Commit 87418307 authored by Stephen Hemminger's avatar Stephen Hemminger Committed by Jeff Garzik

sky2: turn off Rx checksum on bad hardware

On Yukon FE, occasional hardware receive checksum errors are seen.
An early indication of the problem is single bit differences in the two
checksum engines.  Use this as a detection mechanism to turn off Rx
checksumming.
Signed-off-by: default avatarStephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 85cf572c
...@@ -2165,9 +2165,27 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do) ...@@ -2165,9 +2165,27 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do)
/* fall through */ /* fall through */
#endif #endif
case OP_RXCHKS: case OP_RXCHKS:
skb = sky2->rx_ring[sky2->rx_next].skb; if (!sky2->rx_csum)
skb->ip_summed = CHECKSUM_COMPLETE; break;
skb->csum = status & 0xffff;
/* Both checksum counters are programmed to start at
* the same offset, so unless there is a problem they
* should match. This failure is an early indication that
* hardware receive checksumming won't work.
*/
if (likely(status >> 16 == (status & 0xffff))) {
skb = sky2->rx_ring[sky2->rx_next].skb;
skb->ip_summed = CHECKSUM_COMPLETE;
skb->csum = status & 0xffff;
} else {
printk(KERN_NOTICE PFX "%s: hardware receive "
"checksum problem (status = %#x)\n",
dev->name, status);
sky2->rx_csum = 0;
sky2_write32(sky2->hw,
Q_ADDR(rxqaddr[le->link], Q_CSR),
BMU_DIS_RX_CHKSUM);
}
break; break;
case OP_TXINDEXLE: case OP_TXINDEXLE:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment