2
0

104-v5.4-0005-brcmfmac-avoid-firmware-commands-when-bus-is-down.patch 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. From 66ab63fbb33bf367807e3e471231379dce6f8b8c Mon Sep 17 00:00:00 2001
  2. From: Arend van Spriel <[email protected]>
  3. Date: Thu, 11 Jul 2019 11:05:10 +0200
  4. Subject: [PATCH 5/7] brcmfmac: avoid firmware commands when bus is down
  5. Upon rmmod a few attempts are made to inform firmware, but there is
  6. no point as the bus is down and these will fail. Avoid them to keep
  7. the logs clean.
  8. Reported-by: Stefan Wahren <[email protected]>
  9. Reviewed-by: Hante Meuleman <[email protected]>
  10. Reviewed-by: Pieter-Paul Giesberts <[email protected]>
  11. Reviewed-by: Franky Lin <[email protected]>
  12. Signed-off-by: Arend van Spriel <[email protected]>
  13. ---
  14. .../broadcom/brcm80211/brcmfmac/cfg80211.c | 23 +++++++++++--------
  15. 1 file changed, 13 insertions(+), 10 deletions(-)
  16. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
  17. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
  18. @@ -1286,17 +1286,21 @@ static void brcmf_link_down(struct brcmf
  19. {
  20. struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy);
  21. struct brcmf_pub *drvr = cfg->pub;
  22. + bool bus_up = drvr->bus_if->state == BRCMF_BUS_UP;
  23. s32 err = 0;
  24. brcmf_dbg(TRACE, "Enter\n");
  25. if (test_and_clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state)) {
  26. - brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n");
  27. - err = brcmf_fil_cmd_data_set(vif->ifp,
  28. - BRCMF_C_DISASSOC, NULL, 0);
  29. - if (err) {
  30. - bphy_err(drvr, "WLC_DISASSOC failed (%d)\n", err);
  31. + if (bus_up) {
  32. + brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n");
  33. + err = brcmf_fil_cmd_data_set(vif->ifp,
  34. + BRCMF_C_DISASSOC, NULL, 0);
  35. + if (err)
  36. + bphy_err(drvr, "WLC_DISASSOC failed (%d)\n",
  37. + err);
  38. }
  39. +
  40. if ((vif->wdev.iftype == NL80211_IFTYPE_STATION) ||
  41. (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT))
  42. cfg80211_disconnected(vif->wdev.netdev, reason, NULL, 0,
  43. @@ -1306,7 +1310,8 @@ static void brcmf_link_down(struct brcmf
  44. clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
  45. brcmf_btcoex_set_mode(vif, BRCMF_BTCOEX_ENABLED, 0);
  46. if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_NONE) {
  47. - brcmf_set_pmk(vif->ifp, NULL, 0);
  48. + if (bus_up)
  49. + brcmf_set_pmk(vif->ifp, NULL, 0);
  50. vif->profile.use_fwsup = BRCMF_PROFILE_FWSUP_NONE;
  51. }
  52. brcmf_dbg(TRACE, "Exit\n");
  53. @@ -5004,18 +5009,16 @@ static int brcmf_cfg80211_get_channel(st
  54. struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
  55. struct net_device *ndev = wdev->netdev;
  56. struct brcmf_pub *drvr = cfg->pub;
  57. - struct brcmf_if *ifp;
  58. struct brcmu_chan ch;
  59. enum nl80211_band band = 0;
  60. enum nl80211_chan_width width = 0;
  61. u32 chanspec;
  62. int freq, err;
  63. - if (!ndev)
  64. + if (!ndev || drvr->bus_if->state != BRCMF_BUS_UP)
  65. return -ENODEV;
  66. - ifp = netdev_priv(ndev);
  67. - err = brcmf_fil_iovar_int_get(ifp, "chanspec", &chanspec);
  68. + err = brcmf_fil_iovar_int_get(netdev_priv(ndev), "chanspec", &chanspec);
  69. if (err) {
  70. bphy_err(drvr, "chanspec failed (%d)\n", err);
  71. return err;