mac80211: merge a fix for a race condition on station removal
[openwrt.git] / package / mac80211 / patches / 870-brcmsmac-react-on-changing-SSID.patch
1 --- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
2 +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
3 @@ -523,6 +523,12 @@ brcms_ops_bss_info_changed(struct ieee80
4                 brcms_c_set_addrmatch(wl->wlc, RCM_BSSID_OFFSET, info->bssid);
5                 spin_unlock_bh(&wl->lock);
6         }
7 +       if (changed & BSS_CHANGED_SSID) {
8 +               /* BSSID changed, for whatever reason (IBSS and managed mode) */
9 +               spin_lock_bh(&wl->lock);
10 +               brcms_c_set_ssid(wl->wlc, info->ssid, info->ssid_len);
11 +               spin_unlock_bh(&wl->lock);
12 +       }
13         if (changed & BSS_CHANGED_BEACON) {
14                 /* Beacon data changed, retrieve new beacon (beaconing modes) */
15                 struct sk_buff *beacon;
16 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
17 +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
18 @@ -3785,6 +3785,15 @@ static void brcms_c_set_bssid(struct brc
19         brcms_c_set_addrmatch(bsscfg->wlc, RCM_BSSID_OFFSET, bsscfg->BSSID);
20  }
21  
22 +void brcms_c_set_ssid(struct brcms_c_info *wlc, u8 *ssid, size_t ssid_len)
23 +{
24 +       u8 len = min_t(u8, sizeof(wlc->bsscfg->SSID), ssid_len);
25 +       memset(wlc->bsscfg->SSID, 0, sizeof(wlc->bsscfg->SSID));
26 +
27 +       memcpy(wlc->bsscfg->SSID, ssid, len);
28 +       wlc->bsscfg->SSID_len = len;
29 +}
30 +
31  static void brcms_b_set_shortslot(struct brcms_hardware *wlc_hw, bool shortslot)
32  {
33         wlc_hw->shortslot = shortslot;
34 --- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
35 +++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
36 @@ -336,5 +336,7 @@ extern void brcms_c_update_beacon(struct
37  extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
38                                    struct sk_buff *beacon, u16 tim_offset,
39                                    u16 dtim_period);
40 +extern void brcms_c_set_ssid(struct brcms_c_info *wlc, u8 *ssid,
41 +                            size_t ssid_len);
42  
43  #endif                         /* _BRCM_PUB_H_ */