Lines Matching +full:disable +full:- +full:report +full:- +full:mask

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2018-2019 Realtek Corporation
17 .pattern_idx = -1, in rtw_wow_show_wakeup_reason()
41 /* Current firmware and driver don't report pattern index in rtw_wow_show_wakeup_reason()
48 /* Current firmware and driver don't report ssid index. in rtw_wow_show_wakeup_reason()
57 ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, NULL, in rtw_wow_show_wakeup_reason()
61 ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, &wakeup, in rtw_wow_show_wakeup_reason()
85 wdata = rtw_pattern->mask[i * 4]; in rtw_wow_pattern_write_cam_ent()
86 wdata |= rtw_pattern->mask[i * 4 + 1] << 8; in rtw_wow_pattern_write_cam_ent()
87 wdata |= rtw_pattern->mask[i * 4 + 2] << 16; in rtw_wow_pattern_write_cam_ent()
88 wdata |= rtw_pattern->mask[i * 4 + 3] << 24; in rtw_wow_pattern_write_cam_ent()
92 wdata = rtw_pattern->crc; in rtw_wow_pattern_write_cam_ent()
95 switch (rtw_pattern->type) { in rtw_wow_pattern_write_cam_ent()
167 const u8 *mask; in rtw_wow_pattern_generate() local
177 pattern = pkt_pattern->pattern; in rtw_wow_pattern_generate()
178 len = pkt_pattern->pattern_len; in rtw_wow_pattern_generate()
179 mask = pkt_pattern->mask; in rtw_wow_pattern_generate()
181 ether_addr_copy(mac_addr, rtwvif->mac_addr); in rtw_wow_pattern_generate()
187 rtw_pattern->type = RTW_PATTERN_BROADCAST; in rtw_wow_pattern_generate()
189 rtw_pattern->type = RTW_PATTERN_MULTICAST; in rtw_wow_pattern_generate()
191 rtw_pattern->type = RTW_PATTERN_UNICAST; in rtw_wow_pattern_generate()
193 rtw_pattern->type = RTW_PATTERN_INVALID; in rtw_wow_pattern_generate()
195 /* translate mask from os to mask for hw in rtw_wow_pattern_generate()
198 * |--------+--------+------+-----------+------------+-----| in rtw_wow_pattern_generate()
204 * |-------------------+--------+------+-----------+------------+-----| in rtw_wow_pattern_generate()
209 * We should left-shift mask by 6 bits, then set the new bit[0~5] = 0, in rtw_wow_pattern_generate()
210 * because new mask[0~5] means 'SA', but our HW packet begins from LLC, in rtw_wow_pattern_generate()
215 for (i = 0; i < mask_len - 1; i++) { in rtw_wow_pattern_generate()
216 mask_hw[i] = u8_get_bits(mask[i], GENMASK(7, 6)); in rtw_wow_pattern_generate()
217 mask_hw[i] |= u8_get_bits(mask[i + 1], GENMASK(5, 0)) << 2; in rtw_wow_pattern_generate()
219 mask_hw[i] = u8_get_bits(mask[i], GENMASK(7, 6)); in rtw_wow_pattern_generate()
221 /* Set bit 0-5 to zero */ in rtw_wow_pattern_generate()
224 memcpy(rtw_pattern->mask, mask_hw, RTW_MAX_PATTERN_MASK_SIZE); in rtw_wow_pattern_generate()
226 /* To get the wake up pattern from the mask. in rtw_wow_pattern_generate()
232 if ((mask[i / 8] >> (i % 8)) & 0x01) { in rtw_wow_pattern_generate()
238 rtw_pattern->crc = rtw_calc_crc(content, count); in rtw_wow_pattern_generate()
255 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_wow_pattern_write()
256 struct rtw_wow_pattern *rtw_pattern = rtw_wow->patterns; in rtw_wow_pattern_write()
259 for (i = 0; i < rtw_wow->pattern_cnt; i++) in rtw_wow_pattern_write()
265 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_wow_pattern_clear()
269 rtw_wow->pattern_cnt = 0; in rtw_wow_pattern_clear()
270 memset(rtw_wow->patterns, 0, sizeof(rtw_wow->patterns)); in rtw_wow_pattern_clear()
275 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_wow_bb_stop()
283 rtw_wow->txpause = rtw_read8(rtwdev, REG_TXPAUSE); in rtw_wow_bb_stop()
290 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_wow_bb_start()
293 rtw_write8(rtwdev, REG_TXPAUSE, rtw_wow->txpause); in rtw_wow_bb_start()
342 return -EBUSY; in rtw_wow_check_fw_status()
352 struct rtw_dev *rtwdev = hw->priv; in rtw_wow_fw_security_type_iter()
355 if (vif != rtwdev->wow.wow_vif) in rtw_wow_fw_security_type_iter()
358 switch (key->cipher) { in rtw_wow_fw_security_type_iter()
367 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; in rtw_wow_fw_security_type_iter()
371 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX; in rtw_wow_fw_security_type_iter()
375 key->cipher); in rtw_wow_fw_security_type_iter()
381 iter_data->pairwise_key_type = hw_key_type; in rtw_wow_fw_security_type_iter()
383 iter_data->group_key_type = hw_key_type; in rtw_wow_fw_security_type_iter()
389 struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif; in rtw_wow_fw_security_type()
450 rtw_warn(rtwdev, "Unsupported hci type to disable reset MAC\n"); in rtw_wow_avoid_reset_mac()
457 struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv; in rtw_wow_fw_media_status_iter()
459 struct rtw_dev *rtwdev = iter_data->rtwdev; in rtw_wow_fw_media_status_iter()
461 rtw_fw_media_status_report(rtwdev, si->mac_id, iter_data->connect); in rtw_wow_fw_media_status_iter()
476 struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif; in rtw_wow_config_wow_fw_rsvd_page()
477 struct rtw_vif *rtwvif = (struct rtw_vif *)wow_vif->drv_priv; in rtw_wow_config_wow_fw_rsvd_page()
491 struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif; in rtw_wow_config_normal_fw_rsvd_page()
492 struct rtw_vif *rtwvif = (struct rtw_vif *)wow_vif->drv_priv; in rtw_wow_config_normal_fw_rsvd_page()
510 fw = &rtwdev->wow_fw; in rtw_wow_swap_fw()
514 fw = &rtwdev->fw; in rtw_wow_swap_fw()
519 return -ENOENT; in rtw_wow_swap_fw()
537 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_wow_check_pno()
538 struct rtw_pno_request *pno_req = &rtw_wow->pno_req; in rtw_wow_check_pno()
542 if (!nd_config->n_match_sets || !nd_config->n_channels) in rtw_wow_check_pno()
545 pno_req->match_set_cnt = nd_config->n_match_sets; in rtw_wow_check_pno()
546 size = sizeof(*pno_req->match_sets) * pno_req->match_set_cnt; in rtw_wow_check_pno()
547 pno_req->match_sets = kmemdup(nd_config->match_sets, size, GFP_KERNEL); in rtw_wow_check_pno()
548 if (!pno_req->match_sets) in rtw_wow_check_pno()
551 pno_req->channel_cnt = nd_config->n_channels; in rtw_wow_check_pno()
552 size = sizeof(*nd_config->channels[0]) * nd_config->n_channels; in rtw_wow_check_pno()
553 pno_req->channels = kmalloc(size, GFP_KERNEL); in rtw_wow_check_pno()
554 if (!pno_req->channels) in rtw_wow_check_pno()
557 for (i = 0 ; i < pno_req->channel_cnt; i++) { in rtw_wow_check_pno()
558 channel = pno_req->channels + i; in rtw_wow_check_pno()
559 memcpy(channel, nd_config->channels[i], sizeof(*channel)); in rtw_wow_check_pno()
562 pno_req->scan_plan = *nd_config->scan_plans; in rtw_wow_check_pno()
563 pno_req->inited = true; in rtw_wow_check_pno()
565 rtw_dbg(rtwdev, RTW_DBG_WOW, "WOW: net-detect is enabled\n"); in rtw_wow_check_pno()
570 kfree(pno_req->match_sets); in rtw_wow_check_pno()
573 rtw_dbg(rtwdev, RTW_DBG_WOW, "WOW: net-detect is disabled\n"); in rtw_wow_check_pno()
578 if (!test_bit(RTW_FLAG_WOWLAN, rtwdev->flags)) in rtw_wow_leave_linked_ps()
579 cancel_delayed_work_sync(&rtwdev->watch_dog_work); in rtw_wow_leave_linked_ps()
588 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_wow_leave_no_link_ps()
591 if (test_bit(RTW_FLAG_WOWLAN, rtwdev->flags)) { in rtw_wow_leave_no_link_ps()
595 if (!test_bit(RTW_FLAG_POWERON, rtwdev->flags)) { in rtw_wow_leave_no_link_ps()
596 rtw_wow->ips_enabled = true; in rtw_wow_leave_no_link_ps()
622 if (rtw_wow_no_link(rtwdev) && rtwdev->wow.ips_enabled) in rtw_wow_restore_ps()
630 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_wow_enter_linked_ps()
631 struct ieee80211_vif *wow_vif = rtw_wow->wow_vif; in rtw_wow_enter_linked_ps()
632 struct rtw_vif *rtwvif = (struct rtw_vif *)wow_vif->drv_priv; in rtw_wow_enter_linked_ps()
634 rtw_enter_lps(rtwdev, rtwvif->port); in rtw_wow_enter_linked_ps()
642 set_bit(RTW_FLAG_LEISURE_PS_DEEP, rtwdev->flags); in rtw_wow_enter_no_link_ps()
694 set_bit(RTW_FLAG_WOWLAN, rtwdev->flags); in rtw_wow_enable()
711 clear_bit(RTW_FLAG_WOWLAN, rtwdev->flags); in rtw_wow_enable()
747 ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->watch_dog_work, in rtw_wow_resume_trx()
755 clear_bit(RTW_FLAG_WOWLAN, rtwdev->flags); in rtw_wow_disable()
781 struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; in rtw_wow_vif_iter()
782 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_wow_vif_iter()
787 if (rtw_wow->wow_vif || vif->type != NL80211_IFTYPE_STATION) in rtw_wow_vif_iter()
790 switch (rtwvif->net_type) { in rtw_wow_vif_iter()
792 rtw_wow->wow_vif = vif; in rtw_wow_vif_iter()
795 if (rtw_wow->pno_req.inited) in rtw_wow_vif_iter()
796 rtwdev->wow.wow_vif = vif; in rtw_wow_vif_iter()
806 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_wow_set_wakeups()
807 struct rtw_wow_pattern *rtw_patterns = rtw_wow->patterns; in rtw_wow_set_wakeups()
811 if (wowlan->disconnect) in rtw_wow_set_wakeups()
812 set_bit(RTW_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags); in rtw_wow_set_wakeups()
813 if (wowlan->magic_pkt) in rtw_wow_set_wakeups()
814 set_bit(RTW_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags); in rtw_wow_set_wakeups()
815 if (wowlan->gtk_rekey_failure) in rtw_wow_set_wakeups()
816 set_bit(RTW_WOW_FLAG_EN_REKEY_PKT, rtw_wow->flags); in rtw_wow_set_wakeups()
818 if (wowlan->nd_config) in rtw_wow_set_wakeups()
819 rtw_wow_check_pno(rtwdev, wowlan->nd_config); in rtw_wow_set_wakeups()
822 if (!rtw_wow->wow_vif) in rtw_wow_set_wakeups()
823 return -EPERM; in rtw_wow_set_wakeups()
825 rtwvif = (struct rtw_vif *)rtw_wow->wow_vif->drv_priv; in rtw_wow_set_wakeups()
826 if (wowlan->n_patterns && wowlan->patterns) { in rtw_wow_set_wakeups()
827 rtw_wow->pattern_cnt = wowlan->n_patterns; in rtw_wow_set_wakeups()
828 for (i = 0; i < wowlan->n_patterns; i++) in rtw_wow_set_wakeups()
830 wowlan->patterns + i, in rtw_wow_set_wakeups()
839 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_wow_clear_wakeups()
840 struct rtw_pno_request *pno_req = &rtw_wow->pno_req; in rtw_wow_clear_wakeups()
842 if (pno_req->inited) { in rtw_wow_clear_wakeups()
843 kfree(pno_req->channels); in rtw_wow_clear_wakeups()
844 kfree(pno_req->match_sets); in rtw_wow_clear_wakeups()
847 memset(rtw_wow, 0, sizeof(rtwdev->wow)); in rtw_wow_clear_wakeups()
886 if (!test_bit(RTW_FLAG_WOWLAN, rtwdev->flags)) { in rtw_wow_resume()
888 ret = -EPERM; in rtw_wow_resume()
902 rtw_err(rtwdev, "failed to disable wow\n"); in rtw_wow_resume()