Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1559225pxb; Mon, 8 Mar 2021 00:02:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJy4xXi5JQG1VMFr5kdeAWqiF3l9V8LgUP+rcFfQbg1AI8f4hoj7kZdAZFgBnu9meMFtjMjI X-Received: by 2002:a17:906:7015:: with SMTP id n21mr13867384ejj.391.1615190547533; Mon, 08 Mar 2021 00:02:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615190547; cv=none; d=google.com; s=arc-20160816; b=NIsKoJQT6oAxTZIpV53XOkWiGlnlg25DWMW9DPhR1JgzzX3gV9lLc6niIeZl9dk5/N WWqJdPgDeyAfl1YW3w8a6khzyvQ+vEvUfE5gmpQ+ifkf4FpJS2uaziZdCEkU6u3myESq oAlEuAcAsmhBsXWH/VwrzC0mW56LQj+VDF7I4YV1eYupX486x8icS65NRkN3bbZlK2Tk 0lapdB7GA7gOkfvMWRmcvAz1TscPukv9uRorP+4Ge0aYtl+nziLAO3jEgM1X8kNEiBAJ hcSqGQ2/VpS9s+fh2BFY8H0ylnOl/FkzUn6GPr561Z4PFGVUjd35vStzFHkSXZaFOgmk HZHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ev3Pp/QA4oluCoIrmGbEghkIorrk7nhWOt+qWz+0y/M=; b=Eu4wu9nZHvV34Z+l66I4gPJWA+3tRpTFRBresIJFuxO6qUSCbmJKXzGV4QFeqgKi9c xvEZaBB8QpPdcolKH5Q3ZaVPJTpOYw69vgcqh2eXveQdPnlC9/FFzSM3kLoqRCpAmJcB ZLtShOsCyKWte/Hp720b2jaSn9kX+UHYuTTVhfoS4POrJyDlxzTyyiNY4BuNfsm65CNO OCNxYh8AGg9SJVt/MdErX7hUPrEvAVPnUG2NZWRjb0DLkXafC6OPIZouCY9l8Pt02Bni 9xZ8oRfP4emR/5igr1zap7PrCP8C+s7n6i2S6U7UFDd77WSE6CKMykupEiih0qExBWMR 5k/A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=CCR9Fd8T; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d26si6446634edu.160.2021.03.08.00.02.05; Mon, 08 Mar 2021 00:02:27 -0800 (PST) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=CCR9Fd8T; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231296AbhCGSVn (ORCPT + 99 others); Sun, 7 Mar 2021 13:21:43 -0500 Received: from mail.kernel.org ([198.145.29.99]:35618 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231159AbhCGSVN (ORCPT ); Sun, 7 Mar 2021 13:21:13 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 519FA65187; Sun, 7 Mar 2021 18:21:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1615141273; bh=L2C1A+vbNChkSaVAN+AJQNmVmzFOUWGPXNSLTXAoly8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CCR9Fd8Tu+qCCPTyiOyZmm150mVwB8n+vznFfRlwpcjVBemBWBse+4IiJ/t1ZQfsD 4dmGwiqzSPw+boqZiAN5nLZhRcDPq1NWvr7AGOmAoGZAWfZcKq+RvGbTN4Esbi93sj Wq0ENW4TK6mGclvAfksVKmUtBWSwaj/fhV9N6aUC8v6Kh6/pEzPNa4N3It4kSTFP5k kPtj8vHckF0QzxHDinkDf+W5aeiQxsD3BnQTPpJv5txOtw8K+ge3H/h67wwzrCgyVh a1s/Ac3DSmS66THr2PgUEZEzMhCFBDsT6swYSCVdrpOCeekCBIgooThUIxplXMsfYg oPehHkPApACdw== From: Lorenzo Bianconi To: nbd@nbd.name Cc: linux-wireless@vger.kernel.org, lorenzo.bianconi@redhat.com, sean.wang@mediatek.com Subject: [PATCH 5/7] mt76: dma: introduce mt76_dma_queue_reset routine Date: Sun, 7 Mar 2021 19:20:49 +0100 Message-Id: <36d656488ba44442c7a98adfed53469b49f5c629.1615140875.git.lorenzo@kernel.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Introduce mt76_dma_queue_reset utility routine to reset a given hw queue. This is a preliminary patch to introduce mt7921 chip reset support. Co-developed-by: Sean Wang Signed-off-by: Sean Wang Signed-off-by: Lorenzo Bianconi --- drivers/net/wireless/mediatek/mt76/dma.c | 46 ++++++++++++++--------- drivers/net/wireless/mediatek/mt76/mt76.h | 3 ++ 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c index 19098b852d0a..82711d69ec94 100644 --- a/drivers/net/wireless/mediatek/mt76/dma.c +++ b/drivers/net/wireless/mediatek/mt76/dma.c @@ -79,13 +79,38 @@ mt76_free_pending_txwi(struct mt76_dev *dev) local_bh_enable(); } +static void +mt76_dma_sync_idx(struct mt76_dev *dev, struct mt76_queue *q) +{ + writel(q->desc_dma, &q->regs->desc_base); + writel(q->ndesc, &q->regs->ring_size); + q->head = readl(&q->regs->dma_idx); + q->tail = q->head; +} + +static void +mt76_dma_queue_reset(struct mt76_dev *dev, struct mt76_queue *q) +{ + int i; + + if (!q) + return; + + /* clear descriptors */ + for (i = 0; i < q->ndesc; i++) + q->desc[i].ctrl = cpu_to_le32(MT_DMA_CTL_DMA_DONE); + + writel(0, &q->regs->cpu_idx); + writel(0, &q->regs->dma_idx); + mt76_dma_sync_idx(dev, q); +} + static int mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q, int idx, int n_desc, int bufsize, u32 ring_base) { int size; - int i; spin_lock_init(&q->lock); spin_lock_init(&q->cleanup_lock); @@ -105,14 +130,7 @@ mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q, if (!q->entry) return -ENOMEM; - /* clear descriptors */ - for (i = 0; i < q->ndesc; i++) - q->desc[i].ctrl = cpu_to_le32(MT_DMA_CTL_DMA_DONE); - - writel(q->desc_dma, &q->regs->desc_base); - writel(0, &q->regs->cpu_idx); - writel(0, &q->regs->dma_idx); - writel(q->ndesc, &q->regs->ring_size); + mt76_dma_queue_reset(dev, q); return 0; } @@ -201,15 +219,6 @@ mt76_dma_tx_cleanup_idx(struct mt76_dev *dev, struct mt76_queue *q, int idx, memset(e, 0, sizeof(*e)); } -static void -mt76_dma_sync_idx(struct mt76_dev *dev, struct mt76_queue *q) -{ - writel(q->desc_dma, &q->regs->desc_base); - writel(q->ndesc, &q->regs->ring_size); - q->head = readl(&q->regs->dma_idx); - q->tail = q->head; -} - static void mt76_dma_kick_queue(struct mt76_dev *dev, struct mt76_queue *q) { @@ -640,6 +649,7 @@ mt76_dma_init(struct mt76_dev *dev) static const struct mt76_queue_ops mt76_dma_ops = { .init = mt76_dma_init, .alloc = mt76_dma_alloc_queue, + .reset_q = mt76_dma_queue_reset, .tx_queue_skb_raw = mt76_dma_tx_queue_skb_raw, .tx_queue_skb = mt76_dma_tx_queue_skb, .tx_cleanup = mt76_dma_tx_cleanup, diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h index bbe6a70851c8..f306a9c71ebf 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76.h +++ b/drivers/net/wireless/mediatek/mt76/mt76.h @@ -192,6 +192,8 @@ struct mt76_queue_ops { bool flush); void (*kick)(struct mt76_dev *dev, struct mt76_queue *q); + + void (*reset_q)(struct mt76_dev *dev, struct mt76_queue *q); }; enum mt76_wcid_flags { @@ -794,6 +796,7 @@ static inline u16 mt76_rev(struct mt76_dev *dev) #define mt76_queue_rx_reset(dev, ...) (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__) #define mt76_queue_tx_cleanup(dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__) #define mt76_queue_kick(dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__) +#define mt76_queue_reset(dev, ...) (dev)->mt76.queue_ops->reset_q(&((dev)->mt76), __VA_ARGS__) #define mt76_for_each_q_rx(dev, i) \ for (i = 0; i < ARRAY_SIZE((dev)->q_rx) && \ -- 2.29.2