diff options
Diffstat (limited to 'drivers/net/e1000/e1000_main.c')
| -rw-r--r-- | drivers/net/e1000/e1000_main.c | 43 | 
1 files changed, 17 insertions, 26 deletions
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 7e855f9bbd97..d29bb532eccf 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c  | |||
| @@ -1698,18 +1698,6 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter) | |||
| 1698 | rctl &= ~E1000_RCTL_SZ_4096; | 1698 | rctl &= ~E1000_RCTL_SZ_4096; | 
| 1699 | rctl |= E1000_RCTL_BSEX; | 1699 | rctl |= E1000_RCTL_BSEX; | 
| 1700 | switch (adapter->rx_buffer_len) { | 1700 | switch (adapter->rx_buffer_len) { | 
| 1701 | case E1000_RXBUFFER_256: | ||
| 1702 | rctl |= E1000_RCTL_SZ_256; | ||
| 1703 | rctl &= ~E1000_RCTL_BSEX; | ||
| 1704 | break; | ||
| 1705 | case E1000_RXBUFFER_512: | ||
| 1706 | rctl |= E1000_RCTL_SZ_512; | ||
| 1707 | rctl &= ~E1000_RCTL_BSEX; | ||
| 1708 | break; | ||
| 1709 | case E1000_RXBUFFER_1024: | ||
| 1710 | rctl |= E1000_RCTL_SZ_1024; | ||
| 1711 | rctl &= ~E1000_RCTL_BSEX; | ||
| 1712 | break; | ||
| 1713 | case E1000_RXBUFFER_2048: | 1701 | case E1000_RXBUFFER_2048: | 
| 1714 | default: | 1702 | default: | 
| 1715 | rctl |= E1000_RCTL_SZ_2048; | 1703 | rctl |= E1000_RCTL_SZ_2048; | 
| @@ -2802,13 +2790,13 @@ static int e1000_tx_map(struct e1000_adapter *adapter, | |||
| 2802 | dma_error: | 2790 | dma_error: | 
| 2803 | dev_err(&pdev->dev, "TX DMA map failed\n"); | 2791 | dev_err(&pdev->dev, "TX DMA map failed\n"); | 
| 2804 | buffer_info->dma = 0; | 2792 | buffer_info->dma = 0; | 
| 2805 | count--; | 2793 | if (count) | 
| 2806 | |||
| 2807 | while (count >= 0) { | ||
| 2808 | count--; | 2794 | count--; | 
| 2809 | i--; | 2795 | |
| 2810 | if (i < 0) | 2796 | while (count--) { | 
| 2797 | if (i==0) | ||
| 2811 | i += tx_ring->count; | 2798 | i += tx_ring->count; | 
| 2799 | i--; | ||
| 2812 | buffer_info = &tx_ring->buffer_info[i]; | 2800 | buffer_info = &tx_ring->buffer_info[i]; | 
| 2813 | e1000_unmap_and_free_tx_resource(adapter, buffer_info); | 2801 | e1000_unmap_and_free_tx_resource(adapter, buffer_info); | 
| 2814 | } | 2802 | } | 
| @@ -3176,13 +3164,7 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) | |||
| 3176 | * however with the new *_jumbo_rx* routines, jumbo receives will use | 3164 | * however with the new *_jumbo_rx* routines, jumbo receives will use | 
| 3177 | * fragmented skbs */ | 3165 | * fragmented skbs */ | 
| 3178 | 3166 | ||
| 3179 | if (max_frame <= E1000_RXBUFFER_256) | 3167 | if (max_frame <= E1000_RXBUFFER_2048) | 
| 3180 | adapter->rx_buffer_len = E1000_RXBUFFER_256; | ||
| 3181 | else if (max_frame <= E1000_RXBUFFER_512) | ||
| 3182 | adapter->rx_buffer_len = E1000_RXBUFFER_512; | ||
| 3183 | else if (max_frame <= E1000_RXBUFFER_1024) | ||
| 3184 | adapter->rx_buffer_len = E1000_RXBUFFER_1024; | ||
| 3185 | else if (max_frame <= E1000_RXBUFFER_2048) | ||
| 3186 | adapter->rx_buffer_len = E1000_RXBUFFER_2048; | 3168 | adapter->rx_buffer_len = E1000_RXBUFFER_2048; | 
| 3187 | else | 3169 | else | 
| 3188 | #if (PAGE_SIZE >= E1000_RXBUFFER_16384) | 3170 | #if (PAGE_SIZE >= E1000_RXBUFFER_16384) | 
| @@ -3850,13 +3832,22 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
| 3850 | 3832 | ||
| 3851 | length = le16_to_cpu(rx_desc->length); | 3833 | length = le16_to_cpu(rx_desc->length); | 
| 3852 | /* !EOP means multiple descriptors were used to store a single | 3834 | /* !EOP means multiple descriptors were used to store a single | 
| 3853 | * packet, also make sure the frame isn't just CRC only */ | 3835 | * packet, if thats the case we need to toss it. In fact, we | 
| 3854 | if (unlikely(!(status & E1000_RXD_STAT_EOP) || (length <= 4))) { | 3836 | * to toss every packet with the EOP bit clear and the next | 
| 3837 | * frame that _does_ have the EOP bit set, as it is by | ||
| 3838 | * definition only a frame fragment | ||
| 3839 | */ | ||
| 3840 | if (unlikely(!(status & E1000_RXD_STAT_EOP))) | ||
| 3841 | adapter->discarding = true; | ||
| 3842 | |||
| 3843 | if (adapter->discarding) { | ||
| 3855 | /* All receives must fit into a single buffer */ | 3844 | /* All receives must fit into a single buffer */ | 
| 3856 | E1000_DBG("%s: Receive packet consumed multiple" | 3845 | E1000_DBG("%s: Receive packet consumed multiple" | 
| 3857 | " buffers\n", netdev->name); | 3846 | " buffers\n", netdev->name); | 
| 3858 | /* recycle */ | 3847 | /* recycle */ | 
| 3859 | buffer_info->skb = skb; | 3848 | buffer_info->skb = skb; | 
| 3849 | if (status & E1000_RXD_STAT_EOP) | ||
| 3850 | adapter->discarding = false; | ||
| 3860 | goto next_desc; | 3851 | goto next_desc; | 
| 3861 | } | 3852 | } | 
| 3862 | 3853 | ||
