tx.c 27.4 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
		skb_set_network_header(skb, skb_network_offset(skb) + extra);
274 275
	}

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

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

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

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

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

E
Eliad Peller 已提交
307
	desc->hlid = hlid;
E
Eliad Peller 已提交
308
	if (is_dummy || !wlvif)
309 310
		rate_idx = 0;
	else if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
311 312 313
		/* if the packets are destined for AP (have a STA entry)
		   send them with AP rate policies, otherwise use default
		   basic rates */
314 315 316
		if (control->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
			rate_idx = wlvif->sta.p2p_rate_idx;
		else if (control->control.sta)
E
Eliad Peller 已提交
317
			rate_idx = wlvif->sta.ap_rate_idx;
318
		else
E
Eliad Peller 已提交
319
			rate_idx = wlvif->sta.basic_rate_idx;
320
	} else {
321
		if (hlid == wlvif->ap.global_hlid)
E
Eliad Peller 已提交
322
			rate_idx = wlvif->ap.mgmt_rate_idx;
323
		else if (hlid == wlvif->ap.bcast_hlid)
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 344
static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct wl12xx_vif *wlvif,
				   struct sk_buff *skb, u32 buf_offset)
L
Luciano Coelho 已提交
345 346 347 348
{
	struct ieee80211_tx_info *info;
	u32 extra = 0;
	int ret = 0;
349
	u32 total_len;
350
	u8 hlid;
E
Eliad Peller 已提交
351
	bool is_dummy;
L
Luciano Coelho 已提交
352 353 354 355 356 357

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

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

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

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

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

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

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

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

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

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

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

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

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

424
	band = wl->hw->wiphy->bands[rate_band];
425 426 427 428 429 430
	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 已提交
431
	/* MCS rates indication are on bits 16 - 31 */
432 433
	rate_set >>= HW_HT_RATES_OFFSET - band->n_bitrates;

A
Arik Nemtsov 已提交
434
	for (bit = 0; bit < 16; bit++) {
435 436 437 438 439
		if (rate_set & 0x1)
			enabled_rates |= (CONF_HW_BIT_RATE_MCS_0 << bit);
		rate_set >>= 1;
	}

440 441 442
	return enabled_rates;
}

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

448 449
	for (i = 0; i < NUM_TX_QUEUES; i++) {
		if (test_bit(i, &wl->stopped_queues_map) &&
450
		    wl->tx_queue_count[i] <= WL1271_TX_QUEUE_LOW_WATERMARK) {
451 452 453 454 455 456 457
			/* 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);
		}
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 488
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];
}

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

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

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

	return skb;
}

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

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

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

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

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

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

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

	return skb;
}

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

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

560 561 562 563 564
	/* 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 */
565 566 567 568 569 570 571
	if (!skb) {
		wl12xx_for_each_wlvif(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
572 573 574 575 576 577 578

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

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

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

	return skb;
595 596
}

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

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

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

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

619 620 621 622 623 624 625
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 已提交
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 652
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 */
653
		if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
654 655 656 657 658 659 660 661
			ieee80211_queue_work(wl->hw,
					     &wlvif->rx_streaming_enable_work);

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

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

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

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

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

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

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

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

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

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

754
	wl1271_tx_work_locked(wl);
755

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

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

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

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

779
	return flags;
780 781
}

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

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

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

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

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

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

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

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

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

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

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

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

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

	/* read the tx results from the chipset */
T
Teemu Paasikivi 已提交
883 884
	wl1271_read(wl, le32_to_cpu(memmap->tx_result),
		    wl->tx_res_if, sizeof(*wl->tx_res_if), false);
885 886 887 888 889 890 891 892
	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;
893
	wl1271_debug(DEBUG_TX, "tx_complete received, packets: %d", count);
L
Luciano Coelho 已提交
894 895

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

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

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

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

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

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

	wl1271_handle_tx_low_watermark(wl);
}

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

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

957 958
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
959
	}
960 961 962 963 964 965 966 967 968
	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;
969

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

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

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

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

997
		if (!wl12xx_is_dummy_packet(wl, skb)) {
998 999 1000 1001 1002 1003 1004 1005 1006 1007
			/*
			 * 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);
1008
				memmove(skb->data + WL1271_EXTRA_SPACE_TKIP,
1009
					skb->data, hdrlen);
1010
				skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
1011
			}
1012

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

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

#define WL1271_TX_FLUSH_TIMEOUT 500000

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

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

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

	/* 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 已提交
1051
}
A
Arik Nemtsov 已提交
1052

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

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