Received: by 2002:a05:7412:40d:b0:e2:908c:2ebd with SMTP id 13csp339577rdf; Tue, 21 Nov 2023 04:25:11 -0800 (PST) X-Google-Smtp-Source: AGHT+IGZXGxxIYzm2v+RR9SLWSKeWeHXLghEFC7weVskxyHs+1DwQ5G6naE7TMwjIfgNMiKEoL4x X-Received: by 2002:a05:6a20:a315:b0:189:c987:76c5 with SMTP id x21-20020a056a20a31500b00189c98776c5mr9917968pzk.43.1700569510756; Tue, 21 Nov 2023 04:25:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700569510; cv=none; d=google.com; s=arc-20160816; b=miV5sQwFjIAkZ+fuUVpHXHRZW9Mni/MeHZ0z5qniRjgm0IZ4jSVYcAlhVwaIIOJh6/ wxsjvuWU+azOs/IhzXgwGtwST74Qa4+Nc87BBZ3QLXPERfGFAeOGrQoKSxMCWqcX/FkT eYOQ5xwEMyXqdrmBx1fVkIxvN57og5lN92JFFpxFWglyBUMRsOoFVTXsxOO/KhvBWfHD NM+z5k/m30kz1pRlcv1EB0/uP4wVhnPQhj/jqY32HNRM5UYX7lCaPq0UCQBhtUFbxNkZ XhIbCOt4qxYGdMQSGViHcyKoZ2SOz/zU4UcJKJHjjWTgR45lRbjykCuxJKaORrzzQNRv CLew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=y7DbtpzK1w4tm0MAmW+BGPDlzSNx3OWVKQWgUITDxBs=; fh=v5N0kGxFkIJB+a5hEqkR+Rfxy+CsI4MSwxfxCwVnQnM=; b=v0G2DB9uolOAOfRWcx5DhZ/ymtrmROKoEzNTX0GA6RdXlZG4+bsMLM9utk7g8stzdE DMQtfeM2S1n8Hqj+vEHUtdH1/nxw8dEfL/Qb9seHYXgYaSw3c7F254K/nlWmhMCknBza RVs/kcEVJFDDCs9vURZhLPVJiB7xGJ85IIoU+avNDmiIXs25cGeSAtmNL0otm4z5u0wR SIF0bHTmyBPVBgoz9MdUPv6ZfdPqcAt7MJJdo8rdt2zfmaFUm3+O680ByXGOHEPOpvvE ulH+tB/+mC+QYMzy1pZA7M1nOh0bwIc2rKI2IDlyQoRVi5Eg59V6F0m5DWv3wEyVcuw9 srVQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=PitmgaUK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id fa1-20020a056a002d0100b006c2d5919b46si10382904pfb.117.2023.11.21.04.25.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Nov 2023 04:25:10 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=PitmgaUK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id D13DA80FC731; Tue, 21 Nov 2023 04:25:08 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234658AbjKUMZH (ORCPT + 99 others); Tue, 21 Nov 2023 07:25:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36920 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230497AbjKUMZG (ORCPT ); Tue, 21 Nov 2023 07:25:06 -0500 Received: from mail-yb1-xb35.google.com (mail-yb1-xb35.google.com [IPv6:2607:f8b0:4864:20::b35]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4F69519F for ; Tue, 21 Nov 2023 04:25:02 -0800 (PST) Received: by mail-yb1-xb35.google.com with SMTP id 3f1490d57ef6-db3a09e96daso1848259276.3 for ; Tue, 21 Nov 2023 04:25:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1700569501; x=1701174301; darn=vger.kernel.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=y7DbtpzK1w4tm0MAmW+BGPDlzSNx3OWVKQWgUITDxBs=; b=PitmgaUKxW3UkwX2TzLdo6kVDmlY2ZB2gsxUdv9uh0H1R5yf1+VDHOj+dYFHHDnbvl 1cACAaNP80opv53jdRHbcOoqL2zItp4Ik1tENDmdle9tWD/0E+0SNKwzvxfV3k0d/wRr ALyECvytj22hsZoQQlpZouf1ZT/ZS0cPjPOPTDJI266EblbUGuQsAiUUdavcmZKSD0fN npcEaNyM/z9pRDQbQblQDwpHmpUkFApDB3rSIlQNGn4guVO72Cl1EC2OQnESudPbPO9a ETAwGR0v0QvxSG+GMCe1gugUqu6ZaSbrF7aJpjdeMSkF05U8GdbEo7mSi8cqp4YwNZv9 PP2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700569501; x=1701174301; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=y7DbtpzK1w4tm0MAmW+BGPDlzSNx3OWVKQWgUITDxBs=; b=ii7AH1iK4TkMv2fpCq13v4ehSjEBJNaRwOM2rmH5z7fz8h5sG8SWOB+prtk5X/k2oB r2G4nmthqiFkSkXiJT/piA5OQKn/ZFLAmwxS++CEXKcl4tAmwqKK/BMGdrqK44CSOcIH P4EGVuKMWqGjVdbQf0WY+mIfUkw6MqnSlSxlfeuDqI7B2H78u1Iv/lc3N2mAlpL6VG43 lp5xB1Kk0Fw7zyunHwPpTQoH7tnvYRt2uQeo9TVXJYIBISeoTPGKJ0nmexzBV8uM2/73 VKvy67LmEguz4szWKUxnM9DVC+1As8S/xI6moKAPKcmAXhfrSkQDr6r3MKq8LcKUZonX 8ZSg== X-Gm-Message-State: AOJu0Ywp0IUBeeeaFCGYUUTgrX5OBwT0cVkIg4XX8tZFHxb5Q4ZJYYOZ 0kRutRXu5RcUDqeZKn4XXp35Kh2G5wLSkmhh7uWp4g== X-Received: by 2002:a25:8907:0:b0:da0:400e:750c with SMTP id e7-20020a258907000000b00da0400e750cmr9033029ybl.27.1700569501269; Tue, 21 Nov 2023 04:25:01 -0800 (PST) MIME-Version: 1.0 References: <20231120115726.1569323-1-martin.blumenstingl@googlemail.com> In-Reply-To: <20231120115726.1569323-1-martin.blumenstingl@googlemail.com> From: Ulf Hansson Date: Tue, 21 Nov 2023 13:24:25 +0100 Message-ID: Subject: Re: [PATCH v3] wifi: rtw88: sdio: Honor the host max_req_size in the RX path To: Martin Blumenstingl Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, jernej.skrabec@gmail.com, pkshih@realtek.com, kvalo@kernel.org, tony0620emma@gmail.com, lukas@mntre.com Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Tue, 21 Nov 2023 04:25:09 -0800 (PST) On Mon, 20 Nov 2023 at 12:57, Martin Blumenstingl wrote: > > Lukas reports skb_over_panic errors on his Banana Pi BPI-CM4 which comes > with an Amlogic A311D (G12B) SoC and a RTL8822CS SDIO wifi/Bluetooth > combo card. The error he observed is identical to what has been fixed > in commit e967229ead0e ("wifi: rtw88: sdio: Check the HISR RX_REQUEST > bit in rtw_sdio_rx_isr()") but that commit didn't fix Lukas' problem. > > Lukas found that disabling or limiting RX aggregation works around the > problem for some time (but does not fully fix it). In the following > discussion a few key topics have been discussed which have an impact on > this problem: > - The Amlogic A311D (G12B) SoC has a hardware bug in the SDIO controller > which prevents DMA transfers. Instead all transfers need to go through > the controller SRAM which limits transfers to 1536 bytes > - rtw88 chips don't split incoming (RX) packets, so if a big packet is > received this is forwarded to the host in it's original form > - rtw88 chips can do RX aggregation, meaning more multiple incoming > packets can be pulled by the host from the card with one MMC/SDIO > transfer. This Depends on settings in the REG_RXDMA_AGG_PG_TH > register (BIT_RXDMA_AGG_PG_TH limits the number of packets that will > be aggregated, BIT_DMA_AGG_TO_V1 configures a timeout for aggregation > and BIT_EN_PRE_CALC makes the chip honor the limits more effectively) > > Use multiple consecutive reads in rtw_sdio_read_port() and limit the > number of bytes which are copied by the host from the card in one > MMC/SDIO transfer. This allows receiving a buffer that's larger than > the hosts max_req_size (number of bytes which can be transferred in > one MMC/SDIO transfer). As a result of this the skb_over_panic error > is gone as the rtw88 driver is now able to receive more than 1536 bytes > from the card (either because the incoming packet is larger than that > or because multiple packets have been aggregated). > > In case of an receive errors (-EILSEQ has been observed by Lukas) we > need to drain the remaining data from the card's buffer, otherwise the > card will return corrupt data for the next rtw_sdio_read_port() call. > > Fixes: 65371a3f14e7 ("wifi: rtw88: sdio: Add HCI implementation for SDIO based chipsets") > Reported-by: Lukas F. Hartmann > Closes: https://lore.kernel.org/linux-wireless/CAFBinCBaXtebixKbjkWKW_WXc5k=NdGNaGUjVE8NCPNxOhsb2g@mail.gmail.com/ > Suggested-by: Ping-Ke Shih > Signed-off-by: Martin Blumenstingl From the SDIO interface point of view, feel free to add: Reviewed-by: Ulf Hansson Kind regards Uffe > --- > > Changes since v2 at [2]: > - Don't initialize err to zero as that intiial value is never used. > Thanks Ping-Ke for spotting this! > - Add a comment explaning why we need to continue reading but still > have to return an error to the caller of rtw_sdio_read_port() > > Changes since v1 at [0]: > - We need to read all bytes if we split the transaction into multiple > smaller reads. This is even the case when one of N reads reports an > error. Otherwise the next read port call will return garbage (partially > containing zeros, ...). A similar-ish approach can be found in the > vendor driver, see [1] (specifically the call to sdio_recv_and_drop()) > - Update the patch description accordingly > > With a preliminary version of this updated patch Lukas reported off- > list: "i've been using this laptop for almost 3 hours with heavy wifi > usage and so far no problems" > > > [0] https://lore.kernel.org/lkml/169089906853.212423.17095176293160428610.kvalo@kernel.org/T/ > [1] https://github.com/chewitt/RTL8822CS/blob/ad1391e219b59314485739a499fb442d5bbc069e/hal/rtl8822c/sdio/rtl8822cs_io.c#L468-L477 > [2] https://lore.kernel.org/linux-wireless/20230806181656.2072792-1-martin.blumenstingl@googlemail.com/ > > > drivers/net/wireless/realtek/rtw88/sdio.c | 35 ++++++++++++++++++----- > 1 file changed, 28 insertions(+), 7 deletions(-) > > diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c > index 2c1fb2dabd40..0cae5746f540 100644 > --- a/drivers/net/wireless/realtek/rtw88/sdio.c > +++ b/drivers/net/wireless/realtek/rtw88/sdio.c > @@ -500,19 +500,40 @@ static u32 rtw_sdio_get_tx_addr(struct rtw_dev *rtwdev, size_t size, > static int rtw_sdio_read_port(struct rtw_dev *rtwdev, u8 *buf, size_t count) > { > struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; > + struct mmc_host *host = rtwsdio->sdio_func->card->host; > bool bus_claim = rtw_sdio_bus_claim_needed(rtwsdio); > u32 rxaddr = rtwsdio->rx_addr++; > - int ret; > + int ret = 0, err; > + size_t bytes; > > if (bus_claim) > sdio_claim_host(rtwsdio->sdio_func); > > - ret = sdio_memcpy_fromio(rtwsdio->sdio_func, buf, > - RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr), count); > - if (ret) > - rtw_warn(rtwdev, > - "Failed to read %zu byte(s) from SDIO port 0x%08x", > - count, rxaddr); > + while (count > 0) { > + bytes = min_t(size_t, host->max_req_size, count); > + > + err = sdio_memcpy_fromio(rtwsdio->sdio_func, buf, > + RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr), > + bytes); > + if (err) { > + rtw_warn(rtwdev, > + "Failed to read %zu byte(s) from SDIO port 0x%08x: %d", > + bytes, rxaddr, err); > + > + /* Signal to the caller that reading did not work and > + * that the data in the buffer is short/corrupted. > + */ > + ret = err; > + > + /* Don't stop here - instead drain the remaining data > + * from the card's buffer, else the card will return > + * corrupt data for the next rtw_sdio_read_port() call. > + */ > + } > + > + count -= bytes; > + buf += bytes; > + } > > if (bus_claim) > sdio_release_host(rtwsdio->sdio_func); > -- > 2.42.1 >