init.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * (c) Copyright 2002-2010, Ralink Technology, Inc.
  4. * Copyright (C) 2014 Felix Fietkau <nbd@openwrt.org>
  5. * Copyright (C) 2015 Jakub Kicinski <kubakici@wp.pl>
  6. * Copyright (C) 2018 Stanislaw Gruszka <stf_xl@wp.pl>
  7. */
  8. #include "mt76x0.h"
  9. #include "eeprom.h"
  10. #include "mcu.h"
  11. #include "initvals.h"
  12. #include "initvals_init.h"
  13. #include "../mt76x02_phy.h"
  14. static void
  15. mt76x0_set_wlan_state(struct mt76x02_dev *dev, u32 val, bool enable)
  16. {
  17. u32 mask = MT_CMB_CTRL_XTAL_RDY | MT_CMB_CTRL_PLL_LD;
  18. /* Note: we don't turn off WLAN_CLK because that makes the device
  19. * not respond properly on the probe path.
  20. * In case anyone (PSM?) wants to use this function we can
  21. * bring the clock stuff back and fixup the probe path.
  22. */
  23. if (enable)
  24. val |= (MT_WLAN_FUN_CTRL_WLAN_EN |
  25. MT_WLAN_FUN_CTRL_WLAN_CLK_EN);
  26. else
  27. val &= ~(MT_WLAN_FUN_CTRL_WLAN_EN);
  28. mt76_wr(dev, MT_WLAN_FUN_CTRL, val);
  29. udelay(20);
  30. /* Note: vendor driver tries to disable/enable wlan here and retry
  31. * but the code which does it is so buggy it must have never
  32. * triggered, so don't bother.
  33. */
  34. if (enable && !mt76_poll(dev, MT_CMB_CTRL, mask, mask, 2000))
  35. dev_err(dev->mt76.dev, "PLL and XTAL check failed\n");
  36. }
  37. void mt76x0_chip_onoff(struct mt76x02_dev *dev, bool enable, bool reset)
  38. {
  39. u32 val;
  40. val = mt76_rr(dev, MT_WLAN_FUN_CTRL);
  41. if (reset) {
  42. val |= MT_WLAN_FUN_CTRL_GPIO_OUT_EN;
  43. val &= ~MT_WLAN_FUN_CTRL_FRC_WL_ANT_SEL;
  44. if (val & MT_WLAN_FUN_CTRL_WLAN_EN) {
  45. val |= (MT_WLAN_FUN_CTRL_WLAN_RESET |
  46. MT_WLAN_FUN_CTRL_WLAN_RESET_RF);
  47. mt76_wr(dev, MT_WLAN_FUN_CTRL, val);
  48. udelay(20);
  49. val &= ~(MT_WLAN_FUN_CTRL_WLAN_RESET |
  50. MT_WLAN_FUN_CTRL_WLAN_RESET_RF);
  51. }
  52. }
  53. mt76_wr(dev, MT_WLAN_FUN_CTRL, val);
  54. udelay(20);
  55. mt76x0_set_wlan_state(dev, val, enable);
  56. }
  57. EXPORT_SYMBOL_GPL(mt76x0_chip_onoff);
  58. static void mt76x0_reset_csr_bbp(struct mt76x02_dev *dev)
  59. {
  60. mt76_wr(dev, MT_MAC_SYS_CTRL,
  61. MT_MAC_SYS_CTRL_RESET_CSR |
  62. MT_MAC_SYS_CTRL_RESET_BBP);
  63. msleep(200);
  64. mt76_clear(dev, MT_MAC_SYS_CTRL,
  65. MT_MAC_SYS_CTRL_RESET_CSR |
  66. MT_MAC_SYS_CTRL_RESET_BBP);
  67. }
  68. #define RANDOM_WRITE(dev, tab) \
  69. mt76_wr_rp(dev, MT_MCU_MEMMAP_WLAN, \
  70. tab, ARRAY_SIZE(tab))
  71. static int mt76x0_init_bbp(struct mt76x02_dev *dev)
  72. {
  73. int ret, i;
  74. ret = mt76x0_phy_wait_bbp_ready(dev);
  75. if (ret)
  76. return ret;
  77. RANDOM_WRITE(dev, mt76x0_bbp_init_tab);
  78. for (i = 0; i < ARRAY_SIZE(mt76x0_bbp_switch_tab); i++) {
  79. const struct mt76x0_bbp_switch_item *item = &mt76x0_bbp_switch_tab[i];
  80. const struct mt76_reg_pair *pair = &item->reg_pair;
  81. if (((RF_G_BAND | RF_BW_20) & item->bw_band) == (RF_G_BAND | RF_BW_20))
  82. mt76_wr(dev, pair->reg, pair->value);
  83. }
  84. RANDOM_WRITE(dev, mt76x0_dcoc_tab);
  85. return 0;
  86. }
  87. static void mt76x0_init_mac_registers(struct mt76x02_dev *dev)
  88. {
  89. RANDOM_WRITE(dev, common_mac_reg_table);
  90. /* Enable PBF and MAC clock SYS_CTRL[11:10] = 0x3 */
  91. RANDOM_WRITE(dev, mt76x0_mac_reg_table);
  92. /* Release BBP and MAC reset MAC_SYS_CTRL[1:0] = 0x0 */
  93. mt76_clear(dev, MT_MAC_SYS_CTRL, 0x3);
  94. /* Set 0x141C[15:12]=0xF */
  95. mt76_set(dev, MT_EXT_CCA_CFG, 0xf000);
  96. mt76_clear(dev, MT_FCE_L2_STUFF, MT_FCE_L2_STUFF_WR_MPDU_LEN_EN);
  97. /*
  98. * tx_ring 9 is for mgmt frame
  99. * tx_ring 8 is for in-band command frame.
  100. * WMM_RG0_TXQMA: this register setting is for FCE to
  101. * define the rule of tx_ring 9
  102. * WMM_RG1_TXQMA: this register setting is for FCE to
  103. * define the rule of tx_ring 8
  104. */
  105. mt76_rmw(dev, MT_WMM_CTRL, 0x3ff, 0x201);
  106. }
  107. void mt76x0_mac_stop(struct mt76x02_dev *dev)
  108. {
  109. int i = 200, ok = 0;
  110. mt76_clear(dev, MT_TXOP_CTRL_CFG, MT_TXOP_ED_CCA_EN);
  111. /* Page count on TxQ */
  112. while (i-- && ((mt76_rr(dev, 0x0438) & 0xffffffff) ||
  113. (mt76_rr(dev, 0x0a30) & 0x000000ff) ||
  114. (mt76_rr(dev, 0x0a34) & 0x00ff00ff)))
  115. msleep(10);
  116. if (!mt76_poll(dev, MT_MAC_STATUS, MT_MAC_STATUS_TX, 0, 1000))
  117. dev_warn(dev->mt76.dev, "Warning: MAC TX did not stop!\n");
  118. mt76_clear(dev, MT_MAC_SYS_CTRL, MT_MAC_SYS_CTRL_ENABLE_RX |
  119. MT_MAC_SYS_CTRL_ENABLE_TX);
  120. /* Page count on RxQ */
  121. for (i = 0; i < 200; i++) {
  122. if (!(mt76_rr(dev, MT_RXQ_STA) & 0x00ff0000) &&
  123. !mt76_rr(dev, 0x0a30) &&
  124. !mt76_rr(dev, 0x0a34)) {
  125. if (ok++ > 5)
  126. break;
  127. continue;
  128. }
  129. msleep(1);
  130. }
  131. if (!mt76_poll(dev, MT_MAC_STATUS, MT_MAC_STATUS_RX, 0, 1000))
  132. dev_warn(dev->mt76.dev, "Warning: MAC RX did not stop!\n");
  133. }
  134. EXPORT_SYMBOL_GPL(mt76x0_mac_stop);
  135. int mt76x0_init_hardware(struct mt76x02_dev *dev)
  136. {
  137. int ret, i, k;
  138. if (!mt76x02_wait_for_wpdma(&dev->mt76, 1000))
  139. return -EIO;
  140. /* Wait for ASIC ready after FW load. */
  141. if (!mt76x02_wait_for_mac(&dev->mt76))
  142. return -ETIMEDOUT;
  143. mt76x0_reset_csr_bbp(dev);
  144. ret = mt76x02_mcu_function_select(dev, Q_SELECT, 1);
  145. if (ret)
  146. return ret;
  147. mt76x0_init_mac_registers(dev);
  148. if (!mt76x02_wait_for_txrx_idle(&dev->mt76))
  149. return -EIO;
  150. ret = mt76x0_init_bbp(dev);
  151. if (ret)
  152. return ret;
  153. dev->mt76.rxfilter = mt76_rr(dev, MT_RX_FILTR_CFG);
  154. for (i = 0; i < 16; i++)
  155. for (k = 0; k < 4; k++)
  156. mt76x02_mac_shared_key_setup(dev, i, k, NULL);
  157. for (i = 0; i < 256; i++)
  158. mt76x02_mac_wcid_setup(dev, i, 0, NULL);
  159. ret = mt76x0_eeprom_init(dev);
  160. if (ret)
  161. return ret;
  162. mt76x0_phy_init(dev);
  163. return 0;
  164. }
  165. EXPORT_SYMBOL_GPL(mt76x0_init_hardware);
  166. static void
  167. mt76x0_init_txpower(struct mt76x02_dev *dev,
  168. struct ieee80211_supported_band *sband)
  169. {
  170. struct ieee80211_channel *chan;
  171. struct mt76x02_rate_power t;
  172. s8 tp;
  173. int i;
  174. for (i = 0; i < sband->n_channels; i++) {
  175. chan = &sband->channels[i];
  176. mt76x0_get_tx_power_per_rate(dev, chan, &t);
  177. mt76x0_get_power_info(dev, chan, &tp);
  178. chan->orig_mpwr = (mt76x02_get_max_rate_power(&t) + tp) / 2;
  179. chan->max_power = min_t(int, chan->max_reg_power,
  180. chan->orig_mpwr);
  181. }
  182. }
  183. int mt76x0_register_device(struct mt76x02_dev *dev)
  184. {
  185. int ret;
  186. ret = mt76x02_init_device(dev);
  187. if (ret)
  188. return ret;
  189. mt76x02_config_mac_addr_list(dev);
  190. ret = mt76_register_device(&dev->mt76, true, mt76x02_rates,
  191. ARRAY_SIZE(mt76x02_rates));
  192. if (ret)
  193. return ret;
  194. if (dev->mphy.cap.has_5ghz) {
  195. struct ieee80211_supported_band *sband;
  196. sband = &dev->mphy.sband_5g.sband;
  197. sband->vht_cap.cap &= ~IEEE80211_VHT_CAP_RXLDPC;
  198. mt76x0_init_txpower(dev, sband);
  199. }
  200. if (dev->mphy.cap.has_2ghz)
  201. mt76x0_init_txpower(dev, &dev->mphy.sband_2g.sband);
  202. mt76x02_init_debugfs(dev);
  203. return 0;
  204. }
  205. EXPORT_SYMBOL_GPL(mt76x0_register_device);