123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- From: Lorenzo Bianconi <[email protected]>
- Date: Mon, 18 Sep 2023 12:29:06 +0200
- Subject: [PATCH] net: ethernet: mtk_wed: do not configure rx offload if not
- supported
- Check if rx offload is supported running mtk_wed_get_rx_capa routine
- before configuring it. This is a preliminary patch to introduce Wireless
- Ethernet Dispatcher (WED) support for MT7988 SoC.
- Co-developed-by: Sujuan Chen <[email protected]>
- Signed-off-by: Sujuan Chen <[email protected]>
- Signed-off-by: Lorenzo Bianconi <[email protected]>
- Signed-off-by: Paolo Abeni <[email protected]>
- ---
- --- a/drivers/net/ethernet/mediatek/mtk_wed.c
- +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
- @@ -606,7 +606,7 @@ mtk_wed_stop(struct mtk_wed_device *dev)
- wdma_w32(dev, MTK_WDMA_INT_MASK, 0);
- wdma_w32(dev, MTK_WDMA_INT_GRP2, 0);
-
- - if (mtk_wed_is_v1(dev->hw))
- + if (!mtk_wed_get_rx_capa(dev))
- return;
-
- wed_w32(dev, MTK_WED_EXT_INT_MASK1, 0);
- @@ -732,16 +732,21 @@ mtk_wed_set_wpdma(struct mtk_wed_device
- {
- if (mtk_wed_is_v1(dev->hw)) {
- wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_phys);
- - } else {
- - mtk_wed_bus_init(dev);
- -
- - wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_int);
- - wed_w32(dev, MTK_WED_WPDMA_CFG_INT_MASK, dev->wlan.wpdma_mask);
- - wed_w32(dev, MTK_WED_WPDMA_CFG_TX, dev->wlan.wpdma_tx);
- - wed_w32(dev, MTK_WED_WPDMA_CFG_TX_FREE, dev->wlan.wpdma_txfree);
- - wed_w32(dev, MTK_WED_WPDMA_RX_GLO_CFG, dev->wlan.wpdma_rx_glo);
- - wed_w32(dev, MTK_WED_WPDMA_RX_RING, dev->wlan.wpdma_rx);
- + return;
- }
- +
- + mtk_wed_bus_init(dev);
- +
- + wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_int);
- + wed_w32(dev, MTK_WED_WPDMA_CFG_INT_MASK, dev->wlan.wpdma_mask);
- + wed_w32(dev, MTK_WED_WPDMA_CFG_TX, dev->wlan.wpdma_tx);
- + wed_w32(dev, MTK_WED_WPDMA_CFG_TX_FREE, dev->wlan.wpdma_txfree);
- +
- + if (!mtk_wed_get_rx_capa(dev))
- + return;
- +
- + wed_w32(dev, MTK_WED_WPDMA_RX_GLO_CFG, dev->wlan.wpdma_rx_glo);
- + wed_w32(dev, MTK_WED_WPDMA_RX_RING, dev->wlan.wpdma_rx);
- }
-
- static void
- @@ -973,15 +978,17 @@ mtk_wed_hw_init(struct mtk_wed_device *d
- MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
- } else {
- wed_clr(dev, MTK_WED_TX_TKID_CTRL, MTK_WED_TX_TKID_CTRL_PAUSE);
- - /* rx hw init */
- - wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX,
- - MTK_WED_WPDMA_RX_D_RST_CRX_IDX |
- - MTK_WED_WPDMA_RX_D_RST_DRV_IDX);
- - wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX, 0);
- -
- - mtk_wed_rx_buffer_hw_init(dev);
- - mtk_wed_rro_hw_init(dev);
- - mtk_wed_route_qm_hw_init(dev);
- + if (mtk_wed_get_rx_capa(dev)) {
- + /* rx hw init */
- + wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX,
- + MTK_WED_WPDMA_RX_D_RST_CRX_IDX |
- + MTK_WED_WPDMA_RX_D_RST_DRV_IDX);
- + wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX, 0);
- +
- + mtk_wed_rx_buffer_hw_init(dev);
- + mtk_wed_rro_hw_init(dev);
- + mtk_wed_route_qm_hw_init(dev);
- + }
- }
-
- wed_clr(dev, MTK_WED_TX_BM_CTRL, MTK_WED_TX_BM_CTRL_PAUSE);
- @@ -1353,8 +1360,6 @@ mtk_wed_configure_irq(struct mtk_wed_dev
-
- wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask);
- } else {
- - wdma_mask |= FIELD_PREP(MTK_WDMA_INT_MASK_TX_DONE,
- - GENMASK(1, 0));
- /* initail tx interrupt trigger */
- wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_TX,
- MTK_WED_WPDMA_INT_CTRL_TX0_DONE_EN |
- @@ -1373,15 +1378,20 @@ mtk_wed_configure_irq(struct mtk_wed_dev
- FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_TRIG,
- dev->wlan.txfree_tbit));
-
- - wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_RX,
- - MTK_WED_WPDMA_INT_CTRL_RX0_EN |
- - MTK_WED_WPDMA_INT_CTRL_RX0_CLR |
- - MTK_WED_WPDMA_INT_CTRL_RX1_EN |
- - MTK_WED_WPDMA_INT_CTRL_RX1_CLR |
- - FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RX0_DONE_TRIG,
- - dev->wlan.rx_tbit[0]) |
- - FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RX1_DONE_TRIG,
- - dev->wlan.rx_tbit[1]));
- + if (mtk_wed_get_rx_capa(dev)) {
- + wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_RX,
- + MTK_WED_WPDMA_INT_CTRL_RX0_EN |
- + MTK_WED_WPDMA_INT_CTRL_RX0_CLR |
- + MTK_WED_WPDMA_INT_CTRL_RX1_EN |
- + MTK_WED_WPDMA_INT_CTRL_RX1_CLR |
- + FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RX0_DONE_TRIG,
- + dev->wlan.rx_tbit[0]) |
- + FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RX1_DONE_TRIG,
- + dev->wlan.rx_tbit[1]));
- +
- + wdma_mask |= FIELD_PREP(MTK_WDMA_INT_MASK_TX_DONE,
- + GENMASK(1, 0));
- + }
-
- wed_w32(dev, MTK_WED_WDMA_INT_CLR, wdma_mask);
- wed_set(dev, MTK_WED_WDMA_INT_CTRL,
- @@ -1400,6 +1410,8 @@ mtk_wed_configure_irq(struct mtk_wed_dev
- static void
- mtk_wed_dma_enable(struct mtk_wed_device *dev)
- {
- + int i;
- +
- wed_set(dev, MTK_WED_WPDMA_INT_CTRL, MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV);
-
- wed_set(dev, MTK_WED_GLO_CFG,
- @@ -1419,33 +1431,33 @@ mtk_wed_dma_enable(struct mtk_wed_device
- if (mtk_wed_is_v1(dev->hw)) {
- wdma_set(dev, MTK_WDMA_GLO_CFG,
- MTK_WDMA_GLO_CFG_RX_INFO3_PRERES);
- - } else {
- - int i;
- + return;
- + }
-
- - wed_set(dev, MTK_WED_WPDMA_CTRL,
- - MTK_WED_WPDMA_CTRL_SDL1_FIXED);
- + wed_set(dev, MTK_WED_WPDMA_CTRL,
- + MTK_WED_WPDMA_CTRL_SDL1_FIXED);
- + wed_set(dev, MTK_WED_WPDMA_GLO_CFG,
- + MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_PKT_PROC |
- + MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_CRX_SYNC);
- + wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
- + MTK_WED_WPDMA_GLO_CFG_TX_TKID_KEEP |
- + MTK_WED_WPDMA_GLO_CFG_TX_DMAD_DW3_PREV);
-
- - wed_set(dev, MTK_WED_WDMA_GLO_CFG,
- - MTK_WED_WDMA_GLO_CFG_TX_DRV_EN |
- - MTK_WED_WDMA_GLO_CFG_TX_DDONE_CHK);
- + if (!mtk_wed_get_rx_capa(dev))
- + return;
-
- - wed_set(dev, MTK_WED_WPDMA_GLO_CFG,
- - MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_PKT_PROC |
- - MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_CRX_SYNC);
- -
- - wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
- - MTK_WED_WPDMA_GLO_CFG_TX_TKID_KEEP |
- - MTK_WED_WPDMA_GLO_CFG_TX_DMAD_DW3_PREV);
- + wed_set(dev, MTK_WED_WDMA_GLO_CFG,
- + MTK_WED_WDMA_GLO_CFG_TX_DRV_EN |
- + MTK_WED_WDMA_GLO_CFG_TX_DDONE_CHK);
-
- - wed_set(dev, MTK_WED_WPDMA_RX_D_GLO_CFG,
- - MTK_WED_WPDMA_RX_D_RX_DRV_EN |
- - FIELD_PREP(MTK_WED_WPDMA_RX_D_RXD_READ_LEN, 0x18) |
- - FIELD_PREP(MTK_WED_WPDMA_RX_D_INIT_PHASE_RXEN_SEL,
- - 0x2));
- + wed_set(dev, MTK_WED_WPDMA_RX_D_GLO_CFG,
- + MTK_WED_WPDMA_RX_D_RX_DRV_EN |
- + FIELD_PREP(MTK_WED_WPDMA_RX_D_RXD_READ_LEN, 0x18) |
- + FIELD_PREP(MTK_WED_WPDMA_RX_D_INIT_PHASE_RXEN_SEL,
- + 0x2));
-
- - for (i = 0; i < MTK_WED_RX_QUEUES; i++)
- - mtk_wed_check_wfdma_rx_fill(dev, i);
- - }
- + for (i = 0; i < MTK_WED_RX_QUEUES; i++)
- + mtk_wed_check_wfdma_rx_fill(dev, i);
- }
-
- static void
- @@ -1472,7 +1484,7 @@ mtk_wed_start(struct mtk_wed_device *dev
-
- val |= BIT(0) | (BIT(1) * !!dev->hw->index);
- regmap_write(dev->hw->mirror, dev->hw->index * 4, val);
- - } else {
- + } else if (mtk_wed_get_rx_capa(dev)) {
- /* driver set mid ready and only once */
- wed_w32(dev, MTK_WED_EXT_INT_MASK1,
- MTK_WED_EXT_INT_STATUS_WPDMA_MID_RDY);
- @@ -1484,7 +1496,6 @@ mtk_wed_start(struct mtk_wed_device *dev
-
- if (mtk_wed_rro_cfg(dev))
- return;
- -
- }
-
- mtk_wed_set_512_support(dev, dev->wlan.wcid_512);
- @@ -1550,13 +1561,14 @@ mtk_wed_attach(struct mtk_wed_device *de
- }
-
- mtk_wed_hw_init_early(dev);
- - if (mtk_wed_is_v1(hw)) {
- + if (mtk_wed_is_v1(hw))
- regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP,
- BIT(hw->index), 0);
- - } else {
- + else
- dev->rev_id = wed_r32(dev, MTK_WED_REV_ID);
- +
- + if (mtk_wed_get_rx_capa(dev))
- ret = mtk_wed_wo_init(hw);
- - }
- out:
- if (ret) {
- dev_err(dev->hw->dev, "failed to attach wed device\n");
- --- a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
- +++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
- @@ -207,7 +207,7 @@ int mtk_wed_mcu_msg_update(struct mtk_we
- {
- struct mtk_wed_wo *wo = dev->hw->wed_wo;
-
- - if (mtk_wed_is_v1(dev->hw))
- + if (!mtk_wed_get_rx_capa(dev))
- return 0;
-
- if (WARN_ON(!wo))
|