From 4539ea0212ebfd9fe102ee6875c1821f4aa37258 Mon Sep 17 00:00:00 2001 From: Rudi Heitbaum Date: Mon, 8 May 2023 09:37:46 +0000 Subject: [PATCH 1/4] linux: set perf build option NO_LIBTRACEEVENT=1 due to this kernel patch: - https://lkml.org/lkml/2023/3/11/68 --- packages/linux/package.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/linux/package.mk b/packages/linux/package.mk index 2c446eae5e..539f66b466 100644 --- a/packages/linux/package.mk +++ b/packages/linux/package.mk @@ -229,6 +229,7 @@ make_target() { NO_GTK2=1 \ NO_LIBNUMA=1 \ NO_LIBAUDIT=1 \ + NO_LIBTRACEEVENT=1 \ NO_LZMA=1 \ NO_SDT=1 \ CROSS_COMPILE="${TARGET_PREFIX}" \ From 5bfa53952ec25d1b3e04c9d1872d4b14b4779a25 Mon Sep 17 00:00:00 2001 From: Rudi Heitbaum Date: Mon, 8 May 2023 08:48:19 +0000 Subject: [PATCH 2/4] Revert "linux: rtw88: USB bug fixes" This reverts commit 4f5592e5cef960812357cad487cd99c86b2e3177. Patch included in 6.3.2 --- .../default/linux-122-rtw88-USB-fixes2.patch | 277 ------------------ 1 file changed, 277 deletions(-) delete mode 100644 packages/linux/patches/default/linux-122-rtw88-USB-fixes2.patch diff --git a/packages/linux/patches/default/linux-122-rtw88-USB-fixes2.patch b/packages/linux/patches/default/linux-122-rtw88-USB-fixes2.patch deleted file mode 100644 index ff56acd447..0000000000 --- a/packages/linux/patches/default/linux-122-rtw88-USB-fixes2.patch +++ /dev/null @@ -1,277 +0,0 @@ -From: Sascha Hauer -To: linux-wireless -Cc: Hans Ulli Kroll , - Larry Finger , - Pkshih , Tim K , - "Alex G ." , - Nick Morrow , - Viktor Petrenko , - Andreas Henriksson , - ValdikSS , kernel@pengutronix.de, - stable@vger.kernel.org, Sascha Hauer -Subject: [PATCH 0/2] RTW88 USB bug fixes -Date: Fri, 31 Mar 2023 14:10:52 +0200 -Message-Id: <20230331121054.112758-1-s.hauer@pengutronix.de> -X-Mailer: git-send-email 2.39.2 -MIME-Version: 1.0 -Content-Transfer-Encoding: 8bit -X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 -X-SA-Exim-Mail-From: sha@pengutronix.de -X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false -X-PTX-Original-Recipient: linux-wireless@vger.kernel.org -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -This series fixes two bugs in the RTW88 USB driver I was reported from -several people and that I also encountered myself. - -The first one resulted in "timed out to flush queue 3" messages from the -driver and sometimes a complete stall of the TX queues. - -The second one is specific to the RTW8821CU chipset. Here 2GHz networks -were hardly seen and impossible to connect to. This goes down to -misinterpreting the rfe_option field in the efuse. - -Sascha Hauer (2): - wifi: rtw88: usb: fix priority queue to endpoint mapping - wifi: rtw88: rtw8821c: Fix rfe_option field width - - drivers/net/wireless/realtek/rtw88/rtw8821c.c | 3 +- - drivers/net/wireless/realtek/rtw88/usb.c | 70 +++++++++++++------ - 2 files changed, 48 insertions(+), 25 deletions(-) - --- -2.39.2 - - -From: Sascha Hauer -To: linux-wireless -Cc: Hans Ulli Kroll , - Larry Finger , - Pkshih , Tim K , - "Alex G ." , - Nick Morrow , - Viktor Petrenko , - Andreas Henriksson , - ValdikSS , kernel@pengutronix.de, - stable@vger.kernel.org, Sascha Hauer -Subject: [PATCH 1/2] wifi: rtw88: usb: fix priority queue to endpoint mapping -Date: Fri, 31 Mar 2023 14:10:53 +0200 -Message-Id: <20230331121054.112758-2-s.hauer@pengutronix.de> -X-Mailer: git-send-email 2.39.2 -In-Reply-To: <20230331121054.112758-1-s.hauer@pengutronix.de> -References: <20230331121054.112758-1-s.hauer@pengutronix.de> -MIME-Version: 1.0 -Content-Transfer-Encoding: 8bit -X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 -X-SA-Exim-Mail-From: sha@pengutronix.de -X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false -X-PTX-Original-Recipient: linux-wireless@vger.kernel.org -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -The RTW88 chipsets have four different priority queues in hardware. For -the USB type chipsets the packets destined for a specific priority queue -must be sent through the endpoint corresponding to the queue. This was -not fully understood when porting from the RTW88 USB out of tree driver -and thus violated. - -This patch implements the qsel to endpoint mapping as in -get_usb_bulkout_id_88xx() in the downstream driver. - -Without this the driver often issues "timed out to flush queue 3" -warnings and often TX stalls completely. - -Signed-off-by: Sascha Hauer ---- - drivers/net/wireless/realtek/rtw88/usb.c | 70 ++++++++++++++++-------- - 1 file changed, 47 insertions(+), 23 deletions(-) - -diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c -index 2a8336b1847a5..a10d6fef4ffaf 100644 ---- a/drivers/net/wireless/realtek/rtw88/usb.c -+++ b/drivers/net/wireless/realtek/rtw88/usb.c -@@ -118,6 +118,22 @@ static void rtw_usb_write32(struct rtw_dev *rtwdev, u32 addr, u32 val) - rtw_usb_write(rtwdev, addr, val, 4); - } - -+static int dma_mapping_to_ep(enum rtw_dma_mapping dma_mapping) -+{ -+ switch (dma_mapping) { -+ case RTW_DMA_MAPPING_HIGH: -+ return 0; -+ case RTW_DMA_MAPPING_NORMAL: -+ return 1; -+ case RTW_DMA_MAPPING_LOW: -+ return 2; -+ case RTW_DMA_MAPPING_EXTRA: -+ return 3; -+ default: -+ return -EINVAL; -+ } -+} -+ - static int rtw_usb_parse(struct rtw_dev *rtwdev, - struct usb_interface *interface) - { -@@ -129,6 +145,8 @@ static int rtw_usb_parse(struct rtw_dev *rtwdev, - int num_out_pipes = 0; - int i; - u8 num; -+ const struct rtw_chip_info *chip = rtwdev->chip; -+ const struct rtw_rqpn *rqpn; - - for (i = 0; i < interface_desc->bNumEndpoints; i++) { - endpoint = &host_interface->endpoint[i].desc; -@@ -183,31 +201,34 @@ static int rtw_usb_parse(struct rtw_dev *rtwdev, - - rtwdev->hci.bulkout_num = num_out_pipes; - -- switch (num_out_pipes) { -- case 4: -- case 3: -- rtwusb->qsel_to_ep[TX_DESC_QSEL_TID0] = 2; -- rtwusb->qsel_to_ep[TX_DESC_QSEL_TID1] = 2; -- rtwusb->qsel_to_ep[TX_DESC_QSEL_TID2] = 2; -- rtwusb->qsel_to_ep[TX_DESC_QSEL_TID3] = 2; -- rtwusb->qsel_to_ep[TX_DESC_QSEL_TID4] = 1; -- rtwusb->qsel_to_ep[TX_DESC_QSEL_TID5] = 1; -- rtwusb->qsel_to_ep[TX_DESC_QSEL_TID6] = 0; -- rtwusb->qsel_to_ep[TX_DESC_QSEL_TID7] = 0; -- break; -- case 2: -- rtwusb->qsel_to_ep[TX_DESC_QSEL_TID0] = 1; -- rtwusb->qsel_to_ep[TX_DESC_QSEL_TID1] = 1; -- rtwusb->qsel_to_ep[TX_DESC_QSEL_TID2] = 1; -- rtwusb->qsel_to_ep[TX_DESC_QSEL_TID3] = 1; -- break; -- case 1: -- break; -- default: -- rtw_err(rtwdev, "failed to get out_pipes(%d)\n", num_out_pipes); -+ if (num_out_pipes < 1 || num_out_pipes > 4) { -+ rtw_err(rtwdev, "invalid number of endpoints %d\n", num_out_pipes); - return -EINVAL; - } - -+ rqpn = &chip->rqpn_table[num_out_pipes]; -+ -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID0] = dma_mapping_to_ep(rqpn->dma_map_be); -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID1] = dma_mapping_to_ep(rqpn->dma_map_bk); -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID2] = dma_mapping_to_ep(rqpn->dma_map_bk); -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID3] = dma_mapping_to_ep(rqpn->dma_map_be); -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID4] = dma_mapping_to_ep(rqpn->dma_map_vi); -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID5] = dma_mapping_to_ep(rqpn->dma_map_vi); -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID6] = dma_mapping_to_ep(rqpn->dma_map_vo); -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID7] = dma_mapping_to_ep(rqpn->dma_map_vo); -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID8] = -EINVAL; -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID9] = -EINVAL; -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID10] = -EINVAL; -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID11] = -EINVAL; -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID12] = -EINVAL; -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID13] = -EINVAL; -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID14] = -EINVAL; -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID15] = -EINVAL; -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_BEACON] = dma_mapping_to_ep(rqpn->dma_map_hi); -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_HIGH] = dma_mapping_to_ep(rqpn->dma_map_hi); -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_MGMT] = dma_mapping_to_ep(rqpn->dma_map_mg); -+ rtwusb->qsel_to_ep[TX_DESC_QSEL_H2C] = dma_mapping_to_ep(rqpn->dma_map_hi); -+ - return 0; - } - -@@ -250,7 +271,7 @@ static void rtw_usb_write_port_tx_complete(struct urb *urb) - static int qsel_to_ep(struct rtw_usb *rtwusb, unsigned int qsel) - { - if (qsel >= ARRAY_SIZE(rtwusb->qsel_to_ep)) -- return 0; -+ return -EINVAL; - - return rtwusb->qsel_to_ep[qsel]; - } -@@ -265,6 +286,9 @@ static int rtw_usb_write_port(struct rtw_dev *rtwdev, u8 qsel, struct sk_buff *s - int ret; - int ep = qsel_to_ep(rtwusb, qsel); - -+ if (ep < 0) -+ return ep; -+ - pipe = usb_sndbulkpipe(usbd, rtwusb->out_ep[ep]); - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (!urb) --- -2.39.2 - - -From: Sascha Hauer -To: linux-wireless -Cc: Hans Ulli Kroll , - Larry Finger , - Pkshih , Tim K , - "Alex G ." , - Nick Morrow , - Viktor Petrenko , - Andreas Henriksson , - ValdikSS , kernel@pengutronix.de, - stable@vger.kernel.org, Sascha Hauer -Subject: [PATCH 2/2] wifi: rtw88: rtw8821c: Fix rfe_option field width -Date: Fri, 31 Mar 2023 14:10:54 +0200 -Message-Id: <20230331121054.112758-3-s.hauer@pengutronix.de> -X-Mailer: git-send-email 2.39.2 -In-Reply-To: <20230331121054.112758-1-s.hauer@pengutronix.de> -References: <20230331121054.112758-1-s.hauer@pengutronix.de> -MIME-Version: 1.0 -Content-Transfer-Encoding: 8bit -X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 -X-SA-Exim-Mail-From: sha@pengutronix.de -X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false -X-PTX-Original-Recipient: linux-wireless@vger.kernel.org -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -On my RTW8821CU chipset rfe_option reads as 0x22. Looking at the -downstream driver suggests that the field width of rfe_option is 5 bit, -so rfe_option should be masked with 0x1f. - -Without this the rfe_option comparisons with 2 further down the -driver evaluate as false when they should really evaluate as true. -The effect is that 2G channels do not work. - -rfe_option is also used as an array index into rtw8821c_rfe_defs[]. -rtw8821c_rfe_defs[34] (0x22) was added as part of adding USB support, -likely because rfe_option reads as 0x22. As this now becomes 0x2, -rtw8821c_rfe_defs[34] is no longer used and can be removed. - -Signed-off-by: Sascha Hauer ---- - drivers/net/wireless/realtek/rtw88/rtw8821c.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c -index 17f800f6efbd0..67efa58dd78ee 100644 ---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c -+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c -@@ -47,7 +47,7 @@ static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) - - map = (struct rtw8821c_efuse *)log_map; - -- efuse->rfe_option = map->rfe_option; -+ efuse->rfe_option = map->rfe_option & 0x1f; - efuse->rf_board_option = map->rf_board_option; - efuse->crystal_cap = map->xtal_k; - efuse->pa_type_2g = map->pa_type; -@@ -1537,7 +1537,6 @@ static const struct rtw_rfe_def rtw8821c_rfe_defs[] = { - [2] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2), - [4] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2), - [6] = RTW_DEF_RFE(8821c, 0, 0), -- [34] = RTW_DEF_RFE(8821c, 0, 0), - }; - - static struct rtw_hw_reg rtw8821c_dig[] = { --- -2.39.2 - - From 6802394fcb7f761e4c7e1fb585ebf354e9853476 Mon Sep 17 00:00:00 2001 From: Rudi Heitbaum Date: Tue, 9 May 2023 05:09:34 +0000 Subject: [PATCH 3/4] linux: rtw88: rebase for 6.3.2 --- .../default/linux-122-rtw88-sdio-rfc-v1.patch | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/packages/linux/patches/default/linux-122-rtw88-sdio-rfc-v1.patch b/packages/linux/patches/default/linux-122-rtw88-sdio-rfc-v1.patch index 624b8d4c38..7eb8792cbf 100644 --- a/packages/linux/patches/default/linux-122-rtw88-sdio-rfc-v1.patch +++ b/packages/linux/patches/default/linux-122-rtw88-sdio-rfc-v1.patch @@ -88,7 +88,7 @@ diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h index 74f9d9a6d330..bba39d4565da 100644 --- a/include/linux/mmc/sdio_ids.h +++ b/include/linux/mmc/sdio_ids.h -@@ -111,6 +111,15 @@ +@@ -115,6 +115,15 @@ #define SDIO_VENDOR_ID_MICROCHIP_WILC 0x0296 #define SDIO_DEVICE_ID_MICROCHIP_WILC1000 0x5347 @@ -761,7 +761,7 @@ diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/rea index 4e5c194aac29..bf1291902661 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.c +++ b/drivers/net/wireless/realtek/rtw88/mac.c -@@ -269,15 +269,23 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on) +@@ -273,16 +273,24 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on) if (pwr_on == cur_pwr) return -EALREADY; @@ -772,8 +772,9 @@ index 4e5c194aac29..bf1291902661 100644 + rtw_hci_power_switch(rtwdev, false); + pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq; - if (rtw_pwr_seq_parser(rtwdev, pwr_seq)) - return -EINVAL; + ret = rtw_pwr_seq_parser(rtwdev, pwr_seq); + if (ret) + return ret; if (pwr_on) set_bit(RTW_FLAG_POWERON, rtwdev->flags); @@ -879,7 +880,7 @@ diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/rea index c04938691add..8e1fa824b32b 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.c +++ b/drivers/net/wireless/realtek/rtw88/mac.c -@@ -1041,6 +1041,9 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev) +@@ -1053,6 +1053,9 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev) else return -EINVAL; break; @@ -889,7 +890,7 @@ index c04938691add..8e1fa824b32b 100644 default: return -EINVAL; } -@@ -1203,6 +1206,9 @@ static int priority_queue_cfg(struct rtw_dev *rtwdev) +@@ -1215,6 +1218,9 @@ static int priority_queue_cfg(struct rtw_dev *rtwdev) else return -EINVAL; break; @@ -1044,8 +1045,8 @@ index 8e1fa824b32b..ad71f9838d1d 100644 + u32 imr; u8 rpwm; bool cur_pwr; - -@@ -278,17 +301,24 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on) + int ret; +@@ -279,18 +302,25 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on) */ rtw_hci_power_switch(rtwdev, false); @@ -1053,10 +1054,11 @@ index 8e1fa824b32b..ad71f9838d1d 100644 + rtw_write32(rtwdev, REG_SDIO_HIMR, 0); + pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq; -- if (rtw_pwr_seq_parser(rtwdev, pwr_seq)) -+ if (rtw_pwr_seq_parser(rtwdev, pwr_seq)) { + ret = rtw_pwr_seq_parser(rtwdev, pwr_seq); +- if (ret) ++ if (ret) { + rtw_write32(rtwdev, REG_SDIO_HIMR, imr); - return -EINVAL; + return ret; + } if (pwr_on) @@ -1071,7 +1073,7 @@ index 8e1fa824b32b..ad71f9838d1d 100644 return 0; } -@@ -450,6 +480,9 @@ static void download_firmware_reg_backup(struct rtw_dev *rtwdev, +@@ -462,6 +492,9 @@ static void download_firmware_reg_backup(struct rtw_dev *rtwdev, rtw_write16(rtwdev, REG_FIFOPAGE_INFO_1, 0x200); rtw_write32(rtwdev, REG_RQPN_CTRL_2, bckp[bckp_idx - 1].val); @@ -1081,7 +1083,7 @@ index 8e1fa824b32b..ad71f9838d1d 100644 /* Disable beacon related functions */ tmp = rtw_read8(rtwdev, REG_BCN_CTRL); bckp[bckp_idx].len = 1; -@@ -1062,8 +1095,12 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev) +@@ -1074,8 +1107,12 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev) if (rtw_chip_wcpu_11ac(rtwdev)) rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL); @@ -2825,7 +2827,7 @@ index 888427cf3bdf..9435cb43d1dc 100644 bool rtw_disable_lps_deep_mode; EXPORT_SYMBOL(rtw_disable_lps_deep_mode); -@@ -1783,6 +1784,10 @@ static int rtw_chip_parameter_setup(struct rtw_dev *rtwdev) +@@ -1785,6 +1786,10 @@ static int rtw_chip_parameter_setup(struct rtw_dev *rtwdev) rtwdev->hci.rpwm_addr = 0x03d9; rtwdev->hci.cpwm_addr = 0x03da; break; @@ -2935,7 +2937,7 @@ diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re index 9435cb43d1dc..bcdf1f8c8450 100644 --- a/drivers/net/wireless/realtek/rtw88/main.c +++ b/drivers/net/wireless/realtek/rtw88/main.c -@@ -2161,9 +2161,11 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) +@@ -2163,9 +2163,11 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) int max_tx_headroom = 0; int ret; From bc0822a7150b6b50f67bd9780366b5125d234894 Mon Sep 17 00:00:00 2001 From: Rudi Heitbaum Date: Mon, 1 May 2023 09:49:42 +0000 Subject: [PATCH 4/4] linux: update to 6.3.2 --- packages/linux/package.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/linux/package.mk b/packages/linux/package.mk index 539f66b466..03ec83c1dd 100644 --- a/packages/linux/package.mk +++ b/packages/linux/package.mk @@ -29,8 +29,8 @@ case "${LINUX}" in PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz" ;; *) - PKG_VERSION="6.3" - PKG_SHA256="ba3491f5ed6bd270a370c440434e3d69085fcdd528922fa01e73d7657db73b1e" + PKG_VERSION="6.3.2" + PKG_SHA256="b612ecf282ca3f7989ff6d9f39082833b7dc2d522cb969a05334d3614e9c5328" PKG_URL="https://www.kernel.org/pub/linux/kernel/v${PKG_VERSION/.*/}.x/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_PATCH_DIRS="default" ;;