diff options
-rw-r--r-- | drivers/net/igb/igb.h | 2 | ||||
-rw-r--r-- | drivers/net/igb/igb_ethtool.c | 8 | ||||
-rw-r--r-- | drivers/net/igb/igb_main.c | 12 |
3 files changed, 12 insertions, 10 deletions
diff --git a/drivers/net/igb/igb.h b/drivers/net/igb/igb.h index 4e8464b9df2e..154c5acc6fce 100644 --- a/drivers/net/igb/igb.h +++ b/drivers/net/igb/igb.h | |||
@@ -238,7 +238,6 @@ struct igb_adapter { | |||
238 | u64 hw_csum_err; | 238 | u64 hw_csum_err; |
239 | u64 hw_csum_good; | 239 | u64 hw_csum_good; |
240 | u32 alloc_rx_buff_failed; | 240 | u32 alloc_rx_buff_failed; |
241 | bool rx_csum; | ||
242 | u32 gorc; | 241 | u32 gorc; |
243 | u64 gorc_old; | 242 | u64 gorc_old; |
244 | u16 rx_ps_hdr_size; | 243 | u16 rx_ps_hdr_size; |
@@ -286,6 +285,7 @@ struct igb_adapter { | |||
286 | #define IGB_FLAG_DCA_ENABLED (1 << 1) | 285 | #define IGB_FLAG_DCA_ENABLED (1 << 1) |
287 | #define IGB_FLAG_QUAD_PORT_A (1 << 2) | 286 | #define IGB_FLAG_QUAD_PORT_A (1 << 2) |
288 | #define IGB_FLAG_NEED_CTX_IDX (1 << 3) | 287 | #define IGB_FLAG_NEED_CTX_IDX (1 << 3) |
288 | #define IGB_FLAG_RX_CSUM_DISABLED (1 << 4) | ||
289 | 289 | ||
290 | enum e1000_state_t { | 290 | enum e1000_state_t { |
291 | __IGB_TESTING, | 291 | __IGB_TESTING, |
diff --git a/drivers/net/igb/igb_ethtool.c b/drivers/net/igb/igb_ethtool.c index b1367ce6586e..b8551a57dd3f 100644 --- a/drivers/net/igb/igb_ethtool.c +++ b/drivers/net/igb/igb_ethtool.c | |||
@@ -275,13 +275,17 @@ static int igb_set_pauseparam(struct net_device *netdev, | |||
275 | static u32 igb_get_rx_csum(struct net_device *netdev) | 275 | static u32 igb_get_rx_csum(struct net_device *netdev) |
276 | { | 276 | { |
277 | struct igb_adapter *adapter = netdev_priv(netdev); | 277 | struct igb_adapter *adapter = netdev_priv(netdev); |
278 | return adapter->rx_csum; | 278 | return !(adapter->flags & IGB_FLAG_RX_CSUM_DISABLED); |
279 | } | 279 | } |
280 | 280 | ||
281 | static int igb_set_rx_csum(struct net_device *netdev, u32 data) | 281 | static int igb_set_rx_csum(struct net_device *netdev, u32 data) |
282 | { | 282 | { |
283 | struct igb_adapter *adapter = netdev_priv(netdev); | 283 | struct igb_adapter *adapter = netdev_priv(netdev); |
284 | adapter->rx_csum = data; | 284 | |
285 | if (data) | ||
286 | adapter->flags &= ~IGB_FLAG_RX_CSUM_DISABLED; | ||
287 | else | ||
288 | adapter->flags |= IGB_FLAG_RX_CSUM_DISABLED; | ||
285 | 289 | ||
286 | return 0; | 290 | return 0; |
287 | } | 291 | } |
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index bca7e9f76be4..8de8629b07ec 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
@@ -1395,8 +1395,6 @@ static int __devinit igb_probe(struct pci_dev *pdev, | |||
1395 | 1395 | ||
1396 | igb_validate_mdi_setting(hw); | 1396 | igb_validate_mdi_setting(hw); |
1397 | 1397 | ||
1398 | adapter->rx_csum = 1; | ||
1399 | |||
1400 | /* Initial Wake on LAN setting If APM wake is enabled in the EEPROM, | 1398 | /* Initial Wake on LAN setting If APM wake is enabled in the EEPROM, |
1401 | * enable the ACPI Magic Packet filter | 1399 | * enable the ACPI Magic Packet filter |
1402 | */ | 1400 | */ |
@@ -2249,13 +2247,12 @@ static void igb_configure_rx(struct igb_adapter *adapter) | |||
2249 | rxcsum = rd32(E1000_RXCSUM); | 2247 | rxcsum = rd32(E1000_RXCSUM); |
2250 | /* Disable raw packet checksumming */ | 2248 | /* Disable raw packet checksumming */ |
2251 | rxcsum |= E1000_RXCSUM_PCSD; | 2249 | rxcsum |= E1000_RXCSUM_PCSD; |
2252 | /* Don't need to set TUOFL or IPOFL, they default to 1 */ | 2250 | |
2253 | if (!adapter->rx_csum) | 2251 | if (adapter->hw.mac.type == e1000_82576) |
2254 | rxcsum &= ~(E1000_RXCSUM_TUOFL | E1000_RXCSUM_IPOFL); | ||
2255 | else if (adapter->hw.mac.type == e1000_82576) | ||
2256 | /* Enable Receive Checksum Offload for SCTP */ | 2252 | /* Enable Receive Checksum Offload for SCTP */ |
2257 | rxcsum |= E1000_RXCSUM_CRCOFL; | 2253 | rxcsum |= E1000_RXCSUM_CRCOFL; |
2258 | 2254 | ||
2255 | /* Don't need to set TUOFL or IPOFL, they default to 1 */ | ||
2259 | wr32(E1000_RXCSUM, rxcsum); | 2256 | wr32(E1000_RXCSUM, rxcsum); |
2260 | 2257 | ||
2261 | /* Set the default pool for the PF's first queue */ | 2258 | /* Set the default pool for the PF's first queue */ |
@@ -4455,7 +4452,8 @@ static inline void igb_rx_checksum_adv(struct igb_adapter *adapter, | |||
4455 | skb->ip_summed = CHECKSUM_NONE; | 4452 | skb->ip_summed = CHECKSUM_NONE; |
4456 | 4453 | ||
4457 | /* Ignore Checksum bit is set or checksum is disabled through ethtool */ | 4454 | /* Ignore Checksum bit is set or checksum is disabled through ethtool */ |
4458 | if ((status_err & E1000_RXD_STAT_IXSM) || !adapter->rx_csum) | 4455 | if ((status_err & E1000_RXD_STAT_IXSM) || |
4456 | (adapter->flags & IGB_FLAG_RX_CSUM_DISABLED)) | ||
4459 | return; | 4457 | return; |
4460 | /* TCP/UDP checksum error bit is set */ | 4458 | /* TCP/UDP checksum error bit is set */ |
4461 | if (status_err & | 4459 | if (status_err & |