stmmac: fix open funct when exit on error
This patch reviews the open function and fixes some errors when exit with an error state. It also moves the request_irq after core is initialized when interrupts are properly masked. Signed-off-by: Shiraz Hashim <shiraz.hashim@st.com> Hacked-by: Giuseppe Cavallaro <peppe.cavallaro@st.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
bded18c2dd
commit
f66ffe2859
@ -781,21 +781,6 @@ static int stmmac_open(struct net_device *dev)
|
||||
|
||||
stmmac_verify_args();
|
||||
|
||||
ret = stmmac_init_phy(dev);
|
||||
if (unlikely(ret)) {
|
||||
pr_err("%s: Cannot attach to PHY (error: %d)\n", __func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Request the IRQ lines */
|
||||
ret = request_irq(dev->irq, stmmac_interrupt,
|
||||
IRQF_SHARED, dev->name, dev);
|
||||
if (unlikely(ret < 0)) {
|
||||
pr_err("%s: ERROR: allocating the IRQ %d (error: %d)\n",
|
||||
__func__, dev->irq, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_STMMAC_TIMER
|
||||
priv->tm = kzalloc(sizeof(struct stmmac_timer *), GFP_KERNEL);
|
||||
if (unlikely(priv->tm == NULL)) {
|
||||
@ -814,6 +799,11 @@ static int stmmac_open(struct net_device *dev)
|
||||
} else
|
||||
priv->tm->enable = 1;
|
||||
#endif
|
||||
ret = stmmac_init_phy(dev);
|
||||
if (unlikely(ret)) {
|
||||
pr_err("%s: Cannot attach to PHY (error: %d)\n", __func__, ret);
|
||||
goto open_error;
|
||||
}
|
||||
|
||||
/* Create and initialize the TX/RX descriptors chains. */
|
||||
priv->dma_tx_size = STMMAC_ALIGN(dma_txsize);
|
||||
@ -822,12 +812,11 @@ static int stmmac_open(struct net_device *dev)
|
||||
init_dma_desc_rings(dev);
|
||||
|
||||
/* DMA initialization and SW reset */
|
||||
if (unlikely(priv->hw->dma->init(priv->ioaddr, priv->plat->pbl,
|
||||
priv->dma_tx_phy,
|
||||
priv->dma_rx_phy) < 0)) {
|
||||
|
||||
ret = priv->hw->dma->init(priv->ioaddr, priv->plat->pbl,
|
||||
priv->dma_tx_phy, priv->dma_rx_phy);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: DMA initialization failed\n", __func__);
|
||||
return -1;
|
||||
goto open_error;
|
||||
}
|
||||
|
||||
/* Copy the MAC addr into the HW */
|
||||
@ -848,6 +837,15 @@ static int stmmac_open(struct net_device *dev)
|
||||
writel(0xffffffff, priv->ioaddr + MMC_HIGH_INTR_MASK);
|
||||
writel(0xffffffff, priv->ioaddr + MMC_LOW_INTR_MASK);
|
||||
|
||||
/* Request the IRQ lines */
|
||||
ret = request_irq(dev->irq, stmmac_interrupt,
|
||||
IRQF_SHARED, dev->name, dev);
|
||||
if (unlikely(ret < 0)) {
|
||||
pr_err("%s: ERROR: allocating the IRQ %d (error: %d)\n",
|
||||
__func__, dev->irq, ret);
|
||||
goto open_error;
|
||||
}
|
||||
|
||||
/* Enable the MAC Rx/Tx */
|
||||
stmmac_enable_mac(priv->ioaddr);
|
||||
|
||||
@ -878,7 +876,17 @@ static int stmmac_open(struct net_device *dev)
|
||||
napi_enable(&priv->napi);
|
||||
skb_queue_head_init(&priv->rx_recycle);
|
||||
netif_start_queue(dev);
|
||||
|
||||
return 0;
|
||||
|
||||
open_error:
|
||||
#ifdef CONFIG_STMMAC_TIMER
|
||||
kfree(priv->tm);
|
||||
#endif
|
||||
if (priv->phydev)
|
||||
phy_disconnect(priv->phydev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user