tx.c 27.3 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
u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif,
			 struct sk_buff *skb)
135 136 137 138 139 140 141 142 143 144 145 146
{
	struct ieee80211_tx_info *control = IEEE80211_SKB_CB(skb);

	if (control->control.sta) {
		struct wl1271_station *wl_sta;

		wl_sta = (struct wl1271_station *)
				control->control.sta->drv_priv;
		return wl_sta->hlid;
	} else {
		struct ieee80211_hdr *hdr;

147
		if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
148 149
			return wl->system_hlid;

150 151
		hdr = (struct ieee80211_hdr *)skb->data;
		if (ieee80211_is_mgmt(hdr->frame_control))
152
			return wlvif->ap.global_hlid;
153
		else
154
			return wlvif->ap.bcast_hlid;
155 156 157
	}
}

158 159
u8 wl12xx_tx_get_hlid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
		      struct sk_buff *skb)
E
Eliad Peller 已提交
160
{
161 162
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;

E
Eliad Peller 已提交
163
	if (!wlvif || wl12xx_is_dummy_packet(wl, skb))
E
Eliad Peller 已提交
164 165
		return wl->system_hlid;

E
Eliad Peller 已提交
166
	if (wlvif->bss_type == BSS_TYPE_AP_BSS)
167
		return wl12xx_tx_get_hlid_ap(wl, wlvif, skb);
E
Eliad Peller 已提交
168

169
	if ((test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) ||
170
	     test_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags)) &&
171 172
	    !ieee80211_is_auth(hdr->frame_control) &&
	    !ieee80211_is_assoc_req(hdr->frame_control))
E
Eliad Peller 已提交
173
		return wlvif->sta.hlid;
E
Eliad Peller 已提交
174
	else
E
Eliad Peller 已提交
175
		return wlvif->dev_hlid;
E
Eliad Peller 已提交
176 177
}

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

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

199
	if (buf_offset + total_len > WL1271_AGGR_BUFFER_SIZE)
I
Ido Yariv 已提交
200
		return -EAGAIN;
201

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

207
	if (unlikely(wl12xx_is_dummy_packet(wl, skb)))
208
		is_dummy = true;
209 210
	else if (wlvif->is_gem)
		spare_blocks = wl->gem_tx_spare;
211

212
	total_blocks = wlcore_hw_calc_tx_blocks(wl, total_len, spare_blocks);
213

L
Luciano Coelho 已提交
214 215 216 217
	if (total_blocks <= wl->tx_blocks_available) {
		desc = (struct wl1271_tx_hw_descr *)skb_push(
			skb, total_len - skb->len);

218 219
		wlcore_hw_set_tx_desc_blocks(wl, desc, total_blocks,
					     spare_blocks);
220

L
Luciano Coelho 已提交
221 222 223
		desc->id = id;

		wl->tx_blocks_available -= total_blocks;
224
		wl->tx_allocated_blocks += total_blocks;
L
Luciano Coelho 已提交
225

A
Arik Nemtsov 已提交
226 227 228 229
		/* If the FW was empty before, arm the Tx watchdog */
		if (wl->tx_allocated_blocks == total_blocks)
			wl12xx_rearm_tx_watchdog_locked(wl);

230 231
		ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
		wl->tx_allocated_pkts[ac]++;
232

E
Eliad Peller 已提交
233 234
		if (!is_dummy && wlvif &&
		    wlvif->bss_type == BSS_TYPE_AP_BSS &&
235
		    test_bit(hlid, wlvif->ap.sta_hlid_map))
236
			wl->links[hlid].allocated_pkts++;
237

L
Luciano Coelho 已提交
238 239 240 241 242
		ret = 0;

		wl1271_debug(DEBUG_TX,
			     "tx_allocate: size: %d, blocks: %d, id: %d",
			     total_len, total_blocks, id);
243
	} else {
244
		wl1271_free_tx_id(wl, id);
245
	}
L
Luciano Coelho 已提交
246 247 248 249

	return ret;
}

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

	desc = (struct wl1271_tx_hw_descr *) skb->data;
265 266 267
	frame_start = (u8 *)(desc + 1);
	hdr = (struct ieee80211_hdr *)(frame_start + extra);
	frame_control = hdr->frame_control;
L
Luciano Coelho 已提交
268

269 270
	/* relocate space for security header */
	if (extra) {
271 272
		int hdrlen = ieee80211_hdrlen(frame_control);
		memmove(frame_start, hdr, hdrlen);
273 274
	}

