card.c 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
  4. * All rights reserved.
  5. *
  6. * File: card.c
  7. * Purpose: Provide functions to setup NIC operation mode
  8. * Functions:
  9. * s_vSafeResetTx - Rest Tx
  10. * CARDvSetRSPINF - Set RSPINF
  11. * CARDvUpdateBasicTopRate - Update BasicTopRate
  12. * CARDbAddBasicRate - Add to BasicRateSet
  13. * CARDbIsOFDMinBasicRate - Check if any OFDM rate is in BasicRateSet
  14. * CARDvSetLoopbackMode - Set Loopback mode
  15. * CARDbSoftwareReset - Sortware reset NIC
  16. * CARDqGetTSFOffset - Calculate TSFOffset
  17. * CARDbGetCurrentTSF - Read Current NIC TSF counter
  18. * CARDqGetNextTBTT - Calculate Next Beacon TSF counter
  19. * CARDvSetFirstNextTBTT - Set NIC Beacon time
  20. * CARDvUpdateNextTBTT - Sync. NIC Beacon time
  21. * CARDbRadioPowerOff - Turn Off NIC Radio Power
  22. * CARDbRadioPowerOn - Turn On NIC Radio Power
  23. *
  24. * Revision History:
  25. * 06-10-2003 Bryan YC Fan: Re-write codes to support VT3253 spec.
  26. * 08-26-2003 Kyle Hsu: Modify the defination type of iobase.
  27. * 09-01-2003 Bryan YC Fan: Add vUpdateIFS().
  28. *
  29. */
  30. #include "tmacro.h"
  31. #include "card.h"
  32. #include "baseband.h"
  33. #include "mac.h"
  34. #include "desc.h"
  35. #include "rf.h"
  36. #include "power.h"
  37. /*--------------------- Static Definitions -------------------------*/
  38. #define C_SIFS_A 16 /* micro sec. */
  39. #define C_SIFS_BG 10
  40. #define C_EIFS 80 /* micro sec. */
  41. #define C_SLOT_SHORT 9 /* micro sec. */
  42. #define C_SLOT_LONG 20
  43. #define C_CWMIN_A 15 /* slot time */
  44. #define C_CWMIN_B 31
  45. #define C_CWMAX 1023 /* slot time */
  46. #define WAIT_BEACON_TX_DOWN_TMO 3 /* Times */
  47. /*--------------------- Static Variables --------------------------*/
  48. static const unsigned short cwRXBCNTSFOff[MAX_RATE] = {
  49. 17, 17, 17, 17, 34, 23, 17, 11, 8, 5, 4, 3};
  50. /*--------------------- Static Functions --------------------------*/
  51. static
  52. void
  53. s_vCalculateOFDMRParameter(
  54. unsigned char byRate,
  55. u8 bb_type,
  56. unsigned char *pbyTxRate,
  57. unsigned char *pbyRsvTime
  58. );
  59. /*--------------------- Export Functions --------------------------*/
  60. /*
  61. * Description: Calculate TxRate and RsvTime fields for RSPINF in OFDM mode.
  62. *
  63. * Parameters:
  64. * In:
  65. * wRate - Tx Rate
  66. * byPktType - Tx Packet type
  67. * Out:
  68. * pbyTxRate - pointer to RSPINF TxRate field
  69. * pbyRsvTime - pointer to RSPINF RsvTime field
  70. *
  71. * Return Value: none
  72. */
  73. static
  74. void
  75. s_vCalculateOFDMRParameter(
  76. unsigned char byRate,
  77. u8 bb_type,
  78. unsigned char *pbyTxRate,
  79. unsigned char *pbyRsvTime
  80. )
  81. {
  82. switch (byRate) {
  83. case RATE_6M:
  84. if (bb_type == BB_TYPE_11A) { /* 5GHZ */
  85. *pbyTxRate = 0x9B;
  86. *pbyRsvTime = 44;
  87. } else {
  88. *pbyTxRate = 0x8B;
  89. *pbyRsvTime = 50;
  90. }
  91. break;
  92. case RATE_9M:
  93. if (bb_type == BB_TYPE_11A) { /* 5GHZ */
  94. *pbyTxRate = 0x9F;
  95. *pbyRsvTime = 36;
  96. } else {
  97. *pbyTxRate = 0x8F;
  98. *pbyRsvTime = 42;
  99. }
  100. break;
  101. case RATE_12M:
  102. if (bb_type == BB_TYPE_11A) { /* 5GHZ */
  103. *pbyTxRate = 0x9A;
  104. *pbyRsvTime = 32;
  105. } else {
  106. *pbyTxRate = 0x8A;
  107. *pbyRsvTime = 38;
  108. }
  109. break;
  110. case RATE_18M:
  111. if (bb_type == BB_TYPE_11A) { /* 5GHZ */
  112. *pbyTxRate = 0x9E;
  113. *pbyRsvTime = 28;
  114. } else {
  115. *pbyTxRate = 0x8E;
  116. *pbyRsvTime = 34;
  117. }
  118. break;
  119. case RATE_36M:
  120. if (bb_type == BB_TYPE_11A) { /* 5GHZ */
  121. *pbyTxRate = 0x9D;
  122. *pbyRsvTime = 24;
  123. } else {
  124. *pbyTxRate = 0x8D;
  125. *pbyRsvTime = 30;
  126. }
  127. break;
  128. case RATE_48M:
  129. if (bb_type == BB_TYPE_11A) { /* 5GHZ */
  130. *pbyTxRate = 0x98;
  131. *pbyRsvTime = 24;
  132. } else {
  133. *pbyTxRate = 0x88;
  134. *pbyRsvTime = 30;
  135. }
  136. break;
  137. case RATE_54M:
  138. if (bb_type == BB_TYPE_11A) { /* 5GHZ */
  139. *pbyTxRate = 0x9C;
  140. *pbyRsvTime = 24;
  141. } else {
  142. *pbyTxRate = 0x8C;
  143. *pbyRsvTime = 30;
  144. }
  145. break;
  146. case RATE_24M:
  147. default:
  148. if (bb_type == BB_TYPE_11A) { /* 5GHZ */
  149. *pbyTxRate = 0x99;
  150. *pbyRsvTime = 28;
  151. } else {
  152. *pbyTxRate = 0x89;
  153. *pbyRsvTime = 34;
  154. }
  155. break;
  156. }
  157. }
  158. /*--------------------- Export Functions --------------------------*/
  159. /*
  160. * Description: Update IFS
  161. *
  162. * Parameters:
  163. * In:
  164. * priv - The adapter to be set
  165. * Out:
  166. * none
  167. *
  168. * Return Value: None.
  169. */
  170. bool CARDbSetPhyParameter(struct vnt_private *priv, u8 bb_type)
  171. {
  172. unsigned char byCWMaxMin = 0;
  173. unsigned char bySlot = 0;
  174. unsigned char bySIFS = 0;
  175. unsigned char byDIFS = 0;
  176. unsigned char byData;
  177. int i;
  178. /* Set SIFS, DIFS, EIFS, SlotTime, CwMin */
  179. if (bb_type == BB_TYPE_11A) {
  180. if (priv->byRFType == RF_AIROHA7230) {
  181. /* AL7230 use single PAPE and connect to PAPE_2.4G */
  182. MACvSetBBType(priv->PortOffset, BB_TYPE_11G);
  183. priv->abyBBVGA[0] = 0x20;
  184. priv->abyBBVGA[2] = 0x10;
  185. priv->abyBBVGA[3] = 0x10;
  186. BBbReadEmbedded(priv, 0xE7, &byData);
  187. if (byData == 0x1C)
  188. BBbWriteEmbedded(priv, 0xE7, priv->abyBBVGA[0]);
  189. } else if (priv->byRFType == RF_UW2452) {
  190. MACvSetBBType(priv->PortOffset, BB_TYPE_11A);
  191. priv->abyBBVGA[0] = 0x18;
  192. BBbReadEmbedded(priv, 0xE7, &byData);
  193. if (byData == 0x14) {
  194. BBbWriteEmbedded(priv, 0xE7, priv->abyBBVGA[0]);
  195. BBbWriteEmbedded(priv, 0xE1, 0x57);
  196. }
  197. } else {
  198. MACvSetBBType(priv->PortOffset, BB_TYPE_11A);
  199. }
  200. BBbWriteEmbedded(priv, 0x88, 0x03);
  201. bySlot = C_SLOT_SHORT;
  202. bySIFS = C_SIFS_A;
  203. byDIFS = C_SIFS_A + 2 * C_SLOT_SHORT;
  204. byCWMaxMin = 0xA4;
  205. } else if (bb_type == BB_TYPE_11B) {
  206. MACvSetBBType(priv->PortOffset, BB_TYPE_11B);
  207. if (priv->byRFType == RF_AIROHA7230) {
  208. priv->abyBBVGA[0] = 0x1C;
  209. priv->abyBBVGA[2] = 0x00;
  210. priv->abyBBVGA[3] = 0x00;
  211. BBbReadEmbedded(priv, 0xE7, &byData);
  212. if (byData == 0x20)
  213. BBbWriteEmbedded(priv, 0xE7, priv->abyBBVGA[0]);
  214. } else if (priv->byRFType == RF_UW2452) {
  215. priv->abyBBVGA[0] = 0x14;
  216. BBbReadEmbedded(priv, 0xE7, &byData);
  217. if (byData == 0x18) {
  218. BBbWriteEmbedded(priv, 0xE7, priv->abyBBVGA[0]);
  219. BBbWriteEmbedded(priv, 0xE1, 0xD3);
  220. }
  221. }
  222. BBbWriteEmbedded(priv, 0x88, 0x02);
  223. bySlot = C_SLOT_LONG;
  224. bySIFS = C_SIFS_BG;
  225. byDIFS = C_SIFS_BG + 2 * C_SLOT_LONG;
  226. byCWMaxMin = 0xA5;
  227. } else { /* PK_TYPE_11GA & PK_TYPE_11GB */
  228. MACvSetBBType(priv->PortOffset, BB_TYPE_11G);
  229. if (priv->byRFType == RF_AIROHA7230) {
  230. priv->abyBBVGA[0] = 0x1C;
  231. priv->abyBBVGA[2] = 0x00;
  232. priv->abyBBVGA[3] = 0x00;
  233. BBbReadEmbedded(priv, 0xE7, &byData);
  234. if (byData == 0x20)
  235. BBbWriteEmbedded(priv, 0xE7, priv->abyBBVGA[0]);
  236. } else if (priv->byRFType == RF_UW2452) {
  237. priv->abyBBVGA[0] = 0x14;
  238. BBbReadEmbedded(priv, 0xE7, &byData);
  239. if (byData == 0x18) {
  240. BBbWriteEmbedded(priv, 0xE7, priv->abyBBVGA[0]);
  241. BBbWriteEmbedded(priv, 0xE1, 0xD3);
  242. }
  243. }
  244. BBbWriteEmbedded(priv, 0x88, 0x08);
  245. bySIFS = C_SIFS_BG;
  246. if (priv->bShortSlotTime) {
  247. bySlot = C_SLOT_SHORT;
  248. byDIFS = C_SIFS_BG + 2 * C_SLOT_SHORT;
  249. } else {
  250. bySlot = C_SLOT_LONG;
  251. byDIFS = C_SIFS_BG + 2 * C_SLOT_LONG;
  252. }
  253. byCWMaxMin = 0xa4;
  254. for (i = RATE_54M; i >= RATE_6M; i--) {
  255. if (priv->basic_rates & ((u32)(0x1 << i))) {
  256. byCWMaxMin |= 0x1;
  257. break;
  258. }
  259. }
  260. }
  261. if (priv->byRFType == RF_RFMD2959) {
  262. /*
  263. * bcs TX_PE will reserve 3 us hardware's processing
  264. * time here is 2 us.
  265. */
  266. bySIFS -= 3;
  267. byDIFS -= 3;
  268. /*
  269. * TX_PE will reserve 3 us for MAX2829 A mode only, it is for
  270. * better TX throughput; MAC will need 2 us to process, so the
  271. * SIFS, DIFS can be shorter by 2 us.
  272. */
  273. }
  274. if (priv->bySIFS != bySIFS) {
  275. priv->bySIFS = bySIFS;
  276. VNSvOutPortB(priv->PortOffset + MAC_REG_SIFS, priv->bySIFS);
  277. }
  278. if (priv->byDIFS != byDIFS) {
  279. priv->byDIFS = byDIFS;
  280. VNSvOutPortB(priv->PortOffset + MAC_REG_DIFS, priv->byDIFS);
  281. }
  282. if (priv->byEIFS != C_EIFS) {
  283. priv->byEIFS = C_EIFS;
  284. VNSvOutPortB(priv->PortOffset + MAC_REG_EIFS, priv->byEIFS);
  285. }
  286. if (priv->bySlot != bySlot) {
  287. priv->bySlot = bySlot;
  288. VNSvOutPortB(priv->PortOffset + MAC_REG_SLOT, priv->bySlot);
  289. BBvSetShortSlotTime(priv);
  290. }
  291. if (priv->byCWMaxMin != byCWMaxMin) {
  292. priv->byCWMaxMin = byCWMaxMin;
  293. VNSvOutPortB(priv->PortOffset + MAC_REG_CWMAXMIN0,
  294. priv->byCWMaxMin);
  295. }
  296. priv->byPacketType = CARDbyGetPktType(priv);
  297. CARDvSetRSPINF(priv, bb_type);
  298. return true;
  299. }
  300. /*
  301. * Description: Sync. TSF counter to BSS
  302. * Get TSF offset and write to HW
  303. *
  304. * Parameters:
  305. * In:
  306. * priv - The adapter to be sync.
  307. * byRxRate - data rate of receive beacon
  308. * qwBSSTimestamp - Rx BCN's TSF
  309. * qwLocalTSF - Local TSF
  310. * Out:
  311. * none
  312. *
  313. * Return Value: none
  314. */
  315. bool CARDbUpdateTSF(struct vnt_private *priv, unsigned char byRxRate,
  316. u64 qwBSSTimestamp)
  317. {
  318. u64 local_tsf;
  319. u64 qwTSFOffset = 0;
  320. CARDbGetCurrentTSF(priv, &local_tsf);
  321. if (qwBSSTimestamp != local_tsf) {
  322. qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp,
  323. local_tsf);
  324. /* adjust TSF, HW's TSF add TSF Offset reg */
  325. VNSvOutPortD(priv->PortOffset + MAC_REG_TSFOFST,
  326. (u32)qwTSFOffset);
  327. VNSvOutPortD(priv->PortOffset + MAC_REG_TSFOFST + 4,
  328. (u32)(qwTSFOffset >> 32));
  329. MACvRegBitsOn(priv->PortOffset, MAC_REG_TFTCTL,
  330. TFTCTL_TSFSYNCEN);
  331. }
  332. return true;
  333. }
  334. /*
  335. * Description: Set NIC TSF counter for first Beacon time
  336. * Get NEXTTBTT from adjusted TSF and Beacon Interval
  337. *
  338. * Parameters:
  339. * In:
  340. * priv - The adapter to be set.
  341. * wBeaconInterval - Beacon Interval
  342. * Out:
  343. * none
  344. *
  345. * Return Value: true if succeed; otherwise false
  346. */
  347. bool CARDbSetBeaconPeriod(struct vnt_private *priv,
  348. unsigned short wBeaconInterval)
  349. {
  350. u64 qwNextTBTT = 0;
  351. CARDbGetCurrentTSF(priv, &qwNextTBTT); /* Get Local TSF counter */
  352. qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval);
  353. /* set HW beacon interval */
  354. VNSvOutPortW(priv->PortOffset + MAC_REG_BI, wBeaconInterval);
  355. priv->wBeaconInterval = wBeaconInterval;
  356. /* Set NextTBTT */
  357. VNSvOutPortD(priv->PortOffset + MAC_REG_NEXTTBTT, (u32)qwNextTBTT);
  358. VNSvOutPortD(priv->PortOffset + MAC_REG_NEXTTBTT + 4,
  359. (u32)(qwNextTBTT >> 32));
  360. MACvRegBitsOn(priv->PortOffset, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN);
  361. return true;
  362. }
  363. /*
  364. * Description: Turn off Radio power
  365. *
  366. * Parameters:
  367. * In:
  368. * priv - The adapter to be turned off
  369. * Out:
  370. * none
  371. *
  372. * Return Value: true if success; otherwise false
  373. */
  374. bool CARDbRadioPowerOff(struct vnt_private *priv)
  375. {
  376. bool bResult = true;
  377. if (priv->bRadioOff)
  378. return true;
  379. switch (priv->byRFType) {
  380. case RF_RFMD2959:
  381. MACvWordRegBitsOff(priv->PortOffset, MAC_REG_SOFTPWRCTL,
  382. SOFTPWRCTL_TXPEINV);
  383. MACvWordRegBitsOn(priv->PortOffset, MAC_REG_SOFTPWRCTL,
  384. SOFTPWRCTL_SWPE1);
  385. break;
  386. case RF_AIROHA:
  387. case RF_AL2230S:
  388. case RF_AIROHA7230:
  389. MACvWordRegBitsOff(priv->PortOffset, MAC_REG_SOFTPWRCTL,
  390. SOFTPWRCTL_SWPE2);
  391. MACvWordRegBitsOff(priv->PortOffset, MAC_REG_SOFTPWRCTL,
  392. SOFTPWRCTL_SWPE3);
  393. break;
  394. }
  395. MACvRegBitsOff(priv->PortOffset, MAC_REG_HOSTCR, HOSTCR_RXON);
  396. BBvSetDeepSleep(priv, priv->byLocalID);
  397. priv->bRadioOff = true;
  398. pr_debug("chester power off\n");
  399. MACvRegBitsOn(priv->PortOffset, MAC_REG_GPIOCTL0,
  400. LED_ACTSET); /* LED issue */
  401. return bResult;
  402. }
  403. /*
  404. * Description: Turn on Radio power
  405. *
  406. * Parameters:
  407. * In:
  408. * priv - The adapter to be turned on
  409. * Out:
  410. * none
  411. *
  412. * Return Value: true if success; otherwise false
  413. */
  414. bool CARDbRadioPowerOn(struct vnt_private *priv)
  415. {
  416. bool bResult = true;
  417. pr_debug("chester power on\n");
  418. if (priv->bRadioControlOff) {
  419. if (priv->bHWRadioOff)
  420. pr_debug("chester bHWRadioOff\n");
  421. if (priv->bRadioControlOff)
  422. pr_debug("chester bRadioControlOff\n");
  423. return false; }
  424. if (!priv->bRadioOff) {
  425. pr_debug("chester pbRadioOff\n");
  426. return true; }
  427. BBvExitDeepSleep(priv, priv->byLocalID);
  428. MACvRegBitsOn(priv->PortOffset, MAC_REG_HOSTCR, HOSTCR_RXON);
  429. switch (priv->byRFType) {
  430. case RF_RFMD2959:
  431. MACvWordRegBitsOn(priv->PortOffset, MAC_REG_SOFTPWRCTL,
  432. SOFTPWRCTL_TXPEINV);
  433. MACvWordRegBitsOff(priv->PortOffset, MAC_REG_SOFTPWRCTL,
  434. SOFTPWRCTL_SWPE1);
  435. break;
  436. case RF_AIROHA:
  437. case RF_AL2230S:
  438. case RF_AIROHA7230:
  439. MACvWordRegBitsOn(priv->PortOffset, MAC_REG_SOFTPWRCTL,
  440. (SOFTPWRCTL_SWPE2 | SOFTPWRCTL_SWPE3));
  441. break;
  442. }
  443. priv->bRadioOff = false;
  444. pr_debug("chester power on\n");
  445. MACvRegBitsOff(priv->PortOffset, MAC_REG_GPIOCTL0,
  446. LED_ACTSET); /* LED issue */
  447. return bResult;
  448. }
  449. void
  450. CARDvSafeResetTx(
  451. struct vnt_private *priv
  452. )
  453. {
  454. unsigned int uu;
  455. struct vnt_tx_desc *pCurrTD;
  456. /* initialize TD index */
  457. priv->apTailTD[0] = &priv->apTD0Rings[0];
  458. priv->apCurrTD[0] = &priv->apTD0Rings[0];
  459. priv->apTailTD[1] = &priv->apTD1Rings[0];
  460. priv->apCurrTD[1] = &priv->apTD1Rings[0];
  461. for (uu = 0; uu < TYPE_MAXTD; uu++)
  462. priv->iTDUsed[uu] = 0;
  463. for (uu = 0; uu < priv->opts.tx_descs[0]; uu++) {
  464. pCurrTD = &priv->apTD0Rings[uu];
  465. pCurrTD->td0.owner = OWNED_BY_HOST;
  466. /* init all Tx Packet pointer to NULL */
  467. }
  468. for (uu = 0; uu < priv->opts.tx_descs[1]; uu++) {
  469. pCurrTD = &priv->apTD1Rings[uu];
  470. pCurrTD->td0.owner = OWNED_BY_HOST;
  471. /* init all Tx Packet pointer to NULL */
  472. }
  473. /* set MAC TD pointer */
  474. MACvSetCurrTXDescAddr(TYPE_TXDMA0, priv, priv->td0_pool_dma);
  475. MACvSetCurrTXDescAddr(TYPE_AC0DMA, priv, priv->td1_pool_dma);
  476. /* set MAC Beacon TX pointer */
  477. MACvSetCurrBCNTxDescAddr(priv->PortOffset,
  478. (priv->tx_beacon_dma));
  479. }
  480. /*
  481. * Description:
  482. * Reset Rx
  483. *
  484. * Parameters:
  485. * In:
  486. * priv - Pointer to the adapter
  487. * Out:
  488. * none
  489. *
  490. * Return Value: none
  491. */
  492. void CARDvSafeResetRx(struct vnt_private *priv)
  493. {
  494. unsigned int uu;
  495. struct vnt_rx_desc *pDesc;
  496. /* initialize RD index */
  497. priv->pCurrRD[0] = &priv->aRD0Ring[0];
  498. priv->pCurrRD[1] = &priv->aRD1Ring[0];
  499. /* init state, all RD is chip's */
  500. for (uu = 0; uu < priv->opts.rx_descs0; uu++) {
  501. pDesc = &priv->aRD0Ring[uu];
  502. pDesc->rd0.res_count = cpu_to_le16(priv->rx_buf_sz);
  503. pDesc->rd0.owner = OWNED_BY_NIC;
  504. pDesc->rd1.req_count = cpu_to_le16(priv->rx_buf_sz);
  505. }
  506. /* init state, all RD is chip's */
  507. for (uu = 0; uu < priv->opts.rx_descs1; uu++) {
  508. pDesc = &priv->aRD1Ring[uu];
  509. pDesc->rd0.res_count = cpu_to_le16(priv->rx_buf_sz);
  510. pDesc->rd0.owner = OWNED_BY_NIC;
  511. pDesc->rd1.req_count = cpu_to_le16(priv->rx_buf_sz);
  512. }
  513. /* set perPkt mode */
  514. MACvRx0PerPktMode(priv->PortOffset);
  515. MACvRx1PerPktMode(priv->PortOffset);
  516. /* set MAC RD pointer */
  517. MACvSetCurrRx0DescAddr(priv, priv->rd0_pool_dma);
  518. MACvSetCurrRx1DescAddr(priv, priv->rd1_pool_dma);
  519. }
  520. /*
  521. * Description: Get response Control frame rate in CCK mode
  522. *
  523. * Parameters:
  524. * In:
  525. * priv - The adapter to be set
  526. * wRateIdx - Receiving data rate
  527. * Out:
  528. * none
  529. *
  530. * Return Value: response Control frame rate
  531. */
  532. static unsigned short CARDwGetCCKControlRate(struct vnt_private *priv,
  533. unsigned short wRateIdx)
  534. {
  535. unsigned int ui = (unsigned int)wRateIdx;
  536. while (ui > RATE_1M) {
  537. if (priv->basic_rates & ((u32)0x1 << ui))
  538. return (unsigned short)ui;
  539. ui--;
  540. }
  541. return (unsigned short)RATE_1M;
  542. }
  543. /*
  544. * Description: Get response Control frame rate in OFDM mode
  545. *
  546. * Parameters:
  547. * In:
  548. * priv - The adapter to be set
  549. * wRateIdx - Receiving data rate
  550. * Out:
  551. * none
  552. *
  553. * Return Value: response Control frame rate
  554. */
  555. static unsigned short CARDwGetOFDMControlRate(struct vnt_private *priv,
  556. unsigned short wRateIdx)
  557. {
  558. unsigned int ui = (unsigned int)wRateIdx;
  559. pr_debug("BASIC RATE: %X\n", priv->basic_rates);
  560. if (!CARDbIsOFDMinBasicRate((void *)priv)) {
  561. pr_debug("%s:(NO OFDM) %d\n", __func__, wRateIdx);
  562. if (wRateIdx > RATE_24M)
  563. wRateIdx = RATE_24M;
  564. return wRateIdx;
  565. }
  566. while (ui > RATE_11M) {
  567. if (priv->basic_rates & ((u32)0x1 << ui)) {
  568. pr_debug("%s : %d\n", __func__, ui);
  569. return (unsigned short)ui;
  570. }
  571. ui--;
  572. }
  573. pr_debug("%s: 6M\n", __func__);
  574. return (unsigned short)RATE_24M;
  575. }
  576. /*
  577. * Description: Set RSPINF
  578. *
  579. * Parameters:
  580. * In:
  581. * priv - The adapter to be set
  582. * Out:
  583. * none
  584. *
  585. * Return Value: None.
  586. */
  587. void CARDvSetRSPINF(struct vnt_private *priv, u8 bb_type)
  588. {
  589. union vnt_phy_field_swap phy;
  590. unsigned char byTxRate, byRsvTime; /* For OFDM */
  591. unsigned long flags;
  592. spin_lock_irqsave(&priv->lock, flags);
  593. /* Set to Page1 */
  594. MACvSelectPage1(priv->PortOffset);
  595. /* RSPINF_b_1 */
  596. vnt_get_phy_field(priv, 14,
  597. CARDwGetCCKControlRate(priv, RATE_1M),
  598. PK_TYPE_11B, &phy.field_read);
  599. /* swap over to get correct write order */
  600. swap(phy.swap[0], phy.swap[1]);
  601. VNSvOutPortD(priv->PortOffset + MAC_REG_RSPINF_B_1, phy.field_write);
  602. /* RSPINF_b_2 */
  603. vnt_get_phy_field(priv, 14,
  604. CARDwGetCCKControlRate(priv, RATE_2M),
  605. PK_TYPE_11B, &phy.field_read);
  606. swap(phy.swap[0], phy.swap[1]);
  607. VNSvOutPortD(priv->PortOffset + MAC_REG_RSPINF_B_2, phy.field_write);
  608. /* RSPINF_b_5 */
  609. vnt_get_phy_field(priv, 14,
  610. CARDwGetCCKControlRate(priv, RATE_5M),
  611. PK_TYPE_11B, &phy.field_read);
  612. swap(phy.swap[0], phy.swap[1]);
  613. VNSvOutPortD(priv->PortOffset + MAC_REG_RSPINF_B_5, phy.field_write);
  614. /* RSPINF_b_11 */
  615. vnt_get_phy_field(priv, 14,
  616. CARDwGetCCKControlRate(priv, RATE_11M),
  617. PK_TYPE_11B, &phy.field_read);
  618. swap(phy.swap[0], phy.swap[1]);
  619. VNSvOutPortD(priv->PortOffset + MAC_REG_RSPINF_B_11, phy.field_write);
  620. /* RSPINF_a_6 */
  621. s_vCalculateOFDMRParameter(RATE_6M,
  622. bb_type,
  623. &byTxRate,
  624. &byRsvTime);
  625. VNSvOutPortW(priv->PortOffset + MAC_REG_RSPINF_A_6,
  626. MAKEWORD(byTxRate, byRsvTime));
  627. /* RSPINF_a_9 */
  628. s_vCalculateOFDMRParameter(RATE_9M,
  629. bb_type,
  630. &byTxRate,
  631. &byRsvTime);
  632. VNSvOutPortW(priv->PortOffset + MAC_REG_RSPINF_A_9,
  633. MAKEWORD(byTxRate, byRsvTime));
  634. /* RSPINF_a_12 */
  635. s_vCalculateOFDMRParameter(RATE_12M,
  636. bb_type,
  637. &byTxRate,
  638. &byRsvTime);
  639. VNSvOutPortW(priv->PortOffset + MAC_REG_RSPINF_A_12,
  640. MAKEWORD(byTxRate, byRsvTime));
  641. /* RSPINF_a_18 */
  642. s_vCalculateOFDMRParameter(RATE_18M,
  643. bb_type,
  644. &byTxRate,
  645. &byRsvTime);
  646. VNSvOutPortW(priv->PortOffset + MAC_REG_RSPINF_A_18,
  647. MAKEWORD(byTxRate, byRsvTime));
  648. /* RSPINF_a_24 */
  649. s_vCalculateOFDMRParameter(RATE_24M,
  650. bb_type,
  651. &byTxRate,
  652. &byRsvTime);
  653. VNSvOutPortW(priv->PortOffset + MAC_REG_RSPINF_A_24,
  654. MAKEWORD(byTxRate, byRsvTime));
  655. /* RSPINF_a_36 */
  656. s_vCalculateOFDMRParameter(CARDwGetOFDMControlRate(
  657. (void *)priv,
  658. RATE_36M),
  659. bb_type,
  660. &byTxRate,
  661. &byRsvTime);
  662. VNSvOutPortW(priv->PortOffset + MAC_REG_RSPINF_A_36,
  663. MAKEWORD(byTxRate, byRsvTime));
  664. /* RSPINF_a_48 */
  665. s_vCalculateOFDMRParameter(CARDwGetOFDMControlRate(
  666. (void *)priv,
  667. RATE_48M),
  668. bb_type,
  669. &byTxRate,
  670. &byRsvTime);
  671. VNSvOutPortW(priv->PortOffset + MAC_REG_RSPINF_A_48,
  672. MAKEWORD(byTxRate, byRsvTime));
  673. /* RSPINF_a_54 */
  674. s_vCalculateOFDMRParameter(CARDwGetOFDMControlRate(
  675. (void *)priv,
  676. RATE_54M),
  677. bb_type,
  678. &byTxRate,
  679. &byRsvTime);
  680. VNSvOutPortW(priv->PortOffset + MAC_REG_RSPINF_A_54,
  681. MAKEWORD(byTxRate, byRsvTime));
  682. /* RSPINF_a_72 */
  683. s_vCalculateOFDMRParameter(CARDwGetOFDMControlRate(
  684. (void *)priv,
  685. RATE_54M),
  686. bb_type,
  687. &byTxRate,
  688. &byRsvTime);
  689. VNSvOutPortW(priv->PortOffset + MAC_REG_RSPINF_A_72,
  690. MAKEWORD(byTxRate, byRsvTime));
  691. /* Set to Page0 */
  692. MACvSelectPage0(priv->PortOffset);
  693. spin_unlock_irqrestore(&priv->lock, flags);
  694. }
  695. void CARDvUpdateBasicTopRate(struct vnt_private *priv)
  696. {
  697. unsigned char byTopOFDM = RATE_24M, byTopCCK = RATE_1M;
  698. unsigned char ii;
  699. /* Determines the highest basic rate. */
  700. for (ii = RATE_54M; ii >= RATE_6M; ii--) {
  701. if ((priv->basic_rates) & ((u32)(1 << ii))) {
  702. byTopOFDM = ii;
  703. break;
  704. }
  705. }
  706. priv->byTopOFDMBasicRate = byTopOFDM;
  707. for (ii = RATE_11M;; ii--) {
  708. if ((priv->basic_rates) & ((u32)(1 << ii))) {
  709. byTopCCK = ii;
  710. break;
  711. }
  712. if (ii == RATE_1M)
  713. break;
  714. }
  715. priv->byTopCCKBasicRate = byTopCCK;
  716. }
  717. bool CARDbIsOFDMinBasicRate(struct vnt_private *priv)
  718. {
  719. int ii;
  720. for (ii = RATE_54M; ii >= RATE_6M; ii--) {
  721. if ((priv->basic_rates) & ((u32)BIT(ii)))
  722. return true;
  723. }
  724. return false;
  725. }
  726. unsigned char CARDbyGetPktType(struct vnt_private *priv)
  727. {
  728. if (priv->byBBType == BB_TYPE_11A || priv->byBBType == BB_TYPE_11B)
  729. return (unsigned char)priv->byBBType;
  730. else if (CARDbIsOFDMinBasicRate((void *)priv))
  731. return PK_TYPE_11GA;
  732. else
  733. return PK_TYPE_11GB;
  734. }
  735. /*
  736. * Description: Set NIC Loopback mode
  737. *
  738. * Parameters:
  739. * In:
  740. * priv - The adapter to be set
  741. * wLoopbackMode - Loopback mode to be set
  742. * Out:
  743. * none
  744. *
  745. * Return Value: none
  746. */
  747. void CARDvSetLoopbackMode(struct vnt_private *priv,
  748. unsigned short wLoopbackMode)
  749. {
  750. switch (wLoopbackMode) {
  751. case CARD_LB_NONE:
  752. case CARD_LB_MAC:
  753. case CARD_LB_PHY:
  754. break;
  755. default:
  756. break;
  757. }
  758. /* set MAC loopback */
  759. MACvSetLoopbackMode(priv, LOBYTE(wLoopbackMode));
  760. /* set Baseband loopback */
  761. }
  762. /*
  763. * Description: Software Reset NIC
  764. *
  765. * Parameters:
  766. * In:
  767. * priv - The adapter to be reset
  768. * Out:
  769. * none
  770. *
  771. * Return Value: none
  772. */
  773. bool CARDbSoftwareReset(struct vnt_private *priv)
  774. {
  775. /* reset MAC */
  776. if (!MACbSafeSoftwareReset(priv))
  777. return false;
  778. return true;
  779. }
  780. /*
  781. * Description: Calculate TSF offset of two TSF input
  782. * Get TSF Offset from RxBCN's TSF and local TSF
  783. *
  784. * Parameters:
  785. * In:
  786. * priv - The adapter to be sync.
  787. * qwTSF1 - Rx BCN's TSF
  788. * qwTSF2 - Local TSF
  789. * Out:
  790. * none
  791. *
  792. * Return Value: TSF Offset value
  793. */
  794. u64 CARDqGetTSFOffset(unsigned char byRxRate, u64 qwTSF1, u64 qwTSF2)
  795. {
  796. unsigned short wRxBcnTSFOffst;
  797. wRxBcnTSFOffst = cwRXBCNTSFOff[byRxRate % MAX_RATE];
  798. qwTSF2 += (u64)wRxBcnTSFOffst;
  799. return qwTSF1 - qwTSF2;
  800. }
  801. /*
  802. * Description: Read NIC TSF counter
  803. * Get local TSF counter
  804. *
  805. * Parameters:
  806. * In:
  807. * priv - The adapter to be read
  808. * Out:
  809. * qwCurrTSF - Current TSF counter
  810. *
  811. * Return Value: true if success; otherwise false
  812. */
  813. bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
  814. {
  815. void __iomem *iobase = priv->PortOffset;
  816. unsigned short ww;
  817. unsigned char byData;
  818. MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD);
  819. for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
  820. VNSvInPortB(iobase + MAC_REG_TFTCTL, &byData);
  821. if (!(byData & TFTCTL_TSFCNTRRD))
  822. break;
  823. }
  824. if (ww == W_MAX_TIMEOUT)
  825. return false;
  826. VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
  827. VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
  828. return true;
  829. }
  830. /*
  831. * Description: Read NIC TSF counter
  832. * Get NEXTTBTT from adjusted TSF and Beacon Interval
  833. *
  834. * Parameters:
  835. * In:
  836. * qwTSF - Current TSF counter
  837. * wbeaconInterval - Beacon Interval
  838. * Out:
  839. * qwCurrTSF - Current TSF counter
  840. *
  841. * Return Value: TSF value of next Beacon
  842. */
  843. u64 CARDqGetNextTBTT(u64 qwTSF, unsigned short wBeaconInterval)
  844. {
  845. u32 beacon_int;
  846. beacon_int = wBeaconInterval * 1024;
  847. if (beacon_int) {
  848. do_div(qwTSF, beacon_int);
  849. qwTSF += 1;
  850. qwTSF *= beacon_int;
  851. }
  852. return qwTSF;
  853. }
  854. /*
  855. * Description: Set NIC TSF counter for first Beacon time
  856. * Get NEXTTBTT from adjusted TSF and Beacon Interval
  857. *
  858. * Parameters:
  859. * In:
  860. * iobase - IO Base
  861. * wBeaconInterval - Beacon Interval
  862. * Out:
  863. * none
  864. *
  865. * Return Value: none
  866. */
  867. void CARDvSetFirstNextTBTT(struct vnt_private *priv,
  868. unsigned short wBeaconInterval)
  869. {
  870. void __iomem *iobase = priv->PortOffset;
  871. u64 qwNextTBTT = 0;
  872. CARDbGetCurrentTSF(priv, &qwNextTBTT); /* Get Local TSF counter */
  873. qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval);
  874. /* Set NextTBTT */
  875. VNSvOutPortD(iobase + MAC_REG_NEXTTBTT, (u32)qwNextTBTT);
  876. VNSvOutPortD(iobase + MAC_REG_NEXTTBTT + 4, (u32)(qwNextTBTT >> 32));
  877. MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN);
  878. }
  879. /*
  880. * Description: Sync NIC TSF counter for Beacon time
  881. * Get NEXTTBTT and write to HW
  882. *
  883. * Parameters:
  884. * In:
  885. * priv - The adapter to be set
  886. * qwTSF - Current TSF counter
  887. * wBeaconInterval - Beacon Interval
  888. * Out:
  889. * none
  890. *
  891. * Return Value: none
  892. */
  893. void CARDvUpdateNextTBTT(struct vnt_private *priv, u64 qwTSF,
  894. unsigned short wBeaconInterval)
  895. {
  896. void __iomem *iobase = priv->PortOffset;
  897. qwTSF = CARDqGetNextTBTT(qwTSF, wBeaconInterval);
  898. /* Set NextTBTT */
  899. VNSvOutPortD(iobase + MAC_REG_NEXTTBTT, (u32)qwTSF);
  900. VNSvOutPortD(iobase + MAC_REG_NEXTTBTT + 4, (u32)(qwTSF >> 32));
  901. MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN);
  902. pr_debug("Card:Update Next TBTT[%8llx]\n", qwTSF);
  903. }