862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
  2. Date: Thu, 9 Jul 2015 00:07:59 +0200
  3. Subject: [PATCH] brcmfmac: workaround bug with some inconsistent BSSes state
  4. MIME-Version: 1.0
  5. Content-Type: text/plain; charset=UTF-8
  6. Content-Transfer-Encoding: 8bit
  7. Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  8. ---
  9. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
  10. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
  11. @@ -665,9 +665,37 @@ static struct wireless_dev *brcmf_cfg802
  12. u32 *flags,
  13. struct vif_params *params)
  14. {
  15. + struct net_device *dev;
  16. struct wireless_dev *wdev;
  17. int err;
  18. + /*
  19. + * There is a bug with in-firmware BSS management. When adding virtual
  20. + * interface brcmfmac first tells firmware to create new BSS and then
  21. + * it creates new struct net_device.
  22. + *
  23. + * If creating/registering netdev(ice) fails, BSS remains in some bugged
  24. + * state. It conflicts with existing BSSes by overtaking their auth
  25. + * requests.
  26. + *
  27. + * It results in one BSS (addresss X) sending beacons and another BSS
  28. + * (address Y) replying to authentication requests. This makes interface
  29. + * unusable as AP.
  30. + *
  31. + * To workaround this bug we may try to guess if register_netdev(ice)
  32. + * will fail. The most obvious case is using interface name that already
  33. + * exists. This is actually quite likely with brcmfmac & some user space
  34. + * scripts as brcmfmac doesn't allow deleting virtual interfaces.
  35. + * So this bug can be triggered even by something trivial like:
  36. + * iw dev wlan0 delete
  37. + * iw phy phy0 interface add wlan0 type __ap
  38. + */
  39. + dev = dev_get_by_name(&init_net, name);
  40. + if (dev) {
  41. + dev_put(dev);
  42. + return ERR_PTR(-EEXIST);
  43. + }
  44. +
  45. brcmf_dbg(TRACE, "enter: %s type %d\n", name, type);
  46. err = brcmf_vif_add_validate(wiphy_to_cfg(wiphy), type);
  47. if (err) {