L
Luciano Coelho 已提交
275
	/* configure packet life time */
276 277 278
	getnstimeofday(&ts);
	hosttime = (timespec_to_ns(&ts) >> 10);
	desc->start_time = cpu_to_le32(hosttime - wl->time_offset);
279

280
	is_dummy = wl12xx_is_dummy_packet(wl, skb);
E
Eliad Peller 已提交
281
	if (is_dummy || !wlvif || wlvif->bss_type != BSS_TYPE_AP_BSS)
282 283 284
		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 已提交
285

286
	/* queue */
K
Kalle Valo 已提交
287
	ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
288
	desc->tid = skb->priority;
289

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

		tx_attr |= TX_HW_ATTR_TX_DUMMY_REQ;
E
Eliad Peller 已提交
300
	} else if (wlvif) {
301
		/* configure the tx attributes */
302 303
		tx_attr = wlvif->session_counter <<
			  TX_HW_ATTR_OFST_SESSION_COUNTER;
304 305
	}

E
Eliad Peller 已提交
306
	desc->hlid = hlid;
E
Eliad Peller 已提交
307
	if (is_dummy || !wlvif)
308 309
		rate_idx = 0;
	else if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
310 311 312
		/* if the packets are destined for AP (have a STA entry)
		   send them with AP rate policies, otherwise use default
		   basic rates */
313 314 315
		if (control->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
			rate_idx = wlvif->sta.p2p_rate_idx;
		else if (control->control.sta)
E
Eliad Peller 已提交
316
			rate_idx = wlvif->sta.ap_rate_idx;
317
		else
E
Eliad Peller 已提交
318
			rate_idx = wlvif->sta.basic_rate_idx;
319
	} else {
320
		if (hlid == wlvif->ap.global_hlid)
E
Eliad Peller 已提交
321
			rate_idx = wlvif->ap.mgmt_rate_idx;
322
		else if (hlid == wlvif->ap.bcast_hlid)
E
Eliad Peller 已提交
323
			rate_idx = wlvif->ap.bcast_rate_idx;
324
		else
E
Eliad Peller 已提交
325
			rate_idx = wlvif->ap.ucast_rate_idx[ac];
326 327 328
	}

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

330 331 332 333 334
	/* 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;

335
	desc->reserved = 0;
L
Luciano Coelho 已提交
336
	desc->tx_attr = cpu_to_le16(tx_attr);
337 338

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

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

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

E
Eliad Peller 已提交
357 358 359
	/* TODO: handle dummy packets on multi-vifs */
	is_dummy = wl12xx_is_dummy_packet(wl, skb);

L
Luciano Coelho 已提交
360
	if (info->control.hw_key &&
361
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
362
		extra = WL1271_EXTRA_SPACE_TKIP;
L
Luciano Coelho 已提交
363 364

	if (info->control.hw_key) {
365 366 367 368 369 370
		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 已提交
371

E
Eliad Peller 已提交
372
		if (unlikely(is_wep && wlvif->default_key != idx)) {
E
Eliad Peller 已提交
373
			ret = wl1271_set_default_wep_key(wl, wlvif, idx);
L
Luciano Coelho 已提交
374 375
			if (ret < 0)
				return ret;
E
Eliad Peller 已提交
376
			wlvif->default_key = idx;
L
Luciano Coelho 已提交
377 378
		}
	}
379
	hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
E
Eliad Peller 已提交
380
	if (hlid == WL12XX_INVALID_LINK_ID) {
381
		wl1271_error("invalid hlid. dropping skb 0x%p", skb);
E
Eliad Peller 已提交
382 383
		return -EINVAL;
	}
384

385
	ret = wl1271_tx_allocate(wl, wlvif, skb, extra, buf_offset, hlid);
L
Luciano Coelho 已提交
386 387 388
	if (ret < 0)
		return ret;

389
	wl1271_tx_fill_hdr(wl, wlvif, skb, extra, info, hlid);
390

E
Eliad Peller 已提交
391
	if (!is_dummy && wlvif && wlvif->bss_type == BSS_TYPE_AP_BSS) {
392
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
393
		wl1271_tx_regulate_link(wl, wlvif, hlid);
394
	}
395

396
	/*
397 398 399 400 401 402
	 * 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).
403
	 */
404
	total_len = wlcore_calc_packet_alignment(wl, skb->len);
405

406 407
	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 已提交
408

409
	/* Revert side effects in the dummy packet skb, so it can be reused */
E
Eliad Peller 已提交
410
	if (is_dummy)
411 412
		skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

413
	return total_len;
L
Luciano Coelho 已提交
414 415
}

