Lines Matching refs:rtwdev

15 static void rtw89_wow_leave_deep_ps(struct rtw89_dev *rtwdev)
17 __rtw89_leave_ps_mode(rtwdev);
20 static void rtw89_wow_enter_deep_ps(struct rtw89_dev *rtwdev)
22 struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
25 __rtw89_enter_ps_mode(rtwdev, rtwvif);
28 static void rtw89_wow_enter_lps(struct rtw89_dev *rtwdev)
30 struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
33 rtw89_enter_lps(rtwdev, rtwvif, false);
36 static void rtw89_wow_leave_lps(struct rtw89_dev *rtwdev)
38 rtw89_leave_lps(rtwdev);
41 static int rtw89_wow_config_mac(struct rtw89_dev *rtwdev, bool enable_wow)
43 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
47 ret = rtw89_mac_resize_ple_rx_quota(rtwdev, true);
49 rtw89_err(rtwdev, "[ERR]patch rx qta %d\n", ret);
52 rtw89_write32_set(rtwdev, R_AX_RX_FUNCTION_STOP, B_AX_HDR_RX_STOP);
53 rtw89_write32_clr(rtwdev, mac->rx_fltr, B_AX_SNIFFER_MODE);
54 rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, false);
55 rtw89_write32(rtwdev, R_AX_ACTION_FWD0, 0);
56 rtw89_write32(rtwdev, R_AX_ACTION_FWD1, 0);
57 rtw89_write32(rtwdev, R_AX_TF_FWD, 0);
58 rtw89_write32(rtwdev, R_AX_HW_RPT_FWD, 0);
60 ret = rtw89_mac_resize_ple_rx_quota(rtwdev, false);
62 rtw89_err(rtwdev, "[ERR]patch rx qta %d\n", ret);
65 rtw89_write32_clr(rtwdev, R_AX_RX_FUNCTION_STOP, B_AX_HDR_RX_STOP);
66 rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, true);
67 rtw89_write32(rtwdev, R_AX_ACTION_FWD0, TRXCFG_MPDU_PROC_ACT_FRWD);
68 rtw89_write32(rtwdev, R_AX_TF_FWD, TRXCFG_MPDU_PROC_TF_FRWD);
74 static void rtw89_wow_set_rx_filter(struct rtw89_dev *rtwdev, bool enable)
80 rtw89_mac_typ_fltr_opt(rtwdev, RTW89_MGNT, fwd_target, RTW89_MAC_0);
81 rtw89_mac_typ_fltr_opt(rtwdev, RTW89_CTRL, fwd_target, RTW89_MAC_0);
82 rtw89_mac_typ_fltr_opt(rtwdev, RTW89_DATA, fwd_target, RTW89_MAC_0);
85 static void rtw89_wow_show_wakeup_reason(struct rtw89_dev *rtwdev)
87 enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
100 reason = rtw89_read8(rtwdev, wow_reason_reg);
105 rtw89_debug(rtwdev, RTW89_DBG_WOW, "WOW: Rx deauth\n");
109 rtw89_debug(rtwdev, RTW89_DBG_WOW, "WOW: AP is off\n");
113 rtw89_debug(rtwdev, RTW89_DBG_WOW, "WOW: Rx magic packet\n");
117 rtw89_debug(rtwdev, RTW89_DBG_WOW, "WOW: Rx gtk rekey\n");
124 rtw89_debug(rtwdev, RTW89_DBG_WOW, "WOW: Rx pattern match packet\n");
132 rtw89_debug(rtwdev, RTW89_DBG_WOW, "Rx NLO\n");
135 rtw89_warn(rtwdev, "Unknown wakeup reason %x\n", reason);
136 ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, NULL,
141 ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, &wakeup,
145 static void rtw89_wow_vif_iter(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
147 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
247 static int rtw89_wow_pattern_generate(struct rtw89_dev *rtwdev,
320 static int rtw89_wow_parse_patterns(struct rtw89_dev *rtwdev,
324 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
334 ret = rtw89_wow_pattern_generate(rtwdev, rtwvif,
338 rtw89_err(rtwdev, "failed to generate pattern(%d)\n", i);
354 static void rtw89_wow_pattern_clear_cam(struct rtw89_dev *rtwdev)
356 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
363 rtw89_fw_wow_cam_update(rtwdev, rtw_pattern);
367 static void rtw89_wow_pattern_write(struct rtw89_dev *rtwdev)
369 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
374 rtw89_fw_wow_cam_update(rtwdev, rtw_pattern + i);
377 static void rtw89_wow_pattern_clear(struct rtw89_dev *rtwdev)
379 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
381 rtw89_wow_pattern_clear_cam(rtwdev);
387 static void rtw89_wow_clear_wakeups(struct rtw89_dev *rtwdev)
389 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
396 static int rtw89_wow_set_wakeups(struct rtw89_dev *rtwdev,
399 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
407 rtw89_for_each_rtwvif(rtwdev, rtwvif)
408 rtw89_wow_vif_iter(rtwdev, rtwvif);
414 return rtw89_wow_parse_patterns(rtwdev, rtwvif, wowlan);
417 static int rtw89_wow_cfg_wake(struct rtw89_dev *rtwdev, bool wow)
419 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
440 ret = rtw89_fw_h2c_wow_wakeup_ctrl(rtwdev, rtwvif, wow);
442 rtw89_err(rtwdev, "failed to fw wow wakeup ctrl\n");
447 ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif, rtwsta);
449 rtw89_err(rtwdev, "failed to update dctl cam sec entry: %d\n",
455 ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
457 rtw89_warn(rtwdev, "failed to send h2c cam\n");
461 ret = rtw89_fw_h2c_wow_global(rtwdev, rtwvif, wow);
463 rtw89_err(rtwdev, "failed to fw wow global\n");
470 static int rtw89_wow_check_fw_status(struct rtw89_dev *rtwdev, bool wow_enable)
477 50, 50000, false, rtwdev,
480 rtw89_err(rtwdev, "failed to check wow status %s\n",
485 static int rtw89_wow_swap_fw(struct rtw89_dev *rtwdev, bool wow)
488 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
496 rtw89_hci_disable_intr(rtwdev);
504 ret = rtw89_fw_download(rtwdev, fw_type);
506 rtw89_warn(rtwdev, "download fw failed\n");
510 rtw89_phy_init_rf_reg(rtwdev, true);
512 ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif, rtwsta,
515 rtw89_warn(rtwdev, "failed to send h2c role maintain\n");
519 ret = rtw89_fw_h2c_assoc_cmac_tbl(rtwdev, wow_vif, wow_sta);
521 rtw89_warn(rtwdev, "failed to send h2c assoc cmac tbl\n");
526 rtw89_cam_reset_keys(rtwdev);
528 ret = rtw89_fw_h2c_join_info(rtwdev, rtwvif, rtwsta, !is_conn);
530 rtw89_warn(rtwdev, "failed to send h2c join info\n");
534 ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
536 rtw89_warn(rtwdev, "failed to send h2c cam\n");
541 ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif, rtwsta->mac_id);
543 rtw89_warn(rtwdev, "failed to send h2c general packet\n");
546 rtw89_phy_ra_assoc(rtwdev, wow_sta);
547 rtw89_phy_set_bss_color(rtwdev, wow_vif);
548 rtw89_chip_cfg_txpwr_ul_tb_offset(rtwdev, wow_vif);
551 rtw89_mac_hw_mgnt_sec(rtwdev, wow);
552 rtw89_hci_enable_intr(rtwdev);
557 static int rtw89_wow_enable_trx_pre(struct rtw89_dev *rtwdev)
561 rtw89_hci_ctrl_txdma_ch(rtwdev, false);
562 rtw89_hci_ctrl_txdma_fw_ch(rtwdev, true);
564 rtw89_mac_ptk_drop_by_band_and_wait(rtwdev, RTW89_MAC_0);
566 ret = rtw89_hci_poll_txdma_ch(rtwdev);
568 rtw89_err(rtwdev, "txdma ch busy\n");
571 rtw89_wow_set_rx_filter(rtwdev, true);
573 ret = rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, false);
575 rtw89_err(rtwdev, "cfg ppdu status\n");
582 static int rtw89_wow_enable_trx_post(struct rtw89_dev *rtwdev)
586 rtw89_hci_disable_intr(rtwdev);
587 rtw89_hci_ctrl_trxhci(rtwdev, false);
589 ret = rtw89_hci_poll_txdma_ch(rtwdev);
591 rtw89_err(rtwdev, "failed to poll txdma ch idle pcie\n");
595 ret = rtw89_wow_config_mac(rtwdev, true);
597 rtw89_err(rtwdev, "failed to config mac\n");
601 rtw89_wow_set_rx_filter(rtwdev, false);
602 rtw89_hci_reset(rtwdev);
607 static int rtw89_wow_disable_trx_pre(struct rtw89_dev *rtwdev)
611 rtw89_hci_clr_idx_all(rtwdev);
613 ret = rtw89_hci_rst_bdram(rtwdev);
615 rtw89_warn(rtwdev, "reset bdram busy\n");
619 rtw89_hci_ctrl_trxhci(rtwdev, true);
620 rtw89_hci_ctrl_txdma_ch(rtwdev, true);
622 ret = rtw89_wow_config_mac(rtwdev, false);
624 rtw89_err(rtwdev, "failed to config mac\n");
627 rtw89_hci_enable_intr(rtwdev);
632 static int rtw89_wow_disable_trx_post(struct rtw89_dev *rtwdev)
636 ret = rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, true);
638 rtw89_err(rtwdev, "cfg ppdu status\n");
643 static int rtw89_wow_fw_start(struct rtw89_dev *rtwdev)
645 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
649 rtw89_wow_pattern_write(rtwdev);
651 ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif, true);
653 rtw89_err(rtwdev, "wow: failed to enable keep alive\n");
657 ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif, true);
659 rtw89_err(rtwdev, "wow: failed to enable disconnect detect\n");
663 ret = rtw89_wow_cfg_wake(rtwdev, true);
665 rtw89_err(rtwdev, "wow: failed to config wake\n");
669 ret = rtw89_wow_check_fw_status(rtwdev, true);
671 rtw89_err(rtwdev, "wow: failed to check enable fw ready\n");
679 static int rtw89_wow_fw_stop(struct rtw89_dev *rtwdev)
681 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
685 rtw89_wow_pattern_clear(rtwdev);
687 ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif, false);
689 rtw89_err(rtwdev, "wow: failed to disable keep alive\n");
693 ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif, false);
695 rtw89_err(rtwdev, "wow: failed to disable disconnect detect\n");
699 ret = rtw89_wow_cfg_wake(rtwdev, false);
701 rtw89_err(rtwdev, "wow: failed to disable config wake\n");
705 rtw89_fw_release_general_pkt_list(rtwdev, true);
707 ret = rtw89_wow_check_fw_status(rtwdev, false);
709 rtw89_err(rtwdev, "wow: failed to check disable fw ready\n");
717 static int rtw89_wow_enable(struct rtw89_dev *rtwdev)
721 set_bit(RTW89_FLAG_WOWLAN, rtwdev->flags);
723 ret = rtw89_wow_enable_trx_pre(rtwdev);
725 rtw89_err(rtwdev, "wow: failed to enable trx_pre\n");
729 rtw89_fw_release_general_pkt_list(rtwdev, true);
731 ret = rtw89_wow_swap_fw(rtwdev, true);
733 rtw89_err(rtwdev, "wow: failed to swap to wow fw\n");
737 ret = rtw89_wow_fw_start(rtwdev);
739 rtw89_err(rtwdev, "wow: failed to let wow fw start\n");
743 rtw89_wow_enter_lps(rtwdev);
745 ret = rtw89_wow_enable_trx_post(rtwdev);
747 rtw89_err(rtwdev, "wow: failed to enable trx_post\n");
754 clear_bit(RTW89_FLAG_WOWLAN, rtwdev->flags);
758 static int rtw89_wow_disable(struct rtw89_dev *rtwdev)
762 ret = rtw89_wow_disable_trx_pre(rtwdev);
764 rtw89_err(rtwdev, "wow: failed to disable trx_pre\n");
768 rtw89_wow_leave_lps(rtwdev);
770 ret = rtw89_wow_fw_stop(rtwdev);
772 rtw89_err(rtwdev, "wow: failed to swap to normal fw\n");
776 ret = rtw89_wow_swap_fw(rtwdev, false);
778 rtw89_err(rtwdev, "wow: failed to disable trx_post\n");
782 ret = rtw89_wow_disable_trx_post(rtwdev);
784 rtw89_err(rtwdev, "wow: failed to disable trx_pre\n");
789 clear_bit(RTW89_FLAG_WOWLAN, rtwdev->flags);
793 int rtw89_wow_resume(struct rtw89_dev *rtwdev)
797 if (!test_bit(RTW89_FLAG_WOWLAN, rtwdev->flags)) {
798 rtw89_err(rtwdev, "wow is not enabled\n");
803 if (!rtw89_mac_get_power_state(rtwdev)) {
804 rtw89_err(rtwdev, "chip is no power when resume\n");
809 rtw89_wow_leave_deep_ps(rtwdev);
811 rtw89_wow_show_wakeup_reason(rtwdev);
813 ret = rtw89_wow_disable(rtwdev);
815 rtw89_err(rtwdev, "failed to disable wow\n");
818 rtw89_wow_clear_wakeups(rtwdev);
822 int rtw89_wow_suspend(struct rtw89_dev *rtwdev, struct cfg80211_wowlan *wowlan)
826 ret = rtw89_wow_set_wakeups(rtwdev, wowlan);
828 rtw89_err(rtwdev, "failed to set wakeup event\n");
832 rtw89_wow_leave_lps(rtwdev);
834 ret = rtw89_wow_enable(rtwdev);
836 rtw89_err(rtwdev, "failed to enable wow\n");
840 rtw89_wow_enter_deep_ps(rtwdev);