diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/netdev.c')
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 79 |
1 files changed, 16 insertions, 63 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index a4b0435b00dc..623e30b9964d 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
| @@ -496,7 +496,7 @@ static void e1000_receive_skb(struct e1000_adapter *adapter, | |||
| 496 | * @sk_buff: socket buffer with received data | 496 | * @sk_buff: socket buffer with received data |
| 497 | **/ | 497 | **/ |
| 498 | static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err, | 498 | static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err, |
| 499 | __le16 csum, struct sk_buff *skb) | 499 | struct sk_buff *skb) |
| 500 | { | 500 | { |
| 501 | u16 status = (u16)status_err; | 501 | u16 status = (u16)status_err; |
| 502 | u8 errors = (u8)(status_err >> 24); | 502 | u8 errors = (u8)(status_err >> 24); |
| @@ -511,8 +511,8 @@ static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err, | |||
| 511 | if (status & E1000_RXD_STAT_IXSM) | 511 | if (status & E1000_RXD_STAT_IXSM) |
| 512 | return; | 512 | return; |
| 513 | 513 | ||
| 514 | /* TCP/UDP checksum error bit is set */ | 514 | /* TCP/UDP checksum error bit or IP checksum error bit is set */ |
| 515 | if (errors & E1000_RXD_ERR_TCPE) { | 515 | if (errors & (E1000_RXD_ERR_TCPE | E1000_RXD_ERR_IPE)) { |
| 516 | /* let the stack verify checksum errors */ | 516 | /* let the stack verify checksum errors */ |
| 517 | adapter->hw_csum_err++; | 517 | adapter->hw_csum_err++; |
| 518 | return; | 518 | return; |
| @@ -523,19 +523,7 @@ static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err, | |||
| 523 | return; | 523 | return; |
| 524 | 524 | ||
| 525 | /* It must be a TCP or UDP packet with a valid checksum */ | 525 | /* It must be a TCP or UDP packet with a valid checksum */ |
| 526 | if (status & E1000_RXD_STAT_TCPCS) { | 526 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| 527 | /* TCP checksum is good */ | ||
| 528 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
| 529 | } else { | ||
| 530 | /* | ||
| 531 | * IP fragment with UDP payload | ||
| 532 | * Hardware complements the payload checksum, so we undo it | ||
| 533 | * and then put the value in host order for further stack use. | ||
| 534 | */ | ||
| 535 | __sum16 sum = (__force __sum16)swab16((__force u16)csum); | ||
| 536 | skb->csum = csum_unfold(~sum); | ||
| 537 | skb->ip_summed = CHECKSUM_COMPLETE; | ||
| 538 | } | ||
| 539 | adapter->hw_csum_good++; | 527 | adapter->hw_csum_good++; |
| 540 | } | 528 | } |
| 541 | 529 | ||
| @@ -954,8 +942,7 @@ static bool e1000_clean_rx_irq(struct e1000_ring *rx_ring, int *work_done, | |||
| 954 | skb_put(skb, length); | 942 | skb_put(skb, length); |
| 955 | 943 | ||
| 956 | /* Receive Checksum Offload */ | 944 | /* Receive Checksum Offload */ |
| 957 | e1000_rx_checksum(adapter, staterr, | 945 | e1000_rx_checksum(adapter, staterr, skb); |
| 958 | rx_desc->wb.lower.hi_dword.csum_ip.csum, skb); | ||
| 959 | 946 | ||
| 960 | e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb); | 947 | e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb); |
| 961 | 948 | ||
| @@ -1341,8 +1328,7 @@ copydone: | |||
| 1341 | total_rx_bytes += skb->len; | 1328 | total_rx_bytes += skb->len; |
| 1342 | total_rx_packets++; | 1329 | total_rx_packets++; |
| 1343 | 1330 | ||
| 1344 | e1000_rx_checksum(adapter, staterr, | 1331 | e1000_rx_checksum(adapter, staterr, skb); |
| 1345 | rx_desc->wb.lower.hi_dword.csum_ip.csum, skb); | ||
| 1346 | 1332 | ||
| 1347 | e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb); | 1333 | e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb); |
| 1348 | 1334 | ||
| @@ -1512,9 +1498,8 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_ring *rx_ring, int *work_done, | |||
| 1512 | } | 1498 | } |
| 1513 | } | 1499 | } |
| 1514 | 1500 | ||
| 1515 | /* Receive Checksum Offload XXX recompute due to CRC strip? */ | 1501 | /* Receive Checksum Offload */ |
| 1516 | e1000_rx_checksum(adapter, staterr, | 1502 | e1000_rx_checksum(adapter, staterr, skb); |
| 1517 | rx_desc->wb.lower.hi_dword.csum_ip.csum, skb); | ||
| 1518 | 1503 | ||
| 1519 | e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb); | 1504 | e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb); |
| 1520 | 1505 | ||
| @@ -3098,19 +3083,10 @@ static void e1000_configure_rx(struct e1000_adapter *adapter) | |||
| 3098 | 3083 | ||
| 3099 | /* Enable Receive Checksum Offload for TCP and UDP */ | 3084 | /* Enable Receive Checksum Offload for TCP and UDP */ |
| 3100 | rxcsum = er32(RXCSUM); | 3085 | rxcsum = er32(RXCSUM); |
| 3101 | if (adapter->netdev->features & NETIF_F_RXCSUM) { | 3086 | if (adapter->netdev->features & NETIF_F_RXCSUM) |
| 3102 | rxcsum |= E1000_RXCSUM_TUOFL; | 3087 | rxcsum |= E1000_RXCSUM_TUOFL; |
| 3103 | 3088 | else | |
| 3104 | /* | ||
| 3105 | * IPv4 payload checksum for UDP fragments must be | ||
| 3106 | * used in conjunction with packet-split. | ||
| 3107 | */ | ||
| 3108 | if (adapter->rx_ps_pages) | ||
| 3109 | rxcsum |= E1000_RXCSUM_IPPCSE; | ||
| 3110 | } else { | ||
| 3111 | rxcsum &= ~E1000_RXCSUM_TUOFL; | 3089 | rxcsum &= ~E1000_RXCSUM_TUOFL; |
| 3112 | /* no need to clear IPPCSE as it defaults to 0 */ | ||
| 3113 | } | ||
| 3114 | ew32(RXCSUM, rxcsum); | 3090 | ew32(RXCSUM, rxcsum); |
| 3115 | 3091 | ||
| 3116 | if (adapter->hw.mac.type == e1000_pch2lan) { | 3092 | if (adapter->hw.mac.type == e1000_pch2lan) { |
| @@ -5241,22 +5217,10 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) | |||
| 5241 | int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; | 5217 | int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; |
| 5242 | 5218 | ||
| 5243 | /* Jumbo frame support */ | 5219 | /* Jumbo frame support */ |
| 5244 | if (max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) { | 5220 | if ((max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) && |
| 5245 | if (!(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) { | 5221 | !(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) { |
| 5246 | e_err("Jumbo Frames not supported.\n"); | 5222 | e_err("Jumbo Frames not supported.\n"); |
| 5247 | return -EINVAL; | 5223 | return -EINVAL; |
| 5248 | } | ||
| 5249 | |||
| 5250 | /* | ||
| 5251 | * IP payload checksum (enabled with jumbos/packet-split when | ||
| 5252 | * Rx checksum is enabled) and generation of RSS hash is | ||
| 5253 | * mutually exclusive in the hardware. | ||
| 5254 | */ | ||
| 5255 | if ((netdev->features & NETIF_F_RXCSUM) && | ||
| 5256 | (netdev->features & NETIF_F_RXHASH)) { | ||
| 5257 | e_err("Jumbo frames cannot be enabled when both receive checksum offload and receive hashing are enabled. Disable one of the receive offload features before enabling jumbos.\n"); | ||
| 5258 | return -EINVAL; | ||
| 5259 | } | ||
| 5260 | } | 5224 | } |
| 5261 | 5225 | ||
| 5262 | /* Supported frame sizes */ | 5226 | /* Supported frame sizes */ |
| @@ -6030,17 +5994,6 @@ static int e1000_set_features(struct net_device *netdev, | |||
| 6030 | NETIF_F_RXALL))) | 5994 | NETIF_F_RXALL))) |
| 6031 | return 0; | 5995 | return 0; |
| 6032 | 5996 | ||
| 6033 | /* | ||
| 6034 | * IP payload checksum (enabled with jumbos/packet-split when Rx | ||
| 6035 | * checksum is enabled) and generation of RSS hash is mutually | ||
| 6036 | * exclusive in the hardware. | ||
| 6037 | */ | ||
| 6038 | if (adapter->rx_ps_pages && | ||
| 6039 | (features & NETIF_F_RXCSUM) && (features & NETIF_F_RXHASH)) { | ||
| 6040 | e_err("Enabling both receive checksum offload and receive hashing is not possible with jumbo frames. Disable jumbos or enable only one of the receive offload features.\n"); | ||
| 6041 | return -EINVAL; | ||
| 6042 | } | ||
| 6043 | |||
| 6044 | if (changed & NETIF_F_RXFCS) { | 5997 | if (changed & NETIF_F_RXFCS) { |
| 6045 | if (features & NETIF_F_RXFCS) { | 5998 | if (features & NETIF_F_RXFCS) { |
| 6046 | adapter->flags2 &= ~FLAG2_CRC_STRIPPING; | 5999 | adapter->flags2 &= ~FLAG2_CRC_STRIPPING; |
| @@ -6237,7 +6190,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 6237 | adapter->hw.phy.ms_type = e1000_ms_hw_default; | 6190 | adapter->hw.phy.ms_type = e1000_ms_hw_default; |
| 6238 | } | 6191 | } |
| 6239 | 6192 | ||
| 6240 | if (hw->phy.ops.check_reset_block(hw)) | 6193 | if (hw->phy.ops.check_reset_block && hw->phy.ops.check_reset_block(hw)) |
| 6241 | e_info("PHY reset is blocked due to SOL/IDER session.\n"); | 6194 | e_info("PHY reset is blocked due to SOL/IDER session.\n"); |
| 6242 | 6195 | ||
| 6243 | /* Set initial default active device features */ | 6196 | /* Set initial default active device features */ |
| @@ -6404,7 +6357,7 @@ err_register: | |||
| 6404 | if (!(adapter->flags & FLAG_HAS_AMT)) | 6357 | if (!(adapter->flags & FLAG_HAS_AMT)) |
| 6405 | e1000e_release_hw_control(adapter); | 6358 | e1000e_release_hw_control(adapter); |
| 6406 | err_eeprom: | 6359 | err_eeprom: |
| 6407 | if (!hw->phy.ops.check_reset_block(hw)) | 6360 | if (hw->phy.ops.check_reset_block && !hw->phy.ops.check_reset_block(hw)) |
| 6408 | e1000_phy_hw_reset(&adapter->hw); | 6361 | e1000_phy_hw_reset(&adapter->hw); |
| 6409 | err_hw_init: | 6362 | err_hw_init: |
| 6410 | kfree(adapter->tx_ring); | 6363 | kfree(adapter->tx_ring); |
