diff options
Diffstat (limited to 'drivers/net/e1000e')
-rw-r--r-- | drivers/net/e1000e/e1000.h | 5 | ||||
-rw-r--r-- | drivers/net/e1000e/ethtool.c | 8 | ||||
-rw-r--r-- | drivers/net/e1000e/netdev.c | 25 | ||||
-rw-r--r-- | drivers/net/e1000e/param.c | 25 |
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 { | |||
306 | struct e1000_info { | 307 | struct 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 | |||
826 | copydone: | 840 | copydone: |
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: | |||
5000 | err_sw_init: | 5020 | err_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); | ||
5003 | err_flashmap: | 5024 | err_flashmap: |
5004 | iounmap(adapter->hw.hw_addr); | 5025 | iounmap(adapter->hw.hw_addr); |
5005 | err_ioremap: | 5026 | err_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 | */ |
152 | E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lead to corrupted NVM]"); | 152 | E1000_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 | */ | ||
161 | E1000_PARAM(CrcStripping, "Enable CRC Stripping, disable if your BMC needs " \ | ||
162 | "the CRC"); | ||
163 | |||
154 | struct e1000_option { | 164 | struct 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, |