summaryrefslogtreecommitdiff
path: root/target/linux/sunxi/patches-3.13/151-4-stmmac-fixup-4.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/sunxi/patches-3.13/151-4-stmmac-fixup-4.patch')
-rw-r--r--target/linux/sunxi/patches-3.13/151-4-stmmac-fixup-4.patch214
1 files changed, 214 insertions, 0 deletions
diff --git a/target/linux/sunxi/patches-3.13/151-4-stmmac-fixup-4.patch b/target/linux/sunxi/patches-3.13/151-4-stmmac-fixup-4.patch
new file mode 100644
index 0000000..e006fda
--- /dev/null
+++ b/target/linux/sunxi/patches-3.13/151-4-stmmac-fixup-4.patch
@@ -0,0 +1,214 @@
+From 523f11b5d4fd72efb72b04cd7006bfd1d1d4f341 Mon Sep 17 00:00:00 2001
+From: Srinivas Kandagatla <srinivas.kandagatla@st.com>
+Date: Thu, 16 Jan 2014 10:52:14 +0000
+Subject: [PATCH] net: stmmac: move hardware setup for stmmac_open to new
+ function
+
+This patch moves hardware setup part of the code in stmmac_open to a new
+function stmmac_hw_setup, the reason for doing this is to make hw
+initialization independent function so that PM functions can re-use it to
+re-initialize the IP after returning from low power state.
+This will also avoid code duplication across stmmac_resume/restore and
+stmmac_open.
+
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@st.com>
+Acked-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 155 ++++++++++++----------
+ 1 file changed, 88 insertions(+), 67 deletions(-)
+
+diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+index 532f2b4..341c8dc3 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+@@ -1586,6 +1586,86 @@ static void stmmac_init_tx_coalesce(struct stmmac_priv *priv)
+ }
+
+ /**
++ * stmmac_hw_setup: setup mac in a usable state.
++ * @dev : pointer to the device structure.
++ * Description:
++ * This function sets up the ip in a usable state.
++ * Return value:
++ * 0 on success and an appropriate (-)ve integer as defined in errno.h
++ * file on failure.
++ */
++static int stmmac_hw_setup(struct net_device *dev)
++{
++ struct stmmac_priv *priv = netdev_priv(dev);
++ int ret;
++
++ ret = init_dma_desc_rings(dev);
++ if (ret < 0) {
++ pr_err("%s: DMA descriptors initialization failed\n", __func__);
++ return ret;
++ }
++ /* DMA initialization and SW reset */
++ ret = stmmac_init_dma_engine(priv);
++ if (ret < 0) {
++ pr_err("%s: DMA engine initialization failed\n", __func__);
++ return ret;
++ }
++
++ /* Copy the MAC addr into the HW */
++ priv->hw->mac->set_umac_addr(priv->ioaddr, dev->dev_addr, 0);
++
++ /* If required, perform hw setup of the bus. */
++ if (priv->plat->bus_setup)
++ priv->plat->bus_setup(priv->ioaddr);
++
++ /* Initialize the MAC Core */
++ priv->hw->mac->core_init(priv->ioaddr);
++
++ /* Enable the MAC Rx/Tx */
++ stmmac_set_mac(priv->ioaddr, true);
++
++ /* Set the HW DMA mode and the COE */
++ stmmac_dma_operation_mode(priv);
++
++ stmmac_mmc_setup(priv);
++
++ ret = stmmac_init_ptp(priv);
++ if (ret)
++ pr_warn("%s: failed PTP initialisation\n", __func__);
++
++#ifdef CONFIG_STMMAC_DEBUG_FS
++ ret = stmmac_init_fs(dev);
++ if (ret < 0)
++ pr_warn("%s: failed debugFS registration\n", __func__);
++#endif
++ /* Start the ball rolling... */
++ pr_debug("%s: DMA RX/TX processes started...\n", dev->name);
++ priv->hw->dma->start_tx(priv->ioaddr);
++ priv->hw->dma->start_rx(priv->ioaddr);
++
++ /* Dump DMA/MAC registers */
++ if (netif_msg_hw(priv)) {
++ priv->hw->mac->dump_regs(priv->ioaddr);
++ priv->hw->dma->dump_regs(priv->ioaddr);
++ }
++ priv->tx_lpi_timer = STMMAC_DEFAULT_TWT_LS;
++
++ priv->eee_enabled = stmmac_eee_init(priv);
++
++ stmmac_init_tx_coalesce(priv);
++
++ if ((priv->use_riwt) && (priv->hw->dma->rx_watchdog)) {
++ priv->rx_riwt = MAX_DMA_RIWT;
++ priv->hw->dma->rx_watchdog(priv->ioaddr, MAX_DMA_RIWT);
++ }
++
++ if (priv->pcs && priv->hw->mac->ctrl_ane)
++ priv->hw->mac->ctrl_ane(priv->ioaddr, 0);
++
++ return 0;
++}
++
++/**
+ * stmmac_open - open entry point of the driver
+ * @dev : pointer to the device structure.
+ * Description:
+@@ -1613,6 +1693,10 @@ static int stmmac_open(struct net_device *dev)
+ }
+ }
+
++ /* Extra statistics */
++ memset(&priv->xstats, 0, sizeof(struct stmmac_extra_stats));
++ priv->xstats.threshold = tc;
++
+ /* Create and initialize the TX/RX descriptors chains. */
+ priv->dma_tx_size = STMMAC_ALIGN(dma_txsize);
+ priv->dma_rx_size = STMMAC_ALIGN(dma_rxsize);
+@@ -1624,28 +1708,14 @@ static int stmmac_open(struct net_device *dev)
+ goto dma_desc_error;
+ }
+
+- ret = init_dma_desc_rings(dev);
++ ret = stmmac_hw_setup(dev);
+ if (ret < 0) {
+- pr_err("%s: DMA descriptors initialization failed\n", __func__);
+- goto dma_desc_error;
+- }
+-
+- /* DMA initialization and SW reset */
+- ret = stmmac_init_dma_engine(priv);
+- if (ret < 0) {
+- pr_err("%s: DMA engine initialization failed\n", __func__);
++ pr_err("%s: Hw setup failed\n", __func__);
+ goto init_error;
+ }
+
+- /* Copy the MAC addr into the HW */
+- priv->hw->mac->set_umac_addr(priv->ioaddr, dev->dev_addr, 0);
+-
+- /* If required, perform hw setup of the bus. */
+- if (priv->plat->bus_setup)
+- priv->plat->bus_setup(priv->ioaddr);
+-
+- /* Initialize the MAC Core */
+- priv->hw->mac->core_init(priv->ioaddr);
++ if (priv->phydev)
++ phy_start(priv->phydev);
+
+ /* Request the IRQ lines */
+ ret = request_irq(dev->irq, stmmac_interrupt,
+@@ -1678,55 +1748,6 @@ static int stmmac_open(struct net_device *dev)
+ }
+ }
+
+- /* Enable the MAC Rx/Tx */
+- stmmac_set_mac(priv->ioaddr, true);
+-
+- /* Set the HW DMA mode and the COE */
+- stmmac_dma_operation_mode(priv);
+-
+- /* Extra statistics */
+- memset(&priv->xstats, 0, sizeof(struct stmmac_extra_stats));
+- priv->xstats.threshold = tc;
+-
+- stmmac_mmc_setup(priv);
+-
+- ret = stmmac_init_ptp(priv);
+- if (ret)
+- pr_warn("%s: failed PTP initialisation\n", __func__);
+-
+-#ifdef CONFIG_STMMAC_DEBUG_FS
+- ret = stmmac_init_fs(dev);
+- if (ret < 0)
+- pr_warn("%s: failed debugFS registration\n", __func__);
+-#endif
+- /* Start the ball rolling... */
+- pr_debug("%s: DMA RX/TX processes started...\n", dev->name);
+- priv->hw->dma->start_tx(priv->ioaddr);
+- priv->hw->dma->start_rx(priv->ioaddr);
+-
+- /* Dump DMA/MAC registers */
+- if (netif_msg_hw(priv)) {
+- priv->hw->mac->dump_regs(priv->ioaddr);
+- priv->hw->dma->dump_regs(priv->ioaddr);
+- }
+-
+- if (priv->phydev)
+- phy_start(priv->phydev);
+-
+- priv->tx_lpi_timer = STMMAC_DEFAULT_TWT_LS;
+-
+- priv->eee_enabled = stmmac_eee_init(priv);
+-
+- stmmac_init_tx_coalesce(priv);
+-
+- if ((priv->use_riwt) && (priv->hw->dma->rx_watchdog)) {
+- priv->rx_riwt = MAX_DMA_RIWT;
+- priv->hw->dma->rx_watchdog(priv->ioaddr, MAX_DMA_RIWT);
+- }
+-
+- if (priv->pcs && priv->hw->mac->ctrl_ane)
+- priv->hw->mac->ctrl_ane(priv->ioaddr, 0);
+-
+ napi_enable(&priv->napi);
+ netif_start_queue(dev);
+
+--
+1.8.5.5
+