Blame view

drivers/staging/vt6655/rxtx.c 130 KB
5449c685a   Forest Bond   Staging: Add pris...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  /*
   * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
   * All rights reserved.
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License along
   * with this program; if not, write to the Free Software Foundation, Inc.,
   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
   *
   * File: rxtx.c
   *
   * Purpose: handle WMAC/802.3/802.11 rx & tx functions
   *
   * Author: Lyndon Chen
   *
   * Date: May 20, 2003
   *
   * Functions:
f77f13e22   Gilles Espinasse   Fix comment and K...
28
   *      s_vGenerateTxParameter - Generate tx dma required parameter.
5449c685a   Forest Bond   Staging: Add pris...
29
   *      vGenerateMACHeader - Translate 802.3 to 802.11 header
f77f13e22   Gilles Espinasse   Fix comment and K...
30
   *      cbGetFragCount - Caculate fragment number count
5449c685a   Forest Bond   Staging: Add pris...
31
32
33
34
35
   *      csBeacon_xmit - beacon tx function
   *      csMgmt_xmit - management tx function
   *      s_cbFillTxBufHead - fulfill tx dma buffer header
   *      s_uGetDataDuration - get tx data required duration
   *      s_uFillDataHead- fulfill tx data duration header
f77f13e22   Gilles Espinasse   Fix comment and K...
36
   *      s_uGetRTSCTSDuration- get rtx/cts required duration
5449c685a   Forest Bond   Staging: Add pris...
37
38
39
   *      s_uGetRTSCTSRsvTime- get rts/cts reserved time
   *      s_uGetTxRsvTime- get frame reserved time
   *      s_vFillCTSHead- fulfill CTS ctl header
f77f13e22   Gilles Espinasse   Fix comment and K...
40
   *      s_vFillFragParameter- Set fragment ctl parameter.
5449c685a   Forest Bond   Staging: Add pris...
41
42
43
44
45
46
47
48
49
   *      s_vFillRTSHead- fulfill RTS ctl header
   *      s_vFillTxKey- fulfill tx encrypt key
   *      s_vSWencryption- Software encrypt header
   *      vDMA0_tx_80211- tx 802.11 frame via dma0
   *      vGenerateFIFOHeader- Generate tx FIFO ctl header
   *
   * Revision History:
   *
   */
5449c685a   Forest Bond   Staging: Add pris...
50
  #include "device.h"
5449c685a   Forest Bond   Staging: Add pris...
51
  #include "rxtx.h"
5449c685a   Forest Bond   Staging: Add pris...
52
  #include "tether.h"
5449c685a   Forest Bond   Staging: Add pris...
53
  #include "card.h"
5449c685a   Forest Bond   Staging: Add pris...
54
  #include "bssdb.h"
5449c685a   Forest Bond   Staging: Add pris...
55
  #include "mac.h"
5449c685a   Forest Bond   Staging: Add pris...
56
  #include "baseband.h"
5449c685a   Forest Bond   Staging: Add pris...
57
  #include "michael.h"
5449c685a   Forest Bond   Staging: Add pris...
58
  #include "tkip.h"
5449c685a   Forest Bond   Staging: Add pris...
59
  #include "tcrc.h"
5449c685a   Forest Bond   Staging: Add pris...
60
  #include "wctl.h"
5449c685a   Forest Bond   Staging: Add pris...
61
  #include "wroute.h"
5449c685a   Forest Bond   Staging: Add pris...
62
  #include "hostap.h"
5449c685a   Forest Bond   Staging: Add pris...
63
  #include "rf.h"
5449c685a   Forest Bond   Staging: Add pris...
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
  
  /*---------------------  Static Definitions -------------------------*/
  
  /*---------------------  Static Classes  ----------------------------*/
  
  /*---------------------  Static Variables  --------------------------*/
  //static int          msglevel                =MSG_LEVEL_DEBUG;
  static int          msglevel                =MSG_LEVEL_INFO;
  
  #define	PLICE_DEBUG
  
  
  /*---------------------  Static Functions  --------------------------*/
  
  /*---------------------  Static Definitions -------------------------*/
  #define CRITICAL_PACKET_LEN      256    // if packet size < 256 -> in-direct send
                                          //    packet size >= 256 -> direct send
2986db5fd   Charles Clément   Staging: vt6655: ...
81
  const unsigned short wTimeStampOff[2][MAX_RATE] = {
5449c685a   Forest Bond   Staging: Add pris...
82
83
84
          {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
          {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
      };
2986db5fd   Charles Clément   Staging: vt6655: ...
85
  const unsigned short wFB_Opt0[2][5] = {
5449c685a   Forest Bond   Staging: Add pris...
86
87
88
          {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
          {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
      };
2986db5fd   Charles Clément   Staging: vt6655: ...
89
  const unsigned short wFB_Opt1[2][5] = {
5449c685a   Forest Bond   Staging: Add pris...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
          {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
          {RATE_6M , RATE_6M,  RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
      };
  
  
  #define RTSDUR_BB       0
  #define RTSDUR_BA       1
  #define RTSDUR_AA       2
  #define CTSDUR_BA       3
  #define RTSDUR_BA_F0    4
  #define RTSDUR_AA_F0    5
  #define RTSDUR_BA_F1    6
  #define RTSDUR_AA_F1    7
  #define CTSDUR_BA_F0    8
  #define CTSDUR_BA_F1    9
  #define DATADUR_B       10
  #define DATADUR_A       11
  #define DATADUR_A_F0    12
  #define DATADUR_A_F1    13
  
  /*---------------------  Static Functions  --------------------------*/
  
  
  
  static
6b35b7b37   Charles Clément   Staging: vt6655: ...
115
  void
5449c685a   Forest Bond   Staging: Add pris...
116
  s_vFillTxKey(
3a215e0ff   Charles Clément   Staging: vt6655: ...
117
      PSDevice   pDevice,
2989e96f1   Charles Clément   Staging: vt6655: ...
118
119
      unsigned char *pbyBuf,
      unsigned char *pbyIVHead,
3a215e0ff   Charles Clément   Staging: vt6655: ...
120
      PSKeyItem  pTransmitKey,
2989e96f1   Charles Clément   Staging: vt6655: ...
121
      unsigned char *pbyHdrBuf,
2986db5fd   Charles Clément   Staging: vt6655: ...
122
      unsigned short wPayloadLen,
2989e96f1   Charles Clément   Staging: vt6655: ...
123
      unsigned char *pMICHDR
5449c685a   Forest Bond   Staging: Add pris...
124
125
126
127
128
      );
  
  
  
  static
6b35b7b37   Charles Clément   Staging: vt6655: ...
129
  void
5449c685a   Forest Bond   Staging: Add pris...
130
  s_vFillRTSHead(
3a215e0ff   Charles Clément   Staging: vt6655: ...
131
      PSDevice         pDevice,
3fc9b584c   Charles Clément   Staging: vt6655: ...
132
      unsigned char byPktType,
3a215e0ff   Charles Clément   Staging: vt6655: ...
133
      void *           pvRTS,
b6e95cd52   Charles Clément   Staging: vt6655: ...
134
      unsigned int	cbFrameLength,
7b6a00131   Charles Clément   Staging: vt6655: ...
135
136
      bool bNeedAck,
      bool bDisCRC,
3a215e0ff   Charles Clément   Staging: vt6655: ...
137
      PSEthernetHeader psEthHeader,
2986db5fd   Charles Clément   Staging: vt6655: ...
138
      unsigned short wCurrentRate,
3fc9b584c   Charles Clément   Staging: vt6655: ...
139
      unsigned char byFBOption
5449c685a   Forest Bond   Staging: Add pris...
140
141
142
      );
  
  static
6b35b7b37   Charles Clément   Staging: vt6655: ...
143
  void
5449c685a   Forest Bond   Staging: Add pris...
144
  s_vGenerateTxParameter(
3a215e0ff   Charles Clément   Staging: vt6655: ...
145
      PSDevice         pDevice,
3fc9b584c   Charles Clément   Staging: vt6655: ...
146
      unsigned char byPktType,
3a215e0ff   Charles Clément   Staging: vt6655: ...
147
148
149
150
      void *           pTxBufHead,
      void *           pvRrvTime,
      void *           pvRTS,
      void *           pvCTS,
b6e95cd52   Charles Clément   Staging: vt6655: ...
151
      unsigned int	cbFrameSize,
7b6a00131   Charles Clément   Staging: vt6655: ...
152
      bool bNeedACK,
b6e95cd52   Charles Clément   Staging: vt6655: ...
153
      unsigned int	uDMAIdx,
3a215e0ff   Charles Clément   Staging: vt6655: ...
154
      PSEthernetHeader psEthHeader,
2986db5fd   Charles Clément   Staging: vt6655: ...
155
      unsigned short wCurrentRate
5449c685a   Forest Bond   Staging: Add pris...
156
157
158
159
160
      );
  
  
  
  static void s_vFillFragParameter(
3a215e0ff   Charles Clément   Staging: vt6655: ...
161
      PSDevice pDevice,
2989e96f1   Charles Clément   Staging: vt6655: ...
162
      unsigned char *pbyBuffer,
b6e95cd52   Charles Clément   Staging: vt6655: ...
163
      unsigned int	uTxType,
3a215e0ff   Charles Clément   Staging: vt6655: ...
164
      void *   pvtdCurr,
2986db5fd   Charles Clément   Staging: vt6655: ...
165
      unsigned short wFragType,
b6e95cd52   Charles Clément   Staging: vt6655: ...
166
      unsigned int	cbReqCount
5449c685a   Forest Bond   Staging: Add pris...
167
      );
fe4f34bde   Charles Clément   Staging: vt6655: ...
168
169
170
  static unsigned int
  s_cbFillTxBufHead(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
  	unsigned int cbFrameBodySize, unsigned int uDMAIdx, PSTxDesc pHeadTD,
7b6a00131   Charles Clément   Staging: vt6655: ...
171
  	PSEthernetHeader psEthHeader, unsigned char *pPacket, bool bNeedEncrypt,
fe4f34bde   Charles Clément   Staging: vt6655: ...
172
  	PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum);
5449c685a   Forest Bond   Staging: Add pris...
173
174
175
  
  
  static
b6e95cd52   Charles Clément   Staging: vt6655: ...
176
  unsigned int
5449c685a   Forest Bond   Staging: Add pris...
177
  s_uFillDataHead (
3a215e0ff   Charles Clément   Staging: vt6655: ...
178
      PSDevice pDevice,
3fc9b584c   Charles Clément   Staging: vt6655: ...
179
      unsigned char byPktType,
3a215e0ff   Charles Clément   Staging: vt6655: ...
180
      void *   pTxDataHead,
b6e95cd52   Charles Clément   Staging: vt6655: ...
181
182
      unsigned int cbFrameLength,
      unsigned int uDMAIdx,
7b6a00131   Charles Clément   Staging: vt6655: ...
183
      bool bNeedAck,
b6e95cd52   Charles Clément   Staging: vt6655: ...
184
185
186
      unsigned int uFragIdx,
      unsigned int cbLastFragmentSize,
      unsigned int uMACfragNum,
3fc9b584c   Charles Clément   Staging: vt6655: ...
187
      unsigned char byFBOption,
2986db5fd   Charles Clément   Staging: vt6655: ...
188
      unsigned short wCurrentRate
5449c685a   Forest Bond   Staging: Add pris...
189
190
191
192
193
194
195
196
      );
  
  
  /*---------------------  Export Variables  --------------------------*/
  
  
  
  static
6b35b7b37   Charles Clément   Staging: vt6655: ...
197
  void
5449c685a   Forest Bond   Staging: Add pris...
198
  s_vFillTxKey (
3a215e0ff   Charles Clément   Staging: vt6655: ...
199
      PSDevice   pDevice,
2989e96f1   Charles Clément   Staging: vt6655: ...
200
201
      unsigned char *pbyBuf,
      unsigned char *pbyIVHead,
3a215e0ff   Charles Clément   Staging: vt6655: ...
202
      PSKeyItem  pTransmitKey,
2989e96f1   Charles Clément   Staging: vt6655: ...
203
      unsigned char *pbyHdrBuf,
2986db5fd   Charles Clément   Staging: vt6655: ...
204
      unsigned short wPayloadLen,
2989e96f1   Charles Clément   Staging: vt6655: ...
205
      unsigned char *pMICHDR
5449c685a   Forest Bond   Staging: Add pris...
206
207
      )
  {
9d828c458   Charles Clément   Staging: vt6655: ...
208
209
      unsigned long *pdwIV = (unsigned long *) pbyIVHead;
      unsigned long *pdwExtIV = (unsigned long *) ((unsigned char *)pbyIVHead+4);
2986db5fd   Charles Clément   Staging: vt6655: ...
210
      unsigned short wValue;
5449c685a   Forest Bond   Staging: Add pris...
211
      PS802_11Header  pMACHeader = (PS802_11Header)pbyHdrBuf;
0f4c60d61   Charles Clément   Staging: vt6655: ...
212
      unsigned long dwRevIVCounter;
3fc9b584c   Charles Clément   Staging: vt6655: ...
213
      unsigned char byKeyIndex = 0;
5449c685a   Forest Bond   Staging: Add pris...
214
215
216
217
218
219
220
221
222
223
224
225
226
  
  
  
      //Fill TXKEY
      if (pTransmitKey == NULL)
          return;
  
      dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
      *pdwIV = pDevice->dwIVCounter;
      byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
  
      if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
          if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN ){
2989e96f1   Charles Clément   Staging: vt6655: ...
227
              memcpy(pDevice->abyPRNG, (unsigned char *)&(dwRevIVCounter), 3);
51b6d9c29   Jim Lieb   Staging: vt665x: ...
228
              memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
5449c685a   Forest Bond   Staging: Add pris...
229
          } else {
2989e96f1   Charles Clément   Staging: vt6655: ...
230
              memcpy(pbyBuf, (unsigned char *)&(dwRevIVCounter), 3);
51b6d9c29   Jim Lieb   Staging: vt665x: ...
231
              memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
5449c685a   Forest Bond   Staging: Add pris...
232
              if(pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
2989e96f1   Charles Clément   Staging: vt6655: ...
233
                  memcpy(pbyBuf+8, (unsigned char *)&(dwRevIVCounter), 3);
51b6d9c29   Jim Lieb   Staging: vt665x: ...
234
                  memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
5449c685a   Forest Bond   Staging: Add pris...
235
              }
51b6d9c29   Jim Lieb   Staging: vt665x: ...
236
              memcpy(pDevice->abyPRNG, pbyBuf, 16);
5449c685a   Forest Bond   Staging: Add pris...
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
          }
          // Append IV after Mac Header
          *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
          *pdwIV |= (byKeyIndex << 30);
          *pdwIV = cpu_to_le32(*pdwIV);
          pDevice->dwIVCounter++;
          if (pDevice->dwIVCounter > WEP_IV_MASK) {
              pDevice->dwIVCounter = 0;
          }
      } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
          pTransmitKey->wTSC15_0++;
          if (pTransmitKey->wTSC15_0 == 0) {
              pTransmitKey->dwTSC47_16++;
          }
          TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
                      pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
51b6d9c29   Jim Lieb   Staging: vt665x: ...
253
          memcpy(pbyBuf, pDevice->abyPRNG, 16);
5449c685a   Forest Bond   Staging: Add pris...
254
          // Make IV
51b6d9c29   Jim Lieb   Staging: vt665x: ...
255
          memcpy(pdwIV, pDevice->abyPRNG, 3);
5449c685a   Forest Bond   Staging: Add pris...
256

3fc9b584c   Charles Clément   Staging: vt6655: ...
257
          *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
5449c685a   Forest Bond   Staging: Add pris...
258
259
          // Append IV&ExtIV after Mac Header
          *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
7e809a9b1   Jim Lieb   Staging: vt6655 t...
260
261
          DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFillTxKey()---- pdwExtIV: %lx
  ", *pdwExtIV);
5449c685a   Forest Bond   Staging: Add pris...
262
263
264
265
266
267
  
      } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
          pTransmitKey->wTSC15_0++;
          if (pTransmitKey->wTSC15_0 == 0) {
              pTransmitKey->dwTSC47_16++;
          }
51b6d9c29   Jim Lieb   Staging: vt665x: ...
268
          memcpy(pbyBuf, pTransmitKey->abyKey, 16);
5449c685a   Forest Bond   Staging: Add pris...
269
270
271
  
          // Make IV
          *pdwIV = 0;
3fc9b584c   Charles Clément   Staging: vt6655: ...
272
          *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
2986db5fd   Charles Clément   Staging: vt6655: ...
273
          *pdwIV |= cpu_to_le16((unsigned short)(pTransmitKey->wTSC15_0));
5449c685a   Forest Bond   Staging: Add pris...
274
275
276
277
278
          //Append IV&ExtIV after Mac Header
          *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
  
          //Fill MICHDR0
          *pMICHDR = 0x59;
2989e96f1   Charles Clément   Staging: vt6655: ...
279
          *((unsigned char *)(pMICHDR+1)) = 0; // TxPriority
51b6d9c29   Jim Lieb   Staging: vt665x: ...
280
          memcpy(pMICHDR+2, &(pMACHeader->abyAddr2[0]), 6);
2989e96f1   Charles Clément   Staging: vt6655: ...
281
282
283
284
285
286
287
288
          *((unsigned char *)(pMICHDR+8)) = HIBYTE(HIWORD(pTransmitKey->dwTSC47_16));
          *((unsigned char *)(pMICHDR+9)) = LOBYTE(HIWORD(pTransmitKey->dwTSC47_16));
          *((unsigned char *)(pMICHDR+10)) = HIBYTE(LOWORD(pTransmitKey->dwTSC47_16));
          *((unsigned char *)(pMICHDR+11)) = LOBYTE(LOWORD(pTransmitKey->dwTSC47_16));
          *((unsigned char *)(pMICHDR+12)) = HIBYTE(pTransmitKey->wTSC15_0);
          *((unsigned char *)(pMICHDR+13)) = LOBYTE(pTransmitKey->wTSC15_0);
          *((unsigned char *)(pMICHDR+14)) = HIBYTE(wPayloadLen);
          *((unsigned char *)(pMICHDR+15)) = LOBYTE(wPayloadLen);
5449c685a   Forest Bond   Staging: Add pris...
289
290
  
          //Fill MICHDR1
2989e96f1   Charles Clément   Staging: vt6655: ...
291
          *((unsigned char *)(pMICHDR+16)) = 0; // HLEN[15:8]
5449c685a   Forest Bond   Staging: Add pris...
292
          if (pDevice->bLongHeader) {
2989e96f1   Charles Clément   Staging: vt6655: ...
293
              *((unsigned char *)(pMICHDR+17)) = 28; // HLEN[7:0]
5449c685a   Forest Bond   Staging: Add pris...
294
          } else {
2989e96f1   Charles Clément   Staging: vt6655: ...
295
              *((unsigned char *)(pMICHDR+17)) = 22; // HLEN[7:0]
5449c685a   Forest Bond   Staging: Add pris...
296
297
          }
          wValue = cpu_to_le16(pMACHeader->wFrameCtl & 0xC78F);
2989e96f1   Charles Clément   Staging: vt6655: ...
298
          memcpy(pMICHDR+18, (unsigned char *)&wValue, 2); // MSKFRACTL
51b6d9c29   Jim Lieb   Staging: vt665x: ...
299
300
          memcpy(pMICHDR+20, &(pMACHeader->abyAddr1[0]), 6);
          memcpy(pMICHDR+26, &(pMACHeader->abyAddr2[0]), 6);
5449c685a   Forest Bond   Staging: Add pris...
301
302
  
          //Fill MICHDR2
51b6d9c29   Jim Lieb   Staging: vt665x: ...
303
          memcpy(pMICHDR+32, &(pMACHeader->abyAddr3[0]), 6);
5449c685a   Forest Bond   Staging: Add pris...
304
305
306
          wValue = pMACHeader->wSeqCtl;
          wValue &= 0x000F;
          wValue = cpu_to_le16(wValue);
2989e96f1   Charles Clément   Staging: vt6655: ...
307
          memcpy(pMICHDR+38, (unsigned char *)&wValue, 2); // MSKSEQCTL
5449c685a   Forest Bond   Staging: Add pris...
308
          if (pDevice->bLongHeader) {
51b6d9c29   Jim Lieb   Staging: vt665x: ...
309
              memcpy(pMICHDR+40, &(pMACHeader->abyAddr4[0]), 6);
5449c685a   Forest Bond   Staging: Add pris...
310
311
312
313
314
315
          }
      }
  }
  
  
  static
6b35b7b37   Charles Clément   Staging: vt6655: ...
316
  void
5449c685a   Forest Bond   Staging: Add pris...
317
  s_vSWencryption (
3a215e0ff   Charles Clément   Staging: vt6655: ...
318
319
      PSDevice            pDevice,
      PSKeyItem           pTransmitKey,
2989e96f1   Charles Clément   Staging: vt6655: ...
320
      unsigned char *pbyPayloadHead,
2986db5fd   Charles Clément   Staging: vt6655: ...
321
      unsigned short wPayloadSize
5449c685a   Forest Bond   Staging: Add pris...
322
323
      )
  {
b6e95cd52   Charles Clément   Staging: vt6655: ...
324
      unsigned int cbICVlen = 4;
0f4c60d61   Charles Clément   Staging: vt6655: ...
325
      unsigned long dwICV = 0xFFFFFFFFL;
9d828c458   Charles Clément   Staging: vt6655: ...
326
      unsigned long *pdwICV;
5449c685a   Forest Bond   Staging: Add pris...
327
328
329
330
331
332
333
334
  
      if (pTransmitKey == NULL)
          return;
  
      if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
          //=======================================================================
          // Append ICV after payload
          dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
9d828c458   Charles Clément   Staging: vt6655: ...
335
          pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
5449c685a   Forest Bond   Staging: Add pris...
336
337
338
339
340
341
342
343
344
345
          // finally, we must invert dwCRC to get the correct answer
          *pdwICV = cpu_to_le32(~dwICV);
          // RC4 encryption
          rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
          rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
          //=======================================================================
      } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
          //=======================================================================
          //Append ICV after payload
          dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
9d828c458   Charles Clément   Staging: vt6655: ...
346
          pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
5449c685a   Forest Bond   Staging: Add pris...
347
348
349
350
351
352
353
354
          // finally, we must invert dwCRC to get the correct answer
          *pdwICV = cpu_to_le32(~dwICV);
          // RC4 encryption
          rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
          rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
          //=======================================================================
      }
  }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
