diff options
author | Troy Kisky <troy.kisky@boundarydevices.com> | 2012-12-01 13:58:30 -0700 |
---|---|---|
committer | Eric Nelson <eric.nelson@boundarydevices.com> | 2012-12-13 11:27:14 -0700 |
commit | 23e50de473fec3ba33505768b020d9966f5610f6 (patch) | |
tree | 18e2be5bbf3e5355822865134829f80bf15f02da | |
parent | f8626240dda0f1c0b517835356a2121a71600b97 (diff) |
fec: fix rx error counts
On an overrun, the other flags are not
valid, so don't check them.
Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
-rw-r--r-- | drivers/net/fec.c | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/drivers/net/fec.c b/drivers/net/fec.c index 351417cab46a..b74b1d99e5e1 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c @@ -559,28 +559,33 @@ static int fec_rx_poll(struct napi_struct *napi, int budget) goto rx_processing_done; /* Check for errors. */ + status ^= BD_ENET_RX_LAST; if (status & (BD_ENET_RX_LG | BD_ENET_RX_SH | BD_ENET_RX_NO | - BD_ENET_RX_CR | BD_ENET_RX_OV)) { + BD_ENET_RX_CR | BD_ENET_RX_OV | BD_ENET_RX_LAST | + BD_ENET_RX_CL)) { ndev->stats.rx_errors++; - if (status & (BD_ENET_RX_LG | BD_ENET_RX_SH)) { - /* Frame too long or too short. */ - ndev->stats.rx_length_errors++; - } - if (status & BD_ENET_RX_NO) /* Frame alignment */ - ndev->stats.rx_frame_errors++; - if (status & BD_ENET_RX_CR) /* CRC Error */ - ndev->stats.rx_crc_errors++; - if (status & BD_ENET_RX_OV) /* FIFO overrun */ - ndev->stats.rx_fifo_errors++; - } - /* Report late collisions as a frame error. - * On this error, the BD is closed, but we don't know what we - * have in the buffer. So, just drop this frame on the floor. - */ - if (status & BD_ENET_RX_CL) { - ndev->stats.rx_errors++; - ndev->stats.rx_frame_errors++; + if (status & BD_ENET_RX_OV) { + /* FIFO overrun */ + ndev->stats.rx_fifo_errors++; + } else { + if (status & (BD_ENET_RX_LG | BD_ENET_RX_SH + | BD_ENET_RX_LAST)) { + /* Frame too long or too short. */ + ndev->stats.rx_length_errors++; + if (status & BD_ENET_RX_LAST) + dev_err(&ndev->dev, + "rcv is not +last, " + "0x%x\n", status); + } + if (status & BD_ENET_RX_CR) /* CRC Error */ + ndev->stats.rx_crc_errors++; + /* + * Report late collisions as a frame error. + */ + if (status & (BD_ENET_RX_NO | BD_ENET_RX_CL)) + ndev->stats.rx_frame_errors++; + } goto rx_processing_done; } |