projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
libata bugfix: HDIO_DRIVE_TASK
[powerpc.git]
/
drivers
/
net
/
r8169.c
diff --git
a/drivers/net/r8169.c
b/drivers/net/r8169.c
index
5598d86
..
13cf06e
100644
(file)
--- a/
drivers/net/r8169.c
+++ b/
drivers/net/r8169.c
@@
-1733,6
+1733,8
@@
rtl8169_remove_one(struct pci_dev *pdev)
assert(dev != NULL);
assert(tp != NULL);
assert(dev != NULL);
assert(tp != NULL);
+ flush_scheduled_work();
+
unregister_netdev(dev);
rtl8169_release_board(pdev, dev, tp->mmio_addr);
pci_set_drvdata(pdev, NULL);
unregister_netdev(dev);
rtl8169_release_board(pdev, dev, tp->mmio_addr);
pci_set_drvdata(pdev, NULL);
@@
-2161,10
+2163,13
@@
static void rtl8169_reinit_task(struct work_struct *work)
struct net_device *dev = tp->dev;
int ret;
struct net_device *dev = tp->dev;
int ret;
- if (netif_running(dev)) {
- rtl8169_wait_for_quiescence(dev);
- rtl8169_close(dev);
- }
+ rtnl_lock();
+
+ if (!netif_running(dev))
+ goto out_unlock;
+
+ rtl8169_wait_for_quiescence(dev);
+ rtl8169_close(dev);
ret = rtl8169_open(dev);
if (unlikely(ret < 0)) {
ret = rtl8169_open(dev);
if (unlikely(ret < 0)) {
@@
-2179,6
+2184,9
@@
static void rtl8169_reinit_task(struct work_struct *work)
}
rtl8169_schedule_work(dev, rtl8169_reinit_task);
}
}
rtl8169_schedule_work(dev, rtl8169_reinit_task);
}
+
+out_unlock:
+ rtnl_unlock();
}
static void rtl8169_reset_task(struct work_struct *work)
}
static void rtl8169_reset_task(struct work_struct *work)
@@
-2187,8
+2195,10
@@
static void rtl8169_reset_task(struct work_struct *work)
container_of(work, struct rtl8169_private, task.work);
struct net_device *dev = tp->dev;
container_of(work, struct rtl8169_private, task.work);
struct net_device *dev = tp->dev;
+ rtnl_lock();
+
if (!netif_running(dev))
if (!netif_running(dev))
-
return
;
+
goto out_unlock
;
rtl8169_wait_for_quiescence(dev);
rtl8169_wait_for_quiescence(dev);
@@
-2210,6
+2220,9
@@
static void rtl8169_reset_task(struct work_struct *work)
}
rtl8169_schedule_work(dev, rtl8169_reset_task);
}
}
rtl8169_schedule_work(dev, rtl8169_reset_task);
}
+
+out_unlock:
+ rtnl_unlock();
}
static void rtl8169_tx_timeout(struct net_device *dev)
}
static void rtl8169_tx_timeout(struct net_device *dev)
@@
-2722,8
+2735,6
@@
static void rtl8169_down(struct net_device *dev)
netif_stop_queue(dev);
netif_stop_queue(dev);
- flush_scheduled_work();
-
core_down:
spin_lock_irq(&tp->lock);
core_down:
spin_lock_irq(&tp->lock);