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

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.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent da0ce565
Loading
Loading
Loading
Loading
+0 −50
Original line number Diff line number Diff line
@@ -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 @@ drop:
	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);
	}
+0 −1
Original line number Diff line number Diff line
@@ -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);
+0 −8
Original line number Diff line number Diff line
@@ -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;
+0 −3
Original line number Diff line number Diff line
@@ -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