net: bcmgenet: simplify bcmgenet_init_dma()
authorPetri Gynther <pgynther@google.com>
Wed, 25 Mar 2015 19:35:11 +0000 (12:35 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 27 Mar 2015 21:26:13 +0000 (14:26 -0700)
Do the two kcalloc() calls first, before proceeding into Rx/Tx DMA init.
Makes the error case handling much simpler.

Signed-off-by: Petri Gynther <pgynther@google.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Jaedon Shin <jaedon.shin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/genet/bcmgenet.c

index 550bf98..1c9f9b4 100644 (file)
@@ -2050,9 +2050,6 @@ static int bcmgenet_init_dma(struct bcmgenet_priv *priv)
 
        netif_dbg(priv, hw, priv->dev, "%s\n", __func__);
 
-       /* Init rDma */
-       bcmgenet_rdma_writel(priv, DMA_MAX_BURST_LENGTH, DMA_SCB_BURST_SIZE);
-
        /* Initialize common Rx ring structures */
        priv->rx_bds = priv->base + priv->hw_params->rdma_offset;
        priv->num_rx_bds = TOTAL_DESC;
@@ -2066,25 +2063,13 @@ static int bcmgenet_init_dma(struct bcmgenet_priv *priv)
                cb->bd_addr = priv->rx_bds + i * DMA_DESC_SIZE;
        }
 
-       /* Initialize Rx queues */
-       ret = bcmgenet_init_rx_queues(priv->dev);
-       if (ret) {
-               netdev_err(priv->dev, "failed to initialize Rx queues\n");
-               bcmgenet_free_rx_buffers(priv);
-               kfree(priv->rx_cbs);
-               return ret;
-       }
-
-       /* Init tDma */
-       bcmgenet_tdma_writel(priv, DMA_MAX_BURST_LENGTH, DMA_SCB_BURST_SIZE);
-
        /* Initialize common TX ring structures */
        priv->tx_bds = priv->base + priv->hw_params->tdma_offset;
        priv->num_tx_bds = TOTAL_DESC;
        priv->tx_cbs = kcalloc(priv->num_tx_bds, sizeof(struct enet_cb),
                               GFP_KERNEL);
        if (!priv->tx_cbs) {
-               __bcmgenet_fini_dma(priv);
+               kfree(priv->rx_cbs);
                return -ENOMEM;
        }
 
@@ -2093,6 +2078,22 @@ static int bcmgenet_init_dma(struct bcmgenet_priv *priv)
                cb->bd_addr = priv->tx_bds + i * DMA_DESC_SIZE;
        }
 
+       /* Init rDma */
+       bcmgenet_rdma_writel(priv, DMA_MAX_BURST_LENGTH, DMA_SCB_BURST_SIZE);
+
+       /* Initialize Rx queues */
+       ret = bcmgenet_init_rx_queues(priv->dev);
+       if (ret) {
+               netdev_err(priv->dev, "failed to initialize Rx queues\n");
+               bcmgenet_free_rx_buffers(priv);
+               kfree(priv->rx_cbs);
+               kfree(priv->tx_cbs);
+               return ret;
+       }
+
+       /* Init tDma */
+       bcmgenet_tdma_writel(priv, DMA_MAX_BURST_LENGTH, DMA_SCB_BURST_SIZE);
+
        /* Initialize Tx queues */
        bcmgenet_init_tx_queues(priv->dev);