Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f735b76 authored by Francois Romieu's avatar Francois Romieu Committed by Romieu Francois
Browse files

de2104x: prevent interrupt before the interrupt handler is registered



de_init_hw enables the irq thus it must be issued after request_irq.

Signed-off-by: default avatarMartin Michlmayr <tbm@cyrius.com>
Signed-off-by: default avatarFrancois Romieu <romieu@fr.zoreil.com>
parent 6218cf44
Loading
Loading
Loading
Loading
+11 −13
Original line number Original line Diff line number Diff line
@@ -1362,7 +1362,6 @@ static int de_open (struct net_device *dev)
{
{
	struct de_private *de = dev->priv;
	struct de_private *de = dev->priv;
	int rc;
	int rc;
	unsigned long flags;


	if (netif_msg_ifup(de))
	if (netif_msg_ifup(de))
		printk(KERN_DEBUG "%s: enabling interface\n", dev->name);
		printk(KERN_DEBUG "%s: enabling interface\n", dev->name);
@@ -1376,18 +1375,20 @@ static int de_open (struct net_device *dev)
		return rc;
		return rc;
	}
	}


	rc = de_init_hw(de);
	dw32(IntrMask, 0);
	if (rc) {
		printk(KERN_ERR "%s: h/w init failure, err=%d\n",
		       dev->name, rc);
		goto err_out_free;
	}


	rc = request_irq(dev->irq, de_interrupt, SA_SHIRQ, dev->name, dev);
	rc = request_irq(dev->irq, de_interrupt, SA_SHIRQ, dev->name, dev);
	if (rc) {
	if (rc) {
		printk(KERN_ERR "%s: IRQ %d request failure, err=%d\n",
		printk(KERN_ERR "%s: IRQ %d request failure, err=%d\n",
		       dev->name, dev->irq, rc);
		       dev->name, dev->irq, rc);
		goto err_out_hw;
		goto err_out_free;
	}

	rc = de_init_hw(de);
	if (rc) {
		printk(KERN_ERR "%s: h/w init failure, err=%d\n",
		       dev->name, rc);
		goto err_out_free_irq;
	}
	}


	netif_start_queue(dev);
	netif_start_queue(dev);
@@ -1395,11 +1396,8 @@ static int de_open (struct net_device *dev)


	return 0;
	return 0;


err_out_hw:
err_out_free_irq:
	spin_lock_irqsave(&de->lock, flags);
	free_irq(dev->irq, dev);
	de_stop_hw(de);
	spin_unlock_irqrestore(&de->lock, flags);

err_out_free:
err_out_free:
	de_free_rings(de);
	de_free_rings(de);
	return rc;
	return rc;