355
  /*byPktType : PK_TYPE_11A     0
5449c685a   Forest Bond   Staging: Add pris...
356
357
358
359
360
               PK_TYPE_11B     1
               PK_TYPE_11GB    2
               PK_TYPE_11GA    3
  */
  static
b6e95cd52   Charles Clément   Staging: vt6655: ...
361
  unsigned int
5449c685a   Forest Bond   Staging: Add pris...
362
  s_uGetTxRsvTime (
3a215e0ff   Charles Clément   Staging: vt6655: ...
363
      PSDevice pDevice,
3fc9b584c   Charles Clément   Staging: vt6655: ...
364
      unsigned char byPktType,
b6e95cd52   Charles Clément   Staging: vt6655: ...
365
      unsigned int cbFrameLength,
2986db5fd   Charles Clément   Staging: vt6655: ...
366
      unsigned short wRate,
7b6a00131   Charles Clément   Staging: vt6655: ...
367
      bool bNeedAck
5449c685a   Forest Bond   Staging: Add pris...
368
369
      )
  {
b6e95cd52   Charles Clément   Staging: vt6655: ...
370
      unsigned int uDataTime, uAckTime;
5449c685a   Forest Bond   Staging: Add pris...
371

7e809a9b1   Jim Lieb   Staging: vt6655 t...
372
      uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
5449c685a   Forest Bond   Staging: Add pris...
373
374
375
376
  #ifdef	PLICE_DEBUG
  	//printk("s_uGetTxRsvTime is %d
  ",uDataTime);
  #endif
7e809a9b1   Jim Lieb   Staging: vt6655 t...
377
      if (byPktType == PK_TYPE_11B) {//llb,CCK mode
2986db5fd   Charles Clément   Staging: vt6655: ...
378
          uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopCCKBasicRate);
5449c685a   Forest Bond   Staging: Add pris...
379
      } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode
2986db5fd   Charles Clément   Staging: vt6655: ...
380
          uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopOFDMBasicRate);
5449c685a   Forest Bond   Staging: Add pris...
381
382
383
384
385
386
387
388
389
390
391
392
      }
  
      if (bNeedAck) {
          return (uDataTime + pDevice->uSIFS + uAckTime);
      }
      else {
          return uDataTime;
      }
  }
  
  //byFreqType: 0=>5GHZ 1=>2.4GHZ
  static
b6e95cd52   Charles Clément   Staging: vt6655: ...
393
  unsigned int
5449c685a   Forest Bond   Staging: Add pris...
394
  s_uGetRTSCTSRsvTime (
3a215e0ff   Charles Clément   Staging: vt6655: ...
395
      PSDevice pDevice,
3fc9b584c   Charles Clément   Staging: vt6655: ...
396
397
      unsigned char byRTSRsvType,
      unsigned char byPktType,
b6e95cd52   Charles Clément   Staging: vt6655: ...
398
      unsigned int cbFrameLength,
2986db5fd   Charles Clément   Staging: vt6655: ...
399
      unsigned short wCurrentRate
5449c685a   Forest Bond   Staging: Add pris...
400
401
      )
  {
b6e95cd52   Charles Clément   Staging: vt6655: ...
402
      unsigned int uRrvTime  , uRTSTime, uCTSTime, uAckTime, uDataTime;
5449c685a   Forest Bond   Staging: Add pris...
403
404
  
      uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
405
      uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
5449c685a   Forest Bond   Staging: Add pris...
406
      if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
7e809a9b1   Jim Lieb   Staging: vt6655 t...
407
408
          uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
          uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
5449c685a   Forest Bond   Staging: Add pris...
409
410
      }
      else if (byRTSRsvType == 1){ //RTSTxRrvTime_ba, only in 2.4GHZ
7e809a9b1   Jim Lieb   Staging: vt6655 t...
411
412
413
          uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
          uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
          uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
5449c685a   Forest Bond   Staging: Add pris...
414
415
      }
      else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
7e809a9b1   Jim Lieb   Staging: vt6655 t...
416
417
          uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
          uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
5449c685a   Forest Bond   Staging: Add pris...
418
419
      }
      else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
7e809a9b1   Jim Lieb   Staging: vt6655 t...
420
421
          uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
          uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
5449c685a   Forest Bond   Staging: Add pris...
422
423
424
425
426
427
428
429
430
431
432
          uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
          return uRrvTime;
      }
  
      //RTSRrvTime
      uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
      return uRrvTime;
  }
  
  //byFreqType 0: 5GHz, 1:2.4Ghz
  static
b6e95cd52   Charles Clément   Staging: vt6655: ...
433
  unsigned int
5449c685a   Forest Bond   Staging: Add pris...
434
  s_uGetDataDuration (
3a215e0ff   Charles Clément   Staging: vt6655: ...
435
      PSDevice pDevice,
3fc9b584c   Charles Clément   Staging: vt6655: ...
436
      unsigned char byDurType,
b6e95cd52   Charles Clément   Staging: vt6655: ...
437
      unsigned int cbFrameLength,
3fc9b584c   Charles Clément   Staging: vt6655: ...
438
      unsigned char byPktType,
2986db5fd   Charles Clément   Staging: vt6655: ...
439
      unsigned short wRate,
7b6a00131   Charles Clément   Staging: vt6655: ...
440
      bool bNeedAck,
b6e95cd52   Charles Clément   Staging: vt6655: ...
441
442
443
      unsigned int uFragIdx,
      unsigned int cbLastFragmentSize,
      unsigned int uMACfragNum,
3fc9b584c   Charles Clément   Staging: vt6655: ...
444
      unsigned char byFBOption
5449c685a   Forest Bond   Staging: Add pris...
445
446
      )
  {
7b6a00131   Charles Clément   Staging: vt6655: ...
447
      bool bLastFrag = 0;
b6e95cd52   Charles Clément   Staging: vt6655: ...
448
      unsigned int uAckTime =0, uNextPktTime = 0;
5449c685a   Forest Bond   Staging: Add pris...
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
  
  
  
      if (uFragIdx == (uMACfragNum-1)) {
          bLastFrag = 1;
      }
  
  
      switch (byDurType) {
  
      case DATADUR_B:    //DATADUR_B
          if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
              if (bNeedAck) {
              	uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
                  return (pDevice->uSIFS + uAckTime);
              } else {
                  return 0;
              }
          }
          else {//First Frag or Mid Frag
              if (uFragIdx == (uMACfragNum-2)) {
              	uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
              } else {
                  uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
              }
              if (bNeedAck) {
              	uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
                  return (pDevice->uSIFS + uAckTime + uNextPktTime);
              } else {
                  return (pDevice->uSIFS + uNextPktTime);
              }
          }
          break;
  
      case DATADUR_A:    //DATADUR_A
          if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
              if(bNeedAck){
              	uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
                  return (pDevice->uSIFS + uAckTime);
              } else {
                  return 0;
              }
          }
          else {//First Frag or Mid Frag
              if(uFragIdx == (uMACfragNum-2)){
              	uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
              } else {
                  uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
              }
              if(bNeedAck){
              	uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
                  return (pDevice->uSIFS + uAckTime + uNextPktTime);
              } else {
                  return (pDevice->uSIFS + uNextPktTime);
              }
          }
          break;
  
      case DATADUR_A_F0:    //DATADUR_A_F0
  	    if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
              if(bNeedAck){
              	uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
                  return (pDevice->uSIFS + uAckTime);
              } else {
                  return 0;
              }
          }
  	    else { //First Frag or Mid Frag
  	        if (byFBOption == AUTO_FB_0) {
                  if (wRate < RATE_18M)
                      wRate = RATE_18M;
                  else if (wRate > RATE_54M)
                      wRate = RATE_54M;
  
  	            if(uFragIdx == (uMACfragNum-2)){
              	    uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
                  } else {
                      uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
                  }
  	        } else { // (byFBOption == AUTO_FB_1)
                  if (wRate < RATE_18M)
                      wRate = RATE_18M;
                  else if (wRate > RATE_54M)
                      wRate = RATE_54M;
  
  	            if(uFragIdx == (uMACfragNum-2)){
              	    uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
                  } else {
                      uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
                  }
  	        }
  
  	        if(bNeedAck){
              	uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
                  return (pDevice->uSIFS + uAckTime + uNextPktTime);
              } else {
                  return (pDevice->uSIFS + uNextPktTime);
              }
  	    }
          break;
  
      case DATADUR_A_F1:    //DATADUR_A_F1
          if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
              if(bNeedAck){
              	uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
                  return (pDevice->uSIFS + uAckTime);
              } else {
                  return 0;
              }
          }
  	    else { //First Frag or Mid Frag
  	        if (byFBOption == AUTO_FB_0) {
                  if (wRate < RATE_18M)
                      wRate = RATE_18M;
                  else if (wRate > RATE_54M)
                      wRate = RATE_54M;
  
  	            if(uFragIdx == (uMACfragNum-2)){
              	    uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
                  } else {
                      uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
                  }
  
  	        } else { // (byFBOption == AUTO_FB_1)
                  if (wRate < RATE_18M)
                      wRate = RATE_18M;
                  else if (wRate > RATE_54M)
                      wRate = RATE_54M;
  
  	            if(uFragIdx == (uMACfragNum-2)){
              	    uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
                  } else {
                      uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
                  }
  	        }
  	        if(bNeedAck){
              	uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
                  return (pDevice->uSIFS + uAckTime + uNextPktTime);
              } else {
                  return (pDevice->uSIFS + uNextPktTime);
              }
  	    }
          break;
  
      default:
          break;
      }
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
596
  	ASSERT(false);
5449c685a   Forest Bond   Staging: Add pris...
597
598
599
600
601
602
  	return 0;
  }
  
  
  //byFreqType: 0=>5GHZ 1=>2.4GHZ
  static
b6e95cd52   Charles Clément   Staging: vt6655: ...
603
  unsigned int
5449c685a   Forest Bond   Staging: Add pris...
604
  s_uGetRTSCTSDuration (
3a215e0ff   Charles Clément   Staging: vt6655: ...
605
      PSDevice pDevice,
3fc9b584c   Charles Clément   Staging: vt6655: ...
606
      unsigned char byDurType,
b6e95cd52   Charles Clément   Staging: vt6655: ...
607
      unsigned int cbFrameLength,
3fc9b584c   Charles Clément   Staging: vt6655: ...
608
      unsigned char byPktType,
2986db5fd   Charles Clément   Staging: vt6655: ...
609
      unsigned short wRate,
7b6a00131   Charles Clément   Staging: vt6655: ...
610
      bool bNeedAck,
3fc9b584c   Charles Clément   Staging: vt6655: ...
611
      unsigned char byFBOption
5449c685a   Forest Bond   Staging: Add pris...
612
613
      )
  {
b6e95cd52   Charles Clément   Staging: vt6655: ...
614
      unsigned int uCTSTime = 0, uDurTime = 0;
5449c685a   Forest Bond   Staging: Add pris...
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
  
  
      switch (byDurType) {
  
      case RTSDUR_BB:    //RTSDuration_bb
          uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
          uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
          break;
  
      case RTSDUR_BA:    //RTSDuration_ba
          uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
          uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
          break;
  
      case RTSDUR_AA:    //RTSDuration_aa
          uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
          uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
          break;
  
      case CTSDUR_BA:    //CTSDuration_ba
          uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
          break;
  
      case RTSDUR_BA_F0: //RTSDuration_ba_f0
          uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
          if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
              uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
          } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
              uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
          }
          break;
  
      case RTSDUR_AA_F0: //RTSDuration_aa_f0
          uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
          if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
              uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
          } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
              uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
          }
          break;
  
      case RTSDUR_BA_F1: //RTSDuration_ba_f1
          uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
          if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
              uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
          } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
              uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
          }
          break;
  
      case RTSDUR_AA_F1: //RTSDuration_aa_f1
          uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
          if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
              uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
          } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
              uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
          }
          break;
  
      case CTSDUR_BA_F0: //CTSDuration_ba_f0
          if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
              uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
          } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
              uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
          }
          break;
  
      case CTSDUR_BA_F1: //CTSDuration_ba_f1
          if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
              uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
          } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
              uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
          }
          break;
  
      default:
          break;
      }
  
      return uDurTime;
  
  }
  
  
  
  static
b6e95cd52   Charles Clément   Staging: vt6655: ...
701
  unsigned int
5449c685a   Forest Bond   Staging: Add pris...
702
  s_uFillDataHead (
3a215e0ff   Charles Clément   Staging: vt6655: ...
703
      PSDevice pDevice,
3fc9b584c   Charles Clément   Staging: vt6655: ...
704
      unsigned char byPktType,
3a215e0ff   Charles Clément   Staging: vt6655: ...
705
      void *   pTxDataHead,
b6e95cd52   Charles Clément   Staging: vt6655: ...
706
707
      unsigned int cbFrameLength,
      unsigned int uDMAIdx,
7b6a00131   Charles Clément   Staging: vt6655: ...
708
      bool bNeedAck,
b6e95cd52   Charles Clément   Staging: vt6655: ...
709
710
711
      unsigned int uFragIdx,
      unsigned int cbLastFragmentSize,
      unsigned int uMACfragNum,
3fc9b584c   Charles Clément   Staging: vt6655: ...
712
      unsigned char byFBOption,
2986db5fd   Charles Clément   Staging: vt6655: ...
713
      unsigned short wCurrentRate
5449c685a   Forest Bond   Staging: Add pris...
714
715
      )
  {
2986db5fd   Charles Clément   Staging: vt6655: ...
716
      unsigned short wLen = 0x0000;
5449c685a   Forest Bond   Staging: Add pris...
717
718
719
720
  
      if (pTxDataHead == NULL) {
          return 0;
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
721
      if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
5449c685a   Forest Bond   Staging: Add pris...
722
723
724
          if (byFBOption == AUTO_FB_NONE) {
              PSTxDataHead_g pBuf = (PSTxDataHead_g)pTxDataHead;
              //Get SignalField,ServiceField,Length
7e809a9b1   Jim Lieb   Staging: vt6655 t...
725
              BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
15df6c2b9   Charles Clément   Staging: vt6655: ...
726
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
5449c685a   Forest Bond   Staging: Add pris...
727
728
729
              );
              pBuf->wTransmitLength_a = cpu_to_le16(wLen);
              BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
15df6c2b9   Charles Clément   Staging: vt6655: ...
730
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
5449c685a   Forest Bond   Staging: Add pris...
731
732
733
              );
              pBuf->wTransmitLength_b = cpu_to_le16(wLen);
              //Get Duration and TimeStamp
2986db5fd   Charles Clément   Staging: vt6655: ...
734
              pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
7e809a9b1   Jim Lieb   Staging: vt6655 t...
735
                                                           byPktType, wCurrentRate, bNeedAck, uFragIdx,
5449c685a   Forest Bond   Staging: Add pris...
736
737
                                                           cbLastFragmentSize, uMACfragNum,
                                                           byFBOption)); //1: 2.4GHz
2986db5fd   Charles Clément   Staging: vt6655: ...
738
              pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
5449c685a   Forest Bond   Staging: Add pris...
739
740
741
742
743
744
745
746
747
748
749
750
                                                           PK_TYPE_11B, pDevice->byTopCCKBasicRate,
                                                           bNeedAck, uFragIdx, cbLastFragmentSize,
                                                           uMACfragNum, byFBOption)); //1: 2.4
  
              pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
              pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
  
              return (pBuf->wDuration_a);
           } else {
              // Auto Fallback
              PSTxDataHead_g_FB pBuf = (PSTxDataHead_g_FB)pTxDataHead;
              //Get SignalField,ServiceField,Length
7e809a9b1   Jim Lieb   Staging: vt6655 t...
751
              BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
15df6c2b9   Charles Clément   Staging: vt6655: ...
752
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
5449c685a   Forest Bond   Staging: Add pris...
753
754
755
              );
              pBuf->wTransmitLength_a = cpu_to_le16(wLen);
              BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
15df6c2b9   Charles Clément   Staging: vt6655: ...
756
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
5449c685a   Forest Bond   Staging: Add pris...
757
758
759
              );
              pBuf->wTransmitLength_b = cpu_to_le16(wLen);
              //Get Duration and TimeStamp
2986db5fd   Charles Clément   Staging: vt6655: ...
760
              pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
5449c685a   Forest Bond   Staging: Add pris...
761
                                           wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
2986db5fd   Charles Clément   Staging: vt6655: ...
762
              pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
5449c685a   Forest Bond   Staging: Add pris...
763
                                           pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
2986db5fd   Charles Clément   Staging: vt6655: ...
764
              pBuf->wDuration_a_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
5449c685a   Forest Bond   Staging: Add pris...
765
                                           wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
2986db5fd   Charles Clément   Staging: vt6655: ...
766
              pBuf->wDuration_a_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
