Error handling and error interrupt handler code.

Signed-off-by: Iyappan Subramanian <isubraman...@apm.com>
Signed-off-by: Ravi Patel <rapa...@apm.com>
Signed-off-by: Keyur Chudgar <kchud...@apm.com>
---
 drivers/net/ethernet/apm/xgene/Makefile          |    3 +-
 drivers/net/ethernet/apm/xgene/xgene_enet_csr.h  |  265 +++++++-
 drivers/net/ethernet/apm/xgene/xgene_enet_err.c  |  715 ++++++++++++++++++++++
 drivers/net/ethernet/apm/xgene/xgene_enet_main.c |   27 +
 drivers/net/ethernet/apm/xgene/xgene_enet_main.h |    4 +
 5 files changed, 1011 insertions(+), 3 deletions(-)
 create mode 100644 drivers/net/ethernet/apm/xgene/xgene_enet_err.c

diff --git a/drivers/net/ethernet/apm/xgene/Makefile 
b/drivers/net/ethernet/apm/xgene/Makefile
index 16dfc6c..091547e 100644
--- a/drivers/net/ethernet/apm/xgene/Makefile
+++ b/drivers/net/ethernet/apm/xgene/Makefile
@@ -5,6 +5,7 @@
 xgene-enet-objs := \
                xgene_enet_common.o     \
                xgene_enet_mac.o        \
-               xgene_enet_main.o
+               xgene_enet_main.o       \
+               xgene_enet_err.o
 
 obj-$(CONFIG_NET_XGENE) += xgene-enet.o
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_csr.h 
b/drivers/net/ethernet/apm/xgene/xgene_enet_csr.h
index c6b49c9..858d155 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_csr.h
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_csr.h
@@ -19,6 +19,13 @@
 #ifndef __XGENE_ENET_CSR_H__
 #define __XGENE_ENET_CSR_H__
 
+#define RSIF_INT_REG0_ADDR                                           0x00000054
+#define RSIF_FINT_REG0_ADDR                                          0x0000005c
+#define TSIF_INT_REG0_ADDR                                           0x0000012c
+#define TSIF_FINT_REG0_ADDR                                          0x00000134
+#define TSO_INT_REG0_ADDR                                            0x00000324
+#define SPI2SAP_INT_REG0_ADDR                                        0x00000448
+#define RX_TX_BUF_CHKSM_INT_REG0_ADDR                                0x0000052c
 #define ENET_SPARE_CFG_REG_ADDR                                      0x00000750
 #define RSIF_CONFIG_REG_ADDR                                         0x00000010
 #define RSIF_RAM_DBG_REG0_ADDR                                       0x00000048
@@ -33,7 +40,108 @@
 #define TSIF_MSS_REG1_0_ADDR                                         0x00000110
 #define TSO_CFG_0_ADDR                                               0x00000314
 #define TSO_CFG_INSERT_VLAN_0_ADDR                                   0x0000031c
-#define CFG_RSIF_FPBUFF_TIMEOUT_EN_WR(src)      (((u32)(src)<<31) & 0x80000000)
+#define CFG_RSIF_FPBUFF_TIMEOUT_EN_WR(src) \
+       (((u32)(src)<<31) & 0x80000000)
+#define RSIF_LCL_RXBUF_FIFO_OVERFL_INTR_RXPRT10_MASK                 0x20000000
+#define RSIF_LCL_RXBUF_FIFO_OVERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x20000000)>>29)
+#define RSIF_LCL_RXBUF_FIFO_UNDERFL_INTR_RXPRT10_MASK                0x10000000
+#define RSIF_LCL_RXBUF_FIFO_UNDERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x10000000)>>28)
+#define RSIF_CHKSUM_BUFF_FIFO_OVERFL_INTR_RXPRT10_MASK               0x08000000
+#define RSIF_CHKSUM_BUFF_FIFO_OVERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x08000000)>>27)
+#define RSIF_CHKSUM_BUFF_FIFO_UNDERFL_INTR_RXPRT10_MASK              0x04000000
+#define RSIF_CHKSUM_BUFF_FIFO_UNDERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x04000000)>>26)
+#define RSIF_TIMESTAMP_BUFF_FIFO_OVERFL_INTR_RXPRT10_MASK            0x02000000
+#define RSIF_TIMESTAMP_BUFF_FIFO_OVERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x02000000)>>25)
+#define RSIF_TIMESTAMP_BUFF_FIFO_UNDERFL_INTR_RXPRT10_MASK           0x01000000
+#define RSIF_TIMESTAMP_BUFF_FIFO_UNDERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x01000000)>>24)
+#define RSIF_ERR_BUFF_FIFO_OVERFL_INTR_RXPRT10_MASK                  0x00800000
+#define RSIF_ERR_BUFF_FIFO_OVERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x00800000)>>23)
+#define RSIF_ERR_BUFF_FIFO_UNDERFL_INTR_RXPRT10_MASK                 0x00400000
+#define RSIF_ERR_BUFF_FIFO_UNDERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x00400000)>>22)
+#define RSIF_CLEBUFF_FIFO_OVERFL_INTR_RXPRT10_MASK                   0x00200000
+#define RSIF_CLEBUFF_FIFO_OVERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x00200000)>>21)
+#define RSIF_CLEBUFF_FIFO_UNDERFL_INTR_RXPRT10_MASK                  0x00100000
+#define RSIF_CLEBUFF_FIFO_UNDERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x00100000)>>20)
+#define RSIF_CTRLBUFF_FIFO_OVERFL_INTR_RXPRT10_MASK                  0x00080000
+#define RSIF_CTRLBUFF_FIFO_OVERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x00080000)>>19)
+#define RSIF_CTRLBUFF_FIFO_UNDERFL_INTR_RXPRT10_MASK                 0x00040000
+#define RSIF_CTRLBUFF_FIFO_UNDERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x00040000)>>18)
+#define RSIF_BUF_FIFO_OVERFL_INTR_RXPRT10_MASK                       0x00020000
+#define RSIF_BUF_FIFO_OVERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x00020000)>>17)
+#define RSIF_BUF_FIFO_UNDERFL_INTR_RXPRT10_MASK                      0x00010000
+#define RSIF_BUF_FIFO_UNDERFL_INTR_RXPRT10_RD(src) \
+       (((src) & 0x00010000)>>16)
+#define ENET_RSIF_PLC_CLEBUFF_FIFO_OVERFL_INTR0_MASK              0x00008000
+#define ENET_RSIF_PLC_CLEBUFF_FIFO_OVERFL_INTR0_RD(src) \
+       (((src) & 0x00008000)>>15)
+#define ENET_RSIF_PLC_CLEBUFF_FIFO_UNDERFL_INTR0_RD(src) \
+       (((src) & 0x00004000)>>14)
+#define RSIF_LCL_RXBUF_FIFO_UNDERFL_INTR_RXPRT00_MASK                0x00001000
+#define RSIF_LCL_RXBUF_FIFO_UNDERFL_INTR_RXPRT00_RD(src) \
+       (((src) & 0x00001000)>>12)
+#define RSIF_LCL_RXBUF_FIFO_OVERFL_INTR_RXPRT00_MASK                 0x00002000
+#define RSIF_LCL_RXBUF_FIFO_OVERFL_INTR_RXPRT00_RD(src) \
+       (((src) & 0x00002000)>>13)
+#define RSIF_CHKSUM_BUFF_FIFO_OVERFL_INTR_RXPRT00_MASK               0x00000800
+#define RSIF_CHKSUM_BUFF_FIFO_OVERFL_INTR_RXPRT00_RD(src) \
+       (((src) & 0x00000800)>>11)
+#define RSIF_CHKSUM_BUFF_FIFO_UNDERFL_INTR_RXPRT00_MASK              0x00000400
+#define RSIF_CHKSUM_BUFF_FIFO_UNDERFL_INTR_RXPRT00_RD(src) \
+       (((src) & 0x00000400)>>10)
+#define RSIF_TIMESTAMP_BUFF_FIFO_OVERFL_INTR_RXPRT00_MASK            0x00000200
+#define RSIF_TIMESTAMP_BUFF_FIFO_OVERFL_INTR_RXPRT00_RD(src) \
+       (((src) & 0x00000200)>>9)
+#define RSIF_TIMESTAMP_BUFF_FIFO_UNDERFL_INTR_RXPRT00_MASK           0x00000100
+#define RSIF_TIMESTAMP_BUFF_FIFO_UNDERFL_INTR_RXPRT00_RD(src) \
+       (((src) & 0x00000100)>>8)
+#define RSIF_ERR_BUFF_FIFO_OVERFL_INTR_RXPRT00_MASK                  0x00000080
+#define RSIF_ERR_BUFF_FIFO_OVERFL_INTR_RXPRT00_RD(src) (((src) & 
0x00000080)>>7)
+#define RSIF_ERR_BUFF_FIFO_UNDERFL_INTR_RXPRT00_MASK                 0x00000040
+#define RSIF_ERR_BUFF_FIFO_UNDERFL_INTR_RXPRT00_RD(src) \
+       (((src) & 0x00000040)>>6)
+#define RSIF_CLEBUFF_FIFO_OVERFL_INTR_RXPRT00_MASK                   0x00000020
+#define RSIF_CLEBUFF_FIFO_OVERFL_INTR_RXPRT00_RD(src) (((src) & 0x00000020)>>5)
+#define RSIF_CLEBUFF_FIFO_UNDERFL_INTR_RXPRT00_MASK                  0x00000010
+#define RSIF_CLEBUFF_FIFO_UNDERFL_INTR_RXPRT00_RD(src) (((src) & 
0x00000010)>>4)
+#define RSIF_CTRLBUFF_FIFO_OVERFL_INTR_RXPRT00_MASK                  0x00000008
+#define RSIF_CTRLBUFF_FIFO_OVERFL_INTR_RXPRT00_RD(src) (((src) & 
0x00000008)>>3)
+#define RSIF_CTRLBUFF_FIFO_UNDERFL_INTR_RXPRT00_MASK                 0x00000004
+#define RSIF_CTRLBUFF_FIFO_UNDERFL_INTR_RXPRT00_RD(src) \
+       (((src) & 0x00000004)>>2)
+#define RSIF_BUF_FIFO_OVERFL_INTR_RXPRT00_MASK                       0x00000002
+#define RSIF_BUF_FIFO_OVERFL_INTR_RXPRT00_RD(src)     (((src) & 0x00000002)>>1)
+#define RSIF_BUF_FIFO_UNDERFL_INTR_RXPRT00_MASK                      0x00000001
+#define RSIF_BUF_FIFO_UNDERFL_INTR_RXPRT00_RD(src)       (((src) & 0x00000001))
+#define RSIF_SS_MIRRORERR_INTR_RXPRT10_MASK                          0x00080000
+#define RSIF_SS_MIRRORERR_INTR_RXPRT10_RD(src)       (((src) & 0x00080000)>>19)
+#define RSIF_SS_SPLIT_BOUNDARY_INTR_RXPRT10_RD(src)  (((src) & 0x00040000)>>18)
+#define RSIF_SS_FPBUFF_TIMEOUT_INTR_RXPRT10_MASK                     0x00020000
+#define RSIF_SS_FPBUFF_TIMEOUT_INTR_RXPRT10_RD(src)  (((src) & 0x00020000)>>17)
+#define RSIF_SS_AXI_WRERR_INTR_RXPRT10_MASK                          0x00010000
+#define RSIF_SS_AXI_WRERR_INTR_RXPRT10_RD(src)       (((src) & 0x00010000)>>16)
+#define RSIF_SS_MIRRORERR_INTR_RXPRT00_MASK                          0x00000010
+#define RSIF_SS_MIRRORERR_INTR_RXPRT00_RD(src)        (((src) & 0x00000010)>>4)
+#define RSIF_SS_SPLIT_BOUNDARY_INTR_RXPRT00_MASK                     0x00000008
+#define RSIF_SS_SPLIT_BOUNDARY_INTR_RXPRT00_RD(src)   (((src) & 0x00000008)>>3)
+#define RSIF_SS_FPBUFF_TIMEOUT_INTR_RXPRT00_MASK                     0x00000004
+#define RSIF_SS_FPBUFF_TIMEOUT_INTR_RXPRT00_RD(src)   (((src) & 0x00000004)>>2)
+#define RSIF_SS_AXI_WRERR_INTR_RXPRT00_MASK                          0x00000002
+#define RSIF_SS_AXI_WRERR_INTR_RXPRT00_RD(src)        (((src) & 0x00000002)>>1)
+#define STS_RSIF_PLC_DROP0_MASK                                      0x00000001
+#define STS_RSIF_PLC_DROP0_RD(src)                       (((src) & 0x00000001))
 #define CFG_TSIF_MSS_SZ10_SET(dst, src) \
        (((dst) & ~0x3fff0000) | (((u32)(src)<<16) & 0x3fff0000))
 #define CFG_TSIF_MSS_SZ00_SET(dst, src) \
