Commit 5ac712dc authored by Wong Vee Khee's avatar Wong Vee Khee Committed by David S. Miller

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: default avatarWong Vee Khee <vee.khee.wong@linux.intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e5432cc7
...@@ -568,6 +568,16 @@ static int ehl_common_data(struct pci_dev *pdev, ...@@ -568,6 +568,16 @@ static int ehl_common_data(struct pci_dev *pdev,
plat->tx_queues_to_use = 8; plat->tx_queues_to_use = 8;
plat->clk_ptp_rate = 200000000; plat->clk_ptp_rate = 200000000;
plat->safety_feat_cfg->tsoee = 1;
plat->safety_feat_cfg->mrxpee = 1;
plat->safety_feat_cfg->mestee = 1;
plat->safety_feat_cfg->mrxee = 1;
plat->safety_feat_cfg->mtxee = 1;
plat->safety_feat_cfg->epsi = 0;
plat->safety_feat_cfg->edpp = 0;
plat->safety_feat_cfg->prtyen = 0;
plat->safety_feat_cfg->tmouten = 0;
return intel_mgbe_common_data(pdev, plat); return intel_mgbe_common_data(pdev, plat);
} }
...@@ -683,6 +693,16 @@ static int tgl_common_data(struct pci_dev *pdev, ...@@ -683,6 +693,16 @@ static int tgl_common_data(struct pci_dev *pdev,
plat->tx_queues_to_use = 4; plat->tx_queues_to_use = 4;
plat->clk_ptp_rate = 200000000; plat->clk_ptp_rate = 200000000;
plat->safety_feat_cfg->tsoee = 1;
plat->safety_feat_cfg->mrxpee = 0;
plat->safety_feat_cfg->mestee = 1;
plat->safety_feat_cfg->mrxee = 1;
plat->safety_feat_cfg->mtxee = 1;
plat->safety_feat_cfg->epsi = 0;
plat->safety_feat_cfg->edpp = 0;
plat->safety_feat_cfg->prtyen = 0;
plat->safety_feat_cfg->tmouten = 0;
return intel_mgbe_common_data(pdev, plat); return intel_mgbe_common_data(pdev, plat);
} }
...@@ -959,6 +979,12 @@ static int intel_eth_pci_probe(struct pci_dev *pdev, ...@@ -959,6 +979,12 @@ static int intel_eth_pci_probe(struct pci_dev *pdev,
if (!plat->dma_cfg) if (!plat->dma_cfg)
return -ENOMEM; return -ENOMEM;
plat->safety_feat_cfg = devm_kzalloc(&pdev->dev,
sizeof(*plat->safety_feat_cfg),
GFP_KERNEL);
if (!plat->safety_feat_cfg)
return -ENOMEM;
/* Enable pci device */ /* Enable pci device */
ret = pcim_enable_device(pdev); ret = pcim_enable_device(pdev);
if (ret) { if (ret) {
......
...@@ -183,7 +183,8 @@ static void dwmac5_handle_dma_err(struct net_device *ndev, ...@@ -183,7 +183,8 @@ static void dwmac5_handle_dma_err(struct net_device *ndev,
STAT_OFF(dma_errors), stats); STAT_OFF(dma_errors), stats);
} }
int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp) int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp,
struct stmmac_safety_feature_cfg *safety_feat_cfg)
{ {
u32 value; u32 value;
...@@ -193,11 +194,16 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp) ...@@ -193,11 +194,16 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp)
/* 1. Enable Safety Features */ /* 1. Enable Safety Features */
value = readl(ioaddr + MTL_ECC_CONTROL); value = readl(ioaddr + MTL_ECC_CONTROL);
value |= MEEAO; /* MTL ECC Error Addr Status Override */ value |= MEEAO; /* MTL ECC Error Addr Status Override */
value |= TSOEE; /* TSO ECC */ if (safety_feat_cfg->tsoee)
value |= MRXPEE; /* MTL RX Parser ECC */ value |= TSOEE; /* TSO ECC */
value |= MESTEE; /* MTL EST ECC */ if (safety_feat_cfg->mrxpee)
value |= MRXEE; /* MTL RX FIFO ECC */ value |= MRXPEE; /* MTL RX Parser ECC */
value |= MTXEE; /* MTL TX FIFO ECC */ if (safety_feat_cfg->mestee)
value |= MESTEE; /* MTL EST ECC */
if (safety_feat_cfg->mrxee)
value |= MRXEE; /* MTL RX FIFO ECC */
if (safety_feat_cfg->mtxee)
value |= MTXEE; /* MTL TX FIFO ECC */
writel(value, ioaddr + MTL_ECC_CONTROL); writel(value, ioaddr + MTL_ECC_CONTROL);
/* 2. Enable MTL Safety Interrupts */ /* 2. Enable MTL Safety Interrupts */
...@@ -219,13 +225,16 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp) ...@@ -219,13 +225,16 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp)
/* 5. Enable Parity and Timeout for FSM */ /* 5. Enable Parity and Timeout for FSM */
value = readl(ioaddr + MAC_FSM_CONTROL); value = readl(ioaddr + MAC_FSM_CONTROL);
value |= PRTYEN; /* FSM Parity Feature */ if (safety_feat_cfg->prtyen)
value |= TMOUTEN; /* FSM Timeout Feature */ value |= PRTYEN; /* FSM Parity Feature */
if (safety_feat_cfg->tmouten)
value |= TMOUTEN; /* FSM Timeout Feature */
writel(value, ioaddr + MAC_FSM_CONTROL); writel(value, ioaddr + MAC_FSM_CONTROL);
/* 4. Enable Data Parity Protection */ /* 4. Enable Data Parity Protection */
value = readl(ioaddr + MTL_DPP_CONTROL); value = readl(ioaddr + MTL_DPP_CONTROL);
value |= EDPP; if (safety_feat_cfg->edpp)
value |= EDPP;
writel(value, ioaddr + MTL_DPP_CONTROL); writel(value, ioaddr + MTL_DPP_CONTROL);
/* /*
...@@ -235,7 +244,8 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp) ...@@ -235,7 +244,8 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp)
if (asp <= 0x2) if (asp <= 0x2)
return 0; return 0;
value |= EPSI; if (safety_feat_cfg->epsi)
value |= EPSI;
writel(value, ioaddr + MTL_DPP_CONTROL); writel(value, ioaddr + MTL_DPP_CONTROL);
return 0; return 0;
} }
......
...@@ -137,7 +137,8 @@ ...@@ -137,7 +137,8 @@
#define GMAC_INT_FPE_EN BIT(17) #define GMAC_INT_FPE_EN BIT(17)
int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp); int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp,
struct stmmac_safety_feature_cfg *safety_cfg);
int dwmac5_safety_feat_irq_status(struct net_device *ndev, int dwmac5_safety_feat_irq_status(struct net_device *ndev,
void __iomem *ioaddr, unsigned int asp, void __iomem *ioaddr, unsigned int asp,
struct stmmac_safety_stats *stats); struct stmmac_safety_stats *stats);
......
...@@ -801,7 +801,9 @@ static void dwxgmac3_handle_dma_err(struct net_device *ndev, ...@@ -801,7 +801,9 @@ static void dwxgmac3_handle_dma_err(struct net_device *ndev,
dwxgmac3_dma_errors, STAT_OFF(dma_errors), stats); dwxgmac3_dma_errors, STAT_OFF(dma_errors), stats);
} }
static int dwxgmac3_safety_feat_config(void __iomem *ioaddr, unsigned int asp) static int
dwxgmac3_safety_feat_config(void __iomem *ioaddr, unsigned int asp,
struct stmmac_safety_feature_cfg *safety_cfg)
{ {
u32 value; u32 value;
......
...@@ -348,7 +348,8 @@ struct stmmac_ops { ...@@ -348,7 +348,8 @@ struct stmmac_ops {
void (*pcs_rane)(void __iomem *ioaddr, bool restart); void (*pcs_rane)(void __iomem *ioaddr, bool restart);
void (*pcs_get_adv_lp)(void __iomem *ioaddr, struct rgmii_adv *adv); void (*pcs_get_adv_lp)(void __iomem *ioaddr, struct rgmii_adv *adv);
/* Safety Features */ /* Safety Features */
int (*safety_feat_config)(void __iomem *ioaddr, unsigned int asp); int (*safety_feat_config)(void __iomem *ioaddr, unsigned int asp,
struct stmmac_safety_feature_cfg *safety_cfg);
int (*safety_feat_irq_status)(struct net_device *ndev, int (*safety_feat_irq_status)(struct net_device *ndev,
void __iomem *ioaddr, unsigned int asp, void __iomem *ioaddr, unsigned int asp,
struct stmmac_safety_stats *stats); struct stmmac_safety_stats *stats);
......
...@@ -3172,7 +3172,8 @@ static void stmmac_safety_feat_configuration(struct stmmac_priv *priv) ...@@ -3172,7 +3172,8 @@ static void stmmac_safety_feat_configuration(struct stmmac_priv *priv)
{ {
if (priv->dma_cap.asp) { if (priv->dma_cap.asp) {
netdev_info(priv->dev, "Enabling Safety Features\n"); netdev_info(priv->dev, "Enabling Safety Features\n");
stmmac_safety_feat_config(priv, priv->ioaddr, priv->dma_cap.asp); stmmac_safety_feat_config(priv, priv->ioaddr, priv->dma_cap.asp,
priv->plat->safety_feat_cfg);
} else { } else {
netdev_info(priv->dev, "No Safety Features support found\n"); netdev_info(priv->dev, "No Safety Features support found\n");
} }
......
...@@ -174,6 +174,12 @@ static int stmmac_pci_probe(struct pci_dev *pdev, ...@@ -174,6 +174,12 @@ static int stmmac_pci_probe(struct pci_dev *pdev,
if (!plat->dma_cfg) if (!plat->dma_cfg)
return -ENOMEM; return -ENOMEM;
plat->safety_feat_cfg = devm_kzalloc(&pdev->dev,
sizeof(*plat->safety_feat_cfg),
GFP_KERNEL);
if (!plat->safety_feat_cfg)
return -ENOMEM;
/* Enable pci device */ /* Enable pci device */
ret = pci_enable_device(pdev); ret = pci_enable_device(pdev);
if (ret) { if (ret) {
...@@ -203,6 +209,16 @@ static int stmmac_pci_probe(struct pci_dev *pdev, ...@@ -203,6 +209,16 @@ static int stmmac_pci_probe(struct pci_dev *pdev,
res.wol_irq = pdev->irq; res.wol_irq = pdev->irq;
res.irq = pdev->irq; res.irq = pdev->irq;
plat->safety_feat_cfg->tsoee = 1;
plat->safety_feat_cfg->mrxpee = 1;
plat->safety_feat_cfg->mestee = 1;
plat->safety_feat_cfg->mrxee = 1;
plat->safety_feat_cfg->mtxee = 1;
plat->safety_feat_cfg->epsi = 1;
plat->safety_feat_cfg->edpp = 1;
plat->safety_feat_cfg->prtyen = 1;
plat->safety_feat_cfg->tmouten = 1;
return stmmac_dvr_probe(&pdev->dev, plat, &res); return stmmac_dvr_probe(&pdev->dev, plat, &res);
} }
......
...@@ -172,6 +172,18 @@ struct stmmac_fpe_cfg { ...@@ -172,6 +172,18 @@ struct stmmac_fpe_cfg {
enum stmmac_fpe_state lo_fpe_state; /* Local station FPE state */ enum stmmac_fpe_state lo_fpe_state; /* Local station FPE state */
}; };
struct stmmac_safety_feature_cfg {
u32 tsoee;
u32 mrxpee;
u32 mestee;
u32 mrxee;
u32 mtxee;
u32 epsi;
u32 edpp;
u32 prtyen;
u32 tmouten;
};
struct plat_stmmacenet_data { struct plat_stmmacenet_data {
int bus_id; int bus_id;
int phy_addr; int phy_addr;
...@@ -184,6 +196,7 @@ struct plat_stmmacenet_data { ...@@ -184,6 +196,7 @@ struct plat_stmmacenet_data {
struct stmmac_dma_cfg *dma_cfg; struct stmmac_dma_cfg *dma_cfg;
struct stmmac_est *est; struct stmmac_est *est;
struct stmmac_fpe_cfg *fpe_cfg; struct stmmac_fpe_cfg *fpe_cfg;
struct stmmac_safety_feature_cfg *safety_feat_cfg;
int clk_csr; int clk_csr;
int has_gmac; int has_gmac;
int enh_desc; int enh_desc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment