ath6kl: Update BSS information after connection
Since we may end up using a dummy BSS entry when roaming, allow one Beacon frame -based bssinfo from the current BSS to be processed prior to starting to filter all bssinfo events. This allows cfg80211 BSS table to be filled with proper data in the roaming case where the full Beacon data may not have been present at the time of roamed event. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
82e14f56f7
commit
551185ca0a
|
@ -360,6 +360,7 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ar->usr_bss_filter) {
|
if (!ar->usr_bss_filter) {
|
||||||
|
clear_bit(CLEAR_BSSFILTER_ON_BEACON, &ar->flag);
|
||||||
if (ath6kl_wmi_bssfilter_cmd(ar->wmi, ALL_BSS_FILTER, 0) != 0) {
|
if (ath6kl_wmi_bssfilter_cmd(ar->wmi, ALL_BSS_FILTER, 0) != 0) {
|
||||||
ath6kl_err("couldn't set bss filtering\n");
|
ath6kl_err("couldn't set bss filtering\n");
|
||||||
up(&ar->sem);
|
up(&ar->sem);
|
||||||
|
@ -638,6 +639,7 @@ static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
if (!ar->usr_bss_filter) {
|
if (!ar->usr_bss_filter) {
|
||||||
|
clear_bit(CLEAR_BSSFILTER_ON_BEACON, &ar->flag);
|
||||||
ret = ath6kl_wmi_bssfilter_cmd(
|
ret = ath6kl_wmi_bssfilter_cmd(
|
||||||
ar->wmi,
|
ar->wmi,
|
||||||
(test_bit(CONNECTED, &ar->flag) ?
|
(test_bit(CONNECTED, &ar->flag) ?
|
||||||
|
|
|
@ -394,6 +394,7 @@ struct ath6kl_req_key {
|
||||||
#define SKIP_SCAN 11
|
#define SKIP_SCAN 11
|
||||||
#define WLAN_ENABLED 12
|
#define WLAN_ENABLED 12
|
||||||
#define TESTMODE 13
|
#define TESTMODE 13
|
||||||
|
#define CLEAR_BSSFILTER_ON_BEACON 14
|
||||||
|
|
||||||
struct ath6kl {
|
struct ath6kl {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
|
|
|
@ -1011,8 +1011,10 @@ void ath6kl_scan_complete_evt(struct ath6kl *ar, int status)
|
||||||
{
|
{
|
||||||
ath6kl_cfg80211_scan_complete_event(ar, status);
|
ath6kl_cfg80211_scan_complete_event(ar, status);
|
||||||
|
|
||||||
if (!ar->usr_bss_filter)
|
if (!ar->usr_bss_filter) {
|
||||||
|
clear_bit(CLEAR_BSSFILTER_ON_BEACON, &ar->flag);
|
||||||
ath6kl_wmi_bssfilter_cmd(ar->wmi, NONE_BSS_FILTER, 0);
|
ath6kl_wmi_bssfilter_cmd(ar->wmi, NONE_BSS_FILTER, 0);
|
||||||
|
}
|
||||||
|
|
||||||
ath6kl_dbg(ATH6KL_DBG_WLAN_SCAN, "scan complete: %d\n", status);
|
ath6kl_dbg(ATH6KL_DBG_WLAN_SCAN, "scan complete: %d\n", status);
|
||||||
}
|
}
|
||||||
|
@ -1056,8 +1058,10 @@ void ath6kl_connect_event(struct ath6kl *ar, u16 channel, u8 *bssid,
|
||||||
ar->next_ep_id = ENDPOINT_2;
|
ar->next_ep_id = ENDPOINT_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ar->usr_bss_filter)
|
if (!ar->usr_bss_filter) {
|
||||||
ath6kl_wmi_bssfilter_cmd(ar->wmi, NONE_BSS_FILTER, 0);
|
set_bit(CLEAR_BSSFILTER_ON_BEACON, &ar->flag);
|
||||||
|
ath6kl_wmi_bssfilter_cmd(ar->wmi, CURRENT_BSS_FILTER, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ath6kl_tkip_micerr_event(struct ath6kl *ar, u8 keyid, bool ismcast)
|
void ath6kl_tkip_micerr_event(struct ath6kl *ar, u8 keyid, bool ismcast)
|
||||||
|
|
|
@ -917,6 +917,12 @@ static int ath6kl_wmi_bssinfo_event_rx(struct wmi *wmi, u8 *datap, int len)
|
||||||
bih->frame_type != PROBERESP_FTYPE)
|
bih->frame_type != PROBERESP_FTYPE)
|
||||||
return 0; /* Only update BSS table for now */
|
return 0; /* Only update BSS table for now */
|
||||||
|
|
||||||
|
if (bih->frame_type == BEACON_FTYPE &&
|
||||||
|
test_bit(CLEAR_BSSFILTER_ON_BEACON, &ar->flag)) {
|
||||||
|
clear_bit(CLEAR_BSSFILTER_ON_BEACON, &ar->flag);
|
||||||
|
ath6kl_wmi_bssfilter_cmd(ar->wmi, NONE_BSS_FILTER, 0);
|
||||||
|
}
|
||||||
|
|
||||||
channel = ieee80211_get_channel(ar->wdev->wiphy, le16_to_cpu(bih->ch));
|
channel = ieee80211_get_channel(ar->wdev->wiphy, le16_to_cpu(bih->ch));
|
||||||
if (channel == NULL)
|
if (channel == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
Loading…
Reference in New Issue