hc
2024-03-22 f63cd4c03ea42695d5f9b0e1798edd196923aae6
pcie lan read mac form eeprom
4 files modified
210 ■■■■■ changed files
kernel/drivers/misc/eeprom/at24.c 147 ●●●●● patch | view | raw | blame | history
kernel/drivers/net/ethernet/realtek/r8169_main.c 46 ●●●● patch | view | raw | blame | history
kernel/include/linux/device/driver.h 14 ●●●●● patch | view | raw | blame | history
kernel/include/linux/pci.h 3 ●●●●● patch | view | raw | blame | history
kernel/drivers/misc/eeprom/at24.c
....@@ -120,6 +120,8 @@
120120 module_param_named(write_timeout, at24_write_timeout, uint, 0);
121121 MODULE_PARM_DESC(at24_write_timeout, "Time (in ms) to try writes (default 25)");
122122
123
+struct at24_data *at24_private=NULL;
124
+
123125 struct at24_chip_data {
124126 u32 byte_len;
125127 u8 flags;
....@@ -464,6 +466,147 @@
464466 return 0;
465467 }
466468
469
+
470
+
471
+static ssize_t at24_read_private(struct at24_data *at24,
472
+ char *buf, loff_t off, size_t count)
473
+{
474
+ ssize_t retval = 0;
475
+
476
+ if (unlikely(!count))
477
+ return count;
478
+
479
+ if (off + count > at24->byte_len)
480
+ return -EINVAL;
481
+
482
+ /*
483
+ * Read data from chip, protecting against concurrent updates
484
+ * from this host, but not from other I2C masters.
485
+ */
486
+ mutex_lock(&at24->lock);
487
+
488
+ while (count) {
489
+ ssize_t status;
490
+
491
+ //status = at24_eeprom_read_i2c(at24, buf, off, count);
492
+ status = at24_regmap_read(at24, buf, off, count);
493
+ if (status <= 0) {
494
+ if (retval == 0)
495
+ retval = status;
496
+ break;
497
+ }
498
+ buf += status;
499
+ off += status;
500
+ count -= status;
501
+ retval += status;
502
+ }
503
+
504
+ mutex_unlock(&at24->lock);
505
+
506
+ return retval;
507
+}
508
+
509
+#if 0
510
+static unsigned char AscToHex(unsigned char aChar)
511
+{
512
+ if((aChar>=0x30)&&(aChar<=0x39))
513
+ aChar -= 0x30;
514
+ else if((aChar>=0x41)&&(aChar<=0x46))
515
+ aChar -= 0x37;
516
+ else if((aChar>=0x61)&&(aChar<=0x66))
517
+ aChar -= 0x57;
518
+ else aChar = 0xff;
519
+
520
+ return aChar;
521
+}
522
+#endif
523
+
524
+#if 0
525
+ssize_t at24_mac_read(unsigned char* addr)
526
+{
527
+ char buf[20];
528
+ char buf_tmp[12];
529
+ int i;
530
+ ssize_t ret;
531
+ if (at24_private == NULL)
532
+ {
533
+ printk("ben %s: at24_private==null error\n", __func__);
534
+ return 0;
535
+ }
536
+ memset(buf, 0x00, 20);
537
+ memset(buf_tmp, 0x00, 12);
538
+ ret = at24_read(at24_private, 0, buf, 12);
539
+ if (ret > 0)
540
+ {
541
+ for(i=0; i<12; i++)
542
+ {
543
+ buf_tmp[i] = AscToHex(buf[i]);
544
+ }
545
+ addr[0] = (buf_tmp[0] << 4) | buf_tmp[1];
546
+ addr[1] = (buf_tmp[2] << 4) | buf_tmp[3];
547
+ addr[2] = (buf_tmp[4] << 4) | buf_tmp[5];
548
+ addr[3] = (buf_tmp[6] << 4) | buf_tmp[7];
549
+ addr[4] = (buf_tmp[8] << 4) | buf_tmp[9];
550
+ addr[5] = (buf_tmp[10] << 4) | buf_tmp[11];
551
+ }
552
+ return ret;
553
+}
554
+#endif
555
+
556
+ssize_t at24_mac_read(unsigned char* addr)
557
+{
558
+ char buf[20];
559
+ char buf_tmp[12];
560
+ ssize_t ret;
561
+ if (at24_private == NULL)
562
+ {
563
+ printk("ben: at24_mac_read at24_private==null error");
564
+ return 0;
565
+ }
566
+ memset(buf, 0x00, 20);
567
+ memset(buf_tmp, 0x00, 12);
568
+ ret = at24_read_private(at24_private, buf, 0, 6);
569
+ if (ret > 0)
570
+ {
571
+ addr[0] = buf[0];
572
+ addr[1] = buf[1];
573
+ addr[2] = buf[2];
574
+ addr[3] = buf[3];
575
+ addr[4] = buf[4];
576
+ addr[5] = buf[5];
577
+ }
578
+ printk("at24_mac_read ...............\n");
579
+ return ret;
580
+}
581
+EXPORT_SYMBOL(at24_mac_read);
582
+
583
+ssize_t at24_mac1_read(unsigned char* mac)
584
+{
585
+ char buf[20];
586
+ char buf_tmp[12];
587
+ ssize_t ret;
588
+ if (at24_private == NULL)
589
+ {
590
+ printk("zcl: at24_mac_read at24_private==null error");
591
+ return 0;
592
+ }
593
+ memset(buf, 0x00, 20);
594
+ memset(buf_tmp, 0x00, 12);
595
+ ret = at24_read_private(at24_private, buf, 0x10, 6);
596
+ if (ret > 0)
597
+ {
598
+ *mac = buf[0];
599
+ *(mac + 1) = buf[1];
600
+ *(mac + 2) = buf[2];
601
+ *(mac + 3) = buf[3];
602
+ *(mac + 4) = buf[4];
603
+ *(mac + 5) = buf[5];
604
+ }
605
+ printk("at24_mac1_read ...............\n");
606
+ return ret;
607
+}
608
+EXPORT_SYMBOL(at24_mac1_read);
609
+
467610 static int at24_write(void *priv, unsigned int off, void *val, size_t count)
468611 {
469612 struct at24_data *at24;
....@@ -684,6 +827,7 @@
684827 if (!at24)
685828 return -ENOMEM;
686829
830
+ at24_private = at24;
687831 mutex_init(&at24->lock);
688832 at24->byte_len = byte_len;
689833 at24->page_size = page_size;
....@@ -845,7 +989,8 @@
845989 at24_io_limit = rounddown_pow_of_two(at24_io_limit);
846990 return i2c_add_driver(&at24_driver);
847991 }
848
-module_init(at24_init);
992
+//module_init(at24_init);
993
+postcore_initcall_sync(at24_init);
849994
850995 static void __exit at24_exit(void)
851996 {
kernel/drivers/net/ethernet/realtek/r8169_main.c
....@@ -158,7 +158,6 @@
158158 { PCI_VDEVICE(REALTEK, 0x8129) },
159159 { PCI_VDEVICE(REALTEK, 0x8136), RTL_CFG_NO_GBIT },
160160 { PCI_VDEVICE(REALTEK, 0x8161) },
161
- { PCI_VDEVICE(REALTEK, 0x8162) },
162161 { PCI_VDEVICE(REALTEK, 0x8167) },
163162 { PCI_VDEVICE(REALTEK, 0x8168) },
164163 { PCI_VDEVICE(NCUBE, 0x8168) },
....@@ -4184,6 +4183,7 @@
41844183 static bool rtl8169_tso_csum_v2(struct rtl8169_private *tp,
41854184 struct sk_buff *skb, u32 *opts)
41864185 {
4186
+ u32 transport_offset = (u32)skb_transport_offset(skb);
41874187 struct skb_shared_info *shinfo = skb_shinfo(skb);
41884188 u32 mss = shinfo->gso_size;
41894189
....@@ -4200,7 +4200,7 @@
42004200 WARN_ON_ONCE(1);
42014201 }
42024202
4203
- opts[0] |= skb_transport_offset(skb) << GTTCPHO_SHIFT;
4203
+ opts[0] |= transport_offset << GTTCPHO_SHIFT;
42044204 opts[1] |= mss << TD1_MSS_SHIFT;
42054205 } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
42064206 u8 ip_protocol;
....@@ -4228,7 +4228,7 @@
42284228 else
42294229 WARN_ON_ONCE(1);
42304230
4231
- opts[1] |= skb_transport_offset(skb) << TCPHO_SHIFT;
4231
+ opts[1] |= transport_offset << TCPHO_SHIFT;
42324232 } else {
42334233 unsigned int padto = rtl_quirk_packet_padto(tp, skb);
42344234
....@@ -4401,13 +4401,14 @@
44014401 struct net_device *dev,
44024402 netdev_features_t features)
44034403 {
4404
+ int transport_offset = skb_transport_offset(skb);
44044405 struct rtl8169_private *tp = netdev_priv(dev);
44054406
44064407 if (skb_is_gso(skb)) {
44074408 if (tp->mac_version == RTL_GIGA_MAC_VER_34)
44084409 features = rtl8168evl_fix_tso(skb, features);
44094410
4410
- if (skb_transport_offset(skb) > GTTCPHO_MAX &&
4411
+ if (transport_offset > GTTCPHO_MAX &&
44114412 rtl_chip_supports_csum_v2(tp))
44124413 features &= ~NETIF_F_ALL_TSO;
44134414 } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
....@@ -4418,7 +4419,7 @@
44184419 if (rtl_quirk_packet_padto(tp, skb))
44194420 features &= ~NETIF_F_CSUM_MASK;
44204421
4421
- if (skb_transport_offset(skb) > TCPHO_MAX &&
4422
+ if (transport_offset > TCPHO_MAX &&
44224423 rtl_chip_supports_csum_v2(tp))
44234424 features &= ~NETIF_F_CSUM_MASK;
44244425 }
....@@ -5291,13 +5292,14 @@
52915292
52925293 return rc;
52935294 }
5294
-
5295
+extern ssize_t at24_mac_read(unsigned char* mac);
52955296 static void rtl_init_mac_address(struct rtl8169_private *tp)
52965297 {
52975298 struct net_device *dev = tp->dev;
52985299 u8 *mac_addr = dev->dev_addr;
5299
- int rc;
5300
-
5300
+ int rc,i;
5301
+ unsigned char mac[6];
5302
+/*
53015303 rc = eth_platform_get_mac_address(tp_to_dev(tp), mac_addr);
53025304 if (!rc)
53035305 goto done;
....@@ -5309,6 +5311,29 @@
53095311 rtl_read_mac_from_reg(tp, mac_addr, MAC0);
53105312 if (is_valid_ether_addr(mac_addr))
53115313 goto done;
5314
+*/
5315
+ memset(mac, 0x00, 6);
5316
+ at24_mac_read(mac);
5317
+
5318
+ if ((mac[0] == 0x68) && (mac[1] == 0xed))
5319
+ {
5320
+ printk("troy : rtl811h mac read from eeprom success!! \n");
5321
+ for (i = 0; i < ETH_ALEN; i++)
5322
+ dev->dev_addr[i] = mac[i];
5323
+ }
5324
+ else
5325
+ {
5326
+ printk("troy : rtl811h mac read from eeprom error!! \n");
5327
+ dev->dev_addr[0] = 0x66;
5328
+ dev->dev_addr[1] = 0xED;
5329
+ dev->dev_addr[2] = 0xB5;
5330
+ dev->dev_addr[3] = 0x64;
5331
+ dev->dev_addr[4] = 0x72;
5332
+ dev->dev_addr[5] = 0x2C;
5333
+ }
5334
+ if (is_valid_ether_addr(mac_addr))
5335
+ goto done;
5336
+
53125337
53135338 eth_hw_addr_random(dev);
53145339 dev_warn(tp_to_dev(tp), "can't read MAC address, setting random one\n");
....@@ -5316,6 +5341,7 @@
53165341 rtl_rar_set(tp, mac_addr);
53175342 }
53185343
5344
+extern ssize_t at24_mac1_read(unsigned char* mac);
53195345 static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
53205346 {
53215347 struct rtl8169_private *tp;
....@@ -5323,6 +5349,7 @@
53235349 enum mac_version chipset;
53245350 struct net_device *dev;
53255351 u16 xid;
5352
+ unsigned char mac[6];
53265353
53275354 dev = devm_alloc_etherdev(&pdev->dev, sizeof (*tp));
53285355 if (!dev)
....@@ -5518,4 +5545,5 @@
55185545 #endif
55195546 };
55205547
5521
-module_pci_driver(rtl8169_pci_driver);
5548
+//module_pci_driver(rtl8169_pci_driver);
5549
+module_pci_driver2(rtl8169_pci_driver); //late_initcall();
kernel/include/linux/device/driver.h
....@@ -272,6 +272,20 @@
272272 } \
273273 module_exit(__driver##_exit);
274274
275
+
276
+
277
+#define module_driver2(__driver, __register, __unregister, ...) \
278
+static int __init __driver##_init(void) \
279
+{ \
280
+ return __register(&(__driver) , ##__VA_ARGS__); \
281
+} \
282
+late_initcall(__driver##_init); \
283
+static void __exit __driver##_exit(void) \
284
+{ \
285
+ __unregister(&(__driver) , ##__VA_ARGS__); \
286
+} \
287
+module_exit(__driver##_exit);
288
+
275289 /**
276290 * builtin_driver() - Helper macro for drivers that don't do anything
277291 * special in init and have no exit. This eliminates some boilerplate.
kernel/include/linux/pci.h
....@@ -1419,6 +1419,9 @@
14191419 #define module_pci_driver(__pci_driver) \
14201420 module_driver(__pci_driver, pci_register_driver, pci_unregister_driver)
14211421
1422
+#define module_pci_driver2(__pci_driver) \
1423
+ module_driver2(__pci_driver, pci_register_driver, pci_unregister_driver)
1424
+
14221425 /**
14231426 * builtin_pci_driver() - Helper macro for registering a PCI driver
14241427 * @__pci_driver: pci_driver struct