kernel/drivers/misc/eeprom/at24.c | ●●●●● patch | view | raw | blame | history | |
kernel/drivers/net/ethernet/realtek/r8169_main.c | ●●●●● patch | view | raw | blame | history | |
kernel/include/linux/device/driver.h | ●●●●● patch | view | raw | blame | history | |
kernel/include/linux/pci.h | ●●●●● patch | view | raw | blame | history |
kernel/drivers/misc/eeprom/at24.c
.. .. @@ -120,6 +120,8 @@ 120 120 module_param_named(write_timeout, at24_write_timeout, uint, 0); 121 121 MODULE_PARM_DESC(at24_write_timeout, "Time (in ms) to try writes (default 25)"); 122 122 123 +struct at24_data *at24_private=NULL;124 +123 125 struct at24_chip_data { 124 126 u32 byte_len; 125 127 u8 flags; .. .. @@ -464,6 +466,147 @@ 464 466 return 0; 465 467 } 466 468 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 updates484 + * 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 0510 +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 +#endif523 +524 +#if 0525 +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 +#endif555 +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 +467 610 static int at24_write(void *priv, unsigned int off, void *val, size_t count) 468 611 { 469 612 struct at24_data *at24; .. .. @@ -684,6 +827,7 @@ 684 827 if (!at24) 685 828 return -ENOMEM; 686 829 830 + at24_private = at24;687 831 mutex_init(&at24->lock); 688 832 at24->byte_len = byte_len; 689 833 at24->page_size = page_size; .. .. @@ -845,7 +989,8 @@ 845 989 at24_io_limit = rounddown_pow_of_two(at24_io_limit); 846 990 return i2c_add_driver(&at24_driver); 847 991 } 848 -module_init(at24_init);992 +//module_init(at24_init);993 +postcore_initcall_sync(at24_init);849 994 850 995 static void __exit at24_exit(void) 851 996 { kernel/drivers/net/ethernet/realtek/r8169_main.c
.. .. @@ -158,7 +158,6 @@ 158 158 { PCI_VDEVICE(REALTEK, 0x8129) }, 159 159 { PCI_VDEVICE(REALTEK, 0x8136), RTL_CFG_NO_GBIT }, 160 160 { PCI_VDEVICE(REALTEK, 0x8161) }, 161 - { PCI_VDEVICE(REALTEK, 0x8162) },162 161 { PCI_VDEVICE(REALTEK, 0x8167) }, 163 162 { PCI_VDEVICE(REALTEK, 0x8168) }, 164 163 { PCI_VDEVICE(NCUBE, 0x8168) }, .. .. @@ -4184,6 +4183,7 @@ 4184 4183 static bool rtl8169_tso_csum_v2(struct rtl8169_private *tp, 4185 4184 struct sk_buff *skb, u32 *opts) 4186 4185 { 4186 + u32 transport_offset = (u32)skb_transport_offset(skb);4187 4187 struct skb_shared_info *shinfo = skb_shinfo(skb); 4188 4188 u32 mss = shinfo->gso_size; 4189 4189 .. .. @@ -4200,7 +4200,7 @@ 4200 4200 WARN_ON_ONCE(1); 4201 4201 } 4202 4202 4203 - opts[0] |= skb_transport_offset(skb) << GTTCPHO_SHIFT;4203 + opts[0] |= transport_offset << GTTCPHO_SHIFT;4204 4204 opts[1] |= mss << TD1_MSS_SHIFT; 4205 4205 } else if (skb->ip_summed == CHECKSUM_PARTIAL) { 4206 4206 u8 ip_protocol; .. .. @@ -4228,7 +4228,7 @@ 4228 4228 else 4229 4229 WARN_ON_ONCE(1); 4230 4230 4231 - opts[1] |= skb_transport_offset(skb) << TCPHO_SHIFT;4231 + opts[1] |= transport_offset << TCPHO_SHIFT;4232 4232 } else { 4233 4233 unsigned int padto = rtl_quirk_packet_padto(tp, skb); 4234 4234 .. .. @@ -4401,13 +4401,14 @@ 4401 4401 struct net_device *dev, 4402 4402 netdev_features_t features) 4403 4403 { 4404 + int transport_offset = skb_transport_offset(skb);4404 4405 struct rtl8169_private *tp = netdev_priv(dev); 4405 4406 4406 4407 if (skb_is_gso(skb)) { 4407 4408 if (tp->mac_version == RTL_GIGA_MAC_VER_34) 4408 4409 features = rtl8168evl_fix_tso(skb, features); 4409 4410 4410 - if (skb_transport_offset(skb) > GTTCPHO_MAX &&4411 + if (transport_offset > GTTCPHO_MAX &&4411 4412 rtl_chip_supports_csum_v2(tp)) 4412 4413 features &= ~NETIF_F_ALL_TSO; 4413 4414 } else if (skb->ip_summed == CHECKSUM_PARTIAL) { .. .. @@ -4418,7 +4419,7 @@ 4418 4419 if (rtl_quirk_packet_padto(tp, skb)) 4419 4420 features &= ~NETIF_F_CSUM_MASK; 4420 4421 4421 - if (skb_transport_offset(skb) > TCPHO_MAX &&4422 + if (transport_offset > TCPHO_MAX &&4422 4423 rtl_chip_supports_csum_v2(tp)) 4423 4424 features &= ~NETIF_F_CSUM_MASK; 4424 4425 } .. .. @@ -5291,13 +5292,14 @@ 5291 5292 5292 5293 return rc; 5293 5294 } 5294 -5295 +extern ssize_t at24_mac_read(unsigned char* mac);5295 5296 static void rtl_init_mac_address(struct rtl8169_private *tp) 5296 5297 { 5297 5298 struct net_device *dev = tp->dev; 5298 5299 u8 *mac_addr = dev->dev_addr; 5299 - int rc;5300 -5300 + int rc,i;5301 + unsigned char mac[6];5302 +/*5301 5303 rc = eth_platform_get_mac_address(tp_to_dev(tp), mac_addr); 5302 5304 if (!rc) 5303 5305 goto done; .. .. @@ -5309,6 +5311,29 @@ 5309 5311 rtl_read_mac_from_reg(tp, mac_addr, MAC0); 5310 5312 if (is_valid_ether_addr(mac_addr)) 5311 5313 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 + else5325 + {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 +5312 5337 5313 5338 eth_hw_addr_random(dev); 5314 5339 dev_warn(tp_to_dev(tp), "can't read MAC address, setting random one\n"); .. .. @@ -5316,6 +5341,7 @@ 5316 5341 rtl_rar_set(tp, mac_addr); 5317 5342 } 5318 5343 5344 +extern ssize_t at24_mac1_read(unsigned char* mac);5319 5345 static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 5320 5346 { 5321 5347 struct rtl8169_private *tp; .. .. @@ -5323,6 +5349,7 @@ 5323 5349 enum mac_version chipset; 5324 5350 struct net_device *dev; 5325 5351 u16 xid; 5352 + unsigned char mac[6];5326 5353 5327 5354 dev = devm_alloc_etherdev(&pdev->dev, sizeof (*tp)); 5328 5355 if (!dev) .. .. @@ -5518,4 +5545,5 @@ 5518 5545 #endif 5519 5546 }; 5520 5547 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 @@ 272 272 } \ 273 273 module_exit(__driver##_exit); 274 274 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 +275 289 /** 276 290 * builtin_driver() - Helper macro for drivers that don't do anything 277 291 * special in init and have no exit. This eliminates some boilerplate. kernel/include/linux/pci.h
.. .. @@ -1419,6 +1419,9 @@ 1419 1419 #define module_pci_driver(__pci_driver) \ 1420 1420 module_driver(__pci_driver, pci_register_driver, pci_unregister_driver) 1421 1421 1422 +#define module_pci_driver2(__pci_driver) \1423 + module_driver2(__pci_driver, pci_register_driver, pci_unregister_driver)1424 +1422 1425 /** 1423 1426 * builtin_pci_driver() - Helper macro for registering a PCI driver 1424 1427 * @__pci_driver: pci_driver struct