card.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  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. * vnt_set_rspinf - Set RSPINF
  10. * vnt_update_ifs - Update slotTime,SIFS,DIFS, and EIFS
  11. * vnt_update_top_rates - Update BasicTopRate
  12. * vnt_add_basic_rate - Add to BasicRateSet
  13. * vnt_ofdm_min_rate - Check if any OFDM rate is in BasicRateSet
  14. * vnt_get_tsf_offset - Calculate TSFOffset
  15. * vnt_get_current_tsf - Read Current NIC TSF counter
  16. * vnt_get_next_tbtt - Calculate Next Beacon TSF counter
  17. * vnt_reset_next_tbtt - Set NIC Beacon time
  18. * vnt_update_next_tbtt - Sync. NIC Beacon time
  19. * vnt_radio_power_off - Turn Off NIC Radio Power
  20. * vnt_radio_power_on - Turn On NIC Radio Power
  21. *
  22. * Revision History:
  23. * 06-10-2003 Bryan YC Fan: Re-write codes to support VT3253 spec.
  24. * 08-26-2003 Kyle Hsu: Modify the definition type of dwIoBase.
  25. * 09-01-2003 Bryan YC Fan: Add vnt_update_ifs().
  26. *
  27. */
  28. #include "device.h"
  29. #include "card.h"
  30. #include "baseband.h"
  31. #include "mac.h"
  32. #include "desc.h"
  33. #include "rf.h"
  34. #include "power.h"
  35. #include "key.h"
  36. #include "usbpipe.h"
  37. /* const u16 cw_rxbcntsf_off[MAX_RATE] =
  38. * {17, 34, 96, 192, 34, 23, 17, 11, 8, 5, 4, 3};
  39. */
  40. static const u16 cw_rxbcntsf_off[MAX_RATE] = {
  41. 192, 96, 34, 17, 34, 23, 17, 11, 8, 5, 4, 3
  42. };
  43. /*
  44. * Description: Set NIC media channel
  45. *
  46. * Parameters:
  47. * In:
  48. * pDevice - The adapter to be set
  49. * connection_channel - Channel to be set
  50. * Out:
  51. * none
  52. */
  53. void vnt_set_channel(struct vnt_private *priv, u32 connection_channel)
  54. {
  55. if (connection_channel > CB_MAX_CHANNEL || !connection_channel)
  56. return;
  57. /* clear NAV */
  58. vnt_mac_reg_bits_on(priv, MAC_REG_MACCR, MACCR_CLRNAV);
  59. /* Set Channel[7] = 0 to tell H/W channel is changing now. */
  60. vnt_mac_reg_bits_off(priv, MAC_REG_CHANNEL, 0xb0);
  61. vnt_control_out(priv, MESSAGE_TYPE_SELECT_CHANNEL,
  62. connection_channel, 0, 0, NULL);
  63. vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG, MAC_REG_CHANNEL,
  64. (u8)(connection_channel | 0x80));
  65. }
  66. /*
  67. * Description: Get CCK mode basic rate
  68. *
  69. * Parameters:
  70. * In:
  71. * priv - The adapter to be set
  72. * rate_idx - Receiving data rate
  73. * Out:
  74. * none
  75. *
  76. * Return Value: response Control frame rate
  77. *
  78. */
  79. static u16 vnt_get_cck_rate(struct vnt_private *priv, u16 rate_idx)
  80. {
  81. u16 ui = rate_idx;
  82. while (ui > RATE_1M) {
  83. if (priv->basic_rates & (1 << ui))
  84. return ui;
  85. ui--;
  86. }
  87. return RATE_1M;
  88. }
  89. /*
  90. * Description: Get OFDM mode basic rate
  91. *
  92. * Parameters:
  93. * In:
  94. * priv - The adapter to be set
  95. * rate_idx - Receiving data rate
  96. * Out:
  97. * none
  98. *
  99. * Return Value: response Control frame rate
  100. *
  101. */
  102. static u16 vnt_get_ofdm_rate(struct vnt_private *priv, u16 rate_idx)
  103. {
  104. u16 ui = rate_idx;
  105. dev_dbg(&priv->usb->dev, "%s basic rate: %d\n",
  106. __func__, priv->basic_rates);
  107. if (!vnt_ofdm_min_rate(priv)) {
  108. dev_dbg(&priv->usb->dev, "%s (NO OFDM) %d\n",
  109. __func__, rate_idx);
  110. if (rate_idx > RATE_24M)
  111. rate_idx = RATE_24M;
  112. return rate_idx;
  113. }
  114. while (ui > RATE_11M) {
  115. if (priv->basic_rates & (1 << ui)) {
  116. dev_dbg(&priv->usb->dev, "%s rate: %d\n",
  117. __func__, ui);
  118. return ui;
  119. }
  120. ui--;
  121. }
  122. dev_dbg(&priv->usb->dev, "%s basic rate: 24M\n", __func__);
  123. return RATE_24M;
  124. }
  125. /*
  126. * Description: Calculate TxRate and RsvTime fields for RSPINF in OFDM mode.
  127. *
  128. * Parameters:
  129. * In:
  130. * rate - Tx Rate
  131. * bb_type - Tx Packet type
  132. * Out:
  133. * tx_rate - pointer to RSPINF TxRate field
  134. * rsv_time- pointer to RSPINF RsvTime field
  135. *
  136. * Return Value: none
  137. *
  138. */
  139. static void vnt_calculate_ofdm_rate(u16 rate, u8 bb_type,
  140. u8 *tx_rate, u8 *rsv_time)
  141. {
  142. switch (rate) {
  143. case RATE_6M:
  144. if (bb_type == BB_TYPE_11A) {
  145. *tx_rate = 0x9b;
  146. *rsv_time = 24;
  147. } else {
  148. *tx_rate = 0x8b;
  149. *rsv_time = 30;
  150. }
  151. break;
  152. case RATE_9M:
  153. if (bb_type == BB_TYPE_11A) {
  154. *tx_rate = 0x9f;
  155. *rsv_time = 16;
  156. } else {
  157. *tx_rate = 0x8f;
  158. *rsv_time = 22;
  159. }
  160. break;
  161. case RATE_12M:
  162. if (bb_type == BB_TYPE_11A) {
  163. *tx_rate = 0x9a;
  164. *rsv_time = 12;
  165. } else {
  166. *tx_rate = 0x8a;
  167. *rsv_time = 18;
  168. }
  169. break;
  170. case RATE_18M:
  171. if (bb_type == BB_TYPE_11A) {
  172. *tx_rate = 0x9e;
  173. *rsv_time = 8;
  174. } else {
  175. *tx_rate = 0x8e;
  176. *rsv_time = 14;
  177. }
  178. break;
  179. case RATE_36M:
  180. if (bb_type == BB_TYPE_11A) {
  181. *tx_rate = 0x9d;
  182. *rsv_time = 4;
  183. } else {
  184. *tx_rate = 0x8d;
  185. *rsv_time = 10;
  186. }
  187. break;
  188. case RATE_48M:
  189. if (bb_type == BB_TYPE_11A) {
  190. *tx_rate = 0x98;
  191. *rsv_time = 4;
  192. } else {
  193. *tx_rate = 0x88;
  194. *rsv_time = 10;
  195. }
  196. break;
  197. case RATE_54M:
  198. if (bb_type == BB_TYPE_11A) {
  199. *tx_rate = 0x9c;
  200. *rsv_time = 4;
  201. } else {
  202. *tx_rate = 0x8c;
  203. *rsv_time = 10;
  204. }
  205. break;
  206. case RATE_24M:
  207. default:
  208. if (bb_type == BB_TYPE_11A) {
  209. *tx_rate = 0x99;
  210. *rsv_time = 8;
  211. } else {
  212. *tx_rate = 0x89;
  213. *rsv_time = 14;
  214. }
  215. break;
  216. }
  217. }
  218. /*
  219. * Description: Set RSPINF
  220. *
  221. * Parameters:
  222. * In:
  223. * pDevice - The adapter to be set
  224. * Out:
  225. * none
  226. *
  227. * Return Value: None.
  228. *
  229. */
  230. void vnt_set_rspinf(struct vnt_private *priv, u8 bb_type)
  231. {
  232. struct vnt_phy_field phy[4];
  233. u8 tx_rate[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; /* For OFDM */
  234. u8 rsv_time[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
  235. u8 data[34];
  236. int i;
  237. /*RSPINF_b_1*/
  238. vnt_get_phy_field(priv, 14, vnt_get_cck_rate(priv, RATE_1M),
  239. PK_TYPE_11B, &phy[0]);
  240. /*RSPINF_b_2*/
  241. vnt_get_phy_field(priv, 14, vnt_get_cck_rate(priv, RATE_2M),
  242. PK_TYPE_11B, &phy[1]);
  243. /*RSPINF_b_5*/
  244. vnt_get_phy_field(priv, 14, vnt_get_cck_rate(priv, RATE_5M),
  245. PK_TYPE_11B, &phy[2]);
  246. /*RSPINF_b_11*/
  247. vnt_get_phy_field(priv, 14, vnt_get_cck_rate(priv, RATE_11M),
  248. PK_TYPE_11B, &phy[3]);
  249. /*RSPINF_a_6*/
  250. vnt_calculate_ofdm_rate(RATE_6M, bb_type, &tx_rate[0], &rsv_time[0]);
  251. /*RSPINF_a_9*/
  252. vnt_calculate_ofdm_rate(RATE_9M, bb_type, &tx_rate[1], &rsv_time[1]);
  253. /*RSPINF_a_12*/
  254. vnt_calculate_ofdm_rate(RATE_12M, bb_type, &tx_rate[2], &rsv_time[2]);
  255. /*RSPINF_a_18*/
  256. vnt_calculate_ofdm_rate(RATE_18M, bb_type, &tx_rate[3], &rsv_time[3]);
  257. /*RSPINF_a_24*/
  258. vnt_calculate_ofdm_rate(RATE_24M, bb_type, &tx_rate[4], &rsv_time[4]);
  259. /*RSPINF_a_36*/
  260. vnt_calculate_ofdm_rate(vnt_get_ofdm_rate(priv, RATE_36M),
  261. bb_type, &tx_rate[5], &rsv_time[5]);
  262. /*RSPINF_a_48*/
  263. vnt_calculate_ofdm_rate(vnt_get_ofdm_rate(priv, RATE_48M),
  264. bb_type, &tx_rate[6], &rsv_time[6]);
  265. /*RSPINF_a_54*/
  266. vnt_calculate_ofdm_rate(vnt_get_ofdm_rate(priv, RATE_54M),
  267. bb_type, &tx_rate[7], &rsv_time[7]);
  268. /*RSPINF_a_72*/
  269. vnt_calculate_ofdm_rate(vnt_get_ofdm_rate(priv, RATE_54M),
  270. bb_type, &tx_rate[8], &rsv_time[8]);
  271. put_unaligned(phy[0].len, (u16 *)&data[0]);
  272. data[2] = phy[0].signal;
  273. data[3] = phy[0].service;
  274. put_unaligned(phy[1].len, (u16 *)&data[4]);
  275. data[6] = phy[1].signal;
  276. data[7] = phy[1].service;
  277. put_unaligned(phy[2].len, (u16 *)&data[8]);
  278. data[10] = phy[2].signal;
  279. data[11] = phy[2].service;
  280. put_unaligned(phy[3].len, (u16 *)&data[12]);
  281. data[14] = phy[3].signal;
  282. data[15] = phy[3].service;
  283. for (i = 0; i < 9; i++) {
  284. data[16 + i * 2] = tx_rate[i];
  285. data[16 + i * 2 + 1] = rsv_time[i];
  286. }
  287. vnt_control_out(priv, MESSAGE_TYPE_WRITE, MAC_REG_RSPINF_B_1,
  288. MESSAGE_REQUEST_MACREG, 34, &data[0]);
  289. }
  290. /*
  291. * Description: Update IFS
  292. *
  293. * Parameters:
  294. * In:
  295. * priv - The adapter to be set
  296. * Out:
  297. * none
  298. *
  299. * Return Value: None.
  300. *
  301. */
  302. void vnt_update_ifs(struct vnt_private *priv)
  303. {
  304. u8 max_min = 0;
  305. u8 data[4];
  306. if (priv->packet_type == PK_TYPE_11A) {
  307. priv->slot = C_SLOT_SHORT;
  308. priv->sifs = C_SIFS_A;
  309. priv->difs = C_SIFS_A + 2 * C_SLOT_SHORT;
  310. max_min = 4;
  311. } else {
  312. priv->sifs = C_SIFS_BG;
  313. if (priv->short_slot_time) {
  314. priv->slot = C_SLOT_SHORT;
  315. max_min = 4;
  316. } else {
  317. priv->slot = C_SLOT_LONG;
  318. max_min = 5;
  319. }
  320. priv->difs = C_SIFS_BG + 2 * priv->slot;
  321. }
  322. priv->eifs = C_EIFS;
  323. switch (priv->rf_type) {
  324. case RF_VT3226D0:
  325. if (priv->bb_type != BB_TYPE_11B) {
  326. priv->sifs -= 1;
  327. priv->difs -= 1;
  328. break;
  329. }
  330. /* fall through */
  331. case RF_AIROHA7230:
  332. case RF_AL2230:
  333. case RF_AL2230S:
  334. if (priv->bb_type != BB_TYPE_11B)
  335. break;
  336. /* fall through */
  337. case RF_RFMD2959:
  338. case RF_VT3226:
  339. case RF_VT3342A0:
  340. priv->sifs -= 3;
  341. priv->difs -= 3;
  342. break;
  343. case RF_MAXIM2829:
  344. if (priv->bb_type == BB_TYPE_11A) {
  345. priv->sifs -= 5;
  346. priv->difs -= 5;
  347. } else {
  348. priv->sifs -= 2;
  349. priv->difs -= 2;
  350. }
  351. break;
  352. }
  353. data[0] = (u8)priv->sifs;
  354. data[1] = (u8)priv->difs;
  355. data[2] = (u8)priv->eifs;
  356. data[3] = (u8)priv->slot;
  357. vnt_control_out(priv, MESSAGE_TYPE_WRITE, MAC_REG_SIFS,
  358. MESSAGE_REQUEST_MACREG, 4, &data[0]);
  359. max_min |= 0xa0;
  360. vnt_control_out(priv, MESSAGE_TYPE_WRITE, MAC_REG_CWMAXMIN0,
  361. MESSAGE_REQUEST_MACREG, 1, &max_min);
  362. }
  363. void vnt_update_top_rates(struct vnt_private *priv)
  364. {
  365. u8 top_ofdm = RATE_24M, top_cck = RATE_1M;
  366. u8 i;
  367. /*Determines the highest basic rate.*/
  368. for (i = RATE_54M; i >= RATE_6M; i--) {
  369. if (priv->basic_rates & (u16)(1 << i)) {
  370. top_ofdm = i;
  371. break;
  372. }
  373. }
  374. priv->top_ofdm_basic_rate = top_ofdm;
  375. for (i = RATE_11M;; i--) {
  376. if (priv->basic_rates & (u16)(1 << i)) {
  377. top_cck = i;
  378. break;
  379. }
  380. if (i == RATE_1M)
  381. break;
  382. }
  383. priv->top_cck_basic_rate = top_cck;
  384. }
  385. int vnt_ofdm_min_rate(struct vnt_private *priv)
  386. {
  387. int ii;
  388. for (ii = RATE_54M; ii >= RATE_6M; ii--) {
  389. if ((priv->basic_rates) & ((u16)BIT(ii)))
  390. return true;
  391. }
  392. return false;
  393. }
  394. u8 vnt_get_pkt_type(struct vnt_private *priv)
  395. {
  396. if (priv->bb_type == BB_TYPE_11A || priv->bb_type == BB_TYPE_11B)
  397. return (u8)priv->bb_type;
  398. else if (vnt_ofdm_min_rate(priv))
  399. return PK_TYPE_11GA;
  400. return PK_TYPE_11GB;
  401. }
  402. /*
  403. * Description: Calculate TSF offset of two TSF input
  404. * Get TSF Offset from RxBCN's TSF and local TSF
  405. *
  406. * Parameters:
  407. * In:
  408. * rx_rate - rx rate.
  409. * tsf1 - Rx BCN's TSF
  410. * tsf2 - Local TSF
  411. * Out:
  412. * none
  413. *
  414. * Return Value: TSF Offset value
  415. *
  416. */
  417. u64 vnt_get_tsf_offset(u8 rx_rate, u64 tsf1, u64 tsf2)
  418. {
  419. return tsf1 - tsf2 - (u64)cw_rxbcntsf_off[rx_rate % MAX_RATE];
  420. }
  421. /*
  422. * Description: Sync. TSF counter to BSS
  423. * Get TSF offset and write to HW
  424. *
  425. * Parameters:
  426. * In:
  427. * priv - The adapter to be sync.
  428. * time_stamp - Rx BCN's TSF
  429. * local_tsf - Local TSF
  430. * Out:
  431. * none
  432. *
  433. * Return Value: none
  434. *
  435. */
  436. void vnt_adjust_tsf(struct vnt_private *priv, u8 rx_rate,
  437. u64 time_stamp, u64 local_tsf)
  438. {
  439. u64 tsf_offset = 0;
  440. u8 data[8];
  441. tsf_offset = vnt_get_tsf_offset(rx_rate, time_stamp, local_tsf);
  442. data[0] = (u8)tsf_offset;
  443. data[1] = (u8)(tsf_offset >> 8);
  444. data[2] = (u8)(tsf_offset >> 16);
  445. data[3] = (u8)(tsf_offset >> 24);
  446. data[4] = (u8)(tsf_offset >> 32);
  447. data[5] = (u8)(tsf_offset >> 40);
  448. data[6] = (u8)(tsf_offset >> 48);
  449. data[7] = (u8)(tsf_offset >> 56);
  450. vnt_control_out(priv, MESSAGE_TYPE_SET_TSFTBTT,
  451. MESSAGE_REQUEST_TSF, 0, 8, data);
  452. }
  453. /*
  454. * Description: Read NIC TSF counter
  455. * Get local TSF counter
  456. *
  457. * Parameters:
  458. * In:
  459. * priv - The adapter to be read
  460. * Out:
  461. * current_tsf - Current TSF counter
  462. *
  463. * Return Value: true if success; otherwise false
  464. *
  465. */
  466. bool vnt_get_current_tsf(struct vnt_private *priv, u64 *current_tsf)
  467. {
  468. *current_tsf = priv->current_tsf;
  469. return true;
  470. }
  471. /*
  472. * Description: Clear NIC TSF counter
  473. * Clear local TSF counter
  474. *
  475. * Parameters:
  476. * In:
  477. * priv - The adapter to be read
  478. *
  479. * Return Value: true if success; otherwise false
  480. *
  481. */
  482. bool vnt_clear_current_tsf(struct vnt_private *priv)
  483. {
  484. vnt_mac_reg_bits_on(priv, MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
  485. priv->current_tsf = 0;
  486. return true;
  487. }
  488. /*
  489. * Description: Read NIC TSF counter
  490. * Get NEXTTBTT from adjusted TSF and Beacon Interval
  491. *
  492. * Parameters:
  493. * In:
  494. * tsf - Current TSF counter
  495. * beacon_interval - Beacon Interval
  496. * Out:
  497. * tsf - Current TSF counter
  498. *
  499. * Return Value: TSF value of next Beacon
  500. *
  501. */
  502. u64 vnt_get_next_tbtt(u64 tsf, u16 beacon_interval)
  503. {
  504. u32 beacon_int;
  505. beacon_int = beacon_interval * 1024;
  506. /* Next TBTT =
  507. * ((local_current_TSF / beacon_interval) + 1) * beacon_interval
  508. */
  509. if (beacon_int) {
  510. do_div(tsf, beacon_int);
  511. tsf += 1;
  512. tsf *= beacon_int;
  513. }
  514. return tsf;
  515. }
  516. /*
  517. * Description: Set NIC TSF counter for first Beacon time
  518. * Get NEXTTBTT from adjusted TSF and Beacon Interval
  519. *
  520. * Parameters:
  521. * In:
  522. * dwIoBase - IO Base
  523. * beacon_interval - Beacon Interval
  524. * Out:
  525. * none
  526. *
  527. * Return Value: none
  528. *
  529. */
  530. void vnt_reset_next_tbtt(struct vnt_private *priv, u16 beacon_interval)
  531. {
  532. u64 next_tbtt = 0;
  533. u8 data[8];
  534. vnt_clear_current_tsf(priv);
  535. next_tbtt = vnt_get_next_tbtt(next_tbtt, beacon_interval);
  536. data[0] = (u8)next_tbtt;
  537. data[1] = (u8)(next_tbtt >> 8);
  538. data[2] = (u8)(next_tbtt >> 16);
  539. data[3] = (u8)(next_tbtt >> 24);
  540. data[4] = (u8)(next_tbtt >> 32);
  541. data[5] = (u8)(next_tbtt >> 40);
  542. data[6] = (u8)(next_tbtt >> 48);
  543. data[7] = (u8)(next_tbtt >> 56);
  544. vnt_control_out(priv, MESSAGE_TYPE_SET_TSFTBTT,
  545. MESSAGE_REQUEST_TBTT, 0, 8, data);
  546. }
  547. /*
  548. * Description: Sync NIC TSF counter for Beacon time
  549. * Get NEXTTBTT and write to HW
  550. *
  551. * Parameters:
  552. * In:
  553. * priv - The adapter to be set
  554. * tsf - Current TSF counter
  555. * beacon_interval - Beacon Interval
  556. * Out:
  557. * none
  558. *
  559. * Return Value: none
  560. *
  561. */
  562. void vnt_update_next_tbtt(struct vnt_private *priv, u64 tsf,
  563. u16 beacon_interval)
  564. {
  565. u8 data[8];
  566. tsf = vnt_get_next_tbtt(tsf, beacon_interval);
  567. data[0] = (u8)tsf;
  568. data[1] = (u8)(tsf >> 8);
  569. data[2] = (u8)(tsf >> 16);
  570. data[3] = (u8)(tsf >> 24);
  571. data[4] = (u8)(tsf >> 32);
  572. data[5] = (u8)(tsf >> 40);
  573. data[6] = (u8)(tsf >> 48);
  574. data[7] = (u8)(tsf >> 56);
  575. vnt_control_out(priv, MESSAGE_TYPE_SET_TSFTBTT,
  576. MESSAGE_REQUEST_TBTT, 0, 8, data);
  577. dev_dbg(&priv->usb->dev, "%s TBTT: %8llx\n", __func__, tsf);
  578. }
  579. /*
  580. * Description: Turn off Radio power
  581. *
  582. * Parameters:
  583. * In:
  584. * priv - The adapter to be turned off
  585. * Out:
  586. * none
  587. *
  588. * Return Value: true if success; otherwise false
  589. *
  590. */
  591. int vnt_radio_power_off(struct vnt_private *priv)
  592. {
  593. int ret = true;
  594. switch (priv->rf_type) {
  595. case RF_AL2230:
  596. case RF_AL2230S:
  597. case RF_AIROHA7230:
  598. case RF_VT3226:
  599. case RF_VT3226D0:
  600. case RF_VT3342A0:
  601. vnt_mac_reg_bits_off(priv, MAC_REG_SOFTPWRCTL,
  602. (SOFTPWRCTL_SWPE2 | SOFTPWRCTL_SWPE3));
  603. break;
  604. }
  605. vnt_mac_reg_bits_off(priv, MAC_REG_HOSTCR, HOSTCR_RXON);
  606. vnt_set_deep_sleep(priv);
  607. vnt_mac_reg_bits_on(priv, MAC_REG_GPIOCTL1, GPIO3_INTMD);
  608. return ret;
  609. }
  610. /*
  611. * Description: Turn on Radio power
  612. *
  613. * Parameters:
  614. * In:
  615. * priv - The adapter to be turned on
  616. * Out:
  617. * none
  618. *
  619. * Return Value: true if success; otherwise false
  620. *
  621. */
  622. int vnt_radio_power_on(struct vnt_private *priv)
  623. {
  624. int ret = true;
  625. vnt_exit_deep_sleep(priv);
  626. vnt_mac_reg_bits_on(priv, MAC_REG_HOSTCR, HOSTCR_RXON);
  627. switch (priv->rf_type) {
  628. case RF_AL2230:
  629. case RF_AL2230S:
  630. case RF_AIROHA7230:
  631. case RF_VT3226:
  632. case RF_VT3226D0:
  633. case RF_VT3342A0:
  634. vnt_mac_reg_bits_on(priv, MAC_REG_SOFTPWRCTL,
  635. (SOFTPWRCTL_SWPE2 | SOFTPWRCTL_SWPE3));
  636. break;
  637. }
  638. vnt_mac_reg_bits_off(priv, MAC_REG_GPIOCTL1, GPIO3_INTMD);
  639. return ret;
  640. }
  641. void vnt_set_bss_mode(struct vnt_private *priv)
  642. {
  643. if (priv->rf_type == RF_AIROHA7230 && priv->bb_type == BB_TYPE_11A)
  644. vnt_mac_set_bb_type(priv, BB_TYPE_11G);
  645. else
  646. vnt_mac_set_bb_type(priv, priv->bb_type);
  647. priv->packet_type = vnt_get_pkt_type(priv);
  648. if (priv->bb_type == BB_TYPE_11A)
  649. vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x88, 0x03);
  650. else if (priv->bb_type == BB_TYPE_11B)
  651. vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x88, 0x02);
  652. else if (priv->bb_type == BB_TYPE_11G)
  653. vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x88, 0x08);
  654. vnt_update_ifs(priv);
  655. vnt_set_rspinf(priv, (u8)priv->bb_type);
  656. if (priv->bb_type == BB_TYPE_11A) {
  657. if (priv->rf_type == RF_AIROHA7230) {
  658. priv->bb_vga[0] = 0x20;
  659. vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG,
  660. 0xe7, priv->bb_vga[0]);
  661. }
  662. priv->bb_vga[2] = 0x10;
  663. priv->bb_vga[3] = 0x10;
  664. } else {
  665. if (priv->rf_type == RF_AIROHA7230) {
  666. priv->bb_vga[0] = 0x1c;
  667. vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG,
  668. 0xe7, priv->bb_vga[0]);
  669. }
  670. priv->bb_vga[2] = 0x0;
  671. priv->bb_vga[3] = 0x0;
  672. }
  673. vnt_set_vga_gain_offset(priv, priv->bb_vga[0]);
  674. }