aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/net/ethernet/faraday
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2017-04-05 12:28:49 +1000
committerDavid S. Miller <davem@davemloft.net>2017-04-06 12:38:04 -0700
commitda40d9d4b5932d27d8cf3fea685d4cd466b88ec3 (patch)
tree4af0e06087cec827ec5321f428a2e3fae4827694 /drivers/net/ethernet/faraday
parentftgmac100: Request the interrupt only after HW is reset (diff)
downloadwireguard-linux-da40d9d4b5932d27d8cf3fea685d4cd466b88ec3.tar.xz
wireguard-linux-da40d9d4b5932d27d8cf3fea685d4cd466b88ec3.zip
ftgmac100: Move the bulk of inits to a separate function
The link monitoring and error handling code will have to redo the ring inits and HW setup so move the code out of ftgmac100_open() into a dedicated function. This forces a bit of re-ordering of ftgmac100_open() but nothing dramatic. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/faraday')
-rw-r--r--drivers/net/ethernet/faraday/ftgmac100.c71
1 files changed, 42 insertions, 29 deletions
diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
index 09d06e2b78bd..7f46d9c18f11 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.c
+++ b/drivers/net/ethernet/faraday/ftgmac100.c
@@ -1111,10 +1111,35 @@ static int ftgmac100_poll(struct napi_struct *napi, int budget)
return rx;
}
+static int ftgmac100_init_all(struct ftgmac100 *priv, bool ignore_alloc_err)
+{
+ int err = 0;
+
+ /* Re-init descriptors (adjust queue sizes) */
+ ftgmac100_init_rings(priv);
+
+ /* Realloc rx descriptors */
+ err = ftgmac100_alloc_rx_buffers(priv);
+ if (err && !ignore_alloc_err)
+ return err;
+
+ /* Reinit and restart HW */
+ ftgmac100_init_hw(priv);
+ ftgmac100_start_hw(priv);
+
+ /* Re-enable the device */
+ napi_enable(&priv->napi);
+ netif_start_queue(priv->netdev);
+
+ /* Enable all interrupts */
+ iowrite32(priv->int_mask_all, priv->base + FTGMAC100_OFFSET_IER);
+
+ return err;
+}
+
static int ftgmac100_open(struct net_device *netdev)
{
struct ftgmac100 *priv = netdev_priv(netdev);
- unsigned int status;
int err;
/* Allocate ring buffers */
@@ -1124,13 +1149,6 @@ static int ftgmac100_open(struct net_device *netdev)
return err;
}
- /* Initialize the rings */
- ftgmac100_init_rings(priv);
-
- /* Allocate receive buffers */
- if (ftgmac100_alloc_rx_buffers(priv))
- goto err_alloc;
-
/* When using NC-SI we force the speed to 100Mbit/s full duplex,
*
* Otherwise we leave it set to 0 (no link), the link
@@ -1164,26 +1182,21 @@ static int ftgmac100_open(struct net_device *netdev)
goto err_irq;
}
- ftgmac100_init_hw(priv);
- ftgmac100_start_hw(priv);
-
- /* Clear stale interrupts */
- status = ioread32(priv->base + FTGMAC100_OFFSET_ISR);
- iowrite32(status, priv->base + FTGMAC100_OFFSET_ISR);
+ /* Start things up */
+ err = ftgmac100_init_all(priv, false);
+ if (err) {
+ netdev_err(netdev, "Failed to allocate packet buffers\n");
+ goto err_alloc;
+ }
- if (netdev->phydev)
+ if (netdev->phydev) {
+ /* If we have a PHY, start polling */
phy_start(netdev->phydev);
- else if (priv->use_ncsi)
+ } else if (priv->use_ncsi) {
+ /* If using NC-SI, set our carrier on and start the stack */
netif_carrier_on(netdev);
- napi_enable(&priv->napi);
- netif_start_queue(netdev);
-
- /* enable all interrupts */
- iowrite32(priv->int_mask_all, priv->base + FTGMAC100_OFFSET_IER);
-
- /* Start the NCSI device */
- if (priv->use_ncsi) {
+ /* Start the NCSI device */
err = ncsi_start_dev(priv->ndev);
if (err)
goto err_ncsi;
@@ -1191,16 +1204,16 @@ static int ftgmac100_open(struct net_device *netdev)
return 0;
-err_ncsi:
+ err_ncsi:
napi_disable(&priv->napi);
netif_stop_queue(netdev);
+ err_alloc:
+ ftgmac100_free_buffers(priv);
free_irq(netdev->irq, netdev);
-err_irq:
+ err_irq:
netif_napi_del(&priv->napi);
-err_hw:
-err_alloc:
+ err_hw:
iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
- ftgmac100_free_buffers(priv);
ftgmac100_free_rings(priv);
return err;
}