|
@@ -4606,12 +4606,13 @@ brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,
|
|
|
struct brcmf_cfg80211_profile *profile = cfg->profile;
|
|
|
struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg);
|
|
|
struct wiphy *wiphy = cfg_to_wiphy(cfg);
|
|
|
- struct brcmf_channel_info_le channel_le;
|
|
|
- struct ieee80211_channel *notify_channel;
|
|
|
+ struct ieee80211_channel *notify_channel = NULL;
|
|
|
struct ieee80211_supported_band *band;
|
|
|
+ struct brcmf_bss_info_le *bi;
|
|
|
u32 freq;
|
|
|
s32 err = 0;
|
|
|
u32 target_channel;
|
|
|
+ u8 *buf;
|
|
|
|
|
|
WL_TRACE("Enter\n");
|
|
|
|
|
@@ -4619,11 +4620,22 @@ brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,
|
|
|
memcpy(profile->bssid, e->addr, ETH_ALEN);
|
|
|
brcmf_update_bss_info(cfg);
|
|
|
|
|
|
- brcmf_exec_dcmd(ndev, BRCMF_C_GET_CHANNEL, &channel_le,
|
|
|
- sizeof(channel_le));
|
|
|
+ buf = kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL);
|
|
|
+ if (buf == NULL) {
|
|
|
+ err = -ENOMEM;
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* data sent to dongle has to be little endian */
|
|
|
+ *(__le32 *)buf = cpu_to_le32(WL_BSS_INFO_MAX);
|
|
|
+ err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_BSS_INFO, buf, WL_BSS_INFO_MAX);
|
|
|
+
|
|
|
+ if (err)
|
|
|
+ goto done;
|
|
|
|
|
|
- target_channel = le32_to_cpu(channel_le.target_channel);
|
|
|
- WL_CONN("Roamed to channel %d\n", target_channel);
|
|
|
+ bi = (struct brcmf_bss_info_le *)(buf + 4);
|
|
|
+ target_channel = bi->ctl_ch ? bi->ctl_ch :
|
|
|
+ CHSPEC_CHANNEL(le16_to_cpu(bi->chanspec));
|
|
|
|
|
|
if (target_channel <= CH_MAX_2G_CHANNEL)
|
|
|
band = wiphy->bands[IEEE80211_BAND_2GHZ];
|
|
@@ -4633,6 +4645,8 @@ brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,
|
|
|
freq = ieee80211_channel_to_frequency(target_channel, band->band);
|
|
|
notify_channel = ieee80211_get_channel(wiphy, freq);
|
|
|
|
|
|
+done:
|
|
|
+ kfree(buf);
|
|
|
cfg80211_roamed(ndev, notify_channel, (u8 *)profile->bssid,
|
|
|
conn_info->req_ie, conn_info->req_ie_len,
|
|
|
conn_info->resp_ie, conn_info->resp_ie_len, GFP_KERNEL);
|