mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-03 17:40:04 +00:00
net: stmmac: add set_mac to the stmmac_ops
Two different set_mac functions exists but stmmac_dwmac4_set_mac() is only used for enabling and never for disabling. So on dwmac4, the MAC RX/TX is never disabled. This patch add a generic function pointer set_mac() to stmmac_ops and replace all call to stmmac_set_mac/stmmac_dwmac4_set_mac by a call to this pointer. Since dwmac4_ops is const, set_mac cannot be modified after, and so dwmac4_ops is duplioacted like dwmac4_dma_ops. Signed-off-by: Corentin Labbe <clabbe.montjoie@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
aff55a3638
commit
270c7759fb
5 changed files with 45 additions and 9 deletions
|
@ -474,6 +474,8 @@ struct mac_device_info;
|
||||||
struct stmmac_ops {
|
struct stmmac_ops {
|
||||||
/* MAC core initialization */
|
/* MAC core initialization */
|
||||||
void (*core_init)(struct mac_device_info *hw, int mtu);
|
void (*core_init)(struct mac_device_info *hw, int mtu);
|
||||||
|
/* Enable the MAC RX/TX */
|
||||||
|
void (*set_mac)(void __iomem *ioaddr, bool enable);
|
||||||
/* Enable and verify that the IPC module is supported */
|
/* Enable and verify that the IPC module is supported */
|
||||||
int (*rx_ipc)(struct mac_device_info *hw);
|
int (*rx_ipc)(struct mac_device_info *hw);
|
||||||
/* Enable RX Queues */
|
/* Enable RX Queues */
|
||||||
|
|
|
@ -490,6 +490,7 @@ static void dwmac1000_debug(void __iomem *ioaddr, struct stmmac_extra_stats *x,
|
||||||
|
|
||||||
static const struct stmmac_ops dwmac1000_ops = {
|
static const struct stmmac_ops dwmac1000_ops = {
|
||||||
.core_init = dwmac1000_core_init,
|
.core_init = dwmac1000_core_init,
|
||||||
|
.set_mac = stmmac_set_mac,
|
||||||
.rx_ipc = dwmac1000_rx_ipc_enable,
|
.rx_ipc = dwmac1000_rx_ipc_enable,
|
||||||
.dump_regs = dwmac1000_dump_regs,
|
.dump_regs = dwmac1000_dump_regs,
|
||||||
.host_irq_status = dwmac1000_irq_status,
|
.host_irq_status = dwmac1000_irq_status,
|
||||||
|
|
|
@ -150,6 +150,7 @@ static void dwmac100_pmt(struct mac_device_info *hw, unsigned long mode)
|
||||||
|
|
||||||
static const struct stmmac_ops dwmac100_ops = {
|
static const struct stmmac_ops dwmac100_ops = {
|
||||||
.core_init = dwmac100_core_init,
|
.core_init = dwmac100_core_init,
|
||||||
|
.set_mac = stmmac_set_mac,
|
||||||
.rx_ipc = dwmac100_rx_ipc_enable,
|
.rx_ipc = dwmac100_rx_ipc_enable,
|
||||||
.dump_regs = dwmac100_dump_mac_regs,
|
.dump_regs = dwmac100_dump_mac_regs,
|
||||||
.host_irq_status = dwmac100_irq_status,
|
.host_irq_status = dwmac100_irq_status,
|
||||||
|
|
|
@ -669,6 +669,38 @@ static void dwmac4_debug(void __iomem *ioaddr, struct stmmac_extra_stats *x,
|
||||||
|
|
||||||
static const struct stmmac_ops dwmac4_ops = {
|
static const struct stmmac_ops dwmac4_ops = {
|
||||||
.core_init = dwmac4_core_init,
|
.core_init = dwmac4_core_init,
|
||||||
|
.set_mac = stmmac_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_tx_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,
|
||||||
|
.pcs_ctrl_ane = dwmac4_ctrl_ane,
|
||||||
|
.pcs_rane = dwmac4_rane,
|
||||||
|
.pcs_get_adv_lp = dwmac4_get_adv_lp,
|
||||||
|
.debug = dwmac4_debug,
|
||||||
|
.set_filter = dwmac4_set_filter,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct stmmac_ops dwmac410_ops = {
|
||||||
|
.core_init = dwmac4_core_init,
|
||||||
|
.set_mac = stmmac_dwmac4_set_mac,
|
||||||
.rx_ipc = dwmac4_rx_ipc_enable,
|
.rx_ipc = dwmac4_rx_ipc_enable,
|
||||||
.rx_queue_enable = dwmac4_rx_queue_enable,
|
.rx_queue_enable = dwmac4_rx_queue_enable,
|
||||||
.rx_queue_prio = dwmac4_rx_queue_priority,
|
.rx_queue_prio = dwmac4_rx_queue_priority,
|
||||||
|
@ -715,8 +747,6 @@ struct mac_device_info *dwmac4_setup(void __iomem *ioaddr, int mcbins,
|
||||||
if (mac->multicast_filter_bins)
|
if (mac->multicast_filter_bins)
|
||||||
mac->mcast_bits_log2 = ilog2(mac->multicast_filter_bins);
|
mac->mcast_bits_log2 = ilog2(mac->multicast_filter_bins);
|
||||||
|
|
||||||
mac->mac = &dwmac4_ops;
|
|
||||||
|
|
||||||
mac->link.port = GMAC_CONFIG_PS;
|
mac->link.port = GMAC_CONFIG_PS;
|
||||||
mac->link.duplex = GMAC_CONFIG_DM;
|
mac->link.duplex = GMAC_CONFIG_DM;
|
||||||
mac->link.speed = GMAC_CONFIG_FES;
|
mac->link.speed = GMAC_CONFIG_FES;
|
||||||
|
@ -737,5 +767,10 @@ struct mac_device_info *dwmac4_setup(void __iomem *ioaddr, int mcbins,
|
||||||
else
|
else
|
||||||
mac->dma = &dwmac4_dma_ops;
|
mac->dma = &dwmac4_dma_ops;
|
||||||
|
|
||||||
|
if (*synopsys_id >= DWMAC_CORE_4_00)
|
||||||
|
mac->mac = &dwmac410_ops;
|
||||||
|
else
|
||||||
|
mac->mac = &dwmac4_ops;
|
||||||
|
|
||||||
return mac;
|
return mac;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2460,10 +2460,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable the MAC Rx/Tx */
|
/* Enable the MAC Rx/Tx */
|
||||||
if (priv->synopsys_id >= DWMAC_CORE_4_00)
|
priv->hw->mac->set_mac(priv->ioaddr, true);
|
||||||
stmmac_dwmac4_set_mac(priv->ioaddr, true);
|
|
||||||
else
|
|
||||||
stmmac_set_mac(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);
|
||||||
|
@ -2663,7 +2660,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 */
|
||||||
stmmac_set_mac(priv->ioaddr, false);
|
priv->hw->mac->set_mac(priv->ioaddr, false);
|
||||||
|
|
||||||
netif_carrier_off(dev);
|
netif_carrier_off(dev);
|
||||||
|
|
||||||
|
@ -4230,7 +4227,7 @@ int stmmac_dvr_remove(struct device *dev)
|
||||||
|
|
||||||
stmmac_stop_all_dma(priv);
|
stmmac_stop_all_dma(priv);
|
||||||
|
|
||||||
stmmac_set_mac(priv->ioaddr, false);
|
priv->hw->mac->set_mac(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)
|
||||||
|
@ -4281,7 +4278,7 @@ int stmmac_suspend(struct device *dev)
|
||||||
priv->hw->mac->pmt(priv->hw, priv->wolopts);
|
priv->hw->mac->pmt(priv->hw, priv->wolopts);
|
||||||
priv->irq_wake = 1;
|
priv->irq_wake = 1;
|
||||||
} else {
|
} else {
|
||||||
stmmac_set_mac(priv->ioaddr, false);
|
priv->hw->mac->set_mac(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);
|
||||||
|
|
Loading…
Reference in a new issue