Skip to content

Commit

Permalink
wlcore/wl12xx: calibrator fem detect implementation
Browse files Browse the repository at this point in the history
this completes the calibrator based fem detect logic in driver:
driver starts (by calibrator) in plt_mode PLT_FEM_DETECT
wlcore inits and starts plt on wl12xx
wl12xx fetches fem number from firmware and stores it in wl->fem_manuf
wl12xx immediatly returns (doesn't start radio, etc...)
wlcore returns the fem_manuf to calibrator using WL1271_TM_ATTR_DATA
plt_mode is stopped

Signed-off-by: Yair Shapira <yair.shapira@ti.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
  • Loading branch information
Yair Shapira authored and Luciano Coelho committed Jul 18, 2012
1 parent 16bc10c commit ff32431
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 5 deletions.
34 changes: 30 additions & 4 deletions drivers/net/wireless/ti/wl12xx/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,11 @@ int wl1271_cmd_general_parms(struct wl1271 *wl)

memcpy(&gen_parms->general_params, gp, sizeof(*gp));

if (gp->tx_bip_fem_auto_detect)
/* If we started in PLT FEM_DETECT mode, force auto detect */
if (wl->plt_mode == PLT_FEM_DETECT)
gen_parms->general_params.tx_bip_fem_auto_detect = true;

if (gen_parms->general_params.tx_bip_fem_auto_detect)
answer = true;

/* Override the REF CLK from the NVS with the one from platform data */
Expand All @@ -106,8 +110,17 @@ int wl1271_cmd_general_parms(struct wl1271 *wl)
goto out;
}

/* If we are in calibrator based fem auto detect - save fem nr */
if (wl->plt_mode == PLT_FEM_DETECT)
wl->fem_manuf = gp->tx_bip_fem_manufacturer;

wl1271_debug(DEBUG_CMD, "FEM autodetect: %s, manufacturer: %d\n",
answer ? "auto" : "manual", gp->tx_bip_fem_manufacturer);
answer == false ?
"manual" :
wl->plt_mode == PLT_FEM_DETECT ?
"calibrator_fem_detect" :
"auto",
gp->tx_bip_fem_manufacturer);

out:
kfree(gen_parms);
Expand Down Expand Up @@ -139,7 +152,11 @@ int wl128x_cmd_general_parms(struct wl1271 *wl)

memcpy(&gen_parms->general_params, gp, sizeof(*gp));

if (gp->tx_bip_fem_auto_detect)
/* If we started in PLT FEM_DETECT mode, force auto detect */
if (wl->plt_mode == PLT_FEM_DETECT)
gen_parms->general_params.tx_bip_fem_auto_detect = true;

if (gen_parms->general_params.tx_bip_fem_auto_detect)
answer = true;

/* Replace REF and TCXO CLKs with the ones from platform data */
Expand All @@ -161,8 +178,17 @@ int wl128x_cmd_general_parms(struct wl1271 *wl)
goto out;
}

/* If we are in calibrator based fem auto detect - save fem nr */
if (wl->plt_mode == PLT_FEM_DETECT)
wl->fem_manuf = gp->tx_bip_fem_manufacturer;

wl1271_debug(DEBUG_CMD, "FEM autodetect: %s, manufacturer: %d\n",
answer ? "auto" : "manual", gp->tx_bip_fem_manufacturer);
answer == false ?
"manual" :
wl->plt_mode == PLT_FEM_DETECT ?
"calibrator_fem_detect" :
"auto",
gp->tx_bip_fem_manufacturer);

out:
kfree(gen_parms);
Expand Down
23 changes: 23 additions & 0 deletions drivers/net/wireless/ti/wl12xx/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1339,6 +1339,14 @@ static int wl12xx_hw_init(struct wl1271 *wl)
ret = wl128x_cmd_general_parms(wl);
if (ret < 0)
goto out;

/*
* If we are in calibrator based auto detect then we got the FEM nr
* in wl->fem_manuf. No need to continue further
*/
if (wl->plt_mode == PLT_FEM_DETECT)
goto out;

ret = wl128x_cmd_radio_parms(wl);
if (ret < 0)
goto out;
Expand All @@ -1355,6 +1363,14 @@ static int wl12xx_hw_init(struct wl1271 *wl)
ret = wl1271_cmd_general_parms(wl);
if (ret < 0)
goto out;

/*
* If we are in calibrator based auto detect then we got the FEM nr
* in wl->fem_manuf. No need to continue further
*/
if (wl->plt_mode == PLT_FEM_DETECT)
goto out;

ret = wl1271_cmd_radio_parms(wl);
if (ret < 0)
goto out;
Expand Down Expand Up @@ -1500,6 +1516,13 @@ static int wl12xx_plt_init(struct wl1271 *wl)
if (ret < 0)
goto out_irq_disable;

/*
* If we are in calibrator based auto detect then we got the FEM nr
* in wl->fem_manuf. No need to continue further
*/
if (wl->plt_mode == PLT_FEM_DETECT)
goto out;

ret = wl1271_acx_init_mem_config(wl);
if (ret < 0)
goto out_irq_disable;
Expand Down
41 changes: 40 additions & 1 deletion drivers/net/wireless/ti/wlcore/testmode.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,43 @@ static int wl1271_tm_cmd_configure(struct wl1271 *wl, struct nlattr *tb[])
return 0;
}

static int wl1271_tm_detect_fem(struct wl1271 *wl, struct nlattr *tb[])
{
/* return FEM type */
int ret, len;
struct sk_buff *skb;

ret = wl1271_plt_start(wl, PLT_FEM_DETECT);
if (ret < 0)
goto out;

mutex_lock(&wl->mutex);

len = nla_total_size(sizeof(wl->fem_manuf));
skb = cfg80211_testmode_alloc_reply_skb(wl->hw->wiphy, len);
if (!skb) {
ret = -ENOMEM;
goto out_mutex;
}

if (nla_put(skb, WL1271_TM_ATTR_DATA, sizeof(wl->fem_manuf),
&wl->fem_manuf)) {
kfree_skb(skb);
ret = -EMSGSIZE;
goto out_mutex;
}

ret = cfg80211_testmode_reply(skb);

out_mutex:
mutex_unlock(&wl->mutex);

/* We always stop plt after DETECT mode */
wl1271_plt_stop(wl);
out:
return ret;
}

static int wl1271_tm_cmd_set_plt_mode(struct wl1271 *wl, struct nlattr *tb[])
{
u32 val;
Expand All @@ -262,8 +299,10 @@ static int wl1271_tm_cmd_set_plt_mode(struct wl1271 *wl, struct nlattr *tb[])
ret = wl1271_plt_stop(wl);
break;
case PLT_ON:
ret = wl1271_plt_start(wl, PLT_ON);
break;
case PLT_FEM_DETECT:
ret = wl1271_plt_start(wl, val);
ret = wl1271_tm_detect_fem(wl, tb);
break;
default:
ret = -EINVAL;
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/ti/wlcore/wlcore.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ struct wl1271 {
enum wl12xx_fw_type fw_type;
bool plt;
enum plt_mode plt_mode;
u8 fem_manuf;
u8 last_vif_count;
struct mutex mutex;

Expand Down

0 comments on commit ff32431

Please sign in to comment.