Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f8e0af6b authored by Arik Nemtsov's avatar Arik Nemtsov Committed by Luciano Coelho
Browse files

wl12xx: don't indicate up PS-filtered dummy packets



Dummy packets are currently only sent on the system_hlid link. The
system_hlid link should never be filtered for PS (as it is not
a STA link). Even so, for correctness, don't indicate dummy packets up.
The skb does not belong to mac80211 and as such does not contain a
correct skb->cb.

Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent 20a33e52
Loading
Loading
Loading
Loading
+6 −2
Original line number Original line Diff line number Diff line
@@ -199,15 +199,19 @@ static void wl1271_ps_filter_frames(struct wl1271 *wl, u8 hlid)
	unsigned long flags;
	unsigned long flags;
	int filtered[NUM_TX_QUEUES];
	int filtered[NUM_TX_QUEUES];


	/* filter all frames currently the low level queus for this hlid */
	/* filter all frames currently in the low level queues for this hlid */
	for (i = 0; i < NUM_TX_QUEUES; i++) {
	for (i = 0; i < NUM_TX_QUEUES; i++) {
		filtered[i] = 0;
		filtered[i] = 0;
		while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
		while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
			filtered[i]++;

			if (WARN_ON(wl12xx_is_dummy_packet(wl, skb)))
				continue;

			info = IEEE80211_SKB_CB(skb);
			info = IEEE80211_SKB_CB(skb);
			info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
			info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
			info->status.rates[0].idx = -1;
			info->status.rates[0].idx = -1;
			ieee80211_tx_status_ni(wl->hw, skb);
			ieee80211_tx_status_ni(wl->hw, skb);
			filtered[i]++;
		}
		}
	}
	}


+1 −1
Original line number Original line Diff line number Diff line
@@ -143,7 +143,7 @@ static void wl1271_tx_regulate_link(struct wl1271 *wl, u8 hlid)
		wl1271_ps_link_start(wl, hlid, true);
		wl1271_ps_link_start(wl, hlid, true);
}
}


static bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb)
bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb)
{
{
	return wl->dummy_packet == skb;
	return wl->dummy_packet == skb;
}
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -214,5 +214,6 @@ u32 wl1271_tx_min_rate_get(struct wl1271 *wl);
u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct sk_buff *skb);
u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct sk_buff *skb);
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid);
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid);
void wl1271_handle_tx_low_watermark(struct wl1271 *wl);
void wl1271_handle_tx_low_watermark(struct wl1271 *wl);
bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb);


#endif
#endif