phydm_pmac_tx_setting.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  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_PMAC_TX_SETTING_SUPPORT
  31. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  32. void phydm_start_cck_cont_tx_jgr3(void *dm_void,
  33. struct phydm_pmac_info *tx_info)
  34. {
  35. struct dm_struct *dm = (struct dm_struct *)dm_void;
  36. struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table;
  37. u8 rate = tx_info->tx_rate; /* @HW rate */
  38. /* @if CCK block on? */
  39. if (!odm_get_bb_reg(dm, R_0x1c3c, BIT(1)))
  40. odm_set_bb_reg(dm, R_0x1c3c, BIT(1), 1);
  41. /* @Turn Off All Test mode */
  42. odm_set_bb_reg(dm, R_0x1ca4, 0x7, 0x0);
  43. odm_set_bb_reg(dm, R_0x1a00, 0x3000, rate);
  44. odm_set_bb_reg(dm, R_0x1a00, 0x3, 0x2); /* @transmit mode */
  45. odm_set_bb_reg(dm, R_0x1a00, 0x8, 0x1); /* @turn on scramble setting */
  46. /* @Fix rate selection issue */
  47. odm_set_bb_reg(dm, R_0x1a70, 0x4000, 0x1);
  48. /* @set RX weighting for path I & Q to 0 */
  49. odm_set_bb_reg(dm, R_0x1a14, 0x300, 0x3);
  50. /* @set loopback mode */
  51. odm_set_bb_reg(dm, R_0x1c3c, 0x10, 0x1);
  52. pmac_tx->cck_cont_tx = true;
  53. pmac_tx->ofdm_cont_tx = false;
  54. }
  55. void phydm_stop_cck_cont_tx_jgr3(void *dm_void)
  56. {
  57. struct dm_struct *dm = (struct dm_struct *)dm_void;
  58. struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table;
  59. pmac_tx->cck_cont_tx = false;
  60. pmac_tx->ofdm_cont_tx = false;
  61. odm_set_bb_reg(dm, R_0x1a00, 0x3, 0x0); /* @normal mode */
  62. odm_set_bb_reg(dm, R_0x1a00, 0x8, 0x1); /* @turn on scramble setting */
  63. /* @back to default */
  64. odm_set_bb_reg(dm, R_0x1a70, 0x4000, 0x0);
  65. odm_set_bb_reg(dm, R_0x1a14, 0x300, 0x0);
  66. odm_set_bb_reg(dm, R_0x1c3c, 0x10, 0x0);
  67. /* @BB Reset */
  68. odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x0);
  69. odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x1);
  70. }
  71. void phydm_start_ofdm_cont_tx_jgr3(void *dm_void)
  72. {
  73. struct dm_struct *dm = (struct dm_struct *)dm_void;
  74. struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table;
  75. /* @1. if OFDM block on */
  76. if (!odm_get_bb_reg(dm, R_0x1c3c, BIT(0)))
  77. odm_set_bb_reg(dm, R_0x1c3c, BIT(0), 1);
  78. /* @2. set CCK test mode off, set to CCK normal mode */
  79. odm_set_bb_reg(dm, R_0x1a00, 0x3, 0);
  80. /* @3. turn on scramble setting */
  81. odm_set_bb_reg(dm, R_0x1a00, 0x8, 1);
  82. /* @4. Turn On Continue Tx and turn off the other test modes. */
  83. odm_set_bb_reg(dm, R_0x1ca4, 0x7, 0x1);
  84. pmac_tx->cck_cont_tx = false;
  85. pmac_tx->ofdm_cont_tx = true;
  86. }
  87. void phydm_stop_ofdm_cont_tx_jgr3(void *dm_void)
  88. {
  89. struct dm_struct *dm = (struct dm_struct *)dm_void;
  90. struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table;
  91. pmac_tx->cck_cont_tx = false;
  92. pmac_tx->ofdm_cont_tx = false;
  93. /* @Turn Off All Test mode */
  94. odm_set_bb_reg(dm, R_0x1ca4, 0x7, 0x0);
  95. /* @Delay 10 ms */
  96. ODM_delay_ms(10);
  97. /* @BB Reset */
  98. odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x0);
  99. odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x1);
  100. }
  101. void phydm_set_single_tone_jgr3(void *dm_void, boolean is_single_tone,
  102. boolean en_pmac_tx, u8 path)
  103. {
  104. struct dm_struct *dm = (struct dm_struct *)dm_void;
  105. struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table;
  106. u8 start = RF_PATH_A, end = RF_PATH_A;
  107. switch (path) {
  108. case RF_PATH_A:
  109. case RF_PATH_B:
  110. case RF_PATH_C:
  111. case RF_PATH_D:
  112. start = path;
  113. end = path;
  114. break;
  115. case RF_PATH_AB:
  116. start = RF_PATH_A;
  117. end = RF_PATH_B;
  118. break;
  119. case RF_PATH_BC:
  120. start = RF_PATH_B;
  121. end = RF_PATH_C;
  122. break;
  123. case RF_PATH_ABC:
  124. start = RF_PATH_A;
  125. end = RF_PATH_C;
  126. break;
  127. case RF_PATH_BCD:
  128. start = RF_PATH_B;
  129. end = RF_PATH_D;
  130. break;
  131. case RF_PATH_ABCD:
  132. start = RF_PATH_A;
  133. end = RF_PATH_D;
  134. break;
  135. }
  136. if (is_single_tone) {
  137. pmac_tx->tx_scailing = odm_get_bb_reg(dm, R_0x81c, MASKDWORD);
  138. if (!en_pmac_tx) {
  139. phydm_start_ofdm_cont_tx_jgr3(dm);
  140. /*SendPSPoll(pAdapter);*/
  141. }
  142. odm_set_bb_reg(dm, R_0x1c68, BIT(24), 0x1); /* @Disable CCA */
  143. if (!(dm->support_ic_type & ODM_RTL8814B)) {
  144. for (start; start <= end; start++) {
  145. /* @Tx mode: RF0x00[19:16]=4'b0010 */
  146. odm_set_rf_reg(dm, start, RF_0x0, 0xF0000, 0x2);
  147. /* @Lowest RF gain index: RF_0x0[4:0] = 0*/
  148. odm_set_rf_reg(dm, start, RF_0x0, 0x1F, 0x0);
  149. /* @RF LO enabled */
  150. odm_set_rf_reg(dm, start, RF_0x58, BIT(1), 0x1);
  151. }
  152. }
  153. odm_set_bb_reg(dm, R_0x81c, 0x001FC000, 0);
  154. } else {
  155. for (start; start <= end; start++)
  156. /* @RF LO disabled */
  157. if (!(dm->support_ic_type & ODM_RTL8814B))
  158. odm_set_rf_reg(dm, start, RF_0x58, BIT(1), 0x0);
  159. odm_set_bb_reg(dm, R_0x1c68, BIT(24), 0x0); /* @Enable CCA */
  160. if (!en_pmac_tx)
  161. phydm_stop_ofdm_cont_tx_jgr3(dm);
  162. odm_set_bb_reg(dm, R_0x81c, MASKDWORD, pmac_tx->tx_scailing);
  163. }
  164. }
  165. void phydm_stop_pmac_tx_jgr3(void *dm_void, struct phydm_pmac_info *tx_info)
  166. {
  167. struct dm_struct *dm = (struct dm_struct *)dm_void;
  168. struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table;
  169. u32 tmp = 0;
  170. if (tx_info->mode == CONT_TX) {
  171. odm_set_bb_reg(dm, R_0x1e70, 0xf, 2); /* TX Stop */
  172. if (pmac_tx->is_cck_rate)
  173. phydm_stop_cck_cont_tx_jgr3(dm);
  174. else
  175. phydm_stop_ofdm_cont_tx_jgr3(dm);
  176. } else {
  177. if (pmac_tx->is_cck_rate) {
  178. tmp = odm_get_bb_reg(dm, R_0x2de4, MASKLWORD);
  179. odm_set_bb_reg(dm, R_0x1e64, MASKLWORD, tmp + 50);
  180. }
  181. odm_set_bb_reg(dm, R_0x1e70, 0xf, 2); /* TX Stop */
  182. }
  183. if (tx_info->mode == OFDM_SINGLE_TONE_TX) {
  184. /* Stop HW TX -> Stop Continuous TX -> Stop RF Setting */
  185. if (pmac_tx->is_cck_rate)
  186. phydm_stop_cck_cont_tx_jgr3(dm);
  187. else
  188. phydm_stop_ofdm_cont_tx_jgr3(dm);
  189. phydm_set_single_tone_jgr3(dm, false, true, pmac_tx->path);
  190. }
  191. }
  192. void phydm_set_mac_phy_txinfo_jgr3(void *dm_void,
  193. struct phydm_pmac_info *tx_info)
  194. {
  195. struct dm_struct *dm = (struct dm_struct *)dm_void;
  196. struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table;
  197. u32 tmp = 0;
  198. odm_set_bb_reg(dm, R_0xa58, 0x003F8000, tx_info->tx_rate);
  199. /* @0x900[1] ndp_sound */
  200. odm_set_bb_reg(dm, R_0x900, 0x2, tx_info->ndp_sound);
  201. /* @0x900[27:24] txsc [29:28] bw [31:30] m_stbc */
  202. tmp = (tx_info->tx_sc) | ((tx_info->bw) << 4) |
  203. ((tx_info->m_stbc - 1) << 6);
  204. odm_set_bb_reg(dm, R_0x900, 0xFF000000, tmp);
  205. if (pmac_tx->is_ofdm_rate) {
  206. odm_set_bb_reg(dm, R_0x900, 0x1, 0);
  207. odm_set_bb_reg(dm, R_0x900, 0x4, 0);
  208. } else if (pmac_tx->is_ht_rate) {
  209. odm_set_bb_reg(dm, R_0x900, 0x1, 1);
  210. odm_set_bb_reg(dm, R_0x900, 0x4, 0);
  211. } else if (pmac_tx->is_vht_rate) {
  212. odm_set_bb_reg(dm, R_0x900, 0x1, 0);
  213. odm_set_bb_reg(dm, R_0x900, 0x4, 1);
  214. }
  215. tmp = tx_info->packet_period; /* @for TX interval */
  216. odm_set_bb_reg(dm, R_0x9b8, 0xffff0000, tmp);
  217. }
  218. void phydm_set_mac_hdr_jgr3(void *dm_void, struct phydm_pmac_info *tx_info)
  219. {
  220. struct dm_struct *dm = (struct dm_struct *)dm_void;
  221. struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table;
  222. u32 tmp = 0;
  223. u32 tmp1 = 0;
  224. if (pmac_tx->is_vht_rate) {
  225. tmp = BYTE_2_DWORD(tx_info->vht_delimiter[3],
  226. tx_info->vht_delimiter[2],
  227. tx_info->vht_delimiter[1],
  228. tx_info->vht_delimiter[0]);
  229. odm_set_bb_reg(dm, R_0x950, MASKDWORD, tmp);
  230. /* 0x954 - 0x960 24 byte Probe Request MAC Header */
  231. /* & Duration & Frame control */
  232. odm_set_bb_reg(dm, R_0x954, MASKDWORD, 0x00000040);
  233. /* MAC_Addr1[5:0] , the value has no meaning */
  234. tmp = BYTE_2_DWORD(0x33, 0x22, 0x11, 0x00);
  235. tmp1 = BYTE_2_DWORD(0, 0, 0x55, 0x44);
  236. odm_set_bb_reg(dm, R_0x958, MASKDWORD, tmp);
  237. odm_set_bb_reg(dm, R_0x95c, 0xffff, tmp1);
  238. /* MAC_Addr3[3:0], [5:4] drop for DD design*/
  239. odm_set_bb_reg(dm, R_0x964, MASKDWORD, tmp);
  240. /* MAC_Addr2[5:0] */
  241. tmp = BYTE_2_DWORD(0, 0, 0x11, 0x00);
  242. tmp1 = BYTE_2_DWORD(0x55, 0x44, 0x33, 0x22);
  243. odm_set_bb_reg(dm, R_0x95c, 0xffff0000, tmp);
  244. odm_set_bb_reg(dm, R_0x960, MASKDWORD, tmp1);
  245. } else {
  246. /* 0x950 - 0x964 24 byte Probe Request MAC Header */
  247. /* & Duration & Frame control */
  248. odm_set_bb_reg(dm, R_0x950, MASKDWORD, 0x00000040);
  249. /* MAC_Addr1[5:0] , the value has no meaning */
  250. tmp = BYTE_2_DWORD(0x33, 0x22, 0x11, 0x00);
  251. tmp1 = BYTE_2_DWORD(0, 0, 0x55, 0x44);
  252. odm_set_bb_reg(dm, R_0x954, MASKDWORD, tmp);
  253. odm_set_bb_reg(dm, R_0x958, 0xffff, tmp1);
  254. /* Sequence Control & Address3[5:0] */
  255. odm_set_bb_reg(dm, R_0x960, MASKDWORD, tmp);
  256. odm_set_bb_reg(dm, R_0x964, MASKDWORD, tmp1);
  257. /* MAC_Addr2[5:0] */
  258. tmp = BYTE_2_DWORD(0, 0, 0x11, 0x00);
  259. tmp1 = BYTE_2_DWORD(0x55, 0x44, 0x33, 0x22);
  260. odm_set_bb_reg(dm, R_0x958, 0xffff0000, tmp);
  261. odm_set_bb_reg(dm, R_0x95c, MASKDWORD, tmp1);
  262. }
  263. }
  264. void phydm_set_sig_jgr3(void *dm_void, struct phydm_pmac_info *tx_info)
  265. {
  266. struct dm_struct *dm = (struct dm_struct *)dm_void;
  267. struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table;
  268. u32 tmp = 0;
  269. if (pmac_tx->is_cck_rate)
  270. return;
  271. /* @L-SIG */
  272. odm_set_bb_reg(dm, R_0x1eb4, 0xfffff, tx_info->packet_count);
  273. tmp = BYTE_2_DWORD(0, tx_info->lsig[2], tx_info->lsig[1],
  274. tx_info->lsig[0]);
  275. odm_set_bb_reg(dm, R_0x908, 0xffffff, tmp);
  276. /* @0x924[7:0] = Data init octet */
  277. tmp = tx_info->packet_pattern;
  278. odm_set_bb_reg(dm, R_0x924, 0xff, tmp);
  279. if (tx_info->packet_pattern == RANDOM_BY_PN32)
  280. tmp = 0x3;
  281. else
  282. tmp = 0;
  283. odm_set_bb_reg(dm, R_0x914, 0xE0000000, tmp);
  284. if (pmac_tx->is_ht_rate) {
  285. /* @HT SIG */
  286. tmp = BYTE_2_DWORD(0, tx_info->ht_sig[2], tx_info->ht_sig[1],
  287. tx_info->ht_sig[0]);
  288. odm_set_bb_reg(dm, 0x90c, 0xffffff, tmp);
  289. tmp = BYTE_2_DWORD(0, tx_info->ht_sig[5], tx_info->ht_sig[4],
  290. tx_info->ht_sig[3]);
  291. odm_set_bb_reg(dm, 0x910, 0xffffff, tmp);
  292. } else if (pmac_tx->is_vht_rate) {
  293. /* @VHT SIG A/B/serv_field */
  294. tmp = BYTE_2_DWORD(0, tx_info->vht_sig_a[2],
  295. tx_info->vht_sig_a[1],
  296. tx_info->vht_sig_a[0]);
  297. odm_set_bb_reg(dm, 0x90c, 0xffffff, tmp);
  298. tmp = BYTE_2_DWORD(0, tx_info->vht_sig_a[5],
  299. tx_info->vht_sig_a[4],
  300. tx_info->vht_sig_a[3]);
  301. odm_set_bb_reg(dm, 0x910, 0xffffff, tmp);
  302. tmp = BYTE_2_DWORD(tx_info->vht_sig_b[3], tx_info->vht_sig_b[2],
  303. tx_info->vht_sig_b[1],
  304. tx_info->vht_sig_b[0]);
  305. odm_set_bb_reg(dm, 0x914, 0x1FFFFFFF, tmp);
  306. tmp = tx_info->vht_sig_b_crc << 8;
  307. odm_set_bb_reg(dm, R_0x938, 0xffff, tmp);
  308. }
  309. }
  310. void phydm_set_cck_preamble_hdr_jgr3(void *dm_void,
  311. struct phydm_pmac_info *tx_info)
  312. {
  313. struct dm_struct *dm = (struct dm_struct *)dm_void;
  314. struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table;
  315. u32 tmp = 0;
  316. if (!pmac_tx->is_cck_rate)
  317. return;
  318. tmp = tx_info->packet_count | (tx_info->sfd << 16);
  319. odm_set_bb_reg(dm, R_0x1e64, MASKDWORD, tmp);
  320. tmp = tx_info->signal_field | (tx_info->service_field << 8) |
  321. (tx_info->length << 16);
  322. odm_set_bb_reg(dm, R_0x1e68, MASKDWORD, tmp);
  323. tmp = BYTE_2_DWORD(0, 0, tx_info->crc16[1], tx_info->crc16[0]);
  324. odm_set_bb_reg(dm, R_0x1e6c, 0xffff, tmp);
  325. if (tx_info->is_short_preamble)
  326. odm_set_bb_reg(dm, R_0x1e6c, BIT(16), 0);
  327. else
  328. odm_set_bb_reg(dm, R_0x1e6c, BIT(16), 1);
  329. }
  330. void phydm_set_mode_jgr3(void *dm_void, struct phydm_pmac_info *tx_info,
  331. enum phydm_pmac_mode mode)
  332. {
  333. struct dm_struct *dm = (struct dm_struct *)dm_void;
  334. struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table;
  335. if (mode == CONT_TX) {
  336. tx_info->packet_count = 1;
  337. if (pmac_tx->is_cck_rate)
  338. phydm_start_cck_cont_tx_jgr3(dm, tx_info);
  339. else
  340. phydm_start_ofdm_cont_tx_jgr3(dm);
  341. } else if (mode == OFDM_SINGLE_TONE_TX) {
  342. /* Continuous TX -> HW TX -> RF Setting */
  343. tx_info->packet_count = 1;
  344. if (pmac_tx->is_cck_rate)
  345. phydm_start_cck_cont_tx_jgr3(dm, tx_info);
  346. else
  347. phydm_start_ofdm_cont_tx_jgr3(dm);
  348. } else if (mode == PKTS_TX) {
  349. if (pmac_tx->is_cck_rate && tx_info->packet_count == 0)
  350. tx_info->packet_count = 0xffff;
  351. }
  352. }
  353. void phydm_set_pmac_txon_jgr3(void *dm_void, struct phydm_pmac_info *tx_info)
  354. {
  355. struct dm_struct *dm = (struct dm_struct *)dm_void;
  356. struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table;
  357. odm_set_bb_reg(dm, R_0x1d08, BIT(0), 1); /* Turn on PMAC */
  358. if (pmac_tx->is_cck_rate) {
  359. odm_set_bb_reg(dm, R_0x1e70, 0xf, 8); /* TX CCK ON */
  360. odm_set_bb_reg(dm, R_0x1a84, BIT(31), 0);
  361. } else {
  362. odm_set_bb_reg(dm, R_0x1e70, 0xf, 4); /* TX Ofdm ON */
  363. }
  364. if (tx_info->mode == OFDM_SINGLE_TONE_TX)
  365. phydm_set_single_tone_jgr3(dm, true, true, pmac_tx->path);
  366. }
  367. void phydm_set_pmac_tx_jgr3(void *dm_void, struct phydm_pmac_info *tx_info,
  368. enum rf_path mpt_rf_path)
  369. {
  370. struct dm_struct *dm = (struct dm_struct *)dm_void;
  371. struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table;
  372. pmac_tx->is_cck_rate = phydm_is_cck_rate(dm, tx_info->tx_rate);
  373. pmac_tx->is_ofdm_rate = phydm_is_ofdm_rate(dm, tx_info->tx_rate);
  374. pmac_tx->is_ht_rate = phydm_is_ht_rate(dm, tx_info->tx_rate);
  375. pmac_tx->is_vht_rate = phydm_is_vht_rate(dm, tx_info->tx_rate);
  376. pmac_tx->path = mpt_rf_path;
  377. if (!tx_info->en_pmac_tx) {
  378. phydm_stop_pmac_tx_jgr3(dm, tx_info);
  379. return;
  380. }
  381. phydm_set_mode_jgr3(dm, tx_info, tx_info->mode);
  382. if (pmac_tx->is_cck_rate)
  383. phydm_set_cck_preamble_hdr_jgr3(dm, tx_info);
  384. else
  385. phydm_set_sig_jgr3(dm, tx_info);
  386. phydm_set_mac_phy_txinfo_jgr3(dm, tx_info);
  387. phydm_set_mac_hdr_jgr3(dm, tx_info);
  388. phydm_set_pmac_txon_jgr3(dm, tx_info);
  389. }
  390. #endif
  391. void phydm_start_cck_cont_tx(void *dm_void, struct phydm_pmac_info *tx_info)
  392. {
  393. struct dm_struct *dm = (struct dm_struct *)dm_void;
  394. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  395. phydm_start_cck_cont_tx_jgr3(dm, tx_info);
  396. }
  397. void phydm_stop_cck_cont_tx(void *dm_void)
  398. {
  399. struct dm_struct *dm = (struct dm_struct *)dm_void;
  400. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  401. phydm_stop_cck_cont_tx_jgr3(dm);
  402. }
  403. void phydm_start_ofdm_cont_tx(void *dm_void)
  404. {
  405. struct dm_struct *dm = (struct dm_struct *)dm_void;
  406. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  407. phydm_start_ofdm_cont_tx_jgr3(dm);
  408. }
  409. void phydm_stop_ofdm_cont_tx(void *dm_void)
  410. {
  411. struct dm_struct *dm = (struct dm_struct *)dm_void;
  412. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  413. phydm_stop_ofdm_cont_tx_jgr3(dm);
  414. }
  415. void phydm_set_single_tone(void *dm_void, boolean is_single_tone,
  416. boolean en_pmac_tx, u8 path)
  417. {
  418. struct dm_struct *dm = (struct dm_struct *)dm_void;
  419. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  420. phydm_set_single_tone_jgr3(dm, is_single_tone,
  421. en_pmac_tx, path);
  422. }
  423. void phydm_set_pmac_tx(void *dm_void, struct phydm_pmac_info *tx_info,
  424. enum rf_path mpt_rf_path)
  425. {
  426. struct dm_struct *dm = (struct dm_struct *)dm_void;
  427. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  428. phydm_set_pmac_tx_jgr3(dm, tx_info, mpt_rf_path);
  429. }
  430. #endif