OSDN Git Service

net: stmmac: Switch stmmac_ops to generic HW Interface Helpers
authorJose Abreu <Jose.Abreu@synopsys.com>
Mon, 16 Apr 2018 15:08:14 +0000 (16:08 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 16 Apr 2018 22:49:47 +0000 (18:49 -0400)
Switch stmmac_ops to generic Hardware Interface Helpers instead of using
hard-coded callbacks. This makes the code more readable and more
flexible.

No functional change.

Signed-off-by: Jose Abreu <joabreu@synopsys.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Joao Pinto <jpinto@synopsys.com>
Cc: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Cc: Alexandre Torgue <alexandre.torgue@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/common.h
drivers/net/ethernet/stmicro/stmmac/dwmac5.c
drivers/net/ethernet/stmicro/stmmac/dwmac5.h
drivers/net/ethernet/stmicro/stmmac/hwif.h
drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

index b27221b..0e0b6f1 100644 (file)
@@ -383,76 +383,6 @@ extern const struct stmmac_desc_ops ndesc_ops;
 
 struct mac_device_info;
 
-/* Helpers to program the MAC core */
-struct stmmac_ops {
-       /* MAC core initialization */
-       void (*core_init)(struct mac_device_info *hw, struct net_device *dev);
-       /* Enable the MAC RX/TX */
-       void (*set_mac)(void __iomem *ioaddr, bool enable);
-       /* Enable and verify that the IPC module is supported */
-       int (*rx_ipc)(struct mac_device_info *hw);
-       /* Enable RX Queues */
-       void (*rx_queue_enable)(struct mac_device_info *hw, u8 mode, u32 queue);
-       /* RX Queues Priority */
-       void (*rx_queue_prio)(struct mac_device_info *hw, u32 prio, u32 queue);
-       /* TX Queues Priority */
-       void (*tx_queue_prio)(struct mac_device_info *hw, u32 prio, u32 queue);
-       /* RX Queues Routing */
-       void (*rx_queue_routing)(struct mac_device_info *hw, u8 packet,
-                                u32 queue);
-       /* Program RX Algorithms */
-       void (*prog_mtl_rx_algorithms)(struct mac_device_info *hw, u32 rx_alg);
-       /* Program TX Algorithms */
-       void (*prog_mtl_tx_algorithms)(struct mac_device_info *hw, u32 tx_alg);
-       /* Set MTL TX queues weight */
-       void (*set_mtl_tx_queue_weight)(struct mac_device_info *hw,
-                                       u32 weight, u32 queue);
-       /* RX MTL queue to RX dma mapping */
-       void (*map_mtl_to_dma)(struct mac_device_info *hw, u32 queue, u32 chan);
-       /* Configure AV Algorithm */
-       void (*config_cbs)(struct mac_device_info *hw, u32 send_slope,
-                          u32 idle_slope, u32 high_credit, u32 low_credit,
-                          u32 queue);
-       /* Dump MAC registers */
-       void (*dump_regs)(struct mac_device_info *hw, u32 *reg_space);
-       /* Handle extra events on specific interrupts hw dependent */
-       int (*host_irq_status)(struct mac_device_info *hw,
-                              struct stmmac_extra_stats *x);
-       /* Handle MTL interrupts */
-       int (*host_mtl_irq_status)(struct mac_device_info *hw, u32 chan);
-       /* Multicast filter setting */
-       void (*set_filter)(struct mac_device_info *hw, struct net_device *dev);
-       /* Flow control setting */
-       void (*flow_ctrl)(struct mac_device_info *hw, unsigned int duplex,
-                         unsigned int fc, unsigned int pause_time, u32 tx_cnt);
-       /* Set power management mode (e.g. magic frame) */
-       void (*pmt)(struct mac_device_info *hw, unsigned long mode);
-       /* Set/Get Unicast MAC addresses */
-       void (*set_umac_addr)(struct mac_device_info *hw, unsigned char *addr,
-                             unsigned int reg_n);
-       void (*get_umac_addr)(struct mac_device_info *hw, unsigned char *addr,
-                             unsigned int reg_n);
-       void (*set_eee_mode)(struct mac_device_info *hw,
-                            bool en_tx_lpi_clockgating);
-       void (*reset_eee_mode)(struct mac_device_info *hw);
-       void (*set_eee_timer)(struct mac_device_info *hw, int ls, int tw);
-       void (*set_eee_pls)(struct mac_device_info *hw, int link);
-       void (*debug)(void __iomem *ioaddr, struct stmmac_extra_stats *x,
-                     u32 rx_queues, u32 tx_queues);
-       /* PCS calls */
-       void (*pcs_ctrl_ane)(void __iomem *ioaddr, bool ane, bool srgmi_ral,
-                            bool loopback);
-       void (*pcs_rane)(void __iomem *ioaddr, bool restart);
-       void (*pcs_get_adv_lp)(void __iomem *ioaddr, struct rgmii_adv *adv);
-       /* Safety Features */
-       int (*safety_feat_config)(void __iomem *ioaddr, unsigned int asp);
-       bool (*safety_feat_irq_status)(struct net_device *ndev,
-                       void __iomem *ioaddr, unsigned int asp,
-                       struct stmmac_safety_stats *stats);
-       const char *(*safety_feat_dump)(struct stmmac_safety_stats *stats,
-                       int index, unsigned long *count);
-};
-
 /* PTP and HW Timer helpers */
 struct stmmac_hwtimestamp {
        void (*config_hw_tstamping) (void __iomem *ioaddr, u32 data);
index 860de39..2978550 100644 (file)
@@ -237,15 +237,16 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp)
        return 0;
 }
 
