--- a/drivers/net/ethernet/mediatek/mtk_wed.c +++ b/drivers/net/ethernet/mediatek/mtk_wed.c @@ -670,7 +670,7 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev) void *buf; int s; - page = __dev_alloc_page(GFP_KERNEL); + page = __dev_alloc_page(GFP_KERNEL | GFP_DMA32); if (!page) return -ENOMEM; @@ -793,7 +793,7 @@ mtk_wed_hwrro_buffer_alloc(struct mtk_wed_device *dev) struct page *page; int s; - page = __dev_alloc_page(GFP_KERNEL); + page = __dev_alloc_page(GFP_KERNEL | GFP_DMA32); if (!page) return -ENOMEM; @@ -2436,6 +2436,10 @@ mtk_wed_attach(struct mtk_wed_device *dev) dev->version = hw->version; dev->hw->pcie_base = mtk_wed_get_pcie_base(dev); + ret = dma_set_mask_and_coherent(hw->dev, DMA_BIT_MASK(32)); + if (ret) + return ret; + if (hw->eth->dma_dev == hw->eth->dev && of_dma_is_coherent(hw->eth->dev->of_node)) mtk_eth_set_dma_device(hw->eth, hw->dev); --- a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c +++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c @@ -400,10 +400,15 @@ mtk_wed_mcu_load_firmware(struct mtk_wed_wo *wo) fw_name = wo->hw->index ? MT7986_FIRMWARE_WO1 : MT7986_FIRMWARE_WO0; break; - case 3: - fw_name = wo->hw->index ? MT7988_FIRMWARE_WO1 - : MT7988_FIRMWARE_WO0; + case 3:{ + if(wo->hw->index == 0) + fw_name = MT7988_FIRMWARE_WO0; + if(wo->hw->index == 1) + fw_name = MT7988_FIRMWARE_WO1; + if(wo->hw->index == 2) + fw_name = MT7988_FIRMWARE_WO2; break; + } default: return -EINVAL; } --- a/drivers/net/ethernet/mediatek/mtk_wed_wo.h +++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.h @@ -93,6 +93,7 @@ enum mtk_wed_dummy_cr_idx { #define MT7986_FIRMWARE_WO1 "mediatek/mt7986_wo_1.bin" #define MT7988_FIRMWARE_WO0 "mediatek/mt7988_wo_0.bin" #define MT7988_FIRMWARE_WO1 "mediatek/mt7988_wo_1.bin" +#define MT7988_FIRMWARE_WO2 "mediatek/mt7988_wo_2.bin" #define MTK_WO_MCU_CFG_LS_BASE 0 #define MTK_WO_MCU_CFG_LS_HW_VER_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x000)