Commit 4404323c authored by Timur Tabi's avatar Timur Tabi Committed by David S. Miller

net: qcom/emac: claim the irq only when the device is opened

During reset, functions emac_mac_down() and emac_mac_up() are called,
so we don't want to free and claim the IRQ unnecessarily.  Move those
operations to open/close.
Signed-off-by: default avatarTimur Tabi <timur@codeaurora.org>
Reviewed-by: default avatarLino Sanfilippo <LinoSanfilippo@gmx.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 41c1093f
...@@ -314,8 +314,6 @@ struct emac_skb_cb { ...@@ -314,8 +314,6 @@ struct emac_skb_cb {
RX_PKT_INT2 |\ RX_PKT_INT2 |\
RX_PKT_INT3) RX_PKT_INT3)
#define EMAC_MAC_IRQ_RES "core0"
void emac_mac_multicast_addr_set(struct emac_adapter *adpt, u8 *addr) void emac_mac_multicast_addr_set(struct emac_adapter *adpt, u8 *addr)
{ {
u32 crc32, bit, reg, mta; u32 crc32, bit, reg, mta;
...@@ -977,26 +975,16 @@ static void emac_adjust_link(struct net_device *netdev) ...@@ -977,26 +975,16 @@ static void emac_adjust_link(struct net_device *netdev)
int emac_mac_up(struct emac_adapter *adpt) int emac_mac_up(struct emac_adapter *adpt)
{ {
struct net_device *netdev = adpt->netdev; struct net_device *netdev = adpt->netdev;
struct emac_irq *irq = &adpt->irq;
int ret; int ret;
emac_mac_rx_tx_ring_reset_all(adpt); emac_mac_rx_tx_ring_reset_all(adpt);
emac_mac_config(adpt); emac_mac_config(adpt);
ret = request_irq(irq->irq, emac_isr, 0, EMAC_MAC_IRQ_RES, irq);
if (ret) {
netdev_err(adpt->netdev, "could not request %s irq\n",
EMAC_MAC_IRQ_RES);
return ret;
}
emac_mac_rx_descs_refill(adpt, &adpt->rx_q); emac_mac_rx_descs_refill(adpt, &adpt->rx_q);
ret = phy_connect_direct(netdev, adpt->phydev, emac_adjust_link, ret = phy_connect_direct(netdev, adpt->phydev, emac_adjust_link,
PHY_INTERFACE_MODE_SGMII); PHY_INTERFACE_MODE_SGMII);
if (ret) { if (ret) {
netdev_err(adpt->netdev, "could not connect phy\n"); netdev_err(adpt->netdev, "could not connect phy\n");
free_irq(irq->irq, irq);
return ret; return ret;
} }
...@@ -1030,7 +1018,6 @@ void emac_mac_down(struct emac_adapter *adpt) ...@@ -1030,7 +1018,6 @@ void emac_mac_down(struct emac_adapter *adpt)
writel(DIS_INT, adpt->base + EMAC_INT_STATUS); writel(DIS_INT, adpt->base + EMAC_INT_STATUS);
writel(0, adpt->base + EMAC_INT_MASK); writel(0, adpt->base + EMAC_INT_MASK);
synchronize_irq(adpt->irq.irq); synchronize_irq(adpt->irq.irq);
free_irq(adpt->irq.irq, &adpt->irq);
phy_disconnect(adpt->phydev); phy_disconnect(adpt->phydev);
......
...@@ -256,18 +256,27 @@ static int emac_change_mtu(struct net_device *netdev, int new_mtu) ...@@ -256,18 +256,27 @@ static int emac_change_mtu(struct net_device *netdev, int new_mtu)
static int emac_open(struct net_device *netdev) static int emac_open(struct net_device *netdev)
{ {
struct emac_adapter *adpt = netdev_priv(netdev); struct emac_adapter *adpt = netdev_priv(netdev);
struct emac_irq *irq = &adpt->irq;
int ret; int ret;
ret = request_irq(irq->irq, emac_isr, 0, "emac-core0", irq);
if (ret) {
netdev_err(adpt->netdev, "could not request emac-core0 irq\n");
return ret;
}
/* allocate rx/tx dma buffer & descriptors */ /* allocate rx/tx dma buffer & descriptors */
ret = emac_mac_rx_tx_rings_alloc_all(adpt); ret = emac_mac_rx_tx_rings_alloc_all(adpt);
if (ret) { if (ret) {
netdev_err(adpt->netdev, "error allocating rx/tx rings\n"); netdev_err(adpt->netdev, "error allocating rx/tx rings\n");
free_irq(irq->irq, irq);
return ret; return ret;
} }
ret = emac_mac_up(adpt); ret = emac_mac_up(adpt);
if (ret) { if (ret) {
emac_mac_rx_tx_rings_free_all(adpt); emac_mac_rx_tx_rings_free_all(adpt);
free_irq(irq->irq, irq);
return ret; return ret;
} }
...@@ -286,6 +295,8 @@ static int emac_close(struct net_device *netdev) ...@@ -286,6 +295,8 @@ static int emac_close(struct net_device *netdev)
emac_mac_down(adpt); emac_mac_down(adpt);
emac_mac_rx_tx_rings_free_all(adpt); emac_mac_rx_tx_rings_free_all(adpt);
free_irq(adpt->irq.irq, &adpt->irq);
mutex_unlock(&adpt->reset_lock); mutex_unlock(&adpt->reset_lock);
return 0; return 0;
......
...@@ -331,7 +331,6 @@ struct emac_adapter { ...@@ -331,7 +331,6 @@ struct emac_adapter {
int emac_reinit_locked(struct emac_adapter *adpt); int emac_reinit_locked(struct emac_adapter *adpt);
void emac_reg_update32(void __iomem *addr, u32 mask, u32 val); void emac_reg_update32(void __iomem *addr, u32 mask, u32 val);
irqreturn_t emac_isr(int irq, void *data);
void emac_set_ethtool_ops(struct net_device *netdev); void emac_set_ethtool_ops(struct net_device *netdev);
void emac_update_hw_stats(struct emac_adapter *adpt); void emac_update_hw_stats(struct emac_adapter *adpt);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment