diff options
Diffstat (limited to 'drivers/net/e1000e/netdev.c')
-rw-r--r-- | drivers/net/e1000e/netdev.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index abd492b7336d..122539a0e1fe 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -345,7 +345,6 @@ no_buffers: | |||
345 | /** | 345 | /** |
346 | * e1000_alloc_jumbo_rx_buffers - Replace used jumbo receive buffers | 346 | * e1000_alloc_jumbo_rx_buffers - Replace used jumbo receive buffers |
347 | * @adapter: address of board private structure | 347 | * @adapter: address of board private structure |
348 | * @rx_ring: pointer to receive ring structure | ||
349 | * @cleaned_count: number of buffers to allocate this pass | 348 | * @cleaned_count: number of buffers to allocate this pass |
350 | **/ | 349 | **/ |
351 | 350 | ||
@@ -499,6 +498,10 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
499 | goto next_desc; | 498 | goto next_desc; |
500 | } | 499 | } |
501 | 500 | ||
501 | /* adjust length to remove Ethernet CRC */ | ||
502 | if (!(adapter->flags2 & FLAG2_CRC_STRIPPING)) | ||
503 | length -= 4; | ||
504 | |||
502 | total_rx_bytes += length; | 505 | total_rx_bytes += length; |
503 | total_rx_packets++; | 506 | total_rx_packets++; |
504 | 507 | ||
@@ -804,6 +807,10 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, | |||
804 | pci_dma_sync_single_for_device(pdev, ps_page->dma, | 807 | pci_dma_sync_single_for_device(pdev, ps_page->dma, |
805 | PAGE_SIZE, PCI_DMA_FROMDEVICE); | 808 | PAGE_SIZE, PCI_DMA_FROMDEVICE); |
806 | 809 | ||
810 | /* remove the CRC */ | ||
811 | if (!(adapter->flags2 & FLAG2_CRC_STRIPPING)) | ||
812 | l1 -= 4; | ||
813 | |||
807 | skb_put(skb, l1); | 814 | skb_put(skb, l1); |
808 | goto copydone; | 815 | goto copydone; |
809 | } /* if */ | 816 | } /* if */ |
@@ -825,6 +832,12 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, | |||
825 | skb->truesize += length; | 832 | skb->truesize += length; |
826 | } | 833 | } |
827 | 834 | ||
835 | /* strip the ethernet crc, problem is we're using pages now so | ||
836 | * this whole operation can get a little cpu intensive | ||
837 | */ | ||
838 | if (!(adapter->flags2 & FLAG2_CRC_STRIPPING)) | ||
839 | pskb_trim(skb, skb->len - 4); | ||
840 | |||
828 | copydone: | 841 | copydone: |
829 | total_rx_bytes += skb->len; | 842 | total_rx_bytes += skb->len; |
830 | total_rx_packets++; | 843 | total_rx_packets++; |
@@ -2301,8 +2314,12 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter) | |||
2301 | else | 2314 | else |
2302 | rctl |= E1000_RCTL_LPE; | 2315 | rctl |= E1000_RCTL_LPE; |
2303 | 2316 | ||
2304 | /* Enable hardware CRC frame stripping */ | 2317 | /* Some systems expect that the CRC is included in SMBUS traffic. The |
2305 | rctl |= E1000_RCTL_SECRC; | 2318 | * hardware strips the CRC before sending to both SMBUS (BMC) and to |
2319 | * host memory when this is enabled | ||
2320 | */ | ||
2321 | if (adapter->flags2 & FLAG2_CRC_STRIPPING) | ||
2322 | rctl |= E1000_RCTL_SECRC; | ||
2306 | 2323 | ||
2307 | /* Setup buffer sizes */ | 2324 | /* Setup buffer sizes */ |
2308 | rctl &= ~E1000_RCTL_SZ_4096; | 2325 | rctl &= ~E1000_RCTL_SZ_4096; |
@@ -4766,6 +4783,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4766 | adapter->ei = ei; | 4783 | adapter->ei = ei; |
4767 | adapter->pba = ei->pba; | 4784 | adapter->pba = ei->pba; |
4768 | adapter->flags = ei->flags; | 4785 | adapter->flags = ei->flags; |
4786 | adapter->flags2 = ei->flags2; | ||
4769 | adapter->hw.adapter = adapter; | 4787 | adapter->hw.adapter = adapter; |
4770 | adapter->hw.mac.type = ei->mac; | 4788 | adapter->hw.mac.type = ei->mac; |
4771 | adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1; | 4789 | adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1; |
@@ -4970,6 +4988,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4970 | 4988 | ||
4971 | /* initialize the wol settings based on the eeprom settings */ | 4989 | /* initialize the wol settings based on the eeprom settings */ |
4972 | adapter->wol = adapter->eeprom_wol; | 4990 | adapter->wol = adapter->eeprom_wol; |
4991 | device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); | ||
4973 | 4992 | ||
4974 | /* reset the hardware with the new settings */ | 4993 | /* reset the hardware with the new settings */ |
4975 | e1000e_reset(adapter); | 4994 | e1000e_reset(adapter); |
@@ -5008,6 +5027,7 @@ err_hw_init: | |||
5008 | err_sw_init: | 5027 | err_sw_init: |
5009 | if (adapter->hw.flash_address) | 5028 | if (adapter->hw.flash_address) |
5010 | iounmap(adapter->hw.flash_address); | 5029 | iounmap(adapter->hw.flash_address); |
5030 | e1000e_reset_interrupt_capability(adapter); | ||
5011 | err_flashmap: | 5031 | err_flashmap: |
5012 | iounmap(adapter->hw.hw_addr); | 5032 | iounmap(adapter->hw.hw_addr); |
5013 | err_ioremap: | 5033 | err_ioremap: |