mac80211.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  1. // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
  2. /* Copyright(c) 2018-2019 Realtek Corporation
  3. */
  4. #include "main.h"
  5. #include "sec.h"
  6. #include "tx.h"
  7. #include "fw.h"
  8. #include "mac.h"
  9. #include "coex.h"
  10. #include "ps.h"
  11. #include "reg.h"
  12. #include "bf.h"
  13. #include "debug.h"
  14. #include "wow.h"
  15. #include "sar.h"
  16. static void rtw_ops_tx(struct ieee80211_hw *hw,
  17. struct ieee80211_tx_control *control,
  18. struct sk_buff *skb)
  19. {
  20. struct rtw_dev *rtwdev = hw->priv;
  21. if (!test_bit(RTW_FLAG_RUNNING, rtwdev->flags)) {
  22. ieee80211_free_txskb(hw, skb);
  23. return;
  24. }
  25. rtw_tx(rtwdev, control, skb);
  26. }
  27. static void rtw_ops_wake_tx_queue(struct ieee80211_hw *hw,
  28. struct ieee80211_txq *txq)
  29. {
  30. struct rtw_dev *rtwdev = hw->priv;
  31. struct rtw_txq *rtwtxq = (struct rtw_txq *)txq->drv_priv;
  32. if (!test_bit(RTW_FLAG_RUNNING, rtwdev->flags))
  33. return;
  34. spin_lock_bh(&rtwdev->txq_lock);
  35. if (list_empty(&rtwtxq->list))
  36. list_add_tail(&rtwtxq->list, &rtwdev->txqs);
  37. spin_unlock_bh(&rtwdev->txq_lock);
  38. queue_work(rtwdev->tx_wq, &rtwdev->tx_work);
  39. }
  40. static int rtw_ops_start(struct ieee80211_hw *hw)
  41. {
  42. struct rtw_dev *rtwdev = hw->priv;
  43. int ret;
  44. mutex_lock(&rtwdev->mutex);
  45. ret = rtw_core_start(rtwdev);
  46. mutex_unlock(&rtwdev->mutex);
  47. return ret;
  48. }
  49. static void rtw_ops_stop(struct ieee80211_hw *hw)
  50. {
  51. struct rtw_dev *rtwdev = hw->priv;
  52. mutex_lock(&rtwdev->mutex);
  53. rtw_core_stop(rtwdev);
  54. mutex_unlock(&rtwdev->mutex);
  55. }
  56. static int rtw_ops_config(struct ieee80211_hw *hw, u32 changed)
  57. {
  58. struct rtw_dev *rtwdev = hw->priv;
  59. int ret = 0;
  60. /* let previous ips work finish to ensure we don't leave ips twice */
  61. cancel_work_sync(&rtwdev->ips_work);
  62. mutex_lock(&rtwdev->mutex);
  63. rtw_leave_lps_deep(rtwdev);
  64. if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
  65. !(hw->conf.flags & IEEE80211_CONF_IDLE)) {
  66. ret = rtw_leave_ips(rtwdev);
  67. if (ret) {
  68. rtw_err(rtwdev, "failed to leave idle state\n");
  69. goto out;
  70. }
  71. }
  72. if (changed & IEEE80211_CONF_CHANGE_CHANNEL)
  73. rtw_set_channel(rtwdev);
  74. if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
  75. (hw->conf.flags & IEEE80211_CONF_IDLE) &&
  76. !test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
  77. rtw_enter_ips(rtwdev);
  78. out:
  79. mutex_unlock(&rtwdev->mutex);
  80. return ret;
  81. }
  82. static const struct rtw_vif_port rtw_vif_port[] = {
  83. [0] = {
  84. .mac_addr = {.addr = 0x0610},
  85. .bssid = {.addr = 0x0618},
  86. .net_type = {.addr = 0x0100, .mask = 0x30000},
  87. .aid = {.addr = 0x06a8, .mask = 0x7ff},
  88. .bcn_ctrl = {.addr = 0x0550, .mask = 0xff},
  89. },
  90. [1] = {
  91. .mac_addr = {.addr = 0x0700},
  92. .bssid = {.addr = 0x0708},
  93. .net_type = {.addr = 0x0100, .mask = 0xc0000},
  94. .aid = {.addr = 0x0710, .mask = 0x7ff},
  95. .bcn_ctrl = {.addr = 0x0551, .mask = 0xff},
  96. },
  97. [2] = {
  98. .mac_addr = {.addr = 0x1620},
  99. .bssid = {.addr = 0x1628},
  100. .net_type = {.addr = 0x1100, .mask = 0x3},
  101. .aid = {.addr = 0x1600, .mask = 0x7ff},
  102. .bcn_ctrl = {.addr = 0x0578, .mask = 0xff},
  103. },
  104. [3] = {
  105. .mac_addr = {.addr = 0x1630},
  106. .bssid = {.addr = 0x1638},
  107. .net_type = {.addr = 0x1100, .mask = 0xc},
  108. .aid = {.addr = 0x1604, .mask = 0x7ff},
  109. .bcn_ctrl = {.addr = 0x0579, .mask = 0xff},
  110. },
  111. [4] = {
  112. .mac_addr = {.addr = 0x1640},
  113. .bssid = {.addr = 0x1648},
  114. .net_type = {.addr = 0x1100, .mask = 0x30},
  115. .aid = {.addr = 0x1608, .mask = 0x7ff},
  116. .bcn_ctrl = {.addr = 0x057a, .mask = 0xff},
  117. },
  118. };
  119. static int rtw_ops_add_interface(struct ieee80211_hw *hw,
  120. struct ieee80211_vif *vif)
  121. {
  122. struct rtw_dev *rtwdev = hw->priv;
  123. struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
  124. enum rtw_net_type net_type;
  125. u32 config = 0;
  126. u8 port = 0;
  127. u8 bcn_ctrl = 0;
  128. if (rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_BCN_FILTER))
  129. vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
  130. IEEE80211_VIF_SUPPORTS_CQM_RSSI;
  131. rtwvif->port = port;
  132. rtwvif->stats.tx_unicast = 0;
  133. rtwvif->stats.rx_unicast = 0;
  134. rtwvif->stats.tx_cnt = 0;
  135. rtwvif->stats.rx_cnt = 0;
  136. rtwvif->scan_req = NULL;
  137. memset(&rtwvif->bfee, 0, sizeof(struct rtw_bfee));
  138. rtwvif->conf = &rtw_vif_port[port];
  139. rtw_txq_init(rtwdev, vif->txq);
  140. INIT_LIST_HEAD(&rtwvif->rsvd_page_list);
  141. mutex_lock(&rtwdev->mutex);
  142. rtw_leave_lps_deep(rtwdev);
  143. switch (vif->type) {
  144. case NL80211_IFTYPE_AP:
  145. case NL80211_IFTYPE_MESH_POINT:
  146. rtw_add_rsvd_page_bcn(rtwdev, rtwvif);
  147. net_type = RTW_NET_AP_MODE;
  148. bcn_ctrl = BIT_EN_BCN_FUNCTION | BIT_DIS_TSF_UDT;
  149. break;
  150. case NL80211_IFTYPE_ADHOC:
  151. rtw_add_rsvd_page_bcn(rtwdev, rtwvif);
  152. net_type = RTW_NET_AD_HOC;
  153. bcn_ctrl = BIT_EN_BCN_FUNCTION | BIT_DIS_TSF_UDT;
  154. break;
  155. case NL80211_IFTYPE_STATION:
  156. rtw_add_rsvd_page_sta(rtwdev, rtwvif);
  157. net_type = RTW_NET_NO_LINK;
  158. bcn_ctrl = BIT_EN_BCN_FUNCTION;
  159. break;
  160. default:
  161. WARN_ON(1);
  162. mutex_unlock(&rtwdev->mutex);
  163. return -EINVAL;
  164. }
  165. ether_addr_copy(rtwvif->mac_addr, vif->addr);
  166. config |= PORT_SET_MAC_ADDR;
  167. rtwvif->net_type = net_type;
  168. config |= PORT_SET_NET_TYPE;
  169. rtwvif->bcn_ctrl = bcn_ctrl;
  170. config |= PORT_SET_BCN_CTRL;
  171. rtw_vif_port_config(rtwdev, rtwvif, config);
  172. rtw_recalc_lps(rtwdev, vif);
  173. mutex_unlock(&rtwdev->mutex);
  174. rtw_dbg(rtwdev, RTW_DBG_STATE, "start vif %pM on port %d\n", vif->addr, rtwvif->port);
  175. return 0;
  176. }
  177. static void rtw_ops_remove_interface(struct ieee80211_hw *hw,
  178. struct ieee80211_vif *vif)
  179. {
  180. struct rtw_dev *rtwdev = hw->priv;
  181. struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
  182. u32 config = 0;
  183. rtw_dbg(rtwdev, RTW_DBG_STATE, "stop vif %pM on port %d\n", vif->addr, rtwvif->port);
  184. mutex_lock(&rtwdev->mutex);
  185. rtw_leave_lps_deep(rtwdev);
  186. rtw_txq_cleanup(rtwdev, vif->txq);
  187. rtw_remove_rsvd_page(rtwdev, rtwvif);
  188. eth_zero_addr(rtwvif->mac_addr);
  189. config |= PORT_SET_MAC_ADDR;
  190. rtwvif->net_type = RTW_NET_NO_LINK;
  191. config |= PORT_SET_NET_TYPE;
  192. rtwvif->bcn_ctrl = 0;
  193. config |= PORT_SET_BCN_CTRL;
  194. rtw_vif_port_config(rtwdev, rtwvif, config);
  195. rtw_recalc_lps(rtwdev, NULL);
  196. mutex_unlock(&rtwdev->mutex);
  197. }
  198. static int rtw_ops_change_interface(struct ieee80211_hw *hw,
  199. struct ieee80211_vif *vif,
  200. enum nl80211_iftype type, bool p2p)
  201. {
  202. struct rtw_dev *rtwdev = hw->priv;
  203. rtw_dbg(rtwdev, RTW_DBG_STATE, "change vif %pM (%d)->(%d), p2p (%d)->(%d)\n",
  204. vif->addr, vif->type, type, vif->p2p, p2p);
  205. rtw_ops_remove_interface(hw, vif);
  206. vif->type = type;
  207. vif->p2p = p2p;
  208. return rtw_ops_add_interface(hw, vif);
  209. }
  210. static void rtw_ops_configure_filter(struct ieee80211_hw *hw,
  211. unsigned int changed_flags,
  212. unsigned int *new_flags,
  213. u64 multicast)
  214. {
  215. struct rtw_dev *rtwdev = hw->priv;
  216. *new_flags &= FIF_ALLMULTI | FIF_OTHER_BSS | FIF_FCSFAIL |
  217. FIF_BCN_PRBRESP_PROMISC;
  218. mutex_lock(&rtwdev->mutex);
  219. rtw_leave_lps_deep(rtwdev);
  220. if (changed_flags & FIF_ALLMULTI) {
  221. if (*new_flags & FIF_ALLMULTI)
  222. rtwdev->hal.rcr |= BIT_AM | BIT_AB;
  223. else
  224. rtwdev->hal.rcr &= ~(BIT_AM | BIT_AB);
  225. }
  226. if (changed_flags & FIF_FCSFAIL) {
  227. if (*new_flags & FIF_FCSFAIL)
  228. rtwdev->hal.rcr |= BIT_ACRC32;
  229. else
  230. rtwdev->hal.rcr &= ~(BIT_ACRC32);
  231. }
  232. if (changed_flags & FIF_OTHER_BSS) {
  233. if (*new_flags & FIF_OTHER_BSS)
  234. rtwdev->hal.rcr |= BIT_AAP;
  235. else
  236. rtwdev->hal.rcr &= ~(BIT_AAP);
  237. }
  238. if (changed_flags & FIF_BCN_PRBRESP_PROMISC) {
  239. if (*new_flags & FIF_BCN_PRBRESP_PROMISC)
  240. rtwdev->hal.rcr &= ~(BIT_CBSSID_BCN | BIT_CBSSID_DATA);
  241. else
  242. rtwdev->hal.rcr |= BIT_CBSSID_BCN;
  243. }
  244. rtw_dbg(rtwdev, RTW_DBG_RX,
  245. "config rx filter, changed=0x%08x, new=0x%08x, rcr=0x%08x\n",
  246. changed_flags, *new_flags, rtwdev->hal.rcr);
  247. rtw_write32(rtwdev, REG_RCR, rtwdev->hal.rcr);
  248. mutex_unlock(&rtwdev->mutex);
  249. }
  250. /* Only have one group of EDCA parameters now */
  251. static const u32 ac_to_edca_param[IEEE80211_NUM_ACS] = {
  252. [IEEE80211_AC_VO] = REG_EDCA_VO_PARAM,
  253. [IEEE80211_AC_VI] = REG_EDCA_VI_PARAM,
  254. [IEEE80211_AC_BE] = REG_EDCA_BE_PARAM,
  255. [IEEE80211_AC_BK] = REG_EDCA_BK_PARAM,
  256. };
  257. static u8 rtw_aifsn_to_aifs(struct rtw_dev *rtwdev,
  258. struct rtw_vif *rtwvif, u8 aifsn)
  259. {
  260. struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
  261. u8 slot_time;
  262. u8 sifs;
  263. slot_time = vif->bss_conf.use_short_slot ? 9 : 20;
  264. sifs = rtwdev->hal.current_band_type == RTW_BAND_5G ? 16 : 10;
  265. return aifsn * slot_time + sifs;
  266. }
  267. static void __rtw_conf_tx(struct rtw_dev *rtwdev,
  268. struct rtw_vif *rtwvif, u16 ac)
  269. {
  270. struct ieee80211_tx_queue_params *params = &rtwvif->tx_params[ac];
  271. u32 edca_param = ac_to_edca_param[ac];
  272. u8 ecw_max, ecw_min;
  273. u8 aifs;
  274. /* 2^ecw - 1 = cw; ecw = log2(cw + 1) */
  275. ecw_max = ilog2(params->cw_max + 1);
  276. ecw_min = ilog2(params->cw_min + 1);
  277. aifs = rtw_aifsn_to_aifs(rtwdev, rtwvif, params->aifs);
  278. rtw_write32_mask(rtwdev, edca_param, BIT_MASK_TXOP_LMT, params->txop);
  279. rtw_write32_mask(rtwdev, edca_param, BIT_MASK_CWMAX, ecw_max);
  280. rtw_write32_mask(rtwdev, edca_param, BIT_MASK_CWMIN, ecw_min);
  281. rtw_write32_mask(rtwdev, edca_param, BIT_MASK_AIFS, aifs);
  282. }
  283. static void rtw_conf_tx(struct rtw_dev *rtwdev,
  284. struct rtw_vif *rtwvif)
  285. {
  286. u16 ac;
  287. for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
  288. __rtw_conf_tx(rtwdev, rtwvif, ac);
  289. }
  290. static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw,
  291. struct ieee80211_vif *vif,
  292. struct ieee80211_bss_conf *conf,
  293. u64 changed)
  294. {
  295. struct rtw_dev *rtwdev = hw->priv;
  296. struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
  297. struct rtw_coex *coex = &rtwdev->coex;
  298. struct rtw_coex_stat *coex_stat = &coex->stat;
  299. u32 config = 0;
  300. mutex_lock(&rtwdev->mutex);
  301. rtw_leave_lps_deep(rtwdev);
  302. if (changed & BSS_CHANGED_ASSOC) {
  303. rtw_vif_assoc_changed(rtwvif, conf);
  304. if (vif->cfg.assoc) {
  305. rtw_coex_connect_notify(rtwdev, COEX_ASSOCIATE_FINISH);
  306. rtw_fw_download_rsvd_page(rtwdev);
  307. rtw_send_rsvd_page_h2c(rtwdev);
  308. rtw_coex_media_status_notify(rtwdev, vif->cfg.assoc);
  309. if (rtw_bf_support)
  310. rtw_bf_assoc(rtwdev, vif, conf);
  311. } else {
  312. rtw_leave_lps(rtwdev);
  313. rtw_bf_disassoc(rtwdev, vif, conf);
  314. /* Abort ongoing scan if cancel_scan isn't issued
  315. * when disconnected by peer
  316. */
  317. if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
  318. rtw_hw_scan_abort(rtwdev, vif);
  319. }
  320. config |= PORT_SET_NET_TYPE;
  321. config |= PORT_SET_AID;
  322. }
  323. if (changed & BSS_CHANGED_BSSID) {
  324. ether_addr_copy(rtwvif->bssid, conf->bssid);
  325. config |= PORT_SET_BSSID;
  326. if (is_zero_ether_addr(rtwvif->bssid))
  327. rtw_clear_op_chan(rtwdev);
  328. else
  329. rtw_store_op_chan(rtwdev, true);
  330. }
  331. if (changed & BSS_CHANGED_BEACON_INT) {
  332. if (ieee80211_vif_type_p2p(vif) == NL80211_IFTYPE_STATION)
  333. coex_stat->wl_beacon_interval = conf->beacon_int;
  334. }
  335. if (changed & BSS_CHANGED_BEACON) {
  336. rtw_set_dtim_period(rtwdev, conf->dtim_period);
  337. rtw_fw_download_rsvd_page(rtwdev);
  338. }
  339. if (changed & BSS_CHANGED_BEACON_ENABLED) {
  340. if (conf->enable_beacon)
  341. rtw_write32_set(rtwdev, REG_FWHW_TXQ_CTRL,
  342. BIT_EN_BCNQ_DL);
  343. else
  344. rtw_write32_clr(rtwdev, REG_FWHW_TXQ_CTRL,
  345. BIT_EN_BCNQ_DL);
  346. }
  347. if (changed & BSS_CHANGED_CQM)
  348. rtw_fw_beacon_filter_config(rtwdev, true, vif);
  349. if (changed & BSS_CHANGED_MU_GROUPS)
  350. rtw_chip_set_gid_table(rtwdev, vif, conf);
  351. if (changed & BSS_CHANGED_ERP_SLOT)
  352. rtw_conf_tx(rtwdev, rtwvif);
  353. if (changed & BSS_CHANGED_PS)
  354. rtw_recalc_lps(rtwdev, NULL);
  355. rtw_vif_port_config(rtwdev, rtwvif, config);
  356. mutex_unlock(&rtwdev->mutex);
  357. }
  358. static int rtw_ops_start_ap(struct ieee80211_hw *hw,
  359. struct ieee80211_vif *vif,
  360. struct ieee80211_bss_conf *link_conf)
  361. {
  362. struct rtw_dev *rtwdev = hw->priv;
  363. const struct rtw_chip_info *chip = rtwdev->chip;
  364. mutex_lock(&rtwdev->mutex);
  365. chip->ops->phy_calibration(rtwdev);
  366. mutex_unlock(&rtwdev->mutex);
  367. return 0;
  368. }
  369. static int rtw_ops_conf_tx(struct ieee80211_hw *hw,
  370. struct ieee80211_vif *vif,
  371. unsigned int link_id, u16 ac,
  372. const struct ieee80211_tx_queue_params *params)
  373. {
  374. struct rtw_dev *rtwdev = hw->priv;
  375. struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
  376. mutex_lock(&rtwdev->mutex);
  377. rtw_leave_lps_deep(rtwdev);
  378. rtwvif->tx_params[ac] = *params;
  379. __rtw_conf_tx(rtwdev, rtwvif, ac);
  380. mutex_unlock(&rtwdev->mutex);
  381. return 0;
  382. }
  383. static int rtw_ops_sta_add(struct ieee80211_hw *hw,
  384. struct ieee80211_vif *vif,
  385. struct ieee80211_sta *sta)
  386. {
  387. struct rtw_dev *rtwdev = hw->priv;
  388. int ret = 0;
  389. mutex_lock(&rtwdev->mutex);
  390. ret = rtw_sta_add(rtwdev, sta, vif);
  391. mutex_unlock(&rtwdev->mutex);
  392. return ret;
  393. }
  394. static int rtw_ops_sta_remove(struct ieee80211_hw *hw,
  395. struct ieee80211_vif *vif,
  396. struct ieee80211_sta *sta)
  397. {
  398. struct rtw_dev *rtwdev = hw->priv;
  399. rtw_fw_beacon_filter_config(rtwdev, false, vif);
  400. mutex_lock(&rtwdev->mutex);
  401. rtw_sta_remove(rtwdev, sta, true);
  402. mutex_unlock(&rtwdev->mutex);
  403. return 0;
  404. }
  405. static int rtw_ops_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
  406. bool set)
  407. {
  408. struct rtw_dev *rtwdev = hw->priv;
  409. ieee80211_queue_work(hw, &rtwdev->update_beacon_work);
  410. return 0;
  411. }
  412. static int rtw_ops_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
  413. struct ieee80211_vif *vif, struct ieee80211_sta *sta,
  414. struct ieee80211_key_conf *key)
  415. {
  416. struct rtw_dev *rtwdev = hw->priv;
  417. struct rtw_sec_desc *sec = &rtwdev->sec;
  418. u8 hw_key_type;
  419. u8 hw_key_idx;
  420. int ret = 0;
  421. switch (key->cipher) {
  422. case WLAN_CIPHER_SUITE_WEP40:
  423. hw_key_type = RTW_CAM_WEP40;
  424. break;
  425. case WLAN_CIPHER_SUITE_WEP104:
  426. hw_key_type = RTW_CAM_WEP104;
  427. break;
  428. case WLAN_CIPHER_SUITE_TKIP:
  429. hw_key_type = RTW_CAM_TKIP;
  430. key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
  431. break;
  432. case WLAN_CIPHER_SUITE_CCMP:
  433. hw_key_type = RTW_CAM_AES;
  434. key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
  435. break;
  436. case WLAN_CIPHER_SUITE_AES_CMAC:
  437. case WLAN_CIPHER_SUITE_BIP_CMAC_256:
  438. case WLAN_CIPHER_SUITE_BIP_GMAC_128:
  439. case WLAN_CIPHER_SUITE_BIP_GMAC_256:
  440. case WLAN_CIPHER_SUITE_CCMP_256:
  441. case WLAN_CIPHER_SUITE_GCMP:
  442. case WLAN_CIPHER_SUITE_GCMP_256:
  443. /* suppress error messages */
  444. return -EOPNOTSUPP;
  445. default:
  446. return -ENOTSUPP;
  447. }
  448. mutex_lock(&rtwdev->mutex);
  449. rtw_leave_lps_deep(rtwdev);
  450. if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
  451. hw_key_idx = rtw_sec_get_free_cam(sec);
  452. } else {
  453. /* multiple interfaces? */
  454. hw_key_idx = key->keyidx;
  455. }
  456. if (hw_key_idx > sec->total_cam_num) {
  457. ret = -ENOSPC;
  458. goto out;
  459. }
  460. switch (cmd) {
  461. case SET_KEY:
  462. /* need sw generated IV */
  463. key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
  464. key->hw_key_idx = hw_key_idx;
  465. rtw_sec_write_cam(rtwdev, sec, sta, key,
  466. hw_key_type, hw_key_idx);
  467. break;
  468. case DISABLE_KEY:
  469. rtw_hci_flush_all_queues(rtwdev, false);
  470. rtw_mac_flush_all_queues(rtwdev, false);
  471. rtw_sec_clear_cam(rtwdev, sec, key->hw_key_idx);
  472. break;
  473. }
  474. /* download new cam settings for PG to backup */
  475. if (rtw_get_lps_deep_mode(rtwdev) == LPS_DEEP_MODE_PG)
  476. rtw_fw_download_rsvd_page(rtwdev);
  477. out:
  478. mutex_unlock(&rtwdev->mutex);
  479. return ret;
  480. }
  481. static int rtw_ops_ampdu_action(struct ieee80211_hw *hw,
  482. struct ieee80211_vif *vif,
  483. struct ieee80211_ampdu_params *params)
  484. {
  485. struct ieee80211_sta *sta = params->sta;
  486. u16 tid = params->tid;
  487. struct ieee80211_txq *txq = sta->txq[tid];
  488. struct rtw_txq *rtwtxq = (struct rtw_txq *)txq->drv_priv;
  489. switch (params->action) {
  490. case IEEE80211_AMPDU_TX_START:
  491. return IEEE80211_AMPDU_TX_START_IMMEDIATE;
  492. case IEEE80211_AMPDU_TX_STOP_CONT:
  493. case IEEE80211_AMPDU_TX_STOP_FLUSH:
  494. case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
  495. clear_bit(RTW_TXQ_AMPDU, &rtwtxq->flags);
  496. ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
  497. break;
  498. case IEEE80211_AMPDU_TX_OPERATIONAL:
  499. set_bit(RTW_TXQ_AMPDU, &rtwtxq->flags);
  500. break;
  501. case IEEE80211_AMPDU_RX_START:
  502. case IEEE80211_AMPDU_RX_STOP:
  503. break;
  504. default:
  505. WARN_ON(1);
  506. return -ENOTSUPP;
  507. }
  508. return 0;
  509. }
  510. static bool rtw_ops_can_aggregate_in_amsdu(struct ieee80211_hw *hw,
  511. struct sk_buff *head,
  512. struct sk_buff *skb)
  513. {
  514. struct rtw_dev *rtwdev = hw->priv;
  515. struct rtw_hal *hal = &rtwdev->hal;
  516. /* we don't want to enable TX AMSDU on 2.4G */
  517. if (hal->current_band_type == RTW_BAND_2G)
  518. return false;
  519. return true;
  520. }
  521. static void rtw_ops_sw_scan_start(struct ieee80211_hw *hw,
  522. struct ieee80211_vif *vif,
  523. const u8 *mac_addr)
  524. {
  525. struct rtw_dev *rtwdev = hw->priv;
  526. struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
  527. mutex_lock(&rtwdev->mutex);
  528. rtw_core_scan_start(rtwdev, rtwvif, mac_addr, false);
  529. mutex_unlock(&rtwdev->mutex);
  530. }
  531. static void rtw_ops_sw_scan_complete(struct ieee80211_hw *hw,
  532. struct ieee80211_vif *vif)
  533. {
  534. struct rtw_dev *rtwdev = hw->priv;
  535. mutex_lock(&rtwdev->mutex);
  536. rtw_core_scan_complete(rtwdev, vif, false);
  537. mutex_unlock(&rtwdev->mutex);
  538. }
  539. static void rtw_ops_mgd_prepare_tx(struct ieee80211_hw *hw,
  540. struct ieee80211_vif *vif,
  541. struct ieee80211_prep_tx_info *info)
  542. {
  543. struct rtw_dev *rtwdev = hw->priv;
  544. mutex_lock(&rtwdev->mutex);
  545. rtw_leave_lps_deep(rtwdev);
  546. rtw_coex_connect_notify(rtwdev, COEX_ASSOCIATE_START);
  547. rtw_chip_prepare_tx(rtwdev);
  548. mutex_unlock(&rtwdev->mutex);
  549. }
  550. static int rtw_ops_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
  551. {
  552. struct rtw_dev *rtwdev = hw->priv;
  553. mutex_lock(&rtwdev->mutex);
  554. rtwdev->rts_threshold = value;
  555. mutex_unlock(&rtwdev->mutex);
  556. return 0;
  557. }
  558. static void rtw_ops_sta_statistics(struct ieee80211_hw *hw,
  559. struct ieee80211_vif *vif,
  560. struct ieee80211_sta *sta,
  561. struct station_info *sinfo)
  562. {
  563. struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
  564. sinfo->txrate = si->ra_report.txrate;
  565. sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
  566. }
  567. static void rtw_ops_flush(struct ieee80211_hw *hw,
  568. struct ieee80211_vif *vif,
  569. u32 queues, bool drop)
  570. {
  571. struct rtw_dev *rtwdev = hw->priv;
  572. mutex_lock(&rtwdev->mutex);
  573. rtw_leave_lps_deep(rtwdev);
  574. rtw_hci_flush_queues(rtwdev, queues, drop);
  575. rtw_mac_flush_queues(rtwdev, queues, drop);
  576. mutex_unlock(&rtwdev->mutex);
  577. }
  578. struct rtw_iter_bitrate_mask_data {
  579. struct rtw_dev *rtwdev;
  580. struct ieee80211_vif *vif;
  581. const struct cfg80211_bitrate_mask *mask;
  582. };
  583. static void rtw_ra_mask_info_update_iter(void *data, struct ieee80211_sta *sta)
  584. {
  585. struct rtw_iter_bitrate_mask_data *br_data = data;
  586. struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
  587. if (si->vif != br_data->vif)
  588. return;
  589. /* free previous mask setting */
  590. kfree(si->mask);
  591. si->mask = kmemdup(br_data->mask, sizeof(struct cfg80211_bitrate_mask),
  592. GFP_ATOMIC);
  593. if (!si->mask) {
  594. si->use_cfg_mask = false;
  595. return;
  596. }
  597. si->use_cfg_mask = true;
  598. rtw_update_sta_info(br_data->rtwdev, si, true);
  599. }
  600. static void rtw_ra_mask_info_update(struct rtw_dev *rtwdev,
  601. struct ieee80211_vif *vif,
  602. const struct cfg80211_bitrate_mask *mask)
  603. {
  604. struct rtw_iter_bitrate_mask_data br_data;
  605. br_data.rtwdev = rtwdev;
  606. br_data.vif = vif;
  607. br_data.mask = mask;
  608. rtw_iterate_stas_atomic(rtwdev, rtw_ra_mask_info_update_iter, &br_data);
  609. }
  610. static int rtw_ops_set_bitrate_mask(struct ieee80211_hw *hw,
  611. struct ieee80211_vif *vif,
  612. const struct cfg80211_bitrate_mask *mask)
  613. {
  614. struct rtw_dev *rtwdev = hw->priv;
  615. rtw_ra_mask_info_update(rtwdev, vif, mask);
  616. return 0;
  617. }
  618. static int rtw_ops_set_antenna(struct ieee80211_hw *hw,
  619. u32 tx_antenna,
  620. u32 rx_antenna)
  621. {
  622. struct rtw_dev *rtwdev = hw->priv;
  623. const struct rtw_chip_info *chip = rtwdev->chip;
  624. int ret;
  625. if (!chip->ops->set_antenna)
  626. return -EOPNOTSUPP;
  627. mutex_lock(&rtwdev->mutex);
  628. ret = chip->ops->set_antenna(rtwdev, tx_antenna, rx_antenna);
  629. mutex_unlock(&rtwdev->mutex);
  630. return ret;
  631. }
  632. static int rtw_ops_get_antenna(struct ieee80211_hw *hw,
  633. u32 *tx_antenna,
  634. u32 *rx_antenna)
  635. {
  636. struct rtw_dev *rtwdev = hw->priv;
  637. struct rtw_hal *hal = &rtwdev->hal;
  638. *tx_antenna = hal->antenna_tx;
  639. *rx_antenna = hal->antenna_rx;
  640. return 0;
  641. }
  642. #ifdef CONFIG_PM
  643. static int rtw_ops_suspend(struct ieee80211_hw *hw,
  644. struct cfg80211_wowlan *wowlan)
  645. {
  646. struct rtw_dev *rtwdev = hw->priv;
  647. int ret;
  648. mutex_lock(&rtwdev->mutex);
  649. ret = rtw_wow_suspend(rtwdev, wowlan);
  650. if (ret)
  651. rtw_err(rtwdev, "failed to suspend for wow %d\n", ret);
  652. mutex_unlock(&rtwdev->mutex);
  653. return ret ? 1 : 0;
  654. }
  655. static int rtw_ops_resume(struct ieee80211_hw *hw)
  656. {
  657. struct rtw_dev *rtwdev = hw->priv;
  658. int ret;
  659. mutex_lock(&rtwdev->mutex);
  660. ret = rtw_wow_resume(rtwdev);
  661. if (ret)
  662. rtw_err(rtwdev, "failed to resume for wow %d\n", ret);
  663. mutex_unlock(&rtwdev->mutex);
  664. return ret ? 1 : 0;
  665. }
  666. static void rtw_ops_set_wakeup(struct ieee80211_hw *hw, bool enabled)
  667. {
  668. struct rtw_dev *rtwdev = hw->priv;
  669. device_set_wakeup_enable(rtwdev->dev, enabled);
  670. }
  671. #endif
  672. static void rtw_reconfig_complete(struct ieee80211_hw *hw,
  673. enum ieee80211_reconfig_type reconfig_type)
  674. {
  675. struct rtw_dev *rtwdev = hw->priv;
  676. mutex_lock(&rtwdev->mutex);
  677. if (reconfig_type == IEEE80211_RECONFIG_TYPE_RESTART)
  678. clear_bit(RTW_FLAG_RESTARTING, rtwdev->flags);
  679. mutex_unlock(&rtwdev->mutex);
  680. }
  681. static int rtw_ops_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  682. struct ieee80211_scan_request *req)
  683. {
  684. struct rtw_dev *rtwdev = hw->priv;
  685. int ret;
  686. if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_SCAN_OFFLOAD))
  687. return 1;
  688. if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
  689. return -EBUSY;
  690. mutex_lock(&rtwdev->mutex);
  691. rtw_hw_scan_start(rtwdev, vif, req);
  692. ret = rtw_hw_scan_offload(rtwdev, vif, true);
  693. if (ret) {
  694. rtw_hw_scan_abort(rtwdev, vif);
  695. rtw_err(rtwdev, "HW scan failed with status: %d\n", ret);
  696. }
  697. mutex_unlock(&rtwdev->mutex);
  698. return ret;
  699. }
  700. static void rtw_ops_cancel_hw_scan(struct ieee80211_hw *hw,
  701. struct ieee80211_vif *vif)
  702. {
  703. struct rtw_dev *rtwdev = hw->priv;
  704. if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_SCAN_OFFLOAD))
  705. return;
  706. if (!test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
  707. return;
  708. mutex_lock(&rtwdev->mutex);
  709. rtw_hw_scan_abort(rtwdev, vif);
  710. mutex_unlock(&rtwdev->mutex);
  711. }
  712. static int rtw_ops_set_sar_specs(struct ieee80211_hw *hw,
  713. const struct cfg80211_sar_specs *sar)
  714. {
  715. struct rtw_dev *rtwdev = hw->priv;
  716. mutex_lock(&rtwdev->mutex);
  717. rtw_set_sar_specs(rtwdev, sar);
  718. mutex_unlock(&rtwdev->mutex);
  719. return 0;
  720. }
  721. static void rtw_ops_sta_rc_update(struct ieee80211_hw *hw,
  722. struct ieee80211_vif *vif,
  723. struct ieee80211_sta *sta, u32 changed)
  724. {
  725. struct rtw_dev *rtwdev = hw->priv;
  726. struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
  727. if (changed & IEEE80211_RC_BW_CHANGED)
  728. ieee80211_queue_work(rtwdev->hw, &si->rc_work);
  729. }
  730. const struct ieee80211_ops rtw_ops = {
  731. .tx = rtw_ops_tx,
  732. .wake_tx_queue = rtw_ops_wake_tx_queue,
  733. .start = rtw_ops_start,
  734. .stop = rtw_ops_stop,
  735. .config = rtw_ops_config,
  736. .add_interface = rtw_ops_add_interface,
  737. .remove_interface = rtw_ops_remove_interface,
  738. .change_interface = rtw_ops_change_interface,
  739. .configure_filter = rtw_ops_configure_filter,
  740. .bss_info_changed = rtw_ops_bss_info_changed,
  741. .start_ap = rtw_ops_start_ap,
  742. .conf_tx = rtw_ops_conf_tx,
  743. .sta_add = rtw_ops_sta_add,
  744. .sta_remove = rtw_ops_sta_remove,
  745. .set_tim = rtw_ops_set_tim,
  746. .set_key = rtw_ops_set_key,
  747. .ampdu_action = rtw_ops_ampdu_action,
  748. .can_aggregate_in_amsdu = rtw_ops_can_aggregate_in_amsdu,
  749. .sw_scan_start = rtw_ops_sw_scan_start,
  750. .sw_scan_complete = rtw_ops_sw_scan_complete,
  751. .mgd_prepare_tx = rtw_ops_mgd_prepare_tx,
  752. .set_rts_threshold = rtw_ops_set_rts_threshold,
  753. .sta_statistics = rtw_ops_sta_statistics,
  754. .flush = rtw_ops_flush,
  755. .set_bitrate_mask = rtw_ops_set_bitrate_mask,
  756. .set_antenna = rtw_ops_set_antenna,
  757. .get_antenna = rtw_ops_get_antenna,
  758. .reconfig_complete = rtw_reconfig_complete,
  759. .hw_scan = rtw_ops_hw_scan,
  760. .cancel_hw_scan = rtw_ops_cancel_hw_scan,
  761. .sta_rc_update = rtw_ops_sta_rc_update,
  762. .set_sar_specs = rtw_ops_set_sar_specs,
  763. #ifdef CONFIG_PM
  764. .suspend = rtw_ops_suspend,
  765. .resume = rtw_ops_resume,
  766. .set_wakeup = rtw_ops_set_wakeup,
  767. #endif
  768. };
  769. EXPORT_SYMBOL(rtw_ops);