5449c685a   Forest Bond   Staging: Add pris...
767
768
769
770
771
772
773
774
                                           wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
  
              pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
              pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
  
              return (pBuf->wDuration_a);
          } //if (byFBOption == AUTO_FB_NONE)
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
775
      else if (byPktType == PK_TYPE_11A) {
5449c685a   Forest Bond   Staging: Add pris...
776
777
778
779
          if ((byFBOption != AUTO_FB_NONE)) {
              // Auto Fallback
              PSTxDataHead_a_FB pBuf = (PSTxDataHead_a_FB)pTxDataHead;
              //Get SignalField,ServiceField,Length
7e809a9b1   Jim Lieb   Staging: vt6655 t...
780
              BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
15df6c2b9   Charles Clément   Staging: vt6655: ...
781
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
5449c685a   Forest Bond   Staging: Add pris...
782
783
784
              );
              pBuf->wTransmitLength = cpu_to_le16(wLen);
              //Get Duration and TimeStampOff
2986db5fd   Charles Clément   Staging: vt6655: ...
785
              pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
5449c685a   Forest Bond   Staging: Add pris...
786
                                          wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
2986db5fd   Charles Clément   Staging: vt6655: ...
787
              pBuf->wDuration_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
5449c685a   Forest Bond   Staging: Add pris...
788
                                          wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
2986db5fd   Charles Clément   Staging: vt6655: ...
789
              pBuf->wDuration_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
5449c685a   Forest Bond   Staging: Add pris...
790
791
792
793
794
795
                                          wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
              pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
              return (pBuf->wDuration);
          } else {
              PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
              //Get SignalField,ServiceField,Length
7e809a9b1   Jim Lieb   Staging: vt6655 t...
796
              BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
15df6c2b9   Charles Clément   Staging: vt6655: ...
797
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
5449c685a   Forest Bond   Staging: Add pris...
798
799
800
              );
              pBuf->wTransmitLength = cpu_to_le16(wLen);
              //Get Duration and TimeStampOff
2986db5fd   Charles Clément   Staging: vt6655: ...
801
              pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
5449c685a   Forest Bond   Staging: Add pris...
802
803
804
805
806
807
808
809
810
811
812
                                                         wCurrentRate, bNeedAck, uFragIdx,
                                                         cbLastFragmentSize, uMACfragNum,
                                                         byFBOption));
  
              pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
              return (pBuf->wDuration);
          }
      }
      else {
              PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
              //Get SignalField,ServiceField,Length
7e809a9b1   Jim Lieb   Staging: vt6655 t...
813
              BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
15df6c2b9   Charles Clément   Staging: vt6655: ...
814
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
5449c685a   Forest Bond   Staging: Add pris...
815
816
817
              );
              pBuf->wTransmitLength = cpu_to_le16(wLen);
              //Get Duration and TimeStampOff
2986db5fd   Charles Clément   Staging: vt6655: ...
818
              pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
5449c685a   Forest Bond   Staging: Add pris...
819
820
821
822
823
824
825
826
827
828
829
                                                         wCurrentRate, bNeedAck, uFragIdx,
                                                         cbLastFragmentSize, uMACfragNum,
                                                         byFBOption));
              pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
              return (pBuf->wDuration);
      }
      return 0;
  }
  
  
  static
6b35b7b37   Charles Clément   Staging: vt6655: ...
830
  void
5449c685a   Forest Bond   Staging: Add pris...
831
  s_vFillRTSHead (
3a215e0ff   Charles Clément   Staging: vt6655: ...
832
      PSDevice         pDevice,
3fc9b584c   Charles Clément   Staging: vt6655: ...
833
      unsigned char byPktType,
3a215e0ff   Charles Clément   Staging: vt6655: ...
834
      void *           pvRTS,
b6e95cd52   Charles Clément   Staging: vt6655: ...
835
      unsigned int cbFrameLength,
7b6a00131   Charles Clément   Staging: vt6655: ...
836
837
      bool bNeedAck,
      bool bDisCRC,
3a215e0ff   Charles Clément   Staging: vt6655: ...
838
      PSEthernetHeader psEthHeader,
2986db5fd   Charles Clément   Staging: vt6655: ...
839
      unsigned short wCurrentRate,
3fc9b584c   Charles Clément   Staging: vt6655: ...
840
      unsigned char byFBOption
5449c685a   Forest Bond   Staging: Add pris...
841
842
      )
  {
b6e95cd52   Charles Clément   Staging: vt6655: ...
843
      unsigned int uRTSFrameLen = 20;
2986db5fd   Charles Clément   Staging: vt6655: ...
844
      unsigned short wLen = 0x0000;
5449c685a   Forest Bond   Staging: Add pris...
845

5449c685a   Forest Bond   Staging: Add pris...
846
847
848
849
850
851
852
853
854
855
      if (pvRTS == NULL)
      	return;
  
      if (bDisCRC) {
          // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
          // in this case we need to decrease its length by 4.
          uRTSFrameLen -= 4;
      }
  
      // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
f77f13e22   Gilles Espinasse   Fix comment and K...
856
      //       Otherwise, we need to modify codes for them.
7e809a9b1   Jim Lieb   Staging: vt6655 t...
857
      if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
5449c685a   Forest Bond   Staging: Add pris...
858
859
860
861
          if (byFBOption == AUTO_FB_NONE) {
              PSRTS_g pBuf = (PSRTS_g)pvRTS;
              //Get SignalField,ServiceField,Length
              BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
15df6c2b9   Charles Clément   Staging: vt6655: ...
862
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
5449c685a   Forest Bond   Staging: Add pris...
863
864
              );
              pBuf->wTransmitLength_b = cpu_to_le16(wLen);
7e809a9b1   Jim Lieb   Staging: vt6655 t...
865
              BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
15df6c2b9   Charles Clément   Staging: vt6655: ...
866
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
5449c685a   Forest Bond   Staging: Add pris...
867
868
869
              );
              pBuf->wTransmitLength_a = cpu_to_le16(wLen);
              //Get Duration
2986db5fd   Charles Clément   Staging: vt6655: ...
870
871
872
              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
              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
              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
5449c685a   Forest Bond   Staging: Add pris...
873
874
875
876
877
878
  
              pBuf->Data.wDurationID = pBuf->wDuration_aa;
              //Get RTS Frame body
              pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
              if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
                  (pDevice->eOPMode == OP_MODE_AP)) {
078b078f6   Charles Clément   Staging: vt6655: ...
879
                  memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
880
881
              }
              else {
078b078f6   Charles Clément   Staging: vt6655: ...
882
                  memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
883
884
              }
              if (pDevice->eOPMode == OP_MODE_AP) {
078b078f6   Charles Clément   Staging: vt6655: ...
885
                  memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
886
887
              }
              else {
078b078f6   Charles Clément   Staging: vt6655: ...
888
                  memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
889
890
891
892
893
894
              }
          }
          else {
             PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS;
              //Get SignalField,ServiceField,Length
              BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
15df6c2b9   Charles Clément   Staging: vt6655: ...
895
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
5449c685a   Forest Bond   Staging: Add pris...
896
897
              );
              pBuf->wTransmitLength_b = cpu_to_le16(wLen);
7e809a9b1   Jim Lieb   Staging: vt6655 t...
898
              BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
15df6c2b9   Charles Clément   Staging: vt6655: ...
899
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
5449c685a   Forest Bond   Staging: Add pris...
900
901
902
903
              );
              pBuf->wTransmitLength_a = cpu_to_le16(wLen);
  
              //Get Duration
2986db5fd   Charles Clément   Staging: vt6655: ...
904
905
906
907
908
909
910
              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
              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
              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
              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
              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
              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
              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
5449c685a   Forest Bond   Staging: Add pris...
911
912
913
914
915
916
              pBuf->Data.wDurationID = pBuf->wDuration_aa;
              //Get RTS Frame body
              pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
  
              if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
                  (pDevice->eOPMode == OP_MODE_AP)) {
078b078f6   Charles Clément   Staging: vt6655: ...
917
                  memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
918
919
              }
              else {
078b078f6   Charles Clément   Staging: vt6655: ...
920
                  memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
921
922
923
              }
  
              if (pDevice->eOPMode == OP_MODE_AP) {
078b078f6   Charles Clément   Staging: vt6655: ...
924
                  memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
925
926
              }
              else {
078b078f6   Charles Clément   Staging: vt6655: ...
927
                  memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
928
929
930
931
              }
  
          } // if (byFBOption == AUTO_FB_NONE)
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
932
      else if (byPktType == PK_TYPE_11A) {
5449c685a   Forest Bond   Staging: Add pris...
933
934
935
          if (byFBOption == AUTO_FB_NONE) {
              PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
              //Get SignalField,ServiceField,Length
7e809a9b1   Jim Lieb   Staging: vt6655 t...
936
              BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
15df6c2b9   Charles Clément   Staging: vt6655: ...
937
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
5449c685a   Forest Bond   Staging: Add pris...
938
939
940
              );
              pBuf->wTransmitLength = cpu_to_le16(wLen);
              //Get Duration
2986db5fd   Charles Clément   Staging: vt6655: ...
941
              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
5449c685a   Forest Bond   Staging: Add pris...
942
943
944
945
946
947
      	    pBuf->Data.wDurationID = pBuf->wDuration;
              //Get RTS Frame body
              pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
  
              if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
                  (pDevice->eOPMode == OP_MODE_AP)) {
078b078f6   Charles Clément   Staging: vt6655: ...
948
                  memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
949
950
              }
              else {
078b078f6   Charles Clément   Staging: vt6655: ...
951
                  memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
952
953
954
              }
  
              if (pDevice->eOPMode == OP_MODE_AP) {
078b078f6   Charles Clément   Staging: vt6655: ...
955
                  memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
956
957
              }
              else {
078b078f6   Charles Clément   Staging: vt6655: ...
958
                  memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
959
960
961
962
963
964
              }
  
          }
          else {
              PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS;
              //Get SignalField,ServiceField,Length
7e809a9b1   Jim Lieb   Staging: vt6655 t...
965
              BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
15df6c2b9   Charles Clément   Staging: vt6655: ...
966
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
5449c685a   Forest Bond   Staging: Add pris...
967
968
969
              );
              pBuf->wTransmitLength = cpu_to_le16(wLen);
              //Get Duration
2986db5fd   Charles Clément   Staging: vt6655: ...
970
971
972
              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
      	    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
      	    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:
5449c685a   Forest Bond   Staging: Add pris...
973
974
975
976
977
978
      	    pBuf->Data.wDurationID = pBuf->wDuration;
      	    //Get RTS Frame body
              pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
  
              if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
                  (pDevice->eOPMode == OP_MODE_AP)) {
078b078f6   Charles Clément   Staging: vt6655: ...
979
                  memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
980
981
              }
              else {
078b078f6   Charles Clément   Staging: vt6655: ...
982
                  memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
983
984
              }
              if (pDevice->eOPMode == OP_MODE_AP) {
078b078f6   Charles Clément   Staging: vt6655: ...
985
                  memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
986
987
              }
              else {
078b078f6   Charles Clément   Staging: vt6655: ...
988
                  memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
989
990
991
              }
          }
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
992
      else if (byPktType == PK_TYPE_11B) {
5449c685a   Forest Bond   Staging: Add pris...
993
994
995
          PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
          //Get SignalField,ServiceField,Length
          BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
15df6c2b9   Charles Clément   Staging: vt6655: ...
996
              (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
5449c685a   Forest Bond   Staging: Add pris...
997
998
999
          );
          pBuf->wTransmitLength = cpu_to_le16(wLen);
          //Get Duration
2986db5fd   Charles Clément   Staging: vt6655: ...
1000
          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
5449c685a   Forest Bond   Staging: Add pris...
1001
1002
1003
1004
1005
1006
1007
          pBuf->Data.wDurationID = pBuf->wDuration;
          //Get RTS Frame body
          pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
  
  
          if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
              (pDevice->eOPMode == OP_MODE_AP)) {
078b078f6   Charles Clément   Staging: vt6655: ...
1008
              memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
1009
1010
          }
          else {
078b078f6   Charles Clément   Staging: vt6655: ...
1011
              memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
1012
1013
1014
          }
  
          if (pDevice->eOPMode == OP_MODE_AP) {
078b078f6   Charles Clément   Staging: vt6655: ...
1015
              memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
1016
1017
          }
          else {
078b078f6   Charles Clément   Staging: vt6655: ...
1018
              memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
1019
1020
1021
1022
1023
          }
      }
  }
  
  static
6b35b7b37   Charles Clément   Staging: vt6655: ...
1024
  void
5449c685a   Forest Bond   Staging: Add pris...
1025
  s_vFillCTSHead (
3a215e0ff   Charles Clément   Staging: vt6655: ...
1026
      PSDevice pDevice,
b6e95cd52   Charles Clément   Staging: vt6655: ...
1027
      unsigned int uDMAIdx,
3fc9b584c   Charles Clément   Staging: vt6655: ...
1028
      unsigned char byPktType,
3a215e0ff   Charles Clément   Staging: vt6655: ...
1029
      void *   pvCTS,
b6e95cd52   Charles Clément   Staging: vt6655: ...
1030
      unsigned int cbFrameLength,
7b6a00131   Charles Clément   Staging: vt6655: ...
1031
1032
      bool bNeedAck,
      bool bDisCRC,
2986db5fd   Charles Clément   Staging: vt6655: ...
1033
      unsigned short wCurrentRate,
3fc9b584c   Charles Clément   Staging: vt6655: ...
1034
      unsigned char byFBOption
5449c685a   Forest Bond   Staging: Add pris...
1035
1036
      )
  {
b6e95cd52   Charles Clément   Staging: vt6655: ...
1037
      unsigned int uCTSFrameLen = 14;
2986db5fd   Charles Clément   Staging: vt6655: ...
1038
      unsigned short wLen = 0x0000;
5449c685a   Forest Bond   Staging: Add pris...
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
  
      if (pvCTS == NULL) {
          return;
      }
  
      if (bDisCRC) {
          // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
          // in this case we need to decrease its length by 4.
          uCTSFrameLen -= 4;
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1049
      if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
5449c685a   Forest Bond   Staging: Add pris...
1050
1051
1052
1053
1054
          if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
              // Auto Fall back
              PSCTS_FB pBuf = (PSCTS_FB)pvCTS;
              //Get SignalField,ServiceField,Length
              BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
15df6c2b9   Charles Clément   Staging: vt6655: ...
1055
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
5449c685a   Forest Bond   Staging: Add pris...
1056
1057
1058
1059
              );
  
  
              pBuf->wTransmitLength_b = cpu_to_le16(wLen);
2986db5fd   Charles Clément   Staging: vt6655: ...
1060
              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
5449c685a   Forest Bond   Staging: Add pris...
1061
1062
1063
              pBuf->wDuration_ba += pDevice->wCTSDuration;
              pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
              //Get CTSDuration_ba_f0
2986db5fd   Charles Clément   Staging: vt6655: ...
1064
              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
5449c685a   Forest Bond   Staging: Add pris...
1065
1066
1067
              pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration;
              pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0);
              //Get CTSDuration_ba_f1
2986db5fd   Charles Clément   Staging: vt6655: ...
1068
              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
5449c685a   Forest Bond   Staging: Add pris...
1069
1070
1071
1072
1073
1074
              pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration;
              pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1);
              //Get CTS Frame body
              pBuf->Data.wDurationID = pBuf->wDuration_ba;
              pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
              pBuf->Data.wReserved = 0x0000;
078b078f6   Charles Clément   Staging: vt6655: ...
1075
              memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
1076
1077
1078
1079
1080
  
          } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
              PSCTS pBuf = (PSCTS)pvCTS;
              //Get SignalField,ServiceField,Length
              BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
15df6c2b9   Charles Clément   Staging: vt6655: ...
1081
                  (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
5449c685a   Forest Bond   Staging: Add pris...
1082
1083
1084
              );
              pBuf->wTransmitLength_b = cpu_to_le16(wLen);
              //Get CTSDuration_ba
2986db5fd   Charles Clément   Staging: vt6655: ...
1085
              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
5449c685a   Forest Bond   Staging: Add pris...
1086
1087
1088
1089
1090
1091
1092
              pBuf->wDuration_ba += pDevice->wCTSDuration;
              pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
  
              //Get CTS Frame body
              pBuf->Data.wDurationID = pBuf->wDuration_ba;
              pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
              pBuf->Data.wReserved = 0x0000;
078b078f6   Charles Clément   Staging: vt6655: ...
1093
              memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
          }
      }
  }
  
  
  
  
  
  
  /*+
   *
   * Description:
   *      Generate FIFO control for MAC & Baseband controller
   *
   * Parameters:
   *  In:
f77f13e22   Gilles Espinasse   Fix comment and K...
1110
   *      pDevice         - Pointer to adapter
5449c685a   Forest Bond   Staging: Add pris...
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
   *      pTxDataHead     - Transmit Data Buffer
   *      pTxBufHead      - pTxBufHead
   *      pvRrvTime        - pvRrvTime
   *      pvRTS            - RTS Buffer
   *      pCTS            - CTS Buffer
   *      cbFrameSize     - Transmit Data Length (Hdr+Payload+FCS)
   *      bNeedACK        - If need ACK
   *      uDescIdx        - Desc Index
   *  Out:
   *      none
   *
   * Return Value: none
   *
  -*/
b6e95cd52   Charles Clément   Staging: vt6655: ...
1125
  // unsigned int cbFrameSize,//Hdr+Payload+FCS
5449c685a   Forest Bond   Staging: Add pris...
1126
  static
6b35b7b37   Charles Clément   Staging: vt6655: ...
1127
  void
