Commit 441101f6 authored by Luciano Coelho's avatar Luciano Coelho

wlcore: add quirk to disable ELP

ELP is a very complicated process in the firmware.  Due to its
complexity, in some early firmware revisions, the ELP feature is
disabled.  To support this cases, this patch adds a quirk that
disables ELP mode.

When ELP is not supported, do not attempt to enter ELP when requested by
the driver.
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent 4263c5f2
...@@ -408,11 +408,6 @@ int wlcore_boot_run_firmware(struct wl1271 *wl) ...@@ -408,11 +408,6 @@ int wlcore_boot_run_firmware(struct wl1271 *wl)
wl1271_debug(DEBUG_MAILBOX, "MBOX ptrs: 0x%x 0x%x", wl1271_debug(DEBUG_MAILBOX, "MBOX ptrs: 0x%x 0x%x",
wl->mbox_ptr[0], wl->mbox_ptr[1]); wl->mbox_ptr[0], wl->mbox_ptr[1]);
/*
* TODO: wl12xx used to set the partition here, but it seems
* that it can be done later. Make sure this is okay.
*/
wl1271_boot_fw_version(wl); wl1271_boot_fw_version(wl);
/* /*
......
...@@ -581,12 +581,19 @@ int wl1271_init_vif_specific(struct wl1271 *wl, struct ieee80211_vif *vif) ...@@ -581,12 +581,19 @@ int wl1271_init_vif_specific(struct wl1271 *wl, struct ieee80211_vif *vif)
if (ret < 0) if (ret < 0)
return ret; return ret;
} else if (!wl->sta_count) { } else if (!wl->sta_count) {
if (wl->quirks & WLCORE_QUIRK_NO_ELP) {
/* Configure for power always on */
ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
if (ret < 0)
return ret;
} else {
/* Configure for ELP power saving */ /* Configure for ELP power saving */
ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP); ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
} }
}
/* Mode specific init */ /* Mode specific init */
if (is_ap) { if (is_ap) {
......
...@@ -73,6 +73,9 @@ void wl1271_ps_elp_sleep(struct wl1271 *wl) ...@@ -73,6 +73,9 @@ void wl1271_ps_elp_sleep(struct wl1271 *wl)
{ {
struct wl12xx_vif *wlvif; struct wl12xx_vif *wlvif;
if (wl->quirks & WLCORE_QUIRK_NO_ELP)
return;
/* we shouldn't get consecutive sleep requests */ /* we shouldn't get consecutive sleep requests */
if (WARN_ON(test_and_set_bit(WL1271_FLAG_ELP_REQUESTED, &wl->flags))) if (WARN_ON(test_and_set_bit(WL1271_FLAG_ELP_REQUESTED, &wl->flags)))
return; return;
......
...@@ -324,6 +324,9 @@ int wlcore_free_hw(struct wl1271 *wl); ...@@ -324,6 +324,9 @@ int wlcore_free_hw(struct wl1271 *wl);
/* Older firmwares use an old NVS format */ /* Older firmwares use an old NVS format */
#define WLCORE_QUIRK_LEGACY_NVS BIT(5) #define WLCORE_QUIRK_LEGACY_NVS BIT(5)
/* Some firmwares may not support ELP */
#define WLCORE_QUIRK_NO_ELP BIT(6)
/* TODO: move to the lower drivers when all usages are abstracted */ /* TODO: move to the lower drivers when all usages are abstracted */
#define CHIP_ID_1271_PG10 (0x4030101) #define CHIP_ID_1271_PG10 (0x4030101)
#define CHIP_ID_1271_PG20 (0x4030111) #define CHIP_ID_1271_PG20 (0x4030111)
......
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