@@ -42,7 +150,99 @@
        (((dst) & ~0x00003fff) | (((u32)(src)) & 0x00003fff))
 #define CFG_TSIF_MSS_SZ30_SET(dst, src) \
        (((dst) & ~0x3fff0000) | (((u32)(src)<<16) & 0x3fff0000))
+#define TSIF_RDMBUFF_FIFO_OVERFL_INTR_PRT10_MASK                     0x00200000
+#define TSIF_RDMBUFF_FIFO_OVERFL_INTR_PRT10_RD(src)  (((src) & 0x00200000)>>21)
+#define TSIF_RDMBUFF_FIFO_UNDERFL_INTR_PRT10_MASK                    0x00100000
+#define TSIF_RDMBUFF_FIFO_UNDERFL_INTR_PRT10_RD(src) (((src) & 0x00100000)>>20)
+#define TSIF_RRM_FIFO_OVERFL_INTR_PRT10_MASK                         0x00080000
+#define TSIF_RRM_FIFO_OVERFL_INTR_PRT10_RD(src)      (((src) & 0x00080000)>>19)
+#define TSIF_RRM_FIFO_UNDERFL_INTR_PRT10_MASK                        0x00040000
+#define TSIF_RRM_FIFO_UNDERFL_INTR_PRT10_RD(src)     (((src) & 0x00040000)>>18)
+#define TSIF_AMABUF_FIFO_OVERFL_INTR_PRT10_MASK                      0x00020000
+#define TSIF_AMABUF_FIFO_OVERFL_INTR_PRT10_RD(src)   (((src) & 0x00020000)>>17)
+#define TSIF_AMABUF_FIFO_UNDERFL_INTR_PRT10_MASK                     0x00010000
+#define TSIF_AMABUF_FIFO_UNDERFL_INTR_PRT10_RD(src)  (((src) & 0x00010000)>>16)
+#define TSIF_RDMBUFF_FIFO_OVERFL_INTR_PRT00_MASK                     0x00000020
+#define TSIF_RDMBUFF_FIFO_OVERFL_INTR_PRT00_RD(src)   (((src) & 0x00000020)>>5)
+#define TSIF_RDMBUFF_FIFO_UNDERFL_INTR_PRT00_MASK                    0x00000010
+#define TSIF_RDMBUFF_FIFO_UNDERFL_INTR_PRT00_RD(src)  (((src) & 0x00000010)>>4)
+#define TSIF_RRM_FIFO_OVERFL_INTR_PRT00_MASK                         0x00000008
+#define TSIF_RRM_FIFO_OVERFL_INTR_PRT00_RD(src)       (((src) & 0x00000008)>>3)
+#define TSIF_RRM_FIFO_UNDERFL_INTR_PRT00_MASK                        0x00000004
+#define TSIF_RRM_FIFO_UNDERFL_INTR_PRT00_RD(src)      (((src) & 0x00000004)>>2)
+#define TSIF_AMABUF_FIFO_OVERFL_INTR_PRT00_MASK                      0x00000002
+#define TSIF_AMABUF_FIFO_OVERFL_INTR_PRT00_RD(src)    (((src) & 0x00000002)>>1)
+#define TSIF_AMABUF_FIFO_UNDERFL_INTR_PRT00_MASK                     0x00000001
+#define TSIF_AMABUF_FIFO_UNDERFL_INTR_PRT00_RD(src)      (((src) & 0x00000001))
+#define TSIF_SS_AXI_LLRDERR_INTR_PRT10_MASK                          0x00040000
+#define TSIF_SS_AXI_LLRDERR_INTR_PRT10_RD(src)       (((src) & 0x00040000)>>18)
+#define TSIF_SS_AXI_RDERR_INTR_PRT10_MASK                            0x00020000
+#define TSIF_SS_AXI_RDERR_INTR_PRT10_RD(src)         (((src) & 0x00020000)>>17)
+#define TSIF_SS_BAD_MSG_INTR_PRT10_MASK                              0x00010000
+#define TSIF_SS_BAD_MSG_INTR_PRT10_RD(src)           (((src) & 0x00010000)>>16)
+#define TSIF_SS_AXI_LLRDERR_INTR_PRT00_MASK                          0x00000004
+#define TSIF_SS_AXI_LLRDERR_INTR_PRT00_RD(src)        (((src) & 0x00000004)>>2)
+#define TSIF_SS_AXI_RDERR_INTR_PRT00_MASK                            0x00000002
+#define TSIF_SS_AXI_RDERR_INTR_PRT00_RD(src)          (((src) & 0x00000002)>>1)
+#define TSIF_SS_BAD_MSG_INTR_PRT00_MASK                              0x00000001
+#define TSIF_SS_BAD_MSG_INTR_PRT00_RD(src)               (((src) & 0x00000001))
 #define RESUME_TX_WR(src)                           (((u32)(src)) & 0x00000001)
