From: Tim Sell <timothy.s...@unisys.com>

visornic tx reset handling is done asynchronously via a workqueue in
visornic_timeout_reset().  As a result, it needs to use rtnl_lock() /
rtnl_unlock() to lock against possible simultaneous close() of the network
device.

(I consulted the bnx2 driver as a model here, as that driver also does
its tx reset handling asynchronously, just like visornic does.  See
bnx2_tx_timeout() and bnx2_reset_task().)

Signed-off-by: Tim Sell <timothy.s...@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.ro...@unisys.com>
---
 drivers/staging/unisys/visornic/visornic_main.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/staging/unisys/visornic/visornic_main.c 
b/drivers/staging/unisys/visornic/visornic_main.c
index 8d600fa..7541c49 100644
--- a/drivers/staging/unisys/visornic/visornic_main.c
+++ b/drivers/staging/unisys/visornic/visornic_main.c
@@ -719,6 +719,12 @@ visornic_timeout_reset(struct work_struct *work)
        devdata = container_of(work, struct visornic_devdata, timeout_reset);
        netdev = devdata->netdev;
 
+       rtnl_lock();
+       if (!netif_running(netdev)) {
+               rtnl_unlock();
+               return;
+       }
+
        response = visornic_disable_with_timeout(netdev,
                                                 VISORNIC_INFINITE_RSP_WAIT);
        if (response)
@@ -729,10 +735,13 @@ visornic_timeout_reset(struct work_struct *work)
        if (response)
                goto call_serverdown;
 
+       rtnl_unlock();
+
        return;
 
 call_serverdown:
        visornic_serverdown(devdata, NULL);
+       rtnl_unlock();
 }
 
 /**
-- 
2.1.4

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to