Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+12 −3
Original line number Original line Diff line number Diff line
@@ -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)
	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);
+10 −0
Original line number Original line Diff line number Diff line
@@ -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)


	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);
+5 −0
Original line number Original line Diff line number Diff line
@@ -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 {
	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 */
+8 −1
Original line number Original line Diff line number Diff line
@@ -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 {
	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);
};
};


/**
/**