tx.c 31.6 KB
Newer Older
L
Luciano Coelho 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/*
 * This file is part of wl1271
 *
 * Copyright (C) 2009 Nokia Corporation
 *
 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 *
 */

#include <linux/kernel.h>
#include <linux/module.h>
26
#include <linux/etherdevice.h>
L
Luciano Coelho 已提交
27

28
#include "wlcore.h"
29
#include "debug.h"
S
Shahar Levi 已提交
30 31 32
#include "io.h"
#include "ps.h"
#include "tx.h"
33
#include "event.h"
34
#include "hw_ops.h"
L
Luciano Coelho 已提交
35

36 37 38 39 40 41
/*
 * TODO: this is here just for now, it must be removed when the data
 * operations are in place.
 */
#include "../wl12xx/reg.h"

E
Eliad Peller 已提交
42 43
static int wl1271_set_default_wep_key(struct wl1271 *wl,
				      struct wl12xx_vif *wlvif, u8 id)
44 45
{
	int ret;
E
Eliad Peller 已提交
46
	bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
47 48

	if (is_ap)
E
Eliad Peller 已提交
49
		ret = wl12xx_cmd_set_default_wep_key(wl, id,
50
						     wlvif->ap.bcast_hlid);
51
	else
E
Eliad Peller 已提交
52
		ret = wl12xx_cmd_set_default_wep_key(wl, id, wlvif->sta.hlid);
53 54 55 56 57 58 59 60

	if (ret < 0)
		return ret;

	wl1271_debug(DEBUG_CRYPT, "default wep key idx: %d", (int)id);
	return 0;
}

61
static int wl1271_alloc_tx_id(struct wl1271 *wl, struct sk_buff *skb)
L
Luciano Coelho 已提交
62
{
63 64
	int id;

65 66
	id = find_first_zero_bit(wl->tx_frames_map, wl->num_tx_desc);
	if (id >= wl->num_tx_desc)
67 68 69 70 71 72 73
		return -EBUSY;

	__set_bit(id, wl->tx_frames_map);
	wl->tx_frames[id] = skb;
	wl->tx_frames_cnt++;
	return id;
}
L
Luciano Coelho 已提交
74

75
void wl1271_free_tx_id(struct wl1271 *wl, int id)
76 77
{
	if (__test_and_clear_bit(id, wl->tx_frames_map)) {
78
		if (unlikely(wl->tx_frames_cnt == wl->num_tx_desc))
79 80
			clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);

81 82 83
		wl->tx_frames[id] = NULL;
		wl->tx_frames_cnt--;
	}
L
Luciano Coelho 已提交
84
}
85
EXPORT_SYMBOL(wl1271_free_tx_id);
L
Luciano Coelho 已提交
86

87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
static void wl1271_tx_ap_update_inconnection_sta(struct wl1271 *wl,
						 struct sk_buff *skb)
{
	struct ieee80211_hdr *hdr;

	/*
	 * add the station to the known list before transmitting the
	 * authentication response. this way it won't get de-authed by FW
	 * when transmitting too soon.
	 */
	hdr = (struct ieee80211_hdr *)(skb->data +
				       sizeof(struct wl1271_tx_hw_descr));
	if (ieee80211_is_auth(hdr->frame_control))
		wl1271_acx_set_inconnection_sta(wl, hdr->addr1);
}

103 104 105
static void wl1271_tx_regulate_link(struct wl1271 *wl,
				    struct wl12xx_vif *wlvif,
				    u8 hlid)
106
{
107
	bool fw_ps, single_sta;
108
	u8 tx_pkts;
109

110
	if (WARN_ON(!test_bit(hlid, wlvif->links_map)))
111 112 113
		return;

	fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
114
	tx_pkts = wl->links[hlid].allocated_pkts;
115
	single_sta = (wl->active_sta_count == 1);
116 117 118 119

	/*
	 * if in FW PS and there is enough data in FW we can put the link
	 * into high-level PS and clean out its TX queues.
120 121
	 * Make an exception if this is the only connected station. In this
	 * case FW-memory congestion is not a problem.
122
	 */
123
	if (!single_sta && fw_ps && tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
124
		wl12xx_ps_link_start(wl, wlvif, hlid, true);
125 126
}

127
bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb)
E
Eliad Peller 已提交
128 129 130
{
	return wl->dummy_packet == skb;
}
131
EXPORT_SYMBOL(wl12xx_is_dummy_packet);
E
Eliad Peller 已提交
132

133 134
static u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif,
				struct sk_buff *skb, struct ieee80211_sta *sta)
135
{
136
	if (sta) {
137 138
		struct wl1271_station *wl_sta;

139
		wl_sta = (struct wl1271_station *)sta->drv_priv;
140 141 142 143
		return wl_sta->hlid;
	} else {
		struct ieee80211_hdr *hdr;

144
		if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
145 146
			return wl->system_hlid;

147
		hdr = (struct ieee80211_hdr *)skb->data;
148
		if (is_multicast_ether_addr(ieee80211_get_DA(hdr)))
149
			return wlvif->ap.bcast_hlid;
150 151
		else
			return wlvif->ap.global_hlid;
152 153 154
	}
}

155
u8 wl12xx_tx_get_hlid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
156
		      struct sk_buff *skb, struct ieee80211_sta *sta)
E
Eliad Peller 已提交
157
{
158 159
	struct ieee80211_tx_info *control;

E
Eliad Peller 已提交
160
	if (!wlvif || wl12xx_is_dummy_packet(wl, skb))
E
Eliad Peller 已提交
161 162
		return wl->system_hlid;

E
Eliad Peller 已提交
163
	if (wlvif->bss_type == BSS_TYPE_AP_BSS)
164
		return wl12xx_tx_get_hlid_ap(wl, wlvif, skb, sta);
E
Eliad Peller 已提交
165

166 167 168 169 170 171
	control = IEEE80211_SKB_CB(skb);
	if (control->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
		wl1271_debug(DEBUG_TX, "tx offchannel");
		return wlvif->dev_hlid;
	}

172
	return wlvif->sta.hlid;
E
Eliad Peller 已提交
173 174
}

