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 <[email protected]>
---
 drivers/net/wireless/ath/wil6210/main.c         | 15 ++++++++++++---
 drivers/net/wireless/ath/wil6210/pcie_bus.c     | 10 ++++++++++
 drivers/net/wireless/ath/wil6210/wil6210.h      |  5 +++++
 drivers/net/wireless/ath/wil6210/wil_platform.h |  9 ++++++++-
 4 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/ath/wil6210/main.c 
b/drivers/net/wireless/ath/wil6210/main.c
index 5d69796..bafd8d5 100644
--- a/drivers/net/wireless/ath/wil6210/main.c
+++ b/drivers/net/wireless/ath/wil6210/main.c
@@ -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);
diff --git a/drivers/net/wireless/ath/wil6210/pcie_bus.c 
b/drivers/net/wireless/ath/wil6210/pcie_bus.c
index d4bb0bd..dc84001 100644
--- a/drivers/net/wireless/ath/wil6210/pcie_bus.c
+++ b/drivers/net/wireless/ath/wil6210/pcie_bus.c
@@ -43,9 +43,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;
@@ -81,6 +83,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);
diff --git a/drivers/net/wireless/ath/wil6210/wil6210.h 
b/drivers/net/wireless/ath/wil6210/wil6210.h
index db68209..f2bb55e 100644
--- a/drivers/net/wireless/ath/wil6210/wil6210.h
+++ b/drivers/net/wireless/ath/wil6210/wil6210.h
@@ -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 */
diff --git a/drivers/net/wireless/ath/wil6210/wil_platform.h 
b/drivers/net/wireless/ath/wil6210/wil_platform.h
index 5d9e4bf..5cfb946 100644
--- a/drivers/net/wireless/ath/wil6210/wil_platform.h
+++ b/drivers/net/wireless/ath/wil6210/wil_platform.h
@@ -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);
 };
 
 /**
-- 
1.9.1

Reply via email to