020-19-rt2x00-add-support-for-MT7620.patch 72 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064
  1. From 41977e86c984fcdddb454a3d7887de5d47b5f530 Mon Sep 17 00:00:00 2001
  2. From: Roman Yeryomin <[email protected]>
  3. Date: Tue, 21 Mar 2017 00:43:00 +0100
  4. Subject: [PATCH 19/19] rt2x00: add support for MT7620
  5. Basic support for MT7620 built-in wireless radio was added to
  6. OpenWrt in r41441. It has seen some heavy cleaning and refactoring
  7. since in order to match the Kernel's code quality standards.
  8. Signed-off-by: Roman Yeryomin <[email protected]>
  9. Signed-off-by: Daniel Golle <[email protected]>
  10. Acked-by: Stanislaw Gruszka <[email protected]>
  11. Signed-off-by: Kalle Valo <[email protected]>
  12. ---
  13. drivers/net/wireless/ralink/rt2x00/Kconfig | 2 +-
  14. drivers/net/wireless/ralink/rt2x00/rt2800.h | 177 +++
  15. drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 1421 +++++++++++++++++++++++-
  16. drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 4 +
  17. drivers/net/wireless/ralink/rt2x00/rt2x00.h | 1 +
  18. 5 files changed, 1578 insertions(+), 27 deletions(-)
  19. --- a/drivers/net/wireless/ralink/rt2x00/Kconfig
  20. +++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
  21. @@ -210,7 +210,7 @@ endif
  22. config RT2800SOC
  23. tristate "Ralink WiSoC support"
  24. depends on m
  25. - depends on SOC_RT288X || SOC_RT305X
  26. + depends on SOC_RT288X || SOC_RT305X || SOC_MT7620
  27. select RT2X00_LIB_SOC
  28. select RT2X00_LIB_MMIO
  29. select RT2X00_LIB_CRYPTO
  30. --- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
  31. +++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
  32. @@ -79,6 +79,7 @@
  33. #define RF5372 0x5372
  34. #define RF5390 0x5390
  35. #define RF5392 0x5392
  36. +#define RF7620 0x7620
  37. /*
  38. * Chipset revisions.
  39. @@ -639,6 +640,24 @@
  40. #define RF_CSR_CFG_BUSY FIELD32(0x00020000)
  41. /*
  42. + * MT7620 RF registers (reversed order)
  43. + */
  44. +#define RF_CSR_CFG_DATA_MT7620 FIELD32(0x0000ff00)
  45. +#define RF_CSR_CFG_REGNUM_MT7620 FIELD32(0x03ff0000)
  46. +#define RF_CSR_CFG_WRITE_MT7620 FIELD32(0x00000010)
  47. +#define RF_CSR_CFG_BUSY_MT7620 FIELD32(0x00000001)
  48. +
  49. +/* undocumented registers for calibration of new MAC */
  50. +#define RF_CONTROL0 0x0518
  51. +#define RF_BYPASS0 0x051c
  52. +#define RF_CONTROL1 0x0520
  53. +#define RF_BYPASS1 0x0524
  54. +#define RF_CONTROL2 0x0528
  55. +#define RF_BYPASS2 0x052c
  56. +#define RF_CONTROL3 0x0530
  57. +#define RF_BYPASS3 0x0534
  58. +
  59. +/*
  60. * EFUSE_CSR: RT30x0 EEPROM
  61. */
  62. #define EFUSE_CTRL 0x0580
  63. @@ -1022,6 +1041,16 @@
  64. #define AUTOWAKEUP_CFG_AUTOWAKE FIELD32(0x00008000)
  65. /*
  66. + * MIMO_PS_CFG: MIMO Power-save Configuration
  67. + */
  68. +#define MIMO_PS_CFG 0x1210
  69. +#define MIMO_PS_CFG_MMPS_BB_EN FIELD32(0x00000001)
  70. +#define MIMO_PS_CFG_MMPS_RX_ANT_NUM FIELD32(0x00000006)
  71. +#define MIMO_PS_CFG_MMPS_RF_EN FIELD32(0x00000008)
  72. +#define MIMO_PS_CFG_RX_STBY_POL FIELD32(0x00000010)
  73. +#define MIMO_PS_CFG_RX_RX_STBY0 FIELD32(0x00000020)
  74. +
  75. +/*
  76. * EDCA_AC0_CFG:
  77. */
  78. #define EDCA_AC0_CFG 0x1300
  79. @@ -1095,6 +1124,12 @@
  80. #define TX_PWR_CFG_0_OFDM6_CH1 FIELD32(0x00f00000)
  81. #define TX_PWR_CFG_0_OFDM12_CH0 FIELD32(0x0f000000)
  82. #define TX_PWR_CFG_0_OFDM12_CH1 FIELD32(0xf0000000)
  83. +/* bits for new 2T devices */
  84. +#define TX_PWR_CFG_0B_1MBS_2MBS FIELD32(0x000000ff)
  85. +#define TX_PWR_CFG_0B_5MBS_11MBS FIELD32(0x0000ff00)
  86. +#define TX_PWR_CFG_0B_6MBS_9MBS FIELD32(0x00ff0000)
  87. +#define TX_PWR_CFG_0B_12MBS_18MBS FIELD32(0xff000000)
  88. +
  89. /*
  90. * TX_PWR_CFG_1:
  91. @@ -1117,6 +1152,11 @@
  92. #define TX_PWR_CFG_1_MCS0_CH1 FIELD32(0x00f00000)
  93. #define TX_PWR_CFG_1_MCS2_CH0 FIELD32(0x0f000000)
  94. #define TX_PWR_CFG_1_MCS2_CH1 FIELD32(0xf0000000)
  95. +/* bits for new 2T devices */
  96. +#define TX_PWR_CFG_1B_24MBS_36MBS FIELD32(0x000000ff)
  97. +#define TX_PWR_CFG_1B_48MBS FIELD32(0x0000ff00)
  98. +#define TX_PWR_CFG_1B_MCS0_MCS1 FIELD32(0x00ff0000)
  99. +#define TX_PWR_CFG_1B_MCS2_MCS3 FIELD32(0xff000000)
  100. /*
  101. * TX_PWR_CFG_2:
  102. @@ -1139,6 +1179,11 @@
  103. #define TX_PWR_CFG_2_MCS8_CH1 FIELD32(0x00f00000)
  104. #define TX_PWR_CFG_2_MCS10_CH0 FIELD32(0x0f000000)
  105. #define TX_PWR_CFG_2_MCS10_CH1 FIELD32(0xf0000000)
  106. +/* bits for new 2T devices */
  107. +#define TX_PWR_CFG_2B_MCS4_MCS5 FIELD32(0x000000ff)
  108. +#define TX_PWR_CFG_2B_MCS6_MCS7 FIELD32(0x0000ff00)
  109. +#define TX_PWR_CFG_2B_MCS8_MCS9 FIELD32(0x00ff0000)
  110. +#define TX_PWR_CFG_2B_MCS10_MCS11 FIELD32(0xff000000)
  111. /*
  112. * TX_PWR_CFG_3:
  113. @@ -1161,6 +1206,11 @@
  114. #define TX_PWR_CFG_3_STBC0_CH1 FIELD32(0x00f00000)
  115. #define TX_PWR_CFG_3_STBC2_CH0 FIELD32(0x0f000000)
  116. #define TX_PWR_CFG_3_STBC2_CH1 FIELD32(0xf0000000)
  117. +/* bits for new 2T devices */
  118. +#define TX_PWR_CFG_3B_MCS12_MCS13 FIELD32(0x000000ff)
  119. +#define TX_PWR_CFG_3B_MCS14 FIELD32(0x0000ff00)
  120. +#define TX_PWR_CFG_3B_STBC_MCS0_MCS1 FIELD32(0x00ff0000)
  121. +#define TX_PWR_CFG_3B_STBC_MCS2_MSC3 FIELD32(0xff000000)
  122. /*
  123. * TX_PWR_CFG_4:
  124. @@ -1175,6 +1225,9 @@
  125. #define TX_PWR_CFG_4_STBC4_CH1 FIELD32(0x000000f0)
  126. #define TX_PWR_CFG_4_STBC6_CH0 FIELD32(0x00000f00)
  127. #define TX_PWR_CFG_4_STBC6_CH1 FIELD32(0x0000f000)
  128. +/* bits for new 2T devices */
  129. +#define TX_PWR_CFG_4B_STBC_MCS4_MCS5 FIELD32(0x000000ff)
  130. +#define TX_PWR_CFG_4B_STBC_MCS6 FIELD32(0x0000ff00)
  131. /*
  132. * TX_PIN_CFG:
  133. @@ -1201,6 +1254,8 @@
  134. #define TX_PIN_CFG_RFTR_POL FIELD32(0x00020000)
  135. #define TX_PIN_CFG_TRSW_EN FIELD32(0x00040000)
  136. #define TX_PIN_CFG_TRSW_POL FIELD32(0x00080000)
  137. +#define TX_PIN_CFG_RFRX_EN FIELD32(0x00100000)
  138. +#define TX_PIN_CFG_RFRX_POL FIELD32(0x00200000)
  139. #define TX_PIN_CFG_PA_PE_A2_EN FIELD32(0x01000000)
  140. #define TX_PIN_CFG_PA_PE_G2_EN FIELD32(0x02000000)
  141. #define TX_PIN_CFG_PA_PE_A2_POL FIELD32(0x04000000)
  142. @@ -1547,6 +1602,95 @@
  143. #define TX_PWR_CFG_4_EXT_STBC4_CH2 FIELD32(0x0000000f)
  144. #define TX_PWR_CFG_4_EXT_STBC6_CH2 FIELD32(0x00000f00)
  145. +/* TXn_RF_GAIN_CORRECT: RF Gain Correction for each RF_ALC[3:2]
  146. + * Unit: 0.1 dB, Range: -3.2 dB to 3.1 dB
  147. + */
  148. +#define TX0_RF_GAIN_CORRECT 0x13a0
  149. +#define TX0_RF_GAIN_CORRECT_GAIN_CORR_0 FIELD32(0x0000003f)
  150. +#define TX0_RF_GAIN_CORRECT_GAIN_CORR_1 FIELD32(0x00003f00)
  151. +#define TX0_RF_GAIN_CORRECT_GAIN_CORR_2 FIELD32(0x003f0000)
  152. +#define TX0_RF_GAIN_CORRECT_GAIN_CORR_3 FIELD32(0x3f000000)
  153. +
  154. +#define TX1_RF_GAIN_CORRECT 0x13a4
  155. +#define TX1_RF_GAIN_CORRECT_GAIN_CORR_0 FIELD32(0x0000003f)
  156. +#define TX1_RF_GAIN_CORRECT_GAIN_CORR_1 FIELD32(0x00003f00)
  157. +#define TX1_RF_GAIN_CORRECT_GAIN_CORR_2 FIELD32(0x003f0000)
  158. +#define TX1_RF_GAIN_CORRECT_GAIN_CORR_3 FIELD32(0x3f000000)
  159. +
  160. +/* TXn_RF_GAIN_ATTEN: TXn RF Gain Attenuation Level
  161. + * Format: 7-bit, signed value
  162. + * Unit: 0.5 dB, Range: -20 dB to -5 dB
  163. + */
  164. +#define TX0_RF_GAIN_ATTEN 0x13a8
  165. +#define TX0_RF_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000007f)
  166. +#define TX0_RF_GAIN_ATTEN_LEVEL_1 FIELD32(0x00007f00)
  167. +#define TX0_RF_GAIN_ATTEN_LEVEL_2 FIELD32(0x007f0000)
  168. +#define TX0_RF_GAIN_ATTEN_LEVEL_3 FIELD32(0x7f000000)
  169. +#define TX1_RF_GAIN_ATTEN 0x13ac
  170. +#define TX1_RF_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000007f)
  171. +#define TX1_RF_GAIN_ATTEN_LEVEL_1 FIELD32(0x00007f00)
  172. +#define TX1_RF_GAIN_ATTEN_LEVEL_2 FIELD32(0x007f0000)
  173. +#define TX1_RF_GAIN_ATTEN_LEVEL_3 FIELD32(0x7f000000)
  174. +
  175. +/* TX_ALC_CFG_0: TX Automatic Level Control Configuration 0
  176. + * TX_ALC_LIMIT_n: TXn upper limit
  177. + * TX_ALC_CH_INIT_n: TXn channel initial transmission gain
  178. + * Unit: 0.5 dB, Range: 0 to 23.5 dB
  179. + */
  180. +#define TX_ALC_CFG_0 0x13b0
  181. +#define TX_ALC_CFG_0_CH_INIT_0 FIELD32(0x0000003f)
  182. +#define TX_ALC_CFG_0_CH_INIT_1 FIELD32(0x00003f00)
  183. +#define TX_ALC_CFG_0_LIMIT_0 FIELD32(0x003f0000)
  184. +#define TX_ALC_CFG_0_LIMIT_1 FIELD32(0x3f000000)
  185. +
  186. +/* TX_ALC_CFG_1: TX Automatic Level Control Configuration 1
  187. + * TX_TEMP_COMP: TX Power Temperature Compensation
  188. + * Unit: 0.5 dB, Range: -10 dB to 10 dB
  189. + * TXn_GAIN_FINE: TXn Gain Fine Adjustment
  190. + * Unit: 0.1 dB, Range: -0.8 dB to 0.7 dB
  191. + * RF_TOS_DLY: Sets the RF_TOS_EN assertion delay after
  192. + * deassertion of PA_PE.
  193. + * Unit: 0.25 usec
  194. + * TXn_RF_GAIN_ATTEN: TXn RF gain attentuation selector
  195. + * RF_TOS_TIMEOUT: time-out value for RF_TOS_ENABLE
  196. + * deassertion if RF_TOS_DONE is missing.
  197. + * Unit: 0.25 usec
  198. + * RF_TOS_ENABLE: TX offset calibration enable
  199. + * ROS_BUSY_EN: RX offset calibration busy enable
  200. + */
  201. +#define TX_ALC_CFG_1 0x13b4
  202. +#define TX_ALC_CFG_1_TX_TEMP_COMP FIELD32(0x0000003f)
  203. +#define TX_ALC_CFG_1_TX0_GAIN_FINE FIELD32(0x00000f00)
  204. +#define TX_ALC_CFG_1_TX1_GAIN_FINE FIELD32(0x0000f000)
  205. +#define TX_ALC_CFG_1_RF_TOS_DLY FIELD32(0x00070000)
  206. +#define TX_ALC_CFG_1_TX0_RF_GAIN_ATTEN FIELD32(0x00300000)
  207. +#define TX_ALC_CFG_1_TX1_RF_GAIN_ATTEN FIELD32(0x00c00000)
  208. +#define TX_ALC_CFG_1_RF_TOS_TIMEOUT FIELD32(0x3f000000)
  209. +#define TX_ALC_CFG_1_RF_TOS_ENABLE FIELD32(0x40000000)
  210. +#define TX_ALC_CFG_1_ROS_BUSY_EN FIELD32(0x80000000)
  211. +
  212. +/* TXn_BB_GAIN_ATTEN: TXn RF Gain Attenuation Level
  213. + * Format: 5-bit signed values
  214. + * Unit: 0.5 dB, Range: -8 dB to 7 dB
  215. + */
  216. +#define TX0_BB_GAIN_ATTEN 0x13c0
  217. +#define TX0_BB_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000001f)
  218. +#define TX0_BB_GAIN_ATTEN_LEVEL_1 FIELD32(0x00001f00)
  219. +#define TX0_BB_GAIN_ATTEN_LEVEL_2 FIELD32(0x001f0000)
  220. +#define TX0_BB_GAIN_ATTEN_LEVEL_3 FIELD32(0x1f000000)
  221. +#define TX1_BB_GAIN_ATTEN 0x13c4
  222. +#define TX1_BB_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000001f)
  223. +#define TX1_BB_GAIN_ATTEN_LEVEL_1 FIELD32(0x00001f00)
  224. +#define TX1_BB_GAIN_ATTEN_LEVEL_2 FIELD32(0x001f0000)
  225. +#define TX1_BB_GAIN_ATTEN_LEVEL_3 FIELD32(0x1f000000)
  226. +
  227. +/* TX_ALC_VGA3: TX Automatic Level Correction Variable Gain Amplifier 3 */
  228. +#define TX_ALC_VGA3 0x13c8
  229. +#define TX_ALC_VGA3_TX0_ALC_VGA3 FIELD32(0x0000001f)
  230. +#define TX_ALC_VGA3_TX1_ALC_VGA3 FIELD32(0x00001f00)
  231. +#define TX_ALC_VGA3_TX0_ALC_VGA2 FIELD32(0x001f0000)
  232. +#define TX_ALC_VGA3_TX1_ALC_VGA2 FIELD32(0x1f000000)
  233. +
  234. /* TX_PWR_CFG_7 */
  235. #define TX_PWR_CFG_7 0x13d4
  236. #define TX_PWR_CFG_7_OFDM54_CH0 FIELD32(0x0000000f)
  237. @@ -1555,6 +1699,10 @@
  238. #define TX_PWR_CFG_7_MCS7_CH0 FIELD32(0x000f0000)
  239. #define TX_PWR_CFG_7_MCS7_CH1 FIELD32(0x00f00000)
  240. #define TX_PWR_CFG_7_MCS7_CH2 FIELD32(0x0f000000)
  241. +/* bits for new 2T devices */
  242. +#define TX_PWR_CFG_7B_54MBS FIELD32(0x000000ff)
  243. +#define TX_PWR_CFG_7B_MCS7 FIELD32(0x00ff0000)
  244. +
  245. /* TX_PWR_CFG_8 */
  246. #define TX_PWR_CFG_8 0x13d8
  247. @@ -1564,12 +1712,17 @@
  248. #define TX_PWR_CFG_8_MCS23_CH0 FIELD32(0x000f0000)
  249. #define TX_PWR_CFG_8_MCS23_CH1 FIELD32(0x00f00000)
  250. #define TX_PWR_CFG_8_MCS23_CH2 FIELD32(0x0f000000)
  251. +/* bits for new 2T devices */
  252. +#define TX_PWR_CFG_8B_MCS15 FIELD32(0x000000ff)
  253. +
  254. /* TX_PWR_CFG_9 */
  255. #define TX_PWR_CFG_9 0x13dc
  256. #define TX_PWR_CFG_9_STBC7_CH0 FIELD32(0x0000000f)
  257. #define TX_PWR_CFG_9_STBC7_CH1 FIELD32(0x000000f0)
  258. #define TX_PWR_CFG_9_STBC7_CH2 FIELD32(0x00000f00)
  259. +/* bits for new 2T devices */
  260. +#define TX_PWR_CFG_9B_STBC_MCS7 FIELD32(0x000000ff)
  261. /*
  262. * RX_FILTER_CFG: RX configuration register.
  263. @@ -2137,11 +2290,14 @@ struct mac_iveiv_entry {
  264. #define RFCSR1_TX1_PD FIELD8(0x20)
  265. #define RFCSR1_RX2_PD FIELD8(0x40)
  266. #define RFCSR1_TX2_PD FIELD8(0x80)
  267. +#define RFCSR1_TX2_EN_MT7620 FIELD8(0x02)
  268. /*
  269. * RFCSR 2:
  270. */
  271. #define RFCSR2_RESCAL_EN FIELD8(0x80)
  272. +#define RFCSR2_RX2_EN_MT7620 FIELD8(0x02)
  273. +#define RFCSR2_TX2_EN_MT7620 FIELD8(0x20)
  274. /*
  275. * RFCSR 3:
  276. @@ -2160,6 +2316,12 @@ struct mac_iveiv_entry {
  277. #define RFCSR3_BIT5 FIELD8(0x20)
  278. /*
  279. + * RFCSR 4:
  280. + * VCOCAL_EN used by MT7620
  281. + */
  282. +#define RFCSR4_VCOCAL_EN FIELD8(0x80)
  283. +
  284. +/*
  285. * FRCSR 5:
  286. */
  287. #define RFCSR5_R1 FIELD8(0x0c)
  288. @@ -2214,6 +2376,7 @@ struct mac_iveiv_entry {
  289. */
  290. #define RFCSR13_TX_POWER FIELD8(0x1f)
  291. #define RFCSR13_DR0 FIELD8(0xe0)
  292. +#define RFCSR13_RDIV_MT7620 FIELD8(0x03)
  293. /*
  294. * RFCSR 15:
  295. @@ -2224,6 +2387,8 @@ struct mac_iveiv_entry {
  296. * RFCSR 16:
  297. */
  298. #define RFCSR16_TXMIXER_GAIN FIELD8(0x07)
  299. +#define RFCSR16_RF_PLL_FREQ_SEL_MT7620 FIELD8(0x0F)
  300. +#define RFCSR16_SDM_MODE_MT7620 FIELD8(0xE0)
  301. /*
  302. * RFCSR 17:
  303. @@ -2236,6 +2401,8 @@ struct mac_iveiv_entry {
  304. /* RFCSR 18 */
  305. #define RFCSR18_XO_TUNE_BYPASS FIELD8(0x40)
  306. +/* RFCSR 19 */
  307. +#define RFCSR19_K FIELD8(0x03)
  308. /*
  309. * RFCSR 20:
  310. @@ -2246,11 +2413,14 @@ struct mac_iveiv_entry {
  311. * RFCSR 21:
  312. */
  313. #define RFCSR21_RX_LO2_EN FIELD8(0x08)
  314. +#define RFCSR21_BIT1 FIELD8(0x01)
  315. +#define RFCSR21_BIT8 FIELD8(0x80)
  316. /*
  317. * RFCSR 22:
  318. */
  319. #define RFCSR22_BASEBAND_LOOPBACK FIELD8(0x01)
  320. +#define RFCSR22_FREQPLAN_D_MT7620 FIELD8(0x07)
  321. /*
  322. * RFCSR 23:
  323. @@ -2273,6 +2443,11 @@ struct mac_iveiv_entry {
  324. #define RFCSR27_R4 FIELD8(0x40)
  325. /*
  326. + * RFCSR 28:
  327. + */
  328. +#define RFCSR28_CH11_HT40 FIELD8(0x04)
  329. +
  330. +/*
  331. * RFCSR 29:
  332. */
  333. #define RFCSR29_ADC6_TEST FIELD8(0x01)
  334. @@ -2333,6 +2508,7 @@ struct mac_iveiv_entry {
  335. */
  336. #define RFCSR42_BIT1 FIELD8(0x01)
  337. #define RFCSR42_BIT4 FIELD8(0x08)
  338. +#define RFCSR42_TX2_EN_MT7620 FIELD8(0x40)
  339. /*
  340. * RFCSR 49:
  341. @@ -2435,6 +2611,7 @@ enum rt2800_eeprom_word {
  342. EEPROM_TSSI_BOUND_BG5,
  343. EEPROM_TXPOWER_A1,
  344. EEPROM_TXPOWER_A2,
  345. + EEPROM_TXPOWER_INIT,
  346. EEPROM_TSSI_BOUND_A1,
  347. EEPROM_TSSI_BOUND_A2,
  348. EEPROM_TSSI_BOUND_A3,
  349. --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
  350. +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
  351. @@ -59,6 +59,9 @@
  352. rt2800_regbusy_read((__dev), BBP_CSR_CFG, BBP_CSR_CFG_BUSY, (__reg))
  353. #define WAIT_FOR_RFCSR(__dev, __reg) \
  354. rt2800_regbusy_read((__dev), RF_CSR_CFG, RF_CSR_CFG_BUSY, (__reg))
  355. +#define WAIT_FOR_RFCSR_MT7620(__dev, __reg) \
  356. + rt2800_regbusy_read((__dev), RF_CSR_CFG, RF_CSR_CFG_BUSY_MT7620, \
  357. + (__reg))
  358. #define WAIT_FOR_RF(__dev, __reg) \
  359. rt2800_regbusy_read((__dev), RF_CSR_CFG0, RF_CSR_CFG0_BUSY, (__reg))
  360. #define WAIT_FOR_MCU(__dev, __reg) \
  361. @@ -150,19 +153,56 @@ static void rt2800_rfcsr_write(struct rt
  362. * Wait until the RFCSR becomes available, afterwards we
  363. * can safely write the new data into the register.
  364. */
  365. - if (WAIT_FOR_RFCSR(rt2x00dev, &reg)) {
  366. - reg = 0;
  367. - rt2x00_set_field32(&reg, RF_CSR_CFG_DATA, value);
  368. - rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM, word);
  369. - rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE, 1);
  370. - rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY, 1);
  371. + switch (rt2x00dev->chip.rt) {
  372. + case RT6352:
  373. + if (WAIT_FOR_RFCSR_MT7620(rt2x00dev, &reg)) {
  374. + reg = 0;
  375. + rt2x00_set_field32(&reg, RF_CSR_CFG_DATA_MT7620, value);
  376. + rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM_MT7620,
  377. + word);
  378. + rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE_MT7620, 1);
  379. + rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY_MT7620, 1);
  380. +
  381. + rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
  382. + }
  383. + break;
  384. +
  385. + default:
  386. + if (WAIT_FOR_RFCSR(rt2x00dev, &reg)) {
  387. + reg = 0;
  388. + rt2x00_set_field32(&reg, RF_CSR_CFG_DATA, value);
  389. + rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM, word);
  390. + rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE, 1);
  391. + rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY, 1);
  392. - rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
  393. + rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
  394. + }
  395. + break;
  396. }
  397. mutex_unlock(&rt2x00dev->csr_mutex);
  398. }
  399. +static void rt2800_rfcsr_write_bank(struct rt2x00_dev *rt2x00dev, const u8 bank,
  400. + const unsigned int reg, const u8 value)
  401. +{
  402. + rt2800_rfcsr_write(rt2x00dev, (reg | (bank << 6)), value);
  403. +}
  404. +
  405. +static void rt2800_rfcsr_write_chanreg(struct rt2x00_dev *rt2x00dev,
  406. + const unsigned int reg, const u8 value)
  407. +{
  408. + rt2800_rfcsr_write_bank(rt2x00dev, 4, reg, value);
  409. + rt2800_rfcsr_write_bank(rt2x00dev, 6, reg, value);
  410. +}
  411. +
  412. +static void rt2800_rfcsr_write_dccal(struct rt2x00_dev *rt2x00dev,
  413. + const unsigned int reg, const u8 value)
  414. +{
  415. + rt2800_rfcsr_write_bank(rt2x00dev, 5, reg, value);
  416. + rt2800_rfcsr_write_bank(rt2x00dev, 7, reg, value);
  417. +}
  418. +
  419. static void rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev,
  420. const unsigned int word, u8 *value)
  421. {
  422. @@ -178,22 +218,48 @@ static void rt2800_rfcsr_read(struct rt2
  423. * doesn't become available in time, reg will be 0xffffffff
  424. * which means we return 0xff to the caller.
  425. */
  426. - if (WAIT_FOR_RFCSR(rt2x00dev, &reg)) {
  427. - reg = 0;
  428. - rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM, word);
  429. - rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE, 0);
  430. - rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY, 1);
  431. + switch (rt2x00dev->chip.rt) {
  432. + case RT6352:
  433. + if (WAIT_FOR_RFCSR_MT7620(rt2x00dev, &reg)) {
  434. + reg = 0;
  435. + rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM_MT7620,
  436. + word);
  437. + rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE_MT7620, 0);
  438. + rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY_MT7620, 1);
  439. - rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
  440. + rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
  441. - WAIT_FOR_RFCSR(rt2x00dev, &reg);
  442. - }
  443. + WAIT_FOR_RFCSR_MT7620(rt2x00dev, &reg);
  444. + }
  445. +
  446. + *value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA_MT7620);
  447. + break;
  448. - *value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA);
  449. + default:
  450. + if (WAIT_FOR_RFCSR(rt2x00dev, &reg)) {
  451. + reg = 0;
  452. + rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM, word);
  453. + rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE, 0);
  454. + rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY, 1);
  455. +
  456. + rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
  457. +
  458. + WAIT_FOR_RFCSR(rt2x00dev, &reg);
  459. + }
  460. +
  461. + *value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA);
  462. + break;
  463. + }
  464. mutex_unlock(&rt2x00dev->csr_mutex);
  465. }
  466. +static void rt2800_rfcsr_read_bank(struct rt2x00_dev *rt2x00dev, const u8 bank,
  467. + const unsigned int reg, u8 *value)
  468. +{
  469. + rt2800_rfcsr_read(rt2x00dev, (reg | (bank << 6)), value);
  470. +}
  471. +
  472. static void rt2800_rf_write(struct rt2x00_dev *rt2x00dev,
  473. const unsigned int word, const u32 value)
  474. {
  475. @@ -250,6 +316,7 @@ static const unsigned int rt2800_eeprom_
  476. [EEPROM_TSSI_BOUND_BG5] = 0x003b,
  477. [EEPROM_TXPOWER_A1] = 0x003c,
  478. [EEPROM_TXPOWER_A2] = 0x0053,
  479. + [EEPROM_TXPOWER_INIT] = 0x0068,
  480. [EEPROM_TSSI_BOUND_A1] = 0x006a,
  481. [EEPROM_TSSI_BOUND_A2] = 0x006b,
  482. [EEPROM_TSSI_BOUND_A3] = 0x006c,
  483. @@ -524,6 +591,7 @@ void rt2800_get_txwi_rxwi_size(struct rt
  484. break;
  485. case RT5592:
  486. + case RT6352:
  487. *txwi_size = TXWI_DESC_SIZE_5WORDS;
  488. *rxwi_size = RXWI_DESC_SIZE_6WORDS;
  489. break;
  490. @@ -2810,7 +2878,8 @@ static void rt2800_config_channel_rf53xx
  491. rt2800_rfcsr_write(rt2x00dev, 59,
  492. r59_nonbt_rev[idx]);
  493. } else if (rt2x00_rt(rt2x00dev, RT5390) ||
  494. - rt2x00_rt(rt2x00dev, RT5392)) {
  495. + rt2x00_rt(rt2x00dev, RT5392) ||
  496. + rt2x00_rt(rt2x00dev, RT6352)) {
  497. static const char r59_non_bt[] = {0x8f, 0x8f,
  498. 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
  499. 0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
  500. @@ -3104,6 +3173,242 @@ static void rt2800_config_channel_rf55xx
  501. rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x19 : 0x7F);
  502. }
  503. +static void rt2800_config_channel_rf7620(struct rt2x00_dev *rt2x00dev,
  504. + struct ieee80211_conf *conf,
  505. + struct rf_channel *rf,
  506. + struct channel_info *info)
  507. +{
  508. + struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
  509. + u8 rx_agc_fc, tx_agc_fc;
  510. + u8 rfcsr;
  511. +
  512. + /* Frequeny plan setting */
  513. + /* Rdiv setting (set 0x03 if Xtal==20)
  514. + * R13[1:0]
  515. + */
  516. + rt2800_rfcsr_read(rt2x00dev, 13, &rfcsr);
  517. + rt2x00_set_field8(&rfcsr, RFCSR13_RDIV_MT7620,
  518. + rt2800_clk_is_20mhz(rt2x00dev) ? 3 : 0);
  519. + rt2800_rfcsr_write(rt2x00dev, 13, rfcsr);
  520. +
  521. + /* N setting
  522. + * R20[7:0] in rf->rf1
  523. + * R21[0] always 0
  524. + */
  525. + rt2800_rfcsr_read(rt2x00dev, 20, &rfcsr);
  526. + rfcsr = (rf->rf1 & 0x00ff);
  527. + rt2800_rfcsr_write(rt2x00dev, 20, rfcsr);
  528. +
  529. + rt2800_rfcsr_read(rt2x00dev, 21, &rfcsr);
  530. + rt2x00_set_field8(&rfcsr, RFCSR21_BIT1, 0);
  531. + rt2800_rfcsr_write(rt2x00dev, 21, rfcsr);
  532. +
  533. + /* K setting (always 0)
  534. + * R16[3:0] (RF PLL freq selection)
  535. + */
  536. + rt2800_rfcsr_read(rt2x00dev, 16, &rfcsr);
  537. + rt2x00_set_field8(&rfcsr, RFCSR16_RF_PLL_FREQ_SEL_MT7620, 0);
  538. + rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
  539. +
  540. + /* D setting (always 0)
  541. + * R22[2:0] (D=15, R22[2:0]=<111>)
  542. + */
  543. + rt2800_rfcsr_read(rt2x00dev, 22, &rfcsr);
  544. + rt2x00_set_field8(&rfcsr, RFCSR22_FREQPLAN_D_MT7620, 0);
  545. + rt2800_rfcsr_write(rt2x00dev, 22, rfcsr);
  546. +
  547. + /* Ksd setting
  548. + * Ksd: R17<7:0> in rf->rf2
  549. + * R18<7:0> in rf->rf3
  550. + * R19<1:0> in rf->rf4
  551. + */
  552. + rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
  553. + rfcsr = rf->rf2;
  554. + rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
  555. +
  556. + rt2800_rfcsr_read(rt2x00dev, 18, &rfcsr);
  557. + rfcsr = rf->rf3;
  558. + rt2800_rfcsr_write(rt2x00dev, 18, rfcsr);
  559. +
  560. + rt2800_rfcsr_read(rt2x00dev, 19, &rfcsr);
  561. + rt2x00_set_field8(&rfcsr, RFCSR19_K, rf->rf4);
  562. + rt2800_rfcsr_write(rt2x00dev, 19, rfcsr);
  563. +
  564. + /* Default: XO=20MHz , SDM mode */
  565. + rt2800_rfcsr_read(rt2x00dev, 16, &rfcsr);
  566. + rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80);
  567. + rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
  568. +
  569. + rt2800_rfcsr_read(rt2x00dev, 21, &rfcsr);
  570. + rt2x00_set_field8(&rfcsr, RFCSR21_BIT8, 1);
  571. + rt2800_rfcsr_write(rt2x00dev, 21, rfcsr);
  572. +
  573. + rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
  574. + rt2x00_set_field8(&rfcsr, RFCSR1_TX2_EN_MT7620,
  575. + rt2x00dev->default_ant.tx_chain_num != 1);
  576. + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
  577. +
  578. + rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
  579. + rt2x00_set_field8(&rfcsr, RFCSR2_TX2_EN_MT7620,
  580. + rt2x00dev->default_ant.tx_chain_num != 1);
  581. + rt2x00_set_field8(&rfcsr, RFCSR2_RX2_EN_MT7620,
  582. + rt2x00dev->default_ant.rx_chain_num != 1);
  583. + rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
  584. +
  585. + rt2800_rfcsr_read(rt2x00dev, 42, &rfcsr);
  586. + rt2x00_set_field8(&rfcsr, RFCSR42_TX2_EN_MT7620,
  587. + rt2x00dev->default_ant.tx_chain_num != 1);
  588. + rt2800_rfcsr_write(rt2x00dev, 42, rfcsr);
  589. +
  590. + /* RF for DC Cal BW */
  591. + if (conf_is_ht40(conf)) {
  592. + rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x10);
  593. + rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x10);
  594. + rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x04);
  595. + rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x10);
  596. + rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x10);
  597. + } else {
  598. + rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x20);
  599. + rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x20);
  600. + rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x00);
  601. + rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x20);
  602. + rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x20);
  603. + }
  604. +
  605. + if (conf_is_ht40(conf)) {
  606. + rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x08);
  607. + rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x08);
  608. + } else {
  609. + rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x28);
  610. + rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x28);
  611. + }
  612. +
  613. + rt2800_rfcsr_read(rt2x00dev, 28, &rfcsr);
  614. + rt2x00_set_field8(&rfcsr, RFCSR28_CH11_HT40,
  615. + conf_is_ht40(conf) && (rf->channel == 11));
  616. + rt2800_rfcsr_write(rt2x00dev, 28, rfcsr);
  617. +
  618. + if (!test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags)) {
  619. + if (conf_is_ht40(conf)) {
  620. + rx_agc_fc = drv_data->rx_calibration_bw40;
  621. + tx_agc_fc = drv_data->tx_calibration_bw40;
  622. + } else {
  623. + rx_agc_fc = drv_data->rx_calibration_bw20;
  624. + tx_agc_fc = drv_data->tx_calibration_bw20;
  625. + }
  626. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 6, &rfcsr);
  627. + rfcsr &= (~0x3F);
  628. + rfcsr |= rx_agc_fc;
  629. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rfcsr);
  630. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 7, &rfcsr);
  631. + rfcsr &= (~0x3F);
  632. + rfcsr |= rx_agc_fc;
  633. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rfcsr);
  634. + rt2800_rfcsr_read_bank(rt2x00dev, 7, 6, &rfcsr);
  635. + rfcsr &= (~0x3F);
  636. + rfcsr |= rx_agc_fc;
  637. + rt2800_rfcsr_write_bank(rt2x00dev, 7, 6, rfcsr);
  638. + rt2800_rfcsr_read_bank(rt2x00dev, 7, 7, &rfcsr);
  639. + rfcsr &= (~0x3F);
  640. + rfcsr |= rx_agc_fc;
  641. + rt2800_rfcsr_write_bank(rt2x00dev, 7, 7, rfcsr);
  642. +
  643. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 58, &rfcsr);
  644. + rfcsr &= (~0x3F);
  645. + rfcsr |= tx_agc_fc;
  646. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rfcsr);
  647. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 59, &rfcsr);
  648. + rfcsr &= (~0x3F);
  649. + rfcsr |= tx_agc_fc;
  650. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rfcsr);
  651. + rt2800_rfcsr_read_bank(rt2x00dev, 7, 58, &rfcsr);
  652. + rfcsr &= (~0x3F);
  653. + rfcsr |= tx_agc_fc;
  654. + rt2800_rfcsr_write_bank(rt2x00dev, 7, 58, rfcsr);
  655. + rt2800_rfcsr_read_bank(rt2x00dev, 7, 59, &rfcsr);
  656. + rfcsr &= (~0x3F);
  657. + rfcsr |= tx_agc_fc;
  658. + rt2800_rfcsr_write_bank(rt2x00dev, 7, 59, rfcsr);
  659. + }
  660. +}
  661. +
  662. +static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev,
  663. + struct ieee80211_channel *chan,
  664. + int power_level) {
  665. + u16 eeprom, target_power, max_power;
  666. + u32 mac_sys_ctrl, mac_status;
  667. + u32 reg;
  668. + u8 bbp;
  669. + int i;
  670. +
  671. + /* hardware unit is 0.5dBm, limited to 23.5dBm */
  672. + power_level *= 2;
  673. + if (power_level > 0x2f)
  674. + power_level = 0x2f;
  675. +
  676. + max_power = chan->max_power * 2;
  677. + if (max_power > 0x2f)
  678. + max_power = 0x2f;
  679. +
  680. + rt2800_register_read(rt2x00dev, TX_ALC_CFG_0, &reg);
  681. + rt2x00_set_field32(&reg, TX_ALC_CFG_0_CH_INIT_0, power_level);
  682. + rt2x00_set_field32(&reg, TX_ALC_CFG_0_CH_INIT_1, power_level);
  683. + rt2x00_set_field32(&reg, TX_ALC_CFG_0_LIMIT_0, max_power);
  684. + rt2x00_set_field32(&reg, TX_ALC_CFG_0_LIMIT_1, max_power);
  685. +
  686. + rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
  687. + if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_INTERNAL_TX_ALC)) {
  688. + /* init base power by eeprom target power */
  689. + rt2800_eeprom_read(rt2x00dev, EEPROM_TXPOWER_INIT,
  690. + &target_power);
  691. + rt2x00_set_field32(&reg, TX_ALC_CFG_0_CH_INIT_0, target_power);
  692. + rt2x00_set_field32(&reg, TX_ALC_CFG_0_CH_INIT_1, target_power);
  693. + }
  694. + rt2800_register_write(rt2x00dev, TX_ALC_CFG_0, reg);
  695. +
  696. + rt2800_register_read(rt2x00dev, TX_ALC_CFG_1, &reg);
  697. + rt2x00_set_field32(&reg, TX_ALC_CFG_1_TX_TEMP_COMP, 0);
  698. + rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg);
  699. +
  700. + /* Save MAC SYS CTRL registers */
  701. + rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &mac_sys_ctrl);
  702. + /* Disable Tx/Rx */
  703. + rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0);
  704. + /* Check MAC Tx/Rx idle */
  705. + for (i = 0; i < 10000; i++) {
  706. + rt2800_register_read(rt2x00dev, MAC_STATUS_CFG,
  707. + &mac_status);
  708. + if (mac_status & 0x3)
  709. + usleep_range(50, 200);
  710. + else
  711. + break;
  712. + }
  713. +
  714. + if (i == 10000)
  715. + rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n");
  716. +
  717. + if (chan->center_freq > 2457) {
  718. + rt2800_bbp_read(rt2x00dev, 30, &bbp);
  719. + bbp = 0x40;
  720. + rt2800_bbp_write(rt2x00dev, 30, bbp);
  721. + rt2800_rfcsr_write(rt2x00dev, 39, 0);
  722. + if (rt2x00_has_cap_external_lna_bg(rt2x00dev))
  723. + rt2800_rfcsr_write(rt2x00dev, 42, 0xfb);
  724. + else
  725. + rt2800_rfcsr_write(rt2x00dev, 42, 0x7b);
  726. + } else {
  727. + rt2800_bbp_read(rt2x00dev, 30, &bbp);
  728. + bbp = 0x1f;
  729. + rt2800_bbp_write(rt2x00dev, 30, bbp);
  730. + rt2800_rfcsr_write(rt2x00dev, 39, 0x80);
  731. + if (rt2x00_has_cap_external_lna_bg(rt2x00dev))
  732. + rt2800_rfcsr_write(rt2x00dev, 42, 0xdb);
  733. + else
  734. + rt2800_rfcsr_write(rt2x00dev, 42, 0x5b);
  735. + }
  736. + rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
  737. +}
  738. +
  739. static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev,
  740. const unsigned int word,
  741. const u8 value)
  742. @@ -3228,7 +3533,7 @@ static void rt2800_config_channel(struct
  743. struct channel_info *info)
  744. {
  745. u32 reg;
  746. - unsigned int tx_pin;
  747. + u32 tx_pin;
  748. u8 bbp, rfcsr;
  749. info->default_power1 = rt2800_txpower_to_dev(rt2x00dev, rf->channel,
  750. @@ -3273,6 +3578,9 @@ static void rt2800_config_channel(struct
  751. case RF5592:
  752. rt2800_config_channel_rf55xx(rt2x00dev, conf, rf, info);
  753. break;
  754. + case RF7620:
  755. + rt2800_config_channel_rf7620(rt2x00dev, conf, rf, info);
  756. + break;
  757. default:
  758. rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info);
  759. }
  760. @@ -3347,7 +3655,8 @@ static void rt2800_config_channel(struct
  761. if (rf->channel <= 14) {
  762. if (!rt2x00_rt(rt2x00dev, RT5390) &&
  763. - !rt2x00_rt(rt2x00dev, RT5392)) {
  764. + !rt2x00_rt(rt2x00dev, RT5392) &&
  765. + !rt2x00_rt(rt2x00dev, RT6352)) {
  766. if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
  767. rt2800_bbp_write(rt2x00dev, 82, 0x62);
  768. rt2800_bbp_write(rt2x00dev, 75, 0x46);
  769. @@ -3367,7 +3676,7 @@ static void rt2800_config_channel(struct
  770. rt2800_bbp_write(rt2x00dev, 82, 0x94);
  771. else if (rt2x00_rt(rt2x00dev, RT3593))
  772. rt2800_bbp_write(rt2x00dev, 82, 0x82);
  773. - else
  774. + else if (!rt2x00_rt(rt2x00dev, RT6352))
  775. rt2800_bbp_write(rt2x00dev, 82, 0xf2);
  776. if (rt2x00_rt(rt2x00dev, RT3593))
  777. @@ -3388,7 +3697,7 @@ static void rt2800_config_channel(struct
  778. if (rt2x00_rt(rt2x00dev, RT3572))
  779. rt2800_rfcsr_write(rt2x00dev, 8, 0);
  780. - tx_pin = 0;
  781. + rt2800_register_read(rt2x00dev, TX_PIN_CFG, &tx_pin);
  782. switch (rt2x00dev->default_ant.tx_chain_num) {
  783. case 3:
  784. @@ -3437,6 +3746,7 @@ static void rt2800_config_channel(struct
  785. rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1);
  786. rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1);
  787. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFRX_EN, 1); /* mt7620 */
  788. rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
  789. @@ -3495,7 +3805,7 @@ static void rt2800_config_channel(struct
  790. usleep_range(1000, 1500);
  791. }
  792. - if (rt2x00_rt(rt2x00dev, RT5592)) {
  793. + if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) {
  794. rt2800_bbp_write(rt2x00dev, 195, 141);
  795. rt2800_bbp_write(rt2x00dev, 196, conf_is_ht40(conf) ? 0x10 : 0x1a);
  796. @@ -4182,6 +4492,128 @@ static void rt2800_config_txpower_rt3593
  797. (unsigned long) regs[i]);
  798. }
  799. +static void rt2800_config_txpower_rt6352(struct rt2x00_dev *rt2x00dev,
  800. + struct ieee80211_channel *chan,
  801. + int power_level)
  802. +{
  803. + u32 reg, pwreg;
  804. + u16 eeprom;
  805. + u32 data, gdata;
  806. + u8 t, i;
  807. + enum nl80211_band band = chan->band;
  808. + int delta;
  809. +
  810. + /* Warn user if bw_comp is set in EEPROM */
  811. + delta = rt2800_get_txpower_bw_comp(rt2x00dev, band);
  812. +
  813. + if (delta)
  814. + rt2x00_warn(rt2x00dev, "ignoring EEPROM HT40 power delta: %d\n",
  815. + delta);
  816. +
  817. + /* populate TX_PWR_CFG_0 up to TX_PWR_CFG_4 from EEPROM for HT20, limit
  818. + * value to 0x3f and replace 0x20 by 0x21 as this is what the vendor
  819. + * driver does as well, though it looks kinda wrong.
  820. + * Maybe some misunderstanding of what a signed 8-bit value is? Maybe
  821. + * the hardware has a problem handling 0x20, and as the code initially
  822. + * used a fixed offset between HT20 and HT40 rates they had to work-
  823. + * around that issue and most likely just forgot about it later on.
  824. + * Maybe we should use rt2800_get_txpower_bw_comp() here as well,
  825. + * however, the corresponding EEPROM value is not respected by the
  826. + * vendor driver, so maybe this is rather being taken care of the
  827. + * TXALC and the driver doesn't need to handle it...?
  828. + * Though this is all very awkward, just do as they did, as that's what
  829. + * board vendors expected when they populated the EEPROM...
  830. + */
  831. + for (i = 0; i < 5; i++) {
  832. + rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
  833. + i * 2, &eeprom);
  834. +
  835. + data = eeprom;
  836. +
  837. + t = eeprom & 0x3f;
  838. + if (t == 32)
  839. + t++;
  840. +
  841. + gdata = t;
  842. +
  843. + t = (eeprom & 0x3f00) >> 8;
  844. + if (t == 32)
  845. + t++;
  846. +
  847. + gdata |= (t << 8);
  848. +
  849. + rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
  850. + (i * 2) + 1, &eeprom);
  851. +
  852. + t = eeprom & 0x3f;
  853. + if (t == 32)
  854. + t++;
  855. +
  856. + gdata |= (t << 16);
  857. +
  858. + t = (eeprom & 0x3f00) >> 8;
  859. + if (t == 32)
  860. + t++;
  861. +
  862. + gdata |= (t << 24);
  863. + data |= (eeprom << 16);
  864. +
  865. + if (!test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags)) {
  866. + /* HT20 */
  867. + if (data != 0xffffffff)
  868. + rt2800_register_write(rt2x00dev,
  869. + TX_PWR_CFG_0 + (i * 4),
  870. + data);
  871. + } else {
  872. + /* HT40 */
  873. + if (gdata != 0xffffffff)
  874. + rt2800_register_write(rt2x00dev,
  875. + TX_PWR_CFG_0 + (i * 4),
  876. + gdata);
  877. + }
  878. + }
  879. +
  880. + /* Aparently Ralink ran out of space in the BYRATE calibration section
  881. + * of the EERPOM which is copied to the corresponding TX_PWR_CFG_x
  882. + * registers. As recent 2T chips use 8-bit instead of 4-bit values for
  883. + * power-offsets more space would be needed. Ralink decided to keep the
  884. + * EEPROM layout untouched and rather have some shared values covering
  885. + * multiple bitrates.
  886. + * Populate the registers not covered by the EEPROM in the same way the
  887. + * vendor driver does.
  888. + */
  889. +
  890. + /* For OFDM 54MBS use value from OFDM 48MBS */
  891. + pwreg = 0;
  892. + rt2800_register_read(rt2x00dev, TX_PWR_CFG_1, &reg);
  893. + t = rt2x00_get_field32(reg, TX_PWR_CFG_1B_48MBS);
  894. + rt2x00_set_field32(&pwreg, TX_PWR_CFG_7B_54MBS, t);
  895. +
  896. + /* For MCS 7 use value from MCS 6 */
  897. + rt2800_register_read(rt2x00dev, TX_PWR_CFG_2, &reg);
  898. + t = rt2x00_get_field32(reg, TX_PWR_CFG_2B_MCS6_MCS7);
  899. + rt2x00_set_field32(&pwreg, TX_PWR_CFG_7B_MCS7, t);
  900. + rt2800_register_write(rt2x00dev, TX_PWR_CFG_7, pwreg);
  901. +
  902. + /* For MCS 15 use value from MCS 14 */
  903. + pwreg = 0;
  904. + rt2800_register_read(rt2x00dev, TX_PWR_CFG_3, &reg);
  905. + t = rt2x00_get_field32(reg, TX_PWR_CFG_3B_MCS14);
  906. + rt2x00_set_field32(&pwreg, TX_PWR_CFG_8B_MCS15, t);
  907. + rt2800_register_write(rt2x00dev, TX_PWR_CFG_8, pwreg);
  908. +
  909. + /* For STBC MCS 7 use value from STBC MCS 6 */
  910. + pwreg = 0;
  911. + rt2800_register_read(rt2x00dev, TX_PWR_CFG_4, &reg);
  912. + t = rt2x00_get_field32(reg, TX_PWR_CFG_4B_STBC_MCS6);
  913. + rt2x00_set_field32(&pwreg, TX_PWR_CFG_9B_STBC_MCS7, t);
  914. + rt2800_register_write(rt2x00dev, TX_PWR_CFG_9, pwreg);
  915. +
  916. + rt2800_config_alc(rt2x00dev, chan, power_level);
  917. +
  918. + /* TODO: temperature compensation code! */
  919. +}
  920. +
  921. /*
  922. * We configure transmit power using MAC TX_PWR_CFG_{0,...,N} registers and
  923. * BBP R1 register. TX_PWR_CFG_X allow to configure per rate TX power values,
  924. @@ -4378,6 +4810,8 @@ static void rt2800_config_txpower(struct
  925. {
  926. if (rt2x00_rt(rt2x00dev, RT3593))
  927. rt2800_config_txpower_rt3593(rt2x00dev, chan, power_level);
  928. + else if (rt2x00_rt(rt2x00dev, RT6352))
  929. + rt2800_config_txpower_rt6352(rt2x00dev, chan, power_level);
  930. else
  931. rt2800_config_txpower_rt28xx(rt2x00dev, chan, power_level);
  932. }
  933. @@ -4393,6 +4827,7 @@ void rt2800_vco_calibration(struct rt2x0
  934. {
  935. u32 tx_pin;
  936. u8 rfcsr;
  937. + unsigned long min_sleep = 0;
  938. /*
  939. * A voltage-controlled oscillator(VCO) is an electronic oscillator
  940. @@ -4431,6 +4866,15 @@ void rt2800_vco_calibration(struct rt2x0
  941. rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr);
  942. rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
  943. rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
  944. + min_sleep = 1000;
  945. + break;
  946. + case RF7620:
  947. + rt2800_rfcsr_write(rt2x00dev, 5, 0x40);
  948. + rt2800_rfcsr_write(rt2x00dev, 4, 0x0C);
  949. + rt2800_rfcsr_read(rt2x00dev, 4, &rfcsr);
  950. + rt2x00_set_field8(&rfcsr, RFCSR4_VCOCAL_EN, 1);
  951. + rt2800_rfcsr_write(rt2x00dev, 4, rfcsr);
  952. + min_sleep = 2000;
  953. break;
  954. default:
  955. WARN_ONCE(1, "Not supported RF chipet %x for VCO recalibration",
  956. @@ -4438,7 +4882,8 @@ void rt2800_vco_calibration(struct rt2x0
  957. return;
  958. }
  959. - usleep_range(1000, 1500);
  960. + if (min_sleep > 0)
  961. + usleep_range(min_sleep, min_sleep * 2);
  962. rt2800_register_read(rt2x00dev, TX_PIN_CFG, &tx_pin);
  963. if (rt2x00dev->rf_channel <= 14) {
  964. @@ -4470,6 +4915,42 @@ void rt2800_vco_calibration(struct rt2x0
  965. }
  966. rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
  967. + if (rt2x00_rt(rt2x00dev, RT6352)) {
  968. + if (rt2x00dev->default_ant.tx_chain_num == 1) {
  969. + rt2800_bbp_write(rt2x00dev, 91, 0x07);
  970. + rt2800_bbp_write(rt2x00dev, 95, 0x1A);
  971. + rt2800_bbp_write(rt2x00dev, 195, 128);
  972. + rt2800_bbp_write(rt2x00dev, 196, 0xA0);
  973. + rt2800_bbp_write(rt2x00dev, 195, 170);
  974. + rt2800_bbp_write(rt2x00dev, 196, 0x12);
  975. + rt2800_bbp_write(rt2x00dev, 195, 171);
  976. + rt2800_bbp_write(rt2x00dev, 196, 0x10);
  977. + } else {
  978. + rt2800_bbp_write(rt2x00dev, 91, 0x06);
  979. + rt2800_bbp_write(rt2x00dev, 95, 0x9A);
  980. + rt2800_bbp_write(rt2x00dev, 195, 128);
  981. + rt2800_bbp_write(rt2x00dev, 196, 0xE0);
  982. + rt2800_bbp_write(rt2x00dev, 195, 170);
  983. + rt2800_bbp_write(rt2x00dev, 196, 0x30);
  984. + rt2800_bbp_write(rt2x00dev, 195, 171);
  985. + rt2800_bbp_write(rt2x00dev, 196, 0x30);
  986. + }
  987. +
  988. + if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
  989. + rt2800_bbp_write(rt2x00dev, 75, 0x60);
  990. + rt2800_bbp_write(rt2x00dev, 76, 0x44);
  991. + rt2800_bbp_write(rt2x00dev, 79, 0x1C);
  992. + rt2800_bbp_write(rt2x00dev, 80, 0x0C);
  993. + rt2800_bbp_write(rt2x00dev, 82, 0xB6);
  994. + }
  995. +
  996. + /* On 11A, We should delay and wait RF/BBP to be stable
  997. + * and the appropriate time should be 1000 micro seconds
  998. + * 2005/06/05 - On 11G, we also need this delay time.
  999. + * Otherwise it's difficult to pass the WHQL.
  1000. + */
  1001. + usleep_range(1000, 1500);
  1002. + }
  1003. }
  1004. EXPORT_SYMBOL_GPL(rt2800_vco_calibration);
  1005. @@ -4568,7 +5049,8 @@ static u8 rt2800_get_default_vgc(struct
  1006. rt2x00_rt(rt2x00dev, RT3593) ||
  1007. rt2x00_rt(rt2x00dev, RT5390) ||
  1008. rt2x00_rt(rt2x00dev, RT5392) ||
  1009. - rt2x00_rt(rt2x00dev, RT5592))
  1010. + rt2x00_rt(rt2x00dev, RT5592) ||
  1011. + rt2x00_rt(rt2x00dev, RT6352))
  1012. vgc = 0x1c + (2 * rt2x00dev->lna_gain);
  1013. else
  1014. vgc = 0x2e + rt2x00dev->lna_gain;
  1015. @@ -4795,7 +5277,8 @@ static int rt2800_init_registers(struct
  1016. 0x00000000);
  1017. }
  1018. } else if (rt2x00_rt(rt2x00dev, RT5390) ||
  1019. - rt2x00_rt(rt2x00dev, RT5392)) {
  1020. + rt2x00_rt(rt2x00dev, RT5392) ||
  1021. + rt2x00_rt(rt2x00dev, RT6352)) {
  1022. rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
  1023. rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
  1024. rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
  1025. @@ -4805,6 +5288,24 @@ static int rt2800_init_registers(struct
  1026. rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
  1027. } else if (rt2x00_rt(rt2x00dev, RT5350)) {
  1028. rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
  1029. + } else if (rt2x00_rt(rt2x00dev, RT6352)) {
  1030. + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401);
  1031. + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000);
  1032. + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
  1033. + rt2800_register_write(rt2x00dev, MIMO_PS_CFG, 0x00000002);
  1034. + rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0x00150F0F);
  1035. + rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x06060606);
  1036. + rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0);
  1037. + rt2800_register_write(rt2x00dev, TX1_BB_GAIN_ATTEN, 0x0);
  1038. + rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, 0x6C6C666C);
  1039. + rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, 0x6C6C666C);
  1040. + rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT,
  1041. + 0x3630363A);
  1042. + rt2800_register_write(rt2x00dev, TX1_RF_GAIN_CORRECT,
  1043. + 0x3630363A);
  1044. + rt2800_register_read(rt2x00dev, TX_ALC_CFG_1, &reg);
  1045. + rt2x00_set_field32(&reg, TX_ALC_CFG_1_ROS_BUSY_EN, 0);
  1046. + rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg);
  1047. } else {
  1048. rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000);
  1049. rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
  1050. @@ -5786,6 +6287,231 @@ static void rt2800_init_bbp_5592(struct
  1051. rt2800_bbp_write(rt2x00dev, 103, 0xc0);
  1052. }
  1053. +static void rt2800_bbp_glrt_write(struct rt2x00_dev *rt2x00dev,
  1054. + const u8 reg, const u8 value)
  1055. +{
  1056. + rt2800_bbp_write(rt2x00dev, 195, reg);
  1057. + rt2800_bbp_write(rt2x00dev, 196, value);
  1058. +}
  1059. +
  1060. +static void rt2800_bbp_dcoc_write(struct rt2x00_dev *rt2x00dev,
  1061. + const u8 reg, const u8 value)
  1062. +{
  1063. + rt2800_bbp_write(rt2x00dev, 158, reg);
  1064. + rt2800_bbp_write(rt2x00dev, 159, value);
  1065. +}
  1066. +
  1067. +static void rt2800_bbp_dcoc_read(struct rt2x00_dev *rt2x00dev,
  1068. + const u8 reg, u8 *value)
  1069. +{
  1070. + rt2800_bbp_write(rt2x00dev, 158, reg);
  1071. + rt2800_bbp_read(rt2x00dev, 159, value);
  1072. +}
  1073. +
  1074. +static void rt2800_init_bbp_6352(struct rt2x00_dev *rt2x00dev)
  1075. +{
  1076. + u8 bbp;
  1077. +
  1078. + /* Apply Maximum Likelihood Detection (MLD) for 2 stream case */
  1079. + rt2800_bbp_read(rt2x00dev, 105, &bbp);
  1080. + rt2x00_set_field8(&bbp, BBP105_MLD,
  1081. + rt2x00dev->default_ant.rx_chain_num == 2);
  1082. + rt2800_bbp_write(rt2x00dev, 105, bbp);
  1083. +
  1084. + /* Avoid data loss and CRC errors */
  1085. + rt2800_bbp4_mac_if_ctrl(rt2x00dev);
  1086. +
  1087. + /* Fix I/Q swap issue */
  1088. + rt2800_bbp_read(rt2x00dev, 1, &bbp);
  1089. + bbp |= 0x04;
  1090. + rt2800_bbp_write(rt2x00dev, 1, bbp);
  1091. +
  1092. + /* BBP for G band */
  1093. + rt2800_bbp_write(rt2x00dev, 3, 0x08);
  1094. + rt2800_bbp_write(rt2x00dev, 4, 0x00); /* rt2800_bbp4_mac_if_ctrl? */
  1095. + rt2800_bbp_write(rt2x00dev, 6, 0x08);
  1096. + rt2800_bbp_write(rt2x00dev, 14, 0x09);
  1097. + rt2800_bbp_write(rt2x00dev, 15, 0xFF);
  1098. + rt2800_bbp_write(rt2x00dev, 16, 0x01);
  1099. + rt2800_bbp_write(rt2x00dev, 20, 0x06);
  1100. + rt2800_bbp_write(rt2x00dev, 21, 0x00);
  1101. + rt2800_bbp_write(rt2x00dev, 22, 0x00);
  1102. + rt2800_bbp_write(rt2x00dev, 27, 0x00);
  1103. + rt2800_bbp_write(rt2x00dev, 28, 0x00);
  1104. + rt2800_bbp_write(rt2x00dev, 30, 0x00);
  1105. + rt2800_bbp_write(rt2x00dev, 31, 0x48);
  1106. + rt2800_bbp_write(rt2x00dev, 47, 0x40);
  1107. + rt2800_bbp_write(rt2x00dev, 62, 0x00);
  1108. + rt2800_bbp_write(rt2x00dev, 63, 0x00);
  1109. + rt2800_bbp_write(rt2x00dev, 64, 0x00);
  1110. + rt2800_bbp_write(rt2x00dev, 65, 0x2C);
  1111. + rt2800_bbp_write(rt2x00dev, 66, 0x1C);
  1112. + rt2800_bbp_write(rt2x00dev, 67, 0x20);
  1113. + rt2800_bbp_write(rt2x00dev, 68, 0xDD);
  1114. + rt2800_bbp_write(rt2x00dev, 69, 0x10);
  1115. + rt2800_bbp_write(rt2x00dev, 70, 0x05);
  1116. + rt2800_bbp_write(rt2x00dev, 73, 0x18);
  1117. + rt2800_bbp_write(rt2x00dev, 74, 0x0F);
  1118. + rt2800_bbp_write(rt2x00dev, 75, 0x60);
  1119. + rt2800_bbp_write(rt2x00dev, 76, 0x44);
  1120. + rt2800_bbp_write(rt2x00dev, 77, 0x59);
  1121. + rt2800_bbp_write(rt2x00dev, 78, 0x1E);
  1122. + rt2800_bbp_write(rt2x00dev, 79, 0x1C);
  1123. + rt2800_bbp_write(rt2x00dev, 80, 0x0C);
  1124. + rt2800_bbp_write(rt2x00dev, 81, 0x3A);
  1125. + rt2800_bbp_write(rt2x00dev, 82, 0xB6);
  1126. + rt2800_bbp_write(rt2x00dev, 83, 0x9A);
  1127. + rt2800_bbp_write(rt2x00dev, 84, 0x9A);
  1128. + rt2800_bbp_write(rt2x00dev, 86, 0x38);
  1129. + rt2800_bbp_write(rt2x00dev, 88, 0x90);
  1130. + rt2800_bbp_write(rt2x00dev, 91, 0x04);
  1131. + rt2800_bbp_write(rt2x00dev, 92, 0x02);
  1132. + rt2800_bbp_write(rt2x00dev, 95, 0x9A);
  1133. + rt2800_bbp_write(rt2x00dev, 96, 0x00);
  1134. + rt2800_bbp_write(rt2x00dev, 103, 0xC0);
  1135. + rt2800_bbp_write(rt2x00dev, 104, 0x92);
  1136. + /* FIXME BBP105 owerwrite */
  1137. + rt2800_bbp_write(rt2x00dev, 105, 0x3C);
  1138. + rt2800_bbp_write(rt2x00dev, 106, 0x12);
  1139. + rt2800_bbp_write(rt2x00dev, 109, 0x00);
  1140. + rt2800_bbp_write(rt2x00dev, 134, 0x10);
  1141. + rt2800_bbp_write(rt2x00dev, 135, 0xA6);
  1142. + rt2800_bbp_write(rt2x00dev, 137, 0x04);
  1143. + rt2800_bbp_write(rt2x00dev, 142, 0x30);
  1144. + rt2800_bbp_write(rt2x00dev, 143, 0xF7);
  1145. + rt2800_bbp_write(rt2x00dev, 160, 0xEC);
  1146. + rt2800_bbp_write(rt2x00dev, 161, 0xC4);
  1147. + rt2800_bbp_write(rt2x00dev, 162, 0x77);
  1148. + rt2800_bbp_write(rt2x00dev, 163, 0xF9);
  1149. + rt2800_bbp_write(rt2x00dev, 164, 0x00);
  1150. + rt2800_bbp_write(rt2x00dev, 165, 0x00);
  1151. + rt2800_bbp_write(rt2x00dev, 186, 0x00);
  1152. + rt2800_bbp_write(rt2x00dev, 187, 0x00);
  1153. + rt2800_bbp_write(rt2x00dev, 188, 0x00);
  1154. + rt2800_bbp_write(rt2x00dev, 186, 0x00);
  1155. + rt2800_bbp_write(rt2x00dev, 187, 0x01);
  1156. + rt2800_bbp_write(rt2x00dev, 188, 0x00);
  1157. + rt2800_bbp_write(rt2x00dev, 189, 0x00);
  1158. +
  1159. + rt2800_bbp_write(rt2x00dev, 91, 0x06);
  1160. + rt2800_bbp_write(rt2x00dev, 92, 0x04);
  1161. + rt2800_bbp_write(rt2x00dev, 93, 0x54);
  1162. + rt2800_bbp_write(rt2x00dev, 99, 0x50);
  1163. + rt2800_bbp_write(rt2x00dev, 148, 0x84);
  1164. + rt2800_bbp_write(rt2x00dev, 167, 0x80);
  1165. + rt2800_bbp_write(rt2x00dev, 178, 0xFF);
  1166. + rt2800_bbp_write(rt2x00dev, 106, 0x13);
  1167. +
  1168. + /* BBP for G band GLRT function (BBP_128 ~ BBP_221) */
  1169. + rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00);
  1170. + rt2800_bbp_glrt_write(rt2x00dev, 1, 0x14);
  1171. + rt2800_bbp_glrt_write(rt2x00dev, 2, 0x20);
  1172. + rt2800_bbp_glrt_write(rt2x00dev, 3, 0x0A);
  1173. + rt2800_bbp_glrt_write(rt2x00dev, 10, 0x16);
  1174. + rt2800_bbp_glrt_write(rt2x00dev, 11, 0x06);
  1175. + rt2800_bbp_glrt_write(rt2x00dev, 12, 0x02);
  1176. + rt2800_bbp_glrt_write(rt2x00dev, 13, 0x07);
  1177. + rt2800_bbp_glrt_write(rt2x00dev, 14, 0x05);
  1178. + rt2800_bbp_glrt_write(rt2x00dev, 15, 0x09);
  1179. + rt2800_bbp_glrt_write(rt2x00dev, 16, 0x20);
  1180. + rt2800_bbp_glrt_write(rt2x00dev, 17, 0x08);
  1181. + rt2800_bbp_glrt_write(rt2x00dev, 18, 0x4A);
  1182. + rt2800_bbp_glrt_write(rt2x00dev, 19, 0x00);
  1183. + rt2800_bbp_glrt_write(rt2x00dev, 20, 0x00);
  1184. + rt2800_bbp_glrt_write(rt2x00dev, 128, 0xE0);
  1185. + rt2800_bbp_glrt_write(rt2x00dev, 129, 0x1F);
  1186. + rt2800_bbp_glrt_write(rt2x00dev, 130, 0x4F);
  1187. + rt2800_bbp_glrt_write(rt2x00dev, 131, 0x32);
  1188. + rt2800_bbp_glrt_write(rt2x00dev, 132, 0x08);
  1189. + rt2800_bbp_glrt_write(rt2x00dev, 133, 0x28);
  1190. + rt2800_bbp_glrt_write(rt2x00dev, 134, 0x19);
  1191. + rt2800_bbp_glrt_write(rt2x00dev, 135, 0x0A);
  1192. + rt2800_bbp_glrt_write(rt2x00dev, 138, 0x16);
  1193. + rt2800_bbp_glrt_write(rt2x00dev, 139, 0x10);
  1194. + rt2800_bbp_glrt_write(rt2x00dev, 140, 0x10);
  1195. + rt2800_bbp_glrt_write(rt2x00dev, 141, 0x1A);
  1196. + rt2800_bbp_glrt_write(rt2x00dev, 142, 0x36);
  1197. + rt2800_bbp_glrt_write(rt2x00dev, 143, 0x2C);
  1198. + rt2800_bbp_glrt_write(rt2x00dev, 144, 0x26);
  1199. + rt2800_bbp_glrt_write(rt2x00dev, 145, 0x24);
  1200. + rt2800_bbp_glrt_write(rt2x00dev, 146, 0x42);
  1201. + rt2800_bbp_glrt_write(rt2x00dev, 147, 0x40);
  1202. + rt2800_bbp_glrt_write(rt2x00dev, 148, 0x30);
  1203. + rt2800_bbp_glrt_write(rt2x00dev, 149, 0x29);
  1204. + rt2800_bbp_glrt_write(rt2x00dev, 150, 0x4C);
  1205. + rt2800_bbp_glrt_write(rt2x00dev, 151, 0x46);
  1206. + rt2800_bbp_glrt_write(rt2x00dev, 152, 0x3D);
  1207. + rt2800_bbp_glrt_write(rt2x00dev, 153, 0x40);
  1208. + rt2800_bbp_glrt_write(rt2x00dev, 154, 0x3E);
  1209. + rt2800_bbp_glrt_write(rt2x00dev, 155, 0x38);
  1210. + rt2800_bbp_glrt_write(rt2x00dev, 156, 0x3D);
  1211. + rt2800_bbp_glrt_write(rt2x00dev, 157, 0x2F);
  1212. + rt2800_bbp_glrt_write(rt2x00dev, 158, 0x3C);
  1213. + rt2800_bbp_glrt_write(rt2x00dev, 159, 0x34);
  1214. + rt2800_bbp_glrt_write(rt2x00dev, 160, 0x2C);
  1215. + rt2800_bbp_glrt_write(rt2x00dev, 161, 0x2F);
  1216. + rt2800_bbp_glrt_write(rt2x00dev, 162, 0x3C);
  1217. + rt2800_bbp_glrt_write(rt2x00dev, 163, 0x35);
  1218. + rt2800_bbp_glrt_write(rt2x00dev, 164, 0x2E);
  1219. + rt2800_bbp_glrt_write(rt2x00dev, 165, 0x2F);
  1220. + rt2800_bbp_glrt_write(rt2x00dev, 166, 0x49);
  1221. + rt2800_bbp_glrt_write(rt2x00dev, 167, 0x41);
  1222. + rt2800_bbp_glrt_write(rt2x00dev, 168, 0x36);
  1223. + rt2800_bbp_glrt_write(rt2x00dev, 169, 0x39);
  1224. + rt2800_bbp_glrt_write(rt2x00dev, 170, 0x30);
  1225. + rt2800_bbp_glrt_write(rt2x00dev, 171, 0x30);
  1226. + rt2800_bbp_glrt_write(rt2x00dev, 172, 0x0E);
  1227. + rt2800_bbp_glrt_write(rt2x00dev, 173, 0x0D);
  1228. + rt2800_bbp_glrt_write(rt2x00dev, 174, 0x28);
  1229. + rt2800_bbp_glrt_write(rt2x00dev, 175, 0x21);
  1230. + rt2800_bbp_glrt_write(rt2x00dev, 176, 0x1C);
  1231. + rt2800_bbp_glrt_write(rt2x00dev, 177, 0x16);
  1232. + rt2800_bbp_glrt_write(rt2x00dev, 178, 0x50);
  1233. + rt2800_bbp_glrt_write(rt2x00dev, 179, 0x4A);
  1234. + rt2800_bbp_glrt_write(rt2x00dev, 180, 0x43);
  1235. + rt2800_bbp_glrt_write(rt2x00dev, 181, 0x50);
  1236. + rt2800_bbp_glrt_write(rt2x00dev, 182, 0x10);
  1237. + rt2800_bbp_glrt_write(rt2x00dev, 183, 0x10);
  1238. + rt2800_bbp_glrt_write(rt2x00dev, 184, 0x10);
  1239. + rt2800_bbp_glrt_write(rt2x00dev, 185, 0x10);
  1240. + rt2800_bbp_glrt_write(rt2x00dev, 200, 0x7D);
  1241. + rt2800_bbp_glrt_write(rt2x00dev, 201, 0x14);
  1242. + rt2800_bbp_glrt_write(rt2x00dev, 202, 0x32);
  1243. + rt2800_bbp_glrt_write(rt2x00dev, 203, 0x2C);
  1244. + rt2800_bbp_glrt_write(rt2x00dev, 204, 0x36);
  1245. + rt2800_bbp_glrt_write(rt2x00dev, 205, 0x4C);
  1246. + rt2800_bbp_glrt_write(rt2x00dev, 206, 0x43);
  1247. + rt2800_bbp_glrt_write(rt2x00dev, 207, 0x2C);
  1248. + rt2800_bbp_glrt_write(rt2x00dev, 208, 0x2E);
  1249. + rt2800_bbp_glrt_write(rt2x00dev, 209, 0x36);
  1250. + rt2800_bbp_glrt_write(rt2x00dev, 210, 0x30);
  1251. + rt2800_bbp_glrt_write(rt2x00dev, 211, 0x6E);
  1252. +
  1253. + /* BBP for G band DCOC function */
  1254. + rt2800_bbp_dcoc_write(rt2x00dev, 140, 0x0C);
  1255. + rt2800_bbp_dcoc_write(rt2x00dev, 141, 0x00);
  1256. + rt2800_bbp_dcoc_write(rt2x00dev, 142, 0x10);
  1257. + rt2800_bbp_dcoc_write(rt2x00dev, 143, 0x10);
  1258. + rt2800_bbp_dcoc_write(rt2x00dev, 144, 0x10);
  1259. + rt2800_bbp_dcoc_write(rt2x00dev, 145, 0x10);
  1260. + rt2800_bbp_dcoc_write(rt2x00dev, 146, 0x08);
  1261. + rt2800_bbp_dcoc_write(rt2x00dev, 147, 0x40);
  1262. + rt2800_bbp_dcoc_write(rt2x00dev, 148, 0x04);
  1263. + rt2800_bbp_dcoc_write(rt2x00dev, 149, 0x04);
  1264. + rt2800_bbp_dcoc_write(rt2x00dev, 150, 0x08);
  1265. + rt2800_bbp_dcoc_write(rt2x00dev, 151, 0x08);
  1266. + rt2800_bbp_dcoc_write(rt2x00dev, 152, 0x03);
  1267. + rt2800_bbp_dcoc_write(rt2x00dev, 153, 0x03);
  1268. + rt2800_bbp_dcoc_write(rt2x00dev, 154, 0x03);
  1269. + rt2800_bbp_dcoc_write(rt2x00dev, 155, 0x02);
  1270. + rt2800_bbp_dcoc_write(rt2x00dev, 156, 0x40);
  1271. + rt2800_bbp_dcoc_write(rt2x00dev, 157, 0x40);
  1272. + rt2800_bbp_dcoc_write(rt2x00dev, 158, 0x64);
  1273. + rt2800_bbp_dcoc_write(rt2x00dev, 159, 0x64);
  1274. +
  1275. + rt2800_bbp4_mac_if_ctrl(rt2x00dev);
  1276. +}
  1277. +
  1278. static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
  1279. {
  1280. unsigned int i;
  1281. @@ -5830,6 +6556,9 @@ static void rt2800_init_bbp(struct rt2x0
  1282. case RT5592:
  1283. rt2800_init_bbp_5592(rt2x00dev);
  1284. return;
  1285. + case RT6352:
  1286. + rt2800_init_bbp_6352(rt2x00dev);
  1287. + break;
  1288. }
  1289. for (i = 0; i < EEPROM_BBP_SIZE; i++) {
  1290. @@ -6901,6 +7630,615 @@ static void rt2800_init_rfcsr_5592(struc
  1291. rt2800_led_open_drain_enable(rt2x00dev);
  1292. }
  1293. +static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
  1294. + bool set_bw, bool is_ht40)
  1295. +{
  1296. + u8 bbp_val;
  1297. +
  1298. + rt2800_bbp_read(rt2x00dev, 21, &bbp_val);
  1299. + bbp_val |= 0x1;
  1300. + rt2800_bbp_write(rt2x00dev, 21, bbp_val);
  1301. + usleep_range(100, 200);
  1302. +
  1303. + if (set_bw) {
  1304. + rt2800_bbp_read(rt2x00dev, 4, &bbp_val);
  1305. + rt2x00_set_field8(&bbp_val, BBP4_BANDWIDTH, 2 * is_ht40);
  1306. + rt2800_bbp_write(rt2x00dev, 4, bbp_val);
  1307. + usleep_range(100, 200);
  1308. + }
  1309. +
  1310. + rt2800_bbp_read(rt2x00dev, 21, &bbp_val);
  1311. + bbp_val &= (~0x1);
  1312. + rt2800_bbp_write(rt2x00dev, 21, bbp_val);
  1313. + usleep_range(100, 200);
  1314. +}
  1315. +
  1316. +static int rt2800_rf_lp_config(struct rt2x00_dev *rt2x00dev, bool btxcal)
  1317. +{
  1318. + u8 rf_val;
  1319. +
  1320. + if (btxcal)
  1321. + rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x04);
  1322. + else
  1323. + rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x02);
  1324. +
  1325. + rt2800_register_write(rt2x00dev, RF_BYPASS0, 0x06);
  1326. +
  1327. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 17, &rf_val);
  1328. + rf_val |= 0x80;
  1329. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, rf_val);
  1330. +
  1331. + if (btxcal) {
  1332. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, 0xC1);
  1333. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, 0x20);
  1334. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, 0x02);
  1335. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 3, &rf_val);
  1336. + rf_val &= (~0x3F);
  1337. + rf_val |= 0x3F;
  1338. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, rf_val);
  1339. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 4, &rf_val);
  1340. + rf_val &= (~0x3F);
  1341. + rf_val |= 0x3F;
  1342. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, rf_val);
  1343. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 5, 0x31);
  1344. + } else {
  1345. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, 0xF1);
  1346. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, 0x18);
  1347. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, 0x02);
  1348. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 3, &rf_val);
  1349. + rf_val &= (~0x3F);
  1350. + rf_val |= 0x34;
  1351. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, rf_val);
  1352. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 4, &rf_val);
  1353. + rf_val &= (~0x3F);
  1354. + rf_val |= 0x34;
  1355. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, rf_val);
  1356. + }
  1357. +
  1358. + return 0;
  1359. +}
  1360. +
  1361. +static char rt2800_lp_tx_filter_bw_cal(struct rt2x00_dev *rt2x00dev)
  1362. +{
  1363. + unsigned int cnt;
  1364. + u8 bbp_val;
  1365. + char cal_val;
  1366. +
  1367. + rt2800_bbp_dcoc_write(rt2x00dev, 0, 0x82);
  1368. +
  1369. + cnt = 0;
  1370. + do {
  1371. + usleep_range(500, 2000);
  1372. + rt2800_bbp_read(rt2x00dev, 159, &bbp_val);
  1373. + if (bbp_val == 0x02 || cnt == 20)
  1374. + break;
  1375. +
  1376. + cnt++;
  1377. + } while (cnt < 20);
  1378. +
  1379. + rt2800_bbp_dcoc_read(rt2x00dev, 0x39, &bbp_val);
  1380. + cal_val = bbp_val & 0x7F;
  1381. + if (cal_val >= 0x40)
  1382. + cal_val -= 128;
  1383. +
  1384. + return cal_val;
  1385. +}
  1386. +
  1387. +static void rt2800_bw_filter_calibration(struct rt2x00_dev *rt2x00dev,
  1388. + bool btxcal)
  1389. +{
  1390. + struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
  1391. + u8 tx_agc_fc = 0, rx_agc_fc = 0, cmm_agc_fc;
  1392. + u8 filter_target;
  1393. + u8 tx_filter_target_20m = 0x09, tx_filter_target_40m = 0x02;
  1394. + u8 rx_filter_target_20m = 0x27, rx_filter_target_40m = 0x31;
  1395. + int loop = 0, is_ht40, cnt;
  1396. + u8 bbp_val, rf_val;
  1397. + char cal_r32_init, cal_r32_val, cal_diff;
  1398. + u8 saverfb5r00, saverfb5r01, saverfb5r03, saverfb5r04, saverfb5r05;
  1399. + u8 saverfb5r06, saverfb5r07;
  1400. + u8 saverfb5r08, saverfb5r17, saverfb5r18, saverfb5r19, saverfb5r20;
  1401. + u8 saverfb5r37, saverfb5r38, saverfb5r39, saverfb5r40, saverfb5r41;
  1402. + u8 saverfb5r42, saverfb5r43, saverfb5r44, saverfb5r45, saverfb5r46;
  1403. + u8 saverfb5r58, saverfb5r59;
  1404. + u8 savebbp159r0, savebbp159r2, savebbpr23;
  1405. + u32 MAC_RF_CONTROL0, MAC_RF_BYPASS0;
  1406. +
  1407. + /* Save MAC registers */
  1408. + rt2800_register_read(rt2x00dev, RF_CONTROL0, &MAC_RF_CONTROL0);
  1409. + rt2800_register_read(rt2x00dev, RF_BYPASS0, &MAC_RF_BYPASS0);
  1410. +
  1411. + /* save BBP registers */
  1412. + rt2800_bbp_read(rt2x00dev, 23, &savebbpr23);
  1413. +
  1414. + rt2800_bbp_dcoc_read(rt2x00dev, 0, &savebbp159r0);
  1415. + rt2800_bbp_dcoc_read(rt2x00dev, 2, &savebbp159r2);
  1416. +
  1417. + /* Save RF registers */
  1418. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 0, &saverfb5r00);
  1419. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 1, &saverfb5r01);
  1420. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 3, &saverfb5r03);
  1421. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 4, &saverfb5r04);
  1422. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 5, &saverfb5r05);
  1423. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 6, &saverfb5r06);
  1424. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 7, &saverfb5r07);
  1425. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 8, &saverfb5r08);
  1426. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 17, &saverfb5r17);
  1427. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 18, &saverfb5r18);
  1428. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 19, &saverfb5r19);
  1429. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 20, &saverfb5r20);
  1430. +
  1431. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 37, &saverfb5r37);
  1432. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 38, &saverfb5r38);
  1433. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 39, &saverfb5r39);
  1434. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 40, &saverfb5r40);
  1435. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 41, &saverfb5r41);
  1436. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 42, &saverfb5r42);
  1437. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 43, &saverfb5r43);
  1438. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 44, &saverfb5r44);
  1439. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 45, &saverfb5r45);
  1440. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 46, &saverfb5r46);
  1441. +
  1442. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 58, &saverfb5r58);
  1443. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 59, &saverfb5r59);
  1444. +
  1445. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 0, &rf_val);
  1446. + rf_val |= 0x3;
  1447. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, rf_val);
  1448. +
  1449. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 1, &rf_val);
  1450. + rf_val |= 0x1;
  1451. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, rf_val);
  1452. +
  1453. + cnt = 0;
  1454. + do {
  1455. + usleep_range(500, 2000);
  1456. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 1, &rf_val);
  1457. + if (((rf_val & 0x1) == 0x00) || (cnt == 40))
  1458. + break;
  1459. + cnt++;
  1460. + } while (cnt < 40);
  1461. +
  1462. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 0, &rf_val);
  1463. + rf_val &= (~0x3);
  1464. + rf_val |= 0x1;
  1465. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, rf_val);
  1466. +
  1467. + /* I-3 */
  1468. + rt2800_bbp_read(rt2x00dev, 23, &bbp_val);
  1469. + bbp_val &= (~0x1F);
  1470. + bbp_val |= 0x10;
  1471. + rt2800_bbp_write(rt2x00dev, 23, bbp_val);
  1472. +
  1473. + do {
  1474. + /* I-4,5,6,7,8,9 */
  1475. + if (loop == 0) {
  1476. + is_ht40 = false;
  1477. +
  1478. + if (btxcal)
  1479. + filter_target = tx_filter_target_20m;
  1480. + else
  1481. + filter_target = rx_filter_target_20m;
  1482. + } else {
  1483. + is_ht40 = true;
  1484. +
  1485. + if (btxcal)
  1486. + filter_target = tx_filter_target_40m;
  1487. + else
  1488. + filter_target = rx_filter_target_40m;
  1489. + }
  1490. +
  1491. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 8, &rf_val);
  1492. + rf_val &= (~0x04);
  1493. + if (loop == 1)
  1494. + rf_val |= 0x4;
  1495. +
  1496. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 8, rf_val);
  1497. +
  1498. + rt2800_bbp_core_soft_reset(rt2x00dev, true, is_ht40);
  1499. +
  1500. + rt2800_rf_lp_config(rt2x00dev, btxcal);
  1501. + if (btxcal) {
  1502. + tx_agc_fc = 0;
  1503. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 58, &rf_val);
  1504. + rf_val &= (~0x7F);
  1505. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rf_val);
  1506. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 59, &rf_val);
  1507. + rf_val &= (~0x7F);
  1508. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rf_val);
  1509. + } else {
  1510. + rx_agc_fc = 0;
  1511. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 6, &rf_val);
  1512. + rf_val &= (~0x7F);
  1513. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rf_val);
  1514. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 7, &rf_val);
  1515. + rf_val &= (~0x7F);
  1516. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rf_val);
  1517. + }
  1518. +
  1519. + usleep_range(1000, 2000);
  1520. +
  1521. + rt2800_bbp_dcoc_read(rt2x00dev, 2, &bbp_val);
  1522. + bbp_val &= (~0x6);
  1523. + rt2800_bbp_dcoc_write(rt2x00dev, 2, bbp_val);
  1524. +
  1525. + rt2800_bbp_core_soft_reset(rt2x00dev, false, is_ht40);
  1526. +
  1527. + cal_r32_init = rt2800_lp_tx_filter_bw_cal(rt2x00dev);
  1528. +
  1529. + rt2800_bbp_dcoc_read(rt2x00dev, 2, &bbp_val);
  1530. + bbp_val |= 0x6;
  1531. + rt2800_bbp_dcoc_write(rt2x00dev, 2, bbp_val);
  1532. +do_cal:
  1533. + if (btxcal) {
  1534. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 58, &rf_val);
  1535. + rf_val &= (~0x7F);
  1536. + rf_val |= tx_agc_fc;
  1537. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rf_val);
  1538. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 59, &rf_val);
  1539. + rf_val &= (~0x7F);
  1540. + rf_val |= tx_agc_fc;
  1541. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rf_val);
  1542. + } else {
  1543. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 6, &rf_val);
  1544. + rf_val &= (~0x7F);
  1545. + rf_val |= rx_agc_fc;
  1546. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rf_val);
  1547. + rt2800_rfcsr_read_bank(rt2x00dev, 5, 7, &rf_val);
  1548. + rf_val &= (~0x7F);
  1549. + rf_val |= rx_agc_fc;
  1550. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rf_val);
  1551. + }
  1552. +
  1553. + usleep_range(500, 1000);
  1554. +
  1555. + rt2800_bbp_core_soft_reset(rt2x00dev, false, is_ht40);
  1556. +
  1557. + cal_r32_val = rt2800_lp_tx_filter_bw_cal(rt2x00dev);
  1558. +
  1559. + cal_diff = cal_r32_init - cal_r32_val;
  1560. +
  1561. + if (btxcal)
  1562. + cmm_agc_fc = tx_agc_fc;
  1563. + else
  1564. + cmm_agc_fc = rx_agc_fc;
  1565. +
  1566. + if (((cal_diff > filter_target) && (cmm_agc_fc == 0)) ||
  1567. + ((cal_diff < filter_target) && (cmm_agc_fc == 0x3f))) {
  1568. + if (btxcal)
  1569. + tx_agc_fc = 0;
  1570. + else
  1571. + rx_agc_fc = 0;
  1572. + } else if ((cal_diff <= filter_target) && (cmm_agc_fc < 0x3f)) {
  1573. + if (btxcal)
  1574. + tx_agc_fc++;
  1575. + else
  1576. + rx_agc_fc++;
  1577. + goto do_cal;
  1578. + }
  1579. +
  1580. + if (btxcal) {
  1581. + if (loop == 0)
  1582. + drv_data->tx_calibration_bw20 = tx_agc_fc;
  1583. + else
  1584. + drv_data->tx_calibration_bw40 = tx_agc_fc;
  1585. + } else {
  1586. + if (loop == 0)
  1587. + drv_data->rx_calibration_bw20 = rx_agc_fc;
  1588. + else
  1589. + drv_data->rx_calibration_bw40 = rx_agc_fc;
  1590. + }
  1591. +
  1592. + loop++;
  1593. + } while (loop <= 1);
  1594. +
  1595. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, saverfb5r00);
  1596. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, saverfb5r01);
  1597. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, saverfb5r03);
  1598. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, saverfb5r04);
  1599. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 5, saverfb5r05);
  1600. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, saverfb5r06);
  1601. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, saverfb5r07);
  1602. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 8, saverfb5r08);
  1603. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, saverfb5r17);
  1604. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, saverfb5r18);
  1605. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, saverfb5r19);
  1606. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, saverfb5r20);
  1607. +
  1608. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 37, saverfb5r37);
  1609. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 38, saverfb5r38);
  1610. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 39, saverfb5r39);
  1611. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 40, saverfb5r40);
  1612. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 41, saverfb5r41);
  1613. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 42, saverfb5r42);
  1614. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 43, saverfb5r43);
  1615. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 44, saverfb5r44);
  1616. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 45, saverfb5r45);
  1617. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 46, saverfb5r46);
  1618. +
  1619. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, saverfb5r58);
  1620. + rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, saverfb5r59);
  1621. +
  1622. + rt2800_bbp_write(rt2x00dev, 23, savebbpr23);
  1623. +
  1624. + rt2800_bbp_dcoc_write(rt2x00dev, 0, savebbp159r0);
  1625. + rt2800_bbp_dcoc_write(rt2x00dev, 2, savebbp159r2);
  1626. +
  1627. + rt2800_bbp_read(rt2x00dev, 4, &bbp_val);
  1628. + rt2x00_set_field8(&bbp_val, BBP4_BANDWIDTH,
  1629. + 2 * test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags));
  1630. + rt2800_bbp_write(rt2x00dev, 4, bbp_val);
  1631. +
  1632. + rt2800_register_write(rt2x00dev, RF_CONTROL0, MAC_RF_CONTROL0);
  1633. + rt2800_register_write(rt2x00dev, RF_BYPASS0, MAC_RF_BYPASS0);
  1634. +}
  1635. +
  1636. +static void rt2800_init_rfcsr_6352(struct rt2x00_dev *rt2x00dev)
  1637. +{
  1638. + /* Initialize RF central register to default value */
  1639. + rt2800_rfcsr_write(rt2x00dev, 0, 0x02);
  1640. + rt2800_rfcsr_write(rt2x00dev, 1, 0x03);
  1641. + rt2800_rfcsr_write(rt2x00dev, 2, 0x33);
  1642. + rt2800_rfcsr_write(rt2x00dev, 3, 0xFF);
  1643. + rt2800_rfcsr_write(rt2x00dev, 4, 0x0C);
  1644. + rt2800_rfcsr_write(rt2x00dev, 5, 0x40);
  1645. + rt2800_rfcsr_write(rt2x00dev, 6, 0x00);
  1646. + rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
  1647. + rt2800_rfcsr_write(rt2x00dev, 8, 0x00);
  1648. + rt2800_rfcsr_write(rt2x00dev, 9, 0x00);
  1649. + rt2800_rfcsr_write(rt2x00dev, 10, 0x00);
  1650. + rt2800_rfcsr_write(rt2x00dev, 11, 0x00);
  1651. + rt2800_rfcsr_write(rt2x00dev, 12, rt2x00dev->freq_offset);
  1652. + rt2800_rfcsr_write(rt2x00dev, 13, 0x00);
  1653. + rt2800_rfcsr_write(rt2x00dev, 14, 0x40);
  1654. + rt2800_rfcsr_write(rt2x00dev, 15, 0x22);
  1655. + rt2800_rfcsr_write(rt2x00dev, 16, 0x4C);
  1656. + rt2800_rfcsr_write(rt2x00dev, 17, 0x00);
  1657. + rt2800_rfcsr_write(rt2x00dev, 18, 0x00);
  1658. + rt2800_rfcsr_write(rt2x00dev, 19, 0x00);
  1659. + rt2800_rfcsr_write(rt2x00dev, 20, 0xA0);
  1660. + rt2800_rfcsr_write(rt2x00dev, 21, 0x12);
  1661. + rt2800_rfcsr_write(rt2x00dev, 22, 0x07);
  1662. + rt2800_rfcsr_write(rt2x00dev, 23, 0x13);
  1663. + rt2800_rfcsr_write(rt2x00dev, 24, 0xFE);
  1664. + rt2800_rfcsr_write(rt2x00dev, 25, 0x24);
  1665. + rt2800_rfcsr_write(rt2x00dev, 26, 0x7A);
  1666. + rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
  1667. + rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
  1668. + rt2800_rfcsr_write(rt2x00dev, 29, 0x05);
  1669. + rt2800_rfcsr_write(rt2x00dev, 30, 0x00);
  1670. + rt2800_rfcsr_write(rt2x00dev, 31, 0x00);
  1671. + rt2800_rfcsr_write(rt2x00dev, 32, 0x00);
  1672. + rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
  1673. + rt2800_rfcsr_write(rt2x00dev, 34, 0x00);
  1674. + rt2800_rfcsr_write(rt2x00dev, 35, 0x00);
  1675. + rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
  1676. + rt2800_rfcsr_write(rt2x00dev, 37, 0x00);
  1677. + rt2800_rfcsr_write(rt2x00dev, 38, 0x00);
  1678. + rt2800_rfcsr_write(rt2x00dev, 39, 0x00);
  1679. + rt2800_rfcsr_write(rt2x00dev, 40, 0x00);
  1680. + rt2800_rfcsr_write(rt2x00dev, 41, 0xD0);
  1681. + rt2800_rfcsr_write(rt2x00dev, 42, 0x5B);
  1682. + rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
  1683. +
  1684. + rt2800_rfcsr_write(rt2x00dev, 11, 0x21);
  1685. + if (rt2800_clk_is_20mhz(rt2x00dev))
  1686. + rt2800_rfcsr_write(rt2x00dev, 13, 0x03);
  1687. + else
  1688. + rt2800_rfcsr_write(rt2x00dev, 13, 0x00);
  1689. + rt2800_rfcsr_write(rt2x00dev, 14, 0x7C);
  1690. + rt2800_rfcsr_write(rt2x00dev, 16, 0x80);
  1691. + rt2800_rfcsr_write(rt2x00dev, 17, 0x99);
  1692. + rt2800_rfcsr_write(rt2x00dev, 18, 0x99);
  1693. + rt2800_rfcsr_write(rt2x00dev, 19, 0x09);
  1694. + rt2800_rfcsr_write(rt2x00dev, 20, 0x50);
  1695. + rt2800_rfcsr_write(rt2x00dev, 21, 0xB0);
  1696. + rt2800_rfcsr_write(rt2x00dev, 22, 0x00);
  1697. + rt2800_rfcsr_write(rt2x00dev, 23, 0x06);
  1698. + rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
  1699. + rt2800_rfcsr_write(rt2x00dev, 25, 0x00);
  1700. + rt2800_rfcsr_write(rt2x00dev, 26, 0x5D);
  1701. + rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
  1702. + rt2800_rfcsr_write(rt2x00dev, 28, 0x61);
  1703. + rt2800_rfcsr_write(rt2x00dev, 29, 0xB5);
  1704. + rt2800_rfcsr_write(rt2x00dev, 43, 0x02);
  1705. +
  1706. + rt2800_rfcsr_write(rt2x00dev, 28, 0x62);
  1707. + rt2800_rfcsr_write(rt2x00dev, 29, 0xAD);
  1708. + rt2800_rfcsr_write(rt2x00dev, 39, 0x80);
  1709. +
  1710. + /* Initialize RF channel register to default value */
  1711. + rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03);
  1712. + rt2800_rfcsr_write_chanreg(rt2x00dev, 1, 0x00);
  1713. + rt2800_rfcsr_write_chanreg(rt2x00dev, 2, 0x00);
  1714. + rt2800_rfcsr_write_chanreg(rt2x00dev, 3, 0x00);
  1715. + rt2800_rfcsr_write_chanreg(rt2x00dev, 4, 0x00);
  1716. + rt2800_rfcsr_write_chanreg(rt2x00dev, 5, 0x08);
  1717. + rt2800_rfcsr_write_chanreg(rt2x00dev, 6, 0x00);
  1718. + rt2800_rfcsr_write_chanreg(rt2x00dev, 7, 0x51);
  1719. + rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x53);
  1720. + rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x16);
  1721. + rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x61);
  1722. + rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53);
  1723. + rt2800_rfcsr_write_chanreg(rt2x00dev, 12, 0x22);
  1724. + rt2800_rfcsr_write_chanreg(rt2x00dev, 13, 0x3D);
  1725. + rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06);
  1726. + rt2800_rfcsr_write_chanreg(rt2x00dev, 15, 0x13);
  1727. + rt2800_rfcsr_write_chanreg(rt2x00dev, 16, 0x22);
  1728. + rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x27);
  1729. + rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x02);
  1730. + rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7);
  1731. + rt2800_rfcsr_write_chanreg(rt2x00dev, 20, 0x01);
  1732. + rt2800_rfcsr_write_chanreg(rt2x00dev, 21, 0x52);
  1733. + rt2800_rfcsr_write_chanreg(rt2x00dev, 22, 0x80);
  1734. + rt2800_rfcsr_write_chanreg(rt2x00dev, 23, 0xB3);
  1735. + rt2800_rfcsr_write_chanreg(rt2x00dev, 24, 0x00);
  1736. + rt2800_rfcsr_write_chanreg(rt2x00dev, 25, 0x00);
  1737. + rt2800_rfcsr_write_chanreg(rt2x00dev, 26, 0x00);
  1738. + rt2800_rfcsr_write_chanreg(rt2x00dev, 27, 0x00);
  1739. + rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x5C);
  1740. + rt2800_rfcsr_write_chanreg(rt2x00dev, 29, 0x6B);
  1741. + rt2800_rfcsr_write_chanreg(rt2x00dev, 30, 0x6B);
  1742. + rt2800_rfcsr_write_chanreg(rt2x00dev, 31, 0x31);
  1743. + rt2800_rfcsr_write_chanreg(rt2x00dev, 32, 0x5D);
  1744. + rt2800_rfcsr_write_chanreg(rt2x00dev, 33, 0x00);
  1745. + rt2800_rfcsr_write_chanreg(rt2x00dev, 34, 0xE6);
  1746. + rt2800_rfcsr_write_chanreg(rt2x00dev, 35, 0x55);
  1747. + rt2800_rfcsr_write_chanreg(rt2x00dev, 36, 0x00);
  1748. + rt2800_rfcsr_write_chanreg(rt2x00dev, 37, 0xBB);
  1749. + rt2800_rfcsr_write_chanreg(rt2x00dev, 38, 0xB3);
  1750. + rt2800_rfcsr_write_chanreg(rt2x00dev, 39, 0xB3);
  1751. + rt2800_rfcsr_write_chanreg(rt2x00dev, 40, 0x03);
  1752. + rt2800_rfcsr_write_chanreg(rt2x00dev, 41, 0x00);
  1753. + rt2800_rfcsr_write_chanreg(rt2x00dev, 42, 0x00);
  1754. + rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xB3);
  1755. + rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xD3);
  1756. + rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5);
  1757. + rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x07);
  1758. + rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x68);
  1759. + rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xEF);
  1760. + rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1C);
  1761. + rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x07);
  1762. + rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0xA8);
  1763. + rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0x85);
  1764. + rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x10);
  1765. + rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x07);
  1766. + rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6A);
  1767. + rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0x85);
  1768. + rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x10);
  1769. + rt2800_rfcsr_write_chanreg(rt2x00dev, 62, 0x1C);
  1770. + rt2800_rfcsr_write_chanreg(rt2x00dev, 63, 0x00);
  1771. +
  1772. + rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5);
  1773. +
  1774. + rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x47);
  1775. + rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x71);
  1776. + rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x33);
  1777. + rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x0E);
  1778. + rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x23);
  1779. + rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA4);
  1780. + rt2800_rfcsr_write_chanreg(rt2x00dev, 20, 0x02);
  1781. + rt2800_rfcsr_write_chanreg(rt2x00dev, 21, 0x12);
  1782. + rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x1C);
  1783. + rt2800_rfcsr_write_chanreg(rt2x00dev, 29, 0xEB);
  1784. + rt2800_rfcsr_write_chanreg(rt2x00dev, 32, 0x7D);
  1785. + rt2800_rfcsr_write_chanreg(rt2x00dev, 34, 0xD6);
  1786. + rt2800_rfcsr_write_chanreg(rt2x00dev, 36, 0x08);
  1787. + rt2800_rfcsr_write_chanreg(rt2x00dev, 38, 0xB4);
  1788. + rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3);
  1789. + rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3);
  1790. + rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5);
  1791. + rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27);
  1792. + rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x69);
  1793. + rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFF);
  1794. + rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x20);
  1795. + rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66);
  1796. + rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF);
  1797. + rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C);
  1798. + rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x20);
  1799. + rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B);
  1800. + rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xF7);
  1801. + rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x09);
  1802. +
  1803. + rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x51);
  1804. + rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06);
  1805. + rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7);
  1806. + rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x2C);
  1807. + rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x64);
  1808. + rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x51);
  1809. + rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x36);
  1810. + rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53);
  1811. + rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16);
  1812. +
  1813. + rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x6C);
  1814. + rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFC);
  1815. + rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1F);
  1816. + rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27);
  1817. + rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66);
  1818. + rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B);
  1819. +
  1820. + /* Initialize RF channel register for DRQFN */
  1821. + rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3);
  1822. + rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xE3);
  1823. + rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xE5);
  1824. + rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x28);
  1825. + rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x68);
  1826. + rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xF7);
  1827. + rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x02);
  1828. + rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xC7);
  1829. +
  1830. + /* Initialize RF DC calibration register to default value */
  1831. + rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47);
  1832. + rt2800_rfcsr_write_dccal(rt2x00dev, 1, 0x00);
  1833. + rt2800_rfcsr_write_dccal(rt2x00dev, 2, 0x00);
  1834. + rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x00);
  1835. + rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x00);
  1836. + rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
  1837. + rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x10);
  1838. + rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x10);
  1839. + rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x04);
  1840. + rt2800_rfcsr_write_dccal(rt2x00dev, 9, 0x00);
  1841. + rt2800_rfcsr_write_dccal(rt2x00dev, 10, 0x07);
  1842. + rt2800_rfcsr_write_dccal(rt2x00dev, 11, 0x01);
  1843. + rt2800_rfcsr_write_dccal(rt2x00dev, 12, 0x07);
  1844. + rt2800_rfcsr_write_dccal(rt2x00dev, 13, 0x07);
  1845. + rt2800_rfcsr_write_dccal(rt2x00dev, 14, 0x07);
  1846. + rt2800_rfcsr_write_dccal(rt2x00dev, 15, 0x20);
  1847. + rt2800_rfcsr_write_dccal(rt2x00dev, 16, 0x22);
  1848. + rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x00);
  1849. + rt2800_rfcsr_write_dccal(rt2x00dev, 18, 0x00);
  1850. + rt2800_rfcsr_write_dccal(rt2x00dev, 19, 0x00);
  1851. + rt2800_rfcsr_write_dccal(rt2x00dev, 20, 0x00);
  1852. + rt2800_rfcsr_write_dccal(rt2x00dev, 21, 0xF1);
  1853. + rt2800_rfcsr_write_dccal(rt2x00dev, 22, 0x11);
  1854. + rt2800_rfcsr_write_dccal(rt2x00dev, 23, 0x02);
  1855. + rt2800_rfcsr_write_dccal(rt2x00dev, 24, 0x41);
  1856. + rt2800_rfcsr_write_dccal(rt2x00dev, 25, 0x20);
  1857. + rt2800_rfcsr_write_dccal(rt2x00dev, 26, 0x00);
  1858. + rt2800_rfcsr_write_dccal(rt2x00dev, 27, 0xD7);
  1859. + rt2800_rfcsr_write_dccal(rt2x00dev, 28, 0xA2);
  1860. + rt2800_rfcsr_write_dccal(rt2x00dev, 29, 0x20);
  1861. + rt2800_rfcsr_write_dccal(rt2x00dev, 30, 0x49);
  1862. + rt2800_rfcsr_write_dccal(rt2x00dev, 31, 0x20);
  1863. + rt2800_rfcsr_write_dccal(rt2x00dev, 32, 0x04);
  1864. + rt2800_rfcsr_write_dccal(rt2x00dev, 33, 0xF1);
  1865. + rt2800_rfcsr_write_dccal(rt2x00dev, 34, 0xA1);
  1866. + rt2800_rfcsr_write_dccal(rt2x00dev, 35, 0x01);
  1867. + rt2800_rfcsr_write_dccal(rt2x00dev, 41, 0x00);
  1868. + rt2800_rfcsr_write_dccal(rt2x00dev, 42, 0x00);
  1869. + rt2800_rfcsr_write_dccal(rt2x00dev, 43, 0x00);
  1870. + rt2800_rfcsr_write_dccal(rt2x00dev, 44, 0x00);
  1871. + rt2800_rfcsr_write_dccal(rt2x00dev, 45, 0x00);
  1872. + rt2800_rfcsr_write_dccal(rt2x00dev, 46, 0x00);
  1873. + rt2800_rfcsr_write_dccal(rt2x00dev, 47, 0x3E);
  1874. + rt2800_rfcsr_write_dccal(rt2x00dev, 48, 0x3D);
  1875. + rt2800_rfcsr_write_dccal(rt2x00dev, 49, 0x3E);
  1876. + rt2800_rfcsr_write_dccal(rt2x00dev, 50, 0x3D);
  1877. + rt2800_rfcsr_write_dccal(rt2x00dev, 51, 0x3E);
  1878. + rt2800_rfcsr_write_dccal(rt2x00dev, 52, 0x3D);
  1879. + rt2800_rfcsr_write_dccal(rt2x00dev, 53, 0x00);
  1880. + rt2800_rfcsr_write_dccal(rt2x00dev, 54, 0x00);
  1881. + rt2800_rfcsr_write_dccal(rt2x00dev, 55, 0x00);
  1882. + rt2800_rfcsr_write_dccal(rt2x00dev, 56, 0x00);
  1883. + rt2800_rfcsr_write_dccal(rt2x00dev, 57, 0x00);
  1884. + rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x10);
  1885. + rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x10);
  1886. + rt2800_rfcsr_write_dccal(rt2x00dev, 60, 0x0A);
  1887. + rt2800_rfcsr_write_dccal(rt2x00dev, 61, 0x00);
  1888. + rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00);
  1889. + rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00);
  1890. +
  1891. + rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x08);
  1892. + rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x04);
  1893. + rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x20);
  1894. +
  1895. + rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
  1896. + rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
  1897. +
  1898. + rt2800_bw_filter_calibration(rt2x00dev, true);
  1899. + rt2800_bw_filter_calibration(rt2x00dev, false);
  1900. +}
  1901. +
  1902. static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
  1903. {
  1904. if (rt2800_is_305x_soc(rt2x00dev)) {
  1905. @@ -6941,6 +8279,9 @@ static void rt2800_init_rfcsr(struct rt2
  1906. case RT5592:
  1907. rt2800_init_rfcsr_5592(rt2x00dev);
  1908. break;
  1909. + case RT6352:
  1910. + rt2800_init_rfcsr_6352(rt2x00dev);
  1911. + break;
  1912. }
  1913. }
  1914. @@ -7307,7 +8648,8 @@ static int rt2800_init_eeprom(struct rt2
  1915. */
  1916. if (rt2x00_rt(rt2x00dev, RT3290) ||
  1917. rt2x00_rt(rt2x00dev, RT5390) ||
  1918. - rt2x00_rt(rt2x00dev, RT5392))
  1919. + rt2x00_rt(rt2x00dev, RT5392) ||
  1920. + rt2x00_rt(rt2x00dev, RT6352))
  1921. rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
  1922. else if (rt2x00_rt(rt2x00dev, RT3352))
  1923. rf = RF3322;
  1924. @@ -7339,6 +8681,7 @@ static int rt2800_init_eeprom(struct rt2
  1925. case RF5390:
  1926. case RF5392:
  1927. case RF5592:
  1928. + case RF7620:
  1929. break;
  1930. default:
  1931. rt2x00_err(rt2x00dev, "Invalid RF chipset 0x%04x detected\n",
  1932. @@ -7746,6 +9089,23 @@ static const struct rf_channel rf_vals_5
  1933. {196, 83, 0, 12, 1},
  1934. };
  1935. +static const struct rf_channel rf_vals_7620[] = {
  1936. + {1, 0x50, 0x99, 0x99, 1},
  1937. + {2, 0x50, 0x44, 0x44, 2},
  1938. + {3, 0x50, 0xEE, 0xEE, 2},
  1939. + {4, 0x50, 0x99, 0x99, 3},
  1940. + {5, 0x51, 0x44, 0x44, 0},
  1941. + {6, 0x51, 0xEE, 0xEE, 0},
  1942. + {7, 0x51, 0x99, 0x99, 1},
  1943. + {8, 0x51, 0x44, 0x44, 2},
  1944. + {9, 0x51, 0xEE, 0xEE, 2},
  1945. + {10, 0x51, 0x99, 0x99, 3},
  1946. + {11, 0x52, 0x44, 0x44, 0},
  1947. + {12, 0x52, 0xEE, 0xEE, 0},
  1948. + {13, 0x52, 0x99, 0x99, 1},
  1949. + {14, 0x52, 0x33, 0x33, 3},
  1950. +};
  1951. +
  1952. static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
  1953. {
  1954. struct hw_mode_spec *spec = &rt2x00dev->spec;
  1955. @@ -7849,6 +9209,11 @@ static int rt2800_probe_hw_mode(struct r
  1956. spec->channels = rf_vals_3x;
  1957. break;
  1958. + case RF7620:
  1959. + spec->num_channels = ARRAY_SIZE(rf_vals_7620);
  1960. + spec->channels = rf_vals_7620;
  1961. + break;
  1962. +
  1963. case RF3052:
  1964. case RF3053:
  1965. spec->num_channels = ARRAY_SIZE(rf_vals_3x);
  1966. @@ -7980,6 +9345,7 @@ static int rt2800_probe_hw_mode(struct r
  1967. case RF5390:
  1968. case RF5392:
  1969. case RF5592:
  1970. + case RF7620:
  1971. __set_bit(CAPABILITY_VCO_RECALIBRATION, &rt2x00dev->cap_flags);
  1972. break;
  1973. }
  1974. @@ -8024,6 +9390,9 @@ static int rt2800_probe_rt(struct rt2x00
  1975. return -ENODEV;
  1976. }
  1977. + if (rt == RT5390 && rt2x00_is_soc(rt2x00dev))
  1978. + rt = RT6352;
  1979. +
  1980. rt2x00_set_rt(rt2x00dev, rt, rev);
  1981. return 0;
  1982. --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
  1983. +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
  1984. @@ -33,6 +33,10 @@
  1985. struct rt2800_drv_data {
  1986. u8 calibration_bw20;
  1987. u8 calibration_bw40;
  1988. + char rx_calibration_bw20;
  1989. + char rx_calibration_bw40;
  1990. + char tx_calibration_bw20;
  1991. + char tx_calibration_bw40;
  1992. u8 bbp25;
  1993. u8 bbp26;
  1994. u8 txmixer_gain_24g;
  1995. --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
  1996. +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
  1997. @@ -174,6 +174,7 @@ struct rt2x00_chip {
  1998. #define RT5390 0x5390 /* 2.4GHz */
  1999. #define RT5392 0x5392 /* 2.4GHz */
  2000. #define RT5592 0x5592
  2001. +#define RT6352 0x6352 /* WSOC 2.4GHz */
  2002. u16 rf;
  2003. u16 rev;