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.Sell@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
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)
if (response)
goto call_serverdown;
+ rtnl_unlock();
+
return;
call_serverdown:
visornic_serverdown(devdata, NULL);
+ rtnl_unlock();
}
/**