5449c685a   Forest Bond   Staging: Add pris...
1128
  s_vGenerateTxParameter (
3a215e0ff   Charles Clément   Staging: vt6655: ...
1129
      PSDevice         pDevice,
3fc9b584c   Charles Clément   Staging: vt6655: ...
1130
      unsigned char byPktType,
3a215e0ff   Charles Clément   Staging: vt6655: ...
1131
1132
1133
1134
      void *           pTxBufHead,
      void *           pvRrvTime,
      void *           pvRTS,
      void *           pvCTS,
b6e95cd52   Charles Clément   Staging: vt6655: ...
1135
      unsigned int cbFrameSize,
7b6a00131   Charles Clément   Staging: vt6655: ...
1136
      bool bNeedACK,
b6e95cd52   Charles Clément   Staging: vt6655: ...
1137
      unsigned int uDMAIdx,
3a215e0ff   Charles Clément   Staging: vt6655: ...
1138
      PSEthernetHeader psEthHeader,
2986db5fd   Charles Clément   Staging: vt6655: ...
1139
      unsigned short wCurrentRate
5449c685a   Forest Bond   Staging: Add pris...
1140
1141
      )
  {
b6e95cd52   Charles Clément   Staging: vt6655: ...
1142
      unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; //24
2986db5fd   Charles Clément   Staging: vt6655: ...
1143
      unsigned short wFifoCtl;
7b6a00131   Charles Clément   Staging: vt6655: ...
1144
      bool bDisCRC = false;
3fc9b584c   Charles Clément   Staging: vt6655: ...
1145
      unsigned char byFBOption = AUTO_FB_NONE;
2986db5fd   Charles Clément   Staging: vt6655: ...
1146
  //    unsigned short wCurrentRate = pDevice->wCurrentRate;
5449c685a   Forest Bond   Staging: Add pris...
1147

7e809a9b1   Jim Lieb   Staging: vt6655 t...
1148
1149
      //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter...
  ");
5449c685a   Forest Bond   Staging: Add pris...
1150
1151
1152
1153
1154
      PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
      pFifoHead->wReserved = wCurrentRate;
      wFifoCtl = pFifoHead->wFIFOCtl;
  
      if (wFifoCtl & FIFOCTL_CRCDIS) {
1b12068a8   Charles Clément   Staging: vt6655: ...
1155
          bDisCRC = true;
5449c685a   Forest Bond   Staging: Add pris...
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
      }
  
      if (wFifoCtl & FIFOCTL_AUTO_FB_0) {
          byFBOption = AUTO_FB_0;
      }
      else if (wFifoCtl & FIFOCTL_AUTO_FB_1) {
          byFBOption = AUTO_FB_1;
      }
  
      if (pDevice->bLongHeader)
          cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1167
      if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
5449c685a   Forest Bond   Staging: Add pris...
1168
1169
1170
1171
1172
  
          if (pvRTS != NULL) { //RTS_need
              //Fill RsvTime
              if (pvRrvTime) {
                  PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;
2986db5fd   Charles Clément   Staging: vt6655: ...
1173
1174
1175
1176
1177
                  pBuf->wRTSTxRrvTime_aa = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz
                  pBuf->wRTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz
                  pBuf->wRTSTxRrvTime_bb = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
                  pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
                  pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
5449c685a   Forest Bond   Staging: Add pris...
1178
1179
              }
              //Fill RTS
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1180
              s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
5449c685a   Forest Bond   Staging: Add pris...
1181
1182
1183
1184
1185
1186
          }
          else {//RTS_needless, PCF mode
  
              //Fill RsvTime
              if (pvRrvTime) {
                  PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;
2986db5fd   Charles Clément   Staging: vt6655: ...
1187
1188
1189
                  pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
                  pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
                  pBuf->wCTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz
5449c685a   Forest Bond   Staging: Add pris...
1190
1191
1192
1193
              }
  
  
              //Fill CTS
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1194
              s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
5449c685a   Forest Bond   Staging: Add pris...
1195
1196
          }
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1197
      else if (byPktType == PK_TYPE_11A) {
5449c685a   Forest Bond   Staging: Add pris...
1198
1199
1200
1201
1202
  
          if (pvRTS != NULL) {//RTS_need, non PCF mode
              //Fill RsvTime
              if (pvRrvTime) {
                  PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
2986db5fd   Charles Clément   Staging: vt6655: ...
1203
1204
                  pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz
                  pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM
5449c685a   Forest Bond   Staging: Add pris...
1205
1206
              }
              //Fill RTS
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1207
              s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
5449c685a   Forest Bond   Staging: Add pris...
1208
1209
1210
1211
1212
          }
          else if (pvRTS == NULL) {//RTS_needless, non PCF mode
              //Fill RsvTime
              if (pvRrvTime) {
                  PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
2986db5fd   Charles Clément   Staging: vt6655: ...
1213
                  pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM
5449c685a   Forest Bond   Staging: Add pris...
1214
1215
1216
              }
          }
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1217
      else if (byPktType == PK_TYPE_11B) {
5449c685a   Forest Bond   Staging: Add pris...
1218
1219
1220
1221
1222
  
          if ((pvRTS != NULL)) {//RTS_need, non PCF mode
              //Fill RsvTime
              if (pvRrvTime) {
                  PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
2986db5fd   Charles Clément   Staging: vt6655: ...
1223
1224
                  pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
                  pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK
5449c685a   Forest Bond   Staging: Add pris...
1225
1226
              }
              //Fill RTS
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1227
              s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
5449c685a   Forest Bond   Staging: Add pris...
1228
1229
1230
1231
1232
          }
          else { //RTS_needless, non PCF mode
              //Fill RsvTime
              if (pvRrvTime) {
                  PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
2986db5fd   Charles Clément   Staging: vt6655: ...
1233
                  pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK
5449c685a   Forest Bond   Staging: Add pris...
1234
1235
1236
              }
          }
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1237
1238
      //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter END.
  ");
5449c685a   Forest Bond   Staging: Add pris...
1239
1240
  }
  /*
2989e96f1   Charles Clément   Staging: vt6655: ...
1241
      unsigned char *pbyBuffer,//point to pTxBufHead
2986db5fd   Charles Clément   Staging: vt6655: ...
1242
      unsigned short wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last
b6e95cd52   Charles Clément   Staging: vt6655: ...
1243
      unsigned int cbFragmentSize,//Hdr+payoad+FCS
5449c685a   Forest Bond   Staging: Add pris...
1244
1245
  */
  static
6b35b7b37   Charles Clément   Staging: vt6655: ...
1246
  void
5449c685a   Forest Bond   Staging: Add pris...
1247
  s_vFillFragParameter(
3a215e0ff   Charles Clément   Staging: vt6655: ...
1248
      PSDevice pDevice,
2989e96f1   Charles Clément   Staging: vt6655: ...
1249
      unsigned char *pbyBuffer,
b6e95cd52   Charles Clément   Staging: vt6655: ...
1250
      unsigned int uTxType,
3a215e0ff   Charles Clément   Staging: vt6655: ...
1251
      void *   pvtdCurr,
2986db5fd   Charles Clément   Staging: vt6655: ...
1252
      unsigned short wFragType,
b6e95cd52   Charles Clément   Staging: vt6655: ...
1253
      unsigned int cbReqCount
5449c685a   Forest Bond   Staging: Add pris...
1254
1255
1256
      )
  {
      PSTxBufHead pTxBufHead = (PSTxBufHead) pbyBuffer;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1257
1258
      //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vFillFragParameter...
  ");
5449c685a   Forest Bond   Staging: Add pris...
1259
1260
1261
1262
1263
1264
1265
1266
1267
  
      if (uTxType == TYPE_SYNCDMA) {
          //PSTxSyncDesc ptdCurr = (PSTxSyncDesc)s_pvGetTxDescHead(pDevice, uTxType, uCurIdx);
          PSTxSyncDesc ptdCurr = (PSTxSyncDesc)pvtdCurr;
  
           //Set FIFOCtl & TimeStamp in TxSyncDesc
          ptdCurr->m_wFIFOCtl = pTxBufHead->wFIFOCtl;
          ptdCurr->m_wTimeStamp = pTxBufHead->wTimeStamp;
          //Set TSR1 & ReqCount in TxDescHead
2986db5fd   Charles Clément   Staging: vt6655: ...
1268
          ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
5449c685a   Forest Bond   Staging: Add pris...
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
          if (wFragType == FRAGCTL_ENDFRAG) { //Last Fragmentation
              ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
          }
          else {
              ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
          }
      }
      else {
          //PSTxDesc ptdCurr = (PSTxDesc)s_pvGetTxDescHead(pDevice, uTxType, uCurIdx);
          PSTxDesc ptdCurr = (PSTxDesc)pvtdCurr;
          //Set TSR1 & ReqCount in TxDescHead
2986db5fd   Charles Clément   Staging: vt6655: ...
1280
          ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
5449c685a   Forest Bond   Staging: Add pris...
1281
1282
1283
1284
1285
1286
1287
          if (wFragType == FRAGCTL_ENDFRAG) { //Last Fragmentation
              ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
          }
          else {
              ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
          }
      }
2986db5fd   Charles Clément   Staging: vt6655: ...
1288
      pTxBufHead->wFragCtl |= (unsigned short)wFragType;//0x0001; //0000 0000 0000 0001
5449c685a   Forest Bond   Staging: Add pris...
1289

7e809a9b1   Jim Lieb   Staging: vt6655 t...
1290
1291
      //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vFillFragParameter END
  ");
5449c685a   Forest Bond   Staging: Add pris...
1292
  }
fe4f34bde   Charles Clément   Staging: vt6655: ...
1293
1294
1295
  static unsigned int
  s_cbFillTxBufHead(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
  	unsigned int cbFrameBodySize, unsigned int uDMAIdx, PSTxDesc pHeadTD,
7b6a00131   Charles Clément   Staging: vt6655: ...
1296
  	PSEthernetHeader psEthHeader, unsigned char *pPacket, bool bNeedEncrypt,
fe4f34bde   Charles Clément   Staging: vt6655: ...
1297
  	PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum)
5449c685a   Forest Bond   Staging: Add pris...
1298
  {
b6e95cd52   Charles Clément   Staging: vt6655: ...
1299
1300
1301
1302
1303
1304
1305
      unsigned int cbMACHdLen;
      unsigned int cbFrameSize;
      unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
      unsigned int cbFragPayloadSize;
      unsigned int cbLastFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
      unsigned int cbLastFragPayloadSize;
      unsigned int uFragIdx;
2989e96f1   Charles Clément   Staging: vt6655: ...
1306
1307
1308
      unsigned char *pbyPayloadHead;
      unsigned char *pbyIVHead;
      unsigned char *pbyMacHdr;
2986db5fd   Charles Clément   Staging: vt6655: ...
1309
      unsigned short wFragType; //00:Non-Frag, 01:Start, 10:Mid, 11:Last
b6e95cd52   Charles Clément   Staging: vt6655: ...
1310
      unsigned int uDuration;
2989e96f1   Charles Clément   Staging: vt6655: ...
1311
      unsigned char *pbyBuffer;
b6e95cd52   Charles Clément   Staging: vt6655: ...
1312
  //    unsigned int uKeyEntryIdx = NUM_KEY_ENTRY+1;
3fc9b584c   Charles Clément   Staging: vt6655: ...
1313
  //    unsigned char byKeySel = 0xFF;
b6e95cd52   Charles Clément   Staging: vt6655: ...
1314
1315
1316
1317
1318
1319
1320
      unsigned int cbIVlen = 0;
      unsigned int cbICVlen = 0;
      unsigned int cbMIClen = 0;
      unsigned int cbFCSlen = 4;
      unsigned int cb802_1_H_len = 0;
      unsigned int uLength = 0;
      unsigned int uTmpLen = 0;
3fc9b584c   Charles Clément   Staging: vt6655: ...
1321
  //    unsigned char abyTmp[8];
0f4c60d61   Charles Clément   Staging: vt6655: ...
1322
  //    unsigned long dwCRC;
b6e95cd52   Charles Clément   Staging: vt6655: ...
1323
      unsigned int cbMICHDR = 0;
0f4c60d61   Charles Clément   Staging: vt6655: ...
1324
1325
      unsigned long dwMICKey0, dwMICKey1;
      unsigned long dwMIC_Priority;
9d828c458   Charles Clément   Staging: vt6655: ...
1326
1327
      unsigned long *pdwMIC_L;
      unsigned long *pdwMIC_R;
0f4c60d61   Charles Clément   Staging: vt6655: ...
1328
      unsigned long dwSafeMIC_L, dwSafeMIC_R; //Fix "Last Frag Size" < "MIC length".
7b6a00131   Charles Clément   Staging: vt6655: ...
1329
      bool bMIC2Frag = false;
b6e95cd52   Charles Clément   Staging: vt6655: ...
1330
1331
1332
1333
      unsigned int uMICFragLen = 0;
      unsigned int uMACfragNum = 1;
      unsigned int uPadding = 0;
      unsigned int cbReqCount = 0;
5449c685a   Forest Bond   Staging: Add pris...
1334

7b6a00131   Charles Clément   Staging: vt6655: ...
1335
1336
1337
      bool bNeedACK;
      bool bRTS;
      bool bIsAdhoc;
2989e96f1   Charles Clément   Staging: vt6655: ...
1338
      unsigned char *pbyType;
5449c685a   Forest Bond   Staging: Add pris...
1339
1340
      PSTxDesc       ptdCurr;
      PSTxBufHead    psTxBufHd = (PSTxBufHead) pbyTxBufferAddr;
b6e95cd52   Charles Clément   Staging: vt6655: ...
1341
1342
  //    unsigned int tmpDescIdx;
      unsigned int cbHeaderLength = 0;
830a619c0   Charles Clément   Staging: vt6655: ...
1343
      void *         pvRrvTime;
5449c685a   Forest Bond   Staging: Add pris...
1344
      PSMICHDRHead   pMICHDR;
830a619c0   Charles Clément   Staging: vt6655: ...
1345
1346
1347
      void *         pvRTS;
      void *         pvCTS;
      void *         pvTxDataHd;
2986db5fd   Charles Clément   Staging: vt6655: ...
1348
      unsigned short wTxBufSize;   // FFinfo size
b6e95cd52   Charles Clément   Staging: vt6655: ...
1349
      unsigned int uTotalCopyLength = 0;
3fc9b584c   Charles Clément   Staging: vt6655: ...
1350
      unsigned char byFBOption = AUTO_FB_NONE;
7b6a00131   Charles Clément   Staging: vt6655: ...
1351
      bool bIsWEP256 = false;
5449c685a   Forest Bond   Staging: Add pris...
1352
1353
1354
1355
      PSMgmtObject    pMgmt = pDevice->pMgmt;
  
  
      pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1356
1357
      //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_cbFillTxBufHead...
  ");
5449c685a   Forest Bond   Staging: Add pris...
1358
1359
      if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
          (pDevice->eOPMode == OP_MODE_AP)) {
388bf2e8f   Charles Clément   Staging: vt6655: ...
1360
  	if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
1361
  		bNeedACK = false;
388bf2e8f   Charles Clément   Staging: vt6655: ...
1362
          else
1b12068a8   Charles Clément   Staging: vt6655: ...
1363
1364
              bNeedACK = true;
          bIsAdhoc = true;
5449c685a   Forest Bond   Staging: Add pris...
1365
1366
1367
      }
      else {
          // MSDUs in Infra mode always need ACK
1b12068a8   Charles Clément   Staging: vt6655: ...
1368
          bNeedACK = true;
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
1369
          bIsAdhoc = false;
5449c685a   Forest Bond   Staging: Add pris...
1370
1371
1372
1373
1374
1375
      }
  
      if (pDevice->bLongHeader)
          cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
      else
          cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1b12068a8   Charles Clément   Staging: vt6655: ...
1376
      if ((bNeedEncrypt == true) && (pTransmitKey != NULL)) {
5449c685a   Forest Bond   Staging: Add pris...
1377
1378
1379
1380
          if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
              cbIVlen = 4;
              cbICVlen = 4;
              if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) {
1b12068a8   Charles Clément   Staging: vt6655: ...
1381
                  bIsWEP256 = true;
5449c685a   Forest Bond   Staging: Add pris...
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
              }
          }
          if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
              cbIVlen = 8;//IV+ExtIV
              cbMIClen = 8;
              cbICVlen = 4;
          }
          if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
              cbIVlen = 8;//RSN Header
              cbICVlen = 8;//MIC
              cbMICHDR = sizeof(SMICHDRHead);
          }
          if (pDevice->byLocalID > REV_ID_VT3253_A1) {
              //MAC Header should be padding 0 to DW alignment.
              uPadding = 4 - (cbMACHdLen%4);
              uPadding %= 4;
          }
      }
  
  
      cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
1403
      if ((bNeedACK == false) ||
5449c685a   Forest Bond   Staging: Add pris...
1404
1405
1406
          (cbFrameSize < pDevice->wRTSThreshold) ||
          ((cbFrameSize >= pDevice->wFragmentationThreshold) && (pDevice->wFragmentationThreshold <= pDevice->wRTSThreshold))
          ) {
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
1407
          bRTS = false;
5449c685a   Forest Bond   Staging: Add pris...
1408
1409
      }
      else {
1b12068a8   Charles Clément   Staging: vt6655: ...
1410
          bRTS = true;
5449c685a   Forest Bond   Staging: Add pris...
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
          psTxBufHd->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
      }
      //
      // Use for AUTO FALL BACK
      //
      if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_0) {
          byFBOption = AUTO_FB_0;
      }
      else if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_1) {
          byFBOption = AUTO_FB_1;
      }
  
      //////////////////////////////////////////////////////
      //Set RrvTime/RTS/CTS Buffer
      wTxBufSize = sizeof(STxBufHead);
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1426
      if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
5449c685a   Forest Bond   Staging: Add pris...
1427
1428
  
          if (byFBOption == AUTO_FB_NONE) {
1b12068a8   Charles Clément   Staging: vt6655: ...
1429
              if (bRTS == true) {//RTS_need
5449c685a   Forest Bond   Staging: Add pris...
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
                  pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
                  pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
                  pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
                  pvCTS = NULL;
                  pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g));
                  cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g);
              }
              else { //RTS_needless
                  pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
                  pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
                  pvRTS = NULL;
                  pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
                  pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
                  cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
              }
          } else {
              // Auto Fall Back
1b12068a8   Charles Clément   Staging: vt6655: ...
1447
              if (bRTS == true) {//RTS_need
5449c685a   Forest Bond   Staging: Add pris...
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
                  pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
                  pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
                  pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
                  pvCTS = NULL;
                  pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB));
                  cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB);
              }
              else { //RTS_needless
                  pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
                  pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
                  pvRTS = NULL;
                  pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
                  pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB));
                  cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB);
              }
          } // Auto Fall Back
      }
      else {//802.11a/b packet
  
          if (byFBOption == AUTO_FB_NONE) {
1b12068a8   Charles Clément   Staging: vt6655: ...
1468
              if (bRTS == true) {
5449c685a   Forest Bond   Staging: Add pris...
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
                  pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
                  pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
                  pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
                  pvCTS = NULL;
                  pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab));
                  cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab);
              }
              else { //RTS_needless, need MICHDR
                  pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
                  pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
                  pvRTS = NULL;
                  pvCTS = NULL;
                  pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
                  cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
              }
          } else {
              // Auto Fall Back
1b12068a8   Charles Clément   Staging: vt6655: ...
1486
              if (bRTS == true) {//RTS_need
5449c685a   Forest Bond   Staging: Add pris...
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
                  pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
                  pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
                  pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
                  pvCTS = NULL;
                  pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB));
                  cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB);
              }
              else { //RTS_needless
                  pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
                  pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
                  pvRTS = NULL;
                  pvCTS = NULL;
                  pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
                  cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB);
              }
          } // Auto Fall Back
      }
830a619c0   Charles Clément   Staging: vt6655: ...
1504
      memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderLength - wTxBufSize));
5449c685a   Forest Bond   Staging: Add pris...
1505
1506
  
  //////////////////////////////////////////////////////////////////
1b12068a8   Charles Clément   Staging: vt6655: ...
1507
      if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
5449c685a   Forest Bond   Staging: Add pris...
1508
          if (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
9d828c458   Charles Clément   Staging: vt6655: ...
1509
1510
              dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
              dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
5449c685a   Forest Bond   Staging: Add pris...
1511
1512
          }
          else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
9d828c458   Charles Clément   Staging: vt6655: ...
1513
1514
              dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
              dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
5449c685a   Forest Bond   Staging: Add pris...
1515
1516
          }
          else {
9d828c458   Charles Clément   Staging: vt6655: ...
1517
1518
              dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[24]);
              dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[28]);
5449c685a   Forest Bond   Staging: Add pris...
1519
1520
1521
          }
          // DO Software Michael
          MIC_vInit(dwMICKey0, dwMICKey1);
2989e96f1   Charles Clément   Staging: vt6655: ...
1522
          MIC_vAppend((unsigned char *)&(psEthHeader->abyDstAddr[0]), 12);
5449c685a   Forest Bond   Staging: Add pris...
1523
          dwMIC_Priority = 0;
2989e96f1   Charles Clément   Staging: vt6655: ...
1524
          MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1525
1526
          DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %lX, %lX
  ", dwMICKey0, dwMICKey1);
5449c685a   Forest Bond   Staging: Add pris...
1527
1528
1529
      }
  
  ///////////////////////////////////////////////////////////////////
2989e96f1   Charles Clément   Staging: vt6655: ...
1530
1531
1532
      pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderLength);
      pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
      pbyIVHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding);
5449c685a   Forest Bond   Staging: Add pris...
1533