-bool 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,
                struct stmmac_safety_stats *stats)
 {
-       bool ret = false, err, corr;
+       bool err, corr;
        u32 mtl, dma;
+       int ret = 0;
 
        if (!asp)
-               return false;
+               return -EINVAL;
 
        mtl = readl(ioaddr + MTL_SAFETY_INT_STATUS);
        dma = readl(ioaddr + DMA_SAFETY_INT_STATUS);
@@ -282,17 +283,19 @@ static const struct dwmac5_error {
        { dwmac5_dma_errors },
 };
 
-const char *dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats,
-                       int index, unsigned long *count)
+int dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats,
+                       int index, unsigned long *count, const char **desc)
 {
        int module = index / 32, offset = index % 32;
        unsigned long *ptr = (unsigned long *)stats;
 
        if (module >= ARRAY_SIZE(dwmac5_all_errors))
-               return NULL;
+               return -EINVAL;
        if (!dwmac5_all_errors[module].desc[offset].valid)
-               return NULL;
+               return -EINVAL;
        if (count)
                *count = *(ptr + index);
-       return dwmac5_all_errors[module].desc[offset].desc;
+       if (desc)
+               *desc = dwmac5_all_errors[module].desc[offset].desc;
+       return 0;
 }
index a0d2c44..bd4c466 100644 (file)
 #define DMA_ECC_INT_STATUS             0x00001088
 
 int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp);
-bool 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,
                struct stmmac_safety_stats *stats);
-const char *dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats,
-                       int index, unsigned long *count);
+int dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats,
+                       int index, unsigned long *count, const char **desc);
 
 #endif /* __DWMAC5_H__ */
index e1a9ae6..9575135 100644 (file)
@@ -228,4 +228,142 @@ struct stmmac_dma_ops {
 #define stmmac_enable_tso(__priv, __args...) \
        stmmac_do_void_callback(__priv, dma, enable_tso, __args)
 
+struct mac_device_info;
+struct net_device;
+struct rgmii_adv;
+struct stmmac_safety_stats;
+
+/* Helpers to program the MAC core */
+struct stmmac_ops {
+       /* MAC core initialization */
+       void (*core_init)(struct mac_device_info *hw, struct net_device *dev);
+       /* Enable the MAC RX/TX */
+       void (*set_mac)(void __iomem *ioaddr, bool enable);
+       /* Enable and verify that the IPC module is supported */
+       int (*rx_ipc)(struct mac_device_info *hw);
+       /* Enable RX Queues */
+       void (*rx_queue_enable)(struct mac_device_info *hw, u8 mode, u32 queue);
+       /* RX Queues Priority */
+       void (*rx_queue_prio)(struct mac_device_info *hw, u32 prio, u32 queue);
+       /* TX Queues Priority */
+       void (*tx_queue_prio)(struct mac_device_info *hw, u32 prio, u32 queue);
+       /* RX Queues Routing */
+       void (*rx_queue_routing)(struct mac_device_info *hw, u8 packet,
+                                u32 queue);
+       /* Program RX Algorithms */
+       void (*prog_mtl_rx_algorithms)(struct mac_device_info *hw, u32 rx_alg);
+       /* Program TX Algorithms */
+       void (*prog_mtl_tx_algorithms)(struct mac_device_info *hw, u32 tx_alg);
+       /* Set MTL TX queues weight */
+       void (*set_mtl_tx_queue_weight)(struct mac_device_info *hw,
+                                       u32 weight, u32 queue);
+       /* RX MTL queue to RX dma mapping */
+       void (*map_mtl_to_dma)(struct mac_device_info *hw, u32 queue, u32 chan);
+       /* Configure AV Algorithm */
+       void (*config_cbs)(struct mac_device_info *hw, u32 send_slope,
+                          u32 idle_slope, u32 high_credit, u32 low_credit,
+                          u32 queue);
+       /* Dump MAC registers */
+       void (*dump_regs)(struct mac_device_info *hw, u32 *reg_space);
+       /* Handle extra events on specific interrupts hw dependent */
+       int (*host_irq_status)(struct mac_device_info *hw,
+                              struct stmmac_extra_stats *x);
+       /* Handle MTL interrupts */
+       int (*host_mtl_irq_status)(struct mac_device_info *hw, u32 chan);
+       /* Multicast filter setting */
+       void (*set_filter)(struct mac_device_info *hw, struct net_device *dev);
+       /* Flow control setting */
+       void (*flow_ctrl)(struct mac_device_info *hw, unsigned int duplex,
+                         unsigned int fc, unsigned int pause_time, u32 tx_cnt);
+       /* Set power management mode (e.g. magic frame) */
+       void (*pmt)(struct mac_device_info *hw, unsigned long mode);
+       /* Set/Get Unicast MAC addresses */
+       void (*set_umac_addr)(struct mac_device_info *hw, unsigned char *addr,
+                             unsigned int reg_n);
+       void (*get_umac_addr)(struct mac_device_info *hw, unsigned char *addr,
+                             unsigned int reg_n);
+       void (*set_eee_mode)(struct mac_device_info *hw,
+                            bool en_tx_lpi_clockgating);
+       void (*reset_eee_mode)(struct mac_device_info *hw);
+       void (*set_eee_timer)(struct mac_device_info *hw, int ls, int tw);
+       void (*set_eee_pls)(struct mac_device_info *hw, int link);
+       void (*debug)(void __iomem *ioaddr, struct stmmac_extra_stats *x,
+                     u32 rx_queues, u32 tx_queues);
+       /* PCS calls */
+       void (*pcs_ctrl_ane)(void __iomem *ioaddr, bool ane, bool srgmi_ral,
+                            bool loopback);
+       void (*pcs_rane)(void __iomem *ioaddr, bool restart);
+       void (*pcs_get_adv_lp)(void __iomem *ioaddr, struct rgmii_adv *adv);
+       /* Safety Features */
+       int (*safety_feat_config)(void __iomem *ioaddr, unsigned int asp);
+       int (*safety_feat_irq_status)(struct net_device *ndev,
+                       void __iomem *ioaddr, unsigned int asp,
+                       struct stmmac_safety_stats *stats);
+       int (*safety_feat_dump)(struct stmmac_safety_stats *stats,
+                       int index, unsigned long *count, const char **desc);
+};
+
+#define stmmac_core_init(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, core_init, __args)
+#define stmmac_mac_set(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, set_mac, __args)
+#define stmmac_rx_ipc(__priv, __args...) \
+       stmmac_do_callback(__priv, mac, rx_ipc, __args)
+#define stmmac_rx_queue_enable(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, rx_queue_enable, __args)
+#define stmmac_rx_queue_prio(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, rx_queue_prio, __args)
+#define stmmac_tx_queue_prio(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, tx_queue_prio, __args)
+#define stmmac_rx_queue_routing(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, rx_queue_routing, __args)
+#define stmmac_prog_mtl_rx_algorithms(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, prog_mtl_rx_algorithms, __args)
+#define stmmac_prog_mtl_tx_algorithms(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, prog_mtl_tx_algorithms, __args)
+#define stmmac_set_mtl_tx_queue_weight(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, set_mtl_tx_queue_weight, __args)
+#define stmmac_map_mtl_to_dma(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, map_mtl_to_dma, __args)
+#define stmmac_config_cbs(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, config_cbs, __args)
+#define stmmac_dump_mac_regs(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, dump_regs, __args)
+#define stmmac_host_irq_status(__priv, __args...) \
+       stmmac_do_callback(__priv, mac, host_irq_status, __args)
+#define stmmac_host_mtl_irq_status(__priv, __args...) \
+       stmmac_do_callback(__priv, mac, host_mtl_irq_status, __args)
+#define stmmac_set_filter(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, set_filter, __args)
+#define stmmac_flow_ctrl(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, flow_ctrl, __args)
+#define stmmac_pmt(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, pmt, __args)
+#define stmmac_set_umac_addr(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, set_umac_addr, __args)
+#define stmmac_get_umac_addr(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, get_umac_addr, __args)
+#define stmmac_set_eee_mode(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, set_eee_mode, __args)
+#define stmmac_reset_eee_mode(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, reset_eee_mode, __args)
+#define stmmac_set_eee_timer(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, set_eee_timer, __args)
+#define stmmac_set_eee_pls(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, set_eee_pls, __args)
+#define stmmac_mac_debug(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, debug, __args)
+#define stmmac_pcs_ctrl_ane(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, pcs_ctrl_ane, __args)
+#define stmmac_pcs_rane(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, pcs_rane, __args)
+#define stmmac_pcs_get_adv_lp(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, pcs_get_adv_lp, __args)
+#define stmmac_safety_feat_config(__priv, __args...) \
+       stmmac_do_callback(__priv, mac, safety_feat_config, __args)
+#define stmmac_safety_feat_irq_status(__priv, __args...) \
+       stmmac_do_callback(__priv, mac, safety_feat_irq_status, __args)
+#define stmmac_safety_feat_dump(__priv, __args...) \
+       stmmac_do_callback(__priv, mac, safety_feat_dump, __args)
+
 #endif /* __STMMAC_HWIF_H__ */
index 7009718..6d82b3e 100644 (file)
@@ -291,11 +291,9 @@ static int stmmac_ethtool_get_link_ksettings(struct net_device *dev,
                cmd->base.speed = priv->xstats.pcs_speed;
 
                /* Get and convert ADV/LP_ADV from the HW AN registers */
-               if (!priv->hw->mac->pcs_get_adv_lp)
+               if (stmmac_pcs_get_adv_lp(priv, priv->ioaddr, &adv))
                        return -EOPNOTSUPP;     /* should never happen indeed */
 
-               priv->hw->mac->pcs_get_adv_lp(priv->ioaddr, &adv);
-
                /* Encoding of PSE bits is defined in 802.3z, 37.2.1.4 */
 
                ethtool_convert_link_mode_to_legacy_u32(
@@ -393,11 +391,7 @@ stmmac_ethtool_set_link_ksettings(struct net_device *dev,
                        ADVERTISED_10baseT_Full);
 
                spin_lock(&priv->lock);
-
-               if (priv->hw->mac->pcs_ctrl_ane)
-                       priv->hw->mac->pcs_ctrl_ane(priv->ioaddr, 1,
-                                                   priv->hw->ps, 0);
-
+               stmmac_pcs_ctrl_ane(priv, priv->ioaddr, 1, priv->hw->ps, 0);
                spin_unlock(&priv->lock);
 
                return 0;
@@ -442,7 +436,7 @@ static void stmmac_ethtool_gregs(struct net_device *dev,
 
        memset(reg_space, 0x0, REG_SPACE_SIZE);
 
-       priv->hw->mac->dump_regs(priv->hw, reg_space);
+       stmmac_dump_mac_regs(priv, priv->hw, reg_space);
        stmmac_dump_dma_regs(priv, priv->ioaddr, reg_space);
        /* Copy DMA registers to where ethtool expects them */
        memcpy(&reg_space[ETHTOOL_DMA_OFFSET], &reg_space[DMA_BUS_MODE / 4],
@@ -454,15 +448,13 @@ stmmac_get_pauseparam(struct net_device *netdev,
                      struct ethtool_pauseparam *pause)
 {
        struct stmmac_priv *priv = netdev_priv(netdev);
+       struct rgmii_adv adv_lp;
 
        pause->rx_pause = 0;
        pause->tx_pause = 0;
 
-       if (priv->hw->pcs && priv->hw->mac->pcs_get_adv_lp) {
-               struct rgmii_adv adv_lp;
-
+       if (priv->hw->pcs && !stmmac_pcs_get_adv_lp(priv, priv->ioaddr, &adv_lp)) {
                pause->autoneg = 1;
-               priv->hw->mac->pcs_get_adv_lp(priv->ioaddr, &adv_lp);
                if (!adv_lp.pause)
                        return;
        } else {
@@ -488,12 +480,10 @@ stmmac_set_pauseparam(struct net_device *netdev,
        u32 tx_cnt = priv->plat->tx_queues_to_use;
        struct phy_device *phy = netdev->phydev;
        int new_pause = FLOW_OFF;
+       struct rgmii_adv adv_lp;
 
-       if (priv->hw->pcs && priv->hw->mac->pcs_get_adv_lp) {
-               struct rgmii_adv adv_lp;
-
+       if (priv->hw->pcs && !stmmac_pcs_get_adv_lp(priv, priv->ioaddr, &adv_lp)) {
                pause->autoneg = 1;
-               priv->hw->mac->pcs_get_adv_lp(priv->ioaddr, &adv_lp);
                if (!adv_lp.pause)
                        return -EOPNOTSUPP;
        } else {
@@ -515,27 +505,24 @@ stmmac_set_pauseparam(struct net_device *netdev,
                        return phy_start_aneg(phy);
        }
 
-       priv->hw->mac->flow_ctrl(priv->hw, phy->duplex, priv->flow_ctrl,
-                                priv->pause, tx_cnt);
+       stmmac_flow_ctrl(priv, priv->hw, phy->duplex, priv->flow_ctrl,
+                       priv->pause, tx_cnt);
        return 0;
 }
 
 static void stmmac_get_ethtool_stats(struct net_device *dev,
                                 struct ethtool_stats *dummy, u64 *data)
 {
-       const char *(*dump)(struct stmmac_safety_stats *stats, int index,
-                       unsigned long *count);
        struct stmmac_priv *priv = netdev_priv(dev);
        u32 rx_queues_count = priv->plat->rx_queues_to_use;
        u32 tx_queues_count = priv->plat->tx_queues_to_use;
        unsigned long count;
        int i, j = 0, ret;
 
-       if (priv->dma_cap.asp && priv->hw->mac->safety_feat_dump) {
-               dump = priv->hw->mac->safety_feat_dump;
-
+       if (priv->dma_cap.asp) {
                for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) {
-                       if (dump(&priv->sstats, i, &count))
+                       if (!stmmac_safety_feat_dump(priv, &priv->sstats, i,
+                                               &count, NULL))
                                data[j++] = count;
                }
        }
@@ -563,11 +550,10 @@ static void stmmac_get_ethtool_stats(struct net_device *dev,
                                priv->xstats.phy_eee_wakeup_error_n = val;
                }
 
-               if ((priv->hw->mac->debug) &&
-                   (priv->synopsys_id >= DWMAC_CORE_3_50))
-                       priv->hw->mac->debug(priv->ioaddr,
-                                            (void *)&priv->xstats,
-                                            rx_queues_count, tx_queues_count);
+               if (priv->synopsys_id >= DWMAC_CORE_3_50)
+                       stmmac_mac_debug(priv, priv->ioaddr,
+                                       (void *)&priv->xstats,
+                                       rx_queues_count, tx_queues_count);
        }
        for (i = 0; i < STMMAC_STATS_LEN; i++) {
                char *p = (char *)priv + stmmac_gstrings_stats[i].stat_offset;
@@ -579,8 +565,6 @@ static void stmmac_get_ethtool_stats(struct net_device *dev,
 static int stmmac_get_sset_count(struct net_device *netdev, int sset)
 {
        struct stmmac_priv *priv = netdev_priv(netdev);
-       const char *(*dump)(struct stmmac_safety_stats *stats, int index,
-                       unsigned long *count);
        int i, len, safety_len = 0;
 
        switch (sset) {
@@ -589,11 +573,11 @@ static int stmmac_get_sset_count(struct net_device *netdev, int sset)
 
                if (priv->dma_cap.rmon)
                        len += STMMAC_MMC_STATS_LEN;
-               if (priv->dma_cap.asp && priv->hw->mac->safety_feat_dump) {
-                       dump = priv->hw->mac->safety_feat_dump;
-
+               if (priv->dma_cap.asp) {
                        for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) {
-                               if (dump(&priv->sstats, i, NULL))
+                               if (!stmmac_safety_feat_dump(priv,
+                                                       &priv->sstats, i,
+                                                       NULL, NULL))
                                        safety_len++;
                        }
 
@@ -611,17 +595,15 @@ static void stmmac_get_strings(struct net_device *dev, u32 stringset, u8 *data)
        int i;
        u8 *p = data;
        struct stmmac_priv *priv = netdev_priv(dev);
-       const char *(*dump)(struct stmmac_safety_stats *stats, int index,
-                       unsigned long *count);
 
        switch (stringset) {
        case ETH_SS_STATS:
-               if (priv->dma_cap.asp && priv->hw->mac->safety_feat_dump) {
-                       dump = priv->hw->mac->safety_feat_dump;
+               if (priv->dma_cap.asp) {
                        for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) {
-                               const char *desc = dump(&priv->sstats, i, NULL);
-
-                               if (desc) {
+                               const char *desc;
+                               if (!stmmac_safety_feat_dump(priv,
+                                                       &priv->sstats, i,
+                                                       NULL, &desc)) {
                                        memcpy(p, desc, ETH_GSTRING_LEN);
                                        p += ETH_GSTRING_LEN;
                                }
index 7f2aeae..2b52103 100644 (file)
@@ -336,8 +336,8 @@ static void stmmac_enable_eee_mode(struct stmmac_priv *priv)
 
        /* Check and enter in LPI mode */
        if (!priv->tx_path_in_lpi_mode)
-               priv->hw->mac->set_eee_mode(priv->hw,
-                                           priv->plat->en_tx_lpi_clockgating);
+               stmmac_set_eee_mode(priv, priv->hw,
+                               priv->plat->en_tx_lpi_clockgating);
 }
 
 /**
@@ -348,7 +348,7 @@ static void stmmac_enable_eee_mode(struct stmmac_priv *priv)
  */
 void stmmac_disable_eee_mode(struct stmmac_priv *priv)
 {
-       priv->hw->mac->reset_eee_mode(priv->hw);
+       stmmac_reset_eee_mode(priv, priv->hw);
        del_timer_sync(&priv->eee_ctrl_timer);
        priv->tx_path_in_lpi_mode = false;
 }
@@ -411,8 +411,8 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
                        if (priv->eee_active) {
                                netdev_dbg(priv->dev, "disable EEE\n");
                                del_timer_sync(&priv->eee_ctrl_timer);
-                               priv->hw->mac->set_eee_timer(priv->hw, 0,
-                                                            tx_lpi_timer);
+                               stmmac_set_eee_timer(priv, priv->hw, 0,
+                                               tx_lpi_timer);
                        }
                        priv->eee_active = 0;
                        spin_unlock_irqrestore(&priv->lock, flags);
@@ -427,12 +427,11 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
                        mod_timer(&priv->eee_ctrl_timer,
                                  STMMAC_LPI_T(eee_timer));
 
-                       priv->hw->mac->set_eee_timer(priv->hw,
-                                                    STMMAC_DEFAULT_LIT_LS,
-                                                    tx_lpi_timer);
+                       stmmac_set_eee_timer(priv, priv->hw,
+                                       STMMAC_DEFAULT_LIT_LS, tx_lpi_timer);
                }
                /* Set HW EEE according to the speed */
-               priv->hw->mac->set_eee_pls(priv->hw, ndev->phydev->link);
+               stmmac_set_eee_pls(priv, priv->hw, ndev->phydev->link);
 
                ret = true;
                spin_unlock_irqrestore(&priv->lock, flags);
@@ -796,8 +795,8 @@ static void stmmac_mac_flow_ctrl(struct stmmac_priv *priv, u32 duplex)
 {
        u32 tx_cnt = priv->plat->tx_queues_to_use;
 
-       priv->hw->mac->flow_ctrl(priv->hw, duplex, priv->flow_ctrl,
-                                priv->pause, tx_cnt);
+       stmmac_flow_ctrl(priv, priv->hw, duplex, priv->flow_ctrl,
+                       priv->pause, tx_cnt);
 }
 
 /**
@@ -1663,7 +1662,7 @@ static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv)
 
        for (queue = 0; queue < rx_queues_count; queue++) {
                mode = priv->plat->rx_queues_cfg[queue].mode_to_use;
-               priv->hw->mac->rx_queue_enable(priv->hw, mode, queue);
+               stmmac_rx_queue_enable(priv, priv->hw, mode, queue);
        }
 }
 
@@ -2000,18 +1999,19 @@ static void stmmac_set_dma_operation_mode(struct stmmac_priv *priv, u32 txmode,
 
 static bool stmmac_safety_feat_interrupt(struct stmmac_priv *priv)
 {
-       bool ret = false;
+       int ret = false;
 
        /* Safety features are only available in cores >= 5.10 */
        if (priv->synopsys_id < DWMAC_CORE_5_10)
                return ret;
-       if (priv->hw->mac->safety_feat_irq_status)
-               ret = priv->hw->mac->safety_feat_irq_status(priv->dev,
-                               priv->ioaddr, priv->dma_cap.asp, &priv->sstats);
-
-       if (ret)
+       ret = stmmac_safety_feat_irq_status(priv, priv->dev,
+                       priv->ioaddr, priv->dma_cap.asp, &priv->sstats);
+       if (ret && (ret != -EINVAL)) {
                stmmac_global_err(priv);
-       return ret;
+               return true;
+       }
+
+       return false;
 }
 
 /**
@@ -2177,8 +2177,7 @@ static int stmmac_get_hw_features(struct stmmac_priv *priv)
 static void stmmac_check_ether_addr(struct stmmac_priv *priv)
 {
        if (!is_valid_ether_addr(priv->dev->dev_addr)) {
-               priv->hw->mac->get_umac_addr(priv->hw,
-                                            priv->dev->dev_addr, 0);
+               stmmac_get_umac_addr(priv, priv->hw, priv->dev->dev_addr, 0);
                if (!is_valid_ether_addr(priv->dev->dev_addr))
                        eth_hw_addr_random(priv->dev);
                netdev_info(priv->dev, "device MAC address %pM\n",
@@ -2332,7 +2331,7 @@ static void stmmac_set_tx_queue_weight(struct stmmac_priv *priv)
 
        for (queue = 0; queue < tx_queues_count; queue++) {
                weight = priv->plat->tx_queues_cfg[queue].weight;
-               priv->hw->mac->set_mtl_tx_queue_weight(priv->hw, weight, queue);
+               stmmac_set_mtl_tx_queue_weight(priv, priv->hw, weight, queue);
        }
 }
 
@@ -2353,7 +2352,7 @@ static void stmmac_configure_cbs(struct stmmac_priv *priv)
                if (mode_to_use == MTL_QUEUE_DCB)
                        continue;
 
-               priv->hw->mac->config_cbs(priv->hw,
+               stmmac_config_cbs(priv, priv->hw,
                                priv->plat->tx_queues_cfg[queue].send_slope,
                                priv->plat->tx_queues_cfg[queue].idle_slope,
                                priv->plat->tx_queues_cfg[queue].high_credit,
@@ -2375,7 +2374,7 @@ static void stmmac_rx_queue_dma_chan_map(struct stmmac_priv *priv)
 
        for (queue = 0; queue < rx_queues_count; queue++) {
                chan = priv->plat->rx_queues_cfg[queue].chan;
-               priv->hw->mac->map_mtl_to_dma(priv->hw, queue, chan);
+               stmmac_map_mtl_to_dma(priv, priv->hw, queue, chan);
        }
 }
 
@@ -2395,7 +2394,7 @@ static void stmmac_mac_config_rx_queues_prio(struct stmmac_priv *priv)
                        continue;
 
                prio = priv->plat->rx_queues_cfg[queue].prio;
-               priv->hw->mac->rx_queue_prio(priv->hw, prio, queue);
+               stmmac_rx_queue_prio(priv, priv->hw, prio, queue);
        }
 }
 
@@ -2415,7 +2414,7 @@ static void stmmac_mac_config_tx_queues_prio(struct stmmac_priv *priv)
                        continue;
 
                prio = priv->plat->tx_queues_cfg[queue].prio;
-               priv->hw->mac->tx_queue_prio(priv->hw, prio, queue);
+               stmmac_tx_queue_prio(priv, priv->hw, prio, queue);
        }
 }
 
@@ -2436,7 +2435,7 @@ static void stmmac_mac_config_rx_queues_routing(struct stmmac_priv *priv)
                        continue;
 
                packet = priv->plat->rx_queues_cfg[queue].pkt_route;
-               priv->hw->mac->rx_queue_routing(priv->hw, packet, queue);
+               stmmac_rx_queue_routing(priv, priv->hw, packet, queue);
        }
 }
 
@@ -2450,50 +2449,47 @@ static void stmmac_mtl_configuration(struct stmmac_priv *priv)
        u32 rx_queues_count = priv->plat->rx_queues_to_use;
        u32 tx_queues_count = priv->plat->tx_queues_to_use;
 
-       if (tx_queues_count > 1 && priv->hw->mac->set_mtl_tx_queue_weight)
+       if (tx_queues_count > 1)
                stmmac_set_tx_queue_weight(priv);
 
        /* Configure MTL RX algorithms */
-       if (rx_queues_count > 1 && priv->hw->mac->prog_mtl_rx_algorithms)
-               priv->hw->mac->prog_mtl_rx_algorithms(priv->hw,
-                                               priv->plat->rx_sched_algorithm);
+       if (rx_queues_count > 1)
+               stmmac_prog_mtl_rx_algorithms(priv, priv->hw,
+                               priv->plat->rx_sched_algorithm);
 
        /* Configure MTL TX algorithms */
-       if (tx_queues_count > 1 && priv->hw->mac->prog_mtl_tx_algorithms)
-               priv->hw->mac->prog_mtl_tx_algorithms(priv->hw,
-                                               priv->plat->tx_sched_algorithm);
+       if (tx_queues_count > 1)
+               stmmac_prog_mtl_tx_algorithms(priv, priv->hw,
+                               priv->plat->tx_sched_algorithm);
 
        /* Configure CBS in AVB TX queues */
-       if (tx_queues_count > 1 && priv->hw->mac->config_cbs)
+       if (tx_queues_count > 1)
                stmmac_configure_cbs(priv);
 
        /* Map RX MTL to DMA channels */
-       if (priv->hw->mac->map_mtl_to_dma)
-               stmmac_rx_queue_dma_chan_map(priv);
+       stmmac_rx_queue_dma_chan_map(priv);
 
        /* Enable MAC RX Queues */
-       if (priv->hw->mac->rx_queue_enable)
-               stmmac_mac_enable_rx_queues(priv);
+       stmmac_mac_enable_rx_queues(priv);
 
        /* Set RX priorities */
-       if (rx_queues_count > 1 && priv->hw->mac->rx_queue_prio)
+       if (rx_queues_count > 1)
                stmmac_mac_config_rx_queues_prio(priv);
 
        /* Set TX priorities */
-       if (tx_queues_count > 1 && priv->hw->mac->tx_queue_prio)
+       if (tx_queues_count > 1)
                stmmac_mac_config_tx_queues_prio(priv);
 
        /* Set RX routing */
-       if (rx_queues_count > 1 && priv->hw->mac->rx_queue_routing)
+       if (rx_queues_count > 1)
                stmmac_mac_config_rx_queues_routing(priv);
 }
 
 static void stmmac_safety_feat_configuration(struct stmmac_priv *priv)
 {
-       if (priv->hw->mac->safety_feat_config && priv->dma_cap.asp) {
+       if (priv->dma_cap.asp) {
                netdev_info(priv->dev, "Enabling Safety Features\n");
-               priv->hw->mac->safety_feat_config(priv->ioaddr,
-                               priv->dma_cap.asp);
+               stmmac_safety_feat_config(priv, priv->ioaddr, priv->dma_cap.asp);
        } else {
                netdev_info(priv->dev, "No Safety Features support found\n");
        }
@@ -2528,7 +2524,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
        }
 
        /* Copy the MAC addr into the HW  */
-       priv->hw->mac->set_umac_addr(priv->hw, dev->dev_addr, 0);
+       stmmac_set_umac_addr(priv, priv->hw, dev->dev_addr, 0);
 
        /* PS and related bits will be programmed according to the speed */
        if (priv->hw->pcs) {
@@ -2544,7 +2540,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
        }
 
        /* Initialize the MAC Core */
-       priv->hw->mac->core_init(priv->hw, dev);
+       stmmac_core_init(priv, priv->hw, dev);
 
        /* Initialize MTL*/
        if (priv->synopsys_id >= DWMAC_CORE_4_00)
@@ -2554,7 +2550,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
        if (priv->synopsys_id >= DWMAC_CORE_5_10)
                stmmac_safety_feat_configuration(priv);
 
-       ret = priv->hw->mac->rx_ipc(priv->hw);
+       ret = stmmac_rx_ipc(priv, priv->hw);
        if (!ret) {
                netdev_warn(priv->dev, "RX IPC Checksum Offload disabled\n");
                priv->plat->rx_coe = STMMAC_RX_COE_NONE;
@@ -2562,7 +2558,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
        }
 
        /* Enable the MAC Rx/Tx */
-       priv->hw->mac->set_mac(priv->ioaddr, true);
+       stmmac_mac_set(priv, priv->ioaddr, true);
 
        /* Set the HW DMA mode and the COE */
        stmmac_dma_operation_mode(priv);
@@ -2598,8 +2594,8 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
                        priv->rx_riwt = MAX_DMA_RIWT;
        }
 
-       if (priv->hw->pcs && priv->hw->mac->pcs_ctrl_ane)
-               priv->hw->mac->pcs_ctrl_ane(priv->hw, 1, priv->hw->ps, 0);
+       if (priv->hw->pcs)
+               stmmac_pcs_ctrl_ane(priv, priv->hw, 1, priv->hw->ps, 0);
 
        /* set TX and RX rings length */
        stmmac_set_rings_length(priv);
@@ -2778,7 +2774,7 @@ static int stmmac_release(struct net_device *dev)
        free_dma_desc_resources(priv);
 
        /* Disable the MAC Rx/Tx */
-       priv->hw->mac->set_mac(priv->ioaddr, false);
+       stmmac_mac_set(priv, priv->ioaddr, false);
 
        netif_carrier_off(dev);
 
@@ -3614,7 +3610,7 @@ static void stmmac_set_rx_mode(struct net_device *dev)
 {
        struct stmmac_priv *priv = netdev_priv(dev);
 
-       priv->hw->mac->set_filter(priv->hw, dev);
+       stmmac_set_filter(priv, priv->hw, dev);
 }
 
 /**
@@ -3687,7 +3683,7 @@ static int stmmac_set_features(struct net_device *netdev,
        /* No check needed because rx_coe has been set before and it will be
         * fixed in case of issue.
         */
-       priv->hw->mac->rx_ipc(priv->hw);
+       stmmac_rx_ipc(priv, priv->hw);
 
        return 0;
 }
@@ -3731,8 +3727,7 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id)
 
        /* To handle GMAC own interrupts */
        if ((priv->plat->has_gmac) || (priv->plat->has_gmac4)) {
-               int status = priv->hw->mac->host_irq_status(priv->hw,
-                                                           &priv->xstats);
+               int status = stmmac_host_irq_status(priv, priv->hw, &priv->xstats);
 
                if (unlikely(status)) {
                        /* For LPI we need to save the tx status */
@@ -3747,9 +3742,8 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id)
                                struct stmmac_rx_queue *rx_q =
                                &priv->rx_queue[queue];
 
-                               status |=
-                               priv->hw->mac->host_mtl_irq_status(priv->hw,
-                                                                  queue);
+                               status |= stmmac_host_mtl_irq_status(priv,
+                                               priv->hw, queue);
 
                                if (status & CORE_IRQ_MTL_RX_OVERFLOW)
                                        stmmac_set_rx_tail_ptr(priv,
@@ -3829,7 +3823,7 @@ static int stmmac_set_mac_address(struct net_device *ndev, void *addr)
        if (ret)
                return ret;
 
-       priv->hw->mac->set_umac_addr(priv->hw, ndev->dev_addr, 0);
+       stmmac_set_umac_addr(priv, priv->hw, ndev->dev_addr, 0);
 
        return ret;
 }
@@ -4418,7 +4412,7 @@ int stmmac_dvr_remove(struct device *dev)
 
        stmmac_stop_all_dma(priv);
 
-       priv->hw->mac->set_mac(priv->ioaddr, false);
+       stmmac_mac_set(priv, priv->ioaddr, false);
        netif_carrier_off(ndev);
        unregister_netdev(ndev);
        if (priv->plat->stmmac_rst)
@@ -4467,10 +4461,10 @@ int stmmac_suspend(struct device *dev)
 
        /* Enable Power down mode by programming the PMT regs */
        if (device_may_wakeup(priv->device)) {
-               priv->hw->mac->pmt(priv->hw, priv->wolopts);
+               stmmac_pmt(priv, priv->hw, priv->wolopts);
                priv->irq_wake = 1;
        } else {
-               priv->hw->mac->set_mac(priv->ioaddr, false);
+               stmmac_mac_set(priv, priv->ioaddr, false);
                pinctrl_pm_select_sleep_state(priv->device);
                /* Disable clock in case of PWM is off */
                clk_disable(priv->plat->pclk);
@@ -4534,7 +4528,7 @@ int stmmac_resume(struct device *dev)
         */
        if (device_may_wakeup(priv->device)) {
                spin_lock_irqsave(&priv->lock, flags);
-               priv->hw->mac->pmt(priv->hw, 0);
+               stmmac_pmt(priv, priv->hw, 0);
                spin_unlock_irqrestore(&priv->lock, flags);
                priv->irq_wake = 0;
        } else {