card.c 25 KB

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