diff options
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r-- | drivers/net/tg3.c | 64 |
1 files changed, 34 insertions, 30 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index f74d80d5515d..29276e62f128 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -12669,6 +12669,27 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
12669 | tp->dev->features |= NETIF_F_IPV6_CSUM; | 12669 | tp->dev->features |= NETIF_F_IPV6_CSUM; |
12670 | } | 12670 | } |
12671 | 12671 | ||
12672 | /* Determine TSO capabilities */ | ||
12673 | if ((tp->tg3_flags3 & TG3_FLG3_5755_PLUS) || | ||
12674 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) | ||
12675 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2; | ||
12676 | else if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) { | ||
12677 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO_1 | TG3_FLG2_TSO_BUG; | ||
12678 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 && | ||
12679 | tp->pci_chip_rev_id >= CHIPREV_ID_5750_C2) | ||
12680 | tp->tg3_flags2 &= ~TG3_FLG2_TSO_BUG; | ||
12681 | } else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 && | ||
12682 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701 && | ||
12683 | tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) { | ||
12684 | tp->tg3_flags2 |= TG3_FLG2_TSO_BUG; | ||
12685 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) | ||
12686 | tp->fw_needed = FIRMWARE_TG3TSO5; | ||
12687 | else | ||
12688 | tp->fw_needed = FIRMWARE_TG3TSO; | ||
12689 | } | ||
12690 | |||
12691 | tp->irq_max = 1; | ||
12692 | |||
12672 | if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) { | 12693 | if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) { |
12673 | tp->tg3_flags |= TG3_FLAG_SUPPORT_MSI; | 12694 | tp->tg3_flags |= TG3_FLAG_SUPPORT_MSI; |
12674 | if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_AX || | 12695 | if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_AX || |
@@ -12680,22 +12701,13 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
12680 | 12701 | ||
12681 | if ((tp->tg3_flags3 & TG3_FLG3_5755_PLUS) || | 12702 | if ((tp->tg3_flags3 & TG3_FLG3_5755_PLUS) || |
12682 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | 12703 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { |
12683 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2; | ||
12684 | tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI; | 12704 | tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI; |
12685 | } else { | ||
12686 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO_1 | TG3_FLG2_TSO_BUG; | ||
12687 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == | ||
12688 | ASIC_REV_5750 && | ||
12689 | tp->pci_chip_rev_id >= CHIPREV_ID_5750_C2) | ||
12690 | tp->tg3_flags2 &= ~TG3_FLG2_TSO_BUG; | ||
12691 | } | 12705 | } |
12692 | } | ||
12693 | |||
12694 | tp->irq_max = 1; | ||
12695 | 12706 | ||
12696 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717) { | 12707 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717) { |
12697 | tp->tg3_flags |= TG3_FLAG_SUPPORT_MSIX; | 12708 | tp->tg3_flags |= TG3_FLAG_SUPPORT_MSIX; |
12698 | tp->irq_max = TG3_IRQ_MAX_VECS; | 12709 | tp->irq_max = TG3_IRQ_MAX_VECS; |
12710 | } | ||
12699 | } | 12711 | } |
12700 | 12712 | ||
12701 | if (!(tp->tg3_flags3 & TG3_FLG3_5755_PLUS)) { | 12713 | if (!(tp->tg3_flags3 & TG3_FLG3_5755_PLUS)) { |
@@ -14108,25 +14120,17 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
14108 | 14120 | ||
14109 | tg3_init_bufmgr_config(tp); | 14121 | tg3_init_bufmgr_config(tp); |
14110 | 14122 | ||
14111 | if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0) | 14123 | /* Selectively allow TSO based on operating conditions */ |
14112 | tp->fw_needed = FIRMWARE_TG3; | 14124 | if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO) || |
14113 | 14125 | (tp->fw_needed && !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))) | |
14114 | if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) { | ||
14115 | tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE; | 14126 | tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE; |
14127 | else { | ||
14128 | tp->tg3_flags2 &= ~(TG3_FLG2_TSO_CAPABLE | TG3_FLG2_TSO_BUG); | ||
14129 | tp->fw_needed = NULL; | ||
14116 | } | 14130 | } |
14117 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || | 14131 | |
14118 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 || | 14132 | if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0) |
14119 | tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 || | 14133 | tp->fw_needed = FIRMWARE_TG3; |
14120 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 || | ||
14121 | (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) { | ||
14122 | tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE; | ||
14123 | } else { | ||
14124 | tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE | TG3_FLG2_TSO_BUG; | ||
14125 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) | ||
14126 | tp->fw_needed = FIRMWARE_TG3TSO5; | ||
14127 | else | ||
14128 | tp->fw_needed = FIRMWARE_TG3TSO; | ||
14129 | } | ||
14130 | 14134 | ||
14131 | /* TSO is on by default on chips that support hardware TSO. | 14135 | /* TSO is on by default on chips that support hardware TSO. |
14132 | * Firmware TSO on older chips gives lower performance, so it | 14136 | * Firmware TSO on older chips gives lower performance, so it |