620-rt2x00-support-rt3352.patch 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. From 03839951515b0ea2b21d649b1fe7b63f9817d0c8 Mon Sep 17 00:00:00 2001
  2. From: Daniel Golle <[email protected]>
  3. Date: Sun, 9 Sep 2012 14:24:39 +0300
  4. Subject: [PATCH] rt2x00: add MediaTek/RaLink Rt3352 WiSoC
  5. Support for the RT3352 WiSoC was developed for and tested with the ALL5002
  6. devboard running OpenWrt. For now, this supports only devices with internal
  7. TXALC. Corrections were made according to the remarks of Stanislaw Gruszka and
  8. Gertjan van Wingerde, thank you guys for reviewing!
  9. Signed-off-by: Daniel Golle <[email protected]>
  10. Signed-off-by: John W. Linville <[email protected]>
  11. ---
  12. drivers/net/wireless/rt2x00/rt2800.h | 5 +
  13. drivers/net/wireless/rt2x00/rt2800lib.c | 211 +++++++++++++++++++++++++++++++-
  14. drivers/net/wireless/rt2x00/rt2x00.h | 1 +
  15. 3 files changed, 212 insertions(+), 5 deletions(-)
  16. --- a/drivers/net/wireless/rt2x00/rt2800.h
  17. +++ b/drivers/net/wireless/rt2x00/rt2800.h
  18. @@ -1943,6 +1943,11 @@ struct mac_iveiv_entry {
  19. #define BBP47_TSSI_ADC6 FIELD8(0x80)
  20. /*
  21. + * BBP 49
  22. + */
  23. +#define BBP49_UPDATE_FLAG FIELD8(0x01)
  24. +
  25. +/*
  26. * BBP 109
  27. */
  28. #define BBP109_TX0_POWER FIELD8(0x0f)
  29. --- a/drivers/net/wireless/rt2x00/rt2800lib.c
  30. +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  31. @@ -1615,6 +1615,7 @@ void rt2800_config_ant(struct rt2x00_dev
  32. case 1:
  33. if (rt2x00_rt(rt2x00dev, RT3070) ||
  34. rt2x00_rt(rt2x00dev, RT3090) ||
  35. + rt2x00_rt(rt2x00dev, RT3352) ||
  36. rt2x00_rt(rt2x00dev, RT3390)) {
  37. rt2x00_eeprom_read(rt2x00dev,
  38. EEPROM_NIC_CONF1, &eeprom);
  39. @@ -2053,6 +2054,60 @@ static void rt2800_config_channel_rf3290
  40. }
  41. }
  42. +static void rt2800_config_channel_rf3322(struct rt2x00_dev *rt2x00dev,
  43. + struct ieee80211_conf *conf,
  44. + struct rf_channel *rf,
  45. + struct channel_info *info)
  46. +{
  47. + u8 rfcsr;
  48. +
  49. + rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
  50. + rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3);
  51. +
  52. + rt2800_rfcsr_write(rt2x00dev, 11, 0x42);
  53. + rt2800_rfcsr_write(rt2x00dev, 12, 0x1c);
  54. + rt2800_rfcsr_write(rt2x00dev, 13, 0x00);
  55. +
  56. + if (info->default_power1 > POWER_BOUND)
  57. + rt2800_rfcsr_write(rt2x00dev, 47, POWER_BOUND);
  58. + else
  59. + rt2800_rfcsr_write(rt2x00dev, 47, info->default_power1);
  60. +
  61. + if (info->default_power2 > POWER_BOUND)
  62. + rt2800_rfcsr_write(rt2x00dev, 48, POWER_BOUND);
  63. + else
  64. + rt2800_rfcsr_write(rt2x00dev, 48, info->default_power2);
  65. +
  66. + rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
  67. + if (rt2x00dev->freq_offset > FREQ_OFFSET_BOUND)
  68. + rt2x00_set_field8(&rfcsr, RFCSR17_CODE, FREQ_OFFSET_BOUND);
  69. + else
  70. + rt2x00_set_field8(&rfcsr, RFCSR17_CODE, rt2x00dev->freq_offset);
  71. +
  72. + rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
  73. +
  74. + rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
  75. + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
  76. + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
  77. +
  78. + if ( rt2x00dev->default_ant.tx_chain_num == 2 )
  79. + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
  80. + else
  81. + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
  82. +
  83. + if ( rt2x00dev->default_ant.rx_chain_num == 2 )
  84. + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
  85. + else
  86. + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
  87. +
  88. + rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
  89. + rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
  90. +
  91. + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
  92. +
  93. + rt2800_rfcsr_write(rt2x00dev, 31, 80);
  94. +}
  95. +
  96. static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
  97. struct ieee80211_conf *conf,
  98. struct rf_channel *rf,
  99. @@ -2182,6 +2237,9 @@ static void rt2800_config_channel(struct
  100. case RF3290:
  101. rt2800_config_channel_rf3290(rt2x00dev, conf, rf, info);
  102. break;
  103. + case RF3322:
  104. + rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
  105. + break;
  106. case RF5360:
  107. case RF5370:
  108. case RF5372:
  109. @@ -2194,6 +2252,7 @@ static void rt2800_config_channel(struct
  110. }
  111. if (rt2x00_rf(rt2x00dev, RF3290) ||
  112. + rt2x00_rf(rt2x00dev, RF3322) ||
  113. rt2x00_rf(rt2x00dev, RF5360) ||
  114. rt2x00_rf(rt2x00dev, RF5370) ||
  115. rt2x00_rf(rt2x00dev, RF5372) ||
  116. @@ -2212,10 +2271,17 @@ static void rt2800_config_channel(struct
  117. /*
  118. * Change BBP settings
  119. */
  120. - rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
  121. - rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
  122. - rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
  123. - rt2800_bbp_write(rt2x00dev, 86, 0);
  124. + if (rt2x00_rt(rt2x00dev, RT3352)) {
  125. + rt2800_bbp_write(rt2x00dev, 27, 0x0);
  126. + rt2800_bbp_write(rt2x00dev, 62, 0x26 + rt2x00dev->lna_gain);
  127. + rt2800_bbp_write(rt2x00dev, 27, 0x20);
  128. + rt2800_bbp_write(rt2x00dev, 62, 0x26 + rt2x00dev->lna_gain);
  129. + } else {
  130. + rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
  131. + rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
  132. + rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
  133. + rt2800_bbp_write(rt2x00dev, 86, 0);
  134. + }
  135. if (rf->channel <= 14) {
  136. if (!rt2x00_rt(rt2x00dev, RT5390) &&
  137. @@ -2310,6 +2376,15 @@ static void rt2800_config_channel(struct
  138. rt2800_register_read(rt2x00dev, CH_IDLE_STA, &reg);
  139. rt2800_register_read(rt2x00dev, CH_BUSY_STA, &reg);
  140. rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC, &reg);
  141. +
  142. + /*
  143. + * Clear update flag
  144. + */
  145. + if (rt2x00_rt(rt2x00dev, RT3352)) {
  146. + rt2800_bbp_read(rt2x00dev, 49, &bbp);
  147. + rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
  148. + rt2800_bbp_write(rt2x00dev, 49, bbp);
  149. + }
  150. }
  151. static int rt2800_get_gain_calibration_delta(struct rt2x00_dev *rt2x00dev)
  152. @@ -2998,6 +3073,10 @@ static int rt2800_init_registers(struct
  153. rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
  154. rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
  155. rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000030);
  156. + } else if (rt2x00_rt(rt2x00dev, RT3352)) {
  157. + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402);
  158. + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
  159. + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
  160. } else if (rt2x00_rt(rt2x00dev, RT3572)) {
  161. rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
  162. rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
  163. @@ -3378,6 +3457,11 @@ static int rt2800_init_bbp(struct rt2x00
  164. rt2800_wait_bbp_ready(rt2x00dev)))
  165. return -EACCES;
  166. + if (rt2x00_rt(rt2x00dev, RT3352)) {
  167. + rt2800_bbp_write(rt2x00dev, 3, 0x00);
  168. + rt2800_bbp_write(rt2x00dev, 4, 0x50);
  169. + }
  170. +
  171. if (rt2x00_rt(rt2x00dev, RT3290) ||
  172. rt2x00_rt(rt2x00dev, RT5390) ||
  173. rt2x00_rt(rt2x00dev, RT5392)) {
  174. @@ -3388,15 +3472,20 @@ static int rt2800_init_bbp(struct rt2x00
  175. if (rt2800_is_305x_soc(rt2x00dev) ||
  176. rt2x00_rt(rt2x00dev, RT3290) ||
  177. + rt2x00_rt(rt2x00dev, RT3352) ||
  178. rt2x00_rt(rt2x00dev, RT3572) ||
  179. rt2x00_rt(rt2x00dev, RT5390) ||
  180. rt2x00_rt(rt2x00dev, RT5392))
  181. rt2800_bbp_write(rt2x00dev, 31, 0x08);
  182. + if (rt2x00_rt(rt2x00dev, RT3352))
  183. + rt2800_bbp_write(rt2x00dev, 47, 0x48);
  184. +
  185. rt2800_bbp_write(rt2x00dev, 65, 0x2c);
  186. rt2800_bbp_write(rt2x00dev, 66, 0x38);
  187. if (rt2x00_rt(rt2x00dev, RT3290) ||
  188. + rt2x00_rt(rt2x00dev, RT3352) ||
  189. rt2x00_rt(rt2x00dev, RT5390) ||
  190. rt2x00_rt(rt2x00dev, RT5392))
  191. rt2800_bbp_write(rt2x00dev, 68, 0x0b);
  192. @@ -3405,6 +3494,7 @@ static int rt2800_init_bbp(struct rt2x00
  193. rt2800_bbp_write(rt2x00dev, 69, 0x16);
  194. rt2800_bbp_write(rt2x00dev, 73, 0x12);
  195. } else if (rt2x00_rt(rt2x00dev, RT3290) ||
  196. + rt2x00_rt(rt2x00dev, RT3352) ||
  197. rt2x00_rt(rt2x00dev, RT5390) ||
  198. rt2x00_rt(rt2x00dev, RT5392)) {
  199. rt2800_bbp_write(rt2x00dev, 69, 0x12);
  200. @@ -3436,6 +3526,10 @@ static int rt2800_init_bbp(struct rt2x00
  201. } else if (rt2800_is_305x_soc(rt2x00dev)) {
  202. rt2800_bbp_write(rt2x00dev, 78, 0x0e);
  203. rt2800_bbp_write(rt2x00dev, 80, 0x08);
  204. + } else if (rt2x00_rt(rt2x00dev, RT3352)) {
  205. + rt2800_bbp_write(rt2x00dev, 78, 0x0e);
  206. + rt2800_bbp_write(rt2x00dev, 80, 0x08);
  207. + rt2800_bbp_write(rt2x00dev, 81, 0x37);
  208. } else {
  209. rt2800_bbp_write(rt2x00dev, 81, 0x37);
  210. }
  211. @@ -3465,18 +3559,21 @@ static int rt2800_init_bbp(struct rt2x00
  212. rt2800_bbp_write(rt2x00dev, 84, 0x99);
  213. if (rt2x00_rt(rt2x00dev, RT3290) ||
  214. + rt2x00_rt(rt2x00dev, RT3352) ||
  215. rt2x00_rt(rt2x00dev, RT5390) ||
  216. rt2x00_rt(rt2x00dev, RT5392))
  217. rt2800_bbp_write(rt2x00dev, 86, 0x38);
  218. else
  219. rt2800_bbp_write(rt2x00dev, 86, 0x00);
  220. - if (rt2x00_rt(rt2x00dev, RT5392))
  221. + if (rt2x00_rt(rt2x00dev, RT3352) ||
  222. + rt2x00_rt(rt2x00dev, RT5392))
  223. rt2800_bbp_write(rt2x00dev, 88, 0x90);
  224. rt2800_bbp_write(rt2x00dev, 91, 0x04);
  225. if (rt2x00_rt(rt2x00dev, RT3290) ||
  226. + rt2x00_rt(rt2x00dev, RT3352) ||
  227. rt2x00_rt(rt2x00dev, RT5390) ||
  228. rt2x00_rt(rt2x00dev, RT5392))
  229. rt2800_bbp_write(rt2x00dev, 92, 0x02);
  230. @@ -3493,6 +3590,7 @@ static int rt2800_init_bbp(struct rt2x00
  231. rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) ||
  232. rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) ||
  233. rt2x00_rt(rt2x00dev, RT3290) ||
  234. + rt2x00_rt(rt2x00dev, RT3352) ||
  235. rt2x00_rt(rt2x00dev, RT3572) ||
  236. rt2x00_rt(rt2x00dev, RT5390) ||
  237. rt2x00_rt(rt2x00dev, RT5392) ||
  238. @@ -3502,6 +3600,7 @@ static int rt2800_init_bbp(struct rt2x00
  239. rt2800_bbp_write(rt2x00dev, 103, 0x00);
  240. if (rt2x00_rt(rt2x00dev, RT3290) ||
  241. + rt2x00_rt(rt2x00dev, RT3352) ||
  242. rt2x00_rt(rt2x00dev, RT5390) ||
  243. rt2x00_rt(rt2x00dev, RT5392))
  244. rt2800_bbp_write(rt2x00dev, 104, 0x92);
  245. @@ -3510,6 +3609,8 @@ static int rt2800_init_bbp(struct rt2x00
  246. rt2800_bbp_write(rt2x00dev, 105, 0x01);
  247. else if (rt2x00_rt(rt2x00dev, RT3290))
  248. rt2800_bbp_write(rt2x00dev, 105, 0x1c);
  249. + else if (rt2x00_rt(rt2x00dev, RT3352))
  250. + rt2800_bbp_write(rt2x00dev, 105, 0x34);
  251. else if (rt2x00_rt(rt2x00dev, RT5390) ||
  252. rt2x00_rt(rt2x00dev, RT5392))
  253. rt2800_bbp_write(rt2x00dev, 105, 0x3c);
  254. @@ -3519,11 +3620,16 @@ static int rt2800_init_bbp(struct rt2x00
  255. if (rt2x00_rt(rt2x00dev, RT3290) ||
  256. rt2x00_rt(rt2x00dev, RT5390))
  257. rt2800_bbp_write(rt2x00dev, 106, 0x03);
  258. + else if (rt2x00_rt(rt2x00dev, RT3352))
  259. + rt2800_bbp_write(rt2x00dev, 106, 0x05);
  260. else if (rt2x00_rt(rt2x00dev, RT5392))
  261. rt2800_bbp_write(rt2x00dev, 106, 0x12);
  262. else
  263. rt2800_bbp_write(rt2x00dev, 106, 0x35);
  264. + if (rt2x00_rt(rt2x00dev, RT3352))
  265. + rt2800_bbp_write(rt2x00dev, 120, 0x50);
  266. +
  267. if (rt2x00_rt(rt2x00dev, RT3290) ||
  268. rt2x00_rt(rt2x00dev, RT5390) ||
  269. rt2x00_rt(rt2x00dev, RT5392))
  270. @@ -3534,6 +3640,9 @@ static int rt2800_init_bbp(struct rt2x00
  271. rt2800_bbp_write(rt2x00dev, 135, 0xf6);
  272. }
  273. + if (rt2x00_rt(rt2x00dev, RT3352))
  274. + rt2800_bbp_write(rt2x00dev, 137, 0x0f);
  275. +
  276. if (rt2x00_rt(rt2x00dev, RT3071) ||
  277. rt2x00_rt(rt2x00dev, RT3090) ||
  278. rt2x00_rt(rt2x00dev, RT3390) ||
  279. @@ -3574,6 +3683,28 @@ static int rt2800_init_bbp(struct rt2x00
  280. rt2800_bbp_write(rt2x00dev, 3, value);
  281. }
  282. + if (rt2x00_rt(rt2x00dev, RT3352)) {
  283. + rt2800_bbp_write(rt2x00dev, 163, 0xbd);
  284. + /* Set ITxBF timeout to 0x9c40=1000msec */
  285. + rt2800_bbp_write(rt2x00dev, 179, 0x02);
  286. + rt2800_bbp_write(rt2x00dev, 180, 0x00);
  287. + rt2800_bbp_write(rt2x00dev, 182, 0x40);
  288. + rt2800_bbp_write(rt2x00dev, 180, 0x01);
  289. + rt2800_bbp_write(rt2x00dev, 182, 0x9c);
  290. + rt2800_bbp_write(rt2x00dev, 179, 0x00);
  291. + /* Reprogram the inband interface to put right values in RXWI */
  292. + rt2800_bbp_write(rt2x00dev, 142, 0x04);
  293. + rt2800_bbp_write(rt2x00dev, 143, 0x3b);
  294. + rt2800_bbp_write(rt2x00dev, 142, 0x06);
  295. + rt2800_bbp_write(rt2x00dev, 143, 0xa0);
  296. + rt2800_bbp_write(rt2x00dev, 142, 0x07);
  297. + rt2800_bbp_write(rt2x00dev, 143, 0xa1);
  298. + rt2800_bbp_write(rt2x00dev, 142, 0x08);
  299. + rt2800_bbp_write(rt2x00dev, 143, 0xa2);
  300. +
  301. + rt2800_bbp_write(rt2x00dev, 148, 0xc8);
  302. + }
  303. +
  304. if (rt2x00_rt(rt2x00dev, RT5390) ||
  305. rt2x00_rt(rt2x00dev, RT5392)) {
  306. int ant, div_mode;
  307. @@ -3707,6 +3838,7 @@ static int rt2800_init_rfcsr(struct rt2x
  308. !rt2x00_rt(rt2x00dev, RT3071) &&
  309. !rt2x00_rt(rt2x00dev, RT3090) &&
  310. !rt2x00_rt(rt2x00dev, RT3290) &&
  311. + !rt2x00_rt(rt2x00dev, RT3352) &&
  312. !rt2x00_rt(rt2x00dev, RT3390) &&
  313. !rt2x00_rt(rt2x00dev, RT3572) &&
  314. !rt2x00_rt(rt2x00dev, RT5390) &&
  315. @@ -3903,6 +4035,70 @@ static int rt2800_init_rfcsr(struct rt2x
  316. rt2800_rfcsr_write(rt2x00dev, 30, 0x00);
  317. rt2800_rfcsr_write(rt2x00dev, 31, 0x00);
  318. return 0;
  319. + } else if (rt2x00_rt(rt2x00dev, RT3352)) {
  320. + rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
  321. + rt2800_rfcsr_write(rt2x00dev, 1, 0x23);
  322. + rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
  323. + rt2800_rfcsr_write(rt2x00dev, 3, 0x18);
  324. + rt2800_rfcsr_write(rt2x00dev, 4, 0x00);
  325. + rt2800_rfcsr_write(rt2x00dev, 5, 0x00);
  326. + rt2800_rfcsr_write(rt2x00dev, 6, 0x33);
  327. + rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
  328. + rt2800_rfcsr_write(rt2x00dev, 8, 0xf1);
  329. + rt2800_rfcsr_write(rt2x00dev, 9, 0x02);
  330. + rt2800_rfcsr_write(rt2x00dev, 10, 0xd2);
  331. + rt2800_rfcsr_write(rt2x00dev, 11, 0x42);
  332. + rt2800_rfcsr_write(rt2x00dev, 12, 0x1c);
  333. + rt2800_rfcsr_write(rt2x00dev, 13, 0x00);
  334. + rt2800_rfcsr_write(rt2x00dev, 14, 0x5a);
  335. + rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
  336. + rt2800_rfcsr_write(rt2x00dev, 16, 0x01);
  337. + rt2800_rfcsr_write(rt2x00dev, 18, 0x45);
  338. + rt2800_rfcsr_write(rt2x00dev, 19, 0x02);
  339. + rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
  340. + rt2800_rfcsr_write(rt2x00dev, 21, 0x00);
  341. + rt2800_rfcsr_write(rt2x00dev, 22, 0x00);
  342. + rt2800_rfcsr_write(rt2x00dev, 23, 0x00);
  343. + rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
  344. + rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
  345. + rt2800_rfcsr_write(rt2x00dev, 26, 0x00);
  346. + rt2800_rfcsr_write(rt2x00dev, 27, 0x03);
  347. + rt2800_rfcsr_write(rt2x00dev, 28, 0x03);
  348. + rt2800_rfcsr_write(rt2x00dev, 29, 0x00);
  349. + rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
  350. + rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
  351. + rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
  352. + rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
  353. + rt2800_rfcsr_write(rt2x00dev, 34, 0x01);
  354. + rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
  355. + rt2800_rfcsr_write(rt2x00dev, 36, 0xbd);
  356. + rt2800_rfcsr_write(rt2x00dev, 37, 0x3c);
  357. + rt2800_rfcsr_write(rt2x00dev, 38, 0x5f);
  358. + rt2800_rfcsr_write(rt2x00dev, 39, 0xc5);
  359. + rt2800_rfcsr_write(rt2x00dev, 40, 0x33);
  360. + rt2800_rfcsr_write(rt2x00dev, 41, 0x5b);
  361. + rt2800_rfcsr_write(rt2x00dev, 42, 0x5b);
  362. + rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
  363. + rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
  364. + rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
  365. + rt2800_rfcsr_write(rt2x00dev, 46, 0xdd);
  366. + rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
  367. + rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
  368. + rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
  369. + rt2800_rfcsr_write(rt2x00dev, 50, 0x2d);
  370. + rt2800_rfcsr_write(rt2x00dev, 51, 0x7f);
  371. + rt2800_rfcsr_write(rt2x00dev, 52, 0x00);
  372. + rt2800_rfcsr_write(rt2x00dev, 53, 0x52);
  373. + rt2800_rfcsr_write(rt2x00dev, 54, 0x1b);
  374. + rt2800_rfcsr_write(rt2x00dev, 55, 0x7f);
  375. + rt2800_rfcsr_write(rt2x00dev, 56, 0x00);
  376. + rt2800_rfcsr_write(rt2x00dev, 57, 0x52);
  377. + rt2800_rfcsr_write(rt2x00dev, 58, 0x1b);
  378. + rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
  379. + rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
  380. + rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
  381. + rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
  382. + rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
  383. } else if (rt2x00_rt(rt2x00dev, RT5390)) {
  384. rt2800_rfcsr_write(rt2x00dev, 1, 0x0f);
  385. rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
  386. @@ -4104,6 +4300,7 @@ static int rt2800_init_rfcsr(struct rt2x
  387. rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x19);
  388. } else if (rt2x00_rt(rt2x00dev, RT3071) ||
  389. rt2x00_rt(rt2x00dev, RT3090) ||
  390. + rt2x00_rt(rt2x00dev, RT3352) ||
  391. rt2x00_rt(rt2x00dev, RT3390) ||
  392. rt2x00_rt(rt2x00dev, RT3572)) {
  393. drv_data->calibration_bw20 =
  394. @@ -4566,6 +4763,7 @@ static int rt2800_init_eeprom(struct rt2
  395. case RT3071:
  396. case RT3090:
  397. case RT3290:
  398. + case RT3352:
  399. case RT3390:
  400. case RT3572:
  401. case RT5390:
  402. @@ -4588,6 +4786,7 @@ static int rt2800_init_eeprom(struct rt2
  403. case RF3052:
  404. case RF3290:
  405. case RF3320:
  406. + case RF3322:
  407. case RF5360:
  408. case RF5370:
  409. case RF5372:
  410. @@ -4612,6 +4811,7 @@ static int rt2800_init_eeprom(struct rt2
  411. if (rt2x00_rt(rt2x00dev, RT3070) ||
  412. rt2x00_rt(rt2x00dev, RT3090) ||
  413. + rt2x00_rt(rt2x00dev, RT3352) ||
  414. rt2x00_rt(rt2x00dev, RT3390)) {
  415. value = rt2x00_get_field16(eeprom,
  416. EEPROM_NIC_CONF1_ANT_DIVERSITY);
  417. @@ -4904,6 +5104,7 @@ static int rt2800_probe_hw_mode(struct r
  418. rt2x00_rf(rt2x00dev, RF3022) ||
  419. rt2x00_rf(rt2x00dev, RF3290) ||
  420. rt2x00_rf(rt2x00dev, RF3320) ||
  421. + rt2x00_rf(rt2x00dev, RF3322) ||
  422. rt2x00_rf(rt2x00dev, RF5360) ||
  423. rt2x00_rf(rt2x00dev, RF5370) ||
  424. rt2x00_rf(rt2x00dev, RF5372) ||
  425. --- a/drivers/net/wireless/rt2x00/rt2x00.h
  426. +++ b/drivers/net/wireless/rt2x00/rt2x00.h
  427. @@ -189,6 +189,7 @@ struct rt2x00_chip {
  428. #define RT3071 0x3071
  429. #define RT3090 0x3090 /* 2.4GHz PCIe */
  430. #define RT3290 0x3290
  431. +#define RT3352 0x3352 /* WSOC */
  432. #define RT3390 0x3390
  433. #define RT3572 0x3572
  434. #define RT3593 0x3593