175 176
unsigned int wlcore_calc_packet_alignment(struct wl1271 *wl,
					  unsigned int packet_length)
177
{
178 179
	if ((wl->quirks & WLCORE_QUIRK_TX_PAD_LAST_FRAME) ||
	    !(wl->quirks & WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN))
180
		return ALIGN(packet_length, WL1271_TX_ALIGN_TO);
181 182
	else
		return ALIGN(packet_length, WL12XX_BUS_BLOCK_SIZE);
183
}
184
EXPORT_SYMBOL(wlcore_calc_packet_alignment);
185

186
static int wl1271_tx_allocate(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
187
			      struct sk_buff *skb, u32 extra, u32 buf_offset,
188
			      u8 hlid, bool is_gem)
L
Luciano Coelho 已提交
189 190 191
{
	struct wl1271_tx_hw_descr *desc;
	u32 total_len = skb->len + sizeof(struct wl1271_tx_hw_descr) + extra;
192
	u32 total_blocks;
193
	int id, ret = -EBUSY, ac;
194
	u32 spare_blocks;
L
Luciano Coelho 已提交
195

196
	if (buf_offset + total_len > wl->aggr_buf_size)
I
Ido Yariv 已提交
197
		return -EAGAIN;
198

199 200
	spare_blocks = wlcore_hw_get_spare_blocks(wl, is_gem);

L
Luciano Coelho 已提交
201
	/* allocate free identifier for the packet */
202
	id = wl1271_alloc_tx_id(wl, skb);
L
Luciano Coelho 已提交
203 204 205
	if (id < 0)
		return id;

206
	total_blocks = wlcore_hw_calc_tx_blocks(wl, total_len, spare_blocks);
207

L
Luciano Coelho 已提交
208 209 210 211
	if (total_blocks <= wl->tx_blocks_available) {
		desc = (struct wl1271_tx_hw_descr *)skb_push(
			skb, total_len - skb->len);

212 213
		wlcore_hw_set_tx_desc_blocks(wl, desc, total_blocks,
					     spare_blocks);
214

L
Luciano Coelho 已提交
215 216 217
		desc->id = id;

		wl->tx_blocks_available -= total_blocks;
218
		wl->tx_allocated_blocks += total_blocks;
L
Luciano Coelho 已提交
219

A
Arik Nemtsov 已提交
220 221 222 223
		/* If the FW was empty before, arm the Tx watchdog */
		if (wl->tx_allocated_blocks == total_blocks)
			wl12xx_rearm_tx_watchdog_locked(wl);

224 225
		ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
		wl->tx_allocated_pkts[ac]++;
226

227
		if (!wl12xx_is_dummy_packet(wl, skb) && wlvif &&
E
Eliad Peller 已提交
228
		    wlvif->bss_type == BSS_TYPE_AP_BSS &&
229
		    test_bit(hlid, wlvif->ap.sta_hlid_map))
230
			wl->links[hlid].allocated_pkts++;
231

L
Luciano Coelho 已提交
232 233 234 235 236
		ret = 0;

		wl1271_debug(DEBUG_TX,
			     "tx_allocate: size: %d, blocks: %d, id: %d",
			     total_len, total_blocks, id);
237
	} else {
238
		wl1271_free_tx_id(wl, id);
239
	}
L
Luciano Coelho 已提交
240 241 242 243

	return ret;
}

244
static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
245 246
			       struct sk_buff *skb, u32 extra,
			       struct ieee80211_tx_info *control, u8 hlid)
L
Luciano Coelho 已提交
247
{
248
	struct timespec ts;
L
Luciano Coelho 已提交
249
	struct wl1271_tx_hw_descr *desc;
250
	int ac, rate_idx;
251
	s64 hosttime;
252
	u16 tx_attr = 0;
253 254 255
	__le16 frame_control;
	struct ieee80211_hdr *hdr;
	u8 *frame_start;
256
	bool is_dummy;
L
Luciano Coelho 已提交
257 258

	desc = (struct wl1271_tx_hw_descr *) skb->data;
259 260 261
	frame_start = (u8 *)(desc + 1);
	hdr = (struct ieee80211_hdr *)(frame_start + extra);
	frame_control = hdr->frame_control;
L
Luciano Coelho 已提交
262

263 264
	/* relocate space for security header */
	if (extra) {
265 266
		int hdrlen = ieee80211_hdrlen(frame_control);
		memmove(frame_start, hdr, hdrlen);
267
		skb_set_network_header(skb, skb_network_offset(skb) + extra);
268 269
	}

L
Luciano Coelho 已提交
270
	/* configure packet life time */
271 272 273
	getnstimeofday(&ts);
	hosttime = (timespec_to_ns(&ts) >> 10);
	desc->start_time = cpu_to_le32(hosttime - wl->time_offset);
274

275
	is_dummy = wl12xx_is_dummy_packet(wl, skb);
E
Eliad Peller 已提交
276
	if (is_dummy || !wlvif || wlvif->bss_type != BSS_TYPE_AP_BSS)
277 278 279
		desc->life_time = cpu_to_le16(TX_HW_MGMT_PKT_LIFETIME_TU);
	else
		desc->life_time = cpu_to_le16(TX_HW_AP_MODE_PKT_LIFETIME_TU);
L
Luciano Coelho 已提交
280

281
	/* queue */
K
Kalle Valo 已提交
282
	ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
283
	desc->tid = skb->priority;
284

285
	if (is_dummy) {
286 287 288 289
		/*
		 * FW expects the dummy packet to have an invalid session id -
		 * any session id that is different than the one set in the join
		 */
290
		tx_attr = (SESSION_COUNTER_INVALID <<
291 292 293 294
			   TX_HW_ATTR_OFST_SESSION_COUNTER) &
			   TX_HW_ATTR_SESSION_COUNTER;

		tx_attr |= TX_HW_ATTR_TX_DUMMY_REQ;
E
Eliad Peller 已提交
295
	} else if (wlvif) {
296
		/* configure the tx attributes */
E
Eliad Peller 已提交
297
		tx_attr = wl->session_ids[hlid] <<
298
			  TX_HW_ATTR_OFST_SESSION_COUNTER;
299 300
	}

E
Eliad Peller 已提交
301
	desc->hlid = hlid;
E
Eliad Peller 已提交
302
	if (is_dummy || !wlvif)
303 304
		rate_idx = 0;
	else if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
305
		/*
306
		 * if the packets are data packets
307 308 309
		 * send them with AP rate policies (EAPOLs are an exception),
		 * otherwise use default basic rates
		 */
310
		if (skb->protocol == cpu_to_be16(ETH_P_PAE))
311
			rate_idx = wlvif->sta.basic_rate_idx;
312 313
		else if (control->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
			rate_idx = wlvif->sta.p2p_rate_idx;
314
		else if (ieee80211_is_data(frame_control))
E
Eliad Peller 已提交
315
			rate_idx = wlvif->sta.ap_rate_idx;
316
		else
E
Eliad Peller 已提交
317
			rate_idx = wlvif->sta.basic_rate_idx;
318
	} else {
319
		if (hlid == wlvif->ap.global_hlid)
E
Eliad Peller 已提交
320
			rate_idx = wlvif->ap.mgmt_rate_idx;
321
		else if (hlid == wlvif->ap.bcast_hlid ||
322 323 324 325 326 327
			 skb->protocol == cpu_to_be16(ETH_P_PAE) ||
			 !ieee80211_is_data(frame_control))
			/*
			 * send non-data, bcast and EAPOLs using the
			 * min basic rate
			 */
E
Eliad Peller 已提交
328
			rate_idx = wlvif->ap.bcast_rate_idx;
329
		else
E
Eliad Peller 已提交
330
			rate_idx = wlvif->ap.ucast_rate_idx[ac];
331 332 333
	}

	tx_attr |= rate_idx << TX_HW_ATTR_OFST_RATE_POLICY;
L
Luciano Coelho 已提交
334

335 336 337 338 339
	/* for WEP shared auth - no fw encryption is needed */
	if (ieee80211_is_auth(frame_control) &&
	    ieee80211_has_protected(frame_control))
		tx_attr |= TX_HW_ATTR_HOST_ENCRYPT;

L
Luciano Coelho 已提交
340
	desc->tx_attr = cpu_to_le16(tx_attr);
341

342
	wlcore_hw_set_tx_desc_csum(wl, desc, skb);
343
	wlcore_hw_set_tx_desc_data_len(wl, desc, skb);
L
Luciano Coelho 已提交
344 345 346
}

