diff options
Diffstat (limited to 'drivers/net/3c59x.c')
| -rw-r--r-- | drivers/net/3c59x.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index 39db0e96815d..43dcc787a176 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c | |||
| @@ -797,9 +797,9 @@ static void poll_vortex(struct net_device *dev) | |||
| 797 | { | 797 | { |
| 798 | struct vortex_private *vp = netdev_priv(dev); | 798 | struct vortex_private *vp = netdev_priv(dev); |
| 799 | unsigned long flags; | 799 | unsigned long flags; |
| 800 | local_irq_save(flags); | 800 | local_irq_save_nort(flags); |
| 801 | (vp->full_bus_master_rx ? boomerang_interrupt:vortex_interrupt)(dev->irq,dev); | 801 | (vp->full_bus_master_rx ? boomerang_interrupt:vortex_interrupt)(dev->irq,dev); |
| 802 | local_irq_restore(flags); | 802 | local_irq_restore_nort(flags); |
| 803 | } | 803 | } |
| 804 | #endif | 804 | #endif |
| 805 | 805 | ||
| @@ -1764,6 +1764,7 @@ vortex_timer(unsigned long data) | |||
| 1764 | int next_tick = 60*HZ; | 1764 | int next_tick = 60*HZ; |
| 1765 | int ok = 0; | 1765 | int ok = 0; |
| 1766 | int media_status, old_window; | 1766 | int media_status, old_window; |
| 1767 | unsigned long flags; | ||
| 1767 | 1768 | ||
| 1768 | if (vortex_debug > 2) { | 1769 | if (vortex_debug > 2) { |
| 1769 | pr_debug("%s: Media selection timer tick happened, %s.\n", | 1770 | pr_debug("%s: Media selection timer tick happened, %s.\n", |
| @@ -1771,7 +1772,7 @@ vortex_timer(unsigned long data) | |||
| 1771 | pr_debug("dev->watchdog_timeo=%d\n", dev->watchdog_timeo); | 1772 | pr_debug("dev->watchdog_timeo=%d\n", dev->watchdog_timeo); |
| 1772 | } | 1773 | } |
| 1773 | 1774 | ||
| 1774 | disable_irq_lockdep(dev->irq); | 1775 | spin_lock_irqsave(&vp->lock, flags); |
| 1775 | old_window = ioread16(ioaddr + EL3_CMD) >> 13; | 1776 | old_window = ioread16(ioaddr + EL3_CMD) >> 13; |
| 1776 | EL3WINDOW(4); | 1777 | EL3WINDOW(4); |
| 1777 | media_status = ioread16(ioaddr + Wn4_Media); | 1778 | media_status = ioread16(ioaddr + Wn4_Media); |
| @@ -1794,10 +1795,7 @@ vortex_timer(unsigned long data) | |||
| 1794 | case XCVR_MII: case XCVR_NWAY: | 1795 | case XCVR_MII: case XCVR_NWAY: |
| 1795 | { | 1796 | { |
| 1796 | ok = 1; | 1797 | ok = 1; |
| 1797 | /* Interrupts are already disabled */ | ||
| 1798 | spin_lock(&vp->lock); | ||
| 1799 | vortex_check_media(dev, 0); | 1798 | vortex_check_media(dev, 0); |
| 1800 | spin_unlock(&vp->lock); | ||
| 1801 | } | 1799 | } |
| 1802 | break; | 1800 | break; |
| 1803 | default: /* Other media types handled by Tx timeouts. */ | 1801 | default: /* Other media types handled by Tx timeouts. */ |
| @@ -1851,7 +1849,7 @@ leave_media_alone: | |||
| 1851 | dev->name, media_tbl[dev->if_port].name); | 1849 | dev->name, media_tbl[dev->if_port].name); |
| 1852 | 1850 | ||
| 1853 | EL3WINDOW(old_window); | 1851 | EL3WINDOW(old_window); |
| 1854 | enable_irq_lockdep(dev->irq); | 1852 | spin_unlock_irqrestore(&vp->lock, flags); |
| 1855 | mod_timer(&vp->timer, RUN_AT(next_tick)); | 1853 | mod_timer(&vp->timer, RUN_AT(next_tick)); |
| 1856 | if (vp->deferred) | 1854 | if (vp->deferred) |
| 1857 | iowrite16(FakeIntr, ioaddr + EL3_CMD); | 1855 | iowrite16(FakeIntr, ioaddr + EL3_CMD); |
| @@ -1885,12 +1883,12 @@ static void vortex_tx_timeout(struct net_device *dev) | |||
| 1885 | * Block interrupts because vortex_interrupt does a bare spin_lock() | 1883 | * Block interrupts because vortex_interrupt does a bare spin_lock() |
| 1886 | */ | 1884 | */ |
| 1887 | unsigned long flags; | 1885 | unsigned long flags; |
| 1888 | local_irq_save(flags); | 1886 | local_irq_save_nort(flags); |
| 1889 | if (vp->full_bus_master_tx) | 1887 | if (vp->full_bus_master_tx) |
| 1890 | boomerang_interrupt(dev->irq, dev); | 1888 | boomerang_interrupt(dev->irq, dev); |
| 1891 | else | 1889 | else |
| 1892 | vortex_interrupt(dev->irq, dev); | 1890 | vortex_interrupt(dev->irq, dev); |
| 1893 | local_irq_restore(flags); | 1891 | local_irq_restore_nort(flags); |
| 1894 | } | 1892 | } |
| 1895 | } | 1893 | } |
| 1896 | 1894 | ||
