mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 12:16:20 +00:00
atl1: deal with hardware rx checksum bug
The L1 hardware contains a bug that flags a fragmented IP packet as having an incorrect TCP/UDP checksum, even though the packet is perfectly valid and its checksum is correct. There's no way to distinguish between one of these good packets and a packet that actually contains a TCP/UDP checksum error, so all we can do is allow the packet to be handed up to the higher layers and let it be sorted out there. Add a comment describing this condition and remove the code that currently fails to handle what may or may not be a checksum error. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
f0f422e573
commit
c2ac3ef35c
1 changed files with 11 additions and 8 deletions
|
@ -1790,6 +1790,17 @@ static void atl1_rx_checksum(struct atl1_adapter *adapter,
|
|||
{
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
|
||||
/*
|
||||
* The L1 hardware contains a bug that erroneously sets the
|
||||
* PACKET_FLAG_ERR and ERR_FLAG_L4_CHKSUM bits whenever a
|
||||
* fragmented IP packet is received, even though the packet
|
||||
* is perfectly valid and its checksum is correct. There's
|
||||
* no way to distinguish between one of these good packets
|
||||
* and a packet that actually contains a TCP/UDP checksum
|
||||
* error, so all we can do is allow it to be handed up to
|
||||
* the higher layers and let it be sorted out there.
|
||||
*/
|
||||
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
|
||||
if (unlikely(rrd->pkt_flg & PACKET_FLAG_ERR)) {
|
||||
|
@ -1816,14 +1827,6 @@ static void atl1_rx_checksum(struct atl1_adapter *adapter,
|
|||
return;
|
||||
}
|
||||
|
||||
/* IPv4, but hardware thinks its checksum is wrong */
|
||||
if (netif_msg_rx_err(adapter))
|
||||
dev_printk(KERN_DEBUG, &pdev->dev,
|
||||
"hw csum wrong, pkt_flag:%x, err_flag:%x\n",
|
||||
rrd->pkt_flg, rrd->err_flg);
|
||||
skb->ip_summed = CHECKSUM_COMPLETE;
|
||||
skb->csum = htons(rrd->xsz.xsum_sz.rx_chksum);
|
||||
adapter->hw_csum_err++;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue