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: Martin Michlmayr <tbm@cyrius.com>
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>

authored by Francois Romieu and committed by Romieu Francois 3f735b76 6218cf44

+11 -13
+11 -13
drivers/net/tulip/de2104x.c
··· 1362 { 1363 struct de_private *de = dev->priv; 1364 int rc; 1365 - unsigned long flags; 1366 1367 if (netif_msg_ifup(de)) 1368 printk(KERN_DEBUG "%s: enabling interface\n", dev->name); ··· 1375 return rc; 1376 } 1377 1378 - rc = de_init_hw(de); 1379 - if (rc) { 1380 - printk(KERN_ERR "%s: h/w init failure, err=%d\n", 1381 - dev->name, rc); 1382 - goto err_out_free; 1383 - } 1384 1385 rc = request_irq(dev->irq, de_interrupt, SA_SHIRQ, dev->name, dev); 1386 if (rc) { 1387 printk(KERN_ERR "%s: IRQ %d request failure, err=%d\n", 1388 dev->name, dev->irq, rc); 1389 - goto err_out_hw; 1390 } 1391 1392 netif_start_queue(dev); ··· 1396 1397 return 0; 1398 1399 - err_out_hw: 1400 - spin_lock_irqsave(&de->lock, flags); 1401 - de_stop_hw(de); 1402 - spin_unlock_irqrestore(&de->lock, flags); 1403 - 1404 err_out_free: 1405 de_free_rings(de); 1406 return rc;
··· 1362 { 1363 struct de_private *de = dev->priv; 1364 int rc; 1365 1366 if (netif_msg_ifup(de)) 1367 printk(KERN_DEBUG "%s: enabling interface\n", dev->name); ··· 1376 return rc; 1377 } 1378 1379 + dw32(IntrMask, 0); 1380 1381 rc = request_irq(dev->irq, de_interrupt, SA_SHIRQ, dev->name, dev); 1382 if (rc) { 1383 printk(KERN_ERR "%s: IRQ %d request failure, err=%d\n", 1384 dev->name, dev->irq, rc); 1385 + goto err_out_free; 1386 + } 1387 + 1388 + rc = de_init_hw(de); 1389 + if (rc) { 1390 + printk(KERN_ERR "%s: h/w init failure, err=%d\n", 1391 + dev->name, rc); 1392 + goto err_out_free_irq; 1393 } 1394 1395 netif_start_queue(dev); ··· 1395 1396 return 0; 1397 1398 + err_out_free_irq: 1399 + free_irq(dev->irq, dev); 1400 err_out_free: 1401 de_free_rings(de); 1402 return rc;