diff options
| -rw-r--r-- | drivers/net/ethernet/ti/davinci_emac.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c index cd9b164a0434..251430450005 100644 --- a/drivers/net/ethernet/ti/davinci_emac.c +++ b/drivers/net/ethernet/ti/davinci_emac.c | |||
| @@ -1532,7 +1532,7 @@ static int emac_dev_open(struct net_device *ndev) | |||
| 1532 | struct device *emac_dev = &ndev->dev; | 1532 | struct device *emac_dev = &ndev->dev; |
| 1533 | u32 cnt; | 1533 | u32 cnt; |
| 1534 | struct resource *res; | 1534 | struct resource *res; |
| 1535 | int ret; | 1535 | int q, m, ret; |
| 1536 | int i = 0; | 1536 | int i = 0; |
| 1537 | int k = 0; | 1537 | int k = 0; |
| 1538 | struct emac_priv *priv = netdev_priv(ndev); | 1538 | struct emac_priv *priv = netdev_priv(ndev); |
| @@ -1567,8 +1567,7 @@ static int emac_dev_open(struct net_device *ndev) | |||
| 1567 | 1567 | ||
| 1568 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { | 1568 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { |
| 1569 | for (i = res->start; i <= res->end; i++) { | 1569 | for (i = res->start; i <= res->end; i++) { |
| 1570 | if (devm_request_irq(&priv->pdev->dev, i, emac_irq, | 1570 | if (request_irq(i, emac_irq, 0, ndev->name, ndev)) |
| 1571 | 0, ndev->name, ndev)) | ||
| 1572 | goto rollback; | 1571 | goto rollback; |
| 1573 | } | 1572 | } |
| 1574 | k++; | 1573 | k++; |
| @@ -1641,7 +1640,15 @@ static int emac_dev_open(struct net_device *ndev) | |||
| 1641 | 1640 | ||
| 1642 | rollback: | 1641 | rollback: |
| 1643 | 1642 | ||
| 1644 | dev_err(emac_dev, "DaVinci EMAC: devm_request_irq() failed"); | 1643 | dev_err(emac_dev, "DaVinci EMAC: request_irq() failed"); |
| 1644 | |||
| 1645 | for (q = k; k >= 0; k--) { | ||
| 1646 | for (m = i; m >= res->start; m--) | ||
| 1647 | free_irq(m, ndev); | ||
| 1648 | res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k-1); | ||
| 1649 | m = res->end; | ||
| 1650 | } | ||
| 1651 | |||
| 1645 | ret = -EBUSY; | 1652 | ret = -EBUSY; |
| 1646 | err: | 1653 | err: |
| 1647 | pm_runtime_put(&priv->pdev->dev); | 1654 | pm_runtime_put(&priv->pdev->dev); |
| @@ -1659,6 +1666,9 @@ err: | |||
| 1659 | */ | 1666 | */ |
| 1660 | static int emac_dev_stop(struct net_device *ndev) | 1667 | static int emac_dev_stop(struct net_device *ndev) |
| 1661 | { | 1668 | { |
| 1669 | struct resource *res; | ||
| 1670 | int i = 0; | ||
| 1671 | int irq_num; | ||
| 1662 | struct emac_priv *priv = netdev_priv(ndev); | 1672 | struct emac_priv *priv = netdev_priv(ndev); |
| 1663 | struct device *emac_dev = &ndev->dev; | 1673 | struct device *emac_dev = &ndev->dev; |
| 1664 | 1674 | ||
| @@ -1674,6 +1684,13 @@ static int emac_dev_stop(struct net_device *ndev) | |||
| 1674 | if (priv->phydev) | 1684 | if (priv->phydev) |
| 1675 | phy_disconnect(priv->phydev); | 1685 | phy_disconnect(priv->phydev); |
| 1676 | 1686 | ||
| 1687 | /* Free IRQ */ | ||
| 1688 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, i))) { | ||
| 1689 | for (irq_num = res->start; irq_num <= res->end; irq_num++) | ||
| 1690 | free_irq(irq_num, priv->ndev); | ||
| 1691 | i++; | ||
| 1692 | } | ||
| 1693 | |||
| 1677 | if (netif_msg_drv(priv)) | 1694 | if (netif_msg_drv(priv)) |
| 1678 | dev_notice(emac_dev, "DaVinci EMAC: %s stopped\n", ndev->name); | 1695 | dev_notice(emac_dev, "DaVinci EMAC: %s stopped\n", ndev->name); |
| 1679 | 1696 | ||
