aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000e/netdev.c
diff options
context:
space:
mode:
authorAuke Kok <auke-jan.h.kok@intel.com>2007-10-25 16:57:58 -0400
committerJeff Garzik <jeff@garzik.org>2007-10-29 05:47:08 -0400
commit140a74802894e9db57e5cd77ccff77e590ece5f3 (patch)
treedc3470225ce4eba6af4f68c053db308701967358 /drivers/net/e1000e/netdev.c
parentdf762464ad0fad721f9fc5724e85b3df0d550acd (diff)
e1000e: Re-enable SECRC - crc stripping
This workaround code performed software stripping instead of the hardware which can do it much faster. None of the e1000e target hardware has issues with this feature and should work fine. This gives us some performance back on receive, and removes some kludging stripping the 4 bytes. Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net/e1000e/netdev.c')
-rw-r--r--drivers/net/e1000e/netdev.c19
1 files changed, 6 insertions, 13 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
index e87ed3133528..03fcc70e0198 100644
--- a/drivers/net/e1000e/netdev.c
+++ b/drivers/net/e1000e/netdev.c
@@ -494,10 +494,6 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
494 goto next_desc; 494 goto next_desc;
495 } 495 }
496 496
497 /* adjust length to remove Ethernet CRC */
498 length -= 4;
499
500 /* probably a little skewed due to removing CRC */
501 total_rx_bytes += length; 497 total_rx_bytes += length;
502 total_rx_packets++; 498 total_rx_packets++;
503 499
@@ -964,8 +960,7 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
964 kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ); 960 kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ);
965 pci_dma_sync_single_for_device(pdev, ps_page->dma, 961 pci_dma_sync_single_for_device(pdev, ps_page->dma,
966 PAGE_SIZE, PCI_DMA_FROMDEVICE); 962 PAGE_SIZE, PCI_DMA_FROMDEVICE);
967 /* remove the CRC */ 963
968 l1 -= 4;
969 skb_put(skb, l1); 964 skb_put(skb, l1);
970 goto copydone; 965 goto copydone;
971 } /* if */ 966 } /* if */
@@ -987,10 +982,6 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
987 skb->truesize += length; 982 skb->truesize += length;
988 } 983 }
989 984
990 /* strip the ethernet crc, problem is we're using pages now so
991 * this whole operation can get a little cpu intensive */
992 pskb_trim(skb, skb->len - 4);
993
994copydone: 985copydone:
995 total_rx_bytes += skb->len; 986 total_rx_bytes += skb->len;
996 total_rx_packets++; 987 total_rx_packets++;
@@ -2034,9 +2025,11 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
2034 2025
2035 ew32(RFCTL, rfctl); 2026 ew32(RFCTL, rfctl);
2036 2027
2037 /* disable the stripping of CRC because it breaks 2028 /* Enable Packet split descriptors */
2038 * BMC firmware connected over SMBUS */ 2029 rctl |= E1000_RCTL_DTYP_PS;
2039 rctl |= E1000_RCTL_DTYP_PS /* | E1000_RCTL_SECRC */; 2030
2031 /* Enable hardware CRC frame stripping */
2032 rctl |= E1000_RCTL_SECRC;
2040 2033
2041 psrctl |= adapter->rx_ps_bsize0 >> 2034 psrctl |= adapter->rx_ps_bsize0 >>
2042 E1000_PSRCTL_BSIZE0_SHIFT; 2035 E1000_PSRCTL_BSIZE0_SHIFT;