tx.c 31.1 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_hdr *hdr = (struct ieee80211_hdr *)skb->data;

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
	if ((test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) ||
167
	     test_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags)) &&
168 169
	    !ieee80211_is_auth(hdr->frame_control) &&
	    !ieee80211_is_assoc_req(hdr->frame_control))
E
Eliad Peller 已提交
170
		return wlvif->sta.hlid;
E
Eliad Peller 已提交
171
	else
E
Eliad Peller 已提交
172
		return wlvif->dev_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 > WL1271_AGGR_BUFFER_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 */
297 298
		tx_attr = wlvif->session_counter <<
			  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 322 323
		else if (hlid == wlvif->ap.bcast_hlid ||
			 skb->protocol == cpu_to_be16(ETH_P_PAE))
			/* send AP bcast and EAPOLs using the min basic rate */
E
Eliad Peller 已提交
324
			rate_idx = wlvif->ap.bcast_rate_idx;
325
		else
E
Eliad Peller 已提交
326
			rate_idx = wlvif->ap.ucast_rate_idx[ac];
327 328 329
	}

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

331 332 333 334 335
	/* 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 已提交
336
	desc->tx_attr = cpu_to_le16(tx_attr);
337

338
	wlcore_hw_set_tx_desc_csum(wl, desc, skb);
339
	wlcore_hw_set_tx_desc_data_len(wl, desc, skb);
L
Luciano Coelho 已提交
340 341 342
}

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

353 354
	if (!skb) {
		wl1271_error("discarding null skb");
L
Luciano Coelho 已提交
355
		return -EINVAL;
356
	}
L
Luciano Coelho 已提交
357

358 359 360 361 362
	if (hlid == WL12XX_INVALID_LINK_ID) {
		wl1271_error("invalid hlid. dropping skb 0x%p", skb);
		return -EINVAL;
	}

L
Luciano Coelho 已提交
363 364
	info = IEEE80211_SKB_CB(skb);

E
Eliad Peller 已提交
365 366
	is_dummy = wl12xx_is_dummy_packet(wl, skb);

367 368
	if ((wl->quirks & WLCORE_QUIRK_TKIP_HEADER_SPACE) &&
	    info->control.hw_key &&
369
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
370
		extra = WL1271_EXTRA_SPACE_TKIP;
L
Luciano Coelho 已提交
371 372

	if (info->control.hw_key) {
373 374 375 376 377 378
		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 已提交
379

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

		is_gem = (cipher == WL1271_CIPHER_SUITE_GEM);
L
Luciano Coelho 已提交
388
	}
389

390 391
	ret = wl1271_tx_allocate(wl, wlvif, skb, extra, buf_offset, hlid,
				 is_gem);
L
Luciano Coelho 已提交
392 393 394
	if (ret < 0)
		return ret;

395
	wl1271_tx_fill_hdr(wl, wlvif, skb, extra, info, hlid);
396

E
Eliad Peller 已提交
397
	if (!is_dummy && wlvif && wlvif->bss_type == BSS_TYPE_AP_BSS) {
398
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
399
		wl1271_tx_regulate_link(wl, wlvif, hlid);
400
	}
401

402
	/*
403 404 405 406 407 408
	 * 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).
409
	 */
410
	total_len = wlcore_calc_packet_alignment(wl, skb->len);
411

412 413
	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 已提交
414

415
	/* Revert side effects in the dummy packet skb, so it can be reused */
E
Eliad Peller 已提交
416
	if (is_dummy)
417 418
		skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

419
	return total_len;
L
Luciano Coelho 已提交
420 421
}

422 423
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set,
				enum ieee80211_band rate_band)
424 425 426 427 428
{
	struct ieee80211_supported_band *band;
	u32 enabled_rates = 0;
	int bit;

429
	band = wl->hw->wiphy->bands[rate_band];
430 431 432 433 434 435
	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 已提交
436
	/* MCS rates indication are on bits 16 - 31 */
437 438
	rate_set >>= HW_HT_RATES_OFFSET - band->n_bitrates;

A
Arik Nemtsov 已提交
439
	for (bit = 0; bit < 16; bit++) {
440 441 442 443 444
		if (rate_set & 0x1)
			enabled_rates |= (CONF_HW_BIT_RATE_MCS_0 << bit);
		rate_set >>= 1;
	}

445 446 447
	return enabled_rates;
}