/* caller must hold wl->mutex */
347
static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct wl12xx_vif *wlvif,
348
				   struct sk_buff *skb, u32 buf_offset, u8 hlid)
L
Luciano Coelho 已提交
349 350 351 352
{
	struct ieee80211_tx_info *info;
	u32 extra = 0;
	int ret = 0;
353
	u32 total_len;
E
Eliad Peller 已提交
354
	bool is_dummy;
355
	bool is_gem = false;
L
Luciano Coelho 已提交
356

357 358
	if (!skb) {
		wl1271_error("discarding null skb");
L
Luciano Coelho 已提交
359
		return -EINVAL;
360
	}
L
Luciano Coelho 已提交
361

362 363 364 365 366
	if (hlid == WL12XX_INVALID_LINK_ID) {
		wl1271_error("invalid hlid. dropping skb 0x%p", skb);
		return -EINVAL;
	}

L
Luciano Coelho 已提交
367 368
	info = IEEE80211_SKB_CB(skb);

E
Eliad Peller 已提交
369 370
	is_dummy = wl12xx_is_dummy_packet(wl, skb);

371 372
	if ((wl->quirks & WLCORE_QUIRK_TKIP_HEADER_SPACE) &&
	    info->control.hw_key &&
373
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
374
		extra = WL1271_EXTRA_SPACE_TKIP;
L
Luciano Coelho 已提交
375 376

	if (info->control.hw_key) {
377 378 379 380 381 382
		bool is_wep;
		u8 idx = info->control.hw_key->hw_key_idx;
		u32 cipher = info->control.hw_key->cipher;

		is_wep = (cipher == WLAN_CIPHER_SUITE_WEP40) ||
			 (cipher == WLAN_CIPHER_SUITE_WEP104);
L
Luciano Coelho 已提交
383

E
Eliad Peller 已提交
384
		if (unlikely(is_wep && wlvif->default_key != idx)) {
E
Eliad Peller 已提交
385
			ret = wl1271_set_default_wep_key(wl, wlvif, idx);
L
Luciano Coelho 已提交
386 387
			if (ret < 0)
				return ret;
E
Eliad Peller 已提交
388
			wlvif->default_key = idx;
L
Luciano Coelho 已提交
389
		}
390 391

		is_gem = (cipher == WL1271_CIPHER_SUITE_GEM);
L
Luciano Coelho 已提交
392
	}
393

394 395
	ret = wl1271_tx_allocate(wl, wlvif, skb, extra, buf_offset, hlid,
				 is_gem);
L
Luciano Coelho 已提交
396 397 398
	if (ret < 0)
		return ret;

399
	wl1271_tx_fill_hdr(wl, wlvif, skb, extra, info, hlid);
400

E
Eliad Peller 已提交
401
	if (!is_dummy && wlvif && wlvif->bss_type == BSS_TYPE_AP_BSS) {
402
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
403
		wl1271_tx_regulate_link(wl, wlvif, hlid);
404
	}
405

406
	/*
407 408 409 410 411 412
	 * The length of each packet is stored in terms of
	 * words. Thus, we must pad the skb data to make sure its
	 * length is aligned.  The number of padding bytes is computed
	 * and set in wl1271_tx_fill_hdr.
	 * In special cases, we want to align to a specific block size
	 * (eg. for wl128x with SDIO we align to 256).
413
	 */
414
	total_len = wlcore_calc_packet_alignment(wl, skb->len);
415

416 417
	memcpy(wl->aggr_buf + buf_offset, skb->data, skb->len);
	memset(wl->aggr_buf + buf_offset + skb->len, 0, total_len - skb->len);
L
Luciano Coelho 已提交
418

419
	/* Revert side effects in the dummy packet skb, so it can be reused */
E
Eliad Peller 已提交
420
	if (is_dummy)
421 422
		skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

423
	return total_len;
L
Luciano Coelho 已提交
424 425
}

426 427
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set,
				enum ieee80211_band rate_band)
