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

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

wl12xx: AP mode - clean BA and queue state in tx_reset



Reset the BA state of all connected stations and explicitly clear the
Tx queues. The latter is needed for clearing dummy packets from
tx_queue_count.

Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent f4d3b6ab
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -3757,11 +3757,14 @@ static int wl1271_allocate_sta(struct wl1271 *wl,
	return 0;
	return 0;
}
}


static void wl1271_free_sta(struct wl1271 *wl, u8 hlid)
void wl1271_free_sta(struct wl1271 *wl, u8 hlid)
{
{
	int id = hlid - WL1271_AP_STA_HLID_START;
	int id = hlid - WL1271_AP_STA_HLID_START;


	if (WARN_ON(!test_bit(id, wl->ap_hlid_map)))
	if (hlid < WL1271_AP_STA_HLID_START)
		return;

	if (!test_bit(id, wl->ap_hlid_map))
		return;
		return;


	clear_bit(id, wl->ap_hlid_map);
	clear_bit(id, wl->ap_hlid_map);
+6 −1
Original line number Original line Diff line number Diff line
@@ -891,6 +891,7 @@ void wl1271_tx_reset(struct wl1271 *wl, bool reset_tx_queues)
	/* TX failure */
	/* TX failure */
	if (wl->bss_type == BSS_TYPE_AP_BSS) {
	if (wl->bss_type == BSS_TYPE_AP_BSS) {
		for (i = 0; i < AP_MAX_LINKS; i++) {
		for (i = 0; i < AP_MAX_LINKS; i++) {
			wl1271_free_sta(wl, i);
			wl1271_tx_reset_link_queues(wl, i);
			wl1271_tx_reset_link_queues(wl, i);
			wl->links[i].allocated_pkts = 0;
			wl->links[i].allocated_pkts = 0;
			wl->links[i].prev_freed_pkts = 0;
			wl->links[i].prev_freed_pkts = 0;
@@ -910,10 +911,14 @@ void wl1271_tx_reset(struct wl1271 *wl, bool reset_tx_queues)
					ieee80211_tx_status_ni(wl->hw, skb);
					ieee80211_tx_status_ni(wl->hw, skb);
				}
				}
			}
			}
			wl->tx_queue_count[i] = 0;
		}
		}

		wl->ba_rx_bitmap = 0;
	}
	}


	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] = 0;

	wl->stopped_queues_map = 0;
	wl->stopped_queues_map = 0;


	/*
	/*
+3 −0
Original line number Original line Diff line number Diff line
@@ -216,4 +216,7 @@ 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);
bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb);


/* from main.c */
void wl1271_free_sta(struct wl1271 *wl, u8 hlid);

#endif
#endif