All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lorenzo Bianconi <lorenzo@kernel.org>
To: sean.wang@mediatek.com
Cc: nbd@nbd.name, lorenzo.bianconi@redhat.com,
	Soul.Huang@mediatek.com, YN.Chen@mediatek.com,
	Leon.Yen@mediatek.com, Eric-SY.Chang@mediatek.com,
	Mark-YW.Chen@mediatek.com, Deren.Wu@mediatek.com,
	km.lin@mediatek.com, robin.chiu@mediatek.com,
	Eddie.Chen@mediatek.com, ch.yeh@mediatek.com,
	posh.sun@mediatek.com, ted.huang@mediatek.com,
	Eric.Liang@mediatek.com, Stella.Chang@mediatek.com,
	Tom.Chou@mediatek.com, steve.lee@mediatek.com, jsiuda@google.com,
	frankgor@google.com, jemele@google.com,
	abhishekpandit@google.com, shawnku@google.com,
	linux-wireless@vger.kernel.org,
	linux-mediatek@lists.infradead.org
Subject: Re: [PATCH v4 11/16] mt76: sdio: extend sdio module to support CONNAC2
Date: Wed, 13 Oct 2021 18:29:47 +0200	[thread overview]
Message-ID: <YWcJe27HQMS7B85j@lore-desk> (raw)
In-Reply-To: <654f1b4b4f5c5b566e8a64795a3c8ebcc19a7593.1634077769.git.objelf@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 10895 bytes --]

