/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c

http://github.com/mirrors/linux · C · 5632 lines · 4677 code · 481 blank · 474 comment · 355 complexity · 28cf6144aaeebaaa42ae4fd940489bd8 MD5 · raw file

Large files are truncated click here to view the full file

  1. /*
  2. * Copyright (c) 2010-2011 Atheros Communications Inc.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #include <asm/unaligned.h>
  17. #include <linux/kernel.h>
  18. #include "hw.h"
  19. #include "ar9003_phy.h"
  20. #include "ar9003_eeprom.h"
  21. #include "ar9003_mci.h"
  22. #define COMP_HDR_LEN 4
  23. #define COMP_CKSUM_LEN 2
  24. #define LE16(x) cpu_to_le16(x)
  25. #define LE32(x) cpu_to_le32(x)
  26. /* Local defines to distinguish between extension and control CTL's */
  27. #define EXT_ADDITIVE (0x8000)
  28. #define CTL_11A_EXT (CTL_11A | EXT_ADDITIVE)
  29. #define CTL_11G_EXT (CTL_11G | EXT_ADDITIVE)
  30. #define CTL_11B_EXT (CTL_11B | EXT_ADDITIVE)
  31. #define SUB_NUM_CTL_MODES_AT_5G_40 2 /* excluding HT40, EXT-OFDM */
  32. #define SUB_NUM_CTL_MODES_AT_2G_40 3 /* excluding HT40, EXT-OFDM, EXT-CCK */
  33. #define CTL(_tpower, _flag) ((_tpower) | ((_flag) << 6))
  34. #define EEPROM_DATA_LEN_9485 1088
  35. static int ar9003_hw_power_interpolate(int32_t x,
  36. int32_t *px, int32_t *py, u_int16_t np);
  37. static const struct ar9300_eeprom ar9300_default = {
  38. .eepromVersion = 2,
  39. .templateVersion = 2,
  40. .macAddr = {0, 2, 3, 4, 5, 6},
  41. .custData = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  42. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  43. .baseEepHeader = {
  44. .regDmn = { LE16(0), LE16(0x1f) },
  45. .txrxMask = 0x77, /* 4 bits tx and 4 bits rx */
  46. .opCapFlags = {
  47. .opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
  48. .eepMisc = AR9300_EEPMISC_LITTLE_ENDIAN,
  49. },
  50. .rfSilent = 0,
  51. .blueToothOptions = 0,
  52. .deviceCap = 0,
  53. .deviceType = 5, /* takes lower byte in eeprom location */
  54. .pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
  55. .params_for_tuning_caps = {0, 0},
  56. .featureEnable = 0x0c,
  57. /*
  58. * bit0 - enable tx temp comp - disabled
  59. * bit1 - enable tx volt comp - disabled
  60. * bit2 - enable fastClock - enabled
  61. * bit3 - enable doubling - enabled
  62. * bit4 - enable internal regulator - disabled
  63. * bit5 - enable pa predistortion - disabled
  64. */
  65. .miscConfiguration = 0, /* bit0 - turn down drivestrength */
  66. .eepromWriteEnableGpio = 3,
  67. .wlanDisableGpio = 0,
  68. .wlanLedGpio = 8,
  69. .rxBandSelectGpio = 0xff,
  70. .txrxgain = 0,
  71. .swreg = 0,
  72. },
  73. .modalHeader2G = {
  74. /* ar9300_modal_eep_header 2g */
  75. /* 4 idle,t1,t2,b(4 bits per setting) */
  76. .antCtrlCommon = LE32(0x110),
  77. /* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
  78. .antCtrlCommon2 = LE32(0x22222),
  79. /*
  80. * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
  81. * rx1, rx12, b (2 bits each)
  82. */
  83. .antCtrlChain = { LE16(0x150), LE16(0x150), LE16(0x150) },
  84. /*
  85. * xatten1DB[AR9300_MAX_CHAINS]; 3 xatten1_db
  86. * for ar9280 (0xa20c/b20c 5:0)
  87. */
  88. .xatten1DB = {0, 0, 0},
  89. /*
  90. * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
  91. * for ar9280 (0xa20c/b20c 16:12
  92. */
  93. .xatten1Margin = {0, 0, 0},
  94. .tempSlope = 36,
  95. .voltSlope = 0,
  96. /*
  97. * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
  98. * channels in usual fbin coding format
  99. */
  100. .spurChans = {0, 0, 0, 0, 0},
  101. /*
  102. * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
  103. * if the register is per chain
  104. */
  105. .noiseFloorThreshCh = {-1, 0, 0},
  106. .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  107. .quick_drop = 0,
  108. .xpaBiasLvl = 0,
  109. .txFrameToDataStart = 0x0e,
  110. .txFrameToPaOn = 0x0e,
  111. .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
  112. .antennaGain = 0,
  113. .switchSettling = 0x2c,
  114. .adcDesiredSize = -30,
  115. .txEndToXpaOff = 0,
  116. .txEndToRxOn = 0x2,
  117. .txFrameToXpaOn = 0xe,
  118. .thresh62 = 28,
  119. .papdRateMaskHt20 = LE32(0x0cf0e0e0),
  120. .papdRateMaskHt40 = LE32(0x6cf0e0e0),
  121. .switchcomspdt = 0,
  122. .xlna_bias_strength = 0,
  123. .futureModal = {
  124. 0, 0, 0, 0, 0, 0, 0,
  125. },
  126. },
  127. .base_ext1 = {
  128. .ant_div_control = 0,
  129. .future = {0, 0},
  130. .tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
  131. },
  132. .calFreqPier2G = {
  133. FREQ2FBIN(2412, 1),
  134. FREQ2FBIN(2437, 1),
  135. FREQ2FBIN(2472, 1),
  136. },
  137. /* ar9300_cal_data_per_freq_op_loop 2g */
  138. .calPierData2G = {
  139. { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
  140. { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
  141. { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
  142. },
  143. .calTarget_freqbin_Cck = {
  144. FREQ2FBIN(2412, 1),
  145. FREQ2FBIN(2484, 1),
  146. },
  147. .calTarget_freqbin_2G = {
  148. FREQ2FBIN(2412, 1),
  149. FREQ2FBIN(2437, 1),
  150. FREQ2FBIN(2472, 1)
  151. },
  152. .calTarget_freqbin_2GHT20 = {
  153. FREQ2FBIN(2412, 1),
  154. FREQ2FBIN(2437, 1),
  155. FREQ2FBIN(2472, 1)
  156. },
  157. .calTarget_freqbin_2GHT40 = {
  158. FREQ2FBIN(2412, 1),
  159. FREQ2FBIN(2437, 1),
  160. FREQ2FBIN(2472, 1)
  161. },
  162. .calTargetPowerCck = {
  163. /* 1L-5L,5S,11L,11S */
  164. { {36, 36, 36, 36} },
  165. { {36, 36, 36, 36} },
  166. },
  167. .calTargetPower2G = {
  168. /* 6-24,36,48,54 */
  169. { {32, 32, 28, 24} },
  170. { {32, 32, 28, 24} },
  171. { {32, 32, 28, 24} },
  172. },
  173. .calTargetPower2GHT20 = {
  174. { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
  175. { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
  176. { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
  177. },
  178. .calTargetPower2GHT40 = {
  179. { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
  180. { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
  181. { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
  182. },
  183. .ctlIndex_2G = {
  184. 0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
  185. 0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
  186. },
  187. .ctl_freqbin_2G = {
  188. {
  189. FREQ2FBIN(2412, 1),
  190. FREQ2FBIN(2417, 1),
  191. FREQ2FBIN(2457, 1),
  192. FREQ2FBIN(2462, 1)
  193. },
  194. {
  195. FREQ2FBIN(2412, 1),
  196. FREQ2FBIN(2417, 1),
  197. FREQ2FBIN(2462, 1),
  198. 0xFF,
  199. },
  200. {
  201. FREQ2FBIN(2412, 1),
  202. FREQ2FBIN(2417, 1),
  203. FREQ2FBIN(2462, 1),
  204. 0xFF,
  205. },
  206. {
  207. FREQ2FBIN(2422, 1),
  208. FREQ2FBIN(2427, 1),
  209. FREQ2FBIN(2447, 1),
  210. FREQ2FBIN(2452, 1)
  211. },
  212. {
  213. /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  214. /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  215. /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  216. /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
  217. },
  218. {
  219. /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  220. /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  221. /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  222. 0,
  223. },
  224. {
  225. /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  226. /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  227. FREQ2FBIN(2472, 1),
  228. 0,
  229. },
  230. {
  231. /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
  232. /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
  233. /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
  234. /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
  235. },
  236. {
  237. /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  238. /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  239. /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  240. },
  241. {
  242. /* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  243. /* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  244. /* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  245. 0
  246. },
  247. {
  248. /* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  249. /* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  250. /* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  251. 0
  252. },
  253. {
  254. /* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
  255. /* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
  256. /* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
  257. /* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
  258. }
  259. },
  260. .ctlPowerData_2G = {
  261. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  262. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  263. { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
  264. { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
  265. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  266. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  267. { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
  268. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  269. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  270. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  271. { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
  272. { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
  273. },
  274. .modalHeader5G = {
  275. /* 4 idle,t1,t2,b (4 bits per setting) */
  276. .antCtrlCommon = LE32(0x110),
  277. /* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
  278. .antCtrlCommon2 = LE32(0x22222),
  279. /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
  280. .antCtrlChain = {
  281. LE16(0x000), LE16(0x000), LE16(0x000),
  282. },
  283. /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
  284. .xatten1DB = {0, 0, 0},
  285. /*
  286. * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
  287. * for merlin (0xa20c/b20c 16:12
  288. */
  289. .xatten1Margin = {0, 0, 0},
  290. .tempSlope = 68,
  291. .voltSlope = 0,
  292. /* spurChans spur channels in usual fbin coding format */
  293. .spurChans = {0, 0, 0, 0, 0},
  294. /* noiseFloorThreshCh Check if the register is per chain */
  295. .noiseFloorThreshCh = {-1, 0, 0},
  296. .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  297. .quick_drop = 0,
  298. .xpaBiasLvl = 0,
  299. .txFrameToDataStart = 0x0e,
  300. .txFrameToPaOn = 0x0e,
  301. .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
  302. .antennaGain = 0,
  303. .switchSettling = 0x2d,
  304. .adcDesiredSize = -30,
  305. .txEndToXpaOff = 0,
  306. .txEndToRxOn = 0x2,
  307. .txFrameToXpaOn = 0xe,
  308. .thresh62 = 28,
  309. .papdRateMaskHt20 = LE32(0x0c80c080),
  310. .papdRateMaskHt40 = LE32(0x0080c080),
  311. .switchcomspdt = 0,
  312. .xlna_bias_strength = 0,
  313. .futureModal = {
  314. 0, 0, 0, 0, 0, 0, 0,
  315. },
  316. },
  317. .base_ext2 = {
  318. .tempSlopeLow = 0,
  319. .tempSlopeHigh = 0,
  320. .xatten1DBLow = {0, 0, 0},
  321. .xatten1MarginLow = {0, 0, 0},
  322. .xatten1DBHigh = {0, 0, 0},
  323. .xatten1MarginHigh = {0, 0, 0}
  324. },
  325. .calFreqPier5G = {
  326. FREQ2FBIN(5180, 0),
  327. FREQ2FBIN(5220, 0),
  328. FREQ2FBIN(5320, 0),
  329. FREQ2FBIN(5400, 0),
  330. FREQ2FBIN(5500, 0),
  331. FREQ2FBIN(5600, 0),
  332. FREQ2FBIN(5725, 0),
  333. FREQ2FBIN(5825, 0)
  334. },
  335. .calPierData5G = {
  336. {
  337. {0, 0, 0, 0, 0},
  338. {0, 0, 0, 0, 0},
  339. {0, 0, 0, 0, 0},
  340. {0, 0, 0, 0, 0},
  341. {0, 0, 0, 0, 0},
  342. {0, 0, 0, 0, 0},
  343. {0, 0, 0, 0, 0},
  344. {0, 0, 0, 0, 0},
  345. },
  346. {
  347. {0, 0, 0, 0, 0},
  348. {0, 0, 0, 0, 0},
  349. {0, 0, 0, 0, 0},
  350. {0, 0, 0, 0, 0},
  351. {0, 0, 0, 0, 0},
  352. {0, 0, 0, 0, 0},
  353. {0, 0, 0, 0, 0},
  354. {0, 0, 0, 0, 0},
  355. },
  356. {
  357. {0, 0, 0, 0, 0},
  358. {0, 0, 0, 0, 0},
  359. {0, 0, 0, 0, 0},
  360. {0, 0, 0, 0, 0},
  361. {0, 0, 0, 0, 0},
  362. {0, 0, 0, 0, 0},
  363. {0, 0, 0, 0, 0},
  364. {0, 0, 0, 0, 0},
  365. },
  366. },
  367. .calTarget_freqbin_5G = {
  368. FREQ2FBIN(5180, 0),
  369. FREQ2FBIN(5220, 0),
  370. FREQ2FBIN(5320, 0),
  371. FREQ2FBIN(5400, 0),
  372. FREQ2FBIN(5500, 0),
  373. FREQ2FBIN(5600, 0),
  374. FREQ2FBIN(5725, 0),
  375. FREQ2FBIN(5825, 0)
  376. },
  377. .calTarget_freqbin_5GHT20 = {
  378. FREQ2FBIN(5180, 0),
  379. FREQ2FBIN(5240, 0),
  380. FREQ2FBIN(5320, 0),
  381. FREQ2FBIN(5500, 0),
  382. FREQ2FBIN(5700, 0),
  383. FREQ2FBIN(5745, 0),
  384. FREQ2FBIN(5725, 0),
  385. FREQ2FBIN(5825, 0)
  386. },
  387. .calTarget_freqbin_5GHT40 = {
  388. FREQ2FBIN(5180, 0),
  389. FREQ2FBIN(5240, 0),
  390. FREQ2FBIN(5320, 0),
  391. FREQ2FBIN(5500, 0),
  392. FREQ2FBIN(5700, 0),
  393. FREQ2FBIN(5745, 0),
  394. FREQ2FBIN(5725, 0),
  395. FREQ2FBIN(5825, 0)
  396. },
  397. .calTargetPower5G = {
  398. /* 6-24,36,48,54 */
  399. { {20, 20, 20, 10} },
  400. { {20, 20, 20, 10} },
  401. { {20, 20, 20, 10} },
  402. { {20, 20, 20, 10} },
  403. { {20, 20, 20, 10} },
  404. { {20, 20, 20, 10} },
  405. { {20, 20, 20, 10} },
  406. { {20, 20, 20, 10} },
  407. },
  408. .calTargetPower5GHT20 = {
  409. /*
  410. * 0_8_16,1-3_9-11_17-19,
  411. * 4,5,6,7,12,13,14,15,20,21,22,23
  412. */
  413. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  414. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  415. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  416. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  417. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  418. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  419. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  420. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  421. },
  422. .calTargetPower5GHT40 = {
  423. /*
  424. * 0_8_16,1-3_9-11_17-19,
  425. * 4,5,6,7,12,13,14,15,20,21,22,23
  426. */
  427. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  428. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  429. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  430. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  431. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  432. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  433. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  434. { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
  435. },
  436. .ctlIndex_5G = {
  437. 0x10, 0x16, 0x18, 0x40, 0x46,
  438. 0x48, 0x30, 0x36, 0x38
  439. },
  440. .ctl_freqbin_5G = {
  441. {
  442. /* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  443. /* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
  444. /* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
  445. /* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
  446. /* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
  447. /* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
  448. /* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
  449. /* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
  450. },
  451. {
  452. /* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  453. /* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
  454. /* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
  455. /* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
  456. /* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
  457. /* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
  458. /* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
  459. /* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
  460. },
  461. {
  462. /* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
  463. /* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
  464. /* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
  465. /* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
  466. /* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
  467. /* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
  468. /* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
  469. /* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
  470. },
  471. {
  472. /* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  473. /* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
  474. /* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
  475. /* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
  476. /* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
  477. /* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
  478. /* Data[3].ctlEdges[6].bChannel */ 0xFF,
  479. /* Data[3].ctlEdges[7].bChannel */ 0xFF,
  480. },
  481. {
  482. /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  483. /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
  484. /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
  485. /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
  486. /* Data[4].ctlEdges[4].bChannel */ 0xFF,
  487. /* Data[4].ctlEdges[5].bChannel */ 0xFF,
  488. /* Data[4].ctlEdges[6].bChannel */ 0xFF,
  489. /* Data[4].ctlEdges[7].bChannel */ 0xFF,
  490. },
  491. {
  492. /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
  493. /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
  494. /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
  495. /* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
  496. /* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
  497. /* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
  498. /* Data[5].ctlEdges[6].bChannel */ 0xFF,
  499. /* Data[5].ctlEdges[7].bChannel */ 0xFF
  500. },
  501. {
  502. /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  503. /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
  504. /* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
  505. /* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
  506. /* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
  507. /* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
  508. /* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
  509. /* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
  510. },
  511. {
  512. /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  513. /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
  514. /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
  515. /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
  516. /* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
  517. /* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
  518. /* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
  519. /* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
  520. },
  521. {
  522. /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
  523. /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
  524. /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
  525. /* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
  526. /* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
  527. /* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
  528. /* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
  529. /* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
  530. }
  531. },
  532. .ctlPowerData_5G = {
  533. {
  534. {
  535. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
  536. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
  537. }
  538. },
  539. {
  540. {
  541. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
  542. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
  543. }
  544. },
  545. {
  546. {
  547. CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
  548. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
  549. }
  550. },
  551. {
  552. {
  553. CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
  554. CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
  555. }
  556. },
  557. {
  558. {
  559. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
  560. CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
  561. }
  562. },
  563. {
  564. {
  565. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
  566. CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
  567. }
  568. },
  569. {
  570. {
  571. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
  572. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
  573. }
  574. },
  575. {
  576. {
  577. CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
  578. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
  579. }
  580. },
  581. {
  582. {
  583. CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
  584. CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
  585. }
  586. },
  587. }
  588. };
  589. static const struct ar9300_eeprom ar9300_x113 = {
  590. .eepromVersion = 2,
  591. .templateVersion = 6,
  592. .macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
  593. .custData = {"x113-023-f0000"},
  594. .baseEepHeader = {
  595. .regDmn = { LE16(0), LE16(0x1f) },
  596. .txrxMask = 0x77, /* 4 bits tx and 4 bits rx */
  597. .opCapFlags = {
  598. .opFlags = AR5416_OPFLAGS_11A,
  599. .eepMisc = AR9300_EEPMISC_LITTLE_ENDIAN,
  600. },
  601. .rfSilent = 0,
  602. .blueToothOptions = 0,
  603. .deviceCap = 0,
  604. .deviceType = 5, /* takes lower byte in eeprom location */
  605. .pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
  606. .params_for_tuning_caps = {0, 0},
  607. .featureEnable = 0x0d,
  608. /*
  609. * bit0 - enable tx temp comp - disabled
  610. * bit1 - enable tx volt comp - disabled
  611. * bit2 - enable fastClock - enabled
  612. * bit3 - enable doubling - enabled
  613. * bit4 - enable internal regulator - disabled
  614. * bit5 - enable pa predistortion - disabled
  615. */
  616. .miscConfiguration = 0, /* bit0 - turn down drivestrength */
  617. .eepromWriteEnableGpio = 6,
  618. .wlanDisableGpio = 0,
  619. .wlanLedGpio = 8,
  620. .rxBandSelectGpio = 0xff,
  621. .txrxgain = 0x21,
  622. .swreg = 0,
  623. },
  624. .modalHeader2G = {
  625. /* ar9300_modal_eep_header 2g */
  626. /* 4 idle,t1,t2,b(4 bits per setting) */
  627. .antCtrlCommon = LE32(0x110),
  628. /* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
  629. .antCtrlCommon2 = LE32(0x44444),
  630. /*
  631. * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
  632. * rx1, rx12, b (2 bits each)
  633. */
  634. .antCtrlChain = { LE16(0x150), LE16(0x150), LE16(0x150) },
  635. /*
  636. * xatten1DB[AR9300_MAX_CHAINS]; 3 xatten1_db
  637. * for ar9280 (0xa20c/b20c 5:0)
  638. */
  639. .xatten1DB = {0, 0, 0},
  640. /*
  641. * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
  642. * for ar9280 (0xa20c/b20c 16:12
  643. */
  644. .xatten1Margin = {0, 0, 0},
  645. .tempSlope = 25,
  646. .voltSlope = 0,
  647. /*
  648. * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
  649. * channels in usual fbin coding format
  650. */
  651. .spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
  652. /*
  653. * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
  654. * if the register is per chain
  655. */
  656. .noiseFloorThreshCh = {-1, 0, 0},
  657. .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  658. .quick_drop = 0,
  659. .xpaBiasLvl = 0,
  660. .txFrameToDataStart = 0x0e,
  661. .txFrameToPaOn = 0x0e,
  662. .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
  663. .antennaGain = 0,
  664. .switchSettling = 0x2c,
  665. .adcDesiredSize = -30,
  666. .txEndToXpaOff = 0,
  667. .txEndToRxOn = 0x2,
  668. .txFrameToXpaOn = 0xe,
  669. .thresh62 = 28,
  670. .papdRateMaskHt20 = LE32(0x0c80c080),
  671. .papdRateMaskHt40 = LE32(0x0080c080),
  672. .switchcomspdt = 0,
  673. .xlna_bias_strength = 0,
  674. .futureModal = {
  675. 0, 0, 0, 0, 0, 0, 0,
  676. },
  677. },
  678. .base_ext1 = {
  679. .ant_div_control = 0,
  680. .future = {0, 0},
  681. .tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
  682. },
  683. .calFreqPier2G = {
  684. FREQ2FBIN(2412, 1),
  685. FREQ2FBIN(2437, 1),
  686. FREQ2FBIN(2472, 1),
  687. },
  688. /* ar9300_cal_data_per_freq_op_loop 2g */
  689. .calPierData2G = {
  690. { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
  691. { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
  692. { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
  693. },
  694. .calTarget_freqbin_Cck = {
  695. FREQ2FBIN(2412, 1),
  696. FREQ2FBIN(2472, 1),
  697. },
  698. .calTarget_freqbin_2G = {
  699. FREQ2FBIN(2412, 1),
  700. FREQ2FBIN(2437, 1),
  701. FREQ2FBIN(2472, 1)
  702. },
  703. .calTarget_freqbin_2GHT20 = {
  704. FREQ2FBIN(2412, 1),
  705. FREQ2FBIN(2437, 1),
  706. FREQ2FBIN(2472, 1)
  707. },
  708. .calTarget_freqbin_2GHT40 = {
  709. FREQ2FBIN(2412, 1),
  710. FREQ2FBIN(2437, 1),
  711. FREQ2FBIN(2472, 1)
  712. },
  713. .calTargetPowerCck = {
  714. /* 1L-5L,5S,11L,11S */
  715. { {34, 34, 34, 34} },
  716. { {34, 34, 34, 34} },
  717. },
  718. .calTargetPower2G = {
  719. /* 6-24,36,48,54 */
  720. { {34, 34, 32, 32} },
  721. { {34, 34, 32, 32} },
  722. { {34, 34, 32, 32} },
  723. },
  724. .calTargetPower2GHT20 = {
  725. { {32, 32, 32, 32, 32, 28, 32, 32, 30, 28, 0, 0, 0, 0} },
  726. { {32, 32, 32, 32, 32, 28, 32, 32, 30, 28, 0, 0, 0, 0} },
  727. { {32, 32, 32, 32, 32, 28, 32, 32, 30, 28, 0, 0, 0, 0} },
  728. },
  729. .calTargetPower2GHT40 = {
  730. { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
  731. { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
  732. { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
  733. },
  734. .ctlIndex_2G = {
  735. 0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
  736. 0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
  737. },
  738. .ctl_freqbin_2G = {
  739. {
  740. FREQ2FBIN(2412, 1),
  741. FREQ2FBIN(2417, 1),
  742. FREQ2FBIN(2457, 1),
  743. FREQ2FBIN(2462, 1)
  744. },
  745. {
  746. FREQ2FBIN(2412, 1),
  747. FREQ2FBIN(2417, 1),
  748. FREQ2FBIN(2462, 1),
  749. 0xFF,
  750. },
  751. {
  752. FREQ2FBIN(2412, 1),
  753. FREQ2FBIN(2417, 1),
  754. FREQ2FBIN(2462, 1),
  755. 0xFF,
  756. },
  757. {
  758. FREQ2FBIN(2422, 1),
  759. FREQ2FBIN(2427, 1),
  760. FREQ2FBIN(2447, 1),
  761. FREQ2FBIN(2452, 1)
  762. },
  763. {
  764. /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  765. /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  766. /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  767. /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
  768. },
  769. {
  770. /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  771. /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  772. /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  773. 0,
  774. },
  775. {
  776. /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  777. /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  778. FREQ2FBIN(2472, 1),
  779. 0,
  780. },
  781. {
  782. /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
  783. /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
  784. /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
  785. /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
  786. },
  787. {
  788. /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  789. /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  790. /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  791. },
  792. {
  793. /* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  794. /* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  795. /* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  796. 0
  797. },
  798. {
  799. /* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  800. /* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  801. /* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  802. 0
  803. },
  804. {
  805. /* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
  806. /* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
  807. /* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
  808. /* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
  809. }
  810. },
  811. .ctlPowerData_2G = {
  812. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  813. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  814. { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
  815. { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
  816. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  817. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  818. { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
  819. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  820. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  821. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  822. { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
  823. { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
  824. },
  825. .modalHeader5G = {
  826. /* 4 idle,t1,t2,b (4 bits per setting) */
  827. .antCtrlCommon = LE32(0x220),
  828. /* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
  829. .antCtrlCommon2 = LE32(0x11111),
  830. /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
  831. .antCtrlChain = {
  832. LE16(0x150), LE16(0x150), LE16(0x150),
  833. },
  834. /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
  835. .xatten1DB = {0, 0, 0},
  836. /*
  837. * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
  838. * for merlin (0xa20c/b20c 16:12
  839. */
  840. .xatten1Margin = {0, 0, 0},
  841. .tempSlope = 68,
  842. .voltSlope = 0,
  843. /* spurChans spur channels in usual fbin coding format */
  844. .spurChans = {FREQ2FBIN(5500, 0), 0, 0, 0, 0},
  845. /* noiseFloorThreshCh Check if the register is per chain */
  846. .noiseFloorThreshCh = {-1, 0, 0},
  847. .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  848. .quick_drop = 0,
  849. .xpaBiasLvl = 0xf,
  850. .txFrameToDataStart = 0x0e,
  851. .txFrameToPaOn = 0x0e,
  852. .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
  853. .antennaGain = 0,
  854. .switchSettling = 0x2d,
  855. .adcDesiredSize = -30,
  856. .txEndToXpaOff = 0,
  857. .txEndToRxOn = 0x2,
  858. .txFrameToXpaOn = 0xe,
  859. .thresh62 = 28,
  860. .papdRateMaskHt20 = LE32(0x0cf0e0e0),
  861. .papdRateMaskHt40 = LE32(0x6cf0e0e0),
  862. .switchcomspdt = 0,
  863. .xlna_bias_strength = 0,
  864. .futureModal = {
  865. 0, 0, 0, 0, 0, 0, 0,
  866. },
  867. },
  868. .base_ext2 = {
  869. .tempSlopeLow = 72,
  870. .tempSlopeHigh = 105,
  871. .xatten1DBLow = {0, 0, 0},
  872. .xatten1MarginLow = {0, 0, 0},
  873. .xatten1DBHigh = {0, 0, 0},
  874. .xatten1MarginHigh = {0, 0, 0}
  875. },
  876. .calFreqPier5G = {
  877. FREQ2FBIN(5180, 0),
  878. FREQ2FBIN(5240, 0),
  879. FREQ2FBIN(5320, 0),
  880. FREQ2FBIN(5400, 0),
  881. FREQ2FBIN(5500, 0),
  882. FREQ2FBIN(5600, 0),
  883. FREQ2FBIN(5745, 0),
  884. FREQ2FBIN(5785, 0)
  885. },
  886. .calPierData5G = {
  887. {
  888. {0, 0, 0, 0, 0},
  889. {0, 0, 0, 0, 0},
  890. {0, 0, 0, 0, 0},
  891. {0, 0, 0, 0, 0},
  892. {0, 0, 0, 0, 0},
  893. {0, 0, 0, 0, 0},
  894. {0, 0, 0, 0, 0},
  895. {0, 0, 0, 0, 0},
  896. },
  897. {
  898. {0, 0, 0, 0, 0},
  899. {0, 0, 0, 0, 0},
  900. {0, 0, 0, 0, 0},
  901. {0, 0, 0, 0, 0},
  902. {0, 0, 0, 0, 0},
  903. {0, 0, 0, 0, 0},
  904. {0, 0, 0, 0, 0},
  905. {0, 0, 0, 0, 0},
  906. },
  907. {
  908. {0, 0, 0, 0, 0},
  909. {0, 0, 0, 0, 0},
  910. {0, 0, 0, 0, 0},
  911. {0, 0, 0, 0, 0},
  912. {0, 0, 0, 0, 0},
  913. {0, 0, 0, 0, 0},
  914. {0, 0, 0, 0, 0},
  915. {0, 0, 0, 0, 0},
  916. },
  917. },
  918. .calTarget_freqbin_5G = {
  919. FREQ2FBIN(5180, 0),
  920. FREQ2FBIN(5220, 0),
  921. FREQ2FBIN(5320, 0),
  922. FREQ2FBIN(5400, 0),
  923. FREQ2FBIN(5500, 0),
  924. FREQ2FBIN(5600, 0),
  925. FREQ2FBIN(5745, 0),
  926. FREQ2FBIN(5785, 0)
  927. },
  928. .calTarget_freqbin_5GHT20 = {
  929. FREQ2FBIN(5180, 0),
  930. FREQ2FBIN(5240, 0),
  931. FREQ2FBIN(5320, 0),
  932. FREQ2FBIN(5400, 0),
  933. FREQ2FBIN(5500, 0),
  934. FREQ2FBIN(5700, 0),
  935. FREQ2FBIN(5745, 0),
  936. FREQ2FBIN(5825, 0)
  937. },
  938. .calTarget_freqbin_5GHT40 = {
  939. FREQ2FBIN(5190, 0),
  940. FREQ2FBIN(5230, 0),
  941. FREQ2FBIN(5320, 0),
  942. FREQ2FBIN(5410, 0),
  943. FREQ2FBIN(5510, 0),
  944. FREQ2FBIN(5670, 0),
  945. FREQ2FBIN(5755, 0),
  946. FREQ2FBIN(5825, 0)
  947. },
  948. .calTargetPower5G = {
  949. /* 6-24,36,48,54 */
  950. { {42, 40, 40, 34} },
  951. { {42, 40, 40, 34} },
  952. { {42, 40, 40, 34} },
  953. { {42, 40, 40, 34} },
  954. { {42, 40, 40, 34} },
  955. { {42, 40, 40, 34} },
  956. { {42, 40, 40, 34} },
  957. { {42, 40, 40, 34} },
  958. },
  959. .calTargetPower5GHT20 = {
  960. /*
  961. * 0_8_16,1-3_9-11_17-19,
  962. * 4,5,6,7,12,13,14,15,20,21,22,23
  963. */
  964. { {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
  965. { {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
  966. { {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
  967. { {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
  968. { {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
  969. { {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
  970. { {38, 38, 38, 38, 32, 28, 38, 38, 32, 28, 38, 38, 32, 26} },
  971. { {36, 36, 36, 36, 32, 28, 36, 36, 32, 28, 36, 36, 32, 26} },
  972. },
  973. .calTargetPower5GHT40 = {
  974. /*
  975. * 0_8_16,1-3_9-11_17-19,
  976. * 4,5,6,7,12,13,14,15,20,21,22,23
  977. */
  978. { {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
  979. { {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
  980. { {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
  981. { {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
  982. { {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
  983. { {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
  984. { {36, 36, 36, 36, 30, 26, 36, 36, 30, 26, 36, 36, 30, 24} },
  985. { {34, 34, 34, 34, 30, 26, 34, 34, 30, 26, 34, 34, 30, 24} },
  986. },
  987. .ctlIndex_5G = {
  988. 0x10, 0x16, 0x18, 0x40, 0x46,
  989. 0x48, 0x30, 0x36, 0x38
  990. },
  991. .ctl_freqbin_5G = {
  992. {
  993. /* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  994. /* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
  995. /* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
  996. /* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
  997. /* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
  998. /* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
  999. /* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
  1000. /* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
  1001. },
  1002. {
  1003. /* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  1004. /* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
  1005. /* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
  1006. /* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
  1007. /* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
  1008. /* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
  1009. /* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
  1010. /* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
  1011. },
  1012. {
  1013. /* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
  1014. /* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
  1015. /* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
  1016. /* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
  1017. /* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
  1018. /* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
  1019. /* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
  1020. /* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
  1021. },
  1022. {
  1023. /* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  1024. /* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
  1025. /* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
  1026. /* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
  1027. /* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
  1028. /* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
  1029. /* Data[3].ctlEdges[6].bChannel */ 0xFF,
  1030. /* Data[3].ctlEdges[7].bChannel */ 0xFF,
  1031. },
  1032. {
  1033. /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  1034. /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
  1035. /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
  1036. /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
  1037. /* Data[4].ctlEdges[4].bChannel */ 0xFF,
  1038. /* Data[4].ctlEdges[5].bChannel */ 0xFF,
  1039. /* Data[4].ctlEdges[6].bChannel */ 0xFF,
  1040. /* Data[4].ctlEdges[7].bChannel */ 0xFF,
  1041. },
  1042. {
  1043. /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
  1044. /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
  1045. /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
  1046. /* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
  1047. /* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
  1048. /* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
  1049. /* Data[5].ctlEdges[6].bChannel */ 0xFF,
  1050. /* Data[5].ctlEdges[7].bChannel */ 0xFF
  1051. },
  1052. {
  1053. /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  1054. /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
  1055. /* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
  1056. /* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
  1057. /* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
  1058. /* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
  1059. /* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
  1060. /* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
  1061. },
  1062. {
  1063. /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  1064. /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
  1065. /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
  1066. /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
  1067. /* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
  1068. /* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
  1069. /* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
  1070. /* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
  1071. },
  1072. {
  1073. /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
  1074. /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
  1075. /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
  1076. /* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
  1077. /* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
  1078. /* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
  1079. /* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
  1080. /* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
  1081. }
  1082. },
  1083. .ctlPowerData_5G = {
  1084. {
  1085. {
  1086. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
  1087. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
  1088. }
  1089. },
  1090. {
  1091. {
  1092. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
  1093. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
  1094. }
  1095. },
  1096. {
  1097. {
  1098. CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
  1099. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
  1100. }
  1101. },
  1102. {
  1103. {
  1104. CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
  1105. CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
  1106. }
  1107. },
  1108. {
  1109. {
  1110. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
  1111. CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
  1112. }
  1113. },
  1114. {
  1115. {
  1116. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
  1117. CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
  1118. }
  1119. },
  1120. {
  1121. {
  1122. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
  1123. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
  1124. }
  1125. },
  1126. {
  1127. {
  1128. CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
  1129. CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
  1130. }
  1131. },
  1132. {
  1133. {
  1134. CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
  1135. CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
  1136. }
  1137. },
  1138. }
  1139. };
  1140. static const struct ar9300_eeprom ar9300_h112 = {
  1141. .eepromVersion = 2,
  1142. .templateVersion = 3,
  1143. .macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
  1144. .custData = {"h112-241-f0000"},
  1145. .baseEepHeader = {
  1146. .regDmn = { LE16(0), LE16(0x1f) },
  1147. .txrxMask = 0x77, /* 4 bits tx and 4 bits rx */
  1148. .opCapFlags = {
  1149. .opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
  1150. .eepMisc = AR9300_EEPMISC_LITTLE_ENDIAN,
  1151. },
  1152. .rfSilent = 0,
  1153. .blueToothOptions = 0,
  1154. .deviceCap = 0,
  1155. .deviceType = 5, /* takes lower byte in eeprom location */
  1156. .pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
  1157. .params_for_tuning_caps = {0, 0},
  1158. .featureEnable = 0x0d,
  1159. /*
  1160. * bit0 - enable tx temp comp - disabled
  1161. * bit1 - enable tx volt comp - disabled
  1162. * bit2 - enable fastClock - enabled
  1163. * bit3 - enable doubling - enabled
  1164. * bit4 - enable internal regulator - disabled
  1165. * bit5 - enable pa predistortion - disabled
  1166. */
  1167. .miscConfiguration = 0, /* bit0 - turn down drivestrength */
  1168. .eepromWriteEnableGpio = 6,
  1169. .wlanDisableGpio = 0,
  1170. .wlanLedGpio = 8,
  1171. .rxBandSelectGpio = 0xff,
  1172. .txrxgain = 0x10,
  1173. .swreg = 0,
  1174. },
  1175. .modalHeader2G = {
  1176. /* ar9300_modal_eep_header 2g */
  1177. /* 4 idle,t1,t2,b(4 bits per setting) */
  1178. .antCtrlCommon = LE32(0x110),
  1179. /* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
  1180. .antCtrlCommon2 = LE32(0x44444),
  1181. /*
  1182. * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
  1183. * rx1, rx12, b (2 bits each)
  1184. */
  1185. .antCtrlChain = { LE16(0x150), LE16(0x150), LE16(0x150) },
  1186. /*
  1187. * xatten1DB[AR9300_MAX_CHAINS]; 3 xatten1_db
  1188. * for ar9280 (0xa20c/b20c 5:0)
  1189. */
  1190. .xatten1DB = {0, 0, 0},
  1191. /*
  1192. * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
  1193. * for ar9280 (0xa20c/b20c 16:12
  1194. */
  1195. .xatten1Margin = {0, 0, 0},
  1196. .tempSlope = 25,
  1197. .voltSlope = 0,
  1198. /*
  1199. * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
  1200. * channels in usual fbin coding format
  1201. */
  1202. .spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
  1203. /*
  1204. * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
  1205. * if the register is per chain
  1206. */
  1207. .noiseFloorThreshCh = {-1, 0, 0},
  1208. .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  1209. .quick_drop = 0,
  1210. .xpaBiasLvl = 0,
  1211. .txFrameToDataStart = 0x0e,
  1212. .txFrameToPaOn = 0x0e,
  1213. .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
  1214. .antennaGain = 0,
  1215. .switchSettling = 0x2c,
  1216. .adcDesiredSize = -30,
  1217. .txEndToXpaOff = 0,
  1218. .txEndToRxOn = 0x2,
  1219. .txFrameToXpaOn = 0xe,
  1220. .thresh62 = 28,
  1221. .papdRateMaskHt20 = LE32(0x0c80c080),
  1222. .papdRateMaskHt40 = LE32(0x0080c080),
  1223. .switchcomspdt = 0,
  1224. .xlna_bias_strength = 0,
  1225. .futureModal = {
  1226. 0, 0, 0, 0, 0, 0, 0,
  1227. },
  1228. },
  1229. .base_ext1 = {
  1230. .ant_div_control = 0,
  1231. .future = {0, 0},
  1232. .tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
  1233. },
  1234. .calFreqPier2G = {
  1235. FREQ2FBIN(2412, 1),
  1236. FREQ2FBIN(2437, 1),
  1237. FREQ2FBIN(2462, 1),
  1238. },
  1239. /* ar9300_cal_data_per_freq_op_loop 2g */
  1240. .calPierData2G = {
  1241. { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
  1242. { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
  1243. { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
  1244. },
  1245. .calTarget_freqbin_Cck = {
  1246. FREQ2FBIN(2412, 1),
  1247. FREQ2FBIN(2472, 1),
  1248. },
  1249. .calTarget_freqbin_2G = {
  1250. FREQ2FBIN(2412, 1),
  1251. FREQ2FBIN(2437, 1),
  1252. FREQ2FBIN(2472, 1)
  1253. },
  1254. .calTarget_freqbin_2GHT20 = {
  1255. FREQ2FBIN(2412, 1),
  1256. FREQ2FBIN(2437, 1),
  1257. FREQ2FBIN(2472, 1)
  1258. },
  1259. .calTarget_freqbin_2GHT40 = {
  1260. FREQ2FBIN(2412, 1),
  1261. FREQ2FBIN(2437, 1),
  1262. FREQ2FBIN(2472, 1)
  1263. },
  1264. .calTargetPowerCck = {
  1265. /* 1L-5L,5S,11L,11S */
  1266. { {34, 34, 34, 34} },
  1267. { {34, 34, 34, 34} },
  1268. },
  1269. .calTargetPower2G = {
  1270. /* 6-24,36,48,54 */
  1271. { {34, 34, 32, 32} },
  1272. { {34, 34, 32, 32} },
  1273. { {34, 34, 32, 32} },
  1274. },
  1275. .calTargetPower2GHT20 = {
  1276. { {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 28, 28, 28, 24} },
  1277. { {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 28, 28, 28, 24} },
  1278. { {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 28, 28, 28, 24} },
  1279. },
  1280. .calTargetPower2GHT40 = {
  1281. { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 26, 26, 26, 22} },
  1282. { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 26, 26, 26, 22} },
  1283. { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 26, 26, 26, 22} },
  1284. },
  1285. .ctlIndex_2G = {
  1286. 0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
  1287. 0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
  1288. },
  1289. .ctl_freqbin_2G = {
  1290. {
  1291. FREQ2FBIN(2412, 1),
  1292. FREQ2FBIN(2417, 1),
  1293. FREQ2FBIN(2457, 1),
  1294. FREQ2FBIN(2462, 1)
  1295. },
  1296. {
  1297. FREQ2FBIN(2412, 1),
  1298. FREQ2FBIN(2417, 1),
  1299. FREQ2FBIN(2462, 1),
  1300. 0xFF,
  1301. },
  1302. {
  1303. FREQ2FBIN(2412, 1),
  1304. FREQ2FBIN(2417, 1),
  1305. FREQ2FBIN(2462, 1),
  1306. 0xFF,
  1307. },
  1308. {
  1309. FREQ2FBIN(2422, 1),
  1310. FREQ2FBIN(2427, 1),
  1311. FREQ2FBIN(2447, 1),
  1312. FREQ2FBIN(2452, 1)
  1313. },
  1314. {
  1315. /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  1316. /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  1317. /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  1318. /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
  1319. },
  1320. {
  1321. /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  1322. /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  1323. /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  1324. 0,
  1325. },
  1326. {
  1327. /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  1328. /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  1329. FREQ2FBIN(2472, 1),
  1330. 0,
  1331. },
  1332. {
  1333. /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
  1334. /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
  1335. /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
  1336. /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
  1337. },
  1338. {
  1339. /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  1340. /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  1341. /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  1342. },
  1343. {
  1344. /* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  1345. /* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  1346. /* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  1347. 0
  1348. },
  1349. {
  1350. /* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
  1351. /* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
  1352. /* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
  1353. 0
  1354. },
  1355. {
  1356. /* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
  1357. /* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
  1358. /* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
  1359. /* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
  1360. }
  1361. },
  1362. .ctlPowerData_2G = {
  1363. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  1364. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  1365. { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
  1366. { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
  1367. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  1368. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  1369. { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
  1370. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  1371. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  1372. { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
  1373. { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
  1374. { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
  1375. },
  1376. .modalHeader5G = {
  1377. /* 4 idle,t1,t2,b (4 bits per setting) */
  1378. .antCtrlCommon = LE32(0x220),
  1379. /* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
  1380. .antCtrlCommon2 = LE32(0x44444),
  1381. /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
  1382. .antCtrlChain = {
  1383. LE16(0x150), LE16(0x150), LE16(0x150),
  1384. },
  1385. /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
  1386. .xatten1DB = {0, 0, 0},
  1387. /*
  1388. * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
  1389. * for merlin (0xa20c/b20c 16:12
  1390. */
  1391. .xatten1Margin = {0, 0, 0},
  1392. .tempSlope = 45,
  1393. .voltSlope = 0,
  1394. /* spurChans spur channels in usual fbin coding format */
  1395. .spurChans = {0, 0, 0, 0, 0},
  1396. /* noiseFloorThreshCh Check if the register is per chain */
  1397. .noiseFloorThreshCh = {-1, 0, 0},
  1398. .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  1399. .quick_drop = 0,
  1400. .xpaBiasLvl = 0,
  1401. .txFrameToDataStart = 0x0e,
  1402. .txFrameToPaOn = 0x0e,
  1403. .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
  1404. .antennaGain = 0,
  1405. .switchSettling = 0x2d,
  1406. .adcDesiredSize = -30,
  1407. .txEndToXpaOff = 0,
  1408. .txEndToRxOn = 0x2,
  1409. .txFrameToXpaOn = 0xe,
  1410. .thresh62 = 28,
  1411. .papdRateMaskHt20 = LE32(0x0cf0e0e0),
  1412. .papdRateMaskHt40 = LE32(0x6cf0e0e0),
  1413. .switchcomspdt = 0,
  1414. .xlna_bias_strength = 0,
  1415. .futureModal = {
  1416. 0, 0, 0, 0, 0, 0, 0,
  1417. },
  1418. },
  1419. .base_ext2 = {
  1420. .tempSlopeLow = 40,
  1421. .tempSlopeHigh = 50,
  1422. .xatten1DBLow = {0, 0, 0},
  1423. .xatten1MarginLow = {0, 0, 0},
  1424. .xatten1DBHigh = {0, 0, 0},
  1425. .xatten1MarginHigh = {0, 0, 0}
  1426. },
  1427. .calFreqPier5G = {
  1428. FREQ2FBIN(5180, 0),
  1429. FREQ2FBIN(5220, 0),
  1430. FREQ2FBIN(5320, 0),
  1431. FREQ2FBIN(5400, 0),
  1432. FREQ2FBIN(5500, 0),
  1433. FREQ2FBIN(5600, 0),
  1434. FREQ2FBIN(5700, 0),
  1435. FREQ2FBIN(5785, 0)
  1436. },
  1437. .calPierData5G = {
  1438. {
  1439. {0, 0, 0, 0, 0},
  1440. {0, 0, 0, 0, 0},
  1441. {0, 0, 0, 0, 0},
  1442. {0, 0, 0, 0, 0},
  1443. {0, 0, 0, 0, 0},
  1444. {0, 0, 0, 0, 0},
  1445. {0, 0, 0, 0, 0},
  1446. {0, 0, 0, 0, 0},
  1447. },
  1448. {
  1449. {0, 0, 0, 0, 0},
  1450. {0, 0, 0, 0, 0},
  1451. {0, 0, 0, 0, 0},
  1452. {0, 0, 0, 0, 0},
  1453. {0, 0, 0, 0, 0},
  1454. {0, 0, 0, 0, 0},
  1455. {0, 0, 0, 0, 0},
  1456. {0, 0, 0, 0, 0},
  1457. },
  1458. {
  1459. {0, 0, 0, 0, 0},
  1460. {0, 0, 0, 0, 0},
  1461. {0, 0, 0, 0, 0},
  1462. {0, 0, 0, 0, 0},
  1463. {0, 0, 0, 0, 0},
  1464. {0, 0, 0, 0, 0},
  1465. {0, 0, 0, 0, 0},
  1466. {0, 0, 0, 0, 0},
  1467. },
  1468. },
  1469. .calTarget_freqbin_5G = {
  1470. FREQ2FBIN(5180, 0),
  1471. FREQ2FBIN(5240, 0),
  1472. FREQ2FBIN(5320, 0),
  1473. FREQ2FBIN(5400, 0),
  1474. FREQ2FBIN(5500, 0),
  1475. FREQ2FBIN(5600, 0),
  1476. FREQ2FBIN(5700, 0),
  1477. FREQ2FBIN(5825, 0)
  1478. },
  1479. .calTarget_freqbin_5GHT20 = {
  1480. FREQ2FBIN(5180, 0),
  1481. FREQ2FBIN(5240, 0),
  1482. FREQ2FBIN(5320, 0),
  1483. FREQ2FBIN(5400, 0),
  1484. FREQ2FBIN(5500, 0),
  1485. FREQ2FBIN(5700, 0),
  1486. FREQ2FBIN(5745, 0),
  1487. FREQ2FBIN(5825, 0)
  1488. },
  1489. .calTarget_freqbin_5GHT40 = {
  1490. FREQ2FBIN(5180, 0),
  1491. FREQ2FBIN(5240, 0),
  1492. FREQ2FBIN(5320, 0),
  1493. FREQ2FBIN(5400, 0),
  1494. FREQ2FBIN(5500, 0),
  1495. FREQ2FBIN(5700, 0),
  1496. FREQ2FBIN(5745, 0),
  1497. FREQ2FBIN(5825, 0)
  1498. },
  1499. .calTargetPower5G = {
  1500. /* 6-24,36,48,54 */
  1501. { {30, 30, 28, 24} },
  1502. { {30, 30, 28, 24} },
  1503. { {30, 30, 28, 24} },
  1504. { {30, 30, 28, 24} },
  1505. { {30, 30, 28, 24} },
  1506. { {30, 30, 28, 24} },
  1507. { {30, 30, 28, 24} },
  1508. { {30, 30, 28, 24} },
  1509. },
  1510. .calTargetPower5GHT20 = {
  1511. /*
  1512. * 0_8_16,1-3_9-11_17-19,
  1513. * 4,5,6,7,12,13,14,15,20,21,22,23
  1514. */
  1515. { {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 20, 20, 20, 16} },
  1516. { {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 20, 20, 20, 16} },
  1517. { {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 18, 18, 18, 16} },
  1518. { {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 18, 18, 18, 16} },
  1519. { {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 16, 16, 16, 14} },
  1520. { {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 16, 16, 16, 14} },
  1521. { {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 14, 14, 14, 12} },
  1522. { {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 14, 14, 14, 12} },
  1523. },
  1524. .calTargetPower5GHT40 = {
  1525. /*
  1526. * 0_8_16,1-3_9-11_17-19,
  1527. * 4,5,6,7,12,13,14,15,20,21,22,23
  1528. */
  1529. { {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 18, 18, 18, 14} },
  1530. { {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 18, 18, 18, 14} },
  1531. { {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 16, 16, 16, 12} },
  1532. { {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 16, 16, 16, 12} },
  1533. { {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 14, 14, 14, 10} },
  1534. { {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 14, 14, 14, 10} },
  1535. { {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 12, 12, 12, 8} },
  1536. { {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 12, 12, 12, 8} },
  1537. },
  1538. .ctlIndex_5G = {
  1539. 0x10, 0x16, 0x18, 0x40, 0x46,
  1540. 0x48, 0x30, 0x36, 0x38
  1541. },
  1542. .ctl_freqbin_5G = {
  1543. {
  1544. /* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  1545. /* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
  1546. /* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
  1547. /* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
  1548. /* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
  1549. /* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
  1550. /* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
  1551. /* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
  1552. },
  1553. {
  1554. /* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  1555. /* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
  1556. /* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
  1557. /* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
  1558. /* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
  1559. /* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
  1560. /* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
  1561. /* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
  1562. },
  1563. {
  1564. /* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
  1565. /* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
  1566. /* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
  1567. /* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
  1568. /* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
  1569. /* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
  1570. /* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
  1571. /* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
  1572. },
  1573. {
  1574. /* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  1575. /* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
  1576. /* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
  1577. /* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
  1578. /* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
  1579. /* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
  1580. /* Data[3].ctlEdges[6].bChannel */ 0xFF,
  1581. /* Data[3].ctlEdges[7].bChannel */ 0xFF,
  1582. },
  1583. {
  1584. /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  1585. /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
  1586. /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
  1587. /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
  1588. /* Data[4].ctlEdges[4].bChannel */ 0xFF,
  1589. /* Data[4].ctlEdges[5].bChannel */ 0xFF,
  1590. /* Data[4].ctlEdges[6].bChannel */ 0xFF,
  1591. /* Data[4].ctlEdges[7].bChannel */ 0xFF,
  1592. },
  1593. {
  1594. /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
  1595. /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
  1596. /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
  1597. /* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
  1598. /* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
  1599. /* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
  1600. /* Data[5].ctlEdges[6].bChannel */ 0xFF,
  1601. /* Data[5].ctlEdges[7].bChannel */ 0xFF
  1602. },
  1603. {
  1604. /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  1605. /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
  1606. /* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
  1607. /* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
  1608. /* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
  1609. /* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
  1610. /* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
  1611. /* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
  1612. },
  1613. {
  1614. /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
  1615. /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
  1616. /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
  1617. /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
  1618. /* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
  1619. /* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
  1620. /* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
  1621. /* Data[7].ctlEdges[7].bChannel */ FRE