Avoids nehalem keyboard issues, better monitors
[akaros.git] / kern / arch / i686 / rl8168.h
1 #ifndef ROS_INC_REALTEK_H
2 #define ROS_INC_REALTEK_H
3
4 #include <ros/common.h>
5 #include <trap.h>
6 #include <pmap.h>
7 #include <arch/nic_common.h>
8
9 #define rl8168_debug(...) // cprintf(__VA_ARGS__)  
10 #define rl8168_interrupt_debug(...) //cprintf(__VA_ARGS__)  
11 #define rl8168_frame_debug(...)  //cprintf(__VA_ARGS__)  
12
13 #define NE2K_IRQ_CPU            5
14
15 #define REALTEK_VENDOR_ID   0x10ec
16 #define REALTEK_DEV_ID      0x8168
17
18 // Realtek Offsets
19 #define RL_HWREV_REG            0x40
20 #define RL_MAC_OFFSET           0x00
21 #define RL_CTRL_REG         0x37
22 #define RL_IM_REG                       0x3c
23 #define RL_IS_REG                       0x3E
24 #define RL_EP_CTRL_REG          0x50
25 #define RL_RX_CFG_REG           0x44
26 #define RL_TX_CFG_REG           0x40
27 #define RL_RX_MXPKT_REG     0xDA
28 #define RL_TX_MXPKT_REG     0xEC
29 #define RL_RX_DES_REG       0xE4
30 #define RL_TX_DES_REG       0x20
31 #define RL_TX_CTRL_REG          0x38    
32 #define RL_CP_CTRL_REG          0xE0            
33
34 // Realtek masks
35 #define RL_HWREV_MASK           0x7C800000
36 #define RL_CTRL_RXTX_MASK       0x0C
37 #define RL_CTRL_RESET_MASK  0x10
38
39 #define RL_EP_CTRL_UL_MASK      0xC0
40 #define RL_EP_CTRL_L_MASK       0x00
41 #define RL_TX_SEND_MASK         0x40
42 #define RL_CP_MAGIC_MASK        0x002B // Magic bits pulled from the BSD driver.
43                                                                    // Are listed as needed for TX/RX checksumming
44
45 // NOTE: THESE SHOULD BE BROKEN DOWN INTO A SERIES OF BITS TO REPERSENT THE VARIOUS OPTIONS
46 // AND THEN THE MASK SHOULD BE DEFINED TO BE AN OR OF THOSE BITS. THIS IS A QUICK HACK JOB.
47 // See interrupts below for how this should be done
48 #define RL_RX_CFG_MASK          0x0000E70F  // RXFTH: unlimited, MXDMA: unlimited, AAP: set (promisc. mode set)
49 #define RL_TX_CFG_MASK          0x3000700  // IFG: normal, MXDMA: unlimited.  crc appended
50
51 // Realtek interrupt bits
52 #define RL_INT_SERR                     0x8000
53 #define RL_INT_TIMEOUT          0x4000
54 #define RL_INT_SWINT            0x0100
55 #define RL_INT_TDU                      0x0080
56 #define RL_INT_FOVW                     0x0040
57 #define RL_INT_LINKCHG          0x0020
58 #define RL_INT_RDU                      0x0010
59 #define RL_INT_TERR                     0x0008
60 #define RL_INT_TOK                      0x0004
61 #define RL_INT_RERR                     0x0002
62 #define RL_INT_ROK                      0x0001
63
64 #define RL_INTERRUPT_MASK       RL_INT_LINKCHG | RL_INT_TOK | RL_INT_ROK | RL_INT_SWINT
65 #define RL_INTRRUPT_CLEAR       0xFFFF
66
67 // Realtek descriptor command bits
68 #define DES_OWN_MASK            0x80000000
69 #define DES_EOR_MASK            0x40000000
70 #define DES_RX_SIZE_MASK        0x3FFF
71 #define DES_FS_MASK                     0x20000000
72 #define DES_LS_MASK                     0x10000000
73 #define DES_MAR_MASK            0x08000000
74 #define DES_PAM_MASK            0x04000000
75 #define DES_BAR_MASK            0x02000000
76
77 // TFor some reaosn the bits are in an undocumented position for our NIC
78 // They should be part of the command field, at the commented addrs below. instead
79 // they are part of the vlan field as stated below.
80 //#define DES_TX_IP_CHK_MASK  0x40000
81 //#define DES_TX_UDP_CHK_MASK 0x20000
82 //#define DES_TX_TCP_CHK_MASK 0x10000
83 #define DES_TX_IP_CHK_MASK  0x20000000
84 #define DES_TX_UDP_CHK_MASK 0x80000000
85 #define DES_TX_TCP_CHK_MASK 0x40000000
86
87 // Offset used for indexing IRQs
88 #define KERNEL_IRQ_OFFSET       32
89
90 // Realtek Descriptor Related Sizing
91 #define NUM_TX_DESCRIPTORS      1024
92 #define NUM_RX_DESCRIPTORS      1024
93
94 // !!!!!!!!! need to verify the 128byte nature of this field. Spec says it could be 32 for some chips.
95
96 #define RL_TX_MAX_BUFFER_SIZE  ROUNDUP(MAX_FRAME_SIZE, 128)
97 #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?
98
99 #define RL_TX_MAX_SIZE          RL_TX_MAX_BUFFER_SIZE / 128
100 #define RL_RX_MAX_SIZE          RL_RX_MAX_BUFFER_SIZE
101
102 #define RL_DES_ALIGN    256
103 #define RL_BUF_ALIGN    8
104
105 // ^----- Good line ------^
106
107 // v----- Evil line ------v
108
109 char *CT(PACKET_HEADER_SIZE + len)
110 rl8168_packet_wrap(const char *CT(len) data, size_t len);
111
112 // ^----- Evil line ------^
113
114 // v----- Good line ------v
115
116
117 void rl8168_init(void);
118 void rl8168_reset(void);
119 void rl8168_interrupt_handler(trapframe_t *tf, void* data);
120 int rl8168_scan_pci(void);
121 void rl8168_read_mac(void);
122 void rl8168_setup_interrupts(void);
123 void rl8168_setup_descriptors(void);
124 void rl8168_configure(void);
125 void rl8168_handle_rx_packet(void);
126 void rl8168_set_rx_descriptor(uint32_t des_num, uint8_t reset_buffer);
127 void rl8168_set_tx_descriptor(uint32_t des_num);
128 void rl8168_process_frame(char *CT(frame_size) frame_buffer,
129                           uint32_t frame_size, uint32_t command);
130 int rl8168_send_frame(const char *CT(len) data, size_t len);
131
132 #endif /* !ROS_INC_REALTEK_H */