Message ID | 26fa16f2f212bff5edfdbe8a4f41dba7a132b0be.1670072570.git.lorenzo@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [net-next] net: ethernet: mtk_wed: add reset to rx_ring_setup callback | expand |
On Sat, Dec 03, 2022 at 02:06:30PM +0100, Lorenzo Bianconi wrote: > Introduce reset parameter to mtk_wed_rx_ring_setup signature. > This is a preliminary patch to add Wireless Ethernet Dispatcher reset > support. So please submit it as part the relevant series. Thanks > > Co-developed-by: Sujuan Chen <sujuan.chen@mediatek.com> > Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com> > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> > --- > drivers/net/ethernet/mediatek/mtk_wed.c | 20 +++++++++++++------- > drivers/net/wireless/mediatek/mt76/dma.c | 2 +- > include/linux/soc/mediatek/mtk_wed.h | 8 ++++---- > 3 files changed, 18 insertions(+), 12 deletions(-) > > diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c > index 6352abd4157e..b1ec3f353b66 100644 > --- a/drivers/net/ethernet/mediatek/mtk_wed.c > +++ b/drivers/net/ethernet/mediatek/mtk_wed.c > @@ -1216,7 +1216,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size, > } > > static int > -mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) > +mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size, > + bool reset) > { > u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version; > struct mtk_wed_ring *wdma; > @@ -1225,8 +1226,8 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) > return -EINVAL; > > wdma = &dev->tx_wdma[idx]; > - if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, desc_size, > - true)) > + if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, > + desc_size, true)) > return -ENOMEM; > > wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE, > @@ -1236,6 +1237,9 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) > wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0); > wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_DMA_IDX, 0); > > + if (reset) > + mtk_wed_ring_reset(wdma, MTK_WED_WDMA_RING_SIZE, true); > + > if (!idx) { > wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_BASE, > wdma->desc_phys); > @@ -1577,18 +1581,20 @@ mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs) > } > > static int > -mtk_wed_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs) > +mtk_wed_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs, > + bool reset) > { > struct mtk_wed_ring *ring = &dev->rx_ring[idx]; > > if (WARN_ON(idx >= ARRAY_SIZE(dev->rx_ring))) > return -EINVAL; > > - if (mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE, > - sizeof(*ring->desc), false)) > + if (!reset && mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE, > + sizeof(*ring->desc), false)) > return -ENOMEM; > > - if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) > + if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE, > + reset)) > return -ENOMEM; > > ring->reg_base = MTK_WED_RING_RX_DATA(idx); > diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c > index 3f8c0845fcca..f795548562f5 100644 > --- a/drivers/net/wireless/mediatek/mt76/dma.c > +++ b/drivers/net/wireless/mediatek/mt76/dma.c > @@ -648,7 +648,7 @@ mt76_dma_wed_setup(struct mt76_dev *dev, struct mt76_queue *q) > q->wed_regs = wed->txfree_ring.reg_base; > break; > case MT76_WED_Q_RX: > - ret = mtk_wed_device_rx_ring_setup(wed, ring, q->regs); > + ret = mtk_wed_device_rx_ring_setup(wed, ring, q->regs, false); > if (!ret) > q->wed_regs = wed->rx_ring[ring].reg_base; > break; > diff --git a/include/linux/soc/mediatek/mtk_wed.h b/include/linux/soc/mediatek/mtk_wed.h > index beb190449704..a0746d4aec20 100644 > --- a/include/linux/soc/mediatek/mtk_wed.h > +++ b/include/linux/soc/mediatek/mtk_wed.h > @@ -160,7 +160,7 @@ struct mtk_wed_ops { > int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring, > void __iomem *regs, bool reset); > int (*rx_ring_setup)(struct mtk_wed_device *dev, int ring, > - void __iomem *regs); > + void __iomem *regs, bool reset); > int (*txfree_ring_setup)(struct mtk_wed_device *dev, > void __iomem *regs); > int (*msg_update)(struct mtk_wed_device *dev, int cmd_id, > @@ -228,8 +228,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev) > (_dev)->ops->irq_get(_dev, _mask) > #define mtk_wed_device_irq_set_mask(_dev, _mask) \ > (_dev)->ops->irq_set_mask(_dev, _mask) > -#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) \ > - (_dev)->ops->rx_ring_setup(_dev, _ring, _regs) > +#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) \ > + (_dev)->ops->rx_ring_setup(_dev, _ring, _regs, _reset) > #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) \ > (_dev)->ops->ppe_check(_dev, _skb, _reason, _hash) > #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) \ > @@ -249,7 +249,7 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev) > #define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0) > #define mtk_wed_device_irq_get(_dev, _mask) 0 > #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0) > -#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) -ENODEV > +#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) -ENODEV > #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) do {} while (0) > #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) -ENODEV > #define mtk_wed_device_stop(_dev) do {} while (0) > -- > 2.38.1 >
> On Sat, Dec 03, 2022 at 02:06:30PM +0100, Lorenzo Bianconi wrote: > > Introduce reset parameter to mtk_wed_rx_ring_setup signature. > > This is a preliminary patch to add Wireless Ethernet Dispatcher reset > > support. > > So please submit it as part the relevant series. I have not included this patch in my previous reset series since mt76 bit were missing (merged now in net-next). I posted this now as standalone patch to be aligned with mtk_wed_tx_ring_setup counterpart that is already merged into net-next. @Dave,Eric,Jakub,Paolo: I am fine both ways, what do you prefer? Regards, Lorenzo > > Thanks > > > > > Co-developed-by: Sujuan Chen <sujuan.chen@mediatek.com> > > Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com> > > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> > > --- > > drivers/net/ethernet/mediatek/mtk_wed.c | 20 +++++++++++++------- > > drivers/net/wireless/mediatek/mt76/dma.c | 2 +- > > include/linux/soc/mediatek/mtk_wed.h | 8 ++++---- > > 3 files changed, 18 insertions(+), 12 deletions(-) > > > > diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c > > index 6352abd4157e..b1ec3f353b66 100644 > > --- a/drivers/net/ethernet/mediatek/mtk_wed.c > > +++ b/drivers/net/ethernet/mediatek/mtk_wed.c > > @@ -1216,7 +1216,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size, > > } > > > > static int > > -mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) > > +mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size, > > + bool reset) > > { > > u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version; > > struct mtk_wed_ring *wdma; > > @@ -1225,8 +1226,8 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) > > return -EINVAL; > > > > wdma = &dev->tx_wdma[idx]; > > - if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, desc_size, > > - true)) > > + if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, > > + desc_size, true)) > > return -ENOMEM; > > > > wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE, > > @@ -1236,6 +1237,9 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) > > wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0); > > wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_DMA_IDX, 0); > > > > + if (reset) > > + mtk_wed_ring_reset(wdma, MTK_WED_WDMA_RING_SIZE, true); > > + > > if (!idx) { > > wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_BASE, > > wdma->desc_phys); > > @@ -1577,18 +1581,20 @@ mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs) > > } > > > > static int > > -mtk_wed_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs) > > +mtk_wed_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs, > > + bool reset) > > { > > struct mtk_wed_ring *ring = &dev->rx_ring[idx]; > > > > if (WARN_ON(idx >= ARRAY_SIZE(dev->rx_ring))) > > return -EINVAL; > > > > - if (mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE, > > - sizeof(*ring->desc), false)) > > + if (!reset && mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE, > > + sizeof(*ring->desc), false)) > > return -ENOMEM; > > > > - if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) > > + if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE, > > + reset)) > > return -ENOMEM; > > > > ring->reg_base = MTK_WED_RING_RX_DATA(idx); > > diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c > > index 3f8c0845fcca..f795548562f5 100644 > > --- a/drivers/net/wireless/mediatek/mt76/dma.c > > +++ b/drivers/net/wireless/mediatek/mt76/dma.c > > @@ -648,7 +648,7 @@ mt76_dma_wed_setup(struct mt76_dev *dev, struct mt76_queue *q) > > q->wed_regs = wed->txfree_ring.reg_base; > > break; > > case MT76_WED_Q_RX: > > - ret = mtk_wed_device_rx_ring_setup(wed, ring, q->regs); > > + ret = mtk_wed_device_rx_ring_setup(wed, ring, q->regs, false); > > if (!ret) > > q->wed_regs = wed->rx_ring[ring].reg_base; > > break; > > diff --git a/include/linux/soc/mediatek/mtk_wed.h b/include/linux/soc/mediatek/mtk_wed.h > > index beb190449704..a0746d4aec20 100644 > > --- a/include/linux/soc/mediatek/mtk_wed.h > > +++ b/include/linux/soc/mediatek/mtk_wed.h > > @@ -160,7 +160,7 @@ struct mtk_wed_ops { > > int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring, > > void __iomem *regs, bool reset); > > int (*rx_ring_setup)(struct mtk_wed_device *dev, int ring, > > - void __iomem *regs); > > + void __iomem *regs, bool reset); > > int (*txfree_ring_setup)(struct mtk_wed_device *dev, > > void __iomem *regs); > > int (*msg_update)(struct mtk_wed_device *dev, int cmd_id, > > @@ -228,8 +228,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev) > > (_dev)->ops->irq_get(_dev, _mask) > > #define mtk_wed_device_irq_set_mask(_dev, _mask) \ > > (_dev)->ops->irq_set_mask(_dev, _mask) > > -#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) \ > > - (_dev)->ops->rx_ring_setup(_dev, _ring, _regs) > > +#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) \ > > + (_dev)->ops->rx_ring_setup(_dev, _ring, _regs, _reset) > > #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) \ > > (_dev)->ops->ppe_check(_dev, _skb, _reason, _hash) > > #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) \ > > @@ -249,7 +249,7 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev) > > #define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0) > > #define mtk_wed_device_irq_get(_dev, _mask) 0 > > #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0) > > -#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) -ENODEV > > +#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) -ENODEV > > #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) do {} while (0) > > #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) -ENODEV > > #define mtk_wed_device_stop(_dev) do {} while (0) > > -- > > 2.38.1 > >
On Mon, Dec 05, 2022 at 09:53:41AM +0100, Lorenzo Bianconi wrote: > > On Sat, Dec 03, 2022 at 02:06:30PM +0100, Lorenzo Bianconi wrote: > > > Introduce reset parameter to mtk_wed_rx_ring_setup signature. > > > This is a preliminary patch to add Wireless Ethernet Dispatcher reset > > > support. > > > > So please submit it as part the relevant series. > > I have not included this patch in my previous reset series since mt76 bit > were missing (merged now in net-next). I posted this now as standalone patch > to be aligned with mtk_wed_tx_ring_setup counterpart that is already merged > into net-next. > > @Dave,Eric,Jakub,Paolo: I am fine both ways, what do you prefer? Just update commit message from being "preliminary patch" to be "update, align, e.t.c" with pointer to the series which needs it. Thanks > > Regards, > Lorenzo > > > > > Thanks > > > > > > > > Co-developed-by: Sujuan Chen <sujuan.chen@mediatek.com> > > > Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com> > > > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> > > > --- > > > drivers/net/ethernet/mediatek/mtk_wed.c | 20 +++++++++++++------- > > > drivers/net/wireless/mediatek/mt76/dma.c | 2 +- > > > include/linux/soc/mediatek/mtk_wed.h | 8 ++++---- > > > 3 files changed, 18 insertions(+), 12 deletions(-) > > > > > > diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c > > > index 6352abd4157e..b1ec3f353b66 100644 > > > --- a/drivers/net/ethernet/mediatek/mtk_wed.c > > > +++ b/drivers/net/ethernet/mediatek/mtk_wed.c > > > @@ -1216,7 +1216,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size, > > > } > > > > > > static int > > > -mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) > > > +mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size, > > > + bool reset) > > > { > > > u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version; > > > struct mtk_wed_ring *wdma; > > > @@ -1225,8 +1226,8 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) > > > return -EINVAL; > > > > > > wdma = &dev->tx_wdma[idx]; > > > - if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, desc_size, > > > - true)) > > > + if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, > > > + desc_size, true)) > > > return -ENOMEM; > > > > > > wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE, > > > @@ -1236,6 +1237,9 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) > > > wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0); > > > wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_DMA_IDX, 0); > > > > > > + if (reset) > > > + mtk_wed_ring_reset(wdma, MTK_WED_WDMA_RING_SIZE, true); > > > + > > > if (!idx) { > > > wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_BASE, > > > wdma->desc_phys); > > > @@ -1577,18 +1581,20 @@ mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs) > > > } > > > > > > static int > > > -mtk_wed_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs) > > > +mtk_wed_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs, > > > + bool reset) > > > { > > > struct mtk_wed_ring *ring = &dev->rx_ring[idx]; > > > > > > if (WARN_ON(idx >= ARRAY_SIZE(dev->rx_ring))) > > > return -EINVAL; > > > > > > - if (mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE, > > > - sizeof(*ring->desc), false)) > > > + if (!reset && mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE, > > > + sizeof(*ring->desc), false)) > > > return -ENOMEM; > > > > > > - if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) > > > + if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE, > > > + reset)) > > > return -ENOMEM; > > > > > > ring->reg_base = MTK_WED_RING_RX_DATA(idx); > > > diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c > > > index 3f8c0845fcca..f795548562f5 100644 > > > --- a/drivers/net/wireless/mediatek/mt76/dma.c > > > +++ b/drivers/net/wireless/mediatek/mt76/dma.c > > > @@ -648,7 +648,7 @@ mt76_dma_wed_setup(struct mt76_dev *dev, struct mt76_queue *q) > > > q->wed_regs = wed->txfree_ring.reg_base; > > > break; > > > case MT76_WED_Q_RX: > > > - ret = mtk_wed_device_rx_ring_setup(wed, ring, q->regs); > > > + ret = mtk_wed_device_rx_ring_setup(wed, ring, q->regs, false); > > > if (!ret) > > > q->wed_regs = wed->rx_ring[ring].reg_base; > > > break; > > > diff --git a/include/linux/soc/mediatek/mtk_wed.h b/include/linux/soc/mediatek/mtk_wed.h > > > index beb190449704..a0746d4aec20 100644 > > > --- a/include/linux/soc/mediatek/mtk_wed.h > > > +++ b/include/linux/soc/mediatek/mtk_wed.h > > > @@ -160,7 +160,7 @@ struct mtk_wed_ops { > > > int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring, > > > void __iomem *regs, bool reset); > > > int (*rx_ring_setup)(struct mtk_wed_device *dev, int ring, > > > - void __iomem *regs); > > > + void __iomem *regs, bool reset); > > > int (*txfree_ring_setup)(struct mtk_wed_device *dev, > > > void __iomem *regs); > > > int (*msg_update)(struct mtk_wed_device *dev, int cmd_id, > > > @@ -228,8 +228,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev) > > > (_dev)->ops->irq_get(_dev, _mask) > > > #define mtk_wed_device_irq_set_mask(_dev, _mask) \ > > > (_dev)->ops->irq_set_mask(_dev, _mask) > > > -#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) \ > > > - (_dev)->ops->rx_ring_setup(_dev, _ring, _regs) > > > +#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) \ > > > + (_dev)->ops->rx_ring_setup(_dev, _ring, _regs, _reset) > > > #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) \ > > > (_dev)->ops->ppe_check(_dev, _skb, _reason, _hash) > > > #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) \ > > > @@ -249,7 +249,7 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev) > > > #define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0) > > > #define mtk_wed_device_irq_get(_dev, _mask) 0 > > > #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0) > > > -#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) -ENODEV > > > +#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) -ENODEV > > > #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) do {} while (0) > > > #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) -ENODEV > > > #define mtk_wed_device_stop(_dev) do {} while (0) > > > -- > > > 2.38.1 > > >
diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c index 6352abd4157e..b1ec3f353b66 100644 --- a/drivers/net/ethernet/mediatek/mtk_wed.c +++ b/drivers/net/ethernet/mediatek/mtk_wed.c @@ -1216,7 +1216,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size, } static int -mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) +mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size, + bool reset) { u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version; struct mtk_wed_ring *wdma; @@ -1225,8 +1226,8 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) return -EINVAL; wdma = &dev->tx_wdma[idx]; - if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, desc_size, - true)) + if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, + desc_size, true)) return -ENOMEM; wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE, @@ -1236,6 +1237,9 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0); wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_DMA_IDX, 0); + if (reset) + mtk_wed_ring_reset(wdma, MTK_WED_WDMA_RING_SIZE, true); + if (!idx) { wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_BASE, wdma->desc_phys); @@ -1577,18 +1581,20 @@ mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs) } static int -mtk_wed_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs) +mtk_wed_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs, + bool reset) { struct mtk_wed_ring *ring = &dev->rx_ring[idx]; if (WARN_ON(idx >= ARRAY_SIZE(dev->rx_ring))) return -EINVAL; - if (mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE, - sizeof(*ring->desc), false)) + if (!reset && mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE, + sizeof(*ring->desc), false)) return -ENOMEM; - if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) + if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE, + reset)) return -ENOMEM; ring->reg_base = MTK_WED_RING_RX_DATA(idx); diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c index 3f8c0845fcca..f795548562f5 100644 --- a/drivers/net/wireless/mediatek/mt76/dma.c +++ b/drivers/net/wireless/mediatek/mt76/dma.c @@ -648,7 +648,7 @@ mt76_dma_wed_setup(struct mt76_dev *dev, struct mt76_queue *q) q->wed_regs = wed->txfree_ring.reg_base; break; case MT76_WED_Q_RX: - ret = mtk_wed_device_rx_ring_setup(wed, ring, q->regs); + ret = mtk_wed_device_rx_ring_setup(wed, ring, q->regs, false); if (!ret) q->wed_regs = wed->rx_ring[ring].reg_base; break; diff --git a/include/linux/soc/mediatek/mtk_wed.h b/include/linux/soc/mediatek/mtk_wed.h index beb190449704..a0746d4aec20 100644 --- a/include/linux/soc/mediatek/mtk_wed.h +++ b/include/linux/soc/mediatek/mtk_wed.h @@ -160,7 +160,7 @@ struct mtk_wed_ops { int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring, void __iomem *regs, bool reset); int (*rx_ring_setup)(struct mtk_wed_device *dev, int ring, - void __iomem *regs); + void __iomem *regs, bool reset); int (*txfree_ring_setup)(struct mtk_wed_device *dev, void __iomem *regs); int (*msg_update)(struct mtk_wed_device *dev, int cmd_id, @@ -228,8 +228,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev) (_dev)->ops->irq_get(_dev, _mask) #define mtk_wed_device_irq_set_mask(_dev, _mask) \ (_dev)->ops->irq_set_mask(_dev, _mask) -#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) \ - (_dev)->ops->rx_ring_setup(_dev, _ring, _regs) +#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) \ + (_dev)->ops->rx_ring_setup(_dev, _ring, _regs, _reset) #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) \ (_dev)->ops->ppe_check(_dev, _skb, _reason, _hash) #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) \ @@ -249,7 +249,7 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev) #define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0) #define mtk_wed_device_irq_get(_dev, _mask) 0 #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0) -#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) -ENODEV +#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) -ENODEV #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) do {} while (0) #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) -ENODEV #define mtk_wed_device_stop(_dev) do {} while (0)