struct wil6210_priv *wil = file->private_data;
 
        memset(&wil->suspend_stats, 0, sizeof(wil->suspend_stats));
+       wil->suspend_stats.min_suspend_time = ULONG_MAX;
+       wil->suspend_stats.collection_start = ktime_get();
 
        return len;
 }
        struct wil6210_priv *wil = file->private_data;
        static char text[400];
        int n;
+       unsigned long long stats_collection_time =
+               ktime_to_us(ktime_sub(ktime_get(),
+                                     wil->suspend_stats.collection_start));
 
        n = snprintf(text, sizeof(text),
                     "Suspend statistics:\n"
                     "successful suspends:%ld failed suspends:%ld\n"
                     "successful resumes:%ld failed resumes:%ld\n"
-                    "rejected by host:%ld rejected by device:%ld\n",
+                    "rejected by host:%ld rejected by device:%ld\n"
+                    "total suspend time:%lld min suspend time:%lld\n"
+                    "max suspend time:%lld stats collection time: %lld\n",
                     wil->suspend_stats.successful_suspends,
                     wil->suspend_stats.failed_suspends,
                     wil->suspend_stats.successful_resumes,
                     wil->suspend_stats.failed_resumes,
                     wil->suspend_stats.rejected_by_host,
-                    wil->suspend_stats.rejected_by_device);
+                    wil->suspend_stats.rejected_by_device,
+                    wil->suspend_stats.total_suspend_time,
+                    wil->suspend_stats.min_suspend_time,
+                    wil->suspend_stats.max_suspend_time,
+                    stats_collection_time);
 
        n = min_t(int, n, sizeof(text));
 
 
        wil6210_debugfs_create_ITR_CNT(wil, dbg);
 
+       wil->suspend_stats.collection_start = ktime_get();
+
        return 0;
 }
 
 
 
        wil->wakeup_trigger = WMI_WAKEUP_TRIGGER_UCAST |
                              WMI_WAKEUP_TRIGGER_BCAST;
+       memset(&wil->suspend_stats, 0, sizeof(wil->suspend_stats));
+       wil->suspend_stats.min_suspend_time = ULONG_MAX;
 
        return 0;
 
 
        wil_dbg_pm(wil, "suspend: %s => %d\n",
                   is_runtime ? "runtime" : "system", rc);
 
+       if (!rc)
+               wil->suspend_stats.suspend_start_time = ktime_get();
+
        return rc;
 }
 
        struct net_device *ndev = wil_to_ndev(wil);
        bool keep_radio_on = ndev->flags & IFF_UP &&
                             wil->keep_radio_on_during_sleep;
+       unsigned long long suspend_time_usec = 0;
 
        wil_dbg_pm(wil, "resume: %s\n", is_runtime ? "runtime" : "system");
 
        else
                rc = wil_resume_radio_off(wil);
 
+       if (rc)
+               goto out;
+
+       suspend_time_usec =
+               ktime_to_us(ktime_sub(ktime_get(),
+                                     wil->suspend_stats.suspend_start_time));
+       wil->suspend_stats.total_suspend_time += suspend_time_usec;
+       if (suspend_time_usec < wil->suspend_stats.min_suspend_time)
+               wil->suspend_stats.min_suspend_time = suspend_time_usec;
+       if (suspend_time_usec > wil->suspend_stats.max_suspend_time)
+               wil->suspend_stats.max_suspend_time = suspend_time_usec;
+
 out:
-       wil_dbg_pm(wil, "resume: %s => %d\n",
-                  is_runtime ? "runtime" : "system", rc);
+       wil_dbg_pm(wil, "resume: %s => %d, suspend time %lld usec\n",
+                  is_runtime ? "runtime" : "system", rc, suspend_time_usec);
        return rc;
 }
 
        unsigned long failed_resumes;
        unsigned long rejected_by_device;
        unsigned long rejected_by_host;
+       unsigned long long total_suspend_time;
+       unsigned long long min_suspend_time;
+       unsigned long long max_suspend_time;
+       ktime_t collection_start;
+       ktime_t suspend_start_time;
 };
 
 /* Calculate MAC buffer size for the firmware. It includes all overhead,