From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6BCD52750FB for ; Mon, 1 Sep 2025 20:58:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756760336; cv=none; b=YhAXhljw7stCd0vCMGLqfwwztLp2tmE11VZOoSirxJ5e1ucnbZt1BadRja+nK/zY2ABYUhBUdGosu+ZLnDu9k5K/LVAbAyaHjNvesnJl6LOusgoVRD8j1aSbDcBoHhTIOZXPYMeeEUEfcsMrjRaKcGgA3ke0UHRsjOFcNaE2Fm8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756760336; c=relaxed/simple; bh=zIxR8tHE1ex3YBnEJ3n32W6/UA/Srrv0hymuahhhdJw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Dhk3QmqWXkYAWhELa5fdhVwpAKNYGDDLhjw+8u7tJ0r5arwtZtr2+Mvy0D4ymE+e2M/KQjqHw7rtQftSZrPDLtrPlwEO6UiwBMIzboFqW0fnHgLX7HOro0zzfRY8QDcP4RUQq5jx8lOSrP9/EWGL92cG2v4y1X1zkijKA1xX6ww= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nqWn9vuD; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nqWn9vuD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F1B9CC4CEF0; Mon, 1 Sep 2025 20:58:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756760336; bh=zIxR8tHE1ex3YBnEJ3n32W6/UA/Srrv0hymuahhhdJw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nqWn9vuDpOsmIoapBHnri6HIeeW58qISJ6m4NoftkRaWqG0OKFfNONcGiU1rLR8iC TRfpW1v85t8YXa9zEe2j96k+OJQtp5hsuXPxNLvtU7aMfk6AlPHPwTWPmsGpCiUNwh DzU8VYTt4ipMUS07OT21fKzFaeANjpvA/z/z+BoZbitX54htCsXWPSjp3R3eReoCHr kbS8rTS0Nw/yXY5VsNh4EG1v8Tud2FqRgTZOz/UX77qPvBtyUx7uDJAcVHhpd8YcGz V8yHVIwrkUVrsm19K/bc6KtvYXQ/4BBBuHpmEAFj9xvcPCCd7Q8cLFnmy28OgZXr4W oY4DzmId7Pvxg== From: Lorenzo Bianconi Date: Mon, 01 Sep 2025 22:58:09 +0200 Subject: [PATCH mt76 v2 13/14] wifi: mt76: Add mt76_dma_get_rxdmad_c_buf utility routione Precedence: bulk X-Mailing-List: linux-wireless@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20250901-mt7996-rro-rework-v2-13-1f95086b51d1@kernel.org> References: <20250901-mt7996-rro-rework-v2-0-1f95086b51d1@kernel.org> In-Reply-To: <20250901-mt7996-rro-rework-v2-0-1f95086b51d1@kernel.org> To: Felix Fietkau , Ryder Lee , Shayne Chen , Sean Wang , Matthias Brugger , AngeloGioacchino Del Regno , Sujuan Chen , Lorenzo Bianconi Cc: linux-wireless@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, Rex Lu X-Mailer: b4 0.14.2 Introduce mt76_dma_get_rxdmad_c_buf routine to process packets received by HW-RRO v3.1 module. This is a preliminary patch to introduce SW path for HW-RRO v3.1 module available on MT7992 chipset. Co-developed-by: Rex Lu Signed-off-by: Rex Lu Signed-off-by: Lorenzo Bianconi --- drivers/net/wireless/mediatek/mt76/dma.c | 52 +++++++++++++++++++++++++++++-- drivers/net/wireless/mediatek/mt76/dma.h | 33 ++++++++++++++++++++ drivers/net/wireless/mediatek/mt76/mt76.h | 8 +++++ 3 files changed, 90 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c index fc30a8ea54ca6f736fd911de4ad471558e6c9577..67955bd759bacec6c6f562ecd9c114463b601ed2 100644 --- a/drivers/net/wireless/mediatek/mt76/dma.c +++ b/drivers/net/wireless/mediatek/mt76/dma.c @@ -427,15 +427,55 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, struct mt76_queue *q, bool flush) wake_up(&dev->tx_wait); } +static void * +mt76_dma_get_rxdmad_c_buf(struct mt76_dev *dev, struct mt76_queue *q, + int idx, int *len, bool *more) +{ + struct mt76_queue_entry *e = &q->entry[idx]; + struct mt76_rro_rxdmad_c *dmad = e->buf; + struct mt76_txwi_cache *t; + void *buf; + + t = mt76_rx_token_release(dev, dmad->rx_token_id); + if (!t) + return ERR_PTR(-EAGAIN); + + q = &dev->q_rx[t->qid]; + dma_sync_single_for_cpu(dev->dma_dev, t->dma_addr, + SKB_WITH_OVERHEAD(q->buf_size), + page_pool_get_dma_dir(q->page_pool)); + + if (len) + *len = dmad->sdl0; + if (more) + *more = !dmad->ls; + + buf = t->ptr; + if (dmad->ind_reason == MT_DMA_WED_IND_REASON_REPEAT || + dmad->ind_reason == MT_DMA_WED_IND_REASON_OLDPKT) { + mt76_put_page_pool_buf(buf, false); + buf = ERR_PTR(-EAGAIN); + } + t->ptr = NULL; + t->dma_addr = 0; + + mt76_put_rxwi(dev, t); + + return buf; +} + static void * mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx, - int *len, u32 *info, bool *more, bool *drop) + int *len, u32 *info, bool *more, bool *drop, bool flush) { struct mt76_queue_entry *e = &q->entry[idx]; struct mt76_desc *desc = &q->desc[idx]; u32 ctrl, desc_info, buf1; void *buf = e->buf; + if (mt76_queue_is_wed_rro_rxdmad_c(q) && !flush) + buf = mt76_dma_get_rxdmad_c_buf(dev, q, idx, len, more); + if (mt76_queue_is_wed_rro(q)) goto done; @@ -516,7 +556,7 @@ mt76_dma_dequeue(struct mt76_dev *dev, struct mt76_queue *q, bool flush, q->tail = (q->tail + 1) % q->ndesc; q->queued--; - return mt76_dma_get_buf(dev, q, idx, len, info, more, drop); + return mt76_dma_get_buf(dev, q, idx, len, info, more, drop, flush); } static int @@ -885,10 +925,16 @@ mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget) if (!data) break; + if (PTR_ERR(data) == -EAGAIN) { + done++; + continue; + } + if (mt76_queue_is_wed_rro_ind(q) && dev->drv->rx_rro_ind_process) dev->drv->rx_rro_ind_process(dev, data); - if (mt76_queue_is_wed_rro(q)) { + if (mt76_queue_is_wed_rro(q) && + !mt76_queue_is_wed_rro_rxdmad_c(q)) { done++; continue; } diff --git a/drivers/net/wireless/mediatek/mt76/dma.h b/drivers/net/wireless/mediatek/mt76/dma.h index f53c2136858043d0f208d9d21304fae2058ac70f..f47039d9ba4fd03d7decc6dd7582bb0efccda496 100644 --- a/drivers/net/wireless/mediatek/mt76/dma.h +++ b/drivers/net/wireless/mediatek/mt76/dma.h @@ -58,6 +58,39 @@ struct mt76_wed_rro_desc { __le32 buf1; } __packed __aligned(4); +struct mt76_rro_rxdmad_c { + u32 sdp0_31_0; + u32 header_ofst : 7; + u32 ver : 1; + u32 to_host : 1; + u32 ring_info : 2; + u32 dst_sel : 2; + u32 pn_chk_fail : 1; + u32 rsv : 2; + u32 sdl0 : 14; + u32 ls : 1; + u32 rsv2 : 1; + u32 sdp0_35_32 : 4; + u32 rsv3 : 2; + u32 sca_gat : 1; + u32 par_se : 1; + u32 rss_hash : 4; + u32 ind_reason : 4; + u32 rx_token_id : 16; + u32 cs_status : 4; + u32 cs_type : 4; + u32 c : 1; + u32 f : 1; + u32 un : 1; + u32 is_fc_data : 1; + u32 uc : 1; + u32 mc : 1; + u32 bc : 1; + u32 rsv4 : 1; + u32 wcid : 12; + u32 magic_cnt : 4; +}; + enum mt76_qsel { MT_QSEL_MGMT, MT_QSEL_HCCA, diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h index 39e4641ae2cc5287a2c8c838c729bc7e85b68b9a..4aabb8d1021a70f502a4afe25b14d2cc6d524aca 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76.h +++ b/drivers/net/wireless/mediatek/mt76/mt76.h @@ -45,6 +45,7 @@ #define MT_WED_RRO_Q_DATA(_n) __MT_WED_RRO_Q(MT76_WED_RRO_Q_DATA, _n) #define MT_WED_RRO_Q_MSDU_PG(_n) __MT_WED_RRO_Q(MT76_WED_RRO_Q_MSDU_PG, _n) #define MT_WED_RRO_Q_IND __MT_WED_RRO_Q(MT76_WED_RRO_Q_IND, 0) +#define MT_WED_RRO_Q_RXDMAD_C __MT_WED_RRO_Q(MT76_WED_RRO_Q_RXDMAD_C, 0) struct mt76_dev; struct mt76_phy; @@ -71,6 +72,7 @@ enum mt76_wed_type { MT76_WED_RRO_Q_DATA, MT76_WED_RRO_Q_MSDU_PG, MT76_WED_RRO_Q_IND, + MT76_WED_RRO_Q_RXDMAD_C, }; struct mt76_bus_ops { @@ -1793,6 +1795,12 @@ static inline bool mt76_queue_is_wed_rro_ind(struct mt76_queue *q) FIELD_GET(MT_QFLAG_WED_TYPE, q->flags) == MT76_WED_RRO_Q_IND; } +static inline bool mt76_queue_is_wed_rro_rxdmad_c(struct mt76_queue *q) +{ + return mt76_queue_is_wed_rro(q) && + FIELD_GET(MT_QFLAG_WED_TYPE, q->flags) == MT76_WED_RRO_Q_RXDMAD_C; +} + static inline bool mt76_queue_is_wed_rro_data(struct mt76_queue *q) { return mt76_queue_is_wed_rro(q) && -- 2.50.1