mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
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: Jérôme Pouiller <jerome.pouiller@silabs.com> Link: https://lore.kernel.org/r/20200115135338.14374-47-Jerome.Pouiller@silabs.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
79d5fecc9b
commit
7d2d2bfdeb
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user