Got the File IO tests up and running over ethernet.
[akaros.git] / 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 nic_debug(...)  //cprintf(__VA_ARGS__)  
9 #define nic_interrupt_debug(...)  //cprintf(__VA_ARGS__)  
10 #define nic_packet_debug(...)  //cprintf(__VA_ARGS__)  
11
12
13 #define MK_CONFIG_ADDR(BUS, DEV, FUNC, REG) (unsigned long)( (BUS << 16) | (DEV << 11) | \
14                                                              (FUNC << 8) | REG  | \
15                                                              ((uint32_t)0x80000000))
16 #define PCI_CONFIG_ADDR     0xCF8
17 #define PCI_CONFIG_DATA     0xCFC
18
19 #define REALTEK_VENDOR_ID   0x10ec
20 #define INVALID_VENDOR_ID   0xFFFF
21 #define REALTEK_DEV_ID      0x8168
22
23 #define PCI_IO_MASK         0xFFF8
24 #define PCI_MEM_MASK        0xFFFFFFF0
25 #define PCI_IRQ_MASK            0xFF
26 #define PCI_VENDOR_MASK         0xFFFF
27 #define PCI_DEVICE_OFFSET       0x10
28 #define PCI_IRQ_REG                     0x3c
29
30 #define PCI_MAX_BUS                     256
31 #define PCI_MAX_DEV                     32
32 #define PCI_BAR_IO_MASK         0x1
33
34 #define RL_CTRL_RESET_MASK  0x10
35 #define RL_CTRL_RXTX_MASK       0x0C
36
37 #define RL_HWREV_REG            0x40
38 #define RL_HWREV_MASK           0x7C800000
39
40 #define RL_MAC_OFFSET           0x0
41
42 #define RL_CTRL_REG         0x37
43 #define RL_IM_REG                       0x3c
44 #define RL_IS_REG                       0x3E
45 #define RL_EP_CTRL_REG          0x50
46 #define RL_RX_CFG_REG           0x44
47 #define RL_TX_CFG_REG           0x40
48 #define RL_RX_MXPKT_REG     0xDA
49 #define RL_TX_MXPKT_REG     0xEC
50 #define RL_RX_DES_REG       0xE4
51 #define RL_TX_DES_REG       0x20
52 #define RL_TX_CTRL_REG          0x38                    
53
54 #define RL_RX_MAX_SIZE          0x1000 // This is in units of bytes. 0x1000 = 4096
55
56 // !!!!!!!!! need to verify the 128byte nature of this field. Spec says it could be 32 for some chips.
57 #define RL_TX_MAX_SIZE          0x20   // This is in units of 128bytes, 128 * 0x20 = 4096
58 #define RL_EP_CTRL_UL_MASK      0xC0
59 #define RL_EP_CTRL_L_MASK       0x00
60
61 #define RL_TX_SEND_MASK         0x40
62
63 // NOTE: THESE SHOULD BE BROKEN DOWN INTO A SERIES OF BITS TO REPERSENT THE VARIOUS OPTIONS
64 // AND THEN THE MASK SHOULD BE DEFINED TO BE AN OR OF THOSE BITS. THIS IS A QUICK HACK JOB.
65 #define RL_RX_CFG_MASK          0x0000E70F  // RXFTH: unlimited, MXDMA: unlimited, AAP: set (promisc. mode set)
66 #define RL_TX_CFG_MASK          0x3000700  // IFG: normal, MXDMA: unlimited.  crc appended
67
68
69 #define RL_INT_SERR                     0x8000
70 #define RL_INT_TIMEOUT          0x4000
71 #define RL_INT_SWINT            0x0100
72 #define RL_INT_TDU                      0x0080
73 #define RL_INT_FOVW                     0x0040
74 #define RL_INT_LINKCHG          0x0020
75 #define RL_INT_RDU                      0x0010
76 #define RL_INT_TERR                     0x0008
77 #define RL_INT_TOK                      0x0004
78 #define RL_INT_RERR                     0x0002
79 #define RL_INT_ROK                      0x0001
80
81 #define RL_INTERRUPT_MASK       RL_INT_LINKCHG | RL_INT_TOK | RL_INT_ROK | RL_INT_SWINT
82
83 #define DES_OWN_MASK            0x80000000
84 #define DES_EOR_MASK            0x40000000
85 #define DES_RX_SIZE_MASK        0x3FFF
86 #define DES_FS_MASK                     0x20000000
87 #define DES_LS_MASK                     0x10000000
88
89 #define DES_MAR_MASK            0x08000000
90 #define DES_PAM_MASK            0x04000000
91 #define DES_BAR_MASK            0x02000000
92
93 // This is a hack. For some reaosn the bits are in an undocumented position for our NIC
94 // They should be part of the command field, at the commented addrs below. instead
95 // they are part of the vlan field as stated below.
96 //#define DES_TX_IP_CHK_MASK  0x40000
97 //#define DES_TX_UDP_CHK_MASK 0x20000
98 //#define DES_TX_TCP_CHK_MASK 0x10000
99 #define DES_TX_IP_CHK_MASK  0x20000000
100 #define DES_TX_UDP_CHK_MASK 0x80000000
101 #define DES_TX_TCP_CHK_MASK 0x40000000
102
103
104
105 #define KERNEL_IRQ_OFFSET       32
106
107 #define MINIMUM_PACKET_SIZE 14
108 #define MAX_PACKET_SIZE         PGSIZE
109
110 #define PACKET_HEADER_SIZE  20 + 8 + 14 //IP UDP ETH
111 #define MAX_PACKET_DATA         PGSIZE - PACKET_HEADER_SIZE
112 // This number needs verification! Also, this is a huge hack, as the driver shouldnt care about UDP/IP etc.
113
114 void init_nic(void);
115 void nic_interrupt_handler(trapframe_t *tf, void* data);
116 int scan_pci(void);
117 void read_mac(void);
118 void setup_interrupts(void);
119 void setup_descriptors(void);
120 void configure_nic(void);
121 void poll_rx_descriptors(void);
122 void nic_handle_rx_packet(void);
123 void set_rx_descriptor(uint32_t des_num);
124 void set_tx_descriptor(uint32_t des_num);
125 void process_packet(page_t *packet, uint16_t packet_size, uint32_t command);
126 int send_packet(const char *data, size_t len);
127 const char *packet_wrap(const char* data, size_t len);
128 void zero_page(page_t *page);
129 void dump_page(page_t *page);
130
131 #endif /* !ROS_INC_REALTEK_H */