448
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
449
{
450
	int i;
451

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

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
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];
}

491 492
static struct sk_buff *wl12xx_lnk_skb_dequeue(struct wl1271 *wl,
					      struct wl1271_link *lnk)
493
{
494
	struct sk_buff *skb;
495
	unsigned long flags;
496
	struct sk_buff_head *queue;
497

498
	queue = wl1271_select_queue(wl, lnk->tx_queue);
499
	if (!queue)
500
		return NULL;
501 502

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

	return skb;
}

514
static struct sk_buff *wl12xx_vif_skb_dequeue(struct wl1271 *wl,
515 516
					      struct wl12xx_vif *wlvif,
					      u8 *hlid)
517 518 519 520 521
{
	struct sk_buff *skb = NULL;
	int i, h, start_hlid;

	/* start from the link after the last one */
522
	start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
523 524

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

528
		/* only consider connected stations */
529
		if (!test_bit(h, wlvif->links_map))
530 531
			continue;

532 533
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[h]);
		if (!skb)
534 535
			continue;

536 537
		wlvif->last_tx_hlid = h;
		break;
538 539
	}

540
	if (!skb)
541
		wlvif->last_tx_hlid = 0;
542

543
	*hlid = wlvif->last_tx_hlid;
544 545 546
	return skb;
}

547
static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl, u8 *hlid)
548
{
549
	unsigned long flags;
550
	struct wl12xx_vif *wlvif = wl->last_wlvif;
551 552
	struct sk_buff *skb = NULL;

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

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

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

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

588 589
	if (!skb &&
	    test_and_clear_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) {
590 591
		int q;

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

	return skb;
602 603
}

604
static void wl1271_skb_queue_head(struct wl1271 *wl, struct wl12xx_vif *wlvif,
605
				  struct sk_buff *skb, u8 hlid)
606 607 608 609
{
	unsigned long flags;
	int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));

610 611
	if (wl12xx_is_dummy_packet(wl, skb)) {
		set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
612
	} else {
613 614 615
		skb_queue_head(&wl->links[hlid].tx_queue[q], skb);

		/* make sure we dequeue the same packet next time */
616
		wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
617
				      WL12XX_MAX_LINKS;
618 619
	}

620
	spin_lock_irqsave(&wl->wl_lock, flags);
621
	wl->tx_queue_count[q]++;
622 623 624
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

625 626 627 628 629 630 631
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 已提交
632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658
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 */
659
		if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
660 661 662 663 664 665 666 667
			ieee80211_queue_work(wl->hw,
					     &wlvif->rx_streaming_enable_work);

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

668 669 670 671 672 673 674 675 676 677
/*
 * 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.
 */
