From 69d6da3c1c63675524a25e7dc92a4f43c4164cef Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 20 Nov 2023 06:31:22 +0000
Subject: [PATCH] add r8169 read mac form eeprom

---
 kernel/include/linux/pci.h                  |    4 ++++
 kernel/include/linux/device.h               |   14 ++++++++++++++
 kernel/drivers/net/ethernet/realtek/r8169.c |   31 ++++++++++++++++++++++++++++---
 3 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/kernel/drivers/net/ethernet/realtek/r8169.c b/kernel/drivers/net/ethernet/realtek/r8169.c
index 99678fd..cc7db2f 100644
--- a/kernel/drivers/net/ethernet/realtek/r8169.c
+++ b/kernel/drivers/net/ethernet/realtek/r8169.c
@@ -7435,6 +7435,7 @@
 	clk_disable_unprepare(data);
 }
 
+extern ssize_t at24_mac1_read(unsigned char* mac);
 static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
 	const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
@@ -7442,6 +7443,7 @@
 	struct net_device *dev;
 	int chipset, region, i;
 	int jumbo_max, rc;
+	unsigned char mac[6];
 
 	dev = devm_alloc_etherdev(&pdev->dev, sizeof (*tp));
 	if (!dev)
@@ -7593,8 +7595,30 @@
 	default:
 		break;
 	}
-	for (i = 0; i < ETH_ALEN; i++)
-		dev->dev_addr[i] = RTL_R8(tp, MAC0 + i);
+//	for (i = 0; i < ETH_ALEN; i++)
+//		dev->dev_addr[i] = RTL_R8(tp, MAC0 + i);
+	memset(mac, 0x00, 6);
+	at24_mac1_read(mac);
+
+	if ((mac[0] == 0x68) && (mac[1] == 0xed))
+	{
+		printk("rtl811h mac read from eeprom success!! \n");
+		for (i = 0; i < ETH_ALEN; i++)
+			dev->dev_addr[i] = mac[i];
+	}
+	else
+	{
+		printk("rtl811h mac read from eeprom error!! \n");
+	
+		 dev->dev_addr[0] = 0x66;
+                 dev->dev_addr[1] = 0xED;
+                 dev->dev_addr[2] = 0xB5;
+                 dev->dev_addr[3] = 0x64;
+                 dev->dev_addr[4] = 0x72;
+                 dev->dev_addr[5] = 0x2C;
+	}
+
+	rtl_rar_set(tp, dev->dev_addr);
 
 	dev->ethtool_ops = &rtl8169_ethtool_ops;
 	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
@@ -7696,4 +7720,5 @@
 	.driver.pm	= RTL8169_PM_OPS,
 };
 
-module_pci_driver(rtl8169_pci_driver);
+//module_pci_driver(rtl8169_pci_driver);
+module_pci_driver2(rtl8169_pci_driver); //late_initcall();
diff --git a/kernel/include/linux/device.h b/kernel/include/linux/device.h
index 41d9bd7..890849d 100644
--- a/kernel/include/linux/device.h
+++ b/kernel/include/linux/device.h
@@ -1725,6 +1725,20 @@
 } \
 module_exit(__driver##_exit);
 
+
+	
+#define module_driver2(__driver, __register, __unregister, ...) \
+static int __init __driver##_init(void) \
+{ \
+        return __register(&(__driver) , ##__VA_ARGS__); \
+} \
+late_initcall(__driver##_init); \
+static void __exit __driver##_exit(void) \
+{ \
+        __unregister(&(__driver) , ##__VA_ARGS__); \
+} \
+module_exit(__driver##_exit);
+
 /**
  * builtin_driver() - Helper macro for drivers that don't do anything
  * special in init and have no exit. This eliminates some boilerplate.
diff --git a/kernel/include/linux/pci.h b/kernel/include/linux/pci.h
index b56ad12..e7185a2 100644
--- a/kernel/include/linux/pci.h
+++ b/kernel/include/linux/pci.h
@@ -1317,6 +1317,10 @@
 #define module_pci_driver(__pci_driver) \
 	module_driver(__pci_driver, pci_register_driver, pci_unregister_driver)
 
+	
+#define module_pci_driver2(__pci_driver) \
+        module_driver2(__pci_driver, pci_register_driver, pci_unregister_driver)
+
 /**
  * builtin_pci_driver() - Helper macro for registering a PCI driver
  * @__pci_driver: pci_driver struct

--
Gitblit v1.6.2