kernel/drivers/net/ethernet/realtek/r8169.c | ●●●●● patch | view | raw | blame | history | |
kernel/include/linux/device.h | ●●●●● patch | view | raw | blame | history | |
kernel/include/linux/pci.h | ●●●●● patch | view | raw | blame | history |
kernel/drivers/net/ethernet/realtek/r8169.c
.. .. @@ -7435,6 +7435,7 @@ 7435 7435 clk_disable_unprepare(data); 7436 7436 } 7437 7437 7438 +extern ssize_t at24_mac1_read(unsigned char* mac);7438 7439 static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 7439 7440 { 7440 7441 const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data; .. .. @@ -7442,6 +7443,7 @@ 7442 7443 struct net_device *dev; 7443 7444 int chipset, region, i; 7444 7445 int jumbo_max, rc; 7446 + unsigned char mac[6];7445 7447 7446 7448 dev = devm_alloc_etherdev(&pdev->dev, sizeof (*tp)); 7447 7449 if (!dev) .. .. @@ -7593,8 +7595,30 @@ 7593 7595 default: 7594 7596 break; 7595 7597 } 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 + else7610 + {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);7598 7622 7599 7623 dev->ethtool_ops = &rtl8169_ethtool_ops; 7600 7624 dev->watchdog_timeo = RTL8169_TX_TIMEOUT; .. .. @@ -7696,4 +7720,5 @@ 7696 7720 .driver.pm = RTL8169_PM_OPS, 7697 7721 }; 7698 7722 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 @@ 1725 1725 } \ 1726 1726 module_exit(__driver##_exit); 1727 1727 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 +1728 1742 /** 1729 1743 * builtin_driver() - Helper macro for drivers that don't do anything 1730 1744 * special in init and have no exit. This eliminates some boilerplate. kernel/include/linux/pci.h
.. .. @@ -1317,6 +1317,10 @@ 1317 1317 #define module_pci_driver(__pci_driver) \ 1318 1318 module_driver(__pci_driver, pci_register_driver, pci_unregister_driver) 1319 1319 1320 +1321 +#define module_pci_driver2(__pci_driver) \1322 + module_driver2(__pci_driver, pci_register_driver, pci_unregister_driver)1323 +1320 1324 /** 1321 1325 * builtin_pci_driver() - Helper macro for registering a PCI driver 1322 1326 * @__pci_driver: pci_driver struct