staging: wfx: fix case where AP stop with CAB traffic pending
authorJérôme Pouiller <jerome.pouiller@silabs.com>
Wed, 1 Apr 2020 11:04:04 +0000 (13:04 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 13 Apr 2020 06:55:38 +0000 (08:55 +0200)
When driver has Content After DTIM Beacon (CAB) in queue, it wait for an
indication from the firmware. However, when we stop to send beacons,
this indication may never happen.

Solve this issue by simply simulate this indication. Firmware will send
data that probably nobody will heard.

Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
Link: https://lore.kernel.org/r/20200401110405.80282-32-Jerome.Pouiller@silabs.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/wfx/sta.c

index b1ee02d2f5159f6153f7f2216d8773ca9deb86af..2e8d3f571c3eb8b032fa47972bb97ce0d78fb023 100644 (file)
@@ -686,6 +686,19 @@ static void wfx_join_finalize(struct wfx_vif *wvif,
        }
 }
 
+void wfx_enable_beacon(struct wfx_vif *wvif, bool enable)
+{
+       // Driver has Content After DTIM Beacon in queue. Driver is waiting for
+       // a signal from the firmware. Since we are going to stop to send
+       // beacons, this signal will never happens. See also
+       // wfx_suspend_resume_mc()
+       if (!enable && wfx_tx_queues_has_cab(wvif)) {
+               wvif->after_dtim_tx_allowed = true;
+               wfx_bh_request_tx(wvif->wdev);
+       }
+       hif_beacon_transmit(wvif, enable);
+}
+
 void wfx_bss_info_changed(struct ieee80211_hw *hw,
                             struct ieee80211_vif *vif,
                             struct ieee80211_bss_conf *info,
@@ -724,7 +737,7 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 
        if (changed & BSS_CHANGED_BEACON_ENABLED &&
            wvif->state != WFX_STATE_IBSS)
-               hif_beacon_transmit(wvif, info->enable_beacon);
+               wfx_enable_beacon(wvif, info->enable_beacon);
 
        if (changed & BSS_CHANGED_BEACON_INFO)
                hif_set_beacon_wakeup_period(wvif, info->dtim_period,