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