+#define MB_TTF_FIFO_OVERFL_INTR_PRT10_RD(src)        (((src) & 0x00200000)>>21)
+#define MB_TTF_FIFO_OVERFL_INTR_PRT10_MASK                           0x00200000
+#define MB_TTF_FIFO_UNDERFL_INTR_PRT10_RD(src)       (((src) & 0x00100000)>>20)
+#define MB_TTF_FIFO_UNDERFL_INTR_PRT10_MASK                          0x00100000
+#define MH_DEALLOC_FIFO_OVERFL_INTR_PRT10_RD(src)    (((src) & 0x00080000)>>19)
+#define MH_DEALLOC_FIFO_OVERFL_INTR_PRT10_MASK                       0x00080000
+#define MH_DEALLOC_FIFO_UNDERFL_INTR_PRT10_RD(src)   (((src) & 0x00040000)>>18)
+#define MH_DEALLOC_FIFO_UNDERFL_INTR_PRT10_MASK                      0x00040000
+#define MH_FIFO_OVERFL_INTR_PRT10_RD(src)            (((src) & 0x00020000)>>17)
+#define MH_FIFO_OVERFL_INTR_PRT10_MASK                               0x00020000
+#define MH_FIFO_UNDERFL_INTR_PRT10_RD(src)           (((src) & 0x00010000)>>16)
+#define MH_FIFO_UNDERFL_INTR_PRT10_MASK                              0x00010000
+#define MB_TTF_FIFO_OVERFL_INTR_PRT00_RD(src)         (((src) & 0x00000020)>>5)
+#define MB_TTF_FIFO_OVERFL_INTR_PRT00_MASK                           0x00000020
+#define MB_TTF_FIFO_UNDERFL_INTR_PRT00_RD(src)        (((src) & 0x00000010)>>4)
+#define MB_TTF_FIFO_UNDERFL_INTR_PRT00_MASK                          0x00000010
+#define MH_DEALLOC_FIFO_OVERFL_INTR_PRT00_RD(src)     (((src) & 0x00000008)>>3)
+#define MH_DEALLOC_FIFO_OVERFL_INTR_PRT00_MASK                       0x00000008
+#define MH_DEALLOC_FIFO_UNDERFL_INTR_PRT00_RD(src)    (((src) & 0x00000004)>>2)
+#define MH_DEALLOC_FIFO_UNDERFL_INTR_PRT00_MASK                      0x00000004
+#define MH_FIFO_OVERFL_INTR_PRT00_RD(src)             (((src) & 0x00000002)>>1)
+#define MH_FIFO_OVERFL_INTR_PRT00_MASK                               0x00000002
+#define MH_FIFO_UNDERFL_INTR_PRT00_RD(src)               (((src) & 0x00000001))
+#define MH_FIFO_UNDERFL_INTR_PRT00_MASK                              0x00000001
+#define MACIF_FIFO_OVERFL_INTR_RXPRT10_RD(src)       (((src) & 0x00020000)>>17)
+#define MACIF_FIFO_OVERFL_INTR_RXPRT10_MASK                          0x00020000
+#define MACIF_FIFO_OVERFL_INTR_RXPRT00_RD(src)        (((src) & 0x00000002)>>1)
+#define MACIF_FIFO_OVERFL_INTR_RXPRT00_MASK                          0x00000002
+#define MACIF_FIFO_UNDERFL_INTR_RXPRT10_RD(src)      (((src) & 0x00010000)>>16)
+#define MACIF_FIFO_UNDERFL_INTR_RXPRT10_MASK                         0x00010000
+#define MACIF_FIFO_UNDERFL_INTR_RXPRT00_RD(src)          (((src) & 0x00000001))
+#define MACIF_FIFO_UNDERFL_INTR_RXPRT00_MASK                         0x00000001
+#define RXBUF_PAUSE_INTR_PORT10_RD(src)              (((src) & 0x00400000)>>22)
+#define RXBUF_PAUSE_INTR_PORT10_MASK                                 0x00400000
+#define RX_CHKSUM_INTR_PORT10_RD(src)                (((src) & 0x00200000)>>21)
+#define RX_CHKSUM_INTR_PORT10_MASK                                   0x00200000
+#define TX_CHKSUM_INTR_PORT10_RD(src)                (((src) & 0x00100000)>>20)
+#define TX_CHKSUM_INTR_PORT10_MASK                                   0x00100000
+#define RXBUF_FIFO_OVERFL_INTR_PRT10_RD(src)         (((src) & 0x00080000)>>19)
+#define RXBUF_FIFO_OVERFL_INTR_PRT10_MASK                            0x00080000
+#define RXBUF_FIFO_UNDERFL_INTR_PRT10_RD(src)        (((src) & 0x00040000)>>18)
+#define RXBUF_FIFO_UNDERFL_INTR_PRT10_MASK                           0x00040000
+#define TXBUF_FIFO_OVERFL_INTR_PRT10_RD(src)         (((src) & 0x00020000)>>17)
+#define TXBUF_FIFO_UNDERFL_INTR_PRT10_RD(src)        (((src) & 0x00010000)>>16)
+#define RXBUF_PAUSE_INTR_PORT00_RD(src)               (((src) & 0x00000040)>>6)
+#define RX_CHKSUM_INTR_PORT00_RD(src)                 (((src) & 0x00000020)>>5)
+#define RX_CHKSUM_INTR_PORT00_MASK                                   0x00000020
+#define RXBUF_PAUSE_INTR_PORT00_MASK                                 0x00000040
+#define TX_CHKSUM_INTR_PORT00_RD(src)                 (((src) & 0x00000010)>>4)
+#define TX_CHKSUM_INTR_PORT00_MASK                                   0x00000010
+#define RXBUF_FIFO_OVERFL_INTR_PRT00_RD(src)          (((src) & 0x00000008)>>3)
+#define RXBUF_FIFO_OVERFL_INTR_PRT00_MASK                            0x00000008
+#define RXBUF_FIFO_UNDERFL_INTR_PRT00_RD(src)         (((src) & 0x00000004)>>2)
+#define RXBUF_FIFO_UNDERFL_INTR_PRT00_MASK                           0x00000004
+#define TXBUF_FIFO_OVERFL_INTR_PRT00_RD(src)          (((src) & 0x00000002)>>1)
+#define TXBUF_FIFO_UNDERFL_INTR_PRT00_RD(src)            (((src) & 0x00000001))
 #define CFG_SPEED_1250_WR(src)                  (((u32)(src)<<24) & 0x01000000)
 #define CFG_TXCLK_MUXSEL0_WR(src)               (((u32)(src)<<29) & 0xe0000000)
 #define TX_PORT0_WR(src)                            (((u32)(src)) & 0x00000001)
@@ -58,6 +258,8 @@
        (((dst) & ~0x000f0000) | (((u32)(src)<<16) & 0x000f0000))
 #define CFG_CLE_HENQNUM0_SET(dst, src) \
        (((dst) & ~0x0fff0000) | (((u32)(src)<<16) & 0x0fff0000))
+#define MAC_INT_REG0_ADDR                                            0x00000514
+#define MAC_INT_REG1_ADDR                                            0x0000051c
 #define ICM_CONFIG0_REG_0_ADDR                                       0x00000400
 #define ICM_CONFIG2_REG_0_ADDR                                       0x00000410
 #define ECM_CONFIG0_REG_0_ADDR                                       0x00000500
@@ -68,10 +270,69 @@
        (((dst) & ~0x00000002) | (((u32)(src)<<1) & 0x00000002))
 #define RESUME_RX0_SET(dst, src) \
        (((dst) & ~0x00000001) | (((u32)(src)) & 0x00000001))
