1use crate::{
9 error::KernelError,
10 net::{
11 device::{DeviceCapabilities, DeviceState, DeviceStatistics, NetworkDevice},
12 MacAddress, Packet,
13 },
14};
15
16pub const E1000_VENDOR_ID: u16 = 0x8086;
18pub const E1000_DEVICE_ID: u16 = 0x100E;
19
20const REG_CTRL: usize = 0x0000; #[allow(dead_code)] const REG_STATUS: usize = 0x0008; const REG_EEPROM: usize = 0x0014; #[allow(dead_code)] const REG_CTRL_EXT: usize = 0x0018; const REG_ICR: usize = 0x00C0; const REG_IMS: usize = 0x00D0; const REG_RCTL: usize = 0x0100; const REG_TCTL: usize = 0x0400; const REG_RDBAL: usize = 0x2800; const REG_RDBAH: usize = 0x2804; const REG_RDLEN: usize = 0x2808; const REG_RDH: usize = 0x2810; const REG_RDT: usize = 0x2818; const REG_TDBAL: usize = 0x3800; const REG_TDBAH: usize = 0x3804; const REG_TDLEN: usize = 0x3808; const REG_TDH: usize = 0x3810; const REG_TDT: usize = 0x3818; const REG_MTA: usize = 0x5200; const NUM_RX_DESC: usize = 32;
45const NUM_TX_DESC: usize = 8;
46
47#[repr(C)]
49#[derive(Debug, Clone, Copy)]
50struct RxDescriptor {
51 addr: u64,
52 length: u16,
53 checksum: u16,
54 status: u8,
55 errors: u8,
56 special: u16,
57}
58
59#[repr(C)]
61#[derive(Debug, Clone, Copy)]
62struct TxDescriptor {
63 addr: u64,
64 length: u16,
65 cso: u8,
66 cmd: u8,
67 status: u8,
68 css: u8,
69 special: u16,
70}
71
72pub struct E1000Driver {
74 mmio_base: usize,
75 mac_address: MacAddress,
76 rx_descriptors: [RxDescriptor; NUM_RX_DESC],
77 tx_descriptors: [TxDescriptor; NUM_TX_DESC],
78 rx_buffers: [[u8; 2048]; NUM_RX_DESC],
79 tx_buffers: [[u8; 2048]; NUM_TX_DESC],
80 rx_current: usize,
81 tx_current: usize,
82 state: DeviceState,
83 stats: DeviceStatistics,
84}
85
86impl E1000Driver {
87 pub fn new(mmio_base: usize) -> Result<Self, KernelError> {
89 let mut driver = Self {
90 mmio_base,
91 mac_address: MacAddress::ZERO,
92 rx_descriptors: [RxDescriptor {
93 addr: 0,
94 length: 0,
95 checksum: 0,
96 status: 0,
97 errors: 0,
98 special: 0,
99 }; NUM_RX_DESC],
100 tx_descriptors: [TxDescriptor {
101 addr: 0,
102 length: 0,
103 cso: 0,
104 cmd: 0,
105 status: 0,
106 css: 0,
107 special: 0,
108 }; NUM_TX_DESC],
109 rx_buffers: [[0u8; 2048]; NUM_RX_DESC],
110 tx_buffers: [[0u8; 2048]; NUM_TX_DESC],
111 rx_current: 0,
112 tx_current: 0,
113 state: DeviceState::Down,
114 stats: DeviceStatistics::default(),
115 };
116
117 driver.initialize()?;
118 Ok(driver)
119 }
120
121 fn read_reg(&self, offset: usize) -> u32 {
123 unsafe { core::ptr::read_volatile((self.mmio_base + offset) as *const u32) }
128 }
129
130 fn write_reg(&self, offset: usize, value: u32) {
132 unsafe {
134 core::ptr::write_volatile((self.mmio_base + offset) as *mut u32, value);
135 }
136 }
137
138 fn read_mac_address(&mut self) -> MacAddress {
140 let mut mac = [0u8; 6];
141
142 for i in 0usize..3 {
144 let word = self.eeprom_read(i as u8);
145 mac[i * 2] = (word & 0xFF) as u8;
146 mac[i * 2 + 1] = (word >> 8) as u8;
147 }
148
149 MacAddress(mac)
150 }
151
152 fn eeprom_read(&self, addr: u8) -> u16 {
154 self.write_reg(REG_EEPROM, 1 | ((addr as u32) << 8));
155
156 let mut result: u32;
158 loop {
159 result = self.read_reg(REG_EEPROM);
160 if (result & (1 << 4)) != 0 {
161 break;
162 }
163 }
164
165 ((result >> 16) & 0xFFFF) as u16
166 }
167
168 fn initialize(&mut self) -> Result<(), KernelError> {
170 self.mac_address = self.read_mac_address();
172
173 self.write_reg(REG_CTRL, self.read_reg(REG_CTRL) | 0x04000000);
178
179 for _ in 0..1000 {
181 if (self.read_reg(REG_CTRL) & 0x04000000) == 0 {
182 break;
183 }
184 }
185
186 self.write_reg(REG_IMS, 0);
188 self.read_reg(REG_ICR); for i in 0..NUM_RX_DESC {
192 self.rx_descriptors[i].addr = &self.rx_buffers[i] as *const _ as u64;
193 self.rx_descriptors[i].status = 0;
194 }
195
196 for i in 0..NUM_TX_DESC {
198 self.tx_descriptors[i].addr = &self.tx_buffers[i] as *const _ as u64;
199 self.tx_descriptors[i].status = 1; self.tx_descriptors[i].cmd = 0;
201 }
202
203 let rx_desc_addr = &self.rx_descriptors as *const _ as u64;
205 self.write_reg(REG_RDBAL, (rx_desc_addr & 0xFFFFFFFF) as u32);
206 self.write_reg(REG_RDBAH, (rx_desc_addr >> 32) as u32);
207 self.write_reg(REG_RDLEN, (NUM_RX_DESC * 16) as u32);
208 self.write_reg(REG_RDH, 0);
209 self.write_reg(REG_RDT, (NUM_RX_DESC - 1) as u32);
210
211 let tx_desc_addr = &self.tx_descriptors as *const _ as u64;
213 self.write_reg(REG_TDBAL, (tx_desc_addr & 0xFFFFFFFF) as u32);
214 self.write_reg(REG_TDBAH, (tx_desc_addr >> 32) as u32);
215 self.write_reg(REG_TDLEN, (NUM_TX_DESC * 16) as u32);
216 self.write_reg(REG_TDH, 0);
217 self.write_reg(REG_TDT, 0);
218
219 self.write_reg(REG_RCTL, (1 << 1) | (1 << 2) | (1 << 15));
221
222 self.write_reg(REG_TCTL, (1 << 1) | (1 << 3) | (0x10 << 4));
224
225 for i in 0..128 {
227 self.write_reg(REG_MTA + i * 4, 0);
228 }
229
230 println!(
231 "[E1000] Initialized with MAC: {:02X}:{:02X}:{:02X}:{:02X}:{:02X}:{:02X}",
232 self.mac_address.0[0],
233 self.mac_address.0[1],
234 self.mac_address.0[2],
235 self.mac_address.0[3],
236 self.mac_address.0[4],
237 self.mac_address.0[5]
238 );
239
240 self.state = DeviceState::Up;
242
243 Ok(())
244 }
245
246 fn transmit_raw(&mut self, packet: &[u8]) -> Result<(), KernelError> {
248 if packet.len() > 2048 {
249 return Err(KernelError::InvalidArgument {
250 name: "packet_size",
251 value: "too_large",
252 });
253 }
254
255 let idx = self.tx_current;
256 let desc = &mut self.tx_descriptors[idx];
257
258 if (desc.status & 1) == 0 {
260 self.stats.tx_dropped += 1;
261 return Err(KernelError::WouldBlock);
262 }
263
264 self.tx_buffers[idx][..packet.len()].copy_from_slice(packet);
266
267 desc.length = packet.len() as u16;
269 desc.cmd = (1 << 0) | (1 << 1) | (1 << 3); desc.status = 0;
271
272 self.tx_current = (self.tx_current + 1) % NUM_TX_DESC;
274 self.write_reg(REG_TDT, self.tx_current as u32);
275
276 self.stats.tx_packets += 1;
278 self.stats.tx_bytes += packet.len() as u64;
279
280 Ok(())
281 }
282
283 fn receive_raw(&mut self) -> Result<Option<Packet>, KernelError> {
285 let idx = self.rx_current;
286 let desc = &mut self.rx_descriptors[idx];
287
288 if (desc.status & 1) == 0 {
290 return Ok(None);
291 }
292
293 if desc.errors != 0 {
295 self.stats.rx_errors += 1;
296 desc.status = 0;
298 self.rx_current = (self.rx_current + 1) % NUM_RX_DESC;
299 self.write_reg(REG_RDT, self.rx_current as u32);
300 return Ok(None);
301 }
302
303 let len = desc.length as usize;
305 let data = self.rx_buffers[idx][..len].to_vec();
306 let packet = Packet::from_bytes(&data);
307
308 self.stats.rx_packets += 1;
310 self.stats.rx_bytes += len as u64;
311
312 desc.status = 0;
314
315 self.rx_current = (self.rx_current + 1) % NUM_RX_DESC;
317 self.write_reg(REG_RDT, self.rx_current as u32);
318
319 Ok(Some(packet))
320 }
321
322 pub fn mac_address(&self) -> MacAddress {
324 self.mac_address
325 }
326}
327
328impl NetworkDevice for E1000Driver {
331 fn name(&self) -> &str {
332 "eth0"
333 }
334
335 fn mac_address(&self) -> MacAddress {
336 self.mac_address
337 }
338
339 fn capabilities(&self) -> DeviceCapabilities {
340 DeviceCapabilities {
341 max_transmission_unit: 1500,
342 supports_vlan: false,
343 supports_checksum_offload: true,
344 supports_tso: false,
345 supports_lro: false,
346 }
347 }
348
349 fn state(&self) -> DeviceState {
350 self.state
351 }
352
353 fn set_state(&mut self, state: DeviceState) -> Result<(), KernelError> {
354 match state {
355 DeviceState::Up => {
356 if self.state == DeviceState::Down {
357 self.write_reg(REG_RCTL, (1 << 1) | (1 << 2) | (1 << 15));
359 self.write_reg(REG_TCTL, (1 << 1) | (1 << 3) | (0x10 << 4));
360 }
361 self.state = DeviceState::Up;
362 }
363 DeviceState::Down => {
364 self.write_reg(REG_RCTL, 0);
366 self.write_reg(REG_TCTL, 0);
367 self.state = DeviceState::Down;
368 }
369 _ => {
370 self.state = state;
371 }
372 }
373 Ok(())
374 }
375
376 fn statistics(&self) -> DeviceStatistics {
377 self.stats
378 }
379
380 fn transmit(&mut self, packet: &Packet) -> Result<(), KernelError> {
381 if self.state != DeviceState::Up {
382 self.stats.tx_dropped += 1;
383 return Err(KernelError::InvalidState {
384 expected: "up",
385 actual: "not_up",
386 });
387 }
388
389 self.transmit_raw(packet.data())
390 }
391
392 fn receive(&mut self) -> Result<Option<Packet>, KernelError> {
393 if self.state != DeviceState::Up {
394 return Ok(None);
395 }
396
397 self.receive_raw()
398 }
399}
400
401pub fn init() -> Result<(), KernelError> {
403 println!("[E1000] Intel E1000 network driver module loaded");
404 Ok(())
405}
406
407#[cfg(test)]
408mod tests {
409 use super::*;
410
411 #[test]
412 fn test_e1000_constants() {
413 assert_eq!(E1000_VENDOR_ID, 0x8086);
414 assert_eq!(E1000_DEVICE_ID, 0x100E);
415 assert_eq!(NUM_RX_DESC, 32);
416 assert_eq!(NUM_TX_DESC, 8);
417 }
418}