]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
UBUNTU: SAUCE: rtw88: set default port to firmware
authorYan-Hsuan Chuang <yhchuang@realtek.com>
Mon, 30 Dec 2019 06:40:04 +0000 (14:40 +0800)
committerSeth Forshee <seth.forshee@canonical.com>
Fri, 20 Mar 2020 21:31:31 +0000 (16:31 -0500)
BugLink: https://bugs.launchpad.net/bugs/1780590
Most of the power save related functions (LPS/WOW) require to
monitor the interrupts of a specific port. Currently, driver
only uses port 0, so there's no need to set default port to the
firmware, as it default monitors port 0. However, if we are
going to add more limits for interface combinations, we might
add vifs not only on port 0. Set default port number to firmware
if driver is going to enter LPS or WOW, to monitor the hardware
interrupts accordingly.

Change-Id: I54a9d2596508d52a19108068a82167d89ab974d1
Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
drivers/net/wireless/realtek/rtw88/fw.c
drivers/net/wireless/realtek/rtw88/fw.h
drivers/net/wireless/realtek/rtw88/wow.c

index d1b9486ac8262825f078c47a4254bc6a2df086ac..d006b2eae3a3b13cdd1414bcb2ee14aca243c920 100644 (file)
@@ -330,6 +330,17 @@ void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para)
        rtw_fw_send_h2c_packet(rtwdev, h2c_pkt);
 }
 
+void rtw_fw_set_default_port(struct rtw_dev *rtwdev, u8 port)
+{
+       u8 h2c_pkt[H2C_PKT_SIZE] = {0};
+
+       SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_DEFAULT_PORT);
+
+       SET_DEFAULT_PORT_PORTID(h2c_pkt, port);
+
+       rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
+}
+
 void rtw_fw_query_bt_info(struct rtw_dev *rtwdev)
 {
        u8 h2c_pkt[H2C_PKT_SIZE] = {0};
@@ -485,6 +496,8 @@ void rtw_fw_set_pwr_mode(struct rtw_dev *rtwdev)
        struct rtw_lps_conf *conf = &rtwdev->lps_conf;
        u8 h2c_pkt[H2C_PKT_SIZE] = {0};
 
+       rtw_fw_set_default_port(rtwdev, conf->port_id);
+
        SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_SET_PWR_MODE);
 
        SET_PWR_MODE_SET_MODE(h2c_pkt, conf->mode);
index 8855ffb944b70f67a4e7b0c5008e6405f257b996..5f5e6a9bad81556b70fd69de6607d11bd9b7d8a5 100644 (file)
@@ -335,6 +335,7 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)
 #define H2C_CMD_MEDIA_STATUS_RPT       0x01
 #define H2C_CMD_SET_PWR_MODE           0x20
 #define H2C_CMD_LPS_PG_INFO            0x2b
+#define H2C_CMD_DEFAULT_PORT           0x2c
 #define H2C_CMD_RA_INFO                        0x40
 #define H2C_CMD_RSSI_MONITOR           0x42
 
@@ -457,6 +458,8 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)
        le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(15, 8))
 #define SET_BT_WIFI_CONTROL_DATA5(h2c_pkt, value)                              \
        le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(23, 16))
+#define SET_DEFAULT_PORT_PORTID(h2c_pkt, value)                                \
+       le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
 
 #define SET_KEEP_ALIVE_ENABLE(h2c_pkt, value)                                 \
        le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))
@@ -523,6 +526,7 @@ void rtw_fw_send_general_info(struct rtw_dev *rtwdev);
 void rtw_fw_send_phydm_info(struct rtw_dev *rtwdev);
 
 void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para);
+void rtw_fw_set_default_port(struct rtw_dev *rtwdev, u8 port);
 void rtw_fw_set_pwr_mode(struct rtw_dev *rtwdev);
 void rtw_fw_set_pg_info(struct rtw_dev *rtwdev);
 void rtw_fw_query_bt_info(struct rtw_dev *rtwdev);
index 2fcdf70a3a77e4ee1dd603b0e5979d553dc4d9d2..b0dc4bed142c7ef98a50292ba3e9f220e3da1515 100644 (file)
@@ -357,6 +357,9 @@ static void rtw_wow_fw_security_type(struct rtw_dev *rtwdev)
 
 static int rtw_wow_fw_start(struct rtw_dev *rtwdev)
 {
+       struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
+       struct rtw_vif *rtwvif = (struct rtw_vif *)wow_vif->drv_priv;
+
        if (rtw_wow_mgd_linked(rtwdev)) {
                rtw_send_rsvd_page_h2c(rtwdev);
                rtw_wow_pattern_write(rtwdev);
@@ -369,6 +372,7 @@ static int rtw_wow_fw_start(struct rtw_dev *rtwdev)
                rtw_fw_channel_switch(rtwdev, true);
        }
 
+       rtw_fw_set_default_port(rtwdev, rtwvif->port);
        rtw_fw_set_wowlan_ctrl_cmd(rtwdev, true);
        rtw_fw_set_remote_wake_ctrl_cmd(rtwdev, true);