Commit 38e4c25d authored by Maya Erez's avatar Maya Erez Committed by Kalle Valo

wil6210: add platform capabilities bitmap

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: default avatarMaya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 3dc2c13b
...@@ -773,9 +773,8 @@ void wil_refresh_fw_capabilities(struct wil6210_priv *wil) ...@@ -773,9 +773,8 @@ void wil_refresh_fw_capabilities(struct wil6210_priv *wil)
struct wiphy *wiphy = wil_to_wiphy(wil); struct wiphy *wiphy = wil_to_wiphy(wil);
wil->keep_radio_on_during_sleep = wil->keep_radio_on_during_sleep =
wil->platform_ops.keep_radio_on_during_sleep && test_bit(WIL_PLATFORM_CAPA_RADIO_ON_IN_SUSPEND,
wil->platform_ops.keep_radio_on_during_sleep( wil->platform_capa) &&
wil->platform_handle) &&
test_bit(WMI_FW_CAPABILITY_D3_SUSPEND, wil->fw_capabilities); test_bit(WMI_FW_CAPABILITY_D3_SUSPEND, wil->fw_capabilities);
wil_info(wil, "keep_radio_on_during_sleep (%d)\n", wil_info(wil, "keep_radio_on_during_sleep (%d)\n",
...@@ -1008,6 +1007,16 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw) ...@@ -1008,6 +1007,16 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
if (wil->hw_version == HW_VER_UNKNOWN) if (wil->hw_version == HW_VER_UNKNOWN)
return -ENODEV; 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) { if (wil->platform_ops.notify) {
rc = wil->platform_ops.notify(wil->platform_handle, rc = wil->platform_ops.notify(wil->platform_handle,
WIL_PLATFORM_EVT_PRE_RESET); WIL_PLATFORM_EVT_PRE_RESET);
......
...@@ -41,9 +41,11 @@ void wil_set_capabilities(struct wil6210_priv *wil) ...@@ -41,9 +41,11 @@ void wil_set_capabilities(struct wil6210_priv *wil)
u32 jtag_id = wil_r(wil, RGF_USER_JTAG_DEV_ID); u32 jtag_id = wil_r(wil, RGF_USER_JTAG_DEV_ID);
u8 chip_revision = (wil_r(wil, RGF_USER_REVISION_ID) & u8 chip_revision = (wil_r(wil, RGF_USER_REVISION_ID) &
RGF_USER_REVISION_ID_MASK); RGF_USER_REVISION_ID_MASK);
int platform_capa;
bitmap_zero(wil->hw_capabilities, hw_capability_last); bitmap_zero(wil->hw_capabilities, hw_capability_last);
bitmap_zero(wil->fw_capabilities, WMI_FW_CAPABILITY_MAX); 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->wil_fw_name = ftm_mode ? WIL_FW_NAME_FTM_DEFAULT :
WIL_FW_NAME_DEFAULT; WIL_FW_NAME_DEFAULT;
wil->chip_revision = chip_revision; wil->chip_revision = chip_revision;
...@@ -79,6 +81,14 @@ void wil_set_capabilities(struct wil6210_priv *wil) ...@@ -79,6 +81,14 @@ void wil_set_capabilities(struct wil6210_priv *wil)
wil_info(wil, "Board hardware is %s\n", wil->hw_name); 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 */ /* extract FW capabilities from file without loading the FW */
wil_request_firmware(wil, wil->wil_fw_name, false); wil_request_firmware(wil, wil->wil_fw_name, false);
wil_refresh_fw_capabilities(wil); wil_refresh_fw_capabilities(wil);
......
...@@ -161,6 +161,10 @@ struct RGF_ICR { ...@@ -161,6 +161,10 @@ struct RGF_ICR {
#define RGF_USER_USAGE_6 (0x880018) #define RGF_USER_USAGE_6 (0x880018)
#define BIT_USER_OOB_MODE BIT(31) #define BIT_USER_OOB_MODE BIT(31)
#define BIT_USER_OOB_R2_MODE BIT(30) #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 RGF_USER_HW_MACHINE_STATE (0x8801dc)
#define HW_MACHINE_BOOT_DONE (0x3fffffd) #define HW_MACHINE_BOOT_DONE (0x3fffffd)
#define RGF_USER_USER_CPU_0 (0x8801e0) #define RGF_USER_USER_CPU_0 (0x8801e0)
...@@ -643,6 +647,7 @@ struct wil6210_priv { ...@@ -643,6 +647,7 @@ struct wil6210_priv {
const char *wil_fw_name; const char *wil_fw_name;
DECLARE_BITMAP(hw_capabilities, hw_capability_last); DECLARE_BITMAP(hw_capabilities, hw_capability_last);
DECLARE_BITMAP(fw_capabilities, WMI_FW_CAPABILITY_MAX); 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 */ 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_count; /* num of FW recovery attempts in a short time */
u32 recovery_state; /* FW recovery state machine */ u32 recovery_state; /* FW recovery state machine */
......
...@@ -27,6 +27,13 @@ enum wil_platform_event { ...@@ -27,6 +27,13 @@ enum wil_platform_event {
WIL_PLATFORM_EVT_POST_SUSPEND = 4, 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 * struct wil_platform_ops - wil platform module calls from this
* driver to platform driver * driver to platform driver
...@@ -37,7 +44,7 @@ struct wil_platform_ops { ...@@ -37,7 +44,7 @@ struct wil_platform_ops {
int (*resume)(void *handle, bool device_powered_on); int (*resume)(void *handle, bool device_powered_on);
void (*uninit)(void *handle); void (*uninit)(void *handle);
int (*notify)(void *handle, enum wil_platform_event evt); int (*notify)(void *handle, enum wil_platform_event evt);
bool (*keep_radio_on_during_sleep)(void *handle); int (*get_capa)(void *handle);
}; };
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment