]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/wireless/ath/carl9170/main.c
carl9170: fix sleep in softirq context
[karo-tx-linux.git] / drivers / net / wireless / ath / carl9170 / main.c
index 67997b39aba79f0d14c47ffdbe4e85248bece20b..25a1e2f4f73862fb9bc26f6310d87bb3d51b6cf5 100644 (file)
@@ -465,27 +465,26 @@ static void carl9170_restart_work(struct work_struct *work)
 {
        struct ar9170 *ar = container_of(work, struct ar9170,
                                         restart_work);
-       int err;
+       int err = -EIO;
 
        ar->usedkeys = 0;
        ar->filter_state = 0;
        carl9170_cancel_worker(ar);
 
        mutex_lock(&ar->mutex);
-       err = carl9170_usb_restart(ar);
-       if (net_ratelimit()) {
-               if (err) {
-                       dev_err(&ar->udev->dev, "Failed to restart device "
-                               " (%d).\n", err);
-                } else {
-                       dev_info(&ar->udev->dev, "device restarted "
-                                "successfully.\n");
+       if (!ar->force_usb_reset) {
+               err = carl9170_usb_restart(ar);
+               if (net_ratelimit()) {
+                       if (err)
+                               dev_err(&ar->udev->dev, "Failed to restart device (%d).\n", err);
+                       else
+                               dev_info(&ar->udev->dev, "device restarted successfully.\n");
                }
        }
-
        carl9170_zap_queues(ar);
        mutex_unlock(&ar->mutex);
-       if (!err) {
+
+       if (!err && !ar->force_usb_reset) {
                ar->restart_counter++;
                atomic_set(&ar->pending_restarts, 0);
 
@@ -526,10 +525,10 @@ void carl9170_restart(struct ar9170 *ar, const enum carl9170_restart_reasons r)
        if (!ar->registered)
                return;
 
-       if (IS_ACCEPTING_CMD(ar) && !ar->needs_full_reset)
-               ieee80211_queue_work(ar->hw, &ar->restart_work);
-       else
-               carl9170_usb_reset(ar);
+       if (!IS_ACCEPTING_CMD(ar) || ar->needs_full_reset)
+               ar->force_usb_reset = true;
+
+       ieee80211_queue_work(ar->hw, &ar->restart_work);
 
        /*
         * At this point, the device instance might have vanished/disabled.