> From: Sean Wang <sean.wang@mediatek.com>
> 
> Extend sdio module to support CONNAC2 hw that mt7921s rely on.
> 
> Tested-by: Deren Wu <deren.wu@mediatek.com>
> Acked-by: Lorenzo Bianconi <lorenzo@kernel.org>
> Co-developed-by: Deren Wu <deren.wu@mediatek.com>
> Signed-off-by: Deren Wu <deren.wu@mediatek.com>
> Signed-off-by: Sean Wang <sean.wang@mediatek.com>
> ---
>  drivers/net/wireless/mediatek/mt76/mt76.h     |  5 +-
>  .../net/wireless/mediatek/mt76/mt7615/sdio.c  |  5 +-
>  drivers/net/wireless/mediatek/mt76/sdio.c     | 23 ++++++-
>  drivers/net/wireless/mediatek/mt76/sdio.h     | 50 ++++++++++++++-
>  .../net/wireless/mediatek/mt76/sdio_txrx.c    | 62 ++++++++++++++++---
>  5 files changed, 128 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
> index e2f33956a122..06f0d1348d52 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt76.h
> @@ -505,6 +505,8 @@ struct mt76_sdio {
>  
>  	struct sdio_func *func;
>  	void *intr_data;
> +	int intr_size;
> +	u8 hw_ver;
>  
>  	struct {
>  		int pse_data_quota;
> @@ -1249,7 +1251,8 @@ int mt76s_alloc_queues(struct mt76_dev *dev);
>  void mt76s_deinit(struct mt76_dev *dev);
>  void mt76s_sdio_irq(struct sdio_func *func);
>  void mt76s_txrx_worker(struct mt76_sdio *sdio);
> -int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func);
> +int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func,
> +		  int hw_ver);
>  u32 mt76s_rr(struct mt76_dev *dev, u32 offset);
>  void mt76s_wr(struct mt76_dev *dev, u32 offset, u32 val);
>  u32 mt76s_rmw(struct mt76_dev *dev, u32 offset, u32 mask, u32 val);
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/sdio.c b/drivers/net/wireless/mediatek/mt76/mt7615/sdio.c
> index f47e25f6dedb..a6b5d536d962 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7615/sdio.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7615/sdio.c
> @@ -100,7 +100,7 @@ static int mt7663s_probe(struct sdio_func *func,
>  	if (ret < 0)
>  		goto error;
>  
> -	ret = mt76s_hw_init(mdev, func);
> +	ret = mt76s_hw_init(mdev, func, MT76_CONNAC_SDIO);
>  	if (ret)
>  		goto error;
>  
> @@ -108,8 +108,9 @@ static int mt7663s_probe(struct sdio_func *func,
>  		    (mt76_rr(dev, MT_HW_REV) & 0xff);
>  	dev_dbg(mdev->dev, "ASIC revision: %04x\n", mdev->rev);
>  
> +	mdev->sdio.intr_size = sizeof(struct mt76_connac_sdio_intr);
>  	mdev->sdio.intr_data = devm_kmalloc(mdev->dev,
> -					    sizeof(struct mt76s_intr),
> +					    mdev->sdio.intr_size,
>  					    GFP_KERNEL);
>  	if (!mdev->sdio.intr_data) {
>  		ret = -ENOMEM;
> diff --git a/drivers/net/wireless/mediatek/mt76/sdio.c b/drivers/net/wireless/mediatek/mt76/sdio.c
> index 82fb4c110b90..bb40cc3e9c2b 100644
> --- a/drivers/net/wireless/mediatek/mt76/sdio.c
> +++ b/drivers/net/wireless/mediatek/mt76/sdio.c
> @@ -221,11 +221,13 @@ int mt76s_rd_rp(struct mt76_dev *dev, u32 base,
>  }
>  EXPORT_SYMBOL_GPL(mt76s_rd_rp);
>  
> -int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func)
> +int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func, int hw_ver)
>  {
>  	u32 status, ctrl;
>  	int ret;
>  
> +	dev->sdio.hw_ver = hw_ver;
> +
>  	sdio_claim_host(func);
>  
>  	ret = sdio_enable_func(func);
> @@ -255,12 +257,27 @@ int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func)
>  		goto disable_func;
>  
>  	ctrl = WHIER_RX0_DONE_INT_EN | WHIER_TX_DONE_INT_EN;
> +	if (hw_ver == MT76_CONNAC2_SDIO)
> +		ctrl |= WHIER_RX1_DONE_INT_EN;
>  	sdio_writel(func, ctrl, MCR_WHIER, &ret);
>  	if (ret < 0)
>  		goto disable_func;
>  
> -	/* set WHISR as read clear and Rx aggregation number as 16 */
> -	ctrl = FIELD_PREP(MAX_HIF_RX_LEN_NUM, 16);
> +	switch (hw_ver) {
> +	case MT76_CONNAC_SDIO:
> +		/* set WHISR as read clear and Rx aggregation number as 16 */
> +		ctrl = FIELD_PREP(MAX_HIF_RX_LEN_NUM, 16);
> +		break;
> +	default:
> +		ctrl = sdio_readl(func, MCR_WHCR, &ret);
> +		if (ret < 0)
> +			goto disable_func;
> +		ctrl &= ~MAX_HIF_RX_LEN_NUM_CONNAC2;
> +		ctrl &= ~W_INT_CLR_CTRL; /* read clear */
> +		ctrl |= FIELD_PREP(MAX_HIF_RX_LEN_NUM_CONNAC2, 0);
> +		break;
> +	}
> +
>  	sdio_writel(func, ctrl, MCR_WHCR, &ret);
>  	if (ret < 0)
>  		goto disable_func;
> diff --git a/drivers/net/wireless/mediatek/mt76/sdio.h b/drivers/net/wireless/mediatek/mt76/sdio.h
> index 03877d89e152..7d2ec044dcb1 100644
> --- a/drivers/net/wireless/mediatek/mt76/sdio.h
> +++ b/drivers/net/wireless/mediatek/mt76/sdio.h
> @@ -21,7 +21,12 @@
>  #define MCR_WHCR			0x000C
>  #define W_INT_CLR_CTRL			BIT(1)
>  #define RECV_MAILBOX_RD_CLR_EN		BIT(2)
> +#define WF_SYS_RSTB			BIT(4) /* supported in CONNAC2 */
> +#define WF_WHOLE_PATH_RSTB		BIT(5) /* supported in CONNAC2 */
> +#define WF_SDIO_WF_PATH_RSTB		BIT(6) /* supported in CONNAC2 */
>  #define MAX_HIF_RX_LEN_NUM		GENMASK(13, 8)
> +#define MAX_HIF_RX_LEN_NUM_CONNAC2	GENMASK(14, 8) /* supported in CONNAC2 */
> +#define WF_RST_DONE			BIT(15) /* supported in CONNAC2 */
>  #define RX_ENHANCE_MODE			BIT(16)
>  
>  #define MCR_WHISR			0x0010
> @@ -29,6 +34,7 @@
>  #define WHIER_D2H_SW_INT		GENMASK(31, 8)
>  #define WHIER_FW_OWN_BACK_INT_EN	BIT(7)
>  #define WHIER_ABNORMAL_INT_EN		BIT(6)
> +#define WHIER_WDT_INT_EN		BIT(5) /* supported in CONNAC2 */
>  #define WHIER_RX1_DONE_INT_EN		BIT(2)
>  #define WHIER_RX0_DONE_INT_EN		BIT(1)
>  #define WHIER_TX_DONE_INT_EN		BIT(0)
> @@ -100,7 +106,37 @@
>  
>  #define MCR_SWPCDBGR			0x0154
>  
> -struct mt76s_intr {
> +#define MCR_H2DSM2R			0x0160 /* supported in CONNAC2 */
> +#define MCR_H2DSM3R			0x0164 /* supported in CONNAC2 */
> +#define MCR_D2HRM3R			0x0174 /* supported in CONNAC2 */
> +#define MCR_WTQCR8			0x0190 /* supported in CONNAC2 */
> +#define MCR_WTQCR9			0x0194 /* supported in CONNAC2 */
> +#define MCR_WTQCR10			0x0198 /* supported in CONNAC2 */
> +#define MCR_WTQCR11			0x019C /* supported in CONNAC2 */
> +#define MCR_WTQCR12			0x01A0 /* supported in CONNAC2 */
> +#define MCR_WTQCR13			0x01A4 /* supported in CONNAC2 */
> +#define MCR_WTQCR14			0x01A8 /* supported in CONNAC2 */
> +#define MCR_WTQCR15			0x01AC /* supported in CONNAC2 */
> +
> +enum mt76_connac_sdio_ver {
> +	MT76_CONNAC_SDIO,
> +	MT76_CONNAC2_SDIO,
> +};
> +
> +struct mt76_connac2_sdio_intr {
> +	u32 isr;
> +	struct {
> +		u32 wtqcr[16];
> +	} tx;
> +	struct {
> +		u16 num[2];
> +		u16 len0[16];
> +		u16 len1[128];
> +	} rx;
> +	u32 rec_mb[2];
> +} __packed;
> +
> +struct mt76_connac_sdio_intr {
>  	u32 isr;
>  	struct {
>  		u32 wtqcr[8];
> @@ -112,4 +148,16 @@ struct mt76s_intr {
>  	u32 rec_mb[2];
>  } __packed;
>  
> +struct mt76s_intr {
> +	u32 isr;
> +	struct {
> +		u32 *wtqcr;
> +	} tx;
> +	struct {
> +		u16 num[2];
> +		u16 *len[2];
> +	} rx;
> +	u32 rec_mb[2];
> +};
> +
>  #endif
> diff --git a/drivers/net/wireless/mediatek/mt76/sdio_txrx.c b/drivers/net/wireless/mediatek/mt76/sdio_txrx.c
> index ceb3dc0613d6..73289a9845d7 100644
> --- a/drivers/net/wireless/mediatek/mt76/sdio_txrx.c
> +++ b/drivers/net/wireless/mediatek/mt76/sdio_txrx.c
> @@ -81,7 +81,7 @@ static int
>  mt76s_rx_run_queue(struct mt76_dev *dev, enum mt76_rxq_id qid,
>  		   struct mt76s_intr *intr)
>  {
> -	struct mt76_queue *q = &dev->q_rx[qid];
> +	struct mt76_queue *q = &dev->q_rx[0];

why qid is always 0 here?

Regards,
Lorenzo

>  	struct mt76_sdio *sdio = &dev->sdio;
>  	int len = 0, err, i;
>  	struct page *page;
> @@ -112,8 +112,10 @@ mt76s_rx_run_queue(struct mt76_dev *dev, enum mt76_rxq_id qid,
>  	for (i = 0; i < intr->rx.num[qid]; i++) {
>  		int index = (q->head + i) % q->ndesc;
>  		struct mt76_queue_entry *e = &q->entry[index];
> +		__le32 *rxd = (__le32 *)buf;
>  
> -		len = intr->rx.len[qid][i];
> +		/* parse rxd to get the actual packet length */
> +		len = FIELD_GET(GENMASK(15, 0), le32_to_cpu(rxd[0]));
>  		e->skb = mt76s_build_rx_skb(buf, len, round_up(len + 4, 4));
>  		if (!e->skb)
>  			break;
> @@ -132,35 +134,72 @@ mt76s_rx_run_queue(struct mt76_dev *dev, enum mt76_rxq_id qid,
>  	return i;
>  }
>  
> +static void mt76s_intr_parse(struct mt76_dev *dev, void *data,
> +			     struct mt76s_intr *intr)
> +{
> +	struct mt76_connac_sdio_intr *intr_v1;
> +	struct mt76_connac2_sdio_intr *intr_v2;
> +	int i;
> +
> +	switch (dev->sdio.hw_ver) {
> +	case MT76_CONNAC_SDIO:
> +		intr_v1 = data;
> +		intr->isr =  intr_v1->isr;
> +		intr->tx.wtqcr = intr_v1->tx.wtqcr;
> +		for (i = 0; i < 2 ; i++) {
> +			intr->rx.num[i] = intr_v1->rx.num[i];
> +			intr->rx.len[i] = intr_v1->rx.len[i];
> +			intr->rec_mb[i] = intr_v1->rec_mb[i];
> +		}
> +		break;
> +	default:
> +		intr_v2 = data;
> +		intr->isr =  intr_v2->isr;
> +		intr->tx.wtqcr = intr_v2->tx.wtqcr;
> +		for (i = 0; i < 2 ; i++) {
> +			intr->rx.num[i] = intr_v2->rx.num[i];
> +			if (!i)
> +				intr->rx.len[0] = intr_v2->rx.len0;
> +			else
> +				intr->rx.len[1] = intr_v2->rx.len1;
> +			intr->rec_mb[i] = intr_v2->rec_mb[i];
> +		}
> +		break;
> +	}
> +}
> +
>  static int mt76s_rx_handler(struct mt76_dev *dev)
>  {
>  	struct mt76_sdio *sdio = &dev->sdio;
> -	struct mt76s_intr *intr = sdio->intr_data;
> +	void *data = sdio->intr_data;
> +	struct mt76s_intr intr;
>  	int nframes = 0, ret;
>  
> -	ret = sdio_readsb(sdio->func, intr, MCR_WHISR, sizeof(*intr));
> +	ret = sdio_readsb(sdio->func, data, MCR_WHISR, sdio->intr_size);
>  	if (ret < 0)
>  		return ret;
>  
> -	trace_dev_irq(dev, intr->isr, 0);
> +	mt76s_intr_parse(dev, data, &intr);
>  
> -	if (intr->isr & WHIER_RX0_DONE_INT_EN) {
> -		ret = mt76s_rx_run_queue(dev, 0, intr);
> +	trace_dev_irq(dev, intr.isr, 0);
> +
> +	if (intr.isr & WHIER_RX0_DONE_INT_EN) {
> +		ret = mt76s_rx_run_queue(dev, 0, &intr);
>  		if (ret > 0) {
>  			mt76_worker_schedule(&sdio->net_worker);
>  			nframes += ret;
>  		}
>  	}
>  
> -	if (intr->isr & WHIER_RX1_DONE_INT_EN) {
> -		ret = mt76s_rx_run_queue(dev, 1, intr);
> +	if (intr.isr & WHIER_RX1_DONE_INT_EN) {
> +		ret = mt76s_rx_run_queue(dev, 1, &intr);
>  		if (ret > 0) {
>  			mt76_worker_schedule(&sdio->net_worker);
>  			nframes += ret;
>  		}
>  	}
>  
> -	nframes += !!mt76s_refill_sched_quota(dev, intr->tx.wtqcr);
> +	nframes += !!mt76s_refill_sched_quota(dev, intr.tx.wtqcr);
>  
>  	return nframes;
>  }
> @@ -173,6 +212,9 @@ mt76s_tx_pick_quota(struct mt76_sdio *sdio, bool mcu, int buf_sz,
>  
>  	pse_sz = DIV_ROUND_UP(buf_sz + sdio->sched.deficit, MT_PSE_PAGE_SZ);
>  
> +	if (mcu && sdio->hw_ver == MT76_CONNAC2_SDIO)
> +		pse_sz = 1;
> +
>  	if (mcu) {
>  		if (sdio->sched.pse_mcu_quota < *pse_size + pse_sz)
>  			return -EBUSY;
> -- 
> 2.25.1
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: Lorenzo Bianconi <lorenzo@kernel.org>
To: sean.wang@mediatek.com
Cc: nbd@nbd.name, lorenzo.bianconi@redhat.com,
	Soul.Huang@mediatek.com, YN.Chen@mediatek.com,
	Leon.Yen@mediatek.com, Eric-SY.Chang@mediatek.com,
	Mark-YW.Chen@mediatek.com, Deren.Wu@mediatek.com,
	km.lin@mediatek.com, robin.chiu@mediatek.com,
	Eddie.Chen@mediatek.com, ch.yeh@mediatek.com,
	posh.sun@mediatek.com, ted.huang@mediatek.com,
	Eric.Liang@mediatek.com, Stella.Chang@mediatek.com,
	Tom.Chou@mediatek.com, steve.lee@mediatek.com, jsiuda@google.com,
	frankgor@google.com, jemele@google.com,
	abhishekpandit@google.com, shawnku@google.com,
	linux-wireless@vger.kernel.org,
	linux-mediatek@lists.infradead.org
Subject: Re: [PATCH v4 11/16] mt76: sdio: extend sdio module to support CONNAC2
Date: Wed, 13 Oct 2021 18:29:47 +0200	[thread overview]
Message-ID: <YWcJe27HQMS7B85j@lore-desk> (raw)
In-Reply-To: <654f1b4b4f5c5b566e8a64795a3c8ebcc19a7593.1634077769.git.objelf@gmail.com>


[-- Attachment #1.1: Type: text/plain, Size: 10895 bytes --]

> From: Sean Wang <sean.wang@mediatek.com>
> 
> Extend sdio module to support CONNAC2 hw that mt7921s rely on.
> 
> Tested-by: Deren Wu <deren.wu@mediatek.com>
> Acked-by: Lorenzo Bianconi <lorenzo@kernel.org>
> Co-developed-by: Deren Wu <deren.wu@mediatek.com>
> Signed-off-by: Deren Wu <deren.wu@mediatek.com>
> Signed-off-by: Sean Wang <sean.wang@mediatek.com>
> ---
>  drivers/net/wireless/mediatek/mt76/mt76.h     |  5 +-
>  .../net/wireless/mediatek/mt76/mt7615/sdio.c  |  5 +-
>  drivers/net/wireless/mediatek/mt76/sdio.c     | 23 ++++++-
>  drivers/net/wireless/mediatek/mt76/sdio.h     | 50 ++++++++++++++-
>  .../net/wireless/mediatek/mt76/sdio_txrx.c    | 62 ++++++++++++++++---
>  5 files changed, 128 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
> index e2f33956a122..06f0d1348d52 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt76.h
> @@ -505,6 +505,8 @@ struct mt76_sdio {
>  
>  	struct sdio_func *func;
>  	void *intr_data;
> +	int intr_size;
> +	u8 hw_ver;
>  
>  	struct {
>  		int pse_data_quota;
> @@ -1249,7 +1251,8 @@ int mt76s_alloc_queues(struct mt76_dev *dev);
>  void mt76s_deinit(struct mt76_dev *dev);
>  void mt76s_sdio_irq(struct sdio_func *func);
>  void mt76s_txrx_worker(struct mt76_sdio *sdio);
> -int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func);
> +int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func,
> +		  int hw_ver);
>  u32 mt76s_rr(struct mt76_dev *dev, u32 offset);
>  void mt76s_wr(struct mt76_dev *dev, u32 offset, u32 val);
>  u32 mt76s_rmw(struct mt76_dev *dev, u32 offset, u32 mask, u32 val);
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/sdio.c b/drivers/net/wireless/mediatek/mt76/mt7615/sdio.c
> index f47e25f6dedb..a6b5d536d962 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7615/sdio.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7615/sdio.c
> @@ -100,7 +100,7 @@ static int mt7663s_probe(struct sdio_func *func,
>  	if (ret < 0)
>  		goto error;
>  
> -	ret = mt76s_hw_init(mdev, func);
> +	ret = mt76s_hw_init(mdev, func, MT76_CONNAC_SDIO);
>  	if (ret)
>  		goto error;
>  
> @@ -108,8 +108,9 @@ static int mt7663s_probe(struct sdio_func *func,
>  		    (mt76_rr(dev, MT_HW_REV) & 0xff);
>  	dev_dbg(mdev->dev, "ASIC revision: %04x\n", mdev->rev);
>  
> +	mdev->sdio.intr_size = sizeof(struct mt76_connac_sdio_intr);
>  	mdev->sdio.intr_data = devm_kmalloc(mdev->dev,
> -					    sizeof(struct mt76s_intr),
> +					    mdev->sdio.intr_size,
>  					    GFP_KERNEL);
>  	if (!mdev->sdio.intr_data) {
>  		ret = -ENOMEM;
> diff --git a/drivers/net/wireless/mediatek/mt76/sdio.c b/drivers/net/wireless/mediatek/mt76/sdio.c
> index 82fb4c110b90..bb40cc3e9c2b 100644
> --- a/drivers/net/wireless/mediatek/mt76/sdio.c
> +++ b/drivers/net/wireless/mediatek/mt76/sdio.c
> @@ -221,11 +221,13 @@ int mt76s_rd_rp(struct mt76_dev *dev, u32 base,
>  }
>  EXPORT_SYMBOL_GPL(mt76s_rd_rp);
>  
> -int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func)
> +int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func, int hw_ver)
>  {
>  	u32 status, ctrl;
>  	int ret;
>  
> +	dev->sdio.hw_ver = hw_ver;
> +
>  	sdio_claim_host(func);
>  
>  	ret = sdio_enable_func(func);
> @@ -255,12 +257,27 @@ int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func)
>  		goto disable_func;
>  
>  	ctrl = WHIER_RX0_DONE_INT_EN | WHIER_TX_DONE_INT_EN;
> +	if (hw_ver == MT76_CONNAC2_SDIO)
> +		ctrl |= WHIER_RX1_DONE_INT_EN;
>  	sdio_writel(func, ctrl, MCR_WHIER, &ret);
>  	if (ret < 0)
>  		goto disable_func;
>  
> -	/* set WHISR as read clear and Rx aggregation number as 16 */
> -	ctrl = FIELD_PREP(MAX_HIF_RX_LEN_NUM, 16);
> +	switch (hw_ver) {
> +	case MT76_CONNAC_SDIO:
> +		/* set WHISR as read clear and Rx aggregation number as 16 */
> +		ctrl = FIELD_PREP(MAX_HIF_RX_LEN_NUM, 16);
> +		break;
> +	default:
> +		ctrl = sdio_readl(func, MCR_WHCR, &ret);
> +		if (ret < 0)
> +			goto disable_func;
> +		ctrl &= ~MAX_HIF_RX_LEN_NUM_CONNAC2;
> +		ctrl &= ~W_INT_CLR_CTRL; /* read clear */
> +		ctrl |= FIELD_PREP(MAX_HIF_RX_LEN_NUM_CONNAC2, 0);
> +		break;
> +	}
> +
>  	sdio_writel(func, ctrl, MCR_WHCR, &ret);
>  	if (ret < 0)
>  		goto disable_func;
> diff --git a/drivers/net/wireless/mediatek/mt76/sdio.h b/drivers/net/wireless/mediatek/mt76/sdio.h
> index 03877d89e152..7d2ec044dcb1 100644
> --- a/drivers/net/wireless/mediatek/mt76/sdio.h
> +++ b/drivers/net/wireless/mediatek/mt76/sdio.h
> @@ -21,7 +21,12 @@
>  #define MCR_WHCR			0x000C
>  #define W_INT_CLR_CTRL			BIT(1)
>  #define RECV_MAILBOX_RD_CLR_EN		BIT(2)
> +#define WF_SYS_RSTB			BIT(4) /* supported in CONNAC2 */
> +#define WF_WHOLE_PATH_RSTB		BIT(5) /* supported in CONNAC2 */
> +#define WF_SDIO_WF_PATH_RSTB		BIT(6) /* supported in CONNAC2 */
>  #define MAX_HIF_RX_LEN_NUM		GENMASK(13, 8)
> +#define MAX_HIF_RX_LEN_NUM_CONNAC2	GENMASK(14, 8) /* supported in CONNAC2 */
> +#define WF_RST_DONE			BIT(15) /* supported in CONNAC2 */
>  #define RX_ENHANCE_MODE			BIT(16)
>  
>  #define MCR_WHISR			0x0010
> @@ -29,6 +34,7 @@
>  #define WHIER_D2H_SW_INT		GENMASK(31, 8)
>  #define WHIER_FW_OWN_BACK_INT_EN	BIT(7)
>  #define WHIER_ABNORMAL_INT_EN		BIT(6)
> +#define WHIER_WDT_INT_EN		BIT(5) /* supported in CONNAC2 */
>  #define WHIER_RX1_DONE_INT_EN		BIT(2)
>  #define WHIER_RX0_DONE_INT_EN		BIT(1)
>  #define WHIER_TX_DONE_INT_EN		BIT(0)
> @@ -100,7 +106,37 @@
>  
>  #define MCR_SWPCDBGR			0x0154
>  
> -struct mt76s_intr {
> +#define MCR_H2DSM2R			0x0160 /* supported in CONNAC2 */
> +#define MCR_H2DSM3R			0x0164 /* supported in CONNAC2 */
> +#define MCR_D2HRM3R			0x0174 /* supported in CONNAC2 */
> +#define MCR_WTQCR8			0x0190 /* supported in CONNAC2 */
> +#define MCR_WTQCR9			0x0194 /* supported in CONNAC2 */
> +#define MCR_WTQCR10			0x0198 /* supported in CONNAC2 */
> +#define MCR_WTQCR11			0x019C /* supported in CONNAC2 */
> +#define MCR_WTQCR12			0x01A0 /* supported in CONNAC2 */
> +#define MCR_WTQCR13			0x01A4 /* supported in CONNAC2 */
> +#define MCR_WTQCR14			0x01A8 /* supported in CONNAC2 */
> +#define MCR_WTQCR15			0x01AC /* supported in CONNAC2 */
> +
> +enum mt76_connac_sdio_ver {
> +	MT76_CONNAC_SDIO,
> +	MT76_CONNAC2_SDIO,
> +};
> +
> +struct mt76_connac2_sdio_intr {
> +	u32 isr;
> +	struct {
> +		u32 wtqcr[16];
> +	} tx;
> +	struct {
> +		u16 num[2];
> +		u16 len0[16];
> +		u16 len1[128];
> +	} rx;
> +	u32 rec_mb[2];
> +} __packed;
> +
> +struct mt76_connac_sdio_intr {
>  	u32 isr;
>  	struct {
>  		u32 wtqcr[8];
> @@ -112,4 +148,16 @@ struct mt76s_intr {
>  	u32 rec_mb[2];
>  } __packed;
>  
> +struct mt76s_intr {
> +	u32 isr;
> +	struct {
> +		u32 *wtqcr;
> +	} tx;
> +	struct {
> +		u16 num[2];
> +		u16 *len[2];
> +	} rx;
> +	u32 rec_mb[2];
> +};
> +
>  #endif
> diff --git a/drivers/net/wireless/mediatek/mt76/sdio_txrx.c b/drivers/net/wireless/mediatek/mt76/sdio_txrx.c
> index ceb3dc0613d6..73289a9845d7 100644
> --- a/drivers/net/wireless/mediatek/mt76/sdio_txrx.c
> +++ b/drivers/net/wireless/mediatek/mt76/sdio_txrx.c
> @@ -81,7 +81,7 @@ static int
>  mt76s_rx_run_queue(struct mt76_dev *dev, enum mt76_rxq_id qid,
>  		   struct mt76s_intr *intr)
>  {
> -	struct mt76_queue *q = &dev->q_rx[qid];
> +	struct mt76_queue *q = &dev->q_rx[0];

why qid is always 0 here?

Regards,
Lorenzo

>  	struct mt76_sdio *sdio = &dev->sdio;
>  	int len = 0, err, i;
>  	struct page *page;
> @@ -112,8 +112,10 @@ mt76s_rx_run_queue(struct mt76_dev *dev, enum mt76_rxq_id qid,
>  	for (i = 0; i < intr->rx.num[qid]; i++) {
>  		int index = (q->head + i) % q->ndesc;
>  		struct mt76_queue_entry *e = &q->entry[index];
> +		__le32 *rxd = (__le32 *)buf;
>  
> -		len = intr->rx.len[qid][i];
> +		/* parse rxd to get the actual packet length */
> +		len = FIELD_GET(GENMASK(15, 0), le32_to_cpu(rxd[0]));
>  		e->skb = mt76s_build_rx_skb(buf, len, round_up(len + 4, 4));
>  		if (!e->skb)
>  			break;
> @@ -132,35 +134,72 @@ mt76s_rx_run_queue(struct mt76_dev *dev, enum mt76_rxq_id qid,
>  	return i;
>  }
>  
> +static void mt76s_intr_parse(struct mt76_dev *dev, void *data,
> +			     struct mt76s_intr *intr)
> +{
> +	struct mt76_connac_sdio_intr *intr_v1;
> +	struct mt76_connac2_sdio_intr *intr_v2;
> +	int i;
> +
> +	switch (dev->sdio.hw_ver) {
> +	case MT76_CONNAC_SDIO:
> +		intr_v1 = data;
> +		intr->isr =  intr_v1->isr;
> +		intr->tx.wtqcr = intr_v1->tx.wtqcr;
> +		for (i = 0; i < 2 ; i++) {
> +			intr->rx.num[i] = intr_v1->rx.num[i];
> +			intr->rx.len[i] = intr_v1->rx.len[i];
> +			intr->rec_mb[i] = intr_v1->rec_mb[i];
> +		}
> +		break;
> +	default:
> +		intr_v2 = data;
> +		intr->isr =  intr_v2->isr;
> +		intr->tx.wtqcr = intr_v2->tx.wtqcr;
> +		for (i = 0; i < 2 ; i++) {
> +			intr->rx.num[i] = intr_v2->rx.num[i];
> +			if (!i)
> +				intr->rx.len[0] = intr_v2->rx.len0;
> +			else
> +				intr->rx.len[1] = intr_v2->rx.len1;
> +			intr->rec_mb[i] = intr_v2->rec_mb[i];
> +		}
> +		break;
> +	}
> +}
> +
>  static int mt76s_rx_handler(struct mt76_dev *dev)
>  {
>  	struct mt76_sdio *sdio = &dev->sdio;
> -	struct mt76s_intr *intr = sdio->intr_data;
> +	void *data = sdio->intr_data;
> +	struct mt76s_intr intr;
>  	int nframes = 0, ret;
>  
> -	ret = sdio_readsb(sdio->func, intr, MCR_WHISR, sizeof(*intr));
> +	ret = sdio_readsb(sdio->func, data, MCR_WHISR, sdio->intr_size);
>  	if (ret < 0)
>  		return ret;
>  
> -	trace_dev_irq(dev, intr->isr, 0);
> +	mt76s_intr_parse(dev, data, &intr);
>  
> -	if (intr->isr & WHIER_RX0_DONE_INT_EN) {
> -		ret = mt76s_rx_run_queue(dev, 0, intr);
> +	trace_dev_irq(dev, intr.isr, 0);
> +
> +	if (intr.isr & WHIER_RX0_DONE_INT_EN) {
> +		ret = mt76s_rx_run_queue(dev, 0, &intr);
>  		if (ret > 0) {
>  			mt76_worker_schedule(&sdio->net_worker);
>  			nframes += ret;
>  		}
>  	}
>  
> -	if (intr->isr & WHIER_RX1_DONE_INT_EN) {
> -		ret = mt76s_rx_run_queue(dev, 1, intr);
> +	if (intr.isr & WHIER_RX1_DONE_INT_EN) {
> +		ret = mt76s_rx_run_queue(dev, 1, &intr);
>  		if (ret > 0) {
>  			mt76_worker_schedule(&sdio->net_worker);
>  			nframes += ret;
>  		}
>  	}
>  
> -	nframes += !!mt76s_refill_sched_quota(dev, intr->tx.wtqcr);
> +	nframes += !!mt76s_refill_sched_quota(dev, intr.tx.wtqcr);
>  
>  	return nframes;
>  }
> @@ -173,6 +212,9 @@ mt76s_tx_pick_quota(struct mt76_sdio *sdio, bool mcu, int buf_sz,
>  
>  	pse_sz = DIV_ROUND_UP(buf_sz + sdio->sched.deficit, MT_PSE_PAGE_SZ);
>  
> +	if (mcu && sdio->hw_ver == MT76_CONNAC2_SDIO)
> +		pse_sz = 1;
> +
>  	if (mcu) {
>  		if (sdio->sched.pse_mcu_quota < *pse_size + pse_sz)
>  			return -EBUSY;
> -- 
> 2.25.1
> 

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

[-- Attachment #2: Type: text/plain, Size: 170 bytes --]

_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

  reply	other threads:[~2021-10-13 16:29 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-12 22:51 [PATCH v4 00/16] Add MT7921 SDIO WiFi support sean.wang
2021-10-12 22:51 ` sean.wang
2021-10-12 22:51 ` [PATCH v4 01/16] mt76: mt7921: refactor mac.c to be bus independent sean.wang
2021-10-12 22:51   ` sean.wang
2021-10-12 22:51 ` [PATCH v4 02/16] mt76: mt7921: refactor dma.c to be pcie specific sean.wang
2021-10-12 22:51   ` sean.wang
2021-10-12 22:51 ` [PATCH v4 03/16] mt76: mt7921: refactor mcu.c to be bus independent sean.wang
2021-10-12 22:51   ` sean.wang
2021-10-12 22:51 ` [PATCH v4 04/16] mt76: mt7921: refactor init.c " sean.wang
2021-10-12 22:51   ` sean.wang
2021-10-12 22:51 ` [PATCH v4 05/16] mt76: mt7921: add MT7921_COMMON module sean.wang
2021-10-12 22:51   ` sean.wang
2021-10-12 22:51 ` [PATCH v4 06/16] mt76: connac: move mcu reg access utility routines in mt76_connac_lib module sean.wang
2021-10-12 22:51   ` sean.wang
2021-10-12 22:52 ` [PATCH v4 07/16] mt76: mt7663s: rely on mcu reg access utility sean.wang
2021-10-12 22:52   ` sean.wang
2021-10-12 22:52 ` [PATCH v4 08/16] mt76: mt7921: make all event parser reusable between mt7921s and mt7921e sean.wang
2021-10-12 22:52   ` sean.wang
2021-10-12 22:52 ` [PATCH v4 09/16] mt76: mt7921: use physical addr to unify register access sean.wang
2021-10-12 22:52   ` sean.wang
2021-10-12 22:52 ` [PATCH v4 10/16] mt76: sdio: move common code in mt76_sdio module sean.wang
2021-10-12 22:52   ` sean.wang
2021-10-12 22:52 ` [PATCH v4 11/16] mt76: sdio: extend sdio module to support CONNAC2 sean.wang
2021-10-12 22:52   ` sean.wang
2021-10-13 16:29   ` Lorenzo Bianconi [this message]
2021-10-13 16:29     ` Lorenzo Bianconi
2021-10-12 22:52 ` [PATCH v4 12/16] mt76: connac: extend mcu_get_nic_capability sean.wang
2021-10-12 22:52   ` sean.wang
2021-10-12 22:52 ` [PATCH v4 13/16] mt76: mt7921: rely on mcu_get_nic_capability sean.wang
2021-10-12 22:52   ` sean.wang
2021-10-12 22:52 ` [PATCH v4 14/16] mt76: mt7921: refactor mt7921_mcu_send_message sean.wang
2021-10-12 22:52   ` sean.wang
2021-10-12 22:52 ` [PATCH v4 15/16] mt76: mt7921: introduce mt7921s support sean.wang
2021-10-12 22:52   ` sean.wang
2021-10-12 22:52 ` [PATCH v4 16/16] mt76: mt7921s: add reset support sean.wang
2021-10-12 22:52   ` sean.wang
     [not found] <YWcJe27HQMS7B85j@lore-desk--annotate>
2021-10-13 17:56 ` [PATCH v4 11/16] mt76: sdio: extend sdio module to support CONNAC2 sean.wang
2021-10-13 17:56   ` sean.wang
2021-10-13 19:06   ` Lorenzo Bianconi
2021-10-13 19:06     ` Lorenzo Bianconi
     [not found] <YWcuGcFPGCtaPh+2@lore-desk--annotate>
2021-10-13 21:22 ` sean.wang
2021-10-13 21:22   ` sean.wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YWcJe27HQMS7B85j@lore-desk \
    --to=lorenzo@kernel.org \
    --cc=Deren.Wu@mediatek.com \
    --cc=Eddie.Chen@mediatek.com \
    --cc=Eric-SY.Chang@mediatek.com \
    --cc=Eric.Liang@mediatek.com \
    --cc=Leon.Yen@mediatek.com \
    --cc=Mark-YW.Chen@mediatek.com \
    --cc=Soul.Huang@mediatek.com \
    --cc=Stella.Chang@mediatek.com \
    --cc=Tom.Chou@mediatek.com \
    --cc=YN.Chen@mediatek.com \
    --cc=abhishekpandit@google.com \
    --cc=ch.yeh@mediatek.com \
    --cc=frankgor@google.com \
    --cc=jemele@google.com \
    --cc=jsiuda@google.com \
    --cc=km.lin@mediatek.com \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=lorenzo.bianconi@redhat.com \
    --cc=nbd@nbd.name \
    --cc=posh.sun@mediatek.com \
    --cc=robin.chiu@mediatek.com \
    --cc=sean.wang@mediatek.com \
    --cc=shawnku@google.com \
    --cc=steve.lee@mediatek.com \
    --cc=ted.huang@mediatek.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.