/drivers/staging/rtl8712/rtl871x_mp.c

https://bitbucket.org/slukk/jb-tsm-kernel-4.2 · C · 738 lines · 580 code · 71 blank · 87 comment · 50 complexity · b6226ff8cca1fd8f60447ac040b192eb MD5 · raw file

  1. /******************************************************************************
  2. * rtl871x_mp.c
  3. *
  4. * Description :
  5. *
  6. * Author :
  7. *
  8. * History :
  9. *
  10. * Copyright 2007, Realtek Corp.
  11. *
  12. * The contents of this file is the sole property of Realtek Corp. It can not be
  13. * be used, copied or modified without written permission from Realtek Corp.
  14. *
  15. *******************************************************************************/
  16. #define _RTL871X_MP_C_
  17. #include "osdep_service.h"
  18. #include "drv_types.h"
  19. #include "rtl871x_mp_phy_regdef.h"
  20. #include "rtl8712_cmd.h"
  21. static void _init_mp_priv_(struct mp_priv *pmp_priv)
  22. {
  23. pmp_priv->mode = _LOOPBOOK_MODE_;
  24. pmp_priv->curr_ch = 1;
  25. pmp_priv->curr_modem = MIXED_PHY;
  26. pmp_priv->curr_rateidx = 0;
  27. pmp_priv->curr_txpoweridx = 0x14;
  28. pmp_priv->antenna_tx = ANTENNA_A;
  29. pmp_priv->antenna_rx = ANTENNA_AB;
  30. pmp_priv->check_mp_pkt = 0;
  31. pmp_priv->tx_pktcount = 0;
  32. pmp_priv->rx_pktcount = 0;
  33. pmp_priv->rx_crcerrpktcount = 0;
  34. }
  35. static int init_mp_priv(struct mp_priv *pmp_priv)
  36. {
  37. int i, res;
  38. struct mp_xmit_frame *pmp_xmitframe;
  39. _init_mp_priv_(pmp_priv);
  40. _init_queue(&pmp_priv->free_mp_xmitqueue);
  41. pmp_priv->pallocated_mp_xmitframe_buf = NULL;
  42. pmp_priv->pallocated_mp_xmitframe_buf = _malloc(NR_MP_XMITFRAME *
  43. sizeof(struct mp_xmit_frame) + 4);
  44. if (pmp_priv->pallocated_mp_xmitframe_buf == NULL) {
  45. res = _FAIL;
  46. goto _exit_init_mp_priv;
  47. }
  48. pmp_priv->pmp_xmtframe_buf = pmp_priv->pallocated_mp_xmitframe_buf +
  49. 4 -
  50. ((addr_t)(pmp_priv->pallocated_mp_xmitframe_buf) & 3);
  51. pmp_xmitframe = (struct mp_xmit_frame *)pmp_priv->pmp_xmtframe_buf;
  52. for (i = 0; i < NR_MP_XMITFRAME; i++) {
  53. _init_listhead(&(pmp_xmitframe->list));
  54. list_insert_tail(&(pmp_xmitframe->list),
  55. &(pmp_priv->free_mp_xmitqueue.queue));
  56. pmp_xmitframe->pkt = NULL;
  57. pmp_xmitframe->frame_tag = MP_FRAMETAG;
  58. pmp_xmitframe->padapter = pmp_priv->papdater;
  59. pmp_xmitframe++;
  60. }
  61. pmp_priv->free_mp_xmitframe_cnt = NR_MP_XMITFRAME;
  62. res = _SUCCESS;
  63. _exit_init_mp_priv:
  64. return res;
  65. }
  66. static int free_mp_priv(struct mp_priv *pmp_priv)
  67. {
  68. int res = 0;
  69. kfree(pmp_priv->pallocated_mp_xmitframe_buf);
  70. return res;
  71. }
  72. void mp871xinit(struct _adapter *padapter)
  73. {
  74. struct mp_priv *pmppriv = &padapter->mppriv;
  75. pmppriv->papdater = padapter;
  76. init_mp_priv(pmppriv);
  77. }
  78. void mp871xdeinit(struct _adapter *padapter)
  79. {
  80. struct mp_priv *pmppriv = &padapter->mppriv;
  81. free_mp_priv(pmppriv);
  82. }
  83. /*
  84. * Special for bb and rf reg read/write
  85. */
  86. static u32 fw_iocmd_read(struct _adapter *pAdapter, struct IOCMD_STRUCT iocmd)
  87. {
  88. u32 cmd32 = 0, val32 = 0;
  89. u8 iocmd_class = iocmd.cmdclass;
  90. u16 iocmd_value = iocmd.value;
  91. u8 iocmd_idx = iocmd.index;
  92. cmd32 = (iocmd_class << 24) | (iocmd_value << 8) | iocmd_idx ;
  93. if (r8712_fw_cmd(pAdapter, cmd32))
  94. r8712_fw_cmd_data(pAdapter, &val32, 1);
  95. else
  96. val32 = 0;
  97. return val32;
  98. }
  99. static u8 fw_iocmd_write(struct _adapter *pAdapter,
  100. struct IOCMD_STRUCT iocmd, u32 value)
  101. {
  102. u32 cmd32 = 0;
  103. u8 iocmd_class = iocmd.cmdclass;
  104. u32 iocmd_value = iocmd.value;
  105. u8 iocmd_idx = iocmd.index;
  106. r8712_fw_cmd_data(pAdapter, &value, 0);
  107. msleep(100);
  108. cmd32 = (iocmd_class << 24) | (iocmd_value << 8) | iocmd_idx ;
  109. return r8712_fw_cmd(pAdapter, cmd32);
  110. }
  111. /* offset : 0X800~0XFFF */
  112. u32 r8712_bb_reg_read(struct _adapter *pAdapter, u16 offset)
  113. {
  114. u8 shift = offset & 0x0003; /* 4 byte access */
  115. u16 bb_addr = offset & 0x0FFC; /* 4 byte access */
  116. u32 bb_val = 0;
  117. struct IOCMD_STRUCT iocmd;
  118. iocmd.cmdclass = IOCMD_CLASS_BB_RF;
  119. iocmd.value = bb_addr;
  120. iocmd.index = IOCMD_BB_READ_IDX;
  121. bb_val = fw_iocmd_read(pAdapter, iocmd);
  122. if (shift != 0) {
  123. u32 bb_val2 = 0;
  124. bb_val >>= (shift * 8);
  125. iocmd.value += 4;
  126. bb_val2 = fw_iocmd_read(pAdapter, iocmd);
  127. bb_val2 <<= ((4 - shift) * 8);
  128. bb_val |= bb_val2;
  129. }
  130. return bb_val;
  131. }
  132. /* offset : 0X800~0XFFF */
  133. u8 r8712_bb_reg_write(struct _adapter *pAdapter, u16 offset, u32 value)
  134. {
  135. u8 shift = offset & 0x0003; /* 4 byte access */
  136. u16 bb_addr = offset & 0x0FFC; /* 4 byte access */
  137. struct IOCMD_STRUCT iocmd;
  138. iocmd.cmdclass = IOCMD_CLASS_BB_RF;
  139. iocmd.value = bb_addr;
  140. iocmd.index = IOCMD_BB_WRITE_IDX;
  141. if (shift != 0) {
  142. u32 oldValue = 0;
  143. u32 newValue = value;
  144. oldValue = r8712_bb_reg_read(pAdapter, iocmd.value);
  145. oldValue &= (0xFFFFFFFF >> ((4 - shift) * 8));
  146. value = oldValue | (newValue << (shift * 8));
  147. if (fw_iocmd_write(pAdapter, iocmd, value) == false)
  148. return false;
  149. iocmd.value += 4;
  150. oldValue = r8712_bb_reg_read(pAdapter, iocmd.value);
  151. oldValue &= (0xFFFFFFFF << (shift * 8));
  152. value = oldValue | (newValue >> ((4 - shift) * 8));
  153. }
  154. return fw_iocmd_write(pAdapter, iocmd, value);
  155. }
  156. /* offset : 0x00 ~ 0xFF */
  157. u32 r8712_rf_reg_read(struct _adapter *pAdapter, u8 path, u8 offset)
  158. {
  159. u16 rf_addr = (path << 8) | offset;
  160. u32 rf_data;
  161. struct IOCMD_STRUCT iocmd;
  162. iocmd.cmdclass = IOCMD_CLASS_BB_RF ;
  163. iocmd.value = rf_addr ;
  164. iocmd.index = IOCMD_RF_READ_IDX;
  165. rf_data = fw_iocmd_read(pAdapter, iocmd);
  166. return rf_data;
  167. }
  168. u8 r8712_rf_reg_write(struct _adapter *pAdapter, u8 path, u8 offset, u32 value)
  169. {
  170. u16 rf_addr = (path << 8) | offset;
  171. struct IOCMD_STRUCT iocmd;
  172. iocmd.cmdclass = IOCMD_CLASS_BB_RF;
  173. iocmd.value = rf_addr;
  174. iocmd.index = IOCMD_RF_WRIT_IDX;
  175. return fw_iocmd_write(pAdapter, iocmd, value);
  176. }
  177. static u32 bitshift(u32 bitmask)
  178. {
  179. u32 i;
  180. for (i = 0; i <= 31; i++)
  181. if (((bitmask>>i) & 0x1) == 1)
  182. break;
  183. return i;
  184. }
  185. static u32 get_bb_reg(struct _adapter *pAdapter, u16 offset, u32 bitmask)
  186. {
  187. u32 org_value, bit_shift, new_value;
  188. org_value = r8712_bb_reg_read(pAdapter, offset);
  189. bit_shift = bitshift(bitmask);
  190. new_value = (org_value & bitmask) >> bit_shift;
  191. return new_value;
  192. }
  193. static u8 set_bb_reg(struct _adapter *pAdapter,
  194. u16 offset,
  195. u32 bitmask,
  196. u32 value)
  197. {
  198. u32 org_value, bit_shift, new_value;
  199. if (bitmask != bMaskDWord) {
  200. org_value = r8712_bb_reg_read(pAdapter, offset);
  201. bit_shift = bitshift(bitmask);
  202. new_value = ((org_value & (~bitmask)) | (value << bit_shift));
  203. } else
  204. new_value = value;
  205. return r8712_bb_reg_write(pAdapter, offset, new_value);
  206. }
  207. static u32 get_rf_reg(struct _adapter *pAdapter, u8 path, u8 offset,
  208. u32 bitmask)
  209. {
  210. u32 org_value, bit_shift, new_value;
  211. org_value = r8712_rf_reg_read(pAdapter, path, offset);
  212. bit_shift = bitshift(bitmask);
  213. new_value = (org_value & bitmask) >> bit_shift;
  214. return new_value;
  215. }
  216. static u8 set_rf_reg(struct _adapter *pAdapter, u8 path, u8 offset, u32 bitmask,
  217. u32 value)
  218. {
  219. u32 org_value, bit_shift, new_value;
  220. if (bitmask != bMaskDWord) {
  221. org_value = r8712_rf_reg_read(pAdapter, path, offset);
  222. bit_shift = bitshift(bitmask);
  223. new_value = ((org_value & (~bitmask)) | (value << bit_shift));
  224. } else
  225. new_value = value;
  226. return r8712_rf_reg_write(pAdapter, path, offset, new_value);
  227. }
  228. /*
  229. * SetChannel
  230. * Description
  231. * Use H2C command to change channel,
  232. * not only modify rf register, but also other setting need to be done.
  233. */
  234. void r8712_SetChannel(struct _adapter *pAdapter)
  235. {
  236. struct cmd_priv *pcmdpriv = &pAdapter->cmdpriv;
  237. struct cmd_obj *pcmd = NULL;
  238. struct SetChannel_parm *pparm = NULL;
  239. u16 code = GEN_CMD_CODE(_SetChannel);
  240. pcmd = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
  241. if (pcmd == NULL)
  242. return;
  243. pparm = (struct SetChannel_parm *)_malloc(sizeof(struct
  244. SetChannel_parm));
  245. if (pparm == NULL) {
  246. kfree(pcmd);
  247. return;
  248. }
  249. pparm->curr_ch = pAdapter->mppriv.curr_ch;
  250. init_h2fwcmd_w_parm_no_rsp(pcmd, pparm, code);
  251. r8712_enqueue_cmd(pcmdpriv, pcmd);
  252. }
  253. static void SetCCKTxPower(struct _adapter *pAdapter, u8 TxPower)
  254. {
  255. u16 TxAGC = 0;
  256. TxAGC = TxPower;
  257. set_bb_reg(pAdapter, rTxAGC_CCK_Mcs32, bTxAGCRateCCK, TxAGC);
  258. }
  259. static void SetOFDMTxPower(struct _adapter *pAdapter, u8 TxPower)
  260. {
  261. u32 TxAGC = 0;
  262. TxAGC |= ((TxPower<<24)|(TxPower<<16)|(TxPower<<8)|TxPower);
  263. set_bb_reg(pAdapter, rTxAGC_Rate18_06, bTxAGCRate18_06, TxAGC);
  264. set_bb_reg(pAdapter, rTxAGC_Rate54_24, bTxAGCRate54_24, TxAGC);
  265. set_bb_reg(pAdapter, rTxAGC_Mcs03_Mcs00, bTxAGCRateMCS3_MCS0, TxAGC);
  266. set_bb_reg(pAdapter, rTxAGC_Mcs07_Mcs04, bTxAGCRateMCS7_MCS4, TxAGC);
  267. set_bb_reg(pAdapter, rTxAGC_Mcs11_Mcs08, bTxAGCRateMCS11_MCS8, TxAGC);
  268. set_bb_reg(pAdapter, rTxAGC_Mcs15_Mcs12, bTxAGCRateMCS15_MCS12, TxAGC);
  269. }
  270. void r8712_SetTxPower(struct _adapter *pAdapter)
  271. {
  272. u8 TxPower = pAdapter->mppriv.curr_txpoweridx;
  273. SetCCKTxPower(pAdapter, TxPower);
  274. SetOFDMTxPower(pAdapter, TxPower);
  275. }
  276. void r8712_SetTxAGCOffset(struct _adapter *pAdapter, u32 ulTxAGCOffset)
  277. {
  278. u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D, tmpAGC;
  279. TxAGCOffset_B = (ulTxAGCOffset&0x000000ff);
  280. TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8);
  281. TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16);
  282. tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B);
  283. set_bb_reg(pAdapter, rFPGA0_TxGainStage,
  284. (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC);
  285. }
  286. void r8712_SetDataRate(struct _adapter *pAdapter)
  287. {
  288. u8 path = RF_PATH_A;
  289. u8 offset = RF_SYN_G2;
  290. u32 value;
  291. value = (pAdapter->mppriv.curr_rateidx < 4) ? 0x4440 : 0xF200;
  292. r8712_rf_reg_write(pAdapter, path, offset, value);
  293. }
  294. void r8712_SwitchBandwidth(struct _adapter *pAdapter)
  295. {
  296. /* 3 1.Set MAC register : BWOPMODE bit2:1 20MhzBW */
  297. u8 regBwOpMode = 0;
  298. u8 Bandwidth = pAdapter->mppriv.curr_bandwidth;
  299. regBwOpMode = r8712_read8(pAdapter, 0x10250203);
  300. if (Bandwidth == HT_CHANNEL_WIDTH_20)
  301. regBwOpMode |= BIT(2);
  302. else
  303. regBwOpMode &= ~(BIT(2));
  304. r8712_write8(pAdapter, 0x10250203, regBwOpMode);
  305. /* 3 2.Set PHY related register */
  306. switch (Bandwidth) {
  307. /* 20 MHz channel*/
  308. case HT_CHANNEL_WIDTH_20:
  309. set_bb_reg(pAdapter, rFPGA0_RFMOD, bRFMOD, 0x0);
  310. set_bb_reg(pAdapter, rFPGA1_RFMOD, bRFMOD, 0x0);
  311. /* Use PHY_REG.txt default value. Do not need to change.
  312. * Correct the tx power for CCK rate in 40M.
  313. * It is set in Tx descriptor for 8192x series
  314. */
  315. set_bb_reg(pAdapter, rFPGA0_AnalogParameter2, bMaskDWord, 0x58);
  316. break;
  317. /* 40 MHz channel*/
  318. case HT_CHANNEL_WIDTH_40:
  319. set_bb_reg(pAdapter, rFPGA0_RFMOD, bRFMOD, 0x1);
  320. set_bb_reg(pAdapter, rFPGA1_RFMOD, bRFMOD, 0x1);
  321. /* Use PHY_REG.txt default value. Do not need to change.
  322. * Correct the tx power for CCK rate in 40M.
  323. * Set Control channel to upper or lower. These settings are
  324. * required only for 40MHz */
  325. set_bb_reg(pAdapter, rCCK0_System, bCCKSideBand,
  326. (HAL_PRIME_CHNL_OFFSET_DONT_CARE>>1));
  327. set_bb_reg(pAdapter, rOFDM1_LSTF, 0xC00,
  328. HAL_PRIME_CHNL_OFFSET_DONT_CARE);
  329. set_bb_reg(pAdapter, rFPGA0_AnalogParameter2, bMaskDWord, 0x18);
  330. break;
  331. default:
  332. break;
  333. }
  334. /* 3 3.Set RF related register */
  335. switch (Bandwidth) {
  336. case HT_CHANNEL_WIDTH_20:
  337. set_rf_reg(pAdapter, RF_PATH_A, RF_CHNLBW,
  338. BIT(10) | BIT(11), 0x01);
  339. break;
  340. case HT_CHANNEL_WIDTH_40:
  341. set_rf_reg(pAdapter, RF_PATH_A, RF_CHNLBW,
  342. BIT(10) | BIT(11), 0x00);
  343. break;
  344. default:
  345. break;
  346. }
  347. }
  348. /*------------------------------Define structure----------------------------*/
  349. struct R_ANTENNA_SELECT_OFDM {
  350. u32 r_tx_antenna:4;
  351. u32 r_ant_l:4;
  352. u32 r_ant_non_ht:4;
  353. u32 r_ant_ht1:4;
  354. u32 r_ant_ht2:4;
  355. u32 r_ant_ht_s1:4;
  356. u32 r_ant_non_ht_s1:4;
  357. u32 OFDM_TXSC:2;
  358. u32 Reserved:2;
  359. };
  360. struct R_ANTENNA_SELECT_CCK {
  361. u8 r_cckrx_enable_2:2;
  362. u8 r_cckrx_enable:2;
  363. u8 r_ccktx_enable:4;
  364. };
  365. void r8712_SwitchAntenna(struct _adapter *pAdapter)
  366. {
  367. u32 ofdm_tx_en_val = 0, ofdm_tx_ant_sel_val = 0;
  368. u8 ofdm_rx_ant_sel_val = 0;
  369. u8 cck_ant_select_val = 0;
  370. u32 cck_ant_sel_val = 0;
  371. struct R_ANTENNA_SELECT_CCK *p_cck_txrx;
  372. p_cck_txrx = (struct R_ANTENNA_SELECT_CCK *)&cck_ant_select_val;
  373. switch (pAdapter->mppriv.antenna_tx) {
  374. case ANTENNA_A:
  375. /* From SD3 Willis suggestion !!! Set RF A=TX and B as standby*/
  376. set_bb_reg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2);
  377. set_bb_reg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 1);
  378. ofdm_tx_en_val = 0x3;
  379. ofdm_tx_ant_sel_val = 0x11111111;/* Power save */
  380. p_cck_txrx->r_ccktx_enable = 0x8;
  381. break;
  382. case ANTENNA_B:
  383. set_bb_reg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 1);
  384. set_bb_reg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2);
  385. ofdm_tx_en_val = 0x3;
  386. ofdm_tx_ant_sel_val = 0x22222222;/* Power save */
  387. p_cck_txrx->r_ccktx_enable = 0x4;
  388. break;
  389. case ANTENNA_AB: /* For 8192S */
  390. set_bb_reg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2);
  391. set_bb_reg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2);
  392. ofdm_tx_en_val = 0x3;
  393. ofdm_tx_ant_sel_val = 0x3321333; /* Disable Power save */
  394. p_cck_txrx->r_ccktx_enable = 0xC;
  395. break;
  396. default:
  397. break;
  398. }
  399. /*OFDM Tx*/
  400. set_bb_reg(pAdapter, rFPGA1_TxInfo, 0xffffffff, ofdm_tx_ant_sel_val);
  401. /*OFDM Tx*/
  402. set_bb_reg(pAdapter, rFPGA0_TxInfo, 0x0000000f, ofdm_tx_en_val);
  403. switch (pAdapter->mppriv.antenna_rx) {
  404. case ANTENNA_A:
  405. ofdm_rx_ant_sel_val = 0x1; /* A */
  406. p_cck_txrx->r_cckrx_enable = 0x0; /* default: A */
  407. p_cck_txrx->r_cckrx_enable_2 = 0x0; /* option: A */
  408. break;
  409. case ANTENNA_B:
  410. ofdm_rx_ant_sel_val = 0x2; /* B */
  411. p_cck_txrx->r_cckrx_enable = 0x1; /* default: B */
  412. p_cck_txrx->r_cckrx_enable_2 = 0x1; /* option: B */
  413. break;
  414. case ANTENNA_AB:
  415. ofdm_rx_ant_sel_val = 0x3; /* AB */
  416. p_cck_txrx->r_cckrx_enable = 0x0; /* default:A */
  417. p_cck_txrx->r_cckrx_enable_2 = 0x1; /* option:B */
  418. break;
  419. default:
  420. break;
  421. }
  422. /*OFDM Rx*/
  423. set_bb_reg(pAdapter, rOFDM0_TRxPathEnable, 0x0000000f,
  424. ofdm_rx_ant_sel_val);
  425. /*OFDM Rx*/
  426. set_bb_reg(pAdapter, rOFDM1_TRxPathEnable, 0x0000000f,
  427. ofdm_rx_ant_sel_val);
  428. cck_ant_sel_val = cck_ant_select_val;
  429. /*CCK TxRx*/
  430. set_bb_reg(pAdapter, rCCK0_AFESetting, bMaskByte3, cck_ant_sel_val);
  431. }
  432. void r8712_SetCrystalCap(struct _adapter *pAdapter)
  433. {
  434. set_bb_reg(pAdapter, rFPGA0_AnalogParameter1, bXtalCap,
  435. pAdapter->mppriv.curr_crystalcap);
  436. }
  437. static void TriggerRFThermalMeter(struct _adapter *pAdapter)
  438. {
  439. /* 0x24: RF Reg[6:5] */
  440. set_rf_reg(pAdapter, RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
  441. }
  442. static u32 ReadRFThermalMeter(struct _adapter *pAdapter)
  443. {
  444. u32 ThermalValue = 0;
  445. /* 0x24: RF Reg[4:0] */
  446. ThermalValue = get_rf_reg(pAdapter, RF_PATH_A, RF_T_METER, 0x1F);
  447. return ThermalValue;
  448. }
  449. void r8712_GetThermalMeter(struct _adapter *pAdapter, u32 *value)
  450. {
  451. TriggerRFThermalMeter(pAdapter);
  452. msleep(1000);
  453. *value = ReadRFThermalMeter(pAdapter);
  454. }
  455. void r8712_SetSingleCarrierTx(struct _adapter *pAdapter, u8 bStart)
  456. {
  457. if (bStart) { /* Start Single Carrier. */
  458. /* 1. if OFDM block on? */
  459. if (!get_bb_reg(pAdapter, rFPGA0_RFMOD, bOFDMEn))
  460. /*set OFDM block on*/
  461. set_bb_reg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);
  462. /* 2. set CCK test mode off, set to CCK normal mode */
  463. set_bb_reg(pAdapter, rCCK0_System, bCCKBBMode, bDisable);
  464. /* 3. turn on scramble setting */
  465. set_bb_reg(pAdapter, rCCK0_System, bCCKScramble, bEnable);
  466. /* 4. Turn On Single Carrier Tx and off the other test modes. */
  467. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
  468. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bEnable);
  469. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
  470. } else { /* Stop Single Carrier.*/
  471. /* Turn off all test modes.*/
  472. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
  473. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier,
  474. bDisable);
  475. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
  476. msleep(20);
  477. /*BB Reset*/
  478. set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
  479. set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
  480. }
  481. }
  482. void r8712_SetSingleToneTx(struct _adapter *pAdapter, u8 bStart)
  483. {
  484. u8 rfPath = pAdapter->mppriv.curr_rfpath;
  485. switch (pAdapter->mppriv.antenna_tx) {
  486. case ANTENNA_B:
  487. rfPath = RF_PATH_B;
  488. break;
  489. case ANTENNA_A:
  490. default:
  491. rfPath = RF_PATH_A;
  492. break;
  493. }
  494. if (bStart) { /* Start Single Tone.*/
  495. set_bb_reg(pAdapter, rFPGA0_RFMOD, bCCKEn, bDisable);
  496. set_bb_reg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bDisable);
  497. set_rf_reg(pAdapter, rfPath, RF_TX_G2, bRFRegOffsetMask,
  498. 0xd4000);
  499. msleep(100);
  500. /* PAD all on.*/
  501. set_rf_reg(pAdapter, rfPath, RF_AC, bRFRegOffsetMask, 0x2001f);
  502. msleep(100);
  503. } else { /* Stop Single Tone.*/
  504. set_bb_reg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);
  505. set_bb_reg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);
  506. set_rf_reg(pAdapter, rfPath, RF_TX_G2, bRFRegOffsetMask,
  507. 0x54000);
  508. msleep(100);
  509. /* PAD all on.*/
  510. set_rf_reg(pAdapter, rfPath, RF_AC, bRFRegOffsetMask, 0x30000);
  511. msleep(100);
  512. }
  513. }
  514. void r8712_SetCarrierSuppressionTx(struct _adapter *pAdapter, u8 bStart)
  515. {
  516. if (bStart) { /* Start Carrier Suppression.*/
  517. if (pAdapter->mppriv.curr_rateidx <= MPT_RATE_11M) {
  518. /* 1. if CCK block on? */
  519. if (!get_bb_reg(pAdapter, rFPGA0_RFMOD, bCCKEn)) {
  520. /*set CCK block on*/
  521. set_bb_reg(pAdapter, rFPGA0_RFMOD, bCCKEn,
  522. bEnable);
  523. }
  524. /* Turn Off All Test Mode */
  525. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx,
  526. bDisable);
  527. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier,
  528. bDisable);
  529. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone,
  530. bDisable);
  531. /*transmit mode*/
  532. set_bb_reg(pAdapter, rCCK0_System, bCCKBBMode, 0x2);
  533. /*turn off scramble setting*/
  534. set_bb_reg(pAdapter, rCCK0_System, bCCKScramble,
  535. bDisable);
  536. /*Set CCK Tx Test Rate*/
  537. /*Set FTxRate to 1Mbps*/
  538. set_bb_reg(pAdapter, rCCK0_System, bCCKTxRate, 0x0);
  539. }
  540. } else { /* Stop Carrier Suppression. */
  541. if (pAdapter->mppriv.curr_rateidx <= MPT_RATE_11M) {
  542. /*normal mode*/
  543. set_bb_reg(pAdapter, rCCK0_System, bCCKBBMode, 0x0);
  544. /*turn on scramble setting*/
  545. set_bb_reg(pAdapter, rCCK0_System, bCCKScramble,
  546. bEnable);
  547. /*BB Reset*/
  548. set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
  549. set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
  550. }
  551. }
  552. }
  553. static void SetCCKContinuousTx(struct _adapter *pAdapter, u8 bStart)
  554. {
  555. u32 cckrate;
  556. if (bStart) {
  557. /* 1. if CCK block on? */
  558. if (!get_bb_reg(pAdapter, rFPGA0_RFMOD, bCCKEn)) {
  559. /*set CCK block on*/
  560. set_bb_reg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);
  561. }
  562. /* Turn Off All Test Mode */
  563. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
  564. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable);
  565. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
  566. /*Set CCK Tx Test Rate*/
  567. cckrate = pAdapter->mppriv.curr_rateidx;
  568. set_bb_reg(pAdapter, rCCK0_System, bCCKTxRate, cckrate);
  569. /*transmit mode*/
  570. set_bb_reg(pAdapter, rCCK0_System, bCCKBBMode, 0x2);
  571. /*turn on scramble setting*/
  572. set_bb_reg(pAdapter, rCCK0_System, bCCKScramble, bEnable);
  573. } else {
  574. /*normal mode*/
  575. set_bb_reg(pAdapter, rCCK0_System, bCCKBBMode, 0x0);
  576. /*turn on scramble setting*/
  577. set_bb_reg(pAdapter, rCCK0_System, bCCKScramble, bEnable);
  578. /*BB Reset*/
  579. set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
  580. set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
  581. }
  582. } /* mpt_StartCckContTx */
  583. static void SetOFDMContinuousTx(struct _adapter *pAdapter, u8 bStart)
  584. {
  585. if (bStart) {
  586. /* 1. if OFDM block on? */
  587. if (!get_bb_reg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) {
  588. /*set OFDM block on*/
  589. set_bb_reg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);
  590. }
  591. /* 2. set CCK test mode off, set to CCK normal mode*/
  592. set_bb_reg(pAdapter, rCCK0_System, bCCKBBMode, bDisable);
  593. /* 3. turn on scramble setting */
  594. set_bb_reg(pAdapter, rCCK0_System, bCCKScramble, bEnable);
  595. /* 4. Turn On Continue Tx and turn off the other test modes.*/
  596. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bEnable);
  597. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable);
  598. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
  599. } else {
  600. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
  601. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier,
  602. bDisable);
  603. set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
  604. msleep(20);
  605. /*BB Reset*/
  606. set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
  607. set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
  608. }
  609. } /* mpt_StartOfdmContTx */
  610. void r8712_SetContinuousTx(struct _adapter *pAdapter, u8 bStart)
  611. {
  612. /* ADC turn off [bit24-21] adc port0 ~ port1 */
  613. if (bStart) {
  614. r8712_bb_reg_write(pAdapter, rRx_Wait_CCCA,
  615. r8712_bb_reg_read(pAdapter,
  616. rRx_Wait_CCCA) & 0xFE1FFFFF);
  617. msleep(100);
  618. }
  619. if (pAdapter->mppriv.curr_rateidx <= MPT_RATE_11M)
  620. SetCCKContinuousTx(pAdapter, bStart);
  621. else if ((pAdapter->mppriv.curr_rateidx >= MPT_RATE_6M) &&
  622. (pAdapter->mppriv.curr_rateidx <= MPT_RATE_MCS15))
  623. SetOFDMContinuousTx(pAdapter, bStart);
  624. /* ADC turn on [bit24-21] adc port0 ~ port1 */
  625. if (!bStart)
  626. r8712_bb_reg_write(pAdapter, rRx_Wait_CCCA,
  627. r8712_bb_reg_read(pAdapter,
  628. rRx_Wait_CCCA) | 0x01E00000);
  629. }
  630. void r8712_ResetPhyRxPktCount(struct _adapter *pAdapter)
  631. {
  632. u32 i, phyrx_set = 0;
  633. for (i = OFDM_PPDU_BIT; i <= HT_MPDU_FAIL_BIT; i++) {
  634. phyrx_set = 0;
  635. phyrx_set |= (i << 28); /*select*/
  636. phyrx_set |= 0x08000000; /* set counter to zero*/
  637. r8712_write32(pAdapter, RXERR_RPT, phyrx_set);
  638. }
  639. }
  640. static u32 GetPhyRxPktCounts(struct _adapter *pAdapter, u32 selbit)
  641. {
  642. /*selection*/
  643. u32 phyrx_set = 0, count = 0;
  644. u32 SelectBit;
  645. SelectBit = selbit << 28;
  646. phyrx_set |= (SelectBit & 0xF0000000);
  647. r8712_write32(pAdapter, RXERR_RPT, phyrx_set);
  648. /*Read packet count*/
  649. count = r8712_read32(pAdapter, RXERR_RPT) & RPTMaxCount;
  650. return count;
  651. }
  652. u32 r8712_GetPhyRxPktReceived(struct _adapter *pAdapter)
  653. {
  654. u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;
  655. OFDM_cnt = GetPhyRxPktCounts(pAdapter, OFDM_MPDU_OK_BIT);
  656. CCK_cnt = GetPhyRxPktCounts(pAdapter, CCK_MPDU_OK_BIT);
  657. HT_cnt = GetPhyRxPktCounts(pAdapter, HT_MPDU_OK_BIT);
  658. return OFDM_cnt + CCK_cnt + HT_cnt;
  659. }
  660. u32 r8712_GetPhyRxPktCRC32Error(struct _adapter *pAdapter)
  661. {
  662. u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;
  663. OFDM_cnt = GetPhyRxPktCounts(pAdapter, OFDM_MPDU_FAIL_BIT);
  664. CCK_cnt = GetPhyRxPktCounts(pAdapter, CCK_MPDU_FAIL_BIT);
  665. HT_cnt = GetPhyRxPktCounts(pAdapter, HT_MPDU_FAIL_BIT);
  666. return OFDM_cnt + CCK_cnt + HT_cnt;
  667. }