wil6210: add platform capabilities bitmap
authorMaya Erez <qca_merez@qca.qualcomm.com>
Thu, 14 Dec 2017 16:53:07 +0000 (18:53 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 9 Jan 2018 08:03:15 +0000 (10:03 +0200)
Add get_capa callback to platform ops to allow reading the platform
capabilities.
Supported capabilities:
- Keeping 11ad connection during suspend
- T_POWER_ON 0 support
- Usage of external clock

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

index 5d69796..bafd8d5 100644 (file)
@@ -773,9 +773,8 @@ void wil_refresh_fw_capabilities(struct wil6210_priv *wil)
        struct wiphy *wiphy = wil_to_wiphy(wil);
 
        wil->keep_radio_on_during_sleep =
-               wil->platform_ops.keep_radio_on_during_sleep &&
-               wil->platform_ops.keep_radio_on_during_sleep(
-                       wil->platform_handle) &&
+               test_bit(WIL_PLATFORM_CAPA_RADIO_ON_IN_SUSPEND,
+                        wil->platform_capa) &&
                test_bit(WMI_FW_CAPABILITY_D3_SUSPEND, wil->fw_capabilities);
 
        wil_info(wil, "keep_radio_on_during_sleep (%d)\n",
@@ -1008,6 +1007,16 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
        if (wil->hw_version == HW_VER_UNKNOWN)
                return -ENODEV;
 
+       if (test_bit(WIL_PLATFORM_CAPA_T_PWR_ON_0, wil->platform_capa)) {
+               wil_dbg_misc(wil, "Notify FW to set T_POWER_ON=0\n");
+               wil_s(wil, RGF_USER_USAGE_8, BIT_USER_SUPPORT_T_POWER_ON_0);
+       }
+
+       if (test_bit(WIL_PLATFORM_CAPA_EXT_CLK, wil->platform_capa)) {
+               wil_dbg_misc(wil, "Notify FW on ext clock configuration\n");
+               wil_s(wil, RGF_USER_USAGE_8, BIT_USER_EXT_CLK);
+       }
+
        if (wil->platform_ops.notify) {
                rc = wil->platform_ops.notify(wil->platform_handle,
                                              WIL_PLATFORM_EVT_PRE_RESET);
index 030878b..0c401bf 100644 (file)
@@ -41,9 +41,11 @@ void wil_set_capabilities(struct wil6210_priv *wil)
        u32 jtag_id = wil_r(wil, RGF_USER_JTAG_DEV_ID);
        u8 chip_revision = (wil_r(wil, RGF_USER_REVISION_ID) &
                            RGF_USER_REVISION_ID_MASK);
+       int platform_capa;
 
        bitmap_zero(wil->hw_capabilities, hw_capability_last);
        bitmap_zero(wil->fw_capabilities, WMI_FW_CAPABILITY_MAX);
+       bitmap_zero(wil->platform_capa, WIL_PLATFORM_CAPA_MAX);
        wil->wil_fw_name = ftm_mode ? WIL_FW_NAME_FTM_DEFAULT :
                           WIL_FW_NAME_DEFAULT;
        wil->chip_revision = chip_revision;
@@ -79,6 +81,14 @@ void wil_set_capabilities(struct wil6210_priv *wil)
 
        wil_info(wil, "Board hardware is %s\n", wil->hw_name);
 
+       /* Get platform capabilities */
+       if (wil->platform_ops.get_capa) {
+               platform_capa =
+                       wil->platform_ops.get_capa(wil->platform_handle);
+               memcpy(wil->platform_capa, &platform_capa,
+                      min(sizeof(wil->platform_capa), sizeof(platform_capa)));
+       }
+
        /* extract FW capabilities from file without loading the FW */
        wil_request_firmware(wil, wil->wil_fw_name, false);
        wil_refresh_fw_capabilities(wil);
index decbc98..346b600 100644 (file)
@@ -161,6 +161,10 @@ struct RGF_ICR {
 #define RGF_USER_USAGE_6               (0x880018)
        #define BIT_USER_OOB_MODE               BIT(31)
        #define BIT_USER_OOB_R2_MODE            BIT(30)
+#define RGF_USER_USAGE_8               (0x880020)
+       #define BIT_USER_PREVENT_DEEP_SLEEP     BIT(0)
+       #define BIT_USER_SUPPORT_T_POWER_ON_0   BIT(1)
+       #define BIT_USER_EXT_CLK                BIT(2)
 #define RGF_USER_HW_MACHINE_STATE      (0x8801dc)
        #define HW_MACHINE_BOOT_DONE    (0x3fffffd)
 #define RGF_USER_USER_CPU_0            (0x8801e0)
@@ -643,6 +647,7 @@ struct wil6210_priv {
        const char *wil_fw_name;
        DECLARE_BITMAP(hw_capabilities, hw_capability_last);
        DECLARE_BITMAP(fw_capabilities, WMI_FW_CAPABILITY_MAX);
+       DECLARE_BITMAP(platform_capa, WIL_PLATFORM_CAPA_MAX);
        u8 n_mids; /* number of additional MIDs as reported by FW */
        u32 recovery_count; /* num of FW recovery attempts in a short time */
        u32 recovery_state; /* FW recovery state machine */
index 5d9e4bf..5cfb946 100644 (file)
@@ -27,6 +27,13 @@ enum wil_platform_event {
        WIL_PLATFORM_EVT_POST_SUSPEND = 4,
 };
 
+enum wil_platform_capa {
+       WIL_PLATFORM_CAPA_RADIO_ON_IN_SUSPEND = 0,
+       WIL_PLATFORM_CAPA_T_PWR_ON_0 = 1,
+       WIL_PLATFORM_CAPA_EXT_CLK = 2,
+       WIL_PLATFORM_CAPA_MAX,
+};
+
 /**
  * struct wil_platform_ops - wil platform module calls from this
  * driver to platform driver
@@ -37,7 +44,7 @@ struct wil_platform_ops {
        int (*resume)(void *handle, bool device_powered_on);
        void (*uninit)(void *handle);
        int (*notify)(void *handle, enum wil_platform_event evt);
-       bool (*keep_radio_on_during_sleep)(void *handle);
+       int (*get_capa)(void *handle);
 };
 
 /**