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;
|
entry->status = WFX_LINK_RESERVE;
|
||||||
ether_addr_copy(entry->mac, mac);
|
ether_addr_copy(entry->mac, mac);
|
||||||
memset(&entry->buffered, 0, WFX_MAX_TID);
|
|
||||||
wfx_tx_lock(wvif->wdev);
|
wfx_tx_lock(wvif->wdev);
|
||||||
|
|
||||||
if (!schedule_work(&wvif->link_id_work))
|
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)
|
struct ieee80211_sta *sta)
|
||||||
{
|
{
|
||||||
u32 mask = ~BIT(tx_priv->raw_link_id);
|
u32 mask = ~BIT(tx_priv->raw_link_id);
|
||||||
|
struct wfx_sta_priv *sta_priv;
|
||||||
|
|
||||||
spin_lock_bh(&wvif->ps_state_lock);
|
spin_lock_bh(&wvif->ps_state_lock);
|
||||||
if (ieee80211_is_auth(hdr->frame_control)) {
|
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);
|
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;
|
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);
|
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);
|
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,
|
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);
|
wfx_pending_remove(wvif->wdev, skb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wfx_notify_buffered_tx(struct wfx_vif *wvif, struct sk_buff *skb,
|
static void wfx_notify_buffered_tx(struct wfx_vif *wvif, struct sk_buff *skb)
|
||||||
struct hif_req_tx *req)
|
|
||||||
{
|
{
|
||||||
struct ieee80211_sta *sta;
|
|
||||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
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 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) {
|
rcu_read_lock(); // protect sta
|
||||||
buffered = wvif->link_id_db[raw_link_id - 1].buffered;
|
sta = ieee80211_find_sta(wvif->vif, hdr->addr1);
|
||||||
|
if (sta && tid < WFX_MAX_TID) {
|
||||||
spin_lock_bh(&wvif->ps_state_lock);
|
sta_priv = (struct wfx_sta_priv *)&sta->drv_priv;
|
||||||
WARN(!buffered[tid], "inconsistent notification");
|
spin_lock_bh(&sta_priv->lock);
|
||||||
buffered[tid]--;
|
WARN(!sta_priv->buffered[tid], "inconsistent notification");
|
||||||
spin_unlock_bh(&wvif->ps_state_lock);
|
sta_priv->buffered[tid]--;
|
||||||
|
if (!sta_priv->buffered[tid])
|
||||||
if (!buffered[tid]) {
|
ieee80211_sta_set_buffered(sta, tid, false);
|
||||||
rcu_read_lock();
|
spin_unlock_bh(&sta_priv->lock);
|
||||||
sta = ieee80211_find_sta(wvif->vif, hdr->addr1);
|
|
||||||
if (sta)
|
|
||||||
ieee80211_sta_set_buffered(sta, tid, false);
|
|
||||||
rcu_read_unlock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void wfx_skb_dtor(struct wfx_dev *wdev, struct sk_buff *skb)
|
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);
|
WARN_ON(!wvif);
|
||||||
skb_pull(skb, offset);
|
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);
|
wfx_tx_policy_put(wvif, req->tx_flags.retry_policy_index);
|
||||||
ieee80211_tx_status_irqsafe(wdev->hw, skb);
|
ieee80211_tx_status_irqsafe(wdev->hw, skb);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,9 +14,6 @@
|
|||||||
#include "hif_api_cmd.h"
|
#include "hif_api_cmd.h"
|
||||||
#include "hif_api_mib.h"
|
#include "hif_api_mib.h"
|
||||||
|
|
||||||
// FIXME: use IEEE80211_NUM_TIDS
|
|
||||||
#define WFX_MAX_TID 8
|
|
||||||
|
|
||||||
struct wfx_tx_priv;
|
struct wfx_tx_priv;
|
||||||
struct wfx_dev;
|
struct wfx_dev;
|
||||||
struct wfx_vif;
|
struct wfx_vif;
|
||||||
@@ -33,7 +30,6 @@ struct wfx_link_entry {
|
|||||||
enum wfx_link_status status;
|
enum wfx_link_status status;
|
||||||
u8 mac[ETH_ALEN];
|
u8 mac[ETH_ALEN];
|
||||||
u8 old_mac[ETH_ALEN];
|
u8 old_mac[ETH_ALEN];
|
||||||
u8 buffered[WFX_MAX_TID];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct tx_policy {
|
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_sta_priv *sta_priv = (struct wfx_sta_priv *) &sta->drv_priv;
|
||||||
struct wfx_link_entry *entry;
|
struct wfx_link_entry *entry;
|
||||||
|
|
||||||
|
spin_lock_init(&sta_priv->lock);
|
||||||
if (wvif->vif->type != NL80211_IFTYPE_AP)
|
if (wvif->vif->type != NL80211_IFTYPE_AP)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,9 @@
|
|||||||
|
|
||||||
#include "hif_api_cmd.h"
|
#include "hif_api_cmd.h"
|
||||||
|
|
||||||
|
// FIXME: use IEEE80211_NUM_TIDS
|
||||||
|
#define WFX_MAX_TID 8
|
||||||
|
|
||||||
struct wfx_dev;
|
struct wfx_dev;
|
||||||
struct wfx_vif;
|
struct wfx_vif;
|
||||||
|
|
||||||
@@ -37,6 +40,9 @@ struct wfx_grp_addr_table {
|
|||||||
struct wfx_sta_priv {
|
struct wfx_sta_priv {
|
||||||
int link_id;
|
int link_id;
|
||||||
int vif_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
|
// mac80211 interface
|
||||||
|
|||||||
Reference in New Issue
Block a user