static int wl1271_tm_cmd_set_plt_mode(struct wl1271 *wl, struct nlattr *tb[]) { u32 val; int ret; wl1271_debug(DEBUG_TESTMODE, "testmode cmd set plt mode"); if (!tb[WL1271_TM_ATTR_PLT_MODE]) return -EINVAL; val = nla_get_u32(tb[WL1271_TM_ATTR_PLT_MODE]); switch (val) { case 0: ret = wl1271_plt_stop(wl); break; case 1: ret = wl1271_plt_start(wl); break; default: ret = -EINVAL; break; } return ret; }
static int wl1271_tm_cmd_set_plt_mode(struct wl1271 *wl, struct nlattr *tb[]) { u32 val; int ret; wl1271_debug(DEBUG_TESTMODE, "testmode cmd set plt mode"); if (!tb[WL1271_TM_ATTR_PLT_MODE]) return -EINVAL; val = nla_get_u32(tb[WL1271_TM_ATTR_PLT_MODE]); switch (val) { case PLT_OFF: ret = wl1271_plt_stop(wl); break; case PLT_ON: case PLT_CHIP_AWAKE: ret = wl1271_plt_start(wl, val); break; case PLT_FEM_DETECT: ret = wl1271_tm_detect_fem(wl, tb); break; default: ret = -EINVAL; break; } return ret; }
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; }