+#define ICM_DATA_FIFO_UNDERFL_INTR_PRT10_RD(src)     (((src) & 0x01000000)>>24)
+#define ICM_DATA_FIFO_UNDERFL_INTR_PRT10_MASK                        0x01000000
+#define ICM_DATA_FIFO_OVERFL_INTR_PRT10_MASK                         0x00800000
+#define ICM_CTRL_FIFO_OVERFL_INTR_PRT00_RD(src)       (((src) & 0x00000020)>>5)
+#define ICM_CTRL_FIFO_OVERFL_INTR_PRT00_MASK                         0x00000020
+#define ICM_CTRL_FIFO_OVERFL_INTR_PRT10_RD(src)      (((src) & 0x00200000)>>21)
+#define ICM_CTRL_FIFO_OVERFL_INTR_PRT10_MASK                         0x00200000
+#define ICM_CTRL_FIFO_UNDERFL_INTR_PRT10_RD(src)     (((src) & 0x00400000)>>22)
+#define ICM_CTRL_FIFO_UNDERFL_INTR_PRT10_MASK                        0x00400000
+#define ICM_CTRL_FIFO_UNDERFL_INTR_PRT00_RD(src)      (((src) & 0x00000040)>>6)
+#define ICM_CTRL_FIFO_UNDERFL_INTR_PRT00_MASK                        0x00000040
+#define ICM_DATA_FIFO_OVERFL_INTR_PRT00_RD(src)       (((src) & 0x00000080)>>7)
+#define ICM_DATA_FIFO_OVERFL_INTR_PRT10_RD(src)      (((src) & 0x00800000)>>23)
+#define ICM_DATA_FIFO_OVERFL_INTR_PRT00_MASK                         0x00000080
+#define ICM_DATA_FIFO_UNDERFL_INTR_PRT00_RD(src)      (((src) & 0x00000100)>>8)
+#define ICM_DATA_FIFO_UNDERFL_INTR_PRT00_MASK                        0x00000100
+#define ECM_DATA_FIFO_UNDERN_INTR_PRT00_RD(src)       (((src) & 0x00000010)>>4)
+#define ECM_DATA_FIFO_UNDERN_INTR_PRT00_MASK                         0x00000010
+#define ECM_DATA_FIFO_UNDERN_INTR_PRT10_RD(src)      (((src) & 0x00100000)>>20)
+#define ECM_DATA_FIFO_UNDERN_INTR_PRT10_MASK                         0x00100000
+#define ECM_DATA_FIFO_UNDERFL_INTR_PRT10_RD(src)     (((src) & 0x00080000)>>19)
+#define ECM_DATA_FIFO_UNDERFL_INTR_PRT10_MASK                        0x00080000
+#define ECM_DATA_FIFO_OVERFL_INTR_PRT10_RD(src)      (((src) & 0x00040000)>>18)
+#define ECM_DATA_FIFO_OVERFL_INTR_PRT10_MASK                         0x00040000
+#define CARRY_PORT01_RD(src)                             (((src) & 0x00000001))
+#define CARRY_PORT01_MASK                                            0x00000001
+#define LINKDOWN_PORT11_RD(src)                       (((src) & 0x00000008)>>3)
+#define LINKDOWN_PORT11_MASK                                         0x00000008
+#define CARRY_PORT11_RD(src)                          (((src) & 0x00000004)>>2)
+#define CARRY_PORT11_MASK                                            0x00000004
+#define LINKDOWN_PORT01_RD(src)                       (((src) & 0x00000002)>>1)
+#define LINKDOWN_PORT01_MASK                                         0x00000002
+#define MACIF_FIFO_UNDERFL_INTR_RXPRT00_F2_RD(src)    (((src) & 0x00000002)>>1)
+#define MACIF_FIFO_UNDERFL_INTR_RXPRT00_F2_MASK                      0x00000002
+#define MACIF_FIFO_UNDERFL_INTR_RXPRT10_F2_RD(src)   (((src) & 0x00020000)>>17)
+#define MACIF_FIFO_UNDERFL_INTR_RXPRT10_F2_MASK                      0x00020000
+#define MACIF_FIFO_OVERFL_INTR_RXPRT00_F2_RD(src)        (((src) & 0x00000001))
+#define MACIF_FIFO_OVERFL_INTR_RXPRT00_F2_MASK                       0x00000001
+#define MACIF_FIFO_OVERFL_INTR_RXPRT10_F2_RD(src)    (((src) & 0x00010000)>>16)
+#define MACIF_FIFO_OVERFL_INTR_RXPRT10_F2_MASK                       0x00010000
+#define ECM_DATA_FIFO_UNDERFL_INTR_PRT00_RD(src)      (((src) & 0x00000008)>>3)
+#define ECM_DATA_FIFO_UNDERFL_INTR_PRT00_MASK                        0x00000008
+#define ECM_DATA_FIFO_OVERFL_INTR_PRT00_RD(src)       (((src) & 0x00000004)>>2)
+#define ECM_DATA_FIFO_OVERFL_INTR_PRT00_MASK                         0x00000004
+#define ENET_STSSSQMIINT0_ADDR                                    0x0000009c
+#define ENET_STSSSQMIINT1_ADDR                                    0x000000a4
+#define ENET_STSSSQMIINT2_ADDR                                    0x000000ac
+#define ENET_STSSSQMIINT3_ADDR                                    0x000000b4
+#define ENET_STSSSQMIINT4_ADDR                                    0x000000bc
 #define ENET_CFGSSQMIWQASSOC_ADDR                                 0x000000e0
 #define ENET_CFGSSQMIFPQASSOC_ADDR                                0x000000dc
 #define ENET_CFGSSQMIQMLITEFPQASSOC_ADDR                          0x000000f0
 #define ENET_CFGSSQMIQMLITEWQASSOC_ADDR                           0x000000f4
+#define ENET_FPOVERFLOW0_RD(src)                      (((src) & 0xffffffff))
+#define ENET_WQOVERFLOW1_RD(src)                      (((src) & 0xffffffff))
+#define ENET_FPUNDERRUN2_RD(src)                      (((src) & 0xffffffff))
+#define ENET_WQUNDERRUN3_RD(src)                      (((src) & 0xffffffff))
+#define ENET_AXIWCMR_SLVERR4_RD(src)               (((src) & 0x00000002)>>1)
+#define ENET_AXIWCMR_SLVERR4_MASK                                 0x00000002
+#define ENET_FPOVERFLOW0_MASK                                     0xffffffff
+#define ENET_WQOVERFLOW1_MASK                                     0xffffffff
+#define ENET_FPUNDERRUN2_MASK                                     0xffffffff
+#define ENET_WQUNDERRUN3_MASK                                     0xffffffff
 #define ENET_CLKEN_ADDR                                              0x00000008
 #define ENET_SRST_ADDR                                               0x00000000
 #define CSR0_RESET_WR(src)                          (((u32)(src)) & 0x00000001)
@@ -159,4 +420,4 @@
 #define TX_FCS_ERROR_CNTR_MASK                                       0x00000fff
 #define TX_UNDSIZE_FRAME_CNTR_MASK                                   0x00000fff
 
