Commit 99879121 authored by Jérôme Pouiller's avatar Jérôme Pouiller Committed by Greg Kroah-Hartman

staging: wfx: fix the cache of rate policies on interface reset

Device and driver maintain a cache of rate policies (aka.
tx_retry_policy in hardware API).

When hif_reset() is sent to hardware, device resets its cache of rate
policies. In order to keep driver in sync, it is necessary to do the
same on driver.

Note, when driver tries to use a rate policy that has not been defined
on device, data is sent at 1Mbps. So, this patch should fix abnormal
throughput observed sometime after a reset of the interface.
Signed-off-by: default avatarJérôme Pouiller <jerome.pouiller@silabs.com>
Link: https://lore.kernel.org/r/20191217161318.31402-2-Jerome.Pouiller@silabs.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 92ee2034
...@@ -249,7 +249,7 @@ static int wfx_tx_policy_upload(struct wfx_vif *wvif) ...@@ -249,7 +249,7 @@ static int wfx_tx_policy_upload(struct wfx_vif *wvif)
return 0; return 0;
} }
static void wfx_tx_policy_upload_work(struct work_struct *work) void wfx_tx_policy_upload_work(struct work_struct *work)
{ {
struct wfx_vif *wvif = struct wfx_vif *wvif =
container_of(work, struct wfx_vif, tx_policy_upload_work); container_of(work, struct wfx_vif, tx_policy_upload_work);
...@@ -270,7 +270,6 @@ void wfx_tx_policy_init(struct wfx_vif *wvif) ...@@ -270,7 +270,6 @@ void wfx_tx_policy_init(struct wfx_vif *wvif)
spin_lock_init(&cache->lock); spin_lock_init(&cache->lock);
INIT_LIST_HEAD(&cache->used); INIT_LIST_HEAD(&cache->used);
INIT_LIST_HEAD(&cache->free); INIT_LIST_HEAD(&cache->free);
INIT_WORK(&wvif->tx_policy_upload_work, wfx_tx_policy_upload_work);
for (i = 0; i < HIF_MIB_NUM_TX_RATE_RETRY_POLICIES; ++i) for (i = 0; i < HIF_MIB_NUM_TX_RATE_RETRY_POLICIES; ++i)
list_add(&cache->cache[i].link, &cache->free); list_add(&cache->cache[i].link, &cache->free);
......
...@@ -61,6 +61,7 @@ struct wfx_tx_priv { ...@@ -61,6 +61,7 @@ struct wfx_tx_priv {
} __packed; } __packed;
void wfx_tx_policy_init(struct wfx_vif *wvif); void wfx_tx_policy_init(struct wfx_vif *wvif);
void wfx_tx_policy_upload_work(struct work_struct *work);
void wfx_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control, void wfx_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,
struct sk_buff *skb); struct sk_buff *skb);
......
...@@ -592,6 +592,7 @@ static void wfx_do_unjoin(struct wfx_vif *wvif) ...@@ -592,6 +592,7 @@ static void wfx_do_unjoin(struct wfx_vif *wvif)
wfx_tx_flush(wvif->wdev); wfx_tx_flush(wvif->wdev);
hif_keep_alive_period(wvif, 0); hif_keep_alive_period(wvif, 0);
hif_reset(wvif, false); hif_reset(wvif, false);
wfx_tx_policy_init(wvif);
hif_set_output_power(wvif, wvif->wdev->output_power * 10); hif_set_output_power(wvif, wvif->wdev->output_power * 10);
wvif->dtim_period = 0; wvif->dtim_period = 0;
hif_set_macaddr(wvif, wvif->vif->addr); hif_set_macaddr(wvif, wvif->vif->addr);
...@@ -880,8 +881,10 @@ static int wfx_update_beaconing(struct wfx_vif *wvif) ...@@ -880,8 +881,10 @@ static int wfx_update_beaconing(struct wfx_vif *wvif)
if (wvif->state != WFX_STATE_AP || if (wvif->state != WFX_STATE_AP ||
wvif->beacon_int != conf->beacon_int) { wvif->beacon_int != conf->beacon_int) {
wfx_tx_lock_flush(wvif->wdev); wfx_tx_lock_flush(wvif->wdev);
if (wvif->state != WFX_STATE_PASSIVE) if (wvif->state != WFX_STATE_PASSIVE) {
hif_reset(wvif, false); hif_reset(wvif, false);
wfx_tx_policy_init(wvif);
}
wvif->state = WFX_STATE_PASSIVE; wvif->state = WFX_STATE_PASSIVE;
wfx_start_ap(wvif); wfx_start_ap(wvif);
wfx_tx_unlock(wvif->wdev); wfx_tx_unlock(wvif->wdev);
...@@ -1567,6 +1570,7 @@ int wfx_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) ...@@ -1567,6 +1570,7 @@ int wfx_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
INIT_WORK(&wvif->set_cts_work, wfx_set_cts_work); INIT_WORK(&wvif->set_cts_work, wfx_set_cts_work);
INIT_WORK(&wvif->unjoin_work, wfx_unjoin_work); INIT_WORK(&wvif->unjoin_work, wfx_unjoin_work);
INIT_WORK(&wvif->tx_policy_upload_work, wfx_tx_policy_upload_work);
mutex_unlock(&wdev->conf_mutex); mutex_unlock(&wdev->conf_mutex);
hif_set_macaddr(wvif, vif->addr); hif_set_macaddr(wvif, vif->addr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment