Skip to content

Commit 5ac712d

Browse files
wvk86davem330
authored andcommitted
net: stmmac: enable platform specific safety features
On Intel platforms, not all safety features are enabled on the hardware. The current implementation enable all safety features by default. This will cause mass error and warning printouts after the module is loaded. Introduce platform specific safety features flag to enable or disable each safety features. Signed-off-by: Wong Vee Khee <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e5432cc commit 5ac712d

File tree

8 files changed

+84
-14
lines changed

8 files changed

+84
-14
lines changed

drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,16 @@ static int ehl_common_data(struct pci_dev *pdev,
568568
plat->tx_queues_to_use = 8;
569569
plat->clk_ptp_rate = 200000000;
570570

571+
plat->safety_feat_cfg->tsoee = 1;
572+
plat->safety_feat_cfg->mrxpee = 1;
573+
plat->safety_feat_cfg->mestee = 1;
574+
plat->safety_feat_cfg->mrxee = 1;
575+
plat->safety_feat_cfg->mtxee = 1;
576+
plat->safety_feat_cfg->epsi = 0;
577+
plat->safety_feat_cfg->edpp = 0;
578+
plat->safety_feat_cfg->prtyen = 0;
579+
plat->safety_feat_cfg->tmouten = 0;
580+
571581
return intel_mgbe_common_data(pdev, plat);
572582
}
573583

@@ -683,6 +693,16 @@ static int tgl_common_data(struct pci_dev *pdev,
683693
plat->tx_queues_to_use = 4;
684694
plat->clk_ptp_rate = 200000000;
685695

696+
plat->safety_feat_cfg->tsoee = 1;
697+
plat->safety_feat_cfg->mrxpee = 0;
698+
plat->safety_feat_cfg->mestee = 1;
699+
plat->safety_feat_cfg->mrxee = 1;
700+
plat->safety_feat_cfg->mtxee = 1;
701+
plat->safety_feat_cfg->epsi = 0;
702+
plat->safety_feat_cfg->edpp = 0;
703+
plat->safety_feat_cfg->prtyen = 0;
704+
plat->safety_feat_cfg->tmouten = 0;
705+
686706
return intel_mgbe_common_data(pdev, plat);
687707
}
688708

@@ -959,6 +979,12 @@ static int intel_eth_pci_probe(struct pci_dev *pdev,
959979
if (!plat->dma_cfg)
960980
return -ENOMEM;
961981

982+
plat->safety_feat_cfg = devm_kzalloc(&pdev->dev,
983+
sizeof(*plat->safety_feat_cfg),
984+
GFP_KERNEL);
985+
if (!plat->safety_feat_cfg)
986+
return -ENOMEM;
987+
962988
/* Enable pci device */
963989
ret = pcim_enable_device(pdev);
964990
if (ret) {

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

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ static void dwmac5_handle_dma_err(struct net_device *ndev,
183183
STAT_OFF(dma_errors), stats);
184184
}
185185

186-
int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp)
186+
int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp,
187+
struct stmmac_safety_feature_cfg *safety_feat_cfg)
187188
{
188189
u32 value;
189190

@@ -193,11 +194,16 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp)
193194
/* 1. Enable Safety Features */
194195
value = readl(ioaddr + MTL_ECC_CONTROL);
195196
value |= MEEAO; /* MTL ECC Error Addr Status Override */
196-
value |= TSOEE; /* TSO ECC */
197-
value |= MRXPEE; /* MTL RX Parser ECC */
198-
value |= MESTEE; /* MTL EST ECC */
199-
value |= MRXEE; /* MTL RX FIFO ECC */
200-
value |= MTXEE; /* MTL TX FIFO ECC */
197+
if (safety_feat_cfg->tsoee)
198+
value |= TSOEE; /* TSO ECC */
199+
if (safety_feat_cfg->mrxpee)
200+
value |= MRXPEE; /* MTL RX Parser ECC */
201+
if (safety_feat_cfg->mestee)
202+
value |= MESTEE; /* MTL EST ECC */
203+
if (safety_feat_cfg->mrxee)
204+
value |= MRXEE; /* MTL RX FIFO ECC */
205+
if (safety_feat_cfg->mtxee)
206+
value |= MTXEE; /* MTL TX FIFO ECC */
201207
writel(value, ioaddr + MTL_ECC_CONTROL);
202208

203209
/* 2. Enable MTL Safety Interrupts */
@@ -219,13 +225,16 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp)
219225

220226
/* 5. Enable Parity and Timeout for FSM */
221227
value = readl(ioaddr + MAC_FSM_CONTROL);
222-
value |= PRTYEN; /* FSM Parity Feature */
223-
value |= TMOUTEN; /* FSM Timeout Feature */
228+
if (safety_feat_cfg->prtyen)
229+
value |= PRTYEN; /* FSM Parity Feature */
230+
if (safety_feat_cfg->tmouten)
231+
value |= TMOUTEN; /* FSM Timeout Feature */
224232
writel(value, ioaddr + MAC_FSM_CONTROL);
225233

226234
/* 4. Enable Data Parity Protection */
227235
value = readl(ioaddr + MTL_DPP_CONTROL);
228-
value |= EDPP;
236+
if (safety_feat_cfg->edpp)
237+
value |= EDPP;
229238
writel(value, ioaddr + MTL_DPP_CONTROL);
230239

