ath6kl: add state variable depicting hw/fw state
authorKalle Valo <kvalo@qca.qualcomm.com>
Tue, 1 Nov 2011 06:44:28 +0000 (08:44 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Fri, 11 Nov 2011 10:59:00 +0000 (12:59 +0200)
This way it's easier to track state changes and in the future add
more warnings about using hardware in wrong states. Currently there
are few random flags for trying to do the same, those will be cleaned
and removed in the future.

Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath6kl/cfg80211.c
drivers/net/wireless/ath/ath6kl/core.h
drivers/net/wireless/ath/ath6kl/init.c

index c62ebf1c2b6617549a9b91c7d2b9e7d79c1cbfd3..01e83c92c198e775cee1824beb774b1242f40870 100644 (file)
@@ -1671,6 +1671,8 @@ int ath6kl_cfg80211_suspend(struct ath6kl *ar,
                                    ret);
                }
 
+               ar->state = ATH6KL_STATE_DEEPSLEEP;
+
                break;
        }
 
@@ -1679,11 +1681,25 @@ int ath6kl_cfg80211_suspend(struct ath6kl *ar,
 
 int ath6kl_cfg80211_resume(struct ath6kl *ar)
 {
-       if (ar->wmi->pwr_mode != ar->wmi->saved_pwr_mode) {
-               if (ath6kl_wmi_powermode_cmd(ar->wmi, 0,
-                       ar->wmi->saved_pwr_mode) != 0)
-                       ath6kl_warn("ath6kl_sdio_resume: "
-                               "wmi_powermode_cmd failed\n");
+       int ret;
+
+       switch (ar->state) {
+       case ATH6KL_STATE_DEEPSLEEP:
+               if (ar->wmi->pwr_mode != ar->wmi->saved_pwr_mode) {
+                       ret = ath6kl_wmi_powermode_cmd(ar->wmi, 0,
+                                                      ar->wmi->saved_pwr_mode);
+                       if (ret) {
+                               ath6kl_warn("wmi powermode command failed during resume: %d\n",
+                                           ret);
+                       }
+               }
+
+               ar->state = ATH6KL_STATE_ON;
+
+               break;
+
+       default:
+               break;
        }
 
        return 0;
@@ -2254,6 +2270,8 @@ struct ath6kl *ath6kl_core_alloc(struct device *dev)
        ar->sc_params.scan_ctrl_flags = DEFAULT_SCAN_CTRL_FLAGS;
        ar->lrssi_roam_threshold = DEF_LRSSI_ROAM_THRESHOLD;
 
+       ar->state = ATH6KL_STATE_OFF;
+
        memset((u8 *)ar->sta_list, 0,
               AP_MAX_NUM_STA * sizeof(struct ath6kl_sta));
 
index 00cc1db7cbc1f86a359073b96dbaec216bd91685..6613248ffd217fa38c25c9d1c3a38e22cf631d4a 100644 (file)
@@ -450,9 +450,18 @@ enum ath6kl_dev_state {
        FIRST_BOOT,
 };
 
+enum ath6kl_state {
+       ATH6KL_STATE_OFF,
+       ATH6KL_STATE_ON,
+       ATH6KL_STATE_DEEPSLEEP,
+};
+
 struct ath6kl {
        struct device *dev;
        struct wiphy *wiphy;
+
+       enum ath6kl_state state;
+
        struct ath6kl_bmi bmi;
        const struct ath6kl_hif_ops *hif_ops;
        struct wmi *wmi;
index 3f1f2547d1422479a05250f62576a976fdfed501..83b4f165eebf6d0dc195f3df6d5a3f19fcd87adb 100644 (file)
@@ -1452,6 +1452,8 @@ int ath6kl_init_hw_start(struct ath6kl *ar)
                        goto err_htc_stop;
        }
 
+       ar->state = ATH6KL_STATE_ON;
+
        return 0;
 
 err_htc_stop:
@@ -1480,6 +1482,8 @@ int ath6kl_init_hw_stop(struct ath6kl *ar)
        if (ret)
                ath6kl_warn("failed to power off hif: %d\n", ret);
 
+       ar->state = ATH6KL_STATE_OFF;
+
        return 0;
 }