428 429 430 431 432
{
	struct ieee80211_supported_band *band;
	u32 enabled_rates = 0;
	int bit;

433
	band = wl->hw->wiphy->bands[rate_band];
434 435 436 437 438 439
	for (bit = 0; bit < band->n_bitrates; bit++) {
		if (rate_set & 0x1)
			enabled_rates |= band->bitrates[bit].hw_value;
		rate_set >>= 1;
	}

A
Arik Nemtsov 已提交
440
	/* MCS rates indication are on bits 16 - 31 */
441 442
	rate_set >>= HW_HT_RATES_OFFSET - band->n_bitrates;

A
Arik Nemtsov 已提交
443
	for (bit = 0; bit < 16; bit++) {
444 445 446 447 448
		if (rate_set & 0x1)
			enabled_rates |= (CONF_HW_BIT_RATE_MCS_0 << bit);
		rate_set >>= 1;
	}

449 450 451
	return enabled_rates;
}

452
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
453
{
454
	int i;
455

456
	for (i = 0; i < NUM_TX_QUEUES; i++) {
457 458
		if (wlcore_is_queue_stopped_by_reason(wl, i,
			WLCORE_QUEUE_STOP_REASON_WATERMARK) &&
459
		    wl->tx_queue_count[i] <= WL1271_TX_QUEUE_LOW_WATERMARK) {
460
			/* firmware buffer has space, restart queues */
461 462
			wlcore_wake_queue(wl, i,
					  WLCORE_QUEUE_STOP_REASON_WATERMARK);
463
		}
464 465 466
	}
}

467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494
static struct sk_buff_head *wl1271_select_queue(struct wl1271 *wl,
						struct sk_buff_head *queues)
{
	int i, q = -1, ac;
	u32 min_pkts = 0xffffffff;

	/*
	 * Find a non-empty ac where:
	 * 1. There are packets to transmit
	 * 2. The FW has the least allocated blocks
	 *
	 * We prioritize the ACs according to VO>VI>BE>BK
	 */
	for (i = 0; i < NUM_TX_QUEUES; i++) {
		ac = wl1271_tx_get_queue(i);
		if (!skb_queue_empty(&queues[ac]) &&
		    (wl->tx_allocated_pkts[ac] < min_pkts)) {
			q = ac;
			min_pkts = wl->tx_allocated_pkts[q];
		}
	}

	if (q == -1)
		return NULL;

	return &queues[q];
}

495 496
static struct sk_buff *wl12xx_lnk_skb_dequeue(struct wl1271 *wl,
					      struct wl1271_link *lnk)
497
{
498
	struct sk_buff *skb;
499
	unsigned long flags;
500
	struct sk_buff_head *queue;
501

502
	queue = wl1271_select_queue(wl, lnk->tx_queue);
503
	if (!queue)
504
		return NULL;
505 506

	skb = skb_dequeue(queue);
507
	if (skb) {
508
		int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
509
		spin_lock_irqsave(&wl->wl_lock, flags);
510
		WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
511
		wl->tx_queue_count[q]--;
512 513 514 515 516 517
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
}

518
static struct sk_buff *wl12xx_vif_skb_dequeue(struct wl1271 *wl,
519 520
					      struct wl12xx_vif *wlvif,
					      u8 *hlid)
521 522 523 524 525
{
	struct sk_buff *skb = NULL;
	int i, h, start_hlid;

	/* start from the link after the last one */
526
	start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
527 528

	/* dequeue according to AC, round robin on each link */
529 530
	for (i = 0; i < WL12XX_MAX_LINKS; i++) {
		h = (start_hlid + i) % WL12XX_MAX_LINKS;
531

532
		/* only consider connected stations */
533
		if (!test_bit(h, wlvif->links_map))
534 535
			continue;

536 537
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[h]);
		if (!skb)
538 539
			continue;

540 541
		wlvif->last_tx_hlid = h;
		break;
542 543
	}

544
	if (!skb)
545
		wlvif->last_tx_hlid = 0;
546

547
	*hlid = wlvif->last_tx_hlid;
548 549 550
	return skb;
}

551
static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl, u8 *hlid)
552
{
553
	unsigned long flags;
554
	struct wl12xx_vif *wlvif = wl->last_wlvif;
555 556
	struct sk_buff *skb = NULL;

557
	/* continue from last wlvif (round robin) */
558 559
	if (wlvif) {
		wl12xx_for_each_wlvif_continue(wl, wlvif) {
560
			skb = wl12xx_vif_skb_dequeue(wl, wlvif, hlid);
561 562 563 564 565 566 567
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
		}
	}

568
	/* dequeue from the system HLID before the restarting wlvif list */
569
	if (!skb) {
570
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[wl->system_hlid]);
571 572
		*hlid = wl->system_hlid;
	}
573 574

	/* do a new pass over the wlvif list */
575 576
	if (!skb) {
		wl12xx_for_each_wlvif(wl, wlvif) {
577
			skb = wl12xx_vif_skb_dequeue(wl, wlvif, hlid);
578 579 580 581
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
582 583 584 585 586 587 588

			/*
			 * No need to continue after last_wlvif. The previous
			 * pass should have found it.
			 */
			if (wlvif == wl->last_wlvif)
				break;
589
		}
590 591
	}

592 593
	if (!skb &&
	    test_and_clear_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) {
594 595
		int q;

596
		skb = wl->dummy_packet;
597
		*hlid = wl->system_hlid;
598
		q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
599
		spin_lock_irqsave(&wl->wl_lock, flags);
600
		WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
601
		wl->tx_queue_count[q]--;
602 603 604 605
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
606 607
}

608
static void wl1271_skb_queue_head(struct wl1271 *wl, struct wl12xx_vif *wlvif,
609
				  struct sk_buff *skb, u8 hlid)
610 611 612 613
{
	unsigned long flags;
	int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));

614 615
	if (wl12xx_is_dummy_packet(wl, skb)) {
		set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
616
	} else {
617 618 619
		skb_queue_head(&wl->links[hlid].tx_queue[q], skb);

		/* make sure we dequeue the same packet next time */
620
		wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
621
				      WL12XX_MAX_LINKS;
622 623
	}

624
	spin_lock_irqsave(&wl->wl_lock, flags);
625
	wl->tx_queue_count[q]++;
626 627 628
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

629 630 631 632 633 634 635
static bool wl1271_tx_is_data_present(struct sk_buff *skb)
{
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);

	return ieee80211_is_data_present(hdr->frame_control);
}

E
Eliad Peller 已提交
636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662
void wl12xx_rearm_rx_streaming(struct wl1271 *wl, unsigned long *active_hlids)
{
	struct wl12xx_vif *wlvif;
	u32 timeout;
	u8 hlid;

	if (!wl->conf.rx_streaming.interval)
		return;

	if (!wl->conf.rx_streaming.always &&
	    !test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags))
		return;

	timeout = wl->conf.rx_streaming.duration;
	wl12xx_for_each_wlvif_sta(wl, wlvif) {
		bool found = false;
		for_each_set_bit(hlid, active_hlids, WL12XX_MAX_LINKS) {
			if (test_bit(hlid, wlvif->links_map)) {
				found  = true;
				break;
			}
		}

		if (!found)
			continue;

		/* enable rx streaming */
663
		if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
664 665 666 667 668 669 670 671
			ieee80211_queue_work(wl->hw,
					     &wlvif->rx_streaming_enable_work);

		mod_timer(&wlvif->rx_streaming_timer,
			  jiffies + msecs_to_jiffies(timeout));
	}
}

672 673 674 675 676 677 678 679 680 681
/*
 * Returns failure values only in case of failed bus ops within this function.
 * wl1271_prepare_tx_frame retvals won't be returned in order to avoid
 * triggering recovery by higher layers when not necessary.
 * In case a FW command fails within wl1271_prepare_tx_frame fails a recovery
 * will be queued in wl1271_cmd_send. -EAGAIN/-EBUSY from prepare_tx_frame
 * can occur and are legitimate so don't propagate. -EINVAL will emit a WARNING
 * within prepare_tx_frame code but there's nothing we should do about those
 * as well.
 */
682
int wlcore_tx_work_locked(struct wl1271 *wl)
L
Luciano Coelho 已提交
683
{
684
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
685
	struct sk_buff *skb;
E
Eliad Peller 已提交
686
	struct wl1271_tx_hw_descr *desc;
687
	u32 buf_offset = 0, last_len = 0;
I
Ido Yariv 已提交
688
	bool sent_packets = false;
E
Eliad Peller 已提交
689
	unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
690
	int ret = 0;
691
	int bus_ret = 0;
692
	u8 hlid;
L
Luciano Coelho 已提交
693

694
	if (unlikely(wl->state != WLCORE_STATE_ON))
695
		return 0;
L
Luciano Coelho 已提交
696

697
	while ((skb = wl1271_skb_dequeue(wl, &hlid))) {
E
Eliad Peller 已提交
698
		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
E
Eliad Peller 已提交
699 700
		bool has_data = false;

701
		wlvif = NULL;
E
Eliad Peller 已提交
702 703
		if (!wl12xx_is_dummy_packet(wl, skb) && info->control.vif)
			wlvif = wl12xx_vif_to_data(info->control.vif);
704 705
		else
			hlid = wl->system_hlid;
706

E
Eliad Peller 已提交
707
		has_data = wlvif && wl1271_tx_is_data_present(skb);
708 709
		ret = wl1271_prepare_tx_frame(wl, wlvif, skb, buf_offset,
					      hlid);
I
Ido Yariv 已提交
710
		if (ret == -EAGAIN) {
711
			/*
I
Ido Yariv 已提交
712 713 714
			 * Aggregation buffer is full.
			 * Flush buffer and try again.
			 */
715
			wl1271_skb_queue_head(wl, wlvif, skb, hlid);
716 717 718

			buf_offset = wlcore_hw_pre_pkt_send(wl, buf_offset,
							    last_len);
719 720 721
			bus_ret = wlcore_write_data(wl, REG_SLV_MEM_DATA,
					     wl->aggr_buf, buf_offset, true);
			if (bus_ret < 0)
722 723
				goto out;

I
Ido Yariv 已提交
724 725 726 727 728 729
			sent_packets = true;
			buf_offset = 0;
			continue;
		} else if (ret == -EBUSY) {
			/*
			 * Firmware buffer is full.
730 731
			 * Queue back last skb, and stop aggregating.
			 */
732
			wl1271_skb_queue_head(wl, wlvif, skb, hlid);
I
Ido Yariv 已提交
733 734
			/* No work left, avoid scheduling redundant tx work */
			set_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
735
			goto out_ack;
L
Luciano Coelho 已提交
736
		} else if (ret < 0) {
E
Eliad Peller 已提交
737 738 739 740 741
			if (wl12xx_is_dummy_packet(wl, skb))
				/*
				 * fw still expects dummy packet,
				 * so re-enqueue it
				 */
742
				wl1271_skb_queue_head(wl, wlvif, skb, hlid);
E
Eliad Peller 已提交
743 744
			else
				ieee80211_free_txskb(wl->hw, skb);
745
			goto out_ack;
L
Luciano Coelho 已提交
746
		}
747 748
		last_len = ret;
		buf_offset += last_len;
749
		wl->tx_packets_count++;
E
Eliad Peller 已提交
750 751 752 753
		if (has_data) {
			desc = (struct wl1271_tx_hw_descr *) skb->data;
			__set_bit(desc->hlid, active_hlids);
		}
L
Luciano Coelho 已提交
754 755
	}

756
out_ack:
757
	if (buf_offset) {
758
		buf_offset = wlcore_hw_pre_pkt_send(wl, buf_offset, last_len);
759 760 761
		bus_ret = wlcore_write_data(wl, REG_SLV_MEM_DATA, wl->aggr_buf,
					     buf_offset, true);
		if (bus_ret < 0)
762 763
			goto out;

I
Ido Yariv 已提交
764 765 766
		sent_packets = true;
	}
	if (sent_packets) {
767 768 769 770
		/*
		 * Interrupt the firmware with the new packets. This is only
		 * required for older hardware revisions
		 */
771
		if (wl->quirks & WLCORE_QUIRK_END_OF_TRANSACTION) {
772
			bus_ret = wlcore_write32(wl, WL12XX_HOST_WR_ACCESS,
773
					     wl->tx_packets_count);
774
			if (bus_ret < 0)
775 776
				goto out;
		}
777

778
		wl1271_handle_tx_low_watermark(wl);
779
	}
E
Eliad Peller 已提交
780
	wl12xx_rearm_rx_streaming(wl, active_hlids);
781 782

out:
783
	return bus_ret;
I
Ido Yariv 已提交
784
}
L
Luciano Coelho 已提交
785