5a5a2a6ad   Charles Clément   Staging: vt6655: ...
1534
      if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true) && (bIsWEP256 == false)) {
5449c685a   Forest Bond   Staging: Add pris...
1535
1536
1537
1538
1539
          // Fragmentation
          // FragThreshold = Fragment size(Hdr+(IV)+fragment payload+(MIC)+(ICV)+FCS)
          cbFragmentSize = pDevice->wFragmentationThreshold;
          cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
          //FragNum = (FrameSize-(Hdr+FCS))/(Fragment Size -(Hrd+FCS)))
2986db5fd   Charles Clément   Staging: vt6655: ...
1540
          uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
5449c685a   Forest Bond   Staging: Add pris...
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
          cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
          if (cbLastFragPayloadSize == 0) {
              cbLastFragPayloadSize = cbFragPayloadSize;
          } else {
              uMACfragNum++;
          }
          //[Hdr+(IV)+last fragment payload+(MIC)+(ICV)+FCS]
          cbLastFragmentSize = cbMACHdLen + cbLastFragPayloadSize + cbIVlen + cbICVlen + cbFCSlen;
  
          for (uFragIdx = 0; uFragIdx < uMACfragNum; uFragIdx ++) {
              if (uFragIdx == 0) {
                  //=========================
                  //    Start Fragmentation
                  //=========================
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1555
1556
                  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Start Fragmentation...
  ");
5449c685a   Forest Bond   Staging: Add pris...
1557
1558
1559
1560
                  wFragType = FRAGCTL_STAFRAG;
  
  
                  //Fill FIFO,RrvTime,RTS,and CTS
830a619c0   Charles Clément   Staging: vt6655: ...
1561
                  s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
5449c685a   Forest Bond   Staging: Add pris...
1562
1563
                                         cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
                  //Fill DataHead
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1564
                  uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
5449c685a   Forest Bond   Staging: Add pris...
1565
1566
                                              uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
                  // Generate TX MAC Header
2986db5fd   Charles Clément   Staging: vt6655: ...
1567
                  vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
5449c685a   Forest Bond   Staging: Add pris...
1568
                                     wFragType, uDMAIdx, uFragIdx);
1b12068a8   Charles Clément   Staging: vt6655: ...
1569
                  if (bNeedEncrypt == true) {
5449c685a   Forest Bond   Staging: Add pris...
1570
                      //Fill TXKEY
2989e96f1   Charles Clément   Staging: vt6655: ...
1571
                      s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
2986db5fd   Charles Clément   Staging: vt6655: ...
1572
                                   pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
5449c685a   Forest Bond   Staging: Add pris...
1573
1574
1575
1576
1577
1578
1579
1580
1581
                      //Fill IV(ExtIV,RSNHDR)
                      if (pDevice->bEnableHostWEP) {
                          pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
                          pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
                      }
                  }
  
  
                  // 802.1H
31c21b779   Charles Clément   Staging: vt6655: ...
1582
                  if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
5449c685a   Forest Bond   Staging: Add pris...
1583
1584
                      if ((psEthHeader->wType == TYPE_PKT_IPX) ||
                          (psEthHeader->wType == cpu_to_le16(0xF380))) {
2989e96f1   Charles Clément   Staging: vt6655: ...
1585
                          memcpy((unsigned char *) (pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
5449c685a   Forest Bond   Staging: Add pris...
1586
1587
                      }
                      else {
2989e96f1   Charles Clément   Staging: vt6655: ...
1588
                          memcpy((unsigned char *) (pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
5449c685a   Forest Bond   Staging: Add pris...
1589
                      }
2989e96f1   Charles Clément   Staging: vt6655: ...
1590
                      pbyType = (unsigned char *) (pbyPayloadHead + 6);
2986db5fd   Charles Clément   Staging: vt6655: ...
1591
                      memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
5449c685a   Forest Bond   Staging: Add pris...
1592
1593
1594
1595
1596
1597
1598
1599
1600
                      cb802_1_H_len = 8;
                  }
  
                  cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
                  //---------------------------
                  // S/W or H/W Encryption
                  //---------------------------
                  //Fill MICHDR
                  //if (pDevice->bAES) {
2986db5fd   Charles Clément   Staging: vt6655: ...
1601
                  //    s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFragPayloadSize);
5449c685a   Forest Bond   Staging: Add pris...
1602
                  //}
830a619c0   Charles Clément   Staging: vt6655: ...
1603
                  //cbReqCount += s_uDoEncryption(pDevice, psEthHeader, (void *)psTxBufHd, byKeySel,
2986db5fd   Charles Clément   Staging: vt6655: ...
1604
                  //                                pbyPayloadHead, (unsigned short)cbFragPayloadSize, uDMAIdx);
5449c685a   Forest Bond   Staging: Add pris...
1605

2989e96f1   Charles Clément   Staging: vt6655: ...
1606
1607
                  //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][uDescIdx].pbyVAddr;
                  pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
5449c685a   Forest Bond   Staging: Add pris...
1608
1609
1610
  
                  uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
                  //copy TxBufferHeader + MacHeader to desc
830a619c0   Charles Clément   Staging: vt6655: ...
1611
                  memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
5449c685a   Forest Bond   Staging: Add pris...
1612
1613
  
                  // Copy the Packet into a tx Buffer
51b6d9c29   Jim Lieb   Staging: vt665x: ...
1614
                  memcpy((pbyBuffer + uLength), (pPacket + 14), (cbFragPayloadSize - cb802_1_H_len));
5449c685a   Forest Bond   Staging: Add pris...
1615
1616
1617
  
  
                  uTotalCopyLength += cbFragPayloadSize - cb802_1_H_len;
1b12068a8   Charles Clément   Staging: vt6655: ...
1618
                  if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1619
1620
                      DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Start MIC: %d
  ", cbFragPayloadSize);
5449c685a   Forest Bond   Staging: Add pris...
1621
1622
1623
1624
1625
1626
1627
1628
1629
                      MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFragPayloadSize);
  
                  }
  
                  //---------------------------
                  // S/W Encryption
                  //---------------------------
                  if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
                      if (bNeedEncrypt) {
2986db5fd   Charles Clément   Staging: vt6655: ...
1630
                          s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len), (unsigned short)cbFragPayloadSize);
5449c685a   Forest Bond   Staging: Add pris...
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
                          cbReqCount += cbICVlen;
                      }
                  }
  
                  ptdCurr = (PSTxDesc)pHeadTD;
                  //--------------------
                  //1.Set TSR1 & ReqCount in TxDescHead
                  //2.Set FragCtl in TxBufferHead
                  //3.Set Frame Control
                  //4.Set Sequence Control
                  //5.Get S/W generate FCS
                  //--------------------
830a619c0   Charles Clément   Staging: vt6655: ...
1643
                  s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
5449c685a   Forest Bond   Staging: Add pris...
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
  
                  ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
                  ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
                  ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
                  ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
                  pDevice->iTDUsed[uDMAIdx]++;
                  pHeadTD = ptdCurr->next;
              }
              else if (uFragIdx == (uMACfragNum-1)) {
                  //=========================
                  //    Last Fragmentation
                  //=========================
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1656
1657
                  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Last Fragmentation...
  ");
5449c685a   Forest Bond   Staging: Add pris...
1658
1659
1660
1661
1662
                  //tmpDescIdx = (uDescIdx + uFragIdx) % pDevice->cbTD[uDMAIdx];
  
                  wFragType = FRAGCTL_ENDFRAG;
  
                  //Fill FIFO,RrvTime,RTS,and CTS
830a619c0   Charles Clément   Staging: vt6655: ...
1663
                  s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
5449c685a   Forest Bond   Staging: Add pris...
1664
1665
                                         cbLastFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
                  //Fill DataHead
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1666
                  uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbLastFragmentSize, uDMAIdx, bNeedACK,
5449c685a   Forest Bond   Staging: Add pris...
1667
1668
1669
                                              uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
  
                  // Generate TX MAC Header
2986db5fd   Charles Clément   Staging: vt6655: ...
1670
                  vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
5449c685a   Forest Bond   Staging: Add pris...
1671
                                     wFragType, uDMAIdx, uFragIdx);
1b12068a8   Charles Clément   Staging: vt6655: ...
1672
                  if (bNeedEncrypt == true) {
5449c685a   Forest Bond   Staging: Add pris...
1673
                      //Fill TXKEY
2989e96f1   Charles Clément   Staging: vt6655: ...
1674
                      s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
2986db5fd   Charles Clément   Staging: vt6655: ...
1675
                                   pbyMacHdr, (unsigned short)cbLastFragPayloadSize, (unsigned char *)pMICHDR);
5449c685a   Forest Bond   Staging: Add pris...
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
  
                      if (pDevice->bEnableHostWEP) {
                          pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
                          pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
                      }
  
                  }
  
  
                  cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbLastFragPayloadSize;
                  //---------------------------
                  // S/W or H/W Encryption
                  //---------------------------
2989e96f1   Charles Clément   Staging: vt6655: ...
1689
1690
                  pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
                  //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][tmpDescIdx].pbyVAddr;
5449c685a   Forest Bond   Staging: Add pris...
1691
1692
1693
1694
  
                  uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
  
                  //copy TxBufferHeader + MacHeader to desc
830a619c0   Charles Clément   Staging: vt6655: ...
1695
                  memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
5449c685a   Forest Bond   Staging: Add pris...
1696
1697
  
                  // Copy the Packet into a tx Buffer
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
1698
                  if (bMIC2Frag == false) {
5449c685a   Forest Bond   Staging: Add pris...
1699

51b6d9c29   Jim Lieb   Staging: vt665x: ...
1700
                      memcpy((pbyBuffer + uLength),
5449c685a   Forest Bond   Staging: Add pris...
1701
1702
1703
1704
1705
1706
1707
                               (pPacket + 14 + uTotalCopyLength),
                               (cbLastFragPayloadSize - cbMIClen)
                               );
                      //TODO check uTmpLen !
                      uTmpLen = cbLastFragPayloadSize - cbMIClen;
  
                  }
1b12068a8   Charles Clément   Staging: vt6655: ...
1708
                  if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1709
1710
                      DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"LAST: uMICFragLen:%d, cbLastFragPayloadSize:%d, uTmpLen:%d
  ",
5449c685a   Forest Bond   Staging: Add pris...
1711
                                     uMICFragLen, cbLastFragPayloadSize, uTmpLen);
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
1712
                      if (bMIC2Frag == false) {
5449c685a   Forest Bond   Staging: Add pris...
1713
1714
                          if (uTmpLen != 0)
                              MIC_vAppend((pbyBuffer + uLength), uTmpLen);
9d828c458   Charles Clément   Staging: vt6655: ...
1715
1716
                          pdwMIC_L = (unsigned long *)(pbyBuffer + uLength + uTmpLen);
                          pdwMIC_R = (unsigned long *)(pbyBuffer + uLength + uTmpLen + 4);
5449c685a   Forest Bond   Staging: Add pris...
1717
                          MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1718
1719
                          DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Last MIC:%lX, %lX
  ", *pdwMIC_L, *pdwMIC_R);
5449c685a   Forest Bond   Staging: Add pris...
1720
1721
                      } else {
                          if (uMICFragLen >= 4) {
2989e96f1   Charles Clément   Staging: vt6655: ...
1722
                              memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
5449c685a   Forest Bond   Staging: Add pris...
1723
                                       (cbMIClen - uMICFragLen));
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1724
1725
                              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"LAST: uMICFragLen >= 4: %X, %d
  ",
2989e96f1   Charles Clément   Staging: vt6655: ...
1726
                                             *(unsigned char *)((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
5449c685a   Forest Bond   Staging: Add pris...
1727
1728
1729
                                             (cbMIClen - uMICFragLen));
  
                          } else {
2989e96f1   Charles Clément   Staging: vt6655: ...
1730
                              memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_L + uMICFragLen),
5449c685a   Forest Bond   Staging: Add pris...
1731
                                       (4 - uMICFragLen));
51b6d9c29   Jim Lieb   Staging: vt665x: ...
1732
                              memcpy((pbyBuffer + uLength + (4 - uMICFragLen)), &dwSafeMIC_R, 4);
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1733
1734
                              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"LAST: uMICFragLen < 4: %X, %d
  ",
2989e96f1   Charles Clément   Staging: vt6655: ...
1735
                                             *(unsigned char *)((unsigned char *)&dwSafeMIC_R + uMICFragLen - 4),
5449c685a   Forest Bond   Staging: Add pris...
1736
1737
1738
1739
                                             (cbMIClen - uMICFragLen));
                          }
                          /*
                          for (ii = 0; ii < cbLastFragPayloadSize + 8 + 24; ii++) {
2989e96f1   Charles Clément   Staging: vt6655: ...
1740
                              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii - 8 - 24)));
5449c685a   Forest Bond   Staging: Add pris...
1741
                          }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1742
1743
1744
                          DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"
  
  ");
5449c685a   Forest Bond   Staging: Add pris...
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
                          */
                      }
                      MIC_vUnInit();
                  } else {
                      ASSERT(uTmpLen == (cbLastFragPayloadSize - cbMIClen));
                  }
  
  
                  //---------------------------
                  // S/W Encryption
                  //---------------------------
                  if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
                      if (bNeedEncrypt) {
2986db5fd   Charles Clément   Staging: vt6655: ...
1758
                          s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbLastFragPayloadSize);
5449c685a   Forest Bond   Staging: Add pris...
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
                          cbReqCount += cbICVlen;
                      }
                  }
  
                  ptdCurr = (PSTxDesc)pHeadTD;
  
                  //--------------------
                  //1.Set TSR1 & ReqCount in TxDescHead
                  //2.Set FragCtl in TxBufferHead
                  //3.Set Frame Control
                  //4.Set Sequence Control
                  //5.Get S/W generate FCS
                  //--------------------
830a619c0   Charles Clément   Staging: vt6655: ...
1772
                  s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
5449c685a   Forest Bond   Staging: Add pris...
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
  
                  ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
                  ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
                  ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
                  ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
                  pDevice->iTDUsed[uDMAIdx]++;
                  pHeadTD = ptdCurr->next;
  
              }
              else {
                  //=========================
                  //    Middle Fragmentation
                  //=========================
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1786
1787
                  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Middle Fragmentation...
  ");
5449c685a   Forest Bond   Staging: Add pris...
1788
1789
1790
1791
1792
                  //tmpDescIdx = (uDescIdx + uFragIdx) % pDevice->cbTD[uDMAIdx];
  
                  wFragType = FRAGCTL_MIDFRAG;
  
                  //Fill FIFO,RrvTime,RTS,and CTS
830a619c0   Charles Clément   Staging: vt6655: ...
1793
                  s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
5449c685a   Forest Bond   Staging: Add pris...
1794
1795
                                         cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
                  //Fill DataHead
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1796
                  uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
5449c685a   Forest Bond   Staging: Add pris...
1797
1798
1799
                                              uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
  
                  // Generate TX MAC Header
2986db5fd   Charles Clément   Staging: vt6655: ...
1800
                  vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
5449c685a   Forest Bond   Staging: Add pris...
1801
                                     wFragType, uDMAIdx, uFragIdx);
1b12068a8   Charles Clément   Staging: vt6655: ...
1802
                  if (bNeedEncrypt == true) {
5449c685a   Forest Bond   Staging: Add pris...
1803
                      //Fill TXKEY
2989e96f1   Charles Clément   Staging: vt6655: ...
1804
                      s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
2986db5fd   Charles Clément   Staging: vt6655: ...
1805
                                   pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
5449c685a   Forest Bond   Staging: Add pris...
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
  
                      if (pDevice->bEnableHostWEP) {
                          pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
                          pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
                      }
                  }
  
                  cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
                  //---------------------------
                  // S/W or H/W Encryption
                  //---------------------------
                  //Fill MICHDR
                  //if (pDevice->bAES) {
2986db5fd   Charles Clément   Staging: vt6655: ...
1819
                  //    s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFragPayloadSize);
5449c685a   Forest Bond   Staging: Add pris...
1820
                  //}
830a619c0   Charles Clément   Staging: vt6655: ...
1821
                  //cbReqCount += s_uDoEncryption(pDevice, psEthHeader, (void *)psTxBufHd, byKeySel,
2986db5fd   Charles Clément   Staging: vt6655: ...
1822
                  //                              pbyPayloadHead, (unsigned short)cbFragPayloadSize, uDMAIdx);
5449c685a   Forest Bond   Staging: Add pris...
1823

2989e96f1   Charles Clément   Staging: vt6655: ...
1824
1825
                  pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
                  //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][tmpDescIdx].pbyVAddr;
5449c685a   Forest Bond   Staging: Add pris...
1826
1827
1828
1829
1830
  
  
                  uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
  
                  //copy TxBufferHeader + MacHeader to desc
830a619c0   Charles Clément   Staging: vt6655: ...
1831
                  memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
5449c685a   Forest Bond   Staging: Add pris...
1832
1833
  
                  // Copy the Packet into a tx Buffer
51b6d9c29   Jim Lieb   Staging: vt665x: ...
1834
                  memcpy((pbyBuffer + uLength),
5449c685a   Forest Bond   Staging: Add pris...
1835
1836
1837
1838
1839
1840
                           (pPacket + 14 + uTotalCopyLength),
                           cbFragPayloadSize
                          );
                  uTmpLen = cbFragPayloadSize;
  
                  uTotalCopyLength += uTmpLen;
1b12068a8   Charles Clément   Staging: vt6655: ...
1841
                  if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
5449c685a   Forest Bond   Staging: Add pris...
1842
1843
1844
1845
  
                      MIC_vAppend((pbyBuffer + uLength), uTmpLen);
  
                      if (uTmpLen < cbFragPayloadSize) {
1b12068a8   Charles Clément   Staging: vt6655: ...
1846
                          bMIC2Frag = true;
5449c685a   Forest Bond   Staging: Add pris...
1847
1848
                          uMICFragLen = cbFragPayloadSize - uTmpLen;
                          ASSERT(uMICFragLen < cbMIClen);
9d828c458   Charles Clément   Staging: vt6655: ...
1849
1850
                          pdwMIC_L = (unsigned long *)(pbyBuffer + uLength + uTmpLen);
                          pdwMIC_R = (unsigned long *)(pbyBuffer + uLength + uTmpLen + 4);
5449c685a   Forest Bond   Staging: Add pris...
1851
1852
1853
                          MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
                          dwSafeMIC_L = *pdwMIC_L;
                          dwSafeMIC_R = *pdwMIC_R;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1854
1855
                          DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIDDLE: uMICFragLen:%d, cbFragPayloadSize:%d, uTmpLen:%d
  ",
5449c685a   Forest Bond   Staging: Add pris...
1856
                                         uMICFragLen, cbFragPayloadSize, uTmpLen);
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1857
1858
                          DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Fill MIC in Middle frag [%d]
  ", uMICFragLen);
5449c685a   Forest Bond   Staging: Add pris...
1859
1860
                          /*
                          for (ii = 0; ii < uMICFragLen; ii++) {
2989e96f1   Charles Clément   Staging: vt6655: ...
1861
                              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *((unsigned char *)((pbyBuffer + uLength + uTmpLen) + ii)));
5449c685a   Forest Bond   Staging: Add pris...
1862
                          }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1863
1864
                          DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"
  ");
5449c685a   Forest Bond   Staging: Add pris...
1865
                          */
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1866
1867
                          DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get MIC:%lX, %lX
  ", *pdwMIC_L, *pdwMIC_R);
5449c685a   Forest Bond   Staging: Add pris...
1868
                      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1869
1870
                      DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Middle frag len: %d
  ", uTmpLen);
