summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTroy Kisky <troy.kisky@boundarydevices.com>2012-12-01 13:58:30 -0700
committerEric Nelson <eric.nelson@boundarydevices.com>2012-12-13 11:27:14 -0700
commit23e50de473fec3ba33505768b020d9966f5610f6 (patch)
tree18e2be5bbf3e5355822865134829f80bf15f02da
parentf8626240dda0f1c0b517835356a2121a71600b97 (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.c43
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;
}