init.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. // SPDX-License-Identifier: ISC
  2. /* Copyright (C) 2023 MediaTek Inc. */
  3. #include <linux/etherdevice.h>
  4. #include <linux/hwmon.h>
  5. #include <linux/hwmon-sysfs.h>
  6. #include <linux/thermal.h>
  7. #include <linux/firmware.h>
  8. #include "mt7925.h"
  9. #include "mac.h"
  10. #include "mcu.h"
  11. static ssize_t mt7925_thermal_temp_show(struct device *dev,
  12. struct device_attribute *attr,
  13. char *buf)
  14. {
  15. switch (to_sensor_dev_attr(attr)->index) {
  16. case 0: {
  17. struct mt792x_phy *phy = dev_get_drvdata(dev);
  18. struct mt792x_dev *mdev = phy->dev;
  19. int temperature;
  20. mt792x_mutex_acquire(mdev);
  21. temperature = mt7925_mcu_get_temperature(phy);
  22. mt792x_mutex_release(mdev);
  23. if (temperature < 0)
  24. return temperature;
  25. /* display in millidegree Celsius */
  26. return sprintf(buf, "%u\n", temperature * 1000);
  27. }
  28. default:
  29. return -EINVAL;
  30. }
  31. }
  32. static SENSOR_DEVICE_ATTR_RO(temp1_input, mt7925_thermal_temp, 0);
  33. static struct attribute *mt7925_hwmon_attrs[] = {
  34. &sensor_dev_attr_temp1_input.dev_attr.attr,
  35. NULL,
  36. };
  37. ATTRIBUTE_GROUPS(mt7925_hwmon);
  38. static int mt7925_thermal_init(struct mt792x_phy *phy)
  39. {
  40. struct wiphy *wiphy = phy->mt76->hw->wiphy;
  41. struct device *hwmon;
  42. const char *name;
  43. if (!IS_REACHABLE(CONFIG_HWMON))
  44. return 0;
  45. name = devm_kasprintf(&wiphy->dev, GFP_KERNEL, "mt7925_%s",
  46. wiphy_name(wiphy));
  47. if (!name)
  48. return -ENOMEM;
  49. hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev, name, phy,
  50. mt7925_hwmon_groups);
  51. return PTR_ERR_OR_ZERO(hwmon);
  52. }
  53. static void
  54. mt7925_regd_notifier(struct wiphy *wiphy,
  55. struct regulatory_request *req)
  56. {
  57. struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
  58. struct mt792x_dev *dev = mt792x_hw_dev(hw);
  59. struct mt76_dev *mdev = &dev->mt76;
  60. /* allow world regdom at the first boot only */
  61. if (!memcmp(req->alpha2, "00", 2) &&
  62. mdev->alpha2[0] && mdev->alpha2[1])
  63. return;
  64. /* do not need to update the same country twice */
  65. if (!memcmp(req->alpha2, mdev->alpha2, 2) &&
  66. dev->country_ie_env == req->country_ie_env)
  67. return;
  68. memcpy(mdev->alpha2, req->alpha2, 2);
  69. mdev->region = req->dfs_region;
  70. dev->country_ie_env = req->country_ie_env;
  71. mt792x_mutex_acquire(dev);
  72. mt7925_mcu_set_clc(dev, req->alpha2, req->country_ie_env);
  73. mt7925_mcu_set_channel_domain(hw->priv);
  74. mt7925_set_tx_sar_pwr(hw, NULL);
  75. mt792x_mutex_release(dev);
  76. }
  77. static void mt7925_mac_init_basic_rates(struct mt792x_dev *dev)
  78. {
  79. int i;
  80. for (i = 0; i < ARRAY_SIZE(mt76_rates); i++) {
  81. u16 rate = mt76_rates[i].hw_value;
  82. u16 idx = MT792x_BASIC_RATES_TBL + i;
  83. rate = FIELD_PREP(MT_TX_RATE_MODE, rate >> 8) |
  84. FIELD_PREP(MT_TX_RATE_IDX, rate & GENMASK(7, 0));
  85. mt7925_mac_set_fixed_rate_table(dev, idx, rate);
  86. }
  87. }
  88. int mt7925_mac_init(struct mt792x_dev *dev)
  89. {
  90. int i;
  91. mt76_rmw_field(dev, MT_MDP_DCR1, MT_MDP_DCR1_MAX_RX_LEN, 1536);
  92. /* enable hardware de-agg */
  93. mt76_set(dev, MT_MDP_DCR0, MT_MDP_DCR0_DAMSDU_EN);
  94. for (i = 0; i < MT792x_WTBL_SIZE; i++)
  95. mt7925_mac_wtbl_update(dev, i,
  96. MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
  97. for (i = 0; i < 2; i++)
  98. mt792x_mac_init_band(dev, i);
  99. mt7925_mac_init_basic_rates(dev);
  100. memzero_explicit(&dev->mt76.alpha2, sizeof(dev->mt76.alpha2));
  101. return 0;
  102. }
  103. EXPORT_SYMBOL_GPL(mt7925_mac_init);
  104. static int __mt7925_init_hardware(struct mt792x_dev *dev)
  105. {
  106. int ret;
  107. ret = mt792x_mcu_init(dev);
  108. if (ret)
  109. goto out;
  110. mt76_eeprom_override(&dev->mphy);
  111. ret = mt7925_mcu_set_eeprom(dev);
  112. if (ret)
  113. goto out;
  114. ret = mt7925_mac_init(dev);
  115. if (ret)
  116. goto out;
  117. out:
  118. return ret;
  119. }
  120. static int mt7925_init_hardware(struct mt792x_dev *dev)
  121. {
  122. int ret, i;
  123. set_bit(MT76_STATE_INITIALIZED, &dev->mphy.state);
  124. for (i = 0; i < MT792x_MCU_INIT_RETRY_COUNT; i++) {
  125. ret = __mt7925_init_hardware(dev);
  126. if (!ret)
  127. break;
  128. mt792x_init_reset(dev);
  129. }
  130. if (i == MT792x_MCU_INIT_RETRY_COUNT) {
  131. dev_err(dev->mt76.dev, "hardware init failed\n");
  132. return ret;
  133. }
  134. return 0;
  135. }
  136. static void mt7925_init_work(struct work_struct *work)
  137. {
  138. struct mt792x_dev *dev = container_of(work, struct mt792x_dev,
  139. init_work);
  140. int ret;
  141. ret = mt7925_init_hardware(dev);
  142. if (ret)
  143. return;
  144. mt76_set_stream_caps(&dev->mphy, true);
  145. mt7925_set_stream_he_eht_caps(&dev->phy);
  146. ret = mt7925_init_mlo_caps(&dev->phy);
  147. if (ret) {
  148. dev_err(dev->mt76.dev, "MLO init failed\n");
  149. return;
  150. }
  151. ret = mt76_register_device(&dev->mt76, true, mt76_rates,
  152. ARRAY_SIZE(mt76_rates));
  153. if (ret) {
  154. dev_err(dev->mt76.dev, "register device failed\n");
  155. return;
  156. }
  157. ret = mt7925_init_debugfs(dev);
  158. if (ret) {
  159. dev_err(dev->mt76.dev, "register debugfs failed\n");
  160. return;
  161. }
  162. ret = mt7925_thermal_init(&dev->phy);
  163. if (ret) {
  164. dev_err(dev->mt76.dev, "thermal init failed\n");
  165. return;
  166. }
  167. ret = mt7925_mcu_set_thermal_protect(dev);
  168. if (ret) {
  169. dev_err(dev->mt76.dev, "thermal protection enable failed\n");
  170. return;
  171. }
  172. /* we support chip reset now */
  173. dev->hw_init_done = true;
  174. mt7925_mcu_set_deep_sleep(dev, dev->pm.ds_enable);
  175. }
  176. int mt7925_register_device(struct mt792x_dev *dev)
  177. {
  178. struct ieee80211_hw *hw = mt76_hw(dev);
  179. int ret;
  180. dev->phy.dev = dev;
  181. dev->phy.mt76 = &dev->mt76.phy;
  182. dev->mt76.phy.priv = &dev->phy;
  183. dev->mt76.tx_worker.fn = mt792x_tx_worker;
  184. INIT_DELAYED_WORK(&dev->pm.ps_work, mt792x_pm_power_save_work);
  185. INIT_WORK(&dev->pm.wake_work, mt792x_pm_wake_work);
  186. spin_lock_init(&dev->pm.wake.lock);
  187. mutex_init(&dev->pm.mutex);
  188. init_waitqueue_head(&dev->pm.wait);
  189. spin_lock_init(&dev->pm.txq_lock);
  190. INIT_DELAYED_WORK(&dev->mphy.mac_work, mt792x_mac_work);
  191. INIT_DELAYED_WORK(&dev->phy.scan_work, mt7925_scan_work);
  192. INIT_DELAYED_WORK(&dev->coredump.work, mt7925_coredump_work);
  193. #if IS_ENABLED(CONFIG_IPV6)
  194. INIT_WORK(&dev->ipv6_ns_work, mt7925_set_ipv6_ns_work);
  195. skb_queue_head_init(&dev->ipv6_ns_list);
  196. #endif
  197. skb_queue_head_init(&dev->phy.scan_event_list);
  198. skb_queue_head_init(&dev->coredump.msg_list);
  199. INIT_WORK(&dev->reset_work, mt7925_mac_reset_work);
  200. INIT_WORK(&dev->init_work, mt7925_init_work);
  201. INIT_WORK(&dev->phy.roc_work, mt7925_roc_work);
  202. timer_setup(&dev->phy.roc_timer, mt792x_roc_timer, 0);
  203. init_waitqueue_head(&dev->phy.roc_wait);
  204. dev->pm.idle_timeout = MT792x_PM_TIMEOUT;
  205. dev->pm.stats.last_wake_event = jiffies;
  206. dev->pm.stats.last_doze_event = jiffies;
  207. if (!mt76_is_usb(&dev->mt76)) {
  208. dev->pm.enable_user = true;
  209. dev->pm.enable = true;
  210. dev->pm.ds_enable_user = true;
  211. dev->pm.ds_enable = true;
  212. }
  213. if (!mt76_is_mmio(&dev->mt76))
  214. hw->extra_tx_headroom += MT_SDIO_TXD_SIZE + MT_SDIO_HDR_SIZE;
  215. mt792x_init_acpi_sar(dev);
  216. ret = mt792x_init_wcid(dev);
  217. if (ret)
  218. return ret;
  219. ret = mt792x_init_wiphy(hw);
  220. if (ret)
  221. return ret;
  222. hw->wiphy->reg_notifier = mt7925_regd_notifier;
  223. dev->mphy.sband_2g.sband.ht_cap.cap |=
  224. IEEE80211_HT_CAP_LDPC_CODING |
  225. IEEE80211_HT_CAP_MAX_AMSDU;
  226. dev->mphy.sband_2g.sband.ht_cap.ampdu_density =
  227. IEEE80211_HT_MPDU_DENSITY_2;
  228. dev->mphy.sband_5g.sband.ht_cap.cap |=
  229. IEEE80211_HT_CAP_LDPC_CODING |
  230. IEEE80211_HT_CAP_MAX_AMSDU;
  231. dev->mphy.sband_2g.sband.ht_cap.ampdu_density =
  232. IEEE80211_HT_MPDU_DENSITY_1;
  233. dev->mphy.sband_5g.sband.vht_cap.cap |=
  234. IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
  235. IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK |
  236. IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
  237. IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
  238. (3 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT);
  239. dev->mphy.sband_5g.sband.vht_cap.cap |=
  240. IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
  241. IEEE80211_VHT_CAP_SHORT_GI_160;
  242. dev->mphy.hw->wiphy->available_antennas_rx = dev->mphy.chainmask;
  243. dev->mphy.hw->wiphy->available_antennas_tx = dev->mphy.chainmask;
  244. queue_work(system_wq, &dev->init_work);
  245. return 0;
  246. }
  247. EXPORT_SYMBOL_GPL(mt7925_register_device);