[PATCH v3 net-next 3/8] net: ethernet: mtk_wed: introduce wed mcu support
Lorenzo Bianconi
lorenzo at kernel.org
Thu Nov 3 10:57:11 PDT 2022
> Il 03/11/22 10:28, Lorenzo Bianconi ha scritto:
> > From: Sujuan Chen <sujuan.chen at mediatek.com>
> >
> > Introduce WED mcu support used to configure WED WO chip.
> > This is a preliminary patch in order to add RX Wireless
> > Ethernet Dispatch available on MT7986 SoC.
> >
> > Tested-by: Daniel Golle <daniel at makrotopia.org>
> > Co-developed-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > Signed-off-by: Sujuan Chen <sujuan.chen at mediatek.com>
> > ---
> > drivers/net/ethernet/mediatek/Makefile | 2 +-
> > drivers/net/ethernet/mediatek/mtk_wed_mcu.c | 364 +++++++++++++++++++
> > drivers/net/ethernet/mediatek/mtk_wed_regs.h | 1 +
> > drivers/net/ethernet/mediatek/mtk_wed_wo.h | 152 ++++++++
> > include/linux/soc/mediatek/mtk_wed.h | 29 ++
> > 5 files changed, 547 insertions(+), 1 deletion(-)
> > create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_mcu.c
> > create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_wo.h
> >
> > diff --git a/drivers/net/ethernet/mediatek/Makefile b/drivers/net/ethernet/mediatek/Makefile
> > index 45ba0970504a..d4bdefa77159 100644
> > --- a/drivers/net/ethernet/mediatek/Makefile
> > +++ b/drivers/net/ethernet/mediatek/Makefile
> > @@ -5,7 +5,7 @@
> > obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o
> > mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o mtk_ppe_offload.o
> > -mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed.o
> > +mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed.o mtk_wed_mcu.o
> > ifdef CONFIG_DEBUG_FS
> > mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_debugfs.o
> > endif
> > diff --git a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
> > new file mode 100644
> > index 000000000000..20987eecfb52
> > --- /dev/null
> > +++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
>
> ..snip..
>
> > +
> > +int mtk_wed_mcu_init(struct mtk_wed_wo *wo)
> > +{
> > + u32 val;
> > + int ret;
> > +
> > + skb_queue_head_init(&wo->mcu.res_q);
> > + init_waitqueue_head(&wo->mcu.wait);
> > + mutex_init(&wo->mcu.mutex);
> > +
> > + ret = mtk_wed_mcu_load_firmware(wo);
> > + if (ret)
> > + return ret;
> > +
> > + do {
> > + /* get dummy cr */
> > + val = wed_r32(wo->hw->wed_dev,
> > + MTK_WED_SCR0 + 4 * MTK_WED_DUMMY_CR_FWDL);
> > + } while (val && !time_after(jiffies, jiffies + MTK_FW_DL_TIMEOUT));
>
> Here you can use readx_poll_timeout() instead: please do so.
ack, I will fix it in v4
>
> > +
> > + return val ? -EBUSY : 0;
> > +}
> > +
> > +MODULE_FIRMWARE(MT7986_FIRMWARE_WO0);
> > +MODULE_FIRMWARE(MT7986_FIRMWARE_WO1);
> > diff --git a/drivers/net/ethernet/mediatek/mtk_wed_regs.h b/drivers/net/ethernet/mediatek/mtk_wed_regs.h
> > index e270fb336143..c940b3bb215b 100644
> > --- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h
> > +++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h
> > @@ -152,6 +152,7 @@ struct mtk_wdma_desc {
> > #define MTK_WED_RING_RX(_n) (0x400 + (_n) * 0x10)
> > +#define MTK_WED_SCR0 0x3c0
> > #define MTK_WED_WPDMA_INT_TRIGGER 0x504
> > #define MTK_WED_WPDMA_INT_TRIGGER_RX_DONE BIT(1)
> > #define MTK_WED_WPDMA_INT_TRIGGER_TX_DONE GENMASK(5, 4)
> > diff --git a/drivers/net/ethernet/mediatek/mtk_wed_wo.h b/drivers/net/ethernet/mediatek/mtk_wed_wo.h
> > new file mode 100644
> > index 000000000000..2ef3ccdec5bf
> > --- /dev/null
> > +++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.h
> > @@ -0,0 +1,152 @@
>
>
> ..snip..
>
> > +
> > +#define MTK_WO_MCU_CFG_LS_BASE 0 /* XXX: 0x15194000 */
>
> Since that definition is zero, you can safely remove it: like so, the ones
> following will be a bit more readable.
(removing the XXX) this is a pattern already used in the driver and in mt76. I
would prefer to keep it as it is.
>
> > +#define MTK_WO_MCU_CFG_LS_HW_VER_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x000)
> > +#define MTK_WO_MCU_CFG_LS_FW_VER_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x004)
> > +#define MTK_WO_MCU_CFG_LS_CFG_DBG1_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x00c)
> > +#define MTK_WO_MCU_CFG_LS_CFG_DBG2_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x010)
> > +#define MTK_WO_MCU_CFG_LS_WF_MCCR_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x014)
> > +#define MTK_WO_MCU_CFG_LS_WF_MCCR_SET_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x018)
> > +#define MTK_WO_MCU_CFG_LS_WF_MCCR_CLR_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x01c)
> > +#define MTK_WO_MCU_CFG_LS_WF_MCU_CFG_WM_WA_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x050)
> > +#define MTK_WO_MCU_CFG_LS_WM_BOOT_ADDR_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x060)
> > +#define MTK_WO_MCU_CFG_LS_WA_BOOT_ADDR_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x064)
>
> ..snip..
>
> > +
> > +static inline int
> > +mtk_wed_mcu_check_msg(struct mtk_wed_wo *wo, struct sk_buff *skb)
> > +{
> > + struct mtk_wed_mcu_hdr *hdr = (struct mtk_wed_mcu_hdr *)skb->data;
> > +
> > + if (hdr->version)
>
> if (hdr->version || skb->len < sizeof(*hdr) || skb->len != le16_to_cpu(hdr->length))
> return -EINVAL;
This is just a matter of test, I would prefer as it is.
>
>
> > + return -EINVAL;
> > +
> > + if (skb->len < sizeof(*hdr))
> > + return -EINVAL;
> > +
> > + if (skb->len != le16_to_cpu(hdr->length))
> > + return -EINVAL;
> > +
> > + return 0;
> > +}
> > +
>
> Regards,
> Angelo
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20221103/8d72b72a/attachment-0001.sig>
More information about the Linux-mediatek
mailing list