diff options
Diffstat (limited to 'drivers/net/tg3.c')
| -rw-r--r-- | drivers/net/tg3.c | 100 |
1 files changed, 57 insertions, 43 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 0b5358072172..73e271e59c6a 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -497,21 +497,20 @@ static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val) | |||
| 497 | unsigned long flags; | 497 | unsigned long flags; |
| 498 | 498 | ||
| 499 | spin_lock_irqsave(&tp->indirect_lock, flags); | 499 | spin_lock_irqsave(&tp->indirect_lock, flags); |
| 500 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); | 500 | if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) { |
| 501 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); | 501 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); |
| 502 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); | ||
| 502 | 503 | ||
| 503 | /* Always leave this as zero. */ | 504 | /* Always leave this as zero. */ |
| 504 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); | 505 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); |
| 505 | spin_unlock_irqrestore(&tp->indirect_lock, flags); | 506 | } else { |
| 506 | } | 507 | tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off); |
| 508 | tw32_f(TG3PCI_MEM_WIN_DATA, val); | ||
| 507 | 509 | ||
| 508 | static void tg3_write_mem_fast(struct tg3 *tp, u32 off, u32 val) | 510 | /* Always leave this as zero. */ |
| 509 | { | 511 | tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0); |
| 510 | /* If no workaround is needed, write to mem space directly */ | 512 | } |
| 511 | if (tp->write32 != tg3_write_indirect_reg32) | 513 | spin_unlock_irqrestore(&tp->indirect_lock, flags); |
| 512 | tw32(NIC_SRAM_WIN_BASE + off, val); | ||
| 513 | else | ||
| 514 | tg3_write_mem(tp, off, val); | ||
| 515 | } | 514 | } |
| 516 | 515 | ||
| 517 | static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val) | 516 | static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val) |
| @@ -519,11 +518,19 @@ static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val) | |||
| 519 | unsigned long flags; | 518 | unsigned long flags; |
| 520 | 519 | ||
| 521 | spin_lock_irqsave(&tp->indirect_lock, flags); | 520 | spin_lock_irqsave(&tp->indirect_lock, flags); |
| 522 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); | 521 | if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) { |
| 523 | pci_read_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); | 522 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); |
| 523 | pci_read_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); | ||
| 524 | 524 | ||
| 525 | /* Always leave this as zero. */ | 525 | /* Always leave this as zero. */ |
| 526 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); | 526 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); |
| 527 | } else { | ||
| 528 | tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off); | ||
| 529 | *val = tr32(TG3PCI_MEM_WIN_DATA); | ||
| 530 | |||
| 531 | /* Always leave this as zero. */ | ||
| 532 | tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0); | ||
| 533 | } | ||
| 527 | spin_unlock_irqrestore(&tp->indirect_lock, flags); | 534 | spin_unlock_irqrestore(&tp->indirect_lock, flags); |
| 528 | } | 535 | } |
| 529 | 536 | ||
| @@ -1367,12 +1374,12 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) | |||
| 1367 | } | 1374 | } |
| 1368 | } | 1375 | } |
| 1369 | 1376 | ||
| 1377 | tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN); | ||
| 1378 | |||
| 1370 | /* Finally, set the new power state. */ | 1379 | /* Finally, set the new power state. */ |
| 1371 | pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, power_control); | 1380 | pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, power_control); |
| 1372 | udelay(100); /* Delay after power state change */ | 1381 | udelay(100); /* Delay after power state change */ |
| 1373 | 1382 | ||
| 1374 | tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN); | ||
| 1375 | |||
| 1376 | return 0; | 1383 | return 0; |
| 1377 | } | 1384 | } |
| 1378 | 1385 | ||
| @@ -5828,10 +5835,14 @@ static int tg3_reset_hw(struct tg3 *tp) | |||
| 5828 | GRC_MODE_NO_TX_PHDR_CSUM | | 5835 | GRC_MODE_NO_TX_PHDR_CSUM | |
| 5829 | GRC_MODE_NO_RX_PHDR_CSUM); | 5836 | GRC_MODE_NO_RX_PHDR_CSUM); |
| 5830 | tp->grc_mode |= GRC_MODE_HOST_SENDBDS; | 5837 | tp->grc_mode |= GRC_MODE_HOST_SENDBDS; |
| 5831 | if (tp->tg3_flags & TG3_FLAG_NO_TX_PSEUDO_CSUM) | 5838 | |
| 5832 | tp->grc_mode |= GRC_MODE_NO_TX_PHDR_CSUM; | 5839 | /* Pseudo-header checksum is done by hardware logic and not |
| 5833 | if (tp->tg3_flags & TG3_FLAG_NO_RX_PSEUDO_CSUM) | 5840 | * the offload processers, so make the chip do the pseudo- |
| 5834 | tp->grc_mode |= GRC_MODE_NO_RX_PHDR_CSUM; | 5841 | * header checksums on receive. For transmit it is more |
| 5842 | * convenient to do the pseudo-header checksum in software | ||
| 5843 | * as Linux does that on transmit for us in all cases. | ||
| 5844 | */ | ||
| 5845 | tp->grc_mode |= GRC_MODE_NO_TX_PHDR_CSUM; | ||
| 5835 | 5846 | ||
| 5836 | tw32(GRC_MODE, | 5847 | tw32(GRC_MODE, |
| 5837 | tp->grc_mode | | 5848 | tp->grc_mode | |
| @@ -6535,11 +6546,11 @@ static void tg3_timer(unsigned long __opaque) | |||
| 6535 | if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) { | 6546 | if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) { |
| 6536 | u32 val; | 6547 | u32 val; |
| 6537 | 6548 | ||
| 6538 | tg3_write_mem_fast(tp, NIC_SRAM_FW_CMD_MBOX, | 6549 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, |
| 6539 | FWCMD_NICDRV_ALIVE2); | 6550 | FWCMD_NICDRV_ALIVE2); |
| 6540 | tg3_write_mem_fast(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); | 6551 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); |
| 6541 | /* 5 seconds timeout */ | 6552 | /* 5 seconds timeout */ |
| 6542 | tg3_write_mem_fast(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5); | 6553 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5); |
| 6543 | val = tr32(GRC_RX_CPU_EVENT); | 6554 | val = tr32(GRC_RX_CPU_EVENT); |
| 6544 | val |= (1 << 14); | 6555 | val |= (1 << 14); |
| 6545 | tw32(GRC_RX_CPU_EVENT, val); | 6556 | tw32(GRC_RX_CPU_EVENT, val); |
| @@ -8034,9 +8045,13 @@ static int tg3_test_nvram(struct tg3 *tp) | |||
| 8034 | for (i = 0; i < size; i++) | 8045 | for (i = 0; i < size; i++) |
| 8035 | csum8 += buf8[i]; | 8046 | csum8 += buf8[i]; |
| 8036 | 8047 | ||
| 8037 | if (csum8 == 0) | 8048 | if (csum8 == 0) { |
| 8038 | return 0; | 8049 | err = 0; |
| 8039 | return -EIO; | 8050 | goto out; |
| 8051 | } | ||
| 8052 | |||
| 8053 | err = -EIO; | ||
| 8054 | goto out; | ||
| 8040 | } | 8055 | } |
| 8041 | 8056 | ||
| 8042 | /* Bootstrap checksum at offset 0x10 */ | 8057 | /* Bootstrap checksum at offset 0x10 */ |
| @@ -9531,8 +9546,11 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) | |||
| 9531 | tp->led_ctrl = LED_CTRL_MODE_PHY_1; | 9546 | tp->led_ctrl = LED_CTRL_MODE_PHY_1; |
| 9532 | 9547 | ||
| 9533 | /* Do not even try poking around in here on Sun parts. */ | 9548 | /* Do not even try poking around in here on Sun parts. */ |
| 9534 | if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) | 9549 | if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) { |
| 9550 | /* All SUN chips are built-in LOMs. */ | ||
| 9551 | tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT; | ||
| 9535 | return; | 9552 | return; |
| 9553 | } | ||
| 9536 | 9554 | ||
| 9537 | tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val); | 9555 | tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val); |
| 9538 | if (val == NIC_SRAM_DATA_SIG_MAGIC) { | 9556 | if (val == NIC_SRAM_DATA_SIG_MAGIC) { |
| @@ -9630,9 +9648,7 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) | |||
| 9630 | tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL) | 9648 | tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL) |
| 9631 | tp->led_ctrl = LED_CTRL_MODE_PHY_2; | 9649 | tp->led_ctrl = LED_CTRL_MODE_PHY_2; |
| 9632 | 9650 | ||
| 9633 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700) && | 9651 | if (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP) |
| 9634 | (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) && | ||
| 9635 | (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP)) | ||
| 9636 | tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT; | 9652 | tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT; |
| 9637 | 9653 | ||
| 9638 | if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) { | 9654 | if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) { |
| @@ -10257,6 +10273,13 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
| 10257 | pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd); | 10273 | pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd); |
| 10258 | } | 10274 | } |
| 10259 | 10275 | ||
| 10276 | if (tp->write32 == tg3_write_indirect_reg32 || | ||
| 10277 | ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) && | ||
| 10278 | (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || | ||
| 10279 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) || | ||
| 10280 | (tp->tg3_flags2 & TG3_FLG2_SUN_570X)) | ||
| 10281 | tp->tg3_flags |= TG3_FLAG_SRAM_USE_CONFIG; | ||
| 10282 | |||
| 10260 | /* Get eeprom hw config before calling tg3_set_power_state(). | 10283 | /* Get eeprom hw config before calling tg3_set_power_state(). |
| 10261 | * In particular, the TG3_FLAG_EEPROM_WRITE_PROT flag must be | 10284 | * In particular, the TG3_FLAG_EEPROM_WRITE_PROT flag must be |
| 10262 | * determined before calling tg3_set_power_state() so that | 10285 | * determined before calling tg3_set_power_state() so that |
| @@ -10299,15 +10322,6 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
| 10299 | if (tp->pci_chip_rev_id == CHIPREV_ID_5700_B0) | 10322 | if (tp->pci_chip_rev_id == CHIPREV_ID_5700_B0) |
| 10300 | tp->tg3_flags |= TG3_FLAG_BROKEN_CHECKSUMS; | 10323 | tp->tg3_flags |= TG3_FLAG_BROKEN_CHECKSUMS; |
| 10301 | 10324 | ||
| 10302 | /* Pseudo-header checksum is done by hardware logic and not | ||
| 10303 | * the offload processers, so make the chip do the pseudo- | ||
| 10304 | * header checksums on receive. For transmit it is more | ||
| 10305 | * convenient to do the pseudo-header checksum in software | ||
| 10306 | * as Linux does that on transmit for us in all cases. | ||
| 10307 | */ | ||
| 10308 | tp->tg3_flags |= TG3_FLAG_NO_TX_PSEUDO_CSUM; | ||
| 10309 | tp->tg3_flags &= ~TG3_FLAG_NO_RX_PSEUDO_CSUM; | ||
| 10310 | |||
| 10311 | /* Derive initial jumbo mode from MTU assigned in | 10325 | /* Derive initial jumbo mode from MTU assigned in |
| 10312 | * ether_setup() via the alloc_etherdev() call | 10326 | * ether_setup() via the alloc_etherdev() call |
| 10313 | */ | 10327 | */ |
