phydm_cck_pd.c 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2007 - 2017 Realtek Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * The full GNU General Public License is included in this distribution in the
  15. * file called LICENSE.
  16. *
  17. * Contact Information:
  18. * wlanfae <wlanfae@realtek.com>
  19. * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
  20. * Hsinchu 300, Taiwan.
  21. *
  22. * Larry Finger <Larry.Finger@lwfinger.net>
  23. *
  24. *****************************************************************************/
  25. /*@************************************************************
  26. * include files
  27. ************************************************************/
  28. #include "mp_precomp.h"
  29. #include "phydm_precomp.h"
  30. #ifdef PHYDM_SUPPORT_CCKPD
  31. #ifdef PHYDM_COMPILE_CCKPD_TYPE1
  32. void phydm_write_cck_pd_type1(void *dm_void, u8 cca_th)
  33. {
  34. struct dm_struct *dm = (struct dm_struct *)dm_void;
  35. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  36. PHYDM_DBG(dm, DBG_CCKPD, "[%s] cck_cca_th=((0x%x))\n",
  37. __func__, cca_th);
  38. odm_write_1byte(dm, R_0xa0a, cca_th);
  39. cckpd_t->cur_cck_cca_thres = cca_th;
  40. }
  41. void phydm_set_cckpd_lv_type1(void *dm_void, enum cckpd_lv lv)
  42. {
  43. struct dm_struct *dm = (struct dm_struct *)dm_void;
  44. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  45. u8 pd_th = 0;
  46. PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
  47. PHYDM_DBG(dm, DBG_CCKPD, "lv: (%d) -> (%d)\n", cckpd_t->cck_pd_lv, lv);
  48. if (cckpd_t->cck_pd_lv == lv) {
  49. PHYDM_DBG(dm, DBG_CCKPD, "stay in lv=%d\n", lv);
  50. return;
  51. }
  52. cckpd_t->cck_pd_lv = lv;
  53. cckpd_t->cck_fa_ma = CCK_FA_MA_RESET;
  54. if (lv == CCK_PD_LV_4)
  55. pd_th = 0xed;
  56. else if (lv == CCK_PD_LV_3)
  57. pd_th = 0xdd;
  58. else if (lv == CCK_PD_LV_2)
  59. pd_th = 0xcd;
  60. else if (lv == CCK_PD_LV_1)
  61. pd_th = 0x83;
  62. else if (lv == CCK_PD_LV_0)
  63. pd_th = 0x40;
  64. phydm_write_cck_pd_type1(dm, pd_th);
  65. }
  66. void phydm_cckpd_type1(void *dm_void)
  67. {
  68. struct dm_struct *dm = (struct dm_struct *)dm_void;
  69. struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
  70. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  71. enum cckpd_lv lv = CCK_PD_LV_INIT;
  72. boolean is_update = true;
  73. if (dm->is_linked) {
  74. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
  75. if (dm->rssi_min > 60) {
  76. lv = CCK_PD_LV_3;
  77. } else if (dm->rssi_min > 35) {
  78. lv = CCK_PD_LV_2;
  79. } else if (dm->rssi_min > 20) {
  80. if (cckpd_t->cck_fa_ma > 500)
  81. lv = CCK_PD_LV_2;
  82. else if (cckpd_t->cck_fa_ma < 250)
  83. lv = CCK_PD_LV_1;
  84. else
  85. is_update = false;
  86. } else { /*RSSI < 20*/
  87. lv = CCK_PD_LV_1;
  88. }
  89. #else /*ODM_AP*/
  90. if (dig_t->cur_ig_value > 0x32)
  91. lv = CCK_PD_LV_4;
  92. else if (dig_t->cur_ig_value > 0x2a)
  93. lv = CCK_PD_LV_3;
  94. else if (dig_t->cur_ig_value > 0x24)
  95. lv = CCK_PD_LV_2;
  96. else
  97. lv = CCK_PD_LV_1;
  98. #endif
  99. } else {
  100. if (cckpd_t->cck_fa_ma > 1000)
  101. lv = CCK_PD_LV_1;
  102. else if (cckpd_t->cck_fa_ma < 500)
  103. lv = CCK_PD_LV_0;
  104. else
  105. is_update = false;
  106. }
  107. /*[Abnormal case] =================================================*/
  108. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  109. /*@HP 22B LPS power consumption issue & [PCIE-1596]*/
  110. if (dm->hp_hw_id && dm->traffic_load == TRAFFIC_ULTRA_LOW) {
  111. lv = CCK_PD_LV_0;
  112. PHYDM_DBG(dm, DBG_CCKPD, "CCKPD Abnormal case1\n");
  113. } else if ((dm->p_advance_ota & PHYDM_ASUS_OTA_SETTING) &&
  114. cckpd_t->cck_fa_ma > 200 && dm->rssi_min <= 20) {
  115. lv = CCK_PD_LV_1;
  116. cckpd_t->cck_pd_lv = lv;
  117. phydm_write_cck_pd_type1(dm, 0xc3); /*@for ASUS OTA test*/
  118. is_update = false;
  119. PHYDM_DBG(dm, DBG_CCKPD, "CCKPD Abnormal case2\n");
  120. }
  121. #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  122. #ifdef MCR_WIRELESS_EXTEND
  123. lv = CCK_PD_LV_2;
  124. cckpd_t->cck_pd_lv = lv;
  125. phydm_write_cck_pd_type1(dm, 0x43);
  126. is_update = false;
  127. PHYDM_DBG(dm, DBG_CCKPD, "CCKPD Abnormal case3\n");
  128. #endif
  129. #endif
  130. /*=================================================================*/
  131. if (is_update)
  132. phydm_set_cckpd_lv_type1(dm, lv);
  133. PHYDM_DBG(dm, DBG_CCKPD, "is_linked=%d, lv=%d, pd_th=0x%x\n\n",
  134. dm->is_linked, cckpd_t->cck_pd_lv,
  135. cckpd_t->cur_cck_cca_thres);
  136. }
  137. #endif /*#ifdef PHYDM_COMPILE_CCKPD_TYPE1*/
  138. #ifdef PHYDM_COMPILE_CCKPD_TYPE2
  139. void phydm_write_cck_pd_type2(void *dm_void, u8 cca_th, u8 cca_th_aaa)
  140. {
  141. struct dm_struct *dm = (struct dm_struct *)dm_void;
  142. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  143. PHYDM_DBG(dm, DBG_CCKPD, "[%s] pd_th=0x%x, cs_ratio=0x%x\n",
  144. __func__, cca_th, cca_th_aaa);
  145. odm_set_bb_reg(dm, R_0xa08, 0xf0000, cca_th);
  146. odm_set_bb_reg(dm, R_0xaa8, 0x1f0000, cca_th_aaa);
  147. cckpd_t->cur_cck_cca_thres = cca_th;
  148. cckpd_t->cck_cca_th_aaa = cca_th_aaa;
  149. }
  150. void phydm_set_cckpd_lv_type2(void *dm_void, enum cckpd_lv lv)
  151. {
  152. struct dm_struct *dm = (struct dm_struct *)dm_void;
  153. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  154. u8 pd_th = 0, cs_ratio = 0, cs_2r_offset = 0;
  155. u8 cck_n_rx = 1;
  156. PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
  157. PHYDM_DBG(dm, DBG_CCKPD, "lv: (%d) -> (%d)\n", cckpd_t->cck_pd_lv, lv);
  158. /*@r_mrx & r_cca_mrc*/
  159. cck_n_rx = (odm_get_bb_reg(dm, R_0xa2c, BIT(18)) &&
  160. odm_get_bb_reg(dm, R_0xa2c, BIT(22))) ? 2 : 1;
  161. if (cckpd_t->cck_pd_lv == lv && cckpd_t->cck_n_rx == cck_n_rx) {
  162. PHYDM_DBG(dm, DBG_CCKPD, "stay in lv=%d\n", lv);
  163. return;
  164. }
  165. cckpd_t->cck_n_rx = cck_n_rx;
  166. cckpd_t->cck_pd_lv = lv;
  167. cckpd_t->cck_fa_ma = CCK_FA_MA_RESET;
  168. if (lv == CCK_PD_LV_4) {
  169. cs_ratio = cckpd_t->aaa_default + 8;
  170. cs_2r_offset = 5;
  171. pd_th = 0xd;
  172. } else if (lv == CCK_PD_LV_3) {
  173. cs_ratio = cckpd_t->aaa_default + 6;
  174. cs_2r_offset = 4;
  175. pd_th = 0xd;
  176. } else if (lv == CCK_PD_LV_2) {
  177. cs_ratio = cckpd_t->aaa_default + 4;
  178. cs_2r_offset = 3;
  179. pd_th = 0xd;
  180. } else if (lv == CCK_PD_LV_1) {
  181. cs_ratio = cckpd_t->aaa_default + 2;
  182. cs_2r_offset = 1;
  183. pd_th = 0x7;
  184. } else if (lv == CCK_PD_LV_0) {
  185. cs_ratio = cckpd_t->aaa_default;
  186. cs_2r_offset = 0;
  187. pd_th = 0x3;
  188. }
  189. if (cckpd_t->cck_n_rx == 2) {
  190. if (cs_ratio >= cs_2r_offset)
  191. cs_ratio = cs_ratio - cs_2r_offset;
  192. else
  193. cs_ratio = 0;
  194. }
  195. phydm_write_cck_pd_type2(dm, pd_th, cs_ratio);
  196. }
  197. void phydm_cckpd_type2(void *dm_void)
  198. {
  199. struct dm_struct *dm = (struct dm_struct *)dm_void;
  200. struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
  201. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  202. enum cckpd_lv lv = CCK_PD_LV_INIT;
  203. u8 igi = dig_t->cur_ig_value;
  204. u8 rssi_min = dm->rssi_min;
  205. boolean is_update = true;
  206. PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
  207. if (dm->is_linked) {
  208. if (igi > 0x38 && rssi_min > 32) {
  209. lv = CCK_PD_LV_4;
  210. } else if (igi > 0x2a && rssi_min > 32) {
  211. lv = CCK_PD_LV_3;
  212. } else if (igi > 0x24 || (rssi_min > 24 && rssi_min <= 30)) {
  213. lv = CCK_PD_LV_2;
  214. } else if (igi <= 0x24 || rssi_min < 22) {
  215. if (cckpd_t->cck_fa_ma > 1000) {
  216. lv = CCK_PD_LV_1;
  217. } else if (cckpd_t->cck_fa_ma < 500) {
  218. lv = CCK_PD_LV_0;
  219. } else {
  220. is_update = false;
  221. }
  222. } else {
  223. is_update = false;
  224. }
  225. } else {
  226. if (cckpd_t->cck_fa_ma > 1000) {
  227. lv = CCK_PD_LV_1;
  228. } else if (cckpd_t->cck_fa_ma < 500) {
  229. lv = CCK_PD_LV_0;
  230. } else {
  231. is_update = false;
  232. }
  233. }
  234. if (is_update) {
  235. phydm_set_cckpd_lv_type2(dm, lv);
  236. }
  237. PHYDM_DBG(dm, DBG_CCKPD,
  238. "is_linked=%d, lv=%d, n_rx=%d, cs_ratio=0x%x, pd_th=0x%x\n\n",
  239. dm->is_linked, cckpd_t->cck_pd_lv, cckpd_t->cck_n_rx,
  240. cckpd_t->cck_cca_th_aaa, cckpd_t->cur_cck_cca_thres);
  241. }
  242. #endif /*#ifdef PHYDM_COMPILE_CCKPD_TYPE2*/
  243. #ifdef PHYDM_COMPILE_CCKPD_TYPE3
  244. void phydm_write_cck_pd_type3(void *dm_void, u8 pd_th, u8 cs_ratio,
  245. enum cckpd_mode mode)
  246. {
  247. struct dm_struct *dm = (struct dm_struct *)dm_void;
  248. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  249. PHYDM_DBG(dm, DBG_CCKPD,
  250. "[%s] mode=%d, pd_th=0x%x, cs_ratio=0x%x\n", __func__,
  251. mode, pd_th, cs_ratio);
  252. switch (mode) {
  253. case CCK_BW20_1R: /*RFBW20_1R*/
  254. {
  255. cckpd_t->cur_cck_pd_20m_1r = pd_th;
  256. cckpd_t->cur_cck_cs_ratio_20m_1r = cs_ratio;
  257. odm_set_bb_reg(dm, R_0xac8, 0xff, pd_th);
  258. odm_set_bb_reg(dm, R_0xad0, 0x1f, cs_ratio);
  259. } break;
  260. case CCK_BW20_2R: /*RFBW20_2R*/
  261. {
  262. cckpd_t->cur_cck_pd_20m_2r = pd_th;
  263. cckpd_t->cur_cck_cs_ratio_20m_2r = cs_ratio;
  264. odm_set_bb_reg(dm, R_0xac8, 0xff00, pd_th);
  265. odm_set_bb_reg(dm, R_0xad0, 0x3e0, cs_ratio);
  266. } break;
  267. case CCK_BW40_1R: /*RFBW40_1R*/
  268. {
  269. cckpd_t->cur_cck_pd_40m_1r = pd_th;
  270. cckpd_t->cur_cck_cs_ratio_40m_1r = cs_ratio;
  271. odm_set_bb_reg(dm, R_0xacc, 0xff, pd_th);
  272. odm_set_bb_reg(dm, R_0xad0, 0x1f00000, cs_ratio);
  273. } break;
  274. case CCK_BW40_2R: /*RFBW40_2R*/
  275. {
  276. cckpd_t->cur_cck_pd_40m_2r = pd_th;
  277. cckpd_t->cur_cck_cs_ratio_40m_2r = cs_ratio;
  278. odm_set_bb_reg(dm, R_0xacc, 0xff00, pd_th);
  279. odm_set_bb_reg(dm, R_0xad0, 0x3e000000, cs_ratio);
  280. } break;
  281. default:
  282. /*@pr_debug("[%s] warning!\n", __func__);*/
  283. break;
  284. }
  285. }
  286. void phydm_set_cckpd_lv_type3(void *dm_void, enum cckpd_lv lv)
  287. {
  288. struct dm_struct *dm = (struct dm_struct *)dm_void;
  289. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  290. enum cckpd_mode cck_mode = CCK_BW20_2R;
  291. enum channel_width cck_bw = CHANNEL_WIDTH_20;
  292. u8 cck_n_rx = 1;
  293. u8 pd_th;
  294. u8 cs_ratio;
  295. PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
  296. PHYDM_DBG(dm, DBG_CCKPD, "lv: (%d) -> (%d)\n", cckpd_t->cck_pd_lv, lv);
  297. /*[Check Nrx]*/
  298. cck_n_rx = (odm_get_bb_reg(dm, R_0xa2c, BIT(17))) ? 2 : 1;
  299. /*[Check BW]*/
  300. if (odm_get_bb_reg(dm, R_0x800, BIT(0)))
  301. cck_bw = CHANNEL_WIDTH_40;
  302. else
  303. cck_bw = CHANNEL_WIDTH_20;
  304. /*[Check LV]*/
  305. if (cckpd_t->cck_pd_lv == lv &&
  306. cckpd_t->cck_n_rx == cck_n_rx &&
  307. cckpd_t->cck_bw == cck_bw) {
  308. PHYDM_DBG(dm, DBG_CCKPD, "stay in lv=%d\n", lv);
  309. return;
  310. }
  311. cckpd_t->cck_bw = cck_bw;
  312. cckpd_t->cck_n_rx = cck_n_rx;
  313. cckpd_t->cck_pd_lv = lv;
  314. cckpd_t->cck_fa_ma = CCK_FA_MA_RESET;
  315. if (cck_n_rx == 2) {
  316. if (cck_bw == CHANNEL_WIDTH_20) {
  317. pd_th = cckpd_t->cck_pd_20m_2r;
  318. cs_ratio = cckpd_t->cck_cs_ratio_20m_2r;
  319. cck_mode = CCK_BW20_2R;
  320. } else {
  321. pd_th = cckpd_t->cck_pd_40m_2r;
  322. cs_ratio = cckpd_t->cck_cs_ratio_40m_2r;
  323. cck_mode = CCK_BW40_2R;
  324. }
  325. } else {
  326. if (cck_bw == CHANNEL_WIDTH_20) {
  327. pd_th = cckpd_t->cck_pd_20m_1r;
  328. cs_ratio = cckpd_t->cck_cs_ratio_20m_1r;
  329. cck_mode = CCK_BW20_1R;
  330. } else {
  331. pd_th = cckpd_t->cck_pd_40m_1r;
  332. cs_ratio = cckpd_t->cck_cs_ratio_40m_1r;
  333. cck_mode = CCK_BW40_1R;
  334. }
  335. }
  336. if (lv == CCK_PD_LV_4) {
  337. if (cck_n_rx == 2) {
  338. pd_th += 4;
  339. cs_ratio += 2;
  340. } else {
  341. pd_th += 4;
  342. cs_ratio += 3;
  343. }
  344. } else if (lv == CCK_PD_LV_3) {
  345. if (cck_n_rx == 2) {
  346. pd_th += 3;
  347. cs_ratio += 1;
  348. } else {
  349. pd_th += 3;
  350. cs_ratio += 2;
  351. }
  352. } else if (lv == CCK_PD_LV_2) {
  353. pd_th += 2;
  354. cs_ratio += 1;
  355. } else if (lv == CCK_PD_LV_1) {
  356. pd_th += 1;
  357. cs_ratio += 1;
  358. }
  359. #if 0
  360. else if (lv == CCK_PD_LV_0) {
  361. pd_th += 0;
  362. cs_ratio += 0;
  363. }
  364. #endif
  365. phydm_write_cck_pd_type3(dm, pd_th, cs_ratio, cck_mode);
  366. }
  367. void phydm_cckpd_type3(void *dm_void)
  368. {
  369. struct dm_struct *dm = (struct dm_struct *)dm_void;
  370. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  371. enum cckpd_lv lv = CCK_PD_LV_INIT;
  372. u8 igi = dm->dm_dig_table.cur_ig_value;
  373. boolean is_update = true;
  374. u8 pd_th = 0;
  375. u8 cs_ratio = 0;
  376. PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
  377. if (dm->is_linked) {
  378. if (igi > 0x38 && dm->rssi_min > 32) {
  379. lv = CCK_PD_LV_4;
  380. } else if ((igi > 0x2a) && (dm->rssi_min > 32)) {
  381. lv = CCK_PD_LV_3;
  382. } else if ((igi > 0x24) ||
  383. (dm->rssi_min > 24 && dm->rssi_min <= 30)) {
  384. lv = CCK_PD_LV_2;
  385. } else if ((igi <= 0x24) || (dm->rssi_min < 22)) {
  386. if (cckpd_t->cck_fa_ma > 1000)
  387. lv = CCK_PD_LV_1;
  388. else if (cckpd_t->cck_fa_ma < 500)
  389. lv = CCK_PD_LV_0;
  390. else
  391. is_update = false;
  392. }
  393. } else {
  394. if (cckpd_t->cck_fa_ma > 1000)
  395. lv = CCK_PD_LV_1;
  396. else if (cckpd_t->cck_fa_ma < 500)
  397. lv = CCK_PD_LV_0;
  398. else
  399. is_update = false;
  400. }
  401. if (is_update)
  402. phydm_set_cckpd_lv_type3(dm, lv);
  403. if (cckpd_t->cck_n_rx == 2) {
  404. if (cckpd_t->cck_bw == CHANNEL_WIDTH_20) {
  405. pd_th = cckpd_t->cur_cck_pd_20m_2r;
  406. cs_ratio = cckpd_t->cur_cck_cs_ratio_20m_2r;
  407. } else {
  408. pd_th = cckpd_t->cur_cck_pd_40m_2r;
  409. cs_ratio = cckpd_t->cur_cck_cs_ratio_40m_2r;
  410. }
  411. } else {
  412. if (cckpd_t->cck_bw == CHANNEL_WIDTH_20) {
  413. pd_th = cckpd_t->cur_cck_pd_20m_1r;
  414. cs_ratio = cckpd_t->cur_cck_cs_ratio_20m_1r;
  415. } else {
  416. pd_th = cckpd_t->cur_cck_pd_40m_1r;
  417. cs_ratio = cckpd_t->cur_cck_cs_ratio_40m_1r;
  418. }
  419. }
  420. PHYDM_DBG(dm, DBG_CCKPD,
  421. "[%dR][%dM] is_linked=%d, lv=%d, cs_ratio=0x%x, pd_th=0x%x\n\n",
  422. cckpd_t->cck_n_rx, 20 << cckpd_t->cck_bw, dm->is_linked,
  423. cckpd_t->cck_pd_lv, cs_ratio, pd_th);
  424. }
  425. void phydm_cck_pd_init_type3(void *dm_void)
  426. {
  427. struct dm_struct *dm = (struct dm_struct *)dm_void;
  428. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  429. u32 reg_tmp = 0;
  430. /*Get Default value*/
  431. cckpd_t->cck_pd_20m_1r = (u8)odm_get_bb_reg(dm, R_0xac8, 0xff);
  432. cckpd_t->cck_pd_20m_2r = (u8)odm_get_bb_reg(dm, R_0xac8, 0xff00);
  433. cckpd_t->cck_pd_40m_1r = (u8)odm_get_bb_reg(dm, R_0xacc, 0xff);
  434. cckpd_t->cck_pd_40m_2r = (u8)odm_get_bb_reg(dm, R_0xacc, 0xff00);
  435. reg_tmp = odm_get_bb_reg(dm, R_0xad0, MASKDWORD);
  436. cckpd_t->cck_cs_ratio_20m_1r = (u8)(reg_tmp & 0x1f);
  437. cckpd_t->cck_cs_ratio_20m_2r = (u8)((reg_tmp & 0x3e0) >> 5);
  438. cckpd_t->cck_cs_ratio_40m_1r = (u8)((reg_tmp & 0x1f00000) >> 20);
  439. cckpd_t->cck_cs_ratio_40m_2r = (u8)((reg_tmp & 0x3e000000) >> 25);
  440. phydm_set_cckpd_lv_type3(dm, CCK_PD_LV_0);
  441. }
  442. #endif /*#ifdef PHYDM_COMPILE_CCKPD_TYPE3*/
  443. #ifdef PHYDM_COMPILE_CCKPD_TYPE4
  444. void phydm_write_cck_pd_type4(void *dm_void, enum cckpd_lv lv,
  445. enum cckpd_mode mode)
  446. {
  447. struct dm_struct *dm = (struct dm_struct *)dm_void;
  448. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  449. u32 val = 0;
  450. PHYDM_DBG(dm, DBG_CCKPD, "write CCK CCA parameters(CS_ratio & PD)\n");
  451. switch (mode) {
  452. case CCK_BW20_1R: /*RFBW20_1R*/
  453. {
  454. val = cckpd_t->cck_pd_table_jgr3[0][0][0][lv];
  455. odm_set_bb_reg(dm, R_0x1ac8, 0xff, val);
  456. val = cckpd_t->cck_pd_table_jgr3[0][0][1][lv];
  457. odm_set_bb_reg(dm, R_0x1ad0, 0x1f, val);
  458. } break;
  459. case CCK_BW40_1R: /*RFBW40_1R*/
  460. {
  461. val = cckpd_t->cck_pd_table_jgr3[1][0][0][lv];
  462. odm_set_bb_reg(dm, R_0x1acc, 0xff, val);
  463. val = cckpd_t->cck_pd_table_jgr3[1][0][1][lv];
  464. odm_set_bb_reg(dm, R_0x1ad0, 0x01F00000, val);
  465. } break;
  466. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  467. case CCK_BW20_2R: /*RFBW20_2R*/
  468. {
  469. val = cckpd_t->cck_pd_table_jgr3[0][1][0][lv];
  470. odm_set_bb_reg(dm, R_0x1ac8, 0xff00, val);
  471. val = cckpd_t->cck_pd_table_jgr3[0][1][1][lv];
  472. odm_set_bb_reg(dm, R_0x1ad0, 0x3e0, val);
  473. } break;
  474. case CCK_BW40_2R: /*RFBW40_2R*/
  475. {
  476. val = cckpd_t->cck_pd_table_jgr3[1][1][0][lv];
  477. odm_set_bb_reg(dm, R_0x1acc, 0xff00, val);
  478. val = cckpd_t->cck_pd_table_jgr3[1][1][1][lv];
  479. odm_set_bb_reg(dm, R_0x1ad0, 0x3E000000, val);
  480. } break;
  481. #endif
  482. #if (defined(PHYDM_COMPILE_ABOVE_3SS))
  483. case CCK_BW20_3R: /*RFBW20_3R*/
  484. {
  485. val = cckpd_t->cck_pd_table_jgr3[0][2][0][lv];
  486. odm_set_bb_reg(dm, R_0x1ac8, 0xff0000, val);
  487. val = cckpd_t->cck_pd_table_jgr3[0][2][1][lv];
  488. odm_set_bb_reg(dm, R_0x1ad0, 0x7c00, val);
  489. } break;
  490. case CCK_BW40_3R: /*RFBW40_3R*/
  491. {
  492. val = cckpd_t->cck_pd_table_jgr3[1][2][0][lv];
  493. odm_set_bb_reg(dm, R_0x1acc, 0xff0000, val);
  494. val = cckpd_t->cck_pd_table_jgr3[1][2][1][lv] & 0x3;
  495. odm_set_bb_reg(dm, R_0x1ad0, 0xC0000000, val);
  496. val = (cckpd_t->cck_pd_table_jgr3[1][2][1][lv] & 0x1c) >> 2;
  497. odm_set_bb_reg(dm, R_0x1ad4, 0x7, val);
  498. } break;
  499. #endif
  500. #if (defined(PHYDM_COMPILE_ABOVE_4SS))
  501. case CCK_BW20_4R: /*RFBW20_4R*/
  502. {
  503. val = cckpd_t->cck_pd_table_jgr3[0][3][0][lv];
  504. odm_set_bb_reg(dm, R_0x1ac8, 0xff000000, val);
  505. val = cckpd_t->cck_pd_table_jgr3[0][3][1][lv];
  506. odm_set_bb_reg(dm, R_0x1ad0, 0xF8000, val);
  507. } break;
  508. case CCK_BW40_4R: /*RFBW40_4R*/
  509. {
  510. val = cckpd_t->cck_pd_table_jgr3[1][3][0][lv];
  511. odm_set_bb_reg(dm, R_0x1acc, 0xff000000, val);
  512. val = cckpd_t->cck_pd_table_jgr3[1][3][1][lv];
  513. odm_set_bb_reg(dm, R_0x1ad4, 0xf8, val);
  514. } break;
  515. #endif
  516. default:
  517. /*@pr_debug("[%s] warning!\n", __func__);*/
  518. break;
  519. }
  520. }
  521. void phydm_set_cck_pd_lv_type4(void *dm_void, enum cckpd_lv lv)
  522. {
  523. struct dm_struct *dm = (struct dm_struct *)dm_void;
  524. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  525. enum cckpd_mode cck_mode = CCK_BW20_2R;
  526. enum channel_width cck_bw = CHANNEL_WIDTH_20;
  527. u8 cck_n_rx;
  528. u32 val;
  529. /*u32 val_dbg = 0;*/
  530. PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
  531. PHYDM_DBG(dm, DBG_CCKPD, "lv: (%d) -> (%d)\n", cckpd_t->cck_pd_lv, lv);
  532. /*[Check Nrx]*/
  533. cck_n_rx = (u8)odm_get_bb_reg(dm, R_0x1a2c, 0x60000) + 1;
  534. /*[Check BW]*/
  535. val = odm_get_bb_reg(dm, R_0x9b0, 0xc);
  536. if (val == 0)
  537. cck_bw = CHANNEL_WIDTH_20;
  538. else if (val == 1)
  539. cck_bw = CHANNEL_WIDTH_40;
  540. else
  541. cck_bw = CHANNEL_WIDTH_80;
  542. /*[Check LV]*/
  543. if (cckpd_t->cck_pd_lv == lv &&
  544. cckpd_t->cck_n_rx == cck_n_rx &&
  545. cckpd_t->cck_bw == cck_bw) {
  546. PHYDM_DBG(dm, DBG_CCKPD, "stay in lv=%d\n", lv);
  547. return;
  548. }
  549. cckpd_t->cck_bw = cck_bw;
  550. cckpd_t->cck_n_rx = cck_n_rx;
  551. cckpd_t->cck_pd_lv = lv;
  552. cckpd_t->cck_fa_ma = CCK_FA_MA_RESET;
  553. switch (cck_n_rx) {
  554. case 1: /*1R*/
  555. {
  556. if (cck_bw == CHANNEL_WIDTH_20)
  557. cck_mode = CCK_BW20_1R;
  558. else if (cck_bw == CHANNEL_WIDTH_40)
  559. cck_mode = CCK_BW40_1R;
  560. } break;
  561. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  562. case 2: /*2R*/
  563. {
  564. if (cck_bw == CHANNEL_WIDTH_20)
  565. cck_mode = CCK_BW20_2R;
  566. else if (cck_bw == CHANNEL_WIDTH_40)
  567. cck_mode = CCK_BW40_2R;
  568. } break;
  569. #endif
  570. #if (defined(PHYDM_COMPILE_ABOVE_3SS))
  571. case 3: /*3R*/
  572. {
  573. if (cck_bw == CHANNEL_WIDTH_20)
  574. cck_mode = CCK_BW20_3R;
  575. else if (cck_bw == CHANNEL_WIDTH_40)
  576. cck_mode = CCK_BW40_3R;
  577. } break;
  578. #endif
  579. #if (defined(PHYDM_COMPILE_ABOVE_4SS))
  580. case 4: /*4R*/
  581. {
  582. if (cck_bw == CHANNEL_WIDTH_20)
  583. cck_mode = CCK_BW20_4R;
  584. else if (cck_bw == CHANNEL_WIDTH_40)
  585. cck_mode = CCK_BW40_4R;
  586. } break;
  587. #endif
  588. default:
  589. /*@pr_debug("[%s] warning!\n", __func__);*/
  590. break;
  591. }
  592. phydm_write_cck_pd_type4(dm, lv, cck_mode);
  593. }
  594. void phydm_read_cckpd_para_type4(void *dm_void)
  595. {
  596. struct dm_struct *dm = (struct dm_struct *)dm_void;
  597. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  598. u8 bw = 0; /*r_RX_RF_BW*/
  599. u8 n_rx = 0;
  600. u8 curr_cck_pd_t[2][4][2];
  601. u32 reg0 = 0;
  602. u32 reg1 = 0;
  603. u32 reg2 = 0;
  604. u32 reg3 = 0;
  605. bw = (u8)odm_get_bb_reg(dm, R_0x9b0, 0xc);
  606. n_rx = (u8)odm_get_bb_reg(dm, R_0x1a2c, 0x60000) + 1;
  607. reg0 = odm_get_bb_reg(dm, R_0x1ac8, MASKDWORD);
  608. reg1 = odm_get_bb_reg(dm, R_0x1acc, MASKDWORD);
  609. reg2 = odm_get_bb_reg(dm, R_0x1ad0, MASKDWORD);
  610. reg3 = odm_get_bb_reg(dm, R_0x1ad4, MASKDWORD);
  611. curr_cck_pd_t[0][0][0] = (u8)(reg0 & 0x000000ff);
  612. curr_cck_pd_t[1][0][0] = (u8)(reg1 & 0x000000ff);
  613. curr_cck_pd_t[0][0][1] = (u8)(reg2 & 0x0000001f);
  614. curr_cck_pd_t[1][0][1] = (u8)((reg2 & 0x01f00000) >> 20);
  615. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  616. if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS) {
  617. curr_cck_pd_t[0][1][0] = (u8)((reg0 & 0x0000ff00) >> 8);
  618. curr_cck_pd_t[1][1][0] = (u8)((reg1 & 0x0000ff00) >> 8);
  619. curr_cck_pd_t[0][1][1] = (u8)((reg2 & 0x000003E0) >> 5);
  620. curr_cck_pd_t[1][1][1] = (u8)((reg2 & 0x3E000000) >> 25);
  621. }
  622. #endif
  623. #if (defined(PHYDM_COMPILE_ABOVE_3SS))
  624. if (dm->support_ic_type & PHYDM_IC_ABOVE_3SS) {
  625. curr_cck_pd_t[0][2][0] = (u8)((reg0 & 0x00ff0000) >> 16);
  626. curr_cck_pd_t[1][2][0] = (u8)((reg1 & 0x00ff0000) >> 16);
  627. curr_cck_pd_t[0][2][1] = (u8)((reg2 & 0x00007C00) >> 10);
  628. curr_cck_pd_t[1][2][1] = (u8)((reg2 & 0xC0000000) >> 30) |
  629. ((reg3 & 0x7) << 3);
  630. }
  631. #endif
  632. #if (defined(PHYDM_COMPILE_ABOVE_4SS))
  633. if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {
  634. curr_cck_pd_t[0][3][0] = (u8)((reg0 & 0xff000000) >> 24);
  635. curr_cck_pd_t[1][3][0] = (u8)((reg1 & 0xff000000) >> 24);
  636. curr_cck_pd_t[0][3][1] = (u8)((reg2 & 0x000F8000) >> 15);
  637. curr_cck_pd_t[1][3][1] = (u8)((reg3 & 0x000000F8) >> 3);
  638. }
  639. #endif
  640. PHYDM_DBG(dm, DBG_CCKPD, "bw=%dM, Nrx=%d\n", 20 << bw, n_rx);
  641. PHYDM_DBG(dm, DBG_CCKPD, "lv=%d, readback CS_th=%x, PD th=%x\n",
  642. cckpd_t->cck_pd_lv,
  643. curr_cck_pd_t[bw][n_rx - 1][1],
  644. curr_cck_pd_t[bw][n_rx - 1][0]);
  645. }
  646. void phydm_cckpd_type4(void *dm_void)
  647. {
  648. struct dm_struct *dm = (struct dm_struct *)dm_void;
  649. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  650. u8 igi = dm->dm_dig_table.cur_ig_value;
  651. enum cckpd_lv lv = 0;
  652. boolean is_update = true;
  653. PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
  654. if (dm->is_linked) {
  655. PHYDM_DBG(dm, DBG_CCKPD, "Linked!!!\n");
  656. if (igi > 0x38 && dm->rssi_min > 32) {
  657. lv = CCK_PD_LV_4;
  658. PHYDM_DBG(dm, DBG_CCKPD, "Order 1\n");
  659. } else if ((igi > 0x2a) && (dm->rssi_min > 32)) {
  660. lv = CCK_PD_LV_3;
  661. PHYDM_DBG(dm, DBG_CCKPD, "Order 2\n");
  662. } else if ((igi > 0x24) ||
  663. (dm->rssi_min > 24 && dm->rssi_min <= 30)) {
  664. lv = CCK_PD_LV_2;
  665. PHYDM_DBG(dm, DBG_CCKPD, "Order 3\n");
  666. } else if ((igi <= 0x24) || (dm->rssi_min < 22)) {
  667. if (cckpd_t->cck_fa_ma > 1000) {
  668. lv = CCK_PD_LV_1;
  669. PHYDM_DBG(dm, DBG_CCKPD, "Order 4-1\n");
  670. } else if (cckpd_t->cck_fa_ma < 500) {
  671. lv = CCK_PD_LV_0;
  672. PHYDM_DBG(dm, DBG_CCKPD, "Order 4-2\n");
  673. } else {
  674. is_update = false;
  675. PHYDM_DBG(dm, DBG_CCKPD, "Order 4-3\n");
  676. }
  677. } else {
  678. is_update = false;
  679. }
  680. } else {
  681. PHYDM_DBG(dm, DBG_CCKPD, "UnLinked!!!\n");
  682. if (cckpd_t->cck_fa_ma > 1000) {
  683. lv = CCK_PD_LV_1;
  684. PHYDM_DBG(dm, DBG_CCKPD, "Order 1\n");
  685. } else if (cckpd_t->cck_fa_ma < 500) {
  686. lv = CCK_PD_LV_0;
  687. PHYDM_DBG(dm, DBG_CCKPD, "Order 2\n");
  688. } else {
  689. is_update = false;
  690. PHYDM_DBG(dm, DBG_CCKPD, "Order 3\n");
  691. }
  692. }
  693. if (is_update)
  694. phydm_set_cck_pd_lv_type4(dm, lv);
  695. PHYDM_DBG(dm, DBG_CCKPD, "setting CS_th = 0x%x, PD th = 0x%x\n",
  696. cckpd_t->cck_pd_table_jgr3[cckpd_t->cck_bw]
  697. [cckpd_t->cck_n_rx - 1][1][lv],
  698. cckpd_t->cck_pd_table_jgr3[cckpd_t->cck_bw]
  699. [cckpd_t->cck_n_rx - 1][0][lv]);
  700. phydm_read_cckpd_para_type4(dm);
  701. }
  702. void phydm_cck_pd_init_type4(void *dm_void)
  703. {
  704. struct dm_struct *dm = (struct dm_struct *)dm_void;
  705. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  706. u32 reg0 = 0;
  707. u32 reg1 = 0;
  708. u32 reg2 = 0;
  709. u32 reg3 = 0;
  710. u8 pd_step = 0;
  711. u8 cck_bw = 0; /*r_RX_RF_BW*/
  712. u8 cck_n_rx = 0;
  713. u8 val = 0;
  714. u8 i = 0;
  715. PHYDM_DBG(dm, DBG_CCKPD, "[%s]======>\n", __func__);
  716. #if 0
  717. /*@
  718. *cckpd_t[0][0][0][0] = 1ac8[7:0] r_PD_lim_RFBW20_1R
  719. *cckpd_t[0][1][0][0] = 1ac8[15:8] r_PD_lim_RFBW20_2R
  720. *cckpd_t[0][2][0][0] = 1ac8[23:16] r_PD_lim_RFBW20_3R
  721. *cckpd_t[0][3][0][0] = 1ac8[31:24] r_PD_lim_RFBW20_4R
  722. *cckpd_t[1][0][0][0] = 1acc[7:0] r_PD_lim_RFBW40_1R
  723. *cckpd_t[1][1][0][0] = 1acc[15:8] r_PD_lim_RFBW40_2R
  724. *cckpd_t[1][2][0][0] = 1acc[23:16] r_PD_lim_RFBW40_3R
  725. *cckpd_t[1][3][0][0] = 1acc[31:24] r_PD_lim_RFBW40_4R
  726. *
  727. *
  728. *cckpd_t[0][0][1][0] = 1ad0[4:0] r_CS_ratio_RFBW20_1R[4:0]
  729. *cckpd_t[0][1][1][0] = 1ad0[9:5] r_CS_ratio_RFBW20_2R[4:0]
  730. *cckpd_t[0][2][1][0] = 1ad0[14:10] r_CS_ratio_RFBW20_3R[4:0]
  731. *cckpd_t[0][3][1][0] = 1ad0[19:15] r_CS_ratio_RFBW20_4R[4:0]
  732. *cckpd_t[1][0][1][0] = 1ad0[24:20] r_CS_ratio_RFBW40_1R[4:0]
  733. *cckpd_t[1][1][1][0] = 1ad0[29:25] r_CS_ratio_RFBW40_2R[4:0]
  734. *cckpd_t[1][2][1][0] = 1ad0[31:30] r_CS_ratio_RFBW40_3R[1:0]
  735. * 1ad4[2:0] r_CS_ratio_RFBW40_3R[4:2]
  736. *cckpd_t[1][3][1][0] = 1ad4[7:3] r_CS_ratio_RFBW40_4R[4:0]
  737. */
  738. #endif
  739. /*[Check Nrx]*/
  740. cck_n_rx = (u8)odm_get_bb_reg(dm, R_0x1a2c, 0x60000) + 1;
  741. /*[Check BW]*/
  742. val = odm_get_bb_reg(dm, R_0x9b0, 0xc);
  743. if (val == 0)
  744. cck_bw = CHANNEL_WIDTH_20;
  745. else if (val == 1)
  746. cck_bw = CHANNEL_WIDTH_40;
  747. else
  748. cck_bw = CHANNEL_WIDTH_80;
  749. cckpd_t->cck_bw = cck_bw;
  750. cckpd_t->cck_n_rx = cck_n_rx;
  751. reg0 = odm_get_bb_reg(dm, R_0x1ac8, MASKDWORD);
  752. reg1 = odm_get_bb_reg(dm, R_0x1acc, MASKDWORD);
  753. reg2 = odm_get_bb_reg(dm, R_0x1ad0, MASKDWORD);
  754. reg3 = odm_get_bb_reg(dm, R_0x1ad4, MASKDWORD);
  755. for (i = 0 ; i < CCK_PD_LV_MAX ; i++) {
  756. pd_step = i * 2;
  757. val = (u8)(reg0 & 0x000000ff) + pd_step;
  758. PHYDM_DBG(dm, DBG_CCKPD, "lvl %d val = %x\n\n", i, val);
  759. cckpd_t->cck_pd_table_jgr3[0][0][0][i] = val;
  760. val = (u8)(reg1 & 0x000000ff) + pd_step;
  761. cckpd_t->cck_pd_table_jgr3[1][0][0][i] = val;
  762. val = (u8)(reg2 & 0x0000001F) + pd_step;
  763. cckpd_t->cck_pd_table_jgr3[0][0][1][i] = val;
  764. val = (u8)((reg2 & 0x01F00000) >> 20) + pd_step;
  765. cckpd_t->cck_pd_table_jgr3[1][0][1][i] = val;
  766. #ifdef PHYDM_COMPILE_ABOVE_2SS
  767. if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS) {
  768. val = (u8)((reg0 & 0x0000ff00) >> 8) + pd_step;
  769. cckpd_t->cck_pd_table_jgr3[0][1][0][i] = val;
  770. val = (u8)((reg1 & 0x0000ff00) >> 8) + pd_step;
  771. cckpd_t->cck_pd_table_jgr3[1][1][0][i] = val;
  772. val = (u8)((reg2 & 0x000003E0) >> 5) + pd_step;
  773. cckpd_t->cck_pd_table_jgr3[0][1][1][i] = val;
  774. val = (u8)((reg2 & 0x3E000000) >> 25) + pd_step;
  775. cckpd_t->cck_pd_table_jgr3[1][1][1][i] = val;
  776. }
  777. #endif
  778. #ifdef PHYDM_COMPILE_ABOVE_3SS
  779. if (dm->support_ic_type & PHYDM_IC_ABOVE_3SS) {
  780. val = (u8)((reg0 & 0x00ff0000) >> 16) + pd_step;
  781. cckpd_t->cck_pd_table_jgr3[0][2][0][i] = val;
  782. val = (u8)((reg1 & 0x00ff0000) >> 16) + pd_step;
  783. cckpd_t->cck_pd_table_jgr3[1][2][0][i] = val;
  784. val = (u8)((reg2 & 0x00007C00) >> 10) + pd_step;
  785. cckpd_t->cck_pd_table_jgr3[0][2][1][i] = val;
  786. val = (u8)(((reg2 & 0xC0000000) >> 30) |
  787. ((reg3 & 0x7) << 3)) + pd_step;
  788. cckpd_t->cck_pd_table_jgr3[1][2][1][i] = val;
  789. }
  790. #endif
  791. #ifdef PHYDM_COMPILE_ABOVE_4SS
  792. if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {
  793. val = (u8)((reg0 & 0xff000000) >> 24) + pd_step;
  794. cckpd_t->cck_pd_table_jgr3[0][3][0][i] = val;
  795. val = (u8)((reg1 & 0xff000000) >> 24) + pd_step;
  796. cckpd_t->cck_pd_table_jgr3[1][3][0][i] = val;
  797. val = (u8)((reg2 & 0x000F8000) >> 15) + pd_step;
  798. cckpd_t->cck_pd_table_jgr3[0][3][1][i] = val;
  799. val = (u8)((reg3 & 0x000000F8) >> 3) + pd_step;
  800. cckpd_t->cck_pd_table_jgr3[1][3][1][i] = val;
  801. }
  802. #endif
  803. }
  804. }
  805. #endif /*#ifdef PHYDM_COMPILE_CCKPD_TYPE4*/
  806. void phydm_set_cckpd_val(void *dm_void, u32 *val_buf, u8 val_len)
  807. {
  808. struct dm_struct *dm = (struct dm_struct *)dm_void;
  809. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  810. enum cckpd_lv lv;
  811. if (val_len != 1) {
  812. PHYDM_DBG(dm, ODM_COMP_API, "[Error][CCKPD]Need val_len=1\n");
  813. return;
  814. }
  815. lv = (enum cckpd_lv)val_buf[0];
  816. if (lv > CCK_PD_LV_4) {
  817. pr_debug("[%s] warning! lv=%d\n", __func__, lv);
  818. return;
  819. }
  820. switch (cckpd_t->cckpd_hw_type) {
  821. #ifdef PHYDM_COMPILE_CCKPD_TYPE1
  822. case 1:
  823. phydm_set_cckpd_lv_type1(dm, lv);
  824. break;
  825. #endif
  826. #ifdef PHYDM_COMPILE_CCKPD_TYPE2
  827. case 2:
  828. phydm_set_cckpd_lv_type2(dm, lv);
  829. break;
  830. #endif
  831. #ifdef PHYDM_COMPILE_CCKPD_TYPE3
  832. case 3:
  833. phydm_set_cckpd_lv_type3(dm, lv);
  834. break;
  835. #endif
  836. #ifdef PHYDM_COMPILE_CCKPD_TYPE4
  837. case 4:
  838. phydm_set_cck_pd_lv_type4(dm, lv);
  839. break;
  840. #endif
  841. default:
  842. pr_debug("[%s]warning\n", __func__);
  843. break;
  844. }
  845. }
  846. boolean
  847. phydm_stop_cck_pd_th(void *dm_void)
  848. {
  849. struct dm_struct *dm = (struct dm_struct *)dm_void;
  850. if (!(dm->support_ability & (ODM_BB_CCK_PD | ODM_BB_FA_CNT))) {
  851. PHYDM_DBG(dm, DBG_CCKPD, "Not Support\n");
  852. return true;
  853. }
  854. if (dm->pause_ability & ODM_BB_CCK_PD) {
  855. PHYDM_DBG(dm, DBG_CCKPD, "Return: Pause CCKPD in LV=%d\n",
  856. dm->pause_lv_table.lv_cckpd);
  857. return true;
  858. }
  859. if (dm->is_linked && (*dm->channel > 36)) {
  860. PHYDM_DBG(dm, DBG_CCKPD, "Return: 5G CH=%d\n", *dm->channel);
  861. return true;
  862. }
  863. return false;
  864. }
  865. void phydm_cck_pd_th(void *dm_void)
  866. {
  867. struct dm_struct *dm = (struct dm_struct *)dm_void;
  868. struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
  869. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  870. u32 cck_fa = fa_t->cnt_cck_fail;
  871. #ifdef PHYDM_TDMA_DIG_SUPPORT
  872. struct phydm_fa_acc_struct *fa_acc_t = &dm->false_alm_cnt_acc;
  873. #endif
  874. PHYDM_DBG(dm, DBG_CCKPD, "[%s] ======>\n", __func__);
  875. if (phydm_stop_cck_pd_th(dm))
  876. return;
  877. #ifdef PHYDM_TDMA_DIG_SUPPORT
  878. if (dm->original_dig_restore)
  879. cck_fa = fa_t->cnt_cck_fail;
  880. else
  881. cck_fa = fa_acc_t->cnt_cck_fail_1sec;
  882. #endif
  883. if (cckpd_t->cck_fa_ma == CCK_FA_MA_RESET)
  884. cckpd_t->cck_fa_ma = cck_fa;
  885. else
  886. cckpd_t->cck_fa_ma = (cckpd_t->cck_fa_ma * 3 + cck_fa) >> 2;
  887. PHYDM_DBG(dm, DBG_CCKPD,
  888. "IGI=0x%x, rssi_min=%d, cck_fa=%d, cck_fa_ma=%d\n",
  889. dm->dm_dig_table.cur_ig_value, dm->rssi_min,
  890. cck_fa, cckpd_t->cck_fa_ma);
  891. switch (cckpd_t->cckpd_hw_type) {
  892. #ifdef PHYDM_COMPILE_CCKPD_TYPE1
  893. case 1:
  894. phydm_cckpd_type1(dm);
  895. break;
  896. #endif
  897. #ifdef PHYDM_COMPILE_CCKPD_TYPE2
  898. case 2:
  899. phydm_cckpd_type2(dm);
  900. break;
  901. #endif
  902. #ifdef PHYDM_COMPILE_CCKPD_TYPE3
  903. case 3:
  904. phydm_cckpd_type3(dm);
  905. break;
  906. #endif
  907. #ifdef PHYDM_COMPILE_CCKPD_TYPE4
  908. case 4:
  909. phydm_cckpd_type4(dm);
  910. break;
  911. #endif
  912. default:
  913. pr_debug("[%s]warning\n", __func__);
  914. break;
  915. }
  916. }
  917. void phydm_cck_pd_init(void *dm_void)
  918. {
  919. struct dm_struct *dm = (struct dm_struct *)dm_void;
  920. struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
  921. if (dm->support_ic_type & CCK_PD_IC_TYPE1)
  922. cckpd_t->cckpd_hw_type = 1;
  923. else if (dm->support_ic_type & CCK_PD_IC_TYPE2)
  924. cckpd_t->cckpd_hw_type = 2;
  925. else if (dm->support_ic_type & CCK_PD_IC_TYPE3)
  926. cckpd_t->cckpd_hw_type = 3;
  927. else if (dm->support_ic_type & CCK_PD_IC_TYPE4)
  928. cckpd_t->cckpd_hw_type = 4;
  929. PHYDM_DBG(dm, DBG_CCKPD, "[%s] cckpd_hw_type=%d\n",
  930. __func__, cckpd_t->cckpd_hw_type);
  931. cckpd_t->cck_pd_lv = CCK_PD_LV_INIT;
  932. cckpd_t->cck_n_rx = 0xff;
  933. cckpd_t->cck_bw = CHANNEL_WIDTH_MAX;
  934. switch (cckpd_t->cckpd_hw_type) {
  935. #ifdef PHYDM_COMPILE_CCKPD_TYPE1
  936. case 1:
  937. phydm_set_cckpd_lv_type1(dm, CCK_PD_LV_0);
  938. break;
  939. #endif
  940. #ifdef PHYDM_COMPILE_CCKPD_TYPE2
  941. case 2:
  942. cckpd_t->aaa_default = odm_read_1byte(dm, 0xaaa) & 0x1f;
  943. phydm_set_cckpd_lv_type2(dm, CCK_PD_LV_0);
  944. break;
  945. #endif
  946. #ifdef PHYDM_COMPILE_CCKPD_TYPE3
  947. case 3:
  948. phydm_cck_pd_init_type3(dm);
  949. break;
  950. #endif
  951. #ifdef PHYDM_COMPILE_CCKPD_TYPE4
  952. case 4:
  953. phydm_cck_pd_init_type4(dm);
  954. break;
  955. #endif
  956. default:
  957. pr_debug("[%s]warning\n", __func__);
  958. break;
  959. }
  960. }
  961. #endif /*#ifdef PHYDM_SUPPORT_CCKPD*/