diff options
Diffstat (limited to 'net/wireless/core.c')
-rw-r--r-- | net/wireless/core.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/net/wireless/core.c b/net/wireless/core.c index e630648fef79..35d83bedfe5b 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c | |||
@@ -601,8 +601,8 @@ void wiphy_unregister(struct wiphy *wiphy) | |||
601 | 601 | ||
602 | mutex_unlock(&cfg80211_mutex); | 602 | mutex_unlock(&cfg80211_mutex); |
603 | 603 | ||
604 | flush_work(&rdev->scan_done_wk); | ||
604 | cancel_work_sync(&rdev->conn_work); | 605 | cancel_work_sync(&rdev->conn_work); |
605 | cancel_work_sync(&rdev->scan_done_wk); | ||
606 | kfree(rdev->scan_req); | 606 | kfree(rdev->scan_req); |
607 | flush_work(&rdev->event_work); | 607 | flush_work(&rdev->event_work); |
608 | } | 608 | } |
@@ -728,6 +728,13 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb, | |||
728 | #endif | 728 | #endif |
729 | break; | 729 | break; |
730 | case NETDEV_UNREGISTER: | 730 | case NETDEV_UNREGISTER: |
731 | cfg80211_lock_rdev(rdev); | ||
732 | |||
733 | if (WARN_ON(rdev->scan_req && rdev->scan_req->dev == dev)) { | ||
734 | rdev->scan_req->aborted = true; | ||
735 | ___cfg80211_scan_done(rdev); | ||
736 | } | ||
737 | |||
731 | mutex_lock(&rdev->devlist_mtx); | 738 | mutex_lock(&rdev->devlist_mtx); |
732 | /* | 739 | /* |
733 | * It is possible to get NETDEV_UNREGISTER | 740 | * It is possible to get NETDEV_UNREGISTER |
@@ -746,6 +753,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb, | |||
746 | #endif | 753 | #endif |
747 | } | 754 | } |
748 | mutex_unlock(&rdev->devlist_mtx); | 755 | mutex_unlock(&rdev->devlist_mtx); |
756 | cfg80211_unlock_rdev(rdev); | ||
749 | break; | 757 | break; |
750 | case NETDEV_PRE_UP: | 758 | case NETDEV_PRE_UP: |
751 | if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype))) | 759 | if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype))) |