diff options
Diffstat (limited to 'drivers/net/e1000')
-rw-r--r-- | drivers/net/e1000/e1000_main.c | 55 |
1 files changed, 36 insertions, 19 deletions
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 2ab44db29fac..3bafaede7916 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -2873,32 +2873,49 @@ static bool e1000_tx_csum(struct e1000_adapter *adapter, | |||
2873 | struct e1000_buffer *buffer_info; | 2873 | struct e1000_buffer *buffer_info; |
2874 | unsigned int i; | 2874 | unsigned int i; |
2875 | u8 css; | 2875 | u8 css; |
2876 | u32 cmd_len = E1000_TXD_CMD_DEXT; | ||
2876 | 2877 | ||
2877 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { | 2878 | if (skb->ip_summed != CHECKSUM_PARTIAL) |
2878 | css = skb_transport_offset(skb); | 2879 | return false; |
2879 | 2880 | ||
2880 | i = tx_ring->next_to_use; | 2881 | switch (skb->protocol) { |
2881 | buffer_info = &tx_ring->buffer_info[i]; | 2882 | case __constant_htons(ETH_P_IP): |
2882 | context_desc = E1000_CONTEXT_DESC(*tx_ring, i); | 2883 | if (ip_hdr(skb)->protocol == IPPROTO_TCP) |
2884 | cmd_len |= E1000_TXD_CMD_TCP; | ||
2885 | break; | ||
2886 | case __constant_htons(ETH_P_IPV6): | ||
2887 | /* XXX not handling all IPV6 headers */ | ||
2888 | if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP) | ||
2889 | cmd_len |= E1000_TXD_CMD_TCP; | ||
2890 | break; | ||
2891 | default: | ||
2892 | if (unlikely(net_ratelimit())) | ||
2893 | DPRINTK(DRV, WARNING, | ||
2894 | "checksum_partial proto=%x!\n", skb->protocol); | ||
2895 | break; | ||
2896 | } | ||
2883 | 2897 | ||
2884 | context_desc->lower_setup.ip_config = 0; | 2898 | css = skb_transport_offset(skb); |
2885 | context_desc->upper_setup.tcp_fields.tucss = css; | ||
2886 | context_desc->upper_setup.tcp_fields.tucso = | ||
2887 | css + skb->csum_offset; | ||
2888 | context_desc->upper_setup.tcp_fields.tucse = 0; | ||
2889 | context_desc->tcp_seg_setup.data = 0; | ||
2890 | context_desc->cmd_and_length = cpu_to_le32(E1000_TXD_CMD_DEXT); | ||
2891 | 2899 | ||
2892 | buffer_info->time_stamp = jiffies; | 2900 | i = tx_ring->next_to_use; |
2893 | buffer_info->next_to_watch = i; | 2901 | buffer_info = &tx_ring->buffer_info[i]; |
2902 | context_desc = E1000_CONTEXT_DESC(*tx_ring, i); | ||
2894 | 2903 | ||
2895 | if (unlikely(++i == tx_ring->count)) i = 0; | 2904 | context_desc->lower_setup.ip_config = 0; |
2896 | tx_ring->next_to_use = i; | 2905 | context_desc->upper_setup.tcp_fields.tucss = css; |
2906 | context_desc->upper_setup.tcp_fields.tucso = | ||
2907 | css + skb->csum_offset; | ||
2908 | context_desc->upper_setup.tcp_fields.tucse = 0; | ||
2909 | context_desc->tcp_seg_setup.data = 0; | ||
2910 | context_desc->cmd_and_length = cpu_to_le32(cmd_len); | ||
2897 | 2911 | ||
2898 | return true; | 2912 | buffer_info->time_stamp = jiffies; |
2899 | } | 2913 | buffer_info->next_to_watch = i; |
2900 | 2914 | ||
2901 | return false; | 2915 | if (unlikely(++i == tx_ring->count)) i = 0; |
2916 | tx_ring->next_to_use = i; | ||
2917 | |||
2918 | return true; | ||
2902 | } | 2919 | } |
2903 | 2920 | ||
2904 | #define E1000_MAX_TXD_PWR 12 | 2921 | #define E1000_MAX_TXD_PWR 12 |