xref: /linux/drivers/net/ethernet/mucse/rnpgbe/rnpgbe_chip.c (revision 24f171c7e145f43b9f187578e89b0982ce87e54c)
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