All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ping-Ke Shih <pkshih@realtek.com>
To: <kvalo@codeaurora.org>
Cc: <linux-wireless@vger.kernel.org>
Subject: [PATCH v7 22/24] rtw89: add PS files
Date: Fri, 8 Oct 2021 11:56:25 +0800	[thread overview]
Message-ID: <20211008035627.19463-23-pkshih@realtek.com> (raw)
In-Reply-To: <20211008035627.19463-1-pkshih@realtek.com>

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 <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtw89/ps.c | 150 ++++++++++++++++++++++++
 drivers/net/wireless/realtek/rtw89/ps.h |  16 +++
 2 files changed, 166 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..7eaa01e41ef2
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw89/ps.c
@@ -0,0 +1,150 @@
+// 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);
+}
+
+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);
+}
+
+static void rtw89_leave_lps_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
+{
+	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)
+{
+	struct rtw89_vif *rtwvif;
+
+	lockdep_assert_held(&rtwdev->mutex);
+
+	if (!test_and_clear_bit(RTW89_FLAG_LEISURE_PS, rtwdev->flags))
+		return;
+
+	rtw89_for_each_rtwvif(rtwdev, rtwvif)
+		rtw89_leave_lps_vif(rtwdev, rtwvif);
+}
+
+void rtw89_enter_ips(struct rtw89_dev *rtwdev)
+{
+	struct rtw89_vif *rtwvif;
+
+	set_bit(RTW89_FLAG_INACTIVE_PS, rtwdev->flags);
+
+	rtw89_for_each_rtwvif(rtwdev, rtwvif)
+		rtw89_mac_vif_deinit(rtwdev, rtwvif);
+
+	rtw89_core_stop(rtwdev);
+}
+
+void rtw89_leave_ips(struct rtw89_dev *rtwdev)
+{
+	struct rtw89_vif *rtwvif;
+	int ret;
+
+	ret = rtw89_core_start(rtwdev);
+	if (ret)
+		rtw89_err(rtwdev, "failed to leave idle state\n");
+
+	rtw89_set_channel(rtwdev);
+
+	rtw89_for_each_rtwvif(rtwdev, rtwvif)
+		rtw89_mac_vif_init(rtwdev, rtwvif);
+
+	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);
+}
diff --git a/drivers/net/wireless/realtek/rtw89/ps.h b/drivers/net/wireless/realtek/rtw89/ps.h
new file mode 100644
index 000000000000..a184b68994aa
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw89/ps.h
@@ -0,0 +1,16 @@
+/* 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);
+void __rtw89_leave_ps_mode(struct rtw89_dev *rtwdev);
+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


  parent reply	other threads:[~2021-10-08  3:58 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-08  3:56 [PATCH v7 00/24] rtw89: add Realtek 802.11ax driver Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 01/24] rtw89: add CAM files Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 02/24] rtw89: add BT coexistence files Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 03/24] rtw89: add core and trx files Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 04/24] rtw89: add debug files Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 05/24] rtw89: add efuse files Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 06/24] rtw89: add files to download and communicate with firmware Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 07/24] rtw89: add MAC files Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 08/24] rtw89: implement mac80211 ops Ping-Ke Shih
2021-10-08 17:45   ` Toke Høiland-Jørgensen
2021-10-12  8:39     ` Pkshih
2021-10-08  3:56 ` [PATCH v7 09/24] rtw89: add pci files Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 10/24] rtw89: add phy files Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 11/24] rtw89: define register names Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 12/24] rtw89: add regulatory support Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 13/24] rtw89: 8852a: add 8852a specific files Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 14/24] rtw89: 8852a: add 8852a RFK files Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 15/24] rtw89: 8852a: add 8852a RFK tables Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 16/24] rtw89: 8852a: add 8852a tables (1 of 5) Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 17/24] rtw89: 8852a: add 8852a tables (2 " Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 18/24] rtw89: 8852a: add 8852a tables (3 " Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 19/24] rtw89: 8852a: add 8852a tables (4 " Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 20/24] rtw89: 8852a: add 8852a tables (5 " Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 21/24] rtw89: add ser to recover error reported by firmware Ping-Ke Shih
2021-10-08  3:56 ` Ping-Ke Shih [this message]
2021-10-08  3:56 ` [PATCH v7 23/24] rtw89: add SAR files Ping-Ke Shih
2021-10-08  3:56 ` [PATCH v7 24/24] rtw89: add Kconfig and Makefile Ping-Ke Shih
2021-10-09  8:21 ` [PATCH v7 00/24] rtw89: add Realtek 802.11ax driver Kalle Valo
2021-10-11 12:06   ` Kalle Valo
2021-10-12  1:32     ` Pkshih
2021-10-13  6:09       ` Kalle Valo
2021-10-13  8:55         ` Pkshih
2021-10-13  9:06           ` Kalle Valo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211008035627.19463-23-pkshih@realtek.com \
    --to=pkshih@realtek.com \
    --cc=kvalo@codeaurora.org \
    --cc=linux-wireless@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.