|
@@ -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.
|