Message ID | 1464583269-30255-1-git-send-email-zajec5@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | fd3667a8d1cb17f0a91771805be4efaa5c35cda1 |
Delegated to: | Kalle Valo |
Headers | show |
Rafał Miłecki wrote: > There are two firmware events we handle similarly in brcmfmac: > BRCMF_E_LINK and BRCMF_E_IF. The difference from firmware point of view > is that the first one means BSS remains present in the firmware. Trying > to (re)create it (e.g. when adding new virtual interface) will result in > an error. > > Current code treats both events in a similar way. It removes Linux > interface for each of them. It works OK with e.g. BCM43602. Its firmware > generates both events for each interface. It means we get BRCMF_E_LINK > and remove interface. That is soon followed by BRCMF_E_IF which means > BSS was also removed in a firmware. The only downside of this is a > harmless error like: > [ 208.643180] brcmfmac: brcmf_fweh_call_event_handler: no interface object > > Unfortunately BCM4366 firmware doesn't automatically remove BSS and so > it doesn't generate BRCMF_E_IF. In such case we incorrectly remove Linux > interface on BRCMF_E_LINK as BSS is still present in the firmware. It > results in an error when trying to re-create virtual interface, e.g.: > > iw phy phy1 interface add wlan1-1 type __ap > [ 3602.929199] brcmfmac: brcmf_ap_add_vif: timeout occurred > command failed: I/O error (-5) > > With this patch we don't remove Linux interface while firmware keeps > BSS. Thanks to this we keep a consistent states of host driver and > device firmware. > > Further improvement should be to mark BSS as disabled and remove > interface on BRCMF_E_LINK. Then we should add support for reusing > BSS-es. > > Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Thanks, 1 patch applied to wireless-drivers-next.git: fd3667a8d1cb brcmfmac: don't remove interface on link down firmware event
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index 38df1be..d23b95e 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -5428,7 +5428,6 @@ brcmf_notify_connect_status_ap(struct brcmf_cfg80211_info *cfg, struct net_device *ndev, const struct brcmf_event_msg *e, void *data) { - struct brcmf_if *ifp = netdev_priv(ndev); static int generation; u32 event = e->event_code; u32 reason = e->reason; @@ -5439,8 +5438,6 @@ brcmf_notify_connect_status_ap(struct brcmf_cfg80211_info *cfg, ndev != cfg_to_ndev(cfg)) { brcmf_dbg(CONN, "AP mode link down\n"); complete(&cfg->vif_disabled); - if (ifp->vif->mbss) - brcmf_remove_interface(ifp); return 0; }