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

Commit eba95bce authored by Kalle Valo's avatar Kalle Valo
Browse files

ath6kl: convert ar6004 hardware flags to firmware feature flags



The functionality defined through these flags were actually firmware features
which can change between firmware versions. To make it possible to support
different firmware versions with the same driver, convert the flags to firmware
feature flags.

For backwards compatibility support for old ar6004 firmware FW
API 3 or smaller images we forcefully set the feature bits in the driver.
Starting from FW API 5 the firmware image needs to set them.

Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 1c3d95ed
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -2899,7 +2899,8 @@ static int ath6kl_start_ap(struct wiphy *wiphy, struct net_device *dev,
	if (info->inactivity_timeout) {
		inactivity_timeout = info->inactivity_timeout;

		if (ar->hw.flags & ATH6KL_HW_AP_INACTIVITY_MINS)
		if (test_bit(ATH6KL_FW_CAPABILITY_AP_INACTIVITY_MINS,
			     ar->fw_capabilities))
			inactivity_timeout = DIV_ROUND_UP(inactivity_timeout,
							  60);

@@ -3782,7 +3783,8 @@ int ath6kl_cfg80211_init(struct ath6kl *ar)
		ath6kl_band_5ghz.ht_cap.ht_supported = false;
	}

	if (ar->hw.flags & ATH6KL_HW_64BIT_RATES) {
	if (test_bit(ATH6KL_FW_CAPABILITY_64BIT_RATES,
		     ar->fw_capabilities)) {
		ath6kl_band_2ghz.ht_cap.mcs.rx_mask[0] = 0xff;
		ath6kl_band_5ghz.ht_cap.mcs.rx_mask[0] = 0xff;
		ath6kl_band_2ghz.ht_cap.mcs.rx_mask[1] = 0xff;
+16 −0
Original line number Diff line number Diff line
@@ -123,6 +123,22 @@ int ath6kl_core_init(struct ath6kl *ar, enum ath6kl_htc_type htc_type)

	/* FIXME: we should free all firmwares in the error cases below */

	/*
	 * Backwards compatibility support for older ar6004 firmware images
	 * which do not set these feature flags.
	 */
	if (ar->target_type == TARGET_TYPE_AR6004 &&
	    ar->fw_api <= 4) {
		__set_bit(ATH6KL_FW_CAPABILITY_64BIT_RATES,
			  ar->fw_capabilities);
		__set_bit(ATH6KL_FW_CAPABILITY_AP_INACTIVITY_MINS,
			  ar->fw_capabilities);

		if (ar->hw.id == AR6004_HW_1_3_VERSION)
			__set_bit(ATH6KL_FW_CAPABILITY_MAP_LP_ENDPOINT,
				  ar->fw_capabilities);
	}

	/* Indicate that WMI is enabled (although not ready yet) */
	set_bit(WMI_ENABLED, &ar->flag);
	ar->wmi = ath6kl_wmi_init(ar);
+9 −3
Original line number Diff line number Diff line
@@ -136,6 +136,15 @@ enum ath6kl_fw_capability {
	 */
	ATH6KL_FW_CAPABILITY_HEART_BEAT_POLL,

	/* WMI_SET_TX_SELECT_RATES_CMDID uses 64 bit size rate table */
	ATH6KL_FW_CAPABILITY_64BIT_RATES,

	/* WMI_AP_CONN_INACT_CMDID uses minutes as units */
	ATH6KL_FW_CAPABILITY_AP_INACTIVITY_MINS,

	/* use low priority endpoint for all data */
	ATH6KL_FW_CAPABILITY_MAP_LP_ENDPOINT,

	/* this needs to be last */
	ATH6KL_FW_CAPABILITY_MAX,
};
@@ -149,9 +158,6 @@ struct ath6kl_fw_ie {
};

enum ath6kl_hw_flags {
	ATH6KL_HW_64BIT_RATES		= BIT(0),
	ATH6KL_HW_AP_INACTIVITY_MINS	= BIT(1),
	ATH6KL_HW_MAP_LP_ENDPOINT	= BIT(2),
	ATH6KL_HW_SDIO_CRC_ERROR_WAR	= BIT(3),
};

+7 −9
Original line number Diff line number Diff line
@@ -93,8 +93,7 @@ static const struct ath6kl_hw hw_list[] = {
		.board_addr			= 0x433900,
		.refclk_hz			= 26000000,
		.uarttx_pin			= 11,
		.flags				= ATH6KL_HW_64BIT_RATES |
						  ATH6KL_HW_AP_INACTIVITY_MINS,
		.flags				= 0,

		.fw = {
			.dir		= AR6004_HW_1_0_FW_DIR,
@@ -114,8 +113,7 @@ static const struct ath6kl_hw hw_list[] = {
		.board_addr			= 0x43d400,
		.refclk_hz			= 40000000,
		.uarttx_pin			= 11,
		.flags				= ATH6KL_HW_64BIT_RATES |
						  ATH6KL_HW_AP_INACTIVITY_MINS,
		.flags				= 0,
		.fw = {
			.dir		= AR6004_HW_1_1_FW_DIR,
			.fw		= AR6004_HW_1_1_FIRMWARE_FILE,
@@ -134,8 +132,7 @@ static const struct ath6kl_hw hw_list[] = {
		.board_addr			= 0x435c00,
		.refclk_hz			= 40000000,
		.uarttx_pin			= 11,
		.flags				= ATH6KL_HW_64BIT_RATES |
						  ATH6KL_HW_AP_INACTIVITY_MINS,
		.flags				= 0,

		.fw = {
			.dir		= AR6004_HW_1_2_FW_DIR,
@@ -154,9 +151,7 @@ static const struct ath6kl_hw hw_list[] = {
		.board_addr			= 0x436400,
		.refclk_hz                      = 40000000,
		.uarttx_pin                     = 11,
		.flags				= ATH6KL_HW_64BIT_RATES |
						  ATH6KL_HW_AP_INACTIVITY_MINS |
						  ATH6KL_HW_MAP_LP_ENDPOINT,
		.flags				= 0,

		.fw = {
			.dir            = AR6004_HW_1_3_FW_DIR,
@@ -1575,6 +1570,9 @@ static const struct fw_capa_str_map {
	{ ATH6KL_FW_CAPABILITY_REGDOMAIN, "regdomain" },
	{ ATH6KL_FW_CAPABILITY_SCHED_SCAN_V2, "sched-scan-v2" },
	{ ATH6KL_FW_CAPABILITY_HEART_BEAT_POLL, "hb-poll" },
	{ ATH6KL_FW_CAPABILITY_64BIT_RATES, "64bit-rates" },
	{ ATH6KL_FW_CAPABILITY_AP_INACTIVITY_MINS, "ap-inactivity-mins" },
	{ ATH6KL_FW_CAPABILITY_MAP_LP_ENDPOINT, "map-lp-endpoint" },
};

static const char *ath6kl_init_get_fw_capa_name(unsigned int id)
+4 −2
Original line number Diff line number Diff line
@@ -802,7 +802,8 @@ static int ath6kl_usb_map_service_pipe(struct ath6kl *ar, u16 svc_id,
		break;
	case WMI_DATA_VI_SVC:

		if (ar->hw.flags & ATH6KL_HW_MAP_LP_ENDPOINT)
		if (test_bit(ATH6KL_FW_CAPABILITY_MAP_LP_ENDPOINT,
			     ar->fw_capabilities))
			*ul_pipe = ATH6KL_USB_PIPE_TX_DATA_LP;
		else
			*ul_pipe = ATH6KL_USB_PIPE_TX_DATA_MP;
@@ -814,7 +815,8 @@ static int ath6kl_usb_map_service_pipe(struct ath6kl *ar, u16 svc_id,
		break;
	case WMI_DATA_VO_SVC:

		if (ar->hw.flags & ATH6KL_HW_MAP_LP_ENDPOINT)
		if (test_bit(ATH6KL_FW_CAPABILITY_MAP_LP_ENDPOINT,
			     ar->fw_capabilities))
			*ul_pipe = ATH6KL_USB_PIPE_TX_DATA_LP;
		else
			*ul_pipe = ATH6KL_USB_PIPE_TX_DATA_MP;
Loading