416 417
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set,
				enum ieee80211_band rate_band)
418 419 420 421 422
{
	struct ieee80211_supported_band *band;
	u32 enabled_rates = 0;
	int bit;

423
	band = wl->hw->wiphy->bands[rate_band];
424 425 426 427 428 429
	for (bit = 0; bit < band->n_bitrates; bit++) {
		if (rate_set & 0x1)
			enabled_rates |= band->bitrates[bit].hw_value;
		rate_set >>= 1;
	}

430 431 432 433 434 435 436 437 438
	/* MCS rates indication are on bits 16 - 23 */
	rate_set >>= HW_HT_RATES_OFFSET - band->n_bitrates;

	for (bit = 0; bit < 8; bit++) {
		if (rate_set & 0x1)
			enabled_rates |= (CONF_HW_BIT_RATE_MCS_0 << bit);
		rate_set >>= 1;
	}

439 440 441
	return enabled_rates;
}

442
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
443 444
{
	unsigned long flags;
445
	int i;
446

447 448
	for (i = 0; i < NUM_TX_QUEUES; i++) {
		if (test_bit(i, &wl->stopped_queues_map) &&
449
		    wl->tx_queue_count[i] <= WL1271_TX_QUEUE_LOW_WATERMARK) {
450 451 452 453 454 455 456
			/* firmware buffer has space, restart queues */
			spin_lock_irqsave(&wl->wl_lock, flags);
			ieee80211_wake_queue(wl->hw,
					     wl1271_tx_get_mac80211_queue(i));
			clear_bit(i, &wl->stopped_queues_map);
			spin_unlock_irqrestore(&wl->wl_lock, flags);
		}
457 458 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
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];
}

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

495
	queue = wl1271_select_queue(wl, lnk->tx_queue);
496
	if (!queue)
497
		return NULL;
498 499

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

	return skb;
}

511 512
static struct sk_buff *wl12xx_vif_skb_dequeue(struct wl1271 *wl,
					      struct wl12xx_vif *wlvif)
513 514 515 516 517
{
	struct sk_buff *skb = NULL;
	int i, h, start_hlid;

	/* start from the link after the last one */
518
	start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
519 520

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

524
		/* only consider connected stations */
525
		if (!test_bit(h, wlvif->links_map))
526 527
			continue;

528 529
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[h]);
		if (!skb)
530 531
			continue;

532 533
		wlvif->last_tx_hlid = h;
		break;
534 535
	}

536
	if (!skb)
537
		wlvif->last_tx_hlid = 0;
538 539 540 541

	return skb;
}

542
static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl)
543
{
544
	unsigned long flags;
545
	struct wl12xx_vif *wlvif = wl->last_wlvif;
546 547
	struct sk_buff *skb = NULL;

548
	/* continue from last wlvif (round robin) */
549 550 551 552 553 554 555 556 557 558
	if (wlvif) {
		wl12xx_for_each_wlvif_continue(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
		}
	}

559 560 561 562 563
	/* dequeue from the system HLID before the restarting wlvif list */
	if (!skb)
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[wl->system_hlid]);

	/* do a new pass over the wlvif list */
