aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000e
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/e1000e')
-rw-r--r--drivers/net/e1000e/e1000.h5
-rw-r--r--drivers/net/e1000e/ethtool.c8
-rw-r--r--drivers/net/e1000e/netdev.c25
-rw-r--r--drivers/net/e1000e/param.c25
4 files changed, 59 insertions, 4 deletions
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h
index c55de1c027af..c55fd6fdb91c 100644
--- a/drivers/net/e1000e/e1000.h
+++ b/drivers/net/e1000e/e1000.h
@@ -299,6 +299,7 @@ struct e1000_adapter {
299 unsigned long led_status; 299 unsigned long led_status;
300 300
301 unsigned int flags; 301 unsigned int flags;
302 unsigned int flags2;
302 struct work_struct downshift_task; 303 struct work_struct downshift_task;
303 struct work_struct update_phy_task; 304 struct work_struct update_phy_task;
304}; 305};
@@ -306,6 +307,7 @@ struct e1000_adapter {
306struct e1000_info { 307struct e1000_info {
307 enum e1000_mac_type mac; 308 enum e1000_mac_type mac;
308 unsigned int flags; 309 unsigned int flags;
310 unsigned int flags2;
309 u32 pba; 311 u32 pba;
310 s32 (*get_variants)(struct e1000_adapter *); 312 s32 (*get_variants)(struct e1000_adapter *);
311 struct e1000_mac_operations *mac_ops; 313 struct e1000_mac_operations *mac_ops;
@@ -347,6 +349,9 @@ struct e1000_info {
347#define FLAG_RX_RESTART_NOW (1 << 30) 349#define FLAG_RX_RESTART_NOW (1 << 30)
348#define FLAG_MSI_TEST_FAILED (1 << 31) 350#define FLAG_MSI_TEST_FAILED (1 << 31)
349 351
352/* CRC Stripping defines */
353#define FLAG2_CRC_STRIPPING (1 << 0)
354
350#define E1000_RX_DESC_PS(R, i) \ 355#define E1000_RX_DESC_PS(R, i) \
351 (&(((union e1000_rx_desc_packet_split *)((R).desc))[i])) 356 (&(((union e1000_rx_desc_packet_split *)((R).desc))[i]))
352#define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i])) 357#define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i]))
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c
index 70c11c811a08..62421ce96311 100644
--- a/drivers/net/e1000e/ethtool.c
+++ b/drivers/net/e1000e/ethtool.c
@@ -1713,7 +1713,8 @@ static void e1000_get_wol(struct net_device *netdev,
1713 wol->supported = 0; 1713 wol->supported = 0;
1714 wol->wolopts = 0; 1714 wol->wolopts = 0;
1715 1715
1716 if (!(adapter->flags & FLAG_HAS_WOL)) 1716 if (!(adapter->flags & FLAG_HAS_WOL) ||
1717 !device_can_wakeup(&adapter->pdev->dev))
1717 return; 1718 return;
1718 1719
1719 wol->supported = WAKE_UCAST | WAKE_MCAST | 1720 wol->supported = WAKE_UCAST | WAKE_MCAST |
@@ -1751,7 +1752,8 @@ static int e1000_set_wol(struct net_device *netdev,
1751 if (wol->wolopts & WAKE_MAGICSECURE) 1752 if (wol->wolopts & WAKE_MAGICSECURE)
1752 return -EOPNOTSUPP; 1753 return -EOPNOTSUPP;
1753 1754
1754 if (!(adapter->flags & FLAG_HAS_WOL)) 1755 if (!(adapter->flags & FLAG_HAS_WOL) ||
1756 !device_can_wakeup(&adapter->pdev->dev))
1755 return wol->wolopts ? -EOPNOTSUPP : 0; 1757 return wol->wolopts ? -EOPNOTSUPP : 0;
1756 1758
1757 /* these settings will always override what we currently have */ 1759 /* these settings will always override what we currently have */
@@ -1770,6 +1772,8 @@ static int e1000_set_wol(struct net_device *netdev,
1770 if (wol->wolopts & WAKE_ARP) 1772 if (wol->wolopts & WAKE_ARP)
1771 adapter->wol |= E1000_WUFC_ARP; 1773 adapter->wol |= E1000_WUFC_ARP;
1772 1774
1775 device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
1776
1773 return 0; 1777 return 0;
1774} 1778}
1775 1779
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
index 3eeae1cf994e..4f06641cd6d4 100644
--- a/drivers/net/e1000e/netdev.c
+++ b/drivers/net/e1000e/netdev.c
@@ -497,6 +497,10 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
497 goto next_desc; 497 goto next_desc;
498 } 498 }
499 499
500 /* adjust length to remove Ethernet CRC */
501 if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
502 length -= 4;
503
500 total_rx_bytes += length; 504 total_rx_bytes += length;
501 total_rx_packets++; 505 total_rx_packets++;
502 506
@@ -802,6 +806,10 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
802 pci_dma_sync_single_for_device(pdev, ps_page->dma, 806 pci_dma_sync_single_for_device(pdev, ps_page->dma,
803 PAGE_SIZE, PCI_DMA_FROMDEVICE); 807 PAGE_SIZE, PCI_DMA_FROMDEVICE);
804 808
809 /* remove the CRC */
810 if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
811 l1 -= 4;
812
805 skb_put(skb, l1); 813 skb_put(skb, l1);
806 goto copydone; 814 goto copydone;
807 } /* if */ 815 } /* if */
@@ -823,6 +831,12 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
823 skb->truesize += length; 831 skb->truesize += length;
824 } 832 }
825 833
834 /* strip the ethernet crc, problem is we're using pages now so
835 * this whole operation can get a little cpu intensive
836 */
837 if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
838 pskb_trim(skb, skb->len - 4);
839
826copydone: 840copydone:
827 total_rx_bytes += skb->len; 841 total_rx_bytes += skb->len;
828 total_rx_packets++; 842 total_rx_packets++;
@@ -2298,8 +2312,12 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
2298 else 2312 else
2299 rctl |= E1000_RCTL_LPE; 2313 rctl |= E1000_RCTL_LPE;
2300 2314
2301 /* Enable hardware CRC frame stripping */ 2315 /* Some systems expect that the CRC is included in SMBUS traffic. The
2302 rctl |= E1000_RCTL_SECRC; 2316 * hardware strips the CRC before sending to both SMBUS (BMC) and to
2317 * host memory when this is enabled
2318 */
2319 if (adapter->flags2 & FLAG2_CRC_STRIPPING)
2320 rctl |= E1000_RCTL_SECRC;
2303 2321
2304 /* Setup buffer sizes */ 2322 /* Setup buffer sizes */
2305 rctl &= ~E1000_RCTL_SZ_4096; 2323 rctl &= ~E1000_RCTL_SZ_4096;
@@ -4761,6 +4779,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
4761 adapter->ei = ei; 4779 adapter->ei = ei;
4762 adapter->pba = ei->pba; 4780 adapter->pba = ei->pba;
4763 adapter->flags = ei->flags; 4781 adapter->flags = ei->flags;
4782 adapter->flags2 = ei->flags2;
4764 adapter->hw.adapter = adapter; 4783 adapter->hw.adapter = adapter;
4765 adapter->hw.mac.type = ei->mac; 4784 adapter->hw.mac.type = ei->mac;
4766 adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1; 4785 adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1;
@@ -4962,6 +4981,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
4962 4981
4963 /* initialize the wol settings based on the eeprom settings */ 4982 /* initialize the wol settings based on the eeprom settings */
4964 adapter->wol = adapter->eeprom_wol; 4983 adapter->wol = adapter->eeprom_wol;
4984 device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
4965 4985
4966 /* reset the hardware with the new settings */ 4986 /* reset the hardware with the new settings */
4967 e1000e_reset(adapter); 4987 e1000e_reset(adapter);
@@ -5000,6 +5020,7 @@ err_hw_init:
5000err_sw_init: 5020err_sw_init:
5001 if (adapter->hw.flash_address) 5021 if (adapter->hw.flash_address)
5002 iounmap(adapter->hw.flash_address); 5022 iounmap(adapter->hw.flash_address);
5023 e1000e_reset_interrupt_capability(adapter);
5003err_flashmap: 5024err_flashmap:
5004 iounmap(adapter->hw.hw_addr); 5025 iounmap(adapter->hw.hw_addr);
5005err_ioremap: 5026err_ioremap:
diff --git a/drivers/net/e1000e/param.c b/drivers/net/e1000e/param.c
index 77a3d7207a5f..e909f96698e8 100644
--- a/drivers/net/e1000e/param.c
+++ b/drivers/net/e1000e/param.c
@@ -151,6 +151,16 @@ E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround");
151 */ 151 */
152E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lead to corrupted NVM]"); 152E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lead to corrupted NVM]");
153 153
154/*
155 * Enable CRC Stripping
156 *
157 * Valid Range: 0, 1
158 *
159 * Default Value: 1 (enabled)
160 */
161E1000_PARAM(CrcStripping, "Enable CRC Stripping, disable if your BMC needs " \
162 "the CRC");
163
154struct e1000_option { 164struct e1000_option {
155 enum { enable_option, range_option, list_option } type; 165 enum { enable_option, range_option, list_option } type;
156 const char *name; 166 const char *name;
@@ -404,6 +414,21 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter)
404 adapter->flags |= FLAG_SMART_POWER_DOWN; 414 adapter->flags |= FLAG_SMART_POWER_DOWN;
405 } 415 }
406 } 416 }
417 { /* CRC Stripping */
418 const struct e1000_option opt = {
419 .type = enable_option,
420 .name = "CRC Stripping",
421 .err = "defaulting to enabled",
422 .def = OPTION_ENABLED
423 };
424
425 if (num_CrcStripping > bd) {
426 unsigned int crc_stripping = CrcStripping[bd];
427 e1000_validate_option(&crc_stripping, &opt, adapter);
428 if (crc_stripping == OPTION_ENABLED)
429 adapter->flags2 |= FLAG2_CRC_STRIPPING;
430 }
431 }
407 { /* Kumeran Lock Loss Workaround */ 432 { /* Kumeran Lock Loss Workaround */
408 const struct e1000_option opt = { 433 const struct e1000_option opt = {
409 .type = enable_option, 434 .type = enable_option,