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
22 struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif; in rtw89_wow_enter_deep_ps()
23 struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv; in rtw89_wow_enter_deep_ps()
30 struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif; in rtw89_wow_enter_lps()
31 struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv; in rtw89_wow_enter_lps()
43 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_wow_config_mac()
53 rtw89_write32_clr(rtwdev, mac->rx_fltr, B_AX_SNIFFER_MODE); in rtw89_wow_config_mac()
76 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_wow_set_rx_filter()
81 mac->typ_fltr_opt(rtwdev, RTW89_MGNT, fwd_target, RTW89_MAC_0); in rtw89_wow_set_rx_filter()
82 mac->typ_fltr_opt(rtwdev, RTW89_CTRL, fwd_target, RTW89_MAC_0); in rtw89_wow_set_rx_filter()
83 mac->typ_fltr_opt(rtwdev, RTW89_DATA, fwd_target, RTW89_MAC_0); in rtw89_wow_set_rx_filter()
88 enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id; in rtw89_wow_show_wakeup_reason()
90 struct cfg80211_wowlan_wakeup wakeup = { in rtw89_wow_show_wakeup_reason() local
91 .pattern_idx = -1, in rtw89_wow_show_wakeup_reason()
105 wakeup.disconnect = true; in rtw89_wow_show_wakeup_reason()
109 wakeup.disconnect = true; in rtw89_wow_show_wakeup_reason()
113 wakeup.magic_pkt = true; in rtw89_wow_show_wakeup_reason()
117 wakeup.gtk_rekey_failure = true; in rtw89_wow_show_wakeup_reason()
124 wakeup.pattern_idx = 0; in rtw89_wow_show_wakeup_reason()
132 wakeup.net_detect = &nd_info; in rtw89_wow_show_wakeup_reason()
136 rtw89_warn(rtwdev, "Unknown wakeup reason %x\n", reason); in rtw89_wow_show_wakeup_reason()
137 ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, NULL, in rtw89_wow_show_wakeup_reason()
142 ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, &wakeup, in rtw89_wow_show_wakeup_reason()
148 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_vif_iter()
154 if (rtw_wow->wow_vif || vif->type != NL80211_IFTYPE_STATION) in rtw89_wow_vif_iter()
157 switch (rtwvif->net_type) { in rtw89_wow_vif_iter()
159 rtw_wow->wow_vif = vif; in rtw89_wow_vif_iter()
234 rtw_pattern->bc = true; in rtw89_wow_pattern_get_type()
236 rtw_pattern->mc = true; in rtw89_wow_pattern_get_type()
237 else if (ether_addr_equal(da, rtwvif->mac_addr) && in rtw89_wow_pattern_get_type()
239 rtw_pattern->uc = true; in rtw89_wow_pattern_get_type()
243 return -EPERM; in rtw89_wow_pattern_get_type()
255 const u8 *mask; in rtw89_wow_pattern_generate() local
262 pattern = pkt_pattern->pattern; in rtw89_wow_pattern_generate()
263 len = pkt_pattern->pattern_len; in rtw89_wow_pattern_generate()
264 mask = pkt_pattern->mask; in rtw89_wow_pattern_generate()
269 mask[0] & GENMASK(5, 0)); in rtw89_wow_pattern_generate()
273 /* translate mask from os to mask for hw in rtw89_wow_pattern_generate()
276 * |--------+--------+------+-----------+------------+-----| in rtw89_wow_pattern_generate()
282 * |-------------------+--------+------+-----------+------------+-----| in rtw89_wow_pattern_generate()
287 * We should left-shift mask by 6 bits, then set the new bit[0~5] = 0, in rtw89_wow_pattern_generate()
288 * because new mask[0~5] means 'SA', but our HW packet begins from LLC, in rtw89_wow_pattern_generate()
293 for (i = 0; i < mask_len - 1; i++) { in rtw89_wow_pattern_generate()
294 mask_hw[i] = u8_get_bits(mask[i], GENMASK(7, 6)) | in rtw89_wow_pattern_generate()
295 u8_get_bits(mask[i + 1], GENMASK(5, 0)) << 2; in rtw89_wow_pattern_generate()
297 mask_hw[i] = u8_get_bits(mask[i], GENMASK(7, 6)); in rtw89_wow_pattern_generate()
299 /* Set bit 0-5 to zero */ in rtw89_wow_pattern_generate()
302 memcpy(rtw_pattern->mask, mask_hw, sizeof(rtw_pattern->mask)); in rtw89_wow_pattern_generate()
304 /* To get the wake up pattern from the mask. in rtw89_wow_pattern_generate()
310 if ((mask[i / 8] >> (i % 8)) & 0x01) { in rtw89_wow_pattern_generate()
316 rtw_pattern->crc = rtw89_calc_crc(content, count); in rtw89_wow_pattern_generate()
325 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_parse_patterns()
326 struct rtw89_wow_cam_info *rtw_pattern = rtw_wow->patterns; in rtw89_wow_parse_patterns()
330 if (!wowlan->n_patterns || !wowlan->patterns) in rtw89_wow_parse_patterns()
333 for (i = 0; i < wowlan->n_patterns; i++) { in rtw89_wow_parse_patterns()
334 rtw_pattern = &rtw_wow->patterns[i]; in rtw89_wow_parse_patterns()
336 &wowlan->patterns[i], in rtw89_wow_parse_patterns()
340 rtw_wow->pattern_cnt = 0; in rtw89_wow_parse_patterns()
344 rtw_pattern->r_w = true; in rtw89_wow_parse_patterns()
345 rtw_pattern->idx = i; in rtw89_wow_parse_patterns()
346 rtw_pattern->negative_pattern_match = false; in rtw89_wow_parse_patterns()
347 rtw_pattern->skip_mac_hdr = true; in rtw89_wow_parse_patterns()
348 rtw_pattern->valid = true; in rtw89_wow_parse_patterns()
350 rtw_wow->pattern_cnt = wowlan->n_patterns; in rtw89_wow_parse_patterns()
357 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_pattern_clear_cam()
358 struct rtw89_wow_cam_info *rtw_pattern = rtw_wow->patterns; in rtw89_wow_pattern_clear_cam()
361 for (i = 0; i < rtw_wow->pattern_cnt; i++) { in rtw89_wow_pattern_clear_cam()
362 rtw_pattern = &rtw_wow->patterns[i]; in rtw89_wow_pattern_clear_cam()
363 rtw_pattern->valid = false; in rtw89_wow_pattern_clear_cam()
370 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_pattern_write()
371 struct rtw89_wow_cam_info *rtw_pattern = rtw_wow->patterns; in rtw89_wow_pattern_write()
374 for (i = 0; i < rtw_wow->pattern_cnt; i++) in rtw89_wow_pattern_write()
380 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_pattern_clear()
384 rtw_wow->pattern_cnt = 0; in rtw89_wow_pattern_clear()
385 memset(rtw_wow->patterns, 0, sizeof(rtw_wow->patterns)); in rtw89_wow_pattern_clear()
390 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_clear_wakeups()
392 rtw_wow->wow_vif = NULL; in rtw89_wow_clear_wakeups()
393 rtw89_core_release_all_bits_map(rtw_wow->flags, RTW89_WOW_FLAG_NUM); in rtw89_wow_clear_wakeups()
394 rtw_wow->pattern_cnt = 0; in rtw89_wow_clear_wakeups()
400 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_set_wakeups()
403 if (wowlan->disconnect) in rtw89_wow_set_wakeups()
404 set_bit(RTW89_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags); in rtw89_wow_set_wakeups()
405 if (wowlan->magic_pkt) in rtw89_wow_set_wakeups()
406 set_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags); in rtw89_wow_set_wakeups()
411 if (!rtw_wow->wow_vif) in rtw89_wow_set_wakeups()
412 return -EPERM; in rtw89_wow_set_wakeups()
414 rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv; in rtw89_wow_set_wakeups()
420 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_cfg_wake()
421 struct ieee80211_vif *wow_vif = rtw_wow->wow_vif; in rtw89_wow_cfg_wake()
422 struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv; in rtw89_wow_cfg_wake()
427 wow_sta = ieee80211_find_sta(wow_vif, rtwvif->bssid); in rtw89_wow_cfg_wake()
429 rtwsta = (struct rtw89_sta *)wow_sta->drv_priv; in rtw89_wow_cfg_wake()
432 if (rtw_wow->pattern_cnt) in rtw89_wow_cfg_wake()
433 rtwvif->wowlan_pattern = true; in rtw89_wow_cfg_wake()
434 if (test_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags)) in rtw89_wow_cfg_wake()
435 rtwvif->wowlan_magic = true; in rtw89_wow_cfg_wake()
437 rtwvif->wowlan_pattern = false; in rtw89_wow_cfg_wake()
438 rtwvif->wowlan_magic = false; in rtw89_wow_cfg_wake()
443 rtw89_err(rtwdev, "failed to fw wow wakeup ctrl\n"); in rtw89_wow_cfg_wake()
489 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_swap_fw()
490 struct ieee80211_vif *wow_vif = rtw_wow->wow_vif; in rtw89_wow_swap_fw()
491 struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv; in rtw89_wow_swap_fw()
492 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_wow_swap_fw()
493 bool include_bb = !!chip->bbmcu_nr; in rtw89_wow_swap_fw()
501 wow_sta = ieee80211_find_sta(wow_vif, rtwvif->bssid); in rtw89_wow_swap_fw()
503 rtwsta = (struct rtw89_sta *)wow_sta->drv_priv; in rtw89_wow_swap_fw()
544 ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif, rtwsta->mac_id); in rtw89_wow_swap_fw()
648 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_fw_start()
649 struct rtw89_vif *rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv; in rtw89_wow_fw_start()
684 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_fw_stop()
685 struct rtw89_vif *rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv; in rtw89_wow_fw_stop()
724 set_bit(RTW89_FLAG_WOWLAN, rtwdev->flags); in rtw89_wow_enable()
757 clear_bit(RTW89_FLAG_WOWLAN, rtwdev->flags); in rtw89_wow_enable()
792 clear_bit(RTW89_FLAG_WOWLAN, rtwdev->flags); in rtw89_wow_disable()
800 if (!test_bit(RTW89_FLAG_WOWLAN, rtwdev->flags)) { in rtw89_wow_resume()
802 ret = -EPERM; in rtw89_wow_resume()
808 ret = -EPERM; in rtw89_wow_resume()
831 rtw89_err(rtwdev, "failed to set wakeup event\n"); in rtw89_wow_suspend()