678
int wlcore_tx_work_locked(struct wl1271 *wl)
L
Luciano Coelho 已提交
679
{
680
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
681
	struct sk_buff *skb;
E
Eliad Peller 已提交
682
	struct wl1271_tx_hw_descr *desc;
683
	u32 buf_offset = 0, last_len = 0;
I
Ido Yariv 已提交
684
	bool sent_packets = false;
E
Eliad Peller 已提交
685
	unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
686
	int ret = 0;
687
	int bus_ret = 0;
688
	u8 hlid;
L
Luciano Coelho 已提交
689

690
	if (unlikely(wl->state != WLCORE_STATE_ON))
691
		return 0;
L
Luciano Coelho 已提交
692

693
	while ((skb = wl1271_skb_dequeue(wl, &hlid))) {
E
Eliad Peller 已提交
694
		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
E
Eliad Peller 已提交
695 696
		bool has_data = false;

697
		wlvif = NULL;
E
Eliad Peller 已提交
698 699
		if (!wl12xx_is_dummy_packet(wl, skb) && info->control.vif)
			wlvif = wl12xx_vif_to_data(info->control.vif);
700 701
		else
			hlid = wl->system_hlid;
702

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

			buf_offset = wlcore_hw_pre_pkt_send(wl, buf_offset,
							    last_len);
715 716 717
			bus_ret = wlcore_write_data(wl, REG_SLV_MEM_DATA,
					     wl->aggr_buf, buf_offset, true);
			if (bus_ret < 0)
718 719
				goto out;

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

752
out_ack:
753
	if (buf_offset) {
754
		buf_offset = wlcore_hw_pre_pkt_send(wl, buf_offset, last_len);
755 756 757
		bus_ret = wlcore_write_data(wl, REG_SLV_MEM_DATA, wl->aggr_buf,
					     buf_offset, true);
		if (bus_ret < 0)
758 759
			goto out;

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

774
		wl1271_handle_tx_low_watermark(wl);
775
	}
E
Eliad Peller 已提交
776
	wl12xx_rearm_rx_streaming(wl, active_hlids);
777 778

out:
779
	return bus_ret;
I
Ido Yariv 已提交
780
}
L
Luciano Coelho 已提交
781

I
Ido Yariv 已提交
782 783 784
void wl1271_tx_work(struct work_struct *work)
{
	struct wl1271 *wl = container_of(work, struct wl1271, tx_work);
785
	int ret;
I
Ido Yariv 已提交
786 787

	mutex_lock(&wl->mutex);
788 789 790 791
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

792 793 794 795 796
	ret = wlcore_tx_work_locked(wl);
	if (ret < 0) {
		wl12xx_queue_recovery_work(wl);
		goto out;
	}
797

798
	wl1271_ps_elp_sleep(wl);
799
out:
L
Luciano Coelho 已提交
800 801 802
	mutex_unlock(&wl->mutex);
}

803 804
static u8 wl1271_tx_get_rate_flags(u8 rate_class_index)
{
805 806
	u8 flags = 0;

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

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

821
	return flags;
822 823
}

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

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

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

845
	if (wl12xx_is_dummy_packet(wl, skb)) {
846 847 848 849
		wl1271_free_tx_id(wl, id);
		return;
	}

850 851 852 853
	/* 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 已提交
854 855 856
	/* update the TX status info */
	if (result->status == TX_SUCCESS) {
		if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
L
Luciano Coelho 已提交
857
			info->flags |= IEEE80211_TX_STAT_ACK;
858
		rate = wlcore_rate_to_idx(wl, result->rate_class_index,
E
Eliad Peller 已提交
859
					  wlvif->band);
860
		rate_flags = wl1271_tx_get_rate_flags(result->rate_class_index);
J
Juuso Oikarinen 已提交
861 862 863 864
		retries = result->ack_failures;
	} else if (result->status == TX_RETRY_EXCEEDED) {
		wl->stats.excessive_retries++;
		retries = result->ack_failures;
L
Luciano Coelho 已提交
865 866
	}

J
Juuso Oikarinen 已提交
867 868
	info->status.rates[0].idx = rate;
	info->status.rates[0].count = retries;
869
	info->status.rates[0].flags = rate_flags;
J
Juuso Oikarinen 已提交
870 871
	info->status.ack_signal = -1;

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

874 875 876 877 878 879 880 881 882
	/*
	 * 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;
883
		u8 cur_lsb = wlvif->tx_security_last_seq_lsb;
884 885 886 887 888

		/*
		 * update security sequence number, taking care of potential
		 * wrap-around
		 */
889 890
		wlvif->tx_security_seq += (fw_lsb - cur_lsb) & 0xff;
		wlvif->tx_security_last_seq_lsb = fw_lsb;
891
	}
892

893 894 895 896
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

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

	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 */
912
	skb_queue_tail(&wl->deferred_tx_queue, skb);
913
	queue_work(wl->freezable_wq, &wl->netstack_work);
914
	wl1271_free_tx_id(wl, result->id);
L
Luciano Coelho 已提交
915 916 917
}

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

	/* read the tx results from the chipset */
926 927 928 929 930
	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;

931 932 933
	fw_counter = le32_to_cpu(wl->tx_res_if->tx_result_fw_counter);

	/* write host counter to chipset (to ack) */
934 935 936 937 938
	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;
939 940

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

	/* verify that the result buffer is not getting overrun */
