1. 24 6月, 2019 1 次提交
  2. 19 6月, 2019 3 次提交
  3. 18 6月, 2019 3 次提交
    • D
      brcmfmac: sdio: Don't tune while the card is off · 65dade60
      Douglas Anderson 提交于
      When Broadcom SDIO cards are idled they go to sleep and a whole
      separate subsystem takes over their SDIO communication.  This is the
      Always-On-Subsystem (AOS) and it can't handle tuning requests.
      
      Specifically, as tested on rk3288-veyron-minnie (which reports having
      BCM4354/1 in dmesg), if I force a retune in brcmf_sdio_kso_control()
      when "on = 1" (aka we're transition from sleep to wake) by whacking:
        bus->sdiodev->func1->card->host->need_retune = 1
      ...then I can often see tuning fail.  In this case dw_mmc reports "All
      phases bad!").  Note that I don't get 100% failure, presumably because
      sometimes the card itself has already transitioned away from the AOS
      itself by the time we try to wake it up.  If I force retuning when "on
      = 0" (AKA force retuning right before sending the command to go to
      sleep) then retuning is always OK.
      
      NOTE: we need _both_ this patch and the patch to avoid triggering
      tuning due to CRC errors in the sleep/wake transition, AKA ("brcmfmac:
      sdio: Disable auto-tuning around commands expected to fail").  Though
      both patches handle issues with Broadcom's AOS, the problems are
      distinct:
      1. We want to defer (but not ignore) asynchronous (like
         timer-requested) tuning requests till the card is awake.  However,
         we want to ignore CRC errors during the transition, we don't want
         to queue deferred tuning request.
      2. You could imagine that the AOS could implement retuning but we
         could still get errors while transitioning in and out of the AOS.
         Similarly you could imagine a seamless transition into and out of
         the AOS (with no CRC errors) even if the AOS couldn't handle
         tuning.
      
      ALSO NOTE: presumably there is never a desperate need to retune in
      order to wake up the card, since doing so is impossible.  Luckily the
      only way the card can get into sleep state is if we had a good enough
      tuning to send it the command to put it into sleep, so presumably that
      "good enough" tuning is enough to wake us up, at least with a few
      retries.
      
      Cc: stable@vger.kernel.org #v4.18+
      Signed-off-by: NDouglas Anderson <dianders@chromium.org>
      Acked-by: NAdrian Hunter <adrian.hunter@intel.com>
      Reviewed-by: NArend van Spriel <arend.vanspriel@broadcom.com>
      Acked-by: NKalle Valo <kvalo@codeaurora.org>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      65dade60
    • D
      brcmfmac: sdio: Disable auto-tuning around commands expected to fail · 2de0b42d
      Douglas Anderson 提交于
      There are certain cases, notably when transitioning between sleep and
      active state, when Broadcom SDIO WiFi cards will produce errors on the
      SDIO bus.  This is evident from the source code where you can see that
      we try commands in a loop until we either get success or we've tried
      too many times.  The comment in the code reinforces this by saying
      "just one write attempt may fail"
      
      Unfortunately these failures sometimes end up causing an "-EILSEQ"
      back to the core which triggers a retuning of the SDIO card and that
      blocks all traffic to the card until it's done.
      
      Let's disable retuning around the commands we expect might fail.
      
      Cc: stable@vger.kernel.org #v4.18+
      Signed-off-by: NDouglas Anderson <dianders@chromium.org>
      Acked-by: NAdrian Hunter <adrian.hunter@intel.com>
      Reviewed-by: NArend van Spriel <arend.vanspriel@broadcom.com>
      Acked-by: NKalle Valo <kvalo@codeaurora.org>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      2de0b42d
    • D
      Revert "brcmfmac: disable command decode in sdio_aos" · abdd5dcc
      Douglas Anderson 提交于
      This reverts commit 29f65891.
      
      After that patch landed I find that my kernel log on
      rk3288-veyron-minnie and rk3288-veyron-speedy is filled with:
      brcmfmac: brcmf_sdio_bus_sleep: error while changing bus sleep state -110
      
      This seems to happen every time the Broadcom WiFi transitions out of
      sleep mode.  Reverting the commit fixes the problem for me, so that's
      what this patch does.
      
      Note that, in general, the justification in the original commit seemed
      a little weak.  It looked like someone was testing on a SD card
      controller that would sometimes die if there were CRC errors on the
      bus.  This used to happen back in early days of dw_mmc (the controller
      on my boards), but we fixed it.  Disabling a feature on all boards
      just because one SD card controller is broken seems bad.
      
      Fixes: 29f65891 ("brcmfmac: disable command decode in sdio_aos")
      Cc: Wright Feng <wright.feng@cypress.com>
      Cc: Double Lo <double.lo@cypress.com>
      Cc: Madhan Mohan R <madhanmohan.r@cypress.com>
      Cc: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
      Signed-off-by: NDouglas Anderson <dianders@chromium.org>
      Cc: stable@vger.kernel.org
      Acked-by: NKalle Valo <kvalo@codeaurora.org>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      abdd5dcc
  4. 05 6月, 2019 8 次提交
  5. 01 6月, 2019 8 次提交
  6. 31 5月, 2019 5 次提交
  7. 30 5月, 2019 2 次提交
  8. 28 5月, 2019 5 次提交
    • Y
      rtw88: Make some symbols static · 6aca0977
      YueHaibing 提交于
      Fix sparse warnings:
      
      drivers/net/wireless/realtek/rtw88/phy.c:851:4: warning: symbol 'rtw_cck_size' was not declared. Should it be static?
      drivers/net/wireless/realtek/rtw88/phy.c:852:4: warning: symbol 'rtw_ofdm_size' was not declared. Should it be static?
      drivers/net/wireless/realtek/rtw88/phy.c:853:4: warning: symbol 'rtw_ht_1s_size' was not declared. Should it be static?
      drivers/net/wireless/realtek/rtw88/phy.c:854:4: warning: symbol 'rtw_ht_2s_size' was not declared. Should it be static?
      drivers/net/wireless/realtek/rtw88/phy.c:855:4: warning: symbol 'rtw_vht_1s_size' was not declared. Should it be static?
      drivers/net/wireless/realtek/rtw88/phy.c:856:4: warning: symbol 'rtw_vht_2s_size' was not declared. Should it be static?
      drivers/net/wireless/realtek/rtw88/fw.c:11:6: warning: symbol 'rtw_fw_c2h_cmd_handle_ext' was not declared. Should it be static?
      drivers/net/wireless/realtek/rtw88/fw.c:50:6: warning: symbol 'rtw_fw_send_h2c_command' was not declared. Should it be static?
      Reported-by: NHulk Robot <hulkci@huawei.com>
      Signed-off-by: NYueHaibing <yuehaibing@huawei.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      6aca0977
    • S
      rtw88: avoid circular locking between local->iflist_mtx and rtwdev->mutex · 5b0efb4d
      Stanislaw Gruszka 提交于
      Remove circular lock dependency by using atomic version of interfaces
      iterate in watch_dog_work(), hence avoid taking local->iflist_mtx
      (rtw_vif_watch_dog_iter() only update some data, it can be called from
      atomic context). Fixes below LOCKDEP warning:
      
      [ 1157.219415] ======================================================
      [ 1157.225772] [ INFO: possible circular locking dependency detected ]
      [ 1157.232150] 3.10.0-1043.el7.sgruszka1.x86_64.debug #1 Not tainted
      [ 1157.238346] -------------------------------------------------------
      [ 1157.244635] kworker/u4:2/14490 is trying to acquire lock:
      [ 1157.250194]  (&rtwdev->mutex){+.+.+.}, at: [<ffffffffc098322b>] rtw_ops_config+0x2b/0x90 [rtw88]
      [ 1157.259151]
      but task is already holding lock:
      [ 1157.265085]  (&local->iflist_mtx){+.+...}, at: [<ffffffffc0b8ab7a>] ieee80211_mgd_probe_ap.part.28+0xca/0x160 [mac80211]
      [ 1157.276169]
      which lock already depends on the new lock.
      
      [ 1157.284488]
      the existing dependency chain (in reverse order) is:
      [ 1157.292101]
      -> #2 (&local->iflist_mtx){+.+...}:
      [ 1157.296919]        [<ffffffffbc741a29>] lock_acquire+0x99/0x1e0
      [ 1157.302955]        [<ffffffffbce72793>] mutex_lock_nested+0x93/0x410
      [ 1157.309416]        [<ffffffffc0b6038f>] ieee80211_iterate_interfaces+0x2f/0x60 [mac80211]
      [ 1157.317730]        [<ffffffffc09811ab>] rtw_watch_dog_work+0xcb/0x130 [rtw88]
      [ 1157.325003]        [<ffffffffbc6d77bc>] process_one_work+0x22c/0x720
      [ 1157.331481]        [<ffffffffbc6d7dd6>] worker_thread+0x126/0x3b0
      [ 1157.337589]        [<ffffffffbc6e107f>] kthread+0xef/0x100
      [ 1157.343260]        [<ffffffffbce848b7>] ret_from_fork_nospec_end+0x0/0x39
      [ 1157.350091]
      -> #1 ((&(&rtwdev->watch_dog_work)->work)){+.+...}:
      [ 1157.356314]        [<ffffffffbc741a29>] lock_acquire+0x99/0x1e0
      [ 1157.362427]        [<ffffffffbc6d570b>] flush_work+0x5b/0x310
      [ 1157.368287]        [<ffffffffbc6d740e>] __cancel_work_timer+0xae/0x170
      [ 1157.374940]        [<ffffffffbc6d7583>] cancel_delayed_work_sync+0x13/0x20
      [ 1157.381930]        [<ffffffffc0982b49>] rtw_core_stop+0x29/0x50 [rtw88]
      [ 1157.388679]        [<ffffffffc098bee6>] rtw_enter_ips+0x16/0x20 [rtw88]
      [ 1157.395428]        [<ffffffffc0983242>] rtw_ops_config+0x42/0x90 [rtw88]
      [ 1157.402173]        [<ffffffffc0b13343>] ieee80211_hw_config+0xc3/0x680 [mac80211]
      [ 1157.409854]        [<ffffffffc0b3925b>] ieee80211_do_open+0x69b/0x9c0 [mac80211]
      [ 1157.417418]        [<ffffffffc0b395e9>] ieee80211_open+0x69/0x70 [mac80211]
      [ 1157.424496]        [<ffffffffbcd03442>] __dev_open+0xe2/0x160
      [ 1157.430356]        [<ffffffffbcd03773>] __dev_change_flags+0xa3/0x180
      [ 1157.436922]        [<ffffffffbcd03879>] dev_change_flags+0x29/0x60
      [ 1157.443224]        [<ffffffffbcda14c4>] devinet_ioctl+0x794/0x890
      [ 1157.449331]        [<ffffffffbcda27b5>] inet_ioctl+0x75/0xa0
      [ 1157.455087]        [<ffffffffbccd54eb>] sock_do_ioctl+0x2b/0x60
      [ 1157.461178]        [<ffffffffbccd5753>] sock_ioctl+0x233/0x310
      [ 1157.467109]        [<ffffffffbc8bd820>] do_vfs_ioctl+0x410/0x6c0
      [ 1157.473233]        [<ffffffffbc8bdb71>] SyS_ioctl+0xa1/0xc0
      [ 1157.478914]        [<ffffffffbce84a5e>] system_call_fastpath+0x25/0x2a
      [ 1157.485569]
      -> #0 (&rtwdev->mutex){+.+.+.}:
      [ 1157.490022]        [<ffffffffbc7409d1>] __lock_acquire+0xec1/0x1630
      [ 1157.496305]        [<ffffffffbc741a29>] lock_acquire+0x99/0x1e0
      [ 1157.502413]        [<ffffffffbce72793>] mutex_lock_nested+0x93/0x410
      [ 1157.508890]        [<ffffffffc098322b>] rtw_ops_config+0x2b/0x90 [rtw88]
      [ 1157.515724]        [<ffffffffc0b13343>] ieee80211_hw_config+0xc3/0x680 [mac80211]
      [ 1157.523370]        [<ffffffffc0b8a4ca>] ieee80211_recalc_ps.part.27+0x9a/0x180 [mac80211]
      [ 1157.531685]        [<ffffffffc0b8abc5>] ieee80211_mgd_probe_ap.part.28+0x115/0x160 [mac80211]
      [ 1157.540353]        [<ffffffffc0b8b40d>] ieee80211_beacon_connection_loss_work+0x4d/0x80 [mac80211]
      [ 1157.549513]        [<ffffffffbc6d77bc>] process_one_work+0x22c/0x720
      [ 1157.555886]        [<ffffffffbc6d7dd6>] worker_thread+0x126/0x3b0
      [ 1157.562170]        [<ffffffffbc6e107f>] kthread+0xef/0x100
      [ 1157.567765]        [<ffffffffbce848b7>] ret_from_fork_nospec_end+0x0/0x39
      [ 1157.574579]
      other info that might help us debug this:
      
      [ 1157.582788] Chain exists of:
        &rtwdev->mutex --> (&(&rtwdev->watch_dog_work)->work) --> &local->iflist_mtx
      
      [ 1157.593024]  Possible unsafe locking scenario:
      
      [ 1157.599046]        CPU0                    CPU1
      [ 1157.603653]        ----                    ----
      [ 1157.608258]   lock(&local->iflist_mtx);
      [ 1157.612180]                                lock((&(&rtwdev->watch_dog_work)->work));
      [ 1157.620074]                                lock(&local->iflist_mtx);
      [ 1157.626555]   lock(&rtwdev->mutex);
      [ 1157.630124]
       *** DEADLOCK ***
      
      [ 1157.636148] 4 locks held by kworker/u4:2/14490:
      [ 1157.640755]  #0:  (%s#6){.+.+.+}, at: [<ffffffffbc6d774a>] process_one_work+0x1ba/0x720
      [ 1157.648965]  #1:  ((&ifmgd->beacon_connection_loss_work)){+.+.+.}, at: [<ffffffffbc6d774a>] process_one_work+0x1ba/0x720
      [ 1157.659950]  #2:  (&wdev->mtx){+.+.+.}, at: [<ffffffffc0b8aad5>] ieee80211_mgd_probe_ap.part.28+0x25/0x160 [mac80211]
      [ 1157.670901]  #3:  (&local->iflist_mtx){+.+...}, at: [<ffffffffc0b8ab7a>] ieee80211_mgd_probe_ap.part.28+0xca/0x160 [mac80211]
      [ 1157.682466]
      
      Fixes: e3037485 ("rtw88: new Realtek 802.11ac driver")
      Signed-off-by: NStanislaw Gruszka <sgruszka@redhat.com>
      Acked-by: NYan-Hsuan Chuang <yhchuang@realtek.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      5b0efb4d
    • N
      rsi: Properly initialize data in rsi_sdio_ta_reset · f57b5d85
      Nathan Chancellor 提交于
      When building with -Wuninitialized, Clang warns:
      
      drivers/net/wireless/rsi/rsi_91x_sdio.c:940:43: warning: variable 'data'
      is uninitialized when used here [-Wuninitialized]
              put_unaligned_le32(TA_HOLD_THREAD_VALUE, data);
                                                       ^~~~
      drivers/net/wireless/rsi/rsi_91x_sdio.c:930:10: note: initialize the
      variable 'data' to silence this warning
              u8 *data;
                      ^
                       = NULL
      1 warning generated.
      
      Using Clang's suggestion of initializing data to NULL wouldn't work out
      because data will be dereferenced by put_unaligned_le32. Use kzalloc to
      properly initialize data, which matches a couple of other places in this
      driver.
      
      Fixes: e5a1ecc9 ("rsi: add firmware loading for 9116 device")
      Link: https://github.com/ClangBuiltLinux/linux/issues/464Signed-off-by: NNathan Chancellor <natechancellor@gmail.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      f57b5d85
    • Y
      rtw88: fix unassigned rssi_level in rtw_sta_info · a24bad74
      Yan-Hsuan Chuang 提交于
      The new rssi_level should be stored in si, otherwise the rssi_level will
      never be updated and get a wrong RA mask, which is calculated by the
      rssi level
      
      If a wrong RA mask is chosen, the firmware will pick some *bad rates*.
      The most hurtful scene will be in *noisy environment*, such as office or
      public area with many APs and users.
      The latency would be high and the overall throughput would be only half
      or less.
      
      Tested in 2.4G in office area, with this patch the throughput increased
      from such as "1x Mbps -> 4x Mbps".
      Signed-off-by: NYan-Hsuan Chuang <yhchuang@realtek.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      a24bad74
    • S
      rtw88: fix subscript above array bounds compiler warning · 8a03447d
      Stanislaw Gruszka 提交于
      My compiler complains about:
      
      drivers/net/wireless/realtek/rtw88/phy.c: In function ‘rtw_phy_rf_power_2_rssi’:
      drivers/net/wireless/realtek/rtw88/phy.c:430:26: warning: array subscript is above array bounds [-Warray-bounds]
        linear = db_invert_table[i][j];
      
      According to comment power_db should be in range 1 ~ 96 .
      To fix add check for boundaries before access the array.
      Signed-off-by: NStanislaw Gruszka <sgruszka@redhat.com>
      Acked-by: NYan-Hsuan Chuang <yhchuang@realtek.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      8a03447d
  9. 24 5月, 2019 3 次提交
  10. 21 5月, 2019 2 次提交