card.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113
  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: card.c
  20. * Purpose: Provide functions to setup NIC operation mode
  21. * Functions:
  22. * s_vSafeResetTx - Rest Tx
  23. * CARDvSetRSPINF - Set RSPINF
  24. * vUpdateIFS - Update slotTime,SIFS,DIFS, and EIFS
  25. * CARDvUpdateBasicTopRate - Update BasicTopRate
  26. * CARDbAddBasicRate - Add to BasicRateSet
  27. * CARDbSetBasicRate - Set Basic Tx Rate
  28. * CARDbIsOFDMinBasicRate - Check if any OFDM rate is in BasicRateSet
  29. * CARDvSetLoopbackMode - Set Loopback mode
  30. * CARDbSoftwareReset - Sortware reset NIC
  31. * CARDqGetTSFOffset - Caculate TSFOffset
  32. * CARDbGetCurrentTSF - Read Current NIC TSF counter
  33. * CARDqGetNextTBTT - Caculate Next Beacon TSF counter
  34. * CARDvSetFirstNextTBTT - Set NIC Beacon time
  35. * CARDvUpdateNextTBTT - Sync. NIC Beacon time
  36. * CARDbRadioPowerOff - Turn Off NIC Radio Power
  37. * CARDbRadioPowerOn - Turn On NIC Radio Power
  38. * CARDbSetWEPMode - Set NIC Wep mode
  39. * CARDbSetTxPower - Set NIC tx power
  40. *
  41. * Revision History:
  42. * 06-10-2003 Bryan YC Fan: Re-write codes to support VT3253 spec.
  43. * 08-26-2003 Kyle Hsu: Modify the defination type of dwIoBase.
  44. * 09-01-2003 Bryan YC Fan: Add vUpdateIFS().
  45. *
  46. */
  47. #include "tmacro.h"
  48. #include "card.h"
  49. #include "baseband.h"
  50. #include "mac.h"
  51. #include "desc.h"
  52. #include "rf.h"
  53. #include "power.h"
  54. #include "key.h"
  55. #include "rc4.h"
  56. #include "country.h"
  57. #include "datarate.h"
  58. #include "rndis.h"
  59. #include "control.h"
  60. /*--------------------- Static Definitions -------------------------*/
  61. //static int msglevel =MSG_LEVEL_DEBUG;
  62. static int msglevel =MSG_LEVEL_INFO;
  63. /*--------------------- Static Definitions -------------------------*/
  64. #define CB_TXPOWER_LEVEL 6
  65. /*--------------------- Static Classes ----------------------------*/
  66. /*--------------------- Static Variables --------------------------*/
  67. //const WORD cwRXBCNTSFOff[MAX_RATE] =
  68. //{17, 34, 96, 192, 34, 23, 17, 11, 8, 5, 4, 3};
  69. const WORD cwRXBCNTSFOff[MAX_RATE] =
  70. {192, 96, 34, 17, 34, 23, 17, 11, 8, 5, 4, 3};
  71. /*--------------------- Static Functions --------------------------*/
  72. /*--------------------- Export Variables --------------------------*/
  73. /*--------------------- Export Functions --------------------------*/
  74. /*
  75. * Description: Set NIC media channel
  76. *
  77. * Parameters:
  78. * In:
  79. * pDevice - The adapter to be set
  80. * uConnectionChannel - Channel to be set
  81. * Out:
  82. * none
  83. *
  84. * Return Value: TRUE if succeeded; FALSE if failed.
  85. *
  86. */
  87. BOOL CARDbSetMediaChannel(void *pDeviceHandler, unsigned int uConnectionChannel)
  88. {
  89. PSDevice pDevice = (PSDevice) pDeviceHandler;
  90. BOOL bResult = TRUE;
  91. if (pDevice->byBBType == BB_TYPE_11A) { // 15 ~ 38
  92. if ((uConnectionChannel < (CB_MAX_CHANNEL_24G+1)) || (uConnectionChannel > CB_MAX_CHANNEL))
  93. uConnectionChannel = (CB_MAX_CHANNEL_24G+1);
  94. } else {
  95. if ((uConnectionChannel > CB_MAX_CHANNEL_24G) || (uConnectionChannel == 0)) // 1 ~ 14
  96. uConnectionChannel = 1;
  97. }
  98. // clear NAV
  99. MACvRegBitsOn(pDevice, MAC_REG_MACCR, MACCR_CLRNAV);
  100. // Set Channel[7] = 0 to tell H/W channel is changing now.
  101. MACvRegBitsOff(pDevice, MAC_REG_CHANNEL, 0x80);
  102. //if (pMgmt->uCurrChannel == uConnectionChannel)
  103. // return bResult;
  104. CONTROLnsRequestOut(pDevice,
  105. MESSAGE_TYPE_SELECT_CHANNLE,
  106. (WORD) uConnectionChannel,
  107. 0,
  108. 0,
  109. NULL
  110. );
  111. //{{ RobertYu: 20041202
  112. //// TX_PE will reserve 3 us for MAX2829 A mode only, it is for better TX throughput
  113. if (pDevice->byBBType == BB_TYPE_11A) {
  114. pDevice->byCurPwr = 0xFF;
  115. RFbRawSetPower(pDevice, pDevice->abyOFDMAPwrTbl[uConnectionChannel-15], RATE_54M);
  116. } else if (pDevice->byBBType == BB_TYPE_11G) {
  117. pDevice->byCurPwr = 0xFF;
  118. RFbRawSetPower(pDevice, pDevice->abyOFDMPwrTbl[uConnectionChannel-1], RATE_54M);
  119. } else {
  120. pDevice->byCurPwr = 0xFF;
  121. RFbRawSetPower(pDevice, pDevice->abyCCKPwrTbl[uConnectionChannel-1], RATE_1M);
  122. }
  123. ControlvWriteByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_CHANNEL,(BYTE)(uConnectionChannel|0x80));
  124. return(bResult);
  125. }
  126. /*
  127. * Description: Get CCK mode basic rate
  128. *
  129. * Parameters:
  130. * In:
  131. * pDevice - The adapter to be set
  132. * wRateIdx - Receiving data rate
  133. * Out:
  134. * none
  135. *
  136. * Return Value: response Control frame rate
  137. *
  138. */
  139. static WORD swGetCCKControlRate(void *pDeviceHandler, WORD wRateIdx)
  140. {
  141. PSDevice pDevice = (PSDevice) pDeviceHandler;
  142. unsigned int ui = (unsigned int)wRateIdx;
  143. while (ui > RATE_1M) {
  144. if (pDevice->wBasicRate & ((WORD)1 << ui)) {
  145. return (WORD)ui;
  146. }
  147. ui --;
  148. }
  149. return (WORD)RATE_1M;
  150. }
  151. /*
  152. * Description: Get OFDM mode basic rate
  153. *
  154. * Parameters:
  155. * In:
  156. * pDevice - The adapter to be set
  157. * wRateIdx - Receiving data rate
  158. * Out:
  159. * none
  160. *
  161. * Return Value: response Control frame rate
  162. *
  163. */
  164. static WORD swGetOFDMControlRate(void *pDeviceHandler, WORD wRateIdx)
  165. {
  166. PSDevice pDevice = (PSDevice) pDeviceHandler;
  167. unsigned int ui = (unsigned int)wRateIdx;
  168. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BASIC RATE: %X\n", pDevice->wBasicRate);
  169. if (!CARDbIsOFDMinBasicRate(pDevice)) {
  170. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"swGetOFDMControlRate:(NO OFDM) %d\n", wRateIdx);
  171. if (wRateIdx > RATE_24M)
  172. wRateIdx = RATE_24M;
  173. return wRateIdx;
  174. }
  175. while (ui > RATE_11M) {
  176. if (pDevice->wBasicRate & ((WORD)1 << ui)) {
  177. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"swGetOFDMControlRate : %d\n", ui);
  178. return (WORD)ui;
  179. }
  180. ui --;
  181. }
  182. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"swGetOFDMControlRate: 6M\n");
  183. return (WORD)RATE_24M;
  184. }
  185. /*
  186. * Description: Caculate TxRate and RsvTime fields for RSPINF in OFDM mode.
  187. *
  188. * Parameters:
  189. * In:
  190. * wRate - Tx Rate
  191. * byPktType - Tx Packet type
  192. * Out:
  193. * pbyTxRate - pointer to RSPINF TxRate field
  194. * pbyRsvTime - pointer to RSPINF RsvTime field
  195. *
  196. * Return Value: none
  197. *
  198. */
  199. void
  200. CARDvCaculateOFDMRParameter (
  201. WORD wRate,
  202. BYTE byBBType,
  203. PBYTE pbyTxRate,
  204. PBYTE pbyRsvTime
  205. )
  206. {
  207. switch (wRate) {
  208. case RATE_6M :
  209. if (byBBType == BB_TYPE_11A) {//5GHZ
  210. *pbyTxRate = 0x9B;
  211. *pbyRsvTime = 24;
  212. }
  213. else {
  214. *pbyTxRate = 0x8B;
  215. *pbyRsvTime = 30;
  216. }
  217. break;
  218. case RATE_9M :
  219. if (byBBType == BB_TYPE_11A) {//5GHZ
  220. *pbyTxRate = 0x9F;
  221. *pbyRsvTime = 16;
  222. }
  223. else {
  224. *pbyTxRate = 0x8F;
  225. *pbyRsvTime = 22;
  226. }
  227. break;
  228. case RATE_12M :
  229. if (byBBType == BB_TYPE_11A) {//5GHZ
  230. *pbyTxRate = 0x9A;
  231. *pbyRsvTime = 12;
  232. }
  233. else {
  234. *pbyTxRate = 0x8A;
  235. *pbyRsvTime = 18;
  236. }
  237. break;
  238. case RATE_18M :
  239. if (byBBType == BB_TYPE_11A) {//5GHZ
  240. *pbyTxRate = 0x9E;
  241. *pbyRsvTime = 8;
  242. }
  243. else {
  244. *pbyTxRate = 0x8E;
  245. *pbyRsvTime = 14;
  246. }
  247. break;
  248. case RATE_36M :
  249. if (byBBType == BB_TYPE_11A) {//5GHZ
  250. *pbyTxRate = 0x9D;
  251. *pbyRsvTime = 4;
  252. }
  253. else {
  254. *pbyTxRate = 0x8D;
  255. *pbyRsvTime = 10;
  256. }
  257. break;
  258. case RATE_48M :
  259. if (byBBType == BB_TYPE_11A) {//5GHZ
  260. *pbyTxRate = 0x98;
  261. *pbyRsvTime = 4;
  262. }
  263. else {
  264. *pbyTxRate = 0x88;
  265. *pbyRsvTime = 10;
  266. }
  267. break;
  268. case RATE_54M :
  269. if (byBBType == BB_TYPE_11A) {//5GHZ
  270. *pbyTxRate = 0x9C;
  271. *pbyRsvTime = 4;
  272. }
  273. else {
  274. *pbyTxRate = 0x8C;
  275. *pbyRsvTime = 10;
  276. }
  277. break;
  278. case RATE_24M :
  279. default :
  280. if (byBBType == BB_TYPE_11A) {//5GHZ
  281. *pbyTxRate = 0x99;
  282. *pbyRsvTime = 8;
  283. }
  284. else {
  285. *pbyTxRate = 0x89;
  286. *pbyRsvTime = 14;
  287. }
  288. break;
  289. }
  290. }
  291. /*
  292. * Description: Set RSPINF
  293. *
  294. * Parameters:
  295. * In:
  296. * pDevice - The adapter to be set
  297. * Out:
  298. * none
  299. *
  300. * Return Value: None.
  301. *
  302. */
  303. void CARDvSetRSPINF(void *pDeviceHandler, BYTE byBBType)
  304. {
  305. PSDevice pDevice = (PSDevice) pDeviceHandler;
  306. BYTE abyServ[4] = {0,0,0,0}; // For CCK
  307. BYTE abySignal[4] = {0,0,0,0};
  308. WORD awLen[4] = {0,0,0,0};
  309. BYTE abyTxRate[9] = {0,0,0,0,0,0,0,0,0}; // For OFDM
  310. BYTE abyRsvTime[9] = {0,0,0,0,0,0,0,0,0};
  311. BYTE abyData[34];
  312. int i;
  313. //RSPINF_b_1
  314. BBvCaculateParameter(pDevice,
  315. 14,
  316. swGetCCKControlRate(pDevice, RATE_1M),
  317. PK_TYPE_11B,
  318. &awLen[0],
  319. &abyServ[0],
  320. &abySignal[0]
  321. );
  322. ///RSPINF_b_2
  323. BBvCaculateParameter(pDevice,
  324. 14,
  325. swGetCCKControlRate(pDevice, RATE_2M),
  326. PK_TYPE_11B,
  327. &awLen[1],
  328. &abyServ[1],
  329. &abySignal[1]
  330. );
  331. //RSPINF_b_5
  332. BBvCaculateParameter(pDevice,
  333. 14,
  334. swGetCCKControlRate(pDevice, RATE_5M),
  335. PK_TYPE_11B,
  336. &awLen[2],
  337. &abyServ[2],
  338. &abySignal[2]
  339. );
  340. //RSPINF_b_11
  341. BBvCaculateParameter(pDevice,
  342. 14,
  343. swGetCCKControlRate(pDevice, RATE_11M),
  344. PK_TYPE_11B,
  345. &awLen[3],
  346. &abyServ[3],
  347. &abySignal[3]
  348. );
  349. //RSPINF_a_6
  350. CARDvCaculateOFDMRParameter (RATE_6M,
  351. byBBType,
  352. &abyTxRate[0],
  353. &abyRsvTime[0]);
  354. //RSPINF_a_9
  355. CARDvCaculateOFDMRParameter (RATE_9M,
  356. byBBType,
  357. &abyTxRate[1],
  358. &abyRsvTime[1]);
  359. //RSPINF_a_12
  360. CARDvCaculateOFDMRParameter (RATE_12M,
  361. byBBType,
  362. &abyTxRate[2],
  363. &abyRsvTime[2]);
  364. //RSPINF_a_18
  365. CARDvCaculateOFDMRParameter (RATE_18M,
  366. byBBType,
  367. &abyTxRate[3],
  368. &abyRsvTime[3]);
  369. //RSPINF_a_24
  370. CARDvCaculateOFDMRParameter (RATE_24M,
  371. byBBType,
  372. &abyTxRate[4],
  373. &abyRsvTime[4]);
  374. //RSPINF_a_36
  375. CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_36M),
  376. byBBType,
  377. &abyTxRate[5],
  378. &abyRsvTime[5]);
  379. //RSPINF_a_48
  380. CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_48M),
  381. byBBType,
  382. &abyTxRate[6],
  383. &abyRsvTime[6]);
  384. //RSPINF_a_54
  385. CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_54M),
  386. byBBType,
  387. &abyTxRate[7],
  388. &abyRsvTime[7]);
  389. //RSPINF_a_72
  390. CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_54M),
  391. byBBType,
  392. &abyTxRate[8],
  393. &abyRsvTime[8]);
  394. abyData[0] = (BYTE)(awLen[0]&0xFF);
  395. abyData[1] = (BYTE)(awLen[0]>>8);
  396. abyData[2] = abySignal[0];
  397. abyData[3] = abyServ[0];
  398. abyData[4] = (BYTE)(awLen[1]&0xFF);
  399. abyData[5] = (BYTE)(awLen[1]>>8);
  400. abyData[6] = abySignal[1];
  401. abyData[7] = abyServ[1];
  402. abyData[8] = (BYTE)(awLen[2]&0xFF);
  403. abyData[9] = (BYTE)(awLen[2]>>8);
  404. abyData[10] = abySignal[2];
  405. abyData[11] = abyServ[2];
  406. abyData[12] = (BYTE)(awLen[3]&0xFF);
  407. abyData[13] = (BYTE)(awLen[3]>>8);
  408. abyData[14] = abySignal[3];
  409. abyData[15] = abyServ[3];
  410. for (i = 0; i < 9; i++) {
  411. abyData[16+i*2] = abyTxRate[i];
  412. abyData[16+i*2+1] = abyRsvTime[i];
  413. }
  414. CONTROLnsRequestOut(pDevice,
  415. MESSAGE_TYPE_WRITE,
  416. MAC_REG_RSPINF_B_1,
  417. MESSAGE_REQUEST_MACREG,
  418. 34,
  419. &abyData[0]);
  420. }
  421. /*
  422. * Description: Update IFS
  423. *
  424. * Parameters:
  425. * In:
  426. * pDevice - The adapter to be set
  427. * Out:
  428. * none
  429. *
  430. * Return Value: None.
  431. *
  432. */
  433. void vUpdateIFS(void *pDeviceHandler)
  434. {
  435. PSDevice pDevice = (PSDevice) pDeviceHandler;
  436. //Set SIFS, DIFS, EIFS, SlotTime, CwMin
  437. BYTE byMaxMin = 0;
  438. BYTE byData[4];
  439. if (pDevice->byPacketType==PK_TYPE_11A) {//0000 0000 0000 0000,11a
  440. pDevice->uSlot = C_SLOT_SHORT;
  441. pDevice->uSIFS = C_SIFS_A;
  442. pDevice->uDIFS = C_SIFS_A + 2*C_SLOT_SHORT;
  443. pDevice->uCwMin = C_CWMIN_A;
  444. byMaxMin = 4;
  445. }
  446. else if (pDevice->byPacketType==PK_TYPE_11B) {//0000 0001 0000 0000,11b
  447. pDevice->uSlot = C_SLOT_LONG;
  448. pDevice->uSIFS = C_SIFS_BG;
  449. pDevice->uDIFS = C_SIFS_BG + 2*C_SLOT_LONG;
  450. pDevice->uCwMin = C_CWMIN_B;
  451. byMaxMin = 5;
  452. }
  453. else {// PK_TYPE_11GA & PK_TYPE_11GB
  454. BYTE byRate = 0;
  455. BOOL bOFDMRate = FALSE;
  456. unsigned int ii = 0;
  457. PWLAN_IE_SUPP_RATES pItemRates = NULL;
  458. pDevice->uSIFS = C_SIFS_BG;
  459. if (pDevice->bShortSlotTime) {
  460. pDevice->uSlot = C_SLOT_SHORT;
  461. } else {
  462. pDevice->uSlot = C_SLOT_LONG;
  463. }
  464. pDevice->uDIFS = C_SIFS_BG + 2*pDevice->uSlot;
  465. pItemRates = (PWLAN_IE_SUPP_RATES)pDevice->sMgmtObj.abyCurrSuppRates;
  466. for (ii = 0; ii < pItemRates->len; ii++) {
  467. byRate = (BYTE)(pItemRates->abyRates[ii]&0x7F);
  468. if (RATEwGetRateIdx(byRate) > RATE_11M) {
  469. bOFDMRate = TRUE;
  470. break;
  471. }
  472. }
  473. if (bOFDMRate == FALSE) {
  474. pItemRates = (PWLAN_IE_SUPP_RATES)pDevice->sMgmtObj.abyCurrExtSuppRates;
  475. for (ii = 0; ii < pItemRates->len; ii++) {
  476. byRate = (BYTE)(pItemRates->abyRates[ii]&0x7F);
  477. if (RATEwGetRateIdx(byRate) > RATE_11M) {
  478. bOFDMRate = TRUE;
  479. break;
  480. }
  481. }
  482. }
  483. if (bOFDMRate == TRUE) {
  484. pDevice->uCwMin = C_CWMIN_A;
  485. byMaxMin = 4;
  486. } else {
  487. pDevice->uCwMin = C_CWMIN_B;
  488. byMaxMin = 5;
  489. }
  490. }
  491. pDevice->uCwMax = C_CWMAX;
  492. pDevice->uEIFS = C_EIFS;
  493. byData[0] = (BYTE)pDevice->uSIFS;
  494. byData[1] = (BYTE)pDevice->uDIFS;
  495. byData[2] = (BYTE)pDevice->uEIFS;
  496. byData[3] = (BYTE)pDevice->uSlot;
  497. CONTROLnsRequestOut(pDevice,
  498. MESSAGE_TYPE_WRITE,
  499. MAC_REG_SIFS,
  500. MESSAGE_REQUEST_MACREG,
  501. 4,
  502. &byData[0]);
  503. byMaxMin |= 0xA0;//1010 1111,C_CWMAX = 1023
  504. CONTROLnsRequestOut(pDevice,
  505. MESSAGE_TYPE_WRITE,
  506. MAC_REG_CWMAXMIN0,
  507. MESSAGE_REQUEST_MACREG,
  508. 1,
  509. &byMaxMin);
  510. }
  511. void CARDvUpdateBasicTopRate(void *pDeviceHandler)
  512. {
  513. PSDevice pDevice = (PSDevice) pDeviceHandler;
  514. BYTE byTopOFDM = RATE_24M, byTopCCK = RATE_1M;
  515. BYTE ii;
  516. //Determines the highest basic rate.
  517. for (ii = RATE_54M; ii >= RATE_6M; ii --) {
  518. if ( (pDevice->wBasicRate) & ((WORD)(1<<ii)) ) {
  519. byTopOFDM = ii;
  520. break;
  521. }
  522. }
  523. pDevice->byTopOFDMBasicRate = byTopOFDM;
  524. for (ii = RATE_11M;; ii --) {
  525. if ( (pDevice->wBasicRate) & ((WORD)(1<<ii)) ) {
  526. byTopCCK = ii;
  527. break;
  528. }
  529. if (ii == RATE_1M)
  530. break;
  531. }
  532. pDevice->byTopCCKBasicRate = byTopCCK;
  533. }
  534. /*
  535. * Description: Set NIC Tx Basic Rate
  536. *
  537. * Parameters:
  538. * In:
  539. * pDevice - The adapter to be set
  540. * wBasicRate - Basic Rate to be set
  541. * Out:
  542. * none
  543. *
  544. * Return Value: TRUE if succeeded; FALSE if failed.
  545. *
  546. */
  547. BOOL CARDbAddBasicRate(void *pDeviceHandler, WORD wRateIdx)
  548. {
  549. PSDevice pDevice = (PSDevice) pDeviceHandler;
  550. WORD wRate = (WORD)(1<<wRateIdx);
  551. pDevice->wBasicRate |= wRate;
  552. //Determines the highest basic rate.
  553. CARDvUpdateBasicTopRate(pDevice);
  554. return(TRUE);
  555. }
  556. BOOL CARDbIsOFDMinBasicRate(void *pDeviceHandler)
  557. {
  558. PSDevice pDevice = (PSDevice) pDeviceHandler;
  559. int ii;
  560. for (ii = RATE_54M; ii >= RATE_6M; ii --) {
  561. if ((pDevice->wBasicRate) & ((WORD)(1<<ii)))
  562. return TRUE;
  563. }
  564. return FALSE;
  565. }
  566. BYTE CARDbyGetPktType(void *pDeviceHandler)
  567. {
  568. PSDevice pDevice = (PSDevice) pDeviceHandler;
  569. if (pDevice->byBBType == BB_TYPE_11A || pDevice->byBBType == BB_TYPE_11B) {
  570. return (BYTE)pDevice->byBBType;
  571. }
  572. else if (CARDbIsOFDMinBasicRate(pDevice)) {
  573. return PK_TYPE_11GA;
  574. }
  575. else {
  576. return PK_TYPE_11GB;
  577. }
  578. }
  579. /*
  580. * Description: Caculate TSF offset of two TSF input
  581. * Get TSF Offset from RxBCN's TSF and local TSF
  582. *
  583. * Parameters:
  584. * In:
  585. * pDevice - The adapter to be sync.
  586. * qwTSF1 - Rx BCN's TSF
  587. * qwTSF2 - Local TSF
  588. * Out:
  589. * none
  590. *
  591. * Return Value: TSF Offset value
  592. *
  593. */
  594. QWORD CARDqGetTSFOffset (BYTE byRxRate, QWORD qwTSF1, QWORD qwTSF2)
  595. {
  596. QWORD qwTSFOffset;
  597. WORD wRxBcnTSFOffst = 0;
  598. HIDWORD(qwTSFOffset) = 0;
  599. LODWORD(qwTSFOffset) = 0;
  600. wRxBcnTSFOffst = cwRXBCNTSFOff[byRxRate%MAX_RATE];
  601. (qwTSF2).u.dwLowDword += (DWORD)(wRxBcnTSFOffst);
  602. if ((qwTSF2).u.dwLowDword < (DWORD)(wRxBcnTSFOffst)) {
  603. (qwTSF2).u.dwHighDword++;
  604. }
  605. LODWORD(qwTSFOffset) = LODWORD(qwTSF1) - LODWORD(qwTSF2);
  606. if (LODWORD(qwTSF1) < LODWORD(qwTSF2)) {
  607. // if borrow needed
  608. HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2) - 1 ;
  609. }
  610. else {
  611. HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2);
  612. };
  613. return (qwTSFOffset);
  614. }
  615. /*
  616. * Description: Sync. TSF counter to BSS
  617. * Get TSF offset and write to HW
  618. *
  619. * Parameters:
  620. * In:
  621. * pDevice - The adapter to be sync.
  622. * qwBSSTimestamp - Rx BCN's TSF
  623. * qwLocalTSF - Local TSF
  624. * Out:
  625. * none
  626. *
  627. * Return Value: none
  628. *
  629. */
  630. void CARDvAdjustTSF(void *pDeviceHandler, BYTE byRxRate,
  631. QWORD qwBSSTimestamp, QWORD qwLocalTSF)
  632. {
  633. PSDevice pDevice = (PSDevice) pDeviceHandler;
  634. QWORD qwTSFOffset;
  635. DWORD dwTSFOffset1,dwTSFOffset2;
  636. BYTE pbyData[8];
  637. HIDWORD(qwTSFOffset) = 0;
  638. LODWORD(qwTSFOffset) = 0;
  639. qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp, qwLocalTSF);
  640. // adjust TSF
  641. // HW's TSF add TSF Offset reg
  642. dwTSFOffset1 = LODWORD(qwTSFOffset);
  643. dwTSFOffset2 = HIDWORD(qwTSFOffset);
  644. pbyData[0] = (BYTE)dwTSFOffset1;
  645. pbyData[1] = (BYTE)(dwTSFOffset1>>8);
  646. pbyData[2] = (BYTE)(dwTSFOffset1>>16);
  647. pbyData[3] = (BYTE)(dwTSFOffset1>>24);
  648. pbyData[4] = (BYTE)dwTSFOffset2;
  649. pbyData[5] = (BYTE)(dwTSFOffset2>>8);
  650. pbyData[6] = (BYTE)(dwTSFOffset2>>16);
  651. pbyData[7] = (BYTE)(dwTSFOffset2>>24);
  652. CONTROLnsRequestOut(pDevice,
  653. MESSAGE_TYPE_SET_TSFTBTT,
  654. MESSAGE_REQUEST_TSF,
  655. 0,
  656. 8,
  657. pbyData
  658. );
  659. }
  660. /*
  661. * Description: Read NIC TSF counter
  662. * Get local TSF counter
  663. *
  664. * Parameters:
  665. * In:
  666. * pDevice - The adapter to be read
  667. * Out:
  668. * qwCurrTSF - Current TSF counter
  669. *
  670. * Return Value: TRUE if success; otherwise FALSE
  671. *
  672. */
  673. BOOL CARDbGetCurrentTSF(void *pDeviceHandler, PQWORD pqwCurrTSF)
  674. {
  675. PSDevice pDevice = (PSDevice) pDeviceHandler;
  676. LODWORD(*pqwCurrTSF) = LODWORD(pDevice->qwCurrTSF);
  677. HIDWORD(*pqwCurrTSF) = HIDWORD(pDevice->qwCurrTSF);
  678. return(TRUE);
  679. }
  680. /*
  681. * Description: Clear NIC TSF counter
  682. * Clear local TSF counter
  683. *
  684. * Parameters:
  685. * In:
  686. * pDevice - The adapter to be read
  687. *
  688. * Return Value: TRUE if success; otherwise FALSE
  689. *
  690. */
  691. BOOL CARDbClearCurrentTSF(void *pDeviceHandler)
  692. {
  693. PSDevice pDevice = (PSDevice) pDeviceHandler;
  694. MACvRegBitsOn(pDevice,MAC_REG_TFTCTL,TFTCTL_TSFCNTRST);
  695. LODWORD(pDevice->qwCurrTSF) = 0;
  696. HIDWORD(pDevice->qwCurrTSF) = 0;
  697. return(TRUE);
  698. }
  699. /*
  700. * Description: Read NIC TSF counter
  701. * Get NEXTTBTT from adjusted TSF and Beacon Interval
  702. *
  703. * Parameters:
  704. * In:
  705. * qwTSF - Current TSF counter
  706. * wbeaconInterval - Beacon Interval
  707. * Out:
  708. * qwCurrTSF - Current TSF counter
  709. *
  710. * Return Value: TSF value of next Beacon
  711. *
  712. */
  713. QWORD CARDqGetNextTBTT (QWORD qwTSF, WORD wBeaconInterval)
  714. {
  715. unsigned int uLowNextTBTT;
  716. unsigned int uHighRemain, uLowRemain;
  717. unsigned int uBeaconInterval;
  718. uBeaconInterval = wBeaconInterval * 1024;
  719. // Next TBTT = ((local_current_TSF / beacon_interval) + 1 ) * beacon_interval
  720. uLowNextTBTT = (LODWORD(qwTSF) >> 10) << 10;
  721. uLowRemain = (uLowNextTBTT) % uBeaconInterval;
  722. uHighRemain = ((0x80000000 % uBeaconInterval)* 2 * HIDWORD(qwTSF))
  723. % uBeaconInterval;
  724. uLowRemain = (uHighRemain + uLowRemain) % uBeaconInterval;
  725. uLowRemain = uBeaconInterval - uLowRemain;
  726. // check if carry when add one beacon interval
  727. if ((~uLowNextTBTT) < uLowRemain)
  728. HIDWORD(qwTSF) ++ ;
  729. LODWORD(qwTSF) = uLowNextTBTT + uLowRemain;
  730. return (qwTSF);
  731. }
  732. /*
  733. * Description: Set NIC TSF counter for first Beacon time
  734. * Get NEXTTBTT from adjusted TSF and Beacon Interval
  735. *
  736. * Parameters:
  737. * In:
  738. * dwIoBase - IO Base
  739. * wBeaconInterval - Beacon Interval
  740. * Out:
  741. * none
  742. *
  743. * Return Value: none
  744. *
  745. */
  746. void CARDvSetFirstNextTBTT(void *pDeviceHandler, WORD wBeaconInterval)
  747. {
  748. PSDevice pDevice = (PSDevice) pDeviceHandler;
  749. QWORD qwNextTBTT;
  750. DWORD dwLoTBTT,dwHiTBTT;
  751. BYTE pbyData[8];
  752. HIDWORD(qwNextTBTT) = 0;
  753. LODWORD(qwNextTBTT) = 0;
  754. CARDbClearCurrentTSF(pDevice);
  755. //CARDbGetCurrentTSF(pDevice, &qwNextTBTT); //Get Local TSF counter
  756. qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval);
  757. // Set NextTBTT
  758. dwLoTBTT = LODWORD(qwNextTBTT);
  759. dwHiTBTT = HIDWORD(qwNextTBTT);
  760. pbyData[0] = (BYTE)dwLoTBTT;
  761. pbyData[1] = (BYTE)(dwLoTBTT>>8);
  762. pbyData[2] = (BYTE)(dwLoTBTT>>16);
  763. pbyData[3] = (BYTE)(dwLoTBTT>>24);
  764. pbyData[4] = (BYTE)dwHiTBTT;
  765. pbyData[5] = (BYTE)(dwHiTBTT>>8);
  766. pbyData[6] = (BYTE)(dwHiTBTT>>16);
  767. pbyData[7] = (BYTE)(dwHiTBTT>>24);
  768. CONTROLnsRequestOut(pDevice,
  769. MESSAGE_TYPE_SET_TSFTBTT,
  770. MESSAGE_REQUEST_TBTT,
  771. 0,
  772. 8,
  773. pbyData
  774. );
  775. return;
  776. }
  777. /*
  778. * Description: Sync NIC TSF counter for Beacon time
  779. * Get NEXTTBTT and write to HW
  780. *
  781. * Parameters:
  782. * In:
  783. * pDevice - The adapter to be set
  784. * qwTSF - Current TSF counter
  785. * wBeaconInterval - Beacon Interval
  786. * Out:
  787. * none
  788. *
  789. * Return Value: none
  790. *
  791. */
  792. void CARDvUpdateNextTBTT(void *pDeviceHandler, QWORD qwTSF,
  793. WORD wBeaconInterval)
  794. {
  795. PSDevice pDevice = (PSDevice) pDeviceHandler;
  796. DWORD dwLoTBTT,dwHiTBTT;
  797. BYTE pbyData[8];
  798. qwTSF = CARDqGetNextTBTT(qwTSF, wBeaconInterval);
  799. // Set NextTBTT
  800. dwLoTBTT = LODWORD(qwTSF);
  801. dwHiTBTT = HIDWORD(qwTSF);
  802. pbyData[0] = (BYTE)dwLoTBTT;
  803. pbyData[1] = (BYTE)(dwLoTBTT>>8);
  804. pbyData[2] = (BYTE)(dwLoTBTT>>16);
  805. pbyData[3] = (BYTE)(dwLoTBTT>>24);
  806. pbyData[4] = (BYTE)dwHiTBTT;
  807. pbyData[5] = (BYTE)(dwHiTBTT>>8);
  808. pbyData[6] = (BYTE)(dwHiTBTT>>16);
  809. pbyData[7] = (BYTE)(dwHiTBTT>>24);
  810. CONTROLnsRequestOut(pDevice,
  811. MESSAGE_TYPE_SET_TSFTBTT,
  812. MESSAGE_REQUEST_TBTT,
  813. 0,
  814. 8,
  815. pbyData
  816. );
  817. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Card:Update Next TBTT[%8xh:%8xh] \n",(int)HIDWORD(qwTSF), (int)LODWORD(qwTSF));
  818. return;
  819. }
  820. /*
  821. * Description: Turn off Radio power
  822. *
  823. * Parameters:
  824. * In:
  825. * pDevice - The adapter to be turned off
  826. * Out:
  827. * none
  828. *
  829. * Return Value: TRUE if success; otherwise FALSE
  830. *
  831. */
  832. BOOL CARDbRadioPowerOff(void *pDeviceHandler)
  833. {
  834. PSDevice pDevice = (PSDevice) pDeviceHandler;
  835. BOOL bResult = TRUE;
  836. //if (pDevice->bRadioOff == TRUE)
  837. // return TRUE;
  838. pDevice->bRadioOff = TRUE;
  839. switch (pDevice->byRFType) {
  840. case RF_AL2230:
  841. case RF_AL2230S:
  842. case RF_AIROHA7230:
  843. case RF_VT3226: //RobertYu:20051111
  844. case RF_VT3226D0:
  845. case RF_VT3342A0: //RobertYu:20060609
  846. MACvRegBitsOff(pDevice, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPE2 | SOFTPWRCTL_SWPE3));
  847. break;
  848. }
  849. MACvRegBitsOff(pDevice, MAC_REG_HOSTCR, HOSTCR_RXON);
  850. BBvSetDeepSleep(pDevice);
  851. return bResult;
  852. }
  853. /*
  854. * Description: Turn on Radio power
  855. *
  856. * Parameters:
  857. * In:
  858. * pDevice - The adapter to be turned on
  859. * Out:
  860. * none
  861. *
  862. * Return Value: TRUE if success; otherwise FALSE
  863. *
  864. */
  865. BOOL CARDbRadioPowerOn(void *pDeviceHandler)
  866. {
  867. PSDevice pDevice = (PSDevice) pDeviceHandler;
  868. BOOL bResult = TRUE;
  869. if ((pDevice->bHWRadioOff == TRUE) || (pDevice->bRadioControlOff == TRUE)) {
  870. return FALSE;
  871. }
  872. //if (pDevice->bRadioOff == FALSE)
  873. // return TRUE;
  874. pDevice->bRadioOff = FALSE;
  875. BBvExitDeepSleep(pDevice);
  876. MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_RXON);
  877. switch (pDevice->byRFType) {
  878. case RF_AL2230:
  879. case RF_AL2230S:
  880. case RF_AIROHA7230:
  881. case RF_VT3226: //RobertYu:20051111
  882. case RF_VT3226D0:
  883. case RF_VT3342A0: //RobertYu:20060609
  884. MACvRegBitsOn(pDevice, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPE2 | SOFTPWRCTL_SWPE3));
  885. break;
  886. }
  887. return bResult;
  888. }
  889. void CARDvSetBSSMode(void *pDeviceHandler)
  890. {
  891. PSDevice pDevice = (PSDevice) pDeviceHandler;
  892. // Set BB and packet type at the same time.//{{RobertYu:20050222, AL7230 have two TX PA output, only connet to b/g now
  893. // so in 11a mode need to set the MAC Reg0x4C to 11b/g mode to turn on PA
  894. if( (pDevice->byRFType == RF_AIROHA7230 ) && (pDevice->byBBType == BB_TYPE_11A) )
  895. {
  896. MACvSetBBType(pDevice, BB_TYPE_11G);
  897. }
  898. else
  899. {
  900. MACvSetBBType(pDevice, pDevice->byBBType);
  901. }
  902. pDevice->byPacketType = CARDbyGetPktType(pDevice);
  903. if (pDevice->byBBType == BB_TYPE_11A) {
  904. ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x88, 0x03);
  905. } else if (pDevice->byBBType == BB_TYPE_11B) {
  906. ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x88, 0x02);
  907. } else if (pDevice->byBBType == BB_TYPE_11G) {
  908. ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x88, 0x08);
  909. }
  910. vUpdateIFS(pDevice);
  911. CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType);
  912. if ( pDevice->byBBType == BB_TYPE_11A ) {
  913. //request by Jack 2005-04-26
  914. if (pDevice->byRFType == RF_AIROHA7230) {
  915. pDevice->abyBBVGA[0] = 0x20;
  916. ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xE7, pDevice->abyBBVGA[0]);
  917. }
  918. pDevice->abyBBVGA[2] = 0x10;
  919. pDevice->abyBBVGA[3] = 0x10;
  920. } else {
  921. //request by Jack 2005-04-26
  922. if (pDevice->byRFType == RF_AIROHA7230) {
  923. pDevice->abyBBVGA[0] = 0x1C;
  924. ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xE7, pDevice->abyBBVGA[0]);
  925. }
  926. pDevice->abyBBVGA[2] = 0x0;
  927. pDevice->abyBBVGA[3] = 0x0;
  928. }
  929. }
  930. /*
  931. *
  932. * Description:
  933. * Do Channel Switch defined in 802.11h
  934. *
  935. * Parameters:
  936. * In:
  937. * hDeviceContext - device structure point
  938. * Out:
  939. * none
  940. *
  941. * Return Value: none.
  942. *
  943. -*/
  944. BOOL
  945. CARDbChannelSwitch (
  946. void *pDeviceHandler,
  947. BYTE byMode,
  948. BYTE byNewChannel,
  949. BYTE byCount
  950. )
  951. {
  952. PSDevice pDevice = (PSDevice) pDeviceHandler;
  953. BOOL bResult = TRUE;
  954. if (byCount == 0) {
  955. pDevice->sMgmtObj.uCurrChannel = byNewChannel;
  956. bResult = CARDbSetMediaChannel(pDevice, byNewChannel);
  957. return bResult;
  958. }
  959. pDevice->byChannelSwitchCount = byCount;
  960. pDevice->byNewChannel = byNewChannel;
  961. pDevice->bChannelSwitch = TRUE;
  962. if (byMode == 1) {
  963. //bResult=CARDbStopTxPacket(pDevice, PKT_TYPE_802_11_ALL);
  964. pDevice->bStopDataPkt = TRUE;
  965. }
  966. return bResult;
  967. }