I
Ido Yariv 已提交
786 787 788
void wl1271_tx_work(struct work_struct *work)
{
	struct wl1271 *wl = container_of(work, struct wl1271, tx_work);
789
	int ret;
I
Ido Yariv 已提交
790 791

	mutex_lock(&wl->mutex);
792 793 794 795
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

796 797 798 799 800
	ret = wlcore_tx_work_locked(wl);
	if (ret < 0) {
		wl12xx_queue_recovery_work(wl);
		goto out;
	}
801

802
	wl1271_ps_elp_sleep(wl);
803
out:
L
Luciano Coelho 已提交
804 805 806
	mutex_unlock(&wl->mutex);
}

807 808
static u8 wl1271_tx_get_rate_flags(u8 rate_class_index)
{
809 810
	u8 flags = 0;

811 812 813 814 815
	/*
	 * TODO: use wl12xx constants when this code is moved to wl12xx, as
	 * only it uses Tx-completion.
	 */
	if (rate_class_index <= 8)
816
		flags |= IEEE80211_TX_RC_MCS;
817 818 819 820 821 822

	/*
	 * TODO: use wl12xx constants when this code is moved to wl12xx, as
	 * only it uses Tx-completion.
	 */
	if (rate_class_index == 0)
823
		flags |= IEEE80211_TX_RC_SHORT_GI;
824

825
	return flags;
826 827
}

L
Luciano Coelho 已提交
828 829 830 831
static void wl1271_tx_complete_packet(struct wl1271 *wl,
				      struct wl1271_tx_hw_res_descr *result)
{
	struct ieee80211_tx_info *info;
832 833
	struct ieee80211_vif *vif;
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
834 835
	struct sk_buff *skb;
	int id = result->id;
J
Juuso Oikarinen 已提交
836
	int rate = -1;
837
	u8 rate_flags = 0;
J
Juuso Oikarinen 已提交
838
	u8 retries = 0;
L
Luciano Coelho 已提交
839 840

	/* check for id legality */
841
	if (unlikely(id >= wl->num_tx_desc || wl->tx_frames[id] == NULL)) {
L
Luciano Coelho 已提交
842 843 844 845 846 847 848
		wl1271_warning("TX result illegal id: %d", id);
		return;
	}

	skb = wl->tx_frames[id];
	info = IEEE80211_SKB_CB(skb);

849
	if (wl12xx_is_dummy_packet(wl, skb)) {
850 851 852 853
		wl1271_free_tx_id(wl, id);
		return;
	}

854 855 856 857
	/* info->control is valid as long as we don't update info->status */
	vif = info->control.vif;
	wlvif = wl12xx_vif_to_data(vif);

J
Juuso Oikarinen 已提交
858 859 860
	/* update the TX status info */
	if (result->status == TX_SUCCESS) {
		if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
L
Luciano Coelho 已提交
861
			info->flags |= IEEE80211_TX_STAT_ACK;
862
		rate = wlcore_rate_to_idx(wl, result->rate_class_index,
E
Eliad Peller 已提交
863
					  wlvif->band);
864
		rate_flags = wl1271_tx_get_rate_flags(result->rate_class_index);
J
Juuso Oikarinen 已提交
865 866 867 868
		retries = result->ack_failures;
	} else if (result->status == TX_RETRY_EXCEEDED) {
		wl->stats.excessive_retries++;
		retries = result->ack_failures;
L
Luciano Coelho 已提交
869 870
	}

J
Juuso Oikarinen 已提交
871 872
	info->status.rates[0].idx = rate;
	info->status.rates[0].count = retries;
873
	info->status.rates[0].flags = rate_flags;
J
Juuso Oikarinen 已提交
874 875
	info->status.ack_signal = -1;

L
Luciano Coelho 已提交
876 877
	wl->stats.retry_count += result->ack_failures;

878 879 880 881 882 883 884 885 886
	/*
	 * update sequence number only when relevant, i.e. only in
	 * sessions of TKIP, AES and GEM (not in open or WEP sessions)
	 */
	if (info->control.hw_key &&
	    (info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP ||
	     info->control.hw_key->cipher == WLAN_CIPHER_SUITE_CCMP ||
	     info->control.hw_key->cipher == WL1271_CIPHER_SUITE_GEM)) {
		u8 fw_lsb = result->tx_security_sequence_number_lsb;
887
		u8 cur_lsb = wlvif->tx_security_last_seq_lsb;
888 889 890 891 892

		/*
		 * update security sequence number, taking care of potential
		 * wrap-around
		 */
893 894
		wlvif->tx_security_seq += (fw_lsb - cur_lsb) & 0xff;
		wlvif->tx_security_last_seq_lsb = fw_lsb;
895
	}
896

897 898 899 900
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

	/* remove TKIP header space if present */
901 902
	if ((wl->quirks & WLCORE_QUIRK_TKIP_HEADER_SPACE) &&
	    info->control.hw_key &&
903
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
904
		int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
905 906 907
		memmove(skb->data + WL1271_EXTRA_SPACE_TKIP, skb->data,
			hdrlen);
		skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
908
	}
L
Luciano Coelho 已提交
909 910 911 912 913 914 915

