tx.c 27.5 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
		hdr = (struct ieee80211_hdr *)skb->data;
151
		if (is_multicast_ether_addr(ieee80211_get_DA(hdr)))
152
			return wlvif->ap.bcast_hlid;
153 154
		else
			return wlvif->ap.global_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);

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

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

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

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

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

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

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

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

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

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

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

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

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

441 442 443
	return enabled_rates;
}

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

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

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

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

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

	return skb;
}

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

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

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

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

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

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

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

	return skb;
}

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

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

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

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

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

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

	return skb;
596 597
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

755
	wl1271_tx_work_locked(wl);
756

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

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

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

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

780
	return flags;
781 782
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

935
			total[i]++;
936 937 938 939
		}
	}

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

	wl1271_handle_tx_low_watermark(wl);
}

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

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

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

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

981
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
982

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

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

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

1016 1017
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
1018

1019
			ieee80211_tx_status_ni(wl->hw, skb);
1020
		}
1021
	}
1022 1023 1024 1025 1026 1027 1028 1029
}

#define WL1271_TX_FLUSH_TIMEOUT 500000

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

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

	wl1271_warning("Unable to flush all TX buffers, timed out.");
1048 1049 1050 1051 1052 1053

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

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

1061
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1062
}