Commit c10d4c82 authored by Jose Abreu's avatar Jose Abreu Committed by David S. Miller

net: stmmac: Switch stmmac_ops to generic HW Interface Helpers

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: default avatarJose 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: default avatarDavid S. Miller <davem@davemloft.net>
parent a4e887fa
...@@ -383,76 +383,6 @@ extern const struct stmmac_desc_ops ndesc_ops; ...@@ -383,76 +383,6 @@ extern const struct stmmac_desc_ops ndesc_ops;
struct mac_device_info; 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 */ /* PTP and HW Timer helpers */
struct stmmac_hwtimestamp { struct stmmac_hwtimestamp {
void (*config_hw_tstamping) (void __iomem *ioaddr, u32 data); void (*config_hw_tstamping) (void __iomem *ioaddr, u32 data);
......
...@@ -237,15 +237,16 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp) ...@@ -237,15 +237,16 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp)
return 0; 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, void __iomem *ioaddr, unsigned int asp,
struct stmmac_safety_stats *stats) struct stmmac_safety_stats *stats)
{ {
bool ret = false, err, corr; bool err, corr;
u32 mtl, dma; u32 mtl, dma;
int ret = 0;
if (!asp) if (!asp)
return false; return -EINVAL;
mtl = readl(ioaddr + MTL_SAFETY_INT_STATUS); mtl = readl(ioaddr + MTL_SAFETY_INT_STATUS);
dma = readl(ioaddr + DMA_SAFETY_INT_STATUS); dma = readl(ioaddr + DMA_SAFETY_INT_STATUS);
...@@ -282,17 +283,19 @@ static const struct dwmac5_error { ...@@ -282,17 +283,19 @@ static const struct dwmac5_error {
{ dwmac5_dma_errors }, { dwmac5_dma_errors },
}; };
const char *dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats, int dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats,
int index, unsigned long *count) int index, unsigned long *count, const char **desc)
{ {
int module = index / 32, offset = index % 32; int module = index / 32, offset = index % 32;
unsigned long *ptr = (unsigned long *)stats; unsigned long *ptr = (unsigned long *)stats;
if (module >= ARRAY_SIZE(dwmac5_all_errors)) if (module >= ARRAY_SIZE(dwmac5_all_errors))
return NULL; return -EINVAL;
if (!dwmac5_all_errors[module].desc[offset].valid) if (!dwmac5_all_errors[module].desc[offset].valid)
return NULL; return -EINVAL;
if (count) if (count)
*count = *(ptr + index); *count = *(ptr + index);
return dwmac5_all_errors[module].desc[offset].desc; if (desc)
*desc = dwmac5_all_errors[module].desc[offset].desc;
return 0;
} }
...@@ -43,10 +43,10 @@ ...@@ -43,10 +43,10 @@
#define DMA_ECC_INT_STATUS 0x00001088 #define DMA_ECC_INT_STATUS 0x00001088
int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp); 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, void __iomem *ioaddr, unsigned int asp,
struct stmmac_safety_stats *stats); struct stmmac_safety_stats *stats);
const char *dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats, int dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats,
int index, unsigned long *count); int index, unsigned long *count, const char **desc);
#endif /* __DWMAC5_H__ */ #endif /* __DWMAC5_H__ */
...@@ -228,4 +228,142 @@ struct stmmac_dma_ops { ...@@ -228,4 +228,142 @@ struct stmmac_dma_ops {
#define stmmac_enable_tso(__priv, __args...) \ #define stmmac_enable_tso(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, enable_tso, __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__ */ #endif /* __STMMAC_HWIF_H__ */
...@@ -291,11 +291,9 @@ static int stmmac_ethtool_get_link_ksettings(struct net_device *dev, ...@@ -291,11 +291,9 @@ static int stmmac_ethtool_get_link_ksettings(struct net_device *dev,
cmd->base.speed = priv->xstats.pcs_speed; cmd->base.speed = priv->xstats.pcs_speed;
/* Get and convert ADV/LP_ADV from the HW AN registers */ /* 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 */ 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 */ /* Encoding of PSE bits is defined in 802.3z, 37.2.1.4 */
ethtool_convert_link_mode_to_legacy_u32( ethtool_convert_link_mode_to_legacy_u32(
...@@ -393,11 +391,7 @@ stmmac_ethtool_set_link_ksettings(struct net_device *dev, ...@@ -393,11 +391,7 @@ stmmac_ethtool_set_link_ksettings(struct net_device *dev,
ADVERTISED_10baseT_Full); ADVERTISED_10baseT_Full);
spin_lock(&priv->lock); spin_lock(&priv->lock);
stmmac_pcs_ctrl_ane(priv, priv->ioaddr, 1, priv->hw->ps, 0);
if (priv->hw->mac->pcs_ctrl_ane)
priv->hw->mac->pcs_ctrl_ane(priv->ioaddr, 1,
priv->hw->ps, 0);
spin_unlock(&priv->lock); spin_unlock(&priv->lock);
return 0; return 0;
...@@ -442,7 +436,7 @@ static void stmmac_ethtool_gregs(struct net_device *dev, ...@@ -442,7 +436,7 @@ static void stmmac_ethtool_gregs(struct net_device *dev,
memset(reg_space, 0x0, REG_SPACE_SIZE); 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); stmmac_dump_dma_regs(priv, priv->ioaddr, reg_space);
/* Copy DMA registers to where ethtool expects them */ /* Copy DMA registers to where ethtool expects them */
memcpy(&reg_space[ETHTOOL_DMA_OFFSET], &reg_space[DMA_BUS_MODE / 4], memcpy(&reg_space[ETHTOOL_DMA_OFFSET], &reg_space[DMA_BUS_MODE / 4],
...@@ -454,15 +448,13 @@ stmmac_get_pauseparam(struct net_device *netdev, ...@@ -454,15 +448,13 @@ stmmac_get_pauseparam(struct net_device *netdev,
struct ethtool_pauseparam *pause) struct ethtool_pauseparam *pause)
{ {
struct stmmac_priv *priv = netdev_priv(netdev); struct stmmac_priv *priv = netdev_priv(netdev);
struct rgmii_adv adv_lp;
pause->rx_pause = 0; pause->rx_pause = 0;
pause->tx_pause = 0; pause->tx_pause = 0;
if (priv->hw->pcs && priv->hw->mac->pcs_get_adv_lp) { if (priv->hw->pcs && !stmmac_pcs_get_adv_lp(priv, priv->ioaddr, &adv_lp)) {
struct rgmii_adv adv_lp;
pause->autoneg = 1; pause->autoneg = 1;
priv->hw->mac->pcs_get_adv_lp(priv->ioaddr, &adv_lp);
if (!adv_lp.pause) if (!adv_lp.pause)
return; return;
} else { } else {
...@@ -488,12 +480,10 @@ stmmac_set_pauseparam(struct net_device *netdev, ...@@ -488,12 +480,10 @@ stmmac_set_pauseparam(struct net_device *netdev,
u32 tx_cnt = priv->plat->tx_queues_to_use; u32 tx_cnt = priv->plat->tx_queues_to_use;
struct phy_device *phy = netdev->phydev; struct phy_device *phy = netdev->phydev;
int new_pause = FLOW_OFF; int new_pause = FLOW_OFF;
struct rgmii_adv adv_lp;
if (priv->hw->pcs && priv->hw->mac->pcs_get_adv_lp) { if (priv->hw->pcs && !stmmac_pcs_get_adv_lp(priv, priv->ioaddr, &adv_lp)) {
struct rgmii_adv adv_lp;
pause->autoneg = 1; pause->autoneg = 1;
priv->hw->mac->pcs_get_adv_lp(priv->ioaddr, &adv_lp);
if (!adv_lp.pause) if (!adv_lp.pause)
return -EOPNOTSUPP; return -EOPNOTSUPP;
} else { } else {
...@@ -515,27 +505,24 @@ stmmac_set_pauseparam(struct net_device *netdev, ...@@ -515,27 +505,24 @@ stmmac_set_pauseparam(struct net_device *netdev,
return phy_start_aneg(phy); return phy_start_aneg(phy);
} }
priv->hw->mac->flow_ctrl(priv->hw, phy->duplex, priv->flow_ctrl, stmmac_flow_ctrl(priv, priv->hw, phy->duplex, priv->flow_ctrl,
priv->pause, tx_cnt); priv->pause, tx_cnt);
return 0; return 0;
} }
static void stmmac_get_ethtool_stats(struct net_device *dev, static void stmmac_get_ethtool_stats(struct net_device *dev,
struct ethtool_stats *dummy, u64 *data) 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); struct stmmac_priv *priv = netdev_priv(dev);
u32 rx_queues_count = priv->plat->rx_queues_to_use; u32 rx_queues_count = priv->plat->rx_queues_to_use;
u32 tx_queues_count = priv->plat->tx_queues_to_use; u32 tx_queues_count = priv->plat->tx_queues_to_use;
unsigned long count; unsigned long count;
int i, j = 0, ret; int i, j = 0, ret;
if (priv->dma_cap.asp && priv->hw->mac->safety_feat_dump) { if (priv->dma_cap.asp) {
dump = priv->hw->mac->safety_feat_dump;
for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) { 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; data[j++] = count;
} }
} }
...@@ -563,11 +550,10 @@ static void stmmac_get_ethtool_stats(struct net_device *dev, ...@@ -563,11 +550,10 @@ static void stmmac_get_ethtool_stats(struct net_device *dev,
priv->xstats.phy_eee_wakeup_error_n = val; priv->xstats.phy_eee_wakeup_error_n = val;
} }
if ((priv->hw->mac->debug) && if (priv->synopsys_id >= DWMAC_CORE_3_50)
(priv->synopsys_id >= DWMAC_CORE_3_50)) stmmac_mac_debug(priv, priv->ioaddr,
priv->hw->mac->debug(priv->ioaddr, (void *)&priv->xstats,
(void *)&priv->xstats, rx_queues_count, tx_queues_count);
rx_queues_count, tx_queues_count);
} }
for (i = 0; i < STMMAC_STATS_LEN; i++) { for (i = 0; i < STMMAC_STATS_LEN; i++) {
char *p = (char *)priv + stmmac_gstrings_stats[i].stat_offset; char *p = (char *)priv + stmmac_gstrings_stats[i].stat_offset;
...@@ -579,8 +565,6 @@ static void stmmac_get_ethtool_stats(struct net_device *dev, ...@@ -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) static int stmmac_get_sset_count(struct net_device *netdev, int sset)
{ {
struct stmmac_priv *priv = netdev_priv(netdev); 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; int i, len, safety_len = 0;
switch (sset) { switch (sset) {
...@@ -589,11 +573,11 @@ static int stmmac_get_sset_count(struct net_device *netdev, int sset) ...@@ -589,11 +573,11 @@ static int stmmac_get_sset_count(struct net_device *netdev, int sset)
if (priv->dma_cap.rmon) if (priv->dma_cap.rmon)
len += STMMAC_MMC_STATS_LEN; len += STMMAC_MMC_STATS_LEN;
if (priv->dma_cap.asp && priv->hw->mac->safety_feat_dump) { if (priv->dma_cap.asp) {
dump = priv->hw->mac->safety_feat_dump;
for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) { 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++; safety_len++;
} }
...@@ -611,17 +595,15 @@ static void stmmac_get_strings(struct net_device *dev, u32 stringset, u8 *data) ...@@ -611,17 +595,15 @@ static void stmmac_get_strings(struct net_device *dev, u32 stringset, u8 *data)
int i; int i;
u8 *p = data; u8 *p = data;
struct stmmac_priv *priv = netdev_priv(dev); struct stmmac_priv *priv = netdev_priv(dev);
const char *(*dump)(struct stmmac_safety_stats *stats, int index,
unsigned long *count);
switch (stringset) { switch (stringset) {
case ETH_SS_STATS: case ETH_SS_STATS:
if (priv->dma_cap.asp && priv->hw->mac->safety_feat_dump) { if (priv->dma_cap.asp) {
dump = priv->hw->mac->safety_feat_dump;
for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) { for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) {
const char *desc = dump(&priv->sstats, i, NULL); const char *desc;
if (!stmmac_safety_feat_dump(priv,
if (desc) { &priv->sstats, i,
NULL, &desc)) {
memcpy(p, desc, ETH_GSTRING_LEN); memcpy(p, desc, ETH_GSTRING_LEN);
p += ETH_GSTRING_LEN; p += ETH_GSTRING_LEN;
} }
......
...@@ -336,8 +336,8 @@ static void stmmac_enable_eee_mode(struct stmmac_priv *priv) ...@@ -336,8 +336,8 @@ static void stmmac_enable_eee_mode(struct stmmac_priv *priv)
/* Check and enter in LPI mode */ /* Check and enter in LPI mode */
if (!priv->tx_path_in_lpi_mode) if (!priv->tx_path_in_lpi_mode)
priv->hw->mac->set_eee_mode(priv->hw, stmmac_set_eee_mode(priv, priv->hw,
priv->plat->en_tx_lpi_clockgating); priv->plat->en_tx_lpi_clockgating);
} }
/** /**
...@@ -348,7 +348,7 @@ static void stmmac_enable_eee_mode(struct stmmac_priv *priv) ...@@ -348,7 +348,7 @@ static void stmmac_enable_eee_mode(struct stmmac_priv *priv)
*/ */
void stmmac_disable_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); del_timer_sync(&priv->eee_ctrl_timer);
priv->tx_path_in_lpi_mode = false; priv->tx_path_in_lpi_mode = false;
} }
...@@ -411,8 +411,8 @@ bool stmmac_eee_init(struct stmmac_priv *priv) ...@@ -411,8 +411,8 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
if (priv->eee_active) { if (priv->eee_active) {
netdev_dbg(priv->dev, "disable EEE\n"); netdev_dbg(priv->dev, "disable EEE\n");
del_timer_sync(&priv->eee_ctrl_timer); del_timer_sync(&priv->eee_ctrl_timer);
priv->hw->mac->set_eee_timer(priv->hw, 0, stmmac_set_eee_timer(priv, priv->hw, 0,
tx_lpi_timer); tx_lpi_timer);
} }
priv->eee_active = 0; priv->eee_active = 0;
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
...@@ -427,12 +427,11 @@ bool stmmac_eee_init(struct stmmac_priv *priv) ...@@ -427,12 +427,11 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
mod_timer(&priv->eee_ctrl_timer, mod_timer(&priv->eee_ctrl_timer,
STMMAC_LPI_T(eee_timer)); STMMAC_LPI_T(eee_timer));
priv->hw->mac->set_eee_timer(priv->hw, stmmac_set_eee_timer(priv, priv->hw,
STMMAC_DEFAULT_LIT_LS, STMMAC_DEFAULT_LIT_LS, tx_lpi_timer);
tx_lpi_timer);
} }
/* Set HW EEE according to the speed */ /* 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; ret = true;
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
...@@ -796,8 +795,8 @@ static void stmmac_mac_flow_ctrl(struct stmmac_priv *priv, u32 duplex) ...@@ -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; u32 tx_cnt = priv->plat->tx_queues_to_use;
priv->hw->mac->flow_ctrl(priv->hw, duplex, priv->flow_ctrl, stmmac_flow_ctrl(priv, priv->hw, duplex, priv->flow_ctrl,
priv->pause, tx_cnt); priv->pause, tx_cnt);
} }
/** /**
...@@ -1663,7 +1662,7 @@ static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv) ...@@ -1663,7 +1662,7 @@ static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv)
for (queue = 0; queue < rx_queues_count; queue++) { for (queue = 0; queue < rx_queues_count; queue++) {
mode = priv->plat->rx_queues_cfg[queue].mode_to_use; 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, ...@@ -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) 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 */ /* Safety features are only available in cores >= 5.10 */
if (priv->synopsys_id < DWMAC_CORE_5_10) if (priv->synopsys_id < DWMAC_CORE_5_10)
return ret; return ret;
if (priv->hw->mac->safety_feat_irq_status) ret = stmmac_safety_feat_irq_status(priv, priv->dev,
ret = priv->hw->mac->safety_feat_irq_status(priv->dev, priv->ioaddr, priv->dma_cap.asp, &priv->sstats);
priv->ioaddr, priv->dma_cap.asp, &priv->sstats); if (ret && (ret != -EINVAL)) {
if (ret)
stmmac_global_err(priv); stmmac_global_err(priv);
return ret; return true;
}
return false;
} }
/** /**
...@@ -2177,8 +2177,7 @@ static int stmmac_get_hw_features(struct stmmac_priv *priv) ...@@ -2177,8 +2177,7 @@ static int stmmac_get_hw_features(struct stmmac_priv *priv)
static void stmmac_check_ether_addr(struct stmmac_priv *priv) static void stmmac_check_ether_addr(struct stmmac_priv *priv)
{ {
if (!is_valid_ether_addr(priv->dev->dev_addr)) { if (!is_valid_ether_addr(priv->dev->dev_addr)) {
priv->hw->mac->get_umac_addr(priv->hw, stmmac_get_umac_addr(priv, priv->hw, priv->dev->dev_addr, 0);
priv->dev->dev_addr, 0);
if (!is_valid_ether_addr(priv->dev->dev_addr)) if (!is_valid_ether_addr(priv->dev->dev_addr))
eth_hw_addr_random(priv->dev); eth_hw_addr_random(priv->dev);
netdev_info(priv->dev, "device MAC address %pM\n", netdev_info(priv->dev, "device MAC address %pM\n",
...@@ -2332,7 +2331,7 @@ static void stmmac_set_tx_queue_weight(struct stmmac_priv *priv) ...@@ -2332,7 +2331,7 @@ static void stmmac_set_tx_queue_weight(struct stmmac_priv *priv)
for (queue = 0; queue < tx_queues_count; queue++) { for (queue = 0; queue < tx_queues_count; queue++) {
weight = priv->plat->tx_queues_cfg[queue].weight; 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) ...@@ -2353,7 +2352,7 @@ static void stmmac_configure_cbs(struct stmmac_priv *priv)
if (mode_to_use == MTL_QUEUE_DCB) if (mode_to_use == MTL_QUEUE_DCB)
continue; 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].send_slope,
priv->plat->tx_queues_cfg[queue].idle_slope, priv->plat->tx_queues_cfg[queue].idle_slope,
priv->plat->tx_queues_cfg[queue].high_credit, priv->plat->tx_queues_cfg[queue].high_credit,
...@@ -2375,7 +2374,7 @@ static void stmmac_rx_queue_dma_chan_map(struct stmmac_priv *priv) ...@@ -2375,7 +2374,7 @@ static void stmmac_rx_queue_dma_chan_map(struct stmmac_priv *priv)
for (queue = 0; queue < rx_queues_count; queue++) { for (queue = 0; queue < rx_queues_count; queue++) {
chan = priv->plat->rx_queues_cfg[queue].chan; 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) ...@@ -2395,7 +2394,7 @@ static void stmmac_mac_config_rx_queues_prio(struct stmmac_priv *priv)
continue; continue;
prio = priv->plat->rx_queues_cfg[queue].prio; 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) ...@@ -2415,7 +2414,7 @@ static void stmmac_mac_config_tx_queues_prio(struct stmmac_priv *priv)
continue; continue;
prio = priv->plat->tx_queues_cfg[queue].prio; 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) ...@@ -2436,7 +2435,7 @@ static void stmmac_mac_config_rx_queues_routing(struct stmmac_priv *priv)
continue; continue;
packet = priv->plat->rx_queues_cfg[queue].pkt_route; 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) ...@@ -2450,50 +2449,47 @@ static void stmmac_mtl_configuration(struct stmmac_priv *priv)
u32 rx_queues_count = priv->plat->rx_queues_to_use; u32 rx_queues_count = priv->plat->rx_queues_to_use;
u32 tx_queues_count = priv->plat->tx_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); stmmac_set_tx_queue_weight(priv);
/* Configure MTL RX algorithms */ /* Configure MTL RX algorithms */
if (rx_queues_count > 1 && priv->hw->mac->prog_mtl_rx_algorithms) if (rx_queues_count > 1)
priv->hw->mac->prog_mtl_rx_algorithms(priv->hw, stmmac_prog_mtl_rx_algorithms(priv, priv->hw,
priv->plat->rx_sched_algorithm); priv->plat->rx_sched_algorithm);
/* Configure MTL TX algorithms */ /* Configure MTL TX algorithms */
if (tx_queues_count > 1 && priv->hw->mac->prog_mtl_tx_algorithms) if (tx_queues_count > 1)
priv->hw->mac->prog_mtl_tx_algorithms(priv->hw, stmmac_prog_mtl_tx_algorithms(priv, priv->hw,
priv->plat->tx_sched_algorithm); priv->plat->tx_sched_algorithm);
/* Configure CBS in AVB TX queues */ /* 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); stmmac_configure_cbs(priv);
/* Map RX MTL to DMA channels */ /* 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 */ /* 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 */ /* 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); stmmac_mac_config_rx_queues_prio(priv);
/* Set TX priorities */ /* 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); stmmac_mac_config_tx_queues_prio(priv);
/* Set RX routing */ /* 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); stmmac_mac_config_rx_queues_routing(priv);
} }
static void stmmac_safety_feat_configuration(struct stmmac_priv *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"); netdev_info(priv->dev, "Enabling Safety Features\n");
priv->hw->mac->safety_feat_config(priv->ioaddr, stmmac_safety_feat_config(priv, priv->ioaddr, priv->dma_cap.asp);
priv->dma_cap.asp);
} else { } else {
netdev_info(priv->dev, "No Safety Features support found\n"); 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) ...@@ -2528,7 +2524,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
} }
/* Copy the MAC addr into the HW */ /* 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 */ /* PS and related bits will be programmed according to the speed */
if (priv->hw->pcs) { if (priv->hw->pcs) {
...@@ -2544,7 +2540,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) ...@@ -2544,7 +2540,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
} }
/* Initialize the MAC Core */ /* Initialize the MAC Core */
priv->hw->mac->core_init(priv->hw, dev); stmmac_core_init(priv, priv->hw, dev);
/* Initialize MTL*/ /* Initialize MTL*/
if (priv->synopsys_id >= DWMAC_CORE_4_00) if (priv->synopsys_id >= DWMAC_CORE_4_00)
...@@ -2554,7 +2550,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) ...@@ -2554,7 +2550,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
if (priv->synopsys_id >= DWMAC_CORE_5_10) if (priv->synopsys_id >= DWMAC_CORE_5_10)
stmmac_safety_feat_configuration(priv); stmmac_safety_feat_configuration(priv);
ret = priv->hw->mac->rx_ipc(priv->hw); ret = stmmac_rx_ipc(priv, priv->hw);
if (!ret) { if (!ret) {
netdev_warn(priv->dev, "RX IPC Checksum Offload disabled\n"); netdev_warn(priv->dev, "RX IPC Checksum Offload disabled\n");
priv->plat->rx_coe = STMMAC_RX_COE_NONE; priv->plat->rx_coe = STMMAC_RX_COE_NONE;
...@@ -2562,7 +2558,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) ...@@ -2562,7 +2558,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
} }
/* Enable the MAC Rx/Tx */ /* 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 */ /* Set the HW DMA mode and the COE */
stmmac_dma_operation_mode(priv); stmmac_dma_operation_mode(priv);
...@@ -2598,8 +2594,8 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) ...@@ -2598,8 +2594,8 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
priv->rx_riwt = MAX_DMA_RIWT; priv->rx_riwt = MAX_DMA_RIWT;
} }
if (priv->hw->pcs && priv->hw->mac->pcs_ctrl_ane) if (priv->hw->pcs)
priv->hw->mac->pcs_ctrl_ane(priv->hw, 1, priv->hw->ps, 0); stmmac_pcs_ctrl_ane(priv, priv->hw, 1, priv->hw->ps, 0);
/* set TX and RX rings length */ /* set TX and RX rings length */
stmmac_set_rings_length(priv); stmmac_set_rings_length(priv);
...@@ -2778,7 +2774,7 @@ static int stmmac_release(struct net_device *dev) ...@@ -2778,7 +2774,7 @@ static int stmmac_release(struct net_device *dev)
free_dma_desc_resources(priv); free_dma_desc_resources(priv);
/* Disable the MAC Rx/Tx */ /* Disable the MAC Rx/Tx */
priv->hw->mac->set_mac(priv->ioaddr, false); stmmac_mac_set(priv, priv->ioaddr, false);
netif_carrier_off(dev); netif_carrier_off(dev);
...@@ -3614,7 +3610,7 @@ static void stmmac_set_rx_mode(struct net_device *dev) ...@@ -3614,7 +3610,7 @@ static void stmmac_set_rx_mode(struct net_device *dev)
{ {
struct stmmac_priv *priv = netdev_priv(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, ...@@ -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 /* No check needed because rx_coe has been set before and it will be
* fixed in case of issue. * fixed in case of issue.
*/ */
priv->hw->mac->rx_ipc(priv->hw); stmmac_rx_ipc(priv, priv->hw);
return 0; return 0;
} }
...@@ -3731,8 +3727,7 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id) ...@@ -3731,8 +3727,7 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id)
/* To handle GMAC own interrupts */ /* To handle GMAC own interrupts */
if ((priv->plat->has_gmac) || (priv->plat->has_gmac4)) { if ((priv->plat->has_gmac) || (priv->plat->has_gmac4)) {
int status = priv->hw->mac->host_irq_status(priv->hw, int status = stmmac_host_irq_status(priv, priv->hw, &priv->xstats);
&priv->xstats);
if (unlikely(status)) { if (unlikely(status)) {
/* For LPI we need to save the tx status */ /* For LPI we need to save the tx status */
...@@ -3747,9 +3742,8 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id) ...@@ -3747,9 +3742,8 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id)
struct stmmac_rx_queue *rx_q = struct stmmac_rx_queue *rx_q =
&priv->rx_queue[queue]; &priv->rx_queue[queue];
status |= status |= stmmac_host_mtl_irq_status(priv,
priv->hw->mac->host_mtl_irq_status(priv->hw, priv->hw, queue);
queue);
if (status & CORE_IRQ_MTL_RX_OVERFLOW) if (status & CORE_IRQ_MTL_RX_OVERFLOW)
stmmac_set_rx_tail_ptr(priv, stmmac_set_rx_tail_ptr(priv,
...@@ -3829,7 +3823,7 @@ static int stmmac_set_mac_address(struct net_device *ndev, void *addr) ...@@ -3829,7 +3823,7 @@ static int stmmac_set_mac_address(struct net_device *ndev, void *addr)
if (ret) if (ret)
return 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; return ret;
} }
...@@ -4418,7 +4412,7 @@ int stmmac_dvr_remove(struct device *dev) ...@@ -4418,7 +4412,7 @@ int stmmac_dvr_remove(struct device *dev)
stmmac_stop_all_dma(priv); stmmac_stop_all_dma(priv);
priv->hw->mac->set_mac(priv->ioaddr, false); stmmac_mac_set(priv, priv->ioaddr, false);
netif_carrier_off(ndev); netif_carrier_off(ndev);
unregister_netdev(ndev); unregister_netdev(ndev);
if (priv->plat->stmmac_rst) if (priv->plat->stmmac_rst)
...@@ -4467,10 +4461,10 @@ int stmmac_suspend(struct device *dev) ...@@ -4467,10 +4461,10 @@ int stmmac_suspend(struct device *dev)
/* Enable Power down mode by programming the PMT regs */ /* Enable Power down mode by programming the PMT regs */
if (device_may_wakeup(priv->device)) { 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; priv->irq_wake = 1;
} else { } else {
priv->hw->mac->set_mac(priv->ioaddr, false); stmmac_mac_set(priv, priv->ioaddr, false);
pinctrl_pm_select_sleep_state(priv->device); pinctrl_pm_select_sleep_state(priv->device);
/* Disable clock in case of PWM is off */ /* Disable clock in case of PWM is off */
clk_disable(priv->plat->pclk); clk_disable(priv->plat->pclk);
...@@ -4534,7 +4528,7 @@ int stmmac_resume(struct device *dev) ...@@ -4534,7 +4528,7 @@ int stmmac_resume(struct device *dev)
*/ */
if (device_may_wakeup(priv->device)) { if (device_may_wakeup(priv->device)) {
spin_lock_irqsave(&priv->lock, flags); 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); spin_unlock_irqrestore(&priv->lock, flags);
priv->irq_wake = 0; priv->irq_wake = 0;
} else { } else {
......
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