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()
87 enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id; in rtw89_wow_show_wakeup_reason()
89 struct cfg80211_wowlan_wakeup wakeup = { in rtw89_wow_show_wakeup_reason() local
90 .pattern_idx = -1, in rtw89_wow_show_wakeup_reason()
104 wakeup.disconnect = true; in rtw89_wow_show_wakeup_reason()
108 wakeup.disconnect = true; in rtw89_wow_show_wakeup_reason()
112 wakeup.magic_pkt = true; in rtw89_wow_show_wakeup_reason()
116 wakeup.gtk_rekey_failure = true; in rtw89_wow_show_wakeup_reason()
123 wakeup.pattern_idx = 0; in rtw89_wow_show_wakeup_reason()
131 wakeup.net_detect = &nd_info; in rtw89_wow_show_wakeup_reason()
135 rtw89_warn(rtwdev, "Unknown wakeup reason %x\n", reason); in rtw89_wow_show_wakeup_reason()
136 ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, NULL, in rtw89_wow_show_wakeup_reason()
141 ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, &wakeup, in rtw89_wow_show_wakeup_reason()
147 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_vif_iter()
153 if (rtw_wow->wow_vif || vif->type != NL80211_IFTYPE_STATION) in rtw89_wow_vif_iter()
156 switch (rtwvif->net_type) { in rtw89_wow_vif_iter()
158 rtw_wow->wow_vif = vif; in rtw89_wow_vif_iter()
233 rtw_pattern->bc = true; in rtw89_wow_pattern_get_type()
235 rtw_pattern->mc = true; in rtw89_wow_pattern_get_type()
236 else if (ether_addr_equal(da, rtwvif->mac_addr) && in rtw89_wow_pattern_get_type()
238 rtw_pattern->uc = true; in rtw89_wow_pattern_get_type()
242 return -EPERM; in rtw89_wow_pattern_get_type()
254 const u8 *mask; in rtw89_wow_pattern_generate() local
261 pattern = pkt_pattern->pattern; in rtw89_wow_pattern_generate()
262 len = pkt_pattern->pattern_len; in rtw89_wow_pattern_generate()
263 mask = pkt_pattern->mask; in rtw89_wow_pattern_generate()
268 mask[0] & GENMASK(5, 0)); in rtw89_wow_pattern_generate()
272 /* translate mask from os to mask for hw in rtw89_wow_pattern_generate()
275 * |--------+--------+------+-----------+------------+-----| in rtw89_wow_pattern_generate()
281 * |-------------------+--------+------+-----------+------------+-----| in rtw89_wow_pattern_generate()
286 * We should left-shift mask by 6 bits, then set the new bit[0~5] = 0, in rtw89_wow_pattern_generate()
287 * because new mask[0~5] means 'SA', but our HW packet begins from LLC, in rtw89_wow_pattern_generate()
292 for (i = 0; i < mask_len - 1; i++) { in rtw89_wow_pattern_generate()
293 mask_hw[i] = u8_get_bits(mask[i], GENMASK(7, 6)) | in rtw89_wow_pattern_generate()
294 u8_get_bits(mask[i + 1], GENMASK(5, 0)) << 2; in rtw89_wow_pattern_generate()
296 mask_hw[i] = u8_get_bits(mask[i], GENMASK(7, 6)); in rtw89_wow_pattern_generate()
298 /* Set bit 0-5 to zero */ in rtw89_wow_pattern_generate()
301 memcpy(rtw_pattern->mask, mask_hw, sizeof(rtw_pattern->mask)); in rtw89_wow_pattern_generate()
303 /* To get the wake up pattern from the mask. in rtw89_wow_pattern_generate()
309 if ((mask[i / 8] >> (i % 8)) & 0x01) { in rtw89_wow_pattern_generate()
315 rtw_pattern->crc = rtw89_calc_crc(content, count); in rtw89_wow_pattern_generate()
324 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_parse_patterns()
325 struct rtw89_wow_cam_info *rtw_pattern = rtw_wow->patterns; in rtw89_wow_parse_patterns()
329 if (!wowlan->n_patterns || !wowlan->patterns) in rtw89_wow_parse_patterns()
332 for (i = 0; i < wowlan->n_patterns; i++) { in rtw89_wow_parse_patterns()
333 rtw_pattern = &rtw_wow->patterns[i]; in rtw89_wow_parse_patterns()
335 &wowlan->patterns[i], in rtw89_wow_parse_patterns()
339 rtw_wow->pattern_cnt = 0; in rtw89_wow_parse_patterns()
343 rtw_pattern->r_w = true; in rtw89_wow_parse_patterns()
344 rtw_pattern->idx = i; in rtw89_wow_parse_patterns()
345 rtw_pattern->negative_pattern_match = false; in rtw89_wow_parse_patterns()
346 rtw_pattern->skip_mac_hdr = true; in rtw89_wow_parse_patterns()
347 rtw_pattern->valid = true; in rtw89_wow_parse_patterns()
349 rtw_wow->pattern_cnt = wowlan->n_patterns; in rtw89_wow_parse_patterns()
356 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_pattern_clear_cam()
357 struct rtw89_wow_cam_info *rtw_pattern = rtw_wow->patterns; in rtw89_wow_pattern_clear_cam()
360 for (i = 0; i < rtw_wow->pattern_cnt; i++) { in rtw89_wow_pattern_clear_cam()
361 rtw_pattern = &rtw_wow->patterns[i]; in rtw89_wow_pattern_clear_cam()
362 rtw_pattern->valid = false; in rtw89_wow_pattern_clear_cam()
369 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_pattern_write()
370 struct rtw89_wow_cam_info *rtw_pattern = rtw_wow->patterns; in rtw89_wow_pattern_write()
373 for (i = 0; i < rtw_wow->pattern_cnt; i++) in rtw89_wow_pattern_write()
379 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_pattern_clear()
383 rtw_wow->pattern_cnt = 0; in rtw89_wow_pattern_clear()
384 memset(rtw_wow->patterns, 0, sizeof(rtw_wow->patterns)); in rtw89_wow_pattern_clear()
389 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_clear_wakeups()
391 rtw_wow->wow_vif = NULL; in rtw89_wow_clear_wakeups()
392 rtw89_core_release_all_bits_map(rtw_wow->flags, RTW89_WOW_FLAG_NUM); in rtw89_wow_clear_wakeups()
393 rtw_wow->pattern_cnt = 0; in rtw89_wow_clear_wakeups()
399 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_set_wakeups()
402 if (wowlan->disconnect) in rtw89_wow_set_wakeups()
403 set_bit(RTW89_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags); in rtw89_wow_set_wakeups()
404 if (wowlan->magic_pkt) in rtw89_wow_set_wakeups()
405 set_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags); in rtw89_wow_set_wakeups()
410 if (!rtw_wow->wow_vif) in rtw89_wow_set_wakeups()
411 return -EPERM; in rtw89_wow_set_wakeups()
413 rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv; in rtw89_wow_set_wakeups()
419 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_cfg_wake()
420 struct ieee80211_vif *wow_vif = rtw_wow->wow_vif; in rtw89_wow_cfg_wake()
421 struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv; in rtw89_wow_cfg_wake()
426 wow_sta = ieee80211_find_sta(wow_vif, rtwvif->bssid); in rtw89_wow_cfg_wake()
428 rtwsta = (struct rtw89_sta *)wow_sta->drv_priv; in rtw89_wow_cfg_wake()
431 if (rtw_wow->pattern_cnt) in rtw89_wow_cfg_wake()
432 rtwvif->wowlan_pattern = true; in rtw89_wow_cfg_wake()
433 if (test_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags)) in rtw89_wow_cfg_wake()
434 rtwvif->wowlan_magic = true; in rtw89_wow_cfg_wake()
436 rtwvif->wowlan_pattern = false; in rtw89_wow_cfg_wake()
437 rtwvif->wowlan_magic = false; in rtw89_wow_cfg_wake()
442 rtw89_err(rtwdev, "failed to fw wow wakeup ctrl\n"); in rtw89_wow_cfg_wake()
488 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_swap_fw()
489 struct ieee80211_vif *wow_vif = rtw_wow->wow_vif; in rtw89_wow_swap_fw()
490 struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv; in rtw89_wow_swap_fw()
498 wow_sta = ieee80211_find_sta(wow_vif, rtwvif->bssid); in rtw89_wow_swap_fw()
500 rtwsta = (struct rtw89_sta *)wow_sta->drv_priv; in rtw89_wow_swap_fw()
541 ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif, rtwsta->mac_id); in rtw89_wow_swap_fw()
645 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_fw_start()
646 struct rtw89_vif *rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv; in rtw89_wow_fw_start()
681 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_wow_fw_stop()
682 struct rtw89_vif *rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv; in rtw89_wow_fw_stop()
721 set_bit(RTW89_FLAG_WOWLAN, rtwdev->flags); in rtw89_wow_enable()
754 clear_bit(RTW89_FLAG_WOWLAN, rtwdev->flags); in rtw89_wow_enable()
789 clear_bit(RTW89_FLAG_WOWLAN, rtwdev->flags); in rtw89_wow_disable()
797 if (!test_bit(RTW89_FLAG_WOWLAN, rtwdev->flags)) { in rtw89_wow_resume()
799 ret = -EPERM; in rtw89_wow_resume()
805 ret = -EPERM; in rtw89_wow_resume()
828 rtw89_err(rtwdev, "failed to set wakeup event\n"); in rtw89_wow_suspend()