hc
2023-11-20 69d6da3c1c63675524a25e7dc92a4f43c4164cef
add r8169 read mac form eeprom
3 files modified
49 ■■■■■ changed files
kernel/drivers/net/ethernet/realtek/r8169.c 31 ●●●●● patch | view | raw | blame | history
kernel/include/linux/device.h 14 ●●●●● patch | view | raw | blame | history
kernel/include/linux/pci.h 4 ●●●● patch | view | raw | blame | history
kernel/drivers/net/ethernet/realtek/r8169.c
....@@ -7435,6 +7435,7 @@
74357435 clk_disable_unprepare(data);
74367436 }
74377437
7438
+extern ssize_t at24_mac1_read(unsigned char* mac);
74387439 static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
74397440 {
74407441 const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
....@@ -7442,6 +7443,7 @@
74427443 struct net_device *dev;
74437444 int chipset, region, i;
74447445 int jumbo_max, rc;
7446
+ unsigned char mac[6];
74457447
74467448 dev = devm_alloc_etherdev(&pdev->dev, sizeof (*tp));
74477449 if (!dev)
....@@ -7593,8 +7595,30 @@
75937595 default:
75947596 break;
75957597 }
7596
- for (i = 0; i < ETH_ALEN; i++)
7597
- dev->dev_addr[i] = RTL_R8(tp, MAC0 + i);
7598
+// for (i = 0; i < ETH_ALEN; i++)
7599
+// dev->dev_addr[i] = RTL_R8(tp, MAC0 + i);
7600
+ memset(mac, 0x00, 6);
7601
+ at24_mac1_read(mac);
7602
+
7603
+ if ((mac[0] == 0x68) && (mac[1] == 0xed))
7604
+ {
7605
+ printk("rtl811h mac read from eeprom success!! \n");
7606
+ for (i = 0; i < ETH_ALEN; i++)
7607
+ dev->dev_addr[i] = mac[i];
7608
+ }
7609
+ else
7610
+ {
7611
+ printk("rtl811h mac read from eeprom error!! \n");
7612
+
7613
+ dev->dev_addr[0] = 0x66;
7614
+ dev->dev_addr[1] = 0xED;
7615
+ dev->dev_addr[2] = 0xB5;
7616
+ dev->dev_addr[3] = 0x64;
7617
+ dev->dev_addr[4] = 0x72;
7618
+ dev->dev_addr[5] = 0x2C;
7619
+ }
7620
+
7621
+ rtl_rar_set(tp, dev->dev_addr);
75987622
75997623 dev->ethtool_ops = &rtl8169_ethtool_ops;
76007624 dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
....@@ -7696,4 +7720,5 @@
76967720 .driver.pm = RTL8169_PM_OPS,
76977721 };
76987722
7699
-module_pci_driver(rtl8169_pci_driver);
7723
+//module_pci_driver(rtl8169_pci_driver);
7724
+module_pci_driver2(rtl8169_pci_driver); //late_initcall();
kernel/include/linux/device.h
....@@ -1725,6 +1725,20 @@
17251725 } \
17261726 module_exit(__driver##_exit);
17271727
1728
+
1729
+
1730
+#define module_driver2(__driver, __register, __unregister, ...) \
1731
+static int __init __driver##_init(void) \
1732
+{ \
1733
+ return __register(&(__driver) , ##__VA_ARGS__); \
1734
+} \
1735
+late_initcall(__driver##_init); \
1736
+static void __exit __driver##_exit(void) \
1737
+{ \
1738
+ __unregister(&(__driver) , ##__VA_ARGS__); \
1739
+} \
1740
+module_exit(__driver##_exit);
1741
+
17281742 /**
17291743 * builtin_driver() - Helper macro for drivers that don't do anything
17301744 * special in init and have no exit. This eliminates some boilerplate.
kernel/include/linux/pci.h
....@@ -1317,6 +1317,10 @@
13171317 #define module_pci_driver(__pci_driver) \
13181318 module_driver(__pci_driver, pci_register_driver, pci_unregister_driver)
13191319
1320
+
1321
+#define module_pci_driver2(__pci_driver) \
1322
+ module_driver2(__pci_driver, pci_register_driver, pci_unregister_driver)
1323
+
13201324 /**
13211325 * builtin_pci_driver() - Helper macro for registering a PCI driver
13221326 * @__pci_driver: pci_driver struct