Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp1138166pxj; Thu, 17 Jun 2021 23:53:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz2GShjjU0eqjxhKjh4jzMZKqUQ/ivIUZMZalVzII5wwq5xfBGDNPKLmmrzTrMoAfiq8Qa8 X-Received: by 2002:a17:906:7b83:: with SMTP id s3mr6226509ejo.190.1623999202636; Thu, 17 Jun 2021 23:53:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623999202; cv=none; d=google.com; s=arc-20160816; b=Xge7HoaMEQc/SiZB8SxvlRf17zaGEjxIixPpigj8Kgi1BK1FMHWPQRth4JVRoGq00A uFJvZF+OQR5f/gfRB/GZcXPXvDblmWerEF1Olj8VibtnSkqct4WuilAkXLsPhQoIcoaL kSAbDlzOKkHVAnbYLdySDMSgqWJw4u5Dg4fyd+r8LaS1TYvRpJvVAxNVhkGHruuNQo2r rQSOjTuUVrQEgOJQXrwCdOcvtMQH0oUli4il3PubpUhCSkiIk0IIVFN5aGWxCpnzCYmn iCfy5Y79DXl65S7aR8TUlN7VqsXITKJpYwwSacgsZR+cph9vVQbXTch7qyIJYFKIwbjc 6Nbw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :authenticated-by; bh=mWeoXNvBI8S+8OGP6XyGItS0TN82Awg4m5yeC0Ccxy4=; b=LPknVRhBDKhOdzUIXfjxHmCS/PYG6DGceV7cOZ7nAVYDwspNSTVL7cYOieRzD2AQPR gXReD/OhG4gbyTY5TdeecEGAlIQkj4viQCZ/eTPNmi/7XjBXyjvZ/Og/HgWHJWyINLvc DXRwyswwWpTE5BlXSQ0KBqlLahIWmuE8DlaHfH0Z5QKu2+WOtx7pHwYW62qTLE1vc0Cf DYrGW1hRhVF+/r8QHawyu2q7JdYmvS+x5H+cY/KniKyP2rOsXSfAZQ6fQJvp5Wa0nmJM kZnNMlkyOnwxgo54XCYnioz+2so2lq+uwyjzasKSmvCPwWKtAhtqPwkYrQ+iGnuFeDo/ v7cw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c27si1583447ejj.169.2021.06.17.23.52.59; Thu, 17 Jun 2021 23:53:22 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230006AbhFRGuo (ORCPT + 99 others); Fri, 18 Jun 2021 02:50:44 -0400 Received: from rtits2.realtek.com ([211.75.126.72]:39030 "EHLO rtits2.realtek.com.tw" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231497AbhFRGun (ORCPT ); Fri, 18 Jun 2021 02:50:43 -0400 Authenticated-By: X-SpamFilter-By: ArmorX SpamTrap 5.73 with qID 15I6mUuY5011501, This message is accepted by code: ctloc85258 Received: from mail.realtek.com (rtexh36502.realtek.com.tw[172.21.6.25]) by rtits2.realtek.com.tw (8.15.2/2.71/5.88) with ESMTPS id 15I6mUuY5011501 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT); Fri, 18 Jun 2021 14:48:30 +0800 Received: from RTEXMBS04.realtek.com.tw (172.21.6.97) by RTEXH36502.realtek.com.tw (172.21.6.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2106.2; Fri, 18 Jun 2021 14:48:29 +0800 Received: from localhost (172.16.16.17) by RTEXMBS04.realtek.com.tw (172.21.6.97) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2106.2; Fri, 18 Jun 2021 14:48:29 +0800 From: Ping-Ke Shih To: CC: Subject: [PATCH 22/24] rtw89: add PS files Date: Fri, 18 Jun 2021 14:46:23 +0800 Message-ID: <20210618064625.14131-23-pkshih@realtek.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210618064625.14131-1-pkshih@realtek.com> References: <20210618064625.14131-1-pkshih@realtek.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [172.16.16.17] X-ClientProxiedBy: RTEXMBS02.realtek.com.tw (172.21.6.95) To RTEXMBS04.realtek.com.tw (172.21.6.97) X-KSE-ServerInfo: RTEXMBS04.realtek.com.tw, 9 X-KSE-AntiSpam-Interceptor-Info: trusted connection X-KSE-Antiphishing-Info: Clean X-KSE-Antiphishing-ScanningType: Deterministic X-KSE-Antiphishing-Method: None X-KSE-Antiphishing-Bases: 06/18/2021 06:27:00 X-KSE-AttachmentFiltering-Interceptor-Info: no applicable attachment filtering rules found X-KSE-Antivirus-Interceptor-Info: scan successful X-KSE-Antivirus-Info: =?big5?B?Q2xlYW4sIGJhc2VzOiAyMDIxLzYvMTggpFekyCAwNjowMTowMA==?= X-KSE-BulkMessagesFiltering-Scan-Result: protection disabled X-KSE-ServerInfo: RTEXH36502.realtek.com.tw, 9 X-KSE-Attachment-Filter-Triggered-Rules: Clean X-KSE-Attachment-Filter-Triggered-Filters: Clean X-KSE-BulkMessagesFiltering-Scan-Result: protection disabled X-KSE-AntiSpam-Outbound-Interceptor-Info: scan successful X-KSE-AntiSpam-Version: 5.9.20, Database issued on: 06/18/2021 06:23:56 X-KSE-AntiSpam-Status: KAS_STATUS_NOT_DETECTED X-KSE-AntiSpam-Method: none X-KSE-AntiSpam-Rate: 0 X-KSE-AntiSpam-Info: Lua profiles 164465 [Jun 18 2021] X-KSE-AntiSpam-Info: Version: 5.9.20.0 X-KSE-AntiSpam-Info: Envelope from: pkshih@realtek.com X-KSE-AntiSpam-Info: LuaCore: 448 448 71fb1b37213ce9a885768d4012c46ac449c77b17 X-KSE-AntiSpam-Info: {Tracking_all_Bitcoin, bb} X-KSE-AntiSpam-Info: {Tracking_from_domain_doesnt_match_to} X-KSE-AntiSpam-Info: realtek.com:7.1.1;d41d8cd98f00b204e9800998ecf8427e.com:7.1.1;127.0.0.199:7.1.2 X-KSE-AntiSpam-Info: Rate: 0 X-KSE-AntiSpam-Info: Status: not_detected X-KSE-AntiSpam-Info: Method: none X-KSE-AntiSpam-Info: Auth:dkim=none X-KSE-Antiphishing-Info: Clean X-KSE-Antiphishing-ScanningType: Heuristic X-KSE-Antiphishing-Method: None X-KSE-Antiphishing-Bases: 06/18/2021 06:27:00 Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Power saving contains two main types -- IPS (idle PS) and LPS (Leisure PS). If there's no any connection, wifi can enter IPS mode that power consumption is the lowest. After connecting to an AP, it can only wake up at TBTT to receive beacon to check if AP is buffering any packets; this case is called LPS mode that the average power is low, but peak appears at TBTT. With heavy traffic, no power saving mechanism operates, and it costs high power in this case. Signed-off-by: Ping-Ke Shih --- drivers/net/wireless/realtek/rtw89/ps.c | 149 ++++++++++++++++++++++++ drivers/net/wireless/realtek/rtw89/ps.h | 15 +++ 2 files changed, 164 insertions(+) create mode 100644 drivers/net/wireless/realtek/rtw89/ps.c create mode 100644 drivers/net/wireless/realtek/rtw89/ps.h diff --git a/drivers/net/wireless/realtek/rtw89/ps.c b/drivers/net/wireless/realtek/rtw89/ps.c new file mode 100644 index 000000000000..45585093d242 --- /dev/null +++ b/drivers/net/wireless/realtek/rtw89/ps.c @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) 2019-2020 Realtek Corporation + */ + +#include "coex.h" +#include "core.h" +#include "debug.h" +#include "fw.h" +#include "mac.h" +#include "ps.h" +#include "reg.h" +#include "util.h" + +static int rtw89_fw_leave_lps_check(struct rtw89_dev *rtwdev, u8 macid) +{ + u32 pwr_en_bit = 0xE; + u32 chk_msk = pwr_en_bit << (4 * macid); + u32 polling; + int ret; + + ret = read_poll_timeout_atomic(rtw89_read32_mask, polling, !polling, + 1000, 50000, false, rtwdev, + R_AX_PPWRBIT_SETTING, chk_msk); + if (ret) { + rtw89_info(rtwdev, "rtw89: failed to leave lps state\n"); + return -EBUSY; + } + + return 0; +} + +static void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev) +{ + if (!rtwdev->ps_mode) + return; + + if (test_and_set_bit(RTW89_FLAG_LOW_POWER_MODE, rtwdev->flags)) + return; + + rtw89_mac_power_mode_change(rtwdev, true); +} + +static void __rtw89_leave_ps_mode(struct rtw89_dev *rtwdev) +{ + if (!rtwdev->ps_mode) + return; + + if (test_and_clear_bit(RTW89_FLAG_LOW_POWER_MODE, rtwdev->flags)) + rtw89_mac_power_mode_change(rtwdev, false); +} + +static void __rtw89_enter_lps(struct rtw89_dev *rtwdev, u8 mac_id) +{ + struct rtw89_lps_parm lps_param = { + .macid = mac_id, + .psmode = RTW89_MAC_AX_PS_MODE_LEGACY, + .lastrpwm = RTW89_LAST_RPWM_PS, + }; + + rtw89_btc_ntfy_radio_state(rtwdev, BTC_RFCTRL_FW_CTRL); + rtw89_fw_h2c_lps_parm(rtwdev, &lps_param); +} + +static void __rtw89_leave_lps(struct rtw89_dev *rtwdev, u8 mac_id) +{ + struct rtw89_lps_parm lps_param = { + .macid = mac_id, + .psmode = RTW89_MAC_AX_PS_MODE_ACTIVE, + .lastrpwm = RTW89_LAST_RPWM_ACTIVE, + }; + + rtw89_fw_h2c_lps_parm(rtwdev, &lps_param); + rtw89_fw_leave_lps_check(rtwdev, 0); + rtw89_btc_ntfy_radio_state(rtwdev, BTC_RFCTRL_WL_ON); +} + +void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev) +{ + lockdep_assert_held(&rtwdev->mutex); + + __rtw89_leave_ps_mode(rtwdev); +} + +void rtw89_enter_lps(struct rtw89_dev *rtwdev, u8 mac_id) +{ + lockdep_assert_held(&rtwdev->mutex); + + if (test_and_set_bit(RTW89_FLAG_LEISURE_PS, rtwdev->flags)) + return; + + __rtw89_enter_lps(rtwdev, mac_id); + __rtw89_enter_ps_mode(rtwdev); + rtw89_hci_link_ps(rtwdev, true); +} + +static void rtw89_leave_lps_iter(void *data, u8 *mac, struct ieee80211_vif *vif) +{ + struct rtw89_dev *rtwdev = data; + struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; + + if (rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION) + return; + + __rtw89_leave_ps_mode(rtwdev); + __rtw89_leave_lps(rtwdev, rtwvif->mac_id); +} + +void rtw89_leave_lps(struct rtw89_dev *rtwdev, bool held_vifmtx) +{ + lockdep_assert_held(&rtwdev->mutex); + + if (!test_and_clear_bit(RTW89_FLAG_LEISURE_PS, rtwdev->flags)) + return; + + rtw89_hci_link_ps(rtwdev, false); + rtw89_iterate_vifs(rtwdev, rtw89_leave_lps_iter, rtwdev, held_vifmtx); +} + +void rtw89_enter_ips(struct rtw89_dev *rtwdev) +{ + set_bit(RTW89_FLAG_INACTIVE_PS, rtwdev->flags); + + rtw89_iterate_vifs(rtwdev, rtw89_remove_vif_cfg_iter, rtwdev, false); + + rtw89_core_stop(rtwdev); + rtw89_hci_link_ps(rtwdev, true); +} + +void rtw89_leave_ips(struct rtw89_dev *rtwdev) +{ + int ret; + + rtw89_hci_link_ps(rtwdev, false); + ret = rtw89_core_start(rtwdev); + if (ret) + rtw89_err(rtwdev, "failed to leave idle state\n"); + + rtw89_set_channel(rtwdev); + + rtw89_iterate_vifs(rtwdev, rtw89_restore_vif_cfg_iter, rtwdev, false); + + clear_bit(RTW89_FLAG_INACTIVE_PS, rtwdev->flags); +} + +void rtw89_set_coex_ctrl_lps(struct rtw89_dev *rtwdev, bool btc_ctrl) +{ + if (btc_ctrl) + rtw89_leave_lps(rtwdev, false); +} diff --git a/drivers/net/wireless/realtek/rtw89/ps.h b/drivers/net/wireless/realtek/rtw89/ps.h new file mode 100644 index 000000000000..d5e36316ef69 --- /dev/null +++ b/drivers/net/wireless/realtek/rtw89/ps.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ +/* Copyright(c) 2019-2020 Realtek Corporation + */ + +#ifndef __RTW89_PS_H_ +#define __RTW89_PS_H_ + +void rtw89_enter_lps(struct rtw89_dev *rtwdev, u8 mac_id); +void rtw89_leave_lps(struct rtw89_dev *rtwdev, bool held_vifmtx); +void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev); +void rtw89_enter_ips(struct rtw89_dev *rtwdev); +void rtw89_leave_ips(struct rtw89_dev *rtwdev); +void rtw89_set_coex_ctrl_lps(struct rtw89_dev *rtwdev, bool btc_ctrl); + +#endif -- 2.25.1