231240
/*
@@ -235,7 +244,8 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp)
235244
if (asp <= 0x2)
236245
return 0;
237246

238-
value |= EPSI;
247+
if (safety_feat_cfg->epsi)
248+
value |= EPSI;
239249
writel(value, ioaddr + MTL_DPP_CONTROL);
240250
return 0;
241251
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@
137137

138138
#define GMAC_INT_FPE_EN BIT(17)
139139

140-
int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp);
140+
int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp,
141+
struct stmmac_safety_feature_cfg *safety_cfg);
141142
int dwmac5_safety_feat_irq_status(struct net_device *ndev,
142143
void __iomem *ioaddr, unsigned int asp,
143144
struct stmmac_safety_stats *stats);

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -801,7 +801,9 @@ static void dwxgmac3_handle_dma_err(struct net_device *ndev,
801801
dwxgmac3_dma_errors, STAT_OFF(dma_errors), stats);
802802
}
803803

804-
static int dwxgmac3_safety_feat_config(void __iomem *ioaddr, unsigned int asp)
804+
static int
805+
dwxgmac3_safety_feat_config(void __iomem *ioaddr, unsigned int asp,
806+
struct stmmac_safety_feature_cfg *safety_cfg)
805807
{
806808
u32 value;
807809

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,8 @@ struct stmmac_ops {
348348
void (*pcs_rane)(void __iomem *ioaddr, bool restart);
349349
void (*pcs_get_adv_lp)(void __iomem *ioaddr, struct rgmii_adv *adv);
350350
/* Safety Features */
351-
int (*safety_feat_config)(void __iomem *ioaddr, unsigned int asp);
351+
int (*safety_feat_config)(void __iomem *ioaddr, unsigned int asp,
352+
struct stmmac_safety_feature_cfg *safety_cfg);
352353
int (*safety_feat_irq_status)(struct net_device *ndev,
353354
void __iomem *ioaddr, unsigned int asp,
354355
struct stmmac_safety_stats *stats);

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3172,7 +3172,8 @@ static void stmmac_safety_feat_configuration(struct stmmac_priv *priv)
31723172
{
31733173
if (priv->dma_cap.asp) {
31743174
netdev_info(priv->dev, "Enabling Safety Features\n");
3175-
stmmac_safety_feat_config(priv, priv->ioaddr, priv->dma_cap.asp);
3175+
stmmac_safety_feat_config(priv, priv->ioaddr, priv->dma_cap.asp,
3176+
priv->plat->safety_feat_cfg);
31763177
} else {
31773178
netdev_info(priv->dev, "No Safety Features support found\n");
31783179
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,12 @@ static int stmmac_pci_probe(struct pci_dev *pdev,
174174
if (!plat->dma_cfg)
175175
return -ENOMEM;
176176

177+
plat->safety_feat_cfg = devm_kzalloc(&pdev->dev,
178+
sizeof(*plat->safety_feat_cfg),
179+
GFP_KERNEL);
180+
if (!plat->safety_feat_cfg)
181+
return -ENOMEM;
182+
177183
/* Enable pci device */
178184
ret = pci_enable_device(pdev);
179185
if (ret) {
@@ -203,6 +209,16 @@ static int stmmac_pci_probe(struct pci_dev *pdev,
203209
res.wol_irq = pdev->irq;
204210
res.irq = pdev->irq;
205211

212+
plat->safety_feat_cfg->tsoee = 1;
213+
plat->safety_feat_cfg->mrxpee = 1;
214+
plat->safety_feat_cfg->mestee = 1;
215+
plat->safety_feat_cfg->mrxee = 1;
216+
plat->safety_feat_cfg->mtxee = 1;
217+
plat->safety_feat_cfg->epsi = 1;
218+
plat->safety_feat_cfg->edpp = 1;
219+
plat->safety_feat_cfg->prtyen = 1;
220+
plat->safety_feat_cfg->tmouten = 1;
221+
206222
return stmmac_dvr_probe(&pdev->dev, plat, &res);
207223
}
208224

include/linux/stmmac.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,18 @@ struct stmmac_fpe_cfg {
172172
enum stmmac_fpe_state lo_fpe_state; /* Local station FPE state */
173173
};
174174

175+
struct stmmac_safety_feature_cfg {
176+
u32 tsoee;
177+
u32 mrxpee;
178+
u32 mestee;
179+
u32 mrxee;
180+
u32 mtxee;
181+
u32 epsi;
182+
u32 edpp;
183+
u32 prtyen;
184+
u32 tmouten;
185+
};
186+
175187
struct plat_stmmacenet_data {
176188
int bus_id;
177189
int phy_addr;
@@ -184,6 +196,7 @@ struct plat_stmmacenet_data {
184196
struct stmmac_dma_cfg *dma_cfg;
185197
struct stmmac_est *est;
186198
struct stmmac_fpe_cfg *fpe_cfg;
199+
struct stmmac_safety_feature_cfg *safety_feat_cfg;
187200
int clk_csr;
188201
int has_gmac;
189202
int enh_desc;

0 commit comments

Comments
 (0)