wil6210: add statistics for suspend time
authorMaya Erez <qca_merez@qca.qualcomm.com>
Tue, 8 Aug 2017 11:16:45 +0000 (14:16 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Tue, 8 Aug 2017 18:44:03 +0000 (21:44 +0300)
Add statistics for total, min and max suspend time, that
calculates the time the 11ad device was in suspend.
Those statistics will help to estimate the power impact
of d3hot feature.

Signed-off-by: Maya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/wil6210/debugfs.c
drivers/net/wireless/ath/wil6210/main.c
drivers/net/wireless/ath/wil6210/pm.c
drivers/net/wireless/ath/wil6210/wil6210.h

index 21b661158b1a588fbf3166b4e422622f882a846b..d4e88652fcc6a5071e9287e8b5e55023d9b1344b 100644 (file)
@@ -1617,6 +1617,8 @@ static ssize_t wil_write_suspend_stats(struct file *file,
        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;
 }
@@ -1628,18 +1630,27 @@ static ssize_t wil_read_suspend_stats(struct file *file,
        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));
 
@@ -1795,6 +1806,8 @@ int wil6210_debugfs_init(struct wil6210_priv *wil)
 
        wil6210_debugfs_create_ITR_CNT(wil, dbg);
 
+       wil->suspend_stats.collection_start = ktime_get();
+
        return 0;
 }
 
index daf944a71901fd431c14c6ab0b5779678b230fba..8968c2c51a1b43a23f236d2c82772774e8844719 100644 (file)
@@ -578,6 +578,8 @@ int wil_priv_init(struct wil6210_priv *wil)
 
        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;
 
index 45488292a8fc805f63ccdbadd2fa1d1d53328685..820ed17ae2d4fe1dcbd87eab066b6b2bbda5922a 100644 (file)
@@ -300,6 +300,9 @@ int wil_suspend(struct wil6210_priv *wil, bool is_runtime)
        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;
 }
 
@@ -309,6 +312,7 @@ int wil_resume(struct wil6210_priv *wil, bool is_runtime)
        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");
 
@@ -326,8 +330,20 @@ int wil_resume(struct wil6210_priv *wil, bool is_runtime)
        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;
 }
index d085ccfc722865bfab871f43cbb02d49a7780e9f..45d9385e8a0f1cc55f91f6233f4c64a1df5362d5 100644 (file)
@@ -90,6 +90,11 @@ struct wil_suspend_stats {
        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,