	wl1271_debug(DEBUG_TX, "tx status id %u skb 0x%p failures %u rate 0x%x"
		     " status 0x%x",
		     result->id, skb, result->ack_failures,
		     result->rate_class_index, result->status);

	/* return the packet to the stack */
916
	skb_queue_tail(&wl->deferred_tx_queue, skb);
917
	queue_work(wl->freezable_wq, &wl->netstack_work);
918
	wl1271_free_tx_id(wl, result->id);
L
Luciano Coelho 已提交
919 920 921
}

/* Called upon reception of a TX complete interrupt */
922
int wlcore_tx_complete(struct wl1271 *wl)
L
Luciano Coelho 已提交
923
{
924
	struct wl1271_acx_mem_map *memmap = wl->target_mem_map;
925
	u32 count, fw_counter;
L
Luciano Coelho 已提交
926
	u32 i;
927
	int ret;
L
Luciano Coelho 已提交
928 929

	/* read the tx results from the chipset */
930 931 932 933 934
	ret = wlcore_read(wl, le32_to_cpu(memmap->tx_result),
			  wl->tx_res_if, sizeof(*wl->tx_res_if), false);
	if (ret < 0)
		goto out;

935 936 937
	fw_counter = le32_to_cpu(wl->tx_res_if->tx_result_fw_counter);

	/* write host counter to chipset (to ack) */
938 939 940 941 942
	ret = wlcore_write32(wl, le32_to_cpu(memmap->tx_result) +
			     offsetof(struct wl1271_tx_hw_res_if,
				      tx_result_host_counter), fw_counter);
	if (ret < 0)
		goto out;
943 944

	count = fw_counter - wl->tx_results_count;
945
	wl1271_debug(DEBUG_TX, "tx_complete received, packets: %d", count);
L
Luciano Coelho 已提交
946 947

	/* verify that the result buffer is not getting overrun */
948
	if (unlikely(count > TX_HW_RESULT_QUEUE_LEN))
L
Luciano Coelho 已提交
949 950 951 952 953 954 955 956 957 958 959 960 961
		wl1271_warning("TX result overflow from chipset: %d", count);

	/* process the results */
	for (i = 0; i < count; i++) {
		struct wl1271_tx_hw_res_descr *result;
		u8 offset = wl->tx_results_count & TX_HW_RESULT_QUEUE_LEN_MASK;

		/* process the packet */
		result =  &(wl->tx_res_if->tx_results_queue[offset]);
		wl1271_tx_complete_packet(wl, result);

		wl->tx_results_count++;
	}
962 963 964

out:
	return ret;
L
Luciano Coelho 已提交
965
}
966
EXPORT_SYMBOL(wlcore_tx_complete);
L
Luciano Coelho 已提交
967

968 969 970
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
971
	int i;
972
	unsigned long flags;
973
	struct ieee80211_tx_info *info;
974
	int total[NUM_TX_QUEUES];
975 976

	for (i = 0; i < NUM_TX_QUEUES; i++) {
977
		total[i] = 0;
978 979
		while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
			wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb);
980 981 982 983 984 985 986 987

			if (!wl12xx_is_dummy_packet(wl, skb)) {
				info = IEEE80211_SKB_CB(skb);
				info->status.rates[0].idx = -1;
				info->status.rates[0].count = 0;
				ieee80211_tx_status_ni(wl->hw, skb);
			}

988
			total[i]++;
989 990 991 992
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
993 994
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] -= total[i];
995 996 997 998 999
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

1000
/* caller must hold wl->mutex and TX must be stopped */
1001
void wl12xx_tx_reset_wlvif(struct wl1271 *wl, struct wl12xx_vif *wlvif)
L
Luciano Coelho 已提交
1002 1003 1004 1005
{
	int i;

	/* TX failure */
1006 1007
	for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
		if (wlvif->bss_type == BSS_TYPE_AP_BSS)
1008
			wl1271_free_sta(wl, wlvif, i);
1009 1010
		else
			wlvif->sta.ba_rx_bitmap = 0;
1011

1012 1013
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
1014
	}
1015 1016 1017 1018
	wlvif->last_tx_hlid = 0;

}
/* caller must hold wl->mutex and TX must be stopped */
1019
void wl12xx_tx_reset(struct wl1271 *wl)
1020 1021 1022 1023
{
	int i;
	struct sk_buff *skb;
	struct ieee80211_tx_info *info;
1024

1025 1026 1027 1028 1029 1030 1031 1032
	/* only reset the queues if something bad happened */
	if (WARN_ON_ONCE(wl1271_tx_total_queue_count(wl) != 0)) {
		for (i = 0; i < WL12XX_MAX_LINKS; i++)
			wl1271_tx_reset_link_queues(wl, i);

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

1034 1035 1036
	/*
	 * Make sure the driver is at a consistent state, in case this
	 * function is called from a context other than interface removal.
1037
	 * This call will always wake the TX queues.
1038
	 */
1039
	wl1271_handle_tx_low_watermark(wl);
1040

1041
	for (i = 0; i < wl->num_tx_desc; i++) {
1042 1043 1044 1045 1046 1047 1048
		if (wl->tx_frames[i] == NULL)
			continue;

		skb = wl->tx_frames[i];
		wl1271_free_tx_id(wl, i);
		wl1271_debug(DEBUG_TX, "freeing skb 0x%p", skb);

1049
		if (!wl12xx_is_dummy_packet(wl, skb)) {
1050 1051 1052 1053 1054 1055
			/*
			 * Remove private headers before passing the skb to
			 * mac80211
			 */
			info = IEEE80211_SKB_CB(skb);
			skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));
1056 1057
			if ((wl->quirks & WLCORE_QUIRK_TKIP_HEADER_SPACE) &&
			    info->control.hw_key &&
1058 1059 1060
			    info->control.hw_key->cipher ==
			    WLAN_CIPHER_SUITE_TKIP) {
				int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
1061
				memmove(skb->data + WL1271_EXTRA_SPACE_TKIP,
1062
					skb->data, hdrlen);
1063
				skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
1064
			}
1065

1066 1067
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
1068

1069
			ieee80211_tx_status_ni(wl->hw, skb);
1070
		}
1071
	}
