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

Commit 842f1a6c authored by Ido Yariv's avatar Ido Yariv Committed by Luciano Coelho
Browse files

wl12xx: Check for FW quirks as soon as the FW boots



The FW initialization might depend on the FW revision, so check for any
FW quirks right after booting it.

Signed-off-by: default avatarIdo Yariv <ido@wizery.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent 92ef8960
Loading
Loading
Loading
Loading
+21 −0
Original line number Original line Diff line number Diff line
@@ -102,6 +102,24 @@ static void wl1271_boot_set_ecpu_ctrl(struct wl1271 *wl, u32 flag)
	wl1271_write32(wl, ACX_REG_ECPU_CONTROL, cpu_ctrl);
	wl1271_write32(wl, ACX_REG_ECPU_CONTROL, cpu_ctrl);
}
}


static unsigned int wl12xx_get_fw_ver_quirks(struct wl1271 *wl)
{
	unsigned int quirks = 0;
	unsigned int *fw_ver = wl->chip.fw_ver;

	/* Only for wl127x */
	if ((fw_ver[FW_VER_CHIP] == FW_VER_CHIP_WL127X) &&
	    /* Check STA version */
	    (((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_STA) &&
	      (fw_ver[FW_VER_MINOR] < FW_VER_MINOR_1_SPARE_STA_MIN)) ||
	     /* Check AP version */
	     ((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_AP) &&
	      (fw_ver[FW_VER_MINOR] < FW_VER_MINOR_1_SPARE_AP_MIN))))
		quirks |= WL12XX_QUIRK_USE_2_SPARE_BLOCKS;

	return quirks;
}

static void wl1271_parse_fw_ver(struct wl1271 *wl)
static void wl1271_parse_fw_ver(struct wl1271 *wl)
{
{
	int ret;
	int ret;
@@ -116,6 +134,9 @@ static void wl1271_parse_fw_ver(struct wl1271 *wl)
		memset(wl->chip.fw_ver, 0, sizeof(wl->chip.fw_ver));
		memset(wl->chip.fw_ver, 0, sizeof(wl->chip.fw_ver));
		return;
		return;
	}
	}

	/* Check if any quirks are needed with older fw versions */
	wl->quirks |= wl12xx_get_fw_ver_quirks(wl);
}
}


static void wl1271_boot_fw_version(struct wl1271 *wl)
static void wl1271_boot_fw_version(struct wl1271 *wl)
+0 −23
Original line number Original line Diff line number Diff line
@@ -1251,24 +1251,6 @@ static int wl1271_chip_wakeup(struct wl1271 *wl)
	return ret;
	return ret;
}
}


static unsigned int wl1271_get_fw_ver_quirks(struct wl1271 *wl)
{
	unsigned int quirks = 0;
	unsigned int *fw_ver = wl->chip.fw_ver;

	/* Only for wl127x */
	if ((fw_ver[FW_VER_CHIP] == FW_VER_CHIP_WL127X) &&
	    /* Check STA version */
	    (((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_STA) &&
	      (fw_ver[FW_VER_MINOR] < FW_VER_MINOR_1_SPARE_STA_MIN)) ||
	     /* Check AP version */
	     ((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_AP) &&
	      (fw_ver[FW_VER_MINOR] < FW_VER_MINOR_1_SPARE_AP_MIN))))
		quirks |= WL12XX_QUIRK_USE_2_SPARE_BLOCKS;

	return quirks;
}

int wl1271_plt_start(struct wl1271 *wl)
int wl1271_plt_start(struct wl1271 *wl)
{
{
	int retries = WL1271_BOOT_RETRIES;
	int retries = WL1271_BOOT_RETRIES;
@@ -1305,8 +1287,6 @@ int wl1271_plt_start(struct wl1271 *wl)
		wl1271_notice("firmware booted in PLT mode (%s)",
		wl1271_notice("firmware booted in PLT mode (%s)",
			      wl->chip.fw_ver_str);
			      wl->chip.fw_ver_str);


		/* Check if any quirks are needed with older fw versions */
		wl->quirks |= wl1271_get_fw_ver_quirks(wl);
		goto out;
		goto out;


irq_disable:
irq_disable:
@@ -1794,9 +1774,6 @@ static int wl1271_op_add_interface(struct ieee80211_hw *hw,
	strncpy(wiphy->fw_version, wl->chip.fw_ver_str,
	strncpy(wiphy->fw_version, wl->chip.fw_ver_str,
		sizeof(wiphy->fw_version));
		sizeof(wiphy->fw_version));


	/* Check if any quirks are needed with older fw versions */
	wl->quirks |= wl1271_get_fw_ver_quirks(wl);

	/*
	/*
	 * Now we know if 11a is supported (info from the NVS), so disable
	 * Now we know if 11a is supported (info from the NVS), so disable
	 * 11a channels if not supported
	 * 11a channels if not supported