564 565 566 567 568 569 570
	if (!skb) {
		wl12xx_for_each_wlvif(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
571 572 573 574 575 576 577

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

581 582
	if (!skb &&
	    test_and_clear_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) {
583 584
		int q;

585
		skb = wl->dummy_packet;
586
		q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
587
		spin_lock_irqsave(&wl->wl_lock, flags);
588
		WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
589
		wl->tx_queue_count[q]--;
590 591 592 593
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
594 595
}

596
static void wl1271_skb_queue_head(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
597
				  struct sk_buff *skb)
598 599 600 601
{
	unsigned long flags;
	int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));

602 603
	if (wl12xx_is_dummy_packet(wl, skb)) {
		set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
604 605
	} else {
		u8 hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
606 607 608
		skb_queue_head(&wl->links[hlid].tx_queue[q], skb);

		/* make sure we dequeue the same packet next time */
609
		wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
610
				      WL12XX_MAX_LINKS;
611 612
	}

613
	spin_lock_irqsave(&wl->wl_lock, flags);
614
	wl->tx_queue_count[q]++;
615 616 617
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

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

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

661
void wl1271_tx_work_locked(struct wl1271 *wl)
L
Luciano Coelho 已提交
662
{
663
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
664
	struct sk_buff *skb;
E
Eliad Peller 已提交
665
	struct wl1271_tx_hw_descr *desc;
I
Ido Yariv 已提交
666 667
	u32 buf_offset = 0;
	bool sent_packets = false;
E
Eliad Peller 已提交
668
	unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
L
Luciano Coelho 已提交
669 670 671
	int ret;

	if (unlikely(wl->state == WL1271_STATE_OFF))
672
		return;
L
Luciano Coelho 已提交
673

674
	while ((skb = wl1271_skb_dequeue(wl))) {
E
Eliad Peller 已提交
675
		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
E
Eliad Peller 已提交
676 677
		bool has_data = false;

678
		wlvif = NULL;
E
Eliad Peller 已提交
679 680
		if (!wl12xx_is_dummy_packet(wl, skb) && info->control.vif)
			wlvif = wl12xx_vif_to_data(info->control.vif);
681

E
Eliad Peller 已提交
682
		has_data = wlvif && wl1271_tx_is_data_present(skb);
683
		ret = wl1271_prepare_tx_frame(wl, wlvif, skb, buf_offset);
I
Ido Yariv 已提交
684
		if (ret == -EAGAIN) {
685
			/*
I
Ido Yariv 已提交
686 687 688
			 * Aggregation buffer is full.
			 * Flush buffer and try again.
			 */
689
			wl1271_skb_queue_head(wl, wlvif, skb);
690 691
			wlcore_write_data(wl, REG_SLV_MEM_DATA, wl->aggr_buf,
					  buf_offset, true);
I
Ido Yariv 已提交
692 693 694 695 696 697
			sent_packets = true;
			buf_offset = 0;
			continue;
		} else if (ret == -EBUSY) {
			/*
			 * Firmware buffer is full.
698 699
			 * Queue back last skb, and stop aggregating.
			 */
700
			wl1271_skb_queue_head(wl, wlvif, skb);
I
Ido Yariv 已提交
701 702
			/* No work left, avoid scheduling redundant tx work */
			set_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
703
			goto out_ack;
L
Luciano Coelho 已提交
704
		} else if (ret < 0) {
E
Eliad Peller 已提交
705 706 707 708 709 710 711 712
			if (wl12xx_is_dummy_packet(wl, skb))
				/*
				 * fw still expects dummy packet,
				 * so re-enqueue it
				 */
				wl1271_skb_queue_head(wl, wlvif, skb);
			else
				ieee80211_free_txskb(wl->hw, skb);
713
			goto out_ack;
L
Luciano Coelho 已提交
714
		}
715 716
		buf_offset += ret;
		wl->tx_packets_count++;
E
Eliad Peller 已提交
717 718 719 720
		if (has_data) {
			desc = (struct wl1271_tx_hw_descr *) skb->data;
			__set_bit(desc->hlid, active_hlids);
		}
L
Luciano Coelho 已提交
721 722
	}

723
out_ack:
724
	if (buf_offset) {
725 726
		wlcore_write_data(wl, REG_SLV_MEM_DATA, wl->aggr_buf,
				  buf_offset, true);
I
Ido Yariv 已提交
727 728 729
		sent_packets = true;
	}
	if (sent_packets) {
730 731 732 733
		/*
		 * Interrupt the firmware with the new packets. This is only
		 * required for older hardware revisions
		 */
734
		if (wl->quirks & WLCORE_QUIRK_END_OF_TRANSACTION)
735
			wl1271_write32(wl, WL12XX_HOST_WR_ACCESS,
736 737
				       wl->tx_packets_count);

738
		wl1271_handle_tx_low_watermark(wl);
739
	}
E
Eliad Peller 已提交
740
	wl12xx_rearm_rx_streaming(wl, active_hlids);
I
Ido Yariv 已提交
741
}
L
Luciano Coelho 已提交
742

I
Ido Yariv 已提交
743 744 745
void wl1271_tx_work(struct work_struct *work)
{
	struct wl1271 *wl = container_of(work, struct wl1271, tx_work);
746
	int ret;
I
Ido Yariv 已提交
747 748

	mutex_lock(&wl->mutex);
749 750 751 752
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

753
	wl1271_tx_work_locked(wl);
754

755
	wl1271_ps_elp_sleep(wl);
756
out:
L
Luciano Coelho 已提交
757 758 759
	mutex_unlock(&wl->mutex);
}

760 761
static u8 wl1271_tx_get_rate_flags(u8 rate_class_index)
{
762 763
	u8 flags = 0;

764 765 766 767 768
	/*
	 * TODO: use wl12xx constants when this code is moved to wl12xx, as
	 * only it uses Tx-completion.
	 */
	if (rate_class_index <= 8)
769
		flags |= IEEE80211_TX_RC_MCS;
770 771 772 773 774 775

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

778
	return flags;
779 780
}

L
Luciano Coelho 已提交
781 782 783 784
static void wl1271_tx_complete_packet(struct wl1271 *wl,
				      struct wl1271_tx_hw_res_descr *result)
{
	struct ieee80211_tx_info *info;
785 786
	struct ieee80211_vif *vif;
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
787 788
	struct sk_buff *skb;
	int id = result->id;
J
Juuso Oikarinen 已提交
789
	int rate = -1;
790
	u8 rate_flags = 0;
J
Juuso Oikarinen 已提交
791
	u8 retries = 0;
L
Luciano Coelho 已提交
792 793

	/* check for id legality */
794
	if (unlikely(id >= wl->num_tx_desc || wl->tx_frames[id] == NULL)) {
L
Luciano Coelho 已提交
795 796 797 798 799 800 801
		wl1271_warning("TX result illegal id: %d", id);
		return;
	}

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

802
	if (wl12xx_is_dummy_packet(wl, skb)) {
803 804 805 806
		wl1271_free_tx_id(wl, id);
		return;
	}

807 808 809 810
	/* 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 已提交
811 812 813
	/* update the TX status info */
	if (result->status == TX_SUCCESS) {
		if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
L
Luciano Coelho 已提交
814
			info->flags |= IEEE80211_TX_STAT_ACK;
815
		rate = wlcore_rate_to_idx(wl, result->rate_class_index,
E
Eliad Peller 已提交
816
					  wlvif->band);
817
		rate_flags = wl1271_tx_get_rate_flags(result->rate_class_index);
J
Juuso Oikarinen 已提交
818 819 820 821
		retries = result->ack_failures;
	} else if (result->status == TX_RETRY_EXCEEDED) {
		wl->stats.excessive_retries++;
		retries = result->ack_failures;
L
Luciano Coelho 已提交
822 823
	}

J
Juuso Oikarinen 已提交
824 825
	info->status.rates[0].idx = rate;
	info->status.rates[0].count = retries;
826
	info->status.rates[0].flags = rate_flags;
J
Juuso Oikarinen 已提交
827 828
	info->status.ack_signal = -1;

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

831 832 833 834 835 836 837 838 839
	/*
	 * 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;
840
		u8 cur_lsb = wlvif->tx_security_last_seq_lsb;
841 842 843 844 845

		/*
		 * update security sequence number, taking care of potential
		 * wrap-around
		 */
846 847
		wlvif->tx_security_seq += (fw_lsb - cur_lsb) & 0xff;
		wlvif->tx_security_last_seq_lsb = fw_lsb;
848
	}
849

850 851 852 853
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

	/* remove TKIP header space if present */
L
Luciano Coelho 已提交
854
	if (info->control.hw_key &&
855
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
856
		int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
857 858 859
		memmove(skb->data + WL1271_EXTRA_SPACE_TKIP, skb->data,
			hdrlen);
		skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
860
	}
L
Luciano Coelho 已提交
861 862 863 864 865 866 867

	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 */
868
	skb_queue_tail(&wl->deferred_tx_queue, skb);
869
	queue_work(wl->freezable_wq, &wl->netstack_work);
870
	wl1271_free_tx_id(wl, result->id);
L
Luciano Coelho 已提交
871 872 873
}

