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

staging: wfx: relocate "buffered" information to sta_priv

It simplify the code if field buffered is hosted in the struct sta_priv
instead of in the struct wfx_link_entry. More globally, struct
wfx_link_entry has no real reasons to exist and should be dropped soon.
Signed-off-by: default avatarJérôme Pouiller <jerome.pouiller@silabs.com>
Link: https://lore.kernel.org/r/20200115135338.14374-47-Jerome.Pouiller@silabs.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 79d5fecc
......@@ -291,7 +291,6 @@ static int wfx_alloc_link_id(struct wfx_vif *wvif, const u8 *mac)
entry->status = WFX_LINK_RESERVE;
ether_addr_copy(entry->mac, mac);
memset(&entry->buffered, 0, WFX_MAX_TID);
wfx_tx_lock(wvif->wdev);
if (!schedule_work(&wvif->link_id_work))
......@@ -434,6 +433,7 @@ static void wfx_tx_manage_pm(struct wfx_vif *wvif, struct ieee80211_hdr *hdr,
struct ieee80211_sta *sta)
{
u32 mask = ~BIT(tx_priv->raw_link_id);
struct wfx_sta_priv *sta_priv;
spin_lock_bh(&wvif->ps_state_lock);
if (ieee80211_is_auth(hdr->frame_control)) {
......@@ -448,15 +448,17 @@ static void wfx_tx_manage_pm(struct wfx_vif *wvif, struct ieee80211_hdr *hdr,
schedule_work(&wvif->mcast_start_work);
}
if (tx_priv->raw_link_id) {
if (tx_priv->raw_link_id)
wvif->link_id_db[tx_priv->raw_link_id - 1].timestamp = jiffies;
if (tx_priv->tid < WFX_MAX_TID)
wvif->link_id_db[tx_priv->raw_link_id - 1].buffered[tx_priv->tid]++;
}
spin_unlock_bh(&wvif->ps_state_lock);
if (sta)
if (sta && tx_priv->tid < WFX_MAX_TID) {
sta_priv = (struct wfx_sta_priv *)&sta->drv_priv;
spin_lock_bh(&sta_priv->lock);
sta_priv->buffered[tx_priv->tid]++;
ieee80211_sta_set_buffered(sta, tx_priv->tid, true);
spin_unlock_bh(&sta_priv->lock);
}
}
static u8 wfx_tx_get_raw_link_id(struct wfx_vif *wvif,
......@@ -789,31 +791,25 @@ void wfx_tx_confirm_cb(struct wfx_vif *wvif, const struct hif_cnf_tx *arg)
wfx_pending_remove(wvif->wdev, skb);
}
static void wfx_notify_buffered_tx(struct wfx_vif *wvif, struct sk_buff *skb,
struct hif_req_tx *req)
static void wfx_notify_buffered_tx(struct wfx_vif *wvif, struct sk_buff *skb)
{
struct ieee80211_sta *sta;
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
struct ieee80211_sta *sta;
struct wfx_sta_priv *sta_priv;
int tid = wfx_tx_get_tid(hdr);
int raw_link_id = req->queue_id.peer_sta_id;
u8 *buffered;
if (raw_link_id && tid < WFX_MAX_TID) {
buffered = wvif->link_id_db[raw_link_id - 1].buffered;
spin_lock_bh(&wvif->ps_state_lock);
WARN(!buffered[tid], "inconsistent notification");
buffered[tid]--;
spin_unlock_bh(&wvif->ps_state_lock);
if (!buffered[tid]) {
rcu_read_lock();
sta = ieee80211_find_sta(wvif->vif, hdr->addr1);
if (sta)
ieee80211_sta_set_buffered(sta, tid, false);
rcu_read_unlock();
}
rcu_read_lock(); // protect sta
sta = ieee80211_find_sta(wvif->vif, hdr->addr1);
if (sta && tid < WFX_MAX_TID) {
sta_priv = (struct wfx_sta_priv *)&sta->drv_priv;
spin_lock_bh(&sta_priv->lock);
WARN(!sta_priv->buffered[tid], "inconsistent notification");
sta_priv->buffered[tid]--;
if (!sta_priv->buffered[tid])
ieee80211_sta_set_buffered(sta, tid, false);
spin_unlock_bh(&sta_priv->lock);
}
rcu_read_unlock();
}
void wfx_skb_dtor(struct wfx_dev *wdev, struct sk_buff *skb)
......@@ -827,7 +823,7 @@ void wfx_skb_dtor(struct wfx_dev *wdev, struct sk_buff *skb)
WARN_ON(!wvif);
skb_pull(skb, offset);
wfx_notify_buffered_tx(wvif, skb, req);
wfx_notify_buffered_tx(wvif, skb);
wfx_tx_policy_put(wvif, req->tx_flags.retry_policy_index);
ieee80211_tx_status_irqsafe(wdev->hw, skb);
}
......@@ -14,9 +14,6 @@
#include "hif_api_cmd.h"
#include "hif_api_mib.h"
// FIXME: use IEEE80211_NUM_TIDS
#define WFX_MAX_TID 8
struct wfx_tx_priv;
struct wfx_dev;
struct wfx_vif;
......@@ -33,7 +30,6 @@ struct wfx_link_entry {
enum wfx_link_status status;
u8 mac[ETH_ALEN];
u8 old_mac[ETH_ALEN];
u8 buffered[WFX_MAX_TID];
};
struct tx_policy {
......
......@@ -572,6 +572,7 @@ int wfx_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct wfx_sta_priv *sta_priv = (struct wfx_sta_priv *) &sta->drv_priv;
struct wfx_link_entry *entry;
spin_lock_init(&sta_priv->lock);
if (wvif->vif->type != NL80211_IFTYPE_AP)
return 0;
......
......@@ -12,6 +12,9 @@
#include "hif_api_cmd.h"
// FIXME: use IEEE80211_NUM_TIDS
#define WFX_MAX_TID 8
struct wfx_dev;
struct wfx_vif;
......@@ -37,6 +40,9 @@ struct wfx_grp_addr_table {
struct wfx_sta_priv {
int link_id;
int vif_id;
u8 buffered[WFX_MAX_TID];
// Ensure atomicity of "buffered" and calls to ieee80211_sta_set_buffered()
spinlock_t lock;
};
// mac80211 interface
......
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