22
33// E1000 Device IDs
44#define E1000_DEVICE_ID_82540EM 0x100E
5- #define MAX_E1000_DEVICES 8
5+ #define MAX_E1000_DEVICES 8
66
77// E1000 Register Definitions
8- #define E1000_CTRL 0x0000 // Device Control
9- #define E1000_STATUS 0x0008 // Device Status
10- #define E1000_EERD 0x0014 // EEPROM Read
8+ #define E1000_CTRL 0x0000 // Device Control
9+ #define E1000_STATUS 0x0008 // Device Status
10+ #define E1000_EERD 0x0014 // EEPROM Read
1111#define E1000_CTRL_EXT 0x0018 // Extended Device Control
12- #define E1000_ICR 0x00C0 // Interrupt Cause Read
13- #define E1000_IMS 0x00D0 // Interrupt Mask Set
14- #define E1000_IMC 0x00D8 // Interrupt Mask Clear
15- #define E1000_RCTL 0x0100 // RX Control
16- #define E1000_TCTL 0x0400 // TX Control
17- #define E1000_TIPG 0x0410 // TX Inter-packet Gap
18- #define E1000_RDBAL 0x2800 // RX Descriptor Base Address Low
19- #define E1000_RDBAH 0x2804 // RX Descriptor Base Address High
20- #define E1000_RDLEN 0x2808 // RX Descriptor Length
21- #define E1000_RDH 0x2810 // RX Descriptor Head
22- #define E1000_RDT 0x2818 // RX Descriptor Tail
23- #define E1000_RDTR 0x2820 // RX Delay Timer
24- #define E1000_TDBAL 0x3800 // TX Descriptor Base Address Low
25- #define E1000_TDBAH 0x3804 // TX Descriptor Base Address High
26- #define E1000_TDLEN 0x3808 // TX Descriptor Length
27- #define E1000_TDH 0x3810 // TX Descriptor Head
28- #define E1000_TDT 0x3818 // TX Descriptor Tail
29- #define E1000_TIDV 0x3820 // TX Interrupt Delay Value
30- #define E1000_RA 0x5400 // Receive Address (MAC)
12+ #define E1000_ICR 0x00C0 // Interrupt Cause Read
13+ #define E1000_IMS 0x00D0 // Interrupt Mask Set
14+ #define E1000_IMC 0x00D8 // Interrupt Mask Clear
15+ #define E1000_RCTL 0x0100 // RX Control
16+ #define E1000_TCTL 0x0400 // TX Control
17+ #define E1000_TIPG 0x0410 // TX Inter-packet Gap
18+ #define E1000_RDBAL 0x2800 // RX Descriptor Base Address Low
19+ #define E1000_RDBAH 0x2804 // RX Descriptor Base Address High
20+ #define E1000_RDLEN 0x2808 // RX Descriptor Length
21+ #define E1000_RDH 0x2810 // RX Descriptor Head
22+ #define E1000_RDT 0x2818 // RX Descriptor Tail
23+ #define E1000_RDTR 0x2820 // RX Delay Timer
24+ #define E1000_TDBAL 0x3800 // TX Descriptor Base Address Low
25+ #define E1000_TDBAH 0x3804 // TX Descriptor Base Address High
26+ #define E1000_TDLEN 0x3808 // TX Descriptor Length
27+ #define E1000_TDH 0x3810 // TX Descriptor Head
28+ #define E1000_TDT 0x3818 // TX Descriptor Tail
29+ #define E1000_TIDV 0x3820 // TX Interrupt Delay Value
30+ #define E1000_RA 0x5400 // Receive Address (MAC)
3131
3232// Control Register Bits
33- #define E1000_CTRL_RST (1 << 26) // Reset
34- #define E1000_CTRL_ASDE (1 << 5) // Auto-Speed Detection Enable
35- #define E1000_CTRL_SLU (1 << 6) // Set Link Up
36- #define E1000_CTRL_FRCSPD (1 << 11) // Force Speed
33+ #define E1000_CTRL_RST (1 << 26) // Reset
34+ #define E1000_CTRL_ASDE (1 << 5) // Auto-Speed Detection Enable
35+ #define E1000_CTRL_SLU (1 << 6) // Set Link Up
36+ #define E1000_CTRL_FRCSPD (1 << 11) // Force Speed
3737#define E1000_CTRL_FRCDPLX (1 << 12) // Force Duplex
3838
3939// RCTL Register Bits
40- #define E1000_RCTL_EN (1 << 1) // Enable
41- #define E1000_RCTL_SBP (1 << 2) // Store Bad Packets
42- #define E1000_RCTL_UPE (1 << 3) // Unicast Promiscuous Enable
43- #define E1000_RCTL_MPE (1 << 4) // Multicast Promiscuous Enable
44- #define E1000_RCTL_LPE (1 << 5) // Long Packet Enable
45- #define E1000_RCTL_LBM_NONE (0 << 6) // No Loopback
46- #define E1000_RCTL_RDMTS_HALF (0 << 8) // RX Desc Min Threshold Size
47- #define E1000_RCTL_MO_36 (36 << 12) // Multicast Offset
48- #define E1000_RCTL_BAM (1 << 15) // Broadcast Accept Mode
49- #define E1000_RCTL_SECRC (1 << 26) // Strip Ethernet CRC
40+ #define E1000_RCTL_EN (1 << 1) // Enable
41+ #define E1000_RCTL_SBP (1 << 2) // Store Bad Packets
42+ #define E1000_RCTL_UPE (1 << 3) // Unicast Promiscuous Enable
43+ #define E1000_RCTL_MPE (1 << 4) // Multicast Promiscuous Enable
44+ #define E1000_RCTL_LPE (1 << 5) // Long Packet Enable
45+ #define E1000_RCTL_LBM_NONE (0 << 6) // No Loopback
46+ #define E1000_RCTL_RDMTS_HALF (0 << 8) // RX Desc Min Threshold Size
47+ #define E1000_RCTL_MO_36 (36 << 12) // Multicast Offset
48+ #define E1000_RCTL_BAM (1 << 15) // Broadcast Accept Mode
49+ #define E1000_RCTL_SECRC (1 << 26) // Strip Ethernet CRC
5050
5151// TCTL Register Bits
52- #define E1000_TCTL_EN (1 << 1) // Enable
53- #define E1000_TCTL_PSP (1 << 3) // Pad Short Packets
54- #define E1000_TCTL_CT_SHIFT 4 // Collision Threshold
55- #define E1000_TCTL_COLD_SHIFT 12 // Collision Distance
56- #define E1000_TCTL_SWXOFF (1 << 22) // Software XOFF Transmission
52+ #define E1000_TCTL_EN (1 << 1) // Enable
53+ #define E1000_TCTL_PSP (1 << 3) // Pad Short Packets
54+ #define E1000_TCTL_CT_SHIFT 4 // Collision Threshold
55+ #define E1000_TCTL_COLD_SHIFT 12 // Collision Distance
56+ #define E1000_TCTL_SWXOFF (1 << 22) // Software XOFF Transmission
5757
5858// EERD Register Bits
59- #define E1000_EERD_START (1 << 0) // Start Read
60- #define E1000_EERD_DONE (1 << 1) // Read Done
61- #define E1000_EERD_ADDR_SHIFT 2 // Address Shift
62- #define E1000_EERD_DATA_SHIFT 16 // Data Shift
59+ #define E1000_EERD_START (1 << 0) // Start Read
60+ #define E1000_EERD_DONE (1 << 1) // Read Done
61+ #define E1000_EERD_ADDR_SHIFT 2 // Address Shift
62+ #define E1000_EERD_DATA_SHIFT 16 // Data Shift
6363
6464// RX Descriptor Status Bits
65- #define E1000_RXD_STAT_DD (1 << 0) // Descriptor Done
65+ #define E1000_RXD_STAT_DD (1 << 0) // Descriptor Done
6666#define E1000_RXD_STAT_EOP (1 << 1) // End of Packet
67- #define E1000_RXD_ERR_CE (1 << 0) // CRC Error
68- #define E1000_RXD_ERR_SE (1 << 1) // Symbol Error
69- #define E1000_RXD_ERR_SEQ (1 << 2) // Sequence Error
70- #define E1000_RXD_ERR_CXE (1 << 3) // Carrier Extension Error
71- #define E1000_RXD_ERR_RXE (1 << 4) // RX Data Error
67+ #define E1000_RXD_ERR_CE (1 << 0) // CRC Error
68+ #define E1000_RXD_ERR_SE (1 << 1) // Symbol Error
69+ #define E1000_RXD_ERR_SEQ (1 << 2) // Sequence Error
70+ #define E1000_RXD_ERR_CXE (1 << 3) // Carrier Extension Error
71+ #define E1000_RXD_ERR_RXE (1 << 4) // RX Data Error
7272
7373// TX Descriptor Command Bits
74- #define E1000_TXD_CMD_EOP (1 << 0) // End of Packet
74+ #define E1000_TXD_CMD_EOP (1 << 0) // End of Packet
7575#define E1000_TXD_CMD_IFCS (1 << 1) // Insert FCS
76- #define E1000_TXD_CMD_RS (1 << 3) // Report Status
76+ #define E1000_TXD_CMD_RS (1 << 3) // Report Status
7777
7878// TX Descriptor Status Bits
7979#define E1000_TXD_STAT_DD (1 << 0) // Descriptor Done
8080
8181// Constants
82- #define E1000_NUM_RX_DESC 32
83- #define E1000_NUM_TX_DESC 32
82+ #define E1000_NUM_RX_DESC 32
83+ #define E1000_NUM_TX_DESC 32
8484#define E1000_RX_BUFFER_SIZE 2048
8585#define E1000_TX_BUFFER_SIZE 2048
86- #define E1000_MTU 1500
86+ #define E1000_MTU 1500
8787
8888#include "cp_kernel.h"
8989
@@ -92,37 +92,40 @@ struct e1000_rx_desc {
9292 uint64_t buffer_addr ;
9393 uint16_t length ;
9494 uint16_t checksum ;
95- uint8_t status ;
96- uint8_t errors ;
95+ uint8_t status ;
96+ uint8_t errors ;
9797 uint16_t special ;
9898} __attribute__((packed ));
9999
100100// TX Descriptor Structure
101101struct e1000_tx_desc {
102102 uint64_t buffer_addr ;
103103 uint16_t length ;
104- uint8_t cso ;
105- uint8_t cmd ;
106- uint8_t status ;
107- uint8_t css ;
104+ uint8_t cso ;
105+ uint8_t cmd ;
106+ uint8_t status ;
107+ uint8_t css ;
108108 uint16_t special ;
109109} __attribute__((packed ));
110110
111111// E1000 Device Structure
112- typedef struct e1000_device {
113- void * mmio_base ;
114- uint8_t mac [6 ];
112+ typedef struct e1000_device {
113+ void * mmio_base ;
114+ uint8_t mac [6 ];
115115 uint32_t mtu ;
116116
117117 // RX descriptors and buffers
118118 struct e1000_rx_desc * rx_descs ;
119- void * rx_buffers [E1000_NUM_RX_DESC ];
120- uint16_t rx_tail ;
119+ void * rx_buffers [E1000_NUM_RX_DESC ];
120+ uint16_t rx_tail ;
121121
122122 // TX descriptors and buffers
123123 struct e1000_tx_desc * tx_descs ;
124- void * tx_buffers [E1000_NUM_TX_DESC ];
125- uint16_t tx_head ;
126- uint16_t tx_tail ;
124+ void * tx_buffers [E1000_NUM_TX_DESC ];
125+ uint16_t tx_head ;
126+ uint16_t tx_tail ;
127127} e1000_device_t ;
128128
129+ bool e1000_has_packets (e1000_device_t * dev );
130+ errno_t e1000_send (void * dev_desc , void * data , uint32_t len );
131+ errno_t e1000_receive (void * dev_desc , void * buffer , uint32_t buffer_size );
0 commit comments