944
	if (unlikely(count > TX_HW_RESULT_QUEUE_LEN))
L
Luciano Coelho 已提交
945 946 947 948 949 950 951 952 953 954 955 956 957
		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++;
	}
958 959 960

out:
	return ret;
L
Luciano Coelho 已提交
961
}
962
EXPORT_SYMBOL(wlcore_tx_complete);
L
Luciano Coelho 已提交
963

964 965 966
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
967
	int i;
968
	unsigned long flags;
969
	struct ieee80211_tx_info *info;
970
	int total[NUM_TX_QUEUES];
971 972

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

			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);
			}

984
			total[i]++;
985 986 987 988
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
989 990
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] -= total[i];
991 992 993 994 995
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

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

	/* TX failure */
1002 1003
	for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
		if (wlvif->bss_type == BSS_TYPE_AP_BSS)
1004
			wl1271_free_sta(wl, wlvif, i);
1005 1006
		else
			wlvif->sta.ba_rx_bitmap = 0;
1007

1008 1009
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
1010
	}
1011 1012 1013 1014
	wlvif->last_tx_hlid = 0;

}
/* caller must hold wl->mutex and TX must be stopped */
1015
void wl12xx_tx_reset(struct wl1271 *wl)
1016 1017 1018 1019
{
	int i;
	struct sk_buff *skb;
	struct ieee80211_tx_info *info;
1020

1021 1022 1023 1024 1025 1026 1027 1028
	/* 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;
	}
1029

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

1037
	for (i = 0; i < wl->num_tx_desc; i++) {
1038 1039 1040 1041 1042 1043 1044
		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);

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

1062 1063
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
1064

1065
			ieee80211_tx_status_ni(wl->hw, skb);
1066
		}
1067
	}
1068 1069 1070 1071 1072 1073 1074 1075
}

#define WL1271_TX_FLUSH_TIMEOUT 500000

/* caller must *NOT* hold wl->mutex */
void wl1271_tx_flush(struct wl1271 *wl)
{
	unsigned long timeout;
1076
	int i;
1077 1078
	timeout = jiffies + usecs_to_jiffies(WL1271_TX_FLUSH_TIMEOUT);

A
Arik Nemtsov 已提交
1079 1080 1081 1082 1083
	/* only one flush should be in progress, for consistent queue state */
	mutex_lock(&wl->flush_mutex);

	wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_FLUSH);

1084 1085
	while (!time_after(jiffies, timeout)) {
		mutex_lock(&wl->mutex);
1086
		wl1271_debug(DEBUG_TX, "flushing tx buffer: %d %d",
1087 1088 1089 1090
			     wl->tx_frames_cnt,
			     wl1271_tx_total_queue_count(wl));
		if ((wl->tx_frames_cnt == 0) &&
		    (wl1271_tx_total_queue_count(wl) == 0)) {
1091
			mutex_unlock(&wl->mutex);
A
Arik Nemtsov 已提交
1092
			goto out;
1093 1094 1095 1096 1097 1098
		}
		mutex_unlock(&wl->mutex);
		msleep(1);
	}

	wl1271_warning("Unable to flush all TX buffers, timed out.");
1099 1100 1101 1102 1103 1104

	/* forcibly flush all Tx buffers on our queues */
	mutex_lock(&wl->mutex);
	for (i = 0; i < WL12XX_MAX_LINKS; i++)
		wl1271_tx_reset_link_queues(wl, i);
	mutex_unlock(&wl->mutex);
A
Arik Nemtsov 已提交
1105 1106 1107 1108

out:
	wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_FLUSH);
	mutex_unlock(&wl->flush_mutex);
L
Luciano Coelho 已提交
1109
}
1110
EXPORT_SYMBOL_GPL(wl1271_tx_flush);
A
Arik Nemtsov 已提交
1111

1112
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
1113
{
1114 1115
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
1116

1117
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1118
}
1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 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

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);
}
1171
EXPORT_SYMBOL_GPL(wlcore_stop_queues);
1172 1173 1174 1175 1176 1177 1178 1179 1180

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);
}
1181
EXPORT_SYMBOL_GPL(wlcore_wake_queues);
1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211

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];
}