summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorTroy Kisky <troy.kisky@boundarydevices.com>2012-12-01 13:58:30 -0700
committerEric Nelson <eric.nelson@boundarydevices.com>2013-02-12 10:46:56 -0700
commita6f528ea9ae6333e719a3fb8f902258736b15332 (patch)
treeaabc15bc15a9d3eb4c6c1bf58a756fccb3710edb /drivers
parentc0cd6c3f52ad753c0cd259721e397b29928a815b (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>
Diffstat (limited to 'drivers')
-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 6f3e6663d113..9717fc6340ab 100644
--- a/drivers/net/fec.c
+++ b/drivers/net/fec.c
@@ -564,28 +564,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;
}