1072 1073 1074 1075 1076 1077 1078
}

#define WL1271_TX_FLUSH_TIMEOUT 500000

/* caller must *NOT* hold wl->mutex */
void wl1271_tx_flush(struct wl1271 *wl)
{
1079
	unsigned long timeout, start_time;
1080
	int i;
1081 1082
	start_time = jiffies;
	timeout = start_time + usecs_to_jiffies(WL1271_TX_FLUSH_TIMEOUT);
1083

A
Arik Nemtsov 已提交
1084 1085 1086
	/* only one flush should be in progress, for consistent queue state */
	mutex_lock(&wl->flush_mutex);

1087 1088 1089 1090 1091 1092
	mutex_lock(&wl->mutex);
	if (wl->tx_frames_cnt == 0 && wl1271_tx_total_queue_count(wl) == 0) {
		mutex_unlock(&wl->mutex);
		goto out;
	}

A
Arik Nemtsov 已提交
1093 1094
	wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_FLUSH);

1095
	while (!time_after(jiffies, timeout)) {
1096
		wl1271_debug(DEBUG_MAC80211, "flushing tx buffer: %d %d",
1097 1098
			     wl->tx_frames_cnt,
			     wl1271_tx_total_queue_count(wl));
1099 1100 1101 1102 1103 1104 1105 1106

		/* force Tx and give the driver some time to flush data */
		mutex_unlock(&wl->mutex);
		if (wl1271_tx_total_queue_count(wl))
			wl1271_tx_work(&wl->tx_work);
		msleep(20);
		mutex_lock(&wl->mutex);

1107 1108
		if ((wl->tx_frames_cnt == 0) &&
		    (wl1271_tx_total_queue_count(wl) == 0)) {
1109 1110
			wl1271_debug(DEBUG_MAC80211, "tx flush took %d ms",
				     jiffies_to_msecs(jiffies - start_time));
1111
			goto out_wake;
1112 1113 1114
		}
	}

1115 1116 1117
	wl1271_warning("Unable to flush all TX buffers, "
		       "timed out (timeout %d ms",
		       WL1271_TX_FLUSH_TIMEOUT / 1000);
1118 1119 1120 1121

	/* forcibly flush all Tx buffers on our queues */
	for (i = 0; i < WL12XX_MAX_LINKS; i++)
		wl1271_tx_reset_link_queues(wl, i);
A
Arik Nemtsov 已提交
1122

1123
out_wake:
A
Arik Nemtsov 已提交
1124
	wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_FLUSH);
1125 1126
	mutex_unlock(&wl->mutex);
out:
A
Arik Nemtsov 已提交
1127
	mutex_unlock(&wl->flush_mutex);
L
Luciano Coelho 已提交
1128
}
1129
EXPORT_SYMBOL_GPL(wl1271_tx_flush);
A
Arik Nemtsov 已提交
1130

1131
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
1132
{
1133 1134
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
1135

1136
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1137
}
1138
EXPORT_SYMBOL_GPL(wl1271_tx_min_rate_get);
1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190

void wlcore_stop_queue_locked(struct wl1271 *wl, u8 queue,
			      enum wlcore_queue_stop_reason reason)
{
	bool stopped = !!wl->queue_stop_reasons[queue];

	/* queue should not be stopped for this reason */
	WARN_ON(test_and_set_bit(reason, &wl->queue_stop_reasons[queue]));

	if (stopped)
		return;

	ieee80211_stop_queue(wl->hw, wl1271_tx_get_mac80211_queue(queue));
}

void wlcore_stop_queue(struct wl1271 *wl, u8 queue,
		       enum wlcore_queue_stop_reason reason)
{
	unsigned long flags;

	spin_lock_irqsave(&wl->wl_lock, flags);
	wlcore_stop_queue_locked(wl, queue, reason);
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

void wlcore_wake_queue(struct wl1271 *wl, u8 queue,
		       enum wlcore_queue_stop_reason reason)
{
	unsigned long flags;

	spin_lock_irqsave(&wl->wl_lock, flags);

	/* queue should not be clear for this reason */
	WARN_ON(!test_and_clear_bit(reason, &wl->queue_stop_reasons[queue]));

	if (wl->queue_stop_reasons[queue])
		goto out;

	ieee80211_wake_queue(wl->hw, wl1271_tx_get_mac80211_queue(queue));

out:
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

void wlcore_stop_queues(struct wl1271 *wl,
			enum wlcore_queue_stop_reason reason)
{
	int i;

	for (i = 0; i < NUM_TX_QUEUES; i++)
		wlcore_stop_queue(wl, i, reason);
}
1191
EXPORT_SYMBOL_GPL(wlcore_stop_queues);
1192 1193 1194 1195 1196 1197 1198 1199 1200

void wlcore_wake_queues(struct wl1271 *wl,
			enum wlcore_queue_stop_reason reason)
{
	int i;

	for (i = 0; i < NUM_TX_QUEUES; i++)
		wlcore_wake_queue(wl, i, reason);
}
1201
EXPORT_SYMBOL_GPL(wlcore_wake_queues);
1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231

void wlcore_reset_stopped_queues(struct wl1271 *wl)
{
	int i;
	unsigned long flags;

	spin_lock_irqsave(&wl->wl_lock, flags);

	for (i = 0; i < NUM_TX_QUEUES; i++) {
		if (!wl->queue_stop_reasons[i])
			continue;

		wl->queue_stop_reasons[i] = 0;
		ieee80211_wake_queue(wl->hw,
				     wl1271_tx_get_mac80211_queue(i));
	}

	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

bool wlcore_is_queue_stopped_by_reason(struct wl1271 *wl, u8 queue,
			     enum wlcore_queue_stop_reason reason)
{
	return test_bit(reason, &wl->queue_stop_reasons[queue]);
}

bool wlcore_is_queue_stopped(struct wl1271 *wl, u8 queue)
{
	return !!wl->queue_stop_reasons[queue];
}