xref: /freebsd/sys/contrib/alpine-hal/eth/al_hal_eth.h (revision 49b49cda41feabe3439f7318e8bf40e3896c7bf4)
1*49b49cdaSZbigniew Bodek /*-
2*49b49cdaSZbigniew Bodek *******************************************************************************
3*49b49cdaSZbigniew Bodek Copyright (C) 2015 Annapurna Labs Ltd.
4*49b49cdaSZbigniew Bodek 
5*49b49cdaSZbigniew Bodek This file may be licensed under the terms of the Annapurna Labs Commercial
6*49b49cdaSZbigniew Bodek License Agreement.
7*49b49cdaSZbigniew Bodek 
8*49b49cdaSZbigniew Bodek Alternatively, this file can be distributed under the terms of the GNU General
9*49b49cdaSZbigniew Bodek Public License V2 as published by the Free Software Foundation and can be
10*49b49cdaSZbigniew Bodek found at http://www.gnu.org/licenses/gpl-2.0.html
11*49b49cdaSZbigniew Bodek 
12*49b49cdaSZbigniew Bodek Alternatively, redistribution and use in source and binary forms, with or
13*49b49cdaSZbigniew Bodek without modification, are permitted provided that the following conditions are
14*49b49cdaSZbigniew Bodek met:
15*49b49cdaSZbigniew Bodek 
16*49b49cdaSZbigniew Bodek     *     Redistributions of source code must retain the above copyright notice,
17*49b49cdaSZbigniew Bodek this list of conditions and the following disclaimer.
18*49b49cdaSZbigniew Bodek 
19*49b49cdaSZbigniew Bodek     *     Redistributions in binary form must reproduce the above copyright
20*49b49cdaSZbigniew Bodek notice, this list of conditions and the following disclaimer in
21*49b49cdaSZbigniew Bodek the documentation and/or other materials provided with the
22*49b49cdaSZbigniew Bodek distribution.
23*49b49cdaSZbigniew Bodek 
24*49b49cdaSZbigniew Bodek THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
25*49b49cdaSZbigniew Bodek ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26*49b49cdaSZbigniew Bodek WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27*49b49cdaSZbigniew Bodek DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
28*49b49cdaSZbigniew Bodek ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29*49b49cdaSZbigniew Bodek (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30*49b49cdaSZbigniew Bodek LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
31*49b49cdaSZbigniew Bodek ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32*49b49cdaSZbigniew Bodek (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33*49b49cdaSZbigniew Bodek SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34*49b49cdaSZbigniew Bodek 
35*49b49cdaSZbigniew Bodek *******************************************************************************/
36*49b49cdaSZbigniew Bodek 
37*49b49cdaSZbigniew Bodek /**
38*49b49cdaSZbigniew Bodek  * @defgroup group_eth_api API
39*49b49cdaSZbigniew Bodek  * Ethernet Controller HAL driver API
40*49b49cdaSZbigniew Bodek  * @ingroup group_eth
41*49b49cdaSZbigniew Bodek  * @{
42*49b49cdaSZbigniew Bodek  * @file   al_hal_eth.h
43*49b49cdaSZbigniew Bodek  *
44*49b49cdaSZbigniew Bodek  * @brief Header file for Unified GbE and 10GbE Ethernet Controllers This is a
45*49b49cdaSZbigniew Bodek  * common header file that covers both Standard and Advanced Controller
46*49b49cdaSZbigniew Bodek  *
47*49b49cdaSZbigniew Bodek  *
48*49b49cdaSZbigniew Bodek  */
49*49b49cdaSZbigniew Bodek 
50*49b49cdaSZbigniew Bodek #ifndef __AL_HAL_ETH_H__
51*49b49cdaSZbigniew Bodek #define __AL_HAL_ETH_H__
52*49b49cdaSZbigniew Bodek 
53*49b49cdaSZbigniew Bodek #include "al_hal_common.h"
54*49b49cdaSZbigniew Bodek #include "al_hal_udma.h"
55*49b49cdaSZbigniew Bodek #include "al_hal_eth_alu.h"
56*49b49cdaSZbigniew Bodek #ifdef AL_ETH_EX
57*49b49cdaSZbigniew Bodek #include "al_hal_eth_ex.h"
58*49b49cdaSZbigniew Bodek #include "al_hal_eth_ex_internal.h"
59*49b49cdaSZbigniew Bodek #endif
60*49b49cdaSZbigniew Bodek 
61*49b49cdaSZbigniew Bodek /* *INDENT-OFF* */
62*49b49cdaSZbigniew Bodek #ifdef __cplusplus
63*49b49cdaSZbigniew Bodek extern "C" {
64*49b49cdaSZbigniew Bodek #endif
65*49b49cdaSZbigniew Bodek /* *INDENT-ON* */
66*49b49cdaSZbigniew Bodek 
67*49b49cdaSZbigniew Bodek #ifndef AL_ETH_PKT_MAX_BUFS
68*49b49cdaSZbigniew Bodek #ifndef AL_ETH_EX
69*49b49cdaSZbigniew Bodek #define AL_ETH_PKT_MAX_BUFS 19
70*49b49cdaSZbigniew Bodek #else
71*49b49cdaSZbigniew Bodek #define AL_ETH_PKT_MAX_BUFS 29
72*49b49cdaSZbigniew Bodek #endif
73*49b49cdaSZbigniew Bodek #endif
74*49b49cdaSZbigniew Bodek 
75*49b49cdaSZbigniew Bodek #define AL_ETH_UDMA_TX_QUEUES		4
76*49b49cdaSZbigniew Bodek #define AL_ETH_UDMA_RX_QUEUES		4
77*49b49cdaSZbigniew Bodek 
78*49b49cdaSZbigniew Bodek /* PCI Adapter Device/Revision ID */
79*49b49cdaSZbigniew Bodek #define AL_ETH_DEV_ID_STANDARD		0x0001
80*49b49cdaSZbigniew Bodek #define AL_ETH_DEV_ID_ADVANCED		0x0002
81*49b49cdaSZbigniew Bodek #define AL_ETH_REV_ID_0			0 /* Alpine V1 Rev 0 */
82*49b49cdaSZbigniew Bodek #define AL_ETH_REV_ID_1			1 /* Alpine V1 Rev 1 */
83*49b49cdaSZbigniew Bodek #define AL_ETH_REV_ID_2			2 /* Alpine V2 basic */
84*49b49cdaSZbigniew Bodek #define AL_ETH_REV_ID_3			3 /* Alpine V2 advanced */
85*49b49cdaSZbigniew Bodek 
86*49b49cdaSZbigniew Bodek /* PCI BARs */
87*49b49cdaSZbigniew Bodek #define AL_ETH_UDMA_BAR			0
88*49b49cdaSZbigniew Bodek #define AL_ETH_EC_BAR			4
89*49b49cdaSZbigniew Bodek #define AL_ETH_MAC_BAR			2
90*49b49cdaSZbigniew Bodek 
91*49b49cdaSZbigniew Bodek #define AL_ETH_MAX_FRAME_LEN		10000
92*49b49cdaSZbigniew Bodek #define AL_ETH_MIN_FRAME_LEN		60
93*49b49cdaSZbigniew Bodek 
94*49b49cdaSZbigniew Bodek #define AL_ETH_TSO_MSS_MAX_IDX		8
95*49b49cdaSZbigniew Bodek #define AL_ETH_TSO_MSS_MIN_VAL		1
96*49b49cdaSZbigniew Bodek /*TODO: update with correct value*/
97*49b49cdaSZbigniew Bodek #define AL_ETH_TSO_MSS_MAX_VAL		(AL_ETH_MAX_FRAME_LEN - 200)
98*49b49cdaSZbigniew Bodek 
99*49b49cdaSZbigniew Bodek enum AL_ETH_PROTO_ID {
100*49b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_UNKNOWN = 0,
101*49b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_IPv4	= 8,
102*49b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_IPv6	= 11,
103*49b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_TCP	= 12,
104*49b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_UDP	= 13,
105*49b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_FCOE    = 21,
106*49b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_GRH     = 22, /** RoCE l3 header */
107*49b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_BTH     = 23, /** RoCE l4 header */
108*49b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_ANY	= 32, /**< for sw usage only */
109*49b49cdaSZbigniew Bodek };
110*49b49cdaSZbigniew Bodek #define AL_ETH_PROTOCOLS_NUM		(AL_ETH_PROTO_ID_ANY)
111*49b49cdaSZbigniew Bodek 
112*49b49cdaSZbigniew Bodek enum AL_ETH_TX_TUNNEL_MODE {
113*49b49cdaSZbigniew Bodek 	AL_ETH_NO_TUNNELING	= 0,
114*49b49cdaSZbigniew Bodek 	AL_ETH_TUNNEL_NO_UDP	= 1, /* NVGRE / IP over IP */
115*49b49cdaSZbigniew Bodek 	AL_ETH_TUNNEL_WITH_UDP	= 3,	/* VXLAN */
116*49b49cdaSZbigniew Bodek };
117*49b49cdaSZbigniew Bodek 
118*49b49cdaSZbigniew Bodek #define AL_ETH_RX_THASH_TABLE_SIZE	(1 << 8)
119*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FSM_TABLE_SIZE	(1 << 7)
120*49b49cdaSZbigniew Bodek #define AL_ETH_RX_CTRL_TABLE_SIZE	(1 << 11)
121*49b49cdaSZbigniew Bodek #define AL_ETH_RX_HASH_KEY_NUM		10
122*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_MAC_NUM			32
123*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_MAC_HASH_NUM			256
124*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_PBITS_TABLE_NUM	(1 << 3)
125*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_PRIO_TABLE_NUM	(1 << 3)
126*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_VID_TABLE_NUM	(1 << 12)
127*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_DSCP_TABLE_NUM	(1 << 8)
128*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_TC_TABLE_NUM	(1 << 8)
129*49b49cdaSZbigniew Bodek 
130*49b49cdaSZbigniew Bodek /** MAC media mode */
131*49b49cdaSZbigniew Bodek enum al_eth_mac_mode {
132*49b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_RGMII,
133*49b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_SGMII,
134*49b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_SGMII_2_5G,
135*49b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_10GbE_Serial,	/**< Applies to XFI and KR modes */
136*49b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_10G_SGMII,	/**< SGMII using the 10G MAC, don't use*/
137*49b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_XLG_LL_40G,	/**< applies to 40G mode using the 40G low latency (LL) MAC */
138*49b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_KR_LL_25G,	/**< applies to 25G mode using the 10/25G low latency (LL) MAC */
139*49b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_XLG_LL_50G	/**< applies to 50G mode using the 40/50G low latency (LL) MAC */
140*49b49cdaSZbigniew Bodek };
141*49b49cdaSZbigniew Bodek 
142*49b49cdaSZbigniew Bodek struct al_eth_capabilities {
143*49b49cdaSZbigniew Bodek 	al_bool	speed_10_HD;
144*49b49cdaSZbigniew Bodek 	al_bool	speed_10_FD;
145*49b49cdaSZbigniew Bodek 	al_bool speed_100_HD;
146*49b49cdaSZbigniew Bodek 	al_bool speed_100_FD;
147*49b49cdaSZbigniew Bodek 	al_bool speed_1000_HD;
148*49b49cdaSZbigniew Bodek 	al_bool speed_1000_FD;
149*49b49cdaSZbigniew Bodek 	al_bool speed_10000_HD;
150*49b49cdaSZbigniew Bodek 	al_bool speed_10000_FD;
151*49b49cdaSZbigniew Bodek 	al_bool pfc; /**< priority flow control */
152*49b49cdaSZbigniew Bodek 	al_bool eee; /**< Energy Efficient Ethernet */
153*49b49cdaSZbigniew Bodek };
154*49b49cdaSZbigniew Bodek 
155*49b49cdaSZbigniew Bodek /** interface type used for MDIO */
156*49b49cdaSZbigniew Bodek enum al_eth_mdio_if {
157*49b49cdaSZbigniew Bodek 	AL_ETH_MDIO_IF_1G_MAC = 0,
158*49b49cdaSZbigniew Bodek 	AL_ETH_MDIO_IF_10G_MAC = 1
159*49b49cdaSZbigniew Bodek };
160*49b49cdaSZbigniew Bodek 
161*49b49cdaSZbigniew Bodek /** MDIO protocol type */
162*49b49cdaSZbigniew Bodek enum al_eth_mdio_type {
163*49b49cdaSZbigniew Bodek 	AL_ETH_MDIO_TYPE_CLAUSE_22 = 0,
164*49b49cdaSZbigniew Bodek 	AL_ETH_MDIO_TYPE_CLAUSE_45 = 1
165*49b49cdaSZbigniew Bodek };
166*49b49cdaSZbigniew Bodek 
167*49b49cdaSZbigniew Bodek /** flow control mode */
168*49b49cdaSZbigniew Bodek enum al_eth_flow_control_type {
169*49b49cdaSZbigniew Bodek 	AL_ETH_FLOW_CONTROL_TYPE_LINK_PAUSE,
170*49b49cdaSZbigniew Bodek 	AL_ETH_FLOW_CONTROL_TYPE_PFC
171*49b49cdaSZbigniew Bodek };
172*49b49cdaSZbigniew Bodek 
173*49b49cdaSZbigniew Bodek /** Tx to Rx switching decision type */
174*49b49cdaSZbigniew Bodek enum al_eth_tx_switch_dec_type {
175*49b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_TYPE_MAC = 0,
176*49b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_TYPE_VLAN_TABLE = 1,
177*49b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_TYPE_VLAN_TABLE_AND_MAC = 2,
178*49b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_TYPE_BITMAP = 3
179*49b49cdaSZbigniew Bodek };
180*49b49cdaSZbigniew Bodek 
181*49b49cdaSZbigniew Bodek /** Tx to Rx VLAN ID selection type */
182*49b49cdaSZbigniew Bodek enum al_eth_tx_switch_vid_sel_type {
183*49b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_VID_SEL_TYPE_VLAN1 = 0,
184*49b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_VID_SEL_TYPE_VLAN2 = 1,
185*49b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_VID_SEL_TYPE_NEW_VLAN1 = 2,
186*49b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_VID_SEL_TYPE_NEW_VLAN2 = 3,
187*49b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_VID_SEL_TYPE_DEFAULT_VLAN1 = 4,
188*49b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_VID_SEL_TYPE_FINAL_VLAN1 = 5
189*49b49cdaSZbigniew Bodek };
190*49b49cdaSZbigniew Bodek 
191*49b49cdaSZbigniew Bodek /** Rx descriptor configurations */
192*49b49cdaSZbigniew Bodek /* Note: when selecting rx descriptor field to inner packet, then that field
193*49b49cdaSZbigniew Bodek * will be set according to inner packet when packet is tunneled, for non-tunneled
194*49b49cdaSZbigniew Bodek * packets, the field will be set according to the packets header */
195*49b49cdaSZbigniew Bodek 
196*49b49cdaSZbigniew Bodek /** selection of the LRO_context_value result in the Metadata */
197*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_lro_context_val_res {
198*49b49cdaSZbigniew Bodek 	AL_ETH_LRO_CONTEXT_VALUE = 0, /**< LRO_context_value */
199*49b49cdaSZbigniew Bodek 	AL_ETH_L4_OFFSET = 1, /**< L4_offset */
200*49b49cdaSZbigniew Bodek };
201*49b49cdaSZbigniew Bodek 
202*49b49cdaSZbigniew Bodek /** selection of the L4 offset in the Metadata */
203*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l4_offset_sel {
204*49b49cdaSZbigniew Bodek 	AL_ETH_L4_OFFSET_OUTER = 0, /**< set L4 offset of the outer packet */
205*49b49cdaSZbigniew Bodek 	AL_ETH_L4_OFFSET_INNER = 1, /**< set L4 offset of the inner packet */
206*49b49cdaSZbigniew Bodek };
207*49b49cdaSZbigniew Bodek 
208*49b49cdaSZbigniew Bodek /** selection of the L4 checksum result in the Metadata */
209*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l4_chk_res_sel {
210*49b49cdaSZbigniew Bodek 	AL_ETH_L4_INNER_CHK = 0, /**< L4 checksum */
211*49b49cdaSZbigniew Bodek 	AL_ETH_L4_INNER_OUTER_CHK = 1, /**< Logic AND between outer and inner
212*49b49cdaSZbigniew Bodek 					    L4 checksum result */
213*49b49cdaSZbigniew Bodek };
214*49b49cdaSZbigniew Bodek 
215*49b49cdaSZbigniew Bodek /** selection of the L3 checksum result in the Metadata */
216*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l3_chk_res_sel {
217*49b49cdaSZbigniew Bodek 	AL_ETH_L3_CHK_TYPE_0 = 0, /**< L3 checksum */
218*49b49cdaSZbigniew Bodek 	AL_ETH_L3_CHK_TYPE_1 = 1, /**< L3 checksum or RoCE/FCoE CRC,
219*49b49cdaSZbigniew Bodek 				       based on outer header */
220*49b49cdaSZbigniew Bodek 	AL_ETH_L3_CHK_TYPE_2 = 2, /**< If tunnel exist = 0,
221*49b49cdaSZbigniew Bodek 					  L3 checksum or RoCE/FCoE CRC,
222*49b49cdaSZbigniew Bodek 					  based on outer header.
223*49b49cdaSZbigniew Bodek 				       Else,
224*49b49cdaSZbigniew Bodek 					  logic AND between outer L3 checksum
225*49b49cdaSZbigniew Bodek 					  (Ipv4) and inner CRC (RoCE or FcoE) */
226*49b49cdaSZbigniew Bodek 	AL_ETH_L3_CHK_TYPE_3 = 3, /**< combination of the L3 checksum result and
227*49b49cdaSZbigniew Bodek 				       CRC result,based on the checksum and
228*49b49cdaSZbigniew Bodek 				       RoCE/FCoE CRC input selections. */
229*49b49cdaSZbigniew Bodek };
230*49b49cdaSZbigniew Bodek 
231*49b49cdaSZbigniew Bodek /** selection of the L3 protocol index in the Metadata */
232*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l3_proto_idx_sel {
233*49b49cdaSZbigniew Bodek 	AL_ETH_L3_PROTO_IDX_OUTER = 0, /**< set L3 proto index of the outer packet */
234*49b49cdaSZbigniew Bodek 	AL_ETH_L3_PROTO_IDX_INNER = 1, /**< set L3 proto index of the inner packet */
235*49b49cdaSZbigniew Bodek };
236*49b49cdaSZbigniew Bodek 
237*49b49cdaSZbigniew Bodek /** selection of the L3 offset in the Metadata */
238*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l3_offset_sel {
239*49b49cdaSZbigniew Bodek 	AL_ETH_L3_OFFSET_OUTER = 0, /**< set L3 offset of the outer packet */
240*49b49cdaSZbigniew Bodek 	AL_ETH_L3_OFFSET_INNER = 1, /**< set L3 offset of the inner packet */
241*49b49cdaSZbigniew Bodek };
242*49b49cdaSZbigniew Bodek 
243*49b49cdaSZbigniew Bodek 
244*49b49cdaSZbigniew Bodek /** selection of the L4 protocol index in the Metadata */
245*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l4_proto_idx_sel {
246*49b49cdaSZbigniew Bodek 	AL_ETH_L4_PROTO_IDX_OUTER = 0, /**< set L4 proto index of the outer packet */
247*49b49cdaSZbigniew Bodek 	AL_ETH_L4_PROTO_IDX_INNER = 1, /**< set L4 proto index of the inner packet */
248*49b49cdaSZbigniew Bodek };
249*49b49cdaSZbigniew Bodek 
250*49b49cdaSZbigniew Bodek /** selection of the frag indication in the Metadata */
251*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_frag_sel {
252*49b49cdaSZbigniew Bodek 	AL_ETH_FRAG_OUTER = 0, /**< set frag of the outer packet */
253*49b49cdaSZbigniew Bodek 	AL_ETH_FRAG_INNER = 1, /**< set frag of the inner packet */
254*49b49cdaSZbigniew Bodek };
255*49b49cdaSZbigniew Bodek 
256*49b49cdaSZbigniew Bodek /** Ethernet Rx completion descriptor */
257*49b49cdaSZbigniew Bodek typedef struct {
258*49b49cdaSZbigniew Bodek 	uint32_t ctrl_meta;
259*49b49cdaSZbigniew Bodek 	uint32_t len;
260*49b49cdaSZbigniew Bodek 	uint32_t word2;
261*49b49cdaSZbigniew Bodek 	uint32_t word3;
262*49b49cdaSZbigniew Bodek } al_eth_rx_cdesc;
263*49b49cdaSZbigniew Bodek 
264*49b49cdaSZbigniew Bodek /** Flow Contol parameters */
265*49b49cdaSZbigniew Bodek struct al_eth_flow_control_params{
266*49b49cdaSZbigniew Bodek 	enum al_eth_flow_control_type type; /**< flow control type */
267*49b49cdaSZbigniew Bodek 	al_bool		obay_enable; /**< stop tx when pause received */
268*49b49cdaSZbigniew Bodek 	al_bool		gen_enable; /**< generate pause frames */
269*49b49cdaSZbigniew Bodek 	uint16_t	rx_fifo_th_high;
270*49b49cdaSZbigniew Bodek 	uint16_t	rx_fifo_th_low;
271*49b49cdaSZbigniew Bodek 	uint16_t	quanta;
272*49b49cdaSZbigniew Bodek 	uint16_t	quanta_th;
273*49b49cdaSZbigniew Bodek 	uint8_t		prio_q_map[4][8]; /**< for each UDMA, defines the mapping between
274*49b49cdaSZbigniew Bodek 					   * PFC priority and queues(in bit mask).
275*49b49cdaSZbigniew Bodek 					   * same mapping used for obay and generation.
276*49b49cdaSZbigniew Bodek 					   * for example:
277*49b49cdaSZbigniew Bodek 					   * if prio_q_map[1][7] = 0xC, then TX queues 2
278*49b49cdaSZbigniew Bodek 					   * and 3 of UDMA 1 will be stopped when pause
279*49b49cdaSZbigniew Bodek 					   * received with priority 7, also, when RX queues
280*49b49cdaSZbigniew Bodek 					   * 2 and 3 of UDMA 1 become almost full, then
281*49b49cdaSZbigniew Bodek 					   * pause frame with priority 7 will be sent.
282*49b49cdaSZbigniew Bodek 					   *
283*49b49cdaSZbigniew Bodek 					   *note:
284*49b49cdaSZbigniew Bodek 					   * 1) if specific a queue is not used, the caller must
285*49b49cdaSZbigniew Bodek 					   * make set the prio_q_map to 0 otherwise that queue
286*49b49cdaSZbigniew Bodek 					   * will make the controller keep sending PAUSE packets.
287*49b49cdaSZbigniew Bodek 					   * 2) queues of unused UDMA must be treated as above.
288*49b49cdaSZbigniew Bodek 					   * 3) when working in LINK PAUSE mode, only entries at
289*49b49cdaSZbigniew Bodek 					   * priority 0 will be considered.
290*49b49cdaSZbigniew Bodek 					   */
291*49b49cdaSZbigniew Bodek };
292*49b49cdaSZbigniew Bodek 
293*49b49cdaSZbigniew Bodek /* Packet Tx flags */
294*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_TSO		AL_BIT(7)  /**< Enable TCP/UDP segmentation offloading */
295*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_IPV4_L3_CSUM	AL_BIT(13) /**< Enable IPv4 header checksum calculation */
296*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_L4_CSUM		AL_BIT(14) /**< Enable TCP/UDP checksum calculation */
297*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM	AL_BIT(17) /**< L4 partial checksum calculation */
298*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_L2_MACSEC_PKT	AL_BIT(16) /**< L2 Packet type 802_3 or 802_3_MACSEC, V2 */
299*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_ENCRYPT		AL_BIT(16) /**< Enable TX packet encryption, V3 */
300*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_L2_DIS_FCS	AL_BIT(15) /**< Disable CRC calculation*/
301*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_TS		AL_BIT(21) /**< Timestamp the packet */
302*49b49cdaSZbigniew Bodek 
303*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_INT		AL_M2S_DESC_INT_EN
304*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_NO_SNOOP	AL_M2S_DESC_NO_SNOOP_H
305*49b49cdaSZbigniew Bodek 
306*49b49cdaSZbigniew Bodek /** this structure used for tx packet meta data */
307*49b49cdaSZbigniew Bodek struct al_eth_meta_data{
308*49b49cdaSZbigniew Bodek 	uint8_t store :1; /**< store the meta into the queues cache */
309*49b49cdaSZbigniew Bodek 	uint8_t words_valid :4; /**< valid bit per word */
310*49b49cdaSZbigniew Bodek 
311*49b49cdaSZbigniew Bodek 	uint8_t vlan1_cfi_sel:2;
312*49b49cdaSZbigniew Bodek 	uint8_t vlan2_vid_sel:2;
313*49b49cdaSZbigniew Bodek 	uint8_t vlan2_cfi_sel:2;
314*49b49cdaSZbigniew Bodek 	uint8_t vlan2_pbits_sel:2;
315*49b49cdaSZbigniew Bodek 	uint8_t vlan2_ether_sel:2;
316*49b49cdaSZbigniew Bodek 
317*49b49cdaSZbigniew Bodek 	uint16_t vlan1_new_vid:12;
318*49b49cdaSZbigniew Bodek 	uint8_t vlan1_new_cfi :1;
319*49b49cdaSZbigniew Bodek 	uint8_t vlan1_new_pbits :3;
320*49b49cdaSZbigniew Bodek 	uint16_t vlan2_new_vid:12;
321*49b49cdaSZbigniew Bodek 	uint8_t vlan2_new_cfi :1;
322*49b49cdaSZbigniew Bodek 	uint8_t vlan2_new_pbits :3;
323*49b49cdaSZbigniew Bodek 
324*49b49cdaSZbigniew Bodek 	uint8_t l3_header_len; /**< in bytes */
325*49b49cdaSZbigniew Bodek 	uint8_t l3_header_offset;
326*49b49cdaSZbigniew Bodek 	uint8_t l4_header_len; /**< in words(32-bits) */
327*49b49cdaSZbigniew Bodek 
328*49b49cdaSZbigniew Bodek 	/* rev 0 specific */
329*49b49cdaSZbigniew Bodek 	uint8_t mss_idx_sel:3; /**< for TSO, select the register that holds the MSS */
330*49b49cdaSZbigniew Bodek 
331*49b49cdaSZbigniew Bodek 	/* rev 1 specific */
332*49b49cdaSZbigniew Bodek 	uint8_t	ts_index:4; /**< index of regiser where to store the tx timestamp */
333*49b49cdaSZbigniew Bodek 	uint16_t mss_val :14; /**< for TSO, set the mss value */
334*49b49cdaSZbigniew Bodek 	uint8_t outer_l3_offset; /**< for tunneling mode. up to 64 bytes */
335*49b49cdaSZbigniew Bodek 	uint8_t outer_l3_len; /**< for tunneling mode. up to 128 bytes */
336*49b49cdaSZbigniew Bodek };
337*49b49cdaSZbigniew Bodek 
338*49b49cdaSZbigniew Bodek /* Packet Rx flags when adding buffer to receive queue */
339*49b49cdaSZbigniew Bodek 
340*49b49cdaSZbigniew Bodek /**<
341*49b49cdaSZbigniew Bodek  * VMID to be assigned to the packet descriptors
342*49b49cdaSZbigniew Bodek  * Requires VMID in descriptor to be enabled for the specific UDMA
343*49b49cdaSZbigniew Bodek  * queue.
344*49b49cdaSZbigniew Bodek  */
345*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_VMID_MASK	AL_FIELD_MASK(15, 0)
346*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_NO_SNOOP	AL_M2S_DESC_NO_SNOOP_H
347*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_INT		AL_M2S_DESC_INT_EN
348*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_DUAL_BUF	AL_BIT(31)
349*49b49cdaSZbigniew Bodek 
350*49b49cdaSZbigniew Bodek /* Packet Rx flags set by HW when receiving packet */
351*49b49cdaSZbigniew Bodek #define AL_ETH_RX_ERROR			AL_BIT(16) /**< layer 2 errors (FCS, bad len, etc) */
352*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L4_CSUM_ERR	AL_BIT(14)
353*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L3_CSUM_ERR	AL_BIT(13)
354*49b49cdaSZbigniew Bodek 
355*49b49cdaSZbigniew Bodek /* Packet Rx flags - word 3 in Rx completion descriptor */
356*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_CRC						AL_BIT(31)
357*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L3_CSUM_2				AL_BIT(30)
358*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L4_CSUM_2				AL_BIT(29)
359*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_SW_SRC_PORT_SHIFT		13
360*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_SW_SRC_PORT_MASK		AL_FIELD_MASK(15, 13)
361*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_LRO_CONTEXT_VAL_SHIFT	3
362*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_LRO_CONTEXT_VAL_MASK	AL_FIELD_MASK(10, 3)
363*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L4_OFFSET_SHIFT			3
364*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L4_OFFSET_MASK			AL_FIELD_MASK(10, 3)
365*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_PRIORITY_SHIFT			0
366*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_PRIORITY_MASK			AL_FIELD_MASK(2, 0)
367*49b49cdaSZbigniew Bodek 
368*49b49cdaSZbigniew Bodek /** packet structure. used for packet transmission and reception */
369*49b49cdaSZbigniew Bodek struct al_eth_pkt{
370*49b49cdaSZbigniew Bodek 	uint32_t flags; /**< see flags above, depends on context(tx or rx) */
371*49b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID l3_proto_idx;
372*49b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID l4_proto_idx;
373*49b49cdaSZbigniew Bodek 	uint8_t source_vlan_count:2;
374*49b49cdaSZbigniew Bodek 	uint8_t vlan_mod_add_count:2;
375*49b49cdaSZbigniew Bodek 	uint8_t vlan_mod_del_count:2;
376*49b49cdaSZbigniew Bodek 	uint8_t vlan_mod_v1_ether_sel:2;
377*49b49cdaSZbigniew Bodek 	uint8_t vlan_mod_v1_vid_sel:2;
378*49b49cdaSZbigniew Bodek 	uint8_t vlan_mod_v1_pbits_sel:2;
379*49b49cdaSZbigniew Bodek 
380*49b49cdaSZbigniew Bodek 	/* rev 1 specific */
381*49b49cdaSZbigniew Bodek 	enum AL_ETH_TX_TUNNEL_MODE tunnel_mode;
382*49b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID outer_l3_proto_idx; /**< for tunneling mode */
383*49b49cdaSZbigniew Bodek 
384*49b49cdaSZbigniew Bodek 	/**<
385*49b49cdaSZbigniew Bodek 	 * VMID to be assigned to the packet descriptors
386*49b49cdaSZbigniew Bodek 	 * Requires VMID in descriptor to be enabled for the specific UDMA
387*49b49cdaSZbigniew Bodek 	 * queue.
388*49b49cdaSZbigniew Bodek 	 */
389*49b49cdaSZbigniew Bodek 	uint16_t vmid;
390*49b49cdaSZbigniew Bodek 
391*49b49cdaSZbigniew Bodek 	uint32_t rx_header_len; /**< header buffer length of rx packet, not used */
392*49b49cdaSZbigniew Bodek 	struct al_eth_meta_data *meta; /**< if null, then no meta added */
393*49b49cdaSZbigniew Bodek #ifdef AL_ETH_RX_DESC_RAW_GET
394*49b49cdaSZbigniew Bodek 	uint32_t rx_desc_raw[4];
395*49b49cdaSZbigniew Bodek #endif
396*49b49cdaSZbigniew Bodek 	uint16_t rxhash;
397*49b49cdaSZbigniew Bodek 	uint16_t l3_offset;
398*49b49cdaSZbigniew Bodek 
399*49b49cdaSZbigniew Bodek #ifdef AL_ETH_EX
400*49b49cdaSZbigniew Bodek 	struct al_eth_ext_metadata *ext_meta_data;
401*49b49cdaSZbigniew Bodek #endif
402*49b49cdaSZbigniew Bodek 
403*49b49cdaSZbigniew Bodek 	uint8_t num_of_bufs;
404*49b49cdaSZbigniew Bodek 	struct al_buf	bufs[AL_ETH_PKT_MAX_BUFS];
405*49b49cdaSZbigniew Bodek };
406*49b49cdaSZbigniew Bodek 
407*49b49cdaSZbigniew Bodek struct al_ec_regs;
408*49b49cdaSZbigniew Bodek 
409*49b49cdaSZbigniew Bodek 
410*49b49cdaSZbigniew Bodek /** Ethernet Adapter private data structure used by this driver */
411*49b49cdaSZbigniew Bodek struct al_hal_eth_adapter{
412*49b49cdaSZbigniew Bodek 	uint8_t rev_id; /**<PCI adapter revision ID */
413*49b49cdaSZbigniew Bodek 	uint8_t udma_id; /**< the id of the UDMA used by this adapter */
414*49b49cdaSZbigniew Bodek 	struct unit_regs __iomem * unit_regs;
415*49b49cdaSZbigniew Bodek 	void __iomem *udma_regs_base;
416*49b49cdaSZbigniew Bodek 	struct al_ec_regs __iomem *ec_regs_base;
417*49b49cdaSZbigniew Bodek 	void __iomem *ec_ints_base;
418*49b49cdaSZbigniew Bodek 	struct al_eth_mac_regs __iomem *mac_regs_base;
419*49b49cdaSZbigniew Bodek 	struct interrupt_controller_ctrl __iomem *mac_ints_base;
420*49b49cdaSZbigniew Bodek 
421*49b49cdaSZbigniew Bodek 	char *name; /**< the upper layer must keep the string area */
422*49b49cdaSZbigniew Bodek 
423*49b49cdaSZbigniew Bodek 	struct al_udma tx_udma;
424*49b49cdaSZbigniew Bodek 	/*	uint8_t tx_queues;*//* number of tx queues */
425*49b49cdaSZbigniew Bodek 	struct al_udma rx_udma;
426*49b49cdaSZbigniew Bodek 	/*	uint8_t rx_queues;*//* number of tx queues */
427*49b49cdaSZbigniew Bodek 
428*49b49cdaSZbigniew Bodek 	uint8_t		enable_rx_parser; /**< config and enable rx parsing */
429*49b49cdaSZbigniew Bodek 
430*49b49cdaSZbigniew Bodek 	enum al_eth_flow_control_type fc_type; /**< flow control*/
431*49b49cdaSZbigniew Bodek 
432*49b49cdaSZbigniew Bodek 	enum al_eth_mac_mode mac_mode;
433*49b49cdaSZbigniew Bodek 	enum al_eth_mdio_if	mdio_if; /**< which mac mdio interface to use */
434*49b49cdaSZbigniew Bodek 	enum al_eth_mdio_type mdio_type; /**< mdio protocol type */
435*49b49cdaSZbigniew Bodek 	al_bool	shared_mdio_if; /**< when AL_TRUE, the mdio interface is shared with other controllers.*/
436*49b49cdaSZbigniew Bodek 	uint8_t curr_lt_unit;
437*49b49cdaSZbigniew Bodek #ifdef AL_ETH_EX
438*49b49cdaSZbigniew Bodek 	struct al_eth_ex_state ex_state;
439*49b49cdaSZbigniew Bodek #endif
440*49b49cdaSZbigniew Bodek };
441*49b49cdaSZbigniew Bodek 
442*49b49cdaSZbigniew Bodek /** parameters from upper layer */
443*49b49cdaSZbigniew Bodek struct al_eth_adapter_params{
444*49b49cdaSZbigniew Bodek 	uint8_t rev_id; /**<PCI adapter revision ID */
445*49b49cdaSZbigniew Bodek 	uint8_t udma_id; /**< the id of the UDMA used by this adapter */
446*49b49cdaSZbigniew Bodek 	uint8_t	enable_rx_parser; /**< when true, the rx epe parser will be enabled */
447*49b49cdaSZbigniew Bodek 	void __iomem *udma_regs_base; /**< UDMA register base address */
448*49b49cdaSZbigniew Bodek 	void __iomem *ec_regs_base; /**< Ethernet controller registers base address
449*49b49cdaSZbigniew Bodek 				     * can be null if the function is virtual
450*49b49cdaSZbigniew Bodek 				     */
451*49b49cdaSZbigniew Bodek 	void __iomem *mac_regs_base; /**< Ethernet MAC registers base address
452*49b49cdaSZbigniew Bodek 				      * can be null if the function is virtual
453*49b49cdaSZbigniew Bodek 				      */
454*49b49cdaSZbigniew Bodek 	char *name; /**< the upper layer must keep the string area */
455*49b49cdaSZbigniew Bodek };
456*49b49cdaSZbigniew Bodek 
457*49b49cdaSZbigniew Bodek /* adapter management */
458*49b49cdaSZbigniew Bodek /**
459*49b49cdaSZbigniew Bodek  * initialize the ethernet adapter's DMA
460*49b49cdaSZbigniew Bodek  * - initialize the adapter data structure
461*49b49cdaSZbigniew Bodek  * - initialize the Tx and Rx UDMA
462*49b49cdaSZbigniew Bodek  * - enable the Tx and Rx UDMA, the rings will be still disabled at this point.
463*49b49cdaSZbigniew Bodek  *
464*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
465*49b49cdaSZbigniew Bodek  * @param params the parameters passed from upper layer
466*49b49cdaSZbigniew Bodek  *
467*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
468*49b49cdaSZbigniew Bodek  */
469*49b49cdaSZbigniew Bodek int al_eth_adapter_init(struct al_hal_eth_adapter *adapter, struct al_eth_adapter_params *params);
470*49b49cdaSZbigniew Bodek 
471*49b49cdaSZbigniew Bodek /**
472*49b49cdaSZbigniew Bodek  * stop the DMA of the ethernet adapter
473*49b49cdaSZbigniew Bodek  *
474*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
475*49b49cdaSZbigniew Bodek  *
476*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
477*49b49cdaSZbigniew Bodek  */
478*49b49cdaSZbigniew Bodek int al_eth_adapter_stop(struct al_hal_eth_adapter *adapter);
479*49b49cdaSZbigniew Bodek 
480*49b49cdaSZbigniew Bodek int al_eth_adapter_reset(struct al_hal_eth_adapter *adapter);
481*49b49cdaSZbigniew Bodek 
482*49b49cdaSZbigniew Bodek /**
483*49b49cdaSZbigniew Bodek  * enable the ec and mac interrupts
484*49b49cdaSZbigniew Bodek  *
485*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
486*49b49cdaSZbigniew Bodek  *
487*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
488*49b49cdaSZbigniew Bodek  */
489*49b49cdaSZbigniew Bodek int al_eth_ec_mac_ints_config(struct al_hal_eth_adapter *adapter);
490*49b49cdaSZbigniew Bodek 
491*49b49cdaSZbigniew Bodek /**
492*49b49cdaSZbigniew Bodek  * ec and mac interrupt service routine
493*49b49cdaSZbigniew Bodek  * read and print asserted interrupts
494*49b49cdaSZbigniew Bodek  *
495*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
496*49b49cdaSZbigniew Bodek  *
497*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
498*49b49cdaSZbigniew Bodek  */
499*49b49cdaSZbigniew Bodek int al_eth_ec_mac_isr(struct al_hal_eth_adapter *adapter);
500*49b49cdaSZbigniew Bodek 
501*49b49cdaSZbigniew Bodek /* Q management */
502*49b49cdaSZbigniew Bodek /**
503*49b49cdaSZbigniew Bodek  * Configure and enable a queue ring
504*49b49cdaSZbigniew Bodek  *
505*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
506*49b49cdaSZbigniew Bodek  * @param type tx or rx
507*49b49cdaSZbigniew Bodek  * @param qid queue index
508*49b49cdaSZbigniew Bodek  * @param q_params queue parameters
509*49b49cdaSZbigniew Bodek  *
510*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
511*49b49cdaSZbigniew Bodek  */
512*49b49cdaSZbigniew Bodek int al_eth_queue_config(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid,
513*49b49cdaSZbigniew Bodek 			struct al_udma_q_params *q_params);
514*49b49cdaSZbigniew Bodek 
515*49b49cdaSZbigniew Bodek 
516*49b49cdaSZbigniew Bodek /**
517*49b49cdaSZbigniew Bodek  * enable a queue if it was previously disabled
518*49b49cdaSZbigniew Bodek  *
519*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
520*49b49cdaSZbigniew Bodek  * @param type tx or rx
521*49b49cdaSZbigniew Bodek  * @param qid queue index
522*49b49cdaSZbigniew Bodek  *
523*49b49cdaSZbigniew Bodek  * @return -EPERM (not implemented yet).
524*49b49cdaSZbigniew Bodek  */
525*49b49cdaSZbigniew Bodek int al_eth_queue_enable(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid);
526*49b49cdaSZbigniew Bodek 
527*49b49cdaSZbigniew Bodek /**
528*49b49cdaSZbigniew Bodek  * disable a queue
529*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
530*49b49cdaSZbigniew Bodek  * @param type tx or rx
531*49b49cdaSZbigniew Bodek  * @param qid queue index
532*49b49cdaSZbigniew Bodek  *
533*49b49cdaSZbigniew Bodek  * @return -EPERM (not implemented yet).
534*49b49cdaSZbigniew Bodek  */
535*49b49cdaSZbigniew Bodek int al_eth_queue_disable(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid);
536*49b49cdaSZbigniew Bodek 
537*49b49cdaSZbigniew Bodek /* MAC layer */
538*49b49cdaSZbigniew Bodek 
539*49b49cdaSZbigniew Bodek /**
540*49b49cdaSZbigniew Bodek  * configure the mac media type.
541*49b49cdaSZbigniew Bodek  * this function only sets the mode, but not the speed as certain mac modes
542*49b49cdaSZbigniew Bodek  * support multiple speeds as will be negotiated by the link layer.
543*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
544*49b49cdaSZbigniew Bodek  * @param mode media mode
545*49b49cdaSZbigniew Bodek  *
546*49b49cdaSZbigniew Bodek  * @return 0 on success. negative errno on failure.
547*49b49cdaSZbigniew Bodek  */
548*49b49cdaSZbigniew Bodek int al_eth_mac_config(struct al_hal_eth_adapter *adapter, enum al_eth_mac_mode mode);
549*49b49cdaSZbigniew Bodek 
550*49b49cdaSZbigniew Bodek /**
551*49b49cdaSZbigniew Bodek  * stop the mac tx and rx paths.
552*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
553*49b49cdaSZbigniew Bodek  *
554*49b49cdaSZbigniew Bodek  * @return 0 on success. negative error on failure.
555*49b49cdaSZbigniew Bodek  */
556*49b49cdaSZbigniew Bodek int al_eth_mac_stop(struct al_hal_eth_adapter *adapter);
557*49b49cdaSZbigniew Bodek 
558*49b49cdaSZbigniew Bodek /**
559*49b49cdaSZbigniew Bodek  * start the mac tx and rx paths.
560*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
561*49b49cdaSZbigniew Bodek  *
562*49b49cdaSZbigniew Bodek  * @return 0 on success. negative error on failure.
563*49b49cdaSZbigniew Bodek  */
564*49b49cdaSZbigniew Bodek int al_eth_mac_start(struct al_hal_eth_adapter *adapter);
565*49b49cdaSZbigniew Bodek 
566*49b49cdaSZbigniew Bodek 
567*49b49cdaSZbigniew Bodek /**
568*49b49cdaSZbigniew Bodek  * get the adapter capabilities (speed, duplex,..)
569*49b49cdaSZbigniew Bodek  * this function must not be called before configuring the mac mode using al_eth_mac_config()
570*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
571*49b49cdaSZbigniew Bodek  * @param caps pointer to structure that will be updated by this function
572*49b49cdaSZbigniew Bodek  *
573*49b49cdaSZbigniew Bodek  * @return 0 on success. negative errno on failure.
574*49b49cdaSZbigniew Bodek  */
575*49b49cdaSZbigniew Bodek int al_eth_capabilities_get(struct al_hal_eth_adapter *adapter, struct al_eth_capabilities *caps);
576*49b49cdaSZbigniew Bodek 
577*49b49cdaSZbigniew Bodek /**
578*49b49cdaSZbigniew Bodek  * update link auto negotiation speed and duplex mode
579*49b49cdaSZbigniew Bodek  * this function assumes the mac mode already set using the al_eth_mac_config()
580*49b49cdaSZbigniew Bodek  * function.
581*49b49cdaSZbigniew Bodek  *
582*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
583*49b49cdaSZbigniew Bodek  * @param force_1000_base_x set to AL_TRUE to force the mac to work on 1000baseX
584*49b49cdaSZbigniew Bodek  *	  (not relevant to RGMII)
585*49b49cdaSZbigniew Bodek  * @param an_enable set to AL_TRUE to enable auto negotiation
586*49b49cdaSZbigniew Bodek  *	  (not relevant to RGMII)
587*49b49cdaSZbigniew Bodek  * @param speed in mega bits, e.g 1000 stands for 1Gbps (relevant only in case
588*49b49cdaSZbigniew Bodek  *	  an_enable is AL_FALSE)
589*49b49cdaSZbigniew Bodek  * @param full_duplex set to AL_TRUE to enable full duplex mode (relevant only
590*49b49cdaSZbigniew Bodek  *	  in case an_enable is AL_FALSE)
591*49b49cdaSZbigniew Bodek  *
592*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
593*49b49cdaSZbigniew Bodek  */
594*49b49cdaSZbigniew Bodek int al_eth_mac_link_config(struct al_hal_eth_adapter *adapter,
595*49b49cdaSZbigniew Bodek 			   al_bool force_1000_base_x,
596*49b49cdaSZbigniew Bodek 			   al_bool an_enable,
597*49b49cdaSZbigniew Bodek 			   uint32_t speed,
598*49b49cdaSZbigniew Bodek 			   al_bool full_duplex);
599*49b49cdaSZbigniew Bodek /**
600*49b49cdaSZbigniew Bodek  * Enable/Disable Loopback mode
601*49b49cdaSZbigniew Bodek  *
602*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
603*49b49cdaSZbigniew Bodek  * @param enable set to AL_TRUE to enable full duplex mode
604*49b49cdaSZbigniew Bodek  *
605*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
606*49b49cdaSZbigniew Bodek  */
607*49b49cdaSZbigniew Bodek int al_eth_mac_loopback_config(struct al_hal_eth_adapter *adapter, int enable);
608*49b49cdaSZbigniew Bodek 
609*49b49cdaSZbigniew Bodek /**
610*49b49cdaSZbigniew Bodek  * configure minimum and maximum rx packet length
611*49b49cdaSZbigniew Bodek  *
612*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
613*49b49cdaSZbigniew Bodek  * @param min_rx_len minimum rx packet length
614*49b49cdaSZbigniew Bodek  * @param max_rx_len maximum rx packet length
615*49b49cdaSZbigniew Bodek  * both length limits in bytes and it includes the MAC Layer header and FCS.
616*49b49cdaSZbigniew Bodek  * @return 0 on success, otherwise on failure.
617*49b49cdaSZbigniew Bodek  */
618*49b49cdaSZbigniew Bodek int al_eth_rx_pkt_limit_config(struct al_hal_eth_adapter *adapter, uint32_t min_rx_len, uint32_t max_rx_len);
619*49b49cdaSZbigniew Bodek 
620*49b49cdaSZbigniew Bodek 
621*49b49cdaSZbigniew Bodek /* MDIO */
622*49b49cdaSZbigniew Bodek 
623*49b49cdaSZbigniew Bodek /* Reference clock frequency (platform specific) */
624*49b49cdaSZbigniew Bodek enum al_eth_ref_clk_freq {
625*49b49cdaSZbigniew Bodek 	AL_ETH_REF_FREQ_375_MHZ		= 0,
626*49b49cdaSZbigniew Bodek 	AL_ETH_REF_FREQ_187_5_MHZ	= 1,
627*49b49cdaSZbigniew Bodek 	AL_ETH_REF_FREQ_250_MHZ		= 2,
628*49b49cdaSZbigniew Bodek 	AL_ETH_REF_FREQ_500_MHZ		= 3,
629*49b49cdaSZbigniew Bodek 	AL_ETH_REF_FREQ_428_MHZ         = 4,
630*49b49cdaSZbigniew Bodek };
631*49b49cdaSZbigniew Bodek 
632*49b49cdaSZbigniew Bodek /**
633*49b49cdaSZbigniew Bodek  * configure the MDIO hardware interface
634*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
635*49b49cdaSZbigniew Bodek  * @param mdio_type clause type
636*49b49cdaSZbigniew Bodek  * @param shared_mdio_if set to AL_TRUE if multiple controllers using the same
637*49b49cdaSZbigniew Bodek  * @param ref_clk_freq reference clock frequency
638*49b49cdaSZbigniew Bodek  * @param mdio_clk_freq_khz the required MDC/MDIO clock frequency [Khz]
639*49b49cdaSZbigniew Bodek  * MDIO pins of the chip.
640*49b49cdaSZbigniew Bodek  *
641*49b49cdaSZbigniew Bodek  * @return 0 on success, otherwise on failure.
642*49b49cdaSZbigniew Bodek  */
643*49b49cdaSZbigniew Bodek int al_eth_mdio_config(struct al_hal_eth_adapter *adapter,
644*49b49cdaSZbigniew Bodek 		       enum al_eth_mdio_type mdio_type,
645*49b49cdaSZbigniew Bodek 		       al_bool shared_mdio_if,
646*49b49cdaSZbigniew Bodek 		       enum al_eth_ref_clk_freq ref_clk_freq,
647*49b49cdaSZbigniew Bodek 		       unsigned int mdio_clk_freq_khz);
648*49b49cdaSZbigniew Bodek 
649*49b49cdaSZbigniew Bodek /**
650*49b49cdaSZbigniew Bodek  * read mdio register
651*49b49cdaSZbigniew Bodek  * this function uses polling mode, and as the mdio is slow interface, it might
652*49b49cdaSZbigniew Bodek  * block the cpu for long time (milliseconds).
653*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
654*49b49cdaSZbigniew Bodek  * @param phy_addr address of mdio phy
655*49b49cdaSZbigniew Bodek  * @param device address of mdio device (used only in CLAUSE 45)
656*49b49cdaSZbigniew Bodek  * @param reg index of the register
657*49b49cdaSZbigniew Bodek  * @param val pointer for read value of the register
658*49b49cdaSZbigniew Bodek  *
659*49b49cdaSZbigniew Bodek  * @return 0 on success, negative errno on failure
660*49b49cdaSZbigniew Bodek  */
661*49b49cdaSZbigniew Bodek int al_eth_mdio_read(struct al_hal_eth_adapter *adapter, uint32_t phy_addr,
662*49b49cdaSZbigniew Bodek 		     uint32_t device, uint32_t reg, uint16_t *val);
663*49b49cdaSZbigniew Bodek 
664*49b49cdaSZbigniew Bodek /**
665*49b49cdaSZbigniew Bodek  * write mdio register
666*49b49cdaSZbigniew Bodek  * this function uses polling mode, and as the mdio is slow interface, it might
667*49b49cdaSZbigniew Bodek  * block the cpu for long time (milliseconds).
668*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
669*49b49cdaSZbigniew Bodek  * @param phy_addr address of mdio phy
670*49b49cdaSZbigniew Bodek  * @param device address of mdio device (used only in CLAUSE 45)
671*49b49cdaSZbigniew Bodek  * @param reg index of the register
672*49b49cdaSZbigniew Bodek  * @param val value to write
673*49b49cdaSZbigniew Bodek  *
674*49b49cdaSZbigniew Bodek  * @return 0 on success, negative errno on failure
675*49b49cdaSZbigniew Bodek  */
676*49b49cdaSZbigniew Bodek int al_eth_mdio_write(struct al_hal_eth_adapter *adapter, uint32_t phy_addr,
677*49b49cdaSZbigniew Bodek 		      uint32_t device, uint32_t reg, uint16_t val);
678*49b49cdaSZbigniew Bodek 
679*49b49cdaSZbigniew Bodek /* TX */
680*49b49cdaSZbigniew Bodek /**
681*49b49cdaSZbigniew Bodek  * get number of free tx descriptors
682*49b49cdaSZbigniew Bodek  *
683*49b49cdaSZbigniew Bodek  * @param adapter adapter handle
684*49b49cdaSZbigniew Bodek  * @param qid queue index
685*49b49cdaSZbigniew Bodek  *
686*49b49cdaSZbigniew Bodek  * @return num of free descriptors.
687*49b49cdaSZbigniew Bodek  */
688*49b49cdaSZbigniew Bodek static INLINE uint32_t al_eth_tx_available_get(struct al_hal_eth_adapter *adapter,
689*49b49cdaSZbigniew Bodek 					       uint32_t qid)
690*49b49cdaSZbigniew Bodek {
691*49b49cdaSZbigniew Bodek 	struct al_udma_q *udma_q;
692*49b49cdaSZbigniew Bodek 
693*49b49cdaSZbigniew Bodek 	al_udma_q_handle_get(&adapter->tx_udma, qid, &udma_q);
694*49b49cdaSZbigniew Bodek 
695*49b49cdaSZbigniew Bodek 	return al_udma_available_get(udma_q);
696*49b49cdaSZbigniew Bodek }
697*49b49cdaSZbigniew Bodek 
698*49b49cdaSZbigniew Bodek /**
699*49b49cdaSZbigniew Bodek  * prepare packet descriptors in tx queue.
700*49b49cdaSZbigniew Bodek  *
701*49b49cdaSZbigniew Bodek  * This functions prepares the descriptors for the given packet in the tx
702*49b49cdaSZbigniew Bodek  * submission ring. the caller must call al_eth_tx_pkt_action() below
703*49b49cdaSZbigniew Bodek  * in order to notify the hardware about the new descriptors.
704*49b49cdaSZbigniew Bodek  *
705*49b49cdaSZbigniew Bodek  * @param tx_dma_q pointer to UDMA tx queue
706*49b49cdaSZbigniew Bodek  * @param pkt the packet to transmit
707*49b49cdaSZbigniew Bodek  *
708*49b49cdaSZbigniew Bodek  * @return number of descriptors used for this packet, 0 if no free
709*49b49cdaSZbigniew Bodek  * room in the descriptors ring
710*49b49cdaSZbigniew Bodek  */
711*49b49cdaSZbigniew Bodek int al_eth_tx_pkt_prepare(struct al_udma_q *tx_dma_q, struct al_eth_pkt *pkt);
712*49b49cdaSZbigniew Bodek 
713*49b49cdaSZbigniew Bodek 
714*49b49cdaSZbigniew Bodek /**
715*49b49cdaSZbigniew Bodek  * Trigger the DMA about previously added tx descriptors.
716*49b49cdaSZbigniew Bodek  *
717*49b49cdaSZbigniew Bodek  * @param tx_dma_q pointer to UDMA tx queue
718*49b49cdaSZbigniew Bodek  * @param tx_descs number of descriptors to notify the DMA about.
719*49b49cdaSZbigniew Bodek  * the tx_descs can be sum of descriptor numbers of multiple prepared packets,
720*49b49cdaSZbigniew Bodek  * this way the caller can use this function to notify the DMA about multiple
721*49b49cdaSZbigniew Bodek  * packets.
722*49b49cdaSZbigniew Bodek  */
723*49b49cdaSZbigniew Bodek void al_eth_tx_dma_action(struct al_udma_q *tx_dma_q, uint32_t tx_descs);
724*49b49cdaSZbigniew Bodek 
725*49b49cdaSZbigniew Bodek /**
726*49b49cdaSZbigniew Bodek  * get number of completed tx descriptors, upper layer should derive from
727*49b49cdaSZbigniew Bodek  * this information which packets were completed.
728*49b49cdaSZbigniew Bodek  *
729*49b49cdaSZbigniew Bodek  * @param tx_dma_q pointer to UDMA tx queue
730*49b49cdaSZbigniew Bodek  *
731*49b49cdaSZbigniew Bodek  * @return number of completed tx descriptors.
732*49b49cdaSZbigniew Bodek  */
733*49b49cdaSZbigniew Bodek int al_eth_comp_tx_get(struct al_udma_q *tx_dma_q);
734*49b49cdaSZbigniew Bodek 
735*49b49cdaSZbigniew Bodek /**
736*49b49cdaSZbigniew Bodek  * configure a TSO MSS val
737*49b49cdaSZbigniew Bodek  *
738*49b49cdaSZbigniew Bodek  * the TSO MSS vals are preconfigured values for MSS stored in hardware and the
739*49b49cdaSZbigniew Bodek  * packet could use them when not working in MSS explicit mode.
740*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
741*49b49cdaSZbigniew Bodek  * @param idx the mss index
742*49b49cdaSZbigniew Bodek  * @param mss_val the MSS value
743*49b49cdaSZbigniew Bodek  *
744*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
745*49b49cdaSZbigniew Bodek  */
746*49b49cdaSZbigniew Bodek int al_eth_tso_mss_config(struct al_hal_eth_adapter *adapter, uint8_t idx, uint32_t mss_val);
747*49b49cdaSZbigniew Bodek 
748*49b49cdaSZbigniew Bodek /* RX */
749*49b49cdaSZbigniew Bodek /**
750*49b49cdaSZbigniew Bodek  * Config the RX descriptor fields
751*49b49cdaSZbigniew Bodek  *
752*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
753*49b49cdaSZbigniew Bodek  * @param lro_sel select LRO context or l4 offset
754*49b49cdaSZbigniew Bodek  * @param l4_offset_sel select l4 offset source
755*49b49cdaSZbigniew Bodek  * @param l4_sel  select the l4 checksum result
756*49b49cdaSZbigniew Bodek  * @param l3_sel  select the l3 checksum result
757*49b49cdaSZbigniew Bodek  * @param l3_proto_sel select the l3 protocol index source
758*49b49cdaSZbigniew Bodek  * @param l4_proto_sel select the l4 protocol index source
759*49b49cdaSZbigniew Bodek  * @param frag_sel select the frag indication source
760*49b49cdaSZbigniew Bodek  */
761*49b49cdaSZbigniew Bodek void al_eth_rx_desc_config(
762*49b49cdaSZbigniew Bodek 			struct al_hal_eth_adapter *adapter,
763*49b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_lro_context_val_res lro_sel,
764*49b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l4_offset_sel l4_offset_sel,
765*49b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l3_offset_sel l3_offset_sel,
766*49b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l4_chk_res_sel l4_sel,
767*49b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l3_chk_res_sel l3_sel,
768*49b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l3_proto_idx_sel l3_proto_sel,
769*49b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l4_proto_idx_sel l4_proto_sel,
770*49b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_frag_sel frag_sel);
771*49b49cdaSZbigniew Bodek 
772*49b49cdaSZbigniew Bodek /**
773*49b49cdaSZbigniew Bodek  * Configure RX header split
774*49b49cdaSZbigniew Bodek  *
775*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
776*49b49cdaSZbigniew Bodek  * @param enable header split when AL_TRUE
777*49b49cdaSZbigniew Bodek  * @param header_split_len length in bytes of the header split, this value used when
778*49b49cdaSZbigniew Bodek  * CTRL TABLE header split len select is set to
779*49b49cdaSZbigniew Bodek  * AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_REG, in this case the controller will
780*49b49cdaSZbigniew Bodek  * store the first header_split_len bytes into buf2, then the rest (if any) into buf1.
781*49b49cdaSZbigniew Bodek  * when CTRL_TABLE header split len select set to other value, then the header_len
782*49b49cdaSZbigniew Bodek  * determined according to the parser, and the header_split_len parameter is not
783*49b49cdaSZbigniew Bodek  * used.
784*49b49cdaSZbigniew Bodek  *
785*49b49cdaSZbigniew Bodek  * return 0 on success. otherwise on failure.
786*49b49cdaSZbigniew Bodek  */
787*49b49cdaSZbigniew Bodek int al_eth_rx_header_split_config(struct al_hal_eth_adapter *adapter, al_bool enable, uint32_t header_len);
788*49b49cdaSZbigniew Bodek 
789*49b49cdaSZbigniew Bodek /**
790*49b49cdaSZbigniew Bodek  * enable / disable header split in the udma queue.
791*49b49cdaSZbigniew Bodek  * length will be taken from the udma configuration to enable different length per queue.
792*49b49cdaSZbigniew Bodek  *
793*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
794*49b49cdaSZbigniew Bodek  * @param enable header split when AL_TRUE
795*49b49cdaSZbigniew Bodek  * @param qid the queue id to enable/disable header split
796*49b49cdaSZbigniew Bodek  * @param header_len in what len the udma will cut the header
797*49b49cdaSZbigniew Bodek  *
798*49b49cdaSZbigniew Bodek  * return 0 on success.
799*49b49cdaSZbigniew Bodek  */
800*49b49cdaSZbigniew Bodek int al_eth_rx_header_split_force_len_config(struct al_hal_eth_adapter *adapter,
801*49b49cdaSZbigniew Bodek 					al_bool enable,
802*49b49cdaSZbigniew Bodek 					uint32_t qid,
803*49b49cdaSZbigniew Bodek 					uint32_t header_len);
804*49b49cdaSZbigniew Bodek 
805*49b49cdaSZbigniew Bodek /**
806*49b49cdaSZbigniew Bodek  * add buffer to receive queue
807*49b49cdaSZbigniew Bodek  *
808*49b49cdaSZbigniew Bodek  * @param rx_dma_q pointer to UDMA rx queue
809*49b49cdaSZbigniew Bodek  * @param buf pointer to data buffer
810*49b49cdaSZbigniew Bodek  * @param flags bitwise of AL_ETH_RX_FLAGS
811*49b49cdaSZbigniew Bodek  * @param header_buf this is not used for far and header_buf should be set to
812*49b49cdaSZbigniew Bodek  * NULL.
813*49b49cdaSZbigniew Bodek  *
814*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
815*49b49cdaSZbigniew Bodek  */
816*49b49cdaSZbigniew Bodek int al_eth_rx_buffer_add(struct al_udma_q *rx_dma_q,
817*49b49cdaSZbigniew Bodek 			      struct al_buf *buf, uint32_t flags,
818*49b49cdaSZbigniew Bodek 			      struct al_buf *header_buf);
819*49b49cdaSZbigniew Bodek 
820*49b49cdaSZbigniew Bodek /**
821*49b49cdaSZbigniew Bodek  * notify the hw engine about rx descriptors that were added to the receive queue
822*49b49cdaSZbigniew Bodek  *
823*49b49cdaSZbigniew Bodek  * @param rx_dma_q pointer to UDMA rx queue
824*49b49cdaSZbigniew Bodek  * @param descs_num number of rx descriptors
825*49b49cdaSZbigniew Bodek  */
826*49b49cdaSZbigniew Bodek void al_eth_rx_buffer_action(struct al_udma_q *rx_dma_q,
827*49b49cdaSZbigniew Bodek 				uint32_t descs_num);
828*49b49cdaSZbigniew Bodek 
829*49b49cdaSZbigniew Bodek /**
830*49b49cdaSZbigniew Bodek  * get packet from RX completion ring
831*49b49cdaSZbigniew Bodek  *
832*49b49cdaSZbigniew Bodek  * @param rx_dma_q pointer to UDMA rx queue
833*49b49cdaSZbigniew Bodek  * @param pkt pointer to a packet data structure, this function fills this
834*49b49cdaSZbigniew Bodek  * structure with the information about the received packet. the buffers
835*49b49cdaSZbigniew Bodek  * structures filled only with the length of the data written into the buffer,
836*49b49cdaSZbigniew Bodek  * the address fields are not updated as the upper layer can retrieve this
837*49b49cdaSZbigniew Bodek  * information by itself because the hardware uses the buffers in the same order
838*49b49cdaSZbigniew Bodek  * were those buffers inserted into the ring of the receive queue.
839*49b49cdaSZbigniew Bodek  * this structure should be allocated by the caller function.
840*49b49cdaSZbigniew Bodek  *
841*49b49cdaSZbigniew Bodek  * @return return number of descriptors or 0 if no completed packet found.
842*49b49cdaSZbigniew Bodek  */
843*49b49cdaSZbigniew Bodek  uint32_t al_eth_pkt_rx(struct al_udma_q *rx_dma_q, struct al_eth_pkt *pkt);
844*49b49cdaSZbigniew Bodek 
845*49b49cdaSZbigniew Bodek 
846*49b49cdaSZbigniew Bodek /* RX parser table */
847*49b49cdaSZbigniew Bodek struct al_eth_epe_p_reg_entry {
848*49b49cdaSZbigniew Bodek 	uint32_t data;
849*49b49cdaSZbigniew Bodek 	uint32_t mask;
850*49b49cdaSZbigniew Bodek 	uint32_t ctrl;
851*49b49cdaSZbigniew Bodek };
852*49b49cdaSZbigniew Bodek 
853*49b49cdaSZbigniew Bodek struct al_eth_epe_control_entry {
854*49b49cdaSZbigniew Bodek 	uint32_t data[6];
855*49b49cdaSZbigniew Bodek };
856*49b49cdaSZbigniew Bodek 
857*49b49cdaSZbigniew Bodek /**
858*49b49cdaSZbigniew Bodek  * update rx parser entry
859*49b49cdaSZbigniew Bodek  *
860*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
861*49b49cdaSZbigniew Bodek  * @param idx the protocol index to update
862*49b49cdaSZbigniew Bodek  * @param reg_entry contents of parser register entry
863*49b49cdaSZbigniew Bodek  * @param control entry contents of control table entry
864*49b49cdaSZbigniew Bodek  *
865*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
866*49b49cdaSZbigniew Bodek  */
867*49b49cdaSZbigniew Bodek int al_eth_rx_parser_entry_update(struct al_hal_eth_adapter *adapter, uint32_t idx,
868*49b49cdaSZbigniew Bodek 		struct al_eth_epe_p_reg_entry *reg_entry,
869*49b49cdaSZbigniew Bodek 		struct al_eth_epe_control_entry *control_entry);
870*49b49cdaSZbigniew Bodek 
871*49b49cdaSZbigniew Bodek /* Flow Steering and filtering */
872*49b49cdaSZbigniew Bodek int al_eth_thash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma, uint32_t queue);
873*49b49cdaSZbigniew Bodek 
874*49b49cdaSZbigniew Bodek /* FSM table bits */
875*49b49cdaSZbigniew Bodek /** FSM table has 7 bits input address:
876*49b49cdaSZbigniew Bodek  *  bits[2:0] are the outer packet's type (IPv4, TCP...)
877*49b49cdaSZbigniew Bodek  *  bits[5:3] are the inner packet's type
878*49b49cdaSZbigniew Bodek  *  bit[6] is set when packet is tunneled.
879*49b49cdaSZbigniew Bodek  *
880*49b49cdaSZbigniew Bodek  * The output of each entry:
881*49b49cdaSZbigniew Bodek  *  bits[1:0] - input selection: selects the input for the thash (2/4 tuple, inner/outer)
882*49b49cdaSZbigniew Bodek  *  bit[2] - selects whether to use thash output, or default values for the queue and udma
883*49b49cdaSZbigniew Bodek  *  bits[6:3] default UDMA mask: the UDMAs to select when bit 2 above was unset
884*49b49cdaSZbigniew Bodek  *  bits[9:5] defualt queue: the queue index to select when bit 2 above was unset
885*49b49cdaSZbigniew Bodek  */
886*49b49cdaSZbigniew Bodek 
887*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV4_TCP	   0
888*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV4_UDP	   1
889*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV6_TCP	   2
890*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV6_UDP	   3
891*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV6_NO_UDP_TCP   4
892*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV4_NO_UDP_TCP   5
893*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV4_FRAGMENTED   6
894*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_NOT_IP		   7
895*49b49cdaSZbigniew Bodek 
896*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_OUTER(idx)	   ((idx) & 7)
897*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_INNER(idx)	   (((idx) >> 3) & 7)
898*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_TUNNELED(idx)	   (((idx) >> 6) & 1)
899*49b49cdaSZbigniew Bodek 
900*49b49cdaSZbigniew Bodek /* FSM DATA format */
901*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_OUTER_2_TUPLE	0
902*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_OUTER_4_TUPLE	1
903*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_INNER_2_TUPLE	2
904*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_INNER_4_TUPLE	3
905*49b49cdaSZbigniew Bodek 
906*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_HASH_SEL	(1 << 2)
907*49b49cdaSZbigniew Bodek 
908*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_DEFAULT_Q_SHIFT		5
909*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_DEFAULT_UDMA_SHIFT	3
910*49b49cdaSZbigniew Bodek 
911*49b49cdaSZbigniew Bodek /* set fsm table entry */
912*49b49cdaSZbigniew Bodek int al_eth_fsm_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry);
913*49b49cdaSZbigniew Bodek 
914*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT {
915*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_0 = 0,
916*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_1 = 1,
917*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_ANY = 2,
918*49b49cdaSZbigniew Bodek };
919*49b49cdaSZbigniew Bodek 
920*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_TUNNEL {
921*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_TUNNEL_NOT_EXIST = 0,
922*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_TUNNEL_EXIST = 1,
923*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_TUNNEL_ANY = 2,
924*49b49cdaSZbigniew Bodek };
925*49b49cdaSZbigniew Bodek 
926*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_VLAN {
927*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_VLAN_NOT_EXIST = 0,
928*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_VLAN_EXIST = 1,
929*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_VLAN_ANY = 2,
930*49b49cdaSZbigniew Bodek };
931*49b49cdaSZbigniew Bodek 
932*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_MAC_TABLE {
933*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_TABLE_NO_MATCH = 0,
934*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_TABLE_MATCH = 1,
935*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_TABLE_ANY = 2,
936*49b49cdaSZbigniew Bodek };
937*49b49cdaSZbigniew Bodek 
938*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE {
939*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_UC = 0, /**< unicast */
940*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_MC = 1, /**< multicast */
941*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_BC = 2, /**< broadcast */
942*49b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_ANY = 4, /**< for sw usage */
943*49b49cdaSZbigniew Bodek };
944*49b49cdaSZbigniew Bodek 
945*49b49cdaSZbigniew Bodek /**
946*49b49cdaSZbigniew Bodek  * This structure defines the index or group of indeces within the control table.
947*49b49cdaSZbigniew Bodek  * each field has special enum value (with _ANY postfix) that indicates all
948*49b49cdaSZbigniew Bodek  * possible values of that field.
949*49b49cdaSZbigniew Bodek  */
950*49b49cdaSZbigniew Bodek struct al_eth_fwd_ctrl_table_index {
951*49b49cdaSZbigniew Bodek 	enum AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT	vlan_table_out;
952*49b49cdaSZbigniew Bodek 	enum AL_ETH_FWD_CTRL_IDX_TUNNEL tunnel_exist;
953*49b49cdaSZbigniew Bodek 	enum AL_ETH_FWD_CTRL_IDX_VLAN vlan_exist;
954*49b49cdaSZbigniew Bodek 	enum AL_ETH_FWD_CTRL_IDX_MAC_TABLE mac_table_match;
955*49b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID		protocol_id;
956*49b49cdaSZbigniew Bodek 	enum AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE mac_type;
957*49b49cdaSZbigniew Bodek };
958*49b49cdaSZbigniew Bodek 
959*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_PRIO_SEL {
960*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_PBITS_TABLE	= 0,
961*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_DSCP_TABLE	= 1,
962*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_TC_TABLE	= 2,
963*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG1		= 3,
964*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG2		= 4,
965*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG3		= 5,
966*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG4		= 6,
967*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG5		= 7,
968*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG6		= 7,
969*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG7		= 9,
970*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG8		= 10,
971*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_VAL_3	= 11,
972*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_VAL_0	= 12,
973*49b49cdaSZbigniew Bodek };
974*49b49cdaSZbigniew Bodek /** where to select the initial queue from */
975*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_QUEUE_SEL_1 {
976*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_PRIO_TABLE	= 0,
977*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_THASH_TABLE	= 1,
978*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_MAC_TABLE		= 2,
979*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_MHASH_TABLE	= 3,
980*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG1		= 4,
981*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG2		= 5,
982*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG3		= 6,
983*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG4		= 7,
984*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_VAL_3		= 12,
985*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_VAL_0		= 13,
986*49b49cdaSZbigniew Bodek };
987*49b49cdaSZbigniew Bodek 
988*49b49cdaSZbigniew Bodek /** target queue will be built up from the priority and initial queue */
989*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_QUEUE_SEL_2 {
990*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_2_PRIO_TABLE	= 0, /**< target queue is the output of priority table */
991*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_2_PRIO		= 1, /**< target queue is the priority */
992*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_2_PRIO_QUEUE	= 2, /**< target queue is initial queue[0], priority[1] */
993*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_2_NO_PRIO		= 3, /**< target queue is the initial */
994*49b49cdaSZbigniew Bodek };
995*49b49cdaSZbigniew Bodek 
996*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_UDMA_SEL {
997*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_THASH_TABLE		= 0,
998*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_THASH_AND_VLAN	= 1,
999*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_VLAN_TABLE		= 2,
1000*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_VLAN_AND_MAC		= 3,
1001*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_MAC_TABLE		= 4,
1002*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_MAC_AND_MHASH	= 5,
1003*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_MHASH_TABLE		= 6,
1004*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG1			= 7,
1005*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG2			= 8,
1006*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG3			= 9,
1007*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG4			= 10,
1008*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG5			= 11,
1009*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG6			= 12,
1010*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG7			= 13,
1011*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG8			= 14,
1012*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_VAL_0		= 15,
1013*49b49cdaSZbigniew Bodek };
1014*49b49cdaSZbigniew Bodek 
1015*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL {
1016*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_0		= 0,
1017*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_REG		= 1, /**< select header len from the hdr_split register (set by al_eth_rx_header_split_config())*/
1018*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_OUTER_L3_OFFSET = 2,
1019*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_OUTER_L4_OFFSET = 3,
1020*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_TUNNEL_START_OFFSET = 4,
1021*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_INNER_L3_OFFSET = 5,
1022*49b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_INNER_L4_OFFSET = 6,
1023*49b49cdaSZbigniew Bodek };
1024*49b49cdaSZbigniew Bodek 
1025*49b49cdaSZbigniew Bodek struct al_eth_fwd_ctrl_table_entry {
1026*49b49cdaSZbigniew Bodek 	enum AL_ETH_CTRL_TABLE_PRIO_SEL		prio_sel;
1027*49b49cdaSZbigniew Bodek 	enum AL_ETH_CTRL_TABLE_QUEUE_SEL_1	queue_sel_1; /**< queue id source */
1028*49b49cdaSZbigniew Bodek 	enum AL_ETH_CTRL_TABLE_QUEUE_SEL_2	queue_sel_2; /**< mix queue id with priority */
1029*49b49cdaSZbigniew Bodek 	enum AL_ETH_CTRL_TABLE_UDMA_SEL		udma_sel;
1030*49b49cdaSZbigniew Bodek 	enum AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL hdr_split_len_sel;
1031*49b49cdaSZbigniew Bodek 	al_bool 	filter; /**< set to AL_TRUE to enable filtering */
1032*49b49cdaSZbigniew Bodek };
1033*49b49cdaSZbigniew Bodek /**
1034*49b49cdaSZbigniew Bodek  * Configure default control table entry
1035*49b49cdaSZbigniew Bodek  *
1036*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1037*49b49cdaSZbigniew Bodek  * @param use_table set to AL_TRUE if control table is used, when set to AL_FALSE
1038*49b49cdaSZbigniew Bodek  * then control table will be bypassed and the entry value will be used.
1039*49b49cdaSZbigniew Bodek  * @param entry defines the value to be used when bypassing control table.
1040*49b49cdaSZbigniew Bodek  *
1041*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1042*49b49cdaSZbigniew Bodek  */
1043*49b49cdaSZbigniew Bodek int al_eth_ctrl_table_def_set(struct al_hal_eth_adapter *adapter,
1044*49b49cdaSZbigniew Bodek 			      al_bool use_table,
1045*49b49cdaSZbigniew Bodek 			      struct al_eth_fwd_ctrl_table_entry *entry);
1046*49b49cdaSZbigniew Bodek 
1047*49b49cdaSZbigniew Bodek /**
1048*49b49cdaSZbigniew Bodek  * Configure control table entry
1049*49b49cdaSZbigniew Bodek  *
1050*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1051*49b49cdaSZbigniew Bodek  * @param index the entry index within the control table.
1052*49b49cdaSZbigniew Bodek  * @param entry the value to write to the control table entry
1053*49b49cdaSZbigniew Bodek  *
1054*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1055*49b49cdaSZbigniew Bodek  */
1056*49b49cdaSZbigniew Bodek int al_eth_ctrl_table_set(struct al_hal_eth_adapter *adapter,
1057*49b49cdaSZbigniew Bodek 			  struct al_eth_fwd_ctrl_table_index *index,
1058*49b49cdaSZbigniew Bodek 			  struct al_eth_fwd_ctrl_table_entry *entry);
1059*49b49cdaSZbigniew Bodek 
1060*49b49cdaSZbigniew Bodek int al_eth_ctrl_table_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry);
1061*49b49cdaSZbigniew Bodek int al_eth_ctrl_table_def_raw_set(struct al_hal_eth_adapter *adapter, uint32_t val);
1062*49b49cdaSZbigniew Bodek 
1063*49b49cdaSZbigniew Bodek /**
1064*49b49cdaSZbigniew Bodek  * Configure hash key initial registers
1065*49b49cdaSZbigniew Bodek  * Those registers define the initial key values, those values used for
1066*49b49cdaSZbigniew Bodek  * the THASH and MHASH hash functions.
1067*49b49cdaSZbigniew Bodek  *
1068*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1069*49b49cdaSZbigniew Bodek  * @param idx the register index
1070*49b49cdaSZbigniew Bodek  * @param val the register value
1071*49b49cdaSZbigniew Bodek  *
1072*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1073*49b49cdaSZbigniew Bodek  */
1074*49b49cdaSZbigniew Bodek int al_eth_hash_key_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t val);
1075*49b49cdaSZbigniew Bodek 
1076*49b49cdaSZbigniew Bodek struct al_eth_fwd_mac_table_entry {
1077*49b49cdaSZbigniew Bodek 	uint8_t		addr[6]; /**< byte 0 is the first byte seen on the wire */
1078*49b49cdaSZbigniew Bodek 	uint8_t		mask[6];
1079*49b49cdaSZbigniew Bodek 	al_bool		tx_valid;
1080*49b49cdaSZbigniew Bodek 	uint8_t		tx_target;
1081*49b49cdaSZbigniew Bodek 	al_bool		rx_valid;
1082*49b49cdaSZbigniew Bodek 	uint8_t		udma_mask; /**< target udma */
1083*49b49cdaSZbigniew Bodek 	uint8_t		qid; /**< target queue */
1084*49b49cdaSZbigniew Bodek 	al_bool		filter; /**< set to AL_TRUE to enable filtering */
1085*49b49cdaSZbigniew Bodek };
1086*49b49cdaSZbigniew Bodek 
1087*49b49cdaSZbigniew Bodek /**
1088*49b49cdaSZbigniew Bodek  * Configure mac table entry
1089*49b49cdaSZbigniew Bodek  * The HW traverse this table and looks for match from lowest index,
1090*49b49cdaSZbigniew Bodek  * when the packets MAC DA & mask == addr, and the valid bit is set, then match occurs.
1091*49b49cdaSZbigniew Bodek  *
1092*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1093*49b49cdaSZbigniew Bodek  * @param idx the entry index within the mac table.
1094*49b49cdaSZbigniew Bodek  * @param entry the contents of the MAC table entry
1095*49b49cdaSZbigniew Bodek  *
1096*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1097*49b49cdaSZbigniew Bodek  */
1098*49b49cdaSZbigniew Bodek int al_eth_fwd_mac_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
1099*49b49cdaSZbigniew Bodek 				struct al_eth_fwd_mac_table_entry *entry);
1100*49b49cdaSZbigniew Bodek 
1101*49b49cdaSZbigniew Bodek int al_eth_fwd_mac_addr_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
1102*49b49cdaSZbigniew Bodek 				uint32_t addr_lo, uint32_t addr_hi, uint32_t mask_lo, uint32_t mask_hi);
1103*49b49cdaSZbigniew Bodek int al_eth_fwd_mac_ctrl_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t ctrl);
1104*49b49cdaSZbigniew Bodek 
1105*49b49cdaSZbigniew Bodek int al_eth_mac_addr_store(void * __iomem ec_base, uint32_t idx, uint8_t *addr);
1106*49b49cdaSZbigniew Bodek int al_eth_mac_addr_read(void * __iomem ec_base, uint32_t idx, uint8_t *addr);
1107*49b49cdaSZbigniew Bodek 
1108*49b49cdaSZbigniew Bodek /**
1109*49b49cdaSZbigniew Bodek  * Configure pbits table entry
1110*49b49cdaSZbigniew Bodek  * The HW uses this table to translate between vlan pbits field to priority.
1111*49b49cdaSZbigniew Bodek  * The vlan pbits is used as the index of this table.
1112*49b49cdaSZbigniew Bodek  *
1113*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1114*49b49cdaSZbigniew Bodek  * @param idx the entry index within the table.
1115*49b49cdaSZbigniew Bodek  * @param prio the priority to set for this entry
1116*49b49cdaSZbigniew Bodek  *
1117*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1118*49b49cdaSZbigniew Bodek  */
1119*49b49cdaSZbigniew Bodek int al_eth_fwd_pbits_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio);
1120*49b49cdaSZbigniew Bodek 
1121*49b49cdaSZbigniew Bodek /**
1122*49b49cdaSZbigniew Bodek  * Configure priority table entry
1123*49b49cdaSZbigniew Bodek  * The HW uses this table to translate between priority to queue index.
1124*49b49cdaSZbigniew Bodek  * The priority is used as the index of this table.
1125*49b49cdaSZbigniew Bodek  *
1126*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1127*49b49cdaSZbigniew Bodek  * @param prio the entry index within the table.
1128*49b49cdaSZbigniew Bodek  * @param qid the queue index to set for this entry (priority).
1129*49b49cdaSZbigniew Bodek  *
1130*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1131*49b49cdaSZbigniew Bodek  */
1132*49b49cdaSZbigniew Bodek int al_eth_fwd_priority_table_set(struct al_hal_eth_adapter *adapter, uint8_t prio, uint8_t qid);
1133*49b49cdaSZbigniew Bodek 
1134*49b49cdaSZbigniew Bodek /**
1135*49b49cdaSZbigniew Bodek  * Configure DSCP table entry
1136*49b49cdaSZbigniew Bodek  * The HW uses this table to translate between IPv4 DSCP field to priority.
1137*49b49cdaSZbigniew Bodek  * The IPv4 byte 1 (DSCP+ECN) used as index to this table.
1138*49b49cdaSZbigniew Bodek  *
1139*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1140*49b49cdaSZbigniew Bodek  * @param idx the entry index within the table.
1141*49b49cdaSZbigniew Bodek  * @param prio the queue index to set for this entry (priority).
1142*49b49cdaSZbigniew Bodek  *
1143*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1144*49b49cdaSZbigniew Bodek  */
1145*49b49cdaSZbigniew Bodek int al_eth_fwd_dscp_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio);
1146*49b49cdaSZbigniew Bodek 
1147*49b49cdaSZbigniew Bodek /**
1148*49b49cdaSZbigniew Bodek  * Configure TC table entry
1149*49b49cdaSZbigniew Bodek  * The HW uses this table to translate between IPv6 TC field to priority.
1150*49b49cdaSZbigniew Bodek  * The IPv6 TC used as index to this table.
1151*49b49cdaSZbigniew Bodek  *
1152*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1153*49b49cdaSZbigniew Bodek  * @param idx the entry index within the table.
1154*49b49cdaSZbigniew Bodek  * @param prio the queue index to set for this entry (priority).
1155*49b49cdaSZbigniew Bodek  *
1156*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1157*49b49cdaSZbigniew Bodek  */
1158*49b49cdaSZbigniew Bodek int al_eth_fwd_tc_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio);
1159*49b49cdaSZbigniew Bodek 
1160*49b49cdaSZbigniew Bodek /**
1161*49b49cdaSZbigniew Bodek  * Configure MAC HASH table entry
1162*49b49cdaSZbigniew Bodek  * The HW uses 8 bits from the hash result on the MAC DA as index to this table.
1163*49b49cdaSZbigniew Bodek  *
1164*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1165*49b49cdaSZbigniew Bodek  * @param idx the entry index within the table.
1166*49b49cdaSZbigniew Bodek  * @param udma_mask the target udma to set for this entry.
1167*49b49cdaSZbigniew Bodek  * @param qid the target queue index to set for this entry.
1168*49b49cdaSZbigniew Bodek  *
1169*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1170*49b49cdaSZbigniew Bodek  */
1171*49b49cdaSZbigniew Bodek int al_eth_fwd_mhash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma_mask, uint8_t qid);
1172*49b49cdaSZbigniew Bodek 
1173*49b49cdaSZbigniew Bodek struct al_eth_fwd_vid_table_entry {
1174*49b49cdaSZbigniew Bodek 	uint8_t	control:1; /**< used as input for the control table */
1175*49b49cdaSZbigniew Bodek 	uint8_t filter:1; /**< set to 1 to enable filtering */
1176*49b49cdaSZbigniew Bodek 	uint8_t udma_mask:4; /**< target udmas */
1177*49b49cdaSZbigniew Bodek };
1178*49b49cdaSZbigniew Bodek 
1179*49b49cdaSZbigniew Bodek /**
1180*49b49cdaSZbigniew Bodek  * Configure default vlan table entry
1181*49b49cdaSZbigniew Bodek  *
1182*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1183*49b49cdaSZbigniew Bodek  * @param use_table set to AL_TRUE if vlan table is used, when set to AL_FALSE
1184*49b49cdaSZbigniew Bodek  * then vid table will be bypassed and the default_entry value will be used.
1185*49b49cdaSZbigniew Bodek  * @param default_entry defines the value to be used when bypassing vid table.
1186*49b49cdaSZbigniew Bodek  * @param default_vlan defines the value will be used when untagget packet
1187*49b49cdaSZbigniew Bodek  * received. this value will be used only for steering and filtering control,
1188*49b49cdaSZbigniew Bodek  * the packet's data will not be changed.
1189*49b49cdaSZbigniew Bodek  *
1190*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1191*49b49cdaSZbigniew Bodek  */
1192*49b49cdaSZbigniew Bodek int al_eth_fwd_vid_config_set(struct al_hal_eth_adapter *adapter, al_bool use_table,
1193*49b49cdaSZbigniew Bodek 			      struct al_eth_fwd_vid_table_entry *default_entry,
1194*49b49cdaSZbigniew Bodek 			      uint32_t default_vlan);
1195*49b49cdaSZbigniew Bodek /**
1196*49b49cdaSZbigniew Bodek  * Configure vlan table entry
1197*49b49cdaSZbigniew Bodek  *
1198*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1199*49b49cdaSZbigniew Bodek  * @param idx the entry index within the vlan table. The HW uses the vlan id
1200*49b49cdaSZbigniew Bodek  * field of the packet when accessing this table.
1201*49b49cdaSZbigniew Bodek  * @param entry the value to write to the vlan table entry
1202*49b49cdaSZbigniew Bodek  *
1203*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1204*49b49cdaSZbigniew Bodek  */
1205*49b49cdaSZbigniew Bodek int al_eth_fwd_vid_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
1206*49b49cdaSZbigniew Bodek 			     struct al_eth_fwd_vid_table_entry *entry);
1207*49b49cdaSZbigniew Bodek 
1208*49b49cdaSZbigniew Bodek 
1209*49b49cdaSZbigniew Bodek /**
1210*49b49cdaSZbigniew Bodek  * Configure default UDMA register
1211*49b49cdaSZbigniew Bodek  * When the control table entry udma selection set to AL_ETH_CTRL_TABLE_UDMA_SEL_REG<n>,
1212*49b49cdaSZbigniew Bodek  * then the target UDMA will be set according to the register n of the default
1213*49b49cdaSZbigniew Bodek  * UDMA registers.
1214*49b49cdaSZbigniew Bodek  *
1215*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1216*49b49cdaSZbigniew Bodek  * @param idx the index of the default register.
1217*49b49cdaSZbigniew Bodek  * @param udma_mask the value of the register.
1218*49b49cdaSZbigniew Bodek  *
1219*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1220*49b49cdaSZbigniew Bodek  */
1221*49b49cdaSZbigniew Bodek int al_eth_fwd_default_udma_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
1222*49b49cdaSZbigniew Bodek 				   uint8_t udma_mask);
1223*49b49cdaSZbigniew Bodek 
1224*49b49cdaSZbigniew Bodek /**
1225*49b49cdaSZbigniew Bodek  * Configure default queue register
1226*49b49cdaSZbigniew Bodek  * When the control table entry queue selection 1 set to AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG<n>,
1227*49b49cdaSZbigniew Bodek  * then the target queue will be set according to the register n of the default
1228*49b49cdaSZbigniew Bodek  * queue registers.
1229*49b49cdaSZbigniew Bodek  *
1230*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1231*49b49cdaSZbigniew Bodek  * @param idx the index of the default register.
1232*49b49cdaSZbigniew Bodek  * @param qid the value of the register.
1233*49b49cdaSZbigniew Bodek  *
1234*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1235*49b49cdaSZbigniew Bodek  */
1236*49b49cdaSZbigniew Bodek int al_eth_fwd_default_queue_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
1237*49b49cdaSZbigniew Bodek 				   uint8_t qid);
1238*49b49cdaSZbigniew Bodek 
1239*49b49cdaSZbigniew Bodek /**
1240*49b49cdaSZbigniew Bodek  * Configure default priority register
1241*49b49cdaSZbigniew Bodek  * When the control table entry queue selection 1 set to AL_ETH_CTRL_TABLE_PRIO_SEL_1_REG<n>,
1242*49b49cdaSZbigniew Bodek  * then the target priority will be set according to the register n of the default
1243*49b49cdaSZbigniew Bodek  * priority registers.
1244*49b49cdaSZbigniew Bodek  *
1245*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1246*49b49cdaSZbigniew Bodek  * @param idx the index of the default register.
1247*49b49cdaSZbigniew Bodek  * @param prio the value of the register.
1248*49b49cdaSZbigniew Bodek  *
1249*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1250*49b49cdaSZbigniew Bodek  */
1251*49b49cdaSZbigniew Bodek int al_eth_fwd_default_priority_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
1252*49b49cdaSZbigniew Bodek 				   uint8_t prio);
1253*49b49cdaSZbigniew Bodek 
1254*49b49cdaSZbigniew Bodek 
1255*49b49cdaSZbigniew Bodek 
1256*49b49cdaSZbigniew Bodek /* filter undetected MAC DA */
1257*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_UNDET_MAC          (1 << 0)
1258*49b49cdaSZbigniew Bodek /* filter specific MAC DA based on MAC table output */
1259*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_DET_MAC            (1 << 1)
1260*49b49cdaSZbigniew Bodek /* filter all tagged */
1261*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_TAGGED             (1 << 2)
1262*49b49cdaSZbigniew Bodek /* filter all untagged */
1263*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_UNTAGGED           (1 << 3)
1264*49b49cdaSZbigniew Bodek /* filter all broadcast */
1265*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_BC                 (1 << 4)
1266*49b49cdaSZbigniew Bodek /* filter all multicast */
1267*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_MC                 (1 << 5)
1268*49b49cdaSZbigniew Bodek /* filter packet based on parser drop */
1269*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_PARSE              (1 << 6)
1270*49b49cdaSZbigniew Bodek /* filter packet based on VLAN table output */
1271*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_VLAN_VID           (1 << 7)
1272*49b49cdaSZbigniew Bodek /* filter packet based on control table output */
1273*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_CTRL_TABLE         (1 << 8)
1274*49b49cdaSZbigniew Bodek /* filter packet based on protocol index */
1275*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_PROT_INDEX         (1 << 9)
1276*49b49cdaSZbigniew Bodek /* filter packet based on WoL decision */
1277*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_WOL		     (1 << 10)
1278*49b49cdaSZbigniew Bodek 
1279*49b49cdaSZbigniew Bodek 
1280*49b49cdaSZbigniew Bodek struct al_eth_filter_params {
1281*49b49cdaSZbigniew Bodek 	al_bool		enable;
1282*49b49cdaSZbigniew Bodek 	uint32_t	filters; /**< bitmask of AL_ETH_RFW_FILTER.. for filters to enable */
1283*49b49cdaSZbigniew Bodek 	al_bool		filter_proto[AL_ETH_PROTOCOLS_NUM]; /**< set AL_TRUE for protocols to filter */
1284*49b49cdaSZbigniew Bodek };
1285*49b49cdaSZbigniew Bodek 
1286*49b49cdaSZbigniew Bodek struct al_eth_filter_override_params {
1287*49b49cdaSZbigniew Bodek 	uint32_t	filters; /**< bitmask of AL_ETH_RFW_FILTER.. for filters to override */
1288*49b49cdaSZbigniew Bodek 	uint8_t		udma; /**< target udma id */
1289*49b49cdaSZbigniew Bodek 	uint8_t		qid; /**< target queue id */
1290*49b49cdaSZbigniew Bodek };
1291*49b49cdaSZbigniew Bodek 
1292*49b49cdaSZbigniew Bodek /**
1293*49b49cdaSZbigniew Bodek  * Configure the receive filters
1294*49b49cdaSZbigniew Bodek  * this function enables/disables filtering packets and which filtering
1295*49b49cdaSZbigniew Bodek  * types to apply.
1296*49b49cdaSZbigniew Bodek  * filters that indicated in tables (MAC table, VLAN and Control tables)
1297*49b49cdaSZbigniew Bodek  * are not configured by this function. This functions only enables/disables
1298*49b49cdaSZbigniew Bodek  * respecting the filter indication from those tables.
1299*49b49cdaSZbigniew Bodek  *
1300*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1301*49b49cdaSZbigniew Bodek  * @param params the parameters passed from upper layer
1302*49b49cdaSZbigniew Bodek  *
1303*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1304*49b49cdaSZbigniew Bodek  */
1305*49b49cdaSZbigniew Bodek int al_eth_filter_config(struct al_hal_eth_adapter *adapter, struct al_eth_filter_params *params);
1306*49b49cdaSZbigniew Bodek 
1307*49b49cdaSZbigniew Bodek /**
1308*49b49cdaSZbigniew Bodek  * Configure the receive override filters
1309*49b49cdaSZbigniew Bodek  * This function controls whither to force forwarding filtered packets
1310*49b49cdaSZbigniew Bodek  * to a specific UDMA/queue. The override filters apply only for
1311*49b49cdaSZbigniew Bodek  * filters that enabled by al_eth_filter_config().
1312*49b49cdaSZbigniew Bodek  *
1313*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
1314*49b49cdaSZbigniew Bodek  * @param params override config parameters
1315*49b49cdaSZbigniew Bodek  *
1316*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1317*49b49cdaSZbigniew Bodek  */
1318*49b49cdaSZbigniew Bodek int al_eth_filter_override_config(struct al_hal_eth_adapter *adapter,
1319*49b49cdaSZbigniew Bodek 				  struct al_eth_filter_override_params *params);
1320*49b49cdaSZbigniew Bodek 
1321*49b49cdaSZbigniew Bodek 
1322*49b49cdaSZbigniew Bodek 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,
1323*49b49cdaSZbigniew Bodek 					enum al_eth_tx_switch_vid_sel_type vid_sel_type,
1324*49b49cdaSZbigniew Bodek 					enum al_eth_tx_switch_dec_type uc_dec,
1325*49b49cdaSZbigniew Bodek 					enum al_eth_tx_switch_dec_type mc_dec,
1326*49b49cdaSZbigniew Bodek 					enum al_eth_tx_switch_dec_type bc_dec);
1327*49b49cdaSZbigniew Bodek int al_eth_switching_default_bitmap_set(struct al_hal_eth_adapter *adapter, uint8_t udma_id, uint8_t udma_uc_bitmask,
1328*49b49cdaSZbigniew Bodek 						uint8_t udma_mc_bitmask,uint8_t udma_bc_bitmask);
1329*49b49cdaSZbigniew Bodek int al_eth_flow_control_config(struct al_hal_eth_adapter *adapter, struct al_eth_flow_control_params *params);
1330*49b49cdaSZbigniew Bodek 
1331*49b49cdaSZbigniew Bodek struct al_eth_eee_params{
1332*49b49cdaSZbigniew Bodek 	uint8_t enable;
1333*49b49cdaSZbigniew Bodek 	uint32_t tx_eee_timer; /**< time in cycles the interface delays prior to entering eee state */
1334*49b49cdaSZbigniew Bodek 	uint32_t min_interval; /**< minimum interval in cycles between two eee states */
1335*49b49cdaSZbigniew Bodek 	uint32_t stop_cnt; /**< time in cycles to stop Tx mac i/f after getting out of eee state */
1336*49b49cdaSZbigniew Bodek };
1337*49b49cdaSZbigniew Bodek 
1338*49b49cdaSZbigniew Bodek /**
1339*49b49cdaSZbigniew Bodek  * configure EEE mode
1340*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1341*49b49cdaSZbigniew Bodek  * @param params pointer to the eee input parameters.
1342*49b49cdaSZbigniew Bodek  *
1343*49b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
1344*49b49cdaSZbigniew Bodek  */
1345*49b49cdaSZbigniew Bodek int al_eth_eee_config(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params);
1346*49b49cdaSZbigniew Bodek 
1347*49b49cdaSZbigniew Bodek /**
1348*49b49cdaSZbigniew Bodek  * get EEE configuration
1349*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1350*49b49cdaSZbigniew Bodek  * @param params pointer to the eee output parameters.
1351*49b49cdaSZbigniew Bodek  *
1352*49b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
1353*49b49cdaSZbigniew Bodek  */
1354*49b49cdaSZbigniew Bodek int al_eth_eee_get(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params);
1355*49b49cdaSZbigniew Bodek 
1356*49b49cdaSZbigniew Bodek 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);
1357*49b49cdaSZbigniew Bodek 
1358*49b49cdaSZbigniew Bodek /* Timestamp
1359*49b49cdaSZbigniew Bodek  * This is a generic time-stamp mechanism that can be used as generic to
1360*49b49cdaSZbigniew Bodek  * time-stamp every received or transmit packet it can also support IEEE 1588v2
1361*49b49cdaSZbigniew Bodek  * PTP time synchronization protocol.
1362*49b49cdaSZbigniew Bodek  * In addition to time-stamp, an internal system time is maintained. For
1363*49b49cdaSZbigniew Bodek  * further accuracy, the chip support transmit/receive clock synchronization
1364*49b49cdaSZbigniew Bodek  * including recovery of master clock from one of the ports and distributing it
1365*49b49cdaSZbigniew Bodek  * to the rest of the ports - that is outside the scope of the Ethernet
1366*49b49cdaSZbigniew Bodek  * Controller - please refer to Annapurna Labs Alpine Hardware Wiki
1367*49b49cdaSZbigniew Bodek  */
1368*49b49cdaSZbigniew Bodek 
1369*49b49cdaSZbigniew Bodek /* Timestamp management APIs */
1370*49b49cdaSZbigniew Bodek 
1371*49b49cdaSZbigniew Bodek /**
1372*49b49cdaSZbigniew Bodek  * prepare the adapter for timestamping packets.
1373*49b49cdaSZbigniew Bodek  * Rx timestamps requires using 8 words (8x4 bytes) rx completion descriptor
1374*49b49cdaSZbigniew Bodek  * size as the timestamp value added into word 4.
1375*49b49cdaSZbigniew Bodek  *
1376*49b49cdaSZbigniew Bodek  * This function should be called after al_eth_mac_config() and before
1377*49b49cdaSZbigniew Bodek  * enabling the queues.
1378*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1379*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1380*49b49cdaSZbigniew Bodek  */
1381*49b49cdaSZbigniew Bodek int al_eth_ts_init(struct al_hal_eth_adapter *adapter);
1382*49b49cdaSZbigniew Bodek 
1383*49b49cdaSZbigniew Bodek /* Timestamp data path APIs */
1384*49b49cdaSZbigniew Bodek 
1385*49b49cdaSZbigniew Bodek /*
1386*49b49cdaSZbigniew Bodek  * This is the size of the on-chip array that keeps the time-stamp of the
1387*49b49cdaSZbigniew Bodek  * latest transmitted packets
1388*49b49cdaSZbigniew Bodek  */
1389*49b49cdaSZbigniew Bodek #define AL_ETH_PTH_TX_SAMPLES_NUM	16
1390*49b49cdaSZbigniew Bodek 
1391*49b49cdaSZbigniew Bodek /**
1392*49b49cdaSZbigniew Bodek  * read Timestamp sample value of previously transmitted packet.
1393*49b49cdaSZbigniew Bodek  *
1394*49b49cdaSZbigniew Bodek  * The adapter includes AL_ETH_PTH_TX_SAMPLES_NUM timestamp samples for tx
1395*49b49cdaSZbigniew Bodek  * packets, those samples shared for all the UDMAs and queues. the al_eth_pkt
1396*49b49cdaSZbigniew Bodek  * data structure includes the index of which sample to use for the packet
1397*49b49cdaSZbigniew Bodek  * to transmit. It's the caller's responsibility to manage those samples,
1398*49b49cdaSZbigniew Bodek  * for example, when using an index, the caller must make sure the packet
1399*49b49cdaSZbigniew Bodek  * is completed and the tx time is sampled before using that index for
1400*49b49cdaSZbigniew Bodek  * another packet.
1401*49b49cdaSZbigniew Bodek  *
1402*49b49cdaSZbigniew Bodek  * This function should be called after the completion indication of the
1403*49b49cdaSZbigniew Bodek  * tx packet. however, there is a little chance that the timestamp sample
1404*49b49cdaSZbigniew Bodek  * won't be updated yet, thus this function must be called again when it
1405*49b49cdaSZbigniew Bodek  * returns -EAGAIN.
1406*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1407*49b49cdaSZbigniew Bodek  * @param ts_index the index (out of 16) of the timestamp register
1408*49b49cdaSZbigniew Bodek  * @param timestamp the timestamp value in 2^18 femtoseconds resolution.
1409*49b49cdaSZbigniew Bodek  * @return -EAGAIN if the sample was not updated yet. 0 when the sample
1410*49b49cdaSZbigniew Bodek  * was updated and no errors found.
1411*49b49cdaSZbigniew Bodek  */
1412*49b49cdaSZbigniew Bodek int al_eth_tx_ts_val_get(struct al_hal_eth_adapter *adapter, uint8_t ts_index,
1413*49b49cdaSZbigniew Bodek 			 uint32_t *timestamp);
1414*49b49cdaSZbigniew Bodek 
1415*49b49cdaSZbigniew Bodek /* Timestamp PTH (PTP Timestamp Handler) control and times management */
1416*49b49cdaSZbigniew Bodek /** structure for describing PTH epoch time */
1417*49b49cdaSZbigniew Bodek struct al_eth_pth_time {
1418*49b49cdaSZbigniew Bodek 	uint32_t	seconds; /**< seconds */
1419*49b49cdaSZbigniew Bodek 	uint64_t	femto; /**< femto seconds */
1420*49b49cdaSZbigniew Bodek };
1421*49b49cdaSZbigniew Bodek 
1422*49b49cdaSZbigniew Bodek /**
1423*49b49cdaSZbigniew Bodek  * Read the systime value
1424*49b49cdaSZbigniew Bodek  * This API should not be used to get the timestamp of packets.
1425*49b49cdaSZbigniew Bodek  * The HW maintains 50 bits for the sub-seconds portion in femto resolution,
1426*49b49cdaSZbigniew Bodek  * but this function reads only the 32 MSB bits since the LSB provides
1427*49b49cdaSZbigniew Bodek  * sub-nanoseconds accuracy, which is not needed.
1428*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1429*49b49cdaSZbigniew Bodek  * @param systime pointer to structure where the time will be stored.
1430*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1431*49b49cdaSZbigniew Bodek  */
1432*49b49cdaSZbigniew Bodek int al_eth_pth_systime_read(struct al_hal_eth_adapter *adapter,
1433*49b49cdaSZbigniew Bodek 			    struct al_eth_pth_time *systime);
1434*49b49cdaSZbigniew Bodek 
1435*49b49cdaSZbigniew Bodek /**
1436*49b49cdaSZbigniew Bodek  * Set the clock period to a given value.
1437*49b49cdaSZbigniew Bodek  * The systime will be incremented by this value on each posedge of the
1438*49b49cdaSZbigniew Bodek  * adapters internal clock which driven by the SouthBridge clock.
1439*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1440*49b49cdaSZbigniew Bodek  * @param clk_period the clock period in femto seconds.
1441*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1442*49b49cdaSZbigniew Bodek  */
1443*49b49cdaSZbigniew Bodek int al_eth_pth_clk_period_write(struct al_hal_eth_adapter *adapter,
1444*49b49cdaSZbigniew Bodek 				uint64_t clk_period);
1445*49b49cdaSZbigniew Bodek 
1446*49b49cdaSZbigniew Bodek /**< enum for methods when updating systime using triggers */
1447*49b49cdaSZbigniew Bodek enum al_eth_pth_update_method {
1448*49b49cdaSZbigniew Bodek 	AL_ETH_PTH_UPDATE_METHOD_SET = 0, /**< Set the time in int/ext update time */
1449*49b49cdaSZbigniew Bodek 	AL_ETH_PTH_UPDATE_METHOD_INC = 1, /**< increment */
1450*49b49cdaSZbigniew Bodek 	AL_ETH_PTH_UPDATE_METHOD_DEC = 2, /**< decrement */
1451*49b49cdaSZbigniew Bodek 	AL_ETH_PTH_UPDATE_METHOD_ADD_TO_LAST = 3, /**< Set to last time + int/ext update time.*/
1452*49b49cdaSZbigniew Bodek };
1453*49b49cdaSZbigniew Bodek 
1454*49b49cdaSZbigniew Bodek /**< systime internal update trigger types */
1455*49b49cdaSZbigniew Bodek enum al_eth_pth_int_trig {
1456*49b49cdaSZbigniew Bodek 	AL_ETH_PTH_INT_TRIG_OUT_PULSE_0 = 0, /**< use output pulse as trigger */
1457*49b49cdaSZbigniew Bodek 	AL_ETH_PTH_INT_TRIG_REG_WRITE = 1, /**< use the int update register
1458*49b49cdaSZbigniew Bodek 					    * write as a trigger
1459*49b49cdaSZbigniew Bodek 					    */
1460*49b49cdaSZbigniew Bodek };
1461*49b49cdaSZbigniew Bodek 
1462*49b49cdaSZbigniew Bodek /**< parameters for internal trigger update */
1463*49b49cdaSZbigniew Bodek struct al_eth_pth_int_update_params {
1464*49b49cdaSZbigniew Bodek 	al_bool		enable; /**< enable internal trigger update */
1465*49b49cdaSZbigniew Bodek 	enum al_eth_pth_update_method	method; /**< internal trigger update
1466*49b49cdaSZbigniew Bodek 						 * method
1467*49b49cdaSZbigniew Bodek 						 */
1468*49b49cdaSZbigniew Bodek 	enum al_eth_pth_int_trig	trigger; /**< which internal trigger to
1469*49b49cdaSZbigniew Bodek 						  * use
1470*49b49cdaSZbigniew Bodek 						  */
1471*49b49cdaSZbigniew Bodek };
1472*49b49cdaSZbigniew Bodek 
1473*49b49cdaSZbigniew Bodek /**
1474*49b49cdaSZbigniew Bodek  * Configure the systime internal update
1475*49b49cdaSZbigniew Bodek  *
1476*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1477*49b49cdaSZbigniew Bodek  * @param params the configuration of the internal update.
1478*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1479*49b49cdaSZbigniew Bodek  */
1480*49b49cdaSZbigniew Bodek int al_eth_pth_int_update_config(struct al_hal_eth_adapter *adapter,
1481*49b49cdaSZbigniew Bodek 				 struct al_eth_pth_int_update_params *params);
1482*49b49cdaSZbigniew Bodek 
1483*49b49cdaSZbigniew Bodek /**
1484*49b49cdaSZbigniew Bodek  * set internal update time
1485*49b49cdaSZbigniew Bodek  *
1486*49b49cdaSZbigniew Bodek  * The update time used when updating the systime with
1487*49b49cdaSZbigniew Bodek  * internal update method.
1488*49b49cdaSZbigniew Bodek  *
1489*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1490*49b49cdaSZbigniew Bodek  * @param time the internal update time value
1491*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1492*49b49cdaSZbigniew Bodek  */
1493*49b49cdaSZbigniew Bodek int al_eth_pth_int_update_time_set(struct al_hal_eth_adapter *adapter,
1494*49b49cdaSZbigniew Bodek 				   struct al_eth_pth_time *time);
1495*49b49cdaSZbigniew Bodek 
1496*49b49cdaSZbigniew Bodek /**< parameters for external trigger update */
1497*49b49cdaSZbigniew Bodek struct al_eth_pth_ext_update_params {
1498*49b49cdaSZbigniew Bodek 	uint8_t		triggers; /**< bitmask of external triggers to enable */
1499*49b49cdaSZbigniew Bodek 	enum al_eth_pth_update_method	method; /**< external trigger update
1500*49b49cdaSZbigniew Bodek 						 * method
1501*49b49cdaSZbigniew Bodek 						 */
1502*49b49cdaSZbigniew Bodek };
1503*49b49cdaSZbigniew Bodek 
1504*49b49cdaSZbigniew Bodek /**
1505*49b49cdaSZbigniew Bodek  * Configure the systime external update.
1506*49b49cdaSZbigniew Bodek  * external update triggered by external signals such as GPIO or pulses
1507*49b49cdaSZbigniew Bodek  * from other eth controllers on the SoC.
1508*49b49cdaSZbigniew Bodek  *
1509*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1510*49b49cdaSZbigniew Bodek  * @param params the configuration of the external update.
1511*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1512*49b49cdaSZbigniew Bodek  */
1513*49b49cdaSZbigniew Bodek int al_eth_pth_ext_update_config(struct al_hal_eth_adapter *adapter,
1514*49b49cdaSZbigniew Bodek 				 struct al_eth_pth_ext_update_params *params);
1515*49b49cdaSZbigniew Bodek 
1516*49b49cdaSZbigniew Bodek /**
1517*49b49cdaSZbigniew Bodek  * set external update time
1518*49b49cdaSZbigniew Bodek  *
1519*49b49cdaSZbigniew Bodek  * The update time used when updating the systime with
1520*49b49cdaSZbigniew Bodek  * external update method.
1521*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1522*49b49cdaSZbigniew Bodek  * @param time the external update time value
1523*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1524*49b49cdaSZbigniew Bodek  */
1525*49b49cdaSZbigniew Bodek int al_eth_pth_ext_update_time_set(struct al_hal_eth_adapter *adapter,
1526*49b49cdaSZbigniew Bodek 				   struct al_eth_pth_time *time);
1527*49b49cdaSZbigniew Bodek /**
1528*49b49cdaSZbigniew Bodek  * set the read compensation delay
1529*49b49cdaSZbigniew Bodek  *
1530*49b49cdaSZbigniew Bodek  * When reading the systime, the HW adds this value to compensate
1531*49b49cdaSZbigniew Bodek  * read latency.
1532*49b49cdaSZbigniew Bodek  *
1533*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1534*49b49cdaSZbigniew Bodek  * @param subseconds the read latency delay in femto seconds.
1535*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1536*49b49cdaSZbigniew Bodek  */
1537*49b49cdaSZbigniew Bodek int al_eth_pth_read_compensation_set(struct al_hal_eth_adapter *adapter,
1538*49b49cdaSZbigniew Bodek 				     uint64_t subseconds);
1539*49b49cdaSZbigniew Bodek /**
1540*49b49cdaSZbigniew Bodek  * set the internal write compensation delay
1541*49b49cdaSZbigniew Bodek  *
1542*49b49cdaSZbigniew Bodek  * When updating the systime due to an internal trigger's event, the HW adds
1543*49b49cdaSZbigniew Bodek  * this value to compensate latency.
1544*49b49cdaSZbigniew Bodek  *
1545*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1546*49b49cdaSZbigniew Bodek  * @param subseconds the write latency delay in femto seconds.
1547*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1548*49b49cdaSZbigniew Bodek  */
1549*49b49cdaSZbigniew Bodek int al_eth_pth_int_write_compensation_set(struct al_hal_eth_adapter *adapter,
1550*49b49cdaSZbigniew Bodek 					  uint64_t subseconds);
1551*49b49cdaSZbigniew Bodek 
1552*49b49cdaSZbigniew Bodek /**
1553*49b49cdaSZbigniew Bodek  * set the external write compensation delay
1554*49b49cdaSZbigniew Bodek  *
1555*49b49cdaSZbigniew Bodek  * When updating the systime due to an external trigger's event, the HW adds
1556*49b49cdaSZbigniew Bodek  * this value to compensate pulse propagation latency.
1557*49b49cdaSZbigniew Bodek  *
1558*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1559*49b49cdaSZbigniew Bodek  * @param subseconds the write latency delay in femto seconds.
1560*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1561*49b49cdaSZbigniew Bodek  */
1562*49b49cdaSZbigniew Bodek int al_eth_pth_ext_write_compensation_set(struct al_hal_eth_adapter *adapter,
1563*49b49cdaSZbigniew Bodek 					  uint64_t subseconds);
1564*49b49cdaSZbigniew Bodek 
1565*49b49cdaSZbigniew Bodek /**
1566*49b49cdaSZbigniew Bodek  * set the sync compensation delay
1567*49b49cdaSZbigniew Bodek  *
1568*49b49cdaSZbigniew Bodek  * When the adapter passes systime from PTH to MAC to do the packets
1569*49b49cdaSZbigniew Bodek  * timestamping, the sync compensation delay is added to systime value to
1570*49b49cdaSZbigniew Bodek  * compensate the latency between the PTH and the MAC.
1571*49b49cdaSZbigniew Bodek  *
1572*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1573*49b49cdaSZbigniew Bodek  * @param subseconds the sync latency delay in femto seconds.
1574*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1575*49b49cdaSZbigniew Bodek  */
1576*49b49cdaSZbigniew Bodek int al_eth_pth_sync_compensation_set(struct al_hal_eth_adapter *adapter,
1577*49b49cdaSZbigniew Bodek 				     uint64_t subseconds);
1578*49b49cdaSZbigniew Bodek 
1579*49b49cdaSZbigniew Bodek #define AL_ETH_PTH_PULSE_OUT_NUM	8
1580*49b49cdaSZbigniew Bodek struct al_eth_pth_pulse_out_params {
1581*49b49cdaSZbigniew Bodek 	uint8_t		index; /**< id of the pulse (0..7) */
1582*49b49cdaSZbigniew Bodek 	al_bool		enable;
1583*49b49cdaSZbigniew Bodek 	al_bool		periodic; /**< when true, generate periodic pulse (PPS) */
1584*49b49cdaSZbigniew Bodek 	uint8_t		period_sec; /**< for periodic pulse, this is seconds
1585*49b49cdaSZbigniew Bodek 				     * portion of the period time
1586*49b49cdaSZbigniew Bodek 				     */
1587*49b49cdaSZbigniew Bodek 	uint32_t	period_us; /**< this is microseconds portion of the
1588*49b49cdaSZbigniew Bodek 				      * period
1589*49b49cdaSZbigniew Bodek 				      */
1590*49b49cdaSZbigniew Bodek 	struct al_eth_pth_time	start_time; /**< when to start pulse triggering */
1591*49b49cdaSZbigniew Bodek 	uint64_t	pulse_width; /**< pulse width in femto seconds */
1592*49b49cdaSZbigniew Bodek };
1593*49b49cdaSZbigniew Bodek 
1594*49b49cdaSZbigniew Bodek /**
1595*49b49cdaSZbigniew Bodek  * Configure an output pulse
1596*49b49cdaSZbigniew Bodek  * This function configures an output pulse coming from the internal System
1597*49b49cdaSZbigniew Bodek  * Time. This is typically a 1Hhz pulse that is used to synchronize the
1598*49b49cdaSZbigniew Bodek  * rest of the components of the system. This API configure the Ethernet
1599*49b49cdaSZbigniew Bodek  * Controller pulse. An additional set up is required to configure the chip
1600*49b49cdaSZbigniew Bodek  * General Purpose I/O (GPIO) to enable the chip output pin.
1601*49b49cdaSZbigniew Bodek  *
1602*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1603*49b49cdaSZbigniew Bodek  * @param params output pulse configuration.
1604*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
1605*49b49cdaSZbigniew Bodek  */
1606*49b49cdaSZbigniew Bodek int al_eth_pth_pulse_out_config(struct al_hal_eth_adapter *adapter,
1607*49b49cdaSZbigniew Bodek 				struct al_eth_pth_pulse_out_params *params);
1608*49b49cdaSZbigniew Bodek 
1609*49b49cdaSZbigniew Bodek /* link */
1610*49b49cdaSZbigniew Bodek struct al_eth_link_status {
1611*49b49cdaSZbigniew Bodek 	al_bool		link_up;
1612*49b49cdaSZbigniew Bodek };
1613*49b49cdaSZbigniew Bodek 
1614*49b49cdaSZbigniew Bodek /**
1615*49b49cdaSZbigniew Bodek  * get link status
1616*49b49cdaSZbigniew Bodek  *
1617*49b49cdaSZbigniew Bodek  * this function should be used when no external phy is used to get
1618*49b49cdaSZbigniew Bodek  * information about the link
1619*49b49cdaSZbigniew Bodek  *
1620*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1621*49b49cdaSZbigniew Bodek  * @param status pointer to struct where to set link information
1622*49b49cdaSZbigniew Bodek  *
1623*49b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
1624*49b49cdaSZbigniew Bodek  */
1625*49b49cdaSZbigniew Bodek int al_eth_link_status_get(struct al_hal_eth_adapter *adapter, struct al_eth_link_status *status);
1626*49b49cdaSZbigniew Bodek 
1627*49b49cdaSZbigniew Bodek /**
1628*49b49cdaSZbigniew Bodek  * Set LEDs to represent link status.
1629*49b49cdaSZbigniew Bodek  *
1630*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1631*49b49cdaSZbigniew Bodek  * @param link_is_up boolean indicating current link status.
1632*49b49cdaSZbigniew Bodek  *	  In case link is down the leds will be turned off.
1633*49b49cdaSZbigniew Bodek  *	  In case link is up the leds will be turned on, that means
1634*49b49cdaSZbigniew Bodek  *	  leds will be blinking on traffic and will be constantly lighting
1635*49b49cdaSZbigniew Bodek  *	  on inactive link
1636*49b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
1637*49b49cdaSZbigniew Bodek  */
1638*49b49cdaSZbigniew Bodek int al_eth_led_set(struct al_hal_eth_adapter *adapter, al_bool link_is_up);
1639*49b49cdaSZbigniew Bodek 
1640*49b49cdaSZbigniew Bodek /* get statistics */
1641*49b49cdaSZbigniew Bodek 
1642*49b49cdaSZbigniew Bodek struct al_eth_mac_stats{
1643*49b49cdaSZbigniew Bodek 	/* sum the data and padding octets (i.e. without header and FCS) received with a valid frame. */
1644*49b49cdaSZbigniew Bodek 	uint64_t aOctetsReceivedOK;
1645*49b49cdaSZbigniew Bodek 	/* sum of Payload and padding octets of frames transmitted without error*/
1646*49b49cdaSZbigniew Bodek 	uint64_t aOctetsTransmittedOK;
1647*49b49cdaSZbigniew Bodek 	/* total number of packets received. Good and bad packets */
1648*49b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts;
1649*49b49cdaSZbigniew Bodek 	/* number of received unicast packets */
1650*49b49cdaSZbigniew Bodek 	uint32_t ifInUcastPkts;
1651*49b49cdaSZbigniew Bodek 	/* number of received multicast packets */
1652*49b49cdaSZbigniew Bodek 	uint32_t ifInMulticastPkts;
1653*49b49cdaSZbigniew Bodek 	/* number of received broadcast packets */
1654*49b49cdaSZbigniew Bodek 	uint32_t ifInBroadcastPkts;
1655*49b49cdaSZbigniew Bodek 	/* Number of frames received with FIFO Overflow, CRC, Payload Length, Jabber and Oversized, Alignment or PHY/PCS error indication */
1656*49b49cdaSZbigniew Bodek 	uint32_t ifInErrors;
1657*49b49cdaSZbigniew Bodek 
1658*49b49cdaSZbigniew Bodek 	/* number of transmitted unicast packets */
1659*49b49cdaSZbigniew Bodek 	uint32_t ifOutUcastPkts;
1660*49b49cdaSZbigniew Bodek 	/* number of transmitted multicast packets */
1661*49b49cdaSZbigniew Bodek 	uint32_t ifOutMulticastPkts;
1662*49b49cdaSZbigniew Bodek 	/* number of transmitted broadcast packets */
1663*49b49cdaSZbigniew Bodek 	uint32_t ifOutBroadcastPkts;
1664*49b49cdaSZbigniew Bodek 	/* number of frames transmitted with FIFO Overflow, FIFO Underflow or Controller indicated error */
1665*49b49cdaSZbigniew Bodek 	uint32_t ifOutErrors;
1666*49b49cdaSZbigniew Bodek 
1667*49b49cdaSZbigniew Bodek 	/* number of Frame received without error (Including Pause Frames). */
1668*49b49cdaSZbigniew Bodek 	uint32_t aFramesReceivedOK;
1669*49b49cdaSZbigniew Bodek 	/* number of Frames transmitter without error (Including Pause Frames) */
1670*49b49cdaSZbigniew Bodek 	uint32_t aFramesTransmittedOK;
1671*49b49cdaSZbigniew Bodek 	/* number of packets received with less than 64 octets */
1672*49b49cdaSZbigniew Bodek 	uint32_t etherStatsUndersizePkts;
1673*49b49cdaSZbigniew Bodek 	/* Too short frames with CRC error, available only for RGMII and 1G Serial modes */
1674*49b49cdaSZbigniew Bodek 	uint32_t etherStatsFragments;
1675*49b49cdaSZbigniew Bodek 	/* Too long frames with CRC error */
1676*49b49cdaSZbigniew Bodek 	uint32_t etherStatsJabbers;
1677*49b49cdaSZbigniew Bodek 	/* packet that exceeds the valid maximum programmed frame length */
1678*49b49cdaSZbigniew Bodek 	uint32_t etherStatsOversizePkts;
1679*49b49cdaSZbigniew Bodek 	/* number of frames received with a CRC error */
1680*49b49cdaSZbigniew Bodek 	uint32_t aFrameCheckSequenceErrors;
1681*49b49cdaSZbigniew Bodek 	/* number of frames received with alignment error */
1682*49b49cdaSZbigniew Bodek 	uint32_t aAlignmentErrors;
1683*49b49cdaSZbigniew Bodek 	/* number of dropped packets due to FIFO overflow */
1684*49b49cdaSZbigniew Bodek 	uint32_t etherStatsDropEvents;
1685*49b49cdaSZbigniew Bodek 	/* number of transmitted pause frames. */
1686*49b49cdaSZbigniew Bodek 	uint32_t aPAUSEMACCtrlFramesTransmitted;
1687*49b49cdaSZbigniew Bodek 	/* number of received pause frames. */
1688*49b49cdaSZbigniew Bodek 	uint32_t aPAUSEMACCtrlFramesReceived;
1689*49b49cdaSZbigniew Bodek 	/* frame received exceeded the maximum length programmed with register FRM_LGTH, available only for 10G modes */
1690*49b49cdaSZbigniew Bodek 	uint32_t aFrameTooLongErrors;
1691*49b49cdaSZbigniew Bodek 	/* received frame with bad length/type (between 46 and 0x600 or less
1692*49b49cdaSZbigniew Bodek 	 * than 46 for packets longer than 64), available only for 10G modes */
1693*49b49cdaSZbigniew Bodek 	uint32_t aInRangeLengthErrors;
1694*49b49cdaSZbigniew Bodek 	/* Valid VLAN tagged frames transmitted */
1695*49b49cdaSZbigniew Bodek 	uint32_t VLANTransmittedOK;
1696*49b49cdaSZbigniew Bodek 	/* Valid VLAN tagged frames received */
1697*49b49cdaSZbigniew Bodek 	uint32_t VLANReceivedOK;
1698*49b49cdaSZbigniew Bodek 	/* Total number of octets received. Good and bad packets */
1699*49b49cdaSZbigniew Bodek 	uint32_t etherStatsOctets;
1700*49b49cdaSZbigniew Bodek 
1701*49b49cdaSZbigniew Bodek 	/* packets of 64 octets length is received (good and bad frames are counted) */
1702*49b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts64Octets;
1703*49b49cdaSZbigniew Bodek 	/* Frames (good and bad) with 65 to 127 octets */
1704*49b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts65to127Octets;
1705*49b49cdaSZbigniew Bodek 	/* Frames (good and bad) with 128 to 255 octets */
1706*49b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts128to255Octets;
1707*49b49cdaSZbigniew Bodek 	/* Frames (good and bad) with 256 to 511 octets */
1708*49b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts256to511Octets;
1709*49b49cdaSZbigniew Bodek 	/* Frames (good and bad) with 512 to 1023 octets */
1710*49b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts512to1023Octets;
1711*49b49cdaSZbigniew Bodek 	/* Frames (good and bad) with 1024 to 1518 octets */
1712*49b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts1024to1518Octets;
1713*49b49cdaSZbigniew Bodek 	/* frames with 1519 bytes to the maximum length programmed in the register FRAME_LENGTH. */
1714*49b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts1519toX;
1715*49b49cdaSZbigniew Bodek 
1716*49b49cdaSZbigniew Bodek 	uint32_t eee_in;
1717*49b49cdaSZbigniew Bodek 	uint32_t eee_out;
1718*49b49cdaSZbigniew Bodek };
1719*49b49cdaSZbigniew Bodek 
1720*49b49cdaSZbigniew Bodek /**
1721*49b49cdaSZbigniew Bodek  * get mac statistics
1722*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1723*49b49cdaSZbigniew Bodek  * @param stats pointer to structure that will be filled with statistics.
1724*49b49cdaSZbigniew Bodek  *
1725*49b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
1726*49b49cdaSZbigniew Bodek  */
1727*49b49cdaSZbigniew Bodek int al_eth_mac_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_mac_stats *stats);
1728*49b49cdaSZbigniew Bodek 
1729*49b49cdaSZbigniew Bodek struct al_eth_ec_stats{
1730*49b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO input  packets */
1731*49b49cdaSZbigniew Bodek 	uint32_t faf_in_rx_pkt;
1732*49b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO input  short error packets */
1733*49b49cdaSZbigniew Bodek 	uint32_t faf_in_rx_short;
1734*49b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO input  long error packets */
1735*49b49cdaSZbigniew Bodek 	uint32_t faf_in_rx_long;
1736*49b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO output  packets */
1737*49b49cdaSZbigniew Bodek 	uint32_t faf_out_rx_pkt;
1738*49b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO output  short error packets */
1739*49b49cdaSZbigniew Bodek 	uint32_t faf_out_rx_short;
1740*49b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO output  long error packets */
1741*49b49cdaSZbigniew Bodek 	uint32_t faf_out_rx_long;
1742*49b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO output  drop packets */
1743*49b49cdaSZbigniew Bodek 	uint32_t faf_out_drop;
1744*49b49cdaSZbigniew Bodek 	/* Number of packets written into the Rx FIFO (without FIFO error indication) */
1745*49b49cdaSZbigniew Bodek 	uint32_t rxf_in_rx_pkt;
1746*49b49cdaSZbigniew Bodek 	/* Number of error packets written into the Rx FIFO (with FIFO error indication, */
1747*49b49cdaSZbigniew Bodek 	/* FIFO full indication during packet reception) */
1748*49b49cdaSZbigniew Bodek 	uint32_t rxf_in_fifo_err;
1749*49b49cdaSZbigniew Bodek 	/* Number of packets read from Rx FIFO 1 */
1750*49b49cdaSZbigniew Bodek 	uint32_t lbf_in_rx_pkt;
1751*49b49cdaSZbigniew Bodek 	/* Number of packets read from Rx FIFO 2 (loopback FIFO) */
1752*49b49cdaSZbigniew Bodek 	uint32_t lbf_in_fifo_err;
1753*49b49cdaSZbigniew Bodek 	/* Rx FIFO output drop packets from FIFO 1 */
1754*49b49cdaSZbigniew Bodek 	uint32_t rxf_out_rx_1_pkt;
1755*49b49cdaSZbigniew Bodek 	/* Rx FIFO output drop packets from FIFO 2 (loop back) */
1756*49b49cdaSZbigniew Bodek 	uint32_t rxf_out_rx_2_pkt;
1757*49b49cdaSZbigniew Bodek 	/* Rx FIFO output drop packets from FIFO 1 */
1758*49b49cdaSZbigniew Bodek 	uint32_t rxf_out_drop_1_pkt;
1759*49b49cdaSZbigniew Bodek 	/* Rx FIFO output drop packets from FIFO 2 (loop back) */
1760*49b49cdaSZbigniew Bodek 	uint32_t rxf_out_drop_2_pkt;
1761*49b49cdaSZbigniew Bodek 	/* Rx Parser 1, input packet counter */
1762*49b49cdaSZbigniew Bodek 	uint32_t rpe_1_in_rx_pkt;
1763*49b49cdaSZbigniew Bodek 	/* Rx Parser 1, output packet counter */
1764*49b49cdaSZbigniew Bodek 	uint32_t rpe_1_out_rx_pkt;
1765*49b49cdaSZbigniew Bodek 	/* Rx Parser 2, input packet counter */
1766*49b49cdaSZbigniew Bodek 	uint32_t rpe_2_in_rx_pkt;
1767*49b49cdaSZbigniew Bodek 	/* Rx Parser 2, output packet counter */
1768*49b49cdaSZbigniew Bodek 	uint32_t rpe_2_out_rx_pkt;
1769*49b49cdaSZbigniew Bodek 	/* Rx Parser 3 (MACsec), input packet counter */
1770*49b49cdaSZbigniew Bodek 	uint32_t rpe_3_in_rx_pkt;
1771*49b49cdaSZbigniew Bodek 	/* Rx Parser 3 (MACsec), output packet counter */
1772*49b49cdaSZbigniew Bodek 	uint32_t rpe_3_out_rx_pkt;
1773*49b49cdaSZbigniew Bodek 	/* Tx parser, input packet counter */
1774*49b49cdaSZbigniew Bodek 	uint32_t tpe_in_tx_pkt;
1775*49b49cdaSZbigniew Bodek 	/* Tx parser, output packet counter */
1776*49b49cdaSZbigniew Bodek 	uint32_t tpe_out_tx_pkt;
1777*49b49cdaSZbigniew Bodek 	/* Tx packet modification, input packet counter */
1778*49b49cdaSZbigniew Bodek 	uint32_t tpm_tx_pkt;
1779*49b49cdaSZbigniew Bodek 	/* Tx forwarding input packet counter */
1780*49b49cdaSZbigniew Bodek 	uint32_t tfw_in_tx_pkt;
1781*49b49cdaSZbigniew Bodek 	/* Tx forwarding input packet counter */
1782*49b49cdaSZbigniew Bodek 	uint32_t tfw_out_tx_pkt;
1783*49b49cdaSZbigniew Bodek 	/* Rx forwarding input packet counter */
1784*49b49cdaSZbigniew Bodek 	uint32_t rfw_in_rx_pkt;
1785*49b49cdaSZbigniew Bodek 	/* Rx Forwarding, packet with VLAN command drop indication */
1786*49b49cdaSZbigniew Bodek 	uint32_t rfw_in_vlan_drop;
1787*49b49cdaSZbigniew Bodek 	/* Rx Forwarding, packets with parse drop indication */
1788*49b49cdaSZbigniew Bodek 	uint32_t rfw_in_parse_drop;
1789*49b49cdaSZbigniew Bodek 	/* Rx Forwarding, multicast packets */
1790*49b49cdaSZbigniew Bodek 	uint32_t rfw_in_mc;
1791*49b49cdaSZbigniew Bodek 	/* Rx Forwarding, broadcast packets */
1792*49b49cdaSZbigniew Bodek 	uint32_t rfw_in_bc;
1793*49b49cdaSZbigniew Bodek 	/* Rx Forwarding, tagged packets */
1794*49b49cdaSZbigniew Bodek 	uint32_t rfw_in_vlan_exist;
1795*49b49cdaSZbigniew Bodek 	/* Rx Forwarding, untagged packets */
1796*49b49cdaSZbigniew Bodek 	uint32_t rfw_in_vlan_nexist;
1797*49b49cdaSZbigniew Bodek 	/* Rx Forwarding, packets with MAC address drop indication (from the MAC address table) */
1798*49b49cdaSZbigniew Bodek 	uint32_t rfw_in_mac_drop;
1799*49b49cdaSZbigniew Bodek 	/* Rx Forwarding, packets with undetected MAC address */
1800*49b49cdaSZbigniew Bodek 	uint32_t rfw_in_mac_ndet_drop;
1801*49b49cdaSZbigniew Bodek 	/* Rx Forwarding, packets with drop indication from the control table */
1802*49b49cdaSZbigniew Bodek 	uint32_t rfw_in_ctrl_drop;
1803*49b49cdaSZbigniew Bodek 	/* Rx Forwarding, packets with L3_protocol_index drop indication */
1804*49b49cdaSZbigniew Bodek 	uint32_t rfw_in_prot_i_drop;
1805*49b49cdaSZbigniew Bodek 	/* EEE, number of times the system went into EEE state */
1806*49b49cdaSZbigniew Bodek 	uint32_t eee_in;
1807*49b49cdaSZbigniew Bodek };
1808*49b49cdaSZbigniew Bodek 
1809*49b49cdaSZbigniew Bodek /**
1810*49b49cdaSZbigniew Bodek  * get ec statistics
1811*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1812*49b49cdaSZbigniew Bodek  * @param stats pointer to structure that will be filled with statistics.
1813*49b49cdaSZbigniew Bodek  *
1814*49b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
1815*49b49cdaSZbigniew Bodek  */
1816*49b49cdaSZbigniew Bodek int al_eth_ec_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_ec_stats *stats);
1817*49b49cdaSZbigniew Bodek 
1818*49b49cdaSZbigniew Bodek struct al_eth_ec_stat_udma{
1819*49b49cdaSZbigniew Bodek 	/* Rx forwarding output packet counter */
1820*49b49cdaSZbigniew Bodek 	uint32_t rfw_out_rx_pkt;
1821*49b49cdaSZbigniew Bodek 	/* Rx forwarding output drop packet counter */
1822*49b49cdaSZbigniew Bodek 	uint32_t rfw_out_drop;
1823*49b49cdaSZbigniew Bodek 	/* Multi-stream write, number of Rx packets */
1824*49b49cdaSZbigniew Bodek 	uint32_t msw_in_rx_pkt;
1825*49b49cdaSZbigniew Bodek 	/* Multi-stream write, number of dropped packets at SOP,  Q full indication */
1826*49b49cdaSZbigniew Bodek 	uint32_t msw_drop_q_full;
1827*49b49cdaSZbigniew Bodek 	/* Multi-stream write, number of dropped packets at SOP */
1828*49b49cdaSZbigniew Bodek 	uint32_t msw_drop_sop;
1829*49b49cdaSZbigniew Bodek 	/* Multi-stream write, number of dropped packets at EOP, */
1830*49b49cdaSZbigniew Bodek 	/*EOP was written with error indication (not all packet data was written) */
1831*49b49cdaSZbigniew Bodek 	uint32_t msw_drop_eop;
1832*49b49cdaSZbigniew Bodek 	/* Multi-stream write, number of packets written to the stream FIFO with EOP and without packet loss */
1833*49b49cdaSZbigniew Bodek 	uint32_t msw_wr_eop;
1834*49b49cdaSZbigniew Bodek 	/* Multi-stream write, number of packets read from the FIFO into the stream */
1835*49b49cdaSZbigniew Bodek 	uint32_t msw_out_rx_pkt;
1836*49b49cdaSZbigniew Bodek 	/* Number of transmitted packets without TSO enabled */
1837*49b49cdaSZbigniew Bodek 	uint32_t tso_no_tso_pkt;
1838*49b49cdaSZbigniew Bodek 	/* Number of transmitted packets with TSO enabled */
1839*49b49cdaSZbigniew Bodek 	uint32_t tso_tso_pkt;
1840*49b49cdaSZbigniew Bodek 	/* Number of TSO segments that were generated */
1841*49b49cdaSZbigniew Bodek 	uint32_t tso_seg_pkt;
1842*49b49cdaSZbigniew Bodek 	/* Number of TSO segments that required padding */
1843*49b49cdaSZbigniew Bodek 	uint32_t tso_pad_pkt;
1844*49b49cdaSZbigniew Bodek 	/* Tx Packet modification, MAC SA spoof error */
1845*49b49cdaSZbigniew Bodek 	uint32_t tpm_tx_spoof;
1846*49b49cdaSZbigniew Bodek 	/* Tx MAC interface, input packet counter */
1847*49b49cdaSZbigniew Bodek 	uint32_t tmi_in_tx_pkt;
1848*49b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of packets forwarded to the MAC */
1849*49b49cdaSZbigniew Bodek 	uint32_t tmi_out_to_mac;
1850*49b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of packets forwarded to the Rx data path */
1851*49b49cdaSZbigniew Bodek 	uint32_t tmi_out_to_rx;
1852*49b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted bytes */
1853*49b49cdaSZbigniew Bodek 	uint32_t tx_q0_bytes;
1854*49b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted bytes */
1855*49b49cdaSZbigniew Bodek 	uint32_t tx_q1_bytes;
1856*49b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted bytes */
1857*49b49cdaSZbigniew Bodek 	uint32_t tx_q2_bytes;
1858*49b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted bytes */
1859*49b49cdaSZbigniew Bodek 	uint32_t tx_q3_bytes;
1860*49b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted packets */
1861*49b49cdaSZbigniew Bodek 	uint32_t tx_q0_pkts;
1862*49b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted packets */
1863*49b49cdaSZbigniew Bodek 	uint32_t tx_q1_pkts;
1864*49b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted packets */
1865*49b49cdaSZbigniew Bodek 	uint32_t tx_q2_pkts;
1866*49b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted packets */
1867*49b49cdaSZbigniew Bodek 	uint32_t tx_q3_pkts;
1868*49b49cdaSZbigniew Bodek };
1869*49b49cdaSZbigniew Bodek 
1870*49b49cdaSZbigniew Bodek /**
1871*49b49cdaSZbigniew Bodek  * get per_udma statistics
1872*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
1873*49b49cdaSZbigniew Bodek  * @param idx udma_id value
1874*49b49cdaSZbigniew Bodek  * @param stats pointer to structure that will be filled with statistics.
1875*49b49cdaSZbigniew Bodek  *
1876*49b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
1877*49b49cdaSZbigniew Bodek  */
1878*49b49cdaSZbigniew Bodek int al_eth_ec_stat_udma_get(struct al_hal_eth_adapter *adapter, uint8_t idx, struct al_eth_ec_stat_udma *stats);
1879*49b49cdaSZbigniew Bodek 
1880*49b49cdaSZbigniew Bodek /* trafic control */
1881*49b49cdaSZbigniew Bodek 
1882*49b49cdaSZbigniew Bodek /**
1883*49b49cdaSZbigniew Bodek  * perform Function Level Reset RMN
1884*49b49cdaSZbigniew Bodek  *
1885*49b49cdaSZbigniew Bodek  * Addressing RMN: 714
1886*49b49cdaSZbigniew Bodek  *
1887*49b49cdaSZbigniew Bodek  * @param pci_read_config_u32 pointer to function that reads register from pci header
1888*49b49cdaSZbigniew Bodek  * @param pci_write_config_u32 pointer to function that writes register from pci header
1889*49b49cdaSZbigniew Bodek  * @param handle pointer passes to the above functions as first parameter
1890*49b49cdaSZbigniew Bodek  * @param mac_base base address of the MAC registers
1891*49b49cdaSZbigniew Bodek  *
1892*49b49cdaSZbigniew Bodek  * @return 0.
1893*49b49cdaSZbigniew Bodek  */
1894*49b49cdaSZbigniew Bodek int al_eth_flr_rmn(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val),
1895*49b49cdaSZbigniew Bodek 		   int (* pci_write_config_u32)(void *handle, int where, uint32_t val),
1896*49b49cdaSZbigniew Bodek 		   void *handle,
1897*49b49cdaSZbigniew Bodek 		   void __iomem	*mac_base);
1898*49b49cdaSZbigniew Bodek 
1899*49b49cdaSZbigniew Bodek /**
1900*49b49cdaSZbigniew Bodek  * perform Function Level Reset RMN but restore registers that contain board specific data
1901*49b49cdaSZbigniew Bodek  *
1902*49b49cdaSZbigniew Bodek  * the data that save and restored is the board params and mac addresses
1903*49b49cdaSZbigniew Bodek  *
1904*49b49cdaSZbigniew Bodek  * @param pci_read_config_u32 pointer to function that reads register from pci header
1905*49b49cdaSZbigniew Bodek  * @param pci_write_config_u32 pointer to function that writes register from pci header
1906*49b49cdaSZbigniew Bodek  * @param handle pointer passes to the above functions as first parameter
1907*49b49cdaSZbigniew Bodek  * @param mac_base base address of the MAC registers
1908*49b49cdaSZbigniew Bodek  * @param ec_base base address of the Ethernet Controller registers
1909*49b49cdaSZbigniew Bodek  * @param mac_addresses_num number of mac addresses to restore
1910*49b49cdaSZbigniew Bodek  *
1911*49b49cdaSZbigniew Bodek  * @return 0.
1912*49b49cdaSZbigniew Bodek  */
1913*49b49cdaSZbigniew Bodek int al_eth_flr_rmn_restore_params(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val),
1914*49b49cdaSZbigniew Bodek 		int (* pci_write_config_u32)(void *handle, int where, uint32_t val),
1915*49b49cdaSZbigniew Bodek 		void *handle,
1916*49b49cdaSZbigniew Bodek 		void __iomem	*mac_base,
1917*49b49cdaSZbigniew Bodek 		void __iomem	*ec_base,
1918*49b49cdaSZbigniew Bodek 		int	mac_addresses_num);
1919*49b49cdaSZbigniew Bodek 
1920*49b49cdaSZbigniew Bodek /* board specific information (media type, phy address, etc.. */
1921*49b49cdaSZbigniew Bodek 
1922*49b49cdaSZbigniew Bodek 
1923*49b49cdaSZbigniew Bodek enum al_eth_board_media_type {
1924*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_AUTO_DETECT		= 0,
1925*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_RGMII			= 1,
1926*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_10GBASE_SR		= 2,
1927*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_SGMII			= 3,
1928*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_1000BASE_X		= 4,
1929*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_AUTO_DETECT_AUTO_SPEED	= 5,
1930*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_SGMII_2_5G		= 6,
1931*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_NBASE_T			= 7,
1932*49b49cdaSZbigniew Bodek };
1933*49b49cdaSZbigniew Bodek 
1934*49b49cdaSZbigniew Bodek enum al_eth_board_mdio_freq {
1935*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MDIO_FREQ_2_5_MHZ	= 0,
1936*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MDIO_FREQ_1_MHZ	= 1,
1937*49b49cdaSZbigniew Bodek };
1938*49b49cdaSZbigniew Bodek 
1939*49b49cdaSZbigniew Bodek enum al_eth_board_ext_phy_if {
1940*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_PHY_IF_MDIO	= 0,
1941*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_PHY_IF_XMDIO	= 1,
1942*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_PHY_IF_I2C		= 2,
1943*49b49cdaSZbigniew Bodek 
1944*49b49cdaSZbigniew Bodek };
1945*49b49cdaSZbigniew Bodek 
1946*49b49cdaSZbigniew Bodek enum al_eth_board_auto_neg_mode {
1947*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_AUTONEG_OUT_OF_BAND	= 0,
1948*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_AUTONEG_IN_BAND		= 1,
1949*49b49cdaSZbigniew Bodek 
1950*49b49cdaSZbigniew Bodek };
1951*49b49cdaSZbigniew Bodek 
1952*49b49cdaSZbigniew Bodek /* declare the 1G mac active speed when auto negotiation disabled */
1953*49b49cdaSZbigniew Bodek enum al_eth_board_1g_speed {
1954*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_1G_SPEED_1000M		= 0,
1955*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_1G_SPEED_100M		= 1,
1956*49b49cdaSZbigniew Bodek 	AL_ETH_BOARD_1G_SPEED_10M		= 2,
1957*49b49cdaSZbigniew Bodek };
1958*49b49cdaSZbigniew Bodek 
1959*49b49cdaSZbigniew Bodek enum al_eth_retimer_channel {
1960*49b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_CHANNEL_A		= 0,
1961*49b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_CHANNEL_B		= 1,
1962*49b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_CHANNEL_C		= 2,
1963*49b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_CHANNEL_D		= 3,
1964*49b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_CHANNEL_MAX		= 4
1965*49b49cdaSZbigniew Bodek };
1966*49b49cdaSZbigniew Bodek 
1967*49b49cdaSZbigniew Bodek /* list of supported retimers */
1968*49b49cdaSZbigniew Bodek enum al_eth_retimer_type {
1969*49b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_BR_210			= 0,
1970*49b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_BR_410			= 1,
1971*49b49cdaSZbigniew Bodek 
1972*49b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_TYPE_MAX			= 4,
1973*49b49cdaSZbigniew Bodek };
1974*49b49cdaSZbigniew Bodek 
1975*49b49cdaSZbigniew Bodek /** structure represents the board information. this info set by boot loader
1976*49b49cdaSZbigniew Bodek  * and read by OS driver.
1977*49b49cdaSZbigniew Bodek  */
1978*49b49cdaSZbigniew Bodek struct al_eth_board_params {
1979*49b49cdaSZbigniew Bodek 	enum al_eth_board_media_type	media_type;
1980*49b49cdaSZbigniew Bodek 	al_bool		phy_exist; /**< external phy exist */
1981*49b49cdaSZbigniew Bodek 	uint8_t		phy_mdio_addr; /**< mdio address of external phy */
1982*49b49cdaSZbigniew Bodek 	al_bool		sfp_plus_module_exist; /**< SFP+ module connected */
1983*49b49cdaSZbigniew Bodek 	al_bool		autoneg_enable; /**< enable Auto-Negotiation */
1984*49b49cdaSZbigniew Bodek 	al_bool		kr_lt_enable; /**< enable KR Link-Training */
1985*49b49cdaSZbigniew Bodek 	al_bool		kr_fec_enable; /**< enable KR FEC */
1986*49b49cdaSZbigniew Bodek 	enum al_eth_board_mdio_freq	mdio_freq; /**< MDIO frequency */
1987*49b49cdaSZbigniew Bodek 	uint8_t		i2c_adapter_id; /**< identifier for the i2c adapter to use to access SFP+ module */
1988*49b49cdaSZbigniew Bodek 	enum al_eth_board_ext_phy_if	phy_if; /**< phy interface */
1989*49b49cdaSZbigniew Bodek 	enum al_eth_board_auto_neg_mode	an_mode; /**< auto-negotiation mode (in-band / out-of-band) */
1990*49b49cdaSZbigniew Bodek 	uint8_t		serdes_grp; /**< serdes's group id */
1991*49b49cdaSZbigniew Bodek 	uint8_t		serdes_lane; /**< serdes's lane id */
1992*49b49cdaSZbigniew Bodek 	enum al_eth_ref_clk_freq	ref_clk_freq; /**< reference clock frequency */
1993*49b49cdaSZbigniew Bodek 	al_bool		dont_override_serdes; /**< prevent override serdes parameters */
1994*49b49cdaSZbigniew Bodek 	al_bool		force_1000_base_x; /**< set mac to 1000 base-x mode (instead sgmii) */
1995*49b49cdaSZbigniew Bodek 	al_bool		an_disable; /**< disable auto negotiation */
1996*49b49cdaSZbigniew Bodek 	enum al_eth_board_1g_speed	speed; /**< port speed if AN disabled */
1997*49b49cdaSZbigniew Bodek 	al_bool		half_duplex; /**< force half duplex if AN disabled */
1998*49b49cdaSZbigniew Bodek 	al_bool		fc_disable; /**< disable flow control */
1999*49b49cdaSZbigniew Bodek 	al_bool		retimer_exist; /**< retimer is exist on the board */
2000*49b49cdaSZbigniew Bodek 	uint8_t		retimer_bus_id; /**< in what i2c bus the retimer is on */
2001*49b49cdaSZbigniew Bodek 	uint8_t		retimer_i2c_addr; /**< i2c address of the retimer */
2002*49b49cdaSZbigniew Bodek 	enum al_eth_retimer_channel retimer_channel; /**< what channel connected to this port */
2003*49b49cdaSZbigniew Bodek 	al_bool		dac; /**< assume direct attached cable is connected if auto detect is off or failed */
2004*49b49cdaSZbigniew Bodek 	uint8_t		dac_len; /**< assume this cable length if auto detect is off or failed  */
2005*49b49cdaSZbigniew Bodek 	enum al_eth_retimer_type retimer_type; /**< the type of the specific retimer */
2006*49b49cdaSZbigniew Bodek };
2007*49b49cdaSZbigniew Bodek 
2008*49b49cdaSZbigniew Bodek /**
2009*49b49cdaSZbigniew Bodek  * set board parameter of the eth port
2010*49b49cdaSZbigniew Bodek  * this function used to set the board parameters into scratchpad
2011*49b49cdaSZbigniew Bodek  * registers. those paramters can be read later by OS driver.
2012*49b49cdaSZbigniew Bodek  *
2013*49b49cdaSZbigniew Bodek  * @param mac_base the virtual address of the mac registers (PCI BAR 2)
2014*49b49cdaSZbigniew Bodek  * @param params pointer to structure the includes the paramters
2015*49b49cdaSZbigniew Bodek  *
2016*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
2017*49b49cdaSZbigniew Bodek  */
2018*49b49cdaSZbigniew Bodek int al_eth_board_params_set(void * __iomem mac_base, struct al_eth_board_params *params);
2019*49b49cdaSZbigniew Bodek 
2020*49b49cdaSZbigniew Bodek /**
2021*49b49cdaSZbigniew Bodek  * get board parameter of the eth port
2022*49b49cdaSZbigniew Bodek  * this function used to get the board parameters from scratchpad
2023*49b49cdaSZbigniew Bodek  * registers.
2024*49b49cdaSZbigniew Bodek  *
2025*49b49cdaSZbigniew Bodek  * @param mac_base the virtual address of the mac registers (PCI BAR 2)
2026*49b49cdaSZbigniew Bodek  * @param params pointer to structure where the parameters will be stored.
2027*49b49cdaSZbigniew Bodek  *
2028*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
2029*49b49cdaSZbigniew Bodek  */
2030*49b49cdaSZbigniew Bodek int al_eth_board_params_get(void * __iomem mac_base, struct al_eth_board_params *params);
2031*49b49cdaSZbigniew Bodek 
2032*49b49cdaSZbigniew Bodek /*
2033*49b49cdaSZbigniew Bodek  * Wake-On-Lan (WoL)
2034*49b49cdaSZbigniew Bodek  *
2035*49b49cdaSZbigniew Bodek  * The following few functions configure the Wake-On-Lan packet detection
2036*49b49cdaSZbigniew Bodek  * inside the Integrated Ethernet MAC.
2037*49b49cdaSZbigniew Bodek  *
2038*49b49cdaSZbigniew Bodek  * There are other alternative ways to set WoL, such using the
2039*49b49cdaSZbigniew Bodek  * external 1000Base-T transceiver to set WoL mode.
2040*49b49cdaSZbigniew Bodek  *
2041*49b49cdaSZbigniew Bodek  * These APIs do not set the system-wide power-state, nor responsible on the
2042*49b49cdaSZbigniew Bodek  * transition from Sleep to Normal power state.
2043*49b49cdaSZbigniew Bodek  *
2044*49b49cdaSZbigniew Bodek  * For system level considerations, please refer to Annapurna Labs Alpine Wiki.
2045*49b49cdaSZbigniew Bodek  */
2046*49b49cdaSZbigniew Bodek /* Interrupt enable WoL MAC DA Unicast detected  packet */
2047*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_UNICAST		AL_BIT(0)
2048*49b49cdaSZbigniew Bodek /* Interrupt enable WoL L2 Multicast detected  packet */
2049*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_MULTICAST	AL_BIT(1)
2050*49b49cdaSZbigniew Bodek /* Interrupt enable WoL L2 Broadcast detected  packet */
2051*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_BROADCAST	AL_BIT(2)
2052*49b49cdaSZbigniew Bodek /* Interrupt enable WoL IPv4 detected  packet */
2053*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_IPV4		AL_BIT(3)
2054*49b49cdaSZbigniew Bodek /* Interrupt enable WoL IPv6 detected  packet */
2055*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_IPV6		AL_BIT(4)
2056*49b49cdaSZbigniew Bodek /* Interrupt enable WoL EtherType+MAC DA detected  packet */
2057*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_ETHERTYPE_DA	AL_BIT(5)
2058*49b49cdaSZbigniew Bodek /* Interrupt enable WoL EtherType+L2 Broadcast detected  packet */
2059*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_ETHERTYPE_BC	AL_BIT(6)
2060*49b49cdaSZbigniew Bodek /* Interrupt enable WoL parser detected  packet */
2061*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_PARSER		AL_BIT(7)
2062*49b49cdaSZbigniew Bodek /* Interrupt enable WoL magic detected  packet */
2063*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_MAGIC		AL_BIT(8)
2064*49b49cdaSZbigniew Bodek /* Interrupt enable WoL magic+password detected  packet */
2065*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_MAGIC_PSWD	AL_BIT(9)
2066*49b49cdaSZbigniew Bodek 
2067*49b49cdaSZbigniew Bodek /* Forward enable WoL MAC DA Unicast detected  packet */
2068*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_UNICAST		AL_BIT(0)
2069*49b49cdaSZbigniew Bodek /* Forward enable WoL L2 Multicast detected  packet */
2070*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_MULTICAST	AL_BIT(1)
2071*49b49cdaSZbigniew Bodek /* Forward enable WoL L2 Broadcast detected  packet */
2072*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_BROADCAST	AL_BIT(2)
2073*49b49cdaSZbigniew Bodek /* Forward enable WoL IPv4 detected  packet */
2074*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_IPV4		AL_BIT(3)
2075*49b49cdaSZbigniew Bodek /* Forward enable WoL IPv6 detected  packet */
2076*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_IPV6		AL_BIT(4)
2077*49b49cdaSZbigniew Bodek /* Forward enable WoL EtherType+MAC DA detected  packet */
2078*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_ETHERTYPE_DA	AL_BIT(5)
2079*49b49cdaSZbigniew Bodek /* Forward enable WoL EtherType+L2 Broadcast detected  packet */
2080*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_ETHERTYPE_BC	AL_BIT(6)
2081*49b49cdaSZbigniew Bodek /* Forward enable WoL parser detected  packet */
2082*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_PARSER		AL_BIT(7)
2083*49b49cdaSZbigniew Bodek 
2084*49b49cdaSZbigniew Bodek struct al_eth_wol_params {
2085*49b49cdaSZbigniew Bodek 	uint8_t *dest_addr; /**< 6 bytes array of destanation address for
2086*49b49cdaSZbigniew Bodek 				 magic packet detection */
2087*49b49cdaSZbigniew Bodek 	uint8_t *pswd; /**< 6 bytes array of the password to use */
2088*49b49cdaSZbigniew Bodek 	uint8_t *ipv4; /**< 4 bytes array of the ipv4 to use.
2089*49b49cdaSZbigniew Bodek 			    example: for ip = 192.168.1.2
2090*49b49cdaSZbigniew Bodek 			       ipv4[0]=2, ipv4[1]=1, ipv4[2]=168, ipv4[3]=192 */
2091*49b49cdaSZbigniew Bodek 	uint8_t *ipv6; /** 16 bytes array of the ipv6 to use.
2092*49b49cdaSZbigniew Bodek 			   example: ip = 2607:f0d0:1002:0051:0000:0000:5231:1234
2093*49b49cdaSZbigniew Bodek 			       ipv6[0]=34, ipv6[1]=12, ipv6[2]=31 .. */
2094*49b49cdaSZbigniew Bodek 	uint16_t ethr_type1; /**< first ethertype to use */
2095*49b49cdaSZbigniew Bodek 	uint16_t ethr_type2; /**< secound ethertype to use */
2096*49b49cdaSZbigniew Bodek 	uint16_t forward_mask; /**< bitmask of AL_ETH_WOL_FWRD_* of the packet
2097*49b49cdaSZbigniew Bodek 				    types needed to be forward. */
2098*49b49cdaSZbigniew Bodek 	uint16_t int_mask; /**< bitmask of AL_ETH_WOL_INT_* of the packet types
2099*49b49cdaSZbigniew Bodek 				that will send interrupt to wake the system. */
2100*49b49cdaSZbigniew Bodek };
2101*49b49cdaSZbigniew Bodek 
2102*49b49cdaSZbigniew Bodek /**
2103*49b49cdaSZbigniew Bodek  * enable the wol mechanism
2104*49b49cdaSZbigniew Bodek  * set what type of packets will wake up the system and what type of packets
2105*49b49cdaSZbigniew Bodek  * neet to forward after the system is up
2106*49b49cdaSZbigniew Bodek  *
2107*49b49cdaSZbigniew Bodek  * beside this function wol filter also need to be set by
2108*49b49cdaSZbigniew Bodek  * calling al_eth_filter_config with AL_ETH_RFW_FILTER_WOL
2109*49b49cdaSZbigniew Bodek  *
2110*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
2111*49b49cdaSZbigniew Bodek  * @param wol the parameters needed to configure the wol
2112*49b49cdaSZbigniew Bodek  *
2113*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
2114*49b49cdaSZbigniew Bodek  */
2115*49b49cdaSZbigniew Bodek int al_eth_wol_enable(
2116*49b49cdaSZbigniew Bodek 		struct al_hal_eth_adapter *adapter,
2117*49b49cdaSZbigniew Bodek 		struct al_eth_wol_params *wol);
2118*49b49cdaSZbigniew Bodek 
2119*49b49cdaSZbigniew Bodek /**
2120*49b49cdaSZbigniew Bodek  * Disable the WoL mechnism.
2121*49b49cdaSZbigniew Bodek  *
2122*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
2123*49b49cdaSZbigniew Bodek  *
2124*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
2125*49b49cdaSZbigniew Bodek  */
2126*49b49cdaSZbigniew Bodek int al_eth_wol_disable(
2127*49b49cdaSZbigniew Bodek 		struct al_hal_eth_adapter *adapter);
2128*49b49cdaSZbigniew Bodek 
2129*49b49cdaSZbigniew Bodek /**
2130*49b49cdaSZbigniew Bodek  * Configure tx fwd vlan table entry
2131*49b49cdaSZbigniew Bodek  *
2132*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
2133*49b49cdaSZbigniew Bodek  * @param idx the entry index within the vlan table. The HW uses the vlan id
2134*49b49cdaSZbigniew Bodek  * field of the packet when accessing this table.
2135*49b49cdaSZbigniew Bodek  * @param udma_mask vlan table value that indicates that the packet should be forward back to
2136*49b49cdaSZbigniew Bodek  * the udmas, through the Rx path (udma_mask is one-hot representation)
2137*49b49cdaSZbigniew Bodek  * @param fwd_to_mac vlan table value that indicates that the packet should be forward to mac
2138*49b49cdaSZbigniew Bodek  *
2139*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
2140*49b49cdaSZbigniew Bodek  */
2141*49b49cdaSZbigniew Bodek int al_eth_tx_fwd_vid_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma_mask, al_bool fwd_to_mac);
2142*49b49cdaSZbigniew Bodek 
2143*49b49cdaSZbigniew Bodek /** Tx Generic protocol detect Cam compare table entry  */
2144*49b49cdaSZbigniew Bodek struct al_eth_tx_gpd_cam_entry {
2145*49b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID l3_proto_idx;
2146*49b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID l4_proto_idx;
2147*49b49cdaSZbigniew Bodek 	enum AL_ETH_TX_TUNNEL_MODE tunnel_control;
2148*49b49cdaSZbigniew Bodek 	uint8_t source_vlan_count:2;
2149*49b49cdaSZbigniew Bodek 	uint8_t tx_gpd_cam_ctrl:1;
2150*49b49cdaSZbigniew Bodek 	uint8_t l3_proto_idx_mask:5;
2151*49b49cdaSZbigniew Bodek 	uint8_t l4_proto_idx_mask:5;
2152*49b49cdaSZbigniew Bodek 	uint8_t tunnel_control_mask:3;
2153*49b49cdaSZbigniew Bodek 	uint8_t source_vlan_count_mask:2;
2154*49b49cdaSZbigniew Bodek };
2155*49b49cdaSZbigniew Bodek 
2156*49b49cdaSZbigniew Bodek /** Rx Generic protocol detect Cam compare table entry  */
2157*49b49cdaSZbigniew Bodek struct al_eth_rx_gpd_cam_entry {
2158*49b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID outer_l3_proto_idx;
2159*49b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID outer_l4_proto_idx;
2160*49b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID inner_l3_proto_idx;
2161*49b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID inner_l4_proto_idx;
2162*49b49cdaSZbigniew Bodek 	uint8_t parse_ctrl;
2163*49b49cdaSZbigniew Bodek 	uint8_t outer_l3_len;
2164*49b49cdaSZbigniew Bodek 	uint8_t l3_priority;
2165*49b49cdaSZbigniew Bodek 	uint8_t l4_dst_port_lsb;
2166*49b49cdaSZbigniew Bodek 	uint8_t rx_gpd_cam_ctrl:1;
2167*49b49cdaSZbigniew Bodek 	uint8_t outer_l3_proto_idx_mask:5;
2168*49b49cdaSZbigniew Bodek 	uint8_t outer_l4_proto_idx_mask:5;
2169*49b49cdaSZbigniew Bodek 	uint8_t inner_l3_proto_idx_mask:5;
2170*49b49cdaSZbigniew Bodek 	uint8_t inner_l4_proto_idx_mask:5;
2171*49b49cdaSZbigniew Bodek 	uint8_t parse_ctrl_mask;
2172*49b49cdaSZbigniew Bodek 	uint8_t outer_l3_len_mask;
2173*49b49cdaSZbigniew Bodek 	uint8_t l3_priority_mask;
2174*49b49cdaSZbigniew Bodek 	uint8_t l4_dst_port_lsb_mask;
2175*49b49cdaSZbigniew Bodek };
2176*49b49cdaSZbigniew Bodek 
2177*49b49cdaSZbigniew Bodek enum AL_ETH_TX_GCP_ALU_OPSEL {
2178*49b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_L3_OFFSET			= 0,
2179*49b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_OUTER_L3_OFFSET		= 1,
2180*49b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_L3_LEN			= 2,
2181*49b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_OUTER_L3_LEN			= 3,
2182*49b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_L4_OFFSET			= 4,
2183*49b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_L4_LEN			= 5,
2184*49b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_TABLE_VAL			= 10
2185*49b49cdaSZbigniew Bodek };
2186*49b49cdaSZbigniew Bodek 
2187*49b49cdaSZbigniew Bodek enum AL_ETH_RX_GCP_ALU_OPSEL {
2188*49b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_OUTER_L3_OFFSET		= 0,
2189*49b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_INNER_L3_OFFSET		= 1,
2190*49b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_OUTER_L4_OFFSET		= 2,
2191*49b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_INNER_L4_OFFSET		= 3,
2192*49b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_OUTER_L3_HDR_LEN_LAT		= 4,
2193*49b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_INNER_L3_HDR_LEN_LAT		= 5,
2194*49b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_OUTER_L3_HDR_LEN_SEL		= 6,
2195*49b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_INNER_L3_HDR_LEN_SEL		= 7,
2196*49b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_PARSE_RESULT_VECTOR_OFFSET_1	= 8,
2197*49b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_PARSE_RESULT_VECTOR_OFFSET_2	= 9,
2198*49b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_TABLE_VAL			= 10
2199*49b49cdaSZbigniew Bodek };
2200*49b49cdaSZbigniew Bodek 
2201*49b49cdaSZbigniew Bodek /** Tx Generic crc prameters table entry  */
2202*49b49cdaSZbigniew Bodek 
2203*49b49cdaSZbigniew Bodek struct al_eth_tx_gcp_table_entry {
2204*49b49cdaSZbigniew Bodek 	uint8_t poly_sel:1;
2205*49b49cdaSZbigniew Bodek 	uint8_t crc32_bit_comp:1;
2206*49b49cdaSZbigniew Bodek 	uint8_t crc32_bit_swap:1;
2207*49b49cdaSZbigniew Bodek 	uint8_t crc32_byte_swap:1;
2208*49b49cdaSZbigniew Bodek 	uint8_t data_bit_swap:1;
2209*49b49cdaSZbigniew Bodek 	uint8_t data_byte_swap:1;
2210*49b49cdaSZbigniew Bodek 	uint8_t trail_size:4;
2211*49b49cdaSZbigniew Bodek 	uint8_t head_size:8;
2212*49b49cdaSZbigniew Bodek 	uint8_t head_calc:1;
2213*49b49cdaSZbigniew Bodek 	uint8_t mask_polarity:1;
2214*49b49cdaSZbigniew Bodek 	enum AL_ETH_ALU_OPCODE tx_alu_opcode_1;
2215*49b49cdaSZbigniew Bodek 	enum AL_ETH_ALU_OPCODE tx_alu_opcode_2;
2216*49b49cdaSZbigniew Bodek 	enum AL_ETH_ALU_OPCODE tx_alu_opcode_3;
2217*49b49cdaSZbigniew Bodek 	enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_1;
2218*49b49cdaSZbigniew Bodek 	enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_2;
2219*49b49cdaSZbigniew Bodek 	enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_3;
2220*49b49cdaSZbigniew Bodek 	enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_4;
2221*49b49cdaSZbigniew Bodek 	uint32_t gcp_mask[6];
2222*49b49cdaSZbigniew Bodek 	uint32_t crc_init;
2223*49b49cdaSZbigniew Bodek 	uint8_t gcp_table_res:7;
2224*49b49cdaSZbigniew Bodek 	uint16_t alu_val:9;
2225*49b49cdaSZbigniew Bodek };
2226*49b49cdaSZbigniew Bodek 
2227*49b49cdaSZbigniew Bodek /** Rx Generic crc prameters table entry  */
2228*49b49cdaSZbigniew Bodek 
2229*49b49cdaSZbigniew Bodek struct al_eth_rx_gcp_table_entry {
2230*49b49cdaSZbigniew Bodek 	uint8_t poly_sel:1;
2231*49b49cdaSZbigniew Bodek 	uint8_t crc32_bit_comp:1;
2232*49b49cdaSZbigniew Bodek 	uint8_t crc32_bit_swap:1;
2233*49b49cdaSZbigniew Bodek 	uint8_t crc32_byte_swap:1;
2234*49b49cdaSZbigniew Bodek 	uint8_t data_bit_swap:1;
2235*49b49cdaSZbigniew Bodek 	uint8_t data_byte_swap:1;
2236*49b49cdaSZbigniew Bodek 	uint8_t trail_size:4;
2237*49b49cdaSZbigniew Bodek 	uint8_t head_size:8;
2238*49b49cdaSZbigniew Bodek 	uint8_t head_calc:1;
2239*49b49cdaSZbigniew Bodek 	uint8_t mask_polarity:1;
2240*49b49cdaSZbigniew Bodek 	enum AL_ETH_ALU_OPCODE rx_alu_opcode_1;
2241*49b49cdaSZbigniew Bodek 	enum AL_ETH_ALU_OPCODE rx_alu_opcode_2;
2242*49b49cdaSZbigniew Bodek 	enum AL_ETH_ALU_OPCODE rx_alu_opcode_3;
2243*49b49cdaSZbigniew Bodek 	enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_1;
2244*49b49cdaSZbigniew Bodek 	enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_2;
2245*49b49cdaSZbigniew Bodek 	enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_3;
2246*49b49cdaSZbigniew Bodek 	enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_4;
2247*49b49cdaSZbigniew Bodek 	uint32_t gcp_mask[6];
2248*49b49cdaSZbigniew Bodek 	uint32_t crc_init;
2249*49b49cdaSZbigniew Bodek 	uint32_t gcp_table_res:27;
2250*49b49cdaSZbigniew Bodek 	uint16_t alu_val:9;
2251*49b49cdaSZbigniew Bodek };
2252*49b49cdaSZbigniew Bodek 
2253*49b49cdaSZbigniew Bodek /** Tx per_protocol_number crc & l3_checksum & l4_checksum command table entry  */
2254*49b49cdaSZbigniew Bodek 
2255*49b49cdaSZbigniew Bodek struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry {
2256*49b49cdaSZbigniew Bodek         al_bool crc_en_00; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 0 */
2257*49b49cdaSZbigniew Bodek         al_bool crc_en_01; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 1 */
2258*49b49cdaSZbigniew Bodek         al_bool crc_en_10; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 0 */
2259*49b49cdaSZbigniew Bodek         al_bool crc_en_11; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 1 */
2260*49b49cdaSZbigniew Bodek         al_bool l4_csum_en_00; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 0 */
2261*49b49cdaSZbigniew Bodek         al_bool l4_csum_en_01; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 1 */
2262*49b49cdaSZbigniew Bodek         al_bool l4_csum_en_10; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 0 */
2263*49b49cdaSZbigniew Bodek         al_bool l4_csum_en_11; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 1 */
2264*49b49cdaSZbigniew Bodek         al_bool l3_csum_en_00; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 0 */
2265*49b49cdaSZbigniew Bodek         al_bool l3_csum_en_01; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 1 */
2266*49b49cdaSZbigniew Bodek         al_bool l3_csum_en_10; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 0 */
2267*49b49cdaSZbigniew Bodek         al_bool l3_csum_en_11; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 1 */
2268*49b49cdaSZbigniew Bodek };
2269*49b49cdaSZbigniew Bodek 
2270*49b49cdaSZbigniew Bodek /**
2271*49b49cdaSZbigniew Bodek  * Configure tx_gpd_entry
2272*49b49cdaSZbigniew Bodek  *
2273*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
2274*49b49cdaSZbigniew Bodek  * @param idx the entry index
2275*49b49cdaSZbigniew Bodek  * @param tx_gpd_entry entry data for the Tx protocol detect Cam compare table
2276*49b49cdaSZbigniew Bodek  *
2277*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
2278*49b49cdaSZbigniew Bodek  *
2279*49b49cdaSZbigniew Bodek  */
2280*49b49cdaSZbigniew Bodek int al_eth_tx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
2281*49b49cdaSZbigniew Bodek 		struct al_eth_tx_gpd_cam_entry *tx_gpd_entry);
2282*49b49cdaSZbigniew Bodek 
2283*49b49cdaSZbigniew Bodek /**
2284*49b49cdaSZbigniew Bodek  * Configure tx_gcp_entry
2285*49b49cdaSZbigniew Bodek  *
2286*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
2287*49b49cdaSZbigniew Bodek  * @param idx the entry index
2288*49b49cdaSZbigniew Bodek  * @param tx_gcp_entry entry data for the Tx Generic crc prameters table
2289*49b49cdaSZbigniew Bodek  *
2290*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
2291*49b49cdaSZbigniew Bodek  *
2292*49b49cdaSZbigniew Bodek  */
2293*49b49cdaSZbigniew Bodek int al_eth_tx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
2294*49b49cdaSZbigniew Bodek 		struct al_eth_tx_gcp_table_entry *tx_gcp_entry);
2295*49b49cdaSZbigniew Bodek 
2296*49b49cdaSZbigniew Bodek /**
2297*49b49cdaSZbigniew Bodek  * Configure tx_crc_chksum_replace_cmd_entry
2298*49b49cdaSZbigniew Bodek  *
2299*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
2300*49b49cdaSZbigniew Bodek  * @param idx the entry index
2301*49b49cdaSZbigniew Bodek  * @param tx_replace_entry entry data for the Tx crc_&_l3_checksum_&_l4_checksum replace command table
2302*49b49cdaSZbigniew Bodek  *
2303*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
2304*49b49cdaSZbigniew Bodek  *
2305*49b49cdaSZbigniew Bodek  */
2306*49b49cdaSZbigniew Bodek int al_eth_tx_crc_chksum_replace_cmd_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
2307*49b49cdaSZbigniew Bodek 		struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry *tx_replace_entry);
2308*49b49cdaSZbigniew Bodek 
2309*49b49cdaSZbigniew Bodek /**
2310*49b49cdaSZbigniew Bodek  * Configure rx_gpd_entry
2311*49b49cdaSZbigniew Bodek  *
2312*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
2313*49b49cdaSZbigniew Bodek  * @param idx the entry index
2314*49b49cdaSZbigniew Bodek  * @param rx_gpd_entry entry data for the Tx protocol detect Cam compare table
2315*49b49cdaSZbigniew Bodek  *
2316*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
2317*49b49cdaSZbigniew Bodek  *
2318*49b49cdaSZbigniew Bodek  */
2319*49b49cdaSZbigniew Bodek int al_eth_rx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
2320*49b49cdaSZbigniew Bodek 		struct al_eth_rx_gpd_cam_entry *rx_gpd_entry);
2321*49b49cdaSZbigniew Bodek 
2322*49b49cdaSZbigniew Bodek /**
2323*49b49cdaSZbigniew Bodek  * Configure rx_gcp_entry
2324*49b49cdaSZbigniew Bodek  *
2325*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
2326*49b49cdaSZbigniew Bodek  * @param idx the entry index
2327*49b49cdaSZbigniew Bodek  * @param rx_gpd_entry entry data for the Tx protocol detect Cam compare table
2328*49b49cdaSZbigniew Bodek  * @param rx_gcp_entry entry data for the Tx Generic crc prameters table
2329*49b49cdaSZbigniew Bodek  *
2330*49b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
2331*49b49cdaSZbigniew Bodek  *
2332*49b49cdaSZbigniew Bodek  */
2333*49b49cdaSZbigniew Bodek int al_eth_rx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
2334*49b49cdaSZbigniew Bodek 		struct al_eth_rx_gcp_table_entry *rx_gcp_entry);
2335*49b49cdaSZbigniew Bodek 
2336*49b49cdaSZbigniew Bodek /**
2337*49b49cdaSZbigniew Bodek  * Configure tx_gpd_table and regs
2338*49b49cdaSZbigniew Bodek  *
2339*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
2340*49b49cdaSZbigniew Bodek  *
2341*49b49cdaSZbigniew Bodek  */
2342*49b49cdaSZbigniew Bodek int al_eth_tx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter);
2343*49b49cdaSZbigniew Bodek 
2344*49b49cdaSZbigniew Bodek /**
2345*49b49cdaSZbigniew Bodek  * Configure crc_chksum_replace_cmd_table
2346*49b49cdaSZbigniew Bodek  *
2347*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
2348*49b49cdaSZbigniew Bodek  *
2349*49b49cdaSZbigniew Bodek  */
2350*49b49cdaSZbigniew Bodek int al_eth_tx_crc_chksum_replace_cmd_init(struct al_hal_eth_adapter *adapter);
2351*49b49cdaSZbigniew Bodek 
2352*49b49cdaSZbigniew Bodek /**
2353*49b49cdaSZbigniew Bodek  * Configure tx_gcp_table and regs
2354*49b49cdaSZbigniew Bodek  *
2355*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
2356*49b49cdaSZbigniew Bodek  *
2357*49b49cdaSZbigniew Bodek  */
2358*49b49cdaSZbigniew Bodek int al_eth_tx_generic_crc_table_init(struct al_hal_eth_adapter *adapter);
2359*49b49cdaSZbigniew Bodek 
2360*49b49cdaSZbigniew Bodek /**
2361*49b49cdaSZbigniew Bodek  * Configure rx_gpd_table and regs
2362*49b49cdaSZbigniew Bodek  *
2363*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
2364*49b49cdaSZbigniew Bodek  *
2365*49b49cdaSZbigniew Bodek  */
2366*49b49cdaSZbigniew Bodek int al_eth_rx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter);
2367*49b49cdaSZbigniew Bodek 
2368*49b49cdaSZbigniew Bodek /**
2369*49b49cdaSZbigniew Bodek  * Configure rx_gcp_table and regs
2370*49b49cdaSZbigniew Bodek  *
2371*49b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
2372*49b49cdaSZbigniew Bodek  *
2373*49b49cdaSZbigniew Bodek  */
2374*49b49cdaSZbigniew Bodek int al_eth_rx_generic_crc_table_init(struct al_hal_eth_adapter *adapter);
2375*49b49cdaSZbigniew Bodek 
2376*49b49cdaSZbigniew Bodek #ifdef __cplusplus
2377*49b49cdaSZbigniew Bodek }
2378*49b49cdaSZbigniew Bodek #endif
2379*49b49cdaSZbigniew Bodek /* *INDENT-ON* */
2380*49b49cdaSZbigniew Bodek #endif		/* __AL_HAL_ETH_H__ */
2381*49b49cdaSZbigniew Bodek /** @} end of Ethernet group */
2382