mirror of https://gitee.com/openkylin/linux.git
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: Jérôme Pouiller <jerome.pouiller@silabs.com> Link: https://lore.kernel.org/r/20200701150707.222985-9-Jerome.Pouiller@silabs.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
da0ce56566
commit
b9aa17505f
|
@ -213,22 +213,6 @@ static bool ieee80211_is_action_back(struct ieee80211_hdr *hdr)
|
|||
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,
|
||||
struct ieee80211_hdr *hdr)
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
// Auxiliary operations
|
||||
wfx_tx_manage_pm(wvif, hdr, tx_priv, sta);
|
||||
wfx_tx_queues_put(wvif, skb);
|
||||
if (tx_info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM)
|
||||
schedule_work(&wvif->update_tim_work);
|
||||
|
@ -449,35 +432,6 @@ void wfx_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,
|
|||
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)
|
||||
{
|
||||
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)
|
|||
|
||||
// You can touch to tx_priv, but don't touch to tx_info->status.
|
||||
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));
|
||||
|
||||
// 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,
|
|||
while ((skb = skb_dequeue(&dropped)) != NULL) {
|
||||
hif = (struct hif_msg *)skb->data;
|
||||
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));
|
||||
wfx_skb_dtor(wvif, skb);
|
||||
}
|
||||
|
|
|
@ -36,7 +36,6 @@ struct tx_policy_cache {
|
|||
struct wfx_tx_priv {
|
||||
ktime_t xmit_timestamp;
|
||||
struct ieee80211_key_conf *hw_key;
|
||||
bool has_sta;
|
||||
} __packed;
|
||||
|
||||
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,
|
|||
struct wfx_vif *wvif = (struct wfx_vif *)vif->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;
|
||||
|
||||
// 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,
|
|||
{
|
||||
struct wfx_vif *wvif = (struct wfx_vif *)vif->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()
|
||||
if (!sta_priv->link_id)
|
||||
return 0;
|
||||
|
|
|
@ -16,9 +16,6 @@ struct wfx_vif;
|
|||
struct wfx_sta_priv {
|
||||
int link_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
|
||||
|
|
Loading…
Reference in New Issue