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

staging: wfx: drop counter of buffered frames

Since the driver does not call ieee80211_sta_set_buffered() anymore, it
is no more necessary to maintain a counter of buffered frames for each
stations.

This change allows to simplify the processing in multiple places in the
driver.
Signed-off-by: default avatarJérôme Pouiller <jerome.pouiller@silabs.com>
Link: https://lore.kernel.org/r/20200701150707.222985-9-Jerome.Pouiller@silabs.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent da0ce565
...@@ -213,22 +213,6 @@ static bool ieee80211_is_action_back(struct ieee80211_hdr *hdr) ...@@ -213,22 +213,6 @@ static bool ieee80211_is_action_back(struct ieee80211_hdr *hdr)
return true; return true;
} }
static void wfx_tx_manage_pm(struct wfx_vif *wvif, struct ieee80211_hdr *hdr,
struct wfx_tx_priv *tx_priv,
struct ieee80211_sta *sta)
{
struct wfx_sta_priv *sta_priv;
int tid = ieee80211_get_tid(hdr);
if (sta) {
tx_priv->has_sta = true;
sta_priv = (struct wfx_sta_priv *)&sta->drv_priv;
spin_lock_bh(&sta_priv->lock);
sta_priv->buffered[tid]++;
spin_unlock_bh(&sta_priv->lock);
}
}
static u8 wfx_tx_get_link_id(struct wfx_vif *wvif, struct ieee80211_sta *sta, static u8 wfx_tx_get_link_id(struct wfx_vif *wvif, struct ieee80211_sta *sta,
struct ieee80211_hdr *hdr) struct ieee80211_hdr *hdr)
{ {
...@@ -406,7 +390,6 @@ static int wfx_tx_inner(struct wfx_vif *wvif, struct ieee80211_sta *sta, ...@@ -406,7 +390,6 @@ static int wfx_tx_inner(struct wfx_vif *wvif, struct ieee80211_sta *sta,
req->tx_flags.retry_policy_index = wfx_tx_get_rate_id(wvif, tx_info); req->tx_flags.retry_policy_index = wfx_tx_get_rate_id(wvif, tx_info);
// Auxiliary operations // Auxiliary operations
wfx_tx_manage_pm(wvif, hdr, tx_priv, sta);
wfx_tx_queues_put(wvif, skb); wfx_tx_queues_put(wvif, skb);
if (tx_info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) if (tx_info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM)
schedule_work(&wvif->update_tim_work); schedule_work(&wvif->update_tim_work);
...@@ -449,35 +432,6 @@ void wfx_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control, ...@@ -449,35 +432,6 @@ void wfx_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,
ieee80211_tx_status_irqsafe(wdev->hw, skb); ieee80211_tx_status_irqsafe(wdev->hw, skb);
} }
static struct ieee80211_hdr *wfx_skb_hdr80211(struct sk_buff *skb)
{
struct hif_msg *hif = (struct hif_msg *)skb->data;
struct hif_req_tx *req = (struct hif_req_tx *)hif->body;
return (struct ieee80211_hdr *)(req->frame + req->data_flags.fc_offset);
}
static void wfx_tx_update_sta(struct wfx_vif *wvif, struct ieee80211_hdr *hdr)
{
int tid = ieee80211_get_tid(hdr);
struct wfx_sta_priv *sta_priv;
struct ieee80211_sta *sta;
rcu_read_lock(); // protect sta
sta = ieee80211_find_sta(wvif->vif, hdr->addr1);
if (sta) {
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]--;
spin_unlock_bh(&sta_priv->lock);
} else {
dev_dbg(wvif->wdev->dev, "%s: sta does not exist anymore\n",
__func__);
}
rcu_read_unlock();
}
static void wfx_skb_dtor(struct wfx_vif *wvif, struct sk_buff *skb) static void wfx_skb_dtor(struct wfx_vif *wvif, struct sk_buff *skb)
{ {
struct hif_msg *hif = (struct hif_msg *)skb->data; struct hif_msg *hif = (struct hif_msg *)skb->data;
...@@ -553,8 +507,6 @@ void wfx_tx_confirm_cb(struct wfx_dev *wdev, const struct hif_cnf_tx *arg) ...@@ -553,8 +507,6 @@ void wfx_tx_confirm_cb(struct wfx_dev *wdev, const struct hif_cnf_tx *arg)
// You can touch to tx_priv, but don't touch to tx_info->status. // You can touch to tx_priv, but don't touch to tx_info->status.
wfx_tx_fill_rates(wdev, tx_info, arg); wfx_tx_fill_rates(wdev, tx_info, arg);
if (tx_priv->has_sta)
wfx_tx_update_sta(wvif, wfx_skb_hdr80211(skb));
skb_trim(skb, skb->len - wfx_tx_get_icv_len(tx_priv->hw_key)); skb_trim(skb, skb->len - wfx_tx_get_icv_len(tx_priv->hw_key));
// From now, you can touch to tx_info->status, but do not touch to // From now, you can touch to tx_info->status, but do not touch to
...@@ -634,8 +586,6 @@ void wfx_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -634,8 +586,6 @@ void wfx_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
while ((skb = skb_dequeue(&dropped)) != NULL) { while ((skb = skb_dequeue(&dropped)) != NULL) {
hif = (struct hif_msg *)skb->data; hif = (struct hif_msg *)skb->data;
wvif = wdev_to_wvif(wdev, hif->interface); wvif = wdev_to_wvif(wdev, hif->interface);
if (wfx_skb_tx_priv(skb)->has_sta)
wfx_tx_update_sta(wvif, wfx_skb_hdr80211(skb));
ieee80211_tx_info_clear_status(IEEE80211_SKB_CB(skb)); ieee80211_tx_info_clear_status(IEEE80211_SKB_CB(skb));
wfx_skb_dtor(wvif, skb); wfx_skb_dtor(wvif, skb);
} }
......
...@@ -36,7 +36,6 @@ struct tx_policy_cache { ...@@ -36,7 +36,6 @@ struct tx_policy_cache {
struct wfx_tx_priv { struct wfx_tx_priv {
ktime_t xmit_timestamp; ktime_t xmit_timestamp;
struct ieee80211_key_conf *hw_key; struct ieee80211_key_conf *hw_key;
bool has_sta;
} __packed; } __packed;
void wfx_tx_policy_init(struct wfx_vif *wvif); void wfx_tx_policy_init(struct wfx_vif *wvif);
......
...@@ -430,7 +430,6 @@ int wfx_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -430,7 +430,6 @@ int wfx_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct wfx_vif *wvif = (struct wfx_vif *)vif->drv_priv; struct wfx_vif *wvif = (struct wfx_vif *)vif->drv_priv;
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;
spin_lock_init(&sta_priv->lock);
sta_priv->vif_id = wvif->id; sta_priv->vif_id = wvif->id;
// In station mode, the firmware interprets new link-id as a TDLS peer. // In station mode, the firmware interprets new link-id as a TDLS peer.
...@@ -450,14 +449,7 @@ int wfx_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -450,14 +449,7 @@ int wfx_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
{ {
struct wfx_vif *wvif = (struct wfx_vif *)vif->drv_priv; struct wfx_vif *wvif = (struct wfx_vif *)vif->drv_priv;
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;
int i;
for (i = 0; i < ARRAY_SIZE(sta_priv->buffered); i++)
if (sta_priv->buffered[i])
// Not an error if paired with trace in
// wfx_tx_update_sta()
dev_dbg(wvif->wdev->dev, "release station while %d pending frame on queue %d",
sta_priv->buffered[i], i);
// See note in wfx_sta_add() // See note in wfx_sta_add()
if (!sta_priv->link_id) if (!sta_priv->link_id)
return 0; return 0;
......
...@@ -16,9 +16,6 @@ struct wfx_vif; ...@@ -16,9 +16,6 @@ struct wfx_vif;
struct wfx_sta_priv { struct wfx_sta_priv {
int link_id; int link_id;
int vif_id; int vif_id;
int buffered[IEEE80211_NUM_TIDS];
// Ensure atomicity of "buffered" and calls to ieee80211_sta_set_buffered()
spinlock_t lock;
}; };
// mac80211 interface // 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