]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
net: stmmac: add set_mac to the stmmac_ops
authorLABBE Corentin <clabbe.montjoie@gmail.com>
Thu, 23 Mar 2017 13:40:22 +0000 (14:40 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 Mar 2017 19:36:42 +0000 (12:36 -0700)
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>
drivers/net/ethernet/stmicro/stmmac/common.h
drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c
drivers/net/ethernet/stmicro/stmmac/dwmac100_core.c
drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

index 572cf8b617070367c73c9d279f5de1b825ac6e63..90d28bcad8804f9a60c5c84a994ead8fca3cee7c 100644 (file)
@@ -474,6 +474,8 @@ struct mac_device_info;
 struct stmmac_ops {
        /* MAC core initialization */
        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 */
        int (*rx_ipc)(struct mac_device_info *hw);
        /* Enable RX Queues */
index 7f78f7746a5bd1b53992eabc2e3f53bd25f06318..f3d9305e5f706bc407c51a5d98af6a28b6404f42 100644 (file)
@@ -490,6 +490,7 @@ static void dwmac1000_debug(void __iomem *ioaddr, struct stmmac_extra_stats *x,
 
 static const struct stmmac_ops dwmac1000_ops = {
        .core_init = dwmac1000_core_init,
+       .set_mac = stmmac_set_mac,
        .rx_ipc = dwmac1000_rx_ipc_enable,
        .dump_regs = dwmac1000_dump_regs,
        .host_irq_status = dwmac1000_irq_status,
index 524135e6dd89afd959e5f77842899fcbbe7cd55b..1b360910548473a486372835b3e167456528d508 100644 (file)
@@ -150,6 +150,7 @@ static void dwmac100_pmt(struct mac_device_info *hw, unsigned long mode)
 
 static const struct stmmac_ops dwmac100_ops = {
        .core_init = dwmac100_core_init,
+       .set_mac = stmmac_set_mac,
        .rx_ipc = dwmac100_rx_ipc_enable,
        .dump_regs = dwmac100_dump_mac_regs,
        .host_irq_status = dwmac100_irq_status,
index 40ce202184025b5e393eccf60cd9aa06dfd4bcbd..48793f2e93075a9cabd57b3a4e0ee86765368bae 100644 (file)
@@ -669,6 +669,38 @@ static void dwmac4_debug(void __iomem *ioaddr, struct stmmac_extra_stats *x,
 
 static const struct stmmac_ops dwmac4_ops = {
        .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_queue_enable = dwmac4_rx_queue_enable,
        .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)
                mac->mcast_bits_log2 = ilog2(mac->multicast_filter_bins);
 
-       mac->mac = &dwmac4_ops;
-
        mac->link.port = GMAC_CONFIG_PS;
        mac->link.duplex = GMAC_CONFIG_DM;
        mac->link.speed = GMAC_CONFIG_FES;
@@ -737,5 +767,10 @@ struct mac_device_info *dwmac4_setup(void __iomem *ioaddr, int mcbins,
        else
                mac->dma = &dwmac4_dma_ops;
 
+       if (*synopsys_id >= DWMAC_CORE_4_00)
+               mac->mac = &dwmac410_ops;
+       else
+               mac->mac = &dwmac4_ops;
+
        return mac;
 }
index 4b418d2aec3808f70fb307b008830dccfb349801..c78f444ad4231e63e7afe7a653a959291a30b22a 100644 (file)
@@ -2460,10 +2460,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
        }
 
        /* Enable the MAC Rx/Tx */
-       if (priv->synopsys_id >= DWMAC_CORE_4_00)
-               stmmac_dwmac4_set_mac(priv->ioaddr, true);
-       else
-               stmmac_set_mac(priv->ioaddr, true);
+       priv->hw->mac->set_mac(priv->ioaddr, true);
 
        /* Set the HW DMA mode and the COE */
        stmmac_dma_operation_mode(priv);
@@ -2663,7 +2660,7 @@ static int stmmac_release(struct net_device *dev)
        free_dma_desc_resources(priv);
 
        /* Disable the MAC Rx/Tx */
-       stmmac_set_mac(priv->ioaddr, false);
+       priv->hw->mac->set_mac(priv->ioaddr, false);
 
        netif_carrier_off(dev);
 
@@ -4230,7 +4227,7 @@ int stmmac_dvr_remove(struct device *dev)
 
        stmmac_stop_all_dma(priv);
 
-       stmmac_set_mac(priv->ioaddr, false);
+       priv->hw->mac->set_mac(priv->ioaddr, false);
        netif_carrier_off(ndev);
        unregister_netdev(ndev);
        if (priv->plat->stmmac_rst)
@@ -4281,7 +4278,7 @@ int stmmac_suspend(struct device *dev)
                priv->hw->mac->pmt(priv->hw, priv->wolopts);
                priv->irq_wake = 1;
        } else {
-               stmmac_set_mac(priv->ioaddr, false);
+               priv->hw->mac->set_mac(priv->ioaddr, false);
                pinctrl_pm_select_sleep_state(priv->device);
                /* Disable clock in case of PWM is off */
                clk_disable(priv->plat->pclk);