Commit 7019c80e authored by Yair Shapira's avatar Yair Shapira Committed by Luciano Coelho

wlcore: add plt_mode including new PLT_FEM_DETECT

add wl->plt_mode that is used to indicate different plt
working modes: this will be used to implement calibrator side
auto fem detection where driver asks firmware to detect
the wlan fem radio type and returns it to calibrator.

this is not implemented yet and plt_modes: PLT_ON and
PLT_FEM_DETECT currently behave the same.
Signed-off-by: default avatarYair Shapira <yair.shapira@ti.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent 4340d1cf
...@@ -1064,10 +1064,17 @@ static int wl12xx_chip_wakeup(struct wl1271 *wl, bool plt) ...@@ -1064,10 +1064,17 @@ static int wl12xx_chip_wakeup(struct wl1271 *wl, bool plt)
return ret; return ret;
} }
int wl1271_plt_start(struct wl1271 *wl) int wl1271_plt_start(struct wl1271 *wl, const enum plt_mode plt_mode)
{ {
int retries = WL1271_BOOT_RETRIES; int retries = WL1271_BOOT_RETRIES;
struct wiphy *wiphy = wl->hw->wiphy; struct wiphy *wiphy = wl->hw->wiphy;
static const char* const PLT_MODE[] = {
"PLT_OFF",
"PLT_ON",
"PLT_FEM_DETECT"
};
int ret; int ret;
mutex_lock(&wl->mutex); mutex_lock(&wl->mutex);
...@@ -1081,6 +1088,10 @@ int wl1271_plt_start(struct wl1271 *wl) ...@@ -1081,6 +1088,10 @@ int wl1271_plt_start(struct wl1271 *wl)
goto out; goto out;
} }
/* Indicate to lower levels that we are now in PLT mode */
wl->plt = true;
wl->plt_mode = plt_mode;
while (retries) { while (retries) {
retries--; retries--;
ret = wl12xx_chip_wakeup(wl, true); ret = wl12xx_chip_wakeup(wl, true);
...@@ -1091,9 +1102,9 @@ int wl1271_plt_start(struct wl1271 *wl) ...@@ -1091,9 +1102,9 @@ int wl1271_plt_start(struct wl1271 *wl)
if (ret < 0) if (ret < 0)
goto power_off; goto power_off;
wl->plt = true;
wl->state = WL1271_STATE_ON; wl->state = WL1271_STATE_ON;
wl1271_notice("firmware booted in PLT mode (%s)", wl1271_notice("firmware booted in PLT mode %s (%s)",
PLT_MODE[plt_mode],
wl->chip.fw_ver_str); wl->chip.fw_ver_str);
/* update hw/fw version info in wiphy struct */ /* update hw/fw version info in wiphy struct */
...@@ -1107,6 +1118,9 @@ int wl1271_plt_start(struct wl1271 *wl) ...@@ -1107,6 +1118,9 @@ int wl1271_plt_start(struct wl1271 *wl)
wl1271_power_off(wl); wl1271_power_off(wl);
} }
wl->plt = false;
wl->plt_mode = PLT_OFF;
wl1271_error("firmware boot in PLT mode failed despite %d retries", wl1271_error("firmware boot in PLT mode failed despite %d retries",
WL1271_BOOT_RETRIES); WL1271_BOOT_RETRIES);
out: out:
...@@ -1159,6 +1173,7 @@ int wl1271_plt_stop(struct wl1271 *wl) ...@@ -1159,6 +1173,7 @@ int wl1271_plt_stop(struct wl1271 *wl)
wl->sleep_auth = WL1271_PSM_ILLEGAL; wl->sleep_auth = WL1271_PSM_ILLEGAL;
wl->state = WL1271_STATE_OFF; wl->state = WL1271_STATE_OFF;
wl->plt = false; wl->plt = false;
wl->plt_mode = PLT_OFF;
wl->rx_counter = 0; wl->rx_counter = 0;
mutex_unlock(&wl->mutex); mutex_unlock(&wl->mutex);
......
...@@ -258,11 +258,12 @@ static int wl1271_tm_cmd_set_plt_mode(struct wl1271 *wl, struct nlattr *tb[]) ...@@ -258,11 +258,12 @@ static int wl1271_tm_cmd_set_plt_mode(struct wl1271 *wl, struct nlattr *tb[])
val = nla_get_u32(tb[WL1271_TM_ATTR_PLT_MODE]); val = nla_get_u32(tb[WL1271_TM_ATTR_PLT_MODE]);
switch (val) { switch (val) {
case 0: case PLT_OFF:
ret = wl1271_plt_stop(wl); ret = wl1271_plt_stop(wl);
break; break;
case 1: case PLT_ON:
ret = wl1271_plt_start(wl); case PLT_FEM_DETECT:
ret = wl1271_plt_start(wl, val);
break; break;
default: default:
ret = -EINVAL; ret = -EINVAL;
......
...@@ -156,6 +156,7 @@ struct wl1271 { ...@@ -156,6 +156,7 @@ struct wl1271 {
enum wl1271_state state; enum wl1271_state state;
enum wl12xx_fw_type fw_type; enum wl12xx_fw_type fw_type;
bool plt; bool plt;
enum plt_mode plt_mode;
u8 last_vif_count; u8 last_vif_count;
struct mutex mutex; struct mutex mutex;
......
...@@ -293,6 +293,12 @@ enum rx_filter_action { ...@@ -293,6 +293,12 @@ enum rx_filter_action {
FILTER_FW_HANDLE = 2 FILTER_FW_HANDLE = 2
}; };
enum plt_mode {
PLT_OFF = 0,
PLT_ON = 1,
PLT_FEM_DETECT = 2,
};
struct wl12xx_rx_filter_field { struct wl12xx_rx_filter_field {
__le16 offset; __le16 offset;
u8 len; u8 len;
...@@ -459,7 +465,7 @@ struct ieee80211_vif *wl12xx_wlvif_to_vif(struct wl12xx_vif *wlvif) ...@@ -459,7 +465,7 @@ struct ieee80211_vif *wl12xx_wlvif_to_vif(struct wl12xx_vif *wlvif)
#define wl12xx_for_each_wlvif_ap(wl, wlvif) \ #define wl12xx_for_each_wlvif_ap(wl, wlvif) \
wl12xx_for_each_wlvif_bss_type(wl, wlvif, BSS_TYPE_AP_BSS) wl12xx_for_each_wlvif_bss_type(wl, wlvif, BSS_TYPE_AP_BSS)
int wl1271_plt_start(struct wl1271 *wl); int wl1271_plt_start(struct wl1271 *wl, const enum plt_mode plt_mode);
int wl1271_plt_stop(struct wl1271 *wl); int wl1271_plt_stop(struct wl1271 *wl);
int wl1271_recalc_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_recalc_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif);
void wl12xx_queue_recovery_work(struct wl1271 *wl); void wl12xx_queue_recovery_work(struct wl1271 *wl);
......
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