Fix hard reset of alix/soekris hardware under heavy NIC load
[openwrt/svn-archive/archive.git] / target / linux / x86 / patches-3.3 / 003-via-rhine-crash-fix.patch
1 --- a/drivers/net/ethernet/via/via-rhine.c
2 +++ b/drivers/net/ethernet/via/via-rhine.c
3 @@ -689,9 +689,12 @@ static void __devinit rhine_reload_eepro
4 #ifdef CONFIG_NET_POLL_CONTROLLER
5 static void rhine_poll(struct net_device *dev)
6 {
7 - disable_irq(dev->irq);
8 - rhine_interrupt(dev->irq, (void *)dev);
9 - enable_irq(dev->irq);
10 + struct rhine_private *rp = netdev_priv(dev);
11 + const int irq = rp->pdev->irq;
12 +
13 + disable_irq(irq);
14 + rhine_interrupt(irq, dev);
15 + enable_irq(irq);
16 }
17 #endif
18
19 @@ -929,7 +932,6 @@ static int __devinit rhine_init_one(stru
20 dev = alloc_etherdev(sizeof(struct rhine_private));
21 if (!dev) {
22 rc = -ENOMEM;
23 - dev_err(&pdev->dev, "alloc_etherdev failed\n");
24 goto err_out;
25 }
26 SET_NETDEV_DEV(dev, &pdev->dev);
27 @@ -973,7 +975,6 @@ static int __devinit rhine_init_one(stru
28 }
29 #endif /* USE_MMIO */
30
31 - dev->base_addr = (unsigned long)ioaddr;
32 rp->base = ioaddr;
33
34 /* Get chip registers into a sane state */
35 @@ -996,8 +997,6 @@ static int __devinit rhine_init_one(stru
36 if (!phy_id)
37 phy_id = ioread8(ioaddr + 0x6C);
38
39 - dev->irq = pdev->irq;
40 -
41 spin_lock_init(&rp->lock);
42 mutex_init(&rp->task_lock);
43 INIT_WORK(&rp->reset_task, rhine_reset_task);
44 @@ -1158,7 +1157,6 @@ static void alloc_rbufs(struct net_devic
45 rp->rx_skbuff[i] = skb;
46 if (skb == NULL)
47 break;
48 - skb->dev = dev; /* Mark as being used by this device. */
49
50 rp->rx_skbuff_dma[i] =
51 pci_map_single(rp->pdev, skb->data, rp->rx_buf_sz,
52 @@ -1943,7 +1941,6 @@ static int rhine_rx(struct net_device *d
53 rp->rx_skbuff[entry] = skb;
54 if (skb == NULL)
55 break; /* Better luck next round. */
56 - skb->dev = dev; /* Mark as being used by this device. */
57 rp->rx_skbuff_dma[entry] =
58 pci_map_single(rp->pdev, skb->data,
59 rp->rx_buf_sz,
60