@@ -9,17 +9,6 @@ RTL8169_Regs *rtl8169;
99RTL8169_Desc tx_desc [TX_DESC_COUNT ] __attribute__((aligned (256 )));
1010RTL8169_Desc rx_desc [RX_DESC_COUNT ] __attribute__((aligned (256 )));
1111
12- void rtl8169_reset () {
13- rtl8169 -> Command = 0x10 ;
14- while (rtl8169 -> Command & 0x10 )
15- __asm__ volatile ("pause" );
16- }
17-
18- void rtl8169_setup_descriptors () {
19- rtl8169 -> TxDesc = (uint32_t )virt_to_phys ((uint64_t )& tx_desc ); // 设置 TX 描述符基地址
20- rtl8169 -> RxDesc = (uint32_t )& rx_desc ; // 设置 RX 描述符基地址
21- }
22-
2312void rtl8169_setup () {
2413 pcie_device_t * device = pcie_find_class (0x020000 );
2514 if (device == NULL ) {
@@ -50,10 +39,16 @@ void rtl8169_setup() {
5039 rtl8169 = phys_to_virt ((uint64_t )rtl8169 );
5140 }
5241
53- rtl8169 -> Command = 0x0C ;
54- rtl8169_setup_descriptors ();
42+ volatile uint32_t * rtl8169_mmio = (volatile uint32_t * )(((uint64_t )rtl8169 ) & ~0xF );
43+
44+ rtl8169_mmio [0x37 / 4 ] |= (1 << 4 );
45+ while (rtl8169_mmio [0x37 / 4 ] & (1 << 4 )) {
46+ __asm__("pause" );
47+ }
48+ uint8_t mac [6 ];
49+ for (int i = 0 ; i < 6 ; i ++ ) {
50+ mac [i ] = (rtl8169_mmio [0x00 + i ] & 0xFF );
51+ }
5552
56- kinfo ("Rtl8169 mac: %x:%x:%x:%x:%x:%x" , rtl8169 -> MAC [0 ] & 0xFF , (rtl8169 -> MAC [0 ] >> 8 ) & 0xFF ,
57- (rtl8169 -> MAC [0 ] >> 16 ) & 0xFF , (rtl8169 -> MAC [0 ] >> 24 ) & 0xFF , rtl8169 -> MAC [1 ] & 0xFF ,
58- (rtl8169 -> MAC [1 ] >> 8 ) & 0xFF );
53+ kinfo ("Rtl8169 mac: %x:%x:%x:%x:%x:%x" , mac [0 ], mac [1 ], mac [2 ], mac [3 ], mac [4 ], mac [5 ]);
5954}
0 commit comments