From nobody Fri Sep 12 11:14:08 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6F0DAC636CD for ; Fri, 10 Feb 2023 09:27:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231917AbjBJJ1f (ORCPT ); Fri, 10 Feb 2023 04:27:35 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59070 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231594AbjBJJ11 (ORCPT ); Fri, 10 Feb 2023 04:27:27 -0500 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 883B46569B for ; Fri, 10 Feb 2023 01:27:17 -0800 (PST) Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pQPgI-0003Up-2r; Fri, 10 Feb 2023 10:26:58 +0100 Received: from [2a0a:edc0:0:1101:1d::28] (helo=dude02.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1pQPg9-003w62-Nn; Fri, 10 Feb 2023 10:26:50 +0100 Received: from sha by dude02.red.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1pQPg9-002tID-UY; Fri, 10 Feb 2023 10:26:49 +0100 From: Sascha Hauer To: linux-wireless@vger.kernel.org Cc: Neo Jou , Hans Ulli Kroll , Ping-Ke Shih , Yan-Hsuan Chuang , Kalle Valo , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Martin Blumenstingl , kernel@pengutronix.de, Alexander Hochbaum , Da Xue , Po-Hao Huang , Andreas Henriksson , Viktor Petrenko , Sascha Hauer Subject: [PATCH 1/2] wifi: rtw88: usb: Set qsel correctly Date: Fri, 10 Feb 2023 10:26:41 +0100 Message-Id: <20230210092642.685905-2-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230210092642.685905-1-s.hauer@pengutronix.de> References: <20230210092642.685905-1-s.hauer@pengutronix.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" We have to extract qsel from the skb before doing skb_push() on it, otherwise qsel will always be 0. Fixes: a82dfd33d1237 ("wifi: rtw88: Add common USB chip support") Signed-off-by: Sascha Hauer --- drivers/net/wireless/realtek/rtw88/usb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireles= s/realtek/rtw88/usb.c index 4ef38279b64c9..d9e995544e405 100644 --- a/drivers/net/wireless/realtek/rtw88/usb.c +++ b/drivers/net/wireless/realtek/rtw88/usb.c @@ -471,9 +471,9 @@ static int rtw_usb_tx_write(struct rtw_dev *rtwdev, u8 *pkt_desc; int ep; =20 + pkt_info->qsel =3D rtw_usb_tx_queue_mapping_to_qsel(skb); pkt_desc =3D skb_push(skb, chip->tx_pkt_desc_sz); memset(pkt_desc, 0, chip->tx_pkt_desc_sz); - pkt_info->qsel =3D rtw_usb_tx_queue_mapping_to_qsel(skb); ep =3D qsel_to_ep(rtwusb, pkt_info->qsel); rtw_tx_fill_tx_desc(pkt_info, skb); rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data); --=20 2.30.2 From nobody Fri Sep 12 11:14:08 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4AE39C05027 for ; Fri, 10 Feb 2023 09:27:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231630AbjBJJ1T (ORCPT ); Fri, 10 Feb 2023 04:27:19 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58528 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231843AbjBJJ1M (ORCPT ); Fri, 10 Feb 2023 04:27:12 -0500 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3D588518F4 for ; Fri, 10 Feb 2023 01:27:11 -0800 (PST) Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pQPgI-0003Uq-2o; Fri, 10 Feb 2023 10:26:58 +0100 Received: from [2a0a:edc0:0:1101:1d::28] (helo=dude02.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1pQPg9-003w64-Pf; Fri, 10 Feb 2023 10:26:50 +0100 Received: from sha by dude02.red.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1pQPg9-002tIF-VJ; Fri, 10 Feb 2023 10:26:49 +0100 From: Sascha Hauer To: linux-wireless@vger.kernel.org Cc: Neo Jou , Hans Ulli Kroll , Ping-Ke Shih , Yan-Hsuan Chuang , Kalle Valo , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Martin Blumenstingl , kernel@pengutronix.de, Alexander Hochbaum , Da Xue , Po-Hao Huang , Andreas Henriksson , Viktor Petrenko , Sascha Hauer Subject: [PATCH 2/2] wifi: rtw88: usb: Fix urbs with size multiple of bulkout_size Date: Fri, 10 Feb 2023 10:26:42 +0100 Message-Id: <20230210092642.685905-3-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230210092642.685905-1-s.hauer@pengutronix.de> References: <20230210092642.685905-1-s.hauer@pengutronix.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The hardware can't handle urbs with a data size of multiple of bulkout_size. With such a packet the endpoint gets stuck and only replugging the hardware helps. Fix this by moving the header eight bytes down, thus making the packet eight bytes bigger. The same is done in rtw_usb_write_data_rsvd_page() already, but not yet for the tx data. Fixes: a82dfd33d1237 ("wifi: rtw88: Add common USB chip support") Signed-off-by: Sascha Hauer --- drivers/net/wireless/realtek/rtw88/tx.h | 2 ++ drivers/net/wireless/realtek/rtw88/usb.c | 34 +++++++++++++++--------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless= /realtek/rtw88/tx.h index a2f3ac326041b..38ce9c7ae62ed 100644 --- a/drivers/net/wireless/realtek/rtw88/tx.h +++ b/drivers/net/wireless/realtek/rtw88/tx.h @@ -75,6 +75,8 @@ le32p_replace_bits((__le32 *)(txdesc) + 0x07, value, GENMASK(15, 0)) #define SET_TX_DESC_DMA_TXAGG_NUM(txdesc, value) \ le32p_replace_bits((__le32 *)(txdesc) + 0x07, value, GENMASK(31, 24)) +#define GET_TX_DESC_OFFSET(txdesc) \ + le32_get_bits(*((__le32 *)(txdesc) + 0x00), GENMASK(23, 16)) #define GET_TX_DESC_PKT_OFFSET(txdesc) \ le32_get_bits(*((__le32 *)(txdesc) + 0x01), GENMASK(28, 24)) #define GET_TX_DESC_QSEL(txdesc) \ diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireles= s/realtek/rtw88/usb.c index d9e995544e405..08cd480958b6b 100644 --- a/drivers/net/wireless/realtek/rtw88/usb.c +++ b/drivers/net/wireless/realtek/rtw88/usb.c @@ -281,6 +281,7 @@ static int rtw_usb_write_port(struct rtw_dev *rtwdev, u= 8 qsel, struct sk_buff *s static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb, struct sk_buff_head= *list) { struct rtw_dev *rtwdev =3D rtwusb->rtwdev; + const struct rtw_chip_info *chip =3D rtwdev->chip; struct rtw_usb_txcb *txcb; struct sk_buff *skb_head; struct sk_buff *skb_iter; @@ -299,16 +300,11 @@ static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb= , struct sk_buff_head *list =20 skb_iter =3D skb_dequeue(list); =20 - if (skb_queue_empty(list)) { - skb_head =3D skb_iter; - goto queue; - } - skb_head =3D dev_alloc_skb(RTW_USB_MAX_XMITBUF_SZ); - if (!skb_head) { - skb_head =3D skb_iter; - goto queue; - } + if (!skb_head) + return false; + + skb_reserve(skb_head, RTW_USB_PACKET_OFFSET_SZ); =20 while (skb_iter) { unsigned long flags; @@ -326,17 +322,31 @@ static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb= , struct sk_buff_head *list =20 skb_iter =3D skb_peek(list); =20 - if (skb_iter && skb_iter->len + skb_head->len <=3D RTW_USB_MAX_XMITBUF_S= Z) + if (skb_iter && skb_iter->len + skb_head->len <=3D + RTW_USB_MAX_XMITBUF_SZ - RTW_USB_PACKET_OFFSET_SZ) __skb_unlink(skb_iter, list); else skb_iter =3D NULL; spin_unlock_irqrestore(&list->lock, flags); } =20 - if (agg_num > 1) + if (skb_head->len % rtwusb->bulkout_size =3D=3D 0) { + unsigned int offset; + + skb_push(skb_head, RTW_USB_PACKET_OFFSET_SZ); + + memmove(skb_head->data, skb_head->data + 8, chip->tx_pkt_desc_sz); + + offset =3D GET_TX_DESC_OFFSET(skb_head->data); + offset +=3D RTW_USB_PACKET_OFFSET_SZ; + SET_TX_DESC_OFFSET(skb_head->data, offset); + + SET_TX_DESC_PKT_OFFSET(skb_head->data, 1); + rtw_usb_fill_tx_checksum(rtwusb, skb_head, agg_num); + } else if (agg_num > 1) { rtw_usb_fill_tx_checksum(rtwusb, skb_head, agg_num); + } =20 -queue: skb_queue_tail(&txcb->tx_ack_queue, skb_head); =20 rtw_usb_write_port(rtwdev, GET_TX_DESC_QSEL(skb_head->data), skb_head, --=20 2.30.2