diff options
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r-- | drivers/net/tg3.c | 149 |
1 files changed, 113 insertions, 36 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index b66c75e3b8a1..07b3f77e7626 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -64,8 +64,8 @@ | |||
64 | 64 | ||
65 | #define DRV_MODULE_NAME "tg3" | 65 | #define DRV_MODULE_NAME "tg3" |
66 | #define PFX DRV_MODULE_NAME ": " | 66 | #define PFX DRV_MODULE_NAME ": " |
67 | #define DRV_MODULE_VERSION "3.91" | 67 | #define DRV_MODULE_VERSION "3.92" |
68 | #define DRV_MODULE_RELDATE "April 18, 2008" | 68 | #define DRV_MODULE_RELDATE "May 2, 2008" |
69 | 69 | ||
70 | #define TG3_DEF_MAC_MODE 0 | 70 | #define TG3_DEF_MAC_MODE 0 |
71 | #define TG3_DEF_RX_MODE 0 | 71 | #define TG3_DEF_RX_MODE 0 |
@@ -1656,12 +1656,76 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) | |||
1656 | return 0; | 1656 | return 0; |
1657 | } | 1657 | } |
1658 | 1658 | ||
1659 | /* tp->lock is held. */ | ||
1660 | static void tg3_wait_for_event_ack(struct tg3 *tp) | ||
1661 | { | ||
1662 | int i; | ||
1663 | |||
1664 | /* Wait for up to 2.5 milliseconds */ | ||
1665 | for (i = 0; i < 250000; i++) { | ||
1666 | if (!(tr32(GRC_RX_CPU_EVENT) & GRC_RX_CPU_DRIVER_EVENT)) | ||
1667 | break; | ||
1668 | udelay(10); | ||
1669 | } | ||
1670 | } | ||
1671 | |||
1672 | /* tp->lock is held. */ | ||
1673 | static void tg3_ump_link_report(struct tg3 *tp) | ||
1674 | { | ||
1675 | u32 reg; | ||
1676 | u32 val; | ||
1677 | |||
1678 | if (!(tp->tg3_flags2 & TG3_FLG2_5780_CLASS) || | ||
1679 | !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) | ||
1680 | return; | ||
1681 | |||
1682 | tg3_wait_for_event_ack(tp); | ||
1683 | |||
1684 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_LINK_UPDATE); | ||
1685 | |||
1686 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 14); | ||
1687 | |||
1688 | val = 0; | ||
1689 | if (!tg3_readphy(tp, MII_BMCR, ®)) | ||
1690 | val = reg << 16; | ||
1691 | if (!tg3_readphy(tp, MII_BMSR, ®)) | ||
1692 | val |= (reg & 0xffff); | ||
1693 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, val); | ||
1694 | |||
1695 | val = 0; | ||
1696 | if (!tg3_readphy(tp, MII_ADVERTISE, ®)) | ||
1697 | val = reg << 16; | ||
1698 | if (!tg3_readphy(tp, MII_LPA, ®)) | ||
1699 | val |= (reg & 0xffff); | ||
1700 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 4, val); | ||
1701 | |||
1702 | val = 0; | ||
1703 | if (!(tp->tg3_flags2 & TG3_FLG2_MII_SERDES)) { | ||
1704 | if (!tg3_readphy(tp, MII_CTRL1000, ®)) | ||
1705 | val = reg << 16; | ||
1706 | if (!tg3_readphy(tp, MII_STAT1000, ®)) | ||
1707 | val |= (reg & 0xffff); | ||
1708 | } | ||
1709 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 8, val); | ||
1710 | |||
1711 | if (!tg3_readphy(tp, MII_PHYADDR, ®)) | ||
1712 | val = reg << 16; | ||
1713 | else | ||
1714 | val = 0; | ||
1715 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 12, val); | ||
1716 | |||
1717 | val = tr32(GRC_RX_CPU_EVENT); | ||
1718 | val |= GRC_RX_CPU_DRIVER_EVENT; | ||
1719 | tw32_f(GRC_RX_CPU_EVENT, val); | ||
1720 | } | ||
1721 | |||
1659 | static void tg3_link_report(struct tg3 *tp) | 1722 | static void tg3_link_report(struct tg3 *tp) |
1660 | { | 1723 | { |
1661 | if (!netif_carrier_ok(tp->dev)) { | 1724 | if (!netif_carrier_ok(tp->dev)) { |
1662 | if (netif_msg_link(tp)) | 1725 | if (netif_msg_link(tp)) |
1663 | printk(KERN_INFO PFX "%s: Link is down.\n", | 1726 | printk(KERN_INFO PFX "%s: Link is down.\n", |
1664 | tp->dev->name); | 1727 | tp->dev->name); |
1728 | tg3_ump_link_report(tp); | ||
1665 | } else if (netif_msg_link(tp)) { | 1729 | } else if (netif_msg_link(tp)) { |
1666 | printk(KERN_INFO PFX "%s: Link is up at %d Mbps, %s duplex.\n", | 1730 | printk(KERN_INFO PFX "%s: Link is up at %d Mbps, %s duplex.\n", |
1667 | tp->dev->name, | 1731 | tp->dev->name, |
@@ -1679,6 +1743,7 @@ static void tg3_link_report(struct tg3 *tp) | |||
1679 | "on" : "off", | 1743 | "on" : "off", |
1680 | (tp->link_config.active_flowctrl & TG3_FLOW_CTRL_RX) ? | 1744 | (tp->link_config.active_flowctrl & TG3_FLOW_CTRL_RX) ? |
1681 | "on" : "off"); | 1745 | "on" : "off"); |
1746 | tg3_ump_link_report(tp); | ||
1682 | } | 1747 | } |
1683 | } | 1748 | } |
1684 | 1749 | ||
@@ -2097,9 +2162,11 @@ static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset) | |||
2097 | MAC_STATUS_LNKSTATE_CHANGED)); | 2162 | MAC_STATUS_LNKSTATE_CHANGED)); |
2098 | udelay(40); | 2163 | udelay(40); |
2099 | 2164 | ||
2100 | tp->mi_mode = MAC_MI_MODE_BASE; | 2165 | if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) { |
2101 | tw32_f(MAC_MI_MODE, tp->mi_mode); | 2166 | tw32_f(MAC_MI_MODE, |
2102 | udelay(80); | 2167 | (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL)); |
2168 | udelay(80); | ||
2169 | } | ||
2103 | 2170 | ||
2104 | tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x02); | 2171 | tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x02); |
2105 | 2172 | ||
@@ -5498,19 +5565,17 @@ static void tg3_stop_fw(struct tg3 *tp) | |||
5498 | if ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) && | 5565 | if ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) && |
5499 | !(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)) { | 5566 | !(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)) { |
5500 | u32 val; | 5567 | u32 val; |
5501 | int i; | 5568 | |
5569 | /* Wait for RX cpu to ACK the previous event. */ | ||
5570 | tg3_wait_for_event_ack(tp); | ||
5502 | 5571 | ||
5503 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_PAUSE_FW); | 5572 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_PAUSE_FW); |
5504 | val = tr32(GRC_RX_CPU_EVENT); | 5573 | val = tr32(GRC_RX_CPU_EVENT); |
5505 | val |= (1 << 14); | 5574 | val |= GRC_RX_CPU_DRIVER_EVENT; |
5506 | tw32(GRC_RX_CPU_EVENT, val); | 5575 | tw32(GRC_RX_CPU_EVENT, val); |
5507 | 5576 | ||
5508 | /* Wait for RX cpu to ACK the event. */ | 5577 | /* Wait for RX cpu to ACK this event. */ |
5509 | for (i = 0; i < 100; i++) { | 5578 | tg3_wait_for_event_ack(tp); |
5510 | if (!(tr32(GRC_RX_CPU_EVENT) & (1 << 14))) | ||
5511 | break; | ||
5512 | udelay(1); | ||
5513 | } | ||
5514 | } | 5579 | } |
5515 | } | 5580 | } |
5516 | 5581 | ||
@@ -7102,7 +7167,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
7102 | tp->link_config.autoneg = tp->link_config.orig_autoneg; | 7167 | tp->link_config.autoneg = tp->link_config.orig_autoneg; |
7103 | } | 7168 | } |
7104 | 7169 | ||
7105 | tp->mi_mode = MAC_MI_MODE_BASE; | 7170 | tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL; |
7106 | tw32_f(MAC_MI_MODE, tp->mi_mode); | 7171 | tw32_f(MAC_MI_MODE, tp->mi_mode); |
7107 | udelay(80); | 7172 | udelay(80); |
7108 | 7173 | ||
@@ -7400,14 +7465,16 @@ static void tg3_timer(unsigned long __opaque) | |||
7400 | if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) { | 7465 | if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) { |
7401 | u32 val; | 7466 | u32 val; |
7402 | 7467 | ||
7468 | tg3_wait_for_event_ack(tp); | ||
7469 | |||
7403 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, | 7470 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, |
7404 | FWCMD_NICDRV_ALIVE3); | 7471 | FWCMD_NICDRV_ALIVE3); |
7405 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); | 7472 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); |
7406 | /* 5 seconds timeout */ | 7473 | /* 5 seconds timeout */ |
7407 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5); | 7474 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5); |
7408 | val = tr32(GRC_RX_CPU_EVENT); | 7475 | val = tr32(GRC_RX_CPU_EVENT); |
7409 | val |= (1 << 14); | 7476 | val |= GRC_RX_CPU_DRIVER_EVENT; |
7410 | tw32(GRC_RX_CPU_EVENT, val); | 7477 | tw32_f(GRC_RX_CPU_EVENT, val); |
7411 | } | 7478 | } |
7412 | tp->asf_counter = tp->asf_multiplier; | 7479 | tp->asf_counter = tp->asf_multiplier; |
7413 | } | 7480 | } |
@@ -9568,14 +9635,9 @@ static int tg3_test_loopback(struct tg3 *tp) | |||
9568 | 9635 | ||
9569 | /* Turn off link-based power management. */ | 9636 | /* Turn off link-based power management. */ |
9570 | cpmuctrl = tr32(TG3_CPMU_CTRL); | 9637 | cpmuctrl = tr32(TG3_CPMU_CTRL); |
9571 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || | 9638 | tw32(TG3_CPMU_CTRL, |
9572 | GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5761_AX) | 9639 | cpmuctrl & ~(CPMU_CTRL_LINK_SPEED_MODE | |
9573 | tw32(TG3_CPMU_CTRL, | 9640 | CPMU_CTRL_LINK_AWARE_MODE)); |
9574 | cpmuctrl & ~(CPMU_CTRL_LINK_SPEED_MODE | | ||
9575 | CPMU_CTRL_LINK_AWARE_MODE)); | ||
9576 | else | ||
9577 | tw32(TG3_CPMU_CTRL, | ||
9578 | cpmuctrl & ~CPMU_CTRL_LINK_AWARE_MODE); | ||
9579 | } | 9641 | } |
9580 | 9642 | ||
9581 | if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK)) | 9643 | if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK)) |
@@ -9892,7 +9954,7 @@ static void __devinit tg3_get_nvram_size(struct tg3 *tp) | |||
9892 | return; | 9954 | return; |
9893 | } | 9955 | } |
9894 | } | 9956 | } |
9895 | tp->nvram_size = 0x80000; | 9957 | tp->nvram_size = TG3_NVRAM_SIZE_512KB; |
9896 | } | 9958 | } |
9897 | 9959 | ||
9898 | static void __devinit tg3_get_nvram_info(struct tg3 *tp) | 9960 | static void __devinit tg3_get_nvram_info(struct tg3 *tp) |
@@ -10033,11 +10095,14 @@ static void __devinit tg3_get_5755_nvram_info(struct tg3 *tp) | |||
10033 | tp->nvram_pagesize = 264; | 10095 | tp->nvram_pagesize = 264; |
10034 | if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_1 || | 10096 | if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_1 || |
10035 | nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_5) | 10097 | nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_5) |
10036 | tp->nvram_size = (protect ? 0x3e200 : 0x80000); | 10098 | tp->nvram_size = (protect ? 0x3e200 : |
10099 | TG3_NVRAM_SIZE_512KB); | ||
10037 | else if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_2) | 10100 | else if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_2) |
10038 | tp->nvram_size = (protect ? 0x1f200 : 0x40000); | 10101 | tp->nvram_size = (protect ? 0x1f200 : |
10102 | TG3_NVRAM_SIZE_256KB); | ||
10039 | else | 10103 | else |
10040 | tp->nvram_size = (protect ? 0x1f200 : 0x20000); | 10104 | tp->nvram_size = (protect ? 0x1f200 : |
10105 | TG3_NVRAM_SIZE_128KB); | ||
10041 | break; | 10106 | break; |
10042 | case FLASH_5752VENDOR_ST_M45PE10: | 10107 | case FLASH_5752VENDOR_ST_M45PE10: |
10043 | case FLASH_5752VENDOR_ST_M45PE20: | 10108 | case FLASH_5752VENDOR_ST_M45PE20: |
@@ -10047,11 +10112,17 @@ static void __devinit tg3_get_5755_nvram_info(struct tg3 *tp) | |||
10047 | tp->tg3_flags2 |= TG3_FLG2_FLASH; | 10112 | tp->tg3_flags2 |= TG3_FLG2_FLASH; |
10048 | tp->nvram_pagesize = 256; | 10113 | tp->nvram_pagesize = 256; |
10049 | if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE10) | 10114 | if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE10) |
10050 | tp->nvram_size = (protect ? 0x10000 : 0x20000); | 10115 | tp->nvram_size = (protect ? |
10116 | TG3_NVRAM_SIZE_64KB : | ||
10117 | TG3_NVRAM_SIZE_128KB); | ||
10051 | else if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE20) | 10118 | else if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE20) |
10052 | tp->nvram_size = (protect ? 0x10000 : 0x40000); | 10119 | tp->nvram_size = (protect ? |
10120 | TG3_NVRAM_SIZE_64KB : | ||
10121 | TG3_NVRAM_SIZE_256KB); | ||
10053 | else | 10122 | else |
10054 | tp->nvram_size = (protect ? 0x20000 : 0x80000); | 10123 | tp->nvram_size = (protect ? |
10124 | TG3_NVRAM_SIZE_128KB : | ||
10125 | TG3_NVRAM_SIZE_512KB); | ||
10055 | break; | 10126 | break; |
10056 | } | 10127 | } |
10057 | } | 10128 | } |
@@ -10145,25 +10216,25 @@ static void __devinit tg3_get_5761_nvram_info(struct tg3 *tp) | |||
10145 | case FLASH_5761VENDOR_ATMEL_MDB161D: | 10216 | case FLASH_5761VENDOR_ATMEL_MDB161D: |
10146 | case FLASH_5761VENDOR_ST_A_M45PE16: | 10217 | case FLASH_5761VENDOR_ST_A_M45PE16: |
10147 | case FLASH_5761VENDOR_ST_M_M45PE16: | 10218 | case FLASH_5761VENDOR_ST_M_M45PE16: |
10148 | tp->nvram_size = 0x100000; | 10219 | tp->nvram_size = TG3_NVRAM_SIZE_2MB; |
10149 | break; | 10220 | break; |
10150 | case FLASH_5761VENDOR_ATMEL_ADB081D: | 10221 | case FLASH_5761VENDOR_ATMEL_ADB081D: |
10151 | case FLASH_5761VENDOR_ATMEL_MDB081D: | 10222 | case FLASH_5761VENDOR_ATMEL_MDB081D: |
10152 | case FLASH_5761VENDOR_ST_A_M45PE80: | 10223 | case FLASH_5761VENDOR_ST_A_M45PE80: |
10153 | case FLASH_5761VENDOR_ST_M_M45PE80: | 10224 | case FLASH_5761VENDOR_ST_M_M45PE80: |
10154 | tp->nvram_size = 0x80000; | 10225 | tp->nvram_size = TG3_NVRAM_SIZE_1MB; |
10155 | break; | 10226 | break; |
10156 | case FLASH_5761VENDOR_ATMEL_ADB041D: | 10227 | case FLASH_5761VENDOR_ATMEL_ADB041D: |
10157 | case FLASH_5761VENDOR_ATMEL_MDB041D: | 10228 | case FLASH_5761VENDOR_ATMEL_MDB041D: |
10158 | case FLASH_5761VENDOR_ST_A_M45PE40: | 10229 | case FLASH_5761VENDOR_ST_A_M45PE40: |
10159 | case FLASH_5761VENDOR_ST_M_M45PE40: | 10230 | case FLASH_5761VENDOR_ST_M_M45PE40: |
10160 | tp->nvram_size = 0x40000; | 10231 | tp->nvram_size = TG3_NVRAM_SIZE_512KB; |
10161 | break; | 10232 | break; |
10162 | case FLASH_5761VENDOR_ATMEL_ADB021D: | 10233 | case FLASH_5761VENDOR_ATMEL_ADB021D: |
10163 | case FLASH_5761VENDOR_ATMEL_MDB021D: | 10234 | case FLASH_5761VENDOR_ATMEL_MDB021D: |
10164 | case FLASH_5761VENDOR_ST_A_M45PE20: | 10235 | case FLASH_5761VENDOR_ST_A_M45PE20: |
10165 | case FLASH_5761VENDOR_ST_M_M45PE20: | 10236 | case FLASH_5761VENDOR_ST_M_M45PE20: |
10166 | tp->nvram_size = 0x20000; | 10237 | tp->nvram_size = TG3_NVRAM_SIZE_256KB; |
10167 | break; | 10238 | break; |
10168 | } | 10239 | } |
10169 | } | 10240 | } |
@@ -11764,6 +11835,12 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
11764 | tp->phy_otp = TG3_OTP_DEFAULT; | 11835 | tp->phy_otp = TG3_OTP_DEFAULT; |
11765 | } | 11836 | } |
11766 | 11837 | ||
11838 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || | ||
11839 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) | ||
11840 | tp->mi_mode = MAC_MI_MODE_500KHZ_CONST; | ||
11841 | else | ||
11842 | tp->mi_mode = MAC_MI_MODE_BASE; | ||
11843 | |||
11767 | tp->coalesce_mode = 0; | 11844 | tp->coalesce_mode = 0; |
11768 | if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX && | 11845 | if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX && |
11769 | GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_BX) | 11846 | GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_BX) |
@@ -12692,7 +12769,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
12692 | tp->mac_mode = TG3_DEF_MAC_MODE; | 12769 | tp->mac_mode = TG3_DEF_MAC_MODE; |
12693 | tp->rx_mode = TG3_DEF_RX_MODE; | 12770 | tp->rx_mode = TG3_DEF_RX_MODE; |
12694 | tp->tx_mode = TG3_DEF_TX_MODE; | 12771 | tp->tx_mode = TG3_DEF_TX_MODE; |
12695 | tp->mi_mode = MAC_MI_MODE_BASE; | 12772 | |
12696 | if (tg3_debug > 0) | 12773 | if (tg3_debug > 0) |
12697 | tp->msg_enable = tg3_debug; | 12774 | tp->msg_enable = tg3_debug; |
12698 | else | 12775 | else |