wil6210: store FW RF calibration result
authorDedy Lansky <qca_dlansky@qca.qualcomm.com>
Tue, 8 Aug 2017 11:16:48 +0000 (14:16 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Tue, 8 Aug 2017 18:44:20 +0000 (21:44 +0300)
Store initial FW RF calibration result in driver. Set this calibration
result back to FW after each FW reset in order to avoid future calibration
procedures.

Signed-off-by: Dedy Lansky <qca_dlansky@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/main.c
drivers/net/wireless/ath/wil6210/wil6210.h
drivers/net/wireless/ath/wil6210/wmi.c
drivers/net/wireless/ath/wil6210/wmi.h

index b1e281442ba3fef40406f7fc43cf9aecc6d60f2c..b89d017ec84785b0b30ff59a28fb069f77af6b1a 100644 (file)
@@ -1034,6 +1034,12 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
                wil_s(wil, RGF_CAF_ICR + offsetof(struct RGF_ICR, ICR), 0);
                wil_w(wil, RGF_CAF_ICR + offsetof(struct RGF_ICR, IMV), ~0);
 
+               if (wil->fw_calib_result > 0) {
+                       __le32 val = cpu_to_le32(wil->fw_calib_result |
+                                                (CALIB_RESULT_SIGNATURE << 8));
+                       wil_w(wil, RGF_USER_FW_CALIB_RESULT, (u32 __force)val);
+               }
+
                wil_release_cpu(wil);
        }
 
index 45d9385e8a0f1cc55f91f6233f4c64a1df5362d5..78a9c9f8fc8f91b14ca59a1a1b06a48130fa4f6d 100644 (file)
@@ -171,6 +171,10 @@ struct RGF_ICR {
 #define RGF_USER_USER_SCRATCH_PAD      (0x8802bc)
 #define RGF_USER_BL                    (0x880A3C) /* Boot Loader */
 #define RGF_USER_FW_REV_ID             (0x880a8c) /* chip revision */
+#define RGF_USER_FW_CALIB_RESULT       (0x880a90) /* b0-7:result
+                                                   * b8-15:signature
+                                                   */
+       #define CALIB_RESULT_SIGNATURE  (0x11)
 #define RGF_USER_CLKS_CTL_0            (0x880abc)
        #define BIT_USER_CLKS_CAR_AHB_SW_SEL    BIT(1) /* ref clk/PLL */
        #define BIT_USER_CLKS_RST_PWGD  BIT(11) /* reset on "power good" */
@@ -724,6 +728,8 @@ struct wil6210_priv {
 
        enum wmi_ps_profile_type ps_profile;
 
+       int fw_calib_result;
+
 #ifdef CONFIG_PM
 #ifdef CONFIG_PM_SLEEP
        struct notifier_block pm_notify;
index a9487f2b8d60848af49b52d6e503627d320206e7..ffdd2fa401b1502c6a35506a56dc66feb92c5df2 100644 (file)
@@ -344,6 +344,11 @@ static void wmi_evt_ready(struct wil6210_priv *wil, int id, void *d, int len)
        strlcpy(wdev->wiphy->fw_version, wil->fw_version,
                sizeof(wdev->wiphy->fw_version));
 
+       if (len > offsetof(struct wmi_ready_event, rfc_read_calib_result)) {
+               wil_dbg_wmi(wil, "rfc calibration result %d\n",
+                           evt->rfc_read_calib_result);
+               wil->fw_calib_result = evt->rfc_read_calib_result;
+       }
        wil_set_recovery_state(wil, fw_recovery_idle);
        set_bit(wil_status_fwready, wil->status);
        /* let the reset sequence continue */
index 4e31c2fd1fc66b334eed44883930fab9be1896e8..1b426d7ef81f9ee617f56f1d2e3d4d4ed50d59be 100644 (file)
@@ -1300,6 +1300,8 @@ struct wmi_ready_event {
        /* enum wmi_phy_capability */
        u8 phy_capability;
        u8 numof_additional_mids;
+       u8 rfc_read_calib_result;
+       u8 reserved[3];
 } __packed;
 
 /* WMI_NOTIFY_REQ_DONE_EVENTID */