rf.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
  4. * All rights reserved.
  5. *
  6. * File: rf.c
  7. *
  8. * Purpose: rf function code
  9. *
  10. * Author: Jerry Chen
  11. *
  12. * Date: Feb. 19, 2004
  13. *
  14. * Functions:
  15. * vnt_rf_write_embedded - Embedded write RF register via MAC
  16. *
  17. * Revision History:
  18. * RF_VT3226: RobertYu:20051111, VT3226C0 and before
  19. * RF_VT3226D0: RobertYu:20051228
  20. * RF_VT3342A0: RobertYu:20060609
  21. *
  22. */
  23. #include "mac.h"
  24. #include "rf.h"
  25. #include "baseband.h"
  26. #include "usbpipe.h"
  27. #define CB_AL2230_INIT_SEQ 15
  28. #define AL2230_PWR_IDX_LEN 64
  29. #define CB_AL7230_INIT_SEQ 16
  30. #define AL7230_PWR_IDX_LEN 64
  31. #define CB_VT3226_INIT_SEQ 11
  32. #define VT3226_PWR_IDX_LEN 64
  33. #define CB_VT3342_INIT_SEQ 13
  34. #define VT3342_PWR_IDX_LEN 64
  35. static u8 al2230_init_table[CB_AL2230_INIT_SEQ][3] = {
  36. {0x03, 0xf7, 0x90},
  37. {0x03, 0x33, 0x31},
  38. {0x01, 0xb8, 0x02},
  39. {0x00, 0xff, 0xf3},
  40. {0x00, 0x05, 0xa4},
  41. {0x0f, 0x4d, 0xc5},
  42. {0x08, 0x05, 0xb6},
  43. {0x01, 0x47, 0xc7},
  44. {0x00, 0x06, 0x88},
  45. {0x04, 0x03, 0xb9},
  46. {0x00, 0xdb, 0xba},
  47. {0x00, 0x09, 0x9b},
  48. {0x0b, 0xdf, 0xfc},
  49. {0x00, 0x00, 0x0d},
  50. {0x00, 0x58, 0x0f}
  51. };
  52. static u8 al2230_channel_table0[CB_MAX_CHANNEL_24G][3] = {
  53. {0x03, 0xf7, 0x90},
  54. {0x03, 0xf7, 0x90},
  55. {0x03, 0xe7, 0x90},
  56. {0x03, 0xe7, 0x90},
  57. {0x03, 0xf7, 0xa0},
  58. {0x03, 0xf7, 0xa0},
  59. {0x03, 0xe7, 0xa0},
  60. {0x03, 0xe7, 0xa0},
  61. {0x03, 0xf7, 0xb0},
  62. {0x03, 0xf7, 0xb0},
  63. {0x03, 0xe7, 0xb0},
  64. {0x03, 0xe7, 0xb0},
  65. {0x03, 0xf7, 0xc0},
  66. {0x03, 0xe7, 0xc0}
  67. };
  68. static u8 al2230_channel_table1[CB_MAX_CHANNEL_24G][3] = {
  69. {0x03, 0x33, 0x31},
  70. {0x0b, 0x33, 0x31},
  71. {0x03, 0x33, 0x31},
  72. {0x0b, 0x33, 0x31},
  73. {0x03, 0x33, 0x31},
  74. {0x0b, 0x33, 0x31},
  75. {0x03, 0x33, 0x31},
  76. {0x0b, 0x33, 0x31},
  77. {0x03, 0x33, 0x31},
  78. {0x0b, 0x33, 0x31},
  79. {0x03, 0x33, 0x31},
  80. {0x0b, 0x33, 0x31},
  81. {0x03, 0x33, 0x31},
  82. {0x06, 0x66, 0x61}
  83. };
  84. static u8 al7230_init_table[CB_AL7230_INIT_SEQ][3] = {
  85. {0x20, 0x37, 0x90},
  86. {0x13, 0x33, 0x31},
  87. {0x84, 0x1f, 0xf2},
  88. {0x3f, 0xdf, 0xa3},
  89. {0x7f, 0xd7, 0x84},
  90. {0x80, 0x2b, 0x55},
  91. {0x56, 0xaf, 0x36},
  92. {0xce, 0x02, 0x07},
  93. {0x6e, 0xbc, 0x98},
  94. {0x22, 0x1b, 0xb9},
  95. {0xe0, 0x00, 0x0a},
  96. {0x08, 0x03, 0x1b},
  97. {0x00, 0x0a, 0x3c},
  98. {0xff, 0xff, 0xfd},
  99. {0x00, 0x00, 0x0e},
  100. {0x1a, 0xba, 0x8f}
  101. };
  102. static u8 al7230_init_table_amode[CB_AL7230_INIT_SEQ][3] = {
  103. {0x2f, 0xf5, 0x20},
  104. {0x00, 0x00, 0x01},
  105. {0x45, 0x1f, 0xe2},
  106. {0x5f, 0xdf, 0xa3},
  107. {0x6f, 0xd7, 0x84},
  108. {0x85, 0x3f, 0x55},
  109. {0x56, 0xaf, 0x36},
  110. {0xce, 0x02, 0x07},
  111. {0x6e, 0xbc, 0x98},
  112. {0x22, 0x1b, 0xb9},
  113. {0xe0, 0x60, 0x0a},
  114. {0x08, 0x03, 0x1b},
  115. {0x00, 0x14, 0x7c},
  116. {0xff, 0xff, 0xfd},
  117. {0x00, 0x00, 0x0e},
  118. {0x12, 0xba, 0xcf}
  119. };
  120. static u8 al7230_channel_table0[CB_MAX_CHANNEL][3] = {
  121. {0x20, 0x37, 0x90},
  122. {0x20, 0x37, 0x90},
  123. {0x20, 0x37, 0x90},
  124. {0x20, 0x37, 0x90},
  125. {0x20, 0x37, 0xa0},
  126. {0x20, 0x37, 0xa0},
  127. {0x20, 0x37, 0xa0},
  128. {0x20, 0x37, 0xa0},
  129. {0x20, 0x37, 0xb0},
  130. {0x20, 0x37, 0xb0},
  131. {0x20, 0x37, 0xb0},
  132. {0x20, 0x37, 0xb0},
  133. {0x20, 0x37, 0xc0},
  134. {0x20, 0x37, 0xc0},
  135. {0x0f, 0xf5, 0x20}, /* channel 15 Tf = 4915MHz */
  136. {0x2f, 0xf5, 0x20},
  137. {0x0f, 0xf5, 0x20},
  138. {0x0f, 0xf5, 0x20},
  139. {0x2f, 0xf5, 0x20},
  140. {0x0f, 0xf5, 0x20},
  141. {0x2f, 0xf5, 0x30},
  142. {0x2f, 0xf5, 0x30},
  143. {0x0f, 0xf5, 0x40},
  144. {0x2f, 0xf5, 0x40},
  145. {0x0f, 0xf5, 0x40},
  146. {0x0f, 0xf5, 0x40},
  147. {0x2f, 0xf5, 0x40},
  148. {0x2f, 0xf5, 0x50},
  149. {0x2f, 0xf5, 0x60},
  150. {0x2f, 0xf5, 0x60},
  151. {0x2f, 0xf5, 0x70},
  152. {0x2f, 0xf5, 0x70},
  153. {0x2f, 0xf5, 0x70},
  154. {0x2f, 0xf5, 0x70},
  155. {0x2f, 0xf5, 0x70},
  156. {0x2f, 0xf5, 0x70},
  157. {0x2f, 0xf5, 0x80},
  158. {0x2f, 0xf5, 0x80},
  159. {0x2f, 0xf5, 0x80},
  160. {0x2f, 0xf5, 0x90},
  161. {0x2f, 0xf5, 0xc0},
  162. {0x2f, 0xf5, 0xc0},
  163. {0x2f, 0xf5, 0xc0},
  164. {0x2f, 0xf5, 0xd0},
  165. {0x2f, 0xf5, 0xd0},
  166. {0x2f, 0xf5, 0xd0},
  167. {0x2f, 0xf5, 0xe0},
  168. {0x2f, 0xf5, 0xe0},
  169. {0x2f, 0xf5, 0xe0},
  170. {0x2f, 0xf5, 0xf0},
  171. {0x2f, 0xf5, 0xf0},
  172. {0x2f, 0xf6, 0x00},
  173. {0x2f, 0xf6, 0x00},
  174. {0x2f, 0xf6, 0x00},
  175. {0x2f, 0xf6, 0x10},
  176. {0x2f, 0xf6, 0x10}
  177. };
  178. static u8 al7230_channel_table1[CB_MAX_CHANNEL][3] = {
  179. {0x13, 0x33, 0x31},
  180. {0x1b, 0x33, 0x31},
  181. {0x03, 0x33, 0x31},
  182. {0x0b, 0x33, 0x31},
  183. {0x13, 0x33, 0x31},
  184. {0x1b, 0x33, 0x31},
  185. {0x03, 0x33, 0x31},
  186. {0x0b, 0x33, 0x31},
  187. {0x13, 0x33, 0x31},
  188. {0x1b, 0x33, 0x31},
  189. {0x03, 0x33, 0x31},
  190. {0x0b, 0x33, 0x31},
  191. {0x13, 0x33, 0x31},
  192. {0x06, 0x66, 0x61},
  193. {0x1d, 0x55, 0x51}, /* channel = 15, Tf = 4915MHz */
  194. {0x00, 0x00, 0x01},
  195. {0x02, 0xaa, 0xa1},
  196. {0x08, 0x00, 0x01},
  197. {0x0a, 0xaa, 0xa1},
  198. {0x0d, 0x55, 0x51},
  199. {0x15, 0x55, 0x51},
  200. {0x00, 0x00, 0x01},
  201. {0x1d, 0x55, 0x51},
  202. {0x00, 0x00, 0x01},
  203. {0x02, 0xaa, 0xa1},
  204. {0x08, 0x00, 0x01},
  205. {0x0a, 0xaa, 0xa1},
  206. {0x15, 0x55, 0x51},
  207. {0x05, 0x55, 0x51},
  208. {0x0a, 0xaa, 0xa1},
  209. {0x10, 0x00, 0x01},
  210. {0x15, 0x55, 0x51},
  211. {0x1a, 0xaa, 0xa1},
  212. {0x00, 0x00, 0x01},
  213. {0x05, 0x55, 0x51},
  214. {0x0a, 0xaa, 0xa1},
  215. {0x15, 0x55, 0x51},
  216. {0x00, 0x00, 0x01},
  217. {0x0a, 0xaa, 0xa1},
  218. {0x15, 0x55, 0x51},
  219. {0x15, 0x55, 0x51},
  220. {0x00, 0x00, 0x01},
  221. {0x0a, 0xaa, 0xa1},
  222. {0x15, 0x55, 0x51},
  223. {0x00, 0x00, 0x01},
  224. {0x0a, 0xaa, 0xa1},
  225. {0x15, 0x55, 0x51},
  226. {0x00, 0x00, 0x01},
  227. {0x0a, 0xaa, 0xa1},
  228. {0x15, 0x55, 0x51},
  229. {0x00, 0x00, 0x01},
  230. {0x18, 0x00, 0x01},
  231. {0x02, 0xaa, 0xa1},
  232. {0x0d, 0x55, 0x51},
  233. {0x18, 0x00, 0x01},
  234. {0x02, 0xaa, 0xb1}
  235. };
  236. static u8 al7230_channel_table2[CB_MAX_CHANNEL][3] = {
  237. {0x7f, 0xd7, 0x84},
  238. {0x7f, 0xd7, 0x84},
  239. {0x7f, 0xd7, 0x84},
  240. {0x7f, 0xd7, 0x84},
  241. {0x7f, 0xd7, 0x84},
  242. {0x7f, 0xd7, 0x84},
  243. {0x7f, 0xd7, 0x84},
  244. {0x7f, 0xd7, 0x84},
  245. {0x7f, 0xd7, 0x84},
  246. {0x7f, 0xd7, 0x84},
  247. {0x7f, 0xd7, 0x84},
  248. {0x7f, 0xd7, 0x84},
  249. {0x7f, 0xd7, 0x84},
  250. {0x7f, 0xd7, 0x84},
  251. {0x7f, 0xd7, 0x84}, /* channel = 15 Tf = 4915MHz */
  252. {0x6f, 0xd7, 0x84},
  253. {0x7f, 0xd7, 0x84},
  254. {0x7f, 0xd7, 0x84},
  255. {0x7f, 0xd7, 0x84},
  256. {0x7f, 0xd7, 0x84},
  257. {0x7f, 0xd7, 0x84},
  258. {0x6f, 0xd7, 0x84},
  259. {0x7f, 0xd7, 0x84},
  260. {0x6f, 0xd7, 0x84},
  261. {0x7f, 0xd7, 0x84},
  262. {0x7f, 0xd7, 0x84},
  263. {0x7f, 0xd7, 0x84},
  264. {0x7f, 0xd7, 0x84},
  265. {0x7f, 0xd7, 0x84},
  266. {0x7f, 0xd7, 0x84},
  267. {0x7f, 0xd7, 0x84},
  268. {0x7f, 0xd7, 0x84},
  269. {0x7f, 0xd7, 0x84},
  270. {0x6f, 0xd7, 0x84},
  271. {0x7f, 0xd7, 0x84},
  272. {0x7f, 0xd7, 0x84},
  273. {0x7f, 0xd7, 0x84},
  274. {0x6f, 0xd7, 0x84},
  275. {0x7f, 0xd7, 0x84},
  276. {0x7f, 0xd7, 0x84},
  277. {0x7f, 0xd7, 0x84},
  278. {0x6f, 0xd7, 0x84},
  279. {0x7f, 0xd7, 0x84},
  280. {0x7f, 0xd7, 0x84},
  281. {0x6f, 0xd7, 0x84},
  282. {0x7f, 0xd7, 0x84},
  283. {0x7f, 0xd7, 0x84},
  284. {0x6f, 0xd7, 0x84},
  285. {0x7f, 0xd7, 0x84},
  286. {0x7f, 0xd7, 0x84},
  287. {0x6f, 0xd7, 0x84},
  288. {0x7f, 0xd7, 0x84},
  289. {0x7f, 0xd7, 0x84},
  290. {0x7f, 0xd7, 0x84},
  291. {0x7f, 0xd7, 0x84},
  292. {0x7f, 0xd7, 0x84}
  293. };
  294. static u8 vt3226_init_table[CB_VT3226_INIT_SEQ][3] = {
  295. {0x03, 0xff, 0x80},
  296. {0x02, 0x82, 0xa1},
  297. {0x03, 0xc6, 0xa2},
  298. {0x01, 0x97, 0x93},
  299. {0x03, 0x66, 0x64},
  300. {0x00, 0x61, 0xa5},
  301. {0x01, 0x7b, 0xd6},
  302. {0x00, 0x80, 0x17},
  303. {0x03, 0xf8, 0x08},
  304. {0x00, 0x02, 0x39},
  305. {0x02, 0x00, 0x2a}
  306. };
  307. static u8 vt3226d0_init_table[CB_VT3226_INIT_SEQ][3] = {
  308. {0x03, 0xff, 0x80},
  309. {0x03, 0x02, 0x21},
  310. {0x03, 0xc6, 0xa2},
  311. {0x01, 0x97, 0x93},
  312. {0x03, 0x66, 0x64},
  313. {0x00, 0x71, 0xa5},
  314. {0x01, 0x15, 0xc6},
  315. {0x01, 0x2e, 0x07},
  316. {0x00, 0x58, 0x08},
  317. {0x00, 0x02, 0x79},
  318. {0x02, 0x01, 0xaa}
  319. };
  320. static u8 vt3226_channel_table0[CB_MAX_CHANNEL_24G][3] = {
  321. {0x01, 0x97, 0x83},
  322. {0x01, 0x97, 0x83},
  323. {0x01, 0x97, 0x93},
  324. {0x01, 0x97, 0x93},
  325. {0x01, 0x97, 0x93},
  326. {0x01, 0x97, 0x93},
  327. {0x01, 0x97, 0xa3},
  328. {0x01, 0x97, 0xa3},
  329. {0x01, 0x97, 0xa3},
  330. {0x01, 0x97, 0xa3},
  331. {0x01, 0x97, 0xb3},
  332. {0x01, 0x97, 0xb3},
  333. {0x01, 0x97, 0xb3},
  334. {0x03, 0x37, 0xc3}
  335. };
  336. static u8 vt3226_channel_table1[CB_MAX_CHANNEL_24G][3] = {
  337. {0x02, 0x66, 0x64},
  338. {0x03, 0x66, 0x64},
  339. {0x00, 0x66, 0x64},
  340. {0x01, 0x66, 0x64},
  341. {0x02, 0x66, 0x64},
  342. {0x03, 0x66, 0x64},
  343. {0x00, 0x66, 0x64},
  344. {0x01, 0x66, 0x64},
  345. {0x02, 0x66, 0x64},
  346. {0x03, 0x66, 0x64},
  347. {0x00, 0x66, 0x64},
  348. {0x01, 0x66, 0x64},
  349. {0x02, 0x66, 0x64},
  350. {0x00, 0xcc, 0xc4}
  351. };
  352. static const u32 vt3226d0_lo_current_table[CB_MAX_CHANNEL_24G] = {
  353. 0x0135c600,
  354. 0x0135c600,
  355. 0x0235c600,
  356. 0x0235c600,
  357. 0x0235c600,
  358. 0x0335c600,
  359. 0x0335c600,
  360. 0x0335c600,
  361. 0x0335c600,
  362. 0x0335c600,
  363. 0x0335c600,
  364. 0x0335c600,
  365. 0x0335c600,
  366. 0x0135c600
  367. };
  368. static u8 vt3342a0_init_table[CB_VT3342_INIT_SEQ][3] = { /* 11b/g mode */
  369. {0x03, 0xff, 0x80},
  370. {0x02, 0x08, 0x81},
  371. {0x00, 0xc6, 0x02},
  372. {0x03, 0xc5, 0x13},
  373. {0x00, 0xee, 0xe4},
  374. {0x00, 0x71, 0xa5},
  375. {0x01, 0x75, 0x46},
  376. {0x01, 0x40, 0x27},
  377. {0x01, 0x54, 0x08},
  378. {0x00, 0x01, 0x69},
  379. {0x02, 0x00, 0xaa},
  380. {0x00, 0x08, 0xcb},
  381. {0x01, 0x70, 0x0c}
  382. };
  383. static u8 vt3342_channel_table0[CB_MAX_CHANNEL][3] = {
  384. {0x02, 0x05, 0x03},
  385. {0x01, 0x15, 0x03},
  386. {0x03, 0xc5, 0x03},
  387. {0x02, 0x65, 0x03},
  388. {0x01, 0x15, 0x13},
  389. {0x03, 0xc5, 0x13},
  390. {0x02, 0x05, 0x13},
  391. {0x01, 0x15, 0x13},
  392. {0x03, 0xc5, 0x13},
  393. {0x02, 0x65, 0x13},
  394. {0x01, 0x15, 0x23},
  395. {0x03, 0xc5, 0x23},
  396. {0x02, 0x05, 0x23},
  397. {0x00, 0xd5, 0x23},
  398. {0x01, 0x15, 0x13}, /* channel = 15 Tf = 4915MHz */
  399. {0x01, 0x15, 0x13},
  400. {0x01, 0x15, 0x13},
  401. {0x01, 0x15, 0x13},
  402. {0x01, 0x15, 0x13},
  403. {0x01, 0x15, 0x13},
  404. {0x01, 0x15, 0x13},
  405. {0x01, 0x15, 0x13},
  406. {0x01, 0x15, 0x13},
  407. {0x01, 0x15, 0x13},
  408. {0x01, 0x15, 0x13},
  409. {0x01, 0x15, 0x13},
  410. {0x01, 0x15, 0x13},
  411. {0x01, 0x15, 0x13},
  412. {0x01, 0x15, 0x13},
  413. {0x01, 0x55, 0x63},
  414. {0x01, 0x55, 0x63},
  415. {0x02, 0xa5, 0x63},
  416. {0x02, 0xa5, 0x63},
  417. {0x00, 0x05, 0x73},
  418. {0x00, 0x05, 0x73},
  419. {0x01, 0x55, 0x73},
  420. {0x02, 0xa5, 0x73},
  421. {0x00, 0x05, 0x83},
  422. {0x01, 0x55, 0x83},
  423. {0x02, 0xa5, 0x83},
  424. {0x02, 0xa5, 0x83},
  425. {0x02, 0xa5, 0x83},
  426. {0x02, 0xa5, 0x83},
  427. {0x02, 0xa5, 0x83},
  428. {0x02, 0xa5, 0x83},
  429. {0x02, 0xa5, 0x83},
  430. {0x02, 0xa5, 0x83},
  431. {0x02, 0xa5, 0x83},
  432. {0x02, 0xa5, 0x83},
  433. {0x02, 0xa5, 0x83},
  434. {0x02, 0xa5, 0x83},
  435. {0x00, 0x05, 0xF3},
  436. {0x01, 0x56, 0x03},
  437. {0x02, 0xa6, 0x03},
  438. {0x00, 0x06, 0x03},
  439. {0x00, 0x06, 0x03}
  440. };
  441. static u8 vt3342_channel_table1[CB_MAX_CHANNEL][3] = {
  442. {0x01, 0x99, 0x94},
  443. {0x02, 0x44, 0x44},
  444. {0x02, 0xee, 0xe4},
  445. {0x03, 0x99, 0x94},
  446. {0x00, 0x44, 0x44},
  447. {0x00, 0xee, 0xe4},
  448. {0x01, 0x99, 0x94},
  449. {0x02, 0x44, 0x44},
  450. {0x02, 0xee, 0xe4},
  451. {0x03, 0x99, 0x94},
  452. {0x00, 0x44, 0x44},
  453. {0x00, 0xee, 0xe4},
  454. {0x01, 0x99, 0x94},
  455. {0x03, 0x33, 0x34},
  456. {0x00, 0x44, 0x44}, /* channel = 15 Tf = 4915MHz */
  457. {0x00, 0x44, 0x44},
  458. {0x00, 0x44, 0x44},
  459. {0x00, 0x44, 0x44},
  460. {0x00, 0x44, 0x44},
  461. {0x00, 0x44, 0x44},
  462. {0x00, 0x44, 0x44},
  463. {0x00, 0x44, 0x44},
  464. {0x00, 0x44, 0x44},
  465. {0x00, 0x44, 0x44},
  466. {0x00, 0x44, 0x44},
  467. {0x00, 0x44, 0x44},
  468. {0x00, 0x44, 0x44},
  469. {0x00, 0x44, 0x44},
  470. {0x00, 0x44, 0x44},
  471. {0x01, 0x55, 0x54},
  472. {0x01, 0x55, 0x54},
  473. {0x02, 0xaa, 0xa4},
  474. {0x02, 0xaa, 0xa4},
  475. {0x00, 0x00, 0x04},
  476. {0x00, 0x00, 0x04},
  477. {0x01, 0x55, 0x54},
  478. {0x02, 0xaa, 0xa4},
  479. {0x00, 0x00, 0x04},
  480. {0x01, 0x55, 0x54},
  481. {0x02, 0xaa, 0xa4},
  482. {0x02, 0xaa, 0xa4},
  483. {0x02, 0xaa, 0xa4},
  484. {0x02, 0xaa, 0xa4},
  485. {0x02, 0xaa, 0xa4},
  486. {0x02, 0xaa, 0xa4},
  487. {0x02, 0xaa, 0xa4},
  488. {0x02, 0xaa, 0xa4},
  489. {0x02, 0xaa, 0xa4},
  490. {0x02, 0xaa, 0xa4},
  491. {0x02, 0xaa, 0xa4},
  492. {0x02, 0xaa, 0xa4},
  493. {0x03, 0x00, 0x04},
  494. {0x00, 0x55, 0x54},
  495. {0x01, 0xaa, 0xa4},
  496. {0x03, 0x00, 0x04},
  497. {0x03, 0x00, 0x04}
  498. };
  499. /* Power Table */
  500. static const u32 al2230_power_table[AL2230_PWR_IDX_LEN] = {
  501. 0x04040900,
  502. 0x04041900,
  503. 0x04042900,
  504. 0x04043900,
  505. 0x04044900,
  506. 0x04045900,
  507. 0x04046900,
  508. 0x04047900,
  509. 0x04048900,
  510. 0x04049900,
  511. 0x0404a900,
  512. 0x0404b900,
  513. 0x0404c900,
  514. 0x0404d900,
  515. 0x0404e900,
  516. 0x0404f900,
  517. 0x04050900,
  518. 0x04051900,
  519. 0x04052900,
  520. 0x04053900,
  521. 0x04054900,
  522. 0x04055900,
  523. 0x04056900,
  524. 0x04057900,
  525. 0x04058900,
  526. 0x04059900,
  527. 0x0405a900,
  528. 0x0405b900,
  529. 0x0405c900,
  530. 0x0405d900,
  531. 0x0405e900,
  532. 0x0405f900,
  533. 0x04060900,
  534. 0x04061900,
  535. 0x04062900,
  536. 0x04063900,
  537. 0x04064900,
  538. 0x04065900,
  539. 0x04066900,
  540. 0x04067900,
  541. 0x04068900,
  542. 0x04069900,
  543. 0x0406a900,
  544. 0x0406b900,
  545. 0x0406c900,
  546. 0x0406d900,
  547. 0x0406e900,
  548. 0x0406f900,
  549. 0x04070900,
  550. 0x04071900,
  551. 0x04072900,
  552. 0x04073900,
  553. 0x04074900,
  554. 0x04075900,
  555. 0x04076900,
  556. 0x04077900,
  557. 0x04078900,
  558. 0x04079900,
  559. 0x0407a900,
  560. 0x0407b900,
  561. 0x0407c900,
  562. 0x0407d900,
  563. 0x0407e900,
  564. 0x0407f900
  565. };
  566. /*
  567. * Description: Write to IF/RF, by embedded programming
  568. */
  569. int vnt_rf_write_embedded(struct vnt_private *priv, u32 data)
  570. {
  571. u8 reg_data[4];
  572. data |= (VNT_RF_REG_LEN << 3) | IFREGCTL_REGW;
  573. reg_data[0] = (u8)data;
  574. reg_data[1] = (u8)(data >> 8);
  575. reg_data[2] = (u8)(data >> 16);
  576. reg_data[3] = (u8)(data >> 24);
  577. vnt_control_out(priv, MESSAGE_TYPE_WRITE_IFRF,
  578. 0, 0, ARRAY_SIZE(reg_data), reg_data);
  579. return true;
  580. }
  581. /* Set Tx power by rate and channel number */
  582. int vnt_rf_setpower(struct vnt_private *priv, u32 rate, u32 channel)
  583. {
  584. u8 power = priv->cck_pwr;
  585. if (channel == 0)
  586. return -EINVAL;
  587. switch (rate) {
  588. case RATE_1M:
  589. case RATE_2M:
  590. case RATE_5M:
  591. case RATE_11M:
  592. channel--;
  593. if (channel < sizeof(priv->cck_pwr_tbl))
  594. power = priv->cck_pwr_tbl[channel];
  595. break;
  596. case RATE_6M:
  597. case RATE_9M:
  598. case RATE_12M:
  599. case RATE_18M:
  600. case RATE_24M:
  601. case RATE_36M:
  602. case RATE_48M:
  603. case RATE_54M:
  604. if (channel > CB_MAX_CHANNEL_24G)
  605. power = priv->ofdm_a_pwr_tbl[channel - 15];
  606. else
  607. power = priv->ofdm_pwr_tbl[channel - 1];
  608. break;
  609. }
  610. return vnt_rf_set_txpower(priv, power, rate);
  611. }
  612. static u8 vnt_rf_addpower(struct vnt_private *priv)
  613. {
  614. s32 rssi = -priv->current_rssi;
  615. if (!rssi)
  616. return 7;
  617. if (priv->rf_type == RF_VT3226D0) {
  618. if (rssi < -70)
  619. return 9;
  620. else if (rssi < -65)
  621. return 7;
  622. else if (rssi < -60)
  623. return 5;
  624. } else {
  625. if (rssi < -80)
  626. return 9;
  627. else if (rssi < -75)
  628. return 7;
  629. else if (rssi < -70)
  630. return 5;
  631. }
  632. return 0;
  633. }
  634. /* Set Tx power by power level and rate */
  635. int vnt_rf_set_txpower(struct vnt_private *priv, u8 power, u32 rate)
  636. {
  637. u32 power_setting = 0;
  638. int ret = true;
  639. power += vnt_rf_addpower(priv);
  640. if (power > VNT_RF_MAX_POWER)
  641. power = VNT_RF_MAX_POWER;
  642. if (priv->power == power)
  643. return true;
  644. priv->power = power;
  645. switch (priv->rf_type) {
  646. case RF_AL2230:
  647. if (power >= AL2230_PWR_IDX_LEN)
  648. return false;
  649. ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]);
  650. if (rate <= RATE_11M)
  651. ret &= vnt_rf_write_embedded(priv, 0x0001b400);
  652. else
  653. ret &= vnt_rf_write_embedded(priv, 0x0005a400);
  654. break;
  655. case RF_AL2230S:
  656. if (power >= AL2230_PWR_IDX_LEN)
  657. return false;
  658. ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]);
  659. if (rate <= RATE_11M) {
  660. ret &= vnt_rf_write_embedded(priv, 0x040c1400);
  661. ret &= vnt_rf_write_embedded(priv, 0x00299b00);
  662. } else {
  663. ret &= vnt_rf_write_embedded(priv, 0x0005a400);
  664. ret &= vnt_rf_write_embedded(priv, 0x00099b00);
  665. }
  666. break;
  667. case RF_AIROHA7230:
  668. if (rate <= RATE_11M)
  669. ret &= vnt_rf_write_embedded(priv, 0x111bb900);
  670. else
  671. ret &= vnt_rf_write_embedded(priv, 0x221bb900);
  672. if (power >= AL7230_PWR_IDX_LEN)
  673. return false;
  674. /*
  675. * 0x080F1B00 for 3 wire control TxGain(D10)
  676. * and 0x31 as TX Gain value
  677. */
  678. power_setting = 0x080c0b00 | (power << 12);
  679. ret &= vnt_rf_write_embedded(priv, power_setting);
  680. break;
  681. case RF_VT3226:
  682. if (power >= VT3226_PWR_IDX_LEN)
  683. return false;
  684. power_setting = ((0x3f - power) << 20) | (0x17 << 8);
  685. ret &= vnt_rf_write_embedded(priv, power_setting);
  686. break;
  687. case RF_VT3226D0:
  688. if (power >= VT3226_PWR_IDX_LEN)
  689. return false;
  690. if (rate <= RATE_11M) {
  691. u16 hw_value = priv->hw->conf.chandef.chan->hw_value;
  692. power_setting = ((0x3f - power) << 20) | (0xe07 << 8);
  693. ret &= vnt_rf_write_embedded(priv, power_setting);
  694. ret &= vnt_rf_write_embedded(priv, 0x03c6a200);
  695. dev_dbg(&priv->usb->dev,
  696. "%s 11b channel [%d]\n", __func__, hw_value);
  697. hw_value--;
  698. if (hw_value < ARRAY_SIZE(vt3226d0_lo_current_table))
  699. ret &= vnt_rf_write_embedded(priv,
  700. vt3226d0_lo_current_table[hw_value]);
  701. ret &= vnt_rf_write_embedded(priv, 0x015C0800);
  702. } else {
  703. dev_dbg(&priv->usb->dev,
  704. "@@@@ %s> 11G mode\n", __func__);
  705. power_setting = ((0x3f - power) << 20) | (0x7 << 8);
  706. ret &= vnt_rf_write_embedded(priv, power_setting);
  707. ret &= vnt_rf_write_embedded(priv, 0x00C6A200);
  708. ret &= vnt_rf_write_embedded(priv, 0x016BC600);
  709. ret &= vnt_rf_write_embedded(priv, 0x00900800);
  710. }
  711. break;
  712. case RF_VT3342A0:
  713. if (power >= VT3342_PWR_IDX_LEN)
  714. return false;
  715. power_setting = ((0x3f - power) << 20) | (0x27 << 8);
  716. ret &= vnt_rf_write_embedded(priv, power_setting);
  717. break;
  718. default:
  719. break;
  720. }
  721. return ret;
  722. }
  723. /* Convert rssi to dbm */
  724. void vnt_rf_rssi_to_dbm(struct vnt_private *priv, u8 rssi, long *dbm)
  725. {
  726. u8 idx = ((rssi & 0xc0) >> 6) & 0x03;
  727. long b = rssi & 0x3f;
  728. long a = 0;
  729. u8 airoharf[4] = {0, 18, 0, 40};
  730. switch (priv->rf_type) {
  731. case RF_AL2230:
  732. case RF_AL2230S:
  733. case RF_AIROHA7230:
  734. case RF_VT3226:
  735. case RF_VT3226D0:
  736. case RF_VT3342A0:
  737. a = airoharf[idx];
  738. break;
  739. default:
  740. break;
  741. }
  742. *dbm = -1 * (a + b * 2);
  743. }
  744. void vnt_rf_table_download(struct vnt_private *priv)
  745. {
  746. u16 length1 = 0, length2 = 0, length3 = 0;
  747. u8 *addr1 = NULL, *addr2 = NULL, *addr3 = NULL;
  748. u16 length, value;
  749. u8 array[256];
  750. switch (priv->rf_type) {
  751. case RF_AL2230:
  752. case RF_AL2230S:
  753. length1 = CB_AL2230_INIT_SEQ * 3;
  754. length2 = CB_MAX_CHANNEL_24G * 3;
  755. length3 = CB_MAX_CHANNEL_24G * 3;
  756. addr1 = &al2230_init_table[0][0];
  757. addr2 = &al2230_channel_table0[0][0];
  758. addr3 = &al2230_channel_table1[0][0];
  759. break;
  760. case RF_AIROHA7230:
  761. length1 = CB_AL7230_INIT_SEQ * 3;
  762. length2 = CB_MAX_CHANNEL * 3;
  763. length3 = CB_MAX_CHANNEL * 3;
  764. addr1 = &al7230_init_table[0][0];
  765. addr2 = &al7230_channel_table0[0][0];
  766. addr3 = &al7230_channel_table1[0][0];
  767. break;
  768. case RF_VT3226:
  769. length1 = CB_VT3226_INIT_SEQ * 3;
  770. length2 = CB_MAX_CHANNEL_24G * 3;
  771. length3 = CB_MAX_CHANNEL_24G * 3;
  772. addr1 = &vt3226_init_table[0][0];
  773. addr2 = &vt3226_channel_table0[0][0];
  774. addr3 = &vt3226_channel_table1[0][0];
  775. break;
  776. case RF_VT3226D0:
  777. length1 = CB_VT3226_INIT_SEQ * 3;
  778. length2 = CB_MAX_CHANNEL_24G * 3;
  779. length3 = CB_MAX_CHANNEL_24G * 3;
  780. addr1 = &vt3226d0_init_table[0][0];
  781. addr2 = &vt3226_channel_table0[0][0];
  782. addr3 = &vt3226_channel_table1[0][0];
  783. break;
  784. case RF_VT3342A0:
  785. length1 = CB_VT3342_INIT_SEQ * 3;
  786. length2 = CB_MAX_CHANNEL * 3;
  787. length3 = CB_MAX_CHANNEL * 3;
  788. addr1 = &vt3342a0_init_table[0][0];
  789. addr2 = &vt3342_channel_table0[0][0];
  790. addr3 = &vt3342_channel_table1[0][0];
  791. break;
  792. }
  793. /* Init Table */
  794. memcpy(array, addr1, length1);
  795. vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
  796. MESSAGE_REQUEST_RF_INIT, length1, array);
  797. /* Channel Table 0 */
  798. value = 0;
  799. while (length2 > 0) {
  800. if (length2 >= 64)
  801. length = 64;
  802. else
  803. length = length2;
  804. memcpy(array, addr2, length);
  805. vnt_control_out(priv, MESSAGE_TYPE_WRITE,
  806. value, MESSAGE_REQUEST_RF_CH0, length, array);
  807. length2 -= length;
  808. value += length;
  809. addr2 += length;
  810. }
  811. /* Channel table 1 */
  812. value = 0;
  813. while (length3 > 0) {
  814. if (length3 >= 64)
  815. length = 64;
  816. else
  817. length = length3;
  818. memcpy(array, addr3, length);
  819. vnt_control_out(priv, MESSAGE_TYPE_WRITE,
  820. value, MESSAGE_REQUEST_RF_CH1, length, array);
  821. length3 -= length;
  822. value += length;
  823. addr3 += length;
  824. }
  825. if (priv->rf_type == RF_AIROHA7230) {
  826. length1 = CB_AL7230_INIT_SEQ * 3;
  827. length2 = CB_MAX_CHANNEL * 3;
  828. addr1 = &al7230_init_table_amode[0][0];
  829. addr2 = &al7230_channel_table2[0][0];
  830. memcpy(array, addr1, length1);
  831. /* Init Table 2 */
  832. vnt_control_out(priv, MESSAGE_TYPE_WRITE,
  833. 0, MESSAGE_REQUEST_RF_INIT2, length1, array);
  834. /* Channel Table 0 */
  835. value = 0;
  836. while (length2 > 0) {
  837. if (length2 >= 64)
  838. length = 64;
  839. else
  840. length = length2;
  841. memcpy(array, addr2, length);
  842. vnt_control_out(priv, MESSAGE_TYPE_WRITE,
  843. value, MESSAGE_REQUEST_RF_CH2,
  844. length, array);
  845. length2 -= length;
  846. value += length;
  847. addr2 += length;
  848. }
  849. }
  850. }