wil6210: get suspend reject reason and resume triggers from FW
authorLazar Alexei <qca_ailizaro@qca.qualcomm.com>
Tue, 14 Nov 2017 13:25:41 +0000 (15:25 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Sat, 2 Dec 2017 14:18:56 +0000 (16:18 +0200)
Upon receiving suspend reject, print reject reason.
Upon receiving resume event, print resume triggers.

Signed-off-by: Lazar Alexei <qca_ailizaro@qca.qualcomm.com>
Signed-off-by: Maya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/wil6210/wmi.c
drivers/net/wireless/ath/wil6210/wmi.h

index dd25f6369ce34aeff576f25206b8ab7107b8611d..8ace618d0fd9023b275bd0391538b7ce21c90ea4 100644 (file)
@@ -2043,6 +2043,16 @@ void wmi_event_flush(struct wil6210_priv *wil)
        spin_unlock_irqrestore(&wil->wmi_ev_lock, flags);
 }
 
+static const char *suspend_status2name(u8 status)
+{
+       switch (status) {
+       case WMI_TRAFFIC_SUSPEND_REJECTED_LINK_NOT_IDLE:
+               return "LINK_NOT_IDLE";
+       default:
+               return "Untracked status";
+       }
+}
+
 int wmi_suspend(struct wil6210_priv *wil)
 {
        int rc;
@@ -2058,7 +2068,7 @@ int wmi_suspend(struct wil6210_priv *wil)
        wil->suspend_resp_rcvd = false;
        wil->suspend_resp_comp = false;
 
-       reply.evt.status = WMI_TRAFFIC_SUSPEND_REJECTED;
+       reply.evt.status = WMI_TRAFFIC_SUSPEND_REJECTED_LINK_NOT_IDLE;
 
        rc = wmi_call(wil, WMI_TRAFFIC_SUSPEND_CMDID, &cmd, sizeof(cmd),
                      WMI_TRAFFIC_SUSPEND_EVENTID, &reply, sizeof(reply),
@@ -2090,8 +2100,9 @@ int wmi_suspend(struct wil6210_priv *wil)
        }
 
        wil_dbg_wmi(wil, "suspend_response_completed rcvd\n");
-       if (reply.evt.status == WMI_TRAFFIC_SUSPEND_REJECTED) {
-               wil_dbg_pm(wil, "device rejected the suspend\n");
+       if (reply.evt.status != WMI_TRAFFIC_SUSPEND_APPROVED) {
+               wil_dbg_pm(wil, "device rejected the suspend, %s\n",
+                          suspend_status2name(reply.evt.status));
                wil->suspend_stats.rejected_by_device++;
        }
        rc = reply.evt.status;
@@ -2103,21 +2114,50 @@ out:
        return rc;
 }
 
+static void resume_triggers2string(u32 triggers, char *string, int str_size)
+{
+       string[0] = '\0';
+
+       if (!triggers) {
+               strlcat(string, " UNKNOWN", str_size);
+               return;
+       }
+
+       if (triggers & WMI_RESUME_TRIGGER_HOST)
+               strlcat(string, " HOST", str_size);
+
+       if (triggers & WMI_RESUME_TRIGGER_UCAST_RX)
+               strlcat(string, " UCAST_RX", str_size);
+
+       if (triggers & WMI_RESUME_TRIGGER_BCAST_RX)
+               strlcat(string, " BCAST_RX", str_size);
+
+       if (triggers & WMI_RESUME_TRIGGER_WMI_EVT)
+               strlcat(string, " WMI_EVT", str_size);
+}
+
 int wmi_resume(struct wil6210_priv *wil)
 {
        int rc;
+       char string[100];
        struct {
                struct wmi_cmd_hdr wmi;
                struct wmi_traffic_resume_event evt;
        } __packed reply;
 
        reply.evt.status = WMI_TRAFFIC_RESUME_FAILED;
+       reply.evt.resume_triggers = WMI_RESUME_TRIGGER_UNKNOWN;
 
        rc = wmi_call(wil, WMI_TRAFFIC_RESUME_CMDID, NULL, 0,
                      WMI_TRAFFIC_RESUME_EVENTID, &reply, sizeof(reply),
                      WIL_WAIT_FOR_SUSPEND_RESUME_COMP);
        if (rc)
                return rc;
+       resume_triggers2string(le32_to_cpu(reply.evt.resume_triggers), string,
+                              sizeof(string));
+       wil_dbg_pm(wil, "device resume %s, resume triggers:%s (0x%x)\n",
+                  reply.evt.status ? "failed" : "passed", string,
+                  le32_to_cpu(reply.evt.resume_triggers));
 
        return reply.evt.status;
 }
index 5263ee717a4fbe5bbd91bf00c45ffc8c154763ee..d9e220a8c0f4879b11bdb000c42351b24ff95b32 100644 (file)
@@ -2267,8 +2267,8 @@ struct wmi_link_maintain_cfg_read_done_event {
 } __packed;
 
 enum wmi_traffic_suspend_status {
-       WMI_TRAFFIC_SUSPEND_APPROVED    = 0x0,
-       WMI_TRAFFIC_SUSPEND_REJECTED    = 0x1,
+       WMI_TRAFFIC_SUSPEND_APPROVED                    = 0x0,
+       WMI_TRAFFIC_SUSPEND_REJECTED_LINK_NOT_IDLE      = 0x1,
 };
 
 /* WMI_TRAFFIC_SUSPEND_EVENTID */
@@ -2282,10 +2282,21 @@ enum wmi_traffic_resume_status {
        WMI_TRAFFIC_RESUME_FAILED       = 0x1,
 };
 
+enum wmi_resume_trigger {
+       WMI_RESUME_TRIGGER_UNKNOWN      = 0x0,
+       WMI_RESUME_TRIGGER_HOST         = 0x1,
+       WMI_RESUME_TRIGGER_UCAST_RX     = 0x2,
+       WMI_RESUME_TRIGGER_BCAST_RX     = 0x4,
+       WMI_RESUME_TRIGGER_WMI_EVT      = 0x8,
+};
+
 /* WMI_TRAFFIC_RESUME_EVENTID */
 struct wmi_traffic_resume_event {
-       /* enum wmi_traffic_resume_status_e */
+       /* enum wmi_traffic_resume_status */
        u8 status;
+       u8 reserved[3];
+       /* enum wmi_resume_trigger bitmap */
+       __le32 resume_triggers;
 } __packed;
 
 /* Power Save command completion status codes */