mirror of https://gitee.com/openkylin/linux.git
net:ethernet:aquantia: Workaround for HW checksum bug.
The hardware has the HW Checksum Offload bug when small TCP patckets (with length <= 60 bytes) has wrong "checksum valid" bit. The solution is - ignore checksum valid bit for small packets (with length <= 60 bytes) and mark this as CHECKSUM_NONE to allow network stack recalculate checksum itself. Fixes: ccf9a5ed14be ("net: ethernet: aquantia: Atlantic A0 and B0 specific functions.") Signed-off-by: Pavel Belous <Pavel.Belous@aquantia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
64fc7953ff
commit
0a402e7b97
|
@ -629,6 +629,12 @@ static int hw_atl_a0_hw_ring_rx_receive(struct aq_hw_s *self,
|
|||
buff->is_udp_cso = (is_err & 0x10U) ? 0 : 1;
|
||||
else if (0x0U == (pkt_type & 0x1CU))
|
||||
buff->is_tcp_cso = (is_err & 0x10U) ? 0 : 1;
|
||||
|
||||
/* Checksum offload workaround for small packets */
|
||||
if (rxd_wb->pkt_len <= 60) {
|
||||
buff->is_ip_cso = 0U;
|
||||
buff->is_cso_err = 0U;
|
||||
}
|
||||
}
|
||||
|
||||
is_err &= ~0x18U;
|
||||
|
|
|
@ -645,6 +645,12 @@ static int hw_atl_b0_hw_ring_rx_receive(struct aq_hw_s *self,
|
|||
buff->is_udp_cso = buff->is_cso_err ? 0U : 1U;
|
||||
else if (0x0U == (pkt_type & 0x1CU))
|
||||
buff->is_tcp_cso = buff->is_cso_err ? 0U : 1U;
|
||||
|
||||
/* Checksum offload workaround for small packets */
|
||||
if (rxd_wb->pkt_len <= 60) {
|
||||
buff->is_ip_cso = 0U;
|
||||
buff->is_cso_err = 0U;
|
||||
}
|
||||
}
|
||||
|
||||
is_err &= ~0x18U;
|
||||
|
|
Loading…
Reference in New Issue