/* Called upon reception of a TX complete interrupt */
874
void wl1271_tx_complete(struct wl1271 *wl)
L
Luciano Coelho 已提交
875 876 877
{
	struct wl1271_acx_mem_map *memmap =
		(struct wl1271_acx_mem_map *)wl->target_mem_map;
878
	u32 count, fw_counter;
L
Luciano Coelho 已提交
879 880 881
	u32 i;

	/* read the tx results from the chipset */
T
Teemu Paasikivi 已提交
882 883
	wl1271_read(wl, le32_to_cpu(memmap->tx_result),
		    wl->tx_res_if, sizeof(*wl->tx_res_if), false);
884 885 886 887 888 889 890 891
	fw_counter = le32_to_cpu(wl->tx_res_if->tx_result_fw_counter);

	/* write host counter to chipset (to ack) */
	wl1271_write32(wl, le32_to_cpu(memmap->tx_result) +
		       offsetof(struct wl1271_tx_hw_res_if,
				tx_result_host_counter), fw_counter);

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

	/* verify that the result buffer is not getting overrun */
895
	if (unlikely(count > TX_HW_RESULT_QUEUE_LEN))
L
Luciano Coelho 已提交
896 897 898 899 900 901 902 903 904 905 906 907 908 909
		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++;
	}
}
910
EXPORT_SYMBOL(wl1271_tx_complete);
L
Luciano Coelho 已提交
911

