aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/wl1251/tx.c
diff options
context:
space:
mode:
authorKalle Valo <kvalo@adurom.com>2010-10-10 04:28:32 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-10-11 15:04:23 -0400
commit9bc6772e15d25f58c1be638031280e04514287d4 (patch)
tree4cff1bcbeb40698df1bbdff7c06cd3a089bcc205 /drivers/net/wireless/wl1251/tx.c
parentf03ee1ec73d8cad07b0ef5ba6106a9fc4d179ecb (diff)
wl1251: move to it's own directory
wl1271 driver is under heavy development but on the other hand the older wl1251 driver is currently considered more as a legacy driver. To make it easier to develop wl1271 features move wl1251 to it's own directory, drivers/net/wireless/wl1251. There are no functional changes, only moving of files. One regression is that Kconfig won't be updated automatically and user needs to enable wl1251 manually with an older config file. Signed-off-by: Kalle Valo <kvalo@adurom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/wl1251/tx.c')
-rw-r--r--drivers/net/wireless/wl1251/tx.c570
1 files changed, 570 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl1251/tx.c b/drivers/net/wireless/wl1251/tx.c
new file mode 100644
index 000000000000..554b4f9a3d3e
--- /dev/null
+++ b/drivers/net/wireless/wl1251/tx.c
@@ -0,0 +1,570 @@
1/*
2 * This file is part of wl1251
3 *
4 * Copyright (c) 1998-2007 Texas Instruments Incorporated
5 * Copyright (C) 2008 Nokia Corporation
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * version 2 as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19 * 02110-1301 USA
20 *
21 */
22
23#include <linux/kernel.h>
24#include <linux/module.h>
25
26#include "wl1251.h"
27#include "reg.h"
28#include "tx.h"
29#include "ps.h"
30#include "io.h"
31
32static bool wl1251_tx_double_buffer_busy(struct wl1251 *wl, u32 data_out_count)
33{
34 int used, data_in_count;
35
36 data_in_count = wl->data_in_count;
37
38 if (data_in_count < data_out_count)
39 /* data_in_count has wrapped */
40 data_in_count += TX_STATUS_DATA_OUT_COUNT_MASK + 1;
41
42 used = data_in_count - data_out_count;
43
44 WARN_ON(used < 0);
45 WARN_ON(used > DP_TX_PACKET_RING_CHUNK_NUM);
46
47 if (used >= DP_TX_PACKET_RING_CHUNK_NUM)
48 return true;
49 else
50 return false;
51}
52
53static int wl1251_tx_path_status(struct wl1251 *wl)
54{
55 u32 status, addr, data_out_count;
56 bool busy;
57
58 addr = wl->data_path->tx_control_addr;
59 status = wl1251_mem_read32(wl, addr);
60 data_out_count = status & TX_STATUS_DATA_OUT_COUNT_MASK;
61 busy = wl1251_tx_double_buffer_busy(wl, data_out_count);
62
63 if (busy)
64 return -EBUSY;
65
66 return 0;
67}
68
69static int wl1251_tx_id(struct wl1251 *wl, struct sk_buff *skb)
70{
71 int i;
72
73 for (i = 0; i < FW_TX_CMPLT_BLOCK_SIZE; i++)
74 if (wl->tx_frames[i] == NULL) {
75 wl->tx_frames[i] = skb;
76 return i;
77 }
78
79 return -EBUSY;
80}
81
82static void wl1251_tx_control(struct tx_double_buffer_desc *tx_hdr,
83 struct ieee80211_tx_info *control, u16 fc)
84{
85 *(u16 *)&tx_hdr->control = 0;
86
87 tx_hdr->control.rate_policy = 0;
88
89 /* 802.11 packets */
90 tx_hdr->control.packet_type = 0;
91
92 if (control->flags & IEEE80211_TX_CTL_NO_ACK)
93 tx_hdr->control.ack_policy = 1;
94
95 tx_hdr->control.tx_complete = 1;
96
97 if ((fc & IEEE80211_FTYPE_DATA) &&
98 ((fc & IEEE80211_STYPE_QOS_DATA) ||
99 (fc & IEEE80211_STYPE_QOS_NULLFUNC)))
100 tx_hdr->control.qos = 1;
101}
102
103/* RSN + MIC = 8 + 8 = 16 bytes (worst case - AES). */
104#define MAX_MSDU_SECURITY_LENGTH 16
105#define MAX_MPDU_SECURITY_LENGTH 16
106#define WLAN_QOS_HDR_LEN 26
107#define MAX_MPDU_HEADER_AND_SECURITY (MAX_MPDU_SECURITY_LENGTH + \
108 WLAN_QOS_HDR_LEN)
109#define HW_BLOCK_SIZE 252
110static void wl1251_tx_frag_block_num(struct tx_double_buffer_desc *tx_hdr)
111{
112 u16 payload_len, frag_threshold, mem_blocks;
113 u16 num_mpdus, mem_blocks_per_frag;
114
115 frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD;
116 tx_hdr->frag_threshold = cpu_to_le16(frag_threshold);
117
118 payload_len = le16_to_cpu(tx_hdr->length) + MAX_MSDU_SECURITY_LENGTH;
119
120 if (payload_len > frag_threshold) {
121 mem_blocks_per_frag =
122 ((frag_threshold + MAX_MPDU_HEADER_AND_SECURITY) /
123 HW_BLOCK_SIZE) + 1;
124 num_mpdus = payload_len / frag_threshold;
125 mem_blocks = num_mpdus * mem_blocks_per_frag;
126 payload_len -= num_mpdus * frag_threshold;
127 num_mpdus++;
128
129 } else {
130 mem_blocks_per_frag = 0;
131 mem_blocks = 0;
132 num_mpdus = 1;
133 }
134
135 mem_blocks += (payload_len / HW_BLOCK_SIZE) + 1;
136
137 if (num_mpdus > 1)
138 mem_blocks += min(num_mpdus, mem_blocks_per_frag);
139
140 tx_hdr->num_mem_blocks = mem_blocks;
141}
142
143static int wl1251_tx_fill_hdr(struct wl1251 *wl, struct sk_buff *skb,
144 struct ieee80211_tx_info *control)
145{
146 struct tx_double_buffer_desc *tx_hdr;
147 struct ieee80211_rate *rate;
148 int id;
149 u16 fc;
150
151 if (!skb)
152 return -EINVAL;
153
154 id = wl1251_tx_id(wl, skb);
155 if (id < 0)
156 return id;
157
158 fc = *(u16 *)skb->data;
159 tx_hdr = (struct tx_double_buffer_desc *) skb_push(skb,
160 sizeof(*tx_hdr));
161
162 tx_hdr->length = cpu_to_le16(skb->len - sizeof(*tx_hdr));
163 rate = ieee80211_get_tx_rate(wl->hw, control);
164 tx_hdr->rate = cpu_to_le16(rate->hw_value);
165 tx_hdr->expiry_time = cpu_to_le32(1 << 16);
166 tx_hdr->id = id;
167
168 tx_hdr->xmit_queue = wl1251_tx_get_queue(skb_get_queue_mapping(skb));
169
170 wl1251_tx_control(tx_hdr, control, fc);
171 wl1251_tx_frag_block_num(tx_hdr);
172
173 return 0;
174}
175
176/* We copy the packet to the target */
177static int wl1251_tx_send_packet(struct wl1251 *wl, struct sk_buff *skb,
178 struct ieee80211_tx_info *control)
179{
180 struct tx_double_buffer_desc *tx_hdr;
181 int len;
182 u32 addr;
183
184 if (!skb)
185 return -EINVAL;
186
187 tx_hdr = (struct tx_double_buffer_desc *) skb->data;
188
189 if (control->control.hw_key &&
190 control->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
191 int hdrlen;
192 __le16 fc;
193 u16 length;
194 u8 *pos;
195
196 fc = *(__le16 *)(skb->data + sizeof(*tx_hdr));
197 length = le16_to_cpu(tx_hdr->length) + WL1251_TKIP_IV_SPACE;
198 tx_hdr->length = cpu_to_le16(length);
199
200 hdrlen = ieee80211_hdrlen(fc);
201
202 pos = skb_push(skb, WL1251_TKIP_IV_SPACE);
203 memmove(pos, pos + WL1251_TKIP_IV_SPACE,
204 sizeof(*tx_hdr) + hdrlen);
205 }
206
207 /* Revisit. This is a workaround for getting non-aligned packets.
208 This happens at least with EAPOL packets from the user space.
209 Our DMA requires packets to be aligned on a 4-byte boundary.
210 */
211 if (unlikely((long)skb->data & 0x03)) {
212 int offset = (4 - (long)skb->data) & 0x03;
213 wl1251_debug(DEBUG_TX, "skb offset %d", offset);
214
215 /* check whether the current skb can be used */
216 if (!skb_cloned(skb) && (skb_tailroom(skb) >= offset)) {
217 unsigned char *src = skb->data;
218
219 /* align the buffer on a 4-byte boundary */
220 skb_reserve(skb, offset);
221 memmove(skb->data, src, skb->len);
222 tx_hdr = (struct tx_double_buffer_desc *) skb->data;
223 } else {
224 wl1251_info("No handler, fixme!");
225 return -EINVAL;
226 }
227 }
228
229 /* Our skb->data at this point includes the HW header */
230 len = WL1251_TX_ALIGN(skb->len);
231
232 if (wl->data_in_count & 0x1)
233 addr = wl->data_path->tx_packet_ring_addr +
234 wl->data_path->tx_packet_ring_chunk_size;
235 else
236 addr = wl->data_path->tx_packet_ring_addr;
237
238 wl1251_mem_write(wl, addr, skb->data, len);
239
240 wl1251_debug(DEBUG_TX, "tx id %u skb 0x%p payload %u rate 0x%x "
241 "queue %d", tx_hdr->id, skb, tx_hdr->length,
242 tx_hdr->rate, tx_hdr->xmit_queue);
243
244 return 0;
245}
246
247static void wl1251_tx_trigger(struct wl1251 *wl)
248{
249 u32 data, addr;
250
251 if (wl->data_in_count & 0x1) {
252 addr = ACX_REG_INTERRUPT_TRIG_H;
253 data = INTR_TRIG_TX_PROC1;
254 } else {
255 addr = ACX_REG_INTERRUPT_TRIG;
256 data = INTR_TRIG_TX_PROC0;
257 }
258
259 wl1251_reg_write32(wl, addr, data);
260
261 /* Bumping data in */
262 wl->data_in_count = (wl->data_in_count + 1) &
263 TX_STATUS_DATA_OUT_COUNT_MASK;
264}
265
266/* caller must hold wl->mutex */
267static int wl1251_tx_frame(struct wl1251 *wl, struct sk_buff *skb)
268{
269 struct ieee80211_tx_info *info;
270 int ret = 0;
271 u8 idx;
272
273 info = IEEE80211_SKB_CB(skb);
274
275 if (info->control.hw_key) {
276 idx = info->control.hw_key->hw_key_idx;
277 if (unlikely(wl->default_key != idx)) {
278 ret = wl1251_acx_default_key(wl, idx);
279 if (ret < 0)
280 return ret;
281 }
282 }
283
284 ret = wl1251_tx_path_status(wl);
285 if (ret < 0)
286 return ret;
287
288 ret = wl1251_tx_fill_hdr(wl, skb, info);
289 if (ret < 0)
290 return ret;
291
292 ret = wl1251_tx_send_packet(wl, skb, info);
293 if (ret < 0)
294 return ret;
295
296 wl1251_tx_trigger(wl);
297
298 return ret;
299}
300
301void wl1251_tx_work(struct work_struct *work)
302{
303 struct wl1251 *wl = container_of(work, struct wl1251, tx_work);
304 struct sk_buff *skb;
305 bool woken_up = false;
306 int ret;
307
308 mutex_lock(&wl->mutex);
309
310 if (unlikely(wl->state == WL1251_STATE_OFF))
311 goto out;
312
313 while ((skb = skb_dequeue(&wl->tx_queue))) {
314 if (!woken_up) {
315 ret = wl1251_ps_elp_wakeup(wl);
316 if (ret < 0)
317 goto out;
318 woken_up = true;
319 }
320
321 ret = wl1251_tx_frame(wl, skb);
322 if (ret == -EBUSY) {
323 skb_queue_head(&wl->tx_queue, skb);
324 goto out;
325 } else if (ret < 0) {
326 dev_kfree_skb(skb);
327 goto out;
328 }
329 }
330
331out:
332 if (woken_up)
333 wl1251_ps_elp_sleep(wl);
334
335 mutex_unlock(&wl->mutex);
336}
337
338static const char *wl1251_tx_parse_status(u8 status)
339{
340 /* 8 bit status field, one character per bit plus null */
341 static char buf[9];
342 int i = 0;
343
344 memset(buf, 0, sizeof(buf));
345
346 if (status & TX_DMA_ERROR)
347 buf[i++] = 'm';
348 if (status & TX_DISABLED)
349 buf[i++] = 'd';
350 if (status & TX_RETRY_EXCEEDED)
351 buf[i++] = 'r';
352 if (status & TX_TIMEOUT)
353 buf[i++] = 't';
354 if (status & TX_KEY_NOT_FOUND)
355 buf[i++] = 'k';
356 if (status & TX_ENCRYPT_FAIL)
357 buf[i++] = 'e';
358 if (status & TX_UNAVAILABLE_PRIORITY)
359 buf[i++] = 'p';
360
361 /* bit 0 is unused apparently */
362
363 return buf;
364}
365
366static void wl1251_tx_packet_cb(struct wl1251 *wl,
367 struct tx_result *result)
368{
369 struct ieee80211_tx_info *info;
370 struct sk_buff *skb;
371 int hdrlen, ret;
372 u8 *frame;
373
374 skb = wl->tx_frames[result->id];
375 if (skb == NULL) {
376 wl1251_error("SKB for packet %d is NULL", result->id);
377 return;
378 }
379
380 info = IEEE80211_SKB_CB(skb);
381
382 if (!(info->flags & IEEE80211_TX_CTL_NO_ACK) &&
383 (result->status == TX_SUCCESS))
384 info->flags |= IEEE80211_TX_STAT_ACK;
385
386 info->status.rates[0].count = result->ack_failures + 1;
387 wl->stats.retry_count += result->ack_failures;
388
389 /*
390 * We have to remove our private TX header before pushing
391 * the skb back to mac80211.
392 */
393 frame = skb_pull(skb, sizeof(struct tx_double_buffer_desc));
394 if (info->control.hw_key &&
395 info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
396 hdrlen = ieee80211_get_hdrlen_from_skb(skb);
397 memmove(frame + WL1251_TKIP_IV_SPACE, frame, hdrlen);
398 skb_pull(skb, WL1251_TKIP_IV_SPACE);
399 }
400
401 wl1251_debug(DEBUG_TX, "tx status id %u skb 0x%p failures %u rate 0x%x"
402 " status 0x%x (%s)",
403 result->id, skb, result->ack_failures, result->rate,
404 result->status, wl1251_tx_parse_status(result->status));
405
406
407 ieee80211_tx_status(wl->hw, skb);
408
409 wl->tx_frames[result->id] = NULL;
410
411 if (wl->tx_queue_stopped) {
412 wl1251_debug(DEBUG_TX, "cb: queue was stopped");
413
414 skb = skb_dequeue(&wl->tx_queue);
415
416 /* The skb can be NULL because tx_work might have been
417 scheduled before the queue was stopped making the
418 queue empty */
419
420 if (skb) {
421 ret = wl1251_tx_frame(wl, skb);
422 if (ret == -EBUSY) {
423 /* firmware buffer is still full */
424 wl1251_debug(DEBUG_TX, "cb: fw buffer "
425 "still full");
426 skb_queue_head(&wl->tx_queue, skb);
427 return;
428 } else if (ret < 0) {
429 dev_kfree_skb(skb);
430 return;
431 }
432 }
433
434 wl1251_debug(DEBUG_TX, "cb: waking queues");
435 ieee80211_wake_queues(wl->hw);
436 wl->tx_queue_stopped = false;
437 }
438}
439
440/* Called upon reception of a TX complete interrupt */
441void wl1251_tx_complete(struct wl1251 *wl)
442{
443 int i, result_index, num_complete = 0;
444 struct tx_result result[FW_TX_CMPLT_BLOCK_SIZE], *result_ptr;
445 unsigned long flags;
446
447 if (unlikely(wl->state != WL1251_STATE_ON))
448 return;
449
450 /* First we read the result */
451 wl1251_mem_read(wl, wl->data_path->tx_complete_addr,
452 result, sizeof(result));
453
454 result_index = wl->next_tx_complete;
455
456 for (i = 0; i < ARRAY_SIZE(result); i++) {
457 result_ptr = &result[result_index];
458
459 if (result_ptr->done_1 == 1 &&
460 result_ptr->done_2 == 1) {
461 wl1251_tx_packet_cb(wl, result_ptr);
462
463 result_ptr->done_1 = 0;
464 result_ptr->done_2 = 0;
465
466 result_index = (result_index + 1) &
467 (FW_TX_CMPLT_BLOCK_SIZE - 1);
468 num_complete++;
469 } else {
470 break;
471 }
472 }
473
474 if (wl->tx_queue_stopped
475 &&
476 skb_queue_len(&wl->tx_queue) <= WL1251_TX_QUEUE_LOW_WATERMARK){
477
478 /* firmware buffer has space, restart queues */
479 wl1251_debug(DEBUG_TX, "tx_complete: waking queues");
480 spin_lock_irqsave(&wl->wl_lock, flags);
481 ieee80211_wake_queues(wl->hw);
482 wl->tx_queue_stopped = false;
483 spin_unlock_irqrestore(&wl->wl_lock, flags);
484 ieee80211_queue_work(wl->hw, &wl->tx_work);
485
486 }
487
488 /* Every completed frame needs to be acknowledged */
489 if (num_complete) {
490 /*
491 * If we've wrapped, we have to clear
492 * the results in 2 steps.
493 */
494 if (result_index > wl->next_tx_complete) {
495 /* Only 1 write is needed */
496 wl1251_mem_write(wl,
497 wl->data_path->tx_complete_addr +
498 (wl->next_tx_complete *
499 sizeof(struct tx_result)),
500 &result[wl->next_tx_complete],
501 num_complete *
502 sizeof(struct tx_result));
503
504
505 } else if (result_index < wl->next_tx_complete) {
506 /* 2 writes are needed */
507 wl1251_mem_write(wl,
508 wl->data_path->tx_complete_addr +
509 (wl->next_tx_complete *
510 sizeof(struct tx_result)),
511 &result[wl->next_tx_complete],
512 (FW_TX_CMPLT_BLOCK_SIZE -
513 wl->next_tx_complete) *
514 sizeof(struct tx_result));
515
516 wl1251_mem_write(wl,
517 wl->data_path->tx_complete_addr,
518 result,
519 (num_complete -
520 FW_TX_CMPLT_BLOCK_SIZE +
521 wl->next_tx_complete) *
522 sizeof(struct tx_result));
523
524 } else {
525 /* We have to write the whole array */
526 wl1251_mem_write(wl,
527 wl->data_path->tx_complete_addr,
528 result,
529 FW_TX_CMPLT_BLOCK_SIZE *
530 sizeof(struct tx_result));
531 }
532
533 }
534
535 wl->next_tx_complete = result_index;
536}
537
538/* caller must hold wl->mutex */
539void wl1251_tx_flush(struct wl1251 *wl)
540{
541 int i;
542 struct sk_buff *skb;
543 struct ieee80211_tx_info *info;
544
545 /* TX failure */
546/* control->flags = 0; FIXME */
547
548 while ((skb = skb_dequeue(&wl->tx_queue))) {
549 info = IEEE80211_SKB_CB(skb);
550
551 wl1251_debug(DEBUG_TX, "flushing skb 0x%p", skb);
552
553 if (!(info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS))
554 continue;
555
556 ieee80211_tx_status(wl->hw, skb);
557 }
558
559 for (i = 0; i < FW_TX_CMPLT_BLOCK_SIZE; i++)
560 if (wl->tx_frames[i] != NULL) {
561 skb = wl->tx_frames[i];
562 info = IEEE80211_SKB_CB(skb);
563
564 if (!(info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS))
565 continue;
566
567 ieee80211_tx_status(wl->hw, skb);
568 wl->tx_frames[i] = NULL;
569 }
570}