mirror of
https://github.com/torvalds/linux
synced 2024-09-20 11:07:02 +00:00
staging: wfx: fix case of lack of tx_retry_policies
In some rare cases, driver may not have any available tx_retry_policies. In this case, the driver asks to mac80211 to stop sending data. However, it seems that a race is possible and a few frames can be sent to the driver. In this case, driver can't wait for free tx_retry_policies since wfx_tx() must be atomic. So, this patch fix this case by sending these frames with the special policy number 15. The firmware normally use policy 15 to send internal frames (PS-poll, beacons, etc...). So, it is not a so bad fallback. Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com> Link: https://lore.kernel.org/r/20191217161318.31402-3-Jerome.Pouiller@silabs.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b0ac999ebe
commit
89606bb3a9
|
@ -16,7 +16,7 @@
|
||||||
#include "traces.h"
|
#include "traces.h"
|
||||||
#include "hif_tx_mib.h"
|
#include "hif_tx_mib.h"
|
||||||
|
|
||||||
#define WFX_INVALID_RATE_ID (0xFF)
|
#define WFX_INVALID_RATE_ID 15
|
||||||
#define WFX_LINK_ID_NO_ASSOC 15
|
#define WFX_LINK_ID_NO_ASSOC 15
|
||||||
#define WFX_LINK_ID_GC_TIMEOUT ((unsigned long)(10 * HZ))
|
#define WFX_LINK_ID_GC_TIMEOUT ((unsigned long)(10 * HZ))
|
||||||
|
|
||||||
|
@ -202,6 +202,8 @@ static void wfx_tx_policy_put(struct wfx_vif *wvif, int idx)
|
||||||
int usage, locked;
|
int usage, locked;
|
||||||
struct tx_policy_cache *cache = &wvif->tx_policy_cache;
|
struct tx_policy_cache *cache = &wvif->tx_policy_cache;
|
||||||
|
|
||||||
|
if (idx == WFX_INVALID_RATE_ID)
|
||||||
|
return;
|
||||||
spin_lock_bh(&cache->lock);
|
spin_lock_bh(&cache->lock);
|
||||||
locked = list_empty(&cache->free);
|
locked = list_empty(&cache->free);
|
||||||
usage = wfx_tx_policy_release(cache, &cache->cache[idx]);
|
usage = wfx_tx_policy_release(cache, &cache->cache[idx]);
|
||||||
|
@ -549,7 +551,8 @@ static u8 wfx_tx_get_rate_id(struct wfx_vif *wvif,
|
||||||
|
|
||||||
rate_id = wfx_tx_policy_get(wvif,
|
rate_id = wfx_tx_policy_get(wvif,
|
||||||
tx_info->driver_rates, &tx_policy_renew);
|
tx_info->driver_rates, &tx_policy_renew);
|
||||||
WARN(rate_id == WFX_INVALID_RATE_ID, "unable to get a valid Tx policy");
|
if (rate_id == WFX_INVALID_RATE_ID)
|
||||||
|
dev_warn(wvif->wdev->dev, "unable to get a valid Tx policy");
|
||||||
|
|
||||||
if (tx_policy_renew) {
|
if (tx_policy_renew) {
|
||||||
/* FIXME: It's not so optimal to stop TX queues every now and
|
/* FIXME: It's not so optimal to stop TX queues every now and
|
||||||
|
|
Loading…
Reference in a new issue