-#endif /* __XGENE_ENET_CSR_H__ */
+#endif  /* __XGENE_ENET_CSR_H__ */
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_err.c 
b/drivers/net/ethernet/apm/xgene/xgene_enet_err.c
new file mode 100644
index 0000000..5be6531
--- /dev/null
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_err.c
@@ -0,0 +1,715 @@
+/* AppliedMicro X-Gene SoC Ethernet Driver
+ *
+ * Copyright (c) 2013, Applied Micro Circuits Corporation
+ * Authors:    Ravi Patel <rapa...@apm.com>
+ *             Iyappan Subramanian <isubraman...@apm.com>
+ *             Fushen Chen <fc...@apm.com>
+ *             Keyur Chudgar <kchud...@apm.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "xgene_enet_main.h"
+#include "xgene_enet_csr.h"
+
+int xgene_enet_parse_error(u8 LErr, int qid)
+{
+       /* QM Error */
+       switch (LErr) {
+       case 1:
+               pr_err("LErr[%d] QID %d: QM msg size error\n", LErr, qid);
+               return 0;
+       case 2:
+               pr_err("LErr[%d] QID %d: QM msg hop count error\n", LErr, qid);
+               return 0;
+       case 3:
+               pr_err("LErr[%d] QID %d: enqueue to virtual queue error\n",
+                      LErr, qid);
+               return 0;
+       case 4:
+               pr_err("LErr[%d] QID %d: enqueue to disable queue error\n",
+                      LErr, qid);
+               return 0;
+       case 5:
+               pr_debug("LErr[%d] QID %d: queue overfill error\n", LErr, qid);
+               return 1;
+       case 6:
+               pr_err("LErr[%d] QID %d: QM enqueue error\n", LErr, qid);
+               return 0;
+       case 7:
+               pr_err("LErr[%d] QID %d: QM dequeue error\n", LErr, qid);
+               return 0;
+       }
+       return 0;
+}
+
+static irqreturn_t xgene_enet_qmi_err_irq(int irq, void *dev_instance)
+{
+       struct xgene_enet_pdev *pdev;
+       struct xgene_enet_priv *priv;
+       int rc;
+       u32 data;
+       u32 int_mask = 0;
+
+       pdev = netdev_priv(dev_instance);
+       priv = &pdev->priv;
+       pr_err("Received Ethernet QMI Error Interrupt\n");
+       rc = xgene_enet_rd(priv, BLOCK_ETH_CSR, ENET_STSSSQMIINT0_ADDR, &data);
+       if (data) {
+               pr_err("Received STSSSQMIINT0 Error intr\n");
+               if (ENET_FPOVERFLOW0_RD(data)) {
+                       pr_err("FP PB overflow indication:0x%08X\n", data);
+                       int_mask |= ENET_FPOVERFLOW0_MASK;
+               }
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_ETH_CSR,
+                                  ENET_STSSSQMIINT0_ADDR, int_mask);
+       }
+       rc = xgene_enet_rd(priv, BLOCK_ETH_CSR, ENET_STSSSQMIINT1_ADDR, &data);
+       int_mask = 0;
+       if (data) {
+               pr_err("Received STSSSQMIINT1 Error Interrupt\n");
+               if (ENET_WQOVERFLOW1_RD(data)) {
+                       pr_err("WQ PB overflow indication:0x%08X\n", data);
+                       int_mask |= ENET_WQOVERFLOW1_MASK;
+               }
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_ETH_CSR,
+                                  ENET_STSSSQMIINT1_ADDR, int_mask);
+       }
+       rc = xgene_enet_rd(priv, BLOCK_ETH_CSR, ENET_STSSSQMIINT2_ADDR, &data);
+       int_mask = 0;
+       if (data) {
+               pr_err("Received STSSSQMIINT2  Error Interrupt\n");
+               if (ENET_FPUNDERRUN2_RD(data)) {
+                       pr_err("FP PB underrun indication:0x%08X\n", data);
+                       int_mask |= ENET_FPUNDERRUN2_MASK;
+               }
+
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_ETH_CSR,
+                                  ENET_STSSSQMIINT2_ADDR, int_mask);
+       }
+       rc = xgene_enet_rd(priv, BLOCK_ETH_CSR, ENET_STSSSQMIINT3_ADDR, &data);
+       int_mask = 0;
+       if (data) {
+               pr_err("Received STSSSQMIINT3 Error Interrupt\n");
+               if (ENET_WQUNDERRUN3_RD(data)) {
+                       pr_err("WQ PB underrun indication:0x%08X\n", data);
+                       int_mask |= ENET_WQUNDERRUN3_MASK;
+               }
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_ETH_CSR,
+                                  ENET_STSSSQMIINT3_ADDR, int_mask);
+       }
+       rc = xgene_enet_rd(priv, BLOCK_ETH_CSR, ENET_STSSSQMIINT4_ADDR, &data);
+       int_mask = 0;
+       if (data) {
+               pr_err("Received STSSSQMIINT4 Error Interrupt\n");
+               if (ENET_AXIWCMR_SLVERR4_RD(data)) {
+                       pr_err("AXI slave error on write  master channel\n");
+                       int_mask |= ENET_AXIWCMR_SLVERR4_MASK;
+               }
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_ETH_CSR,
+                                  ENET_STSSSQMIINT4_ADDR, int_mask);
+       }
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t xgene_enet_mac_err_irq(int irq, void *dev_instance)
+{
+       struct xgene_enet_pdev *pdev;
+       struct xgene_enet_priv *priv;
+       int rc;
+       u32 data;
+       u32 int_mask = 0;
+
+       pdev = netdev_priv(dev_instance);
+       priv = &pdev->priv;
+       pr_err("Received Ethernet MAC Error Interrupt\n");
+
+       rc = xgene_enet_rd(priv, BLOCK_MCX_MAC_CSR, MAC_INT_REG0_ADDR, &data);
+       if (data) {
+               pr_err("Received MAC Error Interrupt\n");
+
+               if (ICM_DATA_FIFO_UNDERFL_INTR_PRT10_RD(data)) {
+                       pr_err("RxPort1 ICM Data fifo underflow intr\n");
+                       int_mask |= ICM_DATA_FIFO_UNDERFL_INTR_PRT10_MASK;
+               }
+               if (ICM_DATA_FIFO_OVERFL_INTR_PRT10_RD(data)) {
+                       pr_err("RxPort1 ICM Data fifo overflow intr\n");
+                       int_mask |= ICM_DATA_FIFO_OVERFL_INTR_PRT10_MASK;
+               }
+               if (ICM_CTRL_FIFO_UNDERFL_INTR_PRT10_RD(data)) {
+                       pr_err("RxPort1 ICM Ctrl fifo underflow intr\n");
+                       int_mask |= ICM_CTRL_FIFO_UNDERFL_INTR_PRT10_MASK;
+               }
+               if (ICM_CTRL_FIFO_OVERFL_INTR_PRT10_RD(data)) {
+                       pr_err("RxPort1 ICM Ctrl fifo overflow intr\n");
+                       int_mask |= ICM_CTRL_FIFO_OVERFL_INTR_PRT10_MASK;
+               }
+               if (ECM_DATA_FIFO_UNDERN_INTR_PRT10_RD(data)) {
+                       pr_err("RxPort1 ECM Data fifo underrun intr\n");
+                       int_mask |= ECM_DATA_FIFO_UNDERN_INTR_PRT10_MASK;
+               }
+               if (ECM_DATA_FIFO_UNDERFL_INTR_PRT10_RD(data)) {
+                       pr_err("TxPort1 ECM Data fifo underflow intr\n");
+                       int_mask |= ECM_DATA_FIFO_UNDERFL_INTR_PRT10_MASK;
+               }
+               if (ECM_DATA_FIFO_OVERFL_INTR_PRT10_RD(data)) {
+                       pr_err("TxPort1 ECM Data fifo overflow intr\n");
+                       int_mask |= ECM_DATA_FIFO_OVERFL_INTR_PRT10_MASK;
+               }
+               if (MACIF_FIFO_UNDERFL_INTR_RXPRT10_F2_RD(data)) {
+                       pr_err("RxPort1 Mac i/f fifo underflow intr\n");
+                       int_mask |= MACIF_FIFO_UNDERFL_INTR_RXPRT10_F2_MASK;
+               }
+               if (MACIF_FIFO_OVERFL_INTR_RXPRT10_F2_RD(data)) {
+                       pr_err("RxPort1 Mac i/f fifo overflow intr\n");
+                       int_mask |= MACIF_FIFO_OVERFL_INTR_RXPRT10_F2_MASK;
+               }
+               if (ICM_DATA_FIFO_UNDERFL_INTR_PRT00_RD(data)) {
+                       pr_err("RxPort0 ICM Data fifo underflow intr\n");
+                       int_mask |= ICM_DATA_FIFO_UNDERFL_INTR_PRT00_MASK;
+               }
+               if (ICM_DATA_FIFO_OVERFL_INTR_PRT00_RD(data)) {
+                       pr_err("RxPort0 ICM Data fifo overflow intr\n");
+                       int_mask |= ICM_DATA_FIFO_OVERFL_INTR_PRT00_MASK;
+               }
+               if (ICM_CTRL_FIFO_UNDERFL_INTR_PRT00_RD(data)) {
+                       pr_err("RxPort0 ICM Ctrl fifo underflow intr\n");
+                       int_mask |= ICM_CTRL_FIFO_UNDERFL_INTR_PRT00_MASK;
+               }
+               if (ICM_CTRL_FIFO_OVERFL_INTR_PRT00_RD(data)) {
+                       pr_err("RxPort0 ICM Ctrl fifo overflow Interrupt\n");
+                       int_mask |= ICM_CTRL_FIFO_OVERFL_INTR_PRT00_MASK;
+               }
+               if (ECM_DATA_FIFO_UNDERN_INTR_PRT00_RD(data)) {
+                       pr_err("RxPort0 ECM Data fifo underrun interrupt\n");
+                       int_mask |= ECM_DATA_FIFO_UNDERN_INTR_PRT00_MASK;
+               }
+               if (ECM_DATA_FIFO_UNDERFL_INTR_PRT00_RD(data)) {
+                       pr_err("TxPort0 ECM Data fifo underflow interrupt\n");
+                       int_mask |= ECM_DATA_FIFO_UNDERFL_INTR_PRT00_MASK;
+               }
+               if (ECM_DATA_FIFO_OVERFL_INTR_PRT00_RD(data)) {
+                       pr_err("TxPort0 ECM Data fifo overflow interrupt\n");
+                       int_mask |= ECM_DATA_FIFO_OVERFL_INTR_PRT00_MASK;
+               }
+               if (MACIF_FIFO_UNDERFL_INTR_RXPRT00_F2_RD(data)) {
+                       pr_err("RxPort0 Mac i/f fifo underflow interrupt\n");
+                       int_mask |= MACIF_FIFO_UNDERFL_INTR_RXPRT00_F2_MASK;
+               }
+               if (MACIF_FIFO_OVERFL_INTR_RXPRT00_F2_RD(data)) {
+                       pr_err("RxPort0 Mac i/f fifo overflow interrupt\n");
+                       int_mask |= MACIF_FIFO_OVERFL_INTR_RXPRT00_F2_MASK;
+               }
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_MCX_MAC_CSR,
+                                  MAC_INT_REG0_ADDR, int_mask);
+       }
+       rc = xgene_enet_rd(priv, BLOCK_MCX_MAC_CSR, MAC_INT_REG1_ADDR, &data);
+       int_mask = 0;
+       if (data) {
+               pr_err("Received MAC Error Interrupt1\n");
+               if (LINKDOWN_PORT11_RD(data)) {
+                       pr_err("Port1:Link Down intr\n");
+                       int_mask |= LINKDOWN_PORT11_MASK;
+               }
+               if (CARRY_PORT11_RD(data)) {
+                       pr_err("Carry Intr for Status Reg Overflow for Port 
1\n");
+                       int_mask |= CARRY_PORT11_MASK;
+               }
+               if (LINKDOWN_PORT01_RD(data)) {
+                       pr_err("Port0:Link Down intr\n");
+                       int_mask |= LINKDOWN_PORT01_MASK;
+               }
+               if (CARRY_PORT01_RD(data)) {
+                       pr_err("Carry Intr for Status Reg Overflow for Port 
0\n");
+                       int_mask |= CARRY_PORT01_MASK;
+               }
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_MCX_MAC_CSR,
+                                  MAC_INT_REG1_ADDR, int_mask);
+       }
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t xgene_enet_err_irq(int irq, void *dev_instance)
+{
+       struct xgene_enet_pdev *pdev;
+       struct xgene_enet_priv *priv;
+       int rc;
+       u32 data;
+       u32 int_mask = 0;
+
+       pdev = netdev_priv(dev_instance);
+       priv = &pdev->priv;
+       rc = xgene_enet_rd(priv, BLOCK_ETH_CSR, RSIF_INT_REG0_ADDR, &data);
+       if (data) {
+               pr_err("Received RSIF Error Interrupt\n");
+               if (RSIF_LCL_RXBUF_FIFO_OVERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 Local Rxbuff FIFO overflow intr\n");
+                       int_mask |=
+                           RSIF_LCL_RXBUF_FIFO_OVERFL_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_LCL_RXBUF_FIFO_UNDERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 Local Rxbuff FIFO underflow intr\n");
+                       int_mask |=
+                           RSIF_LCL_RXBUF_FIFO_UNDERFL_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_CHKSUM_BUFF_FIFO_OVERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 chksum buff FIFO overflow intr\n");
+                       int_mask |=
+                           RSIF_CHKSUM_BUFF_FIFO_OVERFL_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_CHKSUM_BUFF_FIFO_UNDERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 chksum buffer FIFO underflow intr\n");
+                       int_mask |=
+                           RSIF_CHKSUM_BUFF_FIFO_UNDERFL_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_TIMESTAMP_BUFF_FIFO_OVERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 timestamp buffer FIFO overflow 
intr\n");
+                       int_mask |=
+                           RSIF_TIMESTAMP_BUFF_FIFO_OVERFL_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_TIMESTAMP_BUFF_FIFO_UNDERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 timestamp FIFO underflow intr\n");
+                       int_mask |=
+                           RSIF_TIMESTAMP_BUFF_FIFO_UNDERFL_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_ERR_BUFF_FIFO_OVERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 err buffer FIFO overflow intr\n");
+                       int_mask |= RSIF_ERR_BUFF_FIFO_OVERFL_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_ERR_BUFF_FIFO_UNDERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 err buffer FIFO underflow intr\n");
+                       int_mask |=
+                           RSIF_ERR_BUFF_FIFO_UNDERFL_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_CLEBUFF_FIFO_OVERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 classifier buffer FIFO overflow 
intr\n");
+                       int_mask |= RSIF_CLEBUFF_FIFO_OVERFL_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_CLEBUFF_FIFO_UNDERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 classifier buffer FIFO underflow 
intr\n");
+                       int_mask |= RSIF_CLEBUFF_FIFO_UNDERFL_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_CTRLBUFF_FIFO_OVERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 ctrl buffer FIFO overflow intr\n");
+                       int_mask |= RSIF_CTRLBUFF_FIFO_OVERFL_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_CTRLBUFF_FIFO_UNDERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err(" Rx port1 ctrl buffer FIFO underflow intr\n");
+                       int_mask |=
+                           RSIF_CTRLBUFF_FIFO_UNDERFL_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_BUF_FIFO_OVERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 buffer FIFO overflow intr\n");
+                       int_mask |= RSIF_BUF_FIFO_OVERFL_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_BUF_FIFO_UNDERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 buffer FIFO underflow intr\n");
+                       int_mask |= RSIF_BUF_FIFO_UNDERFL_INTR_RXPRT10_MASK;
+               }
+               if (ENET_RSIF_PLC_CLEBUFF_FIFO_OVERFL_INTR0_RD(data)) {
+                       pr_err("Policer CLE FIFO overflow intr\n");
+                       int_mask |=
+                           ENET_RSIF_PLC_CLEBUFF_FIFO_OVERFL_INTR0_MASK;
+               }
+               if (ENET_RSIF_PLC_CLEBUFF_FIFO_UNDERFL_INTR0_RD(data)) {
+                       pr_err("Policer CLE FIFO underflow intr\n");
+                       int_mask |=
+                           RSIF_LCL_RXBUF_FIFO_UNDERFL_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_LCL_RXBUF_FIFO_OVERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 Local Rx buffer FIFO overflow intr\n");
+                       int_mask |=
+                           RSIF_LCL_RXBUF_FIFO_OVERFL_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_LCL_RXBUF_FIFO_UNDERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 Local Rx buffer FIFO underflow 
intr\n");
+                       int_mask |=
+                           RSIF_LCL_RXBUF_FIFO_UNDERFL_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_CHKSUM_BUFF_FIFO_OVERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 chksum buffer FIFO overflow intr\n");
+                       int_mask |=
+                           RSIF_CHKSUM_BUFF_FIFO_OVERFL_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_CHKSUM_BUFF_FIFO_UNDERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 chksum buffer FIFO underflow intr\n");
+                       int_mask |=
+                           RSIF_CHKSUM_BUFF_FIFO_UNDERFL_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_TIMESTAMP_BUFF_FIFO_OVERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 timestamp buffer FIFO overflow 
intr\n");
+                       int_mask |=
+                           RSIF_TIMESTAMP_BUFF_FIFO_OVERFL_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_TIMESTAMP_BUFF_FIFO_UNDERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 timestamp FIFO underflow intr\n");
+                       int_mask |=
+                           RSIF_TIMESTAMP_BUFF_FIFO_UNDERFL_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_ERR_BUFF_FIFO_OVERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 err buffer FIFO overflow intr\n");
+                       int_mask |= RSIF_ERR_BUFF_FIFO_OVERFL_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_ERR_BUFF_FIFO_UNDERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 err buffer FIFO underflow 
interrupt\n");
+                       int_mask |=
+                           RSIF_ERR_BUFF_FIFO_UNDERFL_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_CLEBUFF_FIFO_OVERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 classifier buffer FIFO overflow 
intr\n");
+                       int_mask |= RSIF_CLEBUFF_FIFO_OVERFL_INTR_RXPRT00_MASK;
+               }
+
+               if (RSIF_CLEBUFF_FIFO_UNDERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 classifier buffer FIFO underflow 
intr\n");
+                       int_mask |= RSIF_CLEBUFF_FIFO_UNDERFL_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_CTRLBUFF_FIFO_OVERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 ctrl buffer FIFO overflow intr\n");
+                       int_mask |= RSIF_CTRLBUFF_FIFO_OVERFL_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_CTRLBUFF_FIFO_UNDERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 ctrl buffer FIFO overflow intr\n");
+                       int_mask |=
+                           RSIF_CTRLBUFF_FIFO_UNDERFL_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_BUF_FIFO_OVERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 buffer FIFO overflow intr\n");
+                       int_mask |= RSIF_BUF_FIFO_OVERFL_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_BUF_FIFO_UNDERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 buffer FIFO underflow intr\n");
+                       int_mask |= RSIF_BUF_FIFO_UNDERFL_INTR_RXPRT00_MASK;
+               }
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_ETH_CSR,
+                                  RSIF_INT_REG0_ADDR, int_mask);
+       }
+       rc = xgene_enet_rd(priv, BLOCK_ETH_CSR, RSIF_FINT_REG0_ADDR, &data);
+       int_mask = 0;
+       if (data) {
+               pr_err("Received RSIF Error2 Interrupt\n");
+               if (RSIF_SS_MIRRORERR_INTR_RXPRT10_RD(data)) {
+                       pr_err("Mirror buffer address offset/length do ");
+                       pr_err("not match with normal xfr address ");
+                       pr_err("offset/length in port1\n");
+                       int_mask |= RSIF_SS_MIRRORERR_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_SS_SPLIT_BOUNDARY_INTR_RXPRT10_RD(data)) {
+                       pr_err("Split boundary cannot be accomodated ");
+                       pr_err("in the firt buffer in port1\n");
+                       int_mask |= RSIF_SS_FPBUFF_TIMEOUT_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_SS_FPBUFF_TIMEOUT_INTR_RXPRT10_RD(data)) {
+                       pr_err("Packet dropped by RSIF because ");
+                       pr_err("freepool buffer was NOT available from ");
+                       pr_err("QMI on port1\n");
+                       int_mask |= RSIF_SS_FPBUFF_TIMEOUT_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_SS_AXI_WRERR_INTR_RXPRT10_RD(data)) {
+                       pr_err("AXI write error on port1\n");
+                       int_mask |= RSIF_SS_AXI_WRERR_INTR_RXPRT10_MASK;
+               }
+               if (RSIF_SS_MIRRORERR_INTR_RXPRT00_RD(data)) {
+                       pr_err("Mirror buffer address offset/length ");
+                       pr_err("do not match with normal xfr address ");
+                       pr_err("offset/length in port0\n");
+                       int_mask |= RSIF_SS_MIRRORERR_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_SS_SPLIT_BOUNDARY_INTR_RXPRT00_RD(data)) {
+                       pr_err("Split boundary cannot be accomodated ");
+                       pr_err("in the firt buffer in port0\n");
+                       int_mask |= RSIF_SS_SPLIT_BOUNDARY_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_SS_FPBUFF_TIMEOUT_INTR_RXPRT00_RD(data)) {
+                       pr_err("Packet dropped by RSIF because ");
+                       pr_err("freepool buffer was NOT available from ");
+                       pr_err("QMI on port0\n");
+                       int_mask |= RSIF_SS_FPBUFF_TIMEOUT_INTR_RXPRT00_MASK;
+               }
+               if (RSIF_SS_AXI_WRERR_INTR_RXPRT00_RD(data)) {
+                       pr_err("AXI write error on port0\n");
+                       int_mask |= RSIF_SS_AXI_WRERR_INTR_RXPRT00_MASK;
+               }
+               if (STS_RSIF_PLC_DROP0_RD(data)) {
+                       pr_err("Packet dropped by policer\n");
+                       int_mask |= STS_RSIF_PLC_DROP0_MASK;
+               }
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_ETH_CSR,
+                                  RSIF_FINT_REG0_ADDR, int_mask);
+       }
+       rc = xgene_enet_rd(priv, BLOCK_ETH_CSR, TSIF_INT_REG0_ADDR, &data);
+       int_mask = 0;
+       if (data) {
+               pr_err("Received TSIF Error Interrupt\n");
+               if (TSIF_RDMBUFF_FIFO_OVERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Tx port1 RDM buffer FIFO overflow interrupt\n");
+                       int_mask |= TSIF_RDMBUFF_FIFO_OVERFL_INTR_PRT10_MASK;
+               }
+               if (TSIF_RDMBUFF_FIFO_UNDERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Tx port1 RDM buffer FIFO underflow 
interrupt\n");
+                       int_mask |= TSIF_RDMBUFF_FIFO_UNDERFL_INTR_PRT10_MASK;
+               }
+               if (TSIF_RRM_FIFO_OVERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Tx port1 RRM buffer FIFO overflow intr\n");
+                       int_mask |= TSIF_RRM_FIFO_OVERFL_INTR_PRT10_MASK;
+               }
+               if (TSIF_RRM_FIFO_UNDERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Tx port1 RRM buffer FIFO underflow intr\n");
+                       int_mask |= TSIF_RRM_FIFO_UNDERFL_INTR_PRT10_MASK;
+               }
+               if (TSIF_AMABUF_FIFO_OVERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Tx port1 AMA buffer FIFO overflow intr\n");
+                       int_mask |= TSIF_AMABUF_FIFO_OVERFL_INTR_PRT10_MASK;
+               }
+               if (TSIF_AMABUF_FIFO_UNDERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Tx port1 AMA buffer FIFO underflow intr\n");
+                       int_mask |= TSIF_AMABUF_FIFO_UNDERFL_INTR_PRT10_MASK;
+               }
+
+               if (TSIF_RDMBUFF_FIFO_OVERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Tx port0 RDM buffer FIFO overflow intr\n");
+                       int_mask |= TSIF_RDMBUFF_FIFO_OVERFL_INTR_PRT00_MASK;
+               }
+               if (TSIF_RDMBUFF_FIFO_UNDERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Tx port0 RDM buffer FIFO underflow intr\n");
+                       int_mask |= TSIF_RDMBUFF_FIFO_UNDERFL_INTR_PRT00_MASK;
+               }
+               if (TSIF_RRM_FIFO_OVERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Tx port0 RRM buffer FIFO overflow intr\n");
+                       int_mask |= TSIF_RRM_FIFO_OVERFL_INTR_PRT00_MASK;
+               }
+               if (TSIF_RRM_FIFO_UNDERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Tx port0 RRM buffer FIFO underflow intr\n");
+                       int_mask |= TSIF_RRM_FIFO_UNDERFL_INTR_PRT00_MASK;
+               }
+               if (TSIF_AMABUF_FIFO_OVERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Tx port0 AMA buffer FIFO overflow intr\n");
+                       int_mask |= TSIF_AMABUF_FIFO_OVERFL_INTR_PRT00_MASK;
+               }
+               if (TSIF_AMABUF_FIFO_UNDERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Tx port0 AMA buffer FIFO underflow intr\n");
+                       int_mask |= TSIF_AMABUF_FIFO_UNDERFL_INTR_PRT00_MASK;
+               }
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_ETH_CSR,
+                                  TSIF_INT_REG0_ADDR, int_mask);
+       }
+       rc = xgene_enet_rd(priv, BLOCK_ETH_CSR, TSIF_FINT_REG0_ADDR, &data);
+       int_mask = 0;
+       if (data) {
+               pr_err("Received TSIF Error Interrupt\n");
+               if (TSIF_SS_AXI_LLRDERR_INTR_PRT10_RD(data)) {
+                       pr_err("AXI error when reading data from port1\n");
+                       int_mask |= TSIF_SS_AXI_LLRDERR_INTR_PRT10_MASK;
+               }
+               if (TSIF_SS_AXI_RDERR_INTR_PRT10_RD(data)) {
+                       pr_err("AXI error when reading data from port1\n");
+                       int_mask |= TSIF_SS_AXI_RDERR_INTR_PRT10_MASK;
+               }
+               if (TSIF_SS_BAD_MSG_INTR_PRT10_RD(data)) {
+                       pr_err("Bad message received by TSIF on port1\n");
+                       int_mask |= TSIF_SS_BAD_MSG_INTR_PRT10_MASK;
+               }
+               if (TSIF_SS_AXI_LLRDERR_INTR_PRT00_RD(data)) {
+                       pr_err("AXI error when reading data from port0\n");
+                       int_mask |= TSIF_SS_AXI_LLRDERR_INTR_PRT00_MASK;
+               }
+               if (TSIF_SS_AXI_RDERR_INTR_PRT00_RD(data)) {
+                       pr_err("AXI error when reading data from port0\n");
+                       int_mask |= TSIF_SS_AXI_RDERR_INTR_PRT00_MASK;
+               }
+               if (TSIF_SS_BAD_MSG_INTR_PRT00_RD(data)) {
+                       pr_err("Bad message received by TSIF on port0\n");
+                       int_mask |= TSIF_SS_BAD_MSG_INTR_PRT00_MASK;
+               }
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_ETH_CSR,
+                                  TSIF_FINT_REG0_ADDR, int_mask);
+       }
+       rc = xgene_enet_rd(priv, BLOCK_ETH_CSR, TSO_INT_REG0_ADDR, &data);
+       int_mask = 0;
+       if (data) {
+               pr_err("Received TSO Error Interrupt\n");
+               if (MB_TTF_FIFO_OVERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Tx port1 tso_txbuff FIFO overflow intr\n");
+                       int_mask |= MB_TTF_FIFO_OVERFL_INTR_PRT10_MASK;
+               }
+               if (MB_TTF_FIFO_UNDERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Tx port1 tso_txbuff FIFO underflow intr\n");
+                       int_mask |= MB_TTF_FIFO_UNDERFL_INTR_PRT10_MASK;
+               }
+               if (MH_DEALLOC_FIFO_OVERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Tx port1 Dealloc FIFO overflow intr\n");
+                       int_mask |= MH_DEALLOC_FIFO_OVERFL_INTR_PRT10_MASK;
+               }
+               if (MH_DEALLOC_FIFO_UNDERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Tx port1 Dealloc FIFO underflow intr\n");
+                       int_mask |= MH_DEALLOC_FIFO_UNDERFL_INTR_PRT10_MASK;
+               }
+               if (MH_FIFO_OVERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Tx port1 Message Hold FIFO overflow intr\n");
+                       int_mask |= MH_FIFO_OVERFL_INTR_PRT10_MASK;
+               }
+               if (MH_FIFO_UNDERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Tx port1 Message Hold FIFO underflow intr\n");
+                       int_mask |= MH_FIFO_UNDERFL_INTR_PRT10_MASK;
+               }
+               if (MB_TTF_FIFO_OVERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Tx port0 tso_txbuff FIFO overflow intr\n");
+                       int_mask |= MB_TTF_FIFO_OVERFL_INTR_PRT00_MASK;
+               }
+               if (MB_TTF_FIFO_UNDERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Tx port0 tso_txbuff FIFO underflow intr\n");
+                       int_mask |= MB_TTF_FIFO_UNDERFL_INTR_PRT00_MASK;
+               }
+               if (MH_DEALLOC_FIFO_OVERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Tx port0 Dealloc FIFO overflow intr\n");
+                       int_mask |= MH_DEALLOC_FIFO_OVERFL_INTR_PRT00_MASK;
+               }
+               if (MH_DEALLOC_FIFO_UNDERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Tx port1 Dealloc FIFO underflow intr\n");
+                       int_mask |= MH_DEALLOC_FIFO_UNDERFL_INTR_PRT00_MASK;
+               }
+               if (MH_FIFO_OVERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Tx port1 Message Hold FIFO overflow intr\n");
+                       int_mask |= MH_FIFO_OVERFL_INTR_PRT00_MASK;
+               }
+               if (MH_FIFO_UNDERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Tx port1 Message Hold FIFO underflow intr\n");
+                       int_mask |= MH_FIFO_UNDERFL_INTR_PRT00_MASK;
+               }
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_ETH_CSR,
+                                  TSO_INT_REG0_ADDR, int_mask);
+       }
+       rc = xgene_enet_rd(priv, BLOCK_ETH_CSR, SPI2SAP_INT_REG0_ADDR, &data);
+       int_mask = 0;
+       if (data) {
+               pr_err("Received SPI2SAP Error Interrupt\n");
+               if (MACIF_FIFO_OVERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 SAP FIFO overflow intr\n");
+                       int_mask |= MACIF_FIFO_OVERFL_INTR_RXPRT10_MASK;
+               }
+               if (MACIF_FIFO_UNDERFL_INTR_RXPRT10_RD(data)) {
+                       pr_err("Rx port1 SAP FIFO underflow intr\n");
+                       int_mask |= MACIF_FIFO_UNDERFL_INTR_RXPRT10_MASK;
+               }
+               if (MACIF_FIFO_OVERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 SAP FIFO overflow intr\n");
+                       int_mask |= MACIF_FIFO_OVERFL_INTR_RXPRT00_MASK;
+               }
+               if (MACIF_FIFO_UNDERFL_INTR_RXPRT00_RD(data)) {
+                       pr_err("Rx port0 SAP FIFO underflow intr\n");
+                       int_mask |= MACIF_FIFO_UNDERFL_INTR_RXPRT00_MASK;
+               }
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_ETH_CSR,
+                                  SPI2SAP_INT_REG0_ADDR, int_mask);
+       }
+       rc = xgene_enet_rd(priv, BLOCK_ETH_CSR,
+                          RX_TX_BUF_CHKSM_INT_REG0_ADDR, &data);
+       int_mask = 0;
+       if (data) {
+               pr_err("Received RX/TX Buffer Checksum Error Interrupt\n");
+               if (RXBUF_PAUSE_INTR_PORT10_RD(data)) {
+                       pr_err("Rx port1 Pause interrupt\n");
+                       int_mask |= RXBUF_PAUSE_INTR_PORT10_MASK;
+               }
+               if (RX_CHKSUM_INTR_PORT10_RD(data)) {
+                       pr_err("Rx port1 Chksum Error intr\n");
+                       int_mask |= RX_CHKSUM_INTR_PORT10_MASK;
+               }
+               if (TX_CHKSUM_INTR_PORT10_RD(data)) {
+                       pr_err("Tx port1 Chksum Error intr\n");
+                       int_mask |= TX_CHKSUM_INTR_PORT10_MASK;
+               }
+               if (RXBUF_FIFO_OVERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Rx port1 rx buffer FIFO  overflow intr\n");
+                       int_mask |= RXBUF_FIFO_OVERFL_INTR_PRT10_MASK;
+               }
+               if (RXBUF_FIFO_UNDERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Rx port1 rx buffer FIFO  underflow intr\n");
+                       int_mask |= RXBUF_FIFO_UNDERFL_INTR_PRT10_MASK;
+               }
+               if (TXBUF_FIFO_OVERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Rx port1 rx buffer FIFO  overflow intr\n");
+                       int_mask |= RXBUF_FIFO_OVERFL_INTR_PRT10_MASK;
+               }
+               if (TXBUF_FIFO_UNDERFL_INTR_PRT10_RD(data)) {
+                       pr_err("Rx port1 rx buffer FIFO  underflow intr\n");
+                       int_mask |= RXBUF_FIFO_UNDERFL_INTR_PRT10_MASK;
+               }
+               if (RXBUF_PAUSE_INTR_PORT00_RD(data)) {
+                       pr_err("Rx port0 Pause interrupt\n");
+                       int_mask |= RXBUF_PAUSE_INTR_PORT00_MASK;
+               }
+               if (RX_CHKSUM_INTR_PORT00_RD(data)) {
+                       pr_err("Rx port0 Chksum Error intr\n");
+                       int_mask |= RX_CHKSUM_INTR_PORT00_MASK;
+               }
+               if (TX_CHKSUM_INTR_PORT00_RD(data)) {
+                       pr_err("Tx port0 Chksum Error intr\n");
+                       int_mask |= TX_CHKSUM_INTR_PORT00_MASK;
+               }
+               if (RXBUF_FIFO_OVERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Rx port0 rx buffer FIFO  overflow intr\n");
+                       int_mask |= RXBUF_FIFO_OVERFL_INTR_PRT00_MASK;
+               }
+               if (RXBUF_FIFO_UNDERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Rx port0 rx buffer FIFO  underflow intr\n");
+                       int_mask |= RXBUF_FIFO_UNDERFL_INTR_PRT00_MASK;
+               }
+               if (TXBUF_FIFO_OVERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Rx port0 rx buffer FIFO  overflow intr\n");
+                       int_mask |= RXBUF_FIFO_OVERFL_INTR_PRT00_MASK;
+               }
+               if (TXBUF_FIFO_UNDERFL_INTR_PRT00_RD(data)) {
+                       pr_err("Rx port0 rx buffer FIFO  underflow intr\n");
+                       int_mask |= RXBUF_FIFO_UNDERFL_INTR_PRT00_MASK;
+               }
+               /* Clear intrstatus bits, its COW */
+               rc = xgene_enet_wr(priv, BLOCK_ETH_CSR,
+                                  RX_TX_BUF_CHKSM_INT_REG0_ADDR, int_mask);
+       }
+       return IRQ_HANDLED;
+}
+
+void xgene_enet_register_err_irqs(struct net_device *ndev)
+{
+       struct xgene_enet_pdev *pdev;
+       struct device *dev;
+
+       pdev = (struct xgene_enet_pdev *)netdev_priv(ndev);
+       dev = &pdev->plat_dev->dev;
+
+       if ((devm_request_irq(dev, pdev->enet_err_irq, xgene_enet_err_irq,
+                        IRQF_SHARED, ndev->name, ndev)) != 0)
+               netdev_err(ndev, "Failed to reg Enet Error IRQ %d\n",
+                          pdev->enet_err_irq);
+       if ((devm_request_irq(dev, pdev->enet_mac_err_irq,
+                        xgene_enet_mac_err_irq, IRQF_SHARED,
+                        ndev->name, ndev)) != 0)
+               netdev_err(ndev, "Failed to reg Enet MAC Error IRQ %d\n",
+                          pdev->enet_mac_err_irq);
+       if ((devm_request_irq(dev, pdev->enet_qmi_err_irq,
+                        xgene_enet_qmi_err_irq,
+                        IRQF_SHARED, ndev->name, ndev)) != 0)
+               netdev_err(ndev, "Failed to reg Enet QMI Error IRQ %d\n",
+                          pdev->enet_qmi_err_irq);
+}
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c 
b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
index 2aa1808..90f53b8 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
@@ -770,6 +770,7 @@ static int xgene_enet_rx_frame(struct xgene_enet_qcontext 
*e2c,
                        goto process_pkt;
                }
 
