diff options
Diffstat (limited to 'drivers/net/tg3.c')
| -rw-r--r-- | drivers/net/tg3.c | 117 |
1 files changed, 91 insertions, 26 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 81f4aedf534c..1802c3b48799 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -67,8 +67,8 @@ | |||
| 67 | 67 | ||
| 68 | #define DRV_MODULE_NAME "tg3" | 68 | #define DRV_MODULE_NAME "tg3" |
| 69 | #define PFX DRV_MODULE_NAME ": " | 69 | #define PFX DRV_MODULE_NAME ": " |
| 70 | #define DRV_MODULE_VERSION "3.40" | 70 | #define DRV_MODULE_VERSION "3.42" |
| 71 | #define DRV_MODULE_RELDATE "September 15, 2005" | 71 | #define DRV_MODULE_RELDATE "Oct 3, 2005" |
| 72 | 72 | ||
| 73 | #define TG3_DEF_MAC_MODE 0 | 73 | #define TG3_DEF_MAC_MODE 0 |
| 74 | #define TG3_DEF_RX_MODE 0 | 74 | #define TG3_DEF_RX_MODE 0 |
| @@ -3389,7 +3389,8 @@ static irqreturn_t tg3_test_isr(int irq, void *dev_id, | |||
| 3389 | struct tg3 *tp = netdev_priv(dev); | 3389 | struct tg3 *tp = netdev_priv(dev); |
| 3390 | struct tg3_hw_status *sblk = tp->hw_status; | 3390 | struct tg3_hw_status *sblk = tp->hw_status; |
| 3391 | 3391 | ||
| 3392 | if (sblk->status & SD_STATUS_UPDATED) { | 3392 | if ((sblk->status & SD_STATUS_UPDATED) || |
| 3393 | !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) { | ||
| 3393 | tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, | 3394 | tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, |
| 3394 | 0x00000001); | 3395 | 0x00000001); |
| 3395 | return IRQ_RETVAL(1); | 3396 | return IRQ_RETVAL(1); |
| @@ -5395,6 +5396,9 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p) | |||
| 5395 | struct tg3 *tp = netdev_priv(dev); | 5396 | struct tg3 *tp = netdev_priv(dev); |
| 5396 | struct sockaddr *addr = p; | 5397 | struct sockaddr *addr = p; |
| 5397 | 5398 | ||
| 5399 | if (!is_valid_ether_addr(addr->sa_data)) | ||
| 5400 | return -EINVAL; | ||
| 5401 | |||
| 5398 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); | 5402 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); |
| 5399 | 5403 | ||
| 5400 | spin_lock_bh(&tp->lock); | 5404 | spin_lock_bh(&tp->lock); |
| @@ -5806,6 +5810,13 @@ static int tg3_reset_hw(struct tg3 *tp) | |||
| 5806 | } | 5810 | } |
| 5807 | memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE); | 5811 | memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE); |
| 5808 | 5812 | ||
| 5813 | if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) { | ||
| 5814 | tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT; | ||
| 5815 | /* reset to prevent losing 1st rx packet intermittently */ | ||
| 5816 | tw32_f(MAC_RX_MODE, RX_MODE_RESET); | ||
| 5817 | udelay(10); | ||
| 5818 | } | ||
| 5819 | |||
| 5809 | tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE | | 5820 | tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE | |
| 5810 | MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE; | 5821 | MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE; |
| 5811 | tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_RXSTAT_CLEAR | MAC_MODE_TXSTAT_CLEAR); | 5822 | tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_RXSTAT_CLEAR | MAC_MODE_TXSTAT_CLEAR); |
| @@ -5937,7 +5948,7 @@ static int tg3_reset_hw(struct tg3 *tp) | |||
| 5937 | tw32(MAC_LED_CTRL, tp->led_ctrl); | 5948 | tw32(MAC_LED_CTRL, tp->led_ctrl); |
| 5938 | 5949 | ||
| 5939 | tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB); | 5950 | tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB); |
| 5940 | if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) { | 5951 | if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) { |
| 5941 | tw32_f(MAC_RX_MODE, RX_MODE_RESET); | 5952 | tw32_f(MAC_RX_MODE, RX_MODE_RESET); |
| 5942 | udelay(10); | 5953 | udelay(10); |
| 5943 | } | 5954 | } |
| @@ -7360,12 +7371,17 @@ static int tg3_nway_reset(struct net_device *dev) | |||
| 7360 | if (!netif_running(dev)) | 7371 | if (!netif_running(dev)) |
| 7361 | return -EAGAIN; | 7372 | return -EAGAIN; |
| 7362 | 7373 | ||
| 7374 | if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) | ||
| 7375 | return -EINVAL; | ||
| 7376 | |||
| 7363 | spin_lock_bh(&tp->lock); | 7377 | spin_lock_bh(&tp->lock); |
| 7364 | r = -EINVAL; | 7378 | r = -EINVAL; |
| 7365 | tg3_readphy(tp, MII_BMCR, &bmcr); | 7379 | tg3_readphy(tp, MII_BMCR, &bmcr); |
| 7366 | if (!tg3_readphy(tp, MII_BMCR, &bmcr) && | 7380 | if (!tg3_readphy(tp, MII_BMCR, &bmcr) && |
| 7367 | (bmcr & BMCR_ANENABLE)) { | 7381 | ((bmcr & BMCR_ANENABLE) || |
| 7368 | tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANRESTART); | 7382 | (tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT))) { |
| 7383 | tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANRESTART | | ||
| 7384 | BMCR_ANENABLE); | ||
| 7369 | r = 0; | 7385 | r = 0; |
| 7370 | } | 7386 | } |
| 7371 | spin_unlock_bh(&tp->lock); | 7387 | spin_unlock_bh(&tp->lock); |
| @@ -7927,19 +7943,32 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) | |||
| 7927 | struct tg3_rx_buffer_desc *desc; | 7943 | struct tg3_rx_buffer_desc *desc; |
| 7928 | 7944 | ||
| 7929 | if (loopback_mode == TG3_MAC_LOOPBACK) { | 7945 | if (loopback_mode == TG3_MAC_LOOPBACK) { |
| 7946 | /* HW errata - mac loopback fails in some cases on 5780. | ||
| 7947 | * Normal traffic and PHY loopback are not affected by | ||
| 7948 | * errata. | ||
| 7949 | */ | ||
| 7950 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) | ||
| 7951 | return 0; | ||
| 7952 | |||
| 7930 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | | 7953 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | |
| 7931 | MAC_MODE_PORT_INT_LPBACK | MAC_MODE_LINK_POLARITY | | 7954 | MAC_MODE_PORT_INT_LPBACK | MAC_MODE_LINK_POLARITY | |
| 7932 | MAC_MODE_PORT_MODE_GMII; | 7955 | MAC_MODE_PORT_MODE_GMII; |
| 7933 | tw32(MAC_MODE, mac_mode); | 7956 | tw32(MAC_MODE, mac_mode); |
| 7934 | } else if (loopback_mode == TG3_PHY_LOOPBACK) { | 7957 | } else if (loopback_mode == TG3_PHY_LOOPBACK) { |
| 7958 | tg3_writephy(tp, MII_BMCR, BMCR_LOOPBACK | BMCR_FULLDPLX | | ||
| 7959 | BMCR_SPEED1000); | ||
| 7960 | udelay(40); | ||
| 7961 | /* reset to prevent losing 1st rx packet intermittently */ | ||
| 7962 | if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) { | ||
| 7963 | tw32_f(MAC_RX_MODE, RX_MODE_RESET); | ||
| 7964 | udelay(10); | ||
| 7965 | tw32_f(MAC_RX_MODE, tp->rx_mode); | ||
| 7966 | } | ||
| 7935 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | | 7967 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | |
| 7936 | MAC_MODE_LINK_POLARITY | MAC_MODE_PORT_MODE_GMII; | 7968 | MAC_MODE_LINK_POLARITY | MAC_MODE_PORT_MODE_GMII; |
| 7937 | if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) | 7969 | if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) |
| 7938 | mac_mode &= ~MAC_MODE_LINK_POLARITY; | 7970 | mac_mode &= ~MAC_MODE_LINK_POLARITY; |
| 7939 | tw32(MAC_MODE, mac_mode); | 7971 | tw32(MAC_MODE, mac_mode); |
| 7940 | |||
| 7941 | tg3_writephy(tp, MII_BMCR, BMCR_LOOPBACK | BMCR_FULLDPLX | | ||
| 7942 | BMCR_SPEED1000); | ||
| 7943 | } | 7972 | } |
| 7944 | else | 7973 | else |
| 7945 | return -EINVAL; | 7974 | return -EINVAL; |
| @@ -9255,8 +9284,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
| 9255 | static struct pci_device_id write_reorder_chipsets[] = { | 9284 | static struct pci_device_id write_reorder_chipsets[] = { |
| 9256 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, | 9285 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, |
| 9257 | PCI_DEVICE_ID_AMD_FE_GATE_700C) }, | 9286 | PCI_DEVICE_ID_AMD_FE_GATE_700C) }, |
| 9258 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, | 9287 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, |
| 9259 | PCI_DEVICE_ID_AMD_K8_NB) }, | 9288 | PCI_DEVICE_ID_VIA_8385_0) }, |
| 9260 | { }, | 9289 | { }, |
| 9261 | }; | 9290 | }; |
| 9262 | u32 misc_ctrl_reg; | 9291 | u32 misc_ctrl_reg; |
| @@ -9271,15 +9300,6 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
| 9271 | tp->tg3_flags2 |= TG3_FLG2_SUN_570X; | 9300 | tp->tg3_flags2 |= TG3_FLG2_SUN_570X; |
| 9272 | #endif | 9301 | #endif |
| 9273 | 9302 | ||
| 9274 | /* If we have an AMD 762 or K8 chipset, write | ||
| 9275 | * reordering to the mailbox registers done by the host | ||
| 9276 | * controller can cause major troubles. We read back from | ||
| 9277 | * every mailbox register write to force the writes to be | ||
| 9278 | * posted to the chip in order. | ||
| 9279 | */ | ||
| 9280 | if (pci_dev_present(write_reorder_chipsets)) | ||
| 9281 | tp->tg3_flags |= TG3_FLAG_MBOX_WRITE_REORDER; | ||
| 9282 | |||
| 9283 | /* Force memory write invalidate off. If we leave it on, | 9303 | /* Force memory write invalidate off. If we leave it on, |
| 9284 | * then on 5700_BX chips we have to enable a workaround. | 9304 | * then on 5700_BX chips we have to enable a workaround. |
| 9285 | * The workaround is to set the TG3PCI_DMA_RW_CTRL boundary | 9305 | * The workaround is to set the TG3PCI_DMA_RW_CTRL boundary |
| @@ -9410,6 +9430,16 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
| 9410 | if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0) | 9430 | if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0) |
| 9411 | tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; | 9431 | tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; |
| 9412 | 9432 | ||
| 9433 | /* If we have an AMD 762 or VIA K8T800 chipset, write | ||
| 9434 | * reordering to the mailbox registers done by the host | ||
| 9435 | * controller can cause major troubles. We read back from | ||
| 9436 | * every mailbox register write to force the writes to be | ||
| 9437 | * posted to the chip in order. | ||
| 9438 | */ | ||
| 9439 | if (pci_dev_present(write_reorder_chipsets) && | ||
| 9440 | !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) | ||
| 9441 | tp->tg3_flags |= TG3_FLAG_MBOX_WRITE_REORDER; | ||
| 9442 | |||
| 9413 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 && | 9443 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 && |
| 9414 | tp->pci_lat_timer < 64) { | 9444 | tp->pci_lat_timer < 64) { |
| 9415 | tp->pci_lat_timer = 64; | 9445 | tp->pci_lat_timer = 64; |
| @@ -10324,6 +10354,44 @@ static char * __devinit tg3_phy_string(struct tg3 *tp) | |||
| 10324 | }; | 10354 | }; |
| 10325 | } | 10355 | } |
| 10326 | 10356 | ||
| 10357 | static char * __devinit tg3_bus_string(struct tg3 *tp, char *str) | ||
| 10358 | { | ||
| 10359 | if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) { | ||
| 10360 | strcpy(str, "PCI Express"); | ||
| 10361 | return str; | ||
| 10362 | } else if (tp->tg3_flags & TG3_FLAG_PCIX_MODE) { | ||
| 10363 | u32 clock_ctrl = tr32(TG3PCI_CLOCK_CTRL) & 0x1f; | ||
| 10364 | |||
| 10365 | strcpy(str, "PCIX:"); | ||
| 10366 | |||
| 10367 | if ((clock_ctrl == 7) || | ||
| 10368 | ((tr32(GRC_MISC_CFG) & GRC_MISC_CFG_BOARD_ID_MASK) == | ||
| 10369 | GRC_MISC_CFG_BOARD_ID_5704CIOBE)) | ||
| 10370 | strcat(str, "133MHz"); | ||
| 10371 | else if (clock_ctrl == 0) | ||
| 10372 | strcat(str, "33MHz"); | ||
| 10373 | else if (clock_ctrl == 2) | ||
| 10374 | strcat(str, "50MHz"); | ||
| 10375 | else if (clock_ctrl == 4) | ||
| 10376 | strcat(str, "66MHz"); | ||
| 10377 | else if (clock_ctrl == 6) | ||
| 10378 | strcat(str, "100MHz"); | ||
| 10379 | else if (clock_ctrl == 7) | ||
| 10380 | strcat(str, "133MHz"); | ||
| 10381 | } else { | ||
| 10382 | strcpy(str, "PCI:"); | ||
| 10383 | if (tp->tg3_flags & TG3_FLAG_PCI_HIGH_SPEED) | ||
| 10384 | strcat(str, "66MHz"); | ||
| 10385 | else | ||
| 10386 | strcat(str, "33MHz"); | ||
| 10387 | } | ||
| 10388 | if (tp->tg3_flags & TG3_FLAG_PCI_32BIT) | ||
| 10389 | strcat(str, ":32-bit"); | ||
| 10390 | else | ||
| 10391 | strcat(str, ":64-bit"); | ||
| 10392 | return str; | ||
| 10393 | } | ||
| 10394 | |||
| 10327 | static struct pci_dev * __devinit tg3_find_5704_peer(struct tg3 *tp) | 10395 | static struct pci_dev * __devinit tg3_find_5704_peer(struct tg3 *tp) |
| 10328 | { | 10396 | { |
| 10329 | struct pci_dev *peer; | 10397 | struct pci_dev *peer; |
| @@ -10386,6 +10454,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
| 10386 | struct net_device *dev; | 10454 | struct net_device *dev; |
| 10387 | struct tg3 *tp; | 10455 | struct tg3 *tp; |
| 10388 | int i, err, pci_using_dac, pm_cap; | 10456 | int i, err, pci_using_dac, pm_cap; |
| 10457 | char str[40]; | ||
| 10389 | 10458 | ||
| 10390 | if (tg3_version_printed++ == 0) | 10459 | if (tg3_version_printed++ == 0) |
| 10391 | printk(KERN_INFO "%s", version); | 10460 | printk(KERN_INFO "%s", version); |
| @@ -10631,16 +10700,12 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
| 10631 | 10700 | ||
| 10632 | pci_set_drvdata(pdev, dev); | 10701 | pci_set_drvdata(pdev, dev); |
| 10633 | 10702 | ||
| 10634 | printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (PCI%s:%s:%s) %sBaseT Ethernet ", | 10703 | printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (%s) %sBaseT Ethernet ", |
| 10635 | dev->name, | 10704 | dev->name, |
| 10636 | tp->board_part_number, | 10705 | tp->board_part_number, |
| 10637 | tp->pci_chip_rev_id, | 10706 | tp->pci_chip_rev_id, |
| 10638 | tg3_phy_string(tp), | 10707 | tg3_phy_string(tp), |
| 10639 | ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ? "X" : ""), | 10708 | tg3_bus_string(tp, str), |
| 10640 | ((tp->tg3_flags & TG3_FLAG_PCI_HIGH_SPEED) ? | ||
| 10641 | ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ? "133MHz" : "66MHz") : | ||
| 10642 | ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ? "100MHz" : "33MHz")), | ||
| 10643 | ((tp->tg3_flags & TG3_FLAG_PCI_32BIT) ? "32-bit" : "64-bit"), | ||
| 10644 | (tp->tg3_flags & TG3_FLAG_10_100_ONLY) ? "10/100" : "10/100/1000"); | 10709 | (tp->tg3_flags & TG3_FLAG_10_100_ONLY) ? "10/100" : "10/100/1000"); |
| 10645 | 10710 | ||
| 10646 | for (i = 0; i < 6; i++) | 10711 | for (i = 0; i < 6; i++) |
