xref: /freebsd/sys/contrib/alpine-hal/eth/al_hal_eth_main.c (revision 2e3507c25e42292b45a5482e116d278f5515d04d)
1 /*-
2 *******************************************************************************
3 Copyright (C) 2015 Annapurna Labs Ltd.
4 
5 This file may be licensed under the terms of the Annapurna Labs Commercial
6 License Agreement.
7 
8 Alternatively, this file can be distributed under the terms of the GNU General
9 Public License V2 as published by the Free Software Foundation and can be
10 found at http://www.gnu.org/licenses/gpl-2.0.html
11 
12 Alternatively, redistribution and use in source and binary forms, with or
13 without modification, are permitted provided that the following conditions are
14 met:
15 
16     *     Redistributions of source code must retain the above copyright notice,
17 this list of conditions and the following disclaimer.
18 
19     *     Redistributions in binary form must reproduce the above copyright
20 notice, this list of conditions and the following disclaimer in
21 the documentation and/or other materials provided with the
22 distribution.
23 
24 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
25 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
28 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
31 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 
35 *******************************************************************************/
36 
37 /**
38  *  @{
39  * @file   al_hal_eth_main.c
40  *
41  * @brief  XG Ethernet unit HAL driver for main functions (initialization, data path)
42  *
43  */
44 
45 #include "al_hal_eth.h"
46 #include "al_hal_udma_iofic.h"
47 #include "al_hal_udma_config.h"
48 #include "al_hal_eth_ec_regs.h"
49 #include "al_hal_eth_mac_regs.h"
50 #include "al_hal_unit_adapter_regs.h"
51 #ifdef AL_ETH_EX
52 #include "al_hal_eth_ex_internal.h"
53 #endif
54 
55 /* Number of xfi_txclk cycles that accumulate into 100ns */
56 #define ETH_MAC_KR_10_PCS_CFG_EEE_TIMER_VAL 52
57 #define ETH_MAC_KR_25_PCS_CFG_EEE_TIMER_VAL 80
58 #define ETH_MAC_XLG_40_PCS_CFG_EEE_TIMER_VAL 63
59 #define ETH_MAC_XLG_50_PCS_CFG_EEE_TIMER_VAL 85
60 
61 #define AL_ETH_TX_PKT_UDMA_FLAGS	(AL_ETH_TX_FLAGS_NO_SNOOP | \
62 					 AL_ETH_TX_FLAGS_INT)
63 
64 #define AL_ETH_TX_PKT_META_FLAGS	(AL_ETH_TX_FLAGS_IPV4_L3_CSUM | \
65 					 AL_ETH_TX_FLAGS_L4_CSUM |	\
66 					 AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM |	\
67 					 AL_ETH_TX_FLAGS_L2_MACSEC_PKT | \
68 					 AL_ETH_TX_FLAGS_L2_DIS_FCS |\
69 					 AL_ETH_TX_FLAGS_TSO |\
70 					 AL_ETH_TX_FLAGS_TS)
71 
72 #define AL_ETH_TX_SRC_VLAN_CNT_MASK	3
73 #define AL_ETH_TX_SRC_VLAN_CNT_SHIFT	5
74 #define AL_ETH_TX_L4_PROTO_IDX_MASK	0x1F
75 #define AL_ETH_TX_L4_PROTO_IDX_SHIFT	8
76 #define AL_ETH_TX_TUNNEL_MODE_SHIFT		18
77 #define AL_ETH_TX_OUTER_L3_PROTO_SHIFT		20
78 #define AL_ETH_TX_VLAN_MOD_ADD_SHIFT		22
79 #define AL_ETH_TX_VLAN_MOD_DEL_SHIFT		24
80 #define AL_ETH_TX_VLAN_MOD_E_SEL_SHIFT		26
81 #define AL_ETH_TX_VLAN_MOD_VID_SEL_SHIFT	28
82 #define AL_ETH_TX_VLAN_MOD_PBIT_SEL_SHIFT	30
83 
84 /* tx Meta Descriptor defines */
85 #define AL_ETH_TX_META_STORE			(1 << 21)
86 #define AL_ETH_TX_META_L3_LEN_MASK		0xff
87 #define AL_ETH_TX_META_L3_OFF_MASK		0xff
88 #define AL_ETH_TX_META_L3_OFF_SHIFT		8
89 #define AL_ETH_TX_META_MSS_LSB_VAL_SHIFT	22
90 #define AL_ETH_TX_META_MSS_MSB_TS_VAL_SHIFT	16
91 #define AL_ETH_TX_META_OUTER_L3_LEN_MASK	0x1f
92 #define AL_ETH_TX_META_OUTER_L3_LEN_SHIFT	24
93 #define AL_ETH_TX_META_OUTER_L3_OFF_HIGH_MASK	0x18
94 #define AL_ETH_TX_META_OUTER_L3_OFF_HIGH_SHIFT	10
95 #define AL_ETH_TX_META_OUTER_L3_OFF_LOW_MASK	0x07
96 #define AL_ETH_TX_META_OUTER_L3_OFF_LOW_SHIFT	29
97 
98 /* tx Meta Descriptor defines - MacSec */
99 #define AL_ETH_TX_MACSEC_SIGN_SHIFT			  0		/* Sign TX pkt */
100 #define AL_ETH_TX_MACSEC_ENCRYPT_SHIFT			  1		/* Encrypt TX pkt */
101 #define AL_ETH_TX_MACSEC_AN_LSB_SHIFT			  2		/* Association Number */
102 #define AL_ETH_TX_MACSEC_AN_MSB_SHIFT			  3
103 #define AL_ETH_TX_MACSEC_SC_LSB_SHIFT			  4		/* Secured Channel */
104 #define AL_ETH_TX_MACSEC_SC_MSB_SHIFT			  9
105 #define AL_ETH_TX_MACSEC_SECURED_PYLD_LEN_LSB_SHIFT	 10		/* Secure Payload Length (0x3FFF for non-SL packets) */
106 #define AL_ETH_TX_MACSEC_SECURED_PYLD_LEN_MSB_SHIFT	 23
107 
108 /* Rx Descriptor defines */
109 #define AL_ETH_RX_L3_PROTO_IDX_MASK	0x1F
110 #define AL_ETH_RX_SRC_VLAN_CNT_MASK	3
111 #define AL_ETH_RX_SRC_VLAN_CNT_SHIFT	5
112 #define AL_ETH_RX_L4_PROTO_IDX_MASK	0x1F
113 #define AL_ETH_RX_L4_PROTO_IDX_SHIFT	8
114 
115 #define AL_ETH_RX_L3_OFFSET_SHIFT	9
116 #define AL_ETH_RX_L3_OFFSET_MASK	(0x7f << AL_ETH_RX_L3_OFFSET_SHIFT)
117 #define AL_ETH_RX_HASH_SHIFT		16
118 #define AL_ETH_RX_HASH_MASK		(0xffff 	<< AL_ETH_RX_HASH_SHIFT)
119 
120 #define ETH_MAC_GEN_LED_CFG_BLINK_TIMER_VAL 5
121 #define ETH_MAC_GEN_LED_CFG_ACT_TIMER_VAL 7
122 
123 /* Tx VID Table*/
124 #define AL_ETH_TX_VLAN_TABLE_UDMA_MASK		0xF
125 #define AL_ETH_TX_VLAN_TABLE_FWD_TO_MAC		(1 << 4)
126 
127 /* tx gpd defines */
128 #define AL_ETH_TX_GPD_L3_PROTO_MASK		0x1f
129 #define AL_ETH_TX_GPD_L3_PROTO_SHIFT		0
130 #define AL_ETH_TX_GPD_L4_PROTO_MASK		0x1f
131 #define AL_ETH_TX_GPD_L4_PROTO_SHIFT		5
132 #define AL_ETH_TX_GPD_TUNNEL_CTRL_MASK		0x7
133 #define AL_ETH_TX_GPD_TUNNEL_CTRL_SHIFT		10
134 #define AL_ETH_TX_GPD_SRC_VLAN_CNT_MASK		0x3
135 #define AL_ETH_TX_GPD_SRC_VLAN_CNT_SHIFT	13
136 #define AL_ETH_TX_GPD_CAM_DATA_2_SHIFT		32
137 #define AL_ETH_TX_GPD_CAM_MASK_2_SHIFT		32
138 #define AL_ETH_TX_GPD_CAM_CTRL_VALID_SHIFT	31
139 
140 /* tx gcp defines */
141 #define AL_ETH_TX_GCP_POLY_SEL_MASK		0x1
142 #define AL_ETH_TX_GCP_POLY_SEL_SHIFT		0
143 #define AL_ETH_TX_GCP_CRC32_BIT_COMP_MASK	0x1
144 #define AL_ETH_TX_GCP_CRC32_BIT_COMP_SHIFT	1
145 #define AL_ETH_TX_GCP_CRC32_BIT_SWAP_MASK	0x1
146 #define AL_ETH_TX_GCP_CRC32_BIT_SWAP_SHIFT	2
147 #define AL_ETH_TX_GCP_CRC32_BYTE_SWAP_MASK	0x1
148 #define AL_ETH_TX_GCP_CRC32_BYTE_SWAP_SHIFT	3
149 #define AL_ETH_TX_GCP_DATA_BIT_SWAP_MASK	0x1
150 #define AL_ETH_TX_GCP_DATA_BIT_SWAP_SHIFT	4
151 #define AL_ETH_TX_GCP_DATA_BYTE_SWAP_MASK	0x1
152 #define AL_ETH_TX_GCP_DATA_BYTE_SWAP_SHIFT	5
153 #define AL_ETH_TX_GCP_TRAIL_SIZE_MASK		0xF
154 #define AL_ETH_TX_GCP_TRAIL_SIZE_SHIFT		6
155 #define AL_ETH_TX_GCP_HEAD_SIZE_MASK		0xFF
156 #define AL_ETH_TX_GCP_HEAD_SIZE_SHIFT		16
157 #define AL_ETH_TX_GCP_HEAD_CALC_MASK		0x1
158 #define AL_ETH_TX_GCP_HEAD_CALC_SHIFT		24
159 #define AL_ETH_TX_GCP_MASK_POLARITY_MASK	0x1
160 #define AL_ETH_TX_GCP_MASK_POLARITY_SHIFT	25
161 
162 #define AL_ETH_TX_GCP_OPCODE_1_MASK		0x3F
163 #define AL_ETH_TX_GCP_OPCODE_1_SHIFT		0
164 #define AL_ETH_TX_GCP_OPCODE_2_MASK		0x3F
165 #define AL_ETH_TX_GCP_OPCODE_2_SHIFT		6
166 #define AL_ETH_TX_GCP_OPCODE_3_MASK		0x3F
167 #define AL_ETH_TX_GCP_OPCODE_3_SHIFT		12
168 #define AL_ETH_TX_GCP_OPSEL_1_MASK		0xF
169 #define AL_ETH_TX_GCP_OPSEL_1_SHIFT		0
170 #define AL_ETH_TX_GCP_OPSEL_2_MASK		0xF
171 #define AL_ETH_TX_GCP_OPSEL_2_SHIFT		4
172 #define AL_ETH_TX_GCP_OPSEL_3_MASK		0xF
173 #define AL_ETH_TX_GCP_OPSEL_3_SHIFT		8
174 #define AL_ETH_TX_GCP_OPSEL_4_MASK		0xF
175 #define AL_ETH_TX_GCP_OPSEL_4_SHIFT		12
176 
177 /*  Tx crc_chksum_replace defines */
178 #define L4_CHECKSUM_DIS_AND_L3_CHECKSUM_DIS     0x00
179 #define L4_CHECKSUM_DIS_AND_L3_CHECKSUM_EN      0x20
180 #define L4_CHECKSUM_EN_AND_L3_CHECKSUM_DIS      0x40
181 #define L4_CHECKSUM_EN_AND_L3_CHECKSUM_EN       0x60
182 
183 /* rx gpd defines */
184 #define AL_ETH_RX_GPD_OUTER_L3_PROTO_MASK		0x1f
185 #define AL_ETH_RX_GPD_OUTER_L3_PROTO_SHIFT		(3 + 0)
186 #define AL_ETH_RX_GPD_OUTER_L4_PROTO_MASK		0x1f
187 #define AL_ETH_RX_GPD_OUTER_L4_PROTO_SHIFT		(3 + 8)
188 #define AL_ETH_RX_GPD_INNER_L3_PROTO_MASK		0x1f
189 #define AL_ETH_RX_GPD_INNER_L3_PROTO_SHIFT		(3 + 16)
190 #define AL_ETH_RX_GPD_INNER_L4_PROTO_MASK		0x1f
191 #define AL_ETH_RX_GPD_INNER_L4_PROTO_SHIFT		(3 + 24)
192 #define AL_ETH_RX_GPD_OUTER_PARSE_CTRL_MASK		0xFF
193 #define AL_ETH_RX_GPD_OUTER_PARSE_CTRL_SHIFT	32
194 #define AL_ETH_RX_GPD_INNER_PARSE_CTRL_MASK		0xFF
195 #define AL_ETH_RX_GPD_INNER_PARSE_CTRL_SHIFT	40
196 #define AL_ETH_RX_GPD_L3_PRIORITY_MASK			0xFF
197 #define AL_ETH_RX_GPD_L3_PRIORITY_SHIFT			48
198 #define AL_ETH_RX_GPD_L4_DST_PORT_LSB_MASK		0xFF
199 #define AL_ETH_RX_GPD_L4_DST_PORT_LSB_SHIFT		56
200 #define AL_ETH_RX_GPD_CAM_DATA_2_SHIFT			32
201 #define AL_ETH_RX_GPD_CAM_MASK_2_SHIFT			32
202 #define AL_ETH_RX_GPD_CAM_CTRL_VALID_SHIFT		31
203 
204 #define AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L3_PROTO_IDX_OFFSET	(106 + 5)
205 #define AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L4_PROTO_IDX_OFFSET	(106 + 10)
206 #define AL_ETH_RX_GPD_PARSE_RESULT_INNER_L3_PROTO_IDX_OFFSET	(0 + 5)
207 #define AL_ETH_RX_GPD_PARSE_RESULT_INNER_L4_PROTO_IDX_OFFSET	(0 + 10)
208 #define AL_ETH_RX_GPD_PARSE_RESULT_OUTER_PARSE_CTRL			(106 + 4)
209 #define AL_ETH_RX_GPD_PARSE_RESULT_INNER_PARSE_CTRL			4
210 #define AL_ETH_RX_GPD_PARSE_RESULT_L3_PRIORITY			(106 + 13)
211 #define AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L4_DST_PORT_LSB	(106 + 65)
212 
213 /* rx gcp defines */
214 #define AL_ETH_RX_GCP_POLY_SEL_MASK		0x1
215 #define AL_ETH_RX_GCP_POLY_SEL_SHIFT		0
216 #define AL_ETH_RX_GCP_CRC32_BIT_COMP_MASK	0x1
217 #define AL_ETH_RX_GCP_CRC32_BIT_COMP_SHIFT	1
218 #define AL_ETH_RX_GCP_CRC32_BIT_SWAP_MASK	0x1
219 #define AL_ETH_RX_GCP_CRC32_BIT_SWAP_SHIFT	2
220 #define AL_ETH_RX_GCP_CRC32_BYTE_SWAP_MASK      0x1
221 #define AL_ETH_RX_GCP_CRC32_BYTE_SWAP_SHIFT	3
222 #define AL_ETH_RX_GCP_DATA_BIT_SWAP_MASK	0x1
223 #define AL_ETH_RX_GCP_DATA_BIT_SWAP_SHIFT	4
224 #define AL_ETH_RX_GCP_DATA_BYTE_SWAP_MASK       0x1
225 #define AL_ETH_RX_GCP_DATA_BYTE_SWAP_SHIFT	5
226 #define AL_ETH_RX_GCP_TRAIL_SIZE_MASK		0xF
227 #define AL_ETH_RX_GCP_TRAIL_SIZE_SHIFT		6
228 #define AL_ETH_RX_GCP_HEAD_SIZE_MASK		0xFF
229 #define AL_ETH_RX_GCP_HEAD_SIZE_SHIFT		16
230 #define AL_ETH_RX_GCP_HEAD_CALC_MASK		0x1
231 #define AL_ETH_RX_GCP_HEAD_CALC_SHIFT		24
232 #define AL_ETH_RX_GCP_MASK_POLARITY_MASK	0x1
233 #define AL_ETH_RX_GCP_MASK_POLARITY_SHIFT	25
234 
235 #define AL_ETH_RX_GCP_OPCODE_1_MASK		0x3F
236 #define AL_ETH_RX_GCP_OPCODE_1_SHIFT		0
237 #define AL_ETH_RX_GCP_OPCODE_2_MASK		0x3F
238 #define AL_ETH_RX_GCP_OPCODE_2_SHIFT		6
239 #define AL_ETH_RX_GCP_OPCODE_3_MASK		0x3F
240 #define AL_ETH_RX_GCP_OPCODE_3_SHIFT		12
241 #define AL_ETH_RX_GCP_OPSEL_1_MASK		0xF
242 #define AL_ETH_RX_GCP_OPSEL_1_SHIFT		0
243 #define AL_ETH_RX_GCP_OPSEL_2_MASK		0xF
244 #define AL_ETH_RX_GCP_OPSEL_2_SHIFT		4
245 #define AL_ETH_RX_GCP_OPSEL_3_MASK		0xF
246 #define AL_ETH_RX_GCP_OPSEL_3_SHIFT		8
247 #define AL_ETH_RX_GCP_OPSEL_4_MASK		0xF
248 #define AL_ETH_RX_GCP_OPSEL_4_SHIFT		12
249 
250 #define AL_ETH_MDIO_DELAY_PERIOD	1 /* micro seconds to wait when polling mdio status */
251 #define AL_ETH_MDIO_DELAY_COUNT		150 /* number of times to poll */
252 #define AL_ETH_S2M_UDMA_COMP_COAL_TIMEOUT	200 /* Rx descriptors coalescing timeout in SB clocks */
253 
254 #define AL_ETH_EPE_ENTRIES_NUM 26
255 static struct al_eth_epe_p_reg_entry al_eth_epe_p_regs[AL_ETH_EPE_ENTRIES_NUM] = {
256 	{ 0x0, 0x0, 0x0 },
257 	{ 0x0, 0x0, 0x1 },
258 	{ 0x0, 0x0, 0x2 },
259 	{ 0x0, 0x0, 0x3 },
260 	{ 0x18100, 0xFFFFF, 0x80000004 },
261 	{ 0x188A8, 0xFFFFF, 0x80000005 },
262 	{ 0x99100, 0xFFFFF, 0x80000006 },
263 	{ 0x98100, 0xFFFFF, 0x80000007 },
264 	{ 0x10800, 0x7FFFF, 0x80000008 },
265 	{ 0x20000, 0x73FFF, 0x80000009 },
266 	{ 0x20000, 0x70000, 0x8000000A },
267 	{ 0x186DD, 0x7FFFF, 0x8000000B },
268 	{ 0x30600, 0x7FF00, 0x8000000C },
269 	{ 0x31100, 0x7FF00, 0x8000000D },
270 	{ 0x32F00, 0x7FF00, 0x8000000E },
271 	{ 0x32900, 0x7FF00, 0x8000000F },
272 	{ 0x105DC, 0x7FFFF, 0x80010010 },
273 	{ 0x188E5, 0x7FFFF, 0x80000011 },
274 	{ 0x72000, 0x72000, 0x80000012 },
275 	{ 0x70000, 0x72000, 0x80000013 },
276 	{ 0x46558, 0x7FFFF, 0x80000001 },
277 	{ 0x18906, 0x7FFFF, 0x80000015 },
278 	{ 0x18915, 0x7FFFF, 0x80000016 },
279 	{ 0x31B00, 0x7FF00, 0x80000017 },
280 	{ 0x30400, 0x7FF00, 0x80000018 },
281 	{ 0x0, 0x0, 0x8000001F }
282 };
283 
284 
285 static struct al_eth_epe_control_entry al_eth_epe_control_table[AL_ETH_EPE_ENTRIES_NUM] = {
286 	{{ 0x2800000, 0x0, 0x0, 0x0, 0x1, 0x400000 }},
287 	{{ 0x280004C, 0x746000, 0xA46030, 0xE00000, 0x2, 0x400000 }},
288 	{{ 0x2800054, 0x746000, 0xA46030, 0x1600000, 0x2, 0x400000 }},
289 	{{ 0x280005C, 0x746000, 0xA46030, 0x1E00000, 0x2, 0x400000 }},
290 	{{ 0x2800042, 0xD42000, 0x0, 0x400000, 0x1010412, 0x400000 }},
291 	{{ 0x2800042, 0xD42000, 0x0, 0x400000, 0x1010412, 0x400000 }},
292 	{{ 0x2800042, 0xE42000, 0x0, 0x400000, 0x2020002, 0x400000 }},
293 	{{ 0x2800042, 0xE42000, 0x0, 0x400000, 0x2020002, 0x400000 }},
294 	{{ 0x280B046, 0x0, 0x6C1008, 0x0, 0x4, 0x406800 }},
295 	{{ 0x2800049, 0xF44060, 0x1744080, 0x14404, 0x6, 0x400011 }},
296 	{{ 0x2015049, 0xF44060, 0x1744080, 0x14404, 0x8080007, 0x400011 }},
297 	{{ 0x280B046, 0xF60040, 0x6C1004, 0x2800000, 0x6, 0x406811 }},
298 	{{ 0x2815042, 0x1F42000, 0x2042010, 0x1414460, 0x10100009, 0x40B800 }},
299 	{{ 0x2815042, 0x1F42000, 0x2042010, 0x800000, 0x10100009, 0x40B800 }},
300 	{{ 0x280B042, 0x0, 0x0, 0x430400, 0x4040009, 0x0 }},
301 	{{ 0x2815580, 0x0, 0x0, 0x0, 0x4040005, 0x0 }},
302 	{{ 0x280B000, 0x0, 0x0, 0x0, 0x1, 0x400000 }},
303 	{{ 0x2800040, 0x174E000, 0x0, 0x0, 0xE, 0x406800 }},
304 	{{ 0x280B000, 0x0, 0x0, 0x600000, 0x1, 0x406800 }},
305 	{{ 0x280B000, 0x0, 0x0, 0xE00000, 0x1, 0x406800 }},
306 	{{ 0x2800000, 0x0, 0x0, 0x0, 0x1, 0x400000 }},
307 	{{ 0x280B046, 0x0, 0x0, 0x2800000, 0x7, 0x400000 }},
308 	{{ 0x280B046, 0xF60040, 0x6C1004, 0x2800000, 0x6, 0x406811 }},
309 	{{ 0x2815042, 0x1F43028, 0x2000000, 0xC00000, 0x10100009, 0x40B800 }},
310 	{{ 0x2815400, 0x0, 0x0, 0x0, 0x4040005, 0x0 }},
311 	{{ 0x2800000, 0x0, 0x0, 0x0, 0x1, 0x400000 }}
312 };
313 
314 
315 #define AL_ETH_IS_1G_MAC(mac_mode) (((mac_mode) == AL_ETH_MAC_MODE_RGMII) || ((mac_mode) == AL_ETH_MAC_MODE_SGMII))
316 #define AL_ETH_IS_10G_MAC(mac_mode)	(((mac_mode) == AL_ETH_MAC_MODE_10GbE_Serial) ||	\
317 					((mac_mode) == AL_ETH_MAC_MODE_10G_SGMII) ||		\
318 					((mac_mode) == AL_ETH_MAC_MODE_SGMII_2_5G))
319 #define AL_ETH_IS_25G_MAC(mac_mode) ((mac_mode) == AL_ETH_MAC_MODE_KR_LL_25G)
320 
321 static const char *al_eth_mac_mode_str(enum al_eth_mac_mode mode)
322 {
323 	switch(mode) {
324 	case AL_ETH_MAC_MODE_RGMII:
325 		return "RGMII";
326 	case AL_ETH_MAC_MODE_SGMII:
327 		return "SGMII";
328 	case AL_ETH_MAC_MODE_SGMII_2_5G:
329 		return "SGMII_2_5G";
330 	case AL_ETH_MAC_MODE_10GbE_Serial:
331 		return "KR";
332         case AL_ETH_MAC_MODE_KR_LL_25G:
333 		return "KR_LL_25G";
334 	case AL_ETH_MAC_MODE_10G_SGMII:
335 		return "10G_SGMII";
336 	case AL_ETH_MAC_MODE_XLG_LL_40G:
337 		return "40G_LL";
338 	case AL_ETH_MAC_MODE_XLG_LL_50G:
339 		return "50G_LL";
340 	case AL_ETH_MAC_MODE_XLG_LL_25G:
341 		return "25G_LL";
342 	default:
343 		return "N/A";
344 	}
345 }
346 
347 /**
348  * change and wait udma state
349  *
350  * @param dma the udma to change its state
351  * @param new_state
352  *
353  * @return 0 on success. otherwise on failure.
354  */
355 static int al_udma_state_set_wait(struct al_udma *dma, enum al_udma_state new_state)
356 {
357 	enum al_udma_state state;
358 	enum al_udma_state expected_state = new_state;
359 	int count = 1000;
360 	int rc;
361 
362 	rc = al_udma_state_set(dma, new_state);
363 	if (rc != 0) {
364 		al_warn("[%s] warn: failed to change state, error %d\n", dma->name, rc);
365 		return rc;
366 	}
367 
368 	if ((new_state == UDMA_NORMAL) || (new_state == UDMA_DISABLE))
369 		expected_state = UDMA_IDLE;
370 
371 	do {
372 		state = al_udma_state_get(dma);
373 		if (state == expected_state)
374 			break;
375 		al_udelay(1);
376 		if (count-- == 0) {
377 			al_warn("[%s] warn: dma state didn't change to %s\n",
378 				 dma->name, al_udma_states_name[new_state]);
379 			return -ETIMEDOUT;
380 		}
381 	} while (1);
382 	return 0;
383 }
384 
385 static void al_eth_epe_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
386 		struct al_eth_epe_p_reg_entry *reg_entry,
387 		struct al_eth_epe_control_entry *control_entry)
388 {
389 	al_reg_write32(&adapter->ec_regs_base->epe_p[idx].comp_data, reg_entry->data);
390 	al_reg_write32(&adapter->ec_regs_base->epe_p[idx].comp_mask, reg_entry->mask);
391 	al_reg_write32(&adapter->ec_regs_base->epe_p[idx].comp_ctrl, reg_entry->ctrl);
392 
393 	al_reg_write32(&adapter->ec_regs_base->msp_c[idx].p_comp_data, reg_entry->data);
394 	al_reg_write32(&adapter->ec_regs_base->msp_c[idx].p_comp_mask, reg_entry->mask);
395 	al_reg_write32(&adapter->ec_regs_base->msp_c[idx].p_comp_ctrl, reg_entry->ctrl);
396 
397 	/*control table  0*/
398 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_addr, idx);
399 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_6,
400 			control_entry->data[5]);
401 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_2,
402 			control_entry->data[1]);
403 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_3,
404 			control_entry->data[2]);
405 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_4,
406 			control_entry->data[3]);
407 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_5,
408 			control_entry->data[4]);
409 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_1,
410 			control_entry->data[0]);
411 
412 	/*control table 1*/
413 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_addr, idx);
414 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_6,
415 			control_entry->data[5]);
416 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_2,
417 			control_entry->data[1]);
418 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_3,
419 			control_entry->data[2]);
420 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_4,
421 			control_entry->data[3]);
422 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_5,
423 			control_entry->data[4]);
424 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_1,
425 			control_entry->data[0]);
426 }
427 
428 static void al_eth_epe_init(struct al_hal_eth_adapter *adapter)
429 {
430 	int idx;
431 
432 	if (adapter->enable_rx_parser == 0) {
433 		al_dbg("eth [%s]: disable rx parser\n", adapter->name);
434 
435 		al_reg_write32(&adapter->ec_regs_base->epe[0].res_def, 0x08000000);
436 		al_reg_write32(&adapter->ec_regs_base->epe[0].res_in, 0x7);
437 
438 		al_reg_write32(&adapter->ec_regs_base->epe[1].res_def, 0x08000000);
439 		al_reg_write32(&adapter->ec_regs_base->epe[1].res_in, 0x7);
440 
441 		return;
442 	}
443 	al_dbg("eth [%s]: enable rx parser\n", adapter->name);
444 	for (idx = 0; idx < AL_ETH_EPE_ENTRIES_NUM; idx++)
445 		al_eth_epe_entry_set(adapter, idx, &al_eth_epe_p_regs[idx], &al_eth_epe_control_table[idx]);
446 
447 	al_reg_write32(&adapter->ec_regs_base->epe[0].res_def, 0x08000080);
448 	al_reg_write32(&adapter->ec_regs_base->epe[0].res_in, 0x7);
449 
450 	al_reg_write32(&adapter->ec_regs_base->epe[1].res_def, 0x08000080);
451 	al_reg_write32(&adapter->ec_regs_base->epe[1].res_in, 0);
452 
453 	/* header length as function of 4 bits value, for GRE, when C bit is set, the header len should be increase by 4*/
454 	al_reg_write32(&adapter->ec_regs_base->epe_h[8].hdr_len, (4 << 16) | 4);
455 
456 	/* select the outer information when writing the rx descriptor (l3 protocol index etc) */
457 	al_reg_write32(&adapter->ec_regs_base->rfw.meta, EC_RFW_META_L3_LEN_CALC);
458 
459 	al_reg_write32(&adapter->ec_regs_base->rfw.checksum, EC_RFW_CHECKSUM_HDR_SEL);
460 }
461 
462 /**
463  * read 40G MAC registers (indirect access)
464  *
465  * @param adapter pointer to the private structure
466  * @param reg_addr address in the an registers
467  *
468  * @return the register value
469  */
470 static uint32_t al_eth_40g_mac_reg_read(
471 			struct al_hal_eth_adapter *adapter,
472 			uint32_t reg_addr)
473 {
474 	uint32_t val;
475 
476 	/* indirect access */
477 	al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, reg_addr);
478 	val = al_reg_read32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data);
479 
480 	al_dbg("[%s]: %s - reg %d. val 0x%x",
481 	       adapter->name, __func__, reg_addr, val);
482 
483 	return val;
484 }
485 
486 /**
487  * write 40G MAC registers (indirect access)
488  *
489  * @param adapter pointer to the private structure
490  * @param reg_addr address in the an registers
491  * @param reg_data value to write to the register
492  *
493  */
494 static void al_eth_40g_mac_reg_write(
495 			struct al_hal_eth_adapter *adapter,
496 			uint32_t reg_addr,
497 			uint32_t reg_data)
498 {
499 	/* indirect access */
500 	al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, reg_addr);
501 	al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, reg_data);
502 
503 	al_dbg("[%s]: %s - reg %d. val 0x%x",
504 	       adapter->name, __func__, reg_addr, reg_data);
505 }
506 
507 /**
508  * read 40G PCS registers (indirect access)
509  *
510  * @param adapter pointer to the private structure
511  * @param reg_addr address in the an registers
512  *
513  * @return the register value
514  */
515 static uint32_t al_eth_40g_pcs_reg_read(
516 			struct al_hal_eth_adapter *adapter,
517 			uint32_t reg_addr)
518 {
519 	uint32_t val;
520 
521 	/* indirect access */
522 	al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, reg_addr);
523 	val = al_reg_read32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data);
524 
525 	al_dbg("[%s]: %s - reg %d. val 0x%x",
526 	       adapter->name, __func__, reg_addr, val);
527 
528 	return val;
529 }
530 
531 /**
532  * write 40G PCS registers (indirect access)
533  *
534  * @param adapter pointer to the private structure
535  * @param reg_addr address in the an registers
536  * @param reg_data value to write to the register
537  *
538  */
539 static void al_eth_40g_pcs_reg_write(
540 			struct al_hal_eth_adapter *adapter,
541 			uint32_t reg_addr,
542 			uint32_t reg_data)
543 {
544 	/* indirect access */
545 	al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, reg_addr);
546 	al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, reg_data);
547 
548 	al_dbg("[%s]: %s - reg %d. val 0x%x",
549 	       adapter->name, __func__, reg_addr, reg_data);
550 }
551 
552 /*****************************API Functions  **********************************/
553 /*adapter management */
554 /**
555  * initialize the ethernet adapter's DMA
556  */
557 int al_eth_adapter_init(struct al_hal_eth_adapter *adapter, struct al_eth_adapter_params *params)
558 {
559 	struct al_udma_params udma_params;
560 	struct al_udma_m2s_pkt_len_conf conf;
561 	int i;
562 	uint32_t reg;
563 	int rc;
564 
565 	al_dbg("eth [%s]: initialize controller's UDMA. id = %d\n", params->name, params->udma_id);
566 	al_dbg("eth [%s]: UDMA base regs: %p\n", params->name, params->udma_regs_base);
567 	al_dbg("eth [%s]: EC base regs: %p\n", params->name, params->ec_regs_base);
568 	al_dbg("eth [%s]: MAC base regs: %p\n", params->name, params->mac_regs_base);
569 	al_dbg("eth [%s]: enable_rx_parser: %x\n", params->name, params->enable_rx_parser);
570 
571 	adapter->name = params->name;
572 	adapter->rev_id = params->rev_id;
573 	adapter->udma_id = params->udma_id;
574 	adapter->udma_regs_base = params->udma_regs_base;
575 	adapter->ec_regs_base = (struct al_ec_regs __iomem*)params->ec_regs_base;
576 	adapter->mac_regs_base = (struct al_eth_mac_regs __iomem*)params->mac_regs_base;
577 	adapter->unit_regs = (struct unit_regs __iomem *)params->udma_regs_base;
578 	adapter->enable_rx_parser = params->enable_rx_parser;
579 	adapter->serdes_lane = params->serdes_lane;
580 	adapter->ec_ints_base = (uint8_t __iomem *)adapter->ec_regs_base + 0x1c00;
581 	adapter->mac_ints_base = (struct interrupt_controller_ctrl __iomem *)
582 			((uint8_t __iomem *)adapter->mac_regs_base + 0x800);
583 
584 	/* initialize Tx udma */
585 	udma_params.udma_regs_base = adapter->unit_regs;
586 	udma_params.type = UDMA_TX;
587 	udma_params.num_of_queues = AL_ETH_UDMA_TX_QUEUES;
588 	udma_params.name = "eth tx";
589 	rc = al_udma_init(&adapter->tx_udma, &udma_params);
590 
591 	if (rc != 0) {
592 		al_err("failed to initialize %s, error %d\n",
593 			 udma_params.name, rc);
594 		return rc;
595 	}
596 	rc = al_udma_state_set_wait(&adapter->tx_udma, UDMA_NORMAL);
597 	if (rc != 0) {
598 		al_err("[%s]: failed to change state, error %d\n",
599 			 udma_params.name, rc);
600 		return rc;
601 	}
602 	/* initialize Rx udma */
603 	udma_params.udma_regs_base = adapter->unit_regs;
604 	udma_params.type = UDMA_RX;
605 	udma_params.num_of_queues = AL_ETH_UDMA_RX_QUEUES;
606 	udma_params.name = "eth rx";
607 	rc = al_udma_init(&adapter->rx_udma, &udma_params);
608 
609 	if (rc != 0) {
610 		al_err("failed to initialize %s, error %d\n",
611 			 udma_params.name, rc);
612 		return rc;
613 	}
614 
615 	rc = al_udma_state_set_wait(&adapter->rx_udma, UDMA_NORMAL);
616 	if (rc != 0) {
617 		al_err("[%s]: failed to change state, error %d\n",
618 			 udma_params.name, rc);
619 		return rc;
620 	}
621 	al_dbg("eth [%s]: controller's UDMA successfully initialized\n",
622 		 params->name);
623 
624 	/* set max packet size to 1M (for TSO) */
625 	conf.encode_64k_as_zero = AL_TRUE;
626 	conf.max_pkt_size = 0xfffff;
627 	al_udma_m2s_packet_size_cfg_set(&adapter->tx_udma, &conf);
628 
629 	/* set m2s (tx) max descriptors to max data buffers number and one for
630 	 * meta descriptor
631 	 */
632 	al_udma_m2s_max_descs_set(&adapter->tx_udma, AL_ETH_PKT_MAX_BUFS + 1);
633 
634 	/* set s2m (rx) max descriptors to max data buffers */
635 	al_udma_s2m_max_descs_set(&adapter->rx_udma, AL_ETH_PKT_MAX_BUFS);
636 
637 	/* set s2m burst lenght when writing completion descriptors to 64 bytes
638 	 */
639 	al_udma_s2m_compl_desc_burst_config(&adapter->rx_udma, 64);
640 
641 	/* if pointer to ec regs provided, then init the tx meta cache of this udma*/
642 	if (adapter->ec_regs_base != NULL) {
643 		// INIT TX CACHE TABLE:
644 		for (i = 0; i < 4; i++) {
645 			al_reg_write32(&adapter->ec_regs_base->tso.cache_table_addr, i + (adapter->udma_id * 4));
646 			al_reg_write32(&adapter->ec_regs_base->tso.cache_table_data_1, 0x00000000);
647 			al_reg_write32(&adapter->ec_regs_base->tso.cache_table_data_2, 0x00000000);
648 			al_reg_write32(&adapter->ec_regs_base->tso.cache_table_data_3, 0x00000000);
649 			al_reg_write32(&adapter->ec_regs_base->tso.cache_table_data_4, 0x00000000);
650 		}
651 	}
652 	// only udma 0 allowed to init ec
653 	if (adapter->udma_id != 0) {
654 		return 0;
655 	}
656 	/* enable Ethernet controller: */
657 	/* enable internal machines*/
658 	al_reg_write32(&adapter->ec_regs_base->gen.en, 0xffffffff);
659 	al_reg_write32(&adapter->ec_regs_base->gen.fifo_en, 0xffffffff);
660 
661 	if (adapter->rev_id > AL_ETH_REV_ID_0) {
662 		/* enable A0 descriptor structure */
663 		al_reg_write32_masked(&adapter->ec_regs_base->gen.en_ext,
664 				      EC_GEN_EN_EXT_CACHE_WORD_SPLIT,
665 				      EC_GEN_EN_EXT_CACHE_WORD_SPLIT);
666 
667 		/* use mss value in the descriptor */
668 		al_reg_write32(&adapter->ec_regs_base->tso.cfg_add_0,
669 						EC_TSO_CFG_ADD_0_MSS_SEL);
670 
671 		/* enable tunnel TSO */
672 		al_reg_write32(&adapter->ec_regs_base->tso.cfg_tunnel,
673 						(EC_TSO_CFG_TUNNEL_EN_TUNNEL_TSO |
674 						 EC_TSO_CFG_TUNNEL_EN_UDP_CHKSUM |
675 						 EC_TSO_CFG_TUNNEL_EN_UDP_LEN |
676 						 EC_TSO_CFG_TUNNEL_EN_IPV6_PLEN |
677 						 EC_TSO_CFG_TUNNEL_EN_IPV4_CHKSUM |
678 						 EC_TSO_CFG_TUNNEL_EN_IPV4_IDEN |
679 						 EC_TSO_CFG_TUNNEL_EN_IPV4_TLEN));
680 	}
681 
682 	/* swap input byts from MAC RX */
683 	al_reg_write32(&adapter->ec_regs_base->mac.gen, 0x00000001);
684 	/* swap output bytes to MAC TX*/
685 	al_reg_write32(&adapter->ec_regs_base->tmi.tx_cfg, EC_TMI_TX_CFG_EN_FWD_TO_RX|EC_TMI_TX_CFG_SWAP_BYTES);
686 
687 	/* TODO: check if we need this line*/
688 	al_reg_write32(&adapter->ec_regs_base->tfw_udma[0].fwd_dec, 0x000003fb);
689 
690 	/* RFW configuration: default 0 */
691 	al_reg_write32(&adapter->ec_regs_base->rfw_default[0].opt_1, 0x00000001);
692 
693 	/* VLAN table address*/
694 	al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_addr, 0x00000000);
695 	/* VLAN table data*/
696 	al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_data, 0x00000000);
697 	/* HASH config (select toeplitz and bits 7:0 of the thash result, enable
698 	 * symmetric hash) */
699 	al_reg_write32(&adapter->ec_regs_base->rfw.thash_cfg_1,
700 			EC_RFW_THASH_CFG_1_ENABLE_IP_SWAP |
701 			EC_RFW_THASH_CFG_1_ENABLE_PORT_SWAP);
702 
703 	al_eth_epe_init(adapter);
704 
705 	/* disable TSO padding and use mac padding instead */
706 	reg = al_reg_read32(&adapter->ec_regs_base->tso.in_cfg);
707 	reg &= ~0x7F00; /*clear bits 14:8 */
708 	al_reg_write32(&adapter->ec_regs_base->tso.in_cfg, reg);
709 
710 	return 0;
711 }
712 
713 /*****************************API Functions  **********************************/
714 /*adapter management */
715 /**
716  * enable the ec and mac interrupts
717  */
718 int al_eth_ec_mac_ints_config(struct al_hal_eth_adapter *adapter)
719 {
720 
721 	al_dbg("eth [%s]: enable ethernet and mac interrupts\n", adapter->name);
722 
723 	// only udma 0 allowed to init ec
724 	if (adapter->udma_id != 0)
725 		return -EPERM;
726 
727 	/* enable mac ints */
728 	al_iofic_config(adapter->ec_ints_base, AL_INT_GROUP_A,
729 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
730 	al_iofic_config(adapter->ec_ints_base, AL_INT_GROUP_B,
731 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
732 	al_iofic_config(adapter->ec_ints_base, AL_INT_GROUP_C,
733 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
734 	al_iofic_config(adapter->ec_ints_base, AL_INT_GROUP_D,
735 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
736 
737 	/* unmask MAC int */
738 	al_iofic_unmask(adapter->ec_ints_base, AL_INT_GROUP_A, 8);
739 
740 	/* enable ec interrupts */
741 	al_iofic_config(adapter->mac_ints_base, AL_INT_GROUP_A,
742 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
743 	al_iofic_config(adapter->mac_ints_base, AL_INT_GROUP_B,
744 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
745 	al_iofic_config(adapter->mac_ints_base, AL_INT_GROUP_C,
746 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
747 	al_iofic_config(adapter->mac_ints_base, AL_INT_GROUP_D,
748 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
749 
750 	/* eee active */
751 	al_iofic_unmask(adapter->mac_ints_base, AL_INT_GROUP_B, AL_BIT(14));
752 
753 	al_iofic_unmask(adapter->unit_regs, AL_INT_GROUP_D, AL_BIT(11));
754 	return 0;
755 }
756 
757 /**
758  * ec and mac interrupt service routine
759  * read and print asserted interrupts
760  *
761  * @param adapter pointer to the private structure
762  *
763  * @return 0 on success. otherwise on failure.
764  */
765 int al_eth_ec_mac_isr(struct al_hal_eth_adapter *adapter)
766 {
767 	uint32_t cause;
768 	al_dbg("[%s]: ethernet interrupts handler\n", adapter->name);
769 
770 	// only udma 0 allowed to init ec
771 	if (adapter->udma_id != 0)
772 		return -EPERM;
773 
774 	/* read ec cause */
775 	cause = al_iofic_read_cause(adapter->ec_ints_base, AL_INT_GROUP_A);
776 	al_dbg("[%s]: ethernet group A cause 0x%08x\n", adapter->name, cause);
777 	if (cause & 1)
778 	{
779 		cause = al_iofic_read_cause(adapter->mac_ints_base, AL_INT_GROUP_A);
780 		al_dbg("[%s]: mac group A cause 0x%08x\n", adapter->name, cause);
781 
782 		cause = al_iofic_read_cause(adapter->mac_ints_base, AL_INT_GROUP_B);
783 		al_dbg("[%s]: mac group B cause 0x%08x\n", adapter->name, cause);
784 
785 		cause = al_iofic_read_cause(adapter->mac_ints_base, AL_INT_GROUP_C);
786 		al_dbg("[%s]: mac group C cause 0x%08x\n", adapter->name, cause);
787 
788 		cause = al_iofic_read_cause(adapter->mac_ints_base, AL_INT_GROUP_D);
789 		al_dbg("[%s]: mac group D cause 0x%08x\n", adapter->name, cause);
790 	}
791 	cause = al_iofic_read_cause(adapter->ec_ints_base, AL_INT_GROUP_B);
792 	al_dbg("[%s]: ethernet group B cause 0x%08x\n", adapter->name, cause);
793 	cause = al_iofic_read_cause(adapter->ec_ints_base, AL_INT_GROUP_C);
794 	al_dbg("[%s]: ethernet group C cause 0x%08x\n", adapter->name, cause);
795 	cause = al_iofic_read_cause(adapter->ec_ints_base, AL_INT_GROUP_D);
796 	al_dbg("[%s]: ethernet group D cause 0x%08x\n", adapter->name, cause);
797 
798 	return 0;
799 }
800 
801 /**
802  * stop the DMA of the ethernet adapter
803  */
804 int al_eth_adapter_stop(struct al_hal_eth_adapter *adapter)
805 {
806 	int rc;
807 
808 	al_dbg("eth [%s]: stop controller's UDMA\n", adapter->name);
809 
810 	/* disable Tx dma*/
811 	rc = al_udma_state_set_wait(&adapter->tx_udma, UDMA_DISABLE);
812 	if (rc != 0) {
813 		al_warn("[%s] warn: failed to change state, error %d\n",
814 			 adapter->tx_udma.name, rc);
815 		return rc;
816 	}
817 
818 	al_dbg("eth [%s]: controller's TX UDMA stopped\n",
819 		 adapter->name);
820 	/* disable Rx dma*/
821 	rc = al_udma_state_set_wait(&adapter->rx_udma, UDMA_DISABLE);
822 	if (rc != 0) {
823 		al_warn("[%s] warn: failed to change state, error %d\n",
824 			 adapter->rx_udma.name, rc);
825 		return rc;
826 	}
827 
828 	al_dbg("eth [%s]: controller's RX UDMA stopped\n",
829 		 adapter->name);
830 	return 0;
831 }
832 
833 int al_eth_adapter_reset(struct al_hal_eth_adapter *adapter)
834 {
835 	al_dbg("eth [%s]: reset controller's UDMA\n", adapter->name);
836 
837 	return -EPERM;
838 }
839 
840 /* Q management */
841 /**
842  * Configure and enable a queue ring
843  */
844 int al_eth_queue_config(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid,
845 			     struct al_udma_q_params *q_params)
846 {
847 	struct al_udma *udma;
848 	int rc;
849 
850 	al_dbg("eth [%s]: config UDMA %s queue %d\n", adapter->name,
851 		 type == UDMA_TX ? "Tx" : "Rx", qid);
852 
853 	if (type == UDMA_TX) {
854 		udma = &adapter->tx_udma;
855 	} else {
856 		udma = &adapter->rx_udma;
857 	}
858 
859 	q_params->adapter_rev_id = adapter->rev_id;
860 
861 	rc = al_udma_q_init(udma, qid, q_params);
862 
863 	if (rc)
864 		return rc;
865 
866 	if (type == UDMA_RX) {
867 		rc = al_udma_s2m_q_compl_coal_config(&udma->udma_q[qid],
868 				AL_TRUE, AL_ETH_S2M_UDMA_COMP_COAL_TIMEOUT);
869 
870 		al_assert(q_params->cdesc_size <= 32);
871 
872 		if (q_params->cdesc_size > 16)
873 			al_reg_write32_masked(&adapter->ec_regs_base->rfw.out_cfg,
874 					EC_RFW_OUT_CFG_META_CNT_MASK, 2);
875 	}
876 	return rc;
877 }
878 
879 int al_eth_queue_enable(struct al_hal_eth_adapter *adapter __attribute__((__unused__)),
880 			enum al_udma_type type __attribute__((__unused__)),
881 			uint32_t qid __attribute__((__unused__)))
882 {
883 	return -EPERM;
884 }
885 int al_eth_queue_disable(struct al_hal_eth_adapter *adapter __attribute__((__unused__)),
886 			 enum al_udma_type type __attribute__((__unused__)),
887 			 uint32_t qid __attribute__((__unused__)))
888 {
889 	return -EPERM;
890 }
891 
892 /* MAC layer */
893 int al_eth_rx_pkt_limit_config(struct al_hal_eth_adapter *adapter, uint32_t min_rx_len, uint32_t max_rx_len)
894 {
895 	al_assert(max_rx_len <= AL_ETH_MAX_FRAME_LEN);
896 
897 	/* EC minimum packet length [bytes] in RX */
898 	al_reg_write32(&adapter->ec_regs_base->mac.min_pkt, min_rx_len);
899 	/* EC maximum packet length [bytes] in RX */
900 	al_reg_write32(&adapter->ec_regs_base->mac.max_pkt, max_rx_len);
901 
902 	if (adapter->rev_id > AL_ETH_REV_ID_2) {
903 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, min_rx_len);
904 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, max_rx_len);
905 	}
906 
907 	/* configure the MAC's max rx length, add 16 bytes so the packet get
908 	 * trimmed by the EC/Async_fifo rather by the MAC
909 	*/
910 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
911 		al_reg_write32(&adapter->mac_regs_base->mac_1g.frm_len, max_rx_len + 16);
912 	else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode))
913 		/* 10G MAC control register  */
914 		al_reg_write32(&adapter->mac_regs_base->mac_10g.frm_len, (max_rx_len + 16));
915 	else
916 		al_eth_40g_mac_reg_write(adapter, ETH_MAC_GEN_V3_MAC_40G_FRM_LENGTH_ADDR, (max_rx_len + 16));
917 
918 	return 0;
919 }
920 
921 /* configure the mac media type. */
922 int al_eth_mac_config(struct al_hal_eth_adapter *adapter, enum al_eth_mac_mode mode)
923 {
924 	switch(mode) {
925 	case AL_ETH_MAC_MODE_RGMII:
926 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x40003210);
927 
928 		/* 1G MAC control register */
929 		/* bit[0]  - TX_ENA - zeroed by default. Should be asserted by al_eth_mac_start
930 		 * bit[1]  - RX_ENA - zeroed by default. Should be asserted by al_eth_mac_start
931 		 * bit[3]  - ETH_SPEED - zeroed to enable 10/100 Mbps Ethernet
932 		 * bit[4]  - PROMIS_EN - asserted to enable MAC promiscuous mode
933 		 * bit[23] - CNTL_FRM-ENA - asserted to enable control frames
934 		 * bit[24] - NO_LGTH_CHECK - asserted to disable length checks, which is done in the controller
935 		 */
936 		al_reg_write32(&adapter->mac_regs_base->mac_1g.cmd_cfg, 0x01800010);
937 
938 		/* RX_SECTION_EMPTY,  */
939 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_section_empty, 0x00000000);
940 		/* RX_SECTION_FULL,  */
941 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_section_full, 0x0000000c); /* must be larger than almost empty */
942 		/* RX_ALMOST_EMPTY,  */
943 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_almost_empty, 0x00000008);
944 		/* RX_ALMOST_FULL,  */
945 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_almost_full, 0x00000008);
946 
947 
948 		/* TX_SECTION_EMPTY,  */
949 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_section_empty, 0x00000008); /* 8 ? */
950 		/* TX_SECTION_FULL, 0 - store and forward, */
951 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_section_full, 0x0000000c);
952 		/* TX_ALMOST_EMPTY,  */
953 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_almost_empty, 0x00000008);
954 		/* TX_ALMOST_FULL,  */
955 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_almost_full, 0x00000008);
956 
957 		/* XAUI MAC control register */
958 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000000);
959 
960 		/* 1G MACSET 1G */
961 		/* taking sel_1000/sel_10 inputs from rgmii PHY, and not from register.
962 		 * disabling magic_packets detection in mac */
963 		al_reg_write32(&adapter->mac_regs_base->gen.mac_1g_cfg, 0x00000002);
964 		/* RGMII set 1G */
965 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00063910);
966 		al_reg_write32(&adapter->mac_regs_base->gen.rgmii_sel, 0xF);
967 		break;
968 	case AL_ETH_MAC_MODE_SGMII:
969 		if (adapter->rev_id > AL_ETH_REV_ID_2) {
970 			/* configure and enable the ASYNC FIFO between the MACs and the EC */
971 			/* TX min packet size */
972 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
973 			/* TX max packet size */
974 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
975 			/* TX input bus configuration */
976 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
977 			/* TX output bus configuration */
978 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00030020);
979 			/* TX Valid/ready configuration */
980 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000121);
981 			/* RX min packet size */
982 			/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
983 			/* RX max packet size */
984 			/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
985 			/* RX input bus configuration */
986 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00030020);
987 			/* RX output bus configuration */
988 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
989 			/* RX Valid/ready configuration */
990 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000212);
991 			/* V3 additional MAC selection */
992 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000000);
993 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000001);
994 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
995 			al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000000);
996 			/* ASYNC FIFO ENABLE */
997 			al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
998 			/* Timestamp_configuration */
999 			al_reg_write32(&adapter->mac_regs_base->gen_v3.spare,
1000 					ETH_MAC_GEN_V3_SPARE_CHICKEN_DISABLE_TIMESTAMP_STRETCH);
1001 		}
1002 
1003 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x40053210);
1004 
1005 		/* 1G MAC control register */
1006 		/* bit[0]  - TX_ENA - zeroed by default. Should be asserted by al_eth_mac_start
1007 		 * bit[1]  - RX_ENA - zeroed by default. Should be asserted by al_eth_mac_start
1008 		 * bit[3]  - ETH_SPEED - zeroed to enable 10/100 Mbps Ethernet
1009 		 * bit[4]  - PROMIS_EN - asserted to enable MAC promiscuous mode
1010 		 * bit[23] - CNTL_FRM-ENA - asserted to enable control frames
1011 		 * bit[24] - NO_LGTH_CHECK - asserted to disable length checks, which is done in the controller
1012 		 */
1013 		al_reg_write32(&adapter->mac_regs_base->mac_1g.cmd_cfg, 0x01800010);
1014 
1015 		/* RX_SECTION_EMPTY,  */
1016 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_section_empty, 0x00000000);
1017 		/* RX_SECTION_FULL,  */
1018 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_section_full, 0x0000000c); /* must be larger than almost empty */
1019 		/* RX_ALMOST_EMPTY,  */
1020 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_almost_empty, 0x00000008);
1021 		/* RX_ALMOST_FULL,  */
1022 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_almost_full, 0x00000008);
1023 
1024 
1025 		/* TX_SECTION_EMPTY,  */
1026 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_section_empty, 0x00000008); /* 8 ? */
1027 		/* TX_SECTION_FULL, 0 - store and forward, */
1028 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_section_full, 0x0000000c);
1029 		/* TX_ALMOST_EMPTY,  */
1030 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_almost_empty, 0x00000008);
1031 		/* TX_ALMOST_FULL,  */
1032 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_almost_full, 0x00000008);
1033 
1034 		/* XAUI MAC control register */
1035 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x000000c0);
1036 
1037 		/* 1G MACSET 1G */
1038 		/* taking sel_1000/sel_10 inputs from rgmii_converter, and not from register.
1039 		 * disabling magic_packets detection in mac */
1040 		al_reg_write32(&adapter->mac_regs_base->gen.mac_1g_cfg, 0x00000002);
1041 		/* SerDes configuration */
1042 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00063910);
1043 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0);
1044 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
1045 
1046 		// FAST AN -- Testing only
1047 #ifdef AL_HAL_ETH_FAST_AN
1048 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 0x00000012);
1049 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data, 0x00000040);
1050 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 0x00000013);
1051 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data, 0x00000000);
1052 #endif
1053 
1054 		/* Setting PCS i/f mode to SGMII (instead of default 1000Base-X) */
1055 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 0x00000014);
1056 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data, 0x0000000b);
1057 		/* setting dev_ability to have speed of 1000Mb, [11:10] = 2'b10 */
1058 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 0x00000004);
1059 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data, 0x000009A0);
1060 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
1061 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
1062 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
1063 		break;
1064 
1065 	case AL_ETH_MAC_MODE_SGMII_2_5G:
1066 		if (adapter->rev_id > AL_ETH_REV_ID_2) {
1067 			/* configure and enable the ASYNC FIFO between the MACs and the EC */
1068 			/* TX min packet size */
1069 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
1070 			/* TX max packet size */
1071 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
1072 			/* TX input bus configuration */
1073 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
1074 			/* TX output bus configuration */
1075 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00030020);
1076 			/* TX Valid/ready configuration */
1077 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
1078 			/* RX input bus configuration */
1079 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00030020);
1080 			/* RX output bus configuration */
1081 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
1082 			/* RX Valid/ready configuration */
1083 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000012);
1084 			/* V3 additional MAC selection */
1085 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000000);
1086 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
1087 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
1088 			al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000050);
1089 			/* ASYNC FIFO ENABLE */
1090 			al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
1091 		}
1092 
1093 		/* MAC register file */
1094 		al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022830);
1095 		/* XAUI MAC control register */
1096 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000001);
1097 		al_reg_write32(&adapter->mac_regs_base->mac_10g.if_mode, 0x00000028);
1098 		al_reg_write32(&adapter->mac_regs_base->mac_10g.control, 0x00001140);
1099 		/* RXAUI MAC control register */
1100 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
1101 /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
1102 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
1103 /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
1104 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
1105 				      ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00063910);
1106 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x40003210);
1107 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0);
1108 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
1109 
1110 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
1111 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
1112 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
1113 		break;
1114 
1115 	case AL_ETH_MAC_MODE_10GbE_Serial:
1116 		if (adapter->rev_id > AL_ETH_REV_ID_2) {
1117 			/* configure and enable the ASYNC FIFO between the MACs and the EC */
1118 			/* TX min packet size */
1119 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
1120 			/* TX max packet size */
1121 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
1122 			/* TX input bus configuration */
1123 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
1124 			/* TX output bus configuration */
1125 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00030020);
1126 			/* TX Valid/ready configuration */
1127 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
1128 			/* RX min packet size */
1129 			/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
1130 			/* RX max packet size */
1131 			/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
1132 			/* RX input bus configuration */
1133 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00030020);
1134 			/* RX output bus configuration */
1135 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
1136 			/* RX Valid/ready configuration */
1137 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000012);
1138 			/* V3 additional MAC selection */
1139 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000000);
1140 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
1141 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
1142 			al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000050);
1143 			/* ASYNC FIFO ENABLE */
1144 			al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
1145 		}
1146 
1147 		/* MAC register file */
1148 		al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810);
1149 		/* XAUI MAC control register */
1150 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
1151 		/* RXAUI MAC control register */
1152 		al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
1153 		al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
1154 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
1155 /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
1156 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
1157 /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
1158 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
1159 					~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00073910);
1160 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
1161 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0);
1162 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
1163 
1164 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
1165 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
1166 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
1167 		break;
1168 
1169 	case AL_ETH_MAC_MODE_KR_LL_25G:
1170 			/* select 25G SERDES lane 0 and lane 1 */
1171 		al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, 0x0002110f);
1172 
1173 		if (adapter->rev_id > AL_ETH_REV_ID_2) {
1174 			/* configure and enable the ASYNC FIFO between the MACs and the EC */
1175 			/* TX min packet size */
1176 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
1177 			/* TX max packet size */
1178 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
1179 			/* TX input bus configuration */
1180 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
1181 			/* TX output bus configuration */
1182 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00030020);
1183 			/* TX Valid/ready configuration */
1184 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
1185 			/* RX min packet size */
1186 			/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
1187 			/* RX max packet size */
1188 			/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
1189 			/* RX input bus configuration */
1190 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00030020);
1191 			/* RX output bus configuration */
1192 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
1193 			/* RX Valid/ready configuration */
1194 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000012);
1195 			/* V3 additional MAC selection */
1196 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000000);
1197 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
1198 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
1199 			al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x000000a0);
1200 			/* ASYNC FIFO ENABLE */
1201 			al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
1202 		}
1203 
1204 		/* MAC register file */
1205 		al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810);
1206 		/* XAUI MAC control register */
1207 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
1208 		/* RXAUI MAC control register */
1209 		al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
1210 		al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
1211 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
1212 /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
1213 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
1214 /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
1215 
1216 		if (adapter->serdes_lane == 0)
1217 			al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
1218 					~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00073910);
1219 		else
1220 			al_reg_write32(&adapter->mac_regs_base->gen.mux_sel, 0x00077910);
1221 
1222 		if (adapter->serdes_lane == 0)
1223 			al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
1224 		else
1225 			al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10000101);
1226 
1227 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0);
1228 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
1229 
1230 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
1231 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
1232 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
1233 
1234 		if (adapter->serdes_lane == 1)
1235 			al_reg_write32(&adapter->mac_regs_base->gen.los_sel, 0x101);
1236 
1237 
1238 		break;
1239 
1240 	case AL_ETH_MAC_MODE_10G_SGMII:
1241 		/* MAC register file */
1242 		al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810);
1243 
1244 		/* XAUI MAC control register */
1245 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000001);
1246 
1247 		al_reg_write32(&adapter->mac_regs_base->mac_10g.if_mode, 0x0000002b);
1248 		al_reg_write32(&adapter->mac_regs_base->mac_10g.control, 0x00009140);
1249 		// FAST AN -- Testing only
1250 #ifdef AL_HAL_ETH_FAST_AN
1251 		al_reg_write32(&adapter->mac_regs_base->mac_10g.link_timer_lo, 0x00000040);
1252 		al_reg_write32(&adapter->mac_regs_base->mac_10g.link_timer_hi, 0x00000000);
1253 #endif
1254 
1255 		/* RXAUI MAC control register */
1256 		al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
1257 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
1258 /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
1259 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
1260 /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
1261 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
1262 					~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00063910);
1263 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x40003210);
1264 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
1265 
1266 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
1267 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
1268 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
1269 		break;
1270 
1271 	case AL_ETH_MAC_MODE_XLG_LL_40G:
1272 		/* configure and enable the ASYNC FIFO between the MACs and the EC */
1273 		/* TX min packet size */
1274 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
1275 		/* TX max packet size */
1276 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
1277 		/* TX input bus configuration */
1278 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
1279 		/* TX output bus configuration */
1280 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00010040);
1281 		/* TX Valid/ready configuration */
1282 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
1283 		/* RX min packet size */
1284 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
1285 		/* RX max packet size */
1286 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
1287 		/* RX input bus configuration */
1288 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00010040);
1289 		/* RX output bus configuration */
1290 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
1291 		/* RX Valid/ready configuration */
1292 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000112);
1293 		/* V3 additional MAC selection */
1294 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000010);
1295 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
1296 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
1297 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000000);
1298 		/* ASYNC FIFO ENABLE */
1299 		al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
1300 
1301 		/* cmd_cfg */
1302 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, 0x00000008);
1303 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, 0x01022810);
1304 		/* speed_ability //Read-Only */
1305 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, 0x00000008); */
1306 		/* 40G capable */
1307 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, 0x00000002); */
1308 
1309 #ifdef AL_HAL_ETH_FAST_AN
1310 		al_eth_40g_pcs_reg_write(adapter, 0x00010004, 1023);
1311 		al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0xA04c);
1312 		al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0x204c);
1313 
1314 #endif
1315 
1316 		/* XAUI MAC control register */
1317 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
1318 					~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x06883910);
1319 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x0000040f);
1320 
1321 		/* MAC register file */
1322 /*		al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810); */
1323 		/* XAUI MAC control register */
1324 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
1325 		/* RXAUI MAC control register */
1326 		al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
1327 		al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
1328 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
1329 /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
1330 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
1331 /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
1332 /*		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00073910); *//* XLG_LL_40G change */
1333 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
1334 /*		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0); *//* XLG_LL_40G change */
1335 /*		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401); *//* XLG_LL_40G change */
1336 
1337 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
1338 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
1339 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
1340 		break;
1341 
1342 	case AL_ETH_MAC_MODE_XLG_LL_25G:
1343 		/* xgmii_mode: 0=xlgmii, 1=xgmii */
1344 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, 0x0080);
1345 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, 0x00000001);
1346 
1347 		/* configure and enable the ASYNC FIFO between the MACs and the EC */
1348 		/* TX min packet size */
1349 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
1350 		/* TX max packet size */
1351 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
1352 		/* TX input bus configuration */
1353 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
1354 		/* TX output bus configuration */
1355 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00010040);
1356 		/* TX Valid/ready configuration */
1357 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
1358 		/* RX min packet size */
1359 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
1360 		/* RX max packet size */
1361 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
1362 		/* RX input bus configuration */
1363 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00010040);
1364 		/* RX output bus configuration */
1365 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
1366 		/* RX Valid/ready configuration */
1367 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000112);
1368 		/* V3 additional MAC selection */
1369 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000010);
1370 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
1371 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
1372 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000000);
1373 		/* ASYNC FIFO ENABLE */
1374 		al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
1375 
1376 		/* cmd_cfg */
1377 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, 0x00000008);
1378 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, 0x01022810);
1379 		/* speed_ability //Read-Only */
1380 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, 0x00000008); */
1381 		/* 40G capable */
1382 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, 0x00000002); */
1383 
1384 		/* select the 25G serdes for lanes 0/1 */
1385 		al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, 0x0002110f);
1386 		/* configure the PCS to work with 2 lanes */
1387 		/* configure which two of the 4 PCS Lanes (VL) are combined to one RXLAUI lane */
1388 		/* use VL 0-2 for RXLAUI lane 0, use VL 1-3 for RXLAUI lane 1 */
1389 		al_eth_40g_pcs_reg_write(adapter, 0x00010008, 0x0d80);
1390 		/* configure the PCS to work 32 bit interface */
1391 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_cfg, 0x00440000);
1392 
1393 		/* disable MLD and move to clause 49 PCS: */
1394 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, 0xE);
1395 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, 0);
1396 
1397 #ifdef AL_HAL_ETH_FAST_AN
1398 		al_eth_40g_pcs_reg_write(adapter, 0x00010004, 1023);
1399 		al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0xA04c);
1400 		al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0x204c);
1401 #endif
1402 
1403 		/* XAUI MAC control register */
1404 		if (adapter->serdes_lane == 0)
1405 			al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
1406 					      ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x06883910);
1407 		else
1408 			al_reg_write32(&adapter->mac_regs_base->gen.mux_sel, 0x06803950);
1409 
1410 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x0000040f);
1411 
1412 		/* XAUI MAC control register */
1413 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
1414 		/* RXAUI MAC control register */
1415 		al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
1416 		al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
1417 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
1418 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
1419 		if (adapter->serdes_lane == 0)
1420 			al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
1421 		else
1422 			al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10000101);
1423 
1424 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
1425 					ETH_MAC_GEN_LED_CFG_SEL_MASK,
1426 					ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
1427 
1428 		if (adapter->serdes_lane == 1)
1429 			al_reg_write32(&adapter->mac_regs_base->gen.los_sel, 0x101);
1430 
1431 		break;
1432 
1433 	case AL_ETH_MAC_MODE_XLG_LL_50G:
1434 
1435 		/* configure and enable the ASYNC FIFO between the MACs and the EC */
1436 		/* TX min packet size */
1437 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
1438 		/* TX max packet size */
1439 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
1440 		/* TX input bus configuration */
1441 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
1442 		/* TX output bus configuration */
1443 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00010040);
1444 		/* TX Valid/ready configuration */
1445 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
1446 		/* RX min packet size */
1447 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
1448 		/* RX max packet size */
1449 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
1450 		/* RX input bus configuration */
1451 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00010040);
1452 		/* RX output bus configuration */
1453 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
1454 		/* RX Valid/ready configuration */
1455 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000112);
1456 		/* V3 additional MAC selection */
1457 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000010);
1458 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
1459 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
1460 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000000);
1461 		/* ASYNC FIFO ENABLE */
1462 		al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
1463 
1464 		/* cmd_cfg */
1465 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, 0x00000008);
1466 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, 0x01022810);
1467 		/* speed_ability //Read-Only */
1468 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, 0x00000008); */
1469 		/* 40G capable */
1470 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, 0x00000002); */
1471 
1472 		/* select the 25G serdes for lanes 0/1 */
1473 		al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, 0x0382110F);
1474 		/* configure the PCS to work with 2 lanes */
1475 		/* configure which two of the 4 PCS Lanes (VL) are combined to one RXLAUI lane */
1476 		/* use VL 0-2 for RXLAUI lane 0, use VL 1-3 for RXLAUI lane 1 */
1477 		al_eth_40g_pcs_reg_write(adapter, 0x00010008, 0x0d81);
1478 		/* configure the PCS to work 32 bit interface */
1479 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_cfg, 0x00440000);
1480 
1481 
1482 #ifdef AL_HAL_ETH_FAST_AN
1483 		al_eth_40g_pcs_reg_write(adapter, 0x00010004, 1023);
1484 		al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0xA04c);
1485 		al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0x204c);
1486 #endif
1487 
1488 		/* XAUI MAC control register */
1489 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x06883910);
1490 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x0000040f);
1491 
1492 		/* MAC register file */
1493 /*		al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810); */
1494 		/* XAUI MAC control register */
1495 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
1496 		/* RXAUI MAC control register */
1497 		al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
1498 		al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
1499 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
1500 /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
1501 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
1502 /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
1503 /*		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00073910); *//* XLG_LL_40G change */
1504 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
1505 /*		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0); *//* XLG_LL_40G change */
1506 /*		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401); *//* XLG_LL_40G change */
1507 
1508 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
1509 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
1510 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
1511 		break;
1512 
1513 
1514 	default:
1515 		al_err("Eth: unsupported MAC mode %d", mode);
1516 		return -EPERM;
1517 	}
1518 	adapter->mac_mode = mode;
1519 	al_info("configured MAC to %s mode:\n", al_eth_mac_mode_str(mode));
1520 
1521 	return 0;
1522 }
1523 
1524 /* start the mac */
1525 int al_eth_mac_start(struct al_hal_eth_adapter *adapter)
1526 {
1527 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
1528 		/* 1G MAC control register */
1529 		al_reg_write32_masked(&adapter->mac_regs_base->mac_1g.cmd_cfg,
1530 				ETH_1G_MAC_CMD_CFG_TX_ENA | ETH_1G_MAC_CMD_CFG_RX_ENA,
1531 				ETH_1G_MAC_CMD_CFG_TX_ENA | ETH_1G_MAC_CMD_CFG_RX_ENA);
1532 	} else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
1533 		/* 10G MAC control register  */
1534 		al_reg_write32_masked(&adapter->mac_regs_base->mac_10g.cmd_cfg,
1535 				ETH_10G_MAC_CMD_CFG_TX_ENA | ETH_10G_MAC_CMD_CFG_RX_ENA,
1536 				ETH_10G_MAC_CMD_CFG_TX_ENA | ETH_10G_MAC_CMD_CFG_RX_ENA);
1537 	} else {
1538 		uint32_t cmd_cfg;
1539 
1540 		cmd_cfg = al_eth_40g_mac_reg_read(adapter,
1541 				ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR);
1542 
1543 		cmd_cfg |= (ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_TX_ENA |
1544 			    ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_RX_ENA);
1545 
1546 		al_eth_40g_mac_reg_write(adapter,
1547 				ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR,
1548 				cmd_cfg);
1549 	}
1550 
1551 	return 0;
1552 }
1553 
1554 /* stop the mac */
1555 int al_eth_mac_stop(struct al_hal_eth_adapter *adapter)
1556 {
1557 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
1558 		/* 1G MAC control register */
1559 		al_reg_write32_masked(&adapter->mac_regs_base->mac_1g.cmd_cfg,
1560 				ETH_1G_MAC_CMD_CFG_TX_ENA | ETH_1G_MAC_CMD_CFG_RX_ENA,
1561 				0);
1562 	else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode))
1563 		/* 10G MAC control register  */
1564 		al_reg_write32_masked(&adapter->mac_regs_base->mac_10g.cmd_cfg,
1565 				ETH_10G_MAC_CMD_CFG_TX_ENA | ETH_10G_MAC_CMD_CFG_RX_ENA,
1566 				0);
1567 	else {
1568 		uint32_t cmd_cfg;
1569 
1570 		cmd_cfg = al_eth_40g_mac_reg_read(adapter,
1571 				ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR);
1572 
1573 		cmd_cfg &= ~(ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_TX_ENA |
1574 			    ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_RX_ENA);
1575 
1576 		al_eth_40g_mac_reg_write(adapter,
1577 				ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR,
1578 				cmd_cfg);
1579 	}
1580 
1581 	return 0;
1582 }
1583 
1584 void al_eth_gearbox_reset(struct al_hal_eth_adapter *adapter, al_bool tx_reset, al_bool rx_reset)
1585 {
1586 	uint32_t reg, orig_val;
1587 
1588 	/* Gearbox is exist only from revision 3 */
1589 	al_assert(adapter->rev_id > AL_ETH_REV_ID_2);
1590 
1591 	orig_val = al_reg_read32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl);
1592 	reg = orig_val;
1593 
1594 	if (tx_reset) {
1595 		reg |= (ETH_MAC_GEN_V3_EXT_SERDES_CTRL_LANE_0_TX_25_GS_SW_RESET |
1596 			ETH_MAC_GEN_V3_EXT_SERDES_CTRL_LANE_1_TX_25_GS_SW_RESET);
1597 	}
1598 
1599 	if (rx_reset) {
1600 		reg |= (ETH_MAC_GEN_V3_EXT_SERDES_CTRL_LANE_0_RX_25_GS_SW_RESET |
1601 			ETH_MAC_GEN_V3_EXT_SERDES_CTRL_LANE_1_RX_25_GS_SW_RESET);
1602 	}
1603 
1604 	al_dbg("%s: perform gearbox reset (Tx %d, Rx %d) \n", __func__, tx_reset, rx_reset);
1605 	al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, reg);
1606 
1607 	al_udelay(10);
1608 
1609 	al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, orig_val);
1610 }
1611 
1612 int al_eth_fec_enable(struct al_hal_eth_adapter *adapter, al_bool enable)
1613 {
1614 	if (adapter->rev_id <= AL_ETH_REV_ID_2)
1615 		return -1;
1616 
1617 	if (enable)
1618 		al_reg_write32_masked(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg,
1619 					(ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_RX |
1620 					 ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_TX),
1621 					(ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_RX |
1622 					 ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_TX));
1623 	else
1624 		al_reg_write32_masked(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg,
1625 					(ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_RX |
1626 					 ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_TX),
1627 					0);
1628 	return 0;
1629 }
1630 
1631 int al_eth_fec_stats_get(struct al_hal_eth_adapter *adapter,
1632 			uint32_t *corrected, uint32_t *uncorrectable)
1633 {
1634 	if (adapter->rev_id <= AL_ETH_REV_ID_2)
1635 		return -1;
1636 
1637 	*corrected = al_reg_read32(&adapter->mac_regs_base->stat.v3_pcs_10g_ll_cerr);
1638 	*uncorrectable = al_reg_read32(&adapter->mac_regs_base->stat.v3_pcs_10g_ll_ncerr);
1639 
1640 	return 0;
1641 }
1642 
1643 
1644 int al_eth_capabilities_get(struct al_hal_eth_adapter *adapter, struct al_eth_capabilities *caps)
1645 {
1646 	al_assert(caps);
1647 
1648 	caps->speed_10_HD = AL_FALSE;
1649 	caps->speed_10_FD = AL_FALSE;
1650 	caps->speed_100_HD = AL_FALSE;
1651 	caps->speed_100_FD = AL_FALSE;
1652 	caps->speed_1000_HD = AL_FALSE;
1653 	caps->speed_1000_FD = AL_FALSE;
1654 	caps->speed_10000_HD = AL_FALSE;
1655 	caps->speed_10000_FD = AL_FALSE;
1656 	caps->pfc = AL_FALSE;
1657 	caps->eee = AL_FALSE;
1658 
1659 	switch (adapter->mac_mode) {
1660 		case AL_ETH_MAC_MODE_RGMII:
1661 		case AL_ETH_MAC_MODE_SGMII:
1662 			caps->speed_10_HD = AL_TRUE;
1663 			caps->speed_10_FD = AL_TRUE;
1664 			caps->speed_100_HD = AL_TRUE;
1665 			caps->speed_100_FD = AL_TRUE;
1666 			caps->speed_1000_FD = AL_TRUE;
1667 			caps->eee = AL_TRUE;
1668 			break;
1669 		case AL_ETH_MAC_MODE_10GbE_Serial:
1670 			caps->speed_10000_FD = AL_TRUE;
1671 			caps->pfc = AL_TRUE;
1672 			break;
1673 		default:
1674 		al_err("Eth: unsupported MAC mode %d", adapter->mac_mode);
1675 		return -EPERM;
1676 	}
1677 	return 0;
1678 }
1679 
1680 static void al_eth_mac_link_config_1g_mac(
1681 				struct al_hal_eth_adapter *adapter,
1682 				al_bool force_1000_base_x,
1683 				al_bool an_enable,
1684 				uint32_t speed,
1685 				al_bool full_duplex)
1686 {
1687 	uint32_t mac_ctrl;
1688 	uint32_t sgmii_ctrl = 0;
1689 	uint32_t sgmii_if_mode = 0;
1690 	uint32_t rgmii_ctrl = 0;
1691 
1692 	mac_ctrl = al_reg_read32(&adapter->mac_regs_base->mac_1g.cmd_cfg);
1693 
1694 	if (adapter->mac_mode == AL_ETH_MAC_MODE_SGMII) {
1695 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr,
1696 			       ETH_MAC_SGMII_REG_ADDR_CTRL_REG);
1697 		sgmii_ctrl = al_reg_read32(&adapter->mac_regs_base->sgmii.reg_data);
1698 		/*
1699 		 * in case bit 0 is off in sgmii_if_mode register all the other
1700 		 * bits are ignored.
1701 		 */
1702 		if (force_1000_base_x == AL_FALSE)
1703 			sgmii_if_mode = ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_EN;
1704 
1705 		if (an_enable == AL_TRUE) {
1706 			sgmii_if_mode |= ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_AN;
1707 			sgmii_ctrl |= ETH_MAC_SGMII_REG_DATA_CTRL_AN_ENABLE;
1708 		} else {
1709 			sgmii_ctrl &= ~(ETH_MAC_SGMII_REG_DATA_CTRL_AN_ENABLE);
1710 		}
1711 	}
1712 
1713 	if (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII) {
1714 		/*
1715 		 * Use the speed provided by the MAC instead of the PHY
1716 		 */
1717 		rgmii_ctrl = al_reg_read32(&adapter->mac_regs_base->gen.rgmii_cfg);
1718 
1719 		AL_REG_MASK_CLEAR(rgmii_ctrl, ETH_MAC_GEN_RGMII_CFG_ENA_AUTO);
1720 		AL_REG_MASK_CLEAR(rgmii_ctrl, ETH_MAC_GEN_RGMII_CFG_SET_1000_SEL);
1721 		AL_REG_MASK_CLEAR(rgmii_ctrl, ETH_MAC_GEN_RGMII_CFG_SET_10_SEL);
1722 
1723 		al_reg_write32(&adapter->mac_regs_base->gen.rgmii_cfg, rgmii_ctrl);
1724 	}
1725 
1726 	if (full_duplex == AL_TRUE) {
1727 		AL_REG_MASK_CLEAR(mac_ctrl, ETH_1G_MAC_CMD_CFG_HD_EN);
1728 	} else {
1729 		AL_REG_MASK_SET(mac_ctrl, ETH_1G_MAC_CMD_CFG_HD_EN);
1730 		sgmii_if_mode |= ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_DUPLEX;
1731 	}
1732 
1733 	if (speed == 1000) {
1734 		AL_REG_MASK_SET(mac_ctrl, ETH_1G_MAC_CMD_CFG_1G_SPD);
1735 		sgmii_if_mode |= ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_SPEED_1000;
1736 	} else {
1737 		AL_REG_MASK_CLEAR(mac_ctrl, ETH_1G_MAC_CMD_CFG_1G_SPD);
1738 		if (speed == 10) {
1739 			AL_REG_MASK_SET(mac_ctrl, ETH_1G_MAC_CMD_CFG_10M_SPD);
1740 		} else {
1741 			sgmii_if_mode |= ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_SPEED_100;
1742 			AL_REG_MASK_CLEAR(mac_ctrl, ETH_1G_MAC_CMD_CFG_10M_SPD);
1743 		}
1744 	}
1745 
1746 	if (adapter->mac_mode == AL_ETH_MAC_MODE_SGMII) {
1747 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr,
1748 			       ETH_MAC_SGMII_REG_ADDR_IF_MODE_REG);
1749 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data,
1750 			       sgmii_if_mode);
1751 
1752 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr,
1753 			       ETH_MAC_SGMII_REG_ADDR_CTRL_REG);
1754 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data,
1755 			       sgmii_ctrl);
1756 	}
1757 
1758 	al_reg_write32(&adapter->mac_regs_base->mac_1g.cmd_cfg, mac_ctrl);
1759 }
1760 
1761 static void al_eth_mac_link_config_10g_mac(
1762 				struct al_hal_eth_adapter *adapter,
1763 				al_bool force_1000_base_x,
1764 				al_bool an_enable,
1765 				uint32_t speed,
1766 				al_bool full_duplex)
1767 {
1768 	uint32_t if_mode;
1769 	uint32_t val;
1770 
1771 	if_mode = al_reg_read32(&adapter->mac_regs_base->mac_10g.if_mode);
1772 
1773 	if (force_1000_base_x) {
1774 		uint32_t control;
1775 
1776 		AL_REG_MASK_CLEAR(if_mode, ETH_10G_MAC_IF_MODE_SGMII_EN_MASK);
1777 
1778 		control = al_reg_read32(&adapter->mac_regs_base->mac_10g.control);
1779 
1780 		if (an_enable)
1781 			AL_REG_MASK_SET(control, ETH_10G_MAC_CONTROL_AN_EN_MASK);
1782 		else
1783 			AL_REG_MASK_CLEAR(control, ETH_10G_MAC_CONTROL_AN_EN_MASK);
1784 
1785 		al_reg_write32(&adapter->mac_regs_base->mac_10g.control, control);
1786 
1787 	} else {
1788 		AL_REG_MASK_SET(if_mode, ETH_10G_MAC_IF_MODE_SGMII_EN_MASK);
1789 		if (an_enable) {
1790 			AL_REG_MASK_SET(if_mode, ETH_10G_MAC_IF_MODE_SGMII_AN_MASK);
1791 		} else {
1792 			AL_REG_MASK_CLEAR(if_mode, ETH_10G_MAC_IF_MODE_SGMII_AN_MASK);
1793 
1794 			if (speed == 1000)
1795 				val = ETH_10G_MAC_IF_MODE_SGMII_SPEED_1G;
1796 			else if (speed == 100)
1797 				val = ETH_10G_MAC_IF_MODE_SGMII_SPEED_100M;
1798 			else
1799 				val = ETH_10G_MAC_IF_MODE_SGMII_SPEED_10M;
1800 
1801 			AL_REG_FIELD_SET(if_mode,
1802 					 ETH_10G_MAC_IF_MODE_SGMII_SPEED_MASK,
1803 					 ETH_10G_MAC_IF_MODE_SGMII_SPEED_SHIFT,
1804 					 val);
1805 
1806 			AL_REG_FIELD_SET(if_mode,
1807 					 ETH_10G_MAC_IF_MODE_SGMII_DUPLEX_MASK,
1808 					 ETH_10G_MAC_IF_MODE_SGMII_DUPLEX_SHIFT,
1809 					 ((full_duplex) ?
1810 						ETH_10G_MAC_IF_MODE_SGMII_DUPLEX_FULL :
1811 						ETH_10G_MAC_IF_MODE_SGMII_DUPLEX_HALF));
1812 		}
1813 	}
1814 
1815 	al_reg_write32(&adapter->mac_regs_base->mac_10g.if_mode, if_mode);
1816 }
1817 
1818 /* update link speed and duplex mode */
1819 int al_eth_mac_link_config(struct al_hal_eth_adapter *adapter,
1820 			   al_bool force_1000_base_x,
1821 			   al_bool an_enable,
1822 			   uint32_t speed,
1823 			   al_bool full_duplex)
1824 {
1825 	if ((!AL_ETH_IS_1G_MAC(adapter->mac_mode)) &&
1826 		(adapter->mac_mode != AL_ETH_MAC_MODE_SGMII_2_5G)) {
1827 		al_err("eth [%s]: this function not supported in this mac mode.\n",
1828 			       adapter->name);
1829 		return -EINVAL;
1830 	}
1831 
1832 	if ((adapter->mac_mode != AL_ETH_MAC_MODE_RGMII) && (an_enable)) {
1833 		/*
1834 		 * an_enable is not relevant to RGMII mode.
1835 		 * in AN mode speed and duplex aren't relevant.
1836 		 */
1837 		al_info("eth [%s]: set auto negotiation to enable\n", adapter->name);
1838 	} else {
1839 		al_info("eth [%s]: set link speed to %dMbps. %s duplex.\n", adapter->name,
1840 			speed, full_duplex == AL_TRUE ? "full" : "half");
1841 
1842 		if ((speed != 10) && (speed != 100) && (speed != 1000)) {
1843 			al_err("eth [%s]: bad speed parameter (%d).\n",
1844 				       adapter->name, speed);
1845 			return -EINVAL;
1846 		}
1847 		if ((speed == 1000) && (full_duplex == AL_FALSE)) {
1848 			al_err("eth [%s]: half duplex in 1Gbps is not supported.\n",
1849 				       adapter->name);
1850 			return -EINVAL;
1851 		}
1852 	}
1853 
1854 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
1855 		al_eth_mac_link_config_1g_mac(adapter,
1856 					      force_1000_base_x,
1857 					      an_enable,
1858 					      speed,
1859 					      full_duplex);
1860 	else
1861 		al_eth_mac_link_config_10g_mac(adapter,
1862 					       force_1000_base_x,
1863 					       an_enable,
1864 					       speed,
1865 					       full_duplex);
1866 
1867 	return 0;
1868 }
1869 
1870 int al_eth_mac_loopback_config(struct al_hal_eth_adapter *adapter, int enable)
1871 {
1872 	const char *state = (enable) ? "enable" : "disable";
1873 
1874 	al_dbg("eth [%s]: loopback %s\n", adapter->name, state);
1875 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
1876 		uint32_t reg;
1877 		reg = al_reg_read32(&adapter->mac_regs_base->mac_1g.cmd_cfg);
1878 		if (enable)
1879 			reg |= AL_BIT(15);
1880 		else
1881 			reg &= ~AL_BIT(15);
1882 		al_reg_write32(&adapter->mac_regs_base->mac_1g.cmd_cfg, reg);
1883 	} else if ((AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode))
1884 			&& (adapter->rev_id == AL_ETH_REV_ID_3)) {
1885 		uint32_t reg;
1886 		al_reg_write16(
1887 			(uint16_t *)&adapter->mac_regs_base->kr.pcs_addr, ETH_MAC_KR_PCS_CONTROL_1_ADDR);
1888 		reg = al_reg_read16(
1889 			(uint16_t *)&adapter->mac_regs_base->kr.pcs_data);
1890 		if (enable)
1891 			reg |= AL_BIT(14);
1892 		else
1893 			reg &= ~AL_BIT(14);
1894 		al_reg_write16(
1895 			(uint16_t *)&adapter->mac_regs_base->kr.pcs_addr, ETH_MAC_KR_PCS_CONTROL_1_ADDR);
1896 		al_reg_write16(
1897 			(uint16_t *)&adapter->mac_regs_base->kr.pcs_data, reg);
1898 	} else if (adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_40G ||
1899 			(adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_50G)) {
1900 		uint32_t reg;
1901 		reg = al_eth_40g_pcs_reg_read(adapter, ETH_MAC_GEN_V3_PCS_40G_CONTROL_STATUS_ADDR);
1902 		if (enable)
1903 			reg |= AL_BIT(14);
1904 		else
1905 			reg &= ~AL_BIT(14);
1906 		al_eth_40g_pcs_reg_write(adapter, ETH_MAC_GEN_V3_PCS_40G_CONTROL_STATUS_ADDR, reg);
1907 	} else {
1908 		al_err("Eth: mac loopback not supported in this mode %d", adapter->mac_mode);
1909 		return -EPERM;
1910 	}
1911 	return 0;
1912 }
1913 
1914 /* MDIO */
1915 int al_eth_mdio_config(
1916 	struct al_hal_eth_adapter	*adapter,
1917 	enum al_eth_mdio_type		mdio_type,
1918 	al_bool				shared_mdio_if,
1919 	enum al_eth_ref_clk_freq	ref_clk_freq,
1920 	unsigned int			mdio_clk_freq_khz)
1921 {
1922 	enum al_eth_mdio_if mdio_if = AL_ETH_MDIO_IF_10G_MAC;
1923 	const char *if_name = (mdio_if == AL_ETH_MDIO_IF_1G_MAC) ? "10/100/1G MAC" : "10G MAC";
1924 	const char *type_name = (mdio_type == AL_ETH_MDIO_TYPE_CLAUSE_22) ? "Clause 22" : "Clause 45";
1925 	const char *shared_name = (shared_mdio_if == AL_TRUE) ? "Yes" : "No";
1926 
1927 	unsigned int ref_clk_freq_khz;
1928 	uint32_t val;
1929 
1930 	al_dbg("eth [%s]: mdio config: interface %s. type %s. shared: %s\n", adapter->name, if_name, type_name, shared_name);
1931 	adapter->shared_mdio_if = shared_mdio_if;
1932 
1933 	val = al_reg_read32(&adapter->mac_regs_base->gen.cfg);
1934 	al_dbg("eth [%s]: mdio config: 10G mac \n", adapter->name);
1935 
1936 	switch(mdio_if)
1937 	{
1938 		case AL_ETH_MDIO_IF_1G_MAC:
1939 			val &= ~AL_BIT(10);
1940 			break;
1941 		case AL_ETH_MDIO_IF_10G_MAC:
1942 			val |= AL_BIT(10);
1943 			break;
1944 	}
1945 	al_reg_write32(&adapter->mac_regs_base->gen.cfg, val);
1946 	adapter->mdio_if = mdio_if;
1947 
1948 
1949 	if (mdio_if == AL_ETH_MDIO_IF_10G_MAC)
1950 	{
1951 		val = al_reg_read32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status);
1952 		switch(mdio_type)
1953 		{
1954 			case AL_ETH_MDIO_TYPE_CLAUSE_22:
1955 				val &= ~AL_BIT(6);
1956 				break;
1957 			case AL_ETH_MDIO_TYPE_CLAUSE_45:
1958 				val |= AL_BIT(6);
1959 				break;
1960 		}
1961 
1962 		/* set clock div to get 'mdio_clk_freq_khz' */
1963 		switch (ref_clk_freq) {
1964 		default:
1965 			al_err("eth [%s]: %s: invalid reference clock frequency"
1966 				" (%d)\n",
1967 				adapter->name, __func__, ref_clk_freq);
1968 		case AL_ETH_REF_FREQ_375_MHZ:
1969 			ref_clk_freq_khz = 375000;
1970 			break;
1971 		case AL_ETH_REF_FREQ_187_5_MHZ:
1972 			ref_clk_freq_khz = 187500;
1973 			break;
1974 		case AL_ETH_REF_FREQ_250_MHZ:
1975 			ref_clk_freq_khz = 250000;
1976 			break;
1977 		case AL_ETH_REF_FREQ_500_MHZ:
1978 			ref_clk_freq_khz = 500000;
1979 			break;
1980                 case AL_ETH_REF_FREQ_428_MHZ:
1981                         ref_clk_freq_khz = 428000;
1982                         break;
1983 		};
1984 
1985 		val &= ~(0x1FF << 7);
1986 		val |= (ref_clk_freq_khz / (2 * mdio_clk_freq_khz)) << 7;
1987 		AL_REG_FIELD_SET(val, ETH_10G_MAC_MDIO_CFG_HOLD_TIME_MASK,
1988 				 ETH_10G_MAC_MDIO_CFG_HOLD_TIME_SHIFT,
1989 				 ETH_10G_MAC_MDIO_CFG_HOLD_TIME_7_CLK);
1990 		al_reg_write32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status, val);
1991 	}else{
1992 		if(mdio_type != AL_ETH_MDIO_TYPE_CLAUSE_22) {
1993 			al_err("eth [%s] mdio type not supported for this interface\n",
1994 				 adapter->name);
1995 			return -EINVAL;
1996 		}
1997 	}
1998 	adapter->mdio_type = mdio_type;
1999 
2000 	return 0;
2001 }
2002 
2003 static int al_eth_mdio_1g_mac_read(struct al_hal_eth_adapter *adapter,
2004 			    uint32_t phy_addr __attribute__((__unused__)),
2005 			    uint32_t reg, uint16_t *val)
2006 {
2007 	*val = al_reg_read32(
2008 		&adapter->mac_regs_base->mac_1g.phy_regs_base + reg);
2009 	return 0;
2010 }
2011 
2012 static int al_eth_mdio_1g_mac_write(struct al_hal_eth_adapter *adapter,
2013 			     uint32_t phy_addr __attribute__((__unused__)),
2014 			     uint32_t reg, uint16_t val)
2015 {
2016 	al_reg_write32(
2017 		&adapter->mac_regs_base->mac_1g.phy_regs_base + reg, val);
2018 	return 0;
2019 }
2020 
2021 static int al_eth_mdio_10g_mac_wait_busy(struct al_hal_eth_adapter *adapter)
2022 {
2023 	int	count = 0;
2024 	uint32_t mdio_cfg_status;
2025 
2026 	do {
2027 		mdio_cfg_status = al_reg_read32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status);
2028 /*
2029 		if (mdio_cfg_status & AL_BIT(1)){ //error
2030 			al_err(" %s mdio read failed on error. phy_addr 0x%x reg 0x%x\n",
2031 				udma_params.name, phy_addr, reg);
2032 			return -EIO;
2033 		}*/
2034 		if (mdio_cfg_status & AL_BIT(0)){
2035 			if (count > 0)
2036 				al_dbg("eth [%s] mdio: still busy!\n", adapter->name);
2037 		}else{
2038 			return 0;
2039 		}
2040 		al_udelay(AL_ETH_MDIO_DELAY_PERIOD);
2041 	}while(count++ < AL_ETH_MDIO_DELAY_COUNT);
2042 
2043 	return -ETIMEDOUT;
2044 }
2045 
2046 static int al_eth_mdio_10g_mac_type22(
2047 	struct al_hal_eth_adapter *adapter,
2048 	int read, uint32_t phy_addr, uint32_t reg, uint16_t *val)
2049 {
2050 	int rc;
2051 	const char *op = (read == 1) ? "read":"write";
2052 	uint32_t mdio_cfg_status;
2053 	uint16_t mdio_cmd;
2054 
2055 	//wait if the HW is busy
2056 	rc = al_eth_mdio_10g_mac_wait_busy(adapter);
2057 	if (rc) {
2058 		al_err(" eth [%s] mdio %s failed. HW is busy\n", adapter->name, op);
2059 		return rc;
2060 	}
2061 
2062 	mdio_cmd = (uint16_t)(0x1F & reg);
2063 	mdio_cmd |= (0x1F & phy_addr) << 5;
2064 
2065 	if (read)
2066 		mdio_cmd |= AL_BIT(15); //READ command
2067 
2068 	al_reg_write16(&adapter->mac_regs_base->mac_10g.mdio_cmd,
2069 			mdio_cmd);
2070 	if (!read)
2071 		al_reg_write16(&adapter->mac_regs_base->mac_10g.mdio_data,
2072 				*val);
2073 
2074 	//wait for the busy to clear
2075 	rc = al_eth_mdio_10g_mac_wait_busy(adapter);
2076 	if (rc != 0) {
2077 		al_err(" %s mdio %s failed on timeout\n", adapter->name, op);
2078 		return -ETIMEDOUT;
2079 	}
2080 
2081 	mdio_cfg_status = al_reg_read32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status);
2082 
2083 	if (mdio_cfg_status & AL_BIT(1)){ //error
2084 		al_err(" %s mdio %s failed on error. phy_addr 0x%x reg 0x%x\n",
2085 			adapter->name, op, phy_addr, reg);
2086 			return -EIO;
2087 	}
2088 	if (read)
2089 		*val = al_reg_read16(
2090 			(uint16_t *)&adapter->mac_regs_base->mac_10g.mdio_data);
2091 	return 0;
2092 }
2093 
2094 static int al_eth_mdio_10g_mac_type45(
2095 	struct al_hal_eth_adapter *adapter,
2096 	int read, uint32_t port_addr, uint32_t device, uint32_t reg, uint16_t *val)
2097 {
2098 	int rc;
2099 	const char *op = (read == 1) ? "read":"write";
2100 	uint32_t mdio_cfg_status;
2101 	uint16_t mdio_cmd;
2102 
2103 	//wait if the HW is busy
2104 	rc = al_eth_mdio_10g_mac_wait_busy(adapter);
2105 	if (rc) {
2106 		al_err(" %s mdio %s failed. HW is busy\n", adapter->name, op);
2107 		return rc;
2108 	}
2109 	// set command register
2110 	mdio_cmd = (uint16_t)(0x1F & device);
2111 	mdio_cmd |= (0x1F & port_addr) << 5;
2112 	al_reg_write16(&adapter->mac_regs_base->mac_10g.mdio_cmd,
2113 			mdio_cmd);
2114 
2115 	// send address frame
2116 	al_reg_write16(&adapter->mac_regs_base->mac_10g.mdio_regaddr, reg);
2117 	//wait for the busy to clear
2118 	rc = al_eth_mdio_10g_mac_wait_busy(adapter);
2119 	if (rc) {
2120 		al_err(" %s mdio %s (address frame) failed on timeout\n", adapter->name, op);
2121 		return rc;
2122 	}
2123 
2124 	// if read, write again to the command register with READ bit set
2125 	if (read) {
2126 		mdio_cmd |= AL_BIT(15); //READ command
2127 		al_reg_write16(
2128 			(uint16_t *)&adapter->mac_regs_base->mac_10g.mdio_cmd,
2129 			mdio_cmd);
2130 	} else {
2131 		al_reg_write16(
2132 			(uint16_t *)&adapter->mac_regs_base->mac_10g.mdio_data,
2133 			*val);
2134 	}
2135 	//wait for the busy to clear
2136 	rc = al_eth_mdio_10g_mac_wait_busy(adapter);
2137 	if (rc) {
2138 		al_err(" %s mdio %s failed on timeout\n", adapter->name, op);
2139 		return rc;
2140 	}
2141 
2142 	mdio_cfg_status = al_reg_read32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status);
2143 
2144 	if (mdio_cfg_status & AL_BIT(1)){ //error
2145 		al_err(" %s mdio %s failed on error. port 0x%x, device 0x%x reg 0x%x\n",
2146 			adapter->name, op, port_addr, device, reg);
2147 			return -EIO;
2148 	}
2149 	if (read)
2150 		*val = al_reg_read16(
2151 			(uint16_t *)&adapter->mac_regs_base->mac_10g.mdio_data);
2152 	return 0;
2153 }
2154 
2155 /**
2156  * acquire mdio interface ownership
2157  * when mdio interface shared between multiple eth controllers, this function waits until the ownership granted for this controller.
2158  * this function does nothing when the mdio interface is used only by this controller.
2159  *
2160  * @param adapter
2161  * @return 0 on success, -ETIMEDOUT  on timeout.
2162  */
2163 static int al_eth_mdio_lock(struct al_hal_eth_adapter *adapter)
2164 {
2165 	int	count = 0;
2166 	uint32_t mdio_ctrl_1;
2167 
2168 	if (adapter->shared_mdio_if == AL_FALSE)
2169 		return 0; /* nothing to do when interface is not shared */
2170 
2171 	do {
2172 		mdio_ctrl_1 = al_reg_read32(&adapter->mac_regs_base->gen.mdio_ctrl_1);
2173 /*
2174 		if (mdio_cfg_status & AL_BIT(1)){ //error
2175 			al_err(" %s mdio read failed on error. phy_addr 0x%x reg 0x%x\n",
2176 				udma_params.name, phy_addr, reg);
2177 			return -EIO;
2178 		}*/
2179 		if (mdio_ctrl_1 & AL_BIT(0)){
2180 			if (count > 0)
2181 				al_dbg("eth %s mdio interface still busy!\n", adapter->name);
2182 		}else{
2183 			return 0;
2184 		}
2185 		al_udelay(AL_ETH_MDIO_DELAY_PERIOD);
2186 	}while(count++ < (AL_ETH_MDIO_DELAY_COUNT * 4));
2187 	al_err(" %s mdio failed to take ownership. MDIO info reg: 0x%08x\n",
2188 		adapter->name, al_reg_read32(&adapter->mac_regs_base->gen.mdio_1));
2189 
2190 	return -ETIMEDOUT;
2191 }
2192 
2193 /**
2194  * free mdio interface ownership
2195  * when mdio interface shared between multiple eth controllers, this function releases the ownership granted for this controller.
2196  * this function does nothing when the mdio interface is used only by this controller.
2197  *
2198  * @param adapter
2199  * @return 0.
2200  */
2201 static int al_eth_mdio_free(struct al_hal_eth_adapter *adapter)
2202 {
2203 	if (adapter->shared_mdio_if == AL_FALSE)
2204 		return 0; /* nothing to do when interface is not shared */
2205 
2206 	al_reg_write32(&adapter->mac_regs_base->gen.mdio_ctrl_1, 0);
2207 
2208 	/*
2209 	 * Addressing RMN: 2917
2210 	 *
2211 	 * RMN description:
2212 	 * The HW spin-lock is stateless and doesn't maintain any scheduling
2213 	 * policy.
2214 	 *
2215 	 * Software flow:
2216 	 * After getting the lock wait 2 times the delay period in order to give
2217 	 * the other port chance to take the lock and prevent starvation.
2218 	 * This is not scalable to more than two ports.
2219 	 */
2220 	al_udelay(2 * AL_ETH_MDIO_DELAY_PERIOD);
2221 
2222 	return 0;
2223 }
2224 
2225 int al_eth_mdio_read(struct al_hal_eth_adapter *adapter, uint32_t phy_addr, uint32_t device, uint32_t reg, uint16_t *val)
2226 {
2227 	int rc;
2228 	rc = al_eth_mdio_lock(adapter);
2229 
2230 	/*"interface ownership taken"*/
2231 	if (rc)
2232 		return rc;
2233 
2234 	if (adapter->mdio_if == AL_ETH_MDIO_IF_1G_MAC)
2235 		rc = al_eth_mdio_1g_mac_read(adapter, phy_addr, reg, val);
2236 	else
2237 		if (adapter->mdio_type == AL_ETH_MDIO_TYPE_CLAUSE_22)
2238 			rc = al_eth_mdio_10g_mac_type22(adapter, 1, phy_addr, reg, val);
2239 		else
2240 			rc = al_eth_mdio_10g_mac_type45(adapter, 1, phy_addr, device, reg, val);
2241 
2242 	al_eth_mdio_free(adapter);
2243 	al_dbg("eth mdio read: phy_addr %x, device %x, reg %x val %x\n", phy_addr, device, reg, *val);
2244 	return rc;
2245 }
2246 
2247 int al_eth_mdio_write(struct al_hal_eth_adapter *adapter, uint32_t phy_addr, uint32_t device, uint32_t reg, uint16_t val)
2248 {
2249 	int rc;
2250 	al_dbg("eth mdio write: phy_addr %x, device %x, reg %x, val %x\n", phy_addr, device, reg, val);
2251 	rc = al_eth_mdio_lock(adapter);
2252 	/* interface ownership taken */
2253 	if (rc)
2254 		return rc;
2255 
2256 	if (adapter->mdio_if == AL_ETH_MDIO_IF_1G_MAC)
2257 		rc = al_eth_mdio_1g_mac_write(adapter, phy_addr, reg, val);
2258 	else
2259 		if (adapter->mdio_type == AL_ETH_MDIO_TYPE_CLAUSE_22)
2260 			rc = al_eth_mdio_10g_mac_type22(adapter, 0, phy_addr, reg, &val);
2261 		else
2262 			rc = al_eth_mdio_10g_mac_type45(adapter, 0, phy_addr, device, reg, &val);
2263 
2264 	al_eth_mdio_free(adapter);
2265 	return rc;
2266 }
2267 
2268 static void al_dump_tx_desc(union al_udma_desc *tx_desc)
2269 {
2270 	uint32_t *ptr = (uint32_t *)tx_desc;
2271 	al_dbg("eth tx desc:\n");
2272 	al_dbg("0x%08x\n", *(ptr++));
2273 	al_dbg("0x%08x\n", *(ptr++));
2274 	al_dbg("0x%08x\n", *(ptr++));
2275 	al_dbg("0x%08x\n", *(ptr++));
2276 }
2277 
2278 static void
2279 al_dump_tx_pkt(struct al_udma_q *tx_dma_q, struct al_eth_pkt *pkt)
2280 {
2281 	const char *tso = (pkt->flags & AL_ETH_TX_FLAGS_TSO) ? "TSO" : "";
2282 	const char *l3_csum = (pkt->flags & AL_ETH_TX_FLAGS_IPV4_L3_CSUM) ? "L3 CSUM" : "";
2283 	const char *l4_csum = (pkt->flags & AL_ETH_TX_FLAGS_L4_CSUM) ?
2284 	  ((pkt->flags & AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM) ? "L4 PARTIAL CSUM" : "L4 FULL CSUM") : "";
2285 	const char *fcs = (pkt->flags & AL_ETH_TX_FLAGS_L2_DIS_FCS) ? "Disable FCS" : "";
2286 	const char *ptp = (pkt->flags & AL_ETH_TX_FLAGS_TS) ? "TX_PTP" : "";
2287 	const char *l3_proto_name = "unknown";
2288 	const char *l4_proto_name = "unknown";
2289 	const char *outer_l3_proto_name = "N/A";
2290 	const char *tunnel_mode = (((pkt->tunnel_mode &
2291 				AL_ETH_TUNNEL_WITH_UDP) == AL_ETH_TUNNEL_WITH_UDP) ?
2292 				"TUNNEL_WITH_UDP" :
2293 				(((pkt->tunnel_mode &
2294 				AL_ETH_TUNNEL_NO_UDP) == AL_ETH_TUNNEL_NO_UDP) ?
2295 				"TUNNEL_NO_UDP" : ""));
2296 	uint32_t total_len = 0;
2297 	int i;
2298 
2299 	al_dbg("[%s %d]: flags: %s %s %s %s %s %s\n", tx_dma_q->udma->name, tx_dma_q->qid,
2300 		 tso, l3_csum, l4_csum, fcs, ptp, tunnel_mode);
2301 
2302 	switch (pkt->l3_proto_idx) {
2303 	case AL_ETH_PROTO_ID_IPv4:
2304 		l3_proto_name = "IPv4";
2305 		break;
2306 	case AL_ETH_PROTO_ID_IPv6:
2307 		l3_proto_name = "IPv6";
2308 		break;
2309 	default:
2310 		l3_proto_name = "unknown";
2311 		break;
2312 	}
2313 
2314 	switch (pkt->l4_proto_idx) {
2315 	case AL_ETH_PROTO_ID_TCP:
2316 		l4_proto_name = "TCP";
2317 		break;
2318 	case AL_ETH_PROTO_ID_UDP:
2319 		l4_proto_name = "UDP";
2320 		break;
2321 	default:
2322 		l4_proto_name = "unknown";
2323 		break;
2324 	}
2325 
2326 	switch (pkt->outer_l3_proto_idx) {
2327 	case AL_ETH_PROTO_ID_IPv4:
2328 		outer_l3_proto_name = "IPv4";
2329 		break;
2330 	case AL_ETH_PROTO_ID_IPv6:
2331 		outer_l3_proto_name = "IPv6";
2332 		break;
2333 	default:
2334 		outer_l3_proto_name = "N/A";
2335 		break;
2336 	}
2337 
2338 	al_dbg("[%s %d]: L3 proto: %d (%s). L4 proto: %d (%s). Outer_L3 proto: %d (%s). vlan source count %d. mod add %d. mod del %d\n",
2339 			tx_dma_q->udma->name, tx_dma_q->qid, pkt->l3_proto_idx,
2340 			l3_proto_name, pkt->l4_proto_idx, l4_proto_name,
2341 			pkt->outer_l3_proto_idx, outer_l3_proto_name,
2342 			pkt->source_vlan_count, pkt->vlan_mod_add_count,
2343 			pkt->vlan_mod_del_count);
2344 
2345 	if (pkt->meta) {
2346 		const char * store = pkt->meta->store ? "Yes" : "No";
2347 		const char *ptp_val = (pkt->flags & AL_ETH_TX_FLAGS_TS) ? "Yes" : "No";
2348 
2349 		al_dbg("[%s %d]: tx pkt with meta data. words valid %x\n",
2350 			tx_dma_q->udma->name, tx_dma_q->qid,
2351 			pkt->meta->words_valid);
2352 		al_dbg("[%s %d]: meta: store to cache %s. l3 hdr len %d. l3 hdr offset %d. "
2353 			"l4 hdr len %d. mss val %d ts_index %d ts_val:%s\n"
2354 			, tx_dma_q->udma->name, tx_dma_q->qid, store,
2355 			pkt->meta->l3_header_len, pkt->meta->l3_header_offset,
2356 			pkt->meta->l4_header_len, pkt->meta->mss_val,
2357 			pkt->meta->ts_index, ptp_val);
2358 		al_dbg("outer_l3_hdr_offset %d. outer_l3_len %d.\n",
2359 			pkt->meta->outer_l3_offset, pkt->meta->outer_l3_len);
2360 	}
2361 
2362 	al_dbg("[%s %d]: num of bufs: %d\n", tx_dma_q->udma->name, tx_dma_q->qid,
2363 		pkt->num_of_bufs);
2364 	for (i = 0; i < pkt->num_of_bufs; i++) {
2365 		al_dbg("eth [%s %d]: buf[%d]: len 0x%08x. address 0x%016llx\n", tx_dma_q->udma->name, tx_dma_q->qid,
2366 			i, pkt->bufs[i].len, (unsigned long long)pkt->bufs[i].addr);
2367 		total_len += pkt->bufs[i].len;
2368 	}
2369 	al_dbg("[%s %d]: total len: 0x%08x\n", tx_dma_q->udma->name, tx_dma_q->qid, total_len);
2370 
2371 }
2372 
2373 /* TX */
2374 /**
2375  * add packet to transmission queue
2376  */
2377 int al_eth_tx_pkt_prepare(struct al_udma_q *tx_dma_q, struct al_eth_pkt *pkt)
2378 {
2379 	union al_udma_desc *tx_desc;
2380 	uint32_t tx_descs;
2381 	uint32_t flags = AL_M2S_DESC_FIRST |
2382 			AL_M2S_DESC_CONCAT |
2383 			(pkt->flags & AL_ETH_TX_FLAGS_INT);
2384 	uint64_t tgtid = ((uint64_t)pkt->tgtid) << AL_UDMA_DESC_TGTID_SHIFT;
2385 	uint32_t meta_ctrl;
2386 	uint32_t ring_id;
2387 	int buf_idx;
2388 
2389 	al_dbg("[%s %d]: new tx pkt\n", tx_dma_q->udma->name, tx_dma_q->qid);
2390 
2391 	al_dump_tx_pkt(tx_dma_q, pkt);
2392 
2393 	tx_descs = pkt->num_of_bufs;
2394 	if (pkt->meta) {
2395 		tx_descs += 1;
2396 	}
2397 #ifdef AL_ETH_EX
2398 	al_assert((pkt->ext_meta_data == NULL) || (tx_dma_q->adapter_rev_id > AL_ETH_REV_ID_2));
2399 
2400 	tx_descs += al_eth_ext_metadata_needed_descs(pkt->ext_meta_data);
2401 	al_dbg("[%s %d]: %d Descriptors: ext_meta (%d). meta (%d). buffer (%d) ",
2402 			tx_dma_q->udma->name, tx_dma_q->qid, tx_descs,
2403 			al_eth_ext_metadata_needed_descs(pkt->ext_meta_data),
2404 			(pkt->meta != NULL), pkt->num_of_bufs);
2405 #endif
2406 
2407 	if (unlikely(al_udma_available_get(tx_dma_q) < tx_descs)) {
2408 		al_dbg("[%s %d]: failed to allocate (%d) descriptors",
2409 			 tx_dma_q->udma->name, tx_dma_q->qid, tx_descs);
2410 		return 0;
2411 	}
2412 
2413 #ifdef AL_ETH_EX
2414 	if (pkt->ext_meta_data != NULL) {
2415 		al_eth_ext_metadata_create(tx_dma_q, &flags, pkt->ext_meta_data);
2416 		flags &= ~(AL_M2S_DESC_FIRST | AL_ETH_TX_FLAGS_INT);
2417 	}
2418 #endif
2419 
2420 	if (pkt->meta) {
2421 		uint32_t meta_word_0 = 0;
2422 		uint32_t meta_word_1 = 0;
2423 		uint32_t meta_word_2 = 0;
2424 		uint32_t meta_word_3 = 0;
2425 
2426 		meta_word_0 |= flags | AL_M2S_DESC_META_DATA;
2427 		meta_word_0 &=  ~AL_M2S_DESC_CONCAT;
2428 		flags &= ~(AL_M2S_DESC_FIRST | AL_ETH_TX_FLAGS_INT);
2429 
2430 		tx_desc = al_udma_desc_get(tx_dma_q);
2431 		/* get ring id, and clear FIRST and Int flags */
2432 		ring_id = al_udma_ring_id_get(tx_dma_q) <<
2433 			AL_M2S_DESC_RING_ID_SHIFT;
2434 
2435 		meta_word_0 |= ring_id;
2436 		meta_word_0 |= pkt->meta->words_valid << 12;
2437 
2438 		if (pkt->meta->store)
2439 			meta_word_0 |= AL_ETH_TX_META_STORE;
2440 
2441 		if (pkt->meta->words_valid & 1) {
2442 			meta_word_0 |= pkt->meta->vlan1_cfi_sel;
2443 			meta_word_0 |= pkt->meta->vlan2_vid_sel << 2;
2444 			meta_word_0 |= pkt->meta->vlan2_cfi_sel << 4;
2445 			meta_word_0 |= pkt->meta->vlan2_pbits_sel << 6;
2446 			meta_word_0 |= pkt->meta->vlan2_ether_sel << 8;
2447 		}
2448 
2449 		if (pkt->meta->words_valid & 2) {
2450 			meta_word_1 = pkt->meta->vlan1_new_vid;
2451 			meta_word_1 |= pkt->meta->vlan1_new_cfi << 12;
2452 			meta_word_1 |= pkt->meta->vlan1_new_pbits << 13;
2453 			meta_word_1 |= pkt->meta->vlan2_new_vid << 16;
2454 			meta_word_1 |= pkt->meta->vlan2_new_cfi << 28;
2455 			meta_word_1 |= pkt->meta->vlan2_new_pbits << 29;
2456 		}
2457 
2458 		if (pkt->meta->words_valid & 4) {
2459 			uint32_t l3_offset;
2460 
2461 			meta_word_2 = pkt->meta->l3_header_len & AL_ETH_TX_META_L3_LEN_MASK;
2462 			meta_word_2 |= (pkt->meta->l3_header_offset & AL_ETH_TX_META_L3_OFF_MASK) <<
2463 				AL_ETH_TX_META_L3_OFF_SHIFT;
2464 			meta_word_2 |= (pkt->meta->l4_header_len & 0x3f) << 16;
2465 
2466 			if (unlikely(pkt->flags & AL_ETH_TX_FLAGS_TS))
2467 				meta_word_0 |= pkt->meta->ts_index <<
2468 					AL_ETH_TX_META_MSS_MSB_TS_VAL_SHIFT;
2469 			else
2470 				meta_word_0 |= (((pkt->meta->mss_val & 0x3c00) >> 10)
2471 						<< AL_ETH_TX_META_MSS_MSB_TS_VAL_SHIFT);
2472 			meta_word_2 |= ((pkt->meta->mss_val & 0x03ff)
2473 					<< AL_ETH_TX_META_MSS_LSB_VAL_SHIFT);
2474 
2475 			/*
2476 			 * move from bytes to multiplication of 2 as the HW
2477 			 * expect to get it
2478 			 */
2479 			l3_offset = (pkt->meta->outer_l3_offset >> 1);
2480 
2481 			meta_word_0 |=
2482 				(((l3_offset &
2483 				   AL_ETH_TX_META_OUTER_L3_OFF_HIGH_MASK) >> 3)
2484 				   << AL_ETH_TX_META_OUTER_L3_OFF_HIGH_SHIFT);
2485 
2486 			meta_word_3 |=
2487 				((l3_offset &
2488 				   AL_ETH_TX_META_OUTER_L3_OFF_LOW_MASK)
2489 				   << AL_ETH_TX_META_OUTER_L3_OFF_LOW_SHIFT);
2490 
2491 			/*
2492 			 * shift right 2 bits to work in multiplication of 4
2493 			 * as the HW expect to get it
2494 			 */
2495 			meta_word_3 |=
2496 				(((pkt->meta->outer_l3_len >> 2) &
2497 				   AL_ETH_TX_META_OUTER_L3_LEN_MASK)
2498 				   << AL_ETH_TX_META_OUTER_L3_LEN_SHIFT);
2499 		}
2500 
2501 		tx_desc->tx_meta.len_ctrl = swap32_to_le(meta_word_0);
2502 		tx_desc->tx_meta.meta_ctrl = swap32_to_le(meta_word_1);
2503 		tx_desc->tx_meta.meta1 = swap32_to_le(meta_word_2);
2504 		tx_desc->tx_meta.meta2 = swap32_to_le(meta_word_3);
2505 		al_dump_tx_desc(tx_desc);
2506 	}
2507 
2508 	meta_ctrl = pkt->flags & AL_ETH_TX_PKT_META_FLAGS;
2509 
2510 	/* L4_PARTIAL_CSUM without L4_CSUM is invalid option  */
2511 	al_assert((pkt->flags & (AL_ETH_TX_FLAGS_L4_CSUM|AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM)) !=
2512 		  AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM);
2513 
2514 	/* TSO packets can't have Timestamp enabled */
2515 	al_assert((pkt->flags & (AL_ETH_TX_FLAGS_TSO|AL_ETH_TX_FLAGS_TS)) !=
2516 		  (AL_ETH_TX_FLAGS_TSO|AL_ETH_TX_FLAGS_TS));
2517 
2518 	meta_ctrl |= pkt->l3_proto_idx;
2519 	meta_ctrl |= pkt->l4_proto_idx << AL_ETH_TX_L4_PROTO_IDX_SHIFT;
2520 	meta_ctrl |= pkt->source_vlan_count << AL_ETH_TX_SRC_VLAN_CNT_SHIFT;
2521 	meta_ctrl |= pkt->vlan_mod_add_count << AL_ETH_TX_VLAN_MOD_ADD_SHIFT;
2522 	meta_ctrl |= pkt->vlan_mod_del_count << AL_ETH_TX_VLAN_MOD_DEL_SHIFT;
2523 	meta_ctrl |= pkt->vlan_mod_v1_ether_sel << AL_ETH_TX_VLAN_MOD_E_SEL_SHIFT;
2524 	meta_ctrl |= pkt->vlan_mod_v1_vid_sel << AL_ETH_TX_VLAN_MOD_VID_SEL_SHIFT;
2525 	meta_ctrl |= pkt->vlan_mod_v1_pbits_sel << AL_ETH_TX_VLAN_MOD_PBIT_SEL_SHIFT;
2526 
2527 #ifdef AL_ETH_EX
2528 	if ((pkt->ext_meta_data != NULL) && (pkt->ext_meta_data->tx_crypto_data != NULL))
2529 		meta_ctrl |= AL_ETH_TX_FLAGS_ENCRYPT;
2530 #endif
2531 
2532 	meta_ctrl |= pkt->tunnel_mode << AL_ETH_TX_TUNNEL_MODE_SHIFT;
2533 	if (pkt->outer_l3_proto_idx == AL_ETH_PROTO_ID_IPv4)
2534 		meta_ctrl |= 1 << AL_ETH_TX_OUTER_L3_PROTO_SHIFT;
2535 
2536 	flags |= pkt->flags & AL_ETH_TX_PKT_UDMA_FLAGS;
2537 	for(buf_idx = 0; buf_idx < pkt->num_of_bufs; buf_idx++ ) {
2538 		uint32_t flags_len = flags;
2539 
2540 		tx_desc = al_udma_desc_get(tx_dma_q);
2541 		/* get ring id, and clear FIRST and Int flags */
2542 		ring_id = al_udma_ring_id_get(tx_dma_q) <<
2543 			AL_M2S_DESC_RING_ID_SHIFT;
2544 
2545 		flags_len |= ring_id;
2546 
2547 		if (buf_idx == (pkt->num_of_bufs - 1))
2548 			flags_len |= AL_M2S_DESC_LAST;
2549 
2550 		/* clear First and Int flags */
2551 		flags &= AL_ETH_TX_FLAGS_NO_SNOOP;
2552 		flags |= AL_M2S_DESC_CONCAT;
2553 
2554 		flags_len |= pkt->bufs[buf_idx].len & AL_M2S_DESC_LEN_MASK;
2555 		tx_desc->tx.len_ctrl = swap32_to_le(flags_len);
2556 		if (buf_idx == 0)
2557 			tx_desc->tx.meta_ctrl = swap32_to_le(meta_ctrl);
2558 		tx_desc->tx.buf_ptr = swap64_to_le(
2559 			pkt->bufs[buf_idx].addr | tgtid);
2560 		al_dump_tx_desc(tx_desc);
2561 	}
2562 
2563 	al_dbg("[%s %d]: pkt descriptors written into the tx queue. descs num (%d)\n",
2564 		tx_dma_q->udma->name, tx_dma_q->qid, tx_descs);
2565 
2566 	return tx_descs;
2567 }
2568 
2569 
2570 void al_eth_tx_dma_action(struct al_udma_q *tx_dma_q, uint32_t tx_descs)
2571 {
2572 	/* add tx descriptors */
2573 	al_udma_desc_action_add(tx_dma_q, tx_descs);
2574 }
2575 
2576 /**
2577  * get number of completed tx descriptors, upper layer should derive from
2578  */
2579 int al_eth_comp_tx_get(struct al_udma_q *tx_dma_q)
2580 {
2581 	int rc;
2582 
2583 	rc = al_udma_cdesc_get_all(tx_dma_q, NULL);
2584 	if (rc != 0) {
2585 		al_udma_cdesc_ack(tx_dma_q, rc);
2586 		al_dbg("[%s %d]: tx completion: descs (%d)\n",
2587 			 tx_dma_q->udma->name, tx_dma_q->qid, rc);
2588 	}
2589 
2590 	return rc;
2591 }
2592 
2593 /**
2594  * configure the TSO MSS val
2595  */
2596 int al_eth_tso_mss_config(struct al_hal_eth_adapter *adapter, uint8_t idx, uint32_t mss_val)
2597 {
2598 
2599 	al_assert(idx <= 8); /*valid MSS index*/
2600 	al_assert(mss_val <= AL_ETH_TSO_MSS_MAX_VAL); /*valid MSS val*/
2601 	al_assert(mss_val >= AL_ETH_TSO_MSS_MIN_VAL); /*valid MSS val*/
2602 
2603 	al_reg_write32(&adapter->ec_regs_base->tso_sel[idx].mss, mss_val);
2604 	return 0;
2605 }
2606 
2607 
2608 /* RX */
2609 /**
2610  * config the rx descriptor fields
2611  */
2612 void al_eth_rx_desc_config(
2613 			struct al_hal_eth_adapter *adapter,
2614 			enum al_eth_rx_desc_lro_context_val_res lro_sel,
2615 			enum al_eth_rx_desc_l4_offset_sel l4_offset_sel,
2616 			enum al_eth_rx_desc_l3_offset_sel l3_offset_sel,
2617 			enum al_eth_rx_desc_l4_chk_res_sel l4_sel,
2618 			enum al_eth_rx_desc_l3_chk_res_sel l3_sel,
2619 			enum al_eth_rx_desc_l3_proto_idx_sel l3_proto_sel,
2620 			enum al_eth_rx_desc_l4_proto_idx_sel l4_proto_sel,
2621 			enum al_eth_rx_desc_frag_sel frag_sel)
2622 {
2623 	uint32_t reg_val = 0;
2624 
2625 	reg_val |= (lro_sel == AL_ETH_L4_OFFSET) ?
2626 			EC_RFW_CFG_A_0_LRO_CONTEXT_SEL : 0;
2627 
2628 	reg_val |= (l4_sel == AL_ETH_L4_INNER_OUTER_CHK) ?
2629 			EC_RFW_CFG_A_0_META_L4_CHK_RES_SEL : 0;
2630 
2631 	reg_val |= l3_sel << EC_RFW_CFG_A_0_META_L3_CHK_RES_SEL_SHIFT;
2632 
2633 	al_reg_write32(&adapter->ec_regs_base->rfw.cfg_a_0, reg_val);
2634 
2635 	reg_val = al_reg_read32(&adapter->ec_regs_base->rfw.meta);
2636 	if (l3_proto_sel == AL_ETH_L3_PROTO_IDX_INNER)
2637 		reg_val |= EC_RFW_META_L3_PROT_SEL;
2638 	else
2639 		reg_val &= ~EC_RFW_META_L3_PROT_SEL;
2640 
2641 	if (l4_proto_sel == AL_ETH_L4_PROTO_IDX_INNER)
2642 		reg_val |= EC_RFW_META_L4_PROT_SEL;
2643 	else
2644 		reg_val &= ~EC_RFW_META_L4_PROT_SEL;
2645 
2646 	if (l4_offset_sel == AL_ETH_L4_OFFSET_INNER)
2647 		reg_val |= EC_RFW_META_L4_OFFSET_SEL;
2648 	else
2649 		reg_val &= ~EC_RFW_META_L4_OFFSET_SEL;
2650 
2651 	if (l3_offset_sel == AL_ETH_L3_OFFSET_INNER)
2652 		reg_val |= EC_RFW_META_L3_OFFSET_SEL;
2653 	else
2654 		reg_val &= ~EC_RFW_META_L3_OFFSET_SEL;
2655 
2656 	if (frag_sel == AL_ETH_FRAG_INNER)
2657 		reg_val |= EC_RFW_META_FRAG_SEL;
2658 	else
2659 		reg_val &= ~EC_RFW_META_FRAG_SEL;
2660 
2661 
2662 	al_reg_write32(&adapter->ec_regs_base->rfw.meta, reg_val);
2663 }
2664 
2665 /**
2666  * Configure RX header split
2667  */
2668 int al_eth_rx_header_split_config(struct al_hal_eth_adapter *adapter, al_bool enable, uint32_t header_len)
2669 {
2670 	uint32_t	reg;
2671 
2672 	reg = al_reg_read32(&adapter->ec_regs_base->rfw.hdr_split);
2673 	if (enable == AL_TRUE)
2674 		reg |= EC_RFW_HDR_SPLIT_EN;
2675 	else
2676 		reg &= ~EC_RFW_HDR_SPLIT_EN;
2677 
2678 	AL_REG_FIELD_SET(reg, EC_RFW_HDR_SPLIT_DEF_LEN_MASK, EC_RFW_HDR_SPLIT_DEF_LEN_SHIFT, header_len);
2679 	al_reg_write32(&adapter->ec_regs_base->rfw.hdr_split, reg);
2680 	return 0;
2681 }
2682 
2683 
2684 /**
2685  * enable / disable header split in the udma queue.
2686  * length will be taken from the udma configuration to enable different length per queue.
2687  */
2688 int al_eth_rx_header_split_force_len_config(struct al_hal_eth_adapter *adapter,
2689 					al_bool enable,
2690 					uint32_t qid,
2691 					uint32_t header_len)
2692 {
2693 	al_udma_s2m_q_compl_hdr_split_config(&(adapter->rx_udma.udma_q[qid]), enable,
2694 					     AL_TRUE, header_len);
2695 
2696 	return 0;
2697 }
2698 
2699 
2700 /**
2701  * add buffer to receive queue
2702  */
2703 int al_eth_rx_buffer_add(struct al_udma_q *rx_dma_q,
2704 			      struct al_buf *buf, uint32_t flags,
2705 			      struct al_buf *header_buf)
2706 {
2707 	uint64_t tgtid = ((uint64_t)flags & AL_ETH_RX_FLAGS_TGTID_MASK) <<
2708 		AL_UDMA_DESC_TGTID_SHIFT;
2709 	uint32_t flags_len = flags & ~AL_ETH_RX_FLAGS_TGTID_MASK;
2710 	union al_udma_desc *rx_desc;
2711 
2712 	al_dbg("[%s %d]: add rx buffer.\n", rx_dma_q->udma->name, rx_dma_q->qid);
2713 
2714 #if 1
2715 	if (unlikely(al_udma_available_get(rx_dma_q) < 1)) {
2716 		al_dbg("[%s]: rx q (%d) has no enough free descriptor",
2717 			 rx_dma_q->udma->name, rx_dma_q->qid);
2718 		return -ENOSPC;
2719 	}
2720 #endif
2721 	rx_desc = al_udma_desc_get(rx_dma_q);
2722 
2723 	flags_len |= al_udma_ring_id_get(rx_dma_q) << AL_S2M_DESC_RING_ID_SHIFT;
2724 	flags_len |= buf->len & AL_S2M_DESC_LEN_MASK;
2725 
2726 	if (flags & AL_S2M_DESC_DUAL_BUF) {
2727 		al_assert(header_buf != NULL); /*header valid in dual buf */
2728 		al_assert((rx_dma_q->udma->rev_id >= AL_UDMA_REV_ID_2) ||
2729 			(AL_ADDR_HIGH(buf->addr) == AL_ADDR_HIGH(header_buf->addr)));
2730 
2731 		flags_len |= ((header_buf->len >> AL_S2M_DESC_LEN2_GRANULARITY_SHIFT)
2732 			<< AL_S2M_DESC_LEN2_SHIFT) & AL_S2M_DESC_LEN2_MASK;
2733 		rx_desc->rx.buf2_ptr_lo = swap32_to_le(AL_ADDR_LOW(header_buf->addr));
2734 	}
2735 	rx_desc->rx.len_ctrl = swap32_to_le(flags_len);
2736 	rx_desc->rx.buf1_ptr = swap64_to_le(buf->addr | tgtid);
2737 
2738 	return 0;
2739 }
2740 
2741 /**
2742  * notify the hw engine about rx descriptors that were added to the receive queue
2743  */
2744 void al_eth_rx_buffer_action(struct al_udma_q *rx_dma_q, uint32_t descs_num)
2745 {
2746 	al_dbg("[%s]: update the rx engine tail pointer: queue %d. descs %d\n",
2747 		 rx_dma_q->udma->name, rx_dma_q->qid, descs_num);
2748 
2749 	/* add rx descriptor */
2750 	al_udma_desc_action_add(rx_dma_q, descs_num);
2751 }
2752 
2753 /**
2754  * get packet from RX completion ring
2755  */
2756 uint32_t al_eth_pkt_rx(struct al_udma_q *rx_dma_q,
2757 			      struct al_eth_pkt *pkt)
2758 {
2759 	volatile union al_udma_cdesc *cdesc;
2760 	volatile al_eth_rx_cdesc *rx_desc;
2761 	uint32_t i;
2762 	uint32_t rc;
2763 
2764 	rc = al_udma_cdesc_packet_get(rx_dma_q, &cdesc);
2765 	if (rc == 0)
2766 		return 0;
2767 
2768 	al_assert(rc <= AL_ETH_PKT_MAX_BUFS);
2769 
2770 	al_dbg("[%s]: fetch rx packet: queue %d.\n",
2771 		 rx_dma_q->udma->name, rx_dma_q->qid);
2772 
2773 	pkt->rx_header_len = 0;
2774 	for (i = 0; i < rc; i++) {
2775 		uint32_t buf1_len, buf2_len;
2776 
2777 		/* get next descriptor */
2778 		rx_desc = (volatile al_eth_rx_cdesc *)al_cdesc_next(rx_dma_q, cdesc, i);
2779 
2780 		buf1_len = swap32_from_le(rx_desc->len);
2781 
2782 		if ((i == 0) && (swap32_from_le(rx_desc->word2) &
2783 			AL_UDMA_CDESC_BUF2_USED)) {
2784 			buf2_len = swap32_from_le(rx_desc->word2);
2785 			pkt->rx_header_len = (buf2_len & AL_S2M_DESC_LEN2_MASK) >>
2786 			AL_S2M_DESC_LEN2_SHIFT;
2787 			}
2788 		if ((swap32_from_le(rx_desc->ctrl_meta) & AL_UDMA_CDESC_BUF1_USED) &&
2789 			((swap32_from_le(rx_desc->ctrl_meta) & AL_UDMA_CDESC_DDP) == 0))
2790 			pkt->bufs[i].len = buf1_len & AL_S2M_DESC_LEN_MASK;
2791 		else
2792 			pkt->bufs[i].len = 0;
2793 	}
2794 	/* get flags from last desc */
2795 	pkt->flags = swap32_from_le(rx_desc->ctrl_meta);
2796 #ifdef AL_ETH_RX_DESC_RAW_GET
2797 	pkt->rx_desc_raw[0] = pkt->flags;
2798 	pkt->rx_desc_raw[1] = swap32_from_le(rx_desc->len);
2799 	pkt->rx_desc_raw[2] = swap32_from_le(rx_desc->word2);
2800 	pkt->rx_desc_raw[3] = swap32_from_le(rx_desc->word3);
2801 #endif
2802 	/* update L3/L4 proto index */
2803 	pkt->l3_proto_idx = pkt->flags & AL_ETH_RX_L3_PROTO_IDX_MASK;
2804 	pkt->l4_proto_idx = (pkt->flags >> AL_ETH_RX_L4_PROTO_IDX_SHIFT) &
2805 				AL_ETH_RX_L4_PROTO_IDX_MASK;
2806 	pkt->rxhash = (swap32_from_le(rx_desc->len) & AL_ETH_RX_HASH_MASK) >>
2807 			AL_ETH_RX_HASH_SHIFT;
2808 	pkt->l3_offset = (swap32_from_le(rx_desc->word2) & AL_ETH_RX_L3_OFFSET_MASK) >> AL_ETH_RX_L3_OFFSET_SHIFT;
2809 
2810 	al_udma_cdesc_ack(rx_dma_q, rc);
2811 	return rc;
2812 }
2813 
2814 
2815 int al_eth_rx_parser_entry_update(struct al_hal_eth_adapter *adapter, uint32_t idx,
2816 		struct al_eth_epe_p_reg_entry *reg_entry,
2817 		struct al_eth_epe_control_entry *control_entry)
2818 {
2819 	al_eth_epe_entry_set(adapter, idx, reg_entry, control_entry);
2820 	return 0;
2821 }
2822 
2823 #define AL_ETH_THASH_UDMA_SHIFT		0
2824 #define AL_ETH_THASH_UDMA_MASK		(0xF << AL_ETH_THASH_UDMA_SHIFT)
2825 
2826 #define AL_ETH_THASH_Q_SHIFT		4
2827 #define AL_ETH_THASH_Q_MASK		(0x3 << AL_ETH_THASH_Q_SHIFT)
2828 
2829 int al_eth_thash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma, uint32_t queue)
2830 {
2831 	uint32_t entry;
2832 	al_assert(idx < AL_ETH_RX_THASH_TABLE_SIZE); /*valid THASH index*/
2833 
2834 	entry = (udma << AL_ETH_THASH_UDMA_SHIFT) & AL_ETH_THASH_UDMA_MASK;
2835 	entry |= (queue << AL_ETH_THASH_Q_SHIFT) & AL_ETH_THASH_Q_MASK;
2836 
2837 	al_reg_write32(&adapter->ec_regs_base->rfw.thash_table_addr, idx);
2838 	al_reg_write32(&adapter->ec_regs_base->rfw.thash_table_data, entry);
2839 	return 0;
2840 }
2841 
2842 int al_eth_fsm_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry)
2843 {
2844 
2845 	al_assert(idx < AL_ETH_RX_FSM_TABLE_SIZE); /*valid FSM index*/
2846 
2847 
2848 	al_reg_write32(&adapter->ec_regs_base->rfw.fsm_table_addr, idx);
2849 	al_reg_write32(&adapter->ec_regs_base->rfw.fsm_table_data, entry);
2850 	return 0;
2851 }
2852 
2853 static uint32_t	al_eth_fwd_ctrl_entry_to_val(struct al_eth_fwd_ctrl_table_entry *entry)
2854 {
2855 	uint32_t val = 0;
2856 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(3,0), 0, entry->prio_sel);
2857 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(7,4), 4, entry->queue_sel_1);
2858 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(9,8), 8, entry->queue_sel_2);
2859 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(13,10), 10, entry->udma_sel);
2860 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(17,15), 15, entry->hdr_split_len_sel);
2861 	if (entry->hdr_split_len_sel != AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_0)
2862 		val |= AL_BIT(18);
2863 	AL_REG_BIT_VAL_SET(val, 19, !!(entry->filter == AL_TRUE));
2864 
2865 	return val;
2866 }
2867 
2868 static int al_eth_ctrl_index_match(struct al_eth_fwd_ctrl_table_index *index, uint32_t i) {
2869 	if ((index->vlan_table_out != AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_ANY)
2870 		&& (index->vlan_table_out != AL_REG_BIT_GET(i, 0)))
2871 		return 0;
2872 	if ((index->tunnel_exist != AL_ETH_FWD_CTRL_IDX_TUNNEL_ANY)
2873 		&& (index->tunnel_exist != AL_REG_BIT_GET(i, 1)))
2874 		return 0;
2875 	if ((index->vlan_exist != AL_ETH_FWD_CTRL_IDX_VLAN_ANY)
2876 		&& (index->vlan_exist != AL_REG_BIT_GET(i, 2)))
2877 		return 0;
2878 	if ((index->mac_table_match != AL_ETH_FWD_CTRL_IDX_MAC_TABLE_ANY)
2879 		&& (index->mac_table_match != AL_REG_BIT_GET(i, 3)))
2880 		return 0;
2881 	if ((index->protocol_id != AL_ETH_PROTO_ID_ANY)
2882 		&& (index->protocol_id != AL_REG_FIELD_GET(i, AL_FIELD_MASK(8,4),4)))
2883 		return 0;
2884 	if ((index->mac_type != AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_ANY)
2885 		&& (index->mac_type != AL_REG_FIELD_GET(i, AL_FIELD_MASK(10,9),9)))
2886 		return 0;
2887 	return 1;
2888 }
2889 
2890 int al_eth_ctrl_table_set(struct al_hal_eth_adapter *adapter,
2891 			  struct al_eth_fwd_ctrl_table_index *index,
2892 			  struct al_eth_fwd_ctrl_table_entry *entry)
2893 {
2894 	uint32_t val = al_eth_fwd_ctrl_entry_to_val(entry);
2895 	uint32_t i;
2896 
2897 	for (i = 0; i < AL_ETH_RX_CTRL_TABLE_SIZE; i++) {
2898 		if (al_eth_ctrl_index_match(index, i)) {
2899 			al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_addr, i);
2900 			al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_data, val);
2901 		}
2902 	}
2903 	return 0;
2904 }
2905 
2906 int al_eth_ctrl_table_def_set(struct al_hal_eth_adapter *adapter,
2907 			      al_bool use_table,
2908 			      struct al_eth_fwd_ctrl_table_entry *entry)
2909 {
2910 	uint32_t val = al_eth_fwd_ctrl_entry_to_val(entry);
2911 
2912 	if (use_table)
2913 		val |= EC_RFW_CTRL_TABLE_DEF_SEL;
2914 
2915 	al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_def, val);
2916 
2917 	return 0;
2918 }
2919 
2920 int al_eth_ctrl_table_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry)
2921 {
2922 
2923 	al_assert(idx < AL_ETH_RX_CTRL_TABLE_SIZE); /* valid CTRL index */
2924 
2925 
2926 	al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_addr, idx);
2927 	al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_data, entry);
2928 	return 0;
2929 }
2930 
2931 int al_eth_ctrl_table_def_raw_set(struct al_hal_eth_adapter *adapter, uint32_t val)
2932 {
2933 	al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_def, val);
2934 
2935 	return 0;
2936 }
2937 
2938 int al_eth_hash_key_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t val)
2939 {
2940 
2941 	al_assert(idx < AL_ETH_RX_HASH_KEY_NUM); /*valid CTRL index*/
2942 
2943 	al_reg_write32(&adapter->ec_regs_base->rfw_hash[idx].key, val);
2944 
2945 	return 0;
2946 }
2947 
2948 static uint32_t	al_eth_fwd_mac_table_entry_to_val(struct al_eth_fwd_mac_table_entry *entry)
2949 {
2950 	uint32_t val = 0;
2951 
2952 	val |= (entry->filter == AL_TRUE) ? EC_FWD_MAC_CTRL_RX_VAL_DROP : 0;
2953 	val |= ((entry->udma_mask << EC_FWD_MAC_CTRL_RX_VAL_UDMA_SHIFT) &
2954 					EC_FWD_MAC_CTRL_RX_VAL_UDMA_MASK);
2955 
2956 	val |= ((entry->qid << EC_FWD_MAC_CTRL_RX_VAL_QID_SHIFT) &
2957 					EC_FWD_MAC_CTRL_RX_VAL_QID_MASK);
2958 
2959 	val |= (entry->rx_valid == AL_TRUE) ? EC_FWD_MAC_CTRL_RX_VALID : 0;
2960 
2961 	val |= ((entry->tx_target << EC_FWD_MAC_CTRL_TX_VAL_SHIFT) &
2962 					EC_FWD_MAC_CTRL_TX_VAL_MASK);
2963 
2964 	val |= (entry->tx_valid == AL_TRUE) ? EC_FWD_MAC_CTRL_TX_VALID : 0;
2965 
2966 	return val;
2967 }
2968 
2969 int al_eth_fwd_mac_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
2970 			     struct al_eth_fwd_mac_table_entry *entry)
2971 {
2972 	uint32_t val;
2973 
2974 	al_assert(idx < AL_ETH_FWD_MAC_NUM); /*valid FWD MAC index */
2975 
2976 	val = (entry->addr[2] << 24) | (entry->addr[3] << 16) |
2977 	      (entry->addr[4] << 8) | entry->addr[5];
2978 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].data_l, val);
2979 	val = (entry->addr[0] << 8) | entry->addr[1];
2980 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].data_h, val);
2981 	val = (entry->mask[2] << 24) | (entry->mask[3] << 16) |
2982 	      (entry->mask[4] << 8) | entry->mask[5];
2983 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].mask_l, val);
2984 	val = (entry->mask[0] << 8) | entry->mask[1];
2985 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].mask_h, val);
2986 
2987 	val = al_eth_fwd_mac_table_entry_to_val(entry);
2988 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].ctrl, val);
2989 	return 0;
2990 }
2991 
2992 
2993 
2994 int al_eth_fwd_mac_addr_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t addr_lo, uint32_t addr_hi, uint32_t mask_lo, uint32_t mask_hi)
2995 {
2996 	al_assert(idx < AL_ETH_FWD_MAC_NUM); /*valid FWD MAC index */
2997 
2998 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].data_l, addr_lo);
2999 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].data_h, addr_hi);
3000 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].mask_l, mask_lo);
3001 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].mask_h, mask_hi);
3002 
3003 	return 0;
3004 }
3005 
3006 int al_eth_fwd_mac_ctrl_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t ctrl)
3007 {
3008 	al_assert(idx < AL_ETH_FWD_MAC_NUM); /*valid FWD MAC index */
3009 
3010 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].ctrl, ctrl);
3011 
3012 	return 0;
3013 }
3014 
3015 int al_eth_mac_addr_store(void * __iomem ec_base, uint32_t idx, uint8_t *addr)
3016 {
3017 	struct al_ec_regs __iomem *ec_regs_base = (struct al_ec_regs __iomem*)ec_base;
3018 	uint32_t val;
3019 
3020 	al_assert(idx < AL_ETH_FWD_MAC_NUM); /*valid FWD MAC index */
3021 
3022 	val = (addr[2] << 24) | (addr[3] << 16) | (addr[4] << 8) | addr[5];
3023 	al_reg_write32(&ec_regs_base->fwd_mac[idx].data_l, val);
3024 	val = (addr[0] << 8) | addr[1];
3025 	al_reg_write32(&ec_regs_base->fwd_mac[idx].data_h, val);
3026 	return 0;
3027 }
3028 
3029 int al_eth_mac_addr_read(void * __iomem ec_base, uint32_t idx, uint8_t *addr)
3030 {
3031 	struct al_ec_regs __iomem *ec_regs_base = (struct al_ec_regs __iomem*)ec_base;
3032 	uint32_t addr_lo = al_reg_read32(&ec_regs_base->fwd_mac[idx].data_l);
3033 	uint16_t addr_hi = al_reg_read32(&ec_regs_base->fwd_mac[idx].data_h);
3034 
3035 	addr[5] = addr_lo & 0xff;
3036 	addr[4] = (addr_lo >> 8) & 0xff;
3037 	addr[3] = (addr_lo >> 16) & 0xff;
3038 	addr[2] = (addr_lo >> 24) & 0xff;
3039 	addr[1] = addr_hi & 0xff;
3040 	addr[0] = (addr_hi >> 8) & 0xff;
3041 	return 0;
3042 }
3043 
3044 int al_eth_fwd_mhash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma_mask, uint8_t qid)
3045 {
3046 	uint32_t val = 0;
3047 	al_assert(idx < AL_ETH_FWD_MAC_HASH_NUM); /* valid MHASH index */
3048 
3049 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(3,0), 0, udma_mask);
3050 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(5,4), 4, qid);
3051 
3052 	al_reg_write32(&adapter->ec_regs_base->rfw.mhash_table_addr, idx);
3053 	al_reg_write32(&adapter->ec_regs_base->rfw.mhash_table_data, val);
3054 	return 0;
3055 }
3056 static uint32_t	al_eth_fwd_vid_entry_to_val(struct al_eth_fwd_vid_table_entry *entry)
3057 {
3058 	uint32_t val = 0;
3059 	AL_REG_BIT_VAL_SET(val, 0, entry->control);
3060 	AL_REG_BIT_VAL_SET(val, 1, entry->filter);
3061 	AL_REG_FIELD_SET(val, AL_FIELD_MASK(5,2), 2, entry->udma_mask);
3062 
3063 	return val;
3064 }
3065 
3066 int al_eth_fwd_vid_config_set(struct al_hal_eth_adapter *adapter, al_bool use_table,
3067 			      struct al_eth_fwd_vid_table_entry *default_entry,
3068 			      uint32_t default_vlan)
3069 {
3070 	uint32_t reg;
3071 
3072 	reg = al_eth_fwd_vid_entry_to_val(default_entry);
3073 	if (use_table)
3074 		reg |= EC_RFW_VID_TABLE_DEF_SEL;
3075 	else
3076 		reg &= ~EC_RFW_VID_TABLE_DEF_SEL;
3077 	al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_def, reg);
3078 	al_reg_write32(&adapter->ec_regs_base->rfw.default_vlan, default_vlan);
3079 
3080 	return 0;
3081 }
3082 
3083 int al_eth_fwd_vid_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
3084 			     struct al_eth_fwd_vid_table_entry *entry)
3085 {
3086 	uint32_t val;
3087 	al_assert(idx < AL_ETH_FWD_VID_TABLE_NUM); /* valid VID index */
3088 
3089 	val = al_eth_fwd_vid_entry_to_val(entry);
3090 	al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_addr, idx);
3091 	al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_data, val);
3092 	return 0;
3093 }
3094 
3095 int al_eth_fwd_pbits_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio)
3096 {
3097 
3098 	al_assert(idx < AL_ETH_FWD_PBITS_TABLE_NUM); /* valid PBIT index */
3099 	al_assert(prio < AL_ETH_FWD_PRIO_TABLE_NUM); /* valid PRIO index */
3100 	al_reg_write32(&adapter->ec_regs_base->rfw.pbits_table_addr, idx);
3101 	al_reg_write32(&adapter->ec_regs_base->rfw.pbits_table_data, prio);
3102 	return 0;
3103 }
3104 
3105 int al_eth_fwd_priority_table_set(struct al_hal_eth_adapter *adapter, uint8_t prio, uint8_t qid)
3106 {
3107 	al_assert(prio < AL_ETH_FWD_PRIO_TABLE_NUM); /* valid PRIO index */
3108 
3109 	al_reg_write32(&adapter->ec_regs_base->rfw_priority[prio].queue, qid);
3110 	return 0;
3111 }
3112 
3113 
3114 int al_eth_fwd_dscp_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio)
3115 {
3116 
3117 	al_assert(idx < AL_ETH_FWD_DSCP_TABLE_NUM); /* valid DSCP index */
3118 
3119 
3120 	al_reg_write32(&adapter->ec_regs_base->rfw.dscp_table_addr, idx);
3121 	al_reg_write32(&adapter->ec_regs_base->rfw.dscp_table_data, prio);
3122 	return 0;
3123 }
3124 
3125 int al_eth_fwd_tc_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio)
3126 {
3127 
3128 	al_assert(idx < AL_ETH_FWD_TC_TABLE_NUM); /* valid TC index */
3129 
3130 
3131 	al_reg_write32(&adapter->ec_regs_base->rfw.tc_table_addr, idx);
3132 	al_reg_write32(&adapter->ec_regs_base->rfw.tc_table_data, prio);
3133 	return 0;
3134 }
3135 
3136 /** Configure default UDMA register */
3137 int al_eth_fwd_default_udma_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
3138 				   uint8_t udma_mask)
3139 {
3140 	al_reg_write32_masked(&adapter->ec_regs_base->rfw_default[idx].opt_1,
3141 			       EC_RFW_DEFAULT_OPT_1_UDMA_MASK,
3142 			       udma_mask << EC_RFW_DEFAULT_OPT_1_UDMA_SHIFT);
3143 	return 0;
3144 }
3145 
3146 /** Configure default queue register */
3147 int al_eth_fwd_default_queue_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
3148 				   uint8_t qid)
3149 {
3150 	al_reg_write32_masked(&adapter->ec_regs_base->rfw_default[idx].opt_1,
3151 			       EC_RFW_DEFAULT_OPT_1_QUEUE_MASK,
3152 			       qid << EC_RFW_DEFAULT_OPT_1_QUEUE_SHIFT);
3153 	return 0;
3154 }
3155 
3156 /** Configure default priority register */
3157 int al_eth_fwd_default_priority_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
3158 				   uint8_t prio)
3159 {
3160 	al_reg_write32_masked(&adapter->ec_regs_base->rfw_default[idx].opt_1,
3161 			       EC_RFW_DEFAULT_OPT_1_PRIORITY_MASK,
3162 			       prio << EC_RFW_DEFAULT_OPT_1_PRIORITY_SHIFT);
3163 	return 0;
3164 }
3165 
3166 int al_eth_switching_config_set(struct al_hal_eth_adapter *adapter, uint8_t udma_id, uint8_t forward_all_to_mac, uint8_t enable_int_switching,
3167 					enum al_eth_tx_switch_vid_sel_type vid_sel_type,
3168 					enum al_eth_tx_switch_dec_type uc_dec,
3169 					enum al_eth_tx_switch_dec_type mc_dec,
3170 					enum al_eth_tx_switch_dec_type bc_dec)
3171 {
3172 	uint32_t reg;
3173 
3174 	if (udma_id == 0) {
3175 		reg = al_reg_read32(&adapter->ec_regs_base->tfw.tx_gen);
3176 		if (forward_all_to_mac)
3177 			reg |= EC_TFW_TX_GEN_FWD_ALL_TO_MAC;
3178 		else
3179 			reg &= ~EC_TFW_TX_GEN_FWD_ALL_TO_MAC;
3180 		al_reg_write32(&adapter->ec_regs_base->tfw.tx_gen, reg);
3181 	}
3182 
3183 	reg = enable_int_switching;
3184 	reg |= (vid_sel_type & 7) << 1;
3185 	reg |= (bc_dec & 3) << 4;
3186 	reg |= (mc_dec & 3) << 6;
3187 	reg |= (uc_dec & 3) << 8;
3188 	al_reg_write32(&adapter->ec_regs_base->tfw_udma[udma_id].fwd_dec, reg);
3189 
3190 	return 0;
3191 }
3192 
3193 #define AL_ETH_RFW_FILTER_SUPPORTED(rev_id)	\
3194 	(AL_ETH_RFW_FILTER_UNDET_MAC | \
3195 	AL_ETH_RFW_FILTER_DET_MAC | \
3196 	AL_ETH_RFW_FILTER_TAGGED | \
3197 	AL_ETH_RFW_FILTER_UNTAGGED | \
3198 	AL_ETH_RFW_FILTER_BC | \
3199 	AL_ETH_RFW_FILTER_MC | \
3200 	AL_ETH_RFW_FILTER_VLAN_VID | \
3201 	AL_ETH_RFW_FILTER_CTRL_TABLE | \
3202 	AL_ETH_RFW_FILTER_PROT_INDEX | \
3203 	AL_ETH_RFW_FILTER_WOL | \
3204 	AL_ETH_RFW_FILTER_PARSE)
3205 
3206 /* Configure the receive filters */
3207 int al_eth_filter_config(struct al_hal_eth_adapter *adapter, struct al_eth_filter_params *params)
3208 {
3209 	uint32_t reg;
3210 
3211 	al_assert(params); /* valid params pointer */
3212 
3213 	if (params->filters & ~(AL_ETH_RFW_FILTER_SUPPORTED(adapter->rev_id))) {
3214 		al_err("[%s]: unsupported filter options (0x%08x)\n", adapter->name, params->filters);
3215 		return -EINVAL;
3216 	}
3217 
3218 	reg = al_reg_read32(&adapter->ec_regs_base->rfw.out_cfg);
3219 	if (params->enable == AL_TRUE)
3220 		AL_REG_MASK_SET(reg, EC_RFW_OUT_CFG_DROP_EN);
3221 	else
3222 		AL_REG_MASK_CLEAR(reg, EC_RFW_OUT_CFG_DROP_EN);
3223 	al_reg_write32(&adapter->ec_regs_base->rfw.out_cfg, reg);
3224 
3225 	al_reg_write32_masked(
3226 		&adapter->ec_regs_base->rfw.filter,
3227 		AL_ETH_RFW_FILTER_SUPPORTED(adapter->rev_id),
3228 		params->filters);
3229 	if (params->filters & AL_ETH_RFW_FILTER_PROT_INDEX) {
3230 		int i;
3231 		for (i = 0; i < AL_ETH_PROTOCOLS_NUM; i++) {
3232 			reg = al_reg_read32(&adapter->ec_regs_base->epe_a[i].prot_act);
3233 			if (params->filter_proto[i] == AL_TRUE)
3234 				AL_REG_MASK_SET(reg, EC_EPE_A_PROT_ACT_DROP);
3235 			else
3236 				AL_REG_MASK_CLEAR(reg, EC_EPE_A_PROT_ACT_DROP);
3237 			al_reg_write32(&adapter->ec_regs_base->epe_a[i].prot_act, reg);
3238 		}
3239 	}
3240 	return 0;
3241 }
3242 
3243 /* Configure the receive override filters */
3244 int al_eth_filter_override_config(struct al_hal_eth_adapter *adapter,
3245 				  struct al_eth_filter_override_params *params)
3246 {
3247 	uint32_t reg;
3248 
3249 	al_assert(params); /* valid params pointer */
3250 
3251 	if (params->filters & ~(AL_ETH_RFW_FILTER_SUPPORTED(adapter->rev_id))) {
3252 		al_err("[%s]: unsupported override filter options (0x%08x)\n", adapter->name, params->filters);
3253 		return -EINVAL;
3254 	}
3255 
3256 	al_reg_write32_masked(
3257 		&adapter->ec_regs_base->rfw.filter,
3258 		AL_ETH_RFW_FILTER_SUPPORTED(adapter->rev_id) << 16,
3259 		params->filters << 16);
3260 
3261 	reg = al_reg_read32(&adapter->ec_regs_base->rfw.default_or);
3262 	AL_REG_FIELD_SET(reg, EC_RFW_DEFAULT_OR_UDMA_MASK, EC_RFW_DEFAULT_OR_UDMA_SHIFT, params->udma);
3263 	AL_REG_FIELD_SET(reg, EC_RFW_DEFAULT_OR_QUEUE_MASK, EC_RFW_DEFAULT_OR_QUEUE_SHIFT, params->qid);
3264 	al_reg_write32(&adapter->ec_regs_base->rfw.default_or, reg);
3265 	return 0;
3266 }
3267 
3268 
3269 
3270 int al_eth_switching_default_bitmap_set(struct al_hal_eth_adapter *adapter, uint8_t udma_id, uint8_t udma_uc_bitmask,
3271 						uint8_t udma_mc_bitmask,uint8_t udma_bc_bitmask)
3272 {
3273 	al_reg_write32(&adapter->ec_regs_base->tfw_udma[udma_id].uc_udma, udma_uc_bitmask);
3274 	al_reg_write32(&adapter->ec_regs_base->tfw_udma[udma_id].mc_udma, udma_mc_bitmask);
3275 	al_reg_write32(&adapter->ec_regs_base->tfw_udma[udma_id].bc_udma, udma_bc_bitmask);
3276 
3277 	return 0;
3278 }
3279 
3280 int al_eth_flow_control_config(struct al_hal_eth_adapter *adapter, struct al_eth_flow_control_params *params)
3281 {
3282 	uint32_t reg;
3283 	int i;
3284 	al_assert(params); /* valid params pointer */
3285 
3286 	switch(params->type){
3287 	case AL_ETH_FLOW_CONTROL_TYPE_LINK_PAUSE:
3288 		al_dbg("[%s]: config flow control to link pause mode.\n", adapter->name);
3289 
3290 		/* config the mac */
3291 		if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
3292 			/* set quanta value */
3293 			al_reg_write32(
3294 				&adapter->mac_regs_base->mac_1g.pause_quant,
3295 				params->quanta);
3296 			al_reg_write32(
3297 				&adapter->ec_regs_base->efc.xoff_timer_1g,
3298 				params->quanta_th);
3299 
3300 		} else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
3301 			/* set quanta value */
3302 			al_reg_write32(
3303 				&adapter->mac_regs_base->mac_10g.cl01_pause_quanta,
3304 				params->quanta);
3305 			/* set quanta threshold value */
3306 			al_reg_write32(
3307 				&adapter->mac_regs_base->mac_10g.cl01_quanta_thresh,
3308 				params->quanta_th);
3309 		} else {
3310 			/* set quanta value */
3311 			al_eth_40g_mac_reg_write(adapter,
3312 				ETH_MAC_GEN_V3_MAC_40G_CL01_PAUSE_QUANTA_ADDR,
3313 				params->quanta);
3314 			/* set quanta threshold value */
3315 			al_eth_40g_mac_reg_write(adapter,
3316 				ETH_MAC_GEN_V3_MAC_40G_CL01_QUANTA_THRESH_ADDR,
3317 				params->quanta_th);
3318 		}
3319 
3320 		if (params->obay_enable == AL_TRUE)
3321 			/* Tx path FIFO, unmask pause_on from MAC when PAUSE packet received */
3322 			al_reg_write32(&adapter->ec_regs_base->efc.ec_pause, 1);
3323 		else
3324 			al_reg_write32(&adapter->ec_regs_base->efc.ec_pause, 0);
3325 
3326 
3327 		/* Rx path */
3328 		if (params->gen_enable == AL_TRUE)
3329 			/* enable generating xoff from ec fifo almost full indication in hysteresis mode */
3330 			al_reg_write32(&adapter->ec_regs_base->efc.ec_xoff, 1 << EC_EFC_EC_XOFF_MASK_2_SHIFT);
3331 		else
3332 			al_reg_write32(&adapter->ec_regs_base->efc.ec_xoff, 0);
3333 
3334 		if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
3335 			/* in 1G mode, enable generating xon from ec fifo in hysteresis mode*/
3336 			al_reg_write32(&adapter->ec_regs_base->efc.xon, EC_EFC_XON_MASK_2 | EC_EFC_XON_MASK_1);
3337 
3338 		/* set hysteresis mode thresholds */
3339 		al_reg_write32(&adapter->ec_regs_base->efc.rx_fifo_hyst, params->rx_fifo_th_low | (params->rx_fifo_th_high << EC_EFC_RX_FIFO_HYST_TH_HIGH_SHIFT));
3340 
3341 		for (i = 0; i < 4; i++) {
3342 			if (params->obay_enable == AL_TRUE)
3343 				/* Tx path UDMA, unmask pause_on for all queues */
3344 				al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_pause_0,
3345 						params->prio_q_map[i][0]);
3346 			else
3347 				al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_pause_0, 0);
3348 
3349 			if (params->gen_enable == AL_TRUE)
3350 				/* Rx path UDMA, enable generating xoff from UDMA queue almost full indication */
3351 				al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_xoff_0, params->prio_q_map[i][0]);
3352 			else
3353 				al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_xoff_0, 0);
3354 		}
3355 	break;
3356 	case AL_ETH_FLOW_CONTROL_TYPE_PFC:
3357 		al_dbg("[%s]: config flow control to PFC mode.\n", adapter->name);
3358 		al_assert(!AL_ETH_IS_1G_MAC(adapter->mac_mode)); /* pfc not available for RGMII mode */;
3359 
3360 		for (i = 0; i < 4; i++) {
3361 			int prio;
3362 			for (prio = 0; prio < 8; prio++) {
3363 				if (params->obay_enable == AL_TRUE)
3364 					/* Tx path UDMA, unmask pause_on for all queues */
3365 					al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_pause_0 + prio,
3366 							params->prio_q_map[i][prio]);
3367 				else
3368 					al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_pause_0 + prio,
3369 							0);
3370 
3371 				if (params->gen_enable == AL_TRUE)
3372 					al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_xoff_0 + prio,
3373 							params->prio_q_map[i][prio]);
3374 				else
3375 					al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_xoff_0 + prio,
3376 							0);
3377 			}
3378 		}
3379 
3380 		/* Rx path */
3381 		/* enable generating xoff from ec fifo almost full indication in hysteresis mode */
3382 		if (params->gen_enable == AL_TRUE)
3383 			al_reg_write32(&adapter->ec_regs_base->efc.ec_xoff, 0xFF << EC_EFC_EC_XOFF_MASK_2_SHIFT);
3384 		else
3385 			al_reg_write32(&adapter->ec_regs_base->efc.ec_xoff, 0);
3386 
3387 		/* set hysteresis mode thresholds */
3388 		al_reg_write32(&adapter->ec_regs_base->efc.rx_fifo_hyst, params->rx_fifo_th_low | (params->rx_fifo_th_high << EC_EFC_RX_FIFO_HYST_TH_HIGH_SHIFT));
3389 
3390 		if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
3391 			/* config the 10g_mac */
3392 			/* set quanta value (same value for all prios) */
3393 			reg = params->quanta | (params->quanta << 16);
3394 			al_reg_write32(
3395 				&adapter->mac_regs_base->mac_10g.cl01_pause_quanta, reg);
3396 			al_reg_write32(
3397 				&adapter->mac_regs_base->mac_10g.cl23_pause_quanta, reg);
3398 			al_reg_write32(
3399 				&adapter->mac_regs_base->mac_10g.cl45_pause_quanta, reg);
3400 			al_reg_write32(
3401 				&adapter->mac_regs_base->mac_10g.cl67_pause_quanta, reg);
3402 			/* set quanta threshold value (same value for all prios) */
3403 			reg = params->quanta_th | (params->quanta_th << 16);
3404 			al_reg_write32(
3405 				&adapter->mac_regs_base->mac_10g.cl01_quanta_thresh, reg);
3406 			al_reg_write32(
3407 				&adapter->mac_regs_base->mac_10g.cl23_quanta_thresh, reg);
3408 			al_reg_write32(
3409 				&adapter->mac_regs_base->mac_10g.cl45_quanta_thresh, reg);
3410 			al_reg_write32(
3411 				&adapter->mac_regs_base->mac_10g.cl67_quanta_thresh, reg);
3412 
3413 			/* enable PFC in the 10g_MAC */
3414 			reg = al_reg_read32(&adapter->mac_regs_base->mac_10g.cmd_cfg);
3415 			reg |= 1 << 19;
3416 			al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, reg);
3417 		} else {
3418 			/* config the 40g_mac */
3419 			/* set quanta value (same value for all prios) */
3420 			reg = params->quanta | (params->quanta << 16);
3421 			al_eth_40g_mac_reg_write(adapter,
3422 				ETH_MAC_GEN_V3_MAC_40G_CL01_PAUSE_QUANTA_ADDR, reg);
3423 			al_eth_40g_mac_reg_write(adapter,
3424 				ETH_MAC_GEN_V3_MAC_40G_CL23_PAUSE_QUANTA_ADDR, reg);
3425 			al_eth_40g_mac_reg_write(adapter,
3426 				ETH_MAC_GEN_V3_MAC_40G_CL45_PAUSE_QUANTA_ADDR, reg);
3427 			al_eth_40g_mac_reg_write(adapter,
3428 				ETH_MAC_GEN_V3_MAC_40G_CL67_PAUSE_QUANTA_ADDR, reg);
3429 			/* set quanta threshold value (same value for all prios) */
3430 			reg = params->quanta_th | (params->quanta_th << 16);
3431 			al_eth_40g_mac_reg_write(adapter,
3432 				ETH_MAC_GEN_V3_MAC_40G_CL01_QUANTA_THRESH_ADDR, reg);
3433 			al_eth_40g_mac_reg_write(adapter,
3434 				ETH_MAC_GEN_V3_MAC_40G_CL23_QUANTA_THRESH_ADDR, reg);
3435 			al_eth_40g_mac_reg_write(adapter,
3436 				ETH_MAC_GEN_V3_MAC_40G_CL45_QUANTA_THRESH_ADDR, reg);
3437 			al_eth_40g_mac_reg_write(adapter,
3438 				ETH_MAC_GEN_V3_MAC_40G_CL67_QUANTA_THRESH_ADDR, reg);
3439 
3440 			/* enable PFC in the 40g_MAC */
3441 			reg = al_reg_read32(&adapter->mac_regs_base->mac_10g.cmd_cfg);
3442 			reg |= 1 << 19;
3443 			al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, reg);
3444 			reg = al_eth_40g_mac_reg_read(adapter, ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR);
3445 
3446 			reg |= ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_PFC_MODE;
3447 
3448 			al_eth_40g_mac_reg_write(adapter, ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR, reg);
3449 		}
3450 
3451 	break;
3452 	default:
3453 		al_err("[%s]: unsupported flow control type %d\n", adapter->name, params->type);
3454 		return -EINVAL;
3455 
3456 	}
3457 	return 0;
3458 }
3459 
3460 int al_eth_vlan_mod_config(struct al_hal_eth_adapter *adapter, uint8_t udma_id, uint16_t udma_etype, uint16_t vlan1_data, uint16_t vlan2_data)
3461 {
3462 	al_dbg("[%s]: config vlan modification registers. udma id %d.\n", adapter->name, udma_id);
3463 
3464 	al_reg_write32(&adapter->ec_regs_base->tpm_sel[udma_id].etype, udma_etype);
3465 	al_reg_write32(&adapter->ec_regs_base->tpm_udma[udma_id].vlan_data, vlan1_data | (vlan2_data << 16));
3466 
3467 	return 0;
3468 }
3469 
3470 int al_eth_eee_get(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params)
3471 {
3472 	uint32_t reg;
3473 
3474 	al_dbg("[%s]: getting eee.\n", adapter->name);
3475 
3476 	reg = al_reg_read32(&adapter->ec_regs_base->eee.cfg_e);
3477 	params->enable = (reg & EC_EEE_CFG_E_ENABLE) ? AL_TRUE : AL_FALSE;
3478 
3479 	params->tx_eee_timer = al_reg_read32(&adapter->ec_regs_base->eee.pre_cnt);
3480 	params->min_interval = al_reg_read32(&adapter->ec_regs_base->eee.post_cnt);
3481 	params->stop_cnt = al_reg_read32(&adapter->ec_regs_base->eee.stop_cnt);
3482 
3483 	return 0;
3484 }
3485 
3486 
3487 int al_eth_eee_config(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params)
3488 {
3489 	uint32_t reg;
3490 	al_dbg("[%s]: config eee.\n", adapter->name);
3491 
3492 	if (params->enable == 0) {
3493 		al_dbg("[%s]: disable eee.\n", adapter->name);
3494 		al_reg_write32(&adapter->ec_regs_base->eee.cfg_e, 0);
3495 		return 0;
3496 	}
3497 	if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
3498 		al_reg_write32_masked(
3499 			&adapter->mac_regs_base->kr.pcs_cfg,
3500 			ETH_MAC_KR_PCS_CFG_EEE_TIMER_VAL_MASK,
3501 			((AL_ETH_IS_10G_MAC(adapter->mac_mode)) ?
3502 			ETH_MAC_KR_10_PCS_CFG_EEE_TIMER_VAL :
3503 			ETH_MAC_KR_25_PCS_CFG_EEE_TIMER_VAL) <<
3504 			ETH_MAC_KR_PCS_CFG_EEE_TIMER_VAL_SHIFT);
3505 	}
3506 	if ((adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_40G) ||
3507 		(adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_50G)) {
3508 		al_reg_write32_masked(
3509 			&adapter->mac_regs_base->gen_v3.pcs_40g_ll_eee_cfg,
3510 			ETH_MAC_GEN_V3_PCS_40G_LL_EEE_CFG_TIMER_VAL_MASK,
3511 			((adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_40G) ?
3512 			ETH_MAC_XLG_40_PCS_CFG_EEE_TIMER_VAL :
3513 			ETH_MAC_XLG_50_PCS_CFG_EEE_TIMER_VAL) <<
3514 			ETH_MAC_GEN_V3_PCS_40G_LL_EEE_CFG_TIMER_VAL_SHIFT);
3515 		/* set Deep sleep mode as the LPI function (instead of Fast wake mode) */
3516 		al_eth_40g_pcs_reg_write(adapter, ETH_MAC_GEN_V3_PCS_40G_EEE_CONTROL_ADDR,
3517 			params->fast_wake ? 1 : 0);
3518 	}
3519 
3520 	al_reg_write32(&adapter->ec_regs_base->eee.pre_cnt, params->tx_eee_timer);
3521 	al_reg_write32(&adapter->ec_regs_base->eee.post_cnt, params->min_interval);
3522 	al_reg_write32(&adapter->ec_regs_base->eee.stop_cnt, params->stop_cnt);
3523 
3524 	reg = EC_EEE_CFG_E_MASK_EC_TMI_STOP | EC_EEE_CFG_E_MASK_MAC_EEE |
3525 	       EC_EEE_CFG_E_ENABLE |
3526 	       EC_EEE_CFG_E_USE_EC_TX_FIFO | EC_EEE_CFG_E_USE_EC_RX_FIFO;
3527 
3528 	/*
3529 	 * Addressing RMN: 3732
3530 	 *
3531 	 * RMN description:
3532 	 * When the HW get into eee mode, it can't transmit any pause packet
3533 	 * (when flow control policy is enabled).
3534 	 * In such case, the HW has no way to handle extreme pushback from
3535 	 * the Rx_path fifos.
3536 	 *
3537 	 * Software flow:
3538 	 * Configure RX_FIFO empty as eee mode term.
3539 	 * That way, nothing will prevent pause packet transmittion in
3540 	 * case of extreme pushback from the Rx_path fifos.
3541 	 *
3542 	 */
3543 
3544 	al_reg_write32(&adapter->ec_regs_base->eee.cfg_e, reg);
3545 
3546 	return 0;
3547 }
3548 
3549 /* Timestamp */
3550 /* prepare the adapter for doing Timestamps for Rx packets. */
3551 int al_eth_ts_init(struct al_hal_eth_adapter *adapter)
3552 {
3553 	uint32_t reg;
3554 
3555 	/*TODO:
3556 	 * return error when:
3557 	 * - working in 1G mode and MACSEC enabled
3558 	 * - RX completion descriptor is not 8 words
3559 	 */
3560 	reg = al_reg_read32(&adapter->ec_regs_base->gen.en_ext);
3561 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
3562 		reg &= ~EC_GEN_EN_EXT_PTH_1_10_SEL;
3563 	else
3564 		reg |= EC_GEN_EN_EXT_PTH_1_10_SEL;
3565 	/*
3566 	 * set completion bypass so tx timestamps won't be inserted to tx cmpl
3567 	 * (in order to disable unverified flow)
3568 	 */
3569 	reg |= EC_GEN_EN_EXT_PTH_COMPLETION_BYPASS;
3570 	al_reg_write32(&adapter->ec_regs_base->gen.en_ext, reg);
3571 
3572 	/*TODO: add the following when we have updated regs file:
3573 	 * reg_rfw_out_cfg_timestamp_sample_out
3574 		0 (default) – use the timestamp from the SOP info (10G MAC)
3575 		1 – use the timestamp from the EOP (1G MAC) (noly when MACSEC is disabled)
3576 	 */
3577 	return 0;
3578 }
3579 
3580 /* read Timestamp sample value of previously transmitted packet. */
3581 int al_eth_tx_ts_val_get(struct al_hal_eth_adapter *adapter, uint8_t ts_index,
3582 			 uint32_t *timestamp)
3583 {
3584 	al_assert(ts_index < AL_ETH_PTH_TX_SAMPLES_NUM);
3585 
3586 	/* in 1G mode, only indexes 1-7 are allowed*/
3587 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
3588 		al_assert(ts_index <= 7);
3589 		al_assert(ts_index >= 1);
3590 	}
3591 
3592 	/*TODO: check if sample is valid */
3593 	*timestamp = al_reg_read32(&adapter->ec_regs_base->pth_db[ts_index].ts);
3594 	return 0;
3595 }
3596 
3597 /* Read the systime value */
3598 int al_eth_pth_systime_read(struct al_hal_eth_adapter *adapter,
3599 			    struct al_eth_pth_time *systime)
3600 {
3601 	uint32_t reg;
3602 
3603 	/* first we must read the subseconds MSB so the seconds register will be
3604 	 * shadowed
3605 	 */
3606 	reg = al_reg_read32(&adapter->ec_regs_base->pth.system_time_subseconds_msb);
3607 	systime->femto = (uint64_t)reg << 18;
3608 	reg = al_reg_read32(&adapter->ec_regs_base->pth.system_time_seconds);
3609 	systime->seconds = reg;
3610 
3611 	return 0;
3612 }
3613 
3614 /* Set the clock period to a given value. */
3615 int al_eth_pth_clk_period_write(struct al_hal_eth_adapter *adapter,
3616 				uint64_t clk_period)
3617 {
3618 	uint32_t reg;
3619 	/* first write the LSB so it will be shadowed */
3620 	/* bits 31:14 of the clock period lsb register contains bits 17:0 of the
3621 	 * period.
3622 	 */
3623 	reg = (clk_period & AL_BIT_MASK(18)) << EC_PTH_CLOCK_PERIOD_LSB_VAL_SHIFT;
3624 	al_reg_write32(&adapter->ec_regs_base->pth.clock_period_lsb, reg);
3625 	reg = clk_period >> 18;
3626 	al_reg_write32(&adapter->ec_regs_base->pth.clock_period_msb, reg);
3627 
3628 	return 0;
3629 }
3630 
3631 /* Configure the systime internal update */
3632 int al_eth_pth_int_update_config(struct al_hal_eth_adapter *adapter,
3633 				 struct al_eth_pth_int_update_params *params)
3634 {
3635 	uint32_t reg;
3636 
3637 	reg = al_reg_read32(&adapter->ec_regs_base->pth.int_update_ctrl);
3638 	if (params->enable == AL_FALSE) {
3639 		reg &= ~EC_PTH_INT_UPDATE_CTRL_INT_TRIG_EN;
3640 	} else {
3641 		reg |= EC_PTH_INT_UPDATE_CTRL_INT_TRIG_EN;
3642 		AL_REG_FIELD_SET(reg, EC_PTH_INT_UPDATE_CTRL_UPDATE_METHOD_MASK,
3643 				 EC_PTH_INT_UPDATE_CTRL_UPDATE_METHOD_SHIFT,
3644 				 params->method);
3645 		if (params->trigger == AL_ETH_PTH_INT_TRIG_REG_WRITE)
3646 			reg |= EC_PTH_INT_UPDATE_CTRL_UPDATE_TRIG;
3647 		else
3648 			reg &= ~EC_PTH_INT_UPDATE_CTRL_UPDATE_TRIG;
3649 	}
3650 	al_reg_write32(&adapter->ec_regs_base->pth.int_update_ctrl, reg);
3651 	return 0;
3652 }
3653 /* set internal update time */
3654 int al_eth_pth_int_update_time_set(struct al_hal_eth_adapter *adapter,
3655 				   struct al_eth_pth_time *time)
3656 {
3657 	uint32_t reg;
3658 
3659 	al_reg_write32(&adapter->ec_regs_base->pth.int_update_seconds,
3660 		       time->seconds);
3661 	reg = time->femto & AL_BIT_MASK(18);
3662 	reg = reg << EC_PTH_INT_UPDATE_SUBSECONDS_LSB_VAL_SHIFT;
3663 	al_reg_write32(&adapter->ec_regs_base->pth.int_update_subseconds_lsb,
3664 		       reg);
3665 	reg = time->femto >> 18;
3666 	al_reg_write32(&adapter->ec_regs_base->pth.int_update_subseconds_msb,
3667 		       reg);
3668 
3669 	return 0;
3670 }
3671 
3672 /* Configure the systime external update */
3673 int al_eth_pth_ext_update_config(struct al_hal_eth_adapter *adapter,
3674 				 struct al_eth_pth_ext_update_params * params)
3675 {
3676 	uint32_t reg;
3677 
3678 	reg = al_reg_read32(&adapter->ec_regs_base->pth.int_update_ctrl);
3679 	AL_REG_FIELD_SET(reg, EC_PTH_INT_UPDATE_CTRL_UPDATE_METHOD_MASK,
3680 			 EC_PTH_INT_UPDATE_CTRL_UPDATE_METHOD_SHIFT,
3681 			 params->method);
3682 
3683 	AL_REG_FIELD_SET(reg, EC_PTH_EXT_UPDATE_CTRL_EXT_TRIG_EN_MASK,
3684 			 EC_PTH_EXT_UPDATE_CTRL_EXT_TRIG_EN_SHIFT,
3685 			 params->triggers);
3686 	al_reg_write32(&adapter->ec_regs_base->pth.int_update_ctrl, reg);
3687 	return 0;
3688 }
3689 
3690 /* set external update time */
3691 int al_eth_pth_ext_update_time_set(struct al_hal_eth_adapter *adapter,
3692 				   struct al_eth_pth_time *time)
3693 {
3694 	uint32_t reg;
3695 
3696 	al_reg_write32(&adapter->ec_regs_base->pth.ext_update_seconds,
3697 		       time->seconds);
3698 	reg = time->femto & AL_BIT_MASK(18);
3699 	reg = reg << EC_PTH_EXT_UPDATE_SUBSECONDS_LSB_VAL_SHIFT;
3700 	al_reg_write32(&adapter->ec_regs_base->pth.ext_update_subseconds_lsb,
3701 		       reg);
3702 	reg = time->femto >> 18;
3703 	al_reg_write32(&adapter->ec_regs_base->pth.ext_update_subseconds_msb,
3704 		       reg);
3705 
3706 	return 0;
3707 };
3708 
3709 /* set the read compensation delay */
3710 int al_eth_pth_read_compensation_set(struct al_hal_eth_adapter *adapter,
3711 				     uint64_t subseconds)
3712 {
3713 	uint32_t reg;
3714 
3715 	/* first write to lsb to ensure atomicity */
3716 	reg = (subseconds & AL_BIT_MASK(18)) << EC_PTH_READ_COMPENSATION_SUBSECONDS_LSB_VAL_SHIFT;
3717 	al_reg_write32(&adapter->ec_regs_base->pth.read_compensation_subseconds_lsb, reg);
3718 
3719 	reg = subseconds >> 18;
3720 	al_reg_write32(&adapter->ec_regs_base->pth.read_compensation_subseconds_msb, reg);
3721 	return 0;
3722 }
3723 
3724 /* set the internal write compensation delay */
3725 int al_eth_pth_int_write_compensation_set(struct al_hal_eth_adapter *adapter,
3726 					  uint64_t subseconds)
3727 {
3728 	uint32_t reg;
3729 
3730 	/* first write to lsb to ensure atomicity */
3731 	reg = (subseconds & AL_BIT_MASK(18)) << EC_PTH_INT_WRITE_COMPENSATION_SUBSECONDS_LSB_VAL_SHIFT;
3732 	al_reg_write32(&adapter->ec_regs_base->pth.int_write_compensation_subseconds_lsb, reg);
3733 
3734 	reg = subseconds >> 18;
3735 	al_reg_write32(&adapter->ec_regs_base->pth.int_write_compensation_subseconds_msb, reg);
3736 	return 0;
3737 }
3738 
3739 /* set the external write compensation delay */
3740 int al_eth_pth_ext_write_compensation_set(struct al_hal_eth_adapter *adapter,
3741 					  uint64_t subseconds)
3742 {
3743 	uint32_t reg;
3744 
3745 	/* first write to lsb to ensure atomicity */
3746 	reg = (subseconds & AL_BIT_MASK(18)) << EC_PTH_EXT_WRITE_COMPENSATION_SUBSECONDS_LSB_VAL_SHIFT;
3747 	al_reg_write32(&adapter->ec_regs_base->pth.ext_write_compensation_subseconds_lsb, reg);
3748 
3749 	reg = subseconds >> 18;
3750 	al_reg_write32(&adapter->ec_regs_base->pth.ext_write_compensation_subseconds_msb, reg);
3751 	return 0;
3752 }
3753 
3754 /* set the sync compensation delay */
3755 int al_eth_pth_sync_compensation_set(struct al_hal_eth_adapter *adapter,
3756 				     uint64_t subseconds)
3757 {
3758 	uint32_t reg;
3759 
3760 	/* first write to lsb to ensure atomicity */
3761 	reg = (subseconds & AL_BIT_MASK(18)) << EC_PTH_SYNC_COMPENSATION_SUBSECONDS_LSB_VAL_SHIFT;
3762 	al_reg_write32(&adapter->ec_regs_base->pth.sync_compensation_subseconds_lsb, reg);
3763 
3764 	reg = subseconds >> 18;
3765 	al_reg_write32(&adapter->ec_regs_base->pth.sync_compensation_subseconds_msb, reg);
3766 	return 0;
3767 }
3768 
3769 /* Configure an output pulse */
3770 int al_eth_pth_pulse_out_config(struct al_hal_eth_adapter *adapter,
3771 				struct al_eth_pth_pulse_out_params *params)
3772 {
3773 	uint32_t reg;
3774 
3775 	if (params->index >= AL_ETH_PTH_PULSE_OUT_NUM) {
3776 		al_err("eth [%s] PTH out pulse index out of range\n",
3777 				 adapter->name);
3778 		return -EINVAL;
3779 	}
3780 	reg = al_reg_read32(&adapter->ec_regs_base->pth_egress[params->index].trigger_ctrl);
3781 	if (params->enable == AL_FALSE) {
3782 		reg &= ~EC_PTH_EGRESS_TRIGGER_CTRL_EN;
3783 	} else {
3784 		reg |= EC_PTH_EGRESS_TRIGGER_CTRL_EN;
3785 		if (params->periodic == AL_FALSE)
3786 			reg &= ~EC_PTH_EGRESS_TRIGGER_CTRL_PERIODIC;
3787 		else
3788 			reg |= EC_PTH_EGRESS_TRIGGER_CTRL_PERIODIC;
3789 
3790 		AL_REG_FIELD_SET(reg, EC_PTH_EGRESS_TRIGGER_CTRL_PERIOD_SUBSEC_MASK,
3791 				 EC_PTH_EGRESS_TRIGGER_CTRL_PERIOD_SUBSEC_SHIFT,
3792 				 params->period_us);
3793 		AL_REG_FIELD_SET(reg, EC_PTH_EGRESS_TRIGGER_CTRL_PERIOD_SEC_MASK,
3794 				 EC_PTH_EGRESS_TRIGGER_CTRL_PERIOD_SEC_SHIFT,
3795 				 params->period_sec);
3796 	}
3797 	al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].trigger_ctrl, reg);
3798 
3799 	/* set trigger time */
3800 	al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].trigger_seconds,
3801 		       params->start_time.seconds);
3802 	reg = params->start_time.femto & AL_BIT_MASK(18);
3803 	reg = reg << EC_PTH_EGRESS_TRIGGER_SUBSECONDS_LSB_VAL_SHIFT;
3804 	al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].trigger_subseconds_lsb,
3805 		       reg);
3806 	reg = params->start_time.femto >> 18;
3807 	al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].trigger_subseconds_msb,
3808 		       reg);
3809 
3810 	/* set pulse width */
3811 	reg = params->pulse_width & AL_BIT_MASK(18);
3812 	reg = reg << EC_PTH_EGRESS_PULSE_WIDTH_SUBSECONDS_LSB_VAL_SHIFT;
3813 	al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].pulse_width_subseconds_lsb, reg);
3814 
3815 	reg = params->pulse_width  >> 18;
3816 	al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].pulse_width_subseconds_msb, reg);
3817 
3818 	return 0;
3819 }
3820 
3821 /** get link status */
3822 int al_eth_link_status_get(struct al_hal_eth_adapter *adapter,
3823 			   struct al_eth_link_status *status)
3824 {
3825 	uint32_t reg;
3826 
3827 	if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
3828 		status->link_up = AL_FALSE;
3829 		status->local_fault = AL_TRUE;
3830 		status->remote_fault = AL_TRUE;
3831 
3832 		al_reg_write32(&adapter->mac_regs_base->kr.pcs_addr, ETH_MAC_KR_PCS_BASE_R_STATUS2);
3833 		reg = al_reg_read32(&adapter->mac_regs_base->kr.pcs_data);
3834 
3835 		if (reg & AL_BIT(15)) {
3836 			reg = al_reg_read32(&adapter->mac_regs_base->mac_10g.status);
3837 
3838 			status->remote_fault = ((reg & ETH_MAC_GEN_MAC_10G_STAT_REM_FAULT) ?
3839 							AL_TRUE : AL_FALSE);
3840 			status->local_fault = ((reg & ETH_MAC_GEN_MAC_10G_STAT_LOC_FAULT) ?
3841 							AL_TRUE : AL_FALSE);
3842 
3843 			status->link_up = ((status->remote_fault == AL_FALSE) &&
3844 					   (status->local_fault == AL_FALSE));
3845 		}
3846 
3847 	} else if (adapter->mac_mode == AL_ETH_MAC_MODE_SGMII) {
3848 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 1);
3849 		/*
3850 		 * This register is latched low so need to read twice to get
3851 		 * the current link status
3852 		 */
3853 		reg = al_reg_read32(&adapter->mac_regs_base->sgmii.reg_data);
3854 		reg = al_reg_read32(&adapter->mac_regs_base->sgmii.reg_data);
3855 
3856 		status->link_up = AL_FALSE;
3857 
3858 		if (reg & AL_BIT(2))
3859 			status->link_up = AL_TRUE;
3860 
3861 		reg = al_reg_read32(&adapter->mac_regs_base->sgmii.link_stat);
3862 
3863 		if ((reg & AL_BIT(3)) == 0)
3864 			status->link_up = AL_FALSE;
3865 
3866 	} else if (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII) {
3867 		reg = al_reg_read32(&adapter->mac_regs_base->gen.rgmii_stat);
3868 
3869 		status->link_up = AL_FALSE;
3870 
3871 		if (reg & AL_BIT(4))
3872 			status->link_up = AL_TRUE;
3873 
3874 	} else if (adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_25G) {
3875 		status->link_up = AL_FALSE;
3876 		status->local_fault = AL_TRUE;
3877 		status->remote_fault = AL_TRUE;
3878 
3879 		reg = al_reg_read32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_status);
3880 
3881 		status->link_up = AL_FALSE;
3882 
3883 		if ((reg & 0xF) == 0xF) {
3884 			reg = al_reg_read32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_status);
3885 
3886 			status->remote_fault = ((reg & ETH_MAC_GEN_V3_MAC_40G_LL_STATUS_REM_FAULT) ?
3887 							AL_TRUE : AL_FALSE);
3888 			status->local_fault = ((reg & ETH_MAC_GEN_V3_MAC_40G_LL_STATUS_LOC_FAULT) ?
3889 							AL_TRUE : AL_FALSE);
3890 
3891 			status->link_up = ((status->remote_fault == AL_FALSE) &&
3892 					   (status->local_fault == AL_FALSE));
3893 		}
3894 
3895 	} else if ((adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_40G) ||
3896 			(adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_50G)) {
3897 		reg = al_reg_read32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_status);
3898 
3899 		status->link_up = AL_FALSE;
3900 
3901 		if ((reg & 0x1F) == 0x1F) {
3902 			reg = al_reg_read32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_status);
3903 			if ((reg & (ETH_MAC_GEN_V3_MAC_40G_LL_STATUS_REM_FAULT |
3904 					ETH_MAC_GEN_V3_MAC_40G_LL_STATUS_LOC_FAULT)) == 0)
3905 				status->link_up = AL_TRUE;
3906 		}
3907 
3908 	} else {
3909 		/* not implemented yet */
3910 		return -EPERM;
3911 	}
3912 
3913 	al_dbg("[%s]: mac %s port. link_status: %s.\n", adapter->name,
3914 		al_eth_mac_mode_str(adapter->mac_mode),
3915 		(status->link_up == AL_TRUE) ? "LINK_UP" : "LINK_DOWN");
3916 
3917 	return 0;
3918 }
3919 
3920 int al_eth_link_status_clear(struct al_hal_eth_adapter *adapter)
3921 {
3922 	int status = 0;
3923 
3924 	if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
3925 		al_reg_write32(&adapter->mac_regs_base->kr.pcs_addr, ETH_MAC_KR_PCS_BASE_R_STATUS2);
3926 		al_reg_read32(&adapter->mac_regs_base->kr.pcs_data);
3927 
3928 		al_reg_read32(&adapter->mac_regs_base->mac_10g.status);
3929 	} else {
3930 		status = -1;
3931 	}
3932 
3933 	return status;
3934 }
3935 
3936 /** set LED mode and value */
3937 int al_eth_led_set(struct al_hal_eth_adapter *adapter, al_bool link_is_up)
3938 {
3939 	uint32_t reg = 0;
3940 	uint32_t mode  = ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG;
3941 
3942 	if (link_is_up)
3943 		mode = ETH_MAC_GEN_LED_CFG_SEL_LINK_ACTIVITY;
3944 
3945 	AL_REG_FIELD_SET(reg,  ETH_MAC_GEN_LED_CFG_SEL_MASK,
3946 			 ETH_MAC_GEN_LED_CFG_SEL_SHIFT, mode);
3947 
3948 	AL_REG_FIELD_SET(reg, ETH_MAC_GEN_LED_CFG_BLINK_TIMER_MASK,
3949 			 ETH_MAC_GEN_LED_CFG_BLINK_TIMER_SHIFT,
3950 			 ETH_MAC_GEN_LED_CFG_BLINK_TIMER_VAL);
3951 
3952 	AL_REG_FIELD_SET(reg, ETH_MAC_GEN_LED_CFG_ACT_TIMER_MASK,
3953 			 ETH_MAC_GEN_LED_CFG_ACT_TIMER_SHIFT,
3954 			 ETH_MAC_GEN_LED_CFG_ACT_TIMER_VAL);
3955 
3956 	al_reg_write32(&adapter->mac_regs_base->gen.led_cfg, reg);
3957 
3958 	return 0;
3959 }
3960 
3961 /* get statistics */
3962 int al_eth_mac_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_mac_stats *stats)
3963 {
3964 	al_assert(stats);
3965 
3966 	al_memset(stats, 0, sizeof(struct al_eth_mac_stats));
3967 
3968 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
3969 		struct al_eth_mac_1g_stats __iomem *reg_stats =
3970 			&adapter->mac_regs_base->mac_1g.stats;
3971 
3972 		stats->ifInUcastPkts = al_reg_read32(&reg_stats->ifInUcastPkts);
3973 		stats->ifInMulticastPkts = al_reg_read32(&reg_stats->ifInMulticastPkts);
3974 		stats->ifInBroadcastPkts = al_reg_read32(&reg_stats->ifInBroadcastPkts);
3975 		stats->etherStatsPkts = al_reg_read32(&reg_stats->etherStatsPkts);
3976 		stats->ifOutUcastPkts = al_reg_read32(&reg_stats->ifOutUcastPkts);
3977 		stats->ifOutMulticastPkts = al_reg_read32(&reg_stats->ifOutMulticastPkts);
3978 		stats->ifOutBroadcastPkts = al_reg_read32(&reg_stats->ifOutBroadcastPkts);
3979 		stats->ifInErrors = al_reg_read32(&reg_stats->ifInErrors);
3980 		stats->ifOutErrors = al_reg_read32(&reg_stats->ifOutErrors);
3981 		stats->aFramesReceivedOK = al_reg_read32(&reg_stats->aFramesReceivedOK);
3982 		stats->aFramesTransmittedOK = al_reg_read32(&reg_stats->aFramesTransmittedOK);
3983 		stats->aOctetsReceivedOK = al_reg_read32(&reg_stats->aOctetsReceivedOK);
3984 		stats->aOctetsTransmittedOK = al_reg_read32(&reg_stats->aOctetsTransmittedOK);
3985 		stats->etherStatsUndersizePkts = al_reg_read32(&reg_stats->etherStatsUndersizePkts);
3986 		stats->etherStatsFragments = al_reg_read32(&reg_stats->etherStatsFragments);
3987 		stats->etherStatsJabbers = al_reg_read32(&reg_stats->etherStatsJabbers);
3988 		stats->etherStatsOversizePkts = al_reg_read32(&reg_stats->etherStatsOversizePkts);
3989 		stats->aFrameCheckSequenceErrors =
3990 			al_reg_read32(&reg_stats->aFrameCheckSequenceErrors);
3991 		stats->aAlignmentErrors = al_reg_read32(&reg_stats->aAlignmentErrors);
3992 		stats->etherStatsDropEvents = al_reg_read32(&reg_stats->etherStatsDropEvents);
3993 		stats->aPAUSEMACCtrlFramesTransmitted =
3994 			al_reg_read32(&reg_stats->aPAUSEMACCtrlFramesTransmitted);
3995 		stats->aPAUSEMACCtrlFramesReceived =
3996 			al_reg_read32(&reg_stats->aPAUSEMACCtrlFramesReceived);
3997 		stats->aFrameTooLongErrors = 0; /* N/A */
3998 		stats->aInRangeLengthErrors = 0; /* N/A */
3999 		stats->VLANTransmittedOK = 0; /* N/A */
4000 		stats->VLANReceivedOK = 0; /* N/A */
4001 		stats->etherStatsOctets = al_reg_read32(&reg_stats->etherStatsOctets);
4002 		stats->etherStatsPkts64Octets = al_reg_read32(&reg_stats->etherStatsPkts64Octets);
4003 		stats->etherStatsPkts65to127Octets =
4004 			al_reg_read32(&reg_stats->etherStatsPkts65to127Octets);
4005 		stats->etherStatsPkts128to255Octets =
4006 			al_reg_read32(&reg_stats->etherStatsPkts128to255Octets);
4007 		stats->etherStatsPkts256to511Octets =
4008 			al_reg_read32(&reg_stats->etherStatsPkts256to511Octets);
4009 		stats->etherStatsPkts512to1023Octets =
4010 			al_reg_read32(&reg_stats->etherStatsPkts512to1023Octets);
4011 		stats->etherStatsPkts1024to1518Octets =
4012 			al_reg_read32(&reg_stats->etherStatsPkts1024to1518Octets);
4013 		stats->etherStatsPkts1519toX = al_reg_read32(&reg_stats->etherStatsPkts1519toX);
4014 	} else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
4015 		if (adapter->rev_id < AL_ETH_REV_ID_3) {
4016 			struct al_eth_mac_10g_stats_v2 __iomem *reg_stats =
4017 				&adapter->mac_regs_base->mac_10g.stats.v2;
4018 			uint64_t octets;
4019 
4020 			stats->ifInUcastPkts = al_reg_read32(&reg_stats->ifInUcastPkts);
4021 			stats->ifInMulticastPkts = al_reg_read32(&reg_stats->ifInMulticastPkts);
4022 			stats->ifInBroadcastPkts = al_reg_read32(&reg_stats->ifInBroadcastPkts);
4023 			stats->etherStatsPkts = al_reg_read32(&reg_stats->etherStatsPkts);
4024 			stats->ifOutUcastPkts = al_reg_read32(&reg_stats->ifOutUcastPkts);
4025 			stats->ifOutMulticastPkts = al_reg_read32(&reg_stats->ifOutMulticastPkts);
4026 			stats->ifOutBroadcastPkts = al_reg_read32(&reg_stats->ifOutBroadcastPkts);
4027 			stats->ifInErrors = al_reg_read32(&reg_stats->ifInErrors);
4028 			stats->ifOutErrors = al_reg_read32(&reg_stats->ifOutErrors);
4029 			stats->aFramesReceivedOK = al_reg_read32(&reg_stats->aFramesReceivedOK);
4030 			stats->aFramesTransmittedOK = al_reg_read32(&reg_stats->aFramesTransmittedOK);
4031 
4032 			/* aOctetsReceivedOK = ifInOctets - 18 * aFramesReceivedOK - 4 * VLANReceivedOK */
4033 			octets = al_reg_read32(&reg_stats->ifInOctetsL);
4034 			octets |= (uint64_t)(al_reg_read32(&reg_stats->ifInOctetsH)) << 32;
4035 			octets -= 18 * stats->aFramesReceivedOK;
4036 			octets -= 4 * al_reg_read32(&reg_stats->VLANReceivedOK);
4037 			stats->aOctetsReceivedOK = octets;
4038 
4039 			/* aOctetsTransmittedOK = ifOutOctets - 18 * aFramesTransmittedOK - 4 * VLANTransmittedOK */
4040 			octets = al_reg_read32(&reg_stats->ifOutOctetsL);
4041 			octets |= (uint64_t)(al_reg_read32(&reg_stats->ifOutOctetsH)) << 32;
4042 			octets -= 18 * stats->aFramesTransmittedOK;
4043 			octets -= 4 * al_reg_read32(&reg_stats->VLANTransmittedOK);
4044 			stats->aOctetsTransmittedOK = octets;
4045 
4046 			stats->etherStatsUndersizePkts = al_reg_read32(&reg_stats->etherStatsUndersizePkts);
4047 			stats->etherStatsFragments = al_reg_read32(&reg_stats->etherStatsFragments);
4048 			stats->etherStatsJabbers = al_reg_read32(&reg_stats->etherStatsJabbers);
4049 			stats->etherStatsOversizePkts = al_reg_read32(&reg_stats->etherStatsOversizePkts);
4050 			stats->aFrameCheckSequenceErrors = al_reg_read32(&reg_stats->aFrameCheckSequenceErrors);
4051 			stats->aAlignmentErrors = al_reg_read32(&reg_stats->aAlignmentErrors);
4052 			stats->etherStatsDropEvents = al_reg_read32(&reg_stats->etherStatsDropEvents);
4053 			stats->aPAUSEMACCtrlFramesTransmitted = al_reg_read32(&reg_stats->aPAUSEMACCtrlFramesTransmitted);
4054 			stats->aPAUSEMACCtrlFramesReceived = al_reg_read32(&reg_stats->aPAUSEMACCtrlFramesReceived);
4055 			stats->aFrameTooLongErrors = al_reg_read32(&reg_stats->aFrameTooLongErrors);
4056 			stats->aInRangeLengthErrors = al_reg_read32(&reg_stats->aInRangeLengthErrors);
4057 			stats->VLANTransmittedOK = al_reg_read32(&reg_stats->VLANTransmittedOK);
4058 			stats->VLANReceivedOK = al_reg_read32(&reg_stats->VLANReceivedOK);
4059 			stats->etherStatsOctets = al_reg_read32(&reg_stats->etherStatsOctets);
4060 			stats->etherStatsPkts64Octets = al_reg_read32(&reg_stats->etherStatsPkts64Octets);
4061 			stats->etherStatsPkts65to127Octets = al_reg_read32(&reg_stats->etherStatsPkts65to127Octets);
4062 			stats->etherStatsPkts128to255Octets = al_reg_read32(&reg_stats->etherStatsPkts128to255Octets);
4063 			stats->etherStatsPkts256to511Octets = al_reg_read32(&reg_stats->etherStatsPkts256to511Octets);
4064 			stats->etherStatsPkts512to1023Octets = al_reg_read32(&reg_stats->etherStatsPkts512to1023Octets);
4065 			stats->etherStatsPkts1024to1518Octets = al_reg_read32(&reg_stats->etherStatsPkts1024to1518Octets);
4066 			stats->etherStatsPkts1519toX = al_reg_read32(&reg_stats->etherStatsPkts1519toX);
4067 		} else {
4068 			struct al_eth_mac_10g_stats_v3_rx __iomem *reg_rx_stats =
4069 				&adapter->mac_regs_base->mac_10g.stats.v3.rx;
4070 			struct al_eth_mac_10g_stats_v3_tx __iomem *reg_tx_stats =
4071 				&adapter->mac_regs_base->mac_10g.stats.v3.tx;
4072 			uint64_t octets;
4073 
4074 			stats->ifInUcastPkts = al_reg_read32(&reg_rx_stats->ifInUcastPkts);
4075 			stats->ifInMulticastPkts = al_reg_read32(&reg_rx_stats->ifInMulticastPkts);
4076 			stats->ifInBroadcastPkts = al_reg_read32(&reg_rx_stats->ifInBroadcastPkts);
4077 			stats->etherStatsPkts = al_reg_read32(&reg_rx_stats->etherStatsPkts);
4078 			stats->ifOutUcastPkts = al_reg_read32(&reg_tx_stats->ifUcastPkts);
4079 			stats->ifOutMulticastPkts = al_reg_read32(&reg_tx_stats->ifMulticastPkts);
4080 			stats->ifOutBroadcastPkts = al_reg_read32(&reg_tx_stats->ifBroadcastPkts);
4081 			stats->ifInErrors = al_reg_read32(&reg_rx_stats->ifInErrors);
4082 			stats->ifOutErrors = al_reg_read32(&reg_tx_stats->ifOutErrors);
4083 			stats->aFramesReceivedOK = al_reg_read32(&reg_rx_stats->FramesOK);
4084 			stats->aFramesTransmittedOK = al_reg_read32(&reg_tx_stats->FramesOK);
4085 
4086 			/* aOctetsReceivedOK = ifInOctets - 18 * aFramesReceivedOK - 4 * VLANReceivedOK */
4087 			octets = al_reg_read32(&reg_rx_stats->ifOctetsL);
4088 			octets |= (uint64_t)(al_reg_read32(&reg_rx_stats->ifOctetsH)) << 32;
4089 			octets -= 18 * stats->aFramesReceivedOK;
4090 			octets -= 4 * al_reg_read32(&reg_rx_stats->VLANOK);
4091 			stats->aOctetsReceivedOK = octets;
4092 
4093 			/* aOctetsTransmittedOK = ifOutOctets - 18 * aFramesTransmittedOK - 4 * VLANTransmittedOK */
4094 			octets = al_reg_read32(&reg_tx_stats->ifOctetsL);
4095 			octets |= (uint64_t)(al_reg_read32(&reg_tx_stats->ifOctetsH)) << 32;
4096 			octets -= 18 * stats->aFramesTransmittedOK;
4097 			octets -= 4 * al_reg_read32(&reg_tx_stats->VLANOK);
4098 			stats->aOctetsTransmittedOK = octets;
4099 
4100 			stats->etherStatsUndersizePkts = al_reg_read32(&reg_rx_stats->etherStatsUndersizePkts);
4101 			stats->etherStatsFragments = al_reg_read32(&reg_rx_stats->etherStatsFragments);
4102 			stats->etherStatsJabbers = al_reg_read32(&reg_rx_stats->etherStatsJabbers);
4103 			stats->etherStatsOversizePkts = al_reg_read32(&reg_rx_stats->etherStatsOversizePkts);
4104 			stats->aFrameCheckSequenceErrors = al_reg_read32(&reg_rx_stats->CRCErrors);
4105 			stats->aAlignmentErrors = al_reg_read32(&reg_rx_stats->aAlignmentErrors);
4106 			stats->etherStatsDropEvents = al_reg_read32(&reg_rx_stats->etherStatsDropEvents);
4107 			stats->aPAUSEMACCtrlFramesTransmitted = al_reg_read32(&reg_tx_stats->aPAUSEMACCtrlFrames);
4108 			stats->aPAUSEMACCtrlFramesReceived = al_reg_read32(&reg_rx_stats->aPAUSEMACCtrlFrames);
4109 			stats->aFrameTooLongErrors = al_reg_read32(&reg_rx_stats->aFrameTooLong);
4110 			stats->aInRangeLengthErrors = al_reg_read32(&reg_rx_stats->aInRangeLengthErrors);
4111 			stats->VLANTransmittedOK = al_reg_read32(&reg_tx_stats->VLANOK);
4112 			stats->VLANReceivedOK = al_reg_read32(&reg_rx_stats->VLANOK);
4113 			stats->etherStatsOctets = al_reg_read32(&reg_rx_stats->etherStatsOctets);
4114 			stats->etherStatsPkts64Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts64Octets);
4115 			stats->etherStatsPkts65to127Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts65to127Octets);
4116 			stats->etherStatsPkts128to255Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts128to255Octets);
4117 			stats->etherStatsPkts256to511Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts256to511Octets);
4118 			stats->etherStatsPkts512to1023Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts512to1023Octets);
4119 			stats->etherStatsPkts1024to1518Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts1024to1518Octets);
4120 			stats->etherStatsPkts1519toX = al_reg_read32(&reg_rx_stats->etherStatsPkts1519toMax);
4121 		}
4122 	} else {
4123 		struct al_eth_mac_10g_stats_v3_rx __iomem *reg_rx_stats =
4124 			&adapter->mac_regs_base->mac_10g.stats.v3.rx;
4125 		struct al_eth_mac_10g_stats_v3_tx __iomem *reg_tx_stats =
4126 			&adapter->mac_regs_base->mac_10g.stats.v3.tx;
4127 		uint64_t octets;
4128 
4129 		/* 40G MAC statistics registers are the same, only read indirectly */
4130 		#define _40g_mac_reg_read32(field)	al_eth_40g_mac_reg_read(adapter,	\
4131 			((uint8_t *)(field)) - ((uint8_t *)&adapter->mac_regs_base->mac_10g))
4132 
4133 		stats->ifInUcastPkts = _40g_mac_reg_read32(&reg_rx_stats->ifInUcastPkts);
4134 		stats->ifInMulticastPkts = _40g_mac_reg_read32(&reg_rx_stats->ifInMulticastPkts);
4135 		stats->ifInBroadcastPkts = _40g_mac_reg_read32(&reg_rx_stats->ifInBroadcastPkts);
4136 		stats->etherStatsPkts = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts);
4137 		stats->ifOutUcastPkts = _40g_mac_reg_read32(&reg_tx_stats->ifUcastPkts);
4138 		stats->ifOutMulticastPkts = _40g_mac_reg_read32(&reg_tx_stats->ifMulticastPkts);
4139 		stats->ifOutBroadcastPkts = _40g_mac_reg_read32(&reg_tx_stats->ifBroadcastPkts);
4140 		stats->ifInErrors = _40g_mac_reg_read32(&reg_rx_stats->ifInErrors);
4141 		stats->ifOutErrors = _40g_mac_reg_read32(&reg_tx_stats->ifOutErrors);
4142 		stats->aFramesReceivedOK = _40g_mac_reg_read32(&reg_rx_stats->FramesOK);
4143 		stats->aFramesTransmittedOK = _40g_mac_reg_read32(&reg_tx_stats->FramesOK);
4144 
4145 		/* aOctetsReceivedOK = ifInOctets - 18 * aFramesReceivedOK - 4 * VLANReceivedOK */
4146 		octets = _40g_mac_reg_read32(&reg_rx_stats->ifOctetsL);
4147 		octets |= (uint64_t)(_40g_mac_reg_read32(&reg_rx_stats->ifOctetsH)) << 32;
4148 		octets -= 18 * stats->aFramesReceivedOK;
4149 		octets -= 4 * _40g_mac_reg_read32(&reg_rx_stats->VLANOK);
4150 		stats->aOctetsReceivedOK = octets;
4151 
4152 		/* aOctetsTransmittedOK = ifOutOctets - 18 * aFramesTransmittedOK - 4 * VLANTransmittedOK */
4153 		octets = _40g_mac_reg_read32(&reg_tx_stats->ifOctetsL);
4154 		octets |= (uint64_t)(_40g_mac_reg_read32(&reg_tx_stats->ifOctetsH)) << 32;
4155 		octets -= 18 * stats->aFramesTransmittedOK;
4156 		octets -= 4 * _40g_mac_reg_read32(&reg_tx_stats->VLANOK);
4157 		stats->aOctetsTransmittedOK = octets;
4158 
4159 		stats->etherStatsUndersizePkts = _40g_mac_reg_read32(&reg_rx_stats->etherStatsUndersizePkts);
4160 		stats->etherStatsFragments = _40g_mac_reg_read32(&reg_rx_stats->etherStatsFragments);
4161 		stats->etherStatsJabbers = _40g_mac_reg_read32(&reg_rx_stats->etherStatsJabbers);
4162 		stats->etherStatsOversizePkts = _40g_mac_reg_read32(&reg_rx_stats->etherStatsOversizePkts);
4163 		stats->aFrameCheckSequenceErrors = _40g_mac_reg_read32(&reg_rx_stats->CRCErrors);
4164 		stats->aAlignmentErrors = _40g_mac_reg_read32(&reg_rx_stats->aAlignmentErrors);
4165 		stats->etherStatsDropEvents = _40g_mac_reg_read32(&reg_rx_stats->etherStatsDropEvents);
4166 		stats->aPAUSEMACCtrlFramesTransmitted = _40g_mac_reg_read32(&reg_tx_stats->aPAUSEMACCtrlFrames);
4167 		stats->aPAUSEMACCtrlFramesReceived = _40g_mac_reg_read32(&reg_rx_stats->aPAUSEMACCtrlFrames);
4168 		stats->aFrameTooLongErrors = _40g_mac_reg_read32(&reg_rx_stats->aFrameTooLong);
4169 		stats->aInRangeLengthErrors = _40g_mac_reg_read32(&reg_rx_stats->aInRangeLengthErrors);
4170 		stats->VLANTransmittedOK = _40g_mac_reg_read32(&reg_tx_stats->VLANOK);
4171 		stats->VLANReceivedOK = _40g_mac_reg_read32(&reg_rx_stats->VLANOK);
4172 		stats->etherStatsOctets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsOctets);
4173 		stats->etherStatsPkts64Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts64Octets);
4174 		stats->etherStatsPkts65to127Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts65to127Octets);
4175 		stats->etherStatsPkts128to255Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts128to255Octets);
4176 		stats->etherStatsPkts256to511Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts256to511Octets);
4177 		stats->etherStatsPkts512to1023Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts512to1023Octets);
4178 		stats->etherStatsPkts1024to1518Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts1024to1518Octets);
4179 		stats->etherStatsPkts1519toX = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts1519toMax);
4180 	}
4181 
4182 	stats->eee_in = al_reg_read32(&adapter->mac_regs_base->stat.eee_in);
4183 	stats->eee_out = al_reg_read32(&adapter->mac_regs_base->stat.eee_out);
4184 
4185 /*	stats->etherStatsPkts = 1; */
4186 	return 0;
4187 }
4188 
4189 /**
4190 * read ec_stat_counters
4191 */
4192 int al_eth_ec_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_ec_stats *stats)
4193 {
4194 	al_assert(stats);
4195 	stats->faf_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.faf_in_rx_pkt);
4196 	stats->faf_in_rx_short = al_reg_read32(&adapter->ec_regs_base->stat.faf_in_rx_short);
4197 	stats->faf_in_rx_long = al_reg_read32(&adapter->ec_regs_base->stat.faf_in_rx_long);
4198 	stats->faf_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.faf_out_rx_pkt);
4199 	stats->faf_out_rx_short = al_reg_read32(&adapter->ec_regs_base->stat.faf_out_rx_short);
4200 	stats->faf_out_rx_long = al_reg_read32(&adapter->ec_regs_base->stat.faf_out_rx_long);
4201 	stats->faf_out_drop = al_reg_read32(&adapter->ec_regs_base->stat.faf_out_drop);
4202 	stats->rxf_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_in_rx_pkt);
4203 	stats->rxf_in_fifo_err = al_reg_read32(&adapter->ec_regs_base->stat.rxf_in_fifo_err);
4204 	stats->lbf_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.lbf_in_rx_pkt);
4205 	stats->lbf_in_fifo_err = al_reg_read32(&adapter->ec_regs_base->stat.lbf_in_fifo_err);
4206 	stats->rxf_out_rx_1_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_out_rx_1_pkt);
4207 	stats->rxf_out_rx_2_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_out_rx_2_pkt);
4208 	stats->rxf_out_drop_1_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_out_drop_1_pkt);
4209 	stats->rxf_out_drop_2_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_out_drop_2_pkt);
4210 	stats->rpe_1_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_1_in_rx_pkt);
4211 	stats->rpe_1_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_1_out_rx_pkt);
4212 	stats->rpe_2_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_2_in_rx_pkt);
4213 	stats->rpe_2_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_2_out_rx_pkt);
4214 	stats->rpe_3_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_3_in_rx_pkt);
4215 	stats->rpe_3_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_3_out_rx_pkt);
4216 	stats->tpe_in_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tpe_in_tx_pkt);
4217 	stats->tpe_out_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tpe_out_tx_pkt);
4218 	stats->tpm_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tpm_tx_pkt);
4219 	stats->tfw_in_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tfw_in_tx_pkt);
4220 	stats->tfw_out_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tfw_out_tx_pkt);
4221 	stats->rfw_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_rx_pkt);
4222 	stats->rfw_in_vlan_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_vlan_drop);
4223 	stats->rfw_in_parse_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_parse_drop);
4224 	stats->rfw_in_mc = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_mc);
4225 	stats->rfw_in_bc = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_bc);
4226 	stats->rfw_in_vlan_exist = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_vlan_exist);
4227 	stats->rfw_in_vlan_nexist = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_vlan_nexist);
4228 	stats->rfw_in_mac_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_mac_drop);
4229 	stats->rfw_in_mac_ndet_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_mac_ndet_drop);
4230 	stats->rfw_in_ctrl_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_ctrl_drop);
4231 	stats->rfw_in_prot_i_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_prot_i_drop);
4232 	stats->eee_in = al_reg_read32(&adapter->ec_regs_base->stat.eee_in);
4233 	return 0;
4234 }
4235 
4236 /**
4237  * read per_udma_counters
4238  */
4239 int al_eth_ec_stat_udma_get(struct al_hal_eth_adapter *adapter, uint8_t idx, struct al_eth_ec_stat_udma *stats)
4240 {
4241 
4242 	al_assert(idx <= 3); /*valid udma_id*/
4243 	al_assert(stats);
4244 	stats->rfw_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].rfw_out_rx_pkt);
4245 	stats->rfw_out_drop = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].rfw_out_drop);
4246 	stats->msw_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_in_rx_pkt);
4247 	stats->msw_drop_q_full = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_drop_q_full);
4248 	stats->msw_drop_sop = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_drop_sop);
4249 	stats->msw_drop_eop = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_drop_eop);
4250 	stats->msw_wr_eop = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_wr_eop);
4251 	stats->msw_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_out_rx_pkt);
4252 	stats->tso_no_tso_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tso_no_tso_pkt);
4253 	stats->tso_tso_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tso_tso_pkt);
4254 	stats->tso_seg_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tso_seg_pkt);
4255 	stats->tso_pad_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tso_pad_pkt);
4256 	stats->tpm_tx_spoof = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tpm_tx_spoof);
4257 	stats->tmi_in_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tmi_in_tx_pkt);
4258 	stats->tmi_out_to_mac = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tmi_out_to_mac);
4259 	stats->tmi_out_to_rx = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tmi_out_to_rx);
4260 	stats->tx_q0_bytes = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q0_bytes);
4261 	stats->tx_q1_bytes = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q1_bytes);
4262 	stats->tx_q2_bytes = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q2_bytes);
4263 	stats->tx_q3_bytes = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q3_bytes);
4264 	stats->tx_q0_pkts = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q0_pkts);
4265 	stats->tx_q1_pkts = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q1_pkts);
4266 	stats->tx_q2_pkts = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q2_pkts);
4267 	stats->tx_q3_pkts = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q3_pkts);
4268 	return 0;
4269 }
4270 
4271 /* Traffic control */
4272 
4273 
4274 int al_eth_flr_rmn(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val),
4275 		   int (* pci_write_config_u32)(void *handle, int where, uint32_t val),
4276 		   void *handle,
4277 		   void __iomem	*mac_base)
4278 {
4279 	struct al_eth_mac_regs __iomem *mac_regs_base =
4280 		(struct	al_eth_mac_regs __iomem *)mac_base;
4281 	uint32_t cfg_reg_store[6];
4282 	uint32_t reg;
4283 	uint32_t mux_sel;
4284 	int i = 0;
4285 
4286 	(*pci_read_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, &reg);
4287 
4288 	/* reset 1G mac */
4289 	AL_REG_MASK_SET(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC);
4290 	(*pci_write_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, reg);
4291 	al_udelay(1000);
4292 	/* don't reset 1G mac */
4293 	AL_REG_MASK_CLEAR(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC);
4294 	/* prevent 1G mac reset on FLR */
4295 	AL_REG_MASK_CLEAR(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC_ON_FLR);
4296 	/* prevent adapter reset */
4297 	(*pci_write_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, reg);
4298 
4299 	mux_sel = al_reg_read32(&mac_regs_base->gen.mux_sel);
4300 
4301 	/* save pci register that get reset due to flr*/
4302 	(*pci_read_config_u32)(handle, AL_PCI_COMMAND, &cfg_reg_store[i++]);
4303 	(*pci_read_config_u32)(handle, 0xC, &cfg_reg_store[i++]);
4304 	(*pci_read_config_u32)(handle, 0x10, &cfg_reg_store[i++]);
4305 	(*pci_read_config_u32)(handle, 0x18, &cfg_reg_store[i++]);
4306 	(*pci_read_config_u32)(handle, 0x20, &cfg_reg_store[i++]);
4307 	(*pci_read_config_u32)(handle, 0x110, &cfg_reg_store[i++]);
4308 
4309 	/* do flr */
4310 	(*pci_write_config_u32)(handle, AL_PCI_EXP_CAP_BASE + AL_PCI_EXP_DEVCTL, AL_PCI_EXP_DEVCTL_BCR_FLR);
4311 	al_udelay(1000);
4312 	/* restore command */
4313 	i = 0;
4314 	(*pci_write_config_u32)(handle, AL_PCI_COMMAND, cfg_reg_store[i++]);
4315 	(*pci_write_config_u32)(handle, 0xC, cfg_reg_store[i++]);
4316 	(*pci_write_config_u32)(handle, 0x10, cfg_reg_store[i++]);
4317 	(*pci_write_config_u32)(handle, 0x18, cfg_reg_store[i++]);
4318 	(*pci_write_config_u32)(handle, 0x20, cfg_reg_store[i++]);
4319 	(*pci_write_config_u32)(handle, 0x110, cfg_reg_store[i++]);
4320 
4321 	al_reg_write32_masked(&mac_regs_base->gen.mux_sel, ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, mux_sel);
4322 
4323 	/* set SGMII clock to 125MHz */
4324 	al_reg_write32(&mac_regs_base->sgmii.clk_div, 0x03320501);
4325 
4326 	/* reset 1G mac */
4327 	AL_REG_MASK_SET(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC);
4328 	(*pci_write_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, reg);
4329 
4330 	al_udelay(1000);
4331 
4332 	/* clear 1G mac reset */
4333 	AL_REG_MASK_CLEAR(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC);
4334 	(*pci_write_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, reg);
4335 
4336 	/* reset SGMII mac clock to default */
4337 	al_reg_write32(&mac_regs_base->sgmii.clk_div, 0x00320501);
4338 	al_udelay(1000);
4339 	/* reset async fifo */
4340 	reg = al_reg_read32(&mac_regs_base->gen.sd_fifo_ctrl);
4341 	AL_REG_MASK_SET(reg, 0xF0);
4342 	al_reg_write32(&mac_regs_base->gen.sd_fifo_ctrl, reg);
4343 	reg = al_reg_read32(&mac_regs_base->gen.sd_fifo_ctrl);
4344 	AL_REG_MASK_CLEAR(reg, 0xF0);
4345 	al_reg_write32(&mac_regs_base->gen.sd_fifo_ctrl, reg);
4346 
4347 	return 0;
4348 }
4349 
4350 int al_eth_flr_rmn_restore_params(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val),
4351 		int (* pci_write_config_u32)(void *handle, int where, uint32_t val),
4352 		void *handle,
4353 		void __iomem    *mac_base,
4354 		void __iomem    *ec_base,
4355 		int     mac_addresses_num
4356 		)
4357 {
4358 	struct al_eth_board_params params = { .media_type = 0 };
4359 	uint8_t mac_addr[6];
4360 	int rc;
4361 
4362 	/* not implemented yet */
4363 	if (mac_addresses_num > 1)
4364 		return -EPERM;
4365 
4366 	/* save board params so we restore it after reset */
4367 	al_eth_board_params_get(mac_base, &params);
4368 	al_eth_mac_addr_read(ec_base, 0, mac_addr);
4369 
4370 	rc = al_eth_flr_rmn(pci_read_config_u32, pci_write_config_u32, handle, mac_base);
4371 	al_eth_board_params_set(mac_base, &params);
4372 	al_eth_mac_addr_store(ec_base, 0, mac_addr);
4373 
4374 	return rc;
4375 }
4376 
4377 /* board params register 1 */
4378 #define AL_HAL_ETH_MEDIA_TYPE_MASK	(AL_FIELD_MASK(3, 0))
4379 #define AL_HAL_ETH_MEDIA_TYPE_SHIFT	0
4380 #define AL_HAL_ETH_EXT_PHY_SHIFT	4
4381 #define AL_HAL_ETH_PHY_ADDR_MASK	(AL_FIELD_MASK(9, 5))
4382 #define AL_HAL_ETH_PHY_ADDR_SHIFT	5
4383 #define AL_HAL_ETH_SFP_EXIST_SHIFT	10
4384 #define AL_HAL_ETH_AN_ENABLE_SHIFT	11
4385 #define AL_HAL_ETH_KR_LT_ENABLE_SHIFT	12
4386 #define AL_HAL_ETH_KR_FEC_ENABLE_SHIFT	13
4387 #define AL_HAL_ETH_MDIO_FREQ_MASK	(AL_FIELD_MASK(15, 14))
4388 #define AL_HAL_ETH_MDIO_FREQ_SHIFT	14
4389 #define AL_HAL_ETH_I2C_ADAPTER_ID_MASK	(AL_FIELD_MASK(19, 16))
4390 #define AL_HAL_ETH_I2C_ADAPTER_ID_SHIFT	16
4391 #define AL_HAL_ETH_EXT_PHY_IF_MASK	(AL_FIELD_MASK(21, 20))
4392 #define AL_HAL_ETH_EXT_PHY_IF_SHIFT	20
4393 #define AL_HAL_ETH_AUTO_NEG_MODE_SHIFT	22
4394 #define AL_HAL_ETH_SERDES_GRP_2_SHIFT	23
4395 #define AL_HAL_ETH_SERDES_GRP_MASK	(AL_FIELD_MASK(26, 25))
4396 #define AL_HAL_ETH_SERDES_GRP_SHIFT	25
4397 #define AL_HAL_ETH_SERDES_LANE_MASK	(AL_FIELD_MASK(28, 27))
4398 #define AL_HAL_ETH_SERDES_LANE_SHIFT	27
4399 #define AL_HAL_ETH_REF_CLK_FREQ_MASK	(AL_FIELD_MASK(31, 29))
4400 #define AL_HAL_ETH_REF_CLK_FREQ_SHIFT	29
4401 
4402 /* board params register 2 */
4403 #define AL_HAL_ETH_DONT_OVERRIDE_SERDES_SHIFT	0
4404 #define AL_HAL_ETH_1000_BASE_X_SHIFT		1
4405 #define AL_HAL_ETH_1G_AN_DISABLE_SHIFT		2
4406 #define AL_HAL_ETH_1G_SPEED_MASK		(AL_FIELD_MASK(4, 3))
4407 #define AL_HAL_ETH_1G_SPEED_SHIFT		3
4408 #define AL_HAL_ETH_1G_HALF_DUPLEX_SHIFT		5
4409 #define AL_HAL_ETH_1G_FC_DISABLE_SHIFT		6
4410 #define AL_HAL_ETH_RETIMER_EXIST_SHIFT		7
4411 #define AL_HAL_ETH_RETIMER_BUS_ID_MASK		(AL_FIELD_MASK(11, 8))
4412 #define AL_HAL_ETH_RETIMER_BUS_ID_SHIFT		8
4413 #define AL_HAL_ETH_RETIMER_I2C_ADDR_MASK	(AL_FIELD_MASK(18, 12))
4414 #define AL_HAL_ETH_RETIMER_I2C_ADDR_SHIFT	12
4415 #define AL_HAL_ETH_RETIMER_CHANNEL_SHIFT	19
4416 #define AL_HAL_ETH_DAC_LENGTH_MASK		(AL_FIELD_MASK(23, 20))
4417 #define AL_HAL_ETH_DAC_LENGTH_SHIFT		20
4418 #define AL_HAL_ETH_DAC_SHIFT			24
4419 #define AL_HAL_ETH_RETIMER_TYPE_MASK		(AL_FIELD_MASK(26, 25))
4420 #define AL_HAL_ETH_RETIMER_TYPE_SHIFT		25
4421 #define AL_HAL_ETH_RETIMER_CHANNEL_2_MASK	(AL_FIELD_MASK(28, 27))
4422 #define AL_HAL_ETH_RETIMER_CHANNEL_2_SHIFT	27
4423 #define AL_HAL_ETH_RETIMER_TX_CHANNEL_MASK	(AL_FIELD_MASK(31, 29))
4424 #define AL_HAL_ETH_RETIMER_TX_CHANNEL_SHIFT	29
4425 
4426 /* board params register 3 */
4427 #define AL_HAL_ETH_GPIO_SFP_PRESENT_MASK	(AL_FIELD_MASK(5, 0))
4428 #define AL_HAL_ETH_GPIO_SFP_PRESENT_SHIFT	0
4429 
4430 int al_eth_board_params_set(void * __iomem mac_base, struct al_eth_board_params *params)
4431 {
4432 	struct al_eth_mac_regs __iomem *mac_regs_base =
4433 		(struct	al_eth_mac_regs __iomem *)mac_base;
4434 	uint32_t	reg = 0;
4435 
4436 	/* ************* Setting Board params register 1 **************** */
4437 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_MEDIA_TYPE_MASK,
4438 			 AL_HAL_ETH_MEDIA_TYPE_SHIFT, params->media_type);
4439 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_EXT_PHY_SHIFT, params->phy_exist == AL_TRUE);
4440 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_PHY_ADDR_MASK,
4441 			 AL_HAL_ETH_PHY_ADDR_SHIFT, params->phy_mdio_addr);
4442 
4443 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_SFP_EXIST_SHIFT, params->sfp_plus_module_exist == AL_TRUE);
4444 
4445 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_AN_ENABLE_SHIFT, params->autoneg_enable == AL_TRUE);
4446 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_KR_LT_ENABLE_SHIFT, params->kr_lt_enable == AL_TRUE);
4447 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_KR_FEC_ENABLE_SHIFT, params->kr_fec_enable == AL_TRUE);
4448 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_MDIO_FREQ_MASK,
4449 			 AL_HAL_ETH_MDIO_FREQ_SHIFT, params->mdio_freq);
4450 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_I2C_ADAPTER_ID_MASK,
4451 			 AL_HAL_ETH_I2C_ADAPTER_ID_SHIFT, params->i2c_adapter_id);
4452 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_EXT_PHY_IF_MASK,
4453 			 AL_HAL_ETH_EXT_PHY_IF_SHIFT, params->phy_if);
4454 
4455 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_AUTO_NEG_MODE_SHIFT,
4456 			   params->an_mode == AL_ETH_BOARD_AUTONEG_IN_BAND);
4457 
4458 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_SERDES_GRP_MASK,
4459 			 AL_HAL_ETH_SERDES_GRP_SHIFT, params->serdes_grp);
4460 
4461 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_SERDES_GRP_2_SHIFT,
4462 			(params->serdes_grp & AL_BIT(2)) ? 1 : 0);
4463 
4464 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_SERDES_LANE_MASK,
4465 			 AL_HAL_ETH_SERDES_LANE_SHIFT, params->serdes_lane);
4466 
4467 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_REF_CLK_FREQ_MASK,
4468 			 AL_HAL_ETH_REF_CLK_FREQ_SHIFT, params->ref_clk_freq);
4469 
4470 	al_assert(reg != 0);
4471 
4472 	al_reg_write32(&mac_regs_base->mac_1g.scratch, reg);
4473 
4474 	/* ************* Setting Board params register 2 **************** */
4475 	reg = 0;
4476 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_DONT_OVERRIDE_SERDES_SHIFT,
4477 			   params->dont_override_serdes == AL_TRUE);
4478 
4479 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_1000_BASE_X_SHIFT,
4480 			   params->force_1000_base_x == AL_TRUE);
4481 
4482 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_1G_AN_DISABLE_SHIFT,
4483 			   params->an_disable == AL_TRUE);
4484 
4485 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_1G_SPEED_MASK,
4486 			 AL_HAL_ETH_1G_SPEED_SHIFT, params->speed);
4487 
4488 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_1G_HALF_DUPLEX_SHIFT,
4489 			   params->half_duplex == AL_TRUE);
4490 
4491 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_1G_FC_DISABLE_SHIFT,
4492 			   params->fc_disable == AL_TRUE);
4493 
4494 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_RETIMER_EXIST_SHIFT, params->retimer_exist == AL_TRUE);
4495 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_BUS_ID_MASK,
4496 			 AL_HAL_ETH_RETIMER_BUS_ID_SHIFT, params->retimer_bus_id);
4497 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_I2C_ADDR_MASK,
4498 			 AL_HAL_ETH_RETIMER_I2C_ADDR_SHIFT, params->retimer_i2c_addr);
4499 
4500 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_RETIMER_CHANNEL_SHIFT,
4501 				(params->retimer_channel & AL_BIT(0)));
4502 
4503 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_CHANNEL_2_MASK,
4504 			 AL_HAL_ETH_RETIMER_CHANNEL_2_SHIFT,
4505 			 (AL_REG_FIELD_GET(params->retimer_channel, 0x6, 1)));
4506 
4507 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_DAC_LENGTH_MASK,
4508 			 AL_HAL_ETH_DAC_LENGTH_SHIFT, params->dac_len);
4509 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_DAC_SHIFT, params->dac);
4510 
4511 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_TYPE_MASK,
4512 			 AL_HAL_ETH_RETIMER_TYPE_SHIFT, params->retimer_type);
4513 
4514 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_TX_CHANNEL_MASK,
4515 			 AL_HAL_ETH_RETIMER_TX_CHANNEL_SHIFT,
4516 			 params->retimer_tx_channel);
4517 
4518 	al_reg_write32(&mac_regs_base->mac_10g.scratch, reg);
4519 
4520 	/* ************* Setting Board params register 3 **************** */
4521 	reg = 0;
4522 
4523 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_GPIO_SFP_PRESENT_MASK,
4524 			 AL_HAL_ETH_GPIO_SFP_PRESENT_SHIFT,
4525 			 params->gpio_sfp_present);
4526 
4527 	al_reg_write32(&mac_regs_base->mac_1g.mac_0, reg);
4528 
4529 	return 0;
4530 }
4531 
4532 int al_eth_board_params_get(void * __iomem mac_base, struct al_eth_board_params *params)
4533 {
4534 	struct al_eth_mac_regs __iomem *mac_regs_base =
4535 		(struct	al_eth_mac_regs __iomem *)mac_base;
4536 	uint32_t	reg = al_reg_read32(&mac_regs_base->mac_1g.scratch);
4537 
4538 	/* check if the register was initialized, 0 is not a valid value */
4539 	if (reg == 0)
4540 		return -ENOENT;
4541 
4542 	/* ************* Getting Board params register 1 **************** */
4543 	params->media_type = AL_REG_FIELD_GET(reg, AL_HAL_ETH_MEDIA_TYPE_MASK,
4544 					      AL_HAL_ETH_MEDIA_TYPE_SHIFT);
4545 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_EXT_PHY_SHIFT))
4546 		params->phy_exist = AL_TRUE;
4547 	else
4548 		params->phy_exist = AL_FALSE;
4549 
4550 	params->phy_mdio_addr = AL_REG_FIELD_GET(reg, AL_HAL_ETH_PHY_ADDR_MASK,
4551 						 AL_HAL_ETH_PHY_ADDR_SHIFT);
4552 
4553 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_SFP_EXIST_SHIFT))
4554 		params->sfp_plus_module_exist = AL_TRUE;
4555 	else
4556 		params->sfp_plus_module_exist = AL_FALSE;
4557 
4558 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_AN_ENABLE_SHIFT))
4559 		params->autoneg_enable = AL_TRUE;
4560 	else
4561 		params->autoneg_enable = AL_FALSE;
4562 
4563 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_KR_LT_ENABLE_SHIFT))
4564 		params->kr_lt_enable = AL_TRUE;
4565 	else
4566 		params->kr_lt_enable = AL_FALSE;
4567 
4568 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_KR_FEC_ENABLE_SHIFT))
4569 		params->kr_fec_enable = AL_TRUE;
4570 	else
4571 		params->kr_fec_enable = AL_FALSE;
4572 
4573 	params->mdio_freq = AL_REG_FIELD_GET(reg,
4574 					     AL_HAL_ETH_MDIO_FREQ_MASK,
4575 					     AL_HAL_ETH_MDIO_FREQ_SHIFT);
4576 
4577 	params->i2c_adapter_id = AL_REG_FIELD_GET(reg,
4578 						  AL_HAL_ETH_I2C_ADAPTER_ID_MASK,
4579 						  AL_HAL_ETH_I2C_ADAPTER_ID_SHIFT);
4580 
4581 	params->phy_if = AL_REG_FIELD_GET(reg,
4582 					  AL_HAL_ETH_EXT_PHY_IF_MASK,
4583 					  AL_HAL_ETH_EXT_PHY_IF_SHIFT);
4584 
4585 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_AUTO_NEG_MODE_SHIFT))
4586 		params->an_mode = AL_TRUE;
4587 	else
4588 		params->an_mode = AL_FALSE;
4589 
4590 	params->serdes_grp = AL_REG_FIELD_GET(reg,
4591 					      AL_HAL_ETH_SERDES_GRP_MASK,
4592 					      AL_HAL_ETH_SERDES_GRP_SHIFT);
4593 
4594 	params->serdes_grp |= (AL_REG_BIT_GET(reg, AL_HAL_ETH_SERDES_GRP_2_SHIFT) ? AL_BIT(2) : 0);
4595 
4596 	params->serdes_lane = AL_REG_FIELD_GET(reg,
4597 					       AL_HAL_ETH_SERDES_LANE_MASK,
4598 					       AL_HAL_ETH_SERDES_LANE_SHIFT);
4599 
4600 	params->ref_clk_freq = AL_REG_FIELD_GET(reg,
4601 						AL_HAL_ETH_REF_CLK_FREQ_MASK,
4602 						AL_HAL_ETH_REF_CLK_FREQ_SHIFT);
4603 
4604 	/* ************* Getting Board params register 2 **************** */
4605 	reg = al_reg_read32(&mac_regs_base->mac_10g.scratch);
4606 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_DONT_OVERRIDE_SERDES_SHIFT))
4607 		params->dont_override_serdes = AL_TRUE;
4608 	else
4609 		params->dont_override_serdes = AL_FALSE;
4610 
4611 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_1000_BASE_X_SHIFT))
4612 		params->force_1000_base_x = AL_TRUE;
4613 	else
4614 		params->force_1000_base_x = AL_FALSE;
4615 
4616 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_1G_AN_DISABLE_SHIFT))
4617 		params->an_disable = AL_TRUE;
4618 	else
4619 		params->an_disable = AL_FALSE;
4620 
4621 	params->speed = AL_REG_FIELD_GET(reg,
4622 					 AL_HAL_ETH_1G_SPEED_MASK,
4623 					 AL_HAL_ETH_1G_SPEED_SHIFT);
4624 
4625 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_1G_HALF_DUPLEX_SHIFT))
4626 		params->half_duplex = AL_TRUE;
4627 	else
4628 		params->half_duplex = AL_FALSE;
4629 
4630 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_1G_FC_DISABLE_SHIFT))
4631 		params->fc_disable = AL_TRUE;
4632 	else
4633 		params->fc_disable = AL_FALSE;
4634 
4635 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_RETIMER_EXIST_SHIFT))
4636 		params->retimer_exist = AL_TRUE;
4637 	else
4638 		params->retimer_exist = AL_FALSE;
4639 
4640 	params->retimer_bus_id = AL_REG_FIELD_GET(reg,
4641 					       AL_HAL_ETH_RETIMER_BUS_ID_MASK,
4642 					       AL_HAL_ETH_RETIMER_BUS_ID_SHIFT);
4643 	params->retimer_i2c_addr = AL_REG_FIELD_GET(reg,
4644 					       AL_HAL_ETH_RETIMER_I2C_ADDR_MASK,
4645 					       AL_HAL_ETH_RETIMER_I2C_ADDR_SHIFT);
4646 
4647 	params->retimer_channel =
4648 		((AL_REG_BIT_GET(reg, AL_HAL_ETH_RETIMER_CHANNEL_SHIFT)) |
4649 		 (AL_REG_FIELD_GET(reg, AL_HAL_ETH_RETIMER_CHANNEL_2_MASK,
4650 				   AL_HAL_ETH_RETIMER_CHANNEL_2_SHIFT) << 1));
4651 
4652 	params->dac_len = AL_REG_FIELD_GET(reg,
4653 					   AL_HAL_ETH_DAC_LENGTH_MASK,
4654 					   AL_HAL_ETH_DAC_LENGTH_SHIFT);
4655 
4656 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_DAC_SHIFT))
4657 		params->dac = AL_TRUE;
4658 	else
4659 		params->dac = AL_FALSE;
4660 
4661 	params->retimer_type = AL_REG_FIELD_GET(reg,
4662 					   AL_HAL_ETH_RETIMER_TYPE_MASK,
4663 					   AL_HAL_ETH_RETIMER_TYPE_SHIFT);
4664 
4665 	params->retimer_tx_channel = AL_REG_FIELD_GET(reg,
4666 					   AL_HAL_ETH_RETIMER_TX_CHANNEL_MASK,
4667 					   AL_HAL_ETH_RETIMER_TX_CHANNEL_SHIFT);
4668 
4669 	/* ************* Getting Board params register 3 **************** */
4670 	reg = al_reg_read32(&mac_regs_base->mac_1g.mac_0);
4671 
4672 	params->gpio_sfp_present = AL_REG_FIELD_GET(reg,
4673 					AL_HAL_ETH_GPIO_SFP_PRESENT_MASK,
4674 					AL_HAL_ETH_GPIO_SFP_PRESENT_SHIFT);
4675 
4676 	return 0;
4677 }
4678 
4679 /* Wake-On-Lan (WoL) */
4680 static inline void al_eth_byte_arr_to_reg(
4681 		uint32_t *reg, uint8_t *arr, unsigned int num_bytes)
4682 {
4683 	uint32_t mask = 0xff;
4684 	unsigned int i;
4685 
4686 	al_assert(num_bytes <= 4);
4687 
4688 	*reg = 0;
4689 
4690 	for (i = 0 ; i < num_bytes ; i++) {
4691 		AL_REG_FIELD_SET(*reg, mask, (sizeof(uint8_t) * i), arr[i]);
4692 		mask = mask << sizeof(uint8_t);
4693 	}
4694 }
4695 
4696 int al_eth_wol_enable(
4697 		struct al_hal_eth_adapter *adapter,
4698 		struct al_eth_wol_params *wol)
4699 {
4700 	uint32_t reg = 0;
4701 
4702 	if (wol->int_mask & AL_ETH_WOL_INT_MAGIC_PSWD) {
4703 		al_assert(wol->pswd != NULL);
4704 
4705 		al_eth_byte_arr_to_reg(&reg, &wol->pswd[0], 4);
4706 		al_reg_write32(&adapter->ec_regs_base->wol.magic_pswd_l, reg);
4707 
4708 		al_eth_byte_arr_to_reg(&reg, &wol->pswd[4], 2);
4709 		al_reg_write32(&adapter->ec_regs_base->wol.magic_pswd_h, reg);
4710 	}
4711 
4712 	if (wol->int_mask & AL_ETH_WOL_INT_IPV4) {
4713 		al_assert(wol->ipv4 != NULL);
4714 
4715 		al_eth_byte_arr_to_reg(&reg, &wol->ipv4[0], 4);
4716 		al_reg_write32(&adapter->ec_regs_base->wol.ipv4_dip, reg);
4717 	}
4718 
4719 	if (wol->int_mask & AL_ETH_WOL_INT_IPV6) {
4720 		al_assert(wol->ipv6 != NULL);
4721 
4722 		al_eth_byte_arr_to_reg(&reg, &wol->ipv6[0], 4);
4723 		al_reg_write32(&adapter->ec_regs_base->wol.ipv6_dip_word0, reg);
4724 
4725 		al_eth_byte_arr_to_reg(&reg, &wol->ipv6[4], 4);
4726 		al_reg_write32(&adapter->ec_regs_base->wol.ipv6_dip_word1, reg);
4727 
4728 		al_eth_byte_arr_to_reg(&reg, &wol->ipv6[8], 4);
4729 		al_reg_write32(&adapter->ec_regs_base->wol.ipv6_dip_word2, reg);
4730 
4731 		al_eth_byte_arr_to_reg(&reg, &wol->ipv6[12], 4);
4732 		al_reg_write32(&adapter->ec_regs_base->wol.ipv6_dip_word3, reg);
4733 	}
4734 
4735 	if (wol->int_mask &
4736 		(AL_ETH_WOL_INT_ETHERTYPE_BC | AL_ETH_WOL_INT_ETHERTYPE_DA)) {
4737 
4738 		reg = ((uint32_t)wol->ethr_type2 << 16);
4739 		reg |= wol->ethr_type1;
4740 
4741 		al_reg_write32(&adapter->ec_regs_base->wol.ethertype, reg);
4742 	}
4743 
4744 	/* make sure we dont forwarding packets without interrupt */
4745 	al_assert((wol->forward_mask | wol->int_mask) == wol->int_mask);
4746 
4747 	reg = ((uint32_t)wol->forward_mask << 16);
4748 	reg |= wol->int_mask;
4749 	al_reg_write32(&adapter->ec_regs_base->wol.wol_en, reg);
4750 
4751 	return 0;
4752 }
4753 
4754 int al_eth_wol_disable(
4755 		struct al_hal_eth_adapter *adapter)
4756 {
4757 	al_reg_write32(&adapter->ec_regs_base->wol.wol_en, 0);
4758 
4759 	return 0;
4760 }
4761 
4762 int al_eth_tx_fwd_vid_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
4763 				uint8_t udma_mask, al_bool fwd_to_mac)
4764 {
4765 	uint32_t	val = 0;
4766 	al_assert(idx < AL_ETH_FWD_VID_TABLE_NUM); /* valid VID index */
4767 	AL_REG_FIELD_SET(val,  AL_ETH_TX_VLAN_TABLE_UDMA_MASK, 0, udma_mask);
4768 	AL_REG_FIELD_SET(val,  AL_ETH_TX_VLAN_TABLE_FWD_TO_MAC, 4, fwd_to_mac);
4769 
4770 	al_reg_write32(&adapter->ec_regs_base->tfw.tx_vid_table_addr, idx);
4771 	al_reg_write32(&adapter->ec_regs_base->tfw.tx_vid_table_data, val);
4772 	return 0;
4773 }
4774 
4775 int al_eth_tx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
4776 		struct al_eth_tx_gpd_cam_entry *tx_gpd_entry)
4777 {
4778 	uint64_t gpd_data;
4779 	uint64_t gpd_mask;
4780 
4781 	gpd_data = ((uint64_t)tx_gpd_entry->l3_proto_idx & AL_ETH_TX_GPD_L3_PROTO_MASK) <<
4782 		AL_ETH_TX_GPD_L3_PROTO_SHIFT;
4783 	gpd_data |= ((uint64_t)tx_gpd_entry->l4_proto_idx & AL_ETH_TX_GPD_L4_PROTO_MASK) <<
4784 		AL_ETH_TX_GPD_L4_PROTO_SHIFT;
4785 	gpd_data |= ((uint64_t)tx_gpd_entry->tunnel_control & AL_ETH_TX_GPD_TUNNEL_CTRL_MASK) <<
4786 		AL_ETH_TX_GPD_TUNNEL_CTRL_SHIFT;
4787 	gpd_data |= ((uint64_t)tx_gpd_entry->source_vlan_count & AL_ETH_TX_GPD_SRC_VLAN_CNT_MASK) <<
4788 		AL_ETH_TX_GPD_SRC_VLAN_CNT_SHIFT;
4789 	gpd_mask  = ((uint64_t)tx_gpd_entry->l3_proto_idx_mask & AL_ETH_TX_GPD_L3_PROTO_MASK) <<
4790 		AL_ETH_TX_GPD_L3_PROTO_SHIFT;
4791 	gpd_mask |= ((uint64_t)tx_gpd_entry->l4_proto_idx_mask & AL_ETH_TX_GPD_L4_PROTO_MASK) <<
4792 		AL_ETH_TX_GPD_L4_PROTO_SHIFT;
4793 	gpd_mask |= ((uint64_t)tx_gpd_entry->tunnel_control_mask & AL_ETH_TX_GPD_TUNNEL_CTRL_MASK) <<
4794 		AL_ETH_TX_GPD_TUNNEL_CTRL_SHIFT;
4795 	gpd_mask |= ((uint64_t)tx_gpd_entry->source_vlan_count_mask & AL_ETH_TX_GPD_SRC_VLAN_CNT_MASK) <<
4796 		AL_ETH_TX_GPD_SRC_VLAN_CNT_SHIFT;
4797 
4798 	/* Tx Generic protocol detect Cam compare table */
4799 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_addr, idx);
4800 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_ctrl,
4801 			(uint32_t)((tx_gpd_entry->tx_gpd_cam_ctrl) << AL_ETH_TX_GPD_CAM_CTRL_VALID_SHIFT));
4802 	al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_ctrl: %#x", idx, tx_gpd_entry->tx_gpd_cam_ctrl);
4803 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_mask_2,
4804 			(uint32_t)(gpd_mask >> AL_ETH_TX_GPD_CAM_MASK_2_SHIFT));
4805 	al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_mask_2: %#x", idx, (uint32_t)(gpd_mask >> AL_ETH_TX_GPD_CAM_MASK_2_SHIFT));
4806 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_mask_1,
4807 			(uint32_t)(gpd_mask));
4808 	al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_mask_1: %#x", idx, (uint32_t)(gpd_mask));
4809 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_data_2,
4810 			(uint32_t)(gpd_data >> AL_ETH_TX_GPD_CAM_DATA_2_SHIFT));
4811 	al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_data_2: %#x", idx, (uint32_t)(gpd_data >> AL_ETH_TX_GPD_CAM_DATA_2_SHIFT));
4812 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_data_1,
4813 			(uint32_t)(gpd_data));
4814 	al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_data_1: %#x", idx, (uint32_t)(gpd_data));
4815 	return 0;
4816 }
4817 
4818 int al_eth_tx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
4819 		struct al_eth_tx_gcp_table_entry *tx_gcp_entry)
4820 {
4821 	uint32_t gcp_table_gen;
4822 	uint32_t tx_alu_opcode;
4823 	uint32_t tx_alu_opsel;
4824 
4825 	gcp_table_gen  = (tx_gcp_entry->poly_sel & AL_ETH_TX_GCP_POLY_SEL_MASK) <<
4826 		AL_ETH_TX_GCP_POLY_SEL_SHIFT;
4827 	gcp_table_gen |= (tx_gcp_entry->crc32_bit_comp & AL_ETH_TX_GCP_CRC32_BIT_COMP_MASK) <<
4828 		AL_ETH_TX_GCP_CRC32_BIT_COMP_SHIFT;
4829 	gcp_table_gen |= (tx_gcp_entry->crc32_bit_swap & AL_ETH_TX_GCP_CRC32_BIT_SWAP_MASK) <<
4830 		AL_ETH_TX_GCP_CRC32_BIT_SWAP_SHIFT;
4831 	gcp_table_gen |= (tx_gcp_entry->crc32_byte_swap & AL_ETH_TX_GCP_CRC32_BYTE_SWAP_MASK) <<
4832 		AL_ETH_TX_GCP_CRC32_BYTE_SWAP_SHIFT;
4833 	gcp_table_gen |= (tx_gcp_entry->data_bit_swap & AL_ETH_TX_GCP_DATA_BIT_SWAP_MASK) <<
4834 		AL_ETH_TX_GCP_DATA_BIT_SWAP_SHIFT;
4835 	gcp_table_gen |= (tx_gcp_entry->data_byte_swap & AL_ETH_TX_GCP_DATA_BYTE_SWAP_MASK) <<
4836 		AL_ETH_TX_GCP_DATA_BYTE_SWAP_SHIFT;
4837 	gcp_table_gen |= (tx_gcp_entry->trail_size & AL_ETH_TX_GCP_TRAIL_SIZE_MASK) <<
4838 		AL_ETH_TX_GCP_TRAIL_SIZE_SHIFT;
4839 	gcp_table_gen |= (tx_gcp_entry->head_size & AL_ETH_TX_GCP_HEAD_SIZE_MASK) <<
4840 		AL_ETH_TX_GCP_HEAD_SIZE_SHIFT;
4841 	gcp_table_gen |= (tx_gcp_entry->head_calc & AL_ETH_TX_GCP_HEAD_CALC_MASK) <<
4842 		AL_ETH_TX_GCP_HEAD_CALC_SHIFT;
4843 	gcp_table_gen |= (tx_gcp_entry->mask_polarity & AL_ETH_TX_GCP_MASK_POLARITY_MASK) <<
4844 		AL_ETH_TX_GCP_MASK_POLARITY_SHIFT;
4845 	al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], gcp_table_gen: %#x", idx, gcp_table_gen);
4846 
4847 	tx_alu_opcode  = (tx_gcp_entry->tx_alu_opcode_1 & AL_ETH_TX_GCP_OPCODE_1_MASK) <<
4848 		AL_ETH_TX_GCP_OPCODE_1_SHIFT;
4849 	tx_alu_opcode |= (tx_gcp_entry->tx_alu_opcode_2 & AL_ETH_TX_GCP_OPCODE_2_MASK) <<
4850 		AL_ETH_TX_GCP_OPCODE_2_SHIFT;
4851 	tx_alu_opcode |= (tx_gcp_entry->tx_alu_opcode_3 & AL_ETH_TX_GCP_OPCODE_3_MASK) <<
4852 		AL_ETH_TX_GCP_OPCODE_3_SHIFT;
4853 	tx_alu_opsel  = (tx_gcp_entry->tx_alu_opsel_1 & AL_ETH_TX_GCP_OPSEL_1_MASK) <<
4854 		AL_ETH_TX_GCP_OPSEL_1_SHIFT;
4855 	tx_alu_opsel |= (tx_gcp_entry->tx_alu_opsel_2 & AL_ETH_TX_GCP_OPSEL_2_MASK) <<
4856 		AL_ETH_TX_GCP_OPSEL_2_SHIFT;
4857 	tx_alu_opsel |= (tx_gcp_entry->tx_alu_opsel_3 & AL_ETH_TX_GCP_OPSEL_3_MASK) <<
4858 		AL_ETH_TX_GCP_OPSEL_3_SHIFT;
4859 	tx_alu_opsel |= (tx_gcp_entry->tx_alu_opsel_4 & AL_ETH_TX_GCP_OPSEL_4_MASK) <<
4860 		AL_ETH_TX_GCP_OPSEL_4_SHIFT;
4861 
4862 	/*  Tx Generic crc prameters table general */
4863 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_addr, idx);
4864 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_gen,
4865 			gcp_table_gen);
4866 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_1,
4867 			tx_gcp_entry->gcp_mask[0]);
4868 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_2,
4869 			tx_gcp_entry->gcp_mask[1]);
4870 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_3,
4871 			tx_gcp_entry->gcp_mask[2]);
4872 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_4,
4873 			tx_gcp_entry->gcp_mask[3]);
4874 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_5,
4875 			tx_gcp_entry->gcp_mask[4]);
4876 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_6,
4877 			tx_gcp_entry->gcp_mask[5]);
4878 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_crc_init,
4879 			tx_gcp_entry->crc_init);
4880 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_res,
4881 			tx_gcp_entry->gcp_table_res);
4882 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_alu_opcode,
4883 			tx_alu_opcode);
4884 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_alu_opsel,
4885 			tx_alu_opsel);
4886 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_alu_val,
4887 			tx_gcp_entry->alu_val);
4888 	return 0;
4889 }
4890 
4891 int al_eth_tx_crc_chksum_replace_cmd_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
4892 		struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry *tx_replace_entry)
4893 {
4894 	uint32_t replace_table_address;
4895 	uint32_t tx_replace_cmd;
4896 
4897 	/*  Tx crc_chksum_replace_cmd */
4898 	replace_table_address = L4_CHECKSUM_DIS_AND_L3_CHECKSUM_DIS | idx;
4899 	tx_replace_cmd  = (uint32_t)(tx_replace_entry->l3_csum_en_00) << 0;
4900 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->l4_csum_en_00) << 1;
4901 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->crc_en_00)     << 2;
4902 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table_addr, replace_table_address);
4903 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table,
4904 			tx_replace_cmd);
4905 	replace_table_address = L4_CHECKSUM_DIS_AND_L3_CHECKSUM_EN | idx;
4906 	tx_replace_cmd  = (uint32_t)(tx_replace_entry->l3_csum_en_01) << 0;
4907 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->l4_csum_en_01) << 1;
4908 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->crc_en_01)     << 2;
4909 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table_addr, replace_table_address);
4910 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table,
4911 			tx_replace_cmd);
4912 	replace_table_address = L4_CHECKSUM_EN_AND_L3_CHECKSUM_DIS | idx;
4913 	tx_replace_cmd  = (uint32_t)(tx_replace_entry->l3_csum_en_10) << 0;
4914 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->l4_csum_en_10) << 1;
4915 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->crc_en_10)     << 2;
4916 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table_addr, replace_table_address);
4917 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table,
4918 			tx_replace_cmd);
4919 	replace_table_address = L4_CHECKSUM_EN_AND_L3_CHECKSUM_EN | idx;
4920 	tx_replace_cmd  = (uint32_t)(tx_replace_entry->l3_csum_en_11) << 0;
4921 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->l4_csum_en_11) << 1;
4922 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->crc_en_11)     << 2;
4923 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table_addr, replace_table_address);
4924 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table,
4925 			tx_replace_cmd);
4926 
4927 	return 0;
4928 }
4929 
4930 int al_eth_rx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
4931 		struct al_eth_rx_gpd_cam_entry *rx_gpd_entry)
4932 {
4933 	uint64_t gpd_data;
4934 	uint64_t gpd_mask;
4935 
4936 	gpd_data  = ((uint64_t)rx_gpd_entry->outer_l3_proto_idx & AL_ETH_RX_GPD_OUTER_L3_PROTO_MASK) <<
4937 		AL_ETH_RX_GPD_OUTER_L3_PROTO_SHIFT;
4938 	gpd_data |= ((uint64_t)rx_gpd_entry->outer_l4_proto_idx & AL_ETH_RX_GPD_OUTER_L4_PROTO_MASK) <<
4939 		AL_ETH_RX_GPD_OUTER_L4_PROTO_SHIFT;
4940 	gpd_data |= ((uint64_t)rx_gpd_entry->inner_l3_proto_idx & AL_ETH_RX_GPD_INNER_L3_PROTO_MASK) <<
4941 		AL_ETH_RX_GPD_INNER_L3_PROTO_SHIFT;
4942 	gpd_data |= ((uint64_t)rx_gpd_entry->inner_l4_proto_idx & AL_ETH_RX_GPD_INNER_L4_PROTO_MASK) <<
4943 		AL_ETH_RX_GPD_INNER_L4_PROTO_SHIFT;
4944 	gpd_data |= ((uint64_t)rx_gpd_entry->parse_ctrl & AL_ETH_RX_GPD_OUTER_PARSE_CTRL_MASK) <<
4945 		AL_ETH_RX_GPD_OUTER_PARSE_CTRL_SHIFT;
4946 	gpd_data |= ((uint64_t)rx_gpd_entry->outer_l3_len & AL_ETH_RX_GPD_INNER_PARSE_CTRL_MASK) <<
4947 		AL_ETH_RX_GPD_INNER_PARSE_CTRL_SHIFT;
4948 	gpd_data |= ((uint64_t)rx_gpd_entry->l3_priority & AL_ETH_RX_GPD_L3_PRIORITY_MASK) <<
4949 		AL_ETH_RX_GPD_L3_PRIORITY_SHIFT;
4950 	gpd_data |= ((uint64_t)rx_gpd_entry->l4_dst_port_lsb & AL_ETH_RX_GPD_L4_DST_PORT_LSB_MASK) <<
4951 		AL_ETH_RX_GPD_L4_DST_PORT_LSB_SHIFT;
4952 
4953 	gpd_mask  = ((uint64_t)rx_gpd_entry->outer_l3_proto_idx_mask & AL_ETH_RX_GPD_OUTER_L3_PROTO_MASK) <<
4954 		AL_ETH_RX_GPD_OUTER_L3_PROTO_SHIFT;
4955 	gpd_mask |= ((uint64_t)rx_gpd_entry->outer_l4_proto_idx_mask & AL_ETH_RX_GPD_OUTER_L4_PROTO_MASK) <<
4956 		AL_ETH_RX_GPD_OUTER_L4_PROTO_SHIFT;
4957 	gpd_mask |= ((uint64_t)rx_gpd_entry->inner_l3_proto_idx_mask & AL_ETH_RX_GPD_INNER_L3_PROTO_MASK) <<
4958 		AL_ETH_RX_GPD_INNER_L3_PROTO_SHIFT;
4959 	gpd_mask |= ((uint64_t)rx_gpd_entry->inner_l4_proto_idx_mask & AL_ETH_RX_GPD_INNER_L4_PROTO_MASK) <<
4960 		AL_ETH_RX_GPD_INNER_L4_PROTO_SHIFT;
4961 	gpd_mask |= ((uint64_t)rx_gpd_entry->parse_ctrl_mask & AL_ETH_RX_GPD_OUTER_PARSE_CTRL_MASK) <<
4962 		AL_ETH_RX_GPD_OUTER_PARSE_CTRL_SHIFT;
4963 	gpd_mask |= ((uint64_t)rx_gpd_entry->outer_l3_len_mask & AL_ETH_RX_GPD_INNER_PARSE_CTRL_MASK) <<
4964 		AL_ETH_RX_GPD_INNER_PARSE_CTRL_SHIFT;
4965 	gpd_mask |= ((uint64_t)rx_gpd_entry->l3_priority_mask & AL_ETH_RX_GPD_L3_PRIORITY_MASK) <<
4966 		AL_ETH_RX_GPD_L3_PRIORITY_SHIFT;
4967 	gpd_mask |= ((uint64_t)rx_gpd_entry->l4_dst_port_lsb_mask & AL_ETH_RX_GPD_L4_DST_PORT_LSB_MASK) <<
4968 		AL_ETH_RX_GPD_L4_DST_PORT_LSB_SHIFT;
4969 
4970 	/* Rx Generic protocol detect Cam compare table */
4971 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_addr, idx);
4972 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_ctrl,
4973 			(uint32_t)((rx_gpd_entry->rx_gpd_cam_ctrl) << AL_ETH_RX_GPD_CAM_CTRL_VALID_SHIFT));
4974 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_mask_2,
4975 			(uint32_t)(gpd_mask >> AL_ETH_RX_GPD_CAM_MASK_2_SHIFT));
4976 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_mask_1,
4977 			(uint32_t)(gpd_mask));
4978 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_data_2,
4979 			(uint32_t)(gpd_data >> AL_ETH_RX_GPD_CAM_DATA_2_SHIFT));
4980 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_data_1,
4981 			(uint32_t)(gpd_data));
4982 	return 0;
4983 }
4984 
4985 int al_eth_rx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
4986 		struct al_eth_rx_gcp_table_entry *rx_gcp_entry)
4987 {
4988 	uint32_t gcp_table_gen;
4989 	uint32_t rx_alu_opcode;
4990 	uint32_t rx_alu_opsel;
4991 
4992 	gcp_table_gen  = (rx_gcp_entry->poly_sel & AL_ETH_RX_GCP_POLY_SEL_MASK) <<
4993 		AL_ETH_RX_GCP_POLY_SEL_SHIFT;
4994 	gcp_table_gen |= (rx_gcp_entry->crc32_bit_comp & AL_ETH_RX_GCP_CRC32_BIT_COMP_MASK) <<
4995 		AL_ETH_RX_GCP_CRC32_BIT_COMP_SHIFT;
4996 	gcp_table_gen |= (rx_gcp_entry->crc32_bit_swap & AL_ETH_RX_GCP_CRC32_BIT_SWAP_MASK) <<
4997 		AL_ETH_RX_GCP_CRC32_BIT_SWAP_SHIFT;
4998 	gcp_table_gen |= (rx_gcp_entry->crc32_byte_swap & AL_ETH_RX_GCP_CRC32_BYTE_SWAP_MASK) <<
4999 		AL_ETH_RX_GCP_CRC32_BYTE_SWAP_SHIFT;
5000 	gcp_table_gen |= (rx_gcp_entry->data_bit_swap & AL_ETH_RX_GCP_DATA_BIT_SWAP_MASK) <<
5001 		AL_ETH_RX_GCP_DATA_BIT_SWAP_SHIFT;
5002 	gcp_table_gen |= (rx_gcp_entry->data_byte_swap & AL_ETH_RX_GCP_DATA_BYTE_SWAP_MASK) <<
5003 		AL_ETH_RX_GCP_DATA_BYTE_SWAP_SHIFT;
5004 	gcp_table_gen |= (rx_gcp_entry->trail_size & AL_ETH_RX_GCP_TRAIL_SIZE_MASK) <<
5005 		AL_ETH_RX_GCP_TRAIL_SIZE_SHIFT;
5006 	gcp_table_gen |= (rx_gcp_entry->head_size & AL_ETH_RX_GCP_HEAD_SIZE_MASK) <<
5007 		AL_ETH_RX_GCP_HEAD_SIZE_SHIFT;
5008 	gcp_table_gen |= (rx_gcp_entry->head_calc & AL_ETH_RX_GCP_HEAD_CALC_MASK) <<
5009 		AL_ETH_RX_GCP_HEAD_CALC_SHIFT;
5010 	gcp_table_gen |= (rx_gcp_entry->mask_polarity & AL_ETH_RX_GCP_MASK_POLARITY_MASK) <<
5011 		AL_ETH_RX_GCP_MASK_POLARITY_SHIFT;
5012 
5013 	rx_alu_opcode  = (rx_gcp_entry->rx_alu_opcode_1 & AL_ETH_RX_GCP_OPCODE_1_MASK) <<
5014 		AL_ETH_RX_GCP_OPCODE_1_SHIFT;
5015 	rx_alu_opcode |= (rx_gcp_entry->rx_alu_opcode_2 & AL_ETH_RX_GCP_OPCODE_2_MASK) <<
5016 		AL_ETH_RX_GCP_OPCODE_2_SHIFT;
5017 	rx_alu_opcode |= (rx_gcp_entry->rx_alu_opcode_3 & AL_ETH_RX_GCP_OPCODE_3_MASK) <<
5018 		AL_ETH_RX_GCP_OPCODE_3_SHIFT;
5019 	rx_alu_opsel  = (rx_gcp_entry->rx_alu_opsel_1 & AL_ETH_RX_GCP_OPSEL_1_MASK) <<
5020 		AL_ETH_RX_GCP_OPSEL_1_SHIFT;
5021 	rx_alu_opsel |= (rx_gcp_entry->rx_alu_opsel_2 & AL_ETH_RX_GCP_OPSEL_2_MASK) <<
5022 		AL_ETH_RX_GCP_OPSEL_2_SHIFT;
5023 	rx_alu_opsel |= (rx_gcp_entry->rx_alu_opsel_3 & AL_ETH_RX_GCP_OPSEL_3_MASK) <<
5024 		AL_ETH_RX_GCP_OPSEL_3_SHIFT;
5025 	rx_alu_opsel |= (rx_gcp_entry->rx_alu_opsel_4 & AL_ETH_RX_GCP_OPSEL_4_MASK) <<
5026 		AL_ETH_RX_GCP_OPSEL_4_SHIFT;
5027 
5028 	/*  Rx Generic crc prameters table general */
5029 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_addr, idx);
5030 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_gen,
5031 			gcp_table_gen);
5032 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_1,
5033 			rx_gcp_entry->gcp_mask[0]);
5034 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_2,
5035 			rx_gcp_entry->gcp_mask[1]);
5036 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_3,
5037 			rx_gcp_entry->gcp_mask[2]);
5038 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_4,
5039 			rx_gcp_entry->gcp_mask[3]);
5040 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_5,
5041 			rx_gcp_entry->gcp_mask[4]);
5042 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_6,
5043 			rx_gcp_entry->gcp_mask[5]);
5044 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_crc_init,
5045 			rx_gcp_entry->crc_init);
5046 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_res,
5047 			rx_gcp_entry->gcp_table_res);
5048 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_alu_opcode,
5049 			rx_alu_opcode);
5050 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_alu_opsel,
5051 			rx_alu_opsel);
5052 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_alu_val,
5053 			rx_gcp_entry->alu_val);
5054 	return 0;
5055 }
5056 
5057 
5058 #define AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM 9
5059 #define AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM 32
5060 
5061 static struct al_eth_tx_gpd_cam_entry
5062 al_eth_generic_tx_crc_gpd[AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM] = {
5063 
5064 	/* [0] roce (with grh, bth) */
5065 	{22,		0,		0,		0,		1,
5066 	 0x1f,		0x0,		0x0,		0x0,		},
5067 	/* [1] fcoe */
5068 	{21,		0,		0,		0,		1,
5069 	 0x1f,		0x0,		0x0,		0x0,		},
5070 	/* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
5071 	{8,		23,		0,		0,		1,
5072 	 0x1f,		0x1f,		0x0,		0x0,		},
5073 	/* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
5074 	{11,		23,		0,		0,		1,
5075 	 0x1f,		0x1f,		0x0,		0x0,		},
5076 	/* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
5077 	{23,		0,		5,		0,		1,
5078 	 0x1f,		0x0,		0x5,		0x0,		},
5079 	/* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
5080 	{23,		0,		3,		0,		1,
5081 	 0x1f,		0x0,		0x5,		0x0		},
5082 	/* [6] GENERIC_STORAGE_READ over IPV4 (and udp) */
5083 	{8,		2,		0,		0,		1,
5084 	 0x1f,		0x1f,		0x0,		0x0,		},
5085 	/* [7] GENERIC_STORAGE_READ over IPV6 (and udp) */
5086 	{11,		2,		0,		0,		1,
5087 	 0x1f,		0x1f,		0x0,		0x0,		},
5088 	/* [8] default match */
5089 	{0,		0,		0,		0,		1,
5090 	 0x0,		0x0,		0x0,		0x0		}
5091 };
5092 
5093 static struct al_eth_tx_gcp_table_entry
5094 al_eth_generic_tx_crc_gcp[AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM] = {
5095 
5096 	/* [0] roce (with grh, bth) */
5097 	{0,		1,		1,		0,		1,
5098 	 0,		4,		8,		0,		1,
5099 	 0,		0,		0,		0,		0,
5100 	 0,		0,		{0xffff7f03,	0x00000000,	0x00000000,
5101 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
5102 	 0},
5103 	/* [1] fcoe */
5104 	{0,		1,		0,		0,		1,
5105 	 0,		8,		14,		1,		1,
5106 	 0,		0,		0,		0,		0,
5107 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5108 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
5109 	 0},
5110 	/* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
5111 	{0,		1,		1,		0,		1,
5112 	 0,		4,		0,		0,		1,
5113 	 0,		0,		0,		0,		0,
5114 	 0,		0,		{0x3000cf00,	0x00000f00,	0xc0000000,
5115 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
5116 	 0},
5117 	/* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
5118 	{0,		1,		1,		0,		1,
5119 	 0,		4,		0,		0,		1,
5120 	 0,		0,		0,		0,		0,
5121 	 0,		0,		{0x7f030000,	0x00000000,	0x00000003,
5122 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
5123 	 0},
5124 	/* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
5125 	{0,		1,		1,		0,		1,
5126 	 0,		4,		0,		0,		1,
5127 	 2,		0,		0,		0,		10,
5128 	 0,		0,		{0x3000cf00,	0x00000f00,	0xc0000000,
5129 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
5130 	 28},
5131 	/* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
5132 	{0,		1,		1,		0,		1,
5133 	 0,		4,		0,		0,		1,
5134 	 2,		0,		0,		0,		10,
5135 	 0,		0,		{0x7f030000,	0x00000000,	0x00000003,
5136 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
5137 	 48},
5138 	/* [6] GENERIC_STORAGE_READ over IPV4 (and udp) */
5139 	{1,		1,		1,		0,		1,
5140 	 0,		4,		0,		0,		1,
5141 	 1,		0,		1,		0,		2,
5142 	 10,		0,		{0x00000000,	0x00000000,	0x00000000,
5143 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
5144 	 8},
5145 	/* [7] GENERIC_STORAGE_READ over IPV6 (and udp) */
5146 	{1,		1,		1,		0,		1,
5147 	 0,		4,		0,		0,		1,
5148 	 1,		0,		1,		0,		2,
5149 	 10,		0,		{0x00000000,	0x00000000,	0x00000000,
5150 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
5151 	 8},
5152 	/* [8] default match */
5153 	{0,		0,		0,		0,		0,
5154 	 0,		0,		0,		0,		0,
5155 	 0,		0,		0,		0,		0,
5156 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5157 	 0x00000000,	0x00000000,	  0x00000000},	0x00000000,	0x0,
5158 	 0}
5159 };
5160 
5161 static struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry
5162 al_eth_tx_crc_chksum_replace_cmd[AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM] = {
5163 
5164 	/* [0] roce (with grh, bth) */
5165 	{0,1,0,1,		0,0,0,0,		0,0,0,0},
5166 	/* [1] fcoe */
5167 	{0,1,0,1,		0,0,0,0,		0,0,0,0},
5168 	/* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
5169 	{0,0,1,1,		0,0,0,0,		0,1,0,1},
5170 	/* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
5171 	{0,0,1,1,		0,0,0,0,		0,0,0,0},
5172 	/* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
5173 	{0,1,0,1,		0,0,0,0,		0,0,0,0},
5174 	/* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
5175 	{0,1,0,1,		0,0,0,0,		0,0,0,0},
5176 	/* [6] GENERIC_STORAGE_READ over IPV4 (and udp) */
5177 	{0,0,1,1,		0,0,0,0,		0,1,0,1},
5178 	/* [7] GENERIC_STORAGE_READ over IPV6 (and udp) */
5179 	{0,0,1,1,		0,0,0,0,		0,0,0,0},
5180 	/* [8] default match */
5181 	{0,0,0,0,		0,0,1,1,		0,1,0,1}
5182 };
5183 
5184 static struct al_eth_rx_gpd_cam_entry
5185 al_eth_generic_rx_crc_gpd[AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM] = {
5186 
5187 	/* [0] roce (with grh, bth) */
5188 	{22,		0,		0,		0,
5189 	 0,		0,		0,		0,		1,
5190 	 0x1f,		0x0,		0x0,		0x0,
5191 	 0x4,		0x0,		0x0,		0x0},
5192 	/* [1] fcoe */
5193 	{21,		0,		0,		0,
5194 	 0,		0,		0,		0,		1,
5195 	 0x1f,		0x0,		0x0,		0x0,
5196 	 0x4,		0x0,		0x0,		0x0},
5197 	/* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
5198 	{8,		23,		0,		0,
5199 	 0,		0,		0,		0,		1,
5200 	 0x1f,		0x1f,		0x0,		0x0,
5201 	 0x4,		0x0,		0x0,		0x0},
5202 	/* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
5203 	{11,		23,		0,		0,
5204 	 0,		0,		0,		0,		1,
5205 	 0x1f,		0x1f,		0x0,		0x0,
5206 	 0x4,		0x0,		0x0,		0x0},
5207 	/* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
5208 	{8,		13,		23,		0,
5209 	 0,		0,		0,		0,		1,
5210 	 0x1f,		0x1f,		0x1f,		0x0,
5211 	 0x4,		0x0,		0x0,		0x0},
5212 	/* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
5213 	{11,		13,		23,		0,
5214 	 0,		0,		0,		0,		1,
5215 	 0x1f,		0x1f,		0x1f,		0x0,
5216 	 0x4,		0x0,		0x0,		0x0},
5217 	/* [6] tunneled roce (with grh, bth) over GRE over IPV4 */
5218 	{8,		0,		22,		0,
5219 	 4,		0,		0,		0,		1,
5220 	 0x1f,		0x0,		0x1f,		0x0,
5221 	 0x4,		0x0,		0x0,		0x0},
5222 	/* [7] tunneled roce (with grh, bth) over GRE over IPV6 */
5223 	{11,		0,		22,		0,
5224 	 4,		0,		0,		0,		1,
5225 	 0x1f,		0x0,		0x1f,		0x0,
5226 	 0x4,		0x0,		0x0,		0x0},
5227 	/* [8] tunneled fcoe over IPV4 */
5228 	{8,		0,		21,		0,
5229 	 4,		0,		0,		0,		1,
5230 	 0x1f,		0x0,		0x1f,		0x0,
5231 	 0x4,		0x0,		0x0,		0x0},
5232         /* [9] tunneled fcoe over IPV6 */
5233         {11,		0,		21,		0,
5234 	 4,		0,		0,		0,		1,
5235          0x1f,		0x0,		0x1f,		0x0,
5236 	 0x4,		0x0,		0x0,		0x0},
5237 	/* [10] tunneled routable_roce that is refered as l4_protocol, over IPV4 (and udp) over IPV4 */
5238 	{8,             0,              8,              23,
5239 	 4,		0,		0,		0,		1,
5240 	0x1f,		0x0,		0x1f,		0x1f,
5241 	 0x4,		0x0,		0x0,		0x0},
5242 	/* [11] tunneled routable_roce that is refered as l4_protocol, over IPV4 (and udp) over IPV6 */
5243 	{11,		0,		8,		23,
5244 	4,		0,		0,		0,		1,
5245 	0x1f,		0x0,		0x1f,		0x1f,
5246 	0x4,		0x0,		0x0,		0x0},
5247 	/* [12] tunneled routable_roce that is refered as l4_protocol, over IPV6 (and udp) over IPV4 */
5248 	{8,		0,		11,		23,
5249 	4,		0,		0,		0,		1,
5250 	0x1f,		0x0,		0x1f,		0x1f,
5251 	0x4,		0x0,		0x0,		0x0},
5252 	/* [13] tunneled routable_roce that is refered as l4_protocol, over IPV6 (and udp) over IPV6 */
5253 	{11,		0,		11,		23,
5254 	4,		0,		0,		0,		1,
5255 	0x1f,		0x0,		0x1f,		0x1f,
5256 	0x4,		0x0,		0x0,		0x0},
5257 	/* [14] l3_pkt - IPV4 */
5258 	{8,		0,		0,		0,
5259 	0,		0,		0,		0,		1,
5260 	0x1f,		0x1f,		0x0,		0x0,
5261 	0x4,		0x0,		0x0,		0x0},
5262 	/* [15] l4_hdr over IPV4 */
5263 	{8,		12,		0,		0,
5264 	0,		0,		0,		0,		1,
5265 	0x1f,		0x1e,		0x0,		0x0,
5266 	0x4,		0x0,		0x0,		0x0},
5267 	/* [16] l3_pkt - IPV6 */
5268 	{11,		0,		0,		0,
5269 	0,		0,		0,		0,		1,
5270 	0x1f,		0x1f,		0x0,		0x0,
5271 	0x4,		0x0,		0x0,		0x0},
5272 	/* [17] l4_hdr over IPV6 */
5273 	{11,		12,		0,		0,
5274 	0,		0,		0,		0,		1,
5275 	0x1f,		0x1e,		0x0,		0x0,
5276 	0x4,		0x0,		0x0,		0x0},
5277 	/* [18] IPV4 over IPV4 */
5278 	{8,		0,		8,		0,
5279 	4,		0,		0,		0,		1,
5280 	0x1f,		0x0,		0x1f,		0x1f,
5281 	0x4,		0x0,		0x0,		0x0},
5282 	/* [19] l4_hdr over IPV4 over IPV4 */
5283 	{8,		0,		8,		12,
5284 	4,		0,		0,		0,		1,
5285 	0x1f,		0x0,		0x1f,		0x1e,
5286 	0x4,		0x0,		0x0,		0x0},
5287 	/* [20] IPV4 over IPV6 */
5288 	{11,		0,		8,		0,
5289 	4,		0,		0,		0,		1,
5290 	0x1f,		0x0,		0x1f,		0x1f,
5291 	0x4,		0x0,		0x0,		0x0},
5292 	/* [21] l4_hdr over IPV4 over IPV6 */
5293 	{11,		0,		8,		12,
5294 	4,		0,		0,		0,		1,
5295 	0x1f,		0x0,		0x1f,		0x1e,
5296 	0x4,		0x0,		0x0,		0x0},
5297 	/* [22] IPV6 over IPV4 */
5298 	{8,		0,		11,		0,
5299 	4,		0,		0,		0,		1,
5300 	0x1f,		0x0,		0x1f,		0x1f,
5301 	0x4,		0x0,		0x0,		0x0},
5302 	/* [23] l4_hdr over IPV6 over IPV4 */
5303 	{8,		0,		11,		12,
5304 	4,		0,		0,		0,		1,
5305 	0x1f,		0x0,		0x1f,		0x1e,
5306 	0x4,		0x0,		0x0,		0x0},
5307 	/* [24] IPV6 over IPV6 */
5308 	{11,		0,		11,		0,
5309 	4,		0,		0,		0,		1,
5310 	0x1f,		0x0,		0x1f,		0x1f,
5311 	0x4,		0x0,		0x0,		0x0},
5312 	/* [25] l4_hdr over IPV6 over IPV6 */
5313 	{11,		0,		11,		12,
5314 	4,		0,		0,		0,		1,
5315 	0x1f,		0x0,		0x1f,		0x1e,
5316 	0x4,		0x0,		0x0,		0x0},
5317 	/* [26] GENERIC_STORAGE_READ, over IPV4 (and udp) */
5318 	{8,		2,		0,		0,
5319 	0,		0,		0,		0,		1,
5320 	0x1f,		0x1f,		0x0,		0x0,
5321 	0x4,		0x0,		0x0,		0x0},
5322 	/* [27] GENERIC_STORAGE_READ, over IPV6 (and udp) */
5323 	{11,		2,		0,		0,
5324 	0,		0,		0,		0,		1,
5325 	0x1f,		0x1f,		0x0,		0x0,
5326 	0x4,		0x0,		0x0,		0x0},
5327 	/* [28] tunneled GENERIC_STORAGE_READ over IPV4 (and udp) over IPV4/IPV6 */
5328 	{8,		0,		8,		2,
5329 	4,		0,		0,		0,		1,
5330 	0x18,		0x0,		0x1f,		0x1f,
5331 	0x4,		0x0,		0x0,		0x0},
5332 	/* [29] tunneled GENERIC_STORAGE_READ over IPV6 (and udp)  over IPV4/IPV6 */
5333 	{8,		0,		11,		2,
5334 	4,		0,		0,		0,		1,
5335 	0x18,		0x0,		0x1f,		0x1f,
5336 	0x4,		0x0,		0x0,		0x0},
5337 	/* [30] tunneled L2 over GRE over IPV4 */
5338 	{8,		0,		0,		0,
5339 	 4,		0,		0,		0,		1,
5340 	 0x1f,		0x0,		0x1f,		0x0,
5341 	 0x4,		0x0,		0x0,		0x0},
5342 	/* [31] default match */
5343 	{0,		0,		0,		0,
5344 	 0,		0,		0,		0,		1,
5345 	 0x0,		0x0,		0x0,		0x0,
5346 	 0x0,		0x0,		0x0,		0x0}
5347 };
5348 
5349 static struct al_eth_rx_gcp_table_entry
5350 al_eth_generic_rx_crc_gcp[AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM] = {
5351 
5352 	/* [0] roce (with grh, bth) */
5353 	{0,		 1,		1,		0,		1,
5354 	 0,		4,		8,		0,		1,
5355 	 0,		0,		0,		0,		0,
5356 	 0,		0,		{0xffff7f03,	0x00000000,	0x00000000,
5357 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
5358 	 0},
5359 	/* [1] fcoe */
5360 	{0,		1,		0,		0,		1,
5361 	 0,		8,		14,		1,		1,
5362 	 0,		0,		0,		0,		0,
5363 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5364 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
5365 	 0},
5366 	/* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
5367 	{0,		1,		1,		0,		1,
5368 	 0,		4,		0,		0,		1,
5369 	 0,		0,		0,		0,		0,
5370 	 0,		0,		{0x3000cf00,	0x00000f00,	0xc0000000,
5371 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000011,
5372 	 0},
5373 	/* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
5374 	{0,		1,		1,		0,		1,
5375 	 0,		4,		0,		0,		1,
5376 	 0,		0,		0,		0,		0,
5377 	 0,		0,		{0x7f030000,	0x00000000,	0x00000003,
5378 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
5379 	 0},
5380 	/* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
5381 	{0,		1,		1,		0,		1,
5382 	 0,		4,		0,		0,		1,
5383 	 2,		0,		0,		0,		10,
5384 	 0,		0,		{0x3000cf00,	0x00000f00,	0xc0000000,
5385 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x0302201c,
5386 	 28},
5387 	/* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
5388 	{0,		1,		1,		0,		1,
5389 	 0,		4,		0,		0,		1,
5390 	 2,		0,		0,		0,		10,
5391 	 0,		0,		{0x7f030000,	0x00000000,	0x00000003,
5392 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03002018,
5393 	 48},
5394 	/* [6] tunneled roce (with grh, bth) over IPV4 */
5395 	{0,		1,		1,		0,		1,
5396 	 0,		4,		8,		0,		1,
5397 	 0,		0,		0,		1,		0,
5398 	 0,		0,		{0xffff7f03,	0x00000000,	0x00000000,
5399 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03020014,
5400 	 0},
5401 	/* [7] tunneled roce (with grh, bth) over IPV6 */
5402 	{0,		1,		1,		0,		1,
5403 	 0,		4,		8,		0,		1,
5404 	 0,		0,		0,		1,		0,
5405 	 0,		0,		{0xffff7f03,	0x00000000,	0x00000000,
5406 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
5407 	 0},
5408 	/* [8] tunneled fcoe over IPV4 */
5409 	{0,		1,		0,		0,		1,
5410 	 0,		8,		14,		1,		1,
5411 	 0,		0,		0,		1,		0,
5412 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5413 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03020014,
5414 	 0},
5415 	/* [9] tunneled fcoe over IPV6 */
5416 	{0,		1,		0,		0,		1,
5417 	 0,		8,		14,		1,		1,
5418 	 0,		0,		0,		1,		0,
5419 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5420 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
5421 	 0},
5422 	/* [10] tunneled routable_roce that is refered as l4_protocol, over IPV4 (and udp) over IPV4 */
5423 	{0,		1,		1,		0,		1,
5424 	 0,		4,		0,		0,		1,
5425 	 0,		0,		0,		1,		0,
5426 	 0,		0,		{0x3000cf00,	0x00000f00,	0xc0000000,
5427 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03020015,
5428 	 0},
5429 	/* [11] tunneled routable_roce that is refered as l4_protocol, over IPV4 (and udp) over IPV6 */
5430 	{0,		1,		1,		0,		1,
5431 	 0,		4,		0,		0,		1,
5432 	 0,		0,		0,		1,		0,
5433 	 0,		0,		{0x3000cf00,	0x00000f00,	0xc0000000,
5434 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000011,
5435 	 0},
5436 	/* [12] tunneled routable_roce that is refered as l4_protocol, over IPV6 (and udp) over IPV4 */
5437 	{0,		1,		1,		0,		1,
5438 	 0,		4,		0,		0,		1,
5439 	 0,		0,		0,		1,		0,
5440 	 0,		0,		{0x7f030000,	0x00000000,	0x00000003,
5441 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03020014,
5442 	 0},
5443 	/* [13] tunneled routable_roce that is refered as l4_protocol, over IPV6 (and udp) over IPV6 */
5444 	{0,		1,		1,		0,		1,
5445 	 0,		4,		0,		0,		1,
5446 	 0,		0,		0,		1,		0,
5447 	 0,		0,		{0x7f030000,	0x00000000,	0x00000003,
5448 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
5449 	 0},
5450 	/* [14] l3_pkt - IPV4 */
5451 	{0,		0,		0,		0,		0,
5452 	 0,		0,		0,		0,		0,
5453 	 0,		0,		0,		0,		0,
5454 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5455 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000001,
5456 	 0},
5457 	/* [15] l4_hdr over IPV4 */
5458 	{0,		0,		0,		0,		0,
5459 	 0,		0,		0,		0,		0,
5460 	 0,		0,		0,		0,		0,
5461 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5462 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000003,
5463 	 0},
5464 	/* [16] l3_pkt - IPV6 */
5465 	{0,		0,		0,		0,		0,
5466 	 0,		0,		0,		0,		0,
5467 	 0,		0,		0,		0,		0,
5468 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5469 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000000,
5470 	 0},
5471 	/* [17] l4_hdr over IPV6 */
5472 	{0,		0,		0,		0,		0,
5473 	 0,		0,		0,		0,		0,
5474 	 0,		0,		0,		0,		0,
5475 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5476 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000002,
5477 	 0},
5478 	/* [18] IPV4 over IPV4 */
5479 	{0,		0,		0,		0,		0,
5480 	 0,		0,		0,		0,		0,
5481 	 0,		0,		0,		0,		0,
5482 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5483 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00020005,
5484 	 0},
5485 	/* [19] l4_hdr over IPV4 over IPV4 */
5486 	{0,		0,		0,		0,		0,
5487 	 0,		0,		0,		0,		0,
5488 	 0,		0,		0,		0,		0,
5489 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5490 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00020007,
5491 	 0},
5492 	/* [20] IPV4 over IPV6 */
5493 	{0,		0,		0,		0,		0,
5494 	 0,		0,		0,		0,		0,
5495 	 0,		0,		0,		0,		0,
5496 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5497 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000001,
5498 	 0},
5499 	/* [21] l4_hdr over IPV4 over IPV6 */
5500 	{0,		0,		0,		0,		0,
5501 	 0,		0,		0,		0,		0,
5502 	 0,		0,		0,		0,		0,
5503 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5504 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000003,
5505 	 0},
5506 	/* [22] IPV6 over IPV4 */
5507 	{0,		0,		0,		0,		0,
5508 	 0,		0,		0,		0,		0,
5509 	 0,		0,		0,		0,		0,
5510 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5511 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00020004,
5512 	 0},
5513 	/* [23] l4_hdr over IPV6 over IPV4 */
5514 	{0,		0,		0,		0,		0,
5515 	 0,		0,		0,		0,		0,
5516 	 0,		0,		0,		0,		0,
5517 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5518 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00020006,
5519 	 0},
5520 	/* [24] IPV6 over IPV6 */
5521 	{0,		0,		0,		0,		0,
5522 	 0,		0,		0,		0,		0,
5523 	 0,		0,		0,		0,		0,
5524 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5525 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000000,
5526 	 0},
5527 	/* [25] l4_hdr over IPV6 over IPV6 */
5528 	{0,		0,		0,		0,		0,
5529 	 0,		0,		0,		0,		0,
5530 	 0,		0,		0,		0,		0,
5531 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5532 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000002,
5533 	 0},
5534 	/* [26] GENERIC_STORAGE_READ, over IPV4 (and udp) */
5535 	{1,		1,		1,		0,		1,
5536 	 0,		4,		0,		0,		1,
5537 	 0,		0,		0,		2,		0,
5538 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5539 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000011,
5540 	 0},
5541 	/* [27] GENERIC_STORAGE_READ, over IPV6 (and udp) */
5542 	{1,		1,		1,		0,		1,
5543 	 0,		4,		0,		0,		1,
5544 	 0,		0,		0,		2,		0,
5545 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5546 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
5547 	 0},
5548 	/* [28] tunneled GENERIC_STORAGE_READ over IPV4 (and udp) over IPV4/IPV6 */
5549 	{1,		1,		1,		0,		1,
5550 	 0,		4,		0,		0,		1,
5551 	 0,		0,		0,		3,		0,
5552 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5553 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000011,
5554 	 0},
5555 	/* [29] tunneled GENERIC_STORAGE_READ over IPV6 (and udp)  over IPV4/IPV6 */
5556 	{1,		1,		1,		0,		1,
5557 	 0,		4,		0,		0,		1,
5558 	 0,		0,		0,		3,		0,
5559 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5560 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
5561 	 0},
5562 	/* [30] tunneled L2 over GRE over IPV4 */
5563 	{0,		0,		0,		0,		0,
5564 	 0,		0,		0,		0,		0,
5565 	 0,		0,		0,		0,		0,
5566 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5567 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00020004,
5568 	 0},
5569 	/* [31] default match */
5570 	{0,		0,		0,		0,		0,
5571 	 0,		0,		0,		0,		0,
5572 	 0,		0,		0,		0,		0,
5573 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
5574 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x0,
5575 	 0}
5576 };
5577 
5578 int al_eth_tx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter)
5579 {
5580 	int idx;
5581 	al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
5582 
5583 	for (idx = 0; idx < AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM; idx++)
5584 		al_eth_tx_protocol_detect_table_entry_set(adapter, idx,
5585 				&al_eth_generic_tx_crc_gpd[idx]);
5586 
5587 	return 0;
5588 }
5589 
5590 int al_eth_tx_generic_crc_table_init(struct al_hal_eth_adapter *adapter)
5591 {
5592 	int idx;
5593 	al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
5594 
5595 	al_dbg("eth [%s]: enable tx_generic_crc\n", adapter->name);
5596 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_legacy, 0x0);
5597 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace, 0x0);
5598 	for (idx = 0; idx < AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM; idx++)
5599 		al_eth_tx_generic_crc_table_entry_set(adapter, idx,
5600 				&al_eth_generic_tx_crc_gcp[idx]);
5601 
5602 	return 0;
5603 }
5604 
5605 int al_eth_tx_crc_chksum_replace_cmd_init(struct al_hal_eth_adapter *adapter)
5606 {
5607 	int idx;
5608 	al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
5609 
5610 	for (idx = 0; idx < AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM; idx++)
5611 		al_eth_tx_crc_chksum_replace_cmd_entry_set(adapter, idx,
5612 				&al_eth_tx_crc_chksum_replace_cmd[idx]);
5613 
5614 	return 0;
5615 }
5616 
5617 int al_eth_rx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter)
5618 {
5619 	int idx;
5620 	al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
5621 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p1,
5622 			AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L3_PROTO_IDX_OFFSET);
5623 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p2,
5624 			AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L4_PROTO_IDX_OFFSET);
5625 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p3,
5626 			AL_ETH_RX_GPD_PARSE_RESULT_INNER_L3_PROTO_IDX_OFFSET);
5627 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p4,
5628 			AL_ETH_RX_GPD_PARSE_RESULT_INNER_L4_PROTO_IDX_OFFSET);
5629 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p5,
5630 			AL_ETH_RX_GPD_PARSE_RESULT_OUTER_PARSE_CTRL);
5631 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p6,
5632 			AL_ETH_RX_GPD_PARSE_RESULT_INNER_PARSE_CTRL);
5633 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p7,
5634 			AL_ETH_RX_GPD_PARSE_RESULT_L3_PRIORITY);
5635 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p8,
5636 			AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L4_DST_PORT_LSB);
5637 
5638 	for (idx = 0; idx < AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM; idx++)
5639 		al_eth_rx_protocol_detect_table_entry_set(adapter, idx,
5640 				&al_eth_generic_rx_crc_gpd[idx]);
5641 	return 0;
5642 }
5643 
5644 int al_eth_rx_generic_crc_table_init(struct al_hal_eth_adapter *adapter)
5645 	{
5646 	int idx;
5647 	uint32_t val;
5648 
5649 	al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
5650 
5651 	al_dbg("eth [%s]: enable rx_generic_crc\n", adapter->name);
5652 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_legacy, 0x0);
5653 
5654 	for (idx = 0; idx < AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM; idx++)
5655 		al_eth_rx_generic_crc_table_entry_set(adapter, idx,
5656 				&al_eth_generic_rx_crc_gcp[idx]);
5657 
5658 	val = EC_GEN_V3_RX_COMP_DESC_W3_DEC_STAT_15_CRC_RES_SEL |
5659 			EC_GEN_V3_RX_COMP_DESC_W3_DEC_STAT_14_L3_CKS_RES_SEL |
5660 			EC_GEN_V3_RX_COMP_DESC_W3_DEC_STAT_13_L4_CKS_RES_SEL |
5661 			EC_GEN_V3_RX_COMP_DESC_W0_L3_CKS_RES_SEL;
5662 	al_reg_write32_masked(&adapter->ec_regs_base->gen_v3.rx_comp_desc,
5663 			val, val);
5664 	return 0;
5665 }
5666 
5667 /** @} end of Ethernet group */
5668 
5669