Message ID | 1556126241-2774-8-git-send-email-weifeng.voon@intel.com |
---|---|
State | Changes Requested |
Delegated to: | David Miller |
Headers | show |
Series | net: stmmac: enable EHL SGMII | expand |
> From: Ong Boon Leong <boon.leong.ong@intel.com> > > We introduce support for driver that has v5.10 IP and is also using xPCS as > MMD. This can be easily enabled for other product that integrates xPCS that > is not using v5.00 IP. > > Reviewed-by: Chuah Kim Tatt <kim.tatt.chuah@intel.com> > Reviewed-by: Voon Weifeng <weifeng.voon@intel.com> > Reviewed-by: Kweh Hock Leong <hock.leong.kweh@intel.com> > Reviewed-by: Baoli Zhang <baoli.zhang@intel.com> > Signed-off-by: Ong Boon Leong <boon.leong.ong@intel.com> > --- > drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c | 67 > +++++++++++++++++++++++ > drivers/net/ethernet/stmicro/stmmac/hwif.c | 31 ++++++++++- > drivers/net/ethernet/stmicro/stmmac/hwif.h | 1 + > 3 files changed, 98 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c > b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c > index 7e5d5db..f36aa67 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c > +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c > @@ -20,6 +20,7 @@ > #include <net/dsa.h> > #include "stmmac.h" > #include "stmmac_pcs.h" > +#include "dw_xpcs.h" > #include "dwmac4.h" > #include "dwmac5.h" > > @@ -505,6 +506,34 @@ static void dwmac4_get_adv_lp(void __iomem > *ioaddr, struct rgmii_adv *adv) > dwmac_get_adv_lp(ioaddr, GMAC_PCS_BASE, adv); } > > +static void dwmac_xpcs_init(struct net_device *ndev, int pcs_mode) { > + dw_xpcs_init(ndev, pcs_mode); > +} > + > +static void dwmac_xpcs_ctrl_ane(struct net_device *ndev, bool ane, > + bool loopback) > +{ > + dw_xpcs_ctrl_ane(ndev, ane, loopback); } > + > +static void dwmac_xpcs_rane(struct net_device *ndev, bool restart) { > + dw_xpcs_rane(ndev, restart); > +} > + > +static void dwmac_xpcs_get_adv_lp(struct net_device *ndev, > + struct rgmii_adv *adv) > +{ > + dw_xpcs_get_adv_lp(ndev, adv); > +} > + > +static int dwmac_xpcs_irq_status(struct net_device *ndev, > + struct stmmac_extra_stats *x) > +{ > + return dw_xpcs_irq_status(ndev, x); > +} > + > /* RGMII or SMII interface */ > static void dwmac4_phystatus(void __iomem *ioaddr, struct > stmmac_extra_stats *x) { @@ -799,6 +828,44 @@ static void > dwmac4_debug(void __iomem *ioaddr, struct stmmac_extra_stats *x, > .flex_pps_config = dwmac5_flex_pps_config, }; > > +const struct stmmac_ops dwmac510_xpcs_ops = { > + .core_init = dwmac4_core_init, > + .set_mac = stmmac_dwmac4_set_mac, > + .rx_ipc = dwmac4_rx_ipc_enable, > + .rx_queue_enable = dwmac4_rx_queue_enable, > + .rx_queue_prio = dwmac4_rx_queue_priority, > + .tx_queue_prio = dwmac4_tx_queue_priority, > + .rx_queue_routing = dwmac4_rx_queue_routing, > + .prog_mtl_rx_algorithms = dwmac4_prog_mtl_rx_algorithms, > + .prog_mtl_tx_algorithms = dwmac4_prog_mtl_tx_algorithms, > + .set_mtl_tx_queue_weight = dwmac4_set_mtl_tx_queue_weight, > + .map_mtl_to_dma = dwmac4_map_mtl_dma, > + .config_cbs = dwmac4_config_cbs, > + .dump_regs = dwmac4_dump_regs, > + .host_irq_status = dwmac4_irq_status, > + .host_mtl_irq_status = dwmac4_irq_mtl_status, > + .flow_ctrl = dwmac4_flow_ctrl, > + .pmt = dwmac4_pmt, > + .set_umac_addr = dwmac4_set_umac_addr, > + .get_umac_addr = dwmac4_get_umac_addr, > + .set_eee_mode = dwmac4_set_eee_mode, > + .reset_eee_mode = dwmac4_reset_eee_mode, > + .set_eee_timer = dwmac4_set_eee_timer, > + .set_eee_pls = dwmac4_set_eee_pls, > + .xpcs_init = dwmac_xpcs_init, > + .xpcs_ctrl_ane = dwmac_xpcs_ctrl_ane, > + .xpcs_rane = dwmac_xpcs_rane, > + .xpcs_get_adv_lp = dwmac_xpcs_get_adv_lp, > + .xpcs_irq_status = dwmac_xpcs_irq_status, > + .debug = dwmac4_debug, > + .set_filter = dwmac4_set_filter, > + .safety_feat_config = dwmac5_safety_feat_config, > + .safety_feat_irq_status = dwmac5_safety_feat_irq_status, > + .safety_feat_dump = dwmac5_safety_feat_dump, > + .rxp_config = dwmac5_rxp_config, > + .flex_pps_config = dwmac5_flex_pps_config, }; > + > int dwmac4_setup(struct stmmac_priv *priv) { > struct mac_device_info *mac = priv->hw; diff --git > a/drivers/net/ethernet/stmicro/stmmac/hwif.c > b/drivers/net/ethernet/stmicro/stmmac/hwif.c > index 81b966a..3725baa 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/hwif.c > +++ b/drivers/net/ethernet/stmicro/stmmac/hwif.c > @@ -73,6 +73,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv > *priv) > bool gmac; > bool gmac4; > bool xgmac; > + bool xpcs; > u32 min_id; > const struct stmmac_regs_off regs; > const void *desc; > @@ -89,6 +90,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv > *priv) > .gmac = false, > .gmac4 = false, > .xgmac = false, > + .xpcs = false, > .min_id = 0, > .regs = { > .ptp_off = PTP_GMAC3_X_OFFSET, > @@ -106,6 +108,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv > *priv) > .gmac = true, > .gmac4 = false, > .xgmac = false, > + .xpcs = false, > .min_id = 0, > .regs = { > .ptp_off = PTP_GMAC3_X_OFFSET, > @@ -123,6 +126,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv > *priv) > .gmac = false, > .gmac4 = true, > .xgmac = false, > + .xpcs = false, > .min_id = 0, > .regs = { > .ptp_off = PTP_GMAC4_OFFSET, > @@ -140,6 +144,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv > *priv) > .gmac = false, > .gmac4 = true, > .xgmac = false, > + .xpcs = false, > .min_id = DWMAC_CORE_4_00, > .regs = { > .ptp_off = PTP_GMAC4_OFFSET, > @@ -157,6 +162,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv > *priv) > .gmac = false, > .gmac4 = true, > .xgmac = false, > + .xpcs = false, > .min_id = DWMAC_CORE_4_10, > .regs = { > .ptp_off = PTP_GMAC4_OFFSET, > @@ -174,6 +180,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv > *priv) > .gmac = false, > .gmac4 = true, > .xgmac = false, > + .xpcs = false, > .min_id = DWMAC_CORE_5_10, > .regs = { > .ptp_off = PTP_GMAC4_OFFSET, > @@ -191,6 +198,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv > *priv) > .gmac = false, > .gmac4 = false, > .xgmac = true, > + .xpcs = false, > .min_id = DWXGMAC_CORE_2_10, > .regs = { > .ptp_off = PTP_XGMAC_OFFSET, > @@ -204,7 +212,25 @@ static int stmmac_dwmac4_quirks(struct > stmmac_priv *priv) > .tc = &dwmac510_tc_ops, > .setup = dwxgmac2_setup, > .quirks = NULL, > - }, > + }, { > + .gmac = false, > + .gmac4 = true, > + .xgmac = false, > + .xpcs = true, > + .min_id = DWMAC_CORE_5_10, > + .regs = { > + .ptp_off = PTP_GMAC4_OFFSET, > + .mmc_off = MMC_GMAC4_OFFSET, > + }, > + .desc = &dwmac4_desc_ops, > + .dma = &dwmac410_dma_ops, > + .mac = &dwmac510_xpcs_ops, > + .hwtimestamp = &stmmac_ptp, > + .mode = &dwmac4_ring_mode_ops, > + .tc = &dwmac510_tc_ops, > + .setup = dwmac4_setup, > + .quirks = NULL, > + } > }; > > int stmmac_hwif_init(struct stmmac_priv *priv) @@ -212,6 +238,7 @@ int > stmmac_hwif_init(struct stmmac_priv *priv) > bool needs_xgmac = priv->plat->has_xgmac; > bool needs_gmac4 = priv->plat->has_gmac4; > bool needs_gmac = priv->plat->has_gmac; > + bool needs_xpcs = priv->plat->has_xpcs; > const struct stmmac_hwif_entry *entry; > struct mac_device_info *mac; > bool needs_setup = true; > @@ -256,6 +283,8 @@ int stmmac_hwif_init(struct stmmac_priv *priv) > continue; > if (needs_xgmac ^ entry->xgmac) > continue; > + if (needs_xpcs ^ entry->xpcs) > + continue; > /* Use synopsys_id var because some setups can override > this */ > if (priv->synopsys_id < entry->min_id) > continue; > diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.h > b/drivers/net/ethernet/stmicro/stmmac/hwif.h > index cb7eb48..485be41 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/hwif.h > +++ b/drivers/net/ethernet/stmicro/stmmac/hwif.h > @@ -495,6 +495,7 @@ struct stmmac_regs_off { extern const struct > stmmac_ops dwmac410_ops; extern const struct stmmac_dma_ops > dwmac410_dma_ops; extern const struct stmmac_ops dwmac510_ops; > +extern const struct stmmac_ops dwmac510_xpcs_ops; > extern const struct stmmac_tc_ops dwmac510_tc_ops; extern const struct > stmmac_ops dwxgmac210_ops; extern const struct stmmac_dma_ops > dwxgmac210_dma_ops; > -- > 1.9.1 ++ stmmac maintainers and c45 experts
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c index 7e5d5db..f36aa67 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c @@ -20,6 +20,7 @@ #include <net/dsa.h> #include "stmmac.h" #include "stmmac_pcs.h" +#include "dw_xpcs.h" #include "dwmac4.h" #include "dwmac5.h" @@ -505,6 +506,34 @@ static void dwmac4_get_adv_lp(void __iomem *ioaddr, struct rgmii_adv *adv) dwmac_get_adv_lp(ioaddr, GMAC_PCS_BASE, adv); } +static void dwmac_xpcs_init(struct net_device *ndev, int pcs_mode) +{ + dw_xpcs_init(ndev, pcs_mode); +} + +static void dwmac_xpcs_ctrl_ane(struct net_device *ndev, bool ane, + bool loopback) +{ + dw_xpcs_ctrl_ane(ndev, ane, loopback); +} + +static void dwmac_xpcs_rane(struct net_device *ndev, bool restart) +{ + dw_xpcs_rane(ndev, restart); +} + +static void dwmac_xpcs_get_adv_lp(struct net_device *ndev, + struct rgmii_adv *adv) +{ + dw_xpcs_get_adv_lp(ndev, adv); +} + +static int dwmac_xpcs_irq_status(struct net_device *ndev, + struct stmmac_extra_stats *x) +{ + return dw_xpcs_irq_status(ndev, x); +} + /* RGMII or SMII interface */ static void dwmac4_phystatus(void __iomem *ioaddr, struct stmmac_extra_stats *x) { @@ -799,6 +828,44 @@ static void dwmac4_debug(void __iomem *ioaddr, struct stmmac_extra_stats *x, .flex_pps_config = dwmac5_flex_pps_config, }; +const struct stmmac_ops dwmac510_xpcs_ops = { + .core_init = dwmac4_core_init, + .set_mac = stmmac_dwmac4_set_mac, + .rx_ipc = dwmac4_rx_ipc_enable, + .rx_queue_enable = dwmac4_rx_queue_enable, + .rx_queue_prio = dwmac4_rx_queue_priority, + .tx_queue_prio = dwmac4_tx_queue_priority, + .rx_queue_routing = dwmac4_rx_queue_routing, + .prog_mtl_rx_algorithms = dwmac4_prog_mtl_rx_algorithms, + .prog_mtl_tx_algorithms = dwmac4_prog_mtl_tx_algorithms, + .set_mtl_tx_queue_weight = dwmac4_set_mtl_tx_queue_weight, + .map_mtl_to_dma = dwmac4_map_mtl_dma, + .config_cbs = dwmac4_config_cbs, + .dump_regs = dwmac4_dump_regs, + .host_irq_status = dwmac4_irq_status, + .host_mtl_irq_status = dwmac4_irq_mtl_status, + .flow_ctrl = dwmac4_flow_ctrl, + .pmt = dwmac4_pmt, + .set_umac_addr = dwmac4_set_umac_addr, + .get_umac_addr = dwmac4_get_umac_addr, + .set_eee_mode = dwmac4_set_eee_mode, + .reset_eee_mode = dwmac4_reset_eee_mode, + .set_eee_timer = dwmac4_set_eee_timer, + .set_eee_pls = dwmac4_set_eee_pls, + .xpcs_init = dwmac_xpcs_init, + .xpcs_ctrl_ane = dwmac_xpcs_ctrl_ane, + .xpcs_rane = dwmac_xpcs_rane, + .xpcs_get_adv_lp = dwmac_xpcs_get_adv_lp, + .xpcs_irq_status = dwmac_xpcs_irq_status, + .debug = dwmac4_debug, + .set_filter = dwmac4_set_filter, + .safety_feat_config = dwmac5_safety_feat_config, + .safety_feat_irq_status = dwmac5_safety_feat_irq_status, + .safety_feat_dump = dwmac5_safety_feat_dump, + .rxp_config = dwmac5_rxp_config, + .flex_pps_config = dwmac5_flex_pps_config, +}; + int dwmac4_setup(struct stmmac_priv *priv) { struct mac_device_info *mac = priv->hw; diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.c b/drivers/net/ethernet/stmicro/stmmac/hwif.c index 81b966a..3725baa 100644 --- a/drivers/net/ethernet/stmicro/stmmac/hwif.c +++ b/drivers/net/ethernet/stmicro/stmmac/hwif.c @@ -73,6 +73,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv *priv) bool gmac; bool gmac4; bool xgmac; + bool xpcs; u32 min_id; const struct stmmac_regs_off regs; const void *desc; @@ -89,6 +90,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv *priv) .gmac = false, .gmac4 = false, .xgmac = false, + .xpcs = false, .min_id = 0, .regs = { .ptp_off = PTP_GMAC3_X_OFFSET, @@ -106,6 +108,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv *priv) .gmac = true, .gmac4 = false, .xgmac = false, + .xpcs = false, .min_id = 0, .regs = { .ptp_off = PTP_GMAC3_X_OFFSET, @@ -123,6 +126,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv *priv) .gmac = false, .gmac4 = true, .xgmac = false, + .xpcs = false, .min_id = 0, .regs = { .ptp_off = PTP_GMAC4_OFFSET, @@ -140,6 +144,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv *priv) .gmac = false, .gmac4 = true, .xgmac = false, + .xpcs = false, .min_id = DWMAC_CORE_4_00, .regs = { .ptp_off = PTP_GMAC4_OFFSET, @@ -157,6 +162,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv *priv) .gmac = false, .gmac4 = true, .xgmac = false, + .xpcs = false, .min_id = DWMAC_CORE_4_10, .regs = { .ptp_off = PTP_GMAC4_OFFSET, @@ -174,6 +180,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv *priv) .gmac = false, .gmac4 = true, .xgmac = false, + .xpcs = false, .min_id = DWMAC_CORE_5_10, .regs = { .ptp_off = PTP_GMAC4_OFFSET, @@ -191,6 +198,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv *priv) .gmac = false, .gmac4 = false, .xgmac = true, + .xpcs = false, .min_id = DWXGMAC_CORE_2_10, .regs = { .ptp_off = PTP_XGMAC_OFFSET, @@ -204,7 +212,25 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv *priv) .tc = &dwmac510_tc_ops, .setup = dwxgmac2_setup, .quirks = NULL, - }, + }, { + .gmac = false, + .gmac4 = true, + .xgmac = false, + .xpcs = true, + .min_id = DWMAC_CORE_5_10, + .regs = { + .ptp_off = PTP_GMAC4_OFFSET, + .mmc_off = MMC_GMAC4_OFFSET, + }, + .desc = &dwmac4_desc_ops, + .dma = &dwmac410_dma_ops, + .mac = &dwmac510_xpcs_ops, + .hwtimestamp = &stmmac_ptp, + .mode = &dwmac4_ring_mode_ops, + .tc = &dwmac510_tc_ops, + .setup = dwmac4_setup, + .quirks = NULL, + } }; int stmmac_hwif_init(struct stmmac_priv *priv) @@ -212,6 +238,7 @@ int stmmac_hwif_init(struct stmmac_priv *priv) bool needs_xgmac = priv->plat->has_xgmac; bool needs_gmac4 = priv->plat->has_gmac4; bool needs_gmac = priv->plat->has_gmac; + bool needs_xpcs = priv->plat->has_xpcs; const struct stmmac_hwif_entry *entry; struct mac_device_info *mac; bool needs_setup = true; @@ -256,6 +283,8 @@ int stmmac_hwif_init(struct stmmac_priv *priv) continue; if (needs_xgmac ^ entry->xgmac) continue; + if (needs_xpcs ^ entry->xpcs) + continue; /* Use synopsys_id var because some setups can override this */ if (priv->synopsys_id < entry->min_id) continue; diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.h b/drivers/net/ethernet/stmicro/stmmac/hwif.h index cb7eb48..485be41 100644 --- a/drivers/net/ethernet/stmicro/stmmac/hwif.h +++ b/drivers/net/ethernet/stmicro/stmmac/hwif.h @@ -495,6 +495,7 @@ struct stmmac_regs_off { extern const struct stmmac_ops dwmac410_ops; extern const struct stmmac_dma_ops dwmac410_dma_ops; extern const struct stmmac_ops dwmac510_ops; +extern const struct stmmac_ops dwmac510_xpcs_ops; extern const struct stmmac_tc_ops dwmac510_tc_ops; extern const struct stmmac_ops dwxgmac210_ops; extern const struct stmmac_dma_ops dwxgmac210_dma_ops;