Commit 397f36c1 authored by Jérôme Pouiller's avatar Jérôme Pouiller Committed by Greg Kroah-Hartman

staging: wfx: introduce update_probe_tmpl()

Simplify wfx_hw_scan() by splitting out the update of the probe request.
Signed-off-by: default avatarJérôme Pouiller <jerome.pouiller@silabs.com>
Link: https://lore.kernel.org/r/20191217161318.31402-49-Jerome.Pouiller@silabs.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 945ce30a
...@@ -49,6 +49,27 @@ static int wfx_scan_start(struct wfx_vif *wvif, ...@@ -49,6 +49,27 @@ static int wfx_scan_start(struct wfx_vif *wvif,
return 0; return 0;
} }
static int update_probe_tmpl(struct wfx_vif *wvif,
struct cfg80211_scan_request *req)
{
struct hif_mib_template_frame *tmpl;
struct sk_buff *skb;
skb = ieee80211_probereq_get(wvif->wdev->hw, wvif->vif->addr,
NULL, 0, req->ie_len);
if (!skb)
return -ENOMEM;
skb_put_data(skb, req->ie, req->ie_len);
skb_push(skb, 4);
tmpl = (struct hif_mib_template_frame *)skb->data;
tmpl->frame_type = HIF_TMPLT_PRBREQ;
tmpl->frame_length = cpu_to_le16(skb->len - 4);
hif_set_template_frame(wvif, tmpl);
dev_kfree_skb(skb);
return 0;
}
int wfx_hw_scan(struct ieee80211_hw *hw, int wfx_hw_scan(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_scan_request *hw_req) struct ieee80211_scan_request *hw_req)
...@@ -56,9 +77,7 @@ int wfx_hw_scan(struct ieee80211_hw *hw, ...@@ -56,9 +77,7 @@ int wfx_hw_scan(struct ieee80211_hw *hw,
struct wfx_dev *wdev = hw->priv; struct wfx_dev *wdev = hw->priv;
struct wfx_vif *wvif = (struct wfx_vif *) vif->drv_priv; struct wfx_vif *wvif = (struct wfx_vif *) vif->drv_priv;
struct cfg80211_scan_request *req = &hw_req->req; struct cfg80211_scan_request *req = &hw_req->req;
struct sk_buff *skb;
int i, ret; int i, ret;
struct hif_mib_template_frame *p;
if (!wvif) if (!wvif)
return -EINVAL; return -EINVAL;
...@@ -72,29 +91,15 @@ int wfx_hw_scan(struct ieee80211_hw *hw, ...@@ -72,29 +91,15 @@ int wfx_hw_scan(struct ieee80211_hw *hw,
if (req->n_ssids > HIF_API_MAX_NB_SSIDS) if (req->n_ssids > HIF_API_MAX_NB_SSIDS)
return -EINVAL; return -EINVAL;
skb = ieee80211_probereq_get(hw, wvif->vif->addr, NULL, 0, req->ie_len);
if (!skb)
return -ENOMEM;
if (req->ie_len)
memcpy(skb_put(skb, req->ie_len), req->ie, req->ie_len);
mutex_lock(&wdev->conf_mutex); mutex_lock(&wdev->conf_mutex);
p = (struct hif_mib_template_frame *)skb_push(skb, 4); ret = update_probe_tmpl(wvif, req);
p->frame_type = HIF_TMPLT_PRBREQ; if (ret)
p->frame_length = cpu_to_le16(skb->len - 4); goto failed;
ret = hif_set_template_frame(wvif, p);
skb_pull(skb, 4);
if (!ret)
/* Host want to be the probe responder. */
ret = wfx_fwd_probe_req(wvif, true); ret = wfx_fwd_probe_req(wvif, true);
if (ret) { if (ret)
mutex_unlock(&wdev->conf_mutex); goto failed;
dev_kfree_skb(skb);
return ret;
}
wfx_tx_lock_flush(wdev); wfx_tx_lock_flush(wdev);
...@@ -114,13 +119,11 @@ int wfx_hw_scan(struct ieee80211_hw *hw, ...@@ -114,13 +119,11 @@ int wfx_hw_scan(struct ieee80211_hw *hw,
dst->ssid_length = req->ssids[i].ssid_len; dst->ssid_length = req->ssids[i].ssid_len;
++wvif->scan.n_ssids; ++wvif->scan.n_ssids;
} }
schedule_work(&wvif->scan.work);
failed:
mutex_unlock(&wdev->conf_mutex); mutex_unlock(&wdev->conf_mutex);
return ret;
if (skb)
dev_kfree_skb(skb);
schedule_work(&wvif->scan.work);
return 0;
} }
void wfx_scan_work(struct work_struct *work) void wfx_scan_work(struct work_struct *work)
......
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