if (no_fw_recovery)
                return;
 
+       /* increment @recovery_count if less then WIL6210_FW_RECOVERY_TO
+        * passed since last recovery attempt
+        */
+       if (time_is_after_jiffies(wil->last_fw_recovery +
+                                 WIL6210_FW_RECOVERY_TO))
+               wil->recovery_count++;
+       else
+               wil->recovery_count = 1; /* fw was alive for a long time */
+
+       if (wil->recovery_count > WIL6210_FW_RECOVERY_RETRIES) {
+               wil_err(wil, "too many recovery attempts (%d), giving up\n",
+                       wil->recovery_count);
+               return;
+       }
+
+       wil->last_fw_recovery = jiffies;
+
        mutex_lock(&wil->mutex);
        switch (wdev->iftype) {
        case NL80211_IFTYPE_STATION:
        case NL80211_IFTYPE_P2P_CLIENT:
        case NL80211_IFTYPE_MONITOR:
-               wil_info(wil, "fw error recovery started...\n");
+               wil_info(wil, "fw error recovery started (try %d)...\n",
+                        wil->recovery_count);
                wil_reset(wil);
 
                /* need to re-allocate Rx ring after reset */
                return -EAGAIN;
        }
 
+       wil->last_fw_recovery = jiffies;
+
        return 0;
 }
 
 
 #define WIL6210_MAX_CID                (8) /* HW limit */
 #define WIL6210_NAPI_BUDGET    (16) /* arbitrary */
 #define WIL6210_ITR_TRSH       (10000) /* arbitrary - about 15 IRQs/msec */
+#define WIL6210_FW_RECOVERY_RETRIES    (5) /* try to recover this many times */
+#define WIL6210_FW_RECOVERY_TO msecs_to_jiffies(5000)
 
 /* Hardware definitions begin */
 
        u32 fw_version;
        u32 hw_version;
        u8 n_mids; /* number of additional MIDs as reported by FW */
+       int recovery_count; /* num of FW recovery attempts in a short time */
+       unsigned long last_fw_recovery; /* jiffies of last fw recovery */
        /* profile */
        u32 monitor_flags;
        u32 secure_pcp; /* create secure PCP? */