Lines Matching +full:valid +full:- +full:wakeup +full:- +full:mask
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2019-2022 Realtek Corporation
17 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data; in __rtw89_wow_parse_akm()
18 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in __rtw89_wow_parse_akm()
19 const u8 *rsn, *ies = mgmt->u.assoc_req.variable; in __rtw89_wow_parse_akm()
26 rsn = cfg80211_find_ie(WLAN_EID_RSN, ies, skb->len); in __rtw89_wow_parse_akm()
35 rtw_wow->akm = rsn_ie->akm_cipher_suite.type; in __rtw89_wow_parse_akm()
63 if (cipher_info_defs->cipher == cipher) in rtw89_cipher_alg_recognize()
73 switch (key->cipher) { in _pn_to_iv()
88 return -EINVAL; in _pn_to_iv()
118 err = _pn_to_iv(rtwdev, key, iv, pn, key->keyidx); in rtw89_rx_pn_to_iv()
123 rtw89_debug(rtwdev, RTW89_DBG_WOW, "%s key %d pn-%llx to iv-%*ph\n", in rtw89_rx_pn_to_iv()
124 __func__, key->keyidx, pn, 8, iv); in rtw89_rx_pn_to_iv()
126 rtw89_debug(rtwdev, RTW89_DBG_WOW, "%s key %d pn-%jx to iv-%*ph\n", in rtw89_rx_pn_to_iv()
127 __func__, key->keyidx, (uintmax_t)pn, 8, iv); in rtw89_rx_pn_to_iv()
140 pn = atomic64_inc_return(&key->tx_pn); in rtw89_tx_pn_to_iv()
141 err = _pn_to_iv(rtwdev, key, iv, pn, key->keyidx); in rtw89_tx_pn_to_iv()
146 rtw89_debug(rtwdev, RTW89_DBG_WOW, "%s key %d pn-%llx to iv-%*ph\n", in rtw89_tx_pn_to_iv()
147 __func__, key->keyidx, pn, 8, iv); in rtw89_tx_pn_to_iv()
149 rtw89_debug(rtwdev, RTW89_DBG_WOW, "%s key %d pn-%jx to iv-%*ph\n", in rtw89_tx_pn_to_iv()
150 __func__, key->keyidx, (uintmax_t)pn, 8, iv); in rtw89_tx_pn_to_iv()
159 switch (key->cipher) { in _iv_to_pn()
172 return -EINVAL; in _iv_to_pn()
207 rtw89_debug(rtwdev, RTW89_DBG_WOW, "%s key %d iv-%*ph to pn-%*ph\n", in rtw89_rx_iv_to_pn()
208 __func__, key->keyidx, 8, iv, 6, seq.ccmp.pn); in rtw89_rx_iv_to_pn()
224 atomic64_set(&key->tx_pn, pn); in rtw89_tx_iv_to_pn()
226 rtw89_debug(rtwdev, RTW89_DBG_WOW, "%s key %d iv-%*ph to pn-%llx\n", in rtw89_tx_iv_to_pn()
227 __func__, key->keyidx, 8, iv, pn); in rtw89_tx_iv_to_pn()
229 rtw89_debug(rtwdev, RTW89_DBG_WOW, "%s key %d iv-%*ph to pn-%jx\n", in rtw89_tx_iv_to_pn()
230 __func__, key->keyidx, 8, iv, (uintmax_t)pn); in rtw89_tx_iv_to_pn()
243 if (key->keyidx == 4) in rtw89_rx_pn_get_pmf()
244 memcpy(gtk_info->igtk[0], key->key, key->keylen); in rtw89_rx_pn_get_pmf()
245 else if (key->keyidx == 5) in rtw89_rx_pn_get_pmf()
246 memcpy(gtk_info->igtk[1], key->key, key->keylen); in rtw89_rx_pn_get_pmf()
248 return -EINVAL; in rtw89_rx_pn_get_pmf()
259 gtk_info->ipn = cpu_to_le64(pn); in rtw89_rx_pn_get_pmf()
260 gtk_info->igtk_keyid = cpu_to_le32(key->keyidx); in rtw89_rx_pn_get_pmf()
262 rtw89_debug(rtwdev, RTW89_DBG_WOW, "%s key %d pn-%llx\n", in rtw89_rx_pn_get_pmf()
263 __func__, key->keyidx, pn); in rtw89_rx_pn_get_pmf()
265 rtw89_debug(rtwdev, RTW89_DBG_WOW, "%s key %d pn-%jx\n", in rtw89_rx_pn_get_pmf()
266 __func__, key->keyidx, (uintmax_t)pn); in rtw89_rx_pn_get_pmf()
276 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_rx_pn_set_pmf()
277 struct rtw89_wow_aoac_report *aoac_rpt = &rtw_wow->aoac_rpt; in rtw89_rx_pn_set_pmf()
280 if (key->keyidx != aoac_rpt->igtk_key_id) in rtw89_rx_pn_set_pmf()
292 rtw89_debug(rtwdev, RTW89_DBG_WOW, "%s key %d pn-%*ph\n", in rtw89_rx_pn_set_pmf()
293 __func__, key->keyidx, 6, seq.ccmp.pn); in rtw89_rx_pn_set_pmf()
304 struct rtw89_dev *rtwdev = hw->priv; in rtw89_wow_get_key_info_iter()
305 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_get_key_info_iter()
306 struct rtw89_wow_key_info *key_info = &rtw_wow->key_info; in rtw89_wow_get_key_info_iter()
307 struct rtw89_wow_gtk_info *gtk_info = &rtw_wow->gtk_info; in rtw89_wow_get_key_info_iter()
312 cipher_info = rtw89_cipher_alg_recognize(key->cipher); in rtw89_wow_get_key_info_iter()
314 switch (key->cipher) { in rtw89_wow_get_key_info_iter()
322 key_info->ptk_tx_iv); in rtw89_wow_get_key_info_iter()
326 key_info->ptk_rx_iv); in rtw89_wow_get_key_info_iter()
330 rtw_wow->ptk_alg = cipher_info->fw_alg; in rtw89_wow_get_key_info_iter()
331 rtw_wow->ptk_keyidx = key->keyidx; in rtw89_wow_get_key_info_iter()
334 key_info->gtk_rx_iv[key->keyidx]); in rtw89_wow_get_key_info_iter()
338 rtw_wow->gtk_alg = cipher_info->fw_alg; in rtw89_wow_get_key_info_iter()
339 key_info->gtk_keyidx = key->keyidx; in rtw89_wow_get_key_info_iter()
352 rtw_wow->ptk_alg = cipher_info->fw_alg; in rtw89_wow_get_key_info_iter()
353 rtw_wow->ptk_keyidx = key->keyidx; in rtw89_wow_get_key_info_iter()
354 rtw_wow->gtk_alg = cipher_info->fw_alg; in rtw89_wow_get_key_info_iter()
355 key_info->gtk_keyidx = key->keyidx; in rtw89_wow_get_key_info_iter()
359 key->cipher); in rtw89_wow_get_key_info_iter()
374 struct rtw89_dev *rtwdev = hw->priv; in rtw89_wow_set_key_info_iter()
375 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_set_key_info_iter()
376 struct rtw89_wow_aoac_report *aoac_rpt = &rtw_wow->aoac_rpt; in rtw89_wow_set_key_info_iter()
378 bool update_tx_key_info = iter_data->rx_ready; in rtw89_wow_set_key_info_iter()
381 switch (key->cipher) { in rtw89_wow_set_key_info_iter()
389 aoac_rpt->ptk_rx_iv); in rtw89_wow_set_key_info_iter()
396 aoac_rpt->ptk_tx_iv); in rtw89_wow_set_key_info_iter()
403 aoac_rpt->gtk_rx_iv[key->keyidx]); in rtw89_wow_set_key_info_iter()
408 if (!sta && update_tx_key_info && aoac_rpt->rekey_ok) in rtw89_wow_set_key_info_iter()
409 iter_data->gtk_cipher = key->cipher; in rtw89_wow_set_key_info_iter()
413 if (aoac_rpt->rekey_ok) in rtw89_wow_set_key_info_iter()
414 iter_data->igtk_cipher = key->cipher; in rtw89_wow_set_key_info_iter()
417 aoac_rpt->igtk_ipn); in rtw89_wow_set_key_info_iter()
427 key->cipher); in rtw89_wow_set_key_info_iter()
434 iter_data->error = true; in rtw89_wow_set_key_info_iter()
439 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_key_clear()
441 memset(&rtw_wow->aoac_rpt, 0, sizeof(rtw_wow->aoac_rpt)); in rtw89_wow_key_clear()
442 memset(&rtw_wow->gtk_info, 0, sizeof(rtw_wow->gtk_info)); in rtw89_wow_key_clear()
443 memset(&rtw_wow->key_info, 0, sizeof(rtw_wow->key_info)); in rtw89_wow_key_clear()
444 rtw_wow->ptk_alg = 0; in rtw89_wow_key_clear()
445 rtw_wow->gtk_alg = 0; in rtw89_wow_key_clear()
450 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_construct_key_info()
451 struct rtw89_wow_key_info *key_info = &rtw_wow->key_info; in rtw89_wow_construct_key_info()
452 struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link; in rtw89_wow_construct_key_info()
457 ieee80211_iter_keys_rcu(rtwdev->hw, wow_vif, in rtw89_wow_construct_key_info()
466 key_info->valid_check = RTW89_WOW_VALID_CHECK; in rtw89_wow_construct_key_info()
467 key_info->symbol_check_en = RTW89_WOW_SYMBOL_CHK_PTK | in rtw89_wow_construct_key_info()
473 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_debug_aoac_rpt()
474 struct rtw89_wow_aoac_report *aoac_rpt = &rtw_wow->aoac_rpt; in rtw89_wow_debug_aoac_rpt()
480 aoac_rpt->rpt_ver); in rtw89_wow_debug_aoac_rpt()
482 aoac_rpt->sec_type); in rtw89_wow_debug_aoac_rpt()
484 aoac_rpt->key_idx); in rtw89_wow_debug_aoac_rpt()
486 aoac_rpt->pattern_idx); in rtw89_wow_debug_aoac_rpt()
488 aoac_rpt->rekey_ok); in rtw89_wow_debug_aoac_rpt()
490 8, aoac_rpt->ptk_tx_iv); in rtw89_wow_debug_aoac_rpt()
493 8, aoac_rpt->eapol_key_replay_count); in rtw89_wow_debug_aoac_rpt()
495 8, aoac_rpt->ptk_rx_iv); in rtw89_wow_debug_aoac_rpt()
497 8, aoac_rpt->gtk_rx_iv[0]); in rtw89_wow_debug_aoac_rpt()
499 8, aoac_rpt->gtk_rx_iv[1]); in rtw89_wow_debug_aoac_rpt()
501 8, aoac_rpt->gtk_rx_iv[2]); in rtw89_wow_debug_aoac_rpt()
503 8, aoac_rpt->gtk_rx_iv[3]); in rtw89_wow_debug_aoac_rpt()
506 aoac_rpt->igtk_key_id); in rtw89_wow_debug_aoac_rpt()
508 aoac_rpt->igtk_ipn); in rtw89_wow_debug_aoac_rpt()
511 (uintmax_t)aoac_rpt->igtk_key_id); in rtw89_wow_debug_aoac_rpt()
513 (uintmax_t)aoac_rpt->igtk_ipn); in rtw89_wow_debug_aoac_rpt()
516 32, aoac_rpt->igtk); in rtw89_wow_debug_aoac_rpt()
521 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_get_aoac_rpt_reg()
522 struct rtw89_wow_aoac_report *aoac_rpt = &rtw_wow->aoac_rpt; in rtw89_wow_get_aoac_rpt_reg()
535 aoac_rpt->key_idx = in rtw89_wow_get_aoac_rpt_reg()
537 key_idx = aoac_rpt->key_idx; in rtw89_wow_get_aoac_rpt_reg()
538 aoac_rpt->gtk_rx_iv[key_idx][0] = in rtw89_wow_get_aoac_rpt_reg()
540 aoac_rpt->gtk_rx_iv[key_idx][1] = in rtw89_wow_get_aoac_rpt_reg()
542 aoac_rpt->gtk_rx_iv[key_idx][2] = in rtw89_wow_get_aoac_rpt_reg()
544 aoac_rpt->gtk_rx_iv[key_idx][3] = in rtw89_wow_get_aoac_rpt_reg()
546 aoac_rpt->gtk_rx_iv[key_idx][4] = in rtw89_wow_get_aoac_rpt_reg()
548 aoac_rpt->gtk_rx_iv[key_idx][5] = in rtw89_wow_get_aoac_rpt_reg()
550 aoac_rpt->gtk_rx_iv[key_idx][6] = in rtw89_wow_get_aoac_rpt_reg()
552 aoac_rpt->gtk_rx_iv[key_idx][7] = in rtw89_wow_get_aoac_rpt_reg()
554 aoac_rpt->ptk_rx_iv[0] = in rtw89_wow_get_aoac_rpt_reg()
556 aoac_rpt->ptk_rx_iv[1] = in rtw89_wow_get_aoac_rpt_reg()
558 aoac_rpt->ptk_rx_iv[2] = in rtw89_wow_get_aoac_rpt_reg()
560 aoac_rpt->ptk_rx_iv[3] = in rtw89_wow_get_aoac_rpt_reg()
569 aoac_rpt->ptk_rx_iv[4] = in rtw89_wow_get_aoac_rpt_reg()
571 aoac_rpt->ptk_rx_iv[5] = in rtw89_wow_get_aoac_rpt_reg()
573 aoac_rpt->ptk_rx_iv[6] = in rtw89_wow_get_aoac_rpt_reg()
575 aoac_rpt->ptk_rx_iv[7] = in rtw89_wow_get_aoac_rpt_reg()
593 aoac_rpt->igtk_ipn = u64_encode_bits(igtk_ipn[0], RTW89_IGTK_IPN_0) | in rtw89_wow_get_aoac_rpt_reg()
607 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_get_aoac_rpt()
610 if (!rtw_wow->ptk_alg) in rtw89_wow_get_aoac_rpt()
611 return -EPERM; in rtw89_wow_get_aoac_rpt()
635 struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link; in rtw89_wow_gtk_rekey()
642 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_wow_gtk_rekey()
645 sz = struct_size(rekey_conf, key, cipher_info->len); in rtw89_wow_gtk_rekey()
650 rekey_conf->cipher = cipher; in rtw89_wow_gtk_rekey()
651 rekey_conf->keyidx = keyidx; in rtw89_wow_gtk_rekey()
652 rekey_conf->keylen = cipher_info->len; in rtw89_wow_gtk_rekey()
653 memcpy(rekey_conf->key, gtk, in rtw89_wow_gtk_rekey()
654 flex_array_size(rekey_conf, key, cipher_info->len)); in rtw89_wow_gtk_rekey()
658 cipher_info->len, in rtw89_wow_gtk_rekey()
659 rtwvif_link->link_id); in rtw89_wow_gtk_rekey()
662 cipher_info->len, -1); in rtw89_wow_gtk_rekey()
675 struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link; in rtw89_wow_update_key_info()
677 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_update_key_info()
678 struct rtw89_wow_aoac_report *aoac_rpt = &rtw_wow->aoac_rpt; in rtw89_wow_update_key_info()
685 ieee80211_iter_keys_rcu(rtwdev->hw, wow_vif, in rtw89_wow_update_key_info()
697 key = rtw89_wow_gtk_rekey(rtwdev, data.gtk_cipher, aoac_rpt->key_idx, in rtw89_wow_update_key_info()
698 aoac_rpt->gtk); in rtw89_wow_update_key_info()
703 aoac_rpt->gtk_rx_iv[key->keyidx]); in rtw89_wow_update_key_info()
708 key = rtw89_wow_gtk_rekey(rtwdev, data.igtk_cipher, aoac_rpt->igtk_key_id, in rtw89_wow_update_key_info()
709 aoac_rpt->igtk); in rtw89_wow_update_key_info()
713 rtw89_rx_pn_set_pmf(rtwdev, key, aoac_rpt->igtk_ipn); in rtw89_wow_update_key_info()
718 ieee80211_gtk_rekey_notify(wow_vif, bss_conf->bssid, in rtw89_wow_update_key_info()
719 aoac_rpt->eapol_key_replay_count, in rtw89_wow_update_key_info()
737 struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link; in rtw89_wow_enter_ps()
740 rtw89_enter_lps(rtwdev, rtwvif_link->rtwvif, false); in rtw89_wow_enter_ps()
747 struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link; in rtw89_wow_leave_ps()
761 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_wow_config_mac()
763 return mac->wow_config_mac(rtwdev, enable_wow); in rtw89_wow_config_mac()
768 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_wow_set_rx_filter()
773 mac->typ_fltr_opt(rtwdev, RTW89_MGNT, fwd_target, RTW89_MAC_0); in rtw89_wow_set_rx_filter()
774 mac->typ_fltr_opt(rtwdev, RTW89_CTRL, fwd_target, RTW89_MAC_0); in rtw89_wow_set_rx_filter()
775 mac->typ_fltr_opt(rtwdev, RTW89_DATA, fwd_target, RTW89_MAC_0); in rtw89_wow_set_rx_filter()
780 struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link; in rtw89_wow_show_wakeup_reason()
782 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_show_wakeup_reason()
783 struct rtw89_wow_aoac_report *aoac_rpt = &rtw_wow->aoac_rpt; in rtw89_wow_show_wakeup_reason()
785 struct cfg80211_wowlan_wakeup wakeup = { in rtw89_wow_show_wakeup_reason() local
786 .pattern_idx = -1, in rtw89_wow_show_wakeup_reason()
791 if (RTW89_CHK_FW_FEATURE(WOW_REASON_V1, &rtwdev->fw)) in rtw89_wow_show_wakeup_reason()
792 wow_reason_reg = rtwdev->chip->wow_reason_reg[RTW89_WOW_REASON_V1]; in rtw89_wow_show_wakeup_reason()
794 wow_reason_reg = rtwdev->chip->wow_reason_reg[RTW89_WOW_REASON_V0]; in rtw89_wow_show_wakeup_reason()
799 wakeup.disconnect = true; in rtw89_wow_show_wakeup_reason()
803 wakeup.disconnect = true; in rtw89_wow_show_wakeup_reason()
807 wakeup.magic_pkt = true; in rtw89_wow_show_wakeup_reason()
811 wakeup.gtk_rekey_failure = true; in rtw89_wow_show_wakeup_reason()
815 wakeup.pattern_idx = aoac_rpt->pattern_idx; in rtw89_wow_show_wakeup_reason()
823 wakeup.net_detect = &nd_info; in rtw89_wow_show_wakeup_reason()
827 rtw89_warn(rtwdev, "Unknown wakeup reason %x\n", reason); in rtw89_wow_show_wakeup_reason()
832 ieee80211_report_wowlan_wakeup(wow_vif, &wakeup, GFP_KERNEL); in rtw89_wow_show_wakeup_reason()
838 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_vif_iter()
845 if (rtw_wow->rtwvif_link || vif->type != NL80211_IFTYPE_STATION) in rtw89_wow_vif_iter()
848 switch (rtwvif_link->net_type) { in rtw89_wow_vif_iter()
851 rtw_wow->rtwvif_link = rtwvif_link; in rtw89_wow_vif_iter()
854 if (rtw_wow->pno_inited) in rtw89_wow_vif_iter()
855 rtw_wow->rtwvif_link = rtwvif_link; in rtw89_wow_vif_iter()
929 rtw_pattern->bc = true; in rtw89_wow_pattern_get_type()
931 rtw_pattern->mc = true; in rtw89_wow_pattern_get_type()
932 else if (ether_addr_equal(da, rtwvif_link->mac_addr) && in rtw89_wow_pattern_get_type()
934 rtw_pattern->uc = true; in rtw89_wow_pattern_get_type()
938 return -EPERM; in rtw89_wow_pattern_get_type()
950 const u8 *mask; in rtw89_wow_pattern_generate() local
957 pattern = pkt_pattern->pattern; in rtw89_wow_pattern_generate()
958 len = pkt_pattern->pattern_len; in rtw89_wow_pattern_generate()
959 mask = pkt_pattern->mask; in rtw89_wow_pattern_generate()
964 mask[0] & GENMASK(5, 0)); in rtw89_wow_pattern_generate()
968 /* translate mask from os to mask for hw in rtw89_wow_pattern_generate()
971 * |--------+--------+------+-----------+------------+-----| in rtw89_wow_pattern_generate()
977 * |-------------------+--------+------+-----------+------------+-----| in rtw89_wow_pattern_generate()
982 * We should left-shift mask by 6 bits, then set the new bit[0~5] = 0, in rtw89_wow_pattern_generate()
983 * because new mask[0~5] means 'SA', but our HW packet begins from LLC, in rtw89_wow_pattern_generate()
988 for (i = 0; i < mask_len - 1; i++) { in rtw89_wow_pattern_generate()
989 mask_hw[i] = u8_get_bits(mask[i], GENMASK(7, 6)) | in rtw89_wow_pattern_generate()
990 u8_get_bits(mask[i + 1], GENMASK(5, 0)) << 2; in rtw89_wow_pattern_generate()
992 mask_hw[i] = u8_get_bits(mask[i], GENMASK(7, 6)); in rtw89_wow_pattern_generate()
994 /* Set bit 0-5 to zero */ in rtw89_wow_pattern_generate()
997 memcpy(rtw_pattern->mask, mask_hw, sizeof(rtw_pattern->mask)); in rtw89_wow_pattern_generate()
999 /* To get the wake up pattern from the mask. in rtw89_wow_pattern_generate()
1005 if ((mask[i / 8] >> (i % 8)) & 0x01) { in rtw89_wow_pattern_generate()
1011 rtw_pattern->crc = rtw89_calc_crc(content, count); in rtw89_wow_pattern_generate()
1020 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_parse_patterns()
1021 struct rtw89_wow_cam_info *rtw_pattern = rtw_wow->patterns; in rtw89_wow_parse_patterns()
1025 if (!wowlan->n_patterns || !wowlan->patterns) in rtw89_wow_parse_patterns()
1028 for (i = 0; i < wowlan->n_patterns; i++) { in rtw89_wow_parse_patterns()
1029 rtw_pattern = &rtw_wow->patterns[i]; in rtw89_wow_parse_patterns()
1031 &wowlan->patterns[i], in rtw89_wow_parse_patterns()
1035 rtw_wow->pattern_cnt = 0; in rtw89_wow_parse_patterns()
1039 rtw_pattern->r_w = true; in rtw89_wow_parse_patterns()
1040 rtw_pattern->idx = i; in rtw89_wow_parse_patterns()
1041 rtw_pattern->negative_pattern_match = false; in rtw89_wow_parse_patterns()
1042 rtw_pattern->skip_mac_hdr = true; in rtw89_wow_parse_patterns()
1043 rtw_pattern->valid = true; in rtw89_wow_parse_patterns()
1045 rtw_wow->pattern_cnt = wowlan->n_patterns; in rtw89_wow_parse_patterns()
1052 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_pattern_clear_cam()
1053 struct rtw89_wow_cam_info *rtw_pattern = rtw_wow->patterns; in rtw89_wow_pattern_clear_cam()
1056 for (i = 0; i < rtw_wow->pattern_cnt; i++) { in rtw89_wow_pattern_clear_cam()
1057 rtw_pattern = &rtw_wow->patterns[i]; in rtw89_wow_pattern_clear_cam()
1058 rtw_pattern->valid = false; in rtw89_wow_pattern_clear_cam()
1065 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_pattern_write()
1066 struct rtw89_wow_cam_info *rtw_pattern = rtw_wow->patterns; in rtw89_wow_pattern_write()
1069 for (i = 0; i < rtw_wow->pattern_cnt; i++) in rtw89_wow_pattern_write()
1075 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_pattern_clear()
1079 rtw_wow->pattern_cnt = 0; in rtw89_wow_pattern_clear()
1080 memset(rtw_wow->patterns, 0, sizeof(rtw_wow->patterns)); in rtw89_wow_pattern_clear()
1085 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_clear_wakeups()
1087 rtw_wow->rtwvif_link = NULL; in rtw89_wow_clear_wakeups()
1088 rtw89_core_release_all_bits_map(rtw_wow->flags, RTW89_WOW_FLAG_NUM); in rtw89_wow_clear_wakeups()
1089 rtw_wow->pattern_cnt = 0; in rtw89_wow_clear_wakeups()
1090 rtw_wow->pno_inited = false; in rtw89_wow_clear_wakeups()
1096 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_init_pno()
1098 if (!nd_config->n_match_sets || !nd_config->n_channels) in rtw89_wow_init_pno()
1101 rtw_wow->nd_config = nd_config; in rtw89_wow_init_pno()
1102 rtw_wow->pno_inited = true; in rtw89_wow_init_pno()
1104 INIT_LIST_HEAD(&rtw_wow->pno_pkt_list); in rtw89_wow_init_pno()
1106 rtw89_debug(rtwdev, RTW89_DBG_WOW, "WOW: net-detect is enabled\n"); in rtw89_wow_init_pno()
1112 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_set_wakeups()
1116 if (wowlan->disconnect) in rtw89_wow_set_wakeups()
1117 set_bit(RTW89_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags); in rtw89_wow_set_wakeups()
1118 if (wowlan->magic_pkt) in rtw89_wow_set_wakeups()
1119 set_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags); in rtw89_wow_set_wakeups()
1120 if (wowlan->n_patterns && wowlan->patterns) in rtw89_wow_set_wakeups()
1121 set_bit(RTW89_WOW_FLAG_EN_PATTERN, rtw_wow->flags); in rtw89_wow_set_wakeups()
1123 if (wowlan->nd_config) in rtw89_wow_set_wakeups()
1124 rtw89_wow_init_pno(rtwdev, wowlan->nd_config); in rtw89_wow_set_wakeups()
1134 rtwvif_link = rtw_wow->rtwvif_link; in rtw89_wow_set_wakeups()
1136 return -EPERM; in rtw89_wow_set_wakeups()
1143 struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link; in rtw89_wow_cfg_wake_pno()
1154 rtw89_err(rtwdev, "failed to fw wow wakeup ctrl\n"); in rtw89_wow_cfg_wake_pno()
1169 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_cfg_wake()
1170 struct rtw89_vif_link *rtwvif_link = rtw_wow->rtwvif_link; in rtw89_wow_cfg_wake()
1177 wow_sta = ieee80211_find_sta(wow_vif, wow_vif->cfg.ap_addr); in rtw89_wow_cfg_wake()
1180 rtwsta_link = rtwsta->links[rtwvif_link->link_id]; in rtw89_wow_cfg_wake()
1182 return -ENOLINK; in rtw89_wow_cfg_wake()
1186 if (rtw_wow->pattern_cnt) in rtw89_wow_cfg_wake()
1187 rtwvif_link->wowlan_pattern = true; in rtw89_wow_cfg_wake()
1188 if (test_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags)) in rtw89_wow_cfg_wake()
1189 rtwvif_link->wowlan_magic = true; in rtw89_wow_cfg_wake()
1191 rtwvif_link->wowlan_pattern = false; in rtw89_wow_cfg_wake()
1192 rtwvif_link->wowlan_magic = false; in rtw89_wow_cfg_wake()
1197 rtw89_err(rtwdev, "failed to fw wow wakeup ctrl\n"); in rtw89_wow_cfg_wake()
1227 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_wow_check_fw_status()
1234 mac->wow_ctrl.addr, mac->wow_ctrl.mask); in rtw89_wow_check_fw_status()
1244 enum rtw89_chip_gen chip_gen = rtwdev->chip->chip_gen; in rtw89_wow_swap_fw()
1245 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_swap_fw()
1246 struct rtw89_vif_link *rtwvif_link = rtw_wow->rtwvif_link; in rtw89_wow_swap_fw()
1248 enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id; in rtw89_wow_swap_fw()
1249 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_wow_swap_fw()
1250 bool include_bb = !!chip->bbmcu_nr; in rtw89_wow_swap_fw()
1261 wow_sta = ieee80211_find_sta(wow_vif, wow_vif->cfg.ap_addr); in rtw89_wow_swap_fw()
1264 rtwsta_link = rtwsta->links[rtwvif_link->link_id]; in rtw89_wow_swap_fw()
1266 return -ENOLINK; in rtw89_wow_swap_fw()
1314 ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif_link, rtwsta_link->mac_id); in rtw89_wow_swap_fw()
1424 struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link; in rtw89_wow_disable_trx_post()
1439 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_fw_release_pno_pkt_list()
1440 struct list_head *pkt_list = &rtw_wow->pno_pkt_list; in rtw89_fw_release_pno_pkt_list()
1444 rtw89_fw_h2c_del_pkt_offload(rtwdev, info->id); in rtw89_fw_release_pno_pkt_list()
1445 list_del(&info->list); in rtw89_fw_release_pno_pkt_list()
1455 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_pno_scan_update_probe_req()
1456 struct cfg80211_sched_scan_request *nd_config = rtw_wow->nd_config; in rtw89_pno_scan_update_probe_req()
1457 u8 num = nd_config->n_match_sets, i; in rtw89_pno_scan_update_probe_req()
1463 skb = ieee80211_probereq_get(rtwdev->hw, rtwvif_link->mac_addr, in rtw89_pno_scan_update_probe_req()
1464 nd_config->match_sets[i].ssid.ssid, in rtw89_pno_scan_update_probe_req()
1465 nd_config->match_sets[i].ssid.ssid_len, in rtw89_pno_scan_update_probe_req()
1466 nd_config->ie_len + sizeof(basic_rate_ie)); in rtw89_pno_scan_update_probe_req()
1468 return -ENOMEM; in rtw89_pno_scan_update_probe_req()
1471 skb_put_data(skb, nd_config->ie, nd_config->ie_len); in rtw89_pno_scan_update_probe_req()
1477 return -ENOMEM; in rtw89_pno_scan_update_probe_req()
1480 ret = rtw89_fw_h2c_add_pkt_offload(rtwdev, &info->id, skb); in rtw89_pno_scan_update_probe_req()
1488 list_add_tail(&info->list, &rtw_wow->pno_pkt_list); in rtw89_pno_scan_update_probe_req()
1497 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_pno_scan_offload()
1498 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_pno_scan_offload()
1499 struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link; in rtw89_pno_scan_offload()
1500 int interval = rtw_wow->nd_config->scan_plans[0].interval; in rtw89_pno_scan_offload()
1511 ret = mac->add_chan_list_pno(rtwdev, rtwvif_link); in rtw89_pno_scan_offload()
1521 opt.delay = max(rtw_wow->nd_config->delay, 1) * 1000; in rtw89_pno_scan_offload()
1523 if (rtwdev->chip->chip_gen == RTW89_CHIP_BE) { in rtw89_pno_scan_offload()
1528 opt.mlo_mode = rtwdev->mlo_dbcc_mode; in rtw89_pno_scan_offload()
1540 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_fw_start()
1541 struct rtw89_vif_link *rtwvif_link = rtw_wow->rtwvif_link; in rtw89_wow_fw_start()
1608 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_fw_stop()
1609 struct rtw89_vif_link *rtwvif_link = rtw_wow->rtwvif_link; in rtw89_wow_fw_stop()
1675 set_bit(RTW89_FLAG_WOWLAN, rtwdev->flags); in rtw89_wow_enable()
1708 clear_bit(RTW89_FLAG_WOWLAN, rtwdev->flags); in rtw89_wow_enable()
1743 clear_bit(RTW89_FLAG_WOWLAN, rtwdev->flags); in rtw89_wow_disable()
1757 if (!test_bit(RTW89_FLAG_WOWLAN, rtwdev->flags)) { in rtw89_wow_resume()
1759 ret = -EPERM; in rtw89_wow_resume()
1765 ret = -EPERM; in rtw89_wow_resume()
1789 rtw89_err(rtwdev, "failed to set wakeup event\n"); in rtw89_wow_suspend()