drivers: power: report battery voltage in AOSP compatible format
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / vt6656 / rxtx.c
1 /*
2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3 * All rights reserved.
4 *
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.
9 *
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.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * File: rxtx.c
20 *
21 * Purpose: handle WMAC/802.3/802.11 rx & tx functions
22 *
23 * Author: Lyndon Chen
24 *
25 * Date: May 20, 2003
26 *
27 * Functions:
28 * s_vGenerateTxParameter - Generate tx dma required parameter.
29 * s_vGenerateMACHeader - Translate 802.3 to 802.11 header
30 * csBeacon_xmit - beacon tx function
31 * csMgmt_xmit - management tx function
32 * s_uGetDataDuration - get tx data required duration
33 * s_uFillDataHead- fulfill tx data duration header
34 * s_uGetRTSCTSDuration- get rtx/cts required duration
35 * s_uGetRTSCTSRsvTime- get rts/cts reserved time
36 * s_uGetTxRsvTime- get frame reserved time
37 * s_vFillCTSHead- fulfill CTS ctl header
38 * s_vFillFragParameter- Set fragment ctl parameter.
39 * s_vFillRTSHead- fulfill RTS ctl header
40 * s_vFillTxKey- fulfill tx encrypt key
41 * s_vSWencryption- Software encrypt header
42 * vDMA0_tx_80211- tx 802.11 frame via dma0
43 * vGenerateFIFOHeader- Generate tx FIFO ctl header
44 *
45 * Revision History:
46 *
47 */
48
49 #include "device.h"
50 #include "rxtx.h"
51 #include "tether.h"
52 #include "card.h"
53 #include "bssdb.h"
54 #include "mac.h"
55 #include "baseband.h"
56 #include "michael.h"
57 #include "tkip.h"
58 #include "tcrc.h"
59 #include "wctl.h"
60 #include "hostap.h"
61 #include "rf.h"
62 #include "datarate.h"
63 #include "usbpipe.h"
64 #include "iocmd.h"
65
66 static int msglevel = MSG_LEVEL_INFO;
67
68 const u16 wTimeStampOff[2][MAX_RATE] = {
69 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
70 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
71 };
72
73 const u16 wFB_Opt0[2][5] = {
74 {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
75 {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
76 };
77 const u16 wFB_Opt1[2][5] = {
78 {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
79 {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
80 };
81
82 #define RTSDUR_BB 0
83 #define RTSDUR_BA 1
84 #define RTSDUR_AA 2
85 #define CTSDUR_BA 3
86 #define RTSDUR_BA_F0 4
87 #define RTSDUR_AA_F0 5
88 #define RTSDUR_BA_F1 6
89 #define RTSDUR_AA_F1 7
90 #define CTSDUR_BA_F0 8
91 #define CTSDUR_BA_F1 9
92 #define DATADUR_B 10
93 #define DATADUR_A 11
94 #define DATADUR_A_F0 12
95 #define DATADUR_A_F1 13
96
97 static void s_vSaveTxPktInfo(struct vnt_private *pDevice, u8 byPktNum,
98 u8 *pbyDestAddr, u16 wPktLength, u16 wFIFOCtl);
99
100 static void *s_vGetFreeContext(struct vnt_private *pDevice);
101
102 static void s_vGenerateTxParameter(struct vnt_private *pDevice,
103 u8 byPktType, u16 wCurrentRate, void *pTxBufHead, void *pvRrvTime,
104 void *pvRTS, void *pvCTS, u32 cbFrameSize, int bNeedACK, u32 uDMAIdx,
105 struct ethhdr *psEthHeader);
106
107 static u32 s_uFillDataHead(struct vnt_private *pDevice,
108 u8 byPktType, u16 wCurrentRate, void *pTxDataHead, u32 cbFrameLength,
109 u32 uDMAIdx, int bNeedAck, u32 uFragIdx, u32 cbLastFragmentSize,
110 u32 uMACfragNum, u8 byFBOption);
111
112 static void s_vGenerateMACHeader(struct vnt_private *pDevice,
113 u8 *pbyBufferAddr, u16 wDuration, struct ethhdr *psEthHeader,
114 int bNeedEncrypt, u16 wFragType, u32 uDMAIdx, u32 uFragIdx);
115
116 static void s_vFillTxKey(struct vnt_private *pDevice, u8 *pbyBuf,
117 u8 *pbyIVHead, PSKeyItem pTransmitKey, u8 *pbyHdrBuf, u16 wPayloadLen,
118 u8 *pMICHDR);
119
120 static void s_vSWencryption(struct vnt_private *pDevice,
121 PSKeyItem pTransmitKey, u8 *pbyPayloadHead, u16 wPayloadSize);
122
123 static unsigned int s_uGetTxRsvTime(struct vnt_private *pDevice, u8 byPktType,
124 u32 cbFrameLength, u16 wRate, int bNeedAck);
125
126 static u32 s_uGetRTSCTSRsvTime(struct vnt_private *pDevice, u8 byRTSRsvType,
127 u8 byPktType, u32 cbFrameLength, u16 wCurrentRate);
128
129 static void s_vFillCTSHead(struct vnt_private *pDevice, u32 uDMAIdx,
130 u8 byPktType, void *pvCTS, u32 cbFrameLength, int bNeedAck,
131 int bDisCRC, u16 wCurrentRate, u8 byFBOption);
132
133 static void s_vFillRTSHead(struct vnt_private *pDevice, u8 byPktType,
134 void *pvRTS, u32 cbFrameLength, int bNeedAck, int bDisCRC,
135 struct ethhdr *psEthHeader, u16 wCurrentRate, u8 byFBOption);
136
137 static u32 s_uGetDataDuration(struct vnt_private *pDevice, u8 byDurType,
138 u32 cbFrameLength, u8 byPktType, u16 wRate, int bNeedAck,
139 u32 uFragIdx, u32 cbLastFragmentSize, u32 uMACfragNum,
140 u8 byFBOption);
141
142 static unsigned int s_uGetRTSCTSDuration(struct vnt_private *pDevice,
143 u8 byDurType, u32 cbFrameLength, u8 byPktType, u16 wRate,
144 int bNeedAck, u8 byFBOption);
145
146 static void *s_vGetFreeContext(struct vnt_private *pDevice)
147 {
148 PUSB_SEND_CONTEXT pContext = NULL;
149 PUSB_SEND_CONTEXT pReturnContext = NULL;
150 int ii;
151
152 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GetFreeContext()\n");
153
154 for (ii = 0; ii < pDevice->cbTD; ii++) {
155 pContext = pDevice->apTD[ii];
156 if (pContext->bBoolInUse == false) {
157 pContext->bBoolInUse = true;
158 pReturnContext = pContext;
159 break;
160 }
161 }
162 if ( ii == pDevice->cbTD ) {
163 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Free Tx Context\n");
164 }
165 return (void *) pReturnContext;
166 }
167
168 static void s_vSaveTxPktInfo(struct vnt_private *pDevice, u8 byPktNum,
169 u8 *pbyDestAddr, u16 wPktLength, u16 wFIFOCtl)
170 {
171 PSStatCounter pStatistic = &pDevice->scStatistic;
172
173 if (is_broadcast_ether_addr(pbyDestAddr))
174 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_BROAD;
175 else if (is_multicast_ether_addr(pbyDestAddr))
176 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_MULTI;
177 else
178 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_UNI;
179
180 pStatistic->abyTxPktInfo[byPktNum].wLength = wPktLength;
181 pStatistic->abyTxPktInfo[byPktNum].wFIFOCtl = wFIFOCtl;
182 memcpy(pStatistic->abyTxPktInfo[byPktNum].abyDestAddr,
183 pbyDestAddr,
184 ETH_ALEN);
185 }
186
187 static void s_vFillTxKey(struct vnt_private *pDevice, u8 *pbyBuf,
188 u8 *pbyIVHead, PSKeyItem pTransmitKey, u8 *pbyHdrBuf,
189 u16 wPayloadLen, u8 *pMICHDR)
190 {
191 u32 *pdwIV = (u32 *)pbyIVHead;
192 u32 *pdwExtIV = (u32 *)((u8 *)pbyIVHead + 4);
193 u16 wValue;
194 struct ieee80211_hdr *pMACHeader = (struct ieee80211_hdr *)pbyHdrBuf;
195 u32 dwRevIVCounter;
196
197 //Fill TXKEY
198 if (pTransmitKey == NULL)
199 return;
200
201 dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
202 *pdwIV = pDevice->dwIVCounter;
203 pDevice->byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
204
205 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
206 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN ){
207 memcpy(pDevice->abyPRNG, (u8 *)&(dwRevIVCounter), 3);
208 memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
209 } else {
210 memcpy(pbyBuf, (u8 *)&(dwRevIVCounter), 3);
211 memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
212 if(pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
213 memcpy(pbyBuf+8, (u8 *)&(dwRevIVCounter), 3);
214 memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
215 }
216 memcpy(pDevice->abyPRNG, pbyBuf, 16);
217 }
218 // Append IV after Mac Header
219 *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
220 *pdwIV |= (u32)pDevice->byKeyIndex << 30;
221 *pdwIV = cpu_to_le32(*pdwIV);
222 pDevice->dwIVCounter++;
223 if (pDevice->dwIVCounter > WEP_IV_MASK) {
224 pDevice->dwIVCounter = 0;
225 }
226 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
227 pTransmitKey->wTSC15_0++;
228 if (pTransmitKey->wTSC15_0 == 0) {
229 pTransmitKey->dwTSC47_16++;
230 }
231 TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
232 pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
233 memcpy(pbyBuf, pDevice->abyPRNG, 16);
234 // Make IV
235 memcpy(pdwIV, pDevice->abyPRNG, 3);
236
237 *(pbyIVHead+3) = (u8)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
238 // Append IV&ExtIV after Mac Header
239 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
240 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFillTxKey()---- pdwExtIV: %x\n",
241 *pdwExtIV);
242
243 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
244 pTransmitKey->wTSC15_0++;
245 if (pTransmitKey->wTSC15_0 == 0) {
246 pTransmitKey->dwTSC47_16++;
247 }
248 memcpy(pbyBuf, pTransmitKey->abyKey, 16);
249
250 // Make IV
251 *pdwIV = 0;
252 *(pbyIVHead+3) = (u8)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
253 *pdwIV |= cpu_to_le16((u16)(pTransmitKey->wTSC15_0));
254 //Append IV&ExtIV after Mac Header
255 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
256
257 //Fill MICHDR0
258 *pMICHDR = 0x59;
259 *((u8 *)(pMICHDR+1)) = 0; // TxPriority
260 memcpy(pMICHDR+2, &(pMACHeader->addr2[0]), 6);
261 *((u8 *)(pMICHDR+8)) = HIBYTE(HIWORD(pTransmitKey->dwTSC47_16));
262 *((u8 *)(pMICHDR+9)) = LOBYTE(HIWORD(pTransmitKey->dwTSC47_16));
263 *((u8 *)(pMICHDR+10)) = HIBYTE(LOWORD(pTransmitKey->dwTSC47_16));
264 *((u8 *)(pMICHDR+11)) = LOBYTE(LOWORD(pTransmitKey->dwTSC47_16));
265 *((u8 *)(pMICHDR+12)) = HIBYTE(pTransmitKey->wTSC15_0);
266 *((u8 *)(pMICHDR+13)) = LOBYTE(pTransmitKey->wTSC15_0);
267 *((u8 *)(pMICHDR+14)) = HIBYTE(wPayloadLen);
268 *((u8 *)(pMICHDR+15)) = LOBYTE(wPayloadLen);
269
270 //Fill MICHDR1
271 *((u8 *)(pMICHDR+16)) = 0; // HLEN[15:8]
272 if (pDevice->bLongHeader) {
273 *((u8 *)(pMICHDR+17)) = 28; // HLEN[7:0]
274 } else {
275 *((u8 *)(pMICHDR+17)) = 22; // HLEN[7:0]
276 }
277 wValue = cpu_to_le16(pMACHeader->frame_control & 0xC78F);
278 memcpy(pMICHDR+18, (u8 *)&wValue, 2); // MSKFRACTL
279 memcpy(pMICHDR+20, &(pMACHeader->addr1[0]), 6);
280 memcpy(pMICHDR+26, &(pMACHeader->addr2[0]), 6);
281
282 //Fill MICHDR2
283 memcpy(pMICHDR+32, &(pMACHeader->addr3[0]), 6);
284 wValue = pMACHeader->seq_ctrl;
285 wValue &= 0x000F;
286 wValue = cpu_to_le16(wValue);
287 memcpy(pMICHDR+38, (u8 *)&wValue, 2); // MSKSEQCTL
288 if (pDevice->bLongHeader) {
289 memcpy(pMICHDR+40, &(pMACHeader->addr4[0]), 6);
290 }
291 }
292 }
293
294 static void s_vSWencryption(struct vnt_private *pDevice,
295 PSKeyItem pTransmitKey, u8 *pbyPayloadHead, u16 wPayloadSize)
296 {
297 u32 cbICVlen = 4;
298 u32 dwICV = 0xffffffff;
299 u32 *pdwICV;
300
301 if (pTransmitKey == NULL)
302 return;
303
304 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
305 //=======================================================================
306 // Append ICV after payload
307 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
308 pdwICV = (u32 *)(pbyPayloadHead + wPayloadSize);
309 // finally, we must invert dwCRC to get the correct answer
310 *pdwICV = cpu_to_le32(~dwICV);
311 // RC4 encryption
312 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
313 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
314 //=======================================================================
315 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
316 //=======================================================================
317 //Append ICV after payload
318 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
319 pdwICV = (u32 *)(pbyPayloadHead + wPayloadSize);
320 // finally, we must invert dwCRC to get the correct answer
321 *pdwICV = cpu_to_le32(~dwICV);
322 // RC4 encryption
323 rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
324 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
325 //=======================================================================
326 }
327 }
328
329 /*byPktType : PK_TYPE_11A 0
330 PK_TYPE_11B 1
331 PK_TYPE_11GB 2
332 PK_TYPE_11GA 3
333 */
334 static u32 s_uGetTxRsvTime(struct vnt_private *pDevice, u8 byPktType,
335 u32 cbFrameLength, u16 wRate, int bNeedAck)
336 {
337 u32 uDataTime, uAckTime;
338
339 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
340 if (byPktType == PK_TYPE_11B) {//llb,CCK mode
341 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (u16)pDevice->byTopCCKBasicRate);
342 } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode
343 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (u16)pDevice->byTopOFDMBasicRate);
344 }
345
346 if (bNeedAck) {
347 return (uDataTime + pDevice->uSIFS + uAckTime);
348 }
349 else {
350 return uDataTime;
351 }
352 }
353
354 //byFreqType: 0=>5GHZ 1=>2.4GHZ
355 static u32 s_uGetRTSCTSRsvTime(struct vnt_private *pDevice,
356 u8 byRTSRsvType, u8 byPktType, u32 cbFrameLength, u16 wCurrentRate)
357 {
358 u32 uRrvTime, uRTSTime, uCTSTime, uAckTime, uDataTime;
359
360 uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
361
362 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
363 if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
364 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
365 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
366 }
367 else if (byRTSRsvType == 1){ //RTSTxRrvTime_ba, only in 2.4GHZ
368 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
369 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
370 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
371 }
372 else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
373 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
374 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
375 }
376 else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
377 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
378 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
379 uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
380 return uRrvTime;
381 }
382
383 //RTSRrvTime
384 uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
385 return uRrvTime;
386 }
387
388 //byFreqType 0: 5GHz, 1:2.4Ghz
389 static u32 s_uGetDataDuration(struct vnt_private *pDevice, u8 byDurType,
390 u32 cbFrameLength, u8 byPktType, u16 wRate, int bNeedAck,
391 u32 uFragIdx, u32 cbLastFragmentSize, u32 uMACfragNum,
392 u8 byFBOption)
393 {
394 int bLastFrag = 0;
395 u32 uAckTime = 0, uNextPktTime = 0;
396
397 if (uFragIdx == (uMACfragNum-1)) {
398 bLastFrag = 1;
399 }
400
401 switch (byDurType) {
402
403 case DATADUR_B: //DATADUR_B
404 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
405 if (bNeedAck) {
406 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
407 return (pDevice->uSIFS + uAckTime);
408 } else {
409 return 0;
410 }
411 }
412 else {//First Frag or Mid Frag
413 if (uFragIdx == (uMACfragNum-2)) {
414 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
415 } else {
416 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
417 }
418 if (bNeedAck) {
419 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
420 return (pDevice->uSIFS + uAckTime + uNextPktTime);
421 } else {
422 return (pDevice->uSIFS + uNextPktTime);
423 }
424 }
425 break;
426
427 case DATADUR_A: //DATADUR_A
428 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
429 if(bNeedAck){
430 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
431 return (pDevice->uSIFS + uAckTime);
432 } else {
433 return 0;
434 }
435 }
436 else {//First Frag or Mid Frag
437 if(uFragIdx == (uMACfragNum-2)){
438 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
439 } else {
440 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
441 }
442 if(bNeedAck){
443 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
444 return (pDevice->uSIFS + uAckTime + uNextPktTime);
445 } else {
446 return (pDevice->uSIFS + uNextPktTime);
447 }
448 }
449 break;
450
451 case DATADUR_A_F0: //DATADUR_A_F0
452 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
453 if(bNeedAck){
454 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
455 return (pDevice->uSIFS + uAckTime);
456 } else {
457 return 0;
458 }
459 }
460 else { //First Frag or Mid Frag
461 if (byFBOption == AUTO_FB_0) {
462 if (wRate < RATE_18M)
463 wRate = RATE_18M;
464 else if (wRate > RATE_54M)
465 wRate = RATE_54M;
466
467 if(uFragIdx == (uMACfragNum-2)){
468 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
469 } else {
470 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
471 }
472 } else { // (byFBOption == AUTO_FB_1)
473 if (wRate < RATE_18M)
474 wRate = RATE_18M;
475 else if (wRate > RATE_54M)
476 wRate = RATE_54M;
477
478 if(uFragIdx == (uMACfragNum-2)){
479 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
480 } else {
481 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
482 }
483 }
484
485 if(bNeedAck){
486 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
487 return (pDevice->uSIFS + uAckTime + uNextPktTime);
488 } else {
489 return (pDevice->uSIFS + uNextPktTime);
490 }
491 }
492 break;
493
494 case DATADUR_A_F1: //DATADUR_A_F1
495 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
496 if(bNeedAck){
497 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
498 return (pDevice->uSIFS + uAckTime);
499 } else {
500 return 0;
501 }
502 }
503 else { //First Frag or Mid Frag
504 if (byFBOption == AUTO_FB_0) {
505 if (wRate < RATE_18M)
506 wRate = RATE_18M;
507 else if (wRate > RATE_54M)
508 wRate = RATE_54M;
509
510 if(uFragIdx == (uMACfragNum-2)){
511 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
512 } else {
513 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
514 }
515
516 } else { // (byFBOption == AUTO_FB_1)
517 if (wRate < RATE_18M)
518 wRate = RATE_18M;
519 else if (wRate > RATE_54M)
520 wRate = RATE_54M;
521
522 if(uFragIdx == (uMACfragNum-2)){
523 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
524 } else {
525 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
526 }
527 }
528 if(bNeedAck){
529 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
530 return (pDevice->uSIFS + uAckTime + uNextPktTime);
531 } else {
532 return (pDevice->uSIFS + uNextPktTime);
533 }
534 }
535 break;
536
537 default:
538 break;
539 }
540
541 ASSERT(false);
542 return 0;
543 }
544
545 //byFreqType: 0=>5GHZ 1=>2.4GHZ
546 static u32 s_uGetRTSCTSDuration(struct vnt_private *pDevice, u8 byDurType,
547 u32 cbFrameLength, u8 byPktType, u16 wRate, int bNeedAck,
548 u8 byFBOption)
549 {
550 u32 uCTSTime = 0, uDurTime = 0;
551
552 switch (byDurType) {
553
554 case RTSDUR_BB: //RTSDuration_bb
555 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
556 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
557 break;
558
559 case RTSDUR_BA: //RTSDuration_ba
560 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
561 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
562 break;
563
564 case RTSDUR_AA: //RTSDuration_aa
565 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
566 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
567 break;
568
569 case CTSDUR_BA: //CTSDuration_ba
570 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
571 break;
572
573 case RTSDUR_BA_F0: //RTSDuration_ba_f0
574 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
575 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
576 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
577 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
578 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
579 }
580 break;
581
582 case RTSDUR_AA_F0: //RTSDuration_aa_f0
583 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
584 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
585 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
586 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
587 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
588 }
589 break;
590
591 case RTSDUR_BA_F1: //RTSDuration_ba_f1
592 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
593 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
594 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
595 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
596 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
597 }
598 break;
599
600 case RTSDUR_AA_F1: //RTSDuration_aa_f1
601 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
602 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
603 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
604 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
605 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
606 }
607 break;
608
609 case CTSDUR_BA_F0: //CTSDuration_ba_f0
610 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
611 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
612 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
613 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
614 }
615 break;
616
617 case CTSDUR_BA_F1: //CTSDuration_ba_f1
618 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
619 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
620 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
621 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
622 }
623 break;
624
625 default:
626 break;
627 }
628
629 return uDurTime;
630
631 }
632
633 static u32 s_uFillDataHead(struct vnt_private *pDevice,
634 u8 byPktType, u16 wCurrentRate, void *pTxDataHead, u32 cbFrameLength,
635 u32 uDMAIdx, int bNeedAck, u32 uFragIdx, u32 cbLastFragmentSize,
636 u32 uMACfragNum, u8 byFBOption)
637 {
638
639 if (pTxDataHead == NULL) {
640 return 0;
641 }
642
643 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
644 if ((uDMAIdx == TYPE_ATIMDMA) || (uDMAIdx == TYPE_BEACONDMA)) {
645 PSTxDataHead_ab pBuf = (PSTxDataHead_ab) pTxDataHead;
646 //Get SignalField,ServiceField,Length
647 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
648 (u16 *)&(pBuf->wTransmitLength), (u8 *)&(pBuf->byServiceField), (u8 *)&(pBuf->bySignalField)
649 );
650 //Get Duration and TimeStampOff
651 pBuf->wDuration = (u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
652 wCurrentRate, bNeedAck, uFragIdx,
653 cbLastFragmentSize, uMACfragNum,
654 byFBOption); //1: 2.4GHz
655 if(uDMAIdx!=TYPE_ATIMDMA) {
656 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
657 }
658 return (pBuf->wDuration);
659 }
660 else { // DATA & MANAGE Frame
661 if (byFBOption == AUTO_FB_NONE) {
662 PSTxDataHead_g pBuf = (PSTxDataHead_g)pTxDataHead;
663 //Get SignalField,ServiceField,Length
664 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
665 (u16 *)&(pBuf->wTransmitLength_a), (u8 *)&(pBuf->byServiceField_a), (u8 *)&(pBuf->bySignalField_a)
666 );
667 BBvCalculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
668 (u16 *)&(pBuf->wTransmitLength_b), (u8 *)&(pBuf->byServiceField_b), (u8 *)&(pBuf->bySignalField_b)
669 );
670 //Get Duration and TimeStamp
671 pBuf->wDuration_a = (u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
672 byPktType, wCurrentRate, bNeedAck, uFragIdx,
673 cbLastFragmentSize, uMACfragNum,
674 byFBOption); //1: 2.4GHz
675 pBuf->wDuration_b = (u16)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
676 PK_TYPE_11B, pDevice->byTopCCKBasicRate,
677 bNeedAck, uFragIdx, cbLastFragmentSize,
678 uMACfragNum, byFBOption); //1: 2.4GHz
679
680 pBuf->wTimeStampOff_a = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
681 pBuf->wTimeStampOff_b = wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE];
682 return (pBuf->wDuration_a);
683 } else {
684 // Auto Fallback
685 PSTxDataHead_g_FB pBuf = (PSTxDataHead_g_FB)pTxDataHead;
686 //Get SignalField,ServiceField,Length
687 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
688 (u16 *)&(pBuf->wTransmitLength_a), (u8 *)&(pBuf->byServiceField_a), (u8 *)&(pBuf->bySignalField_a)
689 );
690 BBvCalculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
691 (u16 *)&(pBuf->wTransmitLength_b), (u8 *)&(pBuf->byServiceField_b), (u8 *)&(pBuf->bySignalField_b)
692 );
693 //Get Duration and TimeStamp
694 pBuf->wDuration_a = (u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
695 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
696 pBuf->wDuration_b = (u16)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
697 pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
698 pBuf->wDuration_a_f0 = (u16)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
699 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
700 pBuf->wDuration_a_f1 = (u16)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
701 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
702 pBuf->wTimeStampOff_a = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
703 pBuf->wTimeStampOff_b = wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE];
704 return (pBuf->wDuration_a);
705 } //if (byFBOption == AUTO_FB_NONE)
706 }
707 }
708 else if (byPktType == PK_TYPE_11A) {
709 if ((byFBOption != AUTO_FB_NONE) && (uDMAIdx != TYPE_ATIMDMA) && (uDMAIdx != TYPE_BEACONDMA)) {
710 // Auto Fallback
711 PSTxDataHead_a_FB pBuf = (PSTxDataHead_a_FB)pTxDataHead;
712 //Get SignalField,ServiceField,Length
713 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
714 (u16 *)&(pBuf->wTransmitLength), (u8 *)&(pBuf->byServiceField), (u8 *)&(pBuf->bySignalField)
715 );
716 //Get Duration and TimeStampOff
717 pBuf->wDuration = (u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
718 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
719 pBuf->wDuration_f0 = (u16)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
720 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
721 pBuf->wDuration_f1 = (u16)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
722 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
723 if(uDMAIdx!=TYPE_ATIMDMA) {
724 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
725 }
726 return (pBuf->wDuration);
727 } else {
728 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
729 //Get SignalField,ServiceField,Length
730 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
731 (u16 *)&(pBuf->wTransmitLength), (u8 *)&(pBuf->byServiceField), (u8 *)&(pBuf->bySignalField)
732 );
733 //Get Duration and TimeStampOff
734 pBuf->wDuration = (u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
735 wCurrentRate, bNeedAck, uFragIdx,
736 cbLastFragmentSize, uMACfragNum,
737 byFBOption);
738
739 if(uDMAIdx!=TYPE_ATIMDMA) {
740 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
741 }
742 return (pBuf->wDuration);
743 }
744 }
745 else if (byPktType == PK_TYPE_11B) {
746 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
747 //Get SignalField,ServiceField,Length
748 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
749 (u16 *)&(pBuf->wTransmitLength), (u8 *)&(pBuf->byServiceField), (u8 *)&(pBuf->bySignalField)
750 );
751 //Get Duration and TimeStampOff
752 pBuf->wDuration = (u16)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
753 wCurrentRate, bNeedAck, uFragIdx,
754 cbLastFragmentSize, uMACfragNum,
755 byFBOption);
756 if (uDMAIdx != TYPE_ATIMDMA) {
757 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
758 }
759 return (pBuf->wDuration);
760 }
761 return 0;
762 }
763
764 static void s_vFillRTSHead(struct vnt_private *pDevice, u8 byPktType,
765 void *pvRTS, u32 cbFrameLength, int bNeedAck, int bDisCRC,
766 struct ethhdr *psEthHeader, u16 wCurrentRate, u8 byFBOption)
767 {
768 u32 uRTSFrameLen = 20;
769 u16 wLen = 0;
770
771 if (pvRTS == NULL)
772 return;
773
774 if (bDisCRC) {
775 // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
776 // in this case we need to decrease its length by 4.
777 uRTSFrameLen -= 4;
778 }
779
780 // Note: So far RTSHead doesn't appear in ATIM & Beacom DMA, so we don't need to take them into account.
781 // Otherwise, we need to modified codes for them.
782 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
783 if (byFBOption == AUTO_FB_NONE) {
784 PSRTS_g pBuf = (PSRTS_g)pvRTS;
785 //Get SignalField,ServiceField,Length
786 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
787 (u16 *)&(wLen), (u8 *)&(pBuf->byServiceField_b), (u8 *)&(pBuf->bySignalField_b)
788 );
789 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
790 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
791 (u16 *)&(wLen), (u8 *)&(pBuf->byServiceField_a), (u8 *)&(pBuf->bySignalField_a)
792 );
793 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
794 //Get Duration
795 pBuf->wDuration_bb = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, PK_TYPE_11B, pDevice->byTopCCKBasicRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
796 pBuf->wDuration_aa = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //2:RTSDuration_aa, 1:2.4G, 2,3: 2.4G OFDMData
797 pBuf->wDuration_ba = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
798
799 pBuf->Data.wDurationID = pBuf->wDuration_aa;
800 //Get RTS Frame body
801 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
802
803 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
804 (pDevice->eOPMode == OP_MODE_AP)) {
805 memcpy(&(pBuf->Data.abyRA[0]),
806 &(psEthHeader->h_dest[0]),
807 ETH_ALEN);
808 }
809 else {
810 memcpy(&(pBuf->Data.abyRA[0]),
811 &(pDevice->abyBSSID[0]),
812 ETH_ALEN);
813 }
814 if (pDevice->eOPMode == OP_MODE_AP) {
815 memcpy(&(pBuf->Data.abyTA[0]),
816 &(pDevice->abyBSSID[0]),
817 ETH_ALEN);
818 }
819 else {
820 memcpy(&(pBuf->Data.abyTA[0]),
821 &(psEthHeader->h_source[0]),
822 ETH_ALEN);
823 }
824 }
825 else {
826 PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS;
827 //Get SignalField,ServiceField,Length
828 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
829 (u16 *)&(wLen), (u8 *)&(pBuf->byServiceField_b), (u8 *)&(pBuf->bySignalField_b)
830 );
831 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
832 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
833 (u16 *)&(wLen), (u8 *)&(pBuf->byServiceField_a), (u8 *)&(pBuf->bySignalField_a)
834 );
835 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
836 //Get Duration
837 pBuf->wDuration_bb = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, PK_TYPE_11B, pDevice->byTopCCKBasicRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
838 pBuf->wDuration_aa = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //2:RTSDuration_aa, 1:2.4G, 2,3:2.4G OFDMData
839 pBuf->wDuration_ba = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDMData
840 pBuf->wRTSDuration_ba_f0 = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //4:wRTSDuration_ba_f0, 1:2.4G, 1:CCKData
841 pBuf->wRTSDuration_aa_f0 = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //5:wRTSDuration_aa_f0, 1:2.4G, 1:CCKData
842 pBuf->wRTSDuration_ba_f1 = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //6:wRTSDuration_ba_f1, 1:2.4G, 1:CCKData
843 pBuf->wRTSDuration_aa_f1 = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //7:wRTSDuration_aa_f1, 1:2.4G, 1:CCKData
844 pBuf->Data.wDurationID = pBuf->wDuration_aa;
845 //Get RTS Frame body
846 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
847
848 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
849 (pDevice->eOPMode == OP_MODE_AP)) {
850 memcpy(&(pBuf->Data.abyRA[0]),
851 &(psEthHeader->h_dest[0]),
852 ETH_ALEN);
853 }
854 else {
855 memcpy(&(pBuf->Data.abyRA[0]),
856 &(pDevice->abyBSSID[0]),
857 ETH_ALEN);
858 }
859
860 if (pDevice->eOPMode == OP_MODE_AP) {
861 memcpy(&(pBuf->Data.abyTA[0]),
862 &(pDevice->abyBSSID[0]),
863 ETH_ALEN);
864 }
865 else {
866 memcpy(&(pBuf->Data.abyTA[0]),
867 &(psEthHeader->h_source[0]),
868 ETH_ALEN);
869 }
870
871 } // if (byFBOption == AUTO_FB_NONE)
872 }
873 else if (byPktType == PK_TYPE_11A) {
874 if (byFBOption == AUTO_FB_NONE) {
875 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
876 //Get SignalField,ServiceField,Length
877 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
878 (u16 *)&(wLen), (u8 *)&(pBuf->byServiceField), (u8 *)&(pBuf->bySignalField)
879 );
880 pBuf->wTransmitLength = cpu_to_le16(wLen);
881 //Get Duration
882 pBuf->wDuration = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
883 pBuf->Data.wDurationID = pBuf->wDuration;
884 //Get RTS Frame body
885 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
886
887 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
888 (pDevice->eOPMode == OP_MODE_AP)) {
889 memcpy(&(pBuf->Data.abyRA[0]),
890 &(psEthHeader->h_dest[0]),
891 ETH_ALEN);
892 } else {
893 memcpy(&(pBuf->Data.abyRA[0]),
894 &(pDevice->abyBSSID[0]),
895 ETH_ALEN);
896 }
897
898 if (pDevice->eOPMode == OP_MODE_AP) {
899 memcpy(&(pBuf->Data.abyTA[0]),
900 &(pDevice->abyBSSID[0]),
901 ETH_ALEN);
902 } else {
903 memcpy(&(pBuf->Data.abyTA[0]),
904 &(psEthHeader->h_source[0]),
905 ETH_ALEN);
906 }
907
908 }
909 else {
910 PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS;
911 //Get SignalField,ServiceField,Length
912 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
913 (u16 *)&(wLen), (u8 *)&(pBuf->byServiceField), (u8 *)&(pBuf->bySignalField)
914 );
915 pBuf->wTransmitLength = cpu_to_le16(wLen);
916 //Get Duration
917 pBuf->wDuration = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
918 pBuf->wRTSDuration_f0 = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //5:RTSDuration_aa_f0, 0:5G, 0: 5G OFDMData
919 pBuf->wRTSDuration_f1 = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //7:RTSDuration_aa_f1, 0:5G, 0:
920 pBuf->Data.wDurationID = pBuf->wDuration;
921 //Get RTS Frame body
922 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
923
924 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
925 (pDevice->eOPMode == OP_MODE_AP)) {
926 memcpy(&(pBuf->Data.abyRA[0]),
927 &(psEthHeader->h_dest[0]),
928 ETH_ALEN);
929 } else {
930 memcpy(&(pBuf->Data.abyRA[0]),
931 &(pDevice->abyBSSID[0]),
932 ETH_ALEN);
933 }
934 if (pDevice->eOPMode == OP_MODE_AP) {
935 memcpy(&(pBuf->Data.abyTA[0]),
936 &(pDevice->abyBSSID[0]),
937 ETH_ALEN);
938 } else {
939 memcpy(&(pBuf->Data.abyTA[0]),
940 &(psEthHeader->h_source[0]),
941 ETH_ALEN);
942 }
943 }
944 }
945 else if (byPktType == PK_TYPE_11B) {
946 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
947 //Get SignalField,ServiceField,Length
948 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
949 (u16 *)&(wLen), (u8 *)&(pBuf->byServiceField), (u8 *)&(pBuf->bySignalField)
950 );
951 pBuf->wTransmitLength = cpu_to_le16(wLen);
952 //Get Duration
953 pBuf->wDuration = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
954 pBuf->Data.wDurationID = pBuf->wDuration;
955 //Get RTS Frame body
956 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
957
958 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
959 (pDevice->eOPMode == OP_MODE_AP)) {
960 memcpy(&(pBuf->Data.abyRA[0]),
961 &(psEthHeader->h_dest[0]),
962 ETH_ALEN);
963 }
964 else {
965 memcpy(&(pBuf->Data.abyRA[0]),
966 &(pDevice->abyBSSID[0]),
967 ETH_ALEN);
968 }
969
970 if (pDevice->eOPMode == OP_MODE_AP) {
971 memcpy(&(pBuf->Data.abyTA[0]),
972 &(pDevice->abyBSSID[0]),
973 ETH_ALEN);
974 } else {
975 memcpy(&(pBuf->Data.abyTA[0]),
976 &(psEthHeader->h_source[0]),
977 ETH_ALEN);
978 }
979 }
980 }
981
982 static void s_vFillCTSHead(struct vnt_private *pDevice, u32 uDMAIdx,
983 u8 byPktType, void *pvCTS, u32 cbFrameLength, int bNeedAck,
984 int bDisCRC, u16 wCurrentRate, u8 byFBOption)
985 {
986 u32 uCTSFrameLen = 14;
987 u16 wLen = 0;
988
989 if (pvCTS == NULL) {
990 return;
991 }
992
993 if (bDisCRC) {
994 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
995 // in this case we need to decrease its length by 4.
996 uCTSFrameLen -= 4;
997 }
998
999 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1000 if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
1001 // Auto Fall back
1002 PSCTS_FB pBuf = (PSCTS_FB)pvCTS;
1003 //Get SignalField,ServiceField,Length
1004 BBvCalculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1005 (u16 *)&(wLen), (u8 *)&(pBuf->byServiceField_b), (u8 *)&(pBuf->bySignalField_b)
1006 );
1007 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1008 pBuf->wDuration_ba = (u16)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1009 pBuf->wDuration_ba += pDevice->wCTSDuration;
1010 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1011 //Get CTSDuration_ba_f0
1012 pBuf->wCTSDuration_ba_f0 = (u16)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //8:CTSDuration_ba_f0, 1:2.4G, 2,3:2.4G OFDM Data
1013 pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration;
1014 pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0);
1015 //Get CTSDuration_ba_f1
1016 pBuf->wCTSDuration_ba_f1 = (u16)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //9:CTSDuration_ba_f1, 1:2.4G, 2,3:2.4G OFDM Data
1017 pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration;
1018 pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1);
1019 //Get CTS Frame body
1020 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1021 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1022 pBuf->Data.wReserved = 0x0000;
1023 memcpy(&(pBuf->Data.abyRA[0]),
1024 &(pDevice->abyCurrentNetAddr[0]),
1025 ETH_ALEN);
1026 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1027 PSCTS pBuf = (PSCTS)pvCTS;
1028 //Get SignalField,ServiceField,Length
1029 BBvCalculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1030 (u16 *)&(wLen), (u8 *)&(pBuf->byServiceField_b), (u8 *)&(pBuf->bySignalField_b)
1031 );
1032 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1033 //Get CTSDuration_ba
1034 pBuf->wDuration_ba = cpu_to_le16((u16)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1035 pBuf->wDuration_ba += pDevice->wCTSDuration;
1036 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1037
1038 //Get CTS Frame body
1039 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1040 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1041 pBuf->Data.wReserved = 0x0000;
1042 memcpy(&(pBuf->Data.abyRA[0]),
1043 &(pDevice->abyCurrentNetAddr[0]),
1044 ETH_ALEN);
1045 }
1046 }
1047 }
1048
1049 /*+
1050 *
1051 * Description:
1052 * Generate FIFO control for MAC & Baseband controller
1053 *
1054 * Parameters:
1055 * In:
1056 * pDevice - Pointer to adpater
1057 * pTxDataHead - Transmit Data Buffer
1058 * pTxBufHead - pTxBufHead
1059 * pvRrvTime - pvRrvTime
1060 * pvRTS - RTS Buffer
1061 * pCTS - CTS Buffer
1062 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1063 * bNeedACK - If need ACK
1064 * uDMAIdx - DMA Index
1065 * Out:
1066 * none
1067 *
1068 * Return Value: none
1069 *
1070 -*/
1071
1072 static void s_vGenerateTxParameter(struct vnt_private *pDevice,
1073 u8 byPktType, u16 wCurrentRate, void *pTxBufHead, void *pvRrvTime,
1074 void *pvRTS, void *pvCTS, u32 cbFrameSize, int bNeedACK, u32 uDMAIdx,
1075 struct ethhdr *psEthHeader)
1076 {
1077 u32 cbMACHdLen = WLAN_HDR_ADDR3_LEN; /* 24 */
1078 u16 wFifoCtl;
1079 int bDisCRC = false;
1080 u8 byFBOption = AUTO_FB_NONE;
1081
1082 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter...\n");
1083 PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
1084 pFifoHead->wReserved = wCurrentRate;
1085 wFifoCtl = pFifoHead->wFIFOCtl;
1086
1087 if (wFifoCtl & FIFOCTL_CRCDIS) {
1088 bDisCRC = true;
1089 }
1090
1091 if (wFifoCtl & FIFOCTL_AUTO_FB_0) {
1092 byFBOption = AUTO_FB_0;
1093 }
1094 else if (wFifoCtl & FIFOCTL_AUTO_FB_1) {
1095 byFBOption = AUTO_FB_1;
1096 }
1097
1098 if (pDevice->bLongHeader)
1099 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1100
1101 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1102
1103 if (pvRTS != NULL) { //RTS_need
1104 //Fill RsvTime
1105 if (pvRrvTime) {
1106 PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;
1107 pBuf->wRTSTxRrvTime_aa = cpu_to_le16((u16)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz
1108 pBuf->wRTSTxRrvTime_ba = cpu_to_le16((u16)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz
1109 pBuf->wRTSTxRrvTime_bb = cpu_to_le16((u16)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1110 pBuf->wTxRrvTime_a = cpu_to_le16((u16) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1111 pBuf->wTxRrvTime_b = cpu_to_le16((u16) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1112 }
1113 //Fill RTS
1114 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1115 }
1116 else {//RTS_needless, PCF mode
1117
1118 //Fill RsvTime
1119 if (pvRrvTime) {
1120 PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;
1121 pBuf->wTxRrvTime_a = cpu_to_le16((u16)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1122 pBuf->wTxRrvTime_b = cpu_to_le16((u16)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1123 pBuf->wCTSTxRrvTime_ba = cpu_to_le16((u16)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz
1124 }
1125 //Fill CTS
1126 s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
1127 }
1128 }
1129 else if (byPktType == PK_TYPE_11A) {
1130
1131 if (pvRTS != NULL) {//RTS_need, non PCF mode
1132 //Fill RsvTime
1133 if (pvRrvTime) {
1134 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1135 pBuf->wRTSTxRrvTime = cpu_to_le16((u16)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz
1136 pBuf->wTxRrvTime = cpu_to_le16((u16)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM
1137 }
1138 //Fill RTS
1139 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1140 }
1141 else if (pvRTS == NULL) {//RTS_needless, non PCF mode
1142 //Fill RsvTime
1143 if (pvRrvTime) {
1144 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1145 pBuf->wTxRrvTime = cpu_to_le16((u16)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM
1146 }
1147 }
1148 }
1149 else if (byPktType == PK_TYPE_11B) {
1150
1151 if ((pvRTS != NULL)) {//RTS_need, non PCF mode
1152 //Fill RsvTime
1153 if (pvRrvTime) {
1154 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1155 pBuf->wRTSTxRrvTime = cpu_to_le16((u16)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1156 pBuf->wTxRrvTime = cpu_to_le16((u16)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK
1157 }
1158 //Fill RTS
1159 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1160 }
1161 else { //RTS_needless, non PCF mode
1162 //Fill RsvTime
1163 if (pvRrvTime) {
1164 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1165 pBuf->wTxRrvTime = cpu_to_le16((u16)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK
1166 }
1167 }
1168 }
1169 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter END.\n");
1170 }
1171 /*
1172 u8 * pbyBuffer,//point to pTxBufHead
1173 u16 wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last
1174 unsigned int cbFragmentSize,//Hdr+payoad+FCS
1175 */
1176
1177 static int s_bPacketToWirelessUsb(struct vnt_private *pDevice, u8 byPktType,
1178 u8 *usbPacketBuf, int bNeedEncryption, u32 uSkbPacketLen, u32 uDMAIdx,
1179 struct ethhdr *psEthHeader, u8 *pPacket, PSKeyItem pTransmitKey,
1180 u32 uNodeIndex, u16 wCurrentRate, u32 *pcbHeaderLen, u32 *pcbTotalLen)
1181 {
1182 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
1183 u32 cbFrameSize, cbFrameBodySize;
1184 PTX_BUFFER pTxBufHead;
1185 u32 cb802_1_H_len;
1186 u32 cbIVlen = 0, cbICVlen = 0, cbMIClen = 0, cbMACHdLen = 0;
1187 u32 cbFCSlen = 4, cbMICHDR = 0;
1188 int bNeedACK, bRTS;
1189 u8 *pbyType, *pbyMacHdr, *pbyIVHead, *pbyPayloadHead, *pbyTxBufferAddr;
1190 u8 abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
1191 u8 abySNAP_Bridgetunnel[ETH_ALEN]
1192 = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
1193 u32 uDuration;
1194 u32 cbHeaderLength = 0, uPadding = 0;
1195 void *pvRrvTime;
1196 PSMICHDRHead pMICHDR;
1197 void *pvRTS;
1198 void *pvCTS;
1199 void *pvTxDataHd;
1200 u8 byFBOption = AUTO_FB_NONE, byFragType;
1201 u16 wTxBufSize;
1202 u32 dwMICKey0, dwMICKey1, dwMIC_Priority, dwCRC;
1203 u32 *pdwMIC_L, *pdwMIC_R;
1204 int bSoftWEP = false;
1205
1206 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
1207
1208 if (bNeedEncryption && pTransmitKey->pvKeyTable) {
1209 if (((PSKeyTable)pTransmitKey->pvKeyTable)->bSoftWEP == true)
1210 bSoftWEP = true; /* WEP 256 */
1211 }
1212
1213 pTxBufHead = (PTX_BUFFER) usbPacketBuf;
1214 memset(pTxBufHead, 0, sizeof(TX_BUFFER));
1215
1216 // Get pkt type
1217 if (ntohs(psEthHeader->h_proto) > ETH_DATA_LEN) {
1218 if (pDevice->dwDiagRefCount == 0) {
1219 cb802_1_H_len = 8;
1220 } else {
1221 cb802_1_H_len = 2;
1222 }
1223 } else {
1224 cb802_1_H_len = 0;
1225 }
1226
1227 cbFrameBodySize = uSkbPacketLen - ETH_HLEN + cb802_1_H_len;
1228
1229 //Set packet type
1230 pTxBufHead->wFIFOCtl |= (u16)(byPktType<<8);
1231
1232 if (pDevice->dwDiagRefCount != 0) {
1233 bNeedACK = false;
1234 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1235 } else { //if (pDevice->dwDiagRefCount != 0) {
1236 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1237 (pDevice->eOPMode == OP_MODE_AP)) {
1238 if (is_multicast_ether_addr(psEthHeader->h_dest)) {
1239 bNeedACK = false;
1240 pTxBufHead->wFIFOCtl =
1241 pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1242 } else {
1243 bNeedACK = true;
1244 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1245 }
1246 }
1247 else {
1248 // MSDUs in Infra mode always need ACK
1249 bNeedACK = true;
1250 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1251 }
1252 } //if (pDevice->dwDiagRefCount != 0) {
1253
1254 pTxBufHead->wTimeStamp = DEFAULT_MSDU_LIFETIME_RES_64us;
1255
1256 //Set FIFOCTL_LHEAD
1257 if (pDevice->bLongHeader)
1258 pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
1259
1260 if (pDevice->bSoftwareGenCrcErr) {
1261 pTxBufHead->wFIFOCtl |= FIFOCTL_CRCDIS; // set tx descriptors to NO hardware CRC
1262 }
1263
1264 //Set FRAGCTL_MACHDCNT
1265 if (pDevice->bLongHeader) {
1266 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1267 } else {
1268 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1269 }
1270 pTxBufHead->wFragCtl |= (u16)(cbMACHdLen << 10);
1271
1272 //Set FIFOCTL_GrpAckPolicy
1273 if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
1274 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
1275 }
1276
1277 //Set Auto Fallback Ctl
1278 if (wCurrentRate >= RATE_18M) {
1279 if (pDevice->byAutoFBCtrl == AUTO_FB_0) {
1280 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
1281 byFBOption = AUTO_FB_0;
1282 } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) {
1283 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
1284 byFBOption = AUTO_FB_1;
1285 }
1286 }
1287
1288 if (bSoftWEP != true) {
1289 if ((bNeedEncryption) && (pTransmitKey != NULL)) { //WEP enabled
1290 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
1291 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
1292 }
1293 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1294 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Tx Set wFragCtl == FRAGCTL_TKIP\n");
1295 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
1296 }
1297 else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
1298 pTxBufHead->wFragCtl |= FRAGCTL_AES;
1299 }
1300 }
1301 }
1302
1303 if ((bNeedEncryption) && (pTransmitKey != NULL)) {
1304 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
1305 cbIVlen = 4;
1306 cbICVlen = 4;
1307 }
1308 else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1309 cbIVlen = 8;//IV+ExtIV
1310 cbMIClen = 8;
1311 cbICVlen = 4;
1312 }
1313 if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
1314 cbIVlen = 8;//RSN Header
1315 cbICVlen = 8;//MIC
1316 cbMICHDR = sizeof(SMICHDRHead);
1317 }
1318 if (bSoftWEP == false) {
1319 //MAC Header should be padding 0 to DW alignment.
1320 uPadding = 4 - (cbMACHdLen%4);
1321 uPadding %= 4;
1322 }
1323 }
1324
1325 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1326
1327 if ( (bNeedACK == false) ||(cbFrameSize < pDevice->wRTSThreshold) ) {
1328 bRTS = false;
1329 } else {
1330 bRTS = true;
1331 pTxBufHead->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
1332 }
1333
1334 pbyTxBufferAddr = (u8 *) &(pTxBufHead->adwTxKey[0]);
1335 wTxBufSize = sizeof(STxBufHead);
1336 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1337 if (byFBOption == AUTO_FB_NONE) {
1338 if (bRTS == true) {//RTS_need
1339 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1340 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1341 pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1342 pvCTS = NULL;
1343 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g));
1344 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g);
1345 }
1346 else { //RTS_needless
1347 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1348 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1349 pvRTS = NULL;
1350 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1351 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
1352 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
1353 }
1354 } else {
1355 // Auto Fall Back
1356 if (bRTS == true) {//RTS_need
1357 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1358 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1359 pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1360 pvCTS = NULL;
1361 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB));
1362 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB);
1363 }
1364 else if (bRTS == false) { //RTS_needless
1365 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1366 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1367 pvRTS = NULL;
1368 pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1369 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB));
1370 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB);
1371 }
1372 } // Auto Fall Back
1373 }
1374 else {//802.11a/b packet
1375 if (byFBOption == AUTO_FB_NONE) {
1376 if (bRTS == true) {//RTS_need
1377 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1378 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1379 pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1380 pvCTS = NULL;
1381 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab));
1382 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab);
1383 }
1384 else if (bRTS == false) { //RTS_needless, no MICHDR
1385 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1386 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1387 pvRTS = NULL;
1388 pvCTS = NULL;
1389 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1390 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
1391 }
1392 } else {
1393 // Auto Fall Back
1394 if (bRTS == true) {//RTS_need
1395 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1396 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1397 pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1398 pvCTS = NULL;
1399 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB));
1400 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB);
1401 }
1402 else if (bRTS == false) { //RTS_needless
1403 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1404 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1405 pvRTS = NULL;
1406 pvCTS = NULL;
1407 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1408 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB);
1409 }
1410 } // Auto Fall Back
1411 }
1412
1413 pbyMacHdr = (u8 *)(pbyTxBufferAddr + cbHeaderLength);
1414 pbyIVHead = (u8 *)(pbyMacHdr + cbMACHdLen + uPadding);
1415 pbyPayloadHead = (u8 *)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
1416
1417 //=========================
1418 // No Fragmentation
1419 //=========================
1420 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Fragmentation...\n");
1421 byFragType = FRAGCTL_NONFRAG;
1422 //uDMAIdx = TYPE_AC0DMA;
1423 //pTxBufHead = (PSTxBufHead) &(pTxBufHead->adwTxKey[0]);
1424
1425 //Fill FIFO,RrvTime,RTS,and CTS
1426 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate,
1427 (void *)pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
1428 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader);
1429 //Fill DataHead
1430 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1431 0, 0, 1/*uMACfragNum*/, byFBOption);
1432 // Generate TX MAC Header
1433 s_vGenerateMACHeader(pDevice, pbyMacHdr, (u16)uDuration, psEthHeader, bNeedEncryption,
1434 byFragType, uDMAIdx, 0);
1435
1436 if (bNeedEncryption == true) {
1437 //Fill TXKEY
1438 s_vFillTxKey(pDevice, (u8 *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
1439 pbyMacHdr, (u16)cbFrameBodySize, (u8 *)pMICHDR);
1440
1441 if (pDevice->bEnableHostWEP) {
1442 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1443 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1444 }
1445 }
1446
1447 // 802.1H
1448 if (ntohs(psEthHeader->h_proto) > ETH_DATA_LEN) {
1449 if (pDevice->dwDiagRefCount == 0) {
1450 if ((psEthHeader->h_proto == cpu_to_be16(ETH_P_IPX)) ||
1451 (psEthHeader->h_proto == cpu_to_le16(0xF380))) {
1452 memcpy((u8 *) (pbyPayloadHead),
1453 abySNAP_Bridgetunnel, 6);
1454 } else {
1455 memcpy((u8 *) (pbyPayloadHead), &abySNAP_RFC1042[0], 6);
1456 }
1457 pbyType = (u8 *) (pbyPayloadHead + 6);
1458 memcpy(pbyType, &(psEthHeader->h_proto), sizeof(u16));
1459 } else {
1460 memcpy((u8 *) (pbyPayloadHead), &(psEthHeader->h_proto), sizeof(u16));
1461
1462 }
1463
1464 }
1465
1466 if (pPacket != NULL) {
1467 // Copy the Packet into a tx Buffer
1468 memcpy((pbyPayloadHead + cb802_1_H_len),
1469 (pPacket + ETH_HLEN),
1470 uSkbPacketLen - ETH_HLEN
1471 );
1472
1473 } else {
1474 // while bRelayPacketSend psEthHeader is point to header+payload
1475 memcpy((pbyPayloadHead + cb802_1_H_len), ((u8 *)psEthHeader) + ETH_HLEN, uSkbPacketLen - ETH_HLEN);
1476 }
1477
1478 ASSERT(uLength == cbNdisBodySize);
1479
1480 if ((bNeedEncryption == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1481
1482 ///////////////////////////////////////////////////////////////////
1483
1484 if (pDevice->vnt_mgmt.eAuthenMode == WMAC_AUTH_WPANONE) {
1485 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
1486 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
1487 }
1488 else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1489 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
1490 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
1491 }
1492 else {
1493 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[24]);
1494 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[28]);
1495 }
1496 // DO Software Michael
1497 MIC_vInit(dwMICKey0, dwMICKey1);
1498 MIC_vAppend((u8 *)&(psEthHeader->h_dest[0]), 12);
1499 dwMIC_Priority = 0;
1500 MIC_vAppend((u8 *)&dwMIC_Priority, 4);
1501 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %X, %X\n",
1502 dwMICKey0, dwMICKey1);
1503
1504 ///////////////////////////////////////////////////////////////////
1505
1506 //DBG_PRN_GRP12(("Length:%d, %d\n", cbFrameBodySize, uFromHDtoPLDLength));
1507 //for (ii = 0; ii < cbFrameBodySize; ii++) {
1508 // DBG_PRN_GRP12(("%02x ", *((u8 *)((pbyPayloadHead + cb802_1_H_len) + ii))));
1509 //}
1510 //DBG_PRN_GRP12(("\n\n\n"));
1511
1512 MIC_vAppend(pbyPayloadHead, cbFrameBodySize);
1513
1514 pdwMIC_L = (u32 *)(pbyPayloadHead + cbFrameBodySize);
1515 pdwMIC_R = (u32 *)(pbyPayloadHead + cbFrameBodySize + 4);
1516
1517 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1518 MIC_vUnInit();
1519
1520 if (pDevice->bTxMICFail == true) {
1521 *pdwMIC_L = 0;
1522 *pdwMIC_R = 0;
1523 pDevice->bTxMICFail = false;
1524 }
1525 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
1526 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
1527 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1528 }
1529
1530 if (bSoftWEP == true) {
1531
1532 s_vSWencryption(pDevice, pTransmitKey, (pbyPayloadHead), (u16)(cbFrameBodySize + cbMIClen));
1533
1534 } else if ( ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) && (bNeedEncryption == true)) ||
1535 ((pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) && (bNeedEncryption == true)) ||
1536 ((pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) && (bNeedEncryption == true)) ) {
1537 cbFrameSize -= cbICVlen;
1538 }
1539
1540 if (pDevice->bSoftwareGenCrcErr == true) {
1541 unsigned int cbLen;
1542 u32 * pdwCRC;
1543
1544 dwCRC = 0xFFFFFFFFL;
1545 cbLen = cbFrameSize - cbFCSlen;
1546 // calculate CRC, and wrtie CRC value to end of TD
1547 dwCRC = CRCdwGetCrc32Ex(pbyMacHdr, cbLen, dwCRC);
1548 pdwCRC = (u32 *)(pbyMacHdr + cbLen);
1549 // finally, we must invert dwCRC to get the correct answer
1550 *pdwCRC = ~dwCRC;
1551 // Force Error
1552 *pdwCRC -= 1;
1553 } else {
1554 cbFrameSize -= cbFCSlen;
1555 }
1556
1557 *pcbHeaderLen = cbHeaderLength;
1558 *pcbTotalLen = cbHeaderLength + cbFrameSize ;
1559
1560 //Set FragCtl in TxBufferHead
1561 pTxBufHead->wFragCtl |= (u16)byFragType;
1562
1563 return true;
1564
1565 }
1566
1567 /*+
1568 *
1569 * Description:
1570 * Translate 802.3 to 802.11 header
1571 *
1572 * Parameters:
1573 * In:
1574 * pDevice - Pointer to adapter
1575 * dwTxBufferAddr - Transmit Buffer
1576 * pPacket - Packet from upper layer
1577 * cbPacketSize - Transmit Data Length
1578 * Out:
1579 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
1580 * pcbAppendPayload - size of append payload for 802.1H translation
1581 *
1582 * Return Value: none
1583 *
1584 -*/
1585
1586 static void s_vGenerateMACHeader(struct vnt_private *pDevice,
1587 u8 *pbyBufferAddr, u16 wDuration, struct ethhdr *psEthHeader,
1588 int bNeedEncrypt, u16 wFragType, u32 uDMAIdx, u32 uFragIdx)
1589 {
1590 struct ieee80211_hdr *pMACHeader = (struct ieee80211_hdr *)pbyBufferAddr;
1591
1592 memset(pMACHeader, 0, (sizeof(struct ieee80211_hdr)));
1593
1594 if (uDMAIdx == TYPE_ATIMDMA) {
1595 pMACHeader->frame_control = TYPE_802_11_ATIM;
1596 } else {
1597 pMACHeader->frame_control = TYPE_802_11_DATA;
1598 }
1599
1600 if (pDevice->eOPMode == OP_MODE_AP) {
1601 memcpy(&(pMACHeader->addr1[0]),
1602 &(psEthHeader->h_dest[0]),
1603 ETH_ALEN);
1604 memcpy(&(pMACHeader->addr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
1605 memcpy(&(pMACHeader->addr3[0]),
1606 &(psEthHeader->h_source[0]),
1607 ETH_ALEN);
1608 pMACHeader->frame_control |= FC_FROMDS;
1609 } else {
1610 if (pDevice->eOPMode == OP_MODE_ADHOC) {
1611 memcpy(&(pMACHeader->addr1[0]),
1612 &(psEthHeader->h_dest[0]),
1613 ETH_ALEN);
1614 memcpy(&(pMACHeader->addr2[0]),
1615 &(psEthHeader->h_source[0]),
1616 ETH_ALEN);
1617 memcpy(&(pMACHeader->addr3[0]),
1618 &(pDevice->abyBSSID[0]),
1619 ETH_ALEN);
1620 } else {
1621 memcpy(&(pMACHeader->addr3[0]),
1622 &(psEthHeader->h_dest[0]),
1623 ETH_ALEN);
1624 memcpy(&(pMACHeader->addr2[0]),
1625 &(psEthHeader->h_source[0]),
1626 ETH_ALEN);
1627 memcpy(&(pMACHeader->addr1[0]),
1628 &(pDevice->abyBSSID[0]),
1629 ETH_ALEN);
1630 pMACHeader->frame_control |= FC_TODS;
1631 }
1632 }
1633
1634 if (bNeedEncrypt)
1635 pMACHeader->frame_control |= cpu_to_le16((u16)WLAN_SET_FC_ISWEP(1));
1636
1637 pMACHeader->duration_id = cpu_to_le16(wDuration);
1638
1639 if (pDevice->bLongHeader) {
1640 PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
1641 pMACHeader->frame_control |= (FC_TODS | FC_FROMDS);
1642 memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
1643 }
1644 pMACHeader->seq_ctrl = cpu_to_le16(pDevice->wSeqCounter << 4);
1645
1646 //Set FragNumber in Sequence Control
1647 pMACHeader->seq_ctrl |= cpu_to_le16((u16)uFragIdx);
1648
1649 if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
1650 pDevice->wSeqCounter++;
1651 if (pDevice->wSeqCounter > 0x0fff)
1652 pDevice->wSeqCounter = 0;
1653 }
1654
1655 if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) { //StartFrag or MidFrag
1656 pMACHeader->frame_control |= FC_MOREFRAG;
1657 }
1658 }
1659
1660 /*+
1661 *
1662 * Description:
1663 * Request instructs a MAC to transmit a 802.11 management packet through
1664 * the adapter onto the medium.
1665 *
1666 * Parameters:
1667 * In:
1668 * hDeviceContext - Pointer to the adapter
1669 * pPacket - A pointer to a descriptor for the packet to transmit
1670 * Out:
1671 * none
1672 *
1673 * Return Value: CMD_STATUS_PENDING if MAC Tx resource available; otherwise false
1674 *
1675 -*/
1676
1677 CMD_STATUS csMgmt_xmit(struct vnt_private *pDevice,
1678 struct vnt_tx_mgmt *pPacket)
1679 {
1680 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
1681 PTX_BUFFER pTX_Buffer;
1682 PSTxBufHead pTxBufHead;
1683 PUSB_SEND_CONTEXT pContext;
1684 struct ieee80211_hdr *pMACHeader;
1685 PSCTS pCTS;
1686 struct ethhdr sEthHeader;
1687 u8 byPktType, *pbyTxBufferAddr;
1688 void *pvRTS, *pvTxDataHd, *pvRrvTime, *pMICHDR;
1689 u32 uDuration, cbReqCount, cbHeaderSize, cbFrameBodySize, cbFrameSize;
1690 int bNeedACK, bIsPSPOLL = false;
1691 u32 cbIVlen = 0, cbICVlen = 0, cbMIClen = 0, cbFCSlen = 4;
1692 u32 uPadding = 0;
1693 u16 wTxBufSize;
1694 u32 cbMacHdLen;
1695 u16 wCurrentRate = RATE_1M;
1696
1697 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
1698
1699 if (NULL == pContext) {
1700 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
1701 return CMD_STATUS_RESOURCES;
1702 }
1703
1704 pTX_Buffer = (PTX_BUFFER) (&pContext->Data[0]);
1705 pbyTxBufferAddr = (u8 *)&(pTX_Buffer->adwTxKey[0]);
1706 cbFrameBodySize = pPacket->cbPayloadLen;
1707 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
1708 wTxBufSize = sizeof(STxBufHead);
1709 memset(pTxBufHead, 0, wTxBufSize);
1710
1711 if (pDevice->byBBType == BB_TYPE_11A) {
1712 wCurrentRate = RATE_6M;
1713 byPktType = PK_TYPE_11A;
1714 } else {
1715 wCurrentRate = RATE_1M;
1716 byPktType = PK_TYPE_11B;
1717 }
1718
1719 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
1720 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
1721 // And cmd timer will wait data pkt TX finish before scanning so it's OK
1722 // to set power here.
1723 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
1724 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
1725 } else {
1726 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
1727 }
1728 pDevice->wCurrentRate = wCurrentRate;
1729
1730 //Set packet type
1731 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
1732 pTxBufHead->wFIFOCtl = 0;
1733 }
1734 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
1735 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
1736 }
1737 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
1738 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
1739 }
1740 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
1741 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
1742 }
1743
1744 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
1745 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
1746
1747 if (is_multicast_ether_addr(pPacket->p80211Header->sA3.abyAddr1)) {
1748 bNeedACK = false;
1749 }
1750 else {
1751 bNeedACK = true;
1752 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1753 };
1754
1755 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
1756 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
1757
1758 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
1759 //Set Preamble type always long
1760 //pDevice->byPreambleType = PREAMBLE_LONG;
1761 // probe-response don't retry
1762 //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
1763 // bNeedACK = false;
1764 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
1765 //}
1766 }
1767
1768 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
1769
1770 if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
1771 bIsPSPOLL = true;
1772 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
1773 } else {
1774 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
1775 }
1776
1777 //Set FRAGCTL_MACHDCNT
1778 pTxBufHead->wFragCtl |= cpu_to_le16((u16)(cbMacHdLen << 10));
1779
1780 // Notes:
1781 // Although spec says MMPDU can be fragmented; In most case,
1782 // no one will send a MMPDU under fragmentation. With RTS may occur.
1783 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
1784
1785 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
1786 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
1787 cbIVlen = 4;
1788 cbICVlen = 4;
1789 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
1790 }
1791 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
1792 cbIVlen = 8;//IV+ExtIV
1793 cbMIClen = 8;
1794 cbICVlen = 4;
1795 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
1796 //We need to get seed here for filling TxKey entry.
1797 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
1798 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
1799 }
1800 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
1801 cbIVlen = 8;//RSN Header
1802 cbICVlen = 8;//MIC
1803 pTxBufHead->wFragCtl |= FRAGCTL_AES;
1804 pDevice->bAES = true;
1805 }
1806 //MAC Header should be padding 0 to DW alignment.
1807 uPadding = 4 - (cbMacHdLen%4);
1808 uPadding %= 4;
1809 }
1810
1811 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
1812
1813 //Set FIFOCTL_GrpAckPolicy
1814 if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
1815 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
1816 }
1817 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
1818
1819 //Set RrvTime/RTS/CTS Buffer
1820 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1821
1822 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1823 pMICHDR = NULL;
1824 pvRTS = NULL;
1825 pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1826 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
1827 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
1828 }
1829 else { // 802.11a/b packet
1830 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1831 pMICHDR = NULL;
1832 pvRTS = NULL;
1833 pCTS = NULL;
1834 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1835 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
1836 }
1837
1838 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0,
1839 (cbHeaderSize - wTxBufSize));
1840
1841 memcpy(&(sEthHeader.h_dest[0]),
1842 &(pPacket->p80211Header->sA3.abyAddr1[0]),
1843 ETH_ALEN);
1844 memcpy(&(sEthHeader.h_source[0]),
1845 &(pPacket->p80211Header->sA3.abyAddr2[0]),
1846 ETH_ALEN);
1847 //=========================
1848 // No Fragmentation
1849 //=========================
1850 pTxBufHead->wFragCtl |= (u16)FRAGCTL_NONFRAG;
1851
1852 //Fill FIFO,RrvTime,RTS,and CTS
1853 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
1854 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
1855
1856 //Fill DataHead
1857 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
1858 0, 0, 1, AUTO_FB_NONE);
1859
1860 pMACHeader = (struct ieee80211_hdr *) (pbyTxBufferAddr + cbHeaderSize);
1861
1862 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
1863
1864 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
1865 u8 * pbyIVHead;
1866 u8 * pbyPayloadHead;
1867 u8 * pbyBSSID;
1868 PSKeyItem pTransmitKey = NULL;
1869
1870 pbyIVHead = (u8 *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
1871 pbyPayloadHead = (u8 *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
1872 do {
1873 if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
1874 (pDevice->bLinkPass == true)) {
1875 pbyBSSID = pDevice->abyBSSID;
1876 // get pairwise key
1877 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
1878 // get group key
1879 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
1880 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
1881 break;
1882 }
1883 } else {
1884 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get PTK.\n");
1885 break;
1886 }
1887 }
1888 // get group key
1889 pbyBSSID = pDevice->abyBroadcastAddr;
1890 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
1891 pTransmitKey = NULL;
1892 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KEY is NULL. OP Mode[%d]\n", pDevice->eOPMode);
1893 } else {
1894 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
1895 }
1896 } while(false);
1897 //Fill TXKEY
1898 s_vFillTxKey(pDevice, (u8 *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
1899 (u8 *)pMACHeader, (u16)cbFrameBodySize, NULL);
1900
1901 memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
1902 memcpy(pbyPayloadHead, ((u8 *)(pPacket->p80211Header) + cbMacHdLen),
1903 cbFrameBodySize);
1904 }
1905 else {
1906 // Copy the Packet into a tx Buffer
1907 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
1908 }
1909
1910 pMACHeader->seq_ctrl = cpu_to_le16(pDevice->wSeqCounter << 4);
1911 pDevice->wSeqCounter++ ;
1912 if (pDevice->wSeqCounter > 0x0fff)
1913 pDevice->wSeqCounter = 0;
1914
1915 if (bIsPSPOLL) {
1916 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
1917 // of FIFO control header.
1918 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
1919 // in the same place of other packet's Duration-field).
1920 // And it will cause Cisco-AP to issue Disassociation-packet
1921 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1922 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
1923 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
1924 } else {
1925 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
1926 }
1927 }
1928
1929 pTX_Buffer->wTxByteCount = cpu_to_le16((u16)(cbReqCount));
1930 pTX_Buffer->byPKTNO = (u8) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
1931 pTX_Buffer->byType = 0x00;
1932
1933 pContext->pPacket = NULL;
1934 pContext->Type = CONTEXT_MGMT_PACKET;
1935 pContext->uBufLen = (u16)cbReqCount + 4; //USB header
1936
1937 if (WLAN_GET_FC_TODS(pMACHeader->frame_control) == 0) {
1938 s_vSaveTxPktInfo(pDevice, (u8) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->addr1[0]), (u16)cbFrameSize, pTX_Buffer->wFIFOCtl);
1939 }
1940 else {
1941 s_vSaveTxPktInfo(pDevice, (u8) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->addr3[0]), (u16)cbFrameSize, pTX_Buffer->wFIFOCtl);
1942 }
1943
1944 PIPEnsSendBulkOut(pDevice,pContext);
1945 return CMD_STATUS_PENDING;
1946 }
1947
1948 CMD_STATUS csBeacon_xmit(struct vnt_private *pDevice,
1949 struct vnt_tx_mgmt *pPacket)
1950 {
1951 u32 cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
1952 u32 cbHeaderSize = 0;
1953 u16 wTxBufSize = sizeof(STxShortBufHead);
1954 PSTxShortBufHead pTxBufHead;
1955 struct ieee80211_hdr *pMACHeader;
1956 PSTxDataHead_ab pTxDataHead;
1957 u16 wCurrentRate;
1958 u32 cbFrameBodySize;
1959 u32 cbReqCount;
1960 PBEACON_BUFFER pTX_Buffer;
1961 u8 *pbyTxBufferAddr;
1962 PUSB_SEND_CONTEXT pContext;
1963 CMD_STATUS status;
1964
1965 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
1966 if (NULL == pContext) {
1967 status = CMD_STATUS_RESOURCES;
1968 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
1969 return status ;
1970 }
1971 pTX_Buffer = (PBEACON_BUFFER) (&pContext->Data[0]);
1972 pbyTxBufferAddr = (u8 *)&(pTX_Buffer->wFIFOCtl);
1973
1974 cbFrameBodySize = pPacket->cbPayloadLen;
1975
1976 pTxBufHead = (PSTxShortBufHead) pbyTxBufferAddr;
1977 wTxBufSize = sizeof(STxShortBufHead);
1978 memset(pTxBufHead, 0, wTxBufSize);
1979
1980 if (pDevice->byBBType == BB_TYPE_11A) {
1981 wCurrentRate = RATE_6M;
1982 pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
1983 //Get SignalField,ServiceField,Length
1984 BBvCalculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11A,
1985 (u16 *)&(pTxDataHead->wTransmitLength), (u8 *)&(pTxDataHead->byServiceField), (u8 *)&(pTxDataHead->bySignalField)
1986 );
1987 //Get Duration and TimeStampOff
1988 pTxDataHead->wDuration = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameSize, PK_TYPE_11A,
1989 wCurrentRate, false, 0, 0, 1, AUTO_FB_NONE));
1990 pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
1991 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
1992 } else {
1993 wCurrentRate = RATE_1M;
1994 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
1995 pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
1996 //Get SignalField,ServiceField,Length
1997 BBvCalculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11B,
1998 (u16 *)&(pTxDataHead->wTransmitLength), (u8 *)&(pTxDataHead->byServiceField), (u8 *)&(pTxDataHead->bySignalField)
1999 );
2000 //Get Duration and TimeStampOff
2001 pTxDataHead->wDuration = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameSize, PK_TYPE_11B,
2002 wCurrentRate, false, 0, 0, 1, AUTO_FB_NONE));
2003 pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
2004 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2005 }
2006
2007 //Generate Beacon Header
2008 pMACHeader = (struct ieee80211_hdr *)(pbyTxBufferAddr + cbHeaderSize);
2009 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2010
2011 pMACHeader->duration_id = 0;
2012 pMACHeader->seq_ctrl = cpu_to_le16(pDevice->wSeqCounter << 4);
2013 pDevice->wSeqCounter++ ;
2014 if (pDevice->wSeqCounter > 0x0fff)
2015 pDevice->wSeqCounter = 0;
2016
2017 cbReqCount = cbHeaderSize + WLAN_HDR_ADDR3_LEN + cbFrameBodySize;
2018
2019 pTX_Buffer->wTxByteCount = (u16)cbReqCount;
2020 pTX_Buffer->byPKTNO = (u8) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2021 pTX_Buffer->byType = 0x01;
2022
2023 pContext->pPacket = NULL;
2024 pContext->Type = CONTEXT_MGMT_PACKET;
2025 pContext->uBufLen = (u16)cbReqCount + 4; //USB header
2026
2027 PIPEnsSendBulkOut(pDevice,pContext);
2028 return CMD_STATUS_PENDING;
2029
2030 }
2031
2032 void vDMA0_tx_80211(struct vnt_private *pDevice, struct sk_buff *skb)
2033 {
2034 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
2035 u8 byPktType;
2036 u8 *pbyTxBufferAddr;
2037 void *pvRTS, *pvCTS, *pvTxDataHd;
2038 u32 uDuration, cbReqCount;
2039 struct ieee80211_hdr *pMACHeader;
2040 u32 cbHeaderSize, cbFrameBodySize;
2041 int bNeedACK, bIsPSPOLL = false;
2042 PSTxBufHead pTxBufHead;
2043 u32 cbFrameSize;
2044 u32 cbIVlen = 0, cbICVlen = 0, cbMIClen = 0, cbFCSlen = 4;
2045 u32 uPadding = 0;
2046 u32 cbMICHDR = 0, uLength = 0;
2047 u32 dwMICKey0, dwMICKey1;
2048 u32 dwMIC_Priority;
2049 u32 *pdwMIC_L, *pdwMIC_R;
2050 u16 wTxBufSize;
2051 u32 cbMacHdLen;
2052 struct ethhdr sEthHeader;
2053 void *pvRrvTime, *pMICHDR;
2054 u32 wCurrentRate = RATE_1M;
2055 PUWLAN_80211HDR p80211Header;
2056 u32 uNodeIndex = 0;
2057 int bNodeExist = false;
2058 SKeyItem STempKey;
2059 PSKeyItem pTransmitKey = NULL;
2060 u8 *pbyIVHead, *pbyPayloadHead, *pbyMacHdr;
2061 u32 cbExtSuppRate = 0;
2062 PTX_BUFFER pTX_Buffer;
2063 PUSB_SEND_CONTEXT pContext;
2064
2065 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2066
2067 if(skb->len <= WLAN_HDR_ADDR3_LEN) {
2068 cbFrameBodySize = 0;
2069 }
2070 else {
2071 cbFrameBodySize = skb->len - WLAN_HDR_ADDR3_LEN;
2072 }
2073 p80211Header = (PUWLAN_80211HDR)skb->data;
2074
2075 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2076
2077 if (NULL == pContext) {
2078 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0 TX...NO CONTEXT!\n");
2079 dev_kfree_skb_irq(skb);
2080 return ;
2081 }
2082
2083 pTX_Buffer = (PTX_BUFFER)(&pContext->Data[0]);
2084 pbyTxBufferAddr = (u8 *)(&pTX_Buffer->adwTxKey[0]);
2085 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2086 wTxBufSize = sizeof(STxBufHead);
2087 memset(pTxBufHead, 0, wTxBufSize);
2088
2089 if (pDevice->byBBType == BB_TYPE_11A) {
2090 wCurrentRate = RATE_6M;
2091 byPktType = PK_TYPE_11A;
2092 } else {
2093 wCurrentRate = RATE_1M;
2094 byPktType = PK_TYPE_11B;
2095 }
2096
2097 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2098 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2099 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2100 // to set power here.
2101 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
2102 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2103 } else {
2104 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2105 }
2106
2107 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x \n", p80211Header->sA3.wFrameCtl);
2108
2109 //Set packet type
2110 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2111 pTxBufHead->wFIFOCtl = 0;
2112 }
2113 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2114 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2115 }
2116 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2117 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2118 }
2119 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2120 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2121 }
2122
2123 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2124 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2125
2126 if (is_multicast_ether_addr(p80211Header->sA3.abyAddr1)) {
2127 bNeedACK = false;
2128 if (pDevice->bEnableHostWEP) {
2129 uNodeIndex = 0;
2130 bNodeExist = true;
2131 }
2132 }
2133 else {
2134 if (pDevice->bEnableHostWEP) {
2135 if (BSSbIsSTAInNodeDB(pDevice, (u8 *)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2136 bNodeExist = true;
2137 }
2138 bNeedACK = true;
2139 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2140 };
2141
2142 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2143 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2144
2145 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2146 //Set Preamble type always long
2147 //pDevice->byPreambleType = PREAMBLE_LONG;
2148
2149 // probe-response don't retry
2150 //if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2151 // bNeedACK = false;
2152 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2153 //}
2154 }
2155
2156 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2157
2158 if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2159 bIsPSPOLL = true;
2160 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2161 } else {
2162 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2163 }
2164
2165 // hostapd daemon ext support rate patch
2166 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2167
2168 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0) {
2169 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2170 }
2171
2172 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0) {
2173 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2174 }
2175
2176 if (cbExtSuppRate >0) {
2177 cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2178 }
2179 }
2180
2181 //Set FRAGCTL_MACHDCNT
2182 pTxBufHead->wFragCtl |= cpu_to_le16((u16)cbMacHdLen << 10);
2183
2184 // Notes:
2185 // Although spec says MMPDU can be fragmented; In most case,
2186 // no one will send a MMPDU under fragmentation. With RTS may occur.
2187 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
2188
2189 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2190 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2191 cbIVlen = 4;
2192 cbICVlen = 4;
2193 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2194 }
2195 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2196 cbIVlen = 8;//IV+ExtIV
2197 cbMIClen = 8;
2198 cbICVlen = 4;
2199 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2200 //We need to get seed here for filling TxKey entry.
2201 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2202 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2203 }
2204 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2205 cbIVlen = 8;//RSN Header
2206 cbICVlen = 8;//MIC
2207 cbMICHDR = sizeof(SMICHDRHead);
2208 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2209 pDevice->bAES = true;
2210 }
2211 //MAC Header should be padding 0 to DW alignment.
2212 uPadding = 4 - (cbMacHdLen%4);
2213 uPadding %= 4;
2214 }
2215
2216 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
2217
2218 //Set FIFOCTL_GrpAckPolicy
2219 if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
2220 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2221 }
2222 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2223
2224 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2225
2226 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2227 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2228 pvRTS = NULL;
2229 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
2230 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
2231 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
2232
2233 }
2234 else {//802.11a/b packet
2235
2236 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2237 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2238 pvRTS = NULL;
2239 pvCTS = NULL;
2240 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
2241 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
2242 }
2243 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0,
2244 (cbHeaderSize - wTxBufSize));
2245 memcpy(&(sEthHeader.h_dest[0]),
2246 &(p80211Header->sA3.abyAddr1[0]),
2247 ETH_ALEN);
2248 memcpy(&(sEthHeader.h_source[0]),
2249 &(p80211Header->sA3.abyAddr2[0]),
2250 ETH_ALEN);
2251 //=========================
2252 // No Fragmentation
2253 //=========================
2254 pTxBufHead->wFragCtl |= (u16)FRAGCTL_NONFRAG;
2255
2256 //Fill FIFO,RrvTime,RTS,and CTS
2257 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
2258 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
2259
2260 //Fill DataHead
2261 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2262 0, 0, 1, AUTO_FB_NONE);
2263
2264 pMACHeader = (struct ieee80211_hdr *) (pbyTxBufferAddr + cbHeaderSize);
2265
2266 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
2267
2268 pbyMacHdr = (u8 *)(pbyTxBufferAddr + cbHeaderSize);
2269 pbyPayloadHead = (u8 *)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
2270 pbyIVHead = (u8 *)(pbyMacHdr + cbMacHdLen + uPadding);
2271
2272 // Copy the Packet into a tx Buffer
2273 memcpy(pbyMacHdr, skb->data, cbMacHdLen);
2274
2275 // version set to 0, patch for hostapd deamon
2276 pMACHeader->frame_control &= cpu_to_le16(0xfffc);
2277 memcpy(pbyPayloadHead, (skb->data + cbMacHdLen), cbFrameBodySize);
2278
2279 // replace support rate, patch for hostapd daemon( only support 11M)
2280 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2281 if (cbExtSuppRate != 0) {
2282 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2283 memcpy((pbyPayloadHead + cbFrameBodySize),
2284 pMgmt->abyCurrSuppRates,
2285 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
2286 );
2287 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2288 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
2289 pMgmt->abyCurrExtSuppRates,
2290 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
2291 );
2292 }
2293 }
2294
2295 // Set wep
2296 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2297
2298 if (pDevice->bEnableHostWEP) {
2299 pTransmitKey = &STempKey;
2300 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2301 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2302 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2303 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2304 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2305 memcpy(pTransmitKey->abyKey,
2306 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2307 pTransmitKey->uKeyLength
2308 );
2309 }
2310
2311 if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
2312
2313 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
2314 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
2315
2316 // DO Software Michael
2317 MIC_vInit(dwMICKey0, dwMICKey1);
2318 MIC_vAppend((u8 *)&(sEthHeader.h_dest[0]), 12);
2319 dwMIC_Priority = 0;
2320 MIC_vAppend((u8 *)&dwMIC_Priority, 4);
2321 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY:"\
2322 " %X, %X\n", dwMICKey0, dwMICKey1);
2323
2324 uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
2325
2326 MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
2327
2328 pdwMIC_L = (u32 *)(pbyTxBufferAddr + uLength + cbFrameBodySize);
2329 pdwMIC_R = (u32 *)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
2330
2331 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2332 MIC_vUnInit();
2333
2334 if (pDevice->bTxMICFail == true) {
2335 *pdwMIC_L = 0;
2336 *pdwMIC_R = 0;
2337 pDevice->bTxMICFail = false;
2338 }
2339
2340 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
2341 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen);
2342 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%x, %x\n",
2343 *pdwMIC_L, *pdwMIC_R);
2344
2345 }
2346
2347 s_vFillTxKey(pDevice, (u8 *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2348 pbyMacHdr, (u16)cbFrameBodySize, (u8 *)pMICHDR);
2349
2350 if (pDevice->bEnableHostWEP) {
2351 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
2352 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
2353 }
2354
2355 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
2356 s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (u16)(cbFrameBodySize + cbMIClen));
2357 }
2358 }
2359
2360 pMACHeader->seq_ctrl = cpu_to_le16(pDevice->wSeqCounter << 4);
2361 pDevice->wSeqCounter++ ;
2362 if (pDevice->wSeqCounter > 0x0fff)
2363 pDevice->wSeqCounter = 0;
2364
2365 if (bIsPSPOLL) {
2366 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2367 // of FIFO control header.
2368 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2369 // in the same place of other packet's Duration-field).
2370 // And it will cause Cisco-AP to issue Disassociation-packet
2371 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2372 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
2373 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
2374 } else {
2375 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
2376 }
2377 }
2378
2379 pTX_Buffer->wTxByteCount = cpu_to_le16((u16)(cbReqCount));
2380 pTX_Buffer->byPKTNO = (u8) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2381 pTX_Buffer->byType = 0x00;
2382
2383 pContext->pPacket = skb;
2384 pContext->Type = CONTEXT_MGMT_PACKET;
2385 pContext->uBufLen = (u16)cbReqCount + 4; //USB header
2386
2387 if (WLAN_GET_FC_TODS(pMACHeader->frame_control) == 0) {
2388 s_vSaveTxPktInfo(pDevice, (u8) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->addr1[0]), (u16)cbFrameSize, pTX_Buffer->wFIFOCtl);
2389 }
2390 else {
2391 s_vSaveTxPktInfo(pDevice, (u8) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->addr3[0]), (u16)cbFrameSize, pTX_Buffer->wFIFOCtl);
2392 }
2393 PIPEnsSendBulkOut(pDevice,pContext);
2394 return ;
2395
2396 }
2397
2398 //TYPE_AC0DMA data tx
2399 /*
2400 * Description:
2401 * Tx packet via AC0DMA(DMA1)
2402 *
2403 * Parameters:
2404 * In:
2405 * pDevice - Pointer to the adapter
2406 * skb - Pointer to tx skb packet
2407 * Out:
2408 * void
2409 *
2410 * Return Value: NULL
2411 */
2412
2413 int nsDMA_tx_packet(struct vnt_private *pDevice,
2414 u32 uDMAIdx, struct sk_buff *skb)
2415 {
2416 struct net_device_stats *pStats = &pDevice->stats;
2417 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
2418 u32 BytesToWrite = 0, uHeaderLen = 0;
2419 u32 uNodeIndex = 0;
2420 u8 byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
2421 u16 wAID;
2422 u8 byPktType;
2423 int bNeedEncryption = false;
2424 PSKeyItem pTransmitKey = NULL;
2425 SKeyItem STempKey;
2426 int ii;
2427 int bTKIP_UseGTK = false;
2428 int bNeedDeAuth = false;
2429 u8 *pbyBSSID;
2430 int bNodeExist = false;
2431 PUSB_SEND_CONTEXT pContext;
2432 bool fConvertedPacket;
2433 PTX_BUFFER pTX_Buffer;
2434 u32 status;
2435 u16 wKeepRate = pDevice->wCurrentRate;
2436 int bTxeapol_key = false;
2437
2438 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2439
2440 if (pDevice->uAssocCount == 0) {
2441 dev_kfree_skb_irq(skb);
2442 return 0;
2443 }
2444
2445 if (is_multicast_ether_addr((u8 *)(skb->data))) {
2446 uNodeIndex = 0;
2447 bNodeExist = true;
2448 if (pMgmt->sNodeDBTable[0].bPSEnable) {
2449
2450 skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
2451 pMgmt->sNodeDBTable[0].wEnQueueCnt++;
2452 // set tx map
2453 pMgmt->abyPSTxMap[0] |= byMask[0];
2454 return 0;
2455 }
2456 // multicast/broadcast data rate
2457
2458 if (pDevice->byBBType != BB_TYPE_11A)
2459 pDevice->wCurrentRate = RATE_2M;
2460 else
2461 pDevice->wCurrentRate = RATE_24M;
2462 // long preamble type
2463 pDevice->byPreambleType = PREAMBLE_SHORT;
2464
2465 }else {
2466
2467 if (BSSbIsSTAInNodeDB(pDevice, (u8 *)(skb->data), &uNodeIndex)) {
2468
2469 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
2470
2471 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
2472
2473 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
2474 // set tx map
2475 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
2476 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
2477 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set:pMgmt->abyPSTxMap[%d]= %d\n",
2478 (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]);
2479
2480 return 0;
2481 }
2482 // AP rate decided from node
2483 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2484 // tx preamble decided from node
2485
2486 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2487 pDevice->byPreambleType = pDevice->byShortPreamble;
2488
2489 }else {
2490 pDevice->byPreambleType = PREAMBLE_LONG;
2491 }
2492 bNodeExist = true;
2493 }
2494 }
2495
2496 if (bNodeExist == false) {
2497 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Unknown STA not found in node DB \n");
2498 dev_kfree_skb_irq(skb);
2499 return 0;
2500 }
2501 }
2502
2503 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2504
2505 if (pContext == NULL) {
2506 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG" pContext == NULL\n");
2507 dev_kfree_skb_irq(skb);
2508 return STATUS_RESOURCES;
2509 }
2510
2511 memcpy(pDevice->sTxEthHeader.h_dest, (u8 *)(skb->data), ETH_HLEN);
2512
2513 //mike add:station mode check eapol-key challenge--->
2514 {
2515 u8 Protocol_Version; //802.1x Authentication
2516 u8 Packet_Type; //802.1x Authentication
2517 u8 Descriptor_type;
2518 u16 Key_info;
2519
2520 Protocol_Version = skb->data[ETH_HLEN];
2521 Packet_Type = skb->data[ETH_HLEN+1];
2522 Descriptor_type = skb->data[ETH_HLEN+1+1+2];
2523 Key_info = (skb->data[ETH_HLEN+1+1+2+1] << 8)|(skb->data[ETH_HLEN+1+1+2+2]);
2524 if (pDevice->sTxEthHeader.h_proto == cpu_to_be16(ETH_P_PAE)) {
2525 /* 802.1x OR eapol-key challenge frame transfer */
2526 if (((Protocol_Version == 1) || (Protocol_Version == 2)) &&
2527 (Packet_Type == 3)) {
2528 bTxeapol_key = true;
2529 if(!(Key_info & BIT3) && //WPA or RSN group-key challenge
2530 (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key
2531 if(Descriptor_type==254) {
2532 pDevice->fWPA_Authened = true;
2533 PRINT_K("WPA ");
2534 }
2535 else {
2536 pDevice->fWPA_Authened = true;
2537 PRINT_K("WPA2(re-keying) ");
2538 }
2539 PRINT_K("Authentication completed!!\n");
2540 }
2541 else if((Key_info & BIT3) && (Descriptor_type==2) && //RSN pairwise-key challenge
2542 (Key_info & BIT8) && (Key_info & BIT9)) {
2543 pDevice->fWPA_Authened = true;
2544 PRINT_K("WPA2 Authentication completed!!\n");
2545 }
2546 }
2547 }
2548 }
2549 //mike add:station mode check eapol-key challenge<---
2550
2551 if (pDevice->bEncryptionEnable == true) {
2552 bNeedEncryption = true;
2553 // get Transmit key
2554 do {
2555 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
2556 (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2557 pbyBSSID = pDevice->abyBSSID;
2558 // get pairwise key
2559 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
2560 // get group key
2561 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
2562 bTKIP_UseGTK = true;
2563 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2564 break;
2565 }
2566 } else {
2567 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n");
2568 break;
2569 }
2570 }else if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2571 /* TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1 */
2572 pbyBSSID = pDevice->sTxEthHeader.h_dest;
2573 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS Serach Key: \n");
2574 for (ii = 0; ii< 6; ii++)
2575 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"%x \n", *(pbyBSSID+ii));
2576 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"\n");
2577
2578 // get pairwise key
2579 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == true)
2580 break;
2581 }
2582 // get group key
2583 pbyBSSID = pDevice->abyBroadcastAddr;
2584 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
2585 pTransmitKey = NULL;
2586 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2587 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
2588 }
2589 else
2590 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
2591 } else {
2592 bTKIP_UseGTK = true;
2593 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2594 }
2595 } while(false);
2596 }
2597
2598 if (pDevice->bEnableHostWEP) {
2599 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"acdma0: STA index %d\n", uNodeIndex);
2600 if (pDevice->bEncryptionEnable == true) {
2601 pTransmitKey = &STempKey;
2602 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2603 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2604 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2605 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2606 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2607 memcpy(pTransmitKey->abyKey,
2608 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2609 pTransmitKey->uKeyLength
2610 );
2611 }
2612 }
2613
2614 byPktType = (u8)pDevice->byPacketType;
2615
2616 if (pDevice->bFixRate) {
2617 if (pDevice->byBBType == BB_TYPE_11B) {
2618 if (pDevice->uConnectionRate >= RATE_11M) {
2619 pDevice->wCurrentRate = RATE_11M;
2620 } else {
2621 pDevice->wCurrentRate = (u16)pDevice->uConnectionRate;
2622 }
2623 } else {
2624 if ((pDevice->byBBType == BB_TYPE_11A) &&
2625 (pDevice->uConnectionRate <= RATE_6M)) {
2626 pDevice->wCurrentRate = RATE_6M;
2627 } else {
2628 if (pDevice->uConnectionRate >= RATE_54M)
2629 pDevice->wCurrentRate = RATE_54M;
2630 else
2631 pDevice->wCurrentRate = (u16)pDevice->uConnectionRate;
2632 }
2633 }
2634 }
2635 else {
2636 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2637 // Adhoc Tx rate decided from node DB
2638 if (is_multicast_ether_addr(pDevice->sTxEthHeader.h_dest)) {
2639 // Multicast use highest data rate
2640 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
2641 // preamble type
2642 pDevice->byPreambleType = pDevice->byShortPreamble;
2643 }
2644 else {
2645 if (BSSbIsSTAInNodeDB(pDevice, &(pDevice->sTxEthHeader.h_dest[0]), &uNodeIndex)) {
2646 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2647 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2648 pDevice->byPreambleType = pDevice->byShortPreamble;
2649
2650 }
2651 else {
2652 pDevice->byPreambleType = PREAMBLE_LONG;
2653 }
2654 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Found Node Index is [%d] Tx Data Rate:[%d]\n",uNodeIndex, pDevice->wCurrentRate);
2655 }
2656 else {
2657 if (pDevice->byBBType != BB_TYPE_11A)
2658 pDevice->wCurrentRate = RATE_2M;
2659 else
2660 pDevice->wCurrentRate = RATE_24M; // refer to vMgrCreateOwnIBSS()'s
2661 // abyCurrExtSuppRates[]
2662 pDevice->byPreambleType = PREAMBLE_SHORT;
2663 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Not Found Node use highest basic Rate.....\n");
2664 }
2665 }
2666 }
2667 if (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) {
2668 // Infra STA rate decided from AP Node, index = 0
2669 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
2670 }
2671 }
2672
2673 if (pDevice->sTxEthHeader.h_proto == cpu_to_be16(ETH_P_PAE)) {
2674 if (pDevice->byBBType != BB_TYPE_11A) {
2675 pDevice->wCurrentRate = RATE_1M;
2676 pDevice->byACKRate = RATE_1M;
2677 pDevice->byTopCCKBasicRate = RATE_1M;
2678 pDevice->byTopOFDMBasicRate = RATE_6M;
2679 } else {
2680 pDevice->wCurrentRate = RATE_6M;
2681 pDevice->byACKRate = RATE_6M;
2682 pDevice->byTopCCKBasicRate = RATE_1M;
2683 pDevice->byTopOFDMBasicRate = RATE_6M;
2684 }
2685 }
2686
2687 DBG_PRT(MSG_LEVEL_DEBUG,
2688 KERN_INFO "dma_tx: pDevice->wCurrentRate = %d\n",
2689 pDevice->wCurrentRate);
2690
2691 if (wKeepRate != pDevice->wCurrentRate) {
2692 bScheduleCommand((void *) pDevice, WLAN_CMD_SETPOWER, NULL);
2693 }
2694
2695 if (pDevice->wCurrentRate <= RATE_11M) {
2696 byPktType = PK_TYPE_11B;
2697 }
2698
2699 if (bNeedEncryption == true) {
2700 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.h_proto));
2701 if ((pDevice->sTxEthHeader.h_proto) == cpu_to_be16(ETH_P_PAE)) {
2702 bNeedEncryption = false;
2703 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.h_proto));
2704 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2705 if (pTransmitKey == NULL) {
2706 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Don't Find TX KEY\n");
2707 }
2708 else {
2709 if (bTKIP_UseGTK == true) {
2710 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n");
2711 }
2712 else {
2713 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%X]\n",
2714 pTransmitKey->dwKeyIndex);
2715 bNeedEncryption = true;
2716 }
2717 }
2718 }
2719
2720 if (pDevice->bEnableHostWEP) {
2721 if ((uNodeIndex != 0) &&
2722 (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) {
2723 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%X]\n",
2724 pTransmitKey->dwKeyIndex);
2725 bNeedEncryption = true;
2726 }
2727 }
2728 }
2729 else {
2730
2731 if (pTransmitKey == NULL) {
2732 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
2733 pContext->bBoolInUse = false;
2734 dev_kfree_skb_irq(skb);
2735 pStats->tx_dropped++;
2736 return STATUS_FAILURE;
2737 }
2738 }
2739 }
2740
2741 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
2742 (u8 *)(&pContext->Data[0]), bNeedEncryption,
2743 skb->len, uDMAIdx, &pDevice->sTxEthHeader,
2744 (u8 *)skb->data, pTransmitKey, uNodeIndex,
2745 pDevice->wCurrentRate,
2746 &uHeaderLen, &BytesToWrite
2747 );
2748
2749 if (fConvertedPacket == false) {
2750 pContext->bBoolInUse = false;
2751 dev_kfree_skb_irq(skb);
2752 return STATUS_FAILURE;
2753 }
2754
2755 if ( pDevice->bEnablePSMode == true ) {
2756 if ( !pDevice->bPSModeTxBurst ) {
2757 bScheduleCommand((void *) pDevice,
2758 WLAN_CMD_MAC_DISPOWERSAVING,
2759 NULL);
2760 pDevice->bPSModeTxBurst = true;
2761 }
2762 }
2763
2764 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
2765 pTX_Buffer->byPKTNO = (u8) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2766 pTX_Buffer->wTxByteCount = (u16)BytesToWrite;
2767
2768 pContext->pPacket = skb;
2769 pContext->Type = CONTEXT_DATA_PACKET;
2770 pContext->uBufLen = (u16)BytesToWrite + 4 ; //USB header
2771
2772 s_vSaveTxPktInfo(pDevice, (u8) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.h_dest[0]), (u16) (BytesToWrite-uHeaderLen), pTX_Buffer->wFIFOCtl);
2773
2774 status = PIPEnsSendBulkOut(pDevice,pContext);
2775
2776 if (bNeedDeAuth == true) {
2777 u16 wReason = WLAN_MGMT_REASON_MIC_FAILURE;
2778
2779 bScheduleCommand((void *) pDevice, WLAN_CMD_DEAUTH, (u8 *) &wReason);
2780 }
2781
2782 if(status!=STATUS_PENDING) {
2783 pContext->bBoolInUse = false;
2784 dev_kfree_skb_irq(skb);
2785 return STATUS_FAILURE;
2786 }
2787 else
2788 return 0;
2789
2790 }
2791
2792 /*
2793 * Description:
2794 * Relay packet send (AC1DMA) from rx dpc.
2795 *
2796 * Parameters:
2797 * In:
2798 * pDevice - Pointer to the adapter
2799 * pPacket - Pointer to rx packet
2800 * cbPacketSize - rx ethernet frame size
2801 * Out:
2802 * TURE, false
2803 *
2804 * Return Value: Return true if packet is copy to dma1; otherwise false
2805 */
2806
2807 int bRelayPacketSend(struct vnt_private *pDevice, u8 *pbySkbData, u32 uDataLen,
2808 u32 uNodeIndex)
2809 {
2810 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
2811 u32 BytesToWrite = 0, uHeaderLen = 0;
2812 u8 byPktType = PK_TYPE_11B;
2813 int bNeedEncryption = false;
2814 SKeyItem STempKey;
2815 PSKeyItem pTransmitKey = NULL;
2816 u8 *pbyBSSID;
2817 PUSB_SEND_CONTEXT pContext;
2818 u8 byPktTyp;
2819 int fConvertedPacket;
2820 PTX_BUFFER pTX_Buffer;
2821 u32 status;
2822 u16 wKeepRate = pDevice->wCurrentRate;
2823
2824 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2825
2826 if (NULL == pContext) {
2827 return false;
2828 }
2829
2830 memcpy(pDevice->sTxEthHeader.h_dest, (u8 *)pbySkbData, ETH_HLEN);
2831
2832 if (pDevice->bEncryptionEnable == true) {
2833 bNeedEncryption = true;
2834 // get group key
2835 pbyBSSID = pDevice->abyBroadcastAddr;
2836 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
2837 pTransmitKey = NULL;
2838 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"KEY is NULL. [%d]\n", pMgmt->eCurrMode);
2839 } else {
2840 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2841 }
2842 }
2843
2844 if (pDevice->bEnableHostWEP) {
2845 if (uNodeIndex < MAX_NODE_NUM + 1) {
2846 pTransmitKey = &STempKey;
2847 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2848 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2849 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2850 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2851 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2852 memcpy(pTransmitKey->abyKey,
2853 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2854 pTransmitKey->uKeyLength
2855 );
2856 }
2857 }
2858
2859 if ( bNeedEncryption && (pTransmitKey == NULL) ) {
2860 pContext->bBoolInUse = false;
2861 return false;
2862 }
2863
2864 byPktTyp = (u8)pDevice->byPacketType;
2865
2866 if (pDevice->bFixRate) {
2867 if (pDevice->byBBType == BB_TYPE_11B) {
2868 if (pDevice->uConnectionRate >= RATE_11M) {
2869 pDevice->wCurrentRate = RATE_11M;
2870 } else {
2871 pDevice->wCurrentRate = (u16)pDevice->uConnectionRate;
2872 }
2873 } else {
2874 if ((pDevice->byBBType == BB_TYPE_11A) &&
2875 (pDevice->uConnectionRate <= RATE_6M)) {
2876 pDevice->wCurrentRate = RATE_6M;
2877 } else {
2878 if (pDevice->uConnectionRate >= RATE_54M)
2879 pDevice->wCurrentRate = RATE_54M;
2880 else
2881 pDevice->wCurrentRate = (u16)pDevice->uConnectionRate;
2882 }
2883 }
2884 }
2885 else {
2886 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2887 }
2888
2889 if (wKeepRate != pDevice->wCurrentRate) {
2890 bScheduleCommand((void *) pDevice, WLAN_CMD_SETPOWER, NULL);
2891 }
2892
2893 if (pDevice->wCurrentRate <= RATE_11M)
2894 byPktType = PK_TYPE_11B;
2895
2896 BytesToWrite = uDataLen + ETH_FCS_LEN;
2897
2898 // Convert the packet to an usb frame and copy into our buffer
2899 // and send the irp.
2900
2901 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
2902 (u8 *)(&pContext->Data[0]), bNeedEncryption,
2903 uDataLen, TYPE_AC0DMA, &pDevice->sTxEthHeader,
2904 pbySkbData, pTransmitKey, uNodeIndex,
2905 pDevice->wCurrentRate,
2906 &uHeaderLen, &BytesToWrite
2907 );
2908
2909 if (fConvertedPacket == false) {
2910 pContext->bBoolInUse = false;
2911 return false;
2912 }
2913
2914 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
2915 pTX_Buffer->byPKTNO = (u8) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2916 pTX_Buffer->wTxByteCount = (u16)BytesToWrite;
2917
2918 pContext->pPacket = NULL;
2919 pContext->Type = CONTEXT_DATA_PACKET;
2920 pContext->uBufLen = (u16)BytesToWrite + 4 ; //USB header
2921
2922 s_vSaveTxPktInfo(pDevice, (u8) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.h_dest[0]), (u16) (BytesToWrite-uHeaderLen), pTX_Buffer->wFIFOCtl);
2923
2924 status = PIPEnsSendBulkOut(pDevice,pContext);
2925
2926 return true;
2927 }
2928