14543534cSDong Yibo // SPDX-License-Identifier: GPL-2.0 24543534cSDong Yibo /* Copyright(c) 2020 - 2025 Mucse Corporation. */ 34543534cSDong Yibo 4*2ee95ec1SDong Yibo #include <linux/pci.h> 54543534cSDong Yibo #include <linux/errno.h> 6*2ee95ec1SDong Yibo #include <linux/etherdevice.h> 74543534cSDong Yibo 84543534cSDong Yibo #include "rnpgbe.h" 94543534cSDong Yibo #include "rnpgbe_hw.h" 104543534cSDong Yibo #include "rnpgbe_mbx.h" 11*2ee95ec1SDong Yibo #include "rnpgbe_mbx_fw.h" 12*2ee95ec1SDong Yibo 13*2ee95ec1SDong Yibo /** 14*2ee95ec1SDong Yibo * rnpgbe_get_permanent_mac - Get permanent mac 15*2ee95ec1SDong Yibo * @hw: hw information structure 16*2ee95ec1SDong Yibo * @perm_addr: pointer to store perm_addr 17*2ee95ec1SDong Yibo * 18*2ee95ec1SDong Yibo * rnpgbe_get_permanent_mac tries to get mac from hw 19*2ee95ec1SDong Yibo * 20*2ee95ec1SDong Yibo * Return: 0 on success, negative errno on failure 21*2ee95ec1SDong Yibo **/ 22*2ee95ec1SDong Yibo int rnpgbe_get_permanent_mac(struct mucse_hw *hw, u8 *perm_addr) 23*2ee95ec1SDong Yibo { 24*2ee95ec1SDong Yibo struct device *dev = &hw->pdev->dev; 25*2ee95ec1SDong Yibo int err; 26*2ee95ec1SDong Yibo 27*2ee95ec1SDong Yibo err = mucse_mbx_get_macaddr(hw, hw->pfvfnum, perm_addr, hw->port); 28*2ee95ec1SDong Yibo if (err) { 29*2ee95ec1SDong Yibo dev_err(dev, "Failed to get MAC from FW %d\n", err); 30*2ee95ec1SDong Yibo return err; 31*2ee95ec1SDong Yibo } 32*2ee95ec1SDong Yibo 33*2ee95ec1SDong Yibo if (!is_valid_ether_addr(perm_addr)) { 34*2ee95ec1SDong Yibo dev_err(dev, "Failed to get valid MAC from FW\n"); 35*2ee95ec1SDong Yibo return -EINVAL; 36*2ee95ec1SDong Yibo } 37*2ee95ec1SDong Yibo 38*2ee95ec1SDong Yibo return 0; 39*2ee95ec1SDong Yibo } 40*2ee95ec1SDong Yibo 41*2ee95ec1SDong Yibo /** 42*2ee95ec1SDong Yibo * rnpgbe_reset_hw - Do a hardware reset 43*2ee95ec1SDong Yibo * @hw: hw information structure 44*2ee95ec1SDong Yibo * 45*2ee95ec1SDong Yibo * rnpgbe_reset_hw calls fw to do a hardware 46*2ee95ec1SDong Yibo * reset, and cleans some regs to default. 47*2ee95ec1SDong Yibo * 48*2ee95ec1SDong Yibo * Return: 0 on success, negative errno on failure 49*2ee95ec1SDong Yibo **/ 50*2ee95ec1SDong Yibo int rnpgbe_reset_hw(struct mucse_hw *hw) 51*2ee95ec1SDong Yibo { 52*2ee95ec1SDong Yibo mucse_hw_wr32(hw, RNPGBE_DMA_AXI_EN, 0); 53*2ee95ec1SDong Yibo return mucse_mbx_reset_hw(hw); 54*2ee95ec1SDong Yibo } 55*2ee95ec1SDong Yibo 56*2ee95ec1SDong Yibo /** 57*2ee95ec1SDong Yibo * rnpgbe_send_notify - Echo fw status 58*2ee95ec1SDong Yibo * @hw: hw information structure 59*2ee95ec1SDong Yibo * @enable: true or false status 60*2ee95ec1SDong Yibo * @mode: status mode 61*2ee95ec1SDong Yibo * 62*2ee95ec1SDong Yibo * Return: 0 on success, negative errno on failure 63*2ee95ec1SDong Yibo **/ 64*2ee95ec1SDong Yibo int rnpgbe_send_notify(struct mucse_hw *hw, 65*2ee95ec1SDong Yibo bool enable, 66*2ee95ec1SDong Yibo int mode) 67*2ee95ec1SDong Yibo { 68*2ee95ec1SDong Yibo int err; 69*2ee95ec1SDong Yibo /* Keep switch struct to support more modes in the future */ 70*2ee95ec1SDong Yibo switch (mode) { 71*2ee95ec1SDong Yibo case mucse_fw_powerup: 72*2ee95ec1SDong Yibo err = mucse_mbx_powerup(hw, enable); 73*2ee95ec1SDong Yibo break; 74*2ee95ec1SDong Yibo default: 75*2ee95ec1SDong Yibo err = -EINVAL; 76*2ee95ec1SDong Yibo } 77*2ee95ec1SDong Yibo 78*2ee95ec1SDong Yibo return err; 79*2ee95ec1SDong Yibo } 804543534cSDong Yibo 814543534cSDong Yibo /** 824543534cSDong Yibo * rnpgbe_init_n500 - Setup n500 hw info 834543534cSDong Yibo * @hw: hw information structure 844543534cSDong Yibo * 854543534cSDong Yibo * rnpgbe_init_n500 initializes all private 864543534cSDong Yibo * structure for n500 874543534cSDong Yibo **/ 884543534cSDong Yibo static void rnpgbe_init_n500(struct mucse_hw *hw) 894543534cSDong Yibo { 904543534cSDong Yibo struct mucse_mbx_info *mbx = &hw->mbx; 914543534cSDong Yibo 924543534cSDong Yibo mbx->fwpf_ctrl_base = MUCSE_N500_FWPF_CTRL_BASE; 934543534cSDong Yibo mbx->fwpf_shm_base = MUCSE_N500_FWPF_SHM_BASE; 944543534cSDong Yibo } 954543534cSDong Yibo 964543534cSDong Yibo /** 974543534cSDong Yibo * rnpgbe_init_n210 - Setup n210 hw info 984543534cSDong Yibo * @hw: hw information structure 994543534cSDong Yibo * 1004543534cSDong Yibo * rnpgbe_init_n210 initializes all private 1014543534cSDong Yibo * structure for n210 1024543534cSDong Yibo **/ 1034543534cSDong Yibo static void rnpgbe_init_n210(struct mucse_hw *hw) 1044543534cSDong Yibo { 1054543534cSDong Yibo struct mucse_mbx_info *mbx = &hw->mbx; 1064543534cSDong Yibo 1074543534cSDong Yibo mbx->fwpf_ctrl_base = MUCSE_N210_FWPF_CTRL_BASE; 1084543534cSDong Yibo mbx->fwpf_shm_base = MUCSE_N210_FWPF_SHM_BASE; 1094543534cSDong Yibo } 1104543534cSDong Yibo 1114543534cSDong Yibo /** 1124543534cSDong Yibo * rnpgbe_init_hw - Setup hw info according to board_type 1134543534cSDong Yibo * @hw: hw information structure 1144543534cSDong Yibo * @board_type: board type 1154543534cSDong Yibo * 1164543534cSDong Yibo * rnpgbe_init_hw initializes all hw data 1174543534cSDong Yibo * 1184543534cSDong Yibo * Return: 0 on success, -EINVAL on failure 1194543534cSDong Yibo **/ 1204543534cSDong Yibo int rnpgbe_init_hw(struct mucse_hw *hw, int board_type) 1214543534cSDong Yibo { 1224543534cSDong Yibo struct mucse_mbx_info *mbx = &hw->mbx; 1234543534cSDong Yibo 124*2ee95ec1SDong Yibo hw->port = 0; 125*2ee95ec1SDong Yibo 1264543534cSDong Yibo mbx->pf2fw_mbx_ctrl = MUCSE_GBE_PFFW_MBX_CTRL_OFFSET; 1274543534cSDong Yibo mbx->fwpf_mbx_mask = MUCSE_GBE_FWPF_MBX_MASK_OFFSET; 1284543534cSDong Yibo 1294543534cSDong Yibo switch (board_type) { 1304543534cSDong Yibo case board_n500: 1314543534cSDong Yibo rnpgbe_init_n500(hw); 1324543534cSDong Yibo break; 1334543534cSDong Yibo case board_n210: 1344543534cSDong Yibo rnpgbe_init_n210(hw); 1354543534cSDong Yibo break; 1364543534cSDong Yibo default: 1374543534cSDong Yibo return -EINVAL; 1384543534cSDong Yibo } 1394543534cSDong Yibo /* init_params with mbx base */ 1404543534cSDong Yibo mucse_init_mbx_params_pf(hw); 1414543534cSDong Yibo 1424543534cSDong Yibo return 0; 1434543534cSDong Yibo } 144