|
@@ -496,7 +496,7 @@ static void e1000_receive_skb(struct e1000_adapter *adapter,
|
|
|
* @sk_buff: socket buffer with received data
|
|
|
**/
|
|
|
static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
|
|
|
- __le16 csum, struct sk_buff *skb)
|
|
|
+ struct sk_buff *skb)
|
|
|
{
|
|
|
u16 status = (u16)status_err;
|
|
|
u8 errors = (u8)(status_err >> 24);
|
|
@@ -511,8 +511,8 @@ static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
|
|
|
if (status & E1000_RXD_STAT_IXSM)
|
|
|
return;
|
|
|
|
|
|
- /* TCP/UDP checksum error bit is set */
|
|
|
- if (errors & E1000_RXD_ERR_TCPE) {
|
|
|
+ /* TCP/UDP checksum error bit or IP checksum error bit is set */
|
|
|
+ if (errors & (E1000_RXD_ERR_TCPE | E1000_RXD_ERR_IPE)) {
|
|
|
/* let the stack verify checksum errors */
|
|
|
adapter->hw_csum_err++;
|
|
|
return;
|
|
@@ -523,19 +523,7 @@ static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
|
|
|
return;
|
|
|
|
|
|
/* It must be a TCP or UDP packet with a valid checksum */
|
|
|
- if (status & E1000_RXD_STAT_TCPCS) {
|
|
|
- /* TCP checksum is good */
|
|
|
- skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
- } else {
|
|
|
- /*
|
|
|
- * IP fragment with UDP payload
|
|
|
- * Hardware complements the payload checksum, so we undo it
|
|
|
- * and then put the value in host order for further stack use.
|
|
|
- */
|
|
|
- __sum16 sum = (__force __sum16)swab16((__force u16)csum);
|
|
|
- skb->csum = csum_unfold(~sum);
|
|
|
- skb->ip_summed = CHECKSUM_COMPLETE;
|
|
|
- }
|
|
|
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
adapter->hw_csum_good++;
|
|
|
}
|
|
|
|
|
@@ -954,8 +942,7 @@ static bool e1000_clean_rx_irq(struct e1000_ring *rx_ring, int *work_done,
|
|
|
skb_put(skb, length);
|
|
|
|
|
|
/* Receive Checksum Offload */
|
|
|
- e1000_rx_checksum(adapter, staterr,
|
|
|
- rx_desc->wb.lower.hi_dword.csum_ip.csum, skb);
|
|
|
+ e1000_rx_checksum(adapter, staterr, skb);
|
|
|
|
|
|
e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb);
|
|
|
|
|
@@ -1341,8 +1328,7 @@ copydone:
|
|
|
total_rx_bytes += skb->len;
|
|
|
total_rx_packets++;
|
|
|
|
|
|
- e1000_rx_checksum(adapter, staterr,
|
|
|
- rx_desc->wb.lower.hi_dword.csum_ip.csum, skb);
|
|
|
+ e1000_rx_checksum(adapter, staterr, skb);
|
|
|
|
|
|
e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb);
|
|
|
|
|
@@ -1512,9 +1498,8 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_ring *rx_ring, int *work_done,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* Receive Checksum Offload XXX recompute due to CRC strip? */
|
|
|
- e1000_rx_checksum(adapter, staterr,
|
|
|
- rx_desc->wb.lower.hi_dword.csum_ip.csum, skb);
|
|
|
+ /* Receive Checksum Offload */
|
|
|
+ e1000_rx_checksum(adapter, staterr, skb);
|
|
|
|
|
|
e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb);
|
|
|
|
|
@@ -3098,19 +3083,10 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
|
|
|
|
|
|
/* Enable Receive Checksum Offload for TCP and UDP */
|
|
|
rxcsum = er32(RXCSUM);
|
|
|
- if (adapter->netdev->features & NETIF_F_RXCSUM) {
|
|
|
+ if (adapter->netdev->features & NETIF_F_RXCSUM)
|
|
|
rxcsum |= E1000_RXCSUM_TUOFL;
|
|
|
-
|
|
|
- /*
|
|
|
- * IPv4 payload checksum for UDP fragments must be
|
|
|
- * used in conjunction with packet-split.
|
|
|
- */
|
|
|
- if (adapter->rx_ps_pages)
|
|
|
- rxcsum |= E1000_RXCSUM_IPPCSE;
|
|
|
- } else {
|
|
|
+ else
|
|
|
rxcsum &= ~E1000_RXCSUM_TUOFL;
|
|
|
- /* no need to clear IPPCSE as it defaults to 0 */
|
|
|
- }
|
|
|
ew32(RXCSUM, rxcsum);
|
|
|
|
|
|
if (adapter->hw.mac.type == e1000_pch2lan) {
|
|
@@ -5241,22 +5217,10 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
|
|
|
int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
|
|
|
|
|
|
/* Jumbo frame support */
|
|
|
- if (max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) {
|
|
|
- if (!(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) {
|
|
|
- e_err("Jumbo Frames not supported.\n");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * IP payload checksum (enabled with jumbos/packet-split when
|
|
|
- * Rx checksum is enabled) and generation of RSS hash is
|
|
|
- * mutually exclusive in the hardware.
|
|
|
- */
|
|
|
- if ((netdev->features & NETIF_F_RXCSUM) &&
|
|
|
- (netdev->features & NETIF_F_RXHASH)) {
|
|
|
- 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");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
+ if ((max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) &&
|
|
|
+ !(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) {
|
|
|
+ e_err("Jumbo Frames not supported.\n");
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
/* Supported frame sizes */
|
|
@@ -6030,17 +5994,6 @@ static int e1000_set_features(struct net_device *netdev,
|
|
|
NETIF_F_RXALL)))
|
|
|
return 0;
|
|
|
|
|
|
- /*
|
|
|
- * IP payload checksum (enabled with jumbos/packet-split when Rx
|
|
|
- * checksum is enabled) and generation of RSS hash is mutually
|
|
|
- * exclusive in the hardware.
|
|
|
- */
|
|
|
- if (adapter->rx_ps_pages &&
|
|
|
- (features & NETIF_F_RXCSUM) && (features & NETIF_F_RXHASH)) {
|
|
|
- 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");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
if (changed & NETIF_F_RXFCS) {
|
|
|
if (features & NETIF_F_RXFCS) {
|
|
|
adapter->flags2 &= ~FLAG2_CRC_STRIPPING;
|