diff options
| author | Divy Le Ray <divy@chelsio.com> | 2010-02-09 01:37:24 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-02-09 01:37:24 -0500 |
| commit | 2d171886b183982feb03446997c65e9e212b948e (patch) | |
| tree | 34e88be6ca9b1fcd909957d0d3894b8d1c561f58 | |
| parent | 2fc1b5dd99f66d93ffc23fd8df82d384c1a354c8 (diff) | |
cxgb3: fix GRO checksum check
Verify the HW checksum state for frames handed to GRO processing.
Signed-off-by: Divy Le Ray <divy@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/cxgb3/sge.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c index bdbd14727e4b..318a018ca7c5 100644 --- a/drivers/net/cxgb3/sge.c +++ b/drivers/net/cxgb3/sge.c | |||
| @@ -2079,6 +2079,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs, | |||
| 2079 | struct sge_fl *fl, int len, int complete) | 2079 | struct sge_fl *fl, int len, int complete) |
| 2080 | { | 2080 | { |
| 2081 | struct rx_sw_desc *sd = &fl->sdesc[fl->cidx]; | 2081 | struct rx_sw_desc *sd = &fl->sdesc[fl->cidx]; |
| 2082 | struct port_info *pi = netdev_priv(qs->netdev); | ||
| 2082 | struct sk_buff *skb = NULL; | 2083 | struct sk_buff *skb = NULL; |
| 2083 | struct cpl_rx_pkt *cpl; | 2084 | struct cpl_rx_pkt *cpl; |
| 2084 | struct skb_frag_struct *rx_frag; | 2085 | struct skb_frag_struct *rx_frag; |
| @@ -2116,11 +2117,18 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs, | |||
| 2116 | 2117 | ||
| 2117 | if (!nr_frags) { | 2118 | if (!nr_frags) { |
| 2118 | offset = 2 + sizeof(struct cpl_rx_pkt); | 2119 | offset = 2 + sizeof(struct cpl_rx_pkt); |
| 2119 | qs->lro_va = sd->pg_chunk.va + 2; | 2120 | cpl = qs->lro_va = sd->pg_chunk.va + 2; |
| 2120 | } | ||
| 2121 | len -= offset; | ||
| 2122 | 2121 | ||
| 2123 | prefetch(qs->lro_va); | 2122 | if ((pi->rx_offload & T3_RX_CSUM) && |
| 2123 | cpl->csum_valid && cpl->csum == htons(0xffff)) { | ||
| 2124 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
| 2125 | qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++; | ||
| 2126 | } else | ||
| 2127 | skb->ip_summed = CHECKSUM_NONE; | ||
| 2128 | } else | ||
| 2129 | cpl = qs->lro_va; | ||
| 2130 | |||
| 2131 | len -= offset; | ||
| 2124 | 2132 | ||
| 2125 | rx_frag += nr_frags; | 2133 | rx_frag += nr_frags; |
| 2126 | rx_frag->page = sd->pg_chunk.page; | 2134 | rx_frag->page = sd->pg_chunk.page; |
| @@ -2136,12 +2144,8 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs, | |||
| 2136 | return; | 2144 | return; |
| 2137 | 2145 | ||
| 2138 | skb_record_rx_queue(skb, qs - &adap->sge.qs[0]); | 2146 | skb_record_rx_queue(skb, qs - &adap->sge.qs[0]); |
| 2139 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
| 2140 | cpl = qs->lro_va; | ||
| 2141 | 2147 | ||
| 2142 | if (unlikely(cpl->vlan_valid)) { | 2148 | if (unlikely(cpl->vlan_valid)) { |
| 2143 | struct net_device *dev = qs->netdev; | ||
| 2144 | struct port_info *pi = netdev_priv(dev); | ||
| 2145 | struct vlan_group *grp = pi->vlan_grp; | 2149 | struct vlan_group *grp = pi->vlan_grp; |
| 2146 | 2150 | ||
| 2147 | if (likely(grp != NULL)) { | 2151 | if (likely(grp != NULL)) { |