+               xgene_enet_parse_error(LErr, qid);
                netdev_dbg(ndev, "ENET LErr 0x%x skb 0x%p FP 0x%x\n",
                           LErr, skb, msg16->FPQNum);
                print_hex_dump(KERN_ERR, "QM Msg: ",
@@ -1258,6 +1259,8 @@ static void xgene_enet_register_irq(struct net_device 
*ndev)
                /* Disable interrupts for RX queue mailboxes */
                disable_irq_nosync(pdev->rx[qindex]->qdesc->irq);
        }
+
+       xgene_enet_register_err_irqs(ndev);
 }
 
 static int xgene_enet_get_resources(struct xgene_enet_pdev *pdev)
@@ -1330,6 +1333,30 @@ static int xgene_enet_get_resources(struct 
xgene_enet_pdev *pdev)
        }
        pdev->sdev = sdev;
 
+       pdata.irq = platform_get_irq(plat_dev, 0);
+       if (pdata.irq <= 0) {
+               dev_err(dev, "Unable to get ENET Error IRQ\n");
+               rc = pdata.irq;
+               goto out;
+       }
+       pdev->enet_err_irq = pdata.irq;
+
+       pdata.irq = platform_get_irq(plat_dev, 1);
+       if (pdata.irq <= 0) {
+               dev_err(dev, "Unable to get ENET MAC Error IRQ\n");
+               rc = pdata.irq;
+               goto out;
+       }
+       pdev->enet_mac_err_irq = pdata.irq;
+
+       pdata.irq = platform_get_irq(plat_dev, 2);
+       if (pdata.irq <= 0) {
+               dev_err(dev, "Unable to get ENET QMI Error IRQ\n");
+               rc = pdata.irq;
+               goto out;
+       }
+       pdev->enet_qmi_err_irq = pdata.irq;
+
        rc = of_property_read_u32(plat_dev->dev.of_node, "phyid",
                                  &pdata.phy_id);
        if (rc || pdata.phy_id > 0x1F) {
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.h 
b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h
index 15ea995..b25bb37 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.h
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h
@@ -127,6 +127,7 @@ struct eth_queue_ids {
 struct xgene_enet_platform_data {
        u32 port_id;
        const char *sname;
+       int irq;
        u32 phy_id;
        u8 ethaddr[6];
 };
@@ -155,6 +156,9 @@ struct xgene_enet_pdev {
        struct eth_queue_ids qm_queues;
        u32 rx_buff_cnt, tx_cqt_low, tx_cqt_hi;
        int mss;
+       unsigned int enet_err_irq;
+       unsigned int enet_mac_err_irq;
+       unsigned int enet_qmi_err_irq;
        struct xgene_enet_priv priv;
 };
 
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to