net: stmmac: Switch stmmac_ops to generic HW Interface Helpers
[linux-2.6-block.git] / drivers / net / ethernet / stmicro / stmmac / stmmac_main.c
index 7f2aeaede682090973ae417bfee0bc3ba4aee4bb..2b521035185d358fa87189585095bca96f44a7a6 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 {