wlcore: workaround start_sta problem in wl12xx fw
for some reason, the wl12xx fw is not able to rx/tx on the first start_sta cmd. Workaround it by issuing a dummy start_sta + stop_sta before starting the sta for the final time. Signed-off-by: Eliad Peller <eliad@wizery.com> Reviewed-by: Arik Nemtsov <arik@wizery.com> Signed-off-by: Luciano Coelho <coelho@ti.com>
This commit is contained in:
parent
3230f35e09
commit
18eab43070
3 changed files with 23 additions and 4 deletions
|
@ -637,7 +637,8 @@ static int wl12xx_identify_chip(struct wl1271 *wl)
|
||||||
|
|
||||||
wl->quirks |= WLCORE_QUIRK_LEGACY_NVS |
|
wl->quirks |= WLCORE_QUIRK_LEGACY_NVS |
|
||||||
WLCORE_QUIRK_DUAL_PROBE_TMPL |
|
WLCORE_QUIRK_DUAL_PROBE_TMPL |
|
||||||
WLCORE_QUIRK_TKIP_HEADER_SPACE;
|
WLCORE_QUIRK_TKIP_HEADER_SPACE |
|
||||||
|
WLCORE_QUIRK_START_STA_FAILS;
|
||||||
wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
|
wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
|
||||||
wl->mr_fw_name = WL127X_FW_NAME_MULTI;
|
wl->mr_fw_name = WL127X_FW_NAME_MULTI;
|
||||||
memcpy(&wl->conf.mem, &wl12xx_default_priv_conf.mem_wl127x,
|
memcpy(&wl->conf.mem, &wl12xx_default_priv_conf.mem_wl127x,
|
||||||
|
@ -657,7 +658,8 @@ static int wl12xx_identify_chip(struct wl1271 *wl)
|
||||||
|
|
||||||
wl->quirks |= WLCORE_QUIRK_LEGACY_NVS |
|
wl->quirks |= WLCORE_QUIRK_LEGACY_NVS |
|
||||||
WLCORE_QUIRK_DUAL_PROBE_TMPL |
|
WLCORE_QUIRK_DUAL_PROBE_TMPL |
|
||||||
WLCORE_QUIRK_TKIP_HEADER_SPACE;
|
WLCORE_QUIRK_TKIP_HEADER_SPACE |
|
||||||
|
WLCORE_QUIRK_START_STA_FAILS;
|
||||||
wl->plt_fw_name = WL127X_PLT_FW_NAME;
|
wl->plt_fw_name = WL127X_PLT_FW_NAME;
|
||||||
wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
|
wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
|
||||||
wl->mr_fw_name = WL127X_FW_NAME_MULTI;
|
wl->mr_fw_name = WL127X_FW_NAME_MULTI;
|
||||||
|
@ -682,7 +684,8 @@ static int wl12xx_identify_chip(struct wl1271 *wl)
|
||||||
/* wl128x requires TX blocksize alignment */
|
/* wl128x requires TX blocksize alignment */
|
||||||
wl->quirks |= WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN |
|
wl->quirks |= WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN |
|
||||||
WLCORE_QUIRK_DUAL_PROBE_TMPL |
|
WLCORE_QUIRK_DUAL_PROBE_TMPL |
|
||||||
WLCORE_QUIRK_TKIP_HEADER_SPACE;
|
WLCORE_QUIRK_TKIP_HEADER_SPACE |
|
||||||
|
WLCORE_QUIRK_START_STA_FAILS;
|
||||||
|
|
||||||
wlcore_set_min_fw_ver(wl, WL128X_CHIP_VER, WL128X_IFTYPE_VER,
|
wlcore_set_min_fw_ver(wl, WL128X_CHIP_VER, WL128X_IFTYPE_VER,
|
||||||
WL128X_MAJOR_VER, WL128X_SUBTYPE_VER,
|
WL128X_MAJOR_VER, WL128X_SUBTYPE_VER,
|
||||||
|
|
|
@ -2490,8 +2490,21 @@ static int wlcore_join(struct wl1271 *wl, struct wl12xx_vif *wlvif)
|
||||||
|
|
||||||
if (is_ibss)
|
if (is_ibss)
|
||||||
ret = wl12xx_cmd_role_start_ibss(wl, wlvif);
|
ret = wl12xx_cmd_role_start_ibss(wl, wlvif);
|
||||||
else
|
else {
|
||||||
|
if (wl->quirks & WLCORE_QUIRK_START_STA_FAILS) {
|
||||||
|
/*
|
||||||
|
* TODO: this is an ugly workaround for wl12xx fw
|
||||||
|
* bug - we are not able to tx/rx after the first
|
||||||
|
* start_sta, so make dummy start+stop calls,
|
||||||
|
* and then call start_sta again.
|
||||||
|
* this should be fixed in the fw.
|
||||||
|
*/
|
||||||
|
wl12xx_cmd_role_start_sta(wl, wlvif);
|
||||||
|
wl12xx_cmd_role_stop_sta(wl, wlvif);
|
||||||
|
}
|
||||||
|
|
||||||
ret = wl12xx_cmd_role_start_sta(wl, wlvif);
|
ret = wl12xx_cmd_role_start_sta(wl, wlvif);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -450,6 +450,9 @@ wlcore_set_min_fw_ver(struct wl1271 *wl, unsigned int chip,
|
||||||
/* Each RX/TX transaction requires an end-of-transaction transfer */
|
/* Each RX/TX transaction requires an end-of-transaction transfer */
|
||||||
#define WLCORE_QUIRK_END_OF_TRANSACTION BIT(0)
|
#define WLCORE_QUIRK_END_OF_TRANSACTION BIT(0)
|
||||||
|
|
||||||
|
/* the first start_role(sta) sometimes doesn't work on wl12xx */
|
||||||
|
#define WLCORE_QUIRK_START_STA_FAILS BIT(1)
|
||||||
|
|
||||||
/* wl127x and SPI don't support SDIO block size alignment */
|
/* wl127x and SPI don't support SDIO block size alignment */
|
||||||
#define WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN BIT(2)
|
#define WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN BIT(2)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue