1- // Inspired by the Astral RTL8169 driver: https://github.com/Mathewnd/Astral/blob/rewrite/kernel-src/io/net/rtl8169.c
2-
1+ /**
2+ * @file rtl8169.c
3+ * @author Craig Edwards (craigedwards@brainbox.cc)
4+ * @copyright Copyright (c) 2012-2025
5+ * @ref Inspired by the Astral RTL8169 driver: https://github.com/Mathewnd/Astral/blob/rewrite/kernel-src/io/net/rtl8169.c
6+ */
37#include <kernel.h>
48#include "rtl8169.h"
59
610static rtl8169_dev_t rtl8169_dev ;
711
8- static inline void rtl8169_outb (uint32_t reg , uint8_t v )
9- {
12+ static inline void rtl8169_outb (uint32_t reg , uint8_t v ) {
1013 outb (rtl8169_dev .io_base + reg , v );
1114}
1215
13- static inline void rtl8169_outw (uint32_t reg , uint16_t v )
14- {
16+ static inline void rtl8169_outw (uint32_t reg , uint16_t v ) {
1517 outw (rtl8169_dev .io_base + reg , v );
1618}
1719
18- static inline void rtl8169_outl (uint32_t reg , uint32_t v )
19- {
20+ static inline void rtl8169_outl (uint32_t reg , uint32_t v ) {
2021 outl (rtl8169_dev .io_base + reg , v );
2122}
2223
23- static inline uint8_t rtl8169_inb (uint32_t reg )
24- {
24+ static inline uint8_t rtl8169_inb (uint32_t reg ) {
2525 return inb (rtl8169_dev .io_base + reg );
2626}
2727
28- static inline uint16_t rtl8169_inw (uint32_t reg )
29- {
28+ static inline uint16_t rtl8169_inw (uint32_t reg ) {
3029 return inw (rtl8169_dev .io_base + reg );
3130}
3231
33- static inline uint32_t rtl8169_inl (uint32_t reg )
34- {
32+ static inline uint32_t rtl8169_inl (uint32_t reg ) {
3533 return inl (rtl8169_dev .io_base + reg );
3634}
3735
38- static bool rtl8169_phy_read (uint8_t reg , uint16_t * value )
39- {
36+ static bool rtl8169_phy_read (uint8_t reg , uint16_t * value ) {
4037 rtl8169_outl (RTL8169_REG_PHYAR , (uint32_t )reg << 16 );
4138
4239 for (int i = 0 ; i < 30 ; i ++ ) {
@@ -52,8 +49,7 @@ static bool rtl8169_phy_read(uint8_t reg, uint16_t* value)
5249 return false;
5350}
5451
55- static bool rtl8169_phy_write (uint8_t reg , uint16_t value )
56- {
52+ static bool rtl8169_phy_write (uint8_t reg , uint16_t value ) {
5753 rtl8169_outl (RTL8169_REG_PHYAR , (uint32_t )value | ((uint32_t )reg << 16 ) | RTL8169_PHYAR_BUSY );
5854
5955 for (int i = 0 ; i < 30 ; i ++ ) {
@@ -68,8 +64,7 @@ static bool rtl8169_phy_write(uint8_t reg, uint16_t value)
6864 return false;
6965}
7066
71- static void rtl8169_read_mac (void )
72- {
67+ static void rtl8169_read_mac (void ) {
7368 uint32_t word = rtl8169_inl (RTL8169_REG_MAC0 );
7469 rtl8169_dev .mac [0 ] = (uint8_t )(word & 0xff );
7570 rtl8169_dev .mac [1 ] = (uint8_t )((word >> 8 ) & 0xff );
@@ -81,13 +76,11 @@ static void rtl8169_read_mac(void)
8176 rtl8169_dev .mac [5 ] = (uint8_t )((word >> 8 ) & 0xff );
8277}
8378
84- static void rtl8169_get_mac_addr (uint8_t * dst )
85- {
79+ static void rtl8169_get_mac_addr (uint8_t * dst ) {
8680 memcpy (dst , rtl8169_dev .mac , 6 );
8781}
8882
89- static bool rtl8169_reset (void )
90- {
83+ static bool rtl8169_reset (void ) {
9184 rtl8169_outw (RTL8169_REG_CCR , 0 );
9285 rtl8169_outb (RTL8169_REG_COMMAND , RTL8169_COMMAND_RESET );
9386
@@ -102,10 +95,9 @@ static bool rtl8169_reset(void)
10295 return false;
10396}
10497
105- static void rtl8169_tx_reclaim (void )
106- {
98+ static void rtl8169_tx_reclaim (void ) {
10799 while (rtl8169_dev .tx_free < RTL8169_TX_DESCRIPTOR_COUNT ) {
108- rtl8169_descriptor_t * d = & rtl8169_dev .tx_ring [rtl8169_dev .tx_clean ];
100+ volatile rtl8169_descriptor_t * d = & rtl8169_dev .tx_ring [rtl8169_dev .tx_clean ];
109101
110102 if (d -> flags & RTL8169_DESCRIPTOR_OWN ) {
111103 break ;
@@ -120,10 +112,9 @@ static void rtl8169_tx_reclaim(void)
120112 }
121113}
122114
123- static void rtl8169_rx_drain (void )
124- {
115+ static void rtl8169_rx_drain (void ) {
125116 while ((rtl8169_dev .rx_ring [rtl8169_dev .rx_next ].flags & RTL8169_DESCRIPTOR_OWN ) == 0 ) {
126- rtl8169_descriptor_t * d = & rtl8169_dev .rx_ring [rtl8169_dev .rx_next ];
117+ volatile rtl8169_descriptor_t * d = & rtl8169_dev .rx_ring [rtl8169_dev .rx_next ];
127118 void * buf = rtl8169_dev .rx_bufs [rtl8169_dev .rx_next ];
128119
129120 uint16_t len = d -> length ;
@@ -143,8 +134,7 @@ static void rtl8169_rx_drain(void)
143134 }
144135}
145136
146- static void rtl8169_handler ([[maybe_unused ]] uint8_t isr , [[maybe_unused ]] uint64_t error , [[maybe_unused ]] uint64_t irq , [[maybe_unused ]] void * opaque )
147- {
137+ static void rtl8169_handler ([[maybe_unused ]] uint8_t isr , [[maybe_unused ]] uint64_t error , [[maybe_unused ]] uint64_t irq , [[maybe_unused ]] void * opaque ) {
148138 uint16_t status = rtl8169_inw (RTL8169_REG_IRQ_STATUS );
149139
150140 while (status ) {
@@ -163,8 +153,7 @@ static void rtl8169_handler([[maybe_unused]] uint8_t isr, [[maybe_unused]] uint6
163153 }
164154}
165155
166- static bool rtl8169_send_packet (void * data , uint16_t len )
167- {
156+ static bool rtl8169_send_packet (void * data , uint16_t len ) {
168157 if (!rtl8169_dev .active ) {
169158 return false;
170159 }
@@ -178,7 +167,7 @@ static bool rtl8169_send_packet(void* data, uint16_t len)
178167 }
179168
180169 uint16_t idx = rtl8169_dev .tx_next ;
181- rtl8169_descriptor_t * d = & rtl8169_dev .tx_ring [idx ];
170+ volatile rtl8169_descriptor_t * d = & rtl8169_dev .tx_ring [idx ];
182171 void * buf = rtl8169_dev .tx_bufs [idx ];
183172
184173 if (!buf ) {
@@ -208,21 +197,19 @@ static bool rtl8169_send_packet(void* data, uint16_t len)
208197 return true;
209198}
210199
211- static void rtl8169_free_rings (void )
212- {
200+ static void rtl8169_free_rings (void ) {
213201 if (rtl8169_dev .tx_ring ) {
214- kfree_aligned (rtl8169_dev .tx_ring );
202+ kfree_aligned (( void * ) rtl8169_dev .tx_ring );
215203 rtl8169_dev .tx_ring = NULL ;
216204 }
217205
218206 if (rtl8169_dev .rx_ring ) {
219- kfree_aligned (rtl8169_dev .rx_ring );
207+ kfree_aligned (( void * ) rtl8169_dev .rx_ring );
220208 rtl8169_dev .rx_ring = NULL ;
221209 }
222210}
223211
224- static void rtl8169_free_buffers (void )
225- {
212+ static void rtl8169_free_buffers (void ) {
226213 for (int i = 0 ; i < RTL8169_RX_DESCRIPTOR_COUNT ; i ++ ) {
227214 if (rtl8169_dev .rx_bufs [i ]) {
228215 kfree_aligned (rtl8169_dev .rx_bufs [i ]);
@@ -238,8 +225,7 @@ static void rtl8169_free_buffers(void)
238225 }
239226}
240227
241- static bool rtl8169_setup_rings (void )
242- {
228+ static bool rtl8169_setup_rings (void ) {
243229 size_t tx_bytes = sizeof (rtl8169_descriptor_t ) * RTL8169_TX_DESCRIPTOR_COUNT ;
244230 size_t rx_bytes = sizeof (rtl8169_descriptor_t ) * RTL8169_RX_DESCRIPTOR_COUNT ;
245231
@@ -310,8 +296,7 @@ static bool rtl8169_setup_rings(void)
310296 return true;
311297}
312298
313- static void rtl8169_phy_bringup (void )
314- {
299+ static void rtl8169_phy_bring_up (void ) {
315300 if (!rtl8169_phy_write (RTL8169_PHY_BMCR , RTL8169_PHY_BMCR_RESET )) {
316301 return ;
317302 }
@@ -347,21 +332,19 @@ static void rtl8169_phy_bringup(void)
347332 }
348333}
349334
350- static bool rtl8169_start (pci_dev_t pdev )
351- {
335+ static bool rtl8169_start (pci_dev_t pdev ) {
352336 memset (& rtl8169_dev , 0 , sizeof (rtl8169_dev ));
353337
354338 rtl8169_dev .vendor_id = (uint16_t )pci_read (pdev , PCI_VENDOR_ID );
355339 rtl8169_dev .device_id = (uint16_t )pci_read (pdev , PCI_DEVICE_ID );
356340
357341 uint32_t bar0 = pci_read (pdev , PCI_BAR0 );
358- if (pci_bar_type (bar0 ) != 0 ) {
342+ if (pci_bar_type (bar0 ) != PCI_BAR_TYPE_IOPORT ) {
359343 dprintf ("rtl8169: BAR0 not IO-mapped\n" );
360344 return false;
361345 }
362346
363347 rtl8169_dev .io_base = pci_io_base (bar0 );
364-
365348 pci_enable_iospace (pdev );
366349 pci_bus_master (pdev );
367350
@@ -393,7 +376,7 @@ static bool rtl8169_start(pci_dev_t pdev)
393376
394377 rtl8169_outw (RTL8169_REG_IRQ_MASK , RTL8169_IRQ_MASK_RX_OK | RTL8169_IRQ_MASK_TX_OK | RTL8169_IRQ_MASK_TX_ERROR | RTL8169_IRQ_MASK_RX_ERROR );
395378
396- rtl8169_phy_bringup ();
379+ rtl8169_phy_bring_up ();
397380
398381 rtl8169_outb (RTL8169_REG_COMMAND , RTL8169_COMMAND_TX_ENABLE | RTL8169_COMMAND_RX_ENABLE );
399382
@@ -424,8 +407,7 @@ static bool rtl8169_start(pci_dev_t pdev)
424407 return true;
425408}
426409
427- static void init_rtl8169 (void )
428- {
410+ static void init_rtl8169 (void ) {
429411 static const struct {
430412 uint16_t vendor ;
431413 uint16_t device ;
@@ -449,14 +431,12 @@ static void init_rtl8169(void)
449431 }
450432}
451433
452- bool EXPORTED MOD_INIT_SYM (KMOD_ABI )(void )
453- {
434+ bool EXPORTED MOD_INIT_SYM (KMOD_ABI )(void ) {
454435 dprintf ("rtl8169: loaded\n" );
455436 init_rtl8169 ();
456437 return rtl8169_dev .active ;
457438}
458439
459- bool EXPORTED MOD_EXIT_SYM (KMOD_ABI )(void )
460- {
440+ bool EXPORTED MOD_EXIT_SYM (KMOD_ABI )(void ) {
461441 return false;
462442}
0 commit comments