rxtx.c 101 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963
  1. /*
  2. * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
  3. * All rights reserved.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License along
  16. * with this program; if not, write to the Free Software Foundation, Inc.,
  17. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  18. *
  19. * File: rxtx.c
  20. *
  21. * Purpose: handle WMAC/802.3/802.11 rx & tx functions
  22. *
  23. * Author: Lyndon Chen
  24. *
  25. * Date: May 20, 2003
  26. *
  27. * Functions:
  28. * s_vGenerateTxParameter - Generate tx dma required parameter.
  29. * vGenerateMACHeader - Translate 802.3 to 802.11 header
  30. * cbGetFragCount - Calculate fragment number count
  31. * csBeacon_xmit - beacon tx function
  32. * csMgmt_xmit - management tx function
  33. * s_cbFillTxBufHead - fulfill tx dma buffer header
  34. * s_uGetDataDuration - get tx data required duration
  35. * s_uFillDataHead- fulfill tx data duration header
  36. * s_uGetRTSCTSDuration- get rtx/cts required duration
  37. * s_uGetRTSCTSRsvTime- get rts/cts reserved time
  38. * s_uGetTxRsvTime- get frame reserved time
  39. * s_vFillCTSHead- fulfill CTS ctl header
  40. * s_vFillFragParameter- Set fragment ctl parameter.
  41. * s_vFillRTSHead- fulfill RTS ctl header
  42. * s_vFillTxKey- fulfill tx encrypt key
  43. * s_vSWencryption- Software encrypt header
  44. * vDMA0_tx_80211- tx 802.11 frame via dma0
  45. * vGenerateFIFOHeader- Generate tx FIFO ctl header
  46. *
  47. * Revision History:
  48. *
  49. */
  50. #include "device.h"
  51. #include "rxtx.h"
  52. #include "tether.h"
  53. #include "card.h"
  54. #include "bssdb.h"
  55. #include "mac.h"
  56. #include "baseband.h"
  57. #include "michael.h"
  58. #include "tkip.h"
  59. #include "tcrc.h"
  60. #include "wctl.h"
  61. #include "wroute.h"
  62. #include "hostap.h"
  63. #include "rf.h"
  64. /*--------------------- Static Definitions -------------------------*/
  65. /*--------------------- Static Classes ----------------------------*/
  66. /*--------------------- Static Variables --------------------------*/
  67. /*--------------------- Static Functions --------------------------*/
  68. /*--------------------- Static Definitions -------------------------*/
  69. #define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send
  70. // packet size >= 256 -> direct send
  71. static const unsigned short wTimeStampOff[2][MAX_RATE] = {
  72. {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
  73. {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
  74. };
  75. static const unsigned short wFB_Opt0[2][5] = {
  76. {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
  77. {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
  78. };
  79. static const unsigned short wFB_Opt1[2][5] = {
  80. {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
  81. {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
  82. };
  83. #define RTSDUR_BB 0
  84. #define RTSDUR_BA 1
  85. #define RTSDUR_AA 2
  86. #define CTSDUR_BA 3
  87. #define RTSDUR_BA_F0 4
  88. #define RTSDUR_AA_F0 5
  89. #define RTSDUR_BA_F1 6
  90. #define RTSDUR_AA_F1 7
  91. #define CTSDUR_BA_F0 8
  92. #define CTSDUR_BA_F1 9
  93. #define DATADUR_B 10
  94. #define DATADUR_A 11
  95. #define DATADUR_A_F0 12
  96. #define DATADUR_A_F1 13
  97. /*--------------------- Static Functions --------------------------*/
  98. static
  99. void
  100. s_vFillTxKey(
  101. struct vnt_private *pDevice,
  102. unsigned char *pbyBuf,
  103. unsigned char *pbyIVHead,
  104. PSKeyItem pTransmitKey,
  105. unsigned char *pbyHdrBuf,
  106. unsigned short wPayloadLen,
  107. unsigned char *pMICHDR
  108. );
  109. static
  110. void
  111. s_vFillRTSHead(
  112. struct vnt_private *pDevice,
  113. unsigned char byPktType,
  114. void *pvRTS,
  115. unsigned int cbFrameLength,
  116. bool bNeedAck,
  117. bool bDisCRC,
  118. PSEthernetHeader psEthHeader,
  119. unsigned short wCurrentRate,
  120. unsigned char byFBOption
  121. );
  122. static
  123. void
  124. s_vGenerateTxParameter(
  125. struct vnt_private *pDevice,
  126. unsigned char byPktType,
  127. void *pTxBufHead,
  128. void *pvRrvTime,
  129. void *pvRTS,
  130. void *pvCTS,
  131. unsigned int cbFrameSize,
  132. bool bNeedACK,
  133. unsigned int uDMAIdx,
  134. PSEthernetHeader psEthHeader,
  135. unsigned short wCurrentRate
  136. );
  137. static void s_vFillFragParameter(
  138. struct vnt_private *pDevice,
  139. unsigned char *pbyBuffer,
  140. unsigned int uTxType,
  141. void *pvtdCurr,
  142. unsigned short wFragType,
  143. unsigned int cbReqCount
  144. );
  145. static unsigned int
  146. s_cbFillTxBufHead(struct vnt_private *pDevice, unsigned char byPktType,
  147. unsigned char *pbyTxBufferAddr, unsigned int cbFrameBodySize,
  148. unsigned int uDMAIdx, PSTxDesc pHeadTD,
  149. PSEthernetHeader psEthHeader, unsigned char *pPacket,
  150. bool bNeedEncrypt, PSKeyItem pTransmitKey,
  151. unsigned int uNodeIndex, unsigned int *puMACfragNum);
  152. static
  153. __le16
  154. s_uFillDataHead(
  155. struct vnt_private *pDevice,
  156. unsigned char byPktType,
  157. void *pTxDataHead,
  158. unsigned int cbFrameLength,
  159. unsigned int uDMAIdx,
  160. bool bNeedAck,
  161. unsigned int uFragIdx,
  162. unsigned int cbLastFragmentSize,
  163. unsigned int uMACfragNum,
  164. unsigned char byFBOption,
  165. unsigned short wCurrentRate
  166. );
  167. /*--------------------- Export Variables --------------------------*/
  168. static
  169. void
  170. s_vFillTxKey(
  171. struct vnt_private *pDevice,
  172. unsigned char *pbyBuf,
  173. unsigned char *pbyIVHead,
  174. PSKeyItem pTransmitKey,
  175. unsigned char *pbyHdrBuf,
  176. unsigned short wPayloadLen,
  177. unsigned char *pMICHDR
  178. )
  179. {
  180. struct vnt_mic_hdr *mic_hdr = (struct vnt_mic_hdr *)pMICHDR;
  181. unsigned long *pdwIV = (unsigned long *)pbyIVHead;
  182. unsigned long *pdwExtIV = (unsigned long *)((unsigned char *)pbyIVHead+4);
  183. PS802_11Header pMACHeader = (PS802_11Header)pbyHdrBuf;
  184. unsigned long dwRevIVCounter;
  185. unsigned char byKeyIndex = 0;
  186. //Fill TXKEY
  187. if (pTransmitKey == NULL)
  188. return;
  189. dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
  190. *pdwIV = pDevice->dwIVCounter;
  191. byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
  192. if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
  193. if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) {
  194. memcpy(pDevice->abyPRNG, (unsigned char *)&(dwRevIVCounter), 3);
  195. memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
  196. } else {
  197. memcpy(pbyBuf, (unsigned char *)&(dwRevIVCounter), 3);
  198. memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
  199. if (pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
  200. memcpy(pbyBuf+8, (unsigned char *)&(dwRevIVCounter), 3);
  201. memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
  202. }
  203. memcpy(pDevice->abyPRNG, pbyBuf, 16);
  204. }
  205. // Append IV after Mac Header
  206. *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
  207. *pdwIV |= (unsigned long)byKeyIndex << 30;
  208. *pdwIV = cpu_to_le32(*pdwIV);
  209. pDevice->dwIVCounter++;
  210. if (pDevice->dwIVCounter > WEP_IV_MASK)
  211. pDevice->dwIVCounter = 0;
  212. } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
  213. pTransmitKey->wTSC15_0++;
  214. if (pTransmitKey->wTSC15_0 == 0)
  215. pTransmitKey->dwTSC47_16++;
  216. TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
  217. pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
  218. memcpy(pbyBuf, pDevice->abyPRNG, 16);
  219. // Make IV
  220. memcpy(pdwIV, pDevice->abyPRNG, 3);
  221. *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
  222. // Append IV&ExtIV after Mac Header
  223. *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
  224. pr_debug("vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV);
  225. } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
  226. pTransmitKey->wTSC15_0++;
  227. if (pTransmitKey->wTSC15_0 == 0)
  228. pTransmitKey->dwTSC47_16++;
  229. memcpy(pbyBuf, pTransmitKey->abyKey, 16);
  230. // Make IV
  231. *pdwIV = 0;
  232. *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
  233. *pdwIV |= cpu_to_le16((unsigned short)(pTransmitKey->wTSC15_0));
  234. //Append IV&ExtIV after Mac Header
  235. *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
  236. /* MICHDR0 */
  237. mic_hdr->id = 0x59;
  238. mic_hdr->tx_priority = 0;
  239. memcpy(mic_hdr->mic_addr2, pMACHeader->abyAddr2, ETH_ALEN);
  240. /* ccmp pn big endian order */
  241. mic_hdr->ccmp_pn[0] = (u8)(pTransmitKey->dwTSC47_16 >> 24);
  242. mic_hdr->ccmp_pn[1] = (u8)(pTransmitKey->dwTSC47_16 >> 16);
  243. mic_hdr->ccmp_pn[2] = (u8)(pTransmitKey->dwTSC47_16 >> 8);
  244. mic_hdr->ccmp_pn[3] = (u8)pTransmitKey->dwTSC47_16;
  245. mic_hdr->ccmp_pn[4] = (u8)(pTransmitKey->wTSC15_0 >> 8);
  246. mic_hdr->ccmp_pn[5] = (u8)pTransmitKey->wTSC15_0;
  247. /* MICHDR1 */
  248. mic_hdr->payload_len = cpu_to_be16(wPayloadLen);
  249. if (pDevice->bLongHeader)
  250. mic_hdr->hlen = cpu_to_be16(28);
  251. else
  252. mic_hdr->hlen = cpu_to_be16(22);
  253. memcpy(mic_hdr->addr1, pMACHeader->abyAddr1, ETH_ALEN);
  254. memcpy(mic_hdr->addr2, pMACHeader->abyAddr2, ETH_ALEN);
  255. /* MICHDR2 */
  256. memcpy(mic_hdr->addr3, pMACHeader->abyAddr3, ETH_ALEN);
  257. mic_hdr->frame_control =
  258. cpu_to_le16(pMACHeader->wFrameCtl & 0xc78f);
  259. mic_hdr->seq_ctrl = cpu_to_le16(pMACHeader->wSeqCtl & 0xf);
  260. if (pDevice->bLongHeader)
  261. memcpy(mic_hdr->addr4, pMACHeader->abyAddr4, ETH_ALEN);
  262. }
  263. }
  264. static
  265. void
  266. s_vSWencryption(
  267. struct vnt_private *pDevice,
  268. PSKeyItem pTransmitKey,
  269. unsigned char *pbyPayloadHead,
  270. unsigned short wPayloadSize
  271. )
  272. {
  273. unsigned int cbICVlen = 4;
  274. unsigned long dwICV = 0xFFFFFFFFL;
  275. unsigned long *pdwICV;
  276. if (pTransmitKey == NULL)
  277. return;
  278. if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
  279. //=======================================================================
  280. // Append ICV after payload
  281. dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
  282. pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
  283. // finally, we must invert dwCRC to get the correct answer
  284. *pdwICV = cpu_to_le32(~dwICV);
  285. // RC4 encryption
  286. rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
  287. rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
  288. //=======================================================================
  289. } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
  290. //=======================================================================
  291. //Append ICV after payload
  292. dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
  293. pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
  294. // finally, we must invert dwCRC to get the correct answer
  295. *pdwICV = cpu_to_le32(~dwICV);
  296. // RC4 encryption
  297. rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
  298. rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
  299. //=======================================================================
  300. }
  301. }
  302. static __le16 vnt_time_stamp_off(struct vnt_private *priv, u16 rate)
  303. {
  304. return cpu_to_le16(wTimeStampOff[priv->byPreambleType % 2]
  305. [rate % MAX_RATE]);
  306. }
  307. /*byPktType : PK_TYPE_11A 0
  308. PK_TYPE_11B 1
  309. PK_TYPE_11GB 2
  310. PK_TYPE_11GA 3
  311. */
  312. static
  313. unsigned int
  314. s_uGetTxRsvTime(
  315. struct vnt_private *pDevice,
  316. unsigned char byPktType,
  317. unsigned int cbFrameLength,
  318. unsigned short wRate,
  319. bool bNeedAck
  320. )
  321. {
  322. unsigned int uDataTime, uAckTime;
  323. uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
  324. if (byPktType == PK_TYPE_11B) //llb,CCK mode
  325. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopCCKBasicRate);
  326. else //11g 2.4G OFDM mode & 11a 5G OFDM mode
  327. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopOFDMBasicRate);
  328. if (bNeedAck)
  329. return uDataTime + pDevice->uSIFS + uAckTime;
  330. else
  331. return uDataTime;
  332. }
  333. static __le16 vnt_rxtx_rsvtime_le16(struct vnt_private *priv, u8 pkt_type,
  334. u32 frame_length, u16 rate, bool need_ack)
  335. {
  336. return cpu_to_le16((u16)s_uGetTxRsvTime(priv, pkt_type,
  337. frame_length, rate, need_ack));
  338. }
  339. //byFreqType: 0=>5GHZ 1=>2.4GHZ
  340. static
  341. __le16
  342. s_uGetRTSCTSRsvTime(
  343. struct vnt_private *pDevice,
  344. unsigned char byRTSRsvType,
  345. unsigned char byPktType,
  346. unsigned int cbFrameLength,
  347. unsigned short wCurrentRate
  348. )
  349. {
  350. unsigned int uRrvTime , uRTSTime, uCTSTime, uAckTime, uDataTime;
  351. uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
  352. uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
  353. if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
  354. uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
  355. uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  356. } else if (byRTSRsvType == 1) { //RTSTxRrvTime_ba, only in 2.4GHZ
  357. uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
  358. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  359. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  360. } else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
  361. uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
  362. uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  363. } else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
  364. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  365. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  366. uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
  367. return cpu_to_le16((u16)uRrvTime);
  368. }
  369. //RTSRrvTime
  370. uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
  371. return cpu_to_le16((u16)uRrvTime);
  372. }
  373. //byFreqType 0: 5GHz, 1:2.4Ghz
  374. static
  375. unsigned int
  376. s_uGetDataDuration(
  377. struct vnt_private *pDevice,
  378. unsigned char byDurType,
  379. unsigned int cbFrameLength,
  380. unsigned char byPktType,
  381. unsigned short wRate,
  382. bool bNeedAck,
  383. unsigned int uFragIdx,
  384. unsigned int cbLastFragmentSize,
  385. unsigned int uMACfragNum,
  386. unsigned char byFBOption
  387. )
  388. {
  389. bool bLastFrag = 0;
  390. unsigned int uAckTime = 0, uNextPktTime = 0;
  391. if (uFragIdx == (uMACfragNum-1))
  392. bLastFrag = 1;
  393. switch (byDurType) {
  394. case DATADUR_B: //DATADUR_B
  395. if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
  396. if (bNeedAck) {
  397. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  398. return pDevice->uSIFS + uAckTime;
  399. } else {
  400. return 0;
  401. }
  402. } else {//First Frag or Mid Frag
  403. if (uFragIdx == (uMACfragNum-2))
  404. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
  405. else
  406. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
  407. if (bNeedAck) {
  408. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  409. return pDevice->uSIFS + uAckTime + uNextPktTime;
  410. } else {
  411. return pDevice->uSIFS + uNextPktTime;
  412. }
  413. }
  414. break;
  415. case DATADUR_A: //DATADUR_A
  416. if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
  417. if (bNeedAck) {
  418. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  419. return pDevice->uSIFS + uAckTime;
  420. } else {
  421. return 0;
  422. }
  423. } else {//First Frag or Mid Frag
  424. if (uFragIdx == (uMACfragNum-2))
  425. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
  426. else
  427. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
  428. if (bNeedAck) {
  429. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  430. return pDevice->uSIFS + uAckTime + uNextPktTime;
  431. } else {
  432. return pDevice->uSIFS + uNextPktTime;
  433. }
  434. }
  435. break;
  436. case DATADUR_A_F0: //DATADUR_A_F0
  437. if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
  438. if (bNeedAck) {
  439. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  440. return pDevice->uSIFS + uAckTime;
  441. } else {
  442. return 0;
  443. }
  444. } else { //First Frag or Mid Frag
  445. if (byFBOption == AUTO_FB_0) {
  446. if (wRate < RATE_18M)
  447. wRate = RATE_18M;
  448. else if (wRate > RATE_54M)
  449. wRate = RATE_54M;
  450. if (uFragIdx == (uMACfragNum-2))
  451. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
  452. else
  453. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
  454. } else { // (byFBOption == AUTO_FB_1)
  455. if (wRate < RATE_18M)
  456. wRate = RATE_18M;
  457. else if (wRate > RATE_54M)
  458. wRate = RATE_54M;
  459. if (uFragIdx == (uMACfragNum-2))
  460. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
  461. else
  462. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
  463. }
  464. if (bNeedAck) {
  465. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  466. return pDevice->uSIFS + uAckTime + uNextPktTime;
  467. } else {
  468. return pDevice->uSIFS + uNextPktTime;
  469. }
  470. }
  471. break;
  472. case DATADUR_A_F1: //DATADUR_A_F1
  473. if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
  474. if (bNeedAck) {
  475. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  476. return pDevice->uSIFS + uAckTime;
  477. } else {
  478. return 0;
  479. }
  480. } else { //First Frag or Mid Frag
  481. if (byFBOption == AUTO_FB_0) {
  482. if (wRate < RATE_18M)
  483. wRate = RATE_18M;
  484. else if (wRate > RATE_54M)
  485. wRate = RATE_54M;
  486. if (uFragIdx == (uMACfragNum-2))
  487. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
  488. else
  489. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
  490. } else { // (byFBOption == AUTO_FB_1)
  491. if (wRate < RATE_18M)
  492. wRate = RATE_18M;
  493. else if (wRate > RATE_54M)
  494. wRate = RATE_54M;
  495. if (uFragIdx == (uMACfragNum-2))
  496. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
  497. else
  498. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
  499. }
  500. if (bNeedAck) {
  501. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  502. return pDevice->uSIFS + uAckTime + uNextPktTime;
  503. } else {
  504. return pDevice->uSIFS + uNextPktTime;
  505. }
  506. }
  507. break;
  508. default:
  509. break;
  510. }
  511. ASSERT(false);
  512. return 0;
  513. }
  514. //byFreqType: 0=>5GHZ 1=>2.4GHZ
  515. static
  516. __le16
  517. s_uGetRTSCTSDuration(
  518. struct vnt_private *pDevice,
  519. unsigned char byDurType,
  520. unsigned int cbFrameLength,
  521. unsigned char byPktType,
  522. unsigned short wRate,
  523. bool bNeedAck,
  524. unsigned char byFBOption
  525. )
  526. {
  527. unsigned int uCTSTime = 0, uDurTime = 0;
  528. switch (byDurType) {
  529. case RTSDUR_BB: //RTSDuration_bb
  530. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  531. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
  532. break;
  533. case RTSDUR_BA: //RTSDuration_ba
  534. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  535. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
  536. break;
  537. case RTSDUR_AA: //RTSDuration_aa
  538. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  539. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
  540. break;
  541. case CTSDUR_BA: //CTSDuration_ba
  542. uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
  543. break;
  544. case RTSDUR_BA_F0: //RTSDuration_ba_f0
  545. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  546. if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
  547. uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
  548. else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
  549. uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
  550. break;
  551. case RTSDUR_AA_F0: //RTSDuration_aa_f0
  552. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  553. if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
  554. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
  555. else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
  556. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
  557. break;
  558. case RTSDUR_BA_F1: //RTSDuration_ba_f1
  559. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  560. if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
  561. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
  562. else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
  563. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
  564. break;
  565. case RTSDUR_AA_F1: //RTSDuration_aa_f1
  566. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  567. if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
  568. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
  569. else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
  570. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
  571. break;
  572. case CTSDUR_BA_F0: //CTSDuration_ba_f0
  573. if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
  574. uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
  575. else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
  576. uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
  577. break;
  578. case CTSDUR_BA_F1: //CTSDuration_ba_f1
  579. if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
  580. uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
  581. else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
  582. uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
  583. break;
  584. default:
  585. break;
  586. }
  587. return cpu_to_le16((u16)uDurTime);
  588. }
  589. static
  590. __le16
  591. s_uFillDataHead(
  592. struct vnt_private *pDevice,
  593. unsigned char byPktType,
  594. void *pTxDataHead,
  595. unsigned int cbFrameLength,
  596. unsigned int uDMAIdx,
  597. bool bNeedAck,
  598. unsigned int uFragIdx,
  599. unsigned int cbLastFragmentSize,
  600. unsigned int uMACfragNum,
  601. unsigned char byFBOption,
  602. unsigned short wCurrentRate
  603. )
  604. {
  605. if (pTxDataHead == NULL)
  606. return 0;
  607. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
  608. if (byFBOption == AUTO_FB_NONE) {
  609. struct vnt_tx_datahead_g *buf = pTxDataHead;
  610. /* Get SignalField, ServiceField & Length */
  611. vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
  612. byPktType, &buf->a);
  613. vnt_get_phy_field(pDevice, cbFrameLength,
  614. pDevice->byTopCCKBasicRate,
  615. PK_TYPE_11B, &buf->b);
  616. /* Get Duration and TimeStamp */
  617. buf->duration_a = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
  618. byPktType, wCurrentRate, bNeedAck, uFragIdx,
  619. cbLastFragmentSize, uMACfragNum,
  620. byFBOption));
  621. buf->duration_b = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
  622. PK_TYPE_11B, pDevice->byTopCCKBasicRate,
  623. bNeedAck, uFragIdx, cbLastFragmentSize,
  624. uMACfragNum, byFBOption));
  625. buf->time_stamp_off_a = vnt_time_stamp_off(pDevice, wCurrentRate);
  626. buf->time_stamp_off_b = vnt_time_stamp_off(pDevice, pDevice->byTopCCKBasicRate);
  627. return buf->duration_a;
  628. } else {
  629. /* Auto Fallback */
  630. struct vnt_tx_datahead_g_fb *buf = pTxDataHead;
  631. /* Get SignalField, ServiceField & Length */
  632. vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
  633. byPktType, &buf->a);
  634. vnt_get_phy_field(pDevice, cbFrameLength,
  635. pDevice->byTopCCKBasicRate,
  636. PK_TYPE_11B, &buf->b);
  637. /* Get Duration and TimeStamp */
  638. buf->duration_a = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
  639. wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
  640. buf->duration_b = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
  641. pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
  642. buf->duration_a_f0 = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
  643. wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
  644. buf->duration_a_f1 = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
  645. wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
  646. buf->time_stamp_off_a = vnt_time_stamp_off(pDevice, wCurrentRate);
  647. buf->time_stamp_off_b = vnt_time_stamp_off(pDevice, pDevice->byTopCCKBasicRate);
  648. return buf->duration_a;
  649. } //if (byFBOption == AUTO_FB_NONE)
  650. } else if (byPktType == PK_TYPE_11A) {
  651. if ((byFBOption != AUTO_FB_NONE)) {
  652. /* Auto Fallback */
  653. struct vnt_tx_datahead_a_fb *buf = pTxDataHead;
  654. /* Get SignalField, ServiceField & Length */
  655. vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
  656. byPktType, &buf->a);
  657. /* Get Duration and TimeStampOff */
  658. buf->duration = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
  659. wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
  660. buf->duration_f0 = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
  661. wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
  662. buf->duration_f1 = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
  663. wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
  664. buf->time_stamp_off = vnt_time_stamp_off(pDevice, wCurrentRate);
  665. return buf->duration;
  666. } else {
  667. struct vnt_tx_datahead_ab *buf = pTxDataHead;
  668. /* Get SignalField, ServiceField & Length */
  669. vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
  670. byPktType, &buf->ab);
  671. /* Get Duration and TimeStampOff */
  672. buf->duration = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
  673. wCurrentRate, bNeedAck, uFragIdx,
  674. cbLastFragmentSize, uMACfragNum,
  675. byFBOption));
  676. buf->time_stamp_off = vnt_time_stamp_off(pDevice, wCurrentRate);
  677. return buf->duration;
  678. }
  679. } else {
  680. struct vnt_tx_datahead_ab *buf = pTxDataHead;
  681. /* Get SignalField, ServiceField & Length */
  682. vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
  683. byPktType, &buf->ab);
  684. /* Get Duration and TimeStampOff */
  685. buf->duration = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
  686. wCurrentRate, bNeedAck, uFragIdx,
  687. cbLastFragmentSize, uMACfragNum,
  688. byFBOption));
  689. buf->time_stamp_off = vnt_time_stamp_off(pDevice, wCurrentRate);
  690. return buf->duration;
  691. }
  692. return 0;
  693. }
  694. static
  695. void
  696. s_vFillRTSHead(
  697. struct vnt_private *pDevice,
  698. unsigned char byPktType,
  699. void *pvRTS,
  700. unsigned int cbFrameLength,
  701. bool bNeedAck,
  702. bool bDisCRC,
  703. PSEthernetHeader psEthHeader,
  704. unsigned short wCurrentRate,
  705. unsigned char byFBOption
  706. )
  707. {
  708. unsigned int uRTSFrameLen = 20;
  709. if (pvRTS == NULL)
  710. return;
  711. if (bDisCRC) {
  712. // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
  713. // in this case we need to decrease its length by 4.
  714. uRTSFrameLen -= 4;
  715. }
  716. // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
  717. // Otherwise, we need to modify codes for them.
  718. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
  719. if (byFBOption == AUTO_FB_NONE) {
  720. struct vnt_rts_g *buf = pvRTS;
  721. /* Get SignalField, ServiceField & Length */
  722. vnt_get_phy_field(pDevice, uRTSFrameLen,
  723. pDevice->byTopCCKBasicRate,
  724. PK_TYPE_11B, &buf->b);
  725. vnt_get_phy_field(pDevice, uRTSFrameLen,
  726. pDevice->byTopOFDMBasicRate,
  727. byPktType, &buf->a);
  728. /* Get Duration */
  729. buf->duration_bb =
  730. s_uGetRTSCTSDuration(pDevice, RTSDUR_BB,
  731. cbFrameLength, PK_TYPE_11B,
  732. pDevice->byTopCCKBasicRate,
  733. bNeedAck, byFBOption);
  734. buf->duration_aa =
  735. s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
  736. cbFrameLength, byPktType,
  737. wCurrentRate, bNeedAck,
  738. byFBOption);
  739. buf->duration_ba =
  740. s_uGetRTSCTSDuration(pDevice, RTSDUR_BA,
  741. cbFrameLength, byPktType,
  742. wCurrentRate, bNeedAck,
  743. byFBOption);
  744. buf->data.duration = buf->duration_aa;
  745. /* Get RTS Frame body */
  746. buf->data.frame_control =
  747. cpu_to_le16(IEEE80211_FTYPE_CTL |
  748. IEEE80211_STYPE_RTS);
  749. if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
  750. (pDevice->op_mode == NL80211_IFTYPE_AP)) {
  751. memcpy(&buf->data.ra, psEthHeader->abyDstAddr, ETH_ALEN);
  752. } else {
  753. memcpy(&buf->data.ra, pDevice->abyBSSID, ETH_ALEN);
  754. }
  755. if (pDevice->op_mode == NL80211_IFTYPE_AP)
  756. memcpy(&buf->data.ta, pDevice->abyBSSID, ETH_ALEN);
  757. else
  758. memcpy(&buf->data.ta, psEthHeader->abySrcAddr, ETH_ALEN);
  759. } else {
  760. struct vnt_rts_g_fb *buf = pvRTS;
  761. /* Get SignalField, ServiceField & Length */
  762. vnt_get_phy_field(pDevice, uRTSFrameLen,
  763. pDevice->byTopCCKBasicRate,
  764. PK_TYPE_11B, &buf->b);
  765. vnt_get_phy_field(pDevice, uRTSFrameLen,
  766. pDevice->byTopOFDMBasicRate,
  767. byPktType, &buf->a);
  768. /* Get Duration */
  769. buf->duration_bb =
  770. s_uGetRTSCTSDuration(pDevice, RTSDUR_BB,
  771. cbFrameLength, PK_TYPE_11B,
  772. pDevice->byTopCCKBasicRate,
  773. bNeedAck, byFBOption);
  774. buf->duration_aa =
  775. s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
  776. cbFrameLength, byPktType,
  777. wCurrentRate, bNeedAck,
  778. byFBOption);
  779. buf->duration_ba =
  780. s_uGetRTSCTSDuration(pDevice, RTSDUR_BA,
  781. cbFrameLength, byPktType,
  782. wCurrentRate, bNeedAck,
  783. byFBOption);
  784. buf->rts_duration_ba_f0 =
  785. s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F0,
  786. cbFrameLength, byPktType,
  787. wCurrentRate, bNeedAck,
  788. byFBOption);
  789. buf->rts_duration_aa_f0 =
  790. s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0,
  791. cbFrameLength, byPktType,
  792. wCurrentRate, bNeedAck,
  793. byFBOption);
  794. buf->rts_duration_ba_f1 =
  795. s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F1,
  796. cbFrameLength, byPktType,
  797. wCurrentRate, bNeedAck,
  798. byFBOption);
  799. buf->rts_duration_aa_f1 =
  800. s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1,
  801. cbFrameLength, byPktType,
  802. wCurrentRate, bNeedAck,
  803. byFBOption);
  804. buf->data.duration = buf->duration_aa;
  805. /* Get RTS Frame body */
  806. buf->data.frame_control =
  807. cpu_to_le16(IEEE80211_FTYPE_CTL |
  808. IEEE80211_STYPE_RTS);
  809. if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
  810. (pDevice->op_mode == NL80211_IFTYPE_AP)) {
  811. memcpy(&buf->data.ra, psEthHeader->abyDstAddr, ETH_ALEN);
  812. } else {
  813. memcpy(&buf->data.ra, pDevice->abyBSSID, ETH_ALEN);
  814. }
  815. if (pDevice->op_mode == NL80211_IFTYPE_AP)
  816. memcpy(&buf->data.ta, pDevice->abyBSSID, ETH_ALEN);
  817. else
  818. memcpy(&buf->data.ta, psEthHeader->abySrcAddr, ETH_ALEN);
  819. } // if (byFBOption == AUTO_FB_NONE)
  820. } else if (byPktType == PK_TYPE_11A) {
  821. if (byFBOption == AUTO_FB_NONE) {
  822. struct vnt_rts_ab *buf = pvRTS;
  823. /* Get SignalField, ServiceField & Length */
  824. vnt_get_phy_field(pDevice, uRTSFrameLen,
  825. pDevice->byTopOFDMBasicRate,
  826. byPktType, &buf->ab);
  827. /* Get Duration */
  828. buf->duration =
  829. s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
  830. cbFrameLength, byPktType,
  831. wCurrentRate, bNeedAck,
  832. byFBOption);
  833. buf->data.duration = buf->duration;
  834. /* Get RTS Frame body */
  835. buf->data.frame_control =
  836. cpu_to_le16(IEEE80211_FTYPE_CTL |
  837. IEEE80211_STYPE_RTS);
  838. if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
  839. (pDevice->op_mode == NL80211_IFTYPE_AP)) {
  840. memcpy(&buf->data.ra, psEthHeader->abyDstAddr, ETH_ALEN);
  841. } else {
  842. memcpy(&buf->data.ra, pDevice->abyBSSID, ETH_ALEN);
  843. }
  844. if (pDevice->op_mode == NL80211_IFTYPE_AP)
  845. memcpy(&buf->data.ta, pDevice->abyBSSID, ETH_ALEN);
  846. else
  847. memcpy(&buf->data.ta, psEthHeader->abySrcAddr, ETH_ALEN);
  848. } else {
  849. struct vnt_rts_a_fb *buf = pvRTS;
  850. /* Get SignalField, ServiceField & Length */
  851. vnt_get_phy_field(pDevice, uRTSFrameLen,
  852. pDevice->byTopOFDMBasicRate,
  853. byPktType, &buf->a);
  854. /* Get Duration */
  855. buf->duration =
  856. s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
  857. cbFrameLength, byPktType,
  858. wCurrentRate, bNeedAck,
  859. byFBOption);
  860. buf->rts_duration_f0 =
  861. s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0,
  862. cbFrameLength, byPktType,
  863. wCurrentRate, bNeedAck,
  864. byFBOption);
  865. buf->rts_duration_f1 =
  866. s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1,
  867. cbFrameLength, byPktType,
  868. wCurrentRate, bNeedAck,
  869. byFBOption);
  870. buf->data.duration = buf->duration;
  871. /* Get RTS Frame body */
  872. buf->data.frame_control =
  873. cpu_to_le16(IEEE80211_FTYPE_CTL |
  874. IEEE80211_STYPE_RTS);
  875. if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
  876. (pDevice->op_mode == NL80211_IFTYPE_AP)) {
  877. memcpy(&buf->data.ra, psEthHeader->abyDstAddr, ETH_ALEN);
  878. } else {
  879. memcpy(&buf->data.ra, pDevice->abyBSSID, ETH_ALEN);
  880. }
  881. if (pDevice->op_mode == NL80211_IFTYPE_AP)
  882. memcpy(&buf->data.ta, pDevice->abyBSSID, ETH_ALEN);
  883. else
  884. memcpy(&buf->data.ta, psEthHeader->abySrcAddr, ETH_ALEN);
  885. }
  886. } else if (byPktType == PK_TYPE_11B) {
  887. struct vnt_rts_ab *buf = pvRTS;
  888. /* Get SignalField, ServiceField & Length */
  889. vnt_get_phy_field(pDevice, uRTSFrameLen,
  890. pDevice->byTopCCKBasicRate,
  891. PK_TYPE_11B, &buf->ab);
  892. /* Get Duration */
  893. buf->duration =
  894. s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength,
  895. byPktType, wCurrentRate, bNeedAck,
  896. byFBOption);
  897. buf->data.duration = buf->duration;
  898. /* Get RTS Frame body */
  899. buf->data.frame_control =
  900. cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
  901. if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
  902. (pDevice->op_mode == NL80211_IFTYPE_AP)) {
  903. memcpy(&buf->data.ra, psEthHeader->abyDstAddr, ETH_ALEN);
  904. } else {
  905. memcpy(&buf->data.ra, pDevice->abyBSSID, ETH_ALEN);
  906. }
  907. if (pDevice->op_mode == NL80211_IFTYPE_AP)
  908. memcpy(&buf->data.ta, pDevice->abyBSSID, ETH_ALEN);
  909. else
  910. memcpy(&buf->data.ta, psEthHeader->abySrcAddr, ETH_ALEN);
  911. }
  912. }
  913. static
  914. void
  915. s_vFillCTSHead(
  916. struct vnt_private *pDevice,
  917. unsigned int uDMAIdx,
  918. unsigned char byPktType,
  919. void *pvCTS,
  920. unsigned int cbFrameLength,
  921. bool bNeedAck,
  922. bool bDisCRC,
  923. unsigned short wCurrentRate,
  924. unsigned char byFBOption
  925. )
  926. {
  927. unsigned int uCTSFrameLen = 14;
  928. if (pvCTS == NULL)
  929. return;
  930. if (bDisCRC) {
  931. // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
  932. // in this case we need to decrease its length by 4.
  933. uCTSFrameLen -= 4;
  934. }
  935. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
  936. if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
  937. // Auto Fall back
  938. struct vnt_cts_fb *buf = pvCTS;
  939. /* Get SignalField, ServiceField & Length */
  940. vnt_get_phy_field(pDevice, uCTSFrameLen,
  941. pDevice->byTopCCKBasicRate,
  942. PK_TYPE_11B, &buf->b);
  943. buf->duration_ba =
  944. s_uGetRTSCTSDuration(pDevice, CTSDUR_BA,
  945. cbFrameLength, byPktType,
  946. wCurrentRate, bNeedAck,
  947. byFBOption);
  948. /* Get CTSDuration_ba_f0 */
  949. buf->cts_duration_ba_f0 =
  950. s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F0,
  951. cbFrameLength, byPktType,
  952. wCurrentRate, bNeedAck,
  953. byFBOption);
  954. /* Get CTSDuration_ba_f1 */
  955. buf->cts_duration_ba_f1 =
  956. s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F1,
  957. cbFrameLength, byPktType,
  958. wCurrentRate, bNeedAck,
  959. byFBOption);
  960. /* Get CTS Frame body */
  961. buf->data.duration = buf->duration_ba;
  962. buf->data.frame_control =
  963. cpu_to_le16(IEEE80211_FTYPE_CTL |
  964. IEEE80211_STYPE_CTS);
  965. buf->reserved2 = 0x0;
  966. memcpy(&buf->data.ra, pDevice->abyCurrentNetAddr, ETH_ALEN);
  967. } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
  968. struct vnt_cts *buf = pvCTS;
  969. /* Get SignalField, ServiceField & Length */
  970. vnt_get_phy_field(pDevice, uCTSFrameLen,
  971. pDevice->byTopCCKBasicRate,
  972. PK_TYPE_11B, &buf->b);
  973. /* Get CTSDuration_ba */
  974. buf->duration_ba =
  975. s_uGetRTSCTSDuration(pDevice, CTSDUR_BA,
  976. cbFrameLength, byPktType,
  977. wCurrentRate, bNeedAck,
  978. byFBOption);
  979. /* Get CTS Frame body */
  980. buf->data.duration = buf->duration_ba;
  981. buf->data.frame_control =
  982. cpu_to_le16(IEEE80211_FTYPE_CTL |
  983. IEEE80211_STYPE_CTS);
  984. buf->reserved2 = 0x0;
  985. memcpy(&buf->data.ra, pDevice->abyCurrentNetAddr, ETH_ALEN);
  986. }
  987. }
  988. }
  989. /*+
  990. *
  991. * Description:
  992. * Generate FIFO control for MAC & Baseband controller
  993. *
  994. * Parameters:
  995. * In:
  996. * pDevice - Pointer to adapter
  997. * pTxDataHead - Transmit Data Buffer
  998. * pTxBufHead - pTxBufHead
  999. * pvRrvTime - pvRrvTime
  1000. * pvRTS - RTS Buffer
  1001. * pCTS - CTS Buffer
  1002. * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
  1003. * bNeedACK - If need ACK
  1004. * uDescIdx - Desc Index
  1005. * Out:
  1006. * none
  1007. *
  1008. * Return Value: none
  1009. *
  1010. -*/
  1011. // unsigned int cbFrameSize,//Hdr+Payload+FCS
  1012. static
  1013. void
  1014. s_vGenerateTxParameter(
  1015. struct vnt_private *pDevice,
  1016. unsigned char byPktType,
  1017. void *pTxBufHead,
  1018. void *pvRrvTime,
  1019. void *pvRTS,
  1020. void *pvCTS,
  1021. unsigned int cbFrameSize,
  1022. bool bNeedACK,
  1023. unsigned int uDMAIdx,
  1024. PSEthernetHeader psEthHeader,
  1025. unsigned short wCurrentRate
  1026. )
  1027. {
  1028. unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; //24
  1029. unsigned short wFifoCtl;
  1030. bool bDisCRC = false;
  1031. unsigned char byFBOption = AUTO_FB_NONE;
  1032. PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
  1033. pFifoHead->wReserved = wCurrentRate;
  1034. wFifoCtl = pFifoHead->wFIFOCtl;
  1035. if (wFifoCtl & FIFOCTL_CRCDIS)
  1036. bDisCRC = true;
  1037. if (wFifoCtl & FIFOCTL_AUTO_FB_0)
  1038. byFBOption = AUTO_FB_0;
  1039. else if (wFifoCtl & FIFOCTL_AUTO_FB_1)
  1040. byFBOption = AUTO_FB_1;
  1041. if (pDevice->bLongHeader)
  1042. cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
  1043. if (!pvRrvTime)
  1044. return;
  1045. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
  1046. if (pvRTS != NULL) { //RTS_need
  1047. /* Fill RsvTime */
  1048. struct vnt_rrv_time_rts *buf = pvRrvTime;
  1049. buf->rts_rrv_time_aa = s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate);
  1050. buf->rts_rrv_time_ba = s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate);
  1051. buf->rts_rrv_time_bb = s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate);
  1052. buf->rrv_time_a = vnt_rxtx_rsvtime_le16(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK);
  1053. buf->rrv_time_b = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK);
  1054. s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
  1055. } else {//RTS_needless, PCF mode
  1056. struct vnt_rrv_time_cts *buf = pvRrvTime;
  1057. buf->rrv_time_a = vnt_rxtx_rsvtime_le16(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK);
  1058. buf->rrv_time_b = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK);
  1059. buf->cts_rrv_time_ba = s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate);
  1060. //Fill CTS
  1061. s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
  1062. }
  1063. } else if (byPktType == PK_TYPE_11A) {
  1064. if (pvRTS != NULL) {//RTS_need, non PCF mode
  1065. struct vnt_rrv_time_ab *buf = pvRrvTime;
  1066. buf->rts_rrv_time = s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate);
  1067. buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK);
  1068. //Fill RTS
  1069. s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
  1070. } else if (pvRTS == NULL) {//RTS_needless, non PCF mode
  1071. struct vnt_rrv_time_ab *buf = pvRrvTime;
  1072. buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK);
  1073. }
  1074. } else if (byPktType == PK_TYPE_11B) {
  1075. if ((pvRTS != NULL)) {//RTS_need, non PCF mode
  1076. struct vnt_rrv_time_ab *buf = pvRrvTime;
  1077. buf->rts_rrv_time = s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate);
  1078. buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK);
  1079. //Fill RTS
  1080. s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
  1081. } else { //RTS_needless, non PCF mode
  1082. struct vnt_rrv_time_ab *buf = pvRrvTime;
  1083. buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK);
  1084. }
  1085. }
  1086. }
  1087. static
  1088. void
  1089. s_vFillFragParameter(
  1090. struct vnt_private *pDevice,
  1091. unsigned char *pbyBuffer,
  1092. unsigned int uTxType,
  1093. void *pvtdCurr,
  1094. unsigned short wFragType,
  1095. unsigned int cbReqCount
  1096. )
  1097. {
  1098. PSTxBufHead pTxBufHead = (PSTxBufHead) pbyBuffer;
  1099. if (uTxType == TYPE_SYNCDMA) {
  1100. PSTxSyncDesc ptdCurr = (PSTxSyncDesc)pvtdCurr;
  1101. //Set FIFOCtl & TimeStamp in TxSyncDesc
  1102. ptdCurr->m_wFIFOCtl = pTxBufHead->wFIFOCtl;
  1103. ptdCurr->m_wTimeStamp = pTxBufHead->wTimeStamp;
  1104. //Set TSR1 & ReqCount in TxDescHead
  1105. ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
  1106. if (wFragType == FRAGCTL_ENDFRAG) //Last Fragmentation
  1107. ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
  1108. else
  1109. ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
  1110. } else {
  1111. PSTxDesc ptdCurr = (PSTxDesc)pvtdCurr;
  1112. //Set TSR1 & ReqCount in TxDescHead
  1113. ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
  1114. if (wFragType == FRAGCTL_ENDFRAG) //Last Fragmentation
  1115. ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
  1116. else
  1117. ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
  1118. }
  1119. pTxBufHead->wFragCtl |= (unsigned short)wFragType;//0x0001; //0000 0000 0000 0001
  1120. }
  1121. static unsigned int
  1122. s_cbFillTxBufHead(struct vnt_private *pDevice, unsigned char byPktType,
  1123. unsigned char *pbyTxBufferAddr, unsigned int cbFrameBodySize,
  1124. unsigned int uDMAIdx, PSTxDesc pHeadTD,
  1125. PSEthernetHeader psEthHeader, unsigned char *pPacket,
  1126. bool bNeedEncrypt, PSKeyItem pTransmitKey,
  1127. unsigned int uNodeIndex, unsigned int *puMACfragNum)
  1128. {
  1129. unsigned int cbMACHdLen;
  1130. unsigned int cbFrameSize;
  1131. unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
  1132. unsigned int cbFragPayloadSize;
  1133. unsigned int cbLastFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
  1134. unsigned int cbLastFragPayloadSize;
  1135. unsigned int uFragIdx;
  1136. unsigned char *pbyPayloadHead;
  1137. unsigned char *pbyIVHead;
  1138. unsigned char *pbyMacHdr;
  1139. unsigned short wFragType; //00:Non-Frag, 01:Start, 10:Mid, 11:Last
  1140. __le16 uDuration;
  1141. unsigned char *pbyBuffer;
  1142. unsigned int cbIVlen = 0;
  1143. unsigned int cbICVlen = 0;
  1144. unsigned int cbMIClen = 0;
  1145. unsigned int cbFCSlen = 4;
  1146. unsigned int cb802_1_H_len = 0;
  1147. unsigned int uLength = 0;
  1148. unsigned int uTmpLen = 0;
  1149. unsigned int cbMICHDR = 0;
  1150. u32 dwMICKey0, dwMICKey1;
  1151. u32 dwMIC_Priority;
  1152. u32 *pdwMIC_L;
  1153. u32 *pdwMIC_R;
  1154. u32 dwSafeMIC_L, dwSafeMIC_R; /* Fix "Last Frag Size" < "MIC length". */
  1155. bool bMIC2Frag = false;
  1156. unsigned int uMICFragLen = 0;
  1157. unsigned int uMACfragNum = 1;
  1158. unsigned int uPadding = 0;
  1159. unsigned int cbReqCount = 0;
  1160. bool bNeedACK;
  1161. bool bRTS;
  1162. bool bIsAdhoc;
  1163. unsigned char *pbyType;
  1164. PSTxDesc ptdCurr;
  1165. PSTxBufHead psTxBufHd = (PSTxBufHead) pbyTxBufferAddr;
  1166. unsigned int cbHeaderLength = 0;
  1167. void *pvRrvTime;
  1168. struct vnt_mic_hdr *pMICHDR;
  1169. void *pvRTS;
  1170. void *pvCTS;
  1171. void *pvTxDataHd;
  1172. unsigned short wTxBufSize; // FFinfo size
  1173. unsigned int uTotalCopyLength = 0;
  1174. unsigned char byFBOption = AUTO_FB_NONE;
  1175. bool bIsWEP256 = false;
  1176. PSMgmtObject pMgmt = pDevice->pMgmt;
  1177. pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
  1178. if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
  1179. (pDevice->op_mode == NL80211_IFTYPE_AP)) {
  1180. if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
  1181. bNeedACK = false;
  1182. else
  1183. bNeedACK = true;
  1184. bIsAdhoc = true;
  1185. } else {
  1186. // MSDUs in Infra mode always need ACK
  1187. bNeedACK = true;
  1188. bIsAdhoc = false;
  1189. }
  1190. if (pDevice->bLongHeader)
  1191. cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
  1192. else
  1193. cbMACHdLen = WLAN_HDR_ADDR3_LEN;
  1194. if ((bNeedEncrypt == true) && (pTransmitKey != NULL)) {
  1195. if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
  1196. cbIVlen = 4;
  1197. cbICVlen = 4;
  1198. if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN)
  1199. bIsWEP256 = true;
  1200. }
  1201. if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
  1202. cbIVlen = 8;//IV+ExtIV
  1203. cbMIClen = 8;
  1204. cbICVlen = 4;
  1205. }
  1206. if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
  1207. cbIVlen = 8;//RSN Header
  1208. cbICVlen = 8;//MIC
  1209. cbMICHDR = sizeof(struct vnt_mic_hdr);
  1210. }
  1211. if (pDevice->byLocalID > REV_ID_VT3253_A1) {
  1212. //MAC Header should be padding 0 to DW alignment.
  1213. uPadding = 4 - (cbMACHdLen%4);
  1214. uPadding %= 4;
  1215. }
  1216. }
  1217. cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
  1218. if ((bNeedACK == false) ||
  1219. (cbFrameSize < pDevice->wRTSThreshold) ||
  1220. ((cbFrameSize >= pDevice->wFragmentationThreshold) && (pDevice->wFragmentationThreshold <= pDevice->wRTSThreshold))
  1221. ) {
  1222. bRTS = false;
  1223. } else {
  1224. bRTS = true;
  1225. psTxBufHd->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
  1226. }
  1227. //
  1228. // Use for AUTO FALL BACK
  1229. //
  1230. if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_0)
  1231. byFBOption = AUTO_FB_0;
  1232. else if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_1)
  1233. byFBOption = AUTO_FB_1;
  1234. //////////////////////////////////////////////////////
  1235. //Set RrvTime/RTS/CTS Buffer
  1236. wTxBufSize = sizeof(STxBufHead);
  1237. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
  1238. if (byFBOption == AUTO_FB_NONE) {
  1239. if (bRTS == true) {//RTS_need
  1240. pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
  1241. pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts));
  1242. pvRTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) + cbMICHDR);
  1243. pvCTS = NULL;
  1244. pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
  1245. cbMICHDR + sizeof(struct vnt_rts_g));
  1246. cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
  1247. cbMICHDR + sizeof(struct vnt_rts_g) +
  1248. sizeof(struct vnt_tx_datahead_g);
  1249. } else { //RTS_needless
  1250. pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
  1251. pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts));
  1252. pvRTS = NULL;
  1253. pvCTS = (void *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
  1254. pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
  1255. sizeof(struct vnt_rrv_time_cts) + cbMICHDR + sizeof(struct vnt_cts));
  1256. cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
  1257. cbMICHDR + sizeof(struct vnt_cts) + sizeof(struct vnt_tx_datahead_g);
  1258. }
  1259. } else {
  1260. // Auto Fall Back
  1261. if (bRTS == true) {//RTS_need
  1262. pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
  1263. pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts));
  1264. pvRTS = (void *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) + cbMICHDR);
  1265. pvCTS = NULL;
  1266. pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
  1267. cbMICHDR + sizeof(struct vnt_rts_g_fb));
  1268. cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
  1269. cbMICHDR + sizeof(struct vnt_rts_g_fb) + sizeof(struct vnt_tx_datahead_g_fb);
  1270. } else { //RTS_needless
  1271. pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
  1272. pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts));
  1273. pvRTS = NULL;
  1274. pvCTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
  1275. pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
  1276. cbMICHDR + sizeof(struct vnt_cts_fb));
  1277. cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
  1278. cbMICHDR + sizeof(struct vnt_cts_fb) + sizeof(struct vnt_tx_datahead_g_fb);
  1279. }
  1280. } // Auto Fall Back
  1281. } else {//802.11a/b packet
  1282. if (byFBOption == AUTO_FB_NONE) {
  1283. if (bRTS == true) {
  1284. pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
  1285. pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
  1286. pvRTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
  1287. pvCTS = NULL;
  1288. pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
  1289. sizeof(struct vnt_rrv_time_ab) + cbMICHDR + sizeof(struct vnt_rts_ab));
  1290. cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
  1291. cbMICHDR + sizeof(struct vnt_rts_ab) + sizeof(struct vnt_tx_datahead_ab);
  1292. } else { //RTS_needless, need MICHDR
  1293. pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
  1294. pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
  1295. pvRTS = NULL;
  1296. pvCTS = NULL;
  1297. pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
  1298. cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
  1299. cbMICHDR + sizeof(struct vnt_tx_datahead_ab);
  1300. }
  1301. } else {
  1302. // Auto Fall Back
  1303. if (bRTS == true) {//RTS_need
  1304. pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
  1305. pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
  1306. pvRTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
  1307. pvCTS = NULL;
  1308. pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
  1309. sizeof(struct vnt_rrv_time_ab) + cbMICHDR + sizeof(struct vnt_rts_a_fb));
  1310. cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
  1311. cbMICHDR + sizeof(struct vnt_rts_a_fb) + sizeof(struct vnt_tx_datahead_a_fb);
  1312. } else { //RTS_needless
  1313. pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
  1314. pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
  1315. pvRTS = NULL;
  1316. pvCTS = NULL;
  1317. pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
  1318. cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
  1319. cbMICHDR + sizeof(struct vnt_tx_datahead_a_fb);
  1320. }
  1321. } // Auto Fall Back
  1322. }
  1323. memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderLength - wTxBufSize));
  1324. //////////////////////////////////////////////////////////////////
  1325. if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
  1326. if (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
  1327. dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
  1328. dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
  1329. } else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
  1330. dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
  1331. dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
  1332. } else {
  1333. dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[24]);
  1334. dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[28]);
  1335. }
  1336. // DO Software Michael
  1337. MIC_vInit(dwMICKey0, dwMICKey1);
  1338. MIC_vAppend((unsigned char *)&(psEthHeader->abyDstAddr[0]), 12);
  1339. dwMIC_Priority = 0;
  1340. MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
  1341. pr_debug("MIC KEY: %X, %X\n", dwMICKey0, dwMICKey1);
  1342. }
  1343. ///////////////////////////////////////////////////////////////////
  1344. pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderLength);
  1345. pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
  1346. pbyIVHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding);
  1347. if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true) && (bIsWEP256 == false)) {
  1348. // Fragmentation
  1349. // FragThreshold = Fragment size(Hdr+(IV)+fragment payload+(MIC)+(ICV)+FCS)
  1350. cbFragmentSize = pDevice->wFragmentationThreshold;
  1351. cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
  1352. //FragNum = (FrameSize-(Hdr+FCS))/(Fragment Size -(Hrd+FCS)))
  1353. uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
  1354. cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
  1355. if (cbLastFragPayloadSize == 0)
  1356. cbLastFragPayloadSize = cbFragPayloadSize;
  1357. else
  1358. uMACfragNum++;
  1359. //[Hdr+(IV)+last fragment payload+(MIC)+(ICV)+FCS]
  1360. cbLastFragmentSize = cbMACHdLen + cbLastFragPayloadSize + cbIVlen + cbICVlen + cbFCSlen;
  1361. for (uFragIdx = 0; uFragIdx < uMACfragNum; uFragIdx++) {
  1362. if (uFragIdx == 0) {
  1363. //=========================
  1364. // Start Fragmentation
  1365. //=========================
  1366. pr_debug("Start Fragmentation...\n");
  1367. wFragType = FRAGCTL_STAFRAG;
  1368. //Fill FIFO,RrvTime,RTS,and CTS
  1369. s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
  1370. cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
  1371. //Fill DataHead
  1372. uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
  1373. uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
  1374. // Generate TX MAC Header
  1375. vGenerateMACHeader(pDevice, pbyMacHdr, uDuration, psEthHeader, bNeedEncrypt,
  1376. wFragType, uDMAIdx, uFragIdx);
  1377. if (bNeedEncrypt == true) {
  1378. //Fill TXKEY
  1379. s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
  1380. pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
  1381. //Fill IV(ExtIV,RSNHDR)
  1382. if (pDevice->bEnableHostWEP) {
  1383. pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
  1384. pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
  1385. }
  1386. }
  1387. // 802.1H
  1388. if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
  1389. if ((psEthHeader->wType == TYPE_PKT_IPX) ||
  1390. (psEthHeader->wType == cpu_to_le16(0xF380))) {
  1391. memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
  1392. } else {
  1393. memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
  1394. }
  1395. pbyType = (unsigned char *)(pbyPayloadHead + 6);
  1396. memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
  1397. cb802_1_H_len = 8;
  1398. }
  1399. cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
  1400. //---------------------------
  1401. // S/W or H/W Encryption
  1402. //---------------------------
  1403. pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
  1404. uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
  1405. //copy TxBufferHeader + MacHeader to desc
  1406. memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
  1407. // Copy the Packet into a tx Buffer
  1408. memcpy((pbyBuffer + uLength), (pPacket + 14), (cbFragPayloadSize - cb802_1_H_len));
  1409. uTotalCopyLength += cbFragPayloadSize - cb802_1_H_len;
  1410. if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
  1411. pr_debug("Start MIC: %d\n",
  1412. cbFragPayloadSize);
  1413. MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFragPayloadSize);
  1414. }
  1415. //---------------------------
  1416. // S/W Encryption
  1417. //---------------------------
  1418. if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
  1419. if (bNeedEncrypt) {
  1420. s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len), (unsigned short)cbFragPayloadSize);
  1421. cbReqCount += cbICVlen;
  1422. }
  1423. }
  1424. ptdCurr = (PSTxDesc)pHeadTD;
  1425. //--------------------
  1426. //1.Set TSR1 & ReqCount in TxDescHead
  1427. //2.Set FragCtl in TxBufferHead
  1428. //3.Set Frame Control
  1429. //4.Set Sequence Control
  1430. //5.Get S/W generate FCS
  1431. //--------------------
  1432. s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
  1433. ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
  1434. ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
  1435. ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
  1436. ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
  1437. pDevice->iTDUsed[uDMAIdx]++;
  1438. pHeadTD = ptdCurr->next;
  1439. } else if (uFragIdx == (uMACfragNum-1)) {
  1440. //=========================
  1441. // Last Fragmentation
  1442. //=========================
  1443. pr_debug("Last Fragmentation...\n");
  1444. wFragType = FRAGCTL_ENDFRAG;
  1445. //Fill FIFO,RrvTime,RTS,and CTS
  1446. s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
  1447. cbLastFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
  1448. //Fill DataHead
  1449. uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbLastFragmentSize, uDMAIdx, bNeedACK,
  1450. uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
  1451. // Generate TX MAC Header
  1452. vGenerateMACHeader(pDevice, pbyMacHdr, uDuration, psEthHeader, bNeedEncrypt,
  1453. wFragType, uDMAIdx, uFragIdx);
  1454. if (bNeedEncrypt == true) {
  1455. //Fill TXKEY
  1456. s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
  1457. pbyMacHdr, (unsigned short)cbLastFragPayloadSize, (unsigned char *)pMICHDR);
  1458. if (pDevice->bEnableHostWEP) {
  1459. pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
  1460. pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
  1461. }
  1462. }
  1463. cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbLastFragPayloadSize;
  1464. //---------------------------
  1465. // S/W or H/W Encryption
  1466. //---------------------------
  1467. pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
  1468. uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
  1469. //copy TxBufferHeader + MacHeader to desc
  1470. memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
  1471. // Copy the Packet into a tx Buffer
  1472. if (bMIC2Frag == false) {
  1473. memcpy((pbyBuffer + uLength),
  1474. (pPacket + 14 + uTotalCopyLength),
  1475. (cbLastFragPayloadSize - cbMIClen)
  1476. );
  1477. //TODO check uTmpLen !
  1478. uTmpLen = cbLastFragPayloadSize - cbMIClen;
  1479. }
  1480. if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
  1481. pr_debug("LAST: uMICFragLen:%d, cbLastFragPayloadSize:%d, uTmpLen:%d\n",
  1482. uMICFragLen,
  1483. cbLastFragPayloadSize,
  1484. uTmpLen);
  1485. if (bMIC2Frag == false) {
  1486. if (uTmpLen != 0)
  1487. MIC_vAppend((pbyBuffer + uLength), uTmpLen);
  1488. pdwMIC_L = (u32 *)(pbyBuffer + uLength + uTmpLen);
  1489. pdwMIC_R = (u32 *)(pbyBuffer + uLength + uTmpLen + 4);
  1490. MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
  1491. pr_debug("Last MIC:%X, %X\n",
  1492. *pdwMIC_L, *pdwMIC_R);
  1493. } else {
  1494. if (uMICFragLen >= 4) {
  1495. memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
  1496. (cbMIClen - uMICFragLen));
  1497. pr_debug("LAST: uMICFragLen >= 4: %X, %d\n",
  1498. *(unsigned char *)((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
  1499. (cbMIClen - uMICFragLen));
  1500. } else {
  1501. memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_L + uMICFragLen),
  1502. (4 - uMICFragLen));
  1503. memcpy((pbyBuffer + uLength + (4 - uMICFragLen)), &dwSafeMIC_R, 4);
  1504. pr_debug("LAST: uMICFragLen < 4: %X, %d\n",
  1505. *(unsigned char *)((unsigned char *)&dwSafeMIC_R + uMICFragLen - 4),
  1506. (cbMIClen - uMICFragLen));
  1507. }
  1508. }
  1509. MIC_vUnInit();
  1510. } else {
  1511. ASSERT(uTmpLen == (cbLastFragPayloadSize - cbMIClen));
  1512. }
  1513. //---------------------------
  1514. // S/W Encryption
  1515. //---------------------------
  1516. if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
  1517. if (bNeedEncrypt) {
  1518. s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbLastFragPayloadSize);
  1519. cbReqCount += cbICVlen;
  1520. }
  1521. }
  1522. ptdCurr = (PSTxDesc)pHeadTD;
  1523. //--------------------
  1524. //1.Set TSR1 & ReqCount in TxDescHead
  1525. //2.Set FragCtl in TxBufferHead
  1526. //3.Set Frame Control
  1527. //4.Set Sequence Control
  1528. //5.Get S/W generate FCS
  1529. //--------------------
  1530. s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
  1531. ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
  1532. ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
  1533. ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
  1534. ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
  1535. pDevice->iTDUsed[uDMAIdx]++;
  1536. pHeadTD = ptdCurr->next;
  1537. } else {
  1538. //=========================
  1539. // Middle Fragmentation
  1540. //=========================
  1541. pr_debug("Middle Fragmentation...\n");
  1542. wFragType = FRAGCTL_MIDFRAG;
  1543. //Fill FIFO,RrvTime,RTS,and CTS
  1544. s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
  1545. cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
  1546. //Fill DataHead
  1547. uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
  1548. uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
  1549. // Generate TX MAC Header
  1550. vGenerateMACHeader(pDevice, pbyMacHdr, uDuration, psEthHeader, bNeedEncrypt,
  1551. wFragType, uDMAIdx, uFragIdx);
  1552. if (bNeedEncrypt == true) {
  1553. //Fill TXKEY
  1554. s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
  1555. pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
  1556. if (pDevice->bEnableHostWEP) {
  1557. pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
  1558. pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
  1559. }
  1560. }
  1561. cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
  1562. //---------------------------
  1563. // S/W or H/W Encryption
  1564. //---------------------------
  1565. pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
  1566. uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
  1567. //copy TxBufferHeader + MacHeader to desc
  1568. memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
  1569. // Copy the Packet into a tx Buffer
  1570. memcpy((pbyBuffer + uLength),
  1571. (pPacket + 14 + uTotalCopyLength),
  1572. cbFragPayloadSize
  1573. );
  1574. uTmpLen = cbFragPayloadSize;
  1575. uTotalCopyLength += uTmpLen;
  1576. if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
  1577. MIC_vAppend((pbyBuffer + uLength), uTmpLen);
  1578. if (uTmpLen < cbFragPayloadSize) {
  1579. bMIC2Frag = true;
  1580. uMICFragLen = cbFragPayloadSize - uTmpLen;
  1581. ASSERT(uMICFragLen < cbMIClen);
  1582. pdwMIC_L = (u32 *)(pbyBuffer + uLength + uTmpLen);
  1583. pdwMIC_R = (u32 *)(pbyBuffer + uLength + uTmpLen + 4);
  1584. MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
  1585. dwSafeMIC_L = *pdwMIC_L;
  1586. dwSafeMIC_R = *pdwMIC_R;
  1587. pr_debug("MIDDLE: uMICFragLen:%d, cbFragPayloadSize:%d, uTmpLen:%d\n",
  1588. uMICFragLen,
  1589. cbFragPayloadSize,
  1590. uTmpLen);
  1591. pr_debug("Fill MIC in Middle frag [%d]\n",
  1592. uMICFragLen);
  1593. pr_debug("Get MIC:%X, %X\n",
  1594. *pdwMIC_L, *pdwMIC_R);
  1595. }
  1596. pr_debug("Middle frag len: %d\n",
  1597. uTmpLen);
  1598. } else {
  1599. ASSERT(uTmpLen == (cbFragPayloadSize));
  1600. }
  1601. if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
  1602. if (bNeedEncrypt) {
  1603. s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbFragPayloadSize);
  1604. cbReqCount += cbICVlen;
  1605. }
  1606. }
  1607. ptdCurr = (PSTxDesc)pHeadTD;
  1608. //--------------------
  1609. //1.Set TSR1 & ReqCount in TxDescHead
  1610. //2.Set FragCtl in TxBufferHead
  1611. //3.Set Frame Control
  1612. //4.Set Sequence Control
  1613. //5.Get S/W generate FCS
  1614. //--------------------
  1615. s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
  1616. ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
  1617. ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
  1618. ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
  1619. ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
  1620. pDevice->iTDUsed[uDMAIdx]++;
  1621. pHeadTD = ptdCurr->next;
  1622. }
  1623. } // for (uMACfragNum)
  1624. } else {
  1625. //=========================
  1626. // No Fragmentation
  1627. //=========================
  1628. wFragType = FRAGCTL_NONFRAG;
  1629. //Set FragCtl in TxBufferHead
  1630. psTxBufHd->wFragCtl |= (unsigned short)wFragType;
  1631. //Fill FIFO,RrvTime,RTS,and CTS
  1632. s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
  1633. cbFrameSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
  1634. //Fill DataHead
  1635. uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
  1636. 0, 0, uMACfragNum, byFBOption, pDevice->wCurrentRate);
  1637. // Generate TX MAC Header
  1638. vGenerateMACHeader(pDevice, pbyMacHdr, uDuration, psEthHeader, bNeedEncrypt,
  1639. wFragType, uDMAIdx, 0);
  1640. if (bNeedEncrypt == true) {
  1641. //Fill TXKEY
  1642. s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
  1643. pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
  1644. if (pDevice->bEnableHostWEP) {
  1645. pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
  1646. pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
  1647. }
  1648. }
  1649. // 802.1H
  1650. if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
  1651. if ((psEthHeader->wType == TYPE_PKT_IPX) ||
  1652. (psEthHeader->wType == cpu_to_le16(0xF380))) {
  1653. memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
  1654. } else {
  1655. memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
  1656. }
  1657. pbyType = (unsigned char *)(pbyPayloadHead + 6);
  1658. memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
  1659. cb802_1_H_len = 8;
  1660. }
  1661. cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen);
  1662. //---------------------------
  1663. // S/W or H/W Encryption
  1664. //---------------------------
  1665. pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
  1666. uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
  1667. //copy TxBufferHeader + MacHeader to desc
  1668. memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
  1669. // Copy the Packet into a tx Buffer
  1670. memcpy((pbyBuffer + uLength),
  1671. (pPacket + 14),
  1672. cbFrameBodySize - cb802_1_H_len
  1673. );
  1674. if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
  1675. pr_debug("Length:%d, %d\n",
  1676. cbFrameBodySize - cb802_1_H_len, uLength);
  1677. MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFrameBodySize);
  1678. pdwMIC_L = (u32 *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize);
  1679. pdwMIC_R = (u32 *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize + 4);
  1680. MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
  1681. MIC_vUnInit();
  1682. if (pDevice->bTxMICFail == true) {
  1683. *pdwMIC_L = 0;
  1684. *pdwMIC_R = 0;
  1685. pDevice->bTxMICFail = false;
  1686. }
  1687. pr_debug("uLength: %d, %d\n", uLength, cbFrameBodySize);
  1688. pr_debug("cbReqCount:%d, %d, %d, %d\n",
  1689. cbReqCount, cbHeaderLength, uPadding, cbIVlen);
  1690. pr_debug("MIC:%x, %x\n", *pdwMIC_L, *pdwMIC_R);
  1691. }
  1692. if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
  1693. if (bNeedEncrypt) {
  1694. s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len),
  1695. (unsigned short)(cbFrameBodySize + cbMIClen));
  1696. cbReqCount += cbICVlen;
  1697. }
  1698. }
  1699. ptdCurr = (PSTxDesc)pHeadTD;
  1700. ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
  1701. ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
  1702. ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
  1703. ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
  1704. //Set TSR1 & ReqCount in TxDescHead
  1705. ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
  1706. ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
  1707. pDevice->iTDUsed[uDMAIdx]++;
  1708. }
  1709. *puMACfragNum = uMACfragNum;
  1710. return cbHeaderLength;
  1711. }
  1712. void
  1713. vGenerateFIFOHeader(struct vnt_private *pDevice, unsigned char byPktType,
  1714. unsigned char *pbyTxBufferAddr, bool bNeedEncrypt,
  1715. unsigned int cbPayloadSize, unsigned int uDMAIdx,
  1716. PSTxDesc pHeadTD, PSEthernetHeader psEthHeader, unsigned char *pPacket,
  1717. PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum,
  1718. unsigned int *pcbHeaderSize)
  1719. {
  1720. unsigned int wTxBufSize; // FFinfo size
  1721. bool bNeedACK;
  1722. bool bIsAdhoc;
  1723. unsigned short cbMacHdLen;
  1724. PSTxBufHead pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
  1725. wTxBufSize = sizeof(STxBufHead);
  1726. memset(pTxBufHead, 0, wTxBufSize);
  1727. //Set FIFOCTL_NEEDACK
  1728. if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
  1729. (pDevice->op_mode == NL80211_IFTYPE_AP)) {
  1730. if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0]))) {
  1731. bNeedACK = false;
  1732. pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
  1733. } else {
  1734. bNeedACK = true;
  1735. pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
  1736. }
  1737. bIsAdhoc = true;
  1738. } else {
  1739. // MSDUs in Infra mode always need ACK
  1740. bNeedACK = true;
  1741. pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
  1742. bIsAdhoc = false;
  1743. }
  1744. pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
  1745. pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us);
  1746. //Set FIFOCTL_LHEAD
  1747. if (pDevice->bLongHeader)
  1748. pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
  1749. //Set FIFOCTL_GENINT
  1750. pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
  1751. //Set FIFOCTL_ISDMA0
  1752. if (TYPE_TXDMA0 == uDMAIdx)
  1753. pTxBufHead->wFIFOCtl |= FIFOCTL_ISDMA0;
  1754. //Set FRAGCTL_MACHDCNT
  1755. if (pDevice->bLongHeader)
  1756. cbMacHdLen = WLAN_HDR_ADDR3_LEN + 6;
  1757. else
  1758. cbMacHdLen = WLAN_HDR_ADDR3_LEN;
  1759. pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
  1760. //Set packet type
  1761. if (byPktType == PK_TYPE_11A) //0000 0000 0000 0000
  1762. ;
  1763. else if (byPktType == PK_TYPE_11B) //0000 0001 0000 0000
  1764. pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
  1765. else if (byPktType == PK_TYPE_11GB) //0000 0010 0000 0000
  1766. pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
  1767. else if (byPktType == PK_TYPE_11GA) //0000 0011 0000 0000
  1768. pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
  1769. //Set FIFOCTL_GrpAckPolicy
  1770. if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
  1771. pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
  1772. //Set Auto Fallback Ctl
  1773. if (pDevice->wCurrentRate >= RATE_18M) {
  1774. if (pDevice->byAutoFBCtrl == AUTO_FB_0)
  1775. pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
  1776. else if (pDevice->byAutoFBCtrl == AUTO_FB_1)
  1777. pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
  1778. }
  1779. //Set FRAGCTL_WEPTYP
  1780. pDevice->bAES = false;
  1781. //Set FRAGCTL_WEPTYP
  1782. if (pDevice->byLocalID > REV_ID_VT3253_A1) {
  1783. if ((bNeedEncrypt) && (pTransmitKey != NULL)) { //WEP enabled
  1784. if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
  1785. pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
  1786. } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
  1787. if (pTransmitKey->uKeyLength != WLAN_WEP232_KEYLEN)
  1788. pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
  1789. } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
  1790. pTxBufHead->wFragCtl |= FRAGCTL_AES;
  1791. }
  1792. }
  1793. }
  1794. RFbSetPower(pDevice, pDevice->wCurrentRate, pDevice->byCurrentCh);
  1795. pTxBufHead->byTxPower = pDevice->byCurPwr;
  1796. *pcbHeaderSize = s_cbFillTxBufHead(pDevice, byPktType, pbyTxBufferAddr, cbPayloadSize,
  1797. uDMAIdx, pHeadTD, psEthHeader, pPacket, bNeedEncrypt,
  1798. pTransmitKey, uNodeIndex, puMACfragNum);
  1799. }
  1800. /*+
  1801. *
  1802. * Description:
  1803. * Translate 802.3 to 802.11 header
  1804. *
  1805. * Parameters:
  1806. * In:
  1807. * pDevice - Pointer to adapter
  1808. * dwTxBufferAddr - Transmit Buffer
  1809. * pPacket - Packet from upper layer
  1810. * cbPacketSize - Transmit Data Length
  1811. * Out:
  1812. * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
  1813. * pcbAppendPayload - size of append payload for 802.1H translation
  1814. *
  1815. * Return Value: none
  1816. *
  1817. -*/
  1818. void
  1819. vGenerateMACHeader(
  1820. struct vnt_private *pDevice,
  1821. unsigned char *pbyBufferAddr,
  1822. __le16 wDuration,
  1823. PSEthernetHeader psEthHeader,
  1824. bool bNeedEncrypt,
  1825. unsigned short wFragType,
  1826. unsigned int uDMAIdx,
  1827. unsigned int uFragIdx
  1828. )
  1829. {
  1830. PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
  1831. memset(pMACHeader, 0, (sizeof(S802_11Header)));
  1832. if (uDMAIdx == TYPE_ATIMDMA)
  1833. pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
  1834. else
  1835. pMACHeader->wFrameCtl = TYPE_802_11_DATA;
  1836. if (pDevice->op_mode == NL80211_IFTYPE_AP) {
  1837. memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
  1838. memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
  1839. memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
  1840. pMACHeader->wFrameCtl |= FC_FROMDS;
  1841. } else {
  1842. if (pDevice->op_mode == NL80211_IFTYPE_ADHOC) {
  1843. memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
  1844. memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
  1845. memcpy(&(pMACHeader->abyAddr3[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
  1846. } else {
  1847. memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
  1848. memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
  1849. memcpy(&(pMACHeader->abyAddr1[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
  1850. pMACHeader->wFrameCtl |= FC_TODS;
  1851. }
  1852. }
  1853. if (bNeedEncrypt)
  1854. pMACHeader->wFrameCtl |= cpu_to_le16((unsigned short)WLAN_SET_FC_ISWEP(1));
  1855. pMACHeader->wDurationID = le16_to_cpu(wDuration);
  1856. if (pDevice->bLongHeader) {
  1857. PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
  1858. pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
  1859. memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
  1860. }
  1861. pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
  1862. //Set FragNumber in Sequence Control
  1863. pMACHeader->wSeqCtl |= cpu_to_le16((unsigned short)uFragIdx);
  1864. if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
  1865. pDevice->wSeqCounter++;
  1866. if (pDevice->wSeqCounter > 0x0fff)
  1867. pDevice->wSeqCounter = 0;
  1868. }
  1869. if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) //StartFrag or MidFrag
  1870. pMACHeader->wFrameCtl |= FC_MOREFRAG;
  1871. }
  1872. CMD_STATUS csMgmt_xmit(struct vnt_private *pDevice, PSTxMgmtPacket pPacket)
  1873. {
  1874. PSTxDesc pFrstTD;
  1875. unsigned char byPktType;
  1876. unsigned char *pbyTxBufferAddr;
  1877. void *pvRTS;
  1878. struct vnt_cts *pCTS;
  1879. void *pvTxDataHd;
  1880. unsigned int uDuration;
  1881. unsigned int cbReqCount;
  1882. PS802_11Header pMACHeader;
  1883. unsigned int cbHeaderSize;
  1884. unsigned int cbFrameBodySize;
  1885. bool bNeedACK;
  1886. bool bIsPSPOLL = false;
  1887. PSTxBufHead pTxBufHead;
  1888. unsigned int cbFrameSize;
  1889. unsigned int cbIVlen = 0;
  1890. unsigned int cbICVlen = 0;
  1891. unsigned int cbMIClen = 0;
  1892. unsigned int cbFCSlen = 4;
  1893. unsigned int uPadding = 0;
  1894. unsigned short wTxBufSize;
  1895. unsigned int cbMacHdLen;
  1896. SEthernetHeader sEthHeader;
  1897. void *pvRrvTime;
  1898. void *pMICHDR;
  1899. PSMgmtObject pMgmt = pDevice->pMgmt;
  1900. unsigned short wCurrentRate = RATE_1M;
  1901. if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0)
  1902. return CMD_STATUS_RESOURCES;
  1903. pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
  1904. pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
  1905. cbFrameBodySize = pPacket->cbPayloadLen;
  1906. pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
  1907. wTxBufSize = sizeof(STxBufHead);
  1908. memset(pTxBufHead, 0, wTxBufSize);
  1909. if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
  1910. wCurrentRate = RATE_6M;
  1911. byPktType = PK_TYPE_11A;
  1912. } else {
  1913. wCurrentRate = RATE_1M;
  1914. byPktType = PK_TYPE_11B;
  1915. }
  1916. // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
  1917. // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
  1918. // And cmd timer will wait data pkt TX finish before scanning so it's OK
  1919. // to set power here.
  1920. if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING)
  1921. RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
  1922. else
  1923. RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
  1924. pTxBufHead->byTxPower = pDevice->byCurPwr;
  1925. //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
  1926. if (pDevice->byFOETuning) {
  1927. if ((pPacket->p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
  1928. wCurrentRate = RATE_24M;
  1929. byPktType = PK_TYPE_11GA;
  1930. }
  1931. }
  1932. //Set packet type
  1933. if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
  1934. pTxBufHead->wFIFOCtl = 0;
  1935. } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
  1936. pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
  1937. } else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
  1938. pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
  1939. } else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
  1940. pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
  1941. }
  1942. pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
  1943. pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
  1944. if (is_multicast_ether_addr(&(pPacket->p80211Header->sA3.abyAddr1[0])))
  1945. bNeedACK = false;
  1946. else {
  1947. bNeedACK = true;
  1948. pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
  1949. }
  1950. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
  1951. (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
  1952. pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
  1953. }
  1954. pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
  1955. if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
  1956. bIsPSPOLL = true;
  1957. cbMacHdLen = WLAN_HDR_ADDR2_LEN;
  1958. } else {
  1959. cbMacHdLen = WLAN_HDR_ADDR3_LEN;
  1960. }
  1961. //Set FRAGCTL_MACHDCNT
  1962. pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
  1963. // Notes:
  1964. // Although spec says MMPDU can be fragmented; In most cases,
  1965. // no one will send a MMPDU under fragmentation. With RTS may occur.
  1966. pDevice->bAES = false; //Set FRAGCTL_WEPTYP
  1967. if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
  1968. if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
  1969. cbIVlen = 4;
  1970. cbICVlen = 4;
  1971. pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
  1972. } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
  1973. cbIVlen = 8;//IV+ExtIV
  1974. cbMIClen = 8;
  1975. cbICVlen = 4;
  1976. pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
  1977. //We need to get seed here for filling TxKey entry.
  1978. } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
  1979. cbIVlen = 8;//RSN Header
  1980. cbICVlen = 8;//MIC
  1981. pTxBufHead->wFragCtl |= FRAGCTL_AES;
  1982. pDevice->bAES = true;
  1983. }
  1984. //MAC Header should be padding 0 to DW alignment.
  1985. uPadding = 4 - (cbMacHdLen%4);
  1986. uPadding %= 4;
  1987. }
  1988. cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
  1989. //Set FIFOCTL_GrpAckPolicy
  1990. if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
  1991. pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
  1992. //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
  1993. //Set RrvTime/RTS/CTS Buffer
  1994. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
  1995. pvRrvTime = (void *) (pbyTxBufferAddr + wTxBufSize);
  1996. pMICHDR = NULL;
  1997. pvRTS = NULL;
  1998. pCTS = (struct vnt_cts *)(pbyTxBufferAddr + wTxBufSize +
  1999. sizeof(struct vnt_rrv_time_cts));
  2000. pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
  2001. sizeof(struct vnt_rrv_time_cts) + sizeof(struct vnt_cts));
  2002. cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
  2003. sizeof(struct vnt_cts) + sizeof(struct vnt_tx_datahead_g);
  2004. } else { // 802.11a/b packet
  2005. pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
  2006. pMICHDR = NULL;
  2007. pvRTS = NULL;
  2008. pCTS = NULL;
  2009. pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
  2010. sizeof(struct vnt_rrv_time_ab));
  2011. cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
  2012. sizeof(struct vnt_tx_datahead_ab);
  2013. }
  2014. memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
  2015. memcpy(&(sEthHeader.abyDstAddr[0]), &(pPacket->p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
  2016. memcpy(&(sEthHeader.abySrcAddr[0]), &(pPacket->p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
  2017. //=========================
  2018. // No Fragmentation
  2019. //=========================
  2020. pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
  2021. //Fill FIFO,RrvTime,RTS,and CTS
  2022. s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
  2023. cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
  2024. //Fill DataHead
  2025. uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
  2026. 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
  2027. pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
  2028. cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
  2029. if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
  2030. unsigned char *pbyIVHead;
  2031. unsigned char *pbyPayloadHead;
  2032. unsigned char *pbyBSSID;
  2033. PSKeyItem pTransmitKey = NULL;
  2034. pbyIVHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
  2035. pbyPayloadHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
  2036. //Fill TXKEY
  2037. //Kyle: Need fix: TKIP and AES did't encrypt Mnt Packet.
  2038. //s_vFillTxKey(pDevice, (unsigned char *)pTxBufHead->adwTxKey, NULL);
  2039. //Fill IV(ExtIV,RSNHDR)
  2040. //s_vFillPrePayload(pDevice, pbyIVHead, NULL);
  2041. //---------------------------
  2042. // S/W or H/W Encryption
  2043. //---------------------------
  2044. do {
  2045. if ((pDevice->op_mode == NL80211_IFTYPE_STATION) &&
  2046. (pDevice->bLinkPass == true)) {
  2047. pbyBSSID = pDevice->abyBSSID;
  2048. // get pairwise key
  2049. if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
  2050. // get group key
  2051. if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
  2052. pr_debug("Get GTK\n");
  2053. break;
  2054. }
  2055. } else {
  2056. pr_debug("Get PTK\n");
  2057. break;
  2058. }
  2059. }
  2060. // get group key
  2061. pbyBSSID = pDevice->abyBroadcastAddr;
  2062. if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
  2063. pTransmitKey = NULL;
  2064. pr_debug("KEY is NULL. OP Mode[%d]\n",
  2065. pDevice->op_mode);
  2066. } else {
  2067. pr_debug("Get GTK\n");
  2068. }
  2069. } while (false);
  2070. //Fill TXKEY
  2071. s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
  2072. (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize, NULL);
  2073. memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
  2074. memcpy(pbyPayloadHead, ((unsigned char *)(pPacket->p80211Header) + cbMacHdLen),
  2075. cbFrameBodySize);
  2076. } else {
  2077. // Copy the Packet into a tx Buffer
  2078. memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
  2079. }
  2080. pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
  2081. pDevice->wSeqCounter++;
  2082. if (pDevice->wSeqCounter > 0x0fff)
  2083. pDevice->wSeqCounter = 0;
  2084. if (bIsPSPOLL) {
  2085. // The MAC will automatically replace the Duration-field of MAC header by Duration-field
  2086. // of FIFO control header.
  2087. // This will cause AID-field of PS-POLL packet to be incorrect (Because PS-POLL's AID field is
  2088. // in the same place of other packet's Duration-field).
  2089. // And it will cause Cisco-AP to issue Disassociation-packet
  2090. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
  2091. ((struct vnt_tx_datahead_g *)pvTxDataHd)->duration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
  2092. ((struct vnt_tx_datahead_g *)pvTxDataHd)->duration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
  2093. } else {
  2094. ((struct vnt_tx_datahead_ab *)pvTxDataHd)->duration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
  2095. }
  2096. }
  2097. // first TD is the only TD
  2098. //Set TSR1 & ReqCount in TxDescHead
  2099. pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
  2100. pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
  2101. pFrstTD->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
  2102. pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
  2103. pFrstTD->pTDInfo->byFlags = 0;
  2104. if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
  2105. // Disable PS
  2106. MACbPSWakeup(pDevice->PortOffset);
  2107. }
  2108. pDevice->bPWBitOn = false;
  2109. wmb();
  2110. pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
  2111. wmb();
  2112. pDevice->iTDUsed[TYPE_TXDMA0]++;
  2113. if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1)
  2114. pr_debug(" available td0 <= 1\n");
  2115. pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
  2116. pDevice->nTxDataTimeCout = 0; //2008-8-21 chester <add> for send null packet
  2117. // Poll Transmit the adapter
  2118. MACvTransmit0(pDevice->PortOffset);
  2119. return CMD_STATUS_PENDING;
  2120. }
  2121. CMD_STATUS csBeacon_xmit(struct vnt_private *pDevice, PSTxMgmtPacket pPacket)
  2122. {
  2123. unsigned char byPktType;
  2124. unsigned char *pbyBuffer = (unsigned char *)pDevice->tx_beacon_bufs;
  2125. unsigned int cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
  2126. unsigned int cbHeaderSize = 0;
  2127. struct vnt_tx_short_buf_head *short_head =
  2128. (struct vnt_tx_short_buf_head *)pbyBuffer;
  2129. PS802_11Header pMACHeader;
  2130. unsigned short wCurrentRate;
  2131. memset(short_head, 0, sizeof(*short_head));
  2132. if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
  2133. wCurrentRate = RATE_6M;
  2134. byPktType = PK_TYPE_11A;
  2135. } else {
  2136. wCurrentRate = RATE_2M;
  2137. byPktType = PK_TYPE_11B;
  2138. }
  2139. //Set Preamble type always long
  2140. pDevice->byPreambleType = PREAMBLE_LONG;
  2141. /* Set FIFOCTL_GENINT */
  2142. short_head->fifo_ctl |= cpu_to_le16(FIFOCTL_GENINT);
  2143. /* Set packet type & Get Duration */
  2144. if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
  2145. short_head->duration =
  2146. cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A,
  2147. cbFrameSize, byPktType, wCurrentRate, false,
  2148. 0, 0, 1, AUTO_FB_NONE));
  2149. } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
  2150. short_head->fifo_ctl |= cpu_to_le16(FIFOCTL_11B);
  2151. short_head->duration =
  2152. cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B,
  2153. cbFrameSize, byPktType, wCurrentRate, false,
  2154. 0, 0, 1, AUTO_FB_NONE));
  2155. }
  2156. vnt_get_phy_field(pDevice, cbFrameSize,
  2157. wCurrentRate, byPktType, &short_head->ab);
  2158. /* Get TimeStampOff */
  2159. short_head->time_stamp_off = vnt_time_stamp_off(pDevice, wCurrentRate);
  2160. cbHeaderSize = sizeof(struct vnt_tx_short_buf_head);
  2161. //Generate Beacon Header
  2162. pMACHeader = (PS802_11Header)(pbyBuffer + cbHeaderSize);
  2163. memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
  2164. pMACHeader->wDurationID = 0;
  2165. pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
  2166. pDevice->wSeqCounter++;
  2167. if (pDevice->wSeqCounter > 0x0fff)
  2168. pDevice->wSeqCounter = 0;
  2169. // Set Beacon buffer length
  2170. pDevice->wBCNBufLen = pPacket->cbMPDULen + cbHeaderSize;
  2171. MACvSetCurrBCNTxDescAddr(pDevice->PortOffset, (pDevice->tx_beacon_dma));
  2172. MACvSetCurrBCNLength(pDevice->PortOffset, pDevice->wBCNBufLen);
  2173. // Set auto Transmit on
  2174. MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
  2175. // Poll Transmit the adapter
  2176. MACvTransmitBCN(pDevice->PortOffset);
  2177. return CMD_STATUS_PENDING;
  2178. }
  2179. unsigned int
  2180. cbGetFragCount(
  2181. struct vnt_private *pDevice,
  2182. PSKeyItem pTransmitKey,
  2183. unsigned int cbFrameBodySize,
  2184. PSEthernetHeader psEthHeader
  2185. )
  2186. {
  2187. unsigned int cbMACHdLen;
  2188. unsigned int cbFrameSize;
  2189. unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
  2190. unsigned int cbFragPayloadSize;
  2191. unsigned int cbLastFragPayloadSize;
  2192. unsigned int cbIVlen = 0;
  2193. unsigned int cbICVlen = 0;
  2194. unsigned int cbMIClen = 0;
  2195. unsigned int cbFCSlen = 4;
  2196. unsigned int uMACfragNum = 1;
  2197. bool bNeedACK;
  2198. if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
  2199. (pDevice->op_mode == NL80211_IFTYPE_AP)) {
  2200. if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
  2201. bNeedACK = false;
  2202. else
  2203. bNeedACK = true;
  2204. } else {
  2205. // MSDUs in Infra mode always need ACK
  2206. bNeedACK = true;
  2207. }
  2208. if (pDevice->bLongHeader)
  2209. cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
  2210. else
  2211. cbMACHdLen = WLAN_HDR_ADDR3_LEN;
  2212. if (pDevice->bEncryptionEnable == true) {
  2213. if (pTransmitKey == NULL) {
  2214. if ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) ||
  2215. (pDevice->pMgmt->eAuthenMode < WMAC_AUTH_WPA)) {
  2216. cbIVlen = 4;
  2217. cbICVlen = 4;
  2218. } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
  2219. cbIVlen = 8;//IV+ExtIV
  2220. cbMIClen = 8;
  2221. cbICVlen = 4;
  2222. } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
  2223. cbIVlen = 8;//RSN Header
  2224. cbICVlen = 8;//MIC
  2225. }
  2226. } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
  2227. cbIVlen = 4;
  2228. cbICVlen = 4;
  2229. } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
  2230. cbIVlen = 8;//IV+ExtIV
  2231. cbMIClen = 8;
  2232. cbICVlen = 4;
  2233. } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
  2234. cbIVlen = 8;//RSN Header
  2235. cbICVlen = 8;//MIC
  2236. }
  2237. }
  2238. cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
  2239. if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true)) {
  2240. // Fragmentation
  2241. cbFragmentSize = pDevice->wFragmentationThreshold;
  2242. cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
  2243. uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
  2244. cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
  2245. if (cbLastFragPayloadSize == 0)
  2246. cbLastFragPayloadSize = cbFragPayloadSize;
  2247. else
  2248. uMACfragNum++;
  2249. }
  2250. return uMACfragNum;
  2251. }
  2252. void vDMA0_tx_80211(struct vnt_private *pDevice, struct sk_buff *skb,
  2253. unsigned char *pbMPDU, unsigned int cbMPDULen)
  2254. {
  2255. PSTxDesc pFrstTD;
  2256. unsigned char byPktType;
  2257. unsigned char *pbyTxBufferAddr;
  2258. void *pvRTS;
  2259. void *pvCTS;
  2260. void *pvTxDataHd;
  2261. unsigned int uDuration;
  2262. unsigned int cbReqCount;
  2263. PS802_11Header pMACHeader;
  2264. unsigned int cbHeaderSize;
  2265. unsigned int cbFrameBodySize;
  2266. bool bNeedACK;
  2267. bool bIsPSPOLL = false;
  2268. PSTxBufHead pTxBufHead;
  2269. unsigned int cbFrameSize;
  2270. unsigned int cbIVlen = 0;
  2271. unsigned int cbICVlen = 0;
  2272. unsigned int cbMIClen = 0;
  2273. unsigned int cbFCSlen = 4;
  2274. unsigned int uPadding = 0;
  2275. unsigned int cbMICHDR = 0;
  2276. unsigned int uLength = 0;
  2277. u32 dwMICKey0, dwMICKey1;
  2278. u32 dwMIC_Priority;
  2279. u32 *pdwMIC_L;
  2280. u32 *pdwMIC_R;
  2281. unsigned short wTxBufSize;
  2282. unsigned int cbMacHdLen;
  2283. SEthernetHeader sEthHeader;
  2284. void *pvRrvTime;
  2285. void *pMICHDR;
  2286. PSMgmtObject pMgmt = pDevice->pMgmt;
  2287. unsigned short wCurrentRate = RATE_1M;
  2288. PUWLAN_80211HDR p80211Header;
  2289. unsigned int uNodeIndex = 0;
  2290. bool bNodeExist = false;
  2291. SKeyItem STempKey;
  2292. PSKeyItem pTransmitKey = NULL;
  2293. unsigned char *pbyIVHead;
  2294. unsigned char *pbyPayloadHead;
  2295. unsigned char *pbyMacHdr;
  2296. unsigned int cbExtSuppRate = 0;
  2297. pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
  2298. if (cbMPDULen <= WLAN_HDR_ADDR3_LEN)
  2299. cbFrameBodySize = 0;
  2300. else
  2301. cbFrameBodySize = cbMPDULen - WLAN_HDR_ADDR3_LEN;
  2302. p80211Header = (PUWLAN_80211HDR)pbMPDU;
  2303. pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
  2304. pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
  2305. pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
  2306. wTxBufSize = sizeof(STxBufHead);
  2307. memset(pTxBufHead, 0, wTxBufSize);
  2308. if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
  2309. wCurrentRate = RATE_6M;
  2310. byPktType = PK_TYPE_11A;
  2311. } else {
  2312. wCurrentRate = RATE_1M;
  2313. byPktType = PK_TYPE_11B;
  2314. }
  2315. // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
  2316. // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
  2317. // And cmd timer will wait data pkt TX to finish before scanning so it's OK
  2318. // to set power here.
  2319. if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING)
  2320. RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
  2321. else
  2322. RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
  2323. pTxBufHead->byTxPower = pDevice->byCurPwr;
  2324. //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
  2325. if (pDevice->byFOETuning) {
  2326. if ((p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
  2327. wCurrentRate = RATE_24M;
  2328. byPktType = PK_TYPE_11GA;
  2329. }
  2330. }
  2331. pr_debug("vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x\n",
  2332. p80211Header->sA3.wFrameCtl);
  2333. //Set packet type
  2334. if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
  2335. pTxBufHead->wFIFOCtl = 0;
  2336. } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
  2337. pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
  2338. } else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
  2339. pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
  2340. } else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
  2341. pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
  2342. }
  2343. pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
  2344. pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
  2345. if (is_multicast_ether_addr(&(p80211Header->sA3.abyAddr1[0]))) {
  2346. bNeedACK = false;
  2347. if (pDevice->bEnableHostWEP) {
  2348. uNodeIndex = 0;
  2349. bNodeExist = true;
  2350. }
  2351. } else {
  2352. if (pDevice->bEnableHostWEP) {
  2353. if (BSSDBbIsSTAInNodeDB(pDevice->pMgmt, (unsigned char *)(p80211Header->sA3.abyAddr1), &uNodeIndex))
  2354. bNodeExist = true;
  2355. }
  2356. bNeedACK = true;
  2357. pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
  2358. }
  2359. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
  2360. (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
  2361. pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
  2362. }
  2363. pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
  2364. if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
  2365. bIsPSPOLL = true;
  2366. cbMacHdLen = WLAN_HDR_ADDR2_LEN;
  2367. } else {
  2368. cbMacHdLen = WLAN_HDR_ADDR3_LEN;
  2369. }
  2370. // hostapd deamon ext support rate patch
  2371. if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
  2372. if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
  2373. cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
  2374. if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
  2375. cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
  2376. if (cbExtSuppRate > 0)
  2377. cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
  2378. }
  2379. //Set FRAGCTL_MACHDCNT
  2380. pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)cbMacHdLen << 10);
  2381. // Notes:
  2382. // Although spec says MMPDU can be fragmented; In most cases,
  2383. // no one will send a MMPDU under fragmentation. With RTS may occur.
  2384. pDevice->bAES = false; //Set FRAGCTL_WEPTYP
  2385. if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
  2386. if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
  2387. cbIVlen = 4;
  2388. cbICVlen = 4;
  2389. pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
  2390. } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
  2391. cbIVlen = 8;//IV+ExtIV
  2392. cbMIClen = 8;
  2393. cbICVlen = 4;
  2394. pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
  2395. //We need to get seed here for filling TxKey entry.
  2396. } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
  2397. cbIVlen = 8;//RSN Header
  2398. cbICVlen = 8;//MIC
  2399. cbMICHDR = sizeof(struct vnt_mic_hdr);
  2400. pTxBufHead->wFragCtl |= FRAGCTL_AES;
  2401. pDevice->bAES = true;
  2402. }
  2403. //MAC Header should be padding 0 to DW alignment.
  2404. uPadding = 4 - (cbMacHdLen%4);
  2405. uPadding %= 4;
  2406. }
  2407. cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
  2408. //Set FIFOCTL_GrpAckPolicy
  2409. if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
  2410. pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
  2411. //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
  2412. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
  2413. pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
  2414. pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize +
  2415. sizeof(struct vnt_rrv_time_cts));
  2416. pvRTS = NULL;
  2417. pvCTS = (struct vnt_cts *)(pbyTxBufferAddr + wTxBufSize +
  2418. sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
  2419. pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
  2420. sizeof(struct vnt_rrv_time_cts) + cbMICHDR + sizeof(struct vnt_cts));
  2421. cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
  2422. cbMICHDR + sizeof(struct vnt_cts) + sizeof(struct vnt_tx_datahead_g);
  2423. } else {//802.11a/b packet
  2424. pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
  2425. pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr +
  2426. wTxBufSize + sizeof(struct vnt_rrv_time_ab));
  2427. pvRTS = NULL;
  2428. pvCTS = NULL;
  2429. pvTxDataHd = (void *)(pbyTxBufferAddr +
  2430. wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
  2431. cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
  2432. cbMICHDR + sizeof(struct vnt_tx_datahead_ab);
  2433. }
  2434. memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
  2435. memcpy(&(sEthHeader.abyDstAddr[0]), &(p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
  2436. memcpy(&(sEthHeader.abySrcAddr[0]), &(p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
  2437. //=========================
  2438. // No Fragmentation
  2439. //=========================
  2440. pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
  2441. //Fill FIFO,RrvTime,RTS,and CTS
  2442. s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
  2443. cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
  2444. //Fill DataHead
  2445. uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
  2446. 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
  2447. pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
  2448. cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
  2449. pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize);
  2450. pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
  2451. pbyIVHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding);
  2452. // Copy the Packet into a tx Buffer
  2453. memcpy(pbyMacHdr, pbMPDU, cbMacHdLen);
  2454. // version set to 0, patch for hostapd deamon
  2455. pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
  2456. memcpy(pbyPayloadHead, (pbMPDU + cbMacHdLen), cbFrameBodySize);
  2457. // replace support rate, patch for hostapd deamon(only support 11M)
  2458. if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
  2459. if (cbExtSuppRate != 0) {
  2460. if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
  2461. memcpy((pbyPayloadHead + cbFrameBodySize),
  2462. pMgmt->abyCurrSuppRates,
  2463. ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
  2464. );
  2465. if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
  2466. memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
  2467. pMgmt->abyCurrExtSuppRates,
  2468. ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
  2469. );
  2470. }
  2471. }
  2472. // Set wep
  2473. if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
  2474. if (pDevice->bEnableHostWEP) {
  2475. pTransmitKey = &STempKey;
  2476. pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
  2477. pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
  2478. pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
  2479. pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
  2480. pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
  2481. memcpy(pTransmitKey->abyKey,
  2482. &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
  2483. pTransmitKey->uKeyLength
  2484. );
  2485. }
  2486. if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
  2487. dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
  2488. dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
  2489. // DO Software Michael
  2490. MIC_vInit(dwMICKey0, dwMICKey1);
  2491. MIC_vAppend((unsigned char *)&(sEthHeader.abyDstAddr[0]), 12);
  2492. dwMIC_Priority = 0;
  2493. MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
  2494. pr_debug("DMA0_tx_8021:MIC KEY: %X, %X\n",
  2495. dwMICKey0, dwMICKey1);
  2496. uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
  2497. MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
  2498. pdwMIC_L = (u32 *)(pbyTxBufferAddr + uLength + cbFrameBodySize);
  2499. pdwMIC_R = (u32 *)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
  2500. MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
  2501. MIC_vUnInit();
  2502. if (pDevice->bTxMICFail == true) {
  2503. *pdwMIC_L = 0;
  2504. *pdwMIC_R = 0;
  2505. pDevice->bTxMICFail = false;
  2506. }
  2507. pr_debug("uLength: %d, %d\n", uLength, cbFrameBodySize);
  2508. pr_debug("cbReqCount:%d, %d, %d, %d\n",
  2509. cbReqCount, cbHeaderSize, uPadding, cbIVlen);
  2510. pr_debug("MIC:%x, %x\n", *pdwMIC_L, *pdwMIC_R);
  2511. }
  2512. s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
  2513. pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
  2514. if (pDevice->bEnableHostWEP) {
  2515. pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
  2516. pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
  2517. }
  2518. if ((pDevice->byLocalID <= REV_ID_VT3253_A1))
  2519. s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (unsigned short)(cbFrameBodySize + cbMIClen));
  2520. }
  2521. pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
  2522. pDevice->wSeqCounter++;
  2523. if (pDevice->wSeqCounter > 0x0fff)
  2524. pDevice->wSeqCounter = 0;
  2525. if (bIsPSPOLL) {
  2526. // The MAC will automatically replace the Duration-field of MAC header by Duration-field
  2527. // of FIFO control header.
  2528. // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
  2529. // in the same place of other packet's Duration-field).
  2530. // And it will cause Cisco-AP to issue Disassociation-packet
  2531. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
  2532. ((struct vnt_tx_datahead_g *)pvTxDataHd)->duration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
  2533. ((struct vnt_tx_datahead_g *)pvTxDataHd)->duration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
  2534. } else {
  2535. ((struct vnt_tx_datahead_ab *)pvTxDataHd)->duration = cpu_to_le16(p80211Header->sA2.wDurationID);
  2536. }
  2537. }
  2538. // first TD is the only TD
  2539. //Set TSR1 & ReqCount in TxDescHead
  2540. pFrstTD->pTDInfo->skb = skb;
  2541. pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
  2542. pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
  2543. pFrstTD->m_td1TD1.wReqCount = cpu_to_le16(cbReqCount);
  2544. pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
  2545. pFrstTD->pTDInfo->byFlags = 0;
  2546. pFrstTD->pTDInfo->byFlags |= TD_FLAGS_PRIV_SKB;
  2547. if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
  2548. // Disable PS
  2549. MACbPSWakeup(pDevice->PortOffset);
  2550. }
  2551. pDevice->bPWBitOn = false;
  2552. wmb();
  2553. pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
  2554. wmb();
  2555. pDevice->iTDUsed[TYPE_TXDMA0]++;
  2556. if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1)
  2557. pr_debug(" available td0 <= 1\n");
  2558. pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
  2559. // Poll Transmit the adapter
  2560. MACvTransmit0(pDevice->PortOffset);
  2561. }