radio_2057.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. /*
  2. Broadcom B43 wireless driver
  3. IEEE 802.11n 2057 radio device data tables
  4. Copyright (c) 2010 Rafał Miłecki <zajec5@gmail.com>
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; see the file COPYING. If not, write to
  15. the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
  16. Boston, MA 02110-1301, USA.
  17. */
  18. #include "b43.h"
  19. #include "radio_2057.h"
  20. #include "phy_common.h"
  21. static u16 r2057_rev4_init[][2] = {
  22. { 0x0E, 0x20 }, { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 },
  23. { 0x35, 0x26 }, { 0x3C, 0xff }, { 0x3D, 0xff }, { 0x3E, 0xff },
  24. { 0x3F, 0xff }, { 0x62, 0x33 }, { 0x8A, 0xf0 }, { 0x8B, 0x10 },
  25. { 0x8C, 0xf0 }, { 0x91, 0x3f }, { 0x92, 0x36 }, { 0xA4, 0x8c },
  26. { 0xA8, 0x55 }, { 0xAF, 0x01 }, { 0x10F, 0xf0 }, { 0x110, 0x10 },
  27. { 0x111, 0xf0 }, { 0x116, 0x3f }, { 0x117, 0x36 }, { 0x129, 0x8c },
  28. { 0x12D, 0x55 }, { 0x134, 0x01 }, { 0x15E, 0x00 }, { 0x15F, 0x00 },
  29. { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 },
  30. { 0x169, 0x02 }, { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 },
  31. { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 },
  32. { 0x1AB, 0x00 }, { 0x1AC, 0x00 },
  33. };
  34. static u16 r2057_rev5_init[][2] = {
  35. { 0x00, 0x00 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x23, 0x6 },
  36. { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 },
  37. { 0x59, 0x88 }, { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f },
  38. { 0x64, 0x0f }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 },
  39. { 0xA1, 0x20 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, { 0xE1, 0x20 },
  40. { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0x106, 0x01 }, { 0x116, 0x3f },
  41. { 0x117, 0x36 }, { 0x126, 0x20 }, { 0x15E, 0x00 }, { 0x15F, 0x00 },
  42. { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 },
  43. { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 },
  44. { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 },
  45. { 0x1AC, 0x00 }, { 0x1B7, 0x0c }, { 0x1C1, 0x01 }, { 0x1C2, 0x80 },
  46. };
  47. static u16 r2057_rev5a_init[][2] = {
  48. { 0x00, 0x15 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x23, 0x6 },
  49. { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 },
  50. { 0x59, 0x88 }, { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f },
  51. { 0x64, 0x0f }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 },
  52. { 0xC9, 0x01 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, { 0xE1, 0x20 },
  53. { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0x106, 0x01 }, { 0x116, 0x3f },
  54. { 0x117, 0x36 }, { 0x126, 0x20 }, { 0x14E, 0x01 }, { 0x15E, 0x00 },
  55. { 0x15F, 0x00 }, { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 },
  56. { 0x163, 0x00 }, { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 },
  57. { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 },
  58. { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, { 0x1B7, 0x0c }, { 0x1C1, 0x01 },
  59. { 0x1C2, 0x80 },
  60. };
  61. static u16 r2057_rev7_init[][2] = {
  62. { 0x00, 0x00 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x31, 0x00 },
  63. { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 },
  64. { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x13 },
  65. { 0x66, 0xee }, { 0x6E, 0x58 }, { 0x75, 0x13 }, { 0x7B, 0x13 },
  66. { 0x7C, 0x14 }, { 0x7D, 0xee }, { 0x81, 0x01 }, { 0x91, 0x3f },
  67. { 0x92, 0x36 }, { 0xA1, 0x20 }, { 0xD6, 0x70 }, { 0xDE, 0x88 },
  68. { 0xE1, 0x20 }, { 0xE8, 0x0f }, { 0xE9, 0x13 }, { 0xEB, 0xee },
  69. { 0xF3, 0x58 }, { 0xFA, 0x13 }, { 0x100, 0x13 }, { 0x101, 0x14 },
  70. { 0x102, 0xee }, { 0x106, 0x01 }, { 0x116, 0x3f }, { 0x117, 0x36 },
  71. { 0x126, 0x20 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, { 0x160, 0x00 },
  72. { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, { 0x16A, 0x00 },
  73. { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 }, { 0x1A5, 0x00 },
  74. { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, { 0x1AC, 0x00 },
  75. { 0x1B7, 0x05 }, { 0x1C2, 0xa0 },
  76. };
  77. /* TODO: Which devices should use it?
  78. static u16 r2057_rev8_init[][2] = {
  79. { 0x00, 0x08 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x31, 0x00 },
  80. { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 },
  81. { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x0f },
  82. { 0x6E, 0x58 }, { 0x75, 0x13 }, { 0x7B, 0x13 }, { 0x7C, 0x0f },
  83. { 0x7D, 0xee }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 },
  84. { 0xA1, 0x20 }, { 0xC9, 0x01 }, { 0xD6, 0x70 }, { 0xDE, 0x88 },
  85. { 0xE1, 0x20 }, { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0xF3, 0x58 },
  86. { 0xFA, 0x13 }, { 0x100, 0x13 }, { 0x101, 0x0f }, { 0x102, 0xee },
  87. { 0x106, 0x01 }, { 0x116, 0x3f }, { 0x117, 0x36 }, { 0x126, 0x20 },
  88. { 0x14E, 0x01 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, { 0x160, 0x00 },
  89. { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, { 0x16A, 0x00 },
  90. { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 }, { 0x1A5, 0x00 },
  91. { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, { 0x1AC, 0x00 },
  92. { 0x1B7, 0x05 }, { 0x1C2, 0xa0 },
  93. };
  94. */
  95. /* Extracted from MMIO dump of 6.30.223.141 */
  96. static u16 r2057_rev9_init[][2] = {
  97. { 0x27, 0x1f }, { 0x28, 0x0a }, { 0x29, 0x2f }, { 0x42, 0x1f },
  98. { 0x48, 0x3f }, { 0x5c, 0x41 }, { 0x63, 0x14 }, { 0x64, 0x12 },
  99. { 0x66, 0xff }, { 0x74, 0xa3 }, { 0x7b, 0x14 }, { 0x7c, 0x14 },
  100. { 0x7d, 0xee }, { 0x86, 0xc0 }, { 0xc4, 0x10 }, { 0xc9, 0x01 },
  101. { 0xe1, 0x41 }, { 0xe8, 0x14 }, { 0xe9, 0x12 }, { 0xeb, 0xff },
  102. { 0xf5, 0x0a }, { 0xf8, 0x09 }, { 0xf9, 0xa3 }, { 0x100, 0x14 },
  103. { 0x101, 0x10 }, { 0x102, 0xee }, { 0x10b, 0xc0 }, { 0x149, 0x10 },
  104. { 0x14e, 0x01 }, { 0x1b7, 0x05 }, { 0x1c2, 0xa0 },
  105. };
  106. /* Extracted from MMIO dump of 6.30.223.248 */
  107. static u16 r2057_rev14_init[][2] = {
  108. { 0x011, 0xfc }, { 0x030, 0x24 }, { 0x040, 0x1c }, { 0x082, 0x08 },
  109. { 0x0b4, 0x44 }, { 0x0c8, 0x01 }, { 0x0c9, 0x01 }, { 0x107, 0x08 },
  110. { 0x14d, 0x01 }, { 0x14e, 0x01 }, { 0x1af, 0x40 }, { 0x1b0, 0x40 },
  111. { 0x1cc, 0x01 }, { 0x1cf, 0x10 }, { 0x1d0, 0x0f }, { 0x1d3, 0x10 },
  112. { 0x1d4, 0x0f },
  113. };
  114. #define RADIOREGS7(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \
  115. r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \
  116. r20, r21, r22, r23, r24, r25, r26, r27) \
  117. .radio_vcocal_countval0 = r00, \
  118. .radio_vcocal_countval1 = r01, \
  119. .radio_rfpll_refmaster_sparextalsize = r02, \
  120. .radio_rfpll_loopfilter_r1 = r03, \
  121. .radio_rfpll_loopfilter_c2 = r04, \
  122. .radio_rfpll_loopfilter_c1 = r05, \
  123. .radio_cp_kpd_idac = r06, \
  124. .radio_rfpll_mmd0 = r07, \
  125. .radio_rfpll_mmd1 = r08, \
  126. .radio_vcobuf_tune = r09, \
  127. .radio_logen_mx2g_tune = r10, \
  128. .radio_logen_mx5g_tune = r11, \
  129. .radio_logen_indbuf2g_tune = r12, \
  130. .radio_logen_indbuf5g_tune = r13, \
  131. .radio_txmix2g_tune_boost_pu_core0 = r14, \
  132. .radio_pad2g_tune_pus_core0 = r15, \
  133. .radio_pga_boost_tune_core0 = r16, \
  134. .radio_txmix5g_boost_tune_core0 = r17, \
  135. .radio_pad5g_tune_misc_pus_core0 = r18, \
  136. .radio_lna2g_tune_core0 = r19, \
  137. .radio_lna5g_tune_core0 = r20, \
  138. .radio_txmix2g_tune_boost_pu_core1 = r21, \
  139. .radio_pad2g_tune_pus_core1 = r22, \
  140. .radio_pga_boost_tune_core1 = r23, \
  141. .radio_txmix5g_boost_tune_core1 = r24, \
  142. .radio_pad5g_tune_misc_pus_core1 = r25, \
  143. .radio_lna2g_tune_core1 = r26, \
  144. .radio_lna5g_tune_core1 = r27
  145. #define RADIOREGS7_2G(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \
  146. r10, r11, r12, r13, r14, r15, r16, r17) \
  147. .radio_vcocal_countval0 = r00, \
  148. .radio_vcocal_countval1 = r01, \
  149. .radio_rfpll_refmaster_sparextalsize = r02, \
  150. .radio_rfpll_loopfilter_r1 = r03, \
  151. .radio_rfpll_loopfilter_c2 = r04, \
  152. .radio_rfpll_loopfilter_c1 = r05, \
  153. .radio_cp_kpd_idac = r06, \
  154. .radio_rfpll_mmd0 = r07, \
  155. .radio_rfpll_mmd1 = r08, \
  156. .radio_vcobuf_tune = r09, \
  157. .radio_logen_mx2g_tune = r10, \
  158. .radio_logen_indbuf2g_tune = r11, \
  159. .radio_txmix2g_tune_boost_pu_core0 = r12, \
  160. .radio_pad2g_tune_pus_core0 = r13, \
  161. .radio_lna2g_tune_core0 = r14, \
  162. .radio_txmix2g_tune_boost_pu_core1 = r15, \
  163. .radio_pad2g_tune_pus_core1 = r16, \
  164. .radio_lna2g_tune_core1 = r17
  165. #define PHYREGS(r0, r1, r2, r3, r4, r5) \
  166. .phy_regs.phy_bw1a = r0, \
  167. .phy_regs.phy_bw2 = r1, \
  168. .phy_regs.phy_bw3 = r2, \
  169. .phy_regs.phy_bw4 = r3, \
  170. .phy_regs.phy_bw5 = r4, \
  171. .phy_regs.phy_bw6 = r5
  172. /* Copied from brcmsmac (5.75.11): chan_info_nphyrev8_2057_rev5 */
  173. static const struct b43_nphy_chantabent_rev7_2g b43_nphy_chantab_phy_rev8_radio_rev5[] = {
  174. {
  175. .freq = 2412,
  176. RADIOREGS7_2G(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c,
  177. 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61,
  178. 0x03, 0xff),
  179. PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
  180. },
  181. {
  182. .freq = 2417,
  183. RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71,
  184. 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61,
  185. 0x03, 0xff),
  186. PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
  187. },
  188. {
  189. .freq = 2422,
  190. RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76,
  191. 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xef, 0x61,
  192. 0x03, 0xef),
  193. PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
  194. },
  195. {
  196. .freq = 2427,
  197. RADIOREGS7_2G(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b,
  198. 0x09, 0x0c, 0x08, 0x0e, 0x61, 0x03, 0xdf, 0x61,
  199. 0x03, 0xdf),
  200. PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
  201. },
  202. {
  203. .freq = 2432,
  204. RADIOREGS7_2G(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80,
  205. 0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xcf, 0x61,
  206. 0x03, 0xcf),
  207. PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
  208. },
  209. {
  210. .freq = 2437,
  211. RADIOREGS7_2G(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85,
  212. 0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xbf, 0x61,
  213. 0x03, 0xbf),
  214. PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
  215. },
  216. {
  217. .freq = 2442,
  218. RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a,
  219. 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0xaf, 0x61,
  220. 0x03, 0xaf),
  221. PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
  222. },
  223. {
  224. .freq = 2447,
  225. RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f,
  226. 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x9f, 0x61,
  227. 0x03, 0x9f),
  228. PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
  229. },
  230. {
  231. .freq = 2452,
  232. RADIOREGS7_2G(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94,
  233. 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x8f, 0x61,
  234. 0x03, 0x8f),
  235. PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
  236. },
  237. {
  238. .freq = 2457,
  239. RADIOREGS7_2G(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99,
  240. 0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x7f, 0x61,
  241. 0x03, 0x7f),
  242. PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
  243. },
  244. {
  245. .freq = 2462,
  246. RADIOREGS7_2G(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e,
  247. 0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x6f, 0x61,
  248. 0x03, 0x6f),
  249. PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
  250. },
  251. {
  252. .freq = 2467,
  253. RADIOREGS7_2G(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3,
  254. 0x09, 0x0b, 0x06, 0x0c, 0x61, 0x03, 0x5f, 0x61,
  255. 0x03, 0x5f),
  256. PHYREGS(0x03df, 0x03db, 0x03d7, 0x0422, 0x0427, 0x042b),
  257. },
  258. {
  259. .freq = 2472,
  260. RADIOREGS7_2G(0x70, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa8,
  261. 0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x4f, 0x61,
  262. 0x03, 0x4f),
  263. PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429),
  264. },
  265. {
  266. .freq = 2484,
  267. RADIOREGS7_2G(0x78, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xb4,
  268. 0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x3f, 0x61,
  269. 0x03, 0x3f),
  270. PHYREGS(0x03e6, 0x03e2, 0x03de, 0x041b, 0x041f, 0x0424),
  271. }
  272. };
  273. /* Extracted from MMIO dump of 6.30.223.248 */
  274. static const struct b43_nphy_chantabent_rev7_2g b43_nphy_chantab_phy_rev17_radio_rev14[] = {
  275. {
  276. .freq = 2412,
  277. RADIOREGS7_2G(0x48, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x6c,
  278. 0x09, 0x0d, 0x09, 0x03, 0x21, 0x53, 0xff, 0x21,
  279. 0x53, 0xff),
  280. PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
  281. },
  282. {
  283. .freq = 2417,
  284. RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x71,
  285. 0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
  286. 0x53, 0xff),
  287. PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
  288. },
  289. {
  290. .freq = 2422,
  291. RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x76,
  292. 0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
  293. 0x53, 0xff),
  294. PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
  295. },
  296. {
  297. .freq = 2427,
  298. RADIOREGS7_2G(0x52, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x7b,
  299. 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
  300. 0x53, 0xff),
  301. PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
  302. },
  303. {
  304. .freq = 2432,
  305. RADIOREGS7_2G(0x55, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x80,
  306. 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
  307. 0x53, 0xff),
  308. PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
  309. },
  310. {
  311. .freq = 2437,
  312. RADIOREGS7_2G(0x58, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x85,
  313. 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
  314. 0x53, 0xff),
  315. PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
  316. },
  317. {
  318. .freq = 2442,
  319. RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8a,
  320. 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21,
  321. 0x43, 0xff),
  322. PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
  323. },
  324. {
  325. .freq = 2447,
  326. RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8f,
  327. 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21,
  328. 0x43, 0xff),
  329. PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
  330. },
  331. {
  332. .freq = 2452,
  333. RADIOREGS7_2G(0x62, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x94,
  334. 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21,
  335. 0x43, 0xff),
  336. PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
  337. },
  338. {
  339. .freq = 2457,
  340. RADIOREGS7_2G(0x66, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x99,
  341. 0x09, 0x0b, 0x07, 0x03, 0x21, 0x43, 0xff, 0x21,
  342. 0x43, 0xff),
  343. PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
  344. },
  345. {
  346. .freq = 2462,
  347. RADIOREGS7_2G(0x69, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x9e,
  348. 0x09, 0x0b, 0x07, 0x03, 0x01, 0x43, 0xff, 0x01,
  349. 0x43, 0xff),
  350. PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
  351. },
  352. };
  353. /* Extracted from MMIO dump of 6.30.223.141 */
  354. static const struct b43_nphy_chantabent_rev7 b43_nphy_chantab_phy_rev16_radio_rev9[] = {
  355. {
  356. .freq = 2412,
  357. RADIOREGS7(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c,
  358. 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63,
  359. 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
  360. 0x00, 0x00, 0xf0, 0x00),
  361. PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
  362. },
  363. {
  364. .freq = 2417,
  365. RADIOREGS7(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71,
  366. 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63,
  367. 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
  368. 0x00, 0x00, 0xf0, 0x00),
  369. PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
  370. },
  371. {
  372. .freq = 2422,
  373. RADIOREGS7(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76,
  374. 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63,
  375. 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
  376. 0x00, 0x00, 0xf0, 0x00),
  377. PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
  378. },
  379. {
  380. .freq = 2427,
  381. RADIOREGS7(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b,
  382. 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63,
  383. 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
  384. 0x00, 0x00, 0xf0, 0x00),
  385. PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
  386. },
  387. {
  388. .freq = 2432,
  389. RADIOREGS7(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80,
  390. 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63,
  391. 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
  392. 0x00, 0x00, 0xf0, 0x00),
  393. PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
  394. },
  395. {
  396. .freq = 2437,
  397. RADIOREGS7(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85,
  398. 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63,
  399. 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
  400. 0x00, 0x00, 0xf0, 0x00),
  401. PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
  402. },
  403. {
  404. .freq = 2442,
  405. RADIOREGS7(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a,
  406. 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63,
  407. 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
  408. 0x00, 0x00, 0xf0, 0x00),
  409. PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
  410. },
  411. {
  412. .freq = 2447,
  413. RADIOREGS7(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f,
  414. 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63,
  415. 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
  416. 0x00, 0x00, 0xf0, 0x00),
  417. PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
  418. },
  419. {
  420. .freq = 2452,
  421. RADIOREGS7(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94,
  422. 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63,
  423. 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
  424. 0x00, 0x00, 0xf0, 0x00),
  425. PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
  426. },
  427. {
  428. .freq = 2457,
  429. RADIOREGS7(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99,
  430. 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63,
  431. 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
  432. 0x00, 0x00, 0xf0, 0x00),
  433. PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
  434. },
  435. {
  436. .freq = 2462,
  437. RADIOREGS7(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e,
  438. 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63,
  439. 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
  440. 0x00, 0x00, 0xf0, 0x00),
  441. PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
  442. },
  443. {
  444. .freq = 5180,
  445. RADIOREGS7(0xbe, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x06,
  446. 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00,
  447. 0x9f, 0x2f, 0xa3, 0x00, 0xfc, 0x00, 0x00, 0x4f,
  448. 0x3a, 0x83, 0x00, 0xfc),
  449. PHYREGS(0x081c, 0x0818, 0x0814, 0x01f9, 0x01fa, 0x01fb),
  450. },
  451. {
  452. .freq = 5200,
  453. RADIOREGS7(0xc5, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x08,
  454. 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00,
  455. 0x7f, 0x2f, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x4c,
  456. 0x4a, 0x83, 0x00, 0xf8),
  457. PHYREGS(0x0824, 0x0820, 0x081c, 0x01f7, 0x01f8, 0x01f9),
  458. },
  459. {
  460. .freq = 5220,
  461. RADIOREGS7(0xcc, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0a,
  462. 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00,
  463. 0x6d, 0x3d, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x2d,
  464. 0x2a, 0x73, 0x00, 0xf8),
  465. PHYREGS(0x082c, 0x0828, 0x0824, 0x01f5, 0x01f6, 0x01f7),
  466. },
  467. {
  468. .freq = 5240,
  469. RADIOREGS7(0xd2, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0c,
  470. 0x02, 0x0d, 0x00, 0x0d, 0x00, 0x8d, 0x00, 0x00,
  471. 0x4d, 0x1c, 0x73, 0x00, 0xf8, 0x00, 0x00, 0x4d,
  472. 0x2b, 0x73, 0x00, 0xf8),
  473. PHYREGS(0x0834, 0x0830, 0x082c, 0x01f3, 0x01f4, 0x01f5),
  474. },
  475. {
  476. .freq = 5745,
  477. RADIOREGS7(0x7b, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x7d,
  478. 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00,
  479. 0x08, 0x03, 0x03, 0x00, 0x30, 0x00, 0x00, 0x06,
  480. 0x02, 0x03, 0x00, 0x30),
  481. PHYREGS(0x08fe, 0x08fa, 0x08f6, 0x01c8, 0x01c8, 0x01c9),
  482. },
  483. {
  484. .freq = 5765,
  485. RADIOREGS7(0x81, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x81,
  486. 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00,
  487. 0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05,
  488. 0x02, 0x03, 0x00, 0x00),
  489. PHYREGS(0x0906, 0x0902, 0x08fe, 0x01c6, 0x01c7, 0x01c8),
  490. },
  491. {
  492. .freq = 5785,
  493. RADIOREGS7(0x88, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x85,
  494. 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00,
  495. 0x08, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05,
  496. 0x21, 0x03, 0x00, 0x00),
  497. PHYREGS(0x090e, 0x090a, 0x0906, 0x01c4, 0x01c5, 0x01c6),
  498. },
  499. {
  500. .freq = 5805,
  501. RADIOREGS7(0x8f, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x89,
  502. 0x04, 0x07, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00,
  503. 0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03,
  504. 0x00, 0x03, 0x00, 0x00),
  505. PHYREGS(0x0916, 0x0912, 0x090e, 0x01c3, 0x01c4, 0x01c4),
  506. },
  507. {
  508. .freq = 5825,
  509. RADIOREGS7(0x95, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x8d,
  510. 0x04, 0x07, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00,
  511. 0x05, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03,
  512. 0x00, 0x03, 0x00, 0x00),
  513. PHYREGS(0x091e, 0x091a, 0x0916, 0x01c1, 0x01c2, 0x01c3),
  514. },
  515. };
  516. void r2057_upload_inittabs(struct b43_wldev *dev)
  517. {
  518. struct b43_phy *phy = &dev->phy;
  519. u16 *table = NULL;
  520. u16 size, i;
  521. switch (phy->rev) {
  522. case 7:
  523. table = r2057_rev4_init[0];
  524. size = ARRAY_SIZE(r2057_rev4_init);
  525. break;
  526. case 8:
  527. if (phy->radio_rev == 5) {
  528. table = r2057_rev5_init[0];
  529. size = ARRAY_SIZE(r2057_rev5_init);
  530. } else if (phy->radio_rev == 7) {
  531. table = r2057_rev7_init[0];
  532. size = ARRAY_SIZE(r2057_rev7_init);
  533. }
  534. break;
  535. case 9:
  536. if (phy->radio_rev == 5) {
  537. table = r2057_rev5a_init[0];
  538. size = ARRAY_SIZE(r2057_rev5a_init);
  539. }
  540. break;
  541. case 16:
  542. if (phy->radio_rev == 9) {
  543. table = r2057_rev9_init[0];
  544. size = ARRAY_SIZE(r2057_rev9_init);
  545. }
  546. break;
  547. case 17:
  548. if (phy->radio_rev == 14) {
  549. table = r2057_rev14_init[0];
  550. size = ARRAY_SIZE(r2057_rev14_init);
  551. }
  552. break;
  553. }
  554. B43_WARN_ON(!table);
  555. if (table) {
  556. for (i = 0; i < size; i++, table += 2)
  557. b43_radio_write(dev, table[0], table[1]);
  558. }
  559. }
  560. void r2057_get_chantabent_rev7(struct b43_wldev *dev, u16 freq,
  561. const struct b43_nphy_chantabent_rev7 **tabent_r7,
  562. const struct b43_nphy_chantabent_rev7_2g **tabent_r7_2g)
  563. {
  564. struct b43_phy *phy = &dev->phy;
  565. const struct b43_nphy_chantabent_rev7 *e_r7 = NULL;
  566. const struct b43_nphy_chantabent_rev7_2g *e_r7_2g = NULL;
  567. unsigned int len, i;
  568. *tabent_r7 = NULL;
  569. *tabent_r7_2g = NULL;
  570. switch (phy->rev) {
  571. case 8:
  572. if (phy->radio_rev == 5) {
  573. e_r7_2g = b43_nphy_chantab_phy_rev8_radio_rev5;
  574. len = ARRAY_SIZE(b43_nphy_chantab_phy_rev8_radio_rev5);
  575. }
  576. break;
  577. case 16:
  578. if (phy->radio_rev == 9) {
  579. e_r7 = b43_nphy_chantab_phy_rev16_radio_rev9;
  580. len = ARRAY_SIZE(b43_nphy_chantab_phy_rev16_radio_rev9);
  581. }
  582. break;
  583. case 17:
  584. if (phy->radio_rev == 14) {
  585. e_r7_2g = b43_nphy_chantab_phy_rev17_radio_rev14;
  586. len = ARRAY_SIZE(b43_nphy_chantab_phy_rev17_radio_rev14);
  587. }
  588. break;
  589. default:
  590. break;
  591. }
  592. if (e_r7) {
  593. for (i = 0; i < len; i++, e_r7++) {
  594. if (e_r7->freq == freq) {
  595. *tabent_r7 = e_r7;
  596. return;
  597. }
  598. }
  599. } else if (e_r7_2g) {
  600. for (i = 0; i < len; i++, e_r7_2g++) {
  601. if (e_r7_2g->freq == freq) {
  602. *tabent_r7_2g = e_r7_2g;
  603. return;
  604. }
  605. }
  606. } else {
  607. B43_WARN_ON(1);
  608. }
  609. }