Rewrote most of newlib_backend to be more "robust". Added sycall server to tree
[akaros.git] / kern / include / rl8168.h
1 #ifndef ROS_INC_REALTEK_H
2 #define ROS_INC_REALTEK_H
3
4 #include <arch/types.h>
5 #include <trap.h>
6 #include <pmap.h>
7
8 #define rl8168_debug(...)  //cprintf(__VA_ARGS__)  
9 #define rl8168_interrupt_debug(...) //cprintf(__VA_ARGS__)  
10 #define rl8168_frame_debug(...)  //cprintf(__VA_ARGS__)  
11
12 // We need to provide some global interface for sending and receiving packets to a generic interface
13 //  for now, that is this set of Macros! They aren't in caps since the final inteface shoudn't be.
14 #define packet_wrap rl8168_packet_wrap
15 #define send_frame rl8168_send_frame
16
17 #define NE2K_IRQ_CPU            5
18
19 #define REALTEK_VENDOR_ID   0x10ec
20 #define REALTEK_DEV_ID      0x8168
21
22 // Realtek Offsets
23 #define RL_HWREV_REG            0x40
24 #define RL_MAC_OFFSET           0x00
25 #define RL_CTRL_REG         0x37
26 #define RL_IM_REG                       0x3c
27 #define RL_IS_REG                       0x3E
28 #define RL_EP_CTRL_REG          0x50
29 #define RL_RX_CFG_REG           0x44
30 #define RL_TX_CFG_REG           0x40
31 #define RL_RX_MXPKT_REG     0xDA
32 #define RL_TX_MXPKT_REG     0xEC
33 #define RL_RX_DES_REG       0xE4
34 #define RL_TX_DES_REG       0x20
35 #define RL_TX_CTRL_REG          0x38    
36 #define RL_CP_CTRL_REG          0xE0            
37
38 // Realtek masks
39 #define RL_HWREV_MASK           0x7C800000
40 #define RL_CTRL_RXTX_MASK       0x0C
41 #define RL_CTRL_RESET_MASK  0x10
42
43 #define RL_EP_CTRL_UL_MASK      0xC0
44 #define RL_EP_CTRL_L_MASK       0x00
45 #define RL_TX_SEND_MASK         0x40
46 #define RL_CP_MAGIC_MASK        0x002B // Magic bits pulled from the BSD driver.
47                                                                    // Are listed as needed for TX/RX checksumming
48
49 // NOTE: THESE SHOULD BE BROKEN DOWN INTO A SERIES OF BITS TO REPERSENT THE VARIOUS OPTIONS
50 // AND THEN THE MASK SHOULD BE DEFINED TO BE AN OR OF THOSE BITS. THIS IS A QUICK HACK JOB.
51 // See interrupts below for how this should be done
52 #define RL_RX_CFG_MASK          0x0000E70F  // RXFTH: unlimited, MXDMA: unlimited, AAP: set (promisc. mode set)
53 #define RL_TX_CFG_MASK          0x3000700  // IFG: normal, MXDMA: unlimited.  crc appended
54
55 // Realtek interrupt bits
56 #define RL_INT_SERR                     0x8000
57 #define RL_INT_TIMEOUT          0x4000
58 #define RL_INT_SWINT            0x0100
59 #define RL_INT_TDU                      0x0080
60 #define RL_INT_FOVW                     0x0040
61 #define RL_INT_LINKCHG          0x0020
62 #define RL_INT_RDU                      0x0010
63 #define RL_INT_TERR                     0x0008
64 #define RL_INT_TOK                      0x0004
65 #define RL_INT_RERR                     0x0002
66 #define RL_INT_ROK                      0x0001
67
68 #define RL_INTERRUPT_MASK       RL_INT_LINKCHG | RL_INT_TOK | RL_INT_ROK | RL_INT_SWINT
69 #define RL_INTRRUPT_CLEAR       0xFFFF
70
71 // Realtek descriptor command bits
72 #define DES_OWN_MASK            0x80000000
73 #define DES_EOR_MASK            0x40000000
74 #define DES_RX_SIZE_MASK        0x3FFF
75 #define DES_FS_MASK                     0x20000000
76 #define DES_LS_MASK                     0x10000000
77 #define DES_MAR_MASK            0x08000000
78 #define DES_PAM_MASK            0x04000000
79 #define DES_BAR_MASK            0x02000000
80
81 // TFor some reaosn the bits are in an undocumented position for our NIC
82 // They should be part of the command field, at the commented addrs below. instead
83 // they are part of the vlan field as stated below.
84 //#define DES_TX_IP_CHK_MASK  0x40000
85 //#define DES_TX_UDP_CHK_MASK 0x20000
86 //#define DES_TX_TCP_CHK_MASK 0x10000
87 #define DES_TX_IP_CHK_MASK  0x20000000
88 #define DES_TX_UDP_CHK_MASK 0x80000000
89 #define DES_TX_TCP_CHK_MASK 0x40000000
90
91 // Offset used for indexing IRQs
92 #define KERNEL_IRQ_OFFSET       32
93
94 // Basic packet sizing
95 // TODO handle jumbo packets
96 #define ETHERNET_ENCAP_SIZE     18
97 #define MTU                                     1500    
98 #define MAX_FRAME_SIZE          ETHERNET_ENCAP_SIZE + MTU       
99         
100 // Realtek Descriptor Related Sizing
101 #define NUM_TX_DESCRIPTORS      1024
102 #define NUM_RX_DESCRIPTORS      1024
103
104 // !!!!!!!!! need to verify the 128byte nature of this field. Spec says it could be 32 for some chips.
105
106 #define RL_TX_MAX_BUFFER_SIZE  ROUNDUP(MAX_FRAME_SIZE, 128)
107 #define RL_RX_MAX_BUFFER_SIZE  ROUNDUP(MAX_FRAME_SIZE, 8)    // Might be able to be 4 less. Does it strip out the crc flag?
108
109 #define RL_TX_MAX_SIZE          RL_TX_MAX_BUFFER_SIZE / 128
110 #define RL_RX_MAX_SIZE          RL_RX_MAX_BUFFER_SIZE
111
112 #define RL_DES_ALIGN    256
113 #define RL_BUF_ALIGN    8
114
115 // ^----- Good line ------^
116
117 // v----- Evil line ------v
118 // Hacky stuff for syscalls go away.
119
120 #define MINIMUM_PACKET_SIZE 14 // kinda evil. probably evil.
121 #define MAX_PACKET_SIZE         MTU
122
123 #define PACKET_HEADER_SIZE  20 + 8 + 14 //IP UDP ETH
124 #define MAX_PACKET_DATA         MAX_FRAME_SIZE - PACKET_HEADER_SIZE
125 // This number needs verification! Also, this is a huge hack, as the driver shouldnt care about UDP/IP etc.
126
127 const char *rl8168_packet_wrap(const char* data, size_t len);
128
129
130 // ^----- Evil line ------^
131
132 // v----- Good line ------v
133
134
135 void rl8168_init(void);
136 void rl8168_reset(void);
137 void rl8168_interrupt_handler(trapframe_t *tf, void* data);
138 int rl8168_scan_pci(void);
139 void rl8168_read_mac(void);
140 void rl8168_setup_interrupts(void);
141 void rl8168_setup_descriptors(void);
142 void rl8168_configure(void);
143 void rl8168_handle_rx_packet(void);
144 void rl8168_set_rx_descriptor(uint32_t des_num, uint8_t reset_buffer);
145 void rl8168_set_tx_descriptor(uint32_t des_num);
146 void rl8168_process_frame(char *frame_buffer, uint32_t frame_size, uint32_t command);
147 int rl8168_send_frame(const char *data, size_t len);
148
149 #endif /* !ROS_INC_REALTEK_H */