mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
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 <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
64fc7953ff
commit
0a402e7b97
2 changed files with 12 additions and 0 deletions
|
|
@ -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 a new issue