5449c685a   Forest Bond   Staging: Add pris...
1871
1872
                      /*
                      for (ii = 0; ii < uTmpLen; ii++) {
2989e96f1   Charles Clément   Staging: vt6655: ...
1873
                          DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii)));
5449c685a   Forest Bond   Staging: Add pris...
1874
                      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1875
1876
1877
                      DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"
  
  ");
5449c685a   Forest Bond   Staging: Add pris...
1878
1879
1880
1881
1882
1883
1884
1885
                      */
  
                  } else {
                      ASSERT(uTmpLen == (cbFragPayloadSize));
                  }
  
                  if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
                      if (bNeedEncrypt) {
2986db5fd   Charles Clément   Staging: vt6655: ...
1886
                          s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbFragPayloadSize);
5449c685a   Forest Bond   Staging: Add pris...
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
                          cbReqCount += cbICVlen;
                      }
                  }
  
                  ptdCurr = (PSTxDesc)pHeadTD;
  
                  //--------------------
                  //1.Set TSR1 & ReqCount in TxDescHead
                  //2.Set FragCtl in TxBufferHead
                  //3.Set Frame Control
                  //4.Set Sequence Control
                  //5.Get S/W generate FCS
                  //--------------------
830a619c0   Charles Clément   Staging: vt6655: ...
1900
                  s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
5449c685a   Forest Bond   Staging: Add pris...
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
  
                  ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
                  ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
                  ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
                  ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
                  pDevice->iTDUsed[uDMAIdx]++;
                  pHeadTD = ptdCurr->next;
              }
          }  // for (uMACfragNum)
      }
      else {
          //=========================
          //    No Fragmentation
          //=========================
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1915
1916
1917
1918
          //DBG_PRTGRP03(("No Fragmentation...
  "));
          //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Fragmentation...
  ");
5449c685a   Forest Bond   Staging: Add pris...
1919
1920
1921
          wFragType = FRAGCTL_NONFRAG;
  
          //Set FragCtl in TxBufferHead
2986db5fd   Charles Clément   Staging: vt6655: ...
1922
          psTxBufHd->wFragCtl |= (unsigned short)wFragType;
5449c685a   Forest Bond   Staging: Add pris...
1923
1924
  
          //Fill FIFO,RrvTime,RTS,and CTS
830a619c0   Charles Clément   Staging: vt6655: ...
1925
          s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
5449c685a   Forest Bond   Staging: Add pris...
1926
1927
                                 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
          //Fill DataHead
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1928
          uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
5449c685a   Forest Bond   Staging: Add pris...
1929
1930
1931
                                      0, 0, uMACfragNum, byFBOption, pDevice->wCurrentRate);
  
          // Generate TX MAC Header
2986db5fd   Charles Clément   Staging: vt6655: ...
1932
          vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
5449c685a   Forest Bond   Staging: Add pris...
1933
                             wFragType, uDMAIdx, 0);
1b12068a8   Charles Clément   Staging: vt6655: ...
1934
          if (bNeedEncrypt == true) {
5449c685a   Forest Bond   Staging: Add pris...
1935
              //Fill TXKEY
2989e96f1   Charles Clément   Staging: vt6655: ...
1936
              s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
2986db5fd   Charles Clément   Staging: vt6655: ...
1937
                           pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
5449c685a   Forest Bond   Staging: Add pris...
1938
1939
1940
1941
1942
1943
1944
1945
  
              if (pDevice->bEnableHostWEP) {
                  pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
                  pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
              }
          }
  
          // 802.1H
31c21b779   Charles Clément   Staging: vt6655: ...
1946
          if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
5449c685a   Forest Bond   Staging: Add pris...
1947
1948
              if ((psEthHeader->wType == TYPE_PKT_IPX) ||
                  (psEthHeader->wType == cpu_to_le16(0xF380))) {
2989e96f1   Charles Clément   Staging: vt6655: ...
1949
                  memcpy((unsigned char *) (pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
5449c685a   Forest Bond   Staging: Add pris...
1950
1951
              }
              else {
2989e96f1   Charles Clément   Staging: vt6655: ...
1952
                  memcpy((unsigned char *) (pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
5449c685a   Forest Bond   Staging: Add pris...
1953
              }
2989e96f1   Charles Clément   Staging: vt6655: ...
1954
              pbyType = (unsigned char *) (pbyPayloadHead + 6);
2986db5fd   Charles Clément   Staging: vt6655: ...
1955
              memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
5449c685a   Forest Bond   Staging: Add pris...
1956
1957
1958
1959
1960
1961
1962
1963
1964
              cb802_1_H_len = 8;
          }
  
          cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen);
          //---------------------------
          // S/W or H/W Encryption
          //---------------------------
          //Fill MICHDR
          //if (pDevice->bAES) {
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1965
1966
          //    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Fill MICHDR...
  ");
2986db5fd   Charles Clément   Staging: vt6655: ...
1967
          //    s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFrameBodySize);
5449c685a   Forest Bond   Staging: Add pris...
1968
          //}
2989e96f1   Charles Clément   Staging: vt6655: ...
1969
1970
          pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
          //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][uDescIdx].pbyVAddr;
5449c685a   Forest Bond   Staging: Add pris...
1971
1972
1973
1974
  
          uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
  
          //copy TxBufferHeader + MacHeader to desc
830a619c0   Charles Clément   Staging: vt6655: ...
1975
          memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
5449c685a   Forest Bond   Staging: Add pris...
1976
1977
  
          // Copy the Packet into a tx Buffer
51b6d9c29   Jim Lieb   Staging: vt665x: ...
1978
          memcpy((pbyBuffer + uLength),
5449c685a   Forest Bond   Staging: Add pris...
1979
1980
1981
                   (pPacket + 14),
                   cbFrameBodySize - cb802_1_H_len
                   );
1b12068a8   Charles Clément   Staging: vt6655: ...
1982
          if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)){
5449c685a   Forest Bond   Staging: Add pris...
1983

7e809a9b1   Jim Lieb   Staging: vt6655 t...
1984
1985
              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Length:%d, %d
  ", cbFrameBodySize - cb802_1_H_len, uLength);
5449c685a   Forest Bond   Staging: Add pris...
1986
1987
              /*
              for (ii = 0; ii < (cbFrameBodySize - cb802_1_H_len); ii++) {
2989e96f1   Charles Clément   Staging: vt6655: ...
1988
                  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii)));
5449c685a   Forest Bond   Staging: Add pris...
1989
              }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
1990
1991
              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"
  ");
5449c685a   Forest Bond   Staging: Add pris...
1992
1993
1994
              */
  
              MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFrameBodySize);
9d828c458   Charles Clément   Staging: vt6655: ...
1995
1996
              pdwMIC_L = (unsigned long *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize);
              pdwMIC_R = (unsigned long *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize + 4);
5449c685a   Forest Bond   Staging: Add pris...
1997
1998
1999
  
              MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
              MIC_vUnInit();
1b12068a8   Charles Clément   Staging: vt6655: ...
2000
              if (pDevice->bTxMICFail == true) {
5449c685a   Forest Bond   Staging: Add pris...
2001
2002
                  *pdwMIC_L = 0;
                  *pdwMIC_R = 0;
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2003
                  pDevice->bTxMICFail = false;
5449c685a   Forest Bond   Staging: Add pris...
2004
              }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2005
2006
2007
2008
2009
2010
              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d
  ", uLength, cbFrameBodySize);
              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d
  ", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lx, %lx
  ", *pdwMIC_L, *pdwMIC_R);
5449c685a   Forest Bond   Staging: Add pris...
2011
2012
  /*
              for (ii = 0; ii < 8; ii++) {
2989e96f1   Charles Clément   Staging: vt6655: ...
2013
                  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *(((unsigned char *)(pdwMIC_L) + ii)));
5449c685a   Forest Bond   Staging: Add pris...
2014
              }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2015
2016
              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"
  ");
5449c685a   Forest Bond   Staging: Add pris...
2017
2018
2019
2020
2021
2022
2023
2024
  */
  
          }
  
  
          if ((pDevice->byLocalID <= REV_ID_VT3253_A1)){
              if (bNeedEncrypt) {
                  s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len),
2986db5fd   Charles Clément   Staging: vt6655: ...
2025
                                  (unsigned short)(cbFrameBodySize + cbMIClen));
5449c685a   Forest Bond   Staging: Add pris...
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
                  cbReqCount += cbICVlen;
              }
          }
  
  
          ptdCurr = (PSTxDesc)pHeadTD;
  
          ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
          ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
          ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
          ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
    	    //Set TSR1 & ReqCount in TxDescHead
          ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
2986db5fd   Charles Clément   Staging: vt6655: ...
2039
          ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
5449c685a   Forest Bond   Staging: Add pris...
2040
2041
  
          pDevice->iTDUsed[uDMAIdx]++;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2042
2043
2044
2045
  //   DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" ptdCurr->m_dwReserved0[%d] ptdCurr->m_dwReserved1[%d].
  ", ptdCurr->pTDInfo->dwReqCount, ptdCurr->pTDInfo->dwHeaderLength);
  //   DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" cbHeaderLength[%d]
  ", cbHeaderLength);
5449c685a   Forest Bond   Staging: Add pris...
2046
2047
2048
  
      }
      *puMACfragNum = uMACfragNum;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2049
2050
      //DBG_PRTGRP03(("s_cbFillTxBufHead END
  "));
5449c685a   Forest Bond   Staging: Add pris...
2051
2052
      return cbHeaderLength;
  }
6b35b7b37   Charles Clément   Staging: vt6655: ...
2053
  void
fe4f34bde   Charles Clément   Staging: vt6655: ...
2054
  vGenerateFIFOHeader(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
7b6a00131   Charles Clément   Staging: vt6655: ...
2055
  	bool bNeedEncrypt, unsigned int cbPayloadSize, unsigned int uDMAIdx,
fe4f34bde   Charles Clément   Staging: vt6655: ...
2056
2057
2058
  	PSTxDesc pHeadTD, PSEthernetHeader psEthHeader, unsigned char *pPacket,
  	PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum,
  	unsigned int *pcbHeaderSize)
5449c685a   Forest Bond   Staging: Add pris...
2059
  {
b6e95cd52   Charles Clément   Staging: vt6655: ...
2060
      unsigned int wTxBufSize;       // FFinfo size
7b6a00131   Charles Clément   Staging: vt6655: ...
2061
2062
      bool bNeedACK;
      bool bIsAdhoc;
2986db5fd   Charles Clément   Staging: vt6655: ...
2063
      unsigned short cbMacHdLen;
5449c685a   Forest Bond   Staging: Add pris...
2064
2065
2066
      PSTxBufHead     pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
  
      wTxBufSize = sizeof(STxBufHead);
51b6d9c29   Jim Lieb   Staging: vt665x: ...
2067
      memset(pTxBufHead, 0, wTxBufSize);
5449c685a   Forest Bond   Staging: Add pris...
2068
2069
2070
2071
      //Set FIFOCTL_NEEDACK
  
      if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
          (pDevice->eOPMode == OP_MODE_AP)) {
388bf2e8f   Charles Clément   Staging: vt6655: ...
2072
          if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0]))) {
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2073
              bNeedACK = false;
5449c685a   Forest Bond   Staging: Add pris...
2074
2075
2076
              pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
          }
          else {
1b12068a8   Charles Clément   Staging: vt6655: ...
2077
              bNeedACK = true;
5449c685a   Forest Bond   Staging: Add pris...
2078
2079
              pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
          }
1b12068a8   Charles Clément   Staging: vt6655: ...
2080
          bIsAdhoc = true;
5449c685a   Forest Bond   Staging: Add pris...
2081
2082
2083
      }
      else {
          // MSDUs in Infra mode always need ACK
1b12068a8   Charles Clément   Staging: vt6655: ...
2084
          bNeedACK = true;
5449c685a   Forest Bond   Staging: Add pris...
2085
          pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2086
          bIsAdhoc = false;
5449c685a   Forest Bond   Staging: Add pris...
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
      }
  
  
      pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
      pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us);
  
      //Set FIFOCTL_LHEAD
      if (pDevice->bLongHeader)
          pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
  
      //Set FIFOCTL_GENINT
  
      pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
  
  
      //Set FIFOCTL_ISDMA0
      if (TYPE_TXDMA0 == uDMAIdx) {
          pTxBufHead->wFIFOCtl |= FIFOCTL_ISDMA0;
      }
  
      //Set FRAGCTL_MACHDCNT
      if (pDevice->bLongHeader) {
          cbMacHdLen = WLAN_HDR_ADDR3_LEN + 6;
      } else {
          cbMacHdLen = WLAN_HDR_ADDR3_LEN;
      }
2986db5fd   Charles Clément   Staging: vt6655: ...
2113
      pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
5449c685a   Forest Bond   Staging: Add pris...
2114
2115
  
      //Set packet type
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2116
      if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2117
2118
          ;
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2119
      else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2120
2121
          pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2122
      else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2123
2124
          pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2125
      else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2126
2127
2128
          pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
      }
      //Set FIFOCTL_GrpAckPolicy
1b12068a8   Charles Clément   Staging: vt6655: ...
2129
      if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
          pTxBufHead->wFIFOCtl |=	FIFOCTL_GRPACK;
      }
  
      //Set Auto Fallback Ctl
      if (pDevice->wCurrentRate >= RATE_18M) {
          if (pDevice->byAutoFBCtrl == AUTO_FB_0) {
              pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
          } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) {
              pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
          }
      }
  
      //Set FRAGCTL_WEPTYP
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2143
      pDevice->bAES = false;
5449c685a   Forest Bond   Staging: Add pris...
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
  
      //Set FRAGCTL_WEPTYP
      if (pDevice->byLocalID > REV_ID_VT3253_A1) {
          if ((bNeedEncrypt) && (pTransmitKey != NULL))  { //WEP enabled
              if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
                  pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
              }
              else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
                  if (pTransmitKey->uKeyLength != WLAN_WEP232_KEYLEN)
                      pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
              }
              else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
                  pTxBufHead->wFragCtl |= FRAGCTL_AES;
              }
          }
      }
  
  #ifdef	PLICE_DEBUG
  	//printk("Func:vGenerateFIFOHeader:TxDataRate is %d,TxPower is %d
  ",pDevice->wCurrentRate,pDevice->byCurPwr);
  
  	//if (pDevice->wCurrentRate <= 3)
  	//{
  	//	RFbRawSetPower(pDevice,36,pDevice->wCurrentRate);
  	//}
  	//else
  
  	RFbSetPower(pDevice, pDevice->wCurrentRate, pDevice->byCurrentCh);
  #endif
  		//if (pDevice->wCurrentRate == 3)
  		//pDevice->byCurPwr = 46;
  		pTxBufHead->byTxPower = pDevice->byCurPwr;
  
  
  
  
  /*
      if(pDevice->bEnableHostWEP)
          pTxBufHead->wFragCtl &=  ~(FRAGCTL_TKIP | FRAGCTL_LEGACY |FRAGCTL_AES);
  */
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2184
      *pcbHeaderSize = s_cbFillTxBufHead(pDevice, byPktType, pbyTxBufferAddr, cbPayloadSize,
5449c685a   Forest Bond   Staging: Add pris...
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
                                     uDMAIdx, pHeadTD, psEthHeader, pPacket, bNeedEncrypt,
                                     pTransmitKey, uNodeIndex, puMACfragNum);
  
      return;
  }
  
  
  
  
  /*+
   *
   * Description:
   *      Translate 802.3 to 802.11 header
   *
   * Parameters:
   *  In:
f77f13e22   Gilles Espinasse   Fix comment and K...
2201
   *      pDevice         - Pointer to adapter
5449c685a   Forest Bond   Staging: Add pris...
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
   *      dwTxBufferAddr  - Transmit Buffer
   *      pPacket         - Packet from upper layer
   *      cbPacketSize    - Transmit Data Length
   *  Out:
   *      pcbHeadSize         - Header size of MAC&Baseband control and 802.11 Header
   *      pcbAppendPayload    - size of append payload for 802.1H translation
   *
   * Return Value: none
   *
  -*/
6b35b7b37   Charles Clément   Staging: vt6655: ...
2212
  void
