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
next prev parent 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: linkBe 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.