Skip to content

Commit

Permalink
libertas: terminate scan when stopping interface
Browse files Browse the repository at this point in the history
There are currently no provisions in place to ensure that the scanning
task has been stopped when the interface is stopped or removed.

This can result in a WARNING at net/wireless/core.c:643 and other badness
when you remove the module while a scan is happening.

Terminate the scanning task during interface stop.

Signed-off-by: Daniel Drake <dsd@laptop.org>
Acked-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Daniel Drake authored and John W. Linville committed Nov 8, 2010
1 parent 352ffad commit 2e30168
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 2 deletions.
5 changes: 3 additions & 2 deletions drivers/net/wireless/libertas/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -700,8 +700,9 @@ static void lbs_scan_worker(struct work_struct *work)

if (priv->scan_channel < priv->scan_req->n_channels) {
cancel_delayed_work(&priv->scan_work);
queue_delayed_work(priv->work_thread, &priv->scan_work,
msecs_to_jiffies(300));
if (!priv->stopping)
queue_delayed_work(priv->work_thread, &priv->scan_work,
msecs_to_jiffies(300));
}

/* This is the final data we are about to send */
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/libertas/dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ struct lbs_private {
/* CFG80211 */
struct wireless_dev *wdev;
bool wiphy_registered;
bool stopping;
struct cfg80211_scan_request *scan_req;
u8 assoc_bss[ETH_ALEN];
u8 disassoc_reason;
Expand Down
7 changes: 7 additions & 0 deletions drivers/net/wireless/libertas/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ static int lbs_dev_open(struct net_device *dev)
lbs_deb_enter(LBS_DEB_NET);

spin_lock_irq(&priv->driver_lock);
priv->stopping = false;

if (priv->connect_status == LBS_CONNECTED)
netif_carrier_on(dev);
Expand Down Expand Up @@ -131,10 +132,16 @@ static int lbs_eth_stop(struct net_device *dev)
lbs_deb_enter(LBS_DEB_NET);

spin_lock_irq(&priv->driver_lock);
priv->stopping = true;
netif_stop_queue(dev);
spin_unlock_irq(&priv->driver_lock);

schedule_work(&priv->mcast_work);
cancel_delayed_work_sync(&priv->scan_work);
if (priv->scan_req) {
cfg80211_scan_done(priv->scan_req, false);
priv->scan_req = NULL;
}

lbs_deb_leave(LBS_DEB_NET);
return 0;
Expand Down

0 comments on commit 2e30168

Please sign in to comment.