2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
18 * Purpose: handle WMAC/802.3/802.11 rx & tx functions
25 * vnt_generate_tx_parameter - Generate tx dma required parameter.
26 * vnt_get_duration_le - get tx data required duration
27 * vnt_get_rtscts_duration_le- get rtx/cts required duration
28 * vnt_get_rtscts_rsvtime_le- get rts/cts reserved time
29 * vnt_get_rsvtime- get frame reserved time
30 * vnt_fill_cts_head- fulfill CTS ctl header
36 #include <linux/etherdevice.h>
44 static const u16 vnt_time_stampoff
[2][MAX_RATE
] = {
46 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23},
49 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23},
52 static const u16 vnt_fb_opt0
[2][5] = {
53 {RATE_12M
, RATE_18M
, RATE_24M
, RATE_36M
, RATE_48M
}, /* fallback_rate0 */
54 {RATE_12M
, RATE_12M
, RATE_18M
, RATE_24M
, RATE_36M
}, /* fallback_rate1 */
57 static const u16 vnt_fb_opt1
[2][5] = {
58 {RATE_12M
, RATE_18M
, RATE_24M
, RATE_24M
, RATE_36M
}, /* fallback_rate0 */
59 {RATE_6M
, RATE_6M
, RATE_12M
, RATE_12M
, RATE_18M
}, /* fallback_rate1 */
66 #define RTSDUR_BA_F0 4
67 #define RTSDUR_AA_F0 5
68 #define RTSDUR_BA_F1 6
69 #define RTSDUR_AA_F1 7
70 #define CTSDUR_BA_F0 8
71 #define CTSDUR_BA_F1 9
74 #define DATADUR_A_F0 12
75 #define DATADUR_A_F1 13
77 static struct vnt_usb_send_context
78 *vnt_get_free_context(struct vnt_private
*priv
)
80 struct vnt_usb_send_context
*context
= NULL
;
83 dev_dbg(&priv
->usb
->dev
, "%s\n", __func__
);
85 for (ii
= 0; ii
< priv
->num_tx_context
; ii
++) {
86 if (!priv
->tx_context
[ii
])
89 context
= priv
->tx_context
[ii
];
90 if (!context
->in_use
) {
91 context
->in_use
= true;
92 memset(context
->data
, 0,
93 MAX_TOTAL_SIZE_WITH_ALL_HEADERS
);
101 if (ii
== priv
->num_tx_context
) {
102 dev_dbg(&priv
->usb
->dev
, "%s No Free Tx Context\n", __func__
);
104 ieee80211_stop_queues(priv
->hw
);
110 static __le16
vnt_time_stamp_off(struct vnt_private
*priv
, u16 rate
)
112 return cpu_to_le16(vnt_time_stampoff
[priv
->preamble_type
% 2]
116 static u32
vnt_get_rsvtime(struct vnt_private
*priv
, u8 pkt_type
,
117 u32 frame_length
, u16 rate
, int need_ack
)
119 u32 data_time
, ack_time
;
121 data_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
124 if (pkt_type
== PK_TYPE_11B
)
125 ack_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
126 14, (u16
)priv
->top_cck_basic_rate
);
128 ack_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
129 14, (u16
)priv
->top_ofdm_basic_rate
);
132 return data_time
+ priv
->sifs
+ ack_time
;
137 static __le16
vnt_rxtx_rsvtime_le16(struct vnt_private
*priv
, u8 pkt_type
,
138 u32 frame_length
, u16 rate
, int need_ack
)
140 return cpu_to_le16((u16
)vnt_get_rsvtime(priv
, pkt_type
,
141 frame_length
, rate
, need_ack
));
144 static __le16
vnt_get_rtscts_rsvtime_le(struct vnt_private
*priv
, u8 rsv_type
,
145 u8 pkt_type
, u32 frame_length
,
148 u32 rrv_time
, rts_time
, cts_time
, ack_time
, data_time
;
155 data_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
156 frame_length
, current_rate
);
159 rts_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
160 20, priv
->top_cck_basic_rate
);
161 ack_time
= vnt_get_frame_time(priv
->preamble_type
,
163 priv
->top_cck_basic_rate
);
166 } else if (rsv_type
== 1) {
167 rts_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
168 20, priv
->top_cck_basic_rate
);
169 cts_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
170 14, priv
->top_cck_basic_rate
);
171 ack_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
172 14, priv
->top_ofdm_basic_rate
);
173 } else if (rsv_type
== 2) {
174 rts_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
175 20, priv
->top_ofdm_basic_rate
);
176 ack_time
= vnt_get_frame_time(priv
->preamble_type
,
178 priv
->top_ofdm_basic_rate
);
181 } else if (rsv_type
== 3) {
182 cts_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
183 14, priv
->top_cck_basic_rate
);
184 ack_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
185 14, priv
->top_ofdm_basic_rate
);
187 rrv_time
= cts_time
+ ack_time
+ data_time
+ 2 * priv
->sifs
;
189 return cpu_to_le16((u16
)rrv_time
);
192 rrv_time
= rts_time
+ cts_time
+ ack_time
+ data_time
+ 3 * priv
->sifs
;
194 return cpu_to_le16((u16
)rrv_time
);
197 static __le16
vnt_get_duration_le(struct vnt_private
*priv
, u8 pkt_type
,
203 if (pkt_type
== PK_TYPE_11B
)
204 ack_time
= vnt_get_frame_time(priv
->preamble_type
,
206 priv
->top_cck_basic_rate
);
208 ack_time
= vnt_get_frame_time(priv
->preamble_type
,
210 priv
->top_ofdm_basic_rate
);
212 return cpu_to_le16((u16
)(priv
->sifs
+ ack_time
));
218 static __le16
vnt_get_rtscts_duration_le(struct vnt_usb_send_context
*context
,
219 u8 dur_type
, u8 pkt_type
, u16 rate
)
221 struct vnt_private
*priv
= context
->priv
;
222 u32 cts_time
= 0, dur_time
= 0;
223 u32 frame_length
= context
->frame_len
;
224 u8 need_ack
= context
->need_ack
;
231 cts_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
232 14, priv
->top_cck_basic_rate
);
233 dur_time
= cts_time
+ 2 * priv
->sifs
+
234 vnt_get_rsvtime(priv
, pkt_type
,
235 frame_length
, rate
, need_ack
);
241 cts_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
242 14, priv
->top_ofdm_basic_rate
);
243 dur_time
= cts_time
+ 2 * priv
->sifs
+
244 vnt_get_rsvtime(priv
, pkt_type
,
245 frame_length
, rate
, need_ack
);
251 dur_time
= priv
->sifs
+ vnt_get_rsvtime(priv
,
252 pkt_type
, frame_length
, rate
, need_ack
);
259 return cpu_to_le16((u16
)dur_time
);
262 static u16
vnt_mac_hdr_pos(struct vnt_usb_send_context
*tx_context
,
263 struct ieee80211_hdr
*hdr
)
265 u8
*head
= tx_context
->data
+ offsetof(struct vnt_tx_buffer
, fifo_head
);
266 u8
*hdr_pos
= (u8
*)hdr
;
268 tx_context
->hdr
= hdr
;
269 if (!tx_context
->hdr
)
272 return (u16
)(hdr_pos
- head
);
275 static u16
vnt_rxtx_datahead_g(struct vnt_usb_send_context
*tx_context
,
276 struct vnt_tx_datahead_g
*buf
)
278 struct vnt_private
*priv
= tx_context
->priv
;
279 struct ieee80211_hdr
*hdr
=
280 (struct ieee80211_hdr
*)tx_context
->skb
->data
;
281 u32 frame_len
= tx_context
->frame_len
;
282 u16 rate
= tx_context
->tx_rate
;
283 u8 need_ack
= tx_context
->need_ack
;
285 /* Get SignalField,ServiceField,Length */
286 vnt_get_phy_field(priv
, frame_len
, rate
, tx_context
->pkt_type
, &buf
->a
);
287 vnt_get_phy_field(priv
, frame_len
, priv
->top_cck_basic_rate
,
288 PK_TYPE_11B
, &buf
->b
);
290 /* Get Duration and TimeStamp */
291 if (ieee80211_is_pspoll(hdr
->frame_control
)) {
292 __le16 dur
= cpu_to_le16(priv
->current_aid
| BIT(14) | BIT(15));
294 buf
->duration_a
= dur
;
295 buf
->duration_b
= dur
;
297 buf
->duration_a
= vnt_get_duration_le(priv
,
298 tx_context
->pkt_type
, need_ack
);
299 buf
->duration_b
= vnt_get_duration_le(priv
,
300 PK_TYPE_11B
, need_ack
);
303 buf
->time_stamp_off_a
= vnt_time_stamp_off(priv
, rate
);
304 buf
->time_stamp_off_b
= vnt_time_stamp_off(priv
,
305 priv
->top_cck_basic_rate
);
307 tx_context
->tx_hdr_size
= vnt_mac_hdr_pos(tx_context
, &buf
->hdr
);
309 return le16_to_cpu(buf
->duration_a
);
312 static u16
vnt_rxtx_datahead_g_fb(struct vnt_usb_send_context
*tx_context
,
313 struct vnt_tx_datahead_g_fb
*buf
)
315 struct vnt_private
*priv
= tx_context
->priv
;
316 u32 frame_len
= tx_context
->frame_len
;
317 u16 rate
= tx_context
->tx_rate
;
318 u8 need_ack
= tx_context
->need_ack
;
320 /* Get SignalField,ServiceField,Length */
321 vnt_get_phy_field(priv
, frame_len
, rate
, tx_context
->pkt_type
, &buf
->a
);
323 vnt_get_phy_field(priv
, frame_len
, priv
->top_cck_basic_rate
,
324 PK_TYPE_11B
, &buf
->b
);
326 /* Get Duration and TimeStamp */
327 buf
->duration_a
= vnt_get_duration_le(priv
, tx_context
->pkt_type
,
329 buf
->duration_b
= vnt_get_duration_le(priv
, PK_TYPE_11B
, need_ack
);
331 buf
->duration_a_f0
= vnt_get_duration_le(priv
, tx_context
->pkt_type
,
333 buf
->duration_a_f1
= vnt_get_duration_le(priv
, tx_context
->pkt_type
,
336 buf
->time_stamp_off_a
= vnt_time_stamp_off(priv
, rate
);
337 buf
->time_stamp_off_b
= vnt_time_stamp_off(priv
,
338 priv
->top_cck_basic_rate
);
340 tx_context
->tx_hdr_size
= vnt_mac_hdr_pos(tx_context
, &buf
->hdr
);
342 return le16_to_cpu(buf
->duration_a
);
345 static u16
vnt_rxtx_datahead_a_fb(struct vnt_usb_send_context
*tx_context
,
346 struct vnt_tx_datahead_a_fb
*buf
)
348 struct vnt_private
*priv
= tx_context
->priv
;
349 u16 rate
= tx_context
->tx_rate
;
350 u8 pkt_type
= tx_context
->pkt_type
;
351 u8 need_ack
= tx_context
->need_ack
;
352 u32 frame_len
= tx_context
->frame_len
;
354 /* Get SignalField,ServiceField,Length */
355 vnt_get_phy_field(priv
, frame_len
, rate
, pkt_type
, &buf
->a
);
356 /* Get Duration and TimeStampOff */
357 buf
->duration
= vnt_get_duration_le(priv
, pkt_type
, need_ack
);
359 buf
->duration_f0
= vnt_get_duration_le(priv
, pkt_type
, need_ack
);
360 buf
->duration_f1
= vnt_get_duration_le(priv
, pkt_type
, need_ack
);
362 buf
->time_stamp_off
= vnt_time_stamp_off(priv
, rate
);
364 tx_context
->tx_hdr_size
= vnt_mac_hdr_pos(tx_context
, &buf
->hdr
);
366 return le16_to_cpu(buf
->duration
);
369 static u16
vnt_rxtx_datahead_ab(struct vnt_usb_send_context
*tx_context
,
370 struct vnt_tx_datahead_ab
*buf
)
372 struct vnt_private
*priv
= tx_context
->priv
;
373 struct ieee80211_hdr
*hdr
=
374 (struct ieee80211_hdr
*)tx_context
->skb
->data
;
375 u32 frame_len
= tx_context
->frame_len
;
376 u16 rate
= tx_context
->tx_rate
;
377 u8 need_ack
= tx_context
->need_ack
;
379 /* Get SignalField,ServiceField,Length */
380 vnt_get_phy_field(priv
, frame_len
, rate
,
381 tx_context
->pkt_type
, &buf
->ab
);
383 /* Get Duration and TimeStampOff */
384 if (ieee80211_is_pspoll(hdr
->frame_control
)) {
385 __le16 dur
= cpu_to_le16(priv
->current_aid
| BIT(14) | BIT(15));
389 buf
->duration
= vnt_get_duration_le(priv
, tx_context
->pkt_type
,
393 buf
->time_stamp_off
= vnt_time_stamp_off(priv
, rate
);
395 tx_context
->tx_hdr_size
= vnt_mac_hdr_pos(tx_context
, &buf
->hdr
);
397 return le16_to_cpu(buf
->duration
);
400 static int vnt_fill_ieee80211_rts(struct vnt_usb_send_context
*tx_context
,
401 struct ieee80211_rts
*rts
, __le16 duration
)
403 struct ieee80211_hdr
*hdr
=
404 (struct ieee80211_hdr
*)tx_context
->skb
->data
;
406 rts
->duration
= duration
;
408 cpu_to_le16(IEEE80211_FTYPE_CTL
| IEEE80211_STYPE_RTS
);
410 ether_addr_copy(rts
->ra
, hdr
->addr1
);
411 ether_addr_copy(rts
->ta
, hdr
->addr2
);
416 static u16
vnt_rxtx_rts_g_head(struct vnt_usb_send_context
*tx_context
,
417 struct vnt_rts_g
*buf
)
419 struct vnt_private
*priv
= tx_context
->priv
;
420 u16 rts_frame_len
= 20;
421 u16 current_rate
= tx_context
->tx_rate
;
423 vnt_get_phy_field(priv
, rts_frame_len
, priv
->top_cck_basic_rate
,
424 PK_TYPE_11B
, &buf
->b
);
425 vnt_get_phy_field(priv
, rts_frame_len
, priv
->top_ofdm_basic_rate
,
426 tx_context
->pkt_type
, &buf
->a
);
428 buf
->duration_bb
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_BB
,
430 priv
->top_cck_basic_rate
);
431 buf
->duration_aa
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA
,
432 tx_context
->pkt_type
,
434 buf
->duration_ba
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_BA
,
435 tx_context
->pkt_type
,
438 vnt_fill_ieee80211_rts(tx_context
, &buf
->data
, buf
->duration_aa
);
440 return vnt_rxtx_datahead_g(tx_context
, &buf
->data_head
);
443 static u16
vnt_rxtx_rts_g_fb_head(struct vnt_usb_send_context
*tx_context
,
444 struct vnt_rts_g_fb
*buf
)
446 struct vnt_private
*priv
= tx_context
->priv
;
447 u16 current_rate
= tx_context
->tx_rate
;
448 u16 rts_frame_len
= 20;
450 vnt_get_phy_field(priv
, rts_frame_len
, priv
->top_cck_basic_rate
,
451 PK_TYPE_11B
, &buf
->b
);
452 vnt_get_phy_field(priv
, rts_frame_len
, priv
->top_ofdm_basic_rate
,
453 tx_context
->pkt_type
, &buf
->a
);
455 buf
->duration_bb
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_BB
,
457 priv
->top_cck_basic_rate
);
458 buf
->duration_aa
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA
,
459 tx_context
->pkt_type
,
461 buf
->duration_ba
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_BA
,
462 tx_context
->pkt_type
,
465 buf
->rts_duration_ba_f0
=
466 vnt_get_rtscts_duration_le(tx_context
, RTSDUR_BA_F0
,
467 tx_context
->pkt_type
,
469 buf
->rts_duration_aa_f0
=
470 vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA_F0
,
471 tx_context
->pkt_type
,
473 buf
->rts_duration_ba_f1
=
474 vnt_get_rtscts_duration_le(tx_context
, RTSDUR_BA_F1
,
475 tx_context
->pkt_type
,
477 buf
->rts_duration_aa_f1
=
478 vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA_F1
,
479 tx_context
->pkt_type
,
482 vnt_fill_ieee80211_rts(tx_context
, &buf
->data
, buf
->duration_aa
);
484 return vnt_rxtx_datahead_g_fb(tx_context
, &buf
->data_head
);
487 static u16
vnt_rxtx_rts_ab_head(struct vnt_usb_send_context
*tx_context
,
488 struct vnt_rts_ab
*buf
)
490 struct vnt_private
*priv
= tx_context
->priv
;
491 u16 current_rate
= tx_context
->tx_rate
;
492 u16 rts_frame_len
= 20;
494 vnt_get_phy_field(priv
, rts_frame_len
, priv
->top_ofdm_basic_rate
,
495 tx_context
->pkt_type
, &buf
->ab
);
497 buf
->duration
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA
,
498 tx_context
->pkt_type
,
501 vnt_fill_ieee80211_rts(tx_context
, &buf
->data
, buf
->duration
);
503 return vnt_rxtx_datahead_ab(tx_context
, &buf
->data_head
);
506 static u16
vnt_rxtx_rts_a_fb_head(struct vnt_usb_send_context
*tx_context
,
507 struct vnt_rts_a_fb
*buf
)
509 struct vnt_private
*priv
= tx_context
->priv
;
510 u16 current_rate
= tx_context
->tx_rate
;
511 u16 rts_frame_len
= 20;
513 vnt_get_phy_field(priv
, rts_frame_len
, priv
->top_ofdm_basic_rate
,
514 tx_context
->pkt_type
, &buf
->a
);
516 buf
->duration
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA
,
517 tx_context
->pkt_type
,
520 buf
->rts_duration_f0
=
521 vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA_F0
,
522 tx_context
->pkt_type
,
525 buf
->rts_duration_f1
=
526 vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA_F1
,
527 tx_context
->pkt_type
,
530 vnt_fill_ieee80211_rts(tx_context
, &buf
->data
, buf
->duration
);
532 return vnt_rxtx_datahead_a_fb(tx_context
, &buf
->data_head
);
535 static u16
vnt_fill_cts_fb_head(struct vnt_usb_send_context
*tx_context
,
536 union vnt_tx_data_head
*head
)
538 struct vnt_private
*priv
= tx_context
->priv
;
539 struct vnt_cts_fb
*buf
= &head
->cts_g_fb
;
540 u32 cts_frame_len
= 14;
541 u16 current_rate
= tx_context
->tx_rate
;
543 /* Get SignalField,ServiceField,Length */
544 vnt_get_phy_field(priv
, cts_frame_len
, priv
->top_cck_basic_rate
,
545 PK_TYPE_11B
, &buf
->b
);
548 vnt_get_rtscts_duration_le(tx_context
, CTSDUR_BA
,
549 tx_context
->pkt_type
,
551 /* Get CTSDuration_ba_f0 */
552 buf
->cts_duration_ba_f0
=
553 vnt_get_rtscts_duration_le(tx_context
, CTSDUR_BA_F0
,
554 tx_context
->pkt_type
,
556 /* Get CTSDuration_ba_f1 */
557 buf
->cts_duration_ba_f1
=
558 vnt_get_rtscts_duration_le(tx_context
, CTSDUR_BA_F1
,
559 tx_context
->pkt_type
,
561 /* Get CTS Frame body */
562 buf
->data
.duration
= buf
->duration_ba
;
563 buf
->data
.frame_control
=
564 cpu_to_le16(IEEE80211_FTYPE_CTL
| IEEE80211_STYPE_CTS
);
566 ether_addr_copy(buf
->data
.ra
, priv
->current_net_addr
);
568 return vnt_rxtx_datahead_g_fb(tx_context
, &buf
->data_head
);
571 static u16
vnt_fill_cts_head(struct vnt_usb_send_context
*tx_context
,
572 union vnt_tx_data_head
*head
)
574 struct vnt_private
*priv
= tx_context
->priv
;
575 struct vnt_cts
*buf
= &head
->cts_g
;
576 u32 cts_frame_len
= 14;
577 u16 current_rate
= tx_context
->tx_rate
;
579 /* Get SignalField,ServiceField,Length */
580 vnt_get_phy_field(priv
, cts_frame_len
, priv
->top_cck_basic_rate
,
581 PK_TYPE_11B
, &buf
->b
);
582 /* Get CTSDuration_ba */
584 vnt_get_rtscts_duration_le(tx_context
, CTSDUR_BA
,
585 tx_context
->pkt_type
,
587 /*Get CTS Frame body*/
588 buf
->data
.duration
= buf
->duration_ba
;
589 buf
->data
.frame_control
=
590 cpu_to_le16(IEEE80211_FTYPE_CTL
| IEEE80211_STYPE_CTS
);
592 ether_addr_copy(buf
->data
.ra
, priv
->current_net_addr
);
594 return vnt_rxtx_datahead_g(tx_context
, &buf
->data_head
);
597 static u16
vnt_rxtx_rts(struct vnt_usb_send_context
*tx_context
,
598 union vnt_tx_head
*tx_head
, bool need_mic
)
600 struct vnt_private
*priv
= tx_context
->priv
;
601 struct vnt_rrv_time_rts
*buf
= &tx_head
->tx_rts
.rts
;
602 union vnt_tx_data_head
*head
= &tx_head
->tx_rts
.tx
.head
;
603 u32 frame_len
= tx_context
->frame_len
;
604 u16 current_rate
= tx_context
->tx_rate
;
605 u8 need_ack
= tx_context
->need_ack
;
607 buf
->rts_rrv_time_aa
= vnt_get_rtscts_rsvtime_le(priv
, 2,
608 tx_context
->pkt_type
, frame_len
, current_rate
);
609 buf
->rts_rrv_time_ba
= vnt_get_rtscts_rsvtime_le(priv
, 1,
610 tx_context
->pkt_type
, frame_len
, current_rate
);
611 buf
->rts_rrv_time_bb
= vnt_get_rtscts_rsvtime_le(priv
, 0,
612 tx_context
->pkt_type
, frame_len
, current_rate
);
614 buf
->rrv_time_a
= vnt_rxtx_rsvtime_le16(priv
, tx_context
->pkt_type
,
615 frame_len
, current_rate
,
617 buf
->rrv_time_b
= vnt_rxtx_rsvtime_le16(priv
, PK_TYPE_11B
, frame_len
,
618 priv
->top_cck_basic_rate
, need_ack
);
621 head
= &tx_head
->tx_rts
.tx
.mic
.head
;
623 if (tx_context
->fb_option
)
624 return vnt_rxtx_rts_g_fb_head(tx_context
, &head
->rts_g_fb
);
626 return vnt_rxtx_rts_g_head(tx_context
, &head
->rts_g
);
629 static u16
vnt_rxtx_cts(struct vnt_usb_send_context
*tx_context
,
630 union vnt_tx_head
*tx_head
, bool need_mic
)
632 struct vnt_private
*priv
= tx_context
->priv
;
633 struct vnt_rrv_time_cts
*buf
= &tx_head
->tx_cts
.cts
;
634 union vnt_tx_data_head
*head
= &tx_head
->tx_cts
.tx
.head
;
635 u32 frame_len
= tx_context
->frame_len
;
636 u16 current_rate
= tx_context
->tx_rate
;
637 u8 need_ack
= tx_context
->need_ack
;
639 buf
->rrv_time_a
= vnt_rxtx_rsvtime_le16(priv
, tx_context
->pkt_type
,
640 frame_len
, current_rate
, need_ack
);
641 buf
->rrv_time_b
= vnt_rxtx_rsvtime_le16(priv
, PK_TYPE_11B
,
642 frame_len
, priv
->top_cck_basic_rate
, need_ack
);
644 buf
->cts_rrv_time_ba
= vnt_get_rtscts_rsvtime_le(priv
, 3,
645 tx_context
->pkt_type
, frame_len
, current_rate
);
648 head
= &tx_head
->tx_cts
.tx
.mic
.head
;
651 if (tx_context
->fb_option
)
652 return vnt_fill_cts_fb_head(tx_context
, head
);
654 return vnt_fill_cts_head(tx_context
, head
);
657 static u16
vnt_rxtx_ab(struct vnt_usb_send_context
*tx_context
,
658 union vnt_tx_head
*tx_head
, bool need_rts
, bool need_mic
)
660 struct vnt_private
*priv
= tx_context
->priv
;
661 struct vnt_rrv_time_ab
*buf
= &tx_head
->tx_ab
.ab
;
662 union vnt_tx_data_head
*head
= &tx_head
->tx_ab
.tx
.head
;
663 u32 frame_len
= tx_context
->frame_len
;
664 u16 current_rate
= tx_context
->tx_rate
;
665 u8 need_ack
= tx_context
->need_ack
;
667 buf
->rrv_time
= vnt_rxtx_rsvtime_le16(priv
, tx_context
->pkt_type
,
668 frame_len
, current_rate
, need_ack
);
671 head
= &tx_head
->tx_ab
.tx
.mic
.head
;
674 if (tx_context
->pkt_type
== PK_TYPE_11B
)
675 buf
->rts_rrv_time
= vnt_get_rtscts_rsvtime_le(priv
, 0,
676 tx_context
->pkt_type
, frame_len
, current_rate
);
677 else /* PK_TYPE_11A */
678 buf
->rts_rrv_time
= vnt_get_rtscts_rsvtime_le(priv
, 2,
679 tx_context
->pkt_type
, frame_len
, current_rate
);
681 if (tx_context
->fb_option
&&
682 tx_context
->pkt_type
== PK_TYPE_11A
)
683 return vnt_rxtx_rts_a_fb_head(tx_context
,
686 return vnt_rxtx_rts_ab_head(tx_context
, &head
->rts_ab
);
689 if (tx_context
->pkt_type
== PK_TYPE_11A
)
690 return vnt_rxtx_datahead_a_fb(tx_context
,
691 &head
->data_head_a_fb
);
693 return vnt_rxtx_datahead_ab(tx_context
, &head
->data_head_ab
);
696 static u16
vnt_generate_tx_parameter(struct vnt_usb_send_context
*tx_context
,
697 struct vnt_tx_buffer
*tx_buffer
,
698 struct vnt_mic_hdr
**mic_hdr
, u32 need_mic
,
701 if (tx_context
->pkt_type
== PK_TYPE_11GB
||
702 tx_context
->pkt_type
== PK_TYPE_11GA
) {
706 &tx_buffer
->tx_head
.tx_rts
.tx
.mic
.hdr
;
708 return vnt_rxtx_rts(tx_context
, &tx_buffer
->tx_head
,
713 *mic_hdr
= &tx_buffer
->tx_head
.tx_cts
.tx
.mic
.hdr
;
715 return vnt_rxtx_cts(tx_context
, &tx_buffer
->tx_head
, need_mic
);
719 *mic_hdr
= &tx_buffer
->tx_head
.tx_ab
.tx
.mic
.hdr
;
721 return vnt_rxtx_ab(tx_context
, &tx_buffer
->tx_head
, need_rts
, need_mic
);
724 static void vnt_fill_txkey(struct vnt_usb_send_context
*tx_context
,
725 u8
*key_buffer
, struct ieee80211_key_conf
*tx_key
,
726 struct sk_buff
*skb
, u16 payload_len
,
727 struct vnt_mic_hdr
*mic_hdr
)
729 struct ieee80211_hdr
*hdr
= tx_context
->hdr
;
731 u8
*iv
= ((u8
*)hdr
+ ieee80211_get_hdrlen_from_skb(skb
));
733 /* strip header and icv len from payload */
734 payload_len
-= ieee80211_get_hdrlen_from_skb(skb
);
735 payload_len
-= tx_key
->icv_len
;
737 switch (tx_key
->cipher
) {
738 case WLAN_CIPHER_SUITE_WEP40
:
739 case WLAN_CIPHER_SUITE_WEP104
:
740 memcpy(key_buffer
, iv
, 3);
741 memcpy(key_buffer
+ 3, tx_key
->key
, tx_key
->keylen
);
743 if (tx_key
->keylen
== WLAN_KEY_LEN_WEP40
) {
744 memcpy(key_buffer
+ 8, iv
, 3);
745 memcpy(key_buffer
+ 11,
746 tx_key
->key
, WLAN_KEY_LEN_WEP40
);
750 case WLAN_CIPHER_SUITE_TKIP
:
751 ieee80211_get_tkip_p2k(tx_key
, skb
, key_buffer
);
754 case WLAN_CIPHER_SUITE_CCMP
:
760 mic_hdr
->payload_len
= cpu_to_be16(payload_len
);
761 ether_addr_copy(mic_hdr
->mic_addr2
, hdr
->addr2
);
763 pn64
= atomic64_read(&tx_key
->tx_pn
);
764 mic_hdr
->ccmp_pn
[5] = pn64
;
765 mic_hdr
->ccmp_pn
[4] = pn64
>> 8;
766 mic_hdr
->ccmp_pn
[3] = pn64
>> 16;
767 mic_hdr
->ccmp_pn
[2] = pn64
>> 24;
768 mic_hdr
->ccmp_pn
[1] = pn64
>> 32;
769 mic_hdr
->ccmp_pn
[0] = pn64
>> 40;
771 if (ieee80211_has_a4(hdr
->frame_control
))
772 mic_hdr
->hlen
= cpu_to_be16(28);
774 mic_hdr
->hlen
= cpu_to_be16(22);
776 ether_addr_copy(mic_hdr
->addr1
, hdr
->addr1
);
777 ether_addr_copy(mic_hdr
->addr2
, hdr
->addr2
);
778 ether_addr_copy(mic_hdr
->addr3
, hdr
->addr3
);
780 mic_hdr
->frame_control
= cpu_to_le16(
781 le16_to_cpu(hdr
->frame_control
) & 0xc78f);
782 mic_hdr
->seq_ctrl
= cpu_to_le16(
783 le16_to_cpu(hdr
->seq_ctrl
) & 0xf);
785 if (ieee80211_has_a4(hdr
->frame_control
))
786 ether_addr_copy(mic_hdr
->addr4
, hdr
->addr4
);
788 memcpy(key_buffer
, tx_key
->key
, WLAN_KEY_LEN_CCMP
);
796 int vnt_tx_packet(struct vnt_private
*priv
, struct sk_buff
*skb
)
798 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
799 struct ieee80211_tx_rate
*tx_rate
= &info
->control
.rates
[0];
800 struct ieee80211_rate
*rate
;
801 struct ieee80211_key_conf
*tx_key
;
802 struct ieee80211_hdr
*hdr
;
803 struct vnt_mic_hdr
*mic_hdr
= NULL
;
804 struct vnt_tx_buffer
*tx_buffer
;
805 struct vnt_tx_fifo_head
*tx_buffer_head
;
806 struct vnt_usb_send_context
*tx_context
;
808 u16 tx_bytes
, tx_header_size
, tx_body_size
, current_rate
, duration_id
;
809 u8 pkt_type
, fb_option
= AUTO_FB_NONE
;
810 bool need_rts
= false, is_pspoll
= false;
811 bool need_mic
= false;
813 hdr
= (struct ieee80211_hdr
*)(skb
->data
);
815 rate
= ieee80211_get_tx_rate(priv
->hw
, info
);
817 current_rate
= rate
->hw_value
;
818 if (priv
->current_rate
!= current_rate
&&
819 !(priv
->hw
->conf
.flags
& IEEE80211_CONF_OFFCHANNEL
)) {
820 priv
->current_rate
= current_rate
;
821 vnt_schedule_command(priv
, WLAN_CMD_SETPOWER
);
824 if (current_rate
> RATE_11M
) {
825 if (info
->band
== NL80211_BAND_5GHZ
) {
826 pkt_type
= PK_TYPE_11A
;
828 if (tx_rate
->flags
& IEEE80211_TX_RC_USE_CTS_PROTECT
)
829 pkt_type
= PK_TYPE_11GB
;
831 pkt_type
= PK_TYPE_11GA
;
834 pkt_type
= PK_TYPE_11B
;
837 spin_lock_irqsave(&priv
->lock
, flags
);
839 tx_context
= vnt_get_free_context(priv
);
841 dev_dbg(&priv
->usb
->dev
, "%s No free context\n", __func__
);
842 spin_unlock_irqrestore(&priv
->lock
, flags
);
846 tx_context
->skb
= skb
;
847 tx_context
->pkt_type
= pkt_type
;
848 tx_context
->need_ack
= false;
849 tx_context
->frame_len
= skb
->len
+ 4;
850 tx_context
->tx_rate
= current_rate
;
852 spin_unlock_irqrestore(&priv
->lock
, flags
);
854 tx_buffer
= (struct vnt_tx_buffer
*)tx_context
->data
;
855 tx_buffer_head
= &tx_buffer
->fifo_head
;
856 tx_body_size
= skb
->len
;
858 /*Set fifo controls */
859 if (pkt_type
== PK_TYPE_11A
)
860 tx_buffer_head
->fifo_ctl
= 0;
861 else if (pkt_type
== PK_TYPE_11B
)
862 tx_buffer_head
->fifo_ctl
= cpu_to_le16(FIFOCTL_11B
);
863 else if (pkt_type
== PK_TYPE_11GB
)
864 tx_buffer_head
->fifo_ctl
= cpu_to_le16(FIFOCTL_11GB
);
865 else if (pkt_type
== PK_TYPE_11GA
)
866 tx_buffer_head
->fifo_ctl
= cpu_to_le16(FIFOCTL_11GA
);
868 if (!ieee80211_is_data(hdr
->frame_control
)) {
869 tx_buffer_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_GENINT
|
871 tx_buffer_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_TMOEN
);
873 tx_buffer_head
->time_stamp
=
874 cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us
);
876 tx_buffer_head
->time_stamp
=
877 cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us
);
880 if (!(info
->flags
& IEEE80211_TX_CTL_NO_ACK
)) {
881 tx_buffer_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_NEEDACK
);
882 tx_context
->need_ack
= true;
885 if (ieee80211_has_retry(hdr
->frame_control
))
886 tx_buffer_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_LRETRY
);
888 if (tx_rate
->flags
& IEEE80211_TX_RC_USE_SHORT_PREAMBLE
)
889 priv
->preamble_type
= PREAMBLE_SHORT
;
891 priv
->preamble_type
= PREAMBLE_LONG
;
893 if (tx_rate
->flags
& IEEE80211_TX_RC_USE_RTS_CTS
) {
895 tx_buffer_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_RTS
);
898 if (ieee80211_has_a4(hdr
->frame_control
))
899 tx_buffer_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_LHEAD
);
901 if (info
->flags
& IEEE80211_TX_CTL_NO_PS_BUFFER
)
904 tx_buffer_head
->frag_ctl
=
905 cpu_to_le16(ieee80211_get_hdrlen_from_skb(skb
) << 10);
907 if (info
->control
.hw_key
) {
908 tx_key
= info
->control
.hw_key
;
909 switch (info
->control
.hw_key
->cipher
) {
910 case WLAN_CIPHER_SUITE_WEP40
:
911 case WLAN_CIPHER_SUITE_WEP104
:
912 tx_buffer_head
->frag_ctl
|= cpu_to_le16(FRAGCTL_LEGACY
);
914 case WLAN_CIPHER_SUITE_TKIP
:
915 tx_buffer_head
->frag_ctl
|= cpu_to_le16(FRAGCTL_TKIP
);
917 case WLAN_CIPHER_SUITE_CCMP
:
918 tx_buffer_head
->frag_ctl
|= cpu_to_le16(FRAGCTL_AES
);
923 tx_context
->frame_len
+= tx_key
->icv_len
;
926 tx_buffer_head
->current_rate
= cpu_to_le16(current_rate
);
928 /* legacy rates TODO use ieee80211_tx_rate */
929 if (current_rate
>= RATE_18M
&& ieee80211_is_data(hdr
->frame_control
)) {
930 if (priv
->auto_fb_ctrl
== AUTO_FB_0
) {
931 tx_buffer_head
->fifo_ctl
|=
932 cpu_to_le16(FIFOCTL_AUTO_FB_0
);
935 vnt_fb_opt0
[FB_RATE0
][current_rate
- RATE_18M
];
937 vnt_fb_opt0
[FB_RATE1
][current_rate
- RATE_18M
];
939 fb_option
= AUTO_FB_0
;
940 } else if (priv
->auto_fb_ctrl
== AUTO_FB_1
) {
941 tx_buffer_head
->fifo_ctl
|=
942 cpu_to_le16(FIFOCTL_AUTO_FB_1
);
945 vnt_fb_opt1
[FB_RATE0
][current_rate
- RATE_18M
];
947 vnt_fb_opt1
[FB_RATE1
][current_rate
- RATE_18M
];
949 fb_option
= AUTO_FB_1
;
953 tx_context
->fb_option
= fb_option
;
955 duration_id
= vnt_generate_tx_parameter(tx_context
, tx_buffer
, &mic_hdr
,
958 tx_header_size
= tx_context
->tx_hdr_size
;
959 if (!tx_header_size
) {
960 tx_context
->in_use
= false;
964 tx_buffer_head
->frag_ctl
|= cpu_to_le16(FRAGCTL_NONFRAG
);
966 tx_bytes
= tx_header_size
+ tx_body_size
;
968 memcpy(tx_context
->hdr
, skb
->data
, tx_body_size
);
970 hdr
->duration_id
= cpu_to_le16(duration_id
);
972 if (info
->control
.hw_key
) {
973 tx_key
= info
->control
.hw_key
;
974 if (tx_key
->keylen
> 0)
975 vnt_fill_txkey(tx_context
, tx_buffer_head
->tx_key
,
976 tx_key
, skb
, tx_body_size
, mic_hdr
);
979 priv
->seq_counter
= (le16_to_cpu(hdr
->seq_ctrl
) &
980 IEEE80211_SCTL_SEQ
) >> 4;
982 tx_buffer
->tx_byte_count
= cpu_to_le16(tx_bytes
);
983 tx_buffer
->pkt_no
= tx_context
->pkt_no
;
984 tx_buffer
->type
= 0x00;
988 tx_context
->type
= CONTEXT_DATA_PACKET
;
989 tx_context
->buf_len
= tx_bytes
;
991 spin_lock_irqsave(&priv
->lock
, flags
);
993 if (vnt_tx_context(priv
, tx_context
) != STATUS_PENDING
) {
994 spin_unlock_irqrestore(&priv
->lock
, flags
);
998 spin_unlock_irqrestore(&priv
->lock
, flags
);
1003 static int vnt_beacon_xmit(struct vnt_private
*priv
, struct sk_buff
*skb
)
1005 struct vnt_beacon_buffer
*beacon_buffer
;
1006 struct vnt_tx_short_buf_head
*short_head
;
1007 struct ieee80211_tx_info
*info
;
1008 struct vnt_usb_send_context
*context
;
1009 struct ieee80211_mgmt
*mgmt_hdr
;
1010 unsigned long flags
;
1011 u32 frame_size
= skb
->len
+ 4;
1012 u16 current_rate
, count
;
1014 spin_lock_irqsave(&priv
->lock
, flags
);
1016 context
= vnt_get_free_context(priv
);
1018 dev_dbg(&priv
->usb
->dev
, "%s No free context!\n", __func__
);
1019 spin_unlock_irqrestore(&priv
->lock
, flags
);
1025 spin_unlock_irqrestore(&priv
->lock
, flags
);
1027 beacon_buffer
= (struct vnt_beacon_buffer
*)&context
->data
[0];
1028 short_head
= &beacon_buffer
->short_head
;
1030 if (priv
->bb_type
== BB_TYPE_11A
) {
1031 current_rate
= RATE_6M
;
1033 /* Get SignalField,ServiceField,Length */
1034 vnt_get_phy_field(priv
, frame_size
, current_rate
,
1035 PK_TYPE_11A
, &short_head
->ab
);
1037 /* Get Duration and TimeStampOff */
1038 short_head
->duration
= vnt_get_duration_le(priv
,
1039 PK_TYPE_11A
, false);
1040 short_head
->time_stamp_off
=
1041 vnt_time_stamp_off(priv
, current_rate
);
1043 current_rate
= RATE_1M
;
1044 short_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_11B
);
1046 /* Get SignalField,ServiceField,Length */
1047 vnt_get_phy_field(priv
, frame_size
, current_rate
,
1048 PK_TYPE_11B
, &short_head
->ab
);
1050 /* Get Duration and TimeStampOff */
1051 short_head
->duration
= vnt_get_duration_le(priv
,
1052 PK_TYPE_11B
, false);
1053 short_head
->time_stamp_off
=
1054 vnt_time_stamp_off(priv
, current_rate
);
1057 /* Generate Beacon Header */
1058 mgmt_hdr
= &beacon_buffer
->mgmt_hdr
;
1059 memcpy(mgmt_hdr
, skb
->data
, skb
->len
);
1061 /* time stamp always 0 */
1062 mgmt_hdr
->u
.beacon
.timestamp
= 0;
1064 info
= IEEE80211_SKB_CB(skb
);
1065 if (info
->flags
& IEEE80211_TX_CTL_ASSIGN_SEQ
) {
1066 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)mgmt_hdr
;
1068 hdr
->duration_id
= 0;
1069 hdr
->seq_ctrl
= cpu_to_le16(priv
->seq_counter
<< 4);
1072 priv
->seq_counter
++;
1073 if (priv
->seq_counter
> 0x0fff)
1074 priv
->seq_counter
= 0;
1076 count
= sizeof(struct vnt_tx_short_buf_head
) + skb
->len
;
1078 beacon_buffer
->tx_byte_count
= cpu_to_le16(count
);
1079 beacon_buffer
->pkt_no
= context
->pkt_no
;
1080 beacon_buffer
->type
= 0x01;
1082 context
->type
= CONTEXT_BEACON_PACKET
;
1083 context
->buf_len
= count
+ 4; /* USB header */
1085 spin_lock_irqsave(&priv
->lock
, flags
);
1087 if (vnt_tx_context(priv
, context
) != STATUS_PENDING
)
1088 ieee80211_free_txskb(priv
->hw
, context
->skb
);
1090 spin_unlock_irqrestore(&priv
->lock
, flags
);
1095 int vnt_beacon_make(struct vnt_private
*priv
, struct ieee80211_vif
*vif
)
1097 struct sk_buff
*beacon
;
1099 beacon
= ieee80211_beacon_get(priv
->hw
, vif
);
1103 if (vnt_beacon_xmit(priv
, beacon
)) {
1104 ieee80211_free_txskb(priv
->hw
, beacon
);
1111 int vnt_beacon_enable(struct vnt_private
*priv
, struct ieee80211_vif
*vif
,
1112 struct ieee80211_bss_conf
*conf
)
1114 vnt_mac_reg_bits_off(priv
, MAC_REG_TCR
, TCR_AUTOBCNTX
);
1116 vnt_mac_reg_bits_off(priv
, MAC_REG_TFTCTL
, TFTCTL_TSFCNTREN
);
1118 vnt_mac_set_beacon_interval(priv
, conf
->beacon_int
);
1120 vnt_clear_current_tsf(priv
);
1122 vnt_mac_reg_bits_on(priv
, MAC_REG_TFTCTL
, TFTCTL_TSFCNTREN
);
1124 vnt_reset_next_tbtt(priv
, conf
->beacon_int
);
1126 return vnt_beacon_make(priv
, vif
);