xref: /linux/drivers/net/ethernet/mucse/rnpgbe/rnpgbe_chip.c (revision 24f171c7e145f43b9f187578e89b0982ce87e54c)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2020 - 2025 Mucse Corporation. */
3 
4 #include <linux/pci.h>
5 #include <linux/errno.h>
6 #include <linux/etherdevice.h>
7 
8 #include "rnpgbe.h"
9 #include "rnpgbe_hw.h"
10 #include "rnpgbe_mbx.h"
11 #include "rnpgbe_mbx_fw.h"
12 
13 /**
14  * rnpgbe_get_permanent_mac - Get permanent mac
15  * @hw: hw information structure
16  * @perm_addr: pointer to store perm_addr
17  *
18  * rnpgbe_get_permanent_mac tries to get mac from hw
19  *
20  * Return: 0 on success, negative errno on failure
21  **/
22 int rnpgbe_get_permanent_mac(struct mucse_hw *hw, u8 *perm_addr)
23 {
24 	struct device *dev = &hw->pdev->dev;
25 	int err;
26 
27 	err = mucse_mbx_get_macaddr(hw, hw->pfvfnum, perm_addr, hw->port);
28 	if (err) {
29 		dev_err(dev, "Failed to get MAC from FW %d\n", err);
30 		return err;
31 	}
32 
33 	if (!is_valid_ether_addr(perm_addr)) {
34 		dev_err(dev, "Failed to get valid MAC from FW\n");
35 		return -EINVAL;
36 	}
37 
38 	return 0;
39 }
40 
41 /**
42  * rnpgbe_reset_hw - Do a hardware reset
43  * @hw: hw information structure
44  *
45  * rnpgbe_reset_hw calls fw to do a hardware
46  * reset, and cleans some regs to default.
47  *
48  * Return: 0 on success, negative errno on failure
49  **/
50 int rnpgbe_reset_hw(struct mucse_hw *hw)
51 {
52 	mucse_hw_wr32(hw, RNPGBE_DMA_AXI_EN, 0);
53 	return mucse_mbx_reset_hw(hw);
54 }
55 
56 /**
57  * rnpgbe_send_notify - Echo fw status
58  * @hw: hw information structure
59  * @enable: true or false status
60  * @mode: status mode
61  *
62  * Return: 0 on success, negative errno on failure
63  **/
64 int rnpgbe_send_notify(struct mucse_hw *hw,
65 		       bool enable,
66 		       int mode)
67 {
68 	int err;
69 	/* Keep switch struct to support more modes in the future */
70 	switch (mode) {
71 	case mucse_fw_powerup:
72 		err = mucse_mbx_powerup(hw, enable);
73 		break;
74 	default:
75 		err = -EINVAL;
76 	}
77 
78 	return err;
79 }
80 
81 /**
82  * rnpgbe_init_n500 - Setup n500 hw info
83  * @hw: hw information structure
84  *
85  * rnpgbe_init_n500 initializes all private
86  * structure for n500
87  **/
88 static void rnpgbe_init_n500(struct mucse_hw *hw)
89 {
90 	struct mucse_mbx_info *mbx = &hw->mbx;
91 
92 	mbx->fwpf_ctrl_base = MUCSE_N500_FWPF_CTRL_BASE;
93 	mbx->fwpf_shm_base = MUCSE_N500_FWPF_SHM_BASE;
94 }
95 
96 /**
97  * rnpgbe_init_n210 - Setup n210 hw info
98  * @hw: hw information structure
99  *
100  * rnpgbe_init_n210 initializes all private
101  * structure for n210
102  **/
103 static void rnpgbe_init_n210(struct mucse_hw *hw)
104 {
105 	struct mucse_mbx_info *mbx = &hw->mbx;
106 
107 	mbx->fwpf_ctrl_base = MUCSE_N210_FWPF_CTRL_BASE;
108 	mbx->fwpf_shm_base = MUCSE_N210_FWPF_SHM_BASE;
109 }
110 
111 /**
112  * rnpgbe_init_hw - Setup hw info according to board_type
113  * @hw: hw information structure
114  * @board_type: board type
115  *
116  * rnpgbe_init_hw initializes all hw data
117  *
118  * Return: 0 on success, -EINVAL on failure
119  **/
120 int rnpgbe_init_hw(struct mucse_hw *hw, int board_type)
121 {
122 	struct mucse_mbx_info *mbx = &hw->mbx;
123 
124 	hw->port = 0;
125 
126 	mbx->pf2fw_mbx_ctrl = MUCSE_GBE_PFFW_MBX_CTRL_OFFSET;
127 	mbx->fwpf_mbx_mask = MUCSE_GBE_FWPF_MBX_MASK_OFFSET;
128 
129 	switch (board_type) {
130 	case board_n500:
131 		rnpgbe_init_n500(hw);
132 		break;
133 	case board_n210:
134 		rnpgbe_init_n210(hw);
135 		break;
136 	default:
137 		return -EINVAL;
138 	}
139 	/* init_params with mbx base */
140 	mucse_init_mbx_params_pf(hw);
141 
142 	return 0;
143 }
144