Skip to content

Commit 46eba19

Browse files
Furong Xudavem330
authored andcommitted
net: stmmac: xgmac: fix handling of DPP safety error for DMA channels
Commit 56e58d6 ("net: stmmac: Implement Safety Features in XGMAC core") checks and reports safety errors, but leaves the Data Path Parity Errors for each channel in DMA unhandled at all, lead to a storm of interrupt. Fix it by checking and clearing the DMA_DPP_Interrupt_Status register. Fixes: 56e58d6 ("net: stmmac: Implement Safety Features in XGMAC core") Signed-off-by: Furong Xu <[email protected]> Reviewed-by: Simon Horman <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 41b9fb3 commit 46eba19

File tree

3 files changed

+60
-1
lines changed

3 files changed

+60
-1
lines changed

drivers/net/ethernet/stmicro/stmmac/common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ struct stmmac_safety_stats {
216216
unsigned long mac_errors[32];
217217
unsigned long mtl_errors[32];
218218
unsigned long dma_errors[32];
219+
unsigned long dma_dpp_errors[32];
219220
};
220221

221222
/* Number of fields in Safety Stats */

drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,8 @@
303303
#define XGMAC_RXCEIE BIT(4)
304304
#define XGMAC_TXCEIE BIT(0)
305305
#define XGMAC_MTL_ECC_INT_STATUS 0x000010cc
306+
#define XGMAC_MTL_DPP_CONTROL 0x000010e0
307+
#define XGMAC_DDPP_DISABLE BIT(0)
306308
#define XGMAC_MTL_TXQ_OPMODE(x) (0x00001100 + (0x80 * (x)))
307309
#define XGMAC_TQS GENMASK(25, 16)
308310
#define XGMAC_TQS_SHIFT 16
@@ -385,6 +387,7 @@
385387
#define XGMAC_DCEIE BIT(1)
386388
#define XGMAC_TCEIE BIT(0)
387389
#define XGMAC_DMA_ECC_INT_STATUS 0x0000306c
390+
#define XGMAC_DMA_DPP_INT_STATUS 0x00003074
388391
#define XGMAC_DMA_CH_CONTROL(x) (0x00003100 + (0x80 * (x)))
389392
#define XGMAC_SPH BIT(24)
390393
#define XGMAC_PBLx8 BIT(16)

drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,43 @@ static const struct dwxgmac3_error_desc dwxgmac3_dma_errors[32]= {
830830
{ false, "UNKNOWN", "Unknown Error" }, /* 31 */
831831
};
832832

833+
static const char * const dpp_rx_err = "Read Rx Descriptor Parity checker Error";
834+
static const char * const dpp_tx_err = "Read Tx Descriptor Parity checker Error";
835+
static const struct dwxgmac3_error_desc dwxgmac3_dma_dpp_errors[32] = {
836+
{ true, "TDPES0", dpp_tx_err },
837+
{ true, "TDPES1", dpp_tx_err },
838+
{ true, "TDPES2", dpp_tx_err },
839+
{ true, "TDPES3", dpp_tx_err },
840+
{ true, "TDPES4", dpp_tx_err },
841+
{ true, "TDPES5", dpp_tx_err },
842+
{ true, "TDPES6", dpp_tx_err },
843+
{ true, "TDPES7", dpp_tx_err },
844+
{ true, "TDPES8", dpp_tx_err },
845+
{ true, "TDPES9", dpp_tx_err },
846+
{ true, "TDPES10", dpp_tx_err },
847+
{ true, "TDPES11", dpp_tx_err },
848+
{ true, "TDPES12", dpp_tx_err },
849+
{ true, "TDPES13", dpp_tx_err },
850+
{ true, "TDPES14", dpp_tx_err },
851+
{ true, "TDPES15", dpp_tx_err },
852+
{ true, "RDPES0", dpp_rx_err },
853+
{ true, "RDPES1", dpp_rx_err },
854+
{ true, "RDPES2", dpp_rx_err },
855+
{ true, "RDPES3", dpp_rx_err },
856+
{ true, "RDPES4", dpp_rx_err },
857+
{ true, "RDPES5", dpp_rx_err },
858+
{ true, "RDPES6", dpp_rx_err },
859+
{ true, "RDPES7", dpp_rx_err },
860+
{ true, "RDPES8", dpp_rx_err },
861+
{ true, "RDPES9", dpp_rx_err },
862+
{ true, "RDPES10", dpp_rx_err },
863+
{ true, "RDPES11", dpp_rx_err },
864+
{ true, "RDPES12", dpp_rx_err },
865+
{ true, "RDPES13", dpp_rx_err },
866+
{ true, "RDPES14", dpp_rx_err },
867+
{ true, "RDPES15", dpp_rx_err },
868+
};
869+
833870
static void dwxgmac3_handle_dma_err(struct net_device *ndev,
834871
void __iomem *ioaddr, bool correctable,
835872
struct stmmac_safety_stats *stats)
@@ -841,6 +878,13 @@ static void dwxgmac3_handle_dma_err(struct net_device *ndev,
841878

842879
dwxgmac3_log_error(ndev, value, correctable, "DMA",
843880
dwxgmac3_dma_errors, STAT_OFF(dma_errors), stats);
881+
882+
value = readl(ioaddr + XGMAC_DMA_DPP_INT_STATUS);
883+
writel(value, ioaddr + XGMAC_DMA_DPP_INT_STATUS);
884+
885+
dwxgmac3_log_error(ndev, value, false, "DMA_DPP",
886+
dwxgmac3_dma_dpp_errors,
887+
STAT_OFF(dma_dpp_errors), stats);
844888
}
845889

846890
static int
@@ -881,6 +925,12 @@ dwxgmac3_safety_feat_config(void __iomem *ioaddr, unsigned int asp,
881925
value |= XGMAC_TMOUTEN; /* FSM Timeout Feature */
882926
writel(value, ioaddr + XGMAC_MAC_FSM_CONTROL);
883927

928+
/* 5. Enable Data Path Parity Protection */
929+
value = readl(ioaddr + XGMAC_MTL_DPP_CONTROL);
930+
/* already enabled by default, explicit enable it again */
931+
value &= ~XGMAC_DDPP_DISABLE;
932+
writel(value, ioaddr + XGMAC_MTL_DPP_CONTROL);
933+
884934
return 0;
885935
}
886936

@@ -914,7 +964,11 @@ static int dwxgmac3_safety_feat_irq_status(struct net_device *ndev,
914964
ret |= !corr;
915965
}
916966

917-
err = dma & (XGMAC_DEUIS | XGMAC_DECIS);
967+
/* DMA_DPP_Interrupt_Status is indicated by MCSIS bit in
968+
* DMA_Safety_Interrupt_Status, so we handle DMA Data Path
969+
* Parity Errors here
970+
*/
971+
err = dma & (XGMAC_DEUIS | XGMAC_DECIS | XGMAC_MCSIS);
918972
corr = dma & XGMAC_DECIS;
919973
if (err) {
920974
dwxgmac3_handle_dma_err(ndev, ioaddr, corr, stats);
@@ -930,6 +984,7 @@ static const struct dwxgmac3_error {
930984
{ dwxgmac3_mac_errors },
931985
{ dwxgmac3_mtl_errors },
932986
{ dwxgmac3_dma_errors },
987+
{ dwxgmac3_dma_dpp_errors },
933988
};
934989

935990
static int dwxgmac3_safety_feat_dump(struct stmmac_safety_stats *stats,

0 commit comments

Comments
 (0)