diff options
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r-- | drivers/net/tg3.c | 140 |
1 files changed, 96 insertions, 44 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 2f3184184ad9..3245f16baabc 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.77" | 67 | #define DRV_MODULE_VERSION "3.78" |
68 | #define DRV_MODULE_RELDATE "May 31, 2007" | 68 | #define DRV_MODULE_RELDATE "July 11, 2007" |
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 |
@@ -721,6 +721,44 @@ static int tg3_writephy(struct tg3 *tp, int reg, u32 val) | |||
721 | return ret; | 721 | return ret; |
722 | } | 722 | } |
723 | 723 | ||
724 | static void tg3_phy_toggle_automdix(struct tg3 *tp, int enable) | ||
725 | { | ||
726 | u32 phy; | ||
727 | |||
728 | if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) || | ||
729 | (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) | ||
730 | return; | ||
731 | |||
732 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
733 | u32 ephy; | ||
734 | |||
735 | if (!tg3_readphy(tp, MII_TG3_EPHY_TEST, &ephy)) { | ||
736 | tg3_writephy(tp, MII_TG3_EPHY_TEST, | ||
737 | ephy | MII_TG3_EPHY_SHADOW_EN); | ||
738 | if (!tg3_readphy(tp, MII_TG3_EPHYTST_MISCCTRL, &phy)) { | ||
739 | if (enable) | ||
740 | phy |= MII_TG3_EPHYTST_MISCCTRL_MDIX; | ||
741 | else | ||
742 | phy &= ~MII_TG3_EPHYTST_MISCCTRL_MDIX; | ||
743 | tg3_writephy(tp, MII_TG3_EPHYTST_MISCCTRL, phy); | ||
744 | } | ||
745 | tg3_writephy(tp, MII_TG3_EPHY_TEST, ephy); | ||
746 | } | ||
747 | } else { | ||
748 | phy = MII_TG3_AUXCTL_MISC_RDSEL_MISC | | ||
749 | MII_TG3_AUXCTL_SHDWSEL_MISC; | ||
750 | if (!tg3_writephy(tp, MII_TG3_AUX_CTRL, phy) && | ||
751 | !tg3_readphy(tp, MII_TG3_AUX_CTRL, &phy)) { | ||
752 | if (enable) | ||
753 | phy |= MII_TG3_AUXCTL_MISC_FORCE_AMDIX; | ||
754 | else | ||
755 | phy &= ~MII_TG3_AUXCTL_MISC_FORCE_AMDIX; | ||
756 | phy |= MII_TG3_AUXCTL_MISC_WREN; | ||
757 | tg3_writephy(tp, MII_TG3_AUX_CTRL, phy); | ||
758 | } | ||
759 | } | ||
760 | } | ||
761 | |||
724 | static void tg3_phy_set_wirespeed(struct tg3 *tp) | 762 | static void tg3_phy_set_wirespeed(struct tg3 *tp) |
725 | { | 763 | { |
726 | u32 val; | 764 | u32 val; |
@@ -1045,23 +1083,11 @@ out: | |||
1045 | } | 1083 | } |
1046 | 1084 | ||
1047 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | 1085 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { |
1048 | u32 phy_reg; | ||
1049 | |||
1050 | /* adjust output voltage */ | 1086 | /* adjust output voltage */ |
1051 | tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x12); | 1087 | tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x12); |
1052 | |||
1053 | if (!tg3_readphy(tp, MII_TG3_EPHY_TEST, &phy_reg)) { | ||
1054 | u32 phy_reg2; | ||
1055 | |||
1056 | tg3_writephy(tp, MII_TG3_EPHY_TEST, | ||
1057 | phy_reg | MII_TG3_EPHY_SHADOW_EN); | ||
1058 | /* Enable auto-MDIX */ | ||
1059 | if (!tg3_readphy(tp, 0x10, &phy_reg2)) | ||
1060 | tg3_writephy(tp, 0x10, phy_reg2 | 0x4000); | ||
1061 | tg3_writephy(tp, MII_TG3_EPHY_TEST, phy_reg); | ||
1062 | } | ||
1063 | } | 1088 | } |
1064 | 1089 | ||
1090 | tg3_phy_toggle_automdix(tp, 1); | ||
1065 | tg3_phy_set_wirespeed(tp); | 1091 | tg3_phy_set_wirespeed(tp); |
1066 | return 0; | 1092 | return 0; |
1067 | } | 1093 | } |
@@ -1162,6 +1188,19 @@ static void tg3_frob_aux_power(struct tg3 *tp) | |||
1162 | } | 1188 | } |
1163 | } | 1189 | } |
1164 | 1190 | ||
1191 | static int tg3_5700_link_polarity(struct tg3 *tp, u32 speed) | ||
1192 | { | ||
1193 | if (tp->led_ctrl == LED_CTRL_MODE_PHY_2) | ||
1194 | return 1; | ||
1195 | else if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5411) { | ||
1196 | if (speed != SPEED_10) | ||
1197 | return 1; | ||
1198 | } else if (speed == SPEED_10) | ||
1199 | return 1; | ||
1200 | |||
1201 | return 0; | ||
1202 | } | ||
1203 | |||
1165 | static int tg3_setup_phy(struct tg3 *, int); | 1204 | static int tg3_setup_phy(struct tg3 *, int); |
1166 | 1205 | ||
1167 | #define RESET_KIND_SHUTDOWN 0 | 1206 | #define RESET_KIND_SHUTDOWN 0 |
@@ -1320,9 +1359,17 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) | |||
1320 | else | 1359 | else |
1321 | mac_mode = MAC_MODE_PORT_MODE_MII; | 1360 | mac_mode = MAC_MODE_PORT_MODE_MII; |
1322 | 1361 | ||
1323 | if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 || | 1362 | mac_mode |= tp->mac_mode & MAC_MODE_LINK_POLARITY; |
1324 | !(tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB)) | 1363 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == |
1325 | mac_mode |= MAC_MODE_LINK_POLARITY; | 1364 | ASIC_REV_5700) { |
1365 | u32 speed = (tp->tg3_flags & | ||
1366 | TG3_FLAG_WOL_SPEED_100MB) ? | ||
1367 | SPEED_100 : SPEED_10; | ||
1368 | if (tg3_5700_link_polarity(tp, speed)) | ||
1369 | mac_mode |= MAC_MODE_LINK_POLARITY; | ||
1370 | else | ||
1371 | mac_mode &= ~MAC_MODE_LINK_POLARITY; | ||
1372 | } | ||
1326 | } else { | 1373 | } else { |
1327 | mac_mode = MAC_MODE_PORT_MODE_TBI; | 1374 | mac_mode = MAC_MODE_PORT_MODE_TBI; |
1328 | } | 1375 | } |
@@ -1990,15 +2037,12 @@ relink: | |||
1990 | if (tp->link_config.active_duplex == DUPLEX_HALF) | 2037 | if (tp->link_config.active_duplex == DUPLEX_HALF) |
1991 | tp->mac_mode |= MAC_MODE_HALF_DUPLEX; | 2038 | tp->mac_mode |= MAC_MODE_HALF_DUPLEX; |
1992 | 2039 | ||
1993 | tp->mac_mode &= ~MAC_MODE_LINK_POLARITY; | ||
1994 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) { | 2040 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) { |
1995 | if ((tp->led_ctrl == LED_CTRL_MODE_PHY_2) || | 2041 | if (current_link_up == 1 && |
1996 | (current_link_up == 1 && | 2042 | tg3_5700_link_polarity(tp, tp->link_config.active_speed)) |
1997 | tp->link_config.active_speed == SPEED_10)) | ||
1998 | tp->mac_mode |= MAC_MODE_LINK_POLARITY; | ||
1999 | } else { | ||
2000 | if (current_link_up == 1) | ||
2001 | tp->mac_mode |= MAC_MODE_LINK_POLARITY; | 2043 | tp->mac_mode |= MAC_MODE_LINK_POLARITY; |
2044 | else | ||
2045 | tp->mac_mode &= ~MAC_MODE_LINK_POLARITY; | ||
2002 | } | 2046 | } |
2003 | 2047 | ||
2004 | /* ??? Without this setting Netgear GA302T PHY does not | 2048 | /* ??? Without this setting Netgear GA302T PHY does not |
@@ -2639,6 +2683,9 @@ static int tg3_setup_fiber_by_hand(struct tg3 *tp, u32 mac_status) | |||
2639 | 2683 | ||
2640 | tw32_f(MAC_MODE, (tp->mac_mode | MAC_MODE_SEND_CONFIGS)); | 2684 | tw32_f(MAC_MODE, (tp->mac_mode | MAC_MODE_SEND_CONFIGS)); |
2641 | udelay(40); | 2685 | udelay(40); |
2686 | |||
2687 | tw32_f(MAC_MODE, tp->mac_mode); | ||
2688 | udelay(40); | ||
2642 | } | 2689 | } |
2643 | 2690 | ||
2644 | out: | 2691 | out: |
@@ -2698,10 +2745,6 @@ static int tg3_setup_fiber_phy(struct tg3 *tp, int force_reset) | |||
2698 | else | 2745 | else |
2699 | current_link_up = tg3_setup_fiber_by_hand(tp, mac_status); | 2746 | current_link_up = tg3_setup_fiber_by_hand(tp, mac_status); |
2700 | 2747 | ||
2701 | tp->mac_mode &= ~MAC_MODE_LINK_POLARITY; | ||
2702 | tw32_f(MAC_MODE, tp->mac_mode); | ||
2703 | udelay(40); | ||
2704 | |||
2705 | tp->hw_status->status = | 2748 | tp->hw_status->status = |
2706 | (SD_STATUS_UPDATED | | 2749 | (SD_STATUS_UPDATED | |
2707 | (tp->hw_status->status & ~SD_STATUS_LINK_CHG)); | 2750 | (tp->hw_status->status & ~SD_STATUS_LINK_CHG)); |
@@ -3512,9 +3555,9 @@ static inline int tg3_irq_sync(struct tg3 *tp) | |||
3512 | */ | 3555 | */ |
3513 | static inline void tg3_full_lock(struct tg3 *tp, int irq_sync) | 3556 | static inline void tg3_full_lock(struct tg3 *tp, int irq_sync) |
3514 | { | 3557 | { |
3558 | spin_lock_bh(&tp->lock); | ||
3515 | if (irq_sync) | 3559 | if (irq_sync) |
3516 | tg3_irq_quiesce(tp); | 3560 | tg3_irq_quiesce(tp); |
3517 | spin_lock_bh(&tp->lock); | ||
3518 | } | 3561 | } |
3519 | 3562 | ||
3520 | static inline void tg3_full_unlock(struct tg3 *tp) | 3563 | static inline void tg3_full_unlock(struct tg3 *tp) |
@@ -6444,6 +6487,10 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
6444 | 6487 | ||
6445 | tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE | | 6488 | tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE | |
6446 | MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE; | 6489 | MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE; |
6490 | if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) && | ||
6491 | !(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) && | ||
6492 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700) | ||
6493 | tp->mac_mode |= MAC_MODE_LINK_POLARITY; | ||
6447 | tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_RXSTAT_CLEAR | MAC_MODE_TXSTAT_CLEAR); | 6494 | tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_RXSTAT_CLEAR | MAC_MODE_TXSTAT_CLEAR); |
6448 | udelay(40); | 6495 | udelay(40); |
6449 | 6496 | ||
@@ -8805,7 +8852,9 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) | |||
8805 | return 0; | 8852 | return 0; |
8806 | 8853 | ||
8807 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | | 8854 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | |
8808 | MAC_MODE_PORT_INT_LPBACK | MAC_MODE_LINK_POLARITY; | 8855 | MAC_MODE_PORT_INT_LPBACK; |
8856 | if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) | ||
8857 | mac_mode |= MAC_MODE_LINK_POLARITY; | ||
8809 | if (tp->tg3_flags & TG3_FLAG_10_100_ONLY) | 8858 | if (tp->tg3_flags & TG3_FLAG_10_100_ONLY) |
8810 | mac_mode |= MAC_MODE_PORT_MODE_MII; | 8859 | mac_mode |= MAC_MODE_PORT_MODE_MII; |
8811 | else | 8860 | else |
@@ -8824,19 +8873,18 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) | |||
8824 | phytest | MII_TG3_EPHY_SHADOW_EN); | 8873 | phytest | MII_TG3_EPHY_SHADOW_EN); |
8825 | if (!tg3_readphy(tp, 0x1b, &phy)) | 8874 | if (!tg3_readphy(tp, 0x1b, &phy)) |
8826 | tg3_writephy(tp, 0x1b, phy & ~0x20); | 8875 | tg3_writephy(tp, 0x1b, phy & ~0x20); |
8827 | if (!tg3_readphy(tp, 0x10, &phy)) | ||
8828 | tg3_writephy(tp, 0x10, phy & ~0x4000); | ||
8829 | tg3_writephy(tp, MII_TG3_EPHY_TEST, phytest); | 8876 | tg3_writephy(tp, MII_TG3_EPHY_TEST, phytest); |
8830 | } | 8877 | } |
8831 | val = BMCR_LOOPBACK | BMCR_FULLDPLX | BMCR_SPEED100; | 8878 | val = BMCR_LOOPBACK | BMCR_FULLDPLX | BMCR_SPEED100; |
8832 | } else | 8879 | } else |
8833 | val = BMCR_LOOPBACK | BMCR_FULLDPLX | BMCR_SPEED1000; | 8880 | val = BMCR_LOOPBACK | BMCR_FULLDPLX | BMCR_SPEED1000; |
8834 | 8881 | ||
8882 | tg3_phy_toggle_automdix(tp, 0); | ||
8883 | |||
8835 | tg3_writephy(tp, MII_BMCR, val); | 8884 | tg3_writephy(tp, MII_BMCR, val); |
8836 | udelay(40); | 8885 | udelay(40); |
8837 | 8886 | ||
8838 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | | 8887 | mac_mode = tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK; |
8839 | MAC_MODE_LINK_POLARITY; | ||
8840 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | 8888 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { |
8841 | tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x1800); | 8889 | tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x1800); |
8842 | mac_mode |= MAC_MODE_PORT_MODE_MII; | 8890 | mac_mode |= MAC_MODE_PORT_MODE_MII; |
@@ -8849,8 +8897,11 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) | |||
8849 | udelay(10); | 8897 | udelay(10); |
8850 | tw32_f(MAC_RX_MODE, tp->rx_mode); | 8898 | tw32_f(MAC_RX_MODE, tp->rx_mode); |
8851 | } | 8899 | } |
8852 | if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) { | 8900 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) { |
8853 | mac_mode &= ~MAC_MODE_LINK_POLARITY; | 8901 | if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) |
8902 | mac_mode &= ~MAC_MODE_LINK_POLARITY; | ||
8903 | else if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5411) | ||
8904 | mac_mode |= MAC_MODE_LINK_POLARITY; | ||
8854 | tg3_writephy(tp, MII_TG3_EXT_CTRL, | 8905 | tg3_writephy(tp, MII_TG3_EXT_CTRL, |
8855 | MII_TG3_EXT_CTRL_LNK3_LED_MODE); | 8906 | MII_TG3_EXT_CTRL_LNK3_LED_MODE); |
8856 | } | 8907 | } |
@@ -9116,10 +9167,10 @@ static void tg3_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) | |||
9116 | /* Update RX_MODE_KEEP_VLAN_TAG bit in RX_MODE register. */ | 9167 | /* Update RX_MODE_KEEP_VLAN_TAG bit in RX_MODE register. */ |
9117 | __tg3_set_rx_mode(dev); | 9168 | __tg3_set_rx_mode(dev); |
9118 | 9169 | ||
9119 | tg3_full_unlock(tp); | ||
9120 | |||
9121 | if (netif_running(dev)) | 9170 | if (netif_running(dev)) |
9122 | tg3_netif_start(tp); | 9171 | tg3_netif_start(tp); |
9172 | |||
9173 | tg3_full_unlock(tp); | ||
9123 | } | 9174 | } |
9124 | #endif | 9175 | #endif |
9125 | 9176 | ||
@@ -9410,11 +9461,13 @@ static void __devinit tg3_get_5755_nvram_info(struct tg3 *tp) | |||
9410 | case FLASH_5755VENDOR_ATMEL_FLASH_1: | 9461 | case FLASH_5755VENDOR_ATMEL_FLASH_1: |
9411 | case FLASH_5755VENDOR_ATMEL_FLASH_2: | 9462 | case FLASH_5755VENDOR_ATMEL_FLASH_2: |
9412 | case FLASH_5755VENDOR_ATMEL_FLASH_3: | 9463 | case FLASH_5755VENDOR_ATMEL_FLASH_3: |
9464 | case FLASH_5755VENDOR_ATMEL_FLASH_5: | ||
9413 | tp->nvram_jedecnum = JEDEC_ATMEL; | 9465 | tp->nvram_jedecnum = JEDEC_ATMEL; |
9414 | tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; | 9466 | tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; |
9415 | tp->tg3_flags2 |= TG3_FLG2_FLASH; | 9467 | tp->tg3_flags2 |= TG3_FLG2_FLASH; |
9416 | tp->nvram_pagesize = 264; | 9468 | tp->nvram_pagesize = 264; |
9417 | if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_1) | 9469 | if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_1 || |
9470 | nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_5) | ||
9418 | tp->nvram_size = (protect ? 0x3e200 : 0x80000); | 9471 | tp->nvram_size = (protect ? 0x3e200 : 0x80000); |
9419 | else if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_2) | 9472 | else if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_2) |
9420 | tp->nvram_size = (protect ? 0x1f200 : 0x40000); | 9473 | tp->nvram_size = (protect ? 0x1f200 : 0x40000); |
@@ -11944,12 +11997,11 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
11944 | * checksumming. | 11997 | * checksumming. |
11945 | */ | 11998 | */ |
11946 | if ((tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) == 0) { | 11999 | if ((tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) == 0) { |
12000 | dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG; | ||
11947 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || | 12001 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || |
11948 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) | 12002 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) |
11949 | dev->features |= NETIF_F_HW_CSUM; | 12003 | dev->features |= NETIF_F_IPV6_CSUM; |
11950 | else | 12004 | |
11951 | dev->features |= NETIF_F_IP_CSUM; | ||
11952 | dev->features |= NETIF_F_SG; | ||
11953 | tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS; | 12005 | tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS; |
11954 | } else | 12006 | } else |
11955 | tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS; | 12007 | tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS; |