5449c685a   Forest Bond   Staging: Add pris...
2213
  vGenerateMACHeader (
3a215e0ff   Charles Clément   Staging: vt6655: ...
2214
      PSDevice         pDevice,
2989e96f1   Charles Clément   Staging: vt6655: ...
2215
      unsigned char *pbyBufferAddr,
2986db5fd   Charles Clément   Staging: vt6655: ...
2216
      unsigned short wDuration,
3a215e0ff   Charles Clément   Staging: vt6655: ...
2217
      PSEthernetHeader psEthHeader,
7b6a00131   Charles Clément   Staging: vt6655: ...
2218
      bool bNeedEncrypt,
2986db5fd   Charles Clément   Staging: vt6655: ...
2219
      unsigned short wFragType,
b6e95cd52   Charles Clément   Staging: vt6655: ...
2220
2221
      unsigned int uDMAIdx,
      unsigned int uFragIdx
5449c685a   Forest Bond   Staging: Add pris...
2222
2223
2224
      )
  {
      PS802_11Header  pMACHeader = (PS802_11Header)pbyBufferAddr;
51b6d9c29   Jim Lieb   Staging: vt665x: ...
2225
      memset(pMACHeader, 0, (sizeof(S802_11Header)));  //- sizeof(pMACHeader->dwIV)));
5449c685a   Forest Bond   Staging: Add pris...
2226
2227
2228
2229
2230
2231
2232
2233
  
      if (uDMAIdx == TYPE_ATIMDMA) {
      	pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
      } else {
          pMACHeader->wFrameCtl = TYPE_802_11_DATA;
      }
  
      if (pDevice->eOPMode == OP_MODE_AP) {
078b078f6   Charles Clément   Staging: vt6655: ...
2234
2235
2236
          memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
          memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
          memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
2237
2238
2239
2240
          pMACHeader->wFrameCtl |= FC_FROMDS;
      }
      else {
          if (pDevice->eOPMode == OP_MODE_ADHOC) {
078b078f6   Charles Clément   Staging: vt6655: ...
2241
2242
2243
              memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
              memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
              memcpy(&(pMACHeader->abyAddr3[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
2244
2245
          }
          else {
078b078f6   Charles Clément   Staging: vt6655: ...
2246
2247
2248
              memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
              memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
              memcpy(&(pMACHeader->abyAddr1[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
2249
2250
2251
2252
2253
              pMACHeader->wFrameCtl |= FC_TODS;
          }
      }
  
      if (bNeedEncrypt)
2986db5fd   Charles Clément   Staging: vt6655: ...
2254
          pMACHeader->wFrameCtl |= cpu_to_le16((unsigned short)WLAN_SET_FC_ISWEP(1));
5449c685a   Forest Bond   Staging: Add pris...
2255
2256
2257
2258
2259
2260
  
      pMACHeader->wDurationID = cpu_to_le16(wDuration);
  
      if (pDevice->bLongHeader) {
          PWLAN_80211HDR_A4 pMACA4Header  = (PWLAN_80211HDR_A4) pbyBufferAddr;
          pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
51b6d9c29   Jim Lieb   Staging: vt665x: ...
2261
          memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
5449c685a   Forest Bond   Staging: Add pris...
2262
2263
2264
2265
      }
      pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
  
      //Set FragNumber in Sequence Control
2986db5fd   Charles Clément   Staging: vt6655: ...
2266
      pMACHeader->wSeqCtl |= cpu_to_le16((unsigned short)uFragIdx);
5449c685a   Forest Bond   Staging: Add pris...
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
  
      if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
          pDevice->wSeqCounter++;
          if (pDevice->wSeqCounter > 0x0fff)
              pDevice->wSeqCounter = 0;
      }
  
      if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) { //StartFrag or MidFrag
          pMACHeader->wFrameCtl |= FC_MOREFRAG;
      }
  }
  
  
  
  
  
  
  CMD_STATUS csMgmt_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket) {
  
      PSTxDesc        pFrstTD;
3fc9b584c   Charles Clément   Staging: vt6655: ...
2287
      unsigned char byPktType;
2989e96f1   Charles Clément   Staging: vt6655: ...
2288
      unsigned char *pbyTxBufferAddr;
830a619c0   Charles Clément   Staging: vt6655: ...
2289
      void *          pvRTS;
5449c685a   Forest Bond   Staging: Add pris...
2290
      PSCTS           pCTS;
830a619c0   Charles Clément   Staging: vt6655: ...
2291
      void *          pvTxDataHd;
b6e95cd52   Charles Clément   Staging: vt6655: ...
2292
2293
      unsigned int uDuration;
      unsigned int cbReqCount;
5449c685a   Forest Bond   Staging: Add pris...
2294
      PS802_11Header  pMACHeader;
b6e95cd52   Charles Clément   Staging: vt6655: ...
2295
2296
      unsigned int cbHeaderSize;
      unsigned int cbFrameBodySize;
7b6a00131   Charles Clément   Staging: vt6655: ...
2297
2298
      bool bNeedACK;
      bool bIsPSPOLL = false;
5449c685a   Forest Bond   Staging: Add pris...
2299
      PSTxBufHead     pTxBufHead;
b6e95cd52   Charles Clément   Staging: vt6655: ...
2300
2301
2302
2303
2304
2305
      unsigned int cbFrameSize;
      unsigned int cbIVlen = 0;
      unsigned int cbICVlen = 0;
      unsigned int cbMIClen = 0;
      unsigned int cbFCSlen = 4;
      unsigned int uPadding = 0;
2986db5fd   Charles Clément   Staging: vt6655: ...
2306
      unsigned short wTxBufSize;
b6e95cd52   Charles Clément   Staging: vt6655: ...
2307
      unsigned int cbMacHdLen;
5449c685a   Forest Bond   Staging: Add pris...
2308
      SEthernetHeader sEthHeader;
830a619c0   Charles Clément   Staging: vt6655: ...
2309
2310
      void *          pvRrvTime;
      void *          pMICHDR;
5449c685a   Forest Bond   Staging: Add pris...
2311
      PSMgmtObject    pMgmt = pDevice->pMgmt;
2986db5fd   Charles Clément   Staging: vt6655: ...
2312
      unsigned short wCurrentRate = RATE_1M;
5449c685a   Forest Bond   Staging: Add pris...
2313
2314
2315
2316
2317
2318
2319
  
  
      if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
          return CMD_STATUS_RESOURCES;
      }
  
      pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2989e96f1   Charles Clément   Staging: vt6655: ...
2320
      pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
5449c685a   Forest Bond   Staging: Add pris...
2321
2322
2323
2324
2325
2326
2327
      cbFrameBodySize = pPacket->cbPayloadLen;
      pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
      wTxBufSize = sizeof(STxBufHead);
      memset(pTxBufHead, 0, wTxBufSize);
  
      if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
          wCurrentRate = RATE_6M;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2328
          byPktType = PK_TYPE_11A;
5449c685a   Forest Bond   Staging: Add pris...
2329
2330
      } else {
          wCurrentRate = RATE_1M;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2331
          byPktType = PK_TYPE_11B;
5449c685a   Forest Bond   Staging: Add pris...
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
      }
  
      // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
      // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
      //                    And cmd timer will wait data pkt TX finish before scanning so it's OK
      //                    to set power here.
      if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING) {
  
  		RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
      } else {
          RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
      }
      pTxBufHead->byTxPower = pDevice->byCurPwr;
      //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
      if (pDevice->byFOETuning) {
          if ((pPacket->p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
              wCurrentRate = RATE_24M;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2349
              byPktType = PK_TYPE_11GA;
5449c685a   Forest Bond   Staging: Add pris...
2350
2351
2352
2353
          }
      }
  
      //Set packet type
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2354
      if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2355
2356
          pTxBufHead->wFIFOCtl = 0;
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2357
      else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2358
2359
          pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2360
      else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2361
2362
          pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2363
      else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2364
2365
2366
2367
2368
          pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
      }
  
      pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
      pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
388bf2e8f   Charles Clément   Staging: vt6655: ...
2369
      if (is_multicast_ether_addr(&(pPacket->p80211Header->sA3.abyAddr1[0])))
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2370
          bNeedACK = false;
5449c685a   Forest Bond   Staging: Add pris...
2371
      else {
1b12068a8   Charles Clément   Staging: vt6655: ...
2372
          bNeedACK = true;
5449c685a   Forest Bond   Staging: Add pris...
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
          pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
      };
  
      if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
          (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
  
          pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
          //Set Preamble type always long
          //pDevice->byPreambleType = PREAMBLE_LONG;
          // probe-response don't retry
          //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2384
          //     bNeedACK = false;
5449c685a   Forest Bond   Staging: Add pris...
2385
2386
2387
2388
2389
2390
2391
          //     pTxBufHead->wFIFOCtl  &= (~FIFOCTL_NEEDACK);
          //}
      }
  
      pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
  
      if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
1b12068a8   Charles Clément   Staging: vt6655: ...
2392
          bIsPSPOLL = true;
5449c685a   Forest Bond   Staging: Add pris...
2393
2394
2395
2396
2397
2398
          cbMacHdLen = WLAN_HDR_ADDR2_LEN;
      } else {
          cbMacHdLen = WLAN_HDR_ADDR3_LEN;
      }
  
      //Set FRAGCTL_MACHDCNT
2986db5fd   Charles Clément   Staging: vt6655: ...
2399
      pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
5449c685a   Forest Bond   Staging: Add pris...
2400
2401
2402
2403
  
      // Notes:
      // Although spec says MMPDU can be fragmented; In most case,
      // no one will send a MMPDU under fragmentation. With RTS may occur.
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2404
      pDevice->bAES = false;  //Set FRAGCTL_WEPTYP
5449c685a   Forest Bond   Staging: Add pris...
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
  
      if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
          if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
              cbIVlen = 4;
              cbICVlen = 4;
      	    pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
          }
          else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
              cbIVlen = 8;//IV+ExtIV
              cbMIClen = 8;
              cbICVlen = 4;
      	    pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
      	    //We need to get seed here for filling TxKey entry.
              //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
              //            pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
          }
          else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
              cbIVlen = 8;//RSN Header
              cbICVlen = 8;//MIC
              pTxBufHead->wFragCtl |= FRAGCTL_AES;
1b12068a8   Charles Clément   Staging: vt6655: ...
2425
              pDevice->bAES = true;
5449c685a   Forest Bond   Staging: Add pris...
2426
2427
2428
2429
2430
2431
2432
2433
2434
          }
          //MAC Header should be padding 0 to DW alignment.
          uPadding = 4 - (cbMacHdLen%4);
          uPadding %= 4;
      }
  
      cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
  
      //Set FIFOCTL_GrpAckPolicy
1b12068a8   Charles Clément   Staging: vt6655: ...
2435
      if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2436
2437
2438
2439
2440
          pTxBufHead->wFIFOCtl |=	FIFOCTL_GRPACK;
      }
      //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
  
      //Set RrvTime/RTS/CTS Buffer
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2441
      if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
5449c685a   Forest Bond   Staging: Add pris...
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
  
          pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
          pMICHDR = NULL;
          pvRTS = NULL;
          pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
          pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
          cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
      }
      else { // 802.11a/b packet
          pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
          pMICHDR = NULL;
          pvRTS = NULL;
          pCTS = NULL;
          pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
          cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
      }
830a619c0   Charles Clément   Staging: vt6655: ...
2458
      memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
5449c685a   Forest Bond   Staging: Add pris...
2459

078b078f6   Charles Clément   Staging: vt6655: ...
2460
2461
      memcpy(&(sEthHeader.abyDstAddr[0]), &(pPacket->p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
      memcpy(&(sEthHeader.abySrcAddr[0]), &(pPacket->p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
2462
2463
2464
      //=========================
      //    No Fragmentation
      //=========================
2986db5fd   Charles Clément   Staging: vt6655: ...
2465
      pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
5449c685a   Forest Bond   Staging: Add pris...
2466
2467
2468
  
  
      //Fill FIFO,RrvTime,RTS,and CTS
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2469
      s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
5449c685a   Forest Bond   Staging: Add pris...
2470
2471
2472
                             cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
  
      //Fill DataHead
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2473
      uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
5449c685a   Forest Bond   Staging: Add pris...
2474
2475
2476
2477
2478
2479
2480
                                  0, 0, 1, AUTO_FB_NONE, wCurrentRate);
  
      pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
  
      cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
  
      if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2989e96f1   Charles Clément   Staging: vt6655: ...
2481
2482
2483
          unsigned char *pbyIVHead;
          unsigned char *pbyPayloadHead;
          unsigned char *pbyBSSID;
5449c685a   Forest Bond   Staging: Add pris...
2484
          PSKeyItem       pTransmitKey = NULL;
2989e96f1   Charles Clément   Staging: vt6655: ...
2485
2486
          pbyIVHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
          pbyPayloadHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
5449c685a   Forest Bond   Staging: Add pris...
2487
2488
2489
  
          //Fill TXKEY
          //Kyle: Need fix: TKIP and AES did't encryt Mnt Packet.
2989e96f1   Charles Clément   Staging: vt6655: ...
2490
          //s_vFillTxKey(pDevice, (unsigned char *)pTxBufHead->adwTxKey, NULL);
5449c685a   Forest Bond   Staging: Add pris...
2491
2492
2493
2494
2495
2496
2497
2498
  
          //Fill IV(ExtIV,RSNHDR)
          //s_vFillPrePayload(pDevice, pbyIVHead, NULL);
          //---------------------------
          // S/W or H/W Encryption
          //---------------------------
          //Fill MICHDR
          //if (pDevice->bAES) {
2986db5fd   Charles Clément   Staging: vt6655: ...
2499
          //    s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize);
5449c685a   Forest Bond   Staging: Add pris...
2500
2501
2502
          //}
          do {
              if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
1b12068a8   Charles Clément   Staging: vt6655: ...
2503
                  (pDevice->bLinkPass == true)) {
5449c685a   Forest Bond   Staging: Add pris...
2504
2505
                  pbyBSSID = pDevice->abyBSSID;
                  // get pairwise key
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2506
                  if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
5449c685a   Forest Bond   Staging: Add pris...
2507
                      // get group key
1b12068a8   Charles Clément   Staging: vt6655: ...
2508
                      if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2509
2510
                          DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.
  ");
5449c685a   Forest Bond   Staging: Add pris...
2511
2512
2513
                          break;
                      }
                  } else {
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2514
2515
                      DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get PTK.
  ");
5449c685a   Forest Bond   Staging: Add pris...
2516
2517
2518
2519
2520
                      break;
                  }
              }
              // get group key
              pbyBSSID = pDevice->abyBroadcastAddr;
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2521
              if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
5449c685a   Forest Bond   Staging: Add pris...
2522
                  pTransmitKey = NULL;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2523
2524
                  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KEY is NULL. OP Mode[%d]
  ", pDevice->eOPMode);
5449c685a   Forest Bond   Staging: Add pris...
2525
              } else {
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2526
2527
                  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.
  ");
5449c685a   Forest Bond   Staging: Add pris...
2528
              }
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2529
          } while(false);
5449c685a   Forest Bond   Staging: Add pris...
2530
          //Fill TXKEY
2989e96f1   Charles Clément   Staging: vt6655: ...
2531
          s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2986db5fd   Charles Clément   Staging: vt6655: ...
2532
                       (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize, NULL);
5449c685a   Forest Bond   Staging: Add pris...
2533

51b6d9c29   Jim Lieb   Staging: vt665x: ...
2534
          memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2989e96f1   Charles Clément   Staging: vt6655: ...
2535
          memcpy(pbyPayloadHead, ((unsigned char *)(pPacket->p80211Header) + cbMacHdLen),
5449c685a   Forest Bond   Staging: Add pris...
2536
2537
2538
2539
                   cbFrameBodySize);
      }
      else {
          // Copy the Packet into a tx Buffer
51b6d9c29   Jim Lieb   Staging: vt665x: ...
2540
          memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
5449c685a   Forest Bond   Staging: Add pris...
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
      }
  
      pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
      pDevice->wSeqCounter++ ;
      if (pDevice->wSeqCounter > 0x0fff)
          pDevice->wSeqCounter = 0;
  
      if (bIsPSPOLL) {
          // The MAC will automatically replace the Duration-field of MAC header by Duration-field
          // of  FIFO control header.
          // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
          // in the same place of other packet's Duration-field).
          // And it will cause Cisco-AP to issue Disassociation-packet
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2554
          if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
5449c685a   Forest Bond   Staging: Add pris...
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
              ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
              ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
          } else {
              ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
          }
      }
  
  
      // first TD is the only TD
      //Set TSR1 & ReqCount in TxDescHead
      pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
      pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2986db5fd   Charles Clément   Staging: vt6655: ...
2567
      pFrstTD->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
5449c685a   Forest Bond   Staging: Add pris...
2568
2569
2570
2571
2572
2573
2574
      pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
      pFrstTD->pTDInfo->byFlags = 0;
  
      if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
          // Disable PS
          MACbPSWakeup(pDevice->PortOffset);
      }
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2575
      pDevice->bPWBitOn = false;
5449c685a   Forest Bond   Staging: Add pris...
2576
2577
2578
2579
2580
2581
2582
2583
  
      wmb();
      pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
      wmb();
  
      pDevice->iTDUsed[TYPE_TXDMA0]++;
  
      if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1) {
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2584
2585
          DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " available td0 <= 1
  ");
5449c685a   Forest Bond   Staging: Add pris...
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
      }
  
      pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
  #ifdef	PLICE_DEBUG
  		//printk("SCAN:CurrentRate is  %d,TxPower is %d
  ",wCurrentRate,pTxBufHead->byTxPower);
  #endif
  
  #ifdef TxInSleep
    pDevice->nTxDataTimeCout=0; //2008-8-21 chester <add> for send null packet
    #endif
  
      // Poll Transmit the adapter
      MACvTransmit0(pDevice->PortOffset);
  
      return CMD_STATUS_PENDING;
  
  }
  
  
  CMD_STATUS csBeacon_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket) {
3fc9b584c   Charles Clément   Staging: vt6655: ...
2607
      unsigned char byPktType;
2989e96f1   Charles Clément   Staging: vt6655: ...
2608
      unsigned char *pbyBuffer = (unsigned char *)pDevice->tx_beacon_bufs;
b6e95cd52   Charles Clément   Staging: vt6655: ...
2609
2610
      unsigned int cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
      unsigned int cbHeaderSize = 0;
2986db5fd   Charles Clément   Staging: vt6655: ...
2611
      unsigned short wTxBufSize = sizeof(STxShortBufHead);
5449c685a   Forest Bond   Staging: Add pris...
2612
2613
2614
      PSTxShortBufHead pTxBufHead = (PSTxShortBufHead) pbyBuffer;
      PSTxDataHead_ab  pTxDataHead = (PSTxDataHead_ab) (pbyBuffer + wTxBufSize);
      PS802_11Header   pMACHeader;
2986db5fd   Charles Clément   Staging: vt6655: ...
2615
2616
      unsigned short wCurrentRate;
      unsigned short wLen = 0x0000;
5449c685a   Forest Bond   Staging: Add pris...
2617
2618
2619
2620
2621
2622
  
  
      memset(pTxBufHead, 0, wTxBufSize);
  
      if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
          wCurrentRate = RATE_6M;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2623
          byPktType = PK_TYPE_11A;
5449c685a   Forest Bond   Staging: Add pris...
2624
2625
      } else {
          wCurrentRate = RATE_2M;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2626
          byPktType = PK_TYPE_11B;
5449c685a   Forest Bond   Staging: Add pris...
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
      }
  
      //Set Preamble type always long
      pDevice->byPreambleType = PREAMBLE_LONG;
  
      //Set FIFOCTL_GENINT
  
      pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
  
  
      //Set packet type & Get Duration
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2638
      if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2986db5fd   Charles Clément   Staging: vt6655: ...
2639
          pTxDataHead->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameSize, byPktType,
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2640
                                                            wCurrentRate, false, 0, 0, 1, AUTO_FB_NONE));
5449c685a   Forest Bond   Staging: Add pris...
2641
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2642
      else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2643
          pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2986db5fd   Charles Clément   Staging: vt6655: ...
2644
          pTxDataHead->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameSize, byPktType,
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2645
                                                            wCurrentRate, false, 0, 0, 1, AUTO_FB_NONE));
5449c685a   Forest Bond   Staging: Add pris...
2646
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2647
      BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, byPktType,
15df6c2b9   Charles Clément   Staging: vt6655: ...
2648
          (unsigned short *)&(wLen), (unsigned char *)&(pTxDataHead->byServiceField), (unsigned char *)&(pTxDataHead->bySignalField)
5449c685a   Forest Bond   Staging: Add pris...
2649
2650
2651
2652
2653
2654
2655
2656
      );
      pTxDataHead->wTransmitLength = cpu_to_le16(wLen);
      //Get TimeStampOff
      pTxDataHead->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
      cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
  
     //Generate Beacon Header
      pMACHeader = (PS802_11Header)(pbyBuffer + cbHeaderSize);
51b6d9c29   Jim Lieb   Staging: vt665x: ...
2657
      memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
5449c685a   Forest Bond   Staging: Add pris...
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
  
      pMACHeader->wDurationID = 0;
      pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
      pDevice->wSeqCounter++ ;
      if (pDevice->wSeqCounter > 0x0fff)
          pDevice->wSeqCounter = 0;
  
      // Set Beacon buffer length
      pDevice->wBCNBufLen = pPacket->cbMPDULen + cbHeaderSize;
  
      MACvSetCurrBCNTxDescAddr(pDevice->PortOffset, (pDevice->tx_beacon_dma));
  
      MACvSetCurrBCNLength(pDevice->PortOffset, pDevice->wBCNBufLen);
      // Set auto Transmit on
      MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
      // Poll Transmit the adapter
      MACvTransmitBCN(pDevice->PortOffset);
  
      return CMD_STATUS_PENDING;
  }
b6e95cd52   Charles Clément   Staging: vt6655: ...
2678
  unsigned int
5449c685a   Forest Bond   Staging: Add pris...
2679
  cbGetFragCount (
3a215e0ff   Charles Clément   Staging: vt6655: ...
2680
2681
      PSDevice         pDevice,
      PSKeyItem        pTransmitKey,
b6e95cd52   Charles Clément   Staging: vt6655: ...
2682
      unsigned int cbFrameBodySize,
3a215e0ff   Charles Clément   Staging: vt6655: ...
2683
      PSEthernetHeader psEthHeader
5449c685a   Forest Bond   Staging: Add pris...
2684
2685
      )
  {
b6e95cd52   Charles Clément   Staging: vt6655: ...
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
      unsigned int cbMACHdLen;
      unsigned int cbFrameSize;
      unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
      unsigned int cbFragPayloadSize;
      unsigned int cbLastFragPayloadSize;
      unsigned int cbIVlen = 0;
      unsigned int cbICVlen = 0;
      unsigned int cbMIClen = 0;
      unsigned int cbFCSlen = 4;
      unsigned int uMACfragNum = 1;
7b6a00131   Charles Clément   Staging: vt6655: ...
2696
      bool bNeedACK;
5449c685a   Forest Bond   Staging: Add pris...
2697
2698
2699
2700
2701
  
  
  
      if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
          (pDevice->eOPMode == OP_MODE_AP)) {
388bf2e8f   Charles Clément   Staging: vt6655: ...
2702
          if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2703
              bNeedACK = false;
388bf2e8f   Charles Clément   Staging: vt6655: ...
2704
          else
1b12068a8   Charles Clément   Staging: vt6655: ...
2705
              bNeedACK = true;
5449c685a   Forest Bond   Staging: Add pris...
2706
2707
2708
      }
      else {
          // MSDUs in Infra mode always need ACK
1b12068a8   Charles Clément   Staging: vt6655: ...
2709
          bNeedACK = true;
5449c685a   Forest Bond   Staging: Add pris...
2710
2711
2712
2713
2714
2715
      }
  
      if (pDevice->bLongHeader)
          cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
      else
          cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1b12068a8   Charles Clément   Staging: vt6655: ...
