diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/tg3.c | 41 | ||||
-rw-r--r-- | drivers/net/tg3.h | 5 |
2 files changed, 27 insertions, 19 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 29276e62f128..6831289baf2a 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -5206,7 +5206,7 @@ static void tg3_set_txd(struct tg3_napi *tnapi, int entry, | |||
5206 | } | 5206 | } |
5207 | 5207 | ||
5208 | /* hard_start_xmit for devices that don't have any bugs and | 5208 | /* hard_start_xmit for devices that don't have any bugs and |
5209 | * support TG3_FLG2_HW_TSO_2 only. | 5209 | * support TG3_FLG2_HW_TSO_2 and TG3_FLG2_HW_TSO_3 only. |
5210 | */ | 5210 | */ |
5211 | static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, | 5211 | static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, |
5212 | struct net_device *dev) | 5212 | struct net_device *dev) |
@@ -5265,7 +5265,7 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, | |||
5265 | hdrlen = ip_tcp_len + tcp_opt_len; | 5265 | hdrlen = ip_tcp_len + tcp_opt_len; |
5266 | } | 5266 | } |
5267 | 5267 | ||
5268 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717) { | 5268 | if (tp->tg3_flags2 & TG3_FLG2_HW_TSO_3) { |
5269 | mss |= (hdrlen & 0xc) << 12; | 5269 | mss |= (hdrlen & 0xc) << 12; |
5270 | if (hdrlen & 0x10) | 5270 | if (hdrlen & 0x10) |
5271 | base_flags |= 0x00000010; | 5271 | base_flags |= 0x00000010; |
@@ -7523,7 +7523,8 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
7523 | if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) | 7523 | if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) |
7524 | rdmac_mode |= RDMAC_MODE_IPV4_LSO_EN; | 7524 | rdmac_mode |= RDMAC_MODE_IPV4_LSO_EN; |
7525 | 7525 | ||
7526 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || | 7526 | if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_3) || |
7527 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || | ||
7527 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) | 7528 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) |
7528 | rdmac_mode |= RDMAC_MODE_IPV6_LSO_EN; | 7529 | rdmac_mode |= RDMAC_MODE_IPV6_LSO_EN; |
7529 | 7530 | ||
@@ -9513,15 +9514,16 @@ static int tg3_set_tso(struct net_device *dev, u32 value) | |||
9513 | return 0; | 9514 | return 0; |
9514 | } | 9515 | } |
9515 | if ((dev->features & NETIF_F_IPV6_CSUM) && | 9516 | if ((dev->features & NETIF_F_IPV6_CSUM) && |
9516 | (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2)) { | 9517 | ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) || |
9518 | (tp->tg3_flags2 & TG3_FLG2_HW_TSO_3))) { | ||
9517 | if (value) { | 9519 | if (value) { |
9518 | dev->features |= NETIF_F_TSO6; | 9520 | dev->features |= NETIF_F_TSO6; |
9519 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || | 9521 | if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_3) || |
9522 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || | ||
9520 | (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 && | 9523 | (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 && |
9521 | GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) || | 9524 | GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) || |
9522 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || | 9525 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || |
9523 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || | 9526 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) |
9524 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717) | ||
9525 | dev->features |= NETIF_F_TSO_ECN; | 9527 | dev->features |= NETIF_F_TSO_ECN; |
9526 | } else | 9528 | } else |
9527 | dev->features &= ~(NETIF_F_TSO6 | NETIF_F_TSO_ECN); | 9529 | dev->features &= ~(NETIF_F_TSO6 | NETIF_F_TSO_ECN); |
@@ -12670,8 +12672,10 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
12670 | } | 12672 | } |
12671 | 12673 | ||
12672 | /* Determine TSO capabilities */ | 12674 | /* Determine TSO capabilities */ |
12673 | if ((tp->tg3_flags3 & TG3_FLG3_5755_PLUS) || | 12675 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717) |
12674 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) | 12676 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO_3; |
12677 | else if ((tp->tg3_flags3 & TG3_FLG3_5755_PLUS) || | ||
12678 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) | ||
12675 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2; | 12679 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2; |
12676 | else if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) { | 12680 | else if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) { |
12677 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO_1 | TG3_FLG2_TSO_BUG; | 12681 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO_1 | TG3_FLG2_TSO_BUG; |
@@ -14136,22 +14140,23 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
14136 | * Firmware TSO on older chips gives lower performance, so it | 14140 | * Firmware TSO on older chips gives lower performance, so it |
14137 | * is off by default, but can be enabled using ethtool. | 14141 | * is off by default, but can be enabled using ethtool. |
14138 | */ | 14142 | */ |
14139 | if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) { | 14143 | if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO) && |
14140 | if (dev->features & NETIF_F_IP_CSUM) | 14144 | (dev->features & NETIF_F_IP_CSUM)) |
14141 | dev->features |= NETIF_F_TSO; | 14145 | dev->features |= NETIF_F_TSO; |
14142 | if ((dev->features & NETIF_F_IPV6_CSUM) && | 14146 | |
14143 | (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2)) | 14147 | if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) || |
14148 | (tp->tg3_flags2 & TG3_FLG2_HW_TSO_3)) { | ||
14149 | if (dev->features & NETIF_F_IPV6_CSUM) | ||
14144 | dev->features |= NETIF_F_TSO6; | 14150 | dev->features |= NETIF_F_TSO6; |
14145 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || | 14151 | if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_3) || |
14152 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || | ||
14146 | (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 && | 14153 | (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 && |
14147 | GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) || | 14154 | GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) || |
14148 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || | 14155 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || |
14149 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || | 14156 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) |
14150 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717) | ||
14151 | dev->features |= NETIF_F_TSO_ECN; | 14157 | dev->features |= NETIF_F_TSO_ECN; |
14152 | } | 14158 | } |
14153 | 14159 | ||
14154 | |||
14155 | if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 && | 14160 | if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 && |
14156 | !(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) && | 14161 | !(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) && |
14157 | !(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH)) { | 14162 | !(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH)) { |
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index 590a692d6a95..5fe57603d1f0 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
@@ -2753,6 +2753,7 @@ struct tg3 { | |||
2753 | #define TG3_FLG2_SERDES_PREEMPHASIS 0x00020000 | 2753 | #define TG3_FLG2_SERDES_PREEMPHASIS 0x00020000 |
2754 | #define TG3_FLG2_5705_PLUS 0x00040000 | 2754 | #define TG3_FLG2_5705_PLUS 0x00040000 |
2755 | #define TG3_FLG2_5750_PLUS 0x00080000 | 2755 | #define TG3_FLG2_5750_PLUS 0x00080000 |
2756 | #define TG3_FLG2_HW_TSO_3 0x00100000 | ||
2756 | #define TG3_FLG2_USING_MSI 0x00200000 | 2757 | #define TG3_FLG2_USING_MSI 0x00200000 |
2757 | #define TG3_FLG2_USING_MSIX 0x00400000 | 2758 | #define TG3_FLG2_USING_MSIX 0x00400000 |
2758 | #define TG3_FLG2_USING_MSI_OR_MSIX (TG3_FLG2_USING_MSI | \ | 2759 | #define TG3_FLG2_USING_MSI_OR_MSIX (TG3_FLG2_USING_MSI | \ |
@@ -2764,7 +2765,9 @@ struct tg3 { | |||
2764 | #define TG3_FLG2_ICH_WORKAROUND 0x02000000 | 2765 | #define TG3_FLG2_ICH_WORKAROUND 0x02000000 |
2765 | #define TG3_FLG2_5780_CLASS 0x04000000 | 2766 | #define TG3_FLG2_5780_CLASS 0x04000000 |
2766 | #define TG3_FLG2_HW_TSO_2 0x08000000 | 2767 | #define TG3_FLG2_HW_TSO_2 0x08000000 |
2767 | #define TG3_FLG2_HW_TSO (TG3_FLG2_HW_TSO_1 | TG3_FLG2_HW_TSO_2) | 2768 | #define TG3_FLG2_HW_TSO (TG3_FLG2_HW_TSO_1 | \ |
2769 | TG3_FLG2_HW_TSO_2 | \ | ||
2770 | TG3_FLG2_HW_TSO_3) | ||
2768 | #define TG3_FLG2_1SHOT_MSI 0x10000000 | 2771 | #define TG3_FLG2_1SHOT_MSI 0x10000000 |
2769 | #define TG3_FLG2_PHY_JITTER_BUG 0x20000000 | 2772 | #define TG3_FLG2_PHY_JITTER_BUG 0x20000000 |
2770 | #define TG3_FLG2_NO_FWARE_REPORTED 0x40000000 | 2773 | #define TG3_FLG2_NO_FWARE_REPORTED 0x40000000 |