912 913 914
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
915
	int i;
916
	unsigned long flags;
917
	struct ieee80211_tx_info *info;
918
	int total[NUM_TX_QUEUES];
919 920

	for (i = 0; i < NUM_TX_QUEUES; i++) {
921
		total[i] = 0;
922 923
		while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
			wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb);
924 925 926 927 928 929 930 931

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

932
			total[i]++;
933 934 935 936
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
937 938
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] -= total[i];
939 940 941 942 943
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

944
/* caller must hold wl->mutex and TX must be stopped */
945
void wl12xx_tx_reset_wlvif(struct wl1271 *wl, struct wl12xx_vif *wlvif)
L
Luciano Coelho 已提交
946 947 948 949
{
	int i;

	/* TX failure */
950 951
	for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
		if (wlvif->bss_type == BSS_TYPE_AP_BSS)
952
			wl1271_free_sta(wl, wlvif, i);
953 954
		else
			wlvif->sta.ba_rx_bitmap = 0;
955

956 957
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
958
	}
959 960 961 962 963 964 965 966 967
	wlvif->last_tx_hlid = 0;

}
/* caller must hold wl->mutex and TX must be stopped */
void wl12xx_tx_reset(struct wl1271 *wl, bool reset_tx_queues)
{
	int i;
	struct sk_buff *skb;
	struct ieee80211_tx_info *info;
968

969 970 971 972 973 974 975 976
	/* 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;
	}
977

978
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
979

980 981 982
	/*
	 * Make sure the driver is at a consistent state, in case this
	 * function is called from a context other than interface removal.
983
	 * This call will always wake the TX queues.
984
	 */
985 986
	if (reset_tx_queues)
		wl1271_handle_tx_low_watermark(wl);
987

988
	for (i = 0; i < wl->num_tx_desc; i++) {
989 990 991 992 993 994 995
		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);

996
		if (!wl12xx_is_dummy_packet(wl, skb)) {
997 998 999 1000 1001 1002 1003 1004 1005 1006
			/*
			 * Remove private headers before passing the skb to
			 * mac80211
			 */
			info = IEEE80211_SKB_CB(skb);
			skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));
			if (info->control.hw_key &&
			    info->control.hw_key->cipher ==
			    WLAN_CIPHER_SUITE_TKIP) {
				int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
1007
				memmove(skb->data + WL1271_EXTRA_SPACE_TKIP,
1008
					skb->data, hdrlen);
1009
				skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
1010
			}
1011

1012 1013
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
1014

1015
			ieee80211_tx_status_ni(wl->hw, skb);
1016
		}
1017
	}
1018 1019 1020 1021 1022 1023 1024 1025
}

#define WL1271_TX_FLUSH_TIMEOUT 500000

/* caller must *NOT* hold wl->mutex */
void wl1271_tx_flush(struct wl1271 *wl)
{
	unsigned long timeout;
1026
	int i;
1027 1028 1029 1030
	timeout = jiffies + usecs_to_jiffies(WL1271_TX_FLUSH_TIMEOUT);

	while (!time_after(jiffies, timeout)) {
		mutex_lock(&wl->mutex);
1031
		wl1271_debug(DEBUG_TX, "flushing tx buffer: %d %d",
1032 1033 1034 1035
			     wl->tx_frames_cnt,
			     wl1271_tx_total_queue_count(wl));
		if ((wl->tx_frames_cnt == 0) &&
		    (wl1271_tx_total_queue_count(wl) == 0)) {
1036 1037 1038 1039 1040 1041 1042 1043
			mutex_unlock(&wl->mutex);
			return;
		}
		mutex_unlock(&wl->mutex);
		msleep(1);
	}

	wl1271_warning("Unable to flush all TX buffers, timed out.");
1044 1045 1046 1047 1048 1049

	/* 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);
L
Luciano Coelho 已提交
1050
}
A
Arik Nemtsov 已提交
1051

1052
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
1053
{
1054 1055
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
1056

1057
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1058
}