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
,
145 u8 rsv_type
, u8 pkt_type
, u32 frame_length
, u16 current_rate
)
147 u32 rrv_time
, rts_time
, cts_time
, ack_time
, data_time
;
149 rrv_time
= rts_time
= cts_time
= ack_time
= data_time
= 0;
151 data_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
152 frame_length
, current_rate
);
155 rts_time
= vnt_get_frame_time(priv
->preamble_type
,
156 pkt_type
, 20, priv
->top_cck_basic_rate
);
157 cts_time
= ack_time
= vnt_get_frame_time(priv
->preamble_type
,
158 pkt_type
, 14, priv
->top_cck_basic_rate
);
159 } else if (rsv_type
== 1) {
160 rts_time
= vnt_get_frame_time(priv
->preamble_type
,
161 pkt_type
, 20, priv
->top_cck_basic_rate
);
162 cts_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
163 14, priv
->top_cck_basic_rate
);
164 ack_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
165 14, priv
->top_ofdm_basic_rate
);
166 } else if (rsv_type
== 2) {
167 rts_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
168 20, priv
->top_ofdm_basic_rate
);
169 cts_time
= ack_time
= vnt_get_frame_time(priv
->preamble_type
,
170 pkt_type
, 14, priv
->top_ofdm_basic_rate
);
171 } else if (rsv_type
== 3) {
172 cts_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
173 14, priv
->top_cck_basic_rate
);
174 ack_time
= vnt_get_frame_time(priv
->preamble_type
, pkt_type
,
175 14, priv
->top_ofdm_basic_rate
);
177 rrv_time
= cts_time
+ ack_time
+ data_time
+ 2 * priv
->sifs
;
179 return cpu_to_le16((u16
)rrv_time
);
182 rrv_time
= rts_time
+ cts_time
+ ack_time
+ data_time
+ 3 * priv
->sifs
;
184 return cpu_to_le16((u16
)rrv_time
);
187 static __le16
vnt_get_duration_le(struct vnt_private
*priv
,
188 u8 pkt_type
, int need_ack
)
193 if (pkt_type
== PK_TYPE_11B
)
194 ack_time
= vnt_get_frame_time(priv
->preamble_type
,
195 pkt_type
, 14, priv
->top_cck_basic_rate
);
197 ack_time
= vnt_get_frame_time(priv
->preamble_type
,
198 pkt_type
, 14, priv
->top_ofdm_basic_rate
);
200 return cpu_to_le16((u16
)(priv
->sifs
+ ack_time
));
206 static __le16
vnt_get_rtscts_duration_le(struct vnt_usb_send_context
*context
,
207 u8 dur_type
, u8 pkt_type
, u16 rate
)
209 struct vnt_private
*priv
= context
->priv
;
210 u32 cts_time
= 0, dur_time
= 0;
211 u32 frame_length
= context
->frame_len
;
212 u8 need_ack
= context
->need_ack
;
219 cts_time
= vnt_get_frame_time(priv
->preamble_type
,
220 pkt_type
, 14, priv
->top_cck_basic_rate
);
221 dur_time
= cts_time
+ 2 * priv
->sifs
+
222 vnt_get_rsvtime(priv
, pkt_type
,
223 frame_length
, rate
, need_ack
);
229 cts_time
= vnt_get_frame_time(priv
->preamble_type
,
230 pkt_type
, 14, priv
->top_ofdm_basic_rate
);
231 dur_time
= cts_time
+ 2 * priv
->sifs
+
232 vnt_get_rsvtime(priv
, pkt_type
,
233 frame_length
, rate
, need_ack
);
239 dur_time
= priv
->sifs
+ vnt_get_rsvtime(priv
,
240 pkt_type
, frame_length
, rate
, need_ack
);
247 return cpu_to_le16((u16
)dur_time
);
250 static u16
vnt_mac_hdr_pos(struct vnt_usb_send_context
*tx_context
,
251 struct ieee80211_hdr
*hdr
)
253 u8
*head
= tx_context
->data
+ offsetof(struct vnt_tx_buffer
, fifo_head
);
254 u8
*hdr_pos
= (u8
*)hdr
;
256 tx_context
->hdr
= hdr
;
257 if (!tx_context
->hdr
)
260 return (u16
)(hdr_pos
- head
);
263 static u16
vnt_rxtx_datahead_g(struct vnt_usb_send_context
*tx_context
,
264 struct vnt_tx_datahead_g
*buf
)
267 struct vnt_private
*priv
= tx_context
->priv
;
268 struct ieee80211_hdr
*hdr
=
269 (struct ieee80211_hdr
*)tx_context
->skb
->data
;
270 u32 frame_len
= tx_context
->frame_len
;
271 u16 rate
= tx_context
->tx_rate
;
272 u8 need_ack
= tx_context
->need_ack
;
274 /* Get SignalField,ServiceField,Length */
275 vnt_get_phy_field(priv
, frame_len
, rate
, tx_context
->pkt_type
, &buf
->a
);
276 vnt_get_phy_field(priv
, frame_len
, priv
->top_cck_basic_rate
,
277 PK_TYPE_11B
, &buf
->b
);
279 /* Get Duration and TimeStamp */
280 if (ieee80211_is_pspoll(hdr
->frame_control
)) {
281 __le16 dur
= cpu_to_le16(priv
->current_aid
| BIT(14) | BIT(15));
283 buf
->duration_a
= dur
;
284 buf
->duration_b
= dur
;
286 buf
->duration_a
= vnt_get_duration_le(priv
,
287 tx_context
->pkt_type
, need_ack
);
288 buf
->duration_b
= vnt_get_duration_le(priv
,
289 PK_TYPE_11B
, need_ack
);
292 buf
->time_stamp_off_a
= vnt_time_stamp_off(priv
, rate
);
293 buf
->time_stamp_off_b
= vnt_time_stamp_off(priv
,
294 priv
->top_cck_basic_rate
);
296 tx_context
->tx_hdr_size
= vnt_mac_hdr_pos(tx_context
, &buf
->hdr
);
298 return le16_to_cpu(buf
->duration_a
);
301 static u16
vnt_rxtx_datahead_g_fb(struct vnt_usb_send_context
*tx_context
,
302 struct vnt_tx_datahead_g_fb
*buf
)
304 struct vnt_private
*priv
= tx_context
->priv
;
305 u32 frame_len
= tx_context
->frame_len
;
306 u16 rate
= tx_context
->tx_rate
;
307 u8 need_ack
= tx_context
->need_ack
;
309 /* Get SignalField,ServiceField,Length */
310 vnt_get_phy_field(priv
, frame_len
, rate
, tx_context
->pkt_type
, &buf
->a
);
312 vnt_get_phy_field(priv
, frame_len
, priv
->top_cck_basic_rate
,
313 PK_TYPE_11B
, &buf
->b
);
315 /* Get Duration and TimeStamp */
316 buf
->duration_a
= vnt_get_duration_le(priv
, tx_context
->pkt_type
,
318 buf
->duration_b
= vnt_get_duration_le(priv
, PK_TYPE_11B
, need_ack
);
320 buf
->duration_a_f0
= vnt_get_duration_le(priv
, tx_context
->pkt_type
,
322 buf
->duration_a_f1
= vnt_get_duration_le(priv
, tx_context
->pkt_type
,
325 buf
->time_stamp_off_a
= vnt_time_stamp_off(priv
, rate
);
326 buf
->time_stamp_off_b
= vnt_time_stamp_off(priv
,
327 priv
->top_cck_basic_rate
);
329 tx_context
->tx_hdr_size
= vnt_mac_hdr_pos(tx_context
, &buf
->hdr
);
331 return le16_to_cpu(buf
->duration_a
);
334 static u16
vnt_rxtx_datahead_a_fb(struct vnt_usb_send_context
*tx_context
,
335 struct vnt_tx_datahead_a_fb
*buf
)
337 struct vnt_private
*priv
= tx_context
->priv
;
338 u16 rate
= tx_context
->tx_rate
;
339 u8 pkt_type
= tx_context
->pkt_type
;
340 u8 need_ack
= tx_context
->need_ack
;
341 u32 frame_len
= tx_context
->frame_len
;
343 /* Get SignalField,ServiceField,Length */
344 vnt_get_phy_field(priv
, frame_len
, rate
, pkt_type
, &buf
->a
);
345 /* Get Duration and TimeStampOff */
346 buf
->duration
= vnt_get_duration_le(priv
, pkt_type
, need_ack
);
348 buf
->duration_f0
= vnt_get_duration_le(priv
, pkt_type
, need_ack
);
349 buf
->duration_f1
= vnt_get_duration_le(priv
, pkt_type
, need_ack
);
351 buf
->time_stamp_off
= vnt_time_stamp_off(priv
, rate
);
353 tx_context
->tx_hdr_size
= vnt_mac_hdr_pos(tx_context
, &buf
->hdr
);
355 return le16_to_cpu(buf
->duration
);
358 static u16
vnt_rxtx_datahead_ab(struct vnt_usb_send_context
*tx_context
,
359 struct vnt_tx_datahead_ab
*buf
)
361 struct vnt_private
*priv
= tx_context
->priv
;
362 struct ieee80211_hdr
*hdr
=
363 (struct ieee80211_hdr
*)tx_context
->skb
->data
;
364 u32 frame_len
= tx_context
->frame_len
;
365 u16 rate
= tx_context
->tx_rate
;
366 u8 need_ack
= tx_context
->need_ack
;
368 /* Get SignalField,ServiceField,Length */
369 vnt_get_phy_field(priv
, frame_len
, rate
,
370 tx_context
->pkt_type
, &buf
->ab
);
372 /* Get Duration and TimeStampOff */
373 if (ieee80211_is_pspoll(hdr
->frame_control
)) {
374 __le16 dur
= cpu_to_le16(priv
->current_aid
| BIT(14) | BIT(15));
378 buf
->duration
= vnt_get_duration_le(priv
, tx_context
->pkt_type
,
382 buf
->time_stamp_off
= vnt_time_stamp_off(priv
, rate
);
384 tx_context
->tx_hdr_size
= vnt_mac_hdr_pos(tx_context
, &buf
->hdr
);
386 return le16_to_cpu(buf
->duration
);
389 static int vnt_fill_ieee80211_rts(struct vnt_usb_send_context
*tx_context
,
390 struct ieee80211_rts
*rts
, __le16 duration
)
392 struct ieee80211_hdr
*hdr
=
393 (struct ieee80211_hdr
*)tx_context
->skb
->data
;
395 rts
->duration
= duration
;
397 cpu_to_le16(IEEE80211_FTYPE_CTL
| IEEE80211_STYPE_RTS
);
399 ether_addr_copy(rts
->ra
, hdr
->addr1
);
400 ether_addr_copy(rts
->ta
, hdr
->addr2
);
405 static u16
vnt_rxtx_rts_g_head(struct vnt_usb_send_context
*tx_context
,
406 struct vnt_rts_g
*buf
)
408 struct vnt_private
*priv
= tx_context
->priv
;
409 u16 rts_frame_len
= 20;
410 u16 current_rate
= tx_context
->tx_rate
;
412 vnt_get_phy_field(priv
, rts_frame_len
, priv
->top_cck_basic_rate
,
413 PK_TYPE_11B
, &buf
->b
);
414 vnt_get_phy_field(priv
, rts_frame_len
, priv
->top_ofdm_basic_rate
,
415 tx_context
->pkt_type
, &buf
->a
);
417 buf
->duration_bb
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_BB
,
419 priv
->top_cck_basic_rate
);
420 buf
->duration_aa
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA
,
421 tx_context
->pkt_type
,
423 buf
->duration_ba
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_BA
,
424 tx_context
->pkt_type
,
427 vnt_fill_ieee80211_rts(tx_context
, &buf
->data
, buf
->duration_aa
);
429 return vnt_rxtx_datahead_g(tx_context
, &buf
->data_head
);
432 static u16
vnt_rxtx_rts_g_fb_head(struct vnt_usb_send_context
*tx_context
,
433 struct vnt_rts_g_fb
*buf
)
435 struct vnt_private
*priv
= tx_context
->priv
;
436 u16 current_rate
= tx_context
->tx_rate
;
437 u16 rts_frame_len
= 20;
439 vnt_get_phy_field(priv
, rts_frame_len
, priv
->top_cck_basic_rate
,
440 PK_TYPE_11B
, &buf
->b
);
441 vnt_get_phy_field(priv
, rts_frame_len
, priv
->top_ofdm_basic_rate
,
442 tx_context
->pkt_type
, &buf
->a
);
444 buf
->duration_bb
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_BB
,
446 priv
->top_cck_basic_rate
);
447 buf
->duration_aa
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA
,
448 tx_context
->pkt_type
,
450 buf
->duration_ba
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_BA
,
451 tx_context
->pkt_type
,
454 buf
->rts_duration_ba_f0
=
455 vnt_get_rtscts_duration_le(tx_context
, RTSDUR_BA_F0
,
456 tx_context
->pkt_type
,
458 buf
->rts_duration_aa_f0
=
459 vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA_F0
,
460 tx_context
->pkt_type
,
462 buf
->rts_duration_ba_f1
=
463 vnt_get_rtscts_duration_le(tx_context
, RTSDUR_BA_F1
,
464 tx_context
->pkt_type
,
466 buf
->rts_duration_aa_f1
=
467 vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA_F1
,
468 tx_context
->pkt_type
,
471 vnt_fill_ieee80211_rts(tx_context
, &buf
->data
, buf
->duration_aa
);
473 return vnt_rxtx_datahead_g_fb(tx_context
, &buf
->data_head
);
476 static u16
vnt_rxtx_rts_ab_head(struct vnt_usb_send_context
*tx_context
,
477 struct vnt_rts_ab
*buf
)
479 struct vnt_private
*priv
= tx_context
->priv
;
480 u16 current_rate
= tx_context
->tx_rate
;
481 u16 rts_frame_len
= 20;
483 vnt_get_phy_field(priv
, rts_frame_len
, priv
->top_ofdm_basic_rate
,
484 tx_context
->pkt_type
, &buf
->ab
);
486 buf
->duration
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA
,
487 tx_context
->pkt_type
,
490 vnt_fill_ieee80211_rts(tx_context
, &buf
->data
, buf
->duration
);
492 return vnt_rxtx_datahead_ab(tx_context
, &buf
->data_head
);
495 static u16
vnt_rxtx_rts_a_fb_head(struct vnt_usb_send_context
*tx_context
,
496 struct vnt_rts_a_fb
*buf
)
498 struct vnt_private
*priv
= tx_context
->priv
;
499 u16 current_rate
= tx_context
->tx_rate
;
500 u16 rts_frame_len
= 20;
502 vnt_get_phy_field(priv
, rts_frame_len
,
503 priv
->top_ofdm_basic_rate
, tx_context
->pkt_type
, &buf
->a
);
505 buf
->duration
= vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA
,
506 tx_context
->pkt_type
,
509 buf
->rts_duration_f0
=
510 vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA_F0
,
511 tx_context
->pkt_type
,
514 buf
->rts_duration_f1
=
515 vnt_get_rtscts_duration_le(tx_context
, RTSDUR_AA_F1
,
516 tx_context
->pkt_type
,
519 vnt_fill_ieee80211_rts(tx_context
, &buf
->data
, buf
->duration
);
521 return vnt_rxtx_datahead_a_fb(tx_context
, &buf
->data_head
);
524 static u16
vnt_fill_cts_fb_head(struct vnt_usb_send_context
*tx_context
,
525 union vnt_tx_data_head
*head
)
527 struct vnt_private
*priv
= tx_context
->priv
;
528 struct vnt_cts_fb
*buf
= &head
->cts_g_fb
;
529 u32 cts_frame_len
= 14;
530 u16 current_rate
= tx_context
->tx_rate
;
532 /* Get SignalField,ServiceField,Length */
533 vnt_get_phy_field(priv
, cts_frame_len
, priv
->top_cck_basic_rate
,
534 PK_TYPE_11B
, &buf
->b
);
537 vnt_get_rtscts_duration_le(tx_context
, CTSDUR_BA
,
538 tx_context
->pkt_type
,
540 /* Get CTSDuration_ba_f0 */
541 buf
->cts_duration_ba_f0
=
542 vnt_get_rtscts_duration_le(tx_context
, CTSDUR_BA_F0
,
543 tx_context
->pkt_type
,
545 /* Get CTSDuration_ba_f1 */
546 buf
->cts_duration_ba_f1
=
547 vnt_get_rtscts_duration_le(tx_context
, CTSDUR_BA_F1
,
548 tx_context
->pkt_type
,
550 /* Get CTS Frame body */
551 buf
->data
.duration
= buf
->duration_ba
;
552 buf
->data
.frame_control
=
553 cpu_to_le16(IEEE80211_FTYPE_CTL
| IEEE80211_STYPE_CTS
);
555 ether_addr_copy(buf
->data
.ra
, priv
->current_net_addr
);
557 return vnt_rxtx_datahead_g_fb(tx_context
, &buf
->data_head
);
560 static u16
vnt_fill_cts_head(struct vnt_usb_send_context
*tx_context
,
561 union vnt_tx_data_head
*head
)
563 struct vnt_private
*priv
= tx_context
->priv
;
564 struct vnt_cts
*buf
= &head
->cts_g
;
565 u32 cts_frame_len
= 14;
566 u16 current_rate
= tx_context
->tx_rate
;
568 /* Get SignalField,ServiceField,Length */
569 vnt_get_phy_field(priv
, cts_frame_len
, priv
->top_cck_basic_rate
,
570 PK_TYPE_11B
, &buf
->b
);
571 /* Get CTSDuration_ba */
573 vnt_get_rtscts_duration_le(tx_context
, CTSDUR_BA
,
574 tx_context
->pkt_type
,
576 /*Get CTS Frame body*/
577 buf
->data
.duration
= buf
->duration_ba
;
578 buf
->data
.frame_control
=
579 cpu_to_le16(IEEE80211_FTYPE_CTL
| IEEE80211_STYPE_CTS
);
581 ether_addr_copy(buf
->data
.ra
, priv
->current_net_addr
);
583 return vnt_rxtx_datahead_g(tx_context
, &buf
->data_head
);
586 static u16
vnt_rxtx_rts(struct vnt_usb_send_context
*tx_context
,
587 union vnt_tx_head
*tx_head
, bool need_mic
)
589 struct vnt_private
*priv
= tx_context
->priv
;
590 struct vnt_rrv_time_rts
*buf
= &tx_head
->tx_rts
.rts
;
591 union vnt_tx_data_head
*head
= &tx_head
->tx_rts
.tx
.head
;
592 u32 frame_len
= tx_context
->frame_len
;
593 u16 current_rate
= tx_context
->tx_rate
;
594 u8 need_ack
= tx_context
->need_ack
;
596 buf
->rts_rrv_time_aa
= vnt_get_rtscts_rsvtime_le(priv
, 2,
597 tx_context
->pkt_type
, frame_len
, current_rate
);
598 buf
->rts_rrv_time_ba
= vnt_get_rtscts_rsvtime_le(priv
, 1,
599 tx_context
->pkt_type
, frame_len
, current_rate
);
600 buf
->rts_rrv_time_bb
= vnt_get_rtscts_rsvtime_le(priv
, 0,
601 tx_context
->pkt_type
, frame_len
, current_rate
);
603 buf
->rrv_time_a
= vnt_rxtx_rsvtime_le16(priv
, tx_context
->pkt_type
,
604 frame_len
, current_rate
,
606 buf
->rrv_time_b
= vnt_rxtx_rsvtime_le16(priv
, PK_TYPE_11B
, frame_len
,
607 priv
->top_cck_basic_rate
, need_ack
);
610 head
= &tx_head
->tx_rts
.tx
.mic
.head
;
612 if (tx_context
->fb_option
)
613 return vnt_rxtx_rts_g_fb_head(tx_context
, &head
->rts_g_fb
);
615 return vnt_rxtx_rts_g_head(tx_context
, &head
->rts_g
);
618 static u16
vnt_rxtx_cts(struct vnt_usb_send_context
*tx_context
,
619 union vnt_tx_head
*tx_head
, bool need_mic
)
621 struct vnt_private
*priv
= tx_context
->priv
;
622 struct vnt_rrv_time_cts
*buf
= &tx_head
->tx_cts
.cts
;
623 union vnt_tx_data_head
*head
= &tx_head
->tx_cts
.tx
.head
;
624 u32 frame_len
= tx_context
->frame_len
;
625 u16 current_rate
= tx_context
->tx_rate
;
626 u8 need_ack
= tx_context
->need_ack
;
628 buf
->rrv_time_a
= vnt_rxtx_rsvtime_le16(priv
, tx_context
->pkt_type
,
629 frame_len
, current_rate
, need_ack
);
630 buf
->rrv_time_b
= vnt_rxtx_rsvtime_le16(priv
, PK_TYPE_11B
,
631 frame_len
, priv
->top_cck_basic_rate
, need_ack
);
633 buf
->cts_rrv_time_ba
= vnt_get_rtscts_rsvtime_le(priv
, 3,
634 tx_context
->pkt_type
, frame_len
, current_rate
);
637 head
= &tx_head
->tx_cts
.tx
.mic
.head
;
640 if (tx_context
->fb_option
)
641 return vnt_fill_cts_fb_head(tx_context
, head
);
643 return vnt_fill_cts_head(tx_context
, head
);
646 static u16
vnt_rxtx_ab(struct vnt_usb_send_context
*tx_context
,
647 union vnt_tx_head
*tx_head
, bool need_rts
, bool need_mic
)
649 struct vnt_private
*priv
= tx_context
->priv
;
650 struct vnt_rrv_time_ab
*buf
= &tx_head
->tx_ab
.ab
;
651 union vnt_tx_data_head
*head
= &tx_head
->tx_ab
.tx
.head
;
652 u32 frame_len
= tx_context
->frame_len
;
653 u16 current_rate
= tx_context
->tx_rate
;
654 u8 need_ack
= tx_context
->need_ack
;
656 buf
->rrv_time
= vnt_rxtx_rsvtime_le16(priv
, tx_context
->pkt_type
,
657 frame_len
, current_rate
, need_ack
);
660 head
= &tx_head
->tx_ab
.tx
.mic
.head
;
663 if (tx_context
->pkt_type
== PK_TYPE_11B
)
664 buf
->rts_rrv_time
= vnt_get_rtscts_rsvtime_le(priv
, 0,
665 tx_context
->pkt_type
, frame_len
, current_rate
);
666 else /* PK_TYPE_11A */
667 buf
->rts_rrv_time
= vnt_get_rtscts_rsvtime_le(priv
, 2,
668 tx_context
->pkt_type
, frame_len
, current_rate
);
670 if (tx_context
->fb_option
&&
671 tx_context
->pkt_type
== PK_TYPE_11A
)
672 return vnt_rxtx_rts_a_fb_head(tx_context
,
675 return vnt_rxtx_rts_ab_head(tx_context
, &head
->rts_ab
);
678 if (tx_context
->pkt_type
== PK_TYPE_11A
)
679 return vnt_rxtx_datahead_a_fb(tx_context
,
680 &head
->data_head_a_fb
);
682 return vnt_rxtx_datahead_ab(tx_context
, &head
->data_head_ab
);
685 static u16
vnt_generate_tx_parameter(struct vnt_usb_send_context
*tx_context
,
686 struct vnt_tx_buffer
*tx_buffer
,
687 struct vnt_mic_hdr
**mic_hdr
, u32 need_mic
,
691 if (tx_context
->pkt_type
== PK_TYPE_11GB
||
692 tx_context
->pkt_type
== PK_TYPE_11GA
) {
695 *mic_hdr
= &tx_buffer
->
696 tx_head
.tx_rts
.tx
.mic
.hdr
;
698 return vnt_rxtx_rts(tx_context
, &tx_buffer
->tx_head
,
703 *mic_hdr
= &tx_buffer
->tx_head
.tx_cts
.tx
.mic
.hdr
;
705 return vnt_rxtx_cts(tx_context
, &tx_buffer
->tx_head
, need_mic
);
709 *mic_hdr
= &tx_buffer
->tx_head
.tx_ab
.tx
.mic
.hdr
;
711 return vnt_rxtx_ab(tx_context
, &tx_buffer
->tx_head
, need_rts
, need_mic
);
714 static void vnt_fill_txkey(struct vnt_usb_send_context
*tx_context
,
715 u8
*key_buffer
, struct ieee80211_key_conf
*tx_key
, struct sk_buff
*skb
,
716 u16 payload_len
, struct vnt_mic_hdr
*mic_hdr
)
718 struct ieee80211_hdr
*hdr
= tx_context
->hdr
;
720 u8
*iv
= ((u8
*)hdr
+ ieee80211_get_hdrlen_from_skb(skb
));
722 /* strip header and icv len from payload */
723 payload_len
-= ieee80211_get_hdrlen_from_skb(skb
);
724 payload_len
-= tx_key
->icv_len
;
726 switch (tx_key
->cipher
) {
727 case WLAN_CIPHER_SUITE_WEP40
:
728 case WLAN_CIPHER_SUITE_WEP104
:
729 memcpy(key_buffer
, iv
, 3);
730 memcpy(key_buffer
+ 3, tx_key
->key
, tx_key
->keylen
);
732 if (tx_key
->keylen
== WLAN_KEY_LEN_WEP40
) {
733 memcpy(key_buffer
+ 8, iv
, 3);
734 memcpy(key_buffer
+ 11,
735 tx_key
->key
, WLAN_KEY_LEN_WEP40
);
739 case WLAN_CIPHER_SUITE_TKIP
:
740 ieee80211_get_tkip_p2k(tx_key
, skb
, key_buffer
);
743 case WLAN_CIPHER_SUITE_CCMP
:
749 mic_hdr
->payload_len
= cpu_to_be16(payload_len
);
750 ether_addr_copy(mic_hdr
->mic_addr2
, hdr
->addr2
);
752 pn64
= atomic64_read(&tx_key
->tx_pn
);
753 mic_hdr
->ccmp_pn
[5] = pn64
;
754 mic_hdr
->ccmp_pn
[4] = pn64
>> 8;
755 mic_hdr
->ccmp_pn
[3] = pn64
>> 16;
756 mic_hdr
->ccmp_pn
[2] = pn64
>> 24;
757 mic_hdr
->ccmp_pn
[1] = pn64
>> 32;
758 mic_hdr
->ccmp_pn
[0] = pn64
>> 40;
760 if (ieee80211_has_a4(hdr
->frame_control
))
761 mic_hdr
->hlen
= cpu_to_be16(28);
763 mic_hdr
->hlen
= cpu_to_be16(22);
765 ether_addr_copy(mic_hdr
->addr1
, hdr
->addr1
);
766 ether_addr_copy(mic_hdr
->addr2
, hdr
->addr2
);
767 ether_addr_copy(mic_hdr
->addr3
, hdr
->addr3
);
769 mic_hdr
->frame_control
= cpu_to_le16(
770 le16_to_cpu(hdr
->frame_control
) & 0xc78f);
771 mic_hdr
->seq_ctrl
= cpu_to_le16(
772 le16_to_cpu(hdr
->seq_ctrl
) & 0xf);
774 if (ieee80211_has_a4(hdr
->frame_control
))
775 ether_addr_copy(mic_hdr
->addr4
, hdr
->addr4
);
778 memcpy(key_buffer
, tx_key
->key
, WLAN_KEY_LEN_CCMP
);
787 int vnt_tx_packet(struct vnt_private
*priv
, struct sk_buff
*skb
)
789 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
790 struct ieee80211_tx_rate
*tx_rate
= &info
->control
.rates
[0];
791 struct ieee80211_rate
*rate
;
792 struct ieee80211_key_conf
*tx_key
;
793 struct ieee80211_hdr
*hdr
;
794 struct vnt_mic_hdr
*mic_hdr
= NULL
;
795 struct vnt_tx_buffer
*tx_buffer
;
796 struct vnt_tx_fifo_head
*tx_buffer_head
;
797 struct vnt_usb_send_context
*tx_context
;
799 u16 tx_bytes
, tx_header_size
, tx_body_size
, current_rate
, duration_id
;
800 u8 pkt_type
, fb_option
= AUTO_FB_NONE
;
801 bool need_rts
= false, is_pspoll
= false;
802 bool need_mic
= false;
804 hdr
= (struct ieee80211_hdr
*)(skb
->data
);
806 rate
= ieee80211_get_tx_rate(priv
->hw
, info
);
808 current_rate
= rate
->hw_value
;
809 if (priv
->current_rate
!= current_rate
&&
810 !(priv
->hw
->conf
.flags
& IEEE80211_CONF_OFFCHANNEL
)) {
811 priv
->current_rate
= current_rate
;
812 vnt_schedule_command(priv
, WLAN_CMD_SETPOWER
);
815 if (current_rate
> RATE_11M
) {
816 if (info
->band
== NL80211_BAND_5GHZ
) {
817 pkt_type
= PK_TYPE_11A
;
819 if (tx_rate
->flags
& IEEE80211_TX_RC_USE_CTS_PROTECT
)
820 pkt_type
= PK_TYPE_11GB
;
822 pkt_type
= PK_TYPE_11GA
;
825 pkt_type
= PK_TYPE_11B
;
828 spin_lock_irqsave(&priv
->lock
, flags
);
830 tx_context
= vnt_get_free_context(priv
);
832 dev_dbg(&priv
->usb
->dev
, "%s No free context\n", __func__
);
833 spin_unlock_irqrestore(&priv
->lock
, flags
);
837 tx_context
->skb
= skb
;
838 tx_context
->pkt_type
= pkt_type
;
839 tx_context
->need_ack
= false;
840 tx_context
->frame_len
= skb
->len
+ 4;
841 tx_context
->tx_rate
= current_rate
;
843 spin_unlock_irqrestore(&priv
->lock
, flags
);
845 tx_buffer
= (struct vnt_tx_buffer
*)tx_context
->data
;
846 tx_buffer_head
= &tx_buffer
->fifo_head
;
847 tx_body_size
= skb
->len
;
849 /*Set fifo controls */
850 if (pkt_type
== PK_TYPE_11A
)
851 tx_buffer_head
->fifo_ctl
= 0;
852 else if (pkt_type
== PK_TYPE_11B
)
853 tx_buffer_head
->fifo_ctl
= cpu_to_le16(FIFOCTL_11B
);
854 else if (pkt_type
== PK_TYPE_11GB
)
855 tx_buffer_head
->fifo_ctl
= cpu_to_le16(FIFOCTL_11GB
);
856 else if (pkt_type
== PK_TYPE_11GA
)
857 tx_buffer_head
->fifo_ctl
= cpu_to_le16(FIFOCTL_11GA
);
859 if (!ieee80211_is_data(hdr
->frame_control
)) {
860 tx_buffer_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_GENINT
|
862 tx_buffer_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_TMOEN
);
864 tx_buffer_head
->time_stamp
=
865 cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us
);
867 tx_buffer_head
->time_stamp
=
868 cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us
);
871 if (!(info
->flags
& IEEE80211_TX_CTL_NO_ACK
)) {
872 tx_buffer_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_NEEDACK
);
873 tx_context
->need_ack
= true;
876 if (ieee80211_has_retry(hdr
->frame_control
))
877 tx_buffer_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_LRETRY
);
879 if (tx_rate
->flags
& IEEE80211_TX_RC_USE_SHORT_PREAMBLE
)
880 priv
->preamble_type
= PREAMBLE_SHORT
;
882 priv
->preamble_type
= PREAMBLE_LONG
;
884 if (tx_rate
->flags
& IEEE80211_TX_RC_USE_RTS_CTS
) {
886 tx_buffer_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_RTS
);
889 if (ieee80211_has_a4(hdr
->frame_control
))
890 tx_buffer_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_LHEAD
);
892 if (info
->flags
& IEEE80211_TX_CTL_NO_PS_BUFFER
)
895 tx_buffer_head
->frag_ctl
=
896 cpu_to_le16(ieee80211_get_hdrlen_from_skb(skb
) << 10);
898 if (info
->control
.hw_key
) {
899 tx_key
= info
->control
.hw_key
;
900 switch (info
->control
.hw_key
->cipher
) {
901 case WLAN_CIPHER_SUITE_WEP40
:
902 case WLAN_CIPHER_SUITE_WEP104
:
903 tx_buffer_head
->frag_ctl
|= cpu_to_le16(FRAGCTL_LEGACY
);
905 case WLAN_CIPHER_SUITE_TKIP
:
906 tx_buffer_head
->frag_ctl
|= cpu_to_le16(FRAGCTL_TKIP
);
908 case WLAN_CIPHER_SUITE_CCMP
:
909 tx_buffer_head
->frag_ctl
|= cpu_to_le16(FRAGCTL_AES
);
914 tx_context
->frame_len
+= tx_key
->icv_len
;
917 tx_buffer_head
->current_rate
= cpu_to_le16(current_rate
);
919 /* legacy rates TODO use ieee80211_tx_rate */
920 if (current_rate
>= RATE_18M
&& ieee80211_is_data(hdr
->frame_control
)) {
921 if (priv
->auto_fb_ctrl
== AUTO_FB_0
) {
922 tx_buffer_head
->fifo_ctl
|=
923 cpu_to_le16(FIFOCTL_AUTO_FB_0
);
926 vnt_fb_opt0
[FB_RATE0
][current_rate
- RATE_18M
];
928 vnt_fb_opt0
[FB_RATE1
][current_rate
- RATE_18M
];
930 fb_option
= AUTO_FB_0
;
931 } else if (priv
->auto_fb_ctrl
== AUTO_FB_1
) {
932 tx_buffer_head
->fifo_ctl
|=
933 cpu_to_le16(FIFOCTL_AUTO_FB_1
);
936 vnt_fb_opt1
[FB_RATE0
][current_rate
- RATE_18M
];
938 vnt_fb_opt1
[FB_RATE1
][current_rate
- RATE_18M
];
940 fb_option
= AUTO_FB_1
;
944 tx_context
->fb_option
= fb_option
;
946 duration_id
= vnt_generate_tx_parameter(tx_context
, tx_buffer
, &mic_hdr
,
949 tx_header_size
= tx_context
->tx_hdr_size
;
950 if (!tx_header_size
) {
951 tx_context
->in_use
= false;
955 tx_buffer_head
->frag_ctl
|= cpu_to_le16(FRAGCTL_NONFRAG
);
957 tx_bytes
= tx_header_size
+ tx_body_size
;
959 memcpy(tx_context
->hdr
, skb
->data
, tx_body_size
);
961 hdr
->duration_id
= cpu_to_le16(duration_id
);
963 if (info
->control
.hw_key
) {
964 tx_key
= info
->control
.hw_key
;
965 if (tx_key
->keylen
> 0)
966 vnt_fill_txkey(tx_context
, tx_buffer_head
->tx_key
,
967 tx_key
, skb
, tx_body_size
, mic_hdr
);
970 priv
->seq_counter
= (le16_to_cpu(hdr
->seq_ctrl
) &
971 IEEE80211_SCTL_SEQ
) >> 4;
973 tx_buffer
->tx_byte_count
= cpu_to_le16(tx_bytes
);
974 tx_buffer
->pkt_no
= tx_context
->pkt_no
;
975 tx_buffer
->type
= 0x00;
979 tx_context
->type
= CONTEXT_DATA_PACKET
;
980 tx_context
->buf_len
= tx_bytes
;
982 spin_lock_irqsave(&priv
->lock
, flags
);
984 if (vnt_tx_context(priv
, tx_context
) != STATUS_PENDING
) {
985 spin_unlock_irqrestore(&priv
->lock
, flags
);
989 spin_unlock_irqrestore(&priv
->lock
, flags
);
994 static int vnt_beacon_xmit(struct vnt_private
*priv
,
997 struct vnt_beacon_buffer
*beacon_buffer
;
998 struct vnt_tx_short_buf_head
*short_head
;
999 struct ieee80211_tx_info
*info
;
1000 struct vnt_usb_send_context
*context
;
1001 struct ieee80211_mgmt
*mgmt_hdr
;
1002 unsigned long flags
;
1003 u32 frame_size
= skb
->len
+ 4;
1004 u16 current_rate
, count
;
1006 spin_lock_irqsave(&priv
->lock
, flags
);
1008 context
= vnt_get_free_context(priv
);
1010 dev_dbg(&priv
->usb
->dev
, "%s No free context!\n", __func__
);
1011 spin_unlock_irqrestore(&priv
->lock
, flags
);
1017 spin_unlock_irqrestore(&priv
->lock
, flags
);
1019 beacon_buffer
= (struct vnt_beacon_buffer
*)&context
->data
[0];
1020 short_head
= &beacon_buffer
->short_head
;
1022 if (priv
->bb_type
== BB_TYPE_11A
) {
1023 current_rate
= RATE_6M
;
1025 /* Get SignalField,ServiceField,Length */
1026 vnt_get_phy_field(priv
, frame_size
, current_rate
,
1027 PK_TYPE_11A
, &short_head
->ab
);
1029 /* Get Duration and TimeStampOff */
1030 short_head
->duration
= vnt_get_duration_le(priv
,
1031 PK_TYPE_11A
, false);
1032 short_head
->time_stamp_off
=
1033 vnt_time_stamp_off(priv
, current_rate
);
1035 current_rate
= RATE_1M
;
1036 short_head
->fifo_ctl
|= cpu_to_le16(FIFOCTL_11B
);
1038 /* Get SignalField,ServiceField,Length */
1039 vnt_get_phy_field(priv
, frame_size
, current_rate
,
1040 PK_TYPE_11B
, &short_head
->ab
);
1042 /* Get Duration and TimeStampOff */
1043 short_head
->duration
= vnt_get_duration_le(priv
,
1044 PK_TYPE_11B
, false);
1045 short_head
->time_stamp_off
=
1046 vnt_time_stamp_off(priv
, current_rate
);
1049 /* Generate Beacon Header */
1050 mgmt_hdr
= &beacon_buffer
->mgmt_hdr
;
1051 memcpy(mgmt_hdr
, skb
->data
, skb
->len
);
1053 /* time stamp always 0 */
1054 mgmt_hdr
->u
.beacon
.timestamp
= 0;
1056 info
= IEEE80211_SKB_CB(skb
);
1057 if (info
->flags
& IEEE80211_TX_CTL_ASSIGN_SEQ
) {
1058 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)mgmt_hdr
;
1060 hdr
->duration_id
= 0;
1061 hdr
->seq_ctrl
= cpu_to_le16(priv
->seq_counter
<< 4);
1064 priv
->seq_counter
++;
1065 if (priv
->seq_counter
> 0x0fff)
1066 priv
->seq_counter
= 0;
1068 count
= sizeof(struct vnt_tx_short_buf_head
) + skb
->len
;
1070 beacon_buffer
->tx_byte_count
= cpu_to_le16(count
);
1071 beacon_buffer
->pkt_no
= context
->pkt_no
;
1072 beacon_buffer
->type
= 0x01;
1074 context
->type
= CONTEXT_BEACON_PACKET
;
1075 context
->buf_len
= count
+ 4; /* USB header */
1077 spin_lock_irqsave(&priv
->lock
, flags
);
1079 if (vnt_tx_context(priv
, context
) != STATUS_PENDING
)
1080 ieee80211_free_txskb(priv
->hw
, context
->skb
);
1082 spin_unlock_irqrestore(&priv
->lock
, flags
);
1087 int vnt_beacon_make(struct vnt_private
*priv
, struct ieee80211_vif
*vif
)
1089 struct sk_buff
*beacon
;
1091 beacon
= ieee80211_beacon_get(priv
->hw
, vif
);
1095 if (vnt_beacon_xmit(priv
, beacon
)) {
1096 ieee80211_free_txskb(priv
->hw
, beacon
);
1103 int vnt_beacon_enable(struct vnt_private
*priv
, struct ieee80211_vif
*vif
,
1104 struct ieee80211_bss_conf
*conf
)
1106 vnt_mac_reg_bits_off(priv
, MAC_REG_TCR
, TCR_AUTOBCNTX
);
1108 vnt_mac_reg_bits_off(priv
, MAC_REG_TFTCTL
, TFTCTL_TSFCNTREN
);
1110 vnt_mac_set_beacon_interval(priv
, conf
->beacon_int
);
1112 vnt_clear_current_tsf(priv
);
1114 vnt_mac_reg_bits_on(priv
, MAC_REG_TFTCTL
, TFTCTL_TSFCNTREN
);
1116 vnt_reset_next_tbtt(priv
, conf
->beacon_int
);
1118 return vnt_beacon_make(priv
, vif
);