mac80211.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955
  1. // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
  2. /* Copyright(c) 2019-2020 Realtek Corporation
  3. */
  4. #include "cam.h"
  5. #include "chan.h"
  6. #include "coex.h"
  7. #include "debug.h"
  8. #include "fw.h"
  9. #include "mac.h"
  10. #include "phy.h"
  11. #include "ps.h"
  12. #include "reg.h"
  13. #include "sar.h"
  14. #include "ser.h"
  15. #include "util.h"
  16. static void rtw89_ops_tx(struct ieee80211_hw *hw,
  17. struct ieee80211_tx_control *control,
  18. struct sk_buff *skb)
  19. {
  20. struct rtw89_dev *rtwdev = hw->priv;
  21. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  22. struct ieee80211_vif *vif = info->control.vif;
  23. struct ieee80211_sta *sta = control->sta;
  24. int ret, qsel;
  25. ret = rtw89_core_tx_write(rtwdev, vif, sta, skb, &qsel);
  26. if (ret) {
  27. rtw89_err(rtwdev, "failed to transmit skb: %d\n", ret);
  28. ieee80211_free_txskb(hw, skb);
  29. return;
  30. }
  31. rtw89_core_tx_kick_off(rtwdev, qsel);
  32. }
  33. static void rtw89_ops_wake_tx_queue(struct ieee80211_hw *hw,
  34. struct ieee80211_txq *txq)
  35. {
  36. struct rtw89_dev *rtwdev = hw->priv;
  37. ieee80211_schedule_txq(hw, txq);
  38. queue_work(rtwdev->txq_wq, &rtwdev->txq_work);
  39. }
  40. static int rtw89_ops_start(struct ieee80211_hw *hw)
  41. {
  42. struct rtw89_dev *rtwdev = hw->priv;
  43. int ret;
  44. mutex_lock(&rtwdev->mutex);
  45. ret = rtw89_core_start(rtwdev);
  46. mutex_unlock(&rtwdev->mutex);
  47. return ret;
  48. }
  49. static void rtw89_ops_stop(struct ieee80211_hw *hw)
  50. {
  51. struct rtw89_dev *rtwdev = hw->priv;
  52. mutex_lock(&rtwdev->mutex);
  53. rtw89_core_stop(rtwdev);
  54. mutex_unlock(&rtwdev->mutex);
  55. }
  56. static int rtw89_ops_config(struct ieee80211_hw *hw, u32 changed)
  57. {
  58. struct rtw89_dev *rtwdev = hw->priv;
  59. /* let previous ips work finish to ensure we don't leave ips twice */
  60. cancel_work_sync(&rtwdev->ips_work);
  61. mutex_lock(&rtwdev->mutex);
  62. rtw89_leave_ps_mode(rtwdev);
  63. if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
  64. !(hw->conf.flags & IEEE80211_CONF_IDLE))
  65. rtw89_leave_ips(rtwdev);
  66. if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
  67. rtw89_config_entity_chandef(rtwdev, RTW89_SUB_ENTITY_0,
  68. &hw->conf.chandef);
  69. rtw89_set_channel(rtwdev);
  70. }
  71. if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
  72. (hw->conf.flags & IEEE80211_CONF_IDLE))
  73. rtw89_enter_ips(rtwdev);
  74. mutex_unlock(&rtwdev->mutex);
  75. return 0;
  76. }
  77. static int rtw89_ops_add_interface(struct ieee80211_hw *hw,
  78. struct ieee80211_vif *vif)
  79. {
  80. struct rtw89_dev *rtwdev = hw->priv;
  81. struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
  82. int ret = 0;
  83. rtw89_debug(rtwdev, RTW89_DBG_STATE, "add vif %pM type %d, p2p %d\n",
  84. vif->addr, vif->type, vif->p2p);
  85. mutex_lock(&rtwdev->mutex);
  86. rtwvif->rtwdev = rtwdev;
  87. list_add_tail(&rtwvif->list, &rtwdev->rtwvifs_list);
  88. INIT_WORK(&rtwvif->update_beacon_work, rtw89_core_update_beacon_work);
  89. rtw89_leave_ps_mode(rtwdev);
  90. rtw89_traffic_stats_init(rtwdev, &rtwvif->stats);
  91. rtw89_vif_type_mapping(vif, false);
  92. rtwvif->port = rtw89_core_acquire_bit_map(rtwdev->hw_port,
  93. RTW89_PORT_NUM);
  94. if (rtwvif->port == RTW89_PORT_NUM) {
  95. ret = -ENOSPC;
  96. goto out;
  97. }
  98. rtwvif->bcn_hit_cond = 0;
  99. rtwvif->mac_idx = RTW89_MAC_0;
  100. rtwvif->phy_idx = RTW89_PHY_0;
  101. rtwvif->hit_rule = 0;
  102. ether_addr_copy(rtwvif->mac_addr, vif->addr);
  103. ret = rtw89_mac_add_vif(rtwdev, rtwvif);
  104. if (ret) {
  105. rtw89_core_release_bit_map(rtwdev->hw_port, rtwvif->port);
  106. goto out;
  107. }
  108. rtw89_core_txq_init(rtwdev, vif->txq);
  109. rtw89_btc_ntfy_role_info(rtwdev, rtwvif, NULL, BTC_ROLE_START);
  110. rtw89_recalc_lps(rtwdev);
  111. out:
  112. mutex_unlock(&rtwdev->mutex);
  113. return ret;
  114. }
  115. static void rtw89_ops_remove_interface(struct ieee80211_hw *hw,
  116. struct ieee80211_vif *vif)
  117. {
  118. struct rtw89_dev *rtwdev = hw->priv;
  119. struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
  120. rtw89_debug(rtwdev, RTW89_DBG_STATE, "remove vif %pM type %d p2p %d\n",
  121. vif->addr, vif->type, vif->p2p);
  122. cancel_work_sync(&rtwvif->update_beacon_work);
  123. mutex_lock(&rtwdev->mutex);
  124. rtw89_leave_ps_mode(rtwdev);
  125. rtw89_btc_ntfy_role_info(rtwdev, rtwvif, NULL, BTC_ROLE_STOP);
  126. rtw89_mac_remove_vif(rtwdev, rtwvif);
  127. rtw89_core_release_bit_map(rtwdev->hw_port, rtwvif->port);
  128. list_del_init(&rtwvif->list);
  129. rtw89_recalc_lps(rtwdev);
  130. mutex_unlock(&rtwdev->mutex);
  131. }
  132. static int rtw89_ops_change_interface(struct ieee80211_hw *hw,
  133. struct ieee80211_vif *vif,
  134. enum nl80211_iftype type, bool p2p)
  135. {
  136. struct rtw89_dev *rtwdev = hw->priv;
  137. rtw89_debug(rtwdev, RTW89_DBG_STATE, "change vif %pM (%d)->(%d), p2p (%d)->(%d)\n",
  138. vif->addr, vif->type, type, vif->p2p, p2p);
  139. rtw89_ops_remove_interface(hw, vif);
  140. vif->type = type;
  141. vif->p2p = p2p;
  142. return rtw89_ops_add_interface(hw, vif);
  143. }
  144. static void rtw89_ops_configure_filter(struct ieee80211_hw *hw,
  145. unsigned int changed_flags,
  146. unsigned int *new_flags,
  147. u64 multicast)
  148. {
  149. struct rtw89_dev *rtwdev = hw->priv;
  150. mutex_lock(&rtwdev->mutex);
  151. rtw89_leave_ps_mode(rtwdev);
  152. *new_flags &= FIF_ALLMULTI | FIF_OTHER_BSS | FIF_FCSFAIL |
  153. FIF_BCN_PRBRESP_PROMISC | FIF_PROBE_REQ;
  154. if (changed_flags & FIF_ALLMULTI) {
  155. if (*new_flags & FIF_ALLMULTI)
  156. rtwdev->hal.rx_fltr &= ~B_AX_A_MC;
  157. else
  158. rtwdev->hal.rx_fltr |= B_AX_A_MC;
  159. }
  160. if (changed_flags & FIF_FCSFAIL) {
  161. if (*new_flags & FIF_FCSFAIL)
  162. rtwdev->hal.rx_fltr |= B_AX_A_CRC32_ERR;
  163. else
  164. rtwdev->hal.rx_fltr &= ~B_AX_A_CRC32_ERR;
  165. }
  166. if (changed_flags & FIF_OTHER_BSS) {
  167. if (*new_flags & FIF_OTHER_BSS)
  168. rtwdev->hal.rx_fltr &= ~B_AX_A_A1_MATCH;
  169. else
  170. rtwdev->hal.rx_fltr |= B_AX_A_A1_MATCH;
  171. }
  172. if (changed_flags & FIF_BCN_PRBRESP_PROMISC) {
  173. if (*new_flags & FIF_BCN_PRBRESP_PROMISC) {
  174. rtwdev->hal.rx_fltr &= ~B_AX_A_BCN_CHK_EN;
  175. rtwdev->hal.rx_fltr &= ~B_AX_A_BC;
  176. rtwdev->hal.rx_fltr &= ~B_AX_A_A1_MATCH;
  177. } else {
  178. rtwdev->hal.rx_fltr |= B_AX_A_BCN_CHK_EN;
  179. rtwdev->hal.rx_fltr |= B_AX_A_BC;
  180. rtwdev->hal.rx_fltr |= B_AX_A_A1_MATCH;
  181. }
  182. }
  183. if (changed_flags & FIF_PROBE_REQ) {
  184. if (*new_flags & FIF_PROBE_REQ) {
  185. rtwdev->hal.rx_fltr &= ~B_AX_A_BC_CAM_MATCH;
  186. rtwdev->hal.rx_fltr &= ~B_AX_A_UC_CAM_MATCH;
  187. } else {
  188. rtwdev->hal.rx_fltr |= B_AX_A_BC_CAM_MATCH;
  189. rtwdev->hal.rx_fltr |= B_AX_A_UC_CAM_MATCH;
  190. }
  191. }
  192. rtw89_write32_mask(rtwdev,
  193. rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_0),
  194. B_AX_RX_FLTR_CFG_MASK,
  195. rtwdev->hal.rx_fltr);
  196. if (!rtwdev->dbcc_en)
  197. goto out;
  198. rtw89_write32_mask(rtwdev,
  199. rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_1),
  200. B_AX_RX_FLTR_CFG_MASK,
  201. rtwdev->hal.rx_fltr);
  202. out:
  203. mutex_unlock(&rtwdev->mutex);
  204. }
  205. static const u8 ac_to_fw_idx[IEEE80211_NUM_ACS] = {
  206. [IEEE80211_AC_VO] = 3,
  207. [IEEE80211_AC_VI] = 2,
  208. [IEEE80211_AC_BE] = 0,
  209. [IEEE80211_AC_BK] = 1,
  210. };
  211. static u8 rtw89_aifsn_to_aifs(struct rtw89_dev *rtwdev,
  212. struct rtw89_vif *rtwvif, u8 aifsn)
  213. {
  214. struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
  215. const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
  216. u8 slot_time;
  217. u8 sifs;
  218. slot_time = vif->bss_conf.use_short_slot ? 9 : 20;
  219. sifs = chan->band_type == RTW89_BAND_5G ? 16 : 10;
  220. return aifsn * slot_time + sifs;
  221. }
  222. static void ____rtw89_conf_tx_edca(struct rtw89_dev *rtwdev,
  223. struct rtw89_vif *rtwvif, u16 ac)
  224. {
  225. struct ieee80211_tx_queue_params *params = &rtwvif->tx_params[ac];
  226. u32 val;
  227. u8 ecw_max, ecw_min;
  228. u8 aifs;
  229. /* 2^ecw - 1 = cw; ecw = log2(cw + 1) */
  230. ecw_max = ilog2(params->cw_max + 1);
  231. ecw_min = ilog2(params->cw_min + 1);
  232. aifs = rtw89_aifsn_to_aifs(rtwdev, rtwvif, params->aifs);
  233. val = FIELD_PREP(FW_EDCA_PARAM_TXOPLMT_MSK, params->txop) |
  234. FIELD_PREP(FW_EDCA_PARAM_CWMAX_MSK, ecw_max) |
  235. FIELD_PREP(FW_EDCA_PARAM_CWMIN_MSK, ecw_min) |
  236. FIELD_PREP(FW_EDCA_PARAM_AIFS_MSK, aifs);
  237. rtw89_fw_h2c_set_edca(rtwdev, rtwvif, ac_to_fw_idx[ac], val);
  238. }
  239. static const u32 ac_to_mu_edca_param[IEEE80211_NUM_ACS] = {
  240. [IEEE80211_AC_VO] = R_AX_MUEDCA_VO_PARAM_0,
  241. [IEEE80211_AC_VI] = R_AX_MUEDCA_VI_PARAM_0,
  242. [IEEE80211_AC_BE] = R_AX_MUEDCA_BE_PARAM_0,
  243. [IEEE80211_AC_BK] = R_AX_MUEDCA_BK_PARAM_0,
  244. };
  245. static void ____rtw89_conf_tx_mu_edca(struct rtw89_dev *rtwdev,
  246. struct rtw89_vif *rtwvif, u16 ac)
  247. {
  248. struct ieee80211_tx_queue_params *params = &rtwvif->tx_params[ac];
  249. struct ieee80211_he_mu_edca_param_ac_rec *mu_edca;
  250. u8 aifs, aifsn;
  251. u16 timer_32us;
  252. u32 reg;
  253. u32 val;
  254. if (!params->mu_edca)
  255. return;
  256. mu_edca = &params->mu_edca_param_rec;
  257. aifsn = FIELD_GET(GENMASK(3, 0), mu_edca->aifsn);
  258. aifs = aifsn ? rtw89_aifsn_to_aifs(rtwdev, rtwvif, aifsn) : 0;
  259. timer_32us = mu_edca->mu_edca_timer << 8;
  260. val = FIELD_PREP(B_AX_MUEDCA_BE_PARAM_0_TIMER_MASK, timer_32us) |
  261. FIELD_PREP(B_AX_MUEDCA_BE_PARAM_0_CW_MASK, mu_edca->ecw_min_max) |
  262. FIELD_PREP(B_AX_MUEDCA_BE_PARAM_0_AIFS_MASK, aifs);
  263. reg = rtw89_mac_reg_by_idx(ac_to_mu_edca_param[ac], rtwvif->mac_idx);
  264. rtw89_write32(rtwdev, reg, val);
  265. rtw89_mac_set_hw_muedca_ctrl(rtwdev, rtwvif, true);
  266. }
  267. static void __rtw89_conf_tx(struct rtw89_dev *rtwdev,
  268. struct rtw89_vif *rtwvif, u16 ac)
  269. {
  270. ____rtw89_conf_tx_edca(rtwdev, rtwvif, ac);
  271. ____rtw89_conf_tx_mu_edca(rtwdev, rtwvif, ac);
  272. }
  273. static void rtw89_conf_tx(struct rtw89_dev *rtwdev,
  274. struct rtw89_vif *rtwvif)
  275. {
  276. u16 ac;
  277. for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
  278. __rtw89_conf_tx(rtwdev, rtwvif, ac);
  279. }
  280. static void rtw89_station_mode_sta_assoc(struct rtw89_dev *rtwdev,
  281. struct ieee80211_vif *vif,
  282. struct ieee80211_bss_conf *conf)
  283. {
  284. struct ieee80211_sta *sta;
  285. if (vif->type != NL80211_IFTYPE_STATION)
  286. return;
  287. sta = ieee80211_find_sta(vif, conf->bssid);
  288. if (!sta) {
  289. rtw89_err(rtwdev, "can't find sta to set sta_assoc state\n");
  290. return;
  291. }
  292. rtw89_vif_type_mapping(vif, true);
  293. rtw89_core_sta_assoc(rtwdev, vif, sta);
  294. }
  295. static void rtw89_ops_bss_info_changed(struct ieee80211_hw *hw,
  296. struct ieee80211_vif *vif,
  297. struct ieee80211_bss_conf *conf,
  298. u64 changed)
  299. {
  300. struct rtw89_dev *rtwdev = hw->priv;
  301. struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
  302. mutex_lock(&rtwdev->mutex);
  303. rtw89_leave_ps_mode(rtwdev);
  304. if (changed & BSS_CHANGED_ASSOC) {
  305. if (vif->cfg.assoc) {
  306. rtw89_station_mode_sta_assoc(rtwdev, vif, conf);
  307. rtw89_phy_set_bss_color(rtwdev, vif);
  308. rtw89_chip_cfg_txpwr_ul_tb_offset(rtwdev, vif);
  309. rtw89_mac_port_update(rtwdev, rtwvif);
  310. rtw89_mac_set_he_obss_narrow_bw_ru(rtwdev, vif);
  311. rtw89_store_op_chan(rtwdev, true);
  312. } else {
  313. /* Abort ongoing scan if cancel_scan isn't issued
  314. * when disconnected by peer
  315. */
  316. if (rtwdev->scanning)
  317. rtw89_hw_scan_abort(rtwdev, vif);
  318. }
  319. }
  320. if (changed & BSS_CHANGED_BSSID) {
  321. ether_addr_copy(rtwvif->bssid, conf->bssid);
  322. rtw89_cam_bssid_changed(rtwdev, rtwvif);
  323. rtw89_fw_h2c_cam(rtwdev, rtwvif, NULL, NULL);
  324. }
  325. if (changed & BSS_CHANGED_BEACON)
  326. rtw89_fw_h2c_update_beacon(rtwdev, rtwvif);
  327. if (changed & BSS_CHANGED_ERP_SLOT)
  328. rtw89_conf_tx(rtwdev, rtwvif);
  329. if (changed & BSS_CHANGED_HE_BSS_COLOR)
  330. rtw89_phy_set_bss_color(rtwdev, vif);
  331. if (changed & BSS_CHANGED_MU_GROUPS)
  332. rtw89_mac_bf_set_gid_table(rtwdev, vif, conf);
  333. if (changed & BSS_CHANGED_P2P_PS)
  334. rtw89_process_p2p_ps(rtwdev, vif);
  335. if (changed & BSS_CHANGED_PS)
  336. rtw89_recalc_lps(rtwdev);
  337. mutex_unlock(&rtwdev->mutex);
  338. }
  339. static int rtw89_ops_start_ap(struct ieee80211_hw *hw,
  340. struct ieee80211_vif *vif,
  341. struct ieee80211_bss_conf *link_conf)
  342. {
  343. struct rtw89_dev *rtwdev = hw->priv;
  344. struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
  345. mutex_lock(&rtwdev->mutex);
  346. ether_addr_copy(rtwvif->bssid, vif->bss_conf.bssid);
  347. rtw89_cam_bssid_changed(rtwdev, rtwvif);
  348. rtw89_mac_port_update(rtwdev, rtwvif);
  349. rtw89_fw_h2c_assoc_cmac_tbl(rtwdev, vif, NULL);
  350. rtw89_fw_h2c_role_maintain(rtwdev, rtwvif, NULL, RTW89_ROLE_TYPE_CHANGE);
  351. rtw89_fw_h2c_join_info(rtwdev, rtwvif, NULL, true);
  352. rtw89_fw_h2c_cam(rtwdev, rtwvif, NULL, NULL);
  353. rtw89_chip_rfk_channel(rtwdev);
  354. mutex_unlock(&rtwdev->mutex);
  355. return 0;
  356. }
  357. static
  358. void rtw89_ops_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  359. struct ieee80211_bss_conf *link_conf)
  360. {
  361. struct rtw89_dev *rtwdev = hw->priv;
  362. struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
  363. mutex_lock(&rtwdev->mutex);
  364. rtw89_fw_h2c_assoc_cmac_tbl(rtwdev, vif, NULL);
  365. rtw89_fw_h2c_join_info(rtwdev, rtwvif, NULL, true);
  366. mutex_unlock(&rtwdev->mutex);
  367. }
  368. static int rtw89_ops_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
  369. bool set)
  370. {
  371. struct rtw89_dev *rtwdev = hw->priv;
  372. struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
  373. struct rtw89_vif *rtwvif = rtwsta->rtwvif;
  374. ieee80211_queue_work(rtwdev->hw, &rtwvif->update_beacon_work);
  375. return 0;
  376. }
  377. static int rtw89_ops_conf_tx(struct ieee80211_hw *hw,
  378. struct ieee80211_vif *vif,
  379. unsigned int link_id, u16 ac,
  380. const struct ieee80211_tx_queue_params *params)
  381. {
  382. struct rtw89_dev *rtwdev = hw->priv;
  383. struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
  384. mutex_lock(&rtwdev->mutex);
  385. rtw89_leave_ps_mode(rtwdev);
  386. rtwvif->tx_params[ac] = *params;
  387. __rtw89_conf_tx(rtwdev, rtwvif, ac);
  388. mutex_unlock(&rtwdev->mutex);
  389. return 0;
  390. }
  391. static int __rtw89_ops_sta_state(struct ieee80211_hw *hw,
  392. struct ieee80211_vif *vif,
  393. struct ieee80211_sta *sta,
  394. enum ieee80211_sta_state old_state,
  395. enum ieee80211_sta_state new_state)
  396. {
  397. struct rtw89_dev *rtwdev = hw->priv;
  398. if (old_state == IEEE80211_STA_NOTEXIST &&
  399. new_state == IEEE80211_STA_NONE)
  400. return rtw89_core_sta_add(rtwdev, vif, sta);
  401. if (old_state == IEEE80211_STA_AUTH &&
  402. new_state == IEEE80211_STA_ASSOC) {
  403. if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls)
  404. return 0; /* defer to bss_info_changed to have vif info */
  405. return rtw89_core_sta_assoc(rtwdev, vif, sta);
  406. }
  407. if (old_state == IEEE80211_STA_ASSOC &&
  408. new_state == IEEE80211_STA_AUTH)
  409. return rtw89_core_sta_disassoc(rtwdev, vif, sta);
  410. if (old_state == IEEE80211_STA_AUTH &&
  411. new_state == IEEE80211_STA_NONE)
  412. return rtw89_core_sta_disconnect(rtwdev, vif, sta);
  413. if (old_state == IEEE80211_STA_NONE &&
  414. new_state == IEEE80211_STA_NOTEXIST)
  415. return rtw89_core_sta_remove(rtwdev, vif, sta);
  416. return 0;
  417. }
  418. static int rtw89_ops_sta_state(struct ieee80211_hw *hw,
  419. struct ieee80211_vif *vif,
  420. struct ieee80211_sta *sta,
  421. enum ieee80211_sta_state old_state,
  422. enum ieee80211_sta_state new_state)
  423. {
  424. struct rtw89_dev *rtwdev = hw->priv;
  425. int ret;
  426. mutex_lock(&rtwdev->mutex);
  427. rtw89_leave_ps_mode(rtwdev);
  428. ret = __rtw89_ops_sta_state(hw, vif, sta, old_state, new_state);
  429. mutex_unlock(&rtwdev->mutex);
  430. return ret;
  431. }
  432. static int rtw89_ops_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
  433. struct ieee80211_vif *vif,
  434. struct ieee80211_sta *sta,
  435. struct ieee80211_key_conf *key)
  436. {
  437. struct rtw89_dev *rtwdev = hw->priv;
  438. int ret = 0;
  439. mutex_lock(&rtwdev->mutex);
  440. rtw89_leave_ps_mode(rtwdev);
  441. switch (cmd) {
  442. case SET_KEY:
  443. rtw89_btc_ntfy_specific_packet(rtwdev, PACKET_EAPOL_END);
  444. ret = rtw89_cam_sec_key_add(rtwdev, vif, sta, key);
  445. if (ret && ret != -EOPNOTSUPP) {
  446. rtw89_err(rtwdev, "failed to add key to sec cam\n");
  447. goto out;
  448. }
  449. break;
  450. case DISABLE_KEY:
  451. rtw89_hci_flush_queues(rtwdev, BIT(rtwdev->hw->queues) - 1,
  452. false);
  453. rtw89_mac_flush_txq(rtwdev, BIT(rtwdev->hw->queues) - 1, false);
  454. ret = rtw89_cam_sec_key_del(rtwdev, vif, sta, key, true);
  455. if (ret) {
  456. rtw89_err(rtwdev, "failed to remove key from sec cam\n");
  457. goto out;
  458. }
  459. break;
  460. }
  461. out:
  462. mutex_unlock(&rtwdev->mutex);
  463. return ret;
  464. }
  465. static int rtw89_ops_ampdu_action(struct ieee80211_hw *hw,
  466. struct ieee80211_vif *vif,
  467. struct ieee80211_ampdu_params *params)
  468. {
  469. struct rtw89_dev *rtwdev = hw->priv;
  470. struct ieee80211_sta *sta = params->sta;
  471. struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
  472. u16 tid = params->tid;
  473. struct ieee80211_txq *txq = sta->txq[tid];
  474. struct rtw89_txq *rtwtxq = (struct rtw89_txq *)txq->drv_priv;
  475. switch (params->action) {
  476. case IEEE80211_AMPDU_TX_START:
  477. return IEEE80211_AMPDU_TX_START_IMMEDIATE;
  478. case IEEE80211_AMPDU_TX_STOP_CONT:
  479. case IEEE80211_AMPDU_TX_STOP_FLUSH:
  480. case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
  481. mutex_lock(&rtwdev->mutex);
  482. clear_bit(RTW89_TXQ_F_AMPDU, &rtwtxq->flags);
  483. mutex_unlock(&rtwdev->mutex);
  484. ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
  485. break;
  486. case IEEE80211_AMPDU_TX_OPERATIONAL:
  487. mutex_lock(&rtwdev->mutex);
  488. set_bit(RTW89_TXQ_F_AMPDU, &rtwtxq->flags);
  489. rtwsta->ampdu_params[tid].agg_num = params->buf_size;
  490. rtwsta->ampdu_params[tid].amsdu = params->amsdu;
  491. rtw89_leave_ps_mode(rtwdev);
  492. mutex_unlock(&rtwdev->mutex);
  493. break;
  494. case IEEE80211_AMPDU_RX_START:
  495. mutex_lock(&rtwdev->mutex);
  496. rtw89_fw_h2c_ba_cam(rtwdev, rtwsta, true, params);
  497. mutex_unlock(&rtwdev->mutex);
  498. break;
  499. case IEEE80211_AMPDU_RX_STOP:
  500. mutex_lock(&rtwdev->mutex);
  501. rtw89_fw_h2c_ba_cam(rtwdev, rtwsta, false, params);
  502. mutex_unlock(&rtwdev->mutex);
  503. break;
  504. default:
  505. WARN_ON(1);
  506. return -ENOTSUPP;
  507. }
  508. return 0;
  509. }
  510. static int rtw89_ops_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
  511. {
  512. struct rtw89_dev *rtwdev = hw->priv;
  513. mutex_lock(&rtwdev->mutex);
  514. rtw89_leave_ps_mode(rtwdev);
  515. if (test_bit(RTW89_FLAG_POWERON, rtwdev->flags))
  516. rtw89_mac_update_rts_threshold(rtwdev, RTW89_MAC_0);
  517. mutex_unlock(&rtwdev->mutex);
  518. return 0;
  519. }
  520. static void rtw89_ops_sta_statistics(struct ieee80211_hw *hw,
  521. struct ieee80211_vif *vif,
  522. struct ieee80211_sta *sta,
  523. struct station_info *sinfo)
  524. {
  525. struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
  526. sinfo->txrate = rtwsta->ra_report.txrate;
  527. sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
  528. }
  529. static
  530. void __rtw89_drop_packets(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif)
  531. {
  532. struct rtw89_vif *rtwvif;
  533. if (vif) {
  534. rtwvif = (struct rtw89_vif *)vif->drv_priv;
  535. rtw89_mac_pkt_drop_vif(rtwdev, rtwvif);
  536. } else {
  537. rtw89_for_each_rtwvif(rtwdev, rtwvif)
  538. rtw89_mac_pkt_drop_vif(rtwdev, rtwvif);
  539. }
  540. }
  541. static void rtw89_ops_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  542. u32 queues, bool drop)
  543. {
  544. struct rtw89_dev *rtwdev = hw->priv;
  545. mutex_lock(&rtwdev->mutex);
  546. rtw89_leave_lps(rtwdev);
  547. rtw89_hci_flush_queues(rtwdev, queues, drop);
  548. if (drop && RTW89_CHK_FW_FEATURE(PACKET_DROP, &rtwdev->fw))
  549. __rtw89_drop_packets(rtwdev, vif);
  550. else
  551. rtw89_mac_flush_txq(rtwdev, queues, drop);
  552. mutex_unlock(&rtwdev->mutex);
  553. }
  554. struct rtw89_iter_bitrate_mask_data {
  555. struct rtw89_dev *rtwdev;
  556. struct ieee80211_vif *vif;
  557. const struct cfg80211_bitrate_mask *mask;
  558. };
  559. static void rtw89_ra_mask_info_update_iter(void *data, struct ieee80211_sta *sta)
  560. {
  561. struct rtw89_iter_bitrate_mask_data *br_data = data;
  562. struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
  563. struct ieee80211_vif *vif = rtwvif_to_vif(rtwsta->rtwvif);
  564. if (vif != br_data->vif || vif->p2p)
  565. return;
  566. rtwsta->use_cfg_mask = true;
  567. rtwsta->mask = *br_data->mask;
  568. rtw89_phy_ra_updata_sta(br_data->rtwdev, sta, IEEE80211_RC_SUPP_RATES_CHANGED);
  569. }
  570. static void rtw89_ra_mask_info_update(struct rtw89_dev *rtwdev,
  571. struct ieee80211_vif *vif,
  572. const struct cfg80211_bitrate_mask *mask)
  573. {
  574. struct rtw89_iter_bitrate_mask_data br_data = { .rtwdev = rtwdev,
  575. .vif = vif,
  576. .mask = mask};
  577. ieee80211_iterate_stations_atomic(rtwdev->hw, rtw89_ra_mask_info_update_iter,
  578. &br_data);
  579. }
  580. static int rtw89_ops_set_bitrate_mask(struct ieee80211_hw *hw,
  581. struct ieee80211_vif *vif,
  582. const struct cfg80211_bitrate_mask *mask)
  583. {
  584. struct rtw89_dev *rtwdev = hw->priv;
  585. mutex_lock(&rtwdev->mutex);
  586. rtw89_phy_rate_pattern_vif(rtwdev, vif, mask);
  587. rtw89_ra_mask_info_update(rtwdev, vif, mask);
  588. mutex_unlock(&rtwdev->mutex);
  589. return 0;
  590. }
  591. static
  592. int rtw89_ops_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
  593. {
  594. struct rtw89_dev *rtwdev = hw->priv;
  595. struct rtw89_hal *hal = &rtwdev->hal;
  596. if (rx_ant != hw->wiphy->available_antennas_rx && rx_ant != hal->antenna_rx)
  597. return -EINVAL;
  598. mutex_lock(&rtwdev->mutex);
  599. hal->antenna_tx = tx_ant;
  600. hal->antenna_rx = rx_ant;
  601. hal->tx_path_diversity = false;
  602. mutex_unlock(&rtwdev->mutex);
  603. return 0;
  604. }
  605. static
  606. int rtw89_ops_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
  607. {
  608. struct rtw89_dev *rtwdev = hw->priv;
  609. struct rtw89_hal *hal = &rtwdev->hal;
  610. *tx_ant = hal->antenna_tx;
  611. *rx_ant = hal->antenna_rx;
  612. return 0;
  613. }
  614. static void rtw89_ops_sw_scan_start(struct ieee80211_hw *hw,
  615. struct ieee80211_vif *vif,
  616. const u8 *mac_addr)
  617. {
  618. struct rtw89_dev *rtwdev = hw->priv;
  619. struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
  620. mutex_lock(&rtwdev->mutex);
  621. rtw89_core_scan_start(rtwdev, rtwvif, mac_addr, false);
  622. mutex_unlock(&rtwdev->mutex);
  623. }
  624. static void rtw89_ops_sw_scan_complete(struct ieee80211_hw *hw,
  625. struct ieee80211_vif *vif)
  626. {
  627. struct rtw89_dev *rtwdev = hw->priv;
  628. mutex_lock(&rtwdev->mutex);
  629. rtw89_core_scan_complete(rtwdev, vif, false);
  630. mutex_unlock(&rtwdev->mutex);
  631. }
  632. static void rtw89_ops_reconfig_complete(struct ieee80211_hw *hw,
  633. enum ieee80211_reconfig_type reconfig_type)
  634. {
  635. struct rtw89_dev *rtwdev = hw->priv;
  636. if (reconfig_type == IEEE80211_RECONFIG_TYPE_RESTART)
  637. rtw89_ser_recfg_done(rtwdev);
  638. }
  639. static int rtw89_ops_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  640. struct ieee80211_scan_request *req)
  641. {
  642. struct rtw89_dev *rtwdev = hw->priv;
  643. int ret = 0;
  644. if (!RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw))
  645. return 1;
  646. if (rtwdev->scanning)
  647. return -EBUSY;
  648. mutex_lock(&rtwdev->mutex);
  649. rtw89_hw_scan_start(rtwdev, vif, req);
  650. ret = rtw89_hw_scan_offload(rtwdev, vif, true);
  651. if (ret) {
  652. rtw89_hw_scan_abort(rtwdev, vif);
  653. rtw89_err(rtwdev, "HW scan failed with status: %d\n", ret);
  654. }
  655. mutex_unlock(&rtwdev->mutex);
  656. return ret;
  657. }
  658. static void rtw89_ops_cancel_hw_scan(struct ieee80211_hw *hw,
  659. struct ieee80211_vif *vif)
  660. {
  661. struct rtw89_dev *rtwdev = hw->priv;
  662. if (!RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw))
  663. return;
  664. if (!rtwdev->scanning)
  665. return;
  666. mutex_lock(&rtwdev->mutex);
  667. rtw89_hw_scan_abort(rtwdev, vif);
  668. mutex_unlock(&rtwdev->mutex);
  669. }
  670. static void rtw89_ops_sta_rc_update(struct ieee80211_hw *hw,
  671. struct ieee80211_vif *vif,
  672. struct ieee80211_sta *sta, u32 changed)
  673. {
  674. struct rtw89_dev *rtwdev = hw->priv;
  675. rtw89_phy_ra_updata_sta(rtwdev, sta, changed);
  676. }
  677. static int rtw89_ops_add_chanctx(struct ieee80211_hw *hw,
  678. struct ieee80211_chanctx_conf *ctx)
  679. {
  680. struct rtw89_dev *rtwdev = hw->priv;
  681. int ret;
  682. mutex_lock(&rtwdev->mutex);
  683. ret = rtw89_chanctx_ops_add(rtwdev, ctx);
  684. mutex_unlock(&rtwdev->mutex);
  685. return ret;
  686. }
  687. static void rtw89_ops_remove_chanctx(struct ieee80211_hw *hw,
  688. struct ieee80211_chanctx_conf *ctx)
  689. {
  690. struct rtw89_dev *rtwdev = hw->priv;
  691. mutex_lock(&rtwdev->mutex);
  692. rtw89_chanctx_ops_remove(rtwdev, ctx);
  693. mutex_unlock(&rtwdev->mutex);
  694. }
  695. static void rtw89_ops_change_chanctx(struct ieee80211_hw *hw,
  696. struct ieee80211_chanctx_conf *ctx,
  697. u32 changed)
  698. {
  699. struct rtw89_dev *rtwdev = hw->priv;
  700. mutex_lock(&rtwdev->mutex);
  701. rtw89_chanctx_ops_change(rtwdev, ctx, changed);
  702. mutex_unlock(&rtwdev->mutex);
  703. }
  704. static int rtw89_ops_assign_vif_chanctx(struct ieee80211_hw *hw,
  705. struct ieee80211_vif *vif,
  706. struct ieee80211_bss_conf *link_conf,
  707. struct ieee80211_chanctx_conf *ctx)
  708. {
  709. struct rtw89_dev *rtwdev = hw->priv;
  710. struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
  711. int ret;
  712. mutex_lock(&rtwdev->mutex);
  713. ret = rtw89_chanctx_ops_assign_vif(rtwdev, rtwvif, ctx);
  714. mutex_unlock(&rtwdev->mutex);
  715. return ret;
  716. }
  717. static void rtw89_ops_unassign_vif_chanctx(struct ieee80211_hw *hw,
  718. struct ieee80211_vif *vif,
  719. struct ieee80211_bss_conf *link_conf,
  720. struct ieee80211_chanctx_conf *ctx)
  721. {
  722. struct rtw89_dev *rtwdev = hw->priv;
  723. struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
  724. mutex_lock(&rtwdev->mutex);
  725. rtw89_chanctx_ops_unassign_vif(rtwdev, rtwvif, ctx);
  726. mutex_unlock(&rtwdev->mutex);
  727. }
  728. static void rtw89_set_tid_config_iter(void *data, struct ieee80211_sta *sta)
  729. {
  730. struct cfg80211_tid_config *tid_config = data;
  731. struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
  732. struct rtw89_dev *rtwdev = rtwsta->rtwvif->rtwdev;
  733. rtw89_core_set_tid_config(rtwdev, sta, tid_config);
  734. }
  735. static int rtw89_ops_set_tid_config(struct ieee80211_hw *hw,
  736. struct ieee80211_vif *vif,
  737. struct ieee80211_sta *sta,
  738. struct cfg80211_tid_config *tid_config)
  739. {
  740. struct rtw89_dev *rtwdev = hw->priv;
  741. mutex_lock(&rtwdev->mutex);
  742. if (sta)
  743. rtw89_core_set_tid_config(rtwdev, sta, tid_config);
  744. else
  745. ieee80211_iterate_stations_atomic(rtwdev->hw,
  746. rtw89_set_tid_config_iter,
  747. tid_config);
  748. mutex_unlock(&rtwdev->mutex);
  749. return 0;
  750. }
  751. const struct ieee80211_ops rtw89_ops = {
  752. .tx = rtw89_ops_tx,
  753. .wake_tx_queue = rtw89_ops_wake_tx_queue,
  754. .start = rtw89_ops_start,
  755. .stop = rtw89_ops_stop,
  756. .config = rtw89_ops_config,
  757. .add_interface = rtw89_ops_add_interface,
  758. .change_interface = rtw89_ops_change_interface,
  759. .remove_interface = rtw89_ops_remove_interface,
  760. .configure_filter = rtw89_ops_configure_filter,
  761. .bss_info_changed = rtw89_ops_bss_info_changed,
  762. .start_ap = rtw89_ops_start_ap,
  763. .stop_ap = rtw89_ops_stop_ap,
  764. .set_tim = rtw89_ops_set_tim,
  765. .conf_tx = rtw89_ops_conf_tx,
  766. .sta_state = rtw89_ops_sta_state,
  767. .set_key = rtw89_ops_set_key,
  768. .ampdu_action = rtw89_ops_ampdu_action,
  769. .set_rts_threshold = rtw89_ops_set_rts_threshold,
  770. .sta_statistics = rtw89_ops_sta_statistics,
  771. .flush = rtw89_ops_flush,
  772. .set_bitrate_mask = rtw89_ops_set_bitrate_mask,
  773. .set_antenna = rtw89_ops_set_antenna,
  774. .get_antenna = rtw89_ops_get_antenna,
  775. .sw_scan_start = rtw89_ops_sw_scan_start,
  776. .sw_scan_complete = rtw89_ops_sw_scan_complete,
  777. .reconfig_complete = rtw89_ops_reconfig_complete,
  778. .hw_scan = rtw89_ops_hw_scan,
  779. .cancel_hw_scan = rtw89_ops_cancel_hw_scan,
  780. .add_chanctx = rtw89_ops_add_chanctx,
  781. .remove_chanctx = rtw89_ops_remove_chanctx,
  782. .change_chanctx = rtw89_ops_change_chanctx,
  783. .assign_vif_chanctx = rtw89_ops_assign_vif_chanctx,
  784. .unassign_vif_chanctx = rtw89_ops_unassign_vif_chanctx,
  785. .set_sar_specs = rtw89_ops_set_sar_specs,
  786. .sta_rc_update = rtw89_ops_sta_rc_update,
  787. .set_tid_config = rtw89_ops_set_tid_config,
  788. };
  789. EXPORT_SYMBOL(rtw89_ops);