staging: wfx: simplify hif_join()
The structure hif_req_join come from hardware API. It is not intended to be manipulated in upper layers of the driver. In add, current code for hif_join() is too dumb. It should pack data with hardware representation instead of leaving all work to the caller. Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com> Link: https://lore.kernel.org/r/20200115135338.14374-30-Jerome.Pouiller@silabs.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
a09343fc35
commit
9ced9b5937
@ -288,18 +288,29 @@ int hif_stop_scan(struct wfx_vif *wvif)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hif_join(struct wfx_vif *wvif, const struct hif_req_join *arg)
|
int hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf,
|
||||||
|
const struct ieee80211_channel *channel, const u8 *ssidie)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct hif_msg *hif;
|
struct hif_msg *hif;
|
||||||
struct hif_req_join *body = wfx_alloc_hif(sizeof(*body), &hif);
|
struct hif_req_join *body = wfx_alloc_hif(sizeof(*body), &hif);
|
||||||
|
|
||||||
memcpy(body, arg, sizeof(struct hif_req_join));
|
WARN_ON(!conf->basic_rates);
|
||||||
cpu_to_le16s(&body->channel_number);
|
body->infrastructure_bss_mode = !conf->ibss_joined;
|
||||||
cpu_to_le16s(&body->atim_window);
|
body->short_preamble = conf->use_short_preamble;
|
||||||
cpu_to_le32s(&body->ssid_length);
|
if (channel && channel->flags & IEEE80211_CHAN_NO_IR)
|
||||||
cpu_to_le32s(&body->beacon_interval);
|
body->probe_for_join = 0;
|
||||||
cpu_to_le32s(&body->basic_rate_set);
|
else
|
||||||
|
body->probe_for_join = 1;
|
||||||
|
body->channel_number = cpu_to_le16(channel->hw_value);
|
||||||
|
body->beacon_interval = cpu_to_le32(conf->beacon_int);
|
||||||
|
body->basic_rate_set =
|
||||||
|
cpu_to_le32(wfx_rate_mask_to_hw(wvif->wdev, conf->basic_rates));
|
||||||
|
memcpy(body->bssid, conf->bssid, sizeof(body->bssid));
|
||||||
|
if (!conf->ibss_joined && ssidie) {
|
||||||
|
body->ssid_length = cpu_to_le32(ssidie[1]);
|
||||||
|
memcpy(body->ssid, &ssidie[2], ssidie[1]);
|
||||||
|
}
|
||||||
wfx_fill_header(hif, wvif->id, HIF_REQ_ID_JOIN, sizeof(*body));
|
wfx_fill_header(hif, wvif->id, HIF_REQ_ID_JOIN, sizeof(*body));
|
||||||
ret = wfx_cmd_send(wvif->wdev, hif, NULL, 0, false);
|
ret = wfx_cmd_send(wvif->wdev, hif, NULL, 0, false);
|
||||||
kfree(hif);
|
kfree(hif);
|
||||||
|
@ -45,7 +45,8 @@ int hif_write_mib(struct wfx_dev *wdev, int vif_id, u16 mib_id,
|
|||||||
int hif_scan(struct wfx_vif *wvif, struct cfg80211_scan_request *req80211,
|
int hif_scan(struct wfx_vif *wvif, struct cfg80211_scan_request *req80211,
|
||||||
int chan_start, int chan_num);
|
int chan_start, int chan_num);
|
||||||
int hif_stop_scan(struct wfx_vif *wvif);
|
int hif_stop_scan(struct wfx_vif *wvif);
|
||||||
int hif_join(struct wfx_vif *wvif, const struct hif_req_join *arg);
|
int hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf,
|
||||||
|
const struct ieee80211_channel *channel, const u8 *ssidie);
|
||||||
int hif_set_pm(struct wfx_vif *wvif, bool ps, int dynamic_ps_timeout);
|
int hif_set_pm(struct wfx_vif *wvif, bool ps, int dynamic_ps_timeout);
|
||||||
int hif_set_bss_params(struct wfx_vif *wvif,
|
int hif_set_bss_params(struct wfx_vif *wvif,
|
||||||
const struct hif_req_set_bss_params *arg);
|
const struct hif_req_set_bss_params *arg);
|
||||||
|
@ -512,32 +512,19 @@ static void wfx_set_mfp(struct wfx_vif *wvif,
|
|||||||
|
|
||||||
static void wfx_do_join(struct wfx_vif *wvif)
|
static void wfx_do_join(struct wfx_vif *wvif)
|
||||||
{
|
{
|
||||||
const u8 *bssid;
|
int ret;
|
||||||
|
const u8 *ssidie;
|
||||||
struct ieee80211_bss_conf *conf = &wvif->vif->bss_conf;
|
struct ieee80211_bss_conf *conf = &wvif->vif->bss_conf;
|
||||||
struct cfg80211_bss *bss = NULL;
|
struct cfg80211_bss *bss = NULL;
|
||||||
struct hif_req_join join = {
|
|
||||||
.infrastructure_bss_mode = !conf->ibss_joined,
|
|
||||||
.short_preamble = conf->use_short_preamble,
|
|
||||||
.probe_for_join = 1,
|
|
||||||
.atim_window = 0,
|
|
||||||
.basic_rate_set = wfx_rate_mask_to_hw(wvif->wdev,
|
|
||||||
conf->basic_rates),
|
|
||||||
};
|
|
||||||
|
|
||||||
wfx_tx_lock_flush(wvif->wdev);
|
wfx_tx_lock_flush(wvif->wdev);
|
||||||
|
|
||||||
if (wvif->channel->flags & IEEE80211_CHAN_NO_IR)
|
|
||||||
join.probe_for_join = 0;
|
|
||||||
|
|
||||||
if (wvif->state)
|
if (wvif->state)
|
||||||
wfx_do_unjoin(wvif);
|
wfx_do_unjoin(wvif);
|
||||||
|
|
||||||
bssid = wvif->vif->bss_conf.bssid;
|
|
||||||
|
|
||||||
bss = cfg80211_get_bss(wvif->wdev->hw->wiphy, wvif->channel,
|
bss = cfg80211_get_bss(wvif->wdev->hw->wiphy, wvif->channel,
|
||||||
bssid, NULL, 0,
|
conf->bssid, NULL, 0,
|
||||||
IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
|
IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
|
||||||
|
|
||||||
if (!bss && !conf->ibss_joined) {
|
if (!bss && !conf->ibss_joined) {
|
||||||
wfx_tx_unlock(wvif->wdev);
|
wfx_tx_unlock(wvif->wdev);
|
||||||
return;
|
return;
|
||||||
@ -545,29 +532,15 @@ static void wfx_do_join(struct wfx_vif *wvif)
|
|||||||
|
|
||||||
mutex_lock(&wvif->wdev->conf_mutex);
|
mutex_lock(&wvif->wdev->conf_mutex);
|
||||||
|
|
||||||
/* Sanity check basic rates */
|
|
||||||
if (!join.basic_rate_set)
|
|
||||||
join.basic_rate_set = 7;
|
|
||||||
|
|
||||||
/* Sanity check beacon interval */
|
/* Sanity check beacon interval */
|
||||||
if (!wvif->beacon_int)
|
if (!wvif->beacon_int)
|
||||||
wvif->beacon_int = 1;
|
wvif->beacon_int = 1;
|
||||||
|
|
||||||
join.beacon_interval = wvif->beacon_int;
|
rcu_read_lock();
|
||||||
join.channel_number = wvif->channel->hw_value;
|
if (!conf->ibss_joined)
|
||||||
memcpy(join.bssid, bssid, sizeof(join.bssid));
|
|
||||||
|
|
||||||
if (!conf->ibss_joined) {
|
|
||||||
const u8 *ssidie;
|
|
||||||
|
|
||||||
rcu_read_lock();
|
|
||||||
ssidie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID);
|
ssidie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID);
|
||||||
if (ssidie) {
|
else
|
||||||
join.ssid_length = ssidie[1];
|
ssidie = NULL;
|
||||||
memcpy(join.ssid, &ssidie[2], join.ssid_length);
|
|
||||||
}
|
|
||||||
rcu_read_unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
wfx_tx_flush(wvif->wdev);
|
wfx_tx_flush(wvif->wdev);
|
||||||
|
|
||||||
@ -578,7 +551,9 @@ static void wfx_do_join(struct wfx_vif *wvif)
|
|||||||
|
|
||||||
/* Perform actual join */
|
/* Perform actual join */
|
||||||
wvif->wdev->tx_burst_idx = -1;
|
wvif->wdev->tx_burst_idx = -1;
|
||||||
if (hif_join(wvif, &join)) {
|
ret = hif_join(wvif, conf, wvif->channel, ssidie);
|
||||||
|
rcu_read_unlock();
|
||||||
|
if (ret) {
|
||||||
ieee80211_connection_loss(wvif->vif);
|
ieee80211_connection_loss(wvif->vif);
|
||||||
wvif->join_complete_status = -1;
|
wvif->join_complete_status = -1;
|
||||||
/* Tx lock still held, unjoin will clear it. */
|
/* Tx lock still held, unjoin will clear it. */
|
||||||
|
Loading…
Reference in New Issue
Block a user