diff options
Diffstat (limited to 'drivers/net/wireless/ti/wlcore/testmode.c')
| -rw-r--r-- | drivers/net/wireless/ti/wlcore/testmode.c | 112 | 
1 files changed, 76 insertions, 36 deletions
diff --git a/drivers/net/wireless/ti/wlcore/testmode.c b/drivers/net/wireless/ti/wlcore/testmode.c index 0e59ea2cdd39..49e5ee1525c9 100644 --- a/drivers/net/wireless/ti/wlcore/testmode.c +++ b/drivers/net/wireless/ti/wlcore/testmode.c @@ -40,7 +40,7 @@ enum wl1271_tm_commands {  	WL1271_TM_CMD_CONFIGURE,  	WL1271_TM_CMD_NVS_PUSH,		/* Not in use. Keep to not break ABI */  	WL1271_TM_CMD_SET_PLT_MODE, -	WL1271_TM_CMD_RECOVER, +	WL1271_TM_CMD_RECOVER,		/* Not in use. Keep to not break ABI */  	WL1271_TM_CMD_GET_MAC,  	__WL1271_TM_CMD_AFTER_LAST @@ -108,6 +108,20 @@ static int wl1271_tm_cmd_test(struct wl1271 *wl, struct nlattr *tb[])  	}  	if (answer) { +		/* If we got bip calibration answer print radio status */ +		struct wl1271_cmd_cal_p2g *params = +			(struct wl1271_cmd_cal_p2g *) buf; + +		s16 radio_status = (s16) le16_to_cpu(params->radio_status); + +		if (params->test.id == TEST_CMD_P2G_CAL && +		    radio_status < 0) +			wl1271_warning("testmode cmd: radio status=%d", +					radio_status); +		else +			wl1271_info("testmode cmd: radio status=%d", +					radio_status); +  		len = nla_total_size(buf_len);  		skb = cfg80211_testmode_alloc_reply_skb(wl->hw->wiphy, len);  		if (!skb) { @@ -115,8 +129,12 @@ static int wl1271_tm_cmd_test(struct wl1271 *wl, struct nlattr *tb[])  			goto out_sleep;  		} -		if (nla_put(skb, WL1271_TM_ATTR_DATA, buf_len, buf)) -			goto nla_put_failure; +		if (nla_put(skb, WL1271_TM_ATTR_DATA, buf_len, buf)) { +			kfree_skb(skb); +			ret = -EMSGSIZE; +			goto out_sleep; +		} +  		ret = cfg80211_testmode_reply(skb);  		if (ret < 0)  			goto out_sleep; @@ -128,11 +146,6 @@ out:  	mutex_unlock(&wl->mutex);  	return ret; - -nla_put_failure: -	kfree_skb(skb); -	ret = -EMSGSIZE; -	goto out_sleep;  }  static int wl1271_tm_cmd_interrogate(struct wl1271 *wl, struct nlattr *tb[]) @@ -178,8 +191,12 @@ static int wl1271_tm_cmd_interrogate(struct wl1271 *wl, struct nlattr *tb[])  		goto out_free;  	} -	if (nla_put(skb, WL1271_TM_ATTR_DATA, sizeof(*cmd), cmd)) -		goto nla_put_failure; +	if (nla_put(skb, WL1271_TM_ATTR_DATA, sizeof(*cmd), cmd)) { +		kfree_skb(skb); +		ret = -EMSGSIZE; +		goto out_free; +	} +  	ret = cfg80211_testmode_reply(skb);  	if (ret < 0)  		goto out_free; @@ -192,11 +209,6 @@ out:  	mutex_unlock(&wl->mutex);  	return ret; - -nla_put_failure: -	kfree_skb(skb); -	ret = -EMSGSIZE; -	goto out_free;  }  static int wl1271_tm_cmd_configure(struct wl1271 *wl, struct nlattr *tb[]) @@ -231,6 +243,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; @@ -244,11 +293,14 @@ static int wl1271_tm_cmd_set_plt_mode(struct wl1271 *wl, struct nlattr *tb[])  	val = nla_get_u32(tb[WL1271_TM_ATTR_PLT_MODE]);  	switch (val) { -	case 0: +	case PLT_OFF:  		ret = wl1271_plt_stop(wl);  		break; -	case 1: -		ret = wl1271_plt_start(wl); +	case PLT_ON: +		ret = wl1271_plt_start(wl, PLT_ON); +		break; +	case PLT_FEM_DETECT: +		ret = wl1271_tm_detect_fem(wl, tb);  		break;  	default:  		ret = -EINVAL; @@ -258,15 +310,6 @@ static int wl1271_tm_cmd_set_plt_mode(struct wl1271 *wl, struct nlattr *tb[])  	return ret;  } -static int wl1271_tm_cmd_recover(struct wl1271 *wl, struct nlattr *tb[]) -{ -	wl1271_debug(DEBUG_TESTMODE, "testmode cmd recover"); - -	wl12xx_queue_recovery_work(wl); - -	return 0; -} -  static int wl12xx_tm_cmd_get_mac(struct wl1271 *wl, struct nlattr *tb[])  {  	struct sk_buff *skb; @@ -298,8 +341,12 @@ static int wl12xx_tm_cmd_get_mac(struct wl1271 *wl, struct nlattr *tb[])  		goto out;  	} -	if (nla_put(skb, WL1271_TM_ATTR_DATA, ETH_ALEN, mac_addr)) -		goto nla_put_failure; +	if (nla_put(skb, WL1271_TM_ATTR_DATA, ETH_ALEN, mac_addr)) { +		kfree_skb(skb); +		ret = -EMSGSIZE; +		goto out; +	} +  	ret = cfg80211_testmode_reply(skb);  	if (ret < 0)  		goto out; @@ -307,11 +354,6 @@ static int wl12xx_tm_cmd_get_mac(struct wl1271 *wl, struct nlattr *tb[])  out:  	mutex_unlock(&wl->mutex);  	return ret; - -nla_put_failure: -	kfree_skb(skb); -	ret = -EMSGSIZE; -	goto out;  }  int wl1271_tm_cmd(struct ieee80211_hw *hw, void *data, int len) @@ -336,8 +378,6 @@ int wl1271_tm_cmd(struct ieee80211_hw *hw, void *data, int len)  		return wl1271_tm_cmd_configure(wl, tb);  	case WL1271_TM_CMD_SET_PLT_MODE:  		return wl1271_tm_cmd_set_plt_mode(wl, tb); -	case WL1271_TM_CMD_RECOVER: -		return wl1271_tm_cmd_recover(wl, tb);  	case WL1271_TM_CMD_GET_MAC:  		return wl12xx_tm_cmd_get_mac(wl, tb);  	default:  | 