2716
      if (pDevice->bEncryptionEnable == true) {
5449c685a   Forest Bond   Staging: Add pris...
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
  
          if (pTransmitKey == NULL) {
              if ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) ||
                  (pDevice->pMgmt->eAuthenMode < WMAC_AUTH_WPA)) {
                  cbIVlen = 4;
                  cbICVlen = 4;
              } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
                  cbIVlen = 8;//IV+ExtIV
                  cbMIClen = 8;
                  cbICVlen = 4;
              } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
                  cbIVlen = 8;//RSN Header
                  cbICVlen = 8;//MIC
              }
          } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
              cbIVlen = 4;
              cbICVlen = 4;
          } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
              cbIVlen = 8;//IV+ExtIV
              cbMIClen = 8;
              cbICVlen = 4;
          } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
              cbIVlen = 8;//RSN Header
              cbICVlen = 8;//MIC
          }
      }
  
      cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1b12068a8   Charles Clément   Staging: vt6655: ...
2745
      if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true)) {
5449c685a   Forest Bond   Staging: Add pris...
2746
2747
2748
          // Fragmentation
          cbFragmentSize = pDevice->wFragmentationThreshold;
          cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
2986db5fd   Charles Clément   Staging: vt6655: ...
2749
          uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
5449c685a   Forest Bond   Staging: Add pris...
2750
2751
2752
2753
2754
2755
2756
2757
2758
          cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
          if (cbLastFragPayloadSize == 0) {
              cbLastFragPayloadSize = cbFragPayloadSize;
          } else {
              uMACfragNum++;
          }
      }
      return uMACfragNum;
  }
6b35b7b37   Charles Clément   Staging: vt6655: ...
2759
  void
2989e96f1   Charles Clément   Staging: vt6655: ...
2760
  vDMA0_tx_80211(PSDevice  pDevice, struct sk_buff *skb, unsigned char *pbMPDU, unsigned int cbMPDULen) {
5449c685a   Forest Bond   Staging: Add pris...
2761
2762
  
      PSTxDesc        pFrstTD;
3fc9b584c   Charles Clément   Staging: vt6655: ...
2763
      unsigned char byPktType;
2989e96f1   Charles Clément   Staging: vt6655: ...
2764
      unsigned char *pbyTxBufferAddr;
830a619c0   Charles Clément   Staging: vt6655: ...
2765
2766
2767
      void *          pvRTS;
      void *          pvCTS;
      void *          pvTxDataHd;
b6e95cd52   Charles Clément   Staging: vt6655: ...
2768
2769
      unsigned int uDuration;
      unsigned int cbReqCount;
5449c685a   Forest Bond   Staging: Add pris...
2770
      PS802_11Header  pMACHeader;
b6e95cd52   Charles Clément   Staging: vt6655: ...
2771
2772
      unsigned int cbHeaderSize;
      unsigned int cbFrameBodySize;
7b6a00131   Charles Clément   Staging: vt6655: ...
2773
2774
      bool bNeedACK;
      bool bIsPSPOLL = false;
5449c685a   Forest Bond   Staging: Add pris...
2775
      PSTxBufHead     pTxBufHead;
b6e95cd52   Charles Clément   Staging: vt6655: ...
2776
2777
2778
2779
2780
2781
2782
2783
      unsigned int cbFrameSize;
      unsigned int cbIVlen = 0;
      unsigned int cbICVlen = 0;
      unsigned int cbMIClen = 0;
      unsigned int cbFCSlen = 4;
      unsigned int uPadding = 0;
      unsigned int cbMICHDR = 0;
      unsigned int uLength = 0;
0f4c60d61   Charles Clément   Staging: vt6655: ...
2784
2785
      unsigned long dwMICKey0, dwMICKey1;
      unsigned long dwMIC_Priority;
9d828c458   Charles Clément   Staging: vt6655: ...
2786
2787
      unsigned long *pdwMIC_L;
      unsigned long *pdwMIC_R;
2986db5fd   Charles Clément   Staging: vt6655: ...
2788
      unsigned short wTxBufSize;
b6e95cd52   Charles Clément   Staging: vt6655: ...
2789
      unsigned int cbMacHdLen;
5449c685a   Forest Bond   Staging: Add pris...
2790
      SEthernetHeader sEthHeader;
830a619c0   Charles Clément   Staging: vt6655: ...
2791
2792
      void *          pvRrvTime;
      void *          pMICHDR;
5449c685a   Forest Bond   Staging: Add pris...
2793
      PSMgmtObject    pMgmt = pDevice->pMgmt;
2986db5fd   Charles Clément   Staging: vt6655: ...
2794
      unsigned short wCurrentRate = RATE_1M;
5449c685a   Forest Bond   Staging: Add pris...
2795
      PUWLAN_80211HDR  p80211Header;
b6e95cd52   Charles Clément   Staging: vt6655: ...
2796
      unsigned int uNodeIndex = 0;
7b6a00131   Charles Clément   Staging: vt6655: ...
2797
      bool bNodeExist = false;
5449c685a   Forest Bond   Staging: Add pris...
2798
2799
      SKeyItem        STempKey;
      PSKeyItem       pTransmitKey = NULL;
2989e96f1   Charles Clément   Staging: vt6655: ...
2800
2801
2802
      unsigned char *pbyIVHead;
      unsigned char *pbyPayloadHead;
      unsigned char *pbyMacHdr;
5449c685a   Forest Bond   Staging: Add pris...
2803

b6e95cd52   Charles Clément   Staging: vt6655: ...
2804
      unsigned int cbExtSuppRate = 0;
5449c685a   Forest Bond   Staging: Add pris...
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
  //    PWLAN_IE        pItem;
  
  
      pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
  
      if(cbMPDULen <= WLAN_HDR_ADDR3_LEN) {
         cbFrameBodySize = 0;
      }
      else {
         cbFrameBodySize = cbMPDULen - WLAN_HDR_ADDR3_LEN;
      }
      p80211Header = (PUWLAN_80211HDR)pbMPDU;
  
  
      pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2989e96f1   Charles Clément   Staging: vt6655: ...
2820
      pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
5449c685a   Forest Bond   Staging: Add pris...
2821
2822
2823
2824
2825
2826
      pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
      wTxBufSize = sizeof(STxBufHead);
      memset(pTxBufHead, 0, wTxBufSize);
  
      if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
          wCurrentRate = RATE_6M;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2827
          byPktType = PK_TYPE_11A;
5449c685a   Forest Bond   Staging: Add pris...
2828
2829
      } else {
          wCurrentRate = RATE_1M;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2830
          byPktType = PK_TYPE_11B;
5449c685a   Forest Bond   Staging: Add pris...
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
      }
  
      // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
      // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
      //                    And cmd timer will wait data pkt TX finish before scanning so it's OK
      //                    to set power here.
      if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING) {
          RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
      } else {
          RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
      }
      pTxBufHead->byTxPower = pDevice->byCurPwr;
  
      //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
      if (pDevice->byFOETuning) {
          if ((p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
              wCurrentRate = RATE_24M;
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2848
              byPktType = PK_TYPE_11GA;
5449c685a   Forest Bond   Staging: Add pris...
2849
2850
          }
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2851
2852
      DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x 
  ", p80211Header->sA3.wFrameCtl);
5449c685a   Forest Bond   Staging: Add pris...
2853
2854
  
      //Set packet type
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2855
      if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2856
2857
          pTxBufHead->wFIFOCtl = 0;
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2858
      else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2859
2860
          pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2861
      else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2862
2863
          pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
      }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2864
      else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2865
2866
2867
2868
2869
          pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
      }
  
      pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
      pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
388bf2e8f   Charles Clément   Staging: vt6655: ...
2870
      if (is_multicast_ether_addr(&(p80211Header->sA3.abyAddr1[0]))) {
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2871
          bNeedACK = false;
5449c685a   Forest Bond   Staging: Add pris...
2872
2873
          if (pDevice->bEnableHostWEP) {
              uNodeIndex = 0;
1b12068a8   Charles Clément   Staging: vt6655: ...
2874
              bNodeExist = true;
9fc86028f   Joe Perches   staging: Remove u...
2875
          }
5449c685a   Forest Bond   Staging: Add pris...
2876
2877
2878
      }
      else {
          if (pDevice->bEnableHostWEP) {
2989e96f1   Charles Clément   Staging: vt6655: ...
2879
              if (BSSDBbIsSTAInNodeDB(pDevice->pMgmt, (unsigned char *)(p80211Header->sA3.abyAddr1), &uNodeIndex))
1b12068a8   Charles Clément   Staging: vt6655: ...
2880
                  bNodeExist = true;
9fc86028f   Joe Perches   staging: Remove u...
2881
          }
1b12068a8   Charles Clément   Staging: vt6655: ...
2882
          bNeedACK = true;
5449c685a   Forest Bond   Staging: Add pris...
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
          pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
      };
  
      if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
          (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
  
          pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
          //Set Preamble type always long
          //pDevice->byPreambleType = PREAMBLE_LONG;
  
          // probe-response don't retry
          //if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2895
          //     bNeedACK = false;
5449c685a   Forest Bond   Staging: Add pris...
2896
2897
2898
2899
2900
2901
2902
          //     pTxBufHead->wFIFOCtl  &= (~FIFOCTL_NEEDACK);
          //}
      }
  
      pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
  
      if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
1b12068a8   Charles Clément   Staging: vt6655: ...
2903
          bIsPSPOLL = true;
5449c685a   Forest Bond   Staging: Add pris...
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
          cbMacHdLen = WLAN_HDR_ADDR2_LEN;
      } else {
          cbMacHdLen = WLAN_HDR_ADDR3_LEN;
      }
  
      // hostapd deamon ext support rate patch
      if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
  
          if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0) {
              cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
           }
  
          if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0) {
              cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
           }
  
           if (cbExtSuppRate >0) {
              cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
           }
      }
  
  
      //Set FRAGCTL_MACHDCNT
2986db5fd   Charles Clément   Staging: vt6655: ...
2927
      pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)cbMacHdLen << 10);
5449c685a   Forest Bond   Staging: Add pris...
2928
2929
2930
2931
  
      // Notes:
      // Although spec says MMPDU can be fragmented; In most case,
      // no one will send a MMPDU under fragmentation. With RTS may occur.
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
2932
      pDevice->bAES = false;  //Set FRAGCTL_WEPTYP
5449c685a   Forest Bond   Staging: Add pris...
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
  
  
      if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
          if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
              cbIVlen = 4;
              cbICVlen = 4;
      	    pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
          }
          else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
              cbIVlen = 8;//IV+ExtIV
              cbMIClen = 8;
              cbICVlen = 4;
      	    pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
      	    //We need to get seed here for filling TxKey entry.
              //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
              //            pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
          }
          else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
              cbIVlen = 8;//RSN Header
              cbICVlen = 8;//MIC
              cbMICHDR = sizeof(SMICHDRHead);
              pTxBufHead->wFragCtl |= FRAGCTL_AES;
1b12068a8   Charles Clément   Staging: vt6655: ...
2955
              pDevice->bAES = true;
5449c685a   Forest Bond   Staging: Add pris...
2956
2957
2958
2959
2960
2961
2962
2963
2964
          }
          //MAC Header should be padding 0 to DW alignment.
          uPadding = 4 - (cbMacHdLen%4);
          uPadding %= 4;
      }
  
      cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
  
      //Set FIFOCTL_GrpAckPolicy
1b12068a8   Charles Clément   Staging: vt6655: ...
2965
      if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
5449c685a   Forest Bond   Staging: Add pris...
2966
2967
2968
          pTxBufHead->wFIFOCtl |=	FIFOCTL_GRPACK;
      }
      //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2969
      if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
5449c685a   Forest Bond   Staging: Add pris...
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
  
          pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
          pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
          pvRTS = NULL;
          pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
          pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
          cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
  
      }
      else {//802.11a/b packet
  
          pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
          pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
          pvRTS = NULL;
          pvCTS = NULL;
          pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
          cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
  
      }
830a619c0   Charles Clément   Staging: vt6655: ...
2989
      memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
078b078f6   Charles Clément   Staging: vt6655: ...
2990
2991
      memcpy(&(sEthHeader.abyDstAddr[0]), &(p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
      memcpy(&(sEthHeader.abySrcAddr[0]), &(p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
5449c685a   Forest Bond   Staging: Add pris...
2992
2993
2994
      //=========================
      //    No Fragmentation
      //=========================
2986db5fd   Charles Clément   Staging: vt6655: ...
2995
      pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
5449c685a   Forest Bond   Staging: Add pris...
2996
2997
2998
  
  
      //Fill FIFO,RrvTime,RTS,and CTS
7e809a9b1   Jim Lieb   Staging: vt6655 t...
2999
      s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
5449c685a   Forest Bond   Staging: Add pris...
3000
3001
3002
                             cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
  
      //Fill DataHead
7e809a9b1   Jim Lieb   Staging: vt6655 t...
3003
      uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
5449c685a   Forest Bond   Staging: Add pris...
3004
3005
3006
3007
3008
                                  0, 0, 1, AUTO_FB_NONE, wCurrentRate);
  
      pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
  
      cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
2989e96f1   Charles Clément   Staging: vt6655: ...
3009
3010
3011
      pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize);
      pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
      pbyIVHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding);
5449c685a   Forest Bond   Staging: Add pris...
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
  
      // Copy the Packet into a tx Buffer
      memcpy(pbyMacHdr, pbMPDU, cbMacHdLen);
  
      // version set to 0, patch for hostapd deamon
      pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
      memcpy(pbyPayloadHead, (pbMPDU + cbMacHdLen), cbFrameBodySize);
  
      // replace support rate, patch for hostapd deamon( only support 11M)
      if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
          if (cbExtSuppRate != 0) {
              if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
                  memcpy((pbyPayloadHead + cbFrameBodySize),
                          pMgmt->abyCurrSuppRates,
                          ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
                         );
               if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
                  memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
                          pMgmt->abyCurrExtSuppRates,
                          ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
                         );
           }
      }
  
      // Set wep
      if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
  
          if (pDevice->bEnableHostWEP) {
              pTransmitKey = &STempKey;
              pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
              pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
              pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
              pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
              pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
              memcpy(pTransmitKey->abyKey,
                  &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
                  pTransmitKey->uKeyLength
                  );
          }
  
          if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
9d828c458   Charles Clément   Staging: vt6655: ...
3053
3054
              dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
              dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
5449c685a   Forest Bond   Staging: Add pris...
3055
3056
3057
  
              // DO Software Michael
              MIC_vInit(dwMICKey0, dwMICKey1);
2989e96f1   Charles Clément   Staging: vt6655: ...
3058
              MIC_vAppend((unsigned char *)&(sEthHeader.abyDstAddr[0]), 12);
5449c685a   Forest Bond   Staging: Add pris...
3059
              dwMIC_Priority = 0;
2989e96f1   Charles Clément   Staging: vt6655: ...
3060
              MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
7e809a9b1   Jim Lieb   Staging: vt6655 t...
3061
3062
              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY: %lX, %lX
  ", dwMICKey0, dwMICKey1);
5449c685a   Forest Bond   Staging: Add pris...
3063
3064
3065
3066
  
              uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
  
              MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
9d828c458   Charles Clément   Staging: vt6655: ...
3067
3068
              pdwMIC_L = (unsigned long *)(pbyTxBufferAddr + uLength + cbFrameBodySize);
              pdwMIC_R = (unsigned long *)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
5449c685a   Forest Bond   Staging: Add pris...
3069
3070
3071
  
              MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
              MIC_vUnInit();
1b12068a8   Charles Clément   Staging: vt6655: ...
3072
              if (pDevice->bTxMICFail == true) {
5449c685a   Forest Bond   Staging: Add pris...
3073
3074
                  *pdwMIC_L = 0;
                  *pdwMIC_R = 0;
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
3075
                  pDevice->bTxMICFail = false;
5449c685a   Forest Bond   Staging: Add pris...
3076
              }
7e809a9b1   Jim Lieb   Staging: vt6655 t...
3077
3078
3079
3080
3081
3082
              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d
  ", uLength, cbFrameBodySize);
              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d
  ", cbReqCount, cbHeaderSize, uPadding, cbIVlen);
              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lx, %lx
  ", *pdwMIC_L, *pdwMIC_R);
5449c685a   Forest Bond   Staging: Add pris...
3083
3084
  
          }
2989e96f1   Charles Clément   Staging: vt6655: ...
3085
          s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2986db5fd   Charles Clément   Staging: vt6655: ...
3086
                       pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
5449c685a   Forest Bond   Staging: Add pris...
3087
3088
3089
3090
3091
3092
3093
  
          if (pDevice->bEnableHostWEP) {
              pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
              pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
          }
  
          if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
2986db5fd   Charles Clément   Staging: vt6655: ...
3094
              s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (unsigned short)(cbFrameBodySize + cbMIClen));
5449c685a   Forest Bond   Staging: Add pris...
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
          }
      }
  
      pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
      pDevice->wSeqCounter++ ;
      if (pDevice->wSeqCounter > 0x0fff)
          pDevice->wSeqCounter = 0;
  
  
      if (bIsPSPOLL) {
          // The MAC will automatically replace the Duration-field of MAC header by Duration-field
          // of  FIFO control header.
          // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
          // in the same place of other packet's Duration-field).
          // And it will cause Cisco-AP to issue Disassociation-packet
7e809a9b1   Jim Lieb   Staging: vt6655 t...
3110
          if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
5449c685a   Forest Bond   Staging: Add pris...
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
              ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
              ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
          } else {
              ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
          }
      }
  
  
      // first TD is the only TD
      //Set TSR1 & ReqCount in TxDescHead
      pFrstTD->pTDInfo->skb = skb;
      pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
      pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
      pFrstTD->m_td1TD1.wReqCount = cpu_to_le16(cbReqCount);
      pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
      pFrstTD->pTDInfo->byFlags = 0;
      pFrstTD->pTDInfo->byFlags |= TD_FLAGS_PRIV_SKB;
  
      if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
          // Disable PS
          MACbPSWakeup(pDevice->PortOffset);
      }
5a5a2a6ad   Charles Clément   Staging: vt6655: ...
3133
      pDevice->bPWBitOn = false;
5449c685a   Forest Bond   Staging: Add pris...
3134
3135
3136
3137
3138
3139
3140
3141
  
      wmb();
      pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
      wmb();
  
      pDevice->iTDUsed[TYPE_TXDMA0]++;
  
      if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1) {
7e809a9b1   Jim Lieb   Staging: vt6655 t...
3142
3143
          DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " available td0 <= 1
  ");
5449c685a   Forest Bond   Staging: Add pris...
3144
3145
3146
3147
3148
3149
3150
3151
3152
      }
  
      pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
  
      // Poll Transmit the adapter
      MACvTransmit0(pDevice->PortOffset);
  
      return;
  }