diff options
| -rw-r--r-- | drivers/net/tg3.c | 56 | ||||
| -rw-r--r-- | drivers/net/tg3.h | 1 |
2 files changed, 57 insertions, 0 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 602326b78ef9..0a4e7b74c1fc 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -7666,6 +7666,7 @@ static void tg3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info | |||
| 7666 | 7666 | ||
| 7667 | strcpy(info->driver, DRV_MODULE_NAME); | 7667 | strcpy(info->driver, DRV_MODULE_NAME); |
| 7668 | strcpy(info->version, DRV_MODULE_VERSION); | 7668 | strcpy(info->version, DRV_MODULE_VERSION); |
| 7669 | strcpy(info->fw_version, tp->fw_ver); | ||
| 7669 | strcpy(info->bus_info, pci_name(tp->pdev)); | 7670 | strcpy(info->bus_info, pci_name(tp->pdev)); |
| 7670 | } | 7671 | } |
| 7671 | 7672 | ||
| @@ -9069,6 +9070,20 @@ static u32 tg3_nvram_phys_addr(struct tg3 *tp, u32 addr) | |||
| 9069 | return addr; | 9070 | return addr; |
| 9070 | } | 9071 | } |
| 9071 | 9072 | ||
| 9073 | static u32 tg3_nvram_logical_addr(struct tg3 *tp, u32 addr) | ||
| 9074 | { | ||
| 9075 | if ((tp->tg3_flags & TG3_FLAG_NVRAM) && | ||
| 9076 | (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) && | ||
| 9077 | (tp->tg3_flags2 & TG3_FLG2_FLASH) && | ||
| 9078 | (tp->nvram_jedecnum == JEDEC_ATMEL)) | ||
| 9079 | |||
| 9080 | addr = ((addr >> ATMEL_AT45DB0X1B_PAGE_POS) * | ||
| 9081 | tp->nvram_pagesize) + | ||
| 9082 | (addr & ((1 << ATMEL_AT45DB0X1B_PAGE_POS) - 1)); | ||
| 9083 | |||
| 9084 | return addr; | ||
| 9085 | } | ||
| 9086 | |||
| 9072 | static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val) | 9087 | static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val) |
| 9073 | { | 9088 | { |
| 9074 | int ret; | 9089 | int ret; |
| @@ -9780,6 +9795,46 @@ out_not_found: | |||
| 9780 | strcpy(tp->board_part_number, "none"); | 9795 | strcpy(tp->board_part_number, "none"); |
| 9781 | } | 9796 | } |
| 9782 | 9797 | ||
| 9798 | static void __devinit tg3_read_fw_ver(struct tg3 *tp) | ||
| 9799 | { | ||
| 9800 | u32 val, offset, start; | ||
| 9801 | |||
| 9802 | if (tg3_nvram_read_swab(tp, 0, &val)) | ||
| 9803 | return; | ||
| 9804 | |||
| 9805 | if (val != TG3_EEPROM_MAGIC) | ||
| 9806 | return; | ||
| 9807 | |||
| 9808 | if (tg3_nvram_read_swab(tp, 0xc, &offset) || | ||
| 9809 | tg3_nvram_read_swab(tp, 0x4, &start)) | ||
| 9810 | return; | ||
| 9811 | |||
| 9812 | offset = tg3_nvram_logical_addr(tp, offset); | ||
| 9813 | if (tg3_nvram_read_swab(tp, offset, &val)) | ||
| 9814 | return; | ||
| 9815 | |||
| 9816 | if ((val & 0xfc000000) == 0x0c000000) { | ||
| 9817 | u32 ver_offset, addr; | ||
| 9818 | int i; | ||
| 9819 | |||
| 9820 | if (tg3_nvram_read_swab(tp, offset + 4, &val) || | ||
| 9821 | tg3_nvram_read_swab(tp, offset + 8, &ver_offset)) | ||
| 9822 | return; | ||
| 9823 | |||
| 9824 | if (val != 0) | ||
| 9825 | return; | ||
| 9826 | |||
| 9827 | addr = offset + ver_offset - start; | ||
| 9828 | for (i = 0; i < 16; i += 4) { | ||
| 9829 | if (tg3_nvram_read(tp, addr + i, &val)) | ||
| 9830 | return; | ||
| 9831 | |||
| 9832 | val = cpu_to_le32(val); | ||
| 9833 | memcpy(tp->fw_ver + i, &val, 4); | ||
| 9834 | } | ||
| 9835 | } | ||
| 9836 | } | ||
| 9837 | |||
| 9783 | #ifdef CONFIG_SPARC64 | 9838 | #ifdef CONFIG_SPARC64 |
| 9784 | static int __devinit tg3_is_sun_570X(struct tg3 *tp) | 9839 | static int __devinit tg3_is_sun_570X(struct tg3 *tp) |
| 9785 | { | 9840 | { |
| @@ -10301,6 +10356,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
| 10301 | } | 10356 | } |
| 10302 | 10357 | ||
| 10303 | tg3_read_partno(tp); | 10358 | tg3_read_partno(tp); |
| 10359 | tg3_read_fw_ver(tp); | ||
| 10304 | 10360 | ||
| 10305 | if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) { | 10361 | if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) { |
| 10306 | tp->tg3_flags &= ~TG3_FLAG_USE_MI_INTERRUPT; | 10362 | tp->tg3_flags &= ~TG3_FLAG_USE_MI_INTERRUPT; |
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index 6b05d5786cd7..baa34c4721db 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
| @@ -2271,6 +2271,7 @@ struct tg3 { | |||
| 2271 | u32 led_ctrl; | 2271 | u32 led_ctrl; |
| 2272 | 2272 | ||
| 2273 | char board_part_number[24]; | 2273 | char board_part_number[24]; |
| 2274 | char fw_ver[16]; | ||
| 2274 | u32 nic_sram_data_cfg; | 2275 | u32 nic_sram_data_cfg; |
| 2275 | u32 pci_clock_ctrl; | 2276 | u32 pci_clock_ctrl; |
| 2276 | struct pci_dev *pdev_peer; | 2277 | struct pci_dev *pdev_peer; |
