xref: /freebsd/sys/contrib/alpine-hal/eth/al_hal_eth.h (revision d002f039aeb370370cd2cba63ad55cc4cf16c932)
149b49cdaSZbigniew Bodek /*-
249b49cdaSZbigniew Bodek *******************************************************************************
349b49cdaSZbigniew Bodek Copyright (C) 2015 Annapurna Labs Ltd.
449b49cdaSZbigniew Bodek 
549b49cdaSZbigniew Bodek This file may be licensed under the terms of the Annapurna Labs Commercial
649b49cdaSZbigniew Bodek License Agreement.
749b49cdaSZbigniew Bodek 
849b49cdaSZbigniew Bodek Alternatively, this file can be distributed under the terms of the GNU General
949b49cdaSZbigniew Bodek Public License V2 as published by the Free Software Foundation and can be
1049b49cdaSZbigniew Bodek found at http://www.gnu.org/licenses/gpl-2.0.html
1149b49cdaSZbigniew Bodek 
1249b49cdaSZbigniew Bodek Alternatively, redistribution and use in source and binary forms, with or
1349b49cdaSZbigniew Bodek without modification, are permitted provided that the following conditions are
1449b49cdaSZbigniew Bodek met:
1549b49cdaSZbigniew Bodek 
1649b49cdaSZbigniew Bodek     *     Redistributions of source code must retain the above copyright notice,
1749b49cdaSZbigniew Bodek this list of conditions and the following disclaimer.
1849b49cdaSZbigniew Bodek 
1949b49cdaSZbigniew Bodek     *     Redistributions in binary form must reproduce the above copyright
2049b49cdaSZbigniew Bodek notice, this list of conditions and the following disclaimer in
2149b49cdaSZbigniew Bodek the documentation and/or other materials provided with the
2249b49cdaSZbigniew Bodek distribution.
2349b49cdaSZbigniew Bodek 
2449b49cdaSZbigniew Bodek THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
2549b49cdaSZbigniew Bodek ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2649b49cdaSZbigniew Bodek WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2749b49cdaSZbigniew Bodek DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
2849b49cdaSZbigniew Bodek ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2949b49cdaSZbigniew Bodek (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
3049b49cdaSZbigniew Bodek LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
3149b49cdaSZbigniew Bodek ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3249b49cdaSZbigniew Bodek (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3349b49cdaSZbigniew Bodek SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3449b49cdaSZbigniew Bodek 
3549b49cdaSZbigniew Bodek *******************************************************************************/
3649b49cdaSZbigniew Bodek 
3749b49cdaSZbigniew Bodek /**
3849b49cdaSZbigniew Bodek  * @defgroup group_eth_api API
3949b49cdaSZbigniew Bodek  * Ethernet Controller HAL driver API
4049b49cdaSZbigniew Bodek  * @ingroup group_eth
4149b49cdaSZbigniew Bodek  * @{
4249b49cdaSZbigniew Bodek  * @file   al_hal_eth.h
4349b49cdaSZbigniew Bodek  *
4449b49cdaSZbigniew Bodek  * @brief Header file for Unified GbE and 10GbE Ethernet Controllers This is a
4549b49cdaSZbigniew Bodek  * common header file that covers both Standard and Advanced Controller
4649b49cdaSZbigniew Bodek  *
4749b49cdaSZbigniew Bodek  *
4849b49cdaSZbigniew Bodek  */
4949b49cdaSZbigniew Bodek 
5049b49cdaSZbigniew Bodek #ifndef __AL_HAL_ETH_H__
5149b49cdaSZbigniew Bodek #define __AL_HAL_ETH_H__
5249b49cdaSZbigniew Bodek 
5349b49cdaSZbigniew Bodek #include "al_hal_common.h"
5449b49cdaSZbigniew Bodek #include "al_hal_udma.h"
5549b49cdaSZbigniew Bodek #include "al_hal_eth_alu.h"
5649b49cdaSZbigniew Bodek #ifdef AL_ETH_EX
5749b49cdaSZbigniew Bodek #include "al_hal_eth_ex.h"
5849b49cdaSZbigniew Bodek #include "al_hal_eth_ex_internal.h"
5949b49cdaSZbigniew Bodek #endif
6049b49cdaSZbigniew Bodek 
6149b49cdaSZbigniew Bodek /* *INDENT-OFF* */
6249b49cdaSZbigniew Bodek #ifdef __cplusplus
6349b49cdaSZbigniew Bodek extern "C" {
6449b49cdaSZbigniew Bodek #endif
6549b49cdaSZbigniew Bodek /* *INDENT-ON* */
6649b49cdaSZbigniew Bodek 
6749b49cdaSZbigniew Bodek #ifndef AL_ETH_PKT_MAX_BUFS
6849b49cdaSZbigniew Bodek #ifndef AL_ETH_EX
6949b49cdaSZbigniew Bodek #define AL_ETH_PKT_MAX_BUFS 19
7049b49cdaSZbigniew Bodek #else
71*3fc36ee0SWojciech Macek #define AL_ETH_PKT_MAX_BUFS 30
7249b49cdaSZbigniew Bodek #endif
7349b49cdaSZbigniew Bodek #endif
7449b49cdaSZbigniew Bodek 
7549b49cdaSZbigniew Bodek #define AL_ETH_UDMA_TX_QUEUES		4
7649b49cdaSZbigniew Bodek #define AL_ETH_UDMA_RX_QUEUES		4
7749b49cdaSZbigniew Bodek 
7849b49cdaSZbigniew Bodek /* PCI Adapter Device/Revision ID */
7949b49cdaSZbigniew Bodek #define AL_ETH_DEV_ID_STANDARD		0x0001
8049b49cdaSZbigniew Bodek #define AL_ETH_DEV_ID_ADVANCED		0x0002
8149b49cdaSZbigniew Bodek #define AL_ETH_REV_ID_0			0 /* Alpine V1 Rev 0 */
8249b49cdaSZbigniew Bodek #define AL_ETH_REV_ID_1			1 /* Alpine V1 Rev 1 */
8349b49cdaSZbigniew Bodek #define AL_ETH_REV_ID_2			2 /* Alpine V2 basic */
8449b49cdaSZbigniew Bodek #define AL_ETH_REV_ID_3			3 /* Alpine V2 advanced */
8549b49cdaSZbigniew Bodek 
8649b49cdaSZbigniew Bodek /* PCI BARs */
8749b49cdaSZbigniew Bodek #define AL_ETH_UDMA_BAR			0
8849b49cdaSZbigniew Bodek #define AL_ETH_EC_BAR			4
8949b49cdaSZbigniew Bodek #define AL_ETH_MAC_BAR			2
9049b49cdaSZbigniew Bodek 
9149b49cdaSZbigniew Bodek #define AL_ETH_MAX_FRAME_LEN		10000
9249b49cdaSZbigniew Bodek #define AL_ETH_MIN_FRAME_LEN		60
9349b49cdaSZbigniew Bodek 
9449b49cdaSZbigniew Bodek #define AL_ETH_TSO_MSS_MAX_IDX		8
9549b49cdaSZbigniew Bodek #define AL_ETH_TSO_MSS_MIN_VAL		1
9649b49cdaSZbigniew Bodek /*TODO: update with correct value*/
9749b49cdaSZbigniew Bodek #define AL_ETH_TSO_MSS_MAX_VAL		(AL_ETH_MAX_FRAME_LEN - 200)
9849b49cdaSZbigniew Bodek 
9949b49cdaSZbigniew Bodek enum AL_ETH_PROTO_ID {
10049b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_UNKNOWN = 0,
10149b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_IPv4	= 8,
10249b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_IPv6	= 11,
10349b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_TCP	= 12,
10449b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_UDP	= 13,
10549b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_FCOE    = 21,
10649b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_GRH     = 22, /** RoCE l3 header */
10749b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_BTH     = 23, /** RoCE l4 header */
10849b49cdaSZbigniew Bodek 	AL_ETH_PROTO_ID_ANY	= 32, /**< for sw usage only */
10949b49cdaSZbigniew Bodek };
11049b49cdaSZbigniew Bodek #define AL_ETH_PROTOCOLS_NUM		(AL_ETH_PROTO_ID_ANY)
11149b49cdaSZbigniew Bodek 
11249b49cdaSZbigniew Bodek enum AL_ETH_TX_TUNNEL_MODE {
11349b49cdaSZbigniew Bodek 	AL_ETH_NO_TUNNELING	= 0,
11449b49cdaSZbigniew Bodek 	AL_ETH_TUNNEL_NO_UDP	= 1, /* NVGRE / IP over IP */
11549b49cdaSZbigniew Bodek 	AL_ETH_TUNNEL_WITH_UDP	= 3,	/* VXLAN */
11649b49cdaSZbigniew Bodek };
11749b49cdaSZbigniew Bodek 
11849b49cdaSZbigniew Bodek #define AL_ETH_RX_THASH_TABLE_SIZE	(1 << 8)
11949b49cdaSZbigniew Bodek #define AL_ETH_RX_FSM_TABLE_SIZE	(1 << 7)
12049b49cdaSZbigniew Bodek #define AL_ETH_RX_CTRL_TABLE_SIZE	(1 << 11)
12149b49cdaSZbigniew Bodek #define AL_ETH_RX_HASH_KEY_NUM		10
12249b49cdaSZbigniew Bodek #define AL_ETH_FWD_MAC_NUM			32
12349b49cdaSZbigniew Bodek #define AL_ETH_FWD_MAC_HASH_NUM			256
12449b49cdaSZbigniew Bodek #define AL_ETH_FWD_PBITS_TABLE_NUM	(1 << 3)
12549b49cdaSZbigniew Bodek #define AL_ETH_FWD_PRIO_TABLE_NUM	(1 << 3)
12649b49cdaSZbigniew Bodek #define AL_ETH_FWD_VID_TABLE_NUM	(1 << 12)
12749b49cdaSZbigniew Bodek #define AL_ETH_FWD_DSCP_TABLE_NUM	(1 << 8)
12849b49cdaSZbigniew Bodek #define AL_ETH_FWD_TC_TABLE_NUM	(1 << 8)
12949b49cdaSZbigniew Bodek 
13049b49cdaSZbigniew Bodek /** MAC media mode */
13149b49cdaSZbigniew Bodek enum al_eth_mac_mode {
13249b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_RGMII,
13349b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_SGMII,
13449b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_SGMII_2_5G,
13549b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_10GbE_Serial,	/**< Applies to XFI and KR modes */
13649b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_10G_SGMII,	/**< SGMII using the 10G MAC, don't use*/
13749b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_XLG_LL_40G,	/**< applies to 40G mode using the 40G low latency (LL) MAC */
13849b49cdaSZbigniew Bodek 	AL_ETH_MAC_MODE_KR_LL_25G,	/**< applies to 25G mode using the 10/25G low latency (LL) MAC */
139*3fc36ee0SWojciech Macek 	AL_ETH_MAC_MODE_XLG_LL_50G,	/**< applies to 50G mode using the 40/50G low latency (LL) MAC */
140*3fc36ee0SWojciech Macek 	AL_ETH_MAC_MODE_XLG_LL_25G	/**< applies to 25G mode using the 40/50G low latency (LL) MAC */
14149b49cdaSZbigniew Bodek };
14249b49cdaSZbigniew Bodek 
14349b49cdaSZbigniew Bodek struct al_eth_capabilities {
14449b49cdaSZbigniew Bodek 	al_bool	speed_10_HD;
14549b49cdaSZbigniew Bodek 	al_bool	speed_10_FD;
14649b49cdaSZbigniew Bodek 	al_bool speed_100_HD;
14749b49cdaSZbigniew Bodek 	al_bool speed_100_FD;
14849b49cdaSZbigniew Bodek 	al_bool speed_1000_HD;
14949b49cdaSZbigniew Bodek 	al_bool speed_1000_FD;
15049b49cdaSZbigniew Bodek 	al_bool speed_10000_HD;
15149b49cdaSZbigniew Bodek 	al_bool speed_10000_FD;
15249b49cdaSZbigniew Bodek 	al_bool pfc; /**< priority flow control */
15349b49cdaSZbigniew Bodek 	al_bool eee; /**< Energy Efficient Ethernet */
15449b49cdaSZbigniew Bodek };
15549b49cdaSZbigniew Bodek 
15649b49cdaSZbigniew Bodek /** interface type used for MDIO */
15749b49cdaSZbigniew Bodek enum al_eth_mdio_if {
15849b49cdaSZbigniew Bodek 	AL_ETH_MDIO_IF_1G_MAC = 0,
15949b49cdaSZbigniew Bodek 	AL_ETH_MDIO_IF_10G_MAC = 1
16049b49cdaSZbigniew Bodek };
16149b49cdaSZbigniew Bodek 
16249b49cdaSZbigniew Bodek /** MDIO protocol type */
16349b49cdaSZbigniew Bodek enum al_eth_mdio_type {
16449b49cdaSZbigniew Bodek 	AL_ETH_MDIO_TYPE_CLAUSE_22 = 0,
16549b49cdaSZbigniew Bodek 	AL_ETH_MDIO_TYPE_CLAUSE_45 = 1
16649b49cdaSZbigniew Bodek };
16749b49cdaSZbigniew Bodek 
16849b49cdaSZbigniew Bodek /** flow control mode */
16949b49cdaSZbigniew Bodek enum al_eth_flow_control_type {
17049b49cdaSZbigniew Bodek 	AL_ETH_FLOW_CONTROL_TYPE_LINK_PAUSE,
17149b49cdaSZbigniew Bodek 	AL_ETH_FLOW_CONTROL_TYPE_PFC
17249b49cdaSZbigniew Bodek };
17349b49cdaSZbigniew Bodek 
17449b49cdaSZbigniew Bodek /** Tx to Rx switching decision type */
17549b49cdaSZbigniew Bodek enum al_eth_tx_switch_dec_type {
17649b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_TYPE_MAC = 0,
17749b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_TYPE_VLAN_TABLE = 1,
17849b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_TYPE_VLAN_TABLE_AND_MAC = 2,
17949b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_TYPE_BITMAP = 3
18049b49cdaSZbigniew Bodek };
18149b49cdaSZbigniew Bodek 
18249b49cdaSZbigniew Bodek /** Tx to Rx VLAN ID selection type */
18349b49cdaSZbigniew Bodek enum al_eth_tx_switch_vid_sel_type {
18449b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_VID_SEL_TYPE_VLAN1 = 0,
18549b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_VID_SEL_TYPE_VLAN2 = 1,
18649b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_VID_SEL_TYPE_NEW_VLAN1 = 2,
18749b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_VID_SEL_TYPE_NEW_VLAN2 = 3,
18849b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_VID_SEL_TYPE_DEFAULT_VLAN1 = 4,
18949b49cdaSZbigniew Bodek 	AL_ETH_TX_SWITCH_VID_SEL_TYPE_FINAL_VLAN1 = 5
19049b49cdaSZbigniew Bodek };
19149b49cdaSZbigniew Bodek 
19249b49cdaSZbigniew Bodek /** Rx descriptor configurations */
19349b49cdaSZbigniew Bodek /* Note: when selecting rx descriptor field to inner packet, then that field
19449b49cdaSZbigniew Bodek * will be set according to inner packet when packet is tunneled, for non-tunneled
19549b49cdaSZbigniew Bodek * packets, the field will be set according to the packets header */
19649b49cdaSZbigniew Bodek 
19749b49cdaSZbigniew Bodek /** selection of the LRO_context_value result in the Metadata */
19849b49cdaSZbigniew Bodek enum al_eth_rx_desc_lro_context_val_res {
19949b49cdaSZbigniew Bodek 	AL_ETH_LRO_CONTEXT_VALUE = 0, /**< LRO_context_value */
20049b49cdaSZbigniew Bodek 	AL_ETH_L4_OFFSET = 1, /**< L4_offset */
20149b49cdaSZbigniew Bodek };
20249b49cdaSZbigniew Bodek 
20349b49cdaSZbigniew Bodek /** selection of the L4 offset in the Metadata */
20449b49cdaSZbigniew Bodek enum al_eth_rx_desc_l4_offset_sel {
20549b49cdaSZbigniew Bodek 	AL_ETH_L4_OFFSET_OUTER = 0, /**< set L4 offset of the outer packet */
20649b49cdaSZbigniew Bodek 	AL_ETH_L4_OFFSET_INNER = 1, /**< set L4 offset of the inner packet */
20749b49cdaSZbigniew Bodek };
20849b49cdaSZbigniew Bodek 
20949b49cdaSZbigniew Bodek /** selection of the L4 checksum result in the Metadata */
21049b49cdaSZbigniew Bodek enum al_eth_rx_desc_l4_chk_res_sel {
21149b49cdaSZbigniew Bodek 	AL_ETH_L4_INNER_CHK = 0, /**< L4 checksum */
21249b49cdaSZbigniew Bodek 	AL_ETH_L4_INNER_OUTER_CHK = 1, /**< Logic AND between outer and inner
21349b49cdaSZbigniew Bodek 					    L4 checksum result */
21449b49cdaSZbigniew Bodek };
21549b49cdaSZbigniew Bodek 
21649b49cdaSZbigniew Bodek /** selection of the L3 checksum result in the Metadata */
21749b49cdaSZbigniew Bodek enum al_eth_rx_desc_l3_chk_res_sel {
21849b49cdaSZbigniew Bodek 	AL_ETH_L3_CHK_TYPE_0 = 0, /**< L3 checksum */
21949b49cdaSZbigniew Bodek 	AL_ETH_L3_CHK_TYPE_1 = 1, /**< L3 checksum or RoCE/FCoE CRC,
22049b49cdaSZbigniew Bodek 				       based on outer header */
22149b49cdaSZbigniew Bodek 	AL_ETH_L3_CHK_TYPE_2 = 2, /**< If tunnel exist = 0,
22249b49cdaSZbigniew Bodek 					  L3 checksum or RoCE/FCoE CRC,
22349b49cdaSZbigniew Bodek 					  based on outer header.
22449b49cdaSZbigniew Bodek 				       Else,
22549b49cdaSZbigniew Bodek 					  logic AND between outer L3 checksum
22649b49cdaSZbigniew Bodek 					  (Ipv4) and inner CRC (RoCE or FcoE) */
22749b49cdaSZbigniew Bodek 	AL_ETH_L3_CHK_TYPE_3 = 3, /**< combination of the L3 checksum result and
22849b49cdaSZbigniew Bodek 				       CRC result,based on the checksum and
22949b49cdaSZbigniew Bodek 				       RoCE/FCoE CRC input selections. */
23049b49cdaSZbigniew Bodek };
23149b49cdaSZbigniew Bodek 
23249b49cdaSZbigniew Bodek /** selection of the L3 protocol index in the Metadata */
23349b49cdaSZbigniew Bodek enum al_eth_rx_desc_l3_proto_idx_sel {
23449b49cdaSZbigniew Bodek 	AL_ETH_L3_PROTO_IDX_OUTER = 0, /**< set L3 proto index of the outer packet */
23549b49cdaSZbigniew Bodek 	AL_ETH_L3_PROTO_IDX_INNER = 1, /**< set L3 proto index of the inner packet */
23649b49cdaSZbigniew Bodek };
23749b49cdaSZbigniew Bodek 
23849b49cdaSZbigniew Bodek /** selection of the L3 offset in the Metadata */
23949b49cdaSZbigniew Bodek enum al_eth_rx_desc_l3_offset_sel {
24049b49cdaSZbigniew Bodek 	AL_ETH_L3_OFFSET_OUTER = 0, /**< set L3 offset of the outer packet */
24149b49cdaSZbigniew Bodek 	AL_ETH_L3_OFFSET_INNER = 1, /**< set L3 offset of the inner packet */
24249b49cdaSZbigniew Bodek };
24349b49cdaSZbigniew Bodek 
24449b49cdaSZbigniew Bodek 
24549b49cdaSZbigniew Bodek /** selection of the L4 protocol index in the Metadata */
24649b49cdaSZbigniew Bodek enum al_eth_rx_desc_l4_proto_idx_sel {
24749b49cdaSZbigniew Bodek 	AL_ETH_L4_PROTO_IDX_OUTER = 0, /**< set L4 proto index of the outer packet */
24849b49cdaSZbigniew Bodek 	AL_ETH_L4_PROTO_IDX_INNER = 1, /**< set L4 proto index of the inner packet */
24949b49cdaSZbigniew Bodek };
25049b49cdaSZbigniew Bodek 
25149b49cdaSZbigniew Bodek /** selection of the frag indication in the Metadata */
25249b49cdaSZbigniew Bodek enum al_eth_rx_desc_frag_sel {
25349b49cdaSZbigniew Bodek 	AL_ETH_FRAG_OUTER = 0, /**< set frag of the outer packet */
25449b49cdaSZbigniew Bodek 	AL_ETH_FRAG_INNER = 1, /**< set frag of the inner packet */
25549b49cdaSZbigniew Bodek };
25649b49cdaSZbigniew Bodek 
25749b49cdaSZbigniew Bodek /** Ethernet Rx completion descriptor */
25849b49cdaSZbigniew Bodek typedef struct {
25949b49cdaSZbigniew Bodek 	uint32_t ctrl_meta;
26049b49cdaSZbigniew Bodek 	uint32_t len;
26149b49cdaSZbigniew Bodek 	uint32_t word2;
26249b49cdaSZbigniew Bodek 	uint32_t word3;
26349b49cdaSZbigniew Bodek } al_eth_rx_cdesc;
26449b49cdaSZbigniew Bodek 
26549b49cdaSZbigniew Bodek /** Flow Contol parameters */
26649b49cdaSZbigniew Bodek struct al_eth_flow_control_params{
26749b49cdaSZbigniew Bodek 	enum al_eth_flow_control_type type; /**< flow control type */
26849b49cdaSZbigniew Bodek 	al_bool		obay_enable; /**< stop tx when pause received */
26949b49cdaSZbigniew Bodek 	al_bool		gen_enable; /**< generate pause frames */
27049b49cdaSZbigniew Bodek 	uint16_t	rx_fifo_th_high;
27149b49cdaSZbigniew Bodek 	uint16_t	rx_fifo_th_low;
27249b49cdaSZbigniew Bodek 	uint16_t	quanta;
27349b49cdaSZbigniew Bodek 	uint16_t	quanta_th;
27449b49cdaSZbigniew Bodek 	uint8_t		prio_q_map[4][8]; /**< for each UDMA, defines the mapping between
27549b49cdaSZbigniew Bodek 					   * PFC priority and queues(in bit mask).
27649b49cdaSZbigniew Bodek 					   * same mapping used for obay and generation.
27749b49cdaSZbigniew Bodek 					   * for example:
27849b49cdaSZbigniew Bodek 					   * if prio_q_map[1][7] = 0xC, then TX queues 2
27949b49cdaSZbigniew Bodek 					   * and 3 of UDMA 1 will be stopped when pause
28049b49cdaSZbigniew Bodek 					   * received with priority 7, also, when RX queues
28149b49cdaSZbigniew Bodek 					   * 2 and 3 of UDMA 1 become almost full, then
28249b49cdaSZbigniew Bodek 					   * pause frame with priority 7 will be sent.
28349b49cdaSZbigniew Bodek 					   *
28449b49cdaSZbigniew Bodek 					   *note:
28549b49cdaSZbigniew Bodek 					   * 1) if specific a queue is not used, the caller must
28649b49cdaSZbigniew Bodek 					   * make set the prio_q_map to 0 otherwise that queue
28749b49cdaSZbigniew Bodek 					   * will make the controller keep sending PAUSE packets.
28849b49cdaSZbigniew Bodek 					   * 2) queues of unused UDMA must be treated as above.
28949b49cdaSZbigniew Bodek 					   * 3) when working in LINK PAUSE mode, only entries at
29049b49cdaSZbigniew Bodek 					   * priority 0 will be considered.
29149b49cdaSZbigniew Bodek 					   */
29249b49cdaSZbigniew Bodek };
29349b49cdaSZbigniew Bodek 
29449b49cdaSZbigniew Bodek /* Packet Tx flags */
29549b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_TSO		AL_BIT(7)  /**< Enable TCP/UDP segmentation offloading */
29649b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_IPV4_L3_CSUM	AL_BIT(13) /**< Enable IPv4 header checksum calculation */
29749b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_L4_CSUM		AL_BIT(14) /**< Enable TCP/UDP checksum calculation */
29849b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM	AL_BIT(17) /**< L4 partial checksum calculation */
29949b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_L2_MACSEC_PKT	AL_BIT(16) /**< L2 Packet type 802_3 or 802_3_MACSEC, V2 */
30049b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_ENCRYPT		AL_BIT(16) /**< Enable TX packet encryption, V3 */
30149b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_L2_DIS_FCS	AL_BIT(15) /**< Disable CRC calculation*/
30249b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_TS		AL_BIT(21) /**< Timestamp the packet */
30349b49cdaSZbigniew Bodek 
30449b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_INT		AL_M2S_DESC_INT_EN
30549b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_NO_SNOOP	AL_M2S_DESC_NO_SNOOP_H
30649b49cdaSZbigniew Bodek 
30749b49cdaSZbigniew Bodek /** this structure used for tx packet meta data */
30849b49cdaSZbigniew Bodek struct al_eth_meta_data{
30949b49cdaSZbigniew Bodek 	uint8_t store :1; /**< store the meta into the queues cache */
31049b49cdaSZbigniew Bodek 	uint8_t words_valid :4; /**< valid bit per word */
31149b49cdaSZbigniew Bodek 
31249b49cdaSZbigniew Bodek 	uint8_t vlan1_cfi_sel:2;
31349b49cdaSZbigniew Bodek 	uint8_t vlan2_vid_sel:2;
31449b49cdaSZbigniew Bodek 	uint8_t vlan2_cfi_sel:2;
31549b49cdaSZbigniew Bodek 	uint8_t vlan2_pbits_sel:2;
31649b49cdaSZbigniew Bodek 	uint8_t vlan2_ether_sel:2;
31749b49cdaSZbigniew Bodek 
31849b49cdaSZbigniew Bodek 	uint16_t vlan1_new_vid:12;
31949b49cdaSZbigniew Bodek 	uint8_t vlan1_new_cfi :1;
32049b49cdaSZbigniew Bodek 	uint8_t vlan1_new_pbits :3;
32149b49cdaSZbigniew Bodek 	uint16_t vlan2_new_vid:12;
32249b49cdaSZbigniew Bodek 	uint8_t vlan2_new_cfi :1;
32349b49cdaSZbigniew Bodek 	uint8_t vlan2_new_pbits :3;
32449b49cdaSZbigniew Bodek 
32549b49cdaSZbigniew Bodek 	uint8_t l3_header_len; /**< in bytes */
32649b49cdaSZbigniew Bodek 	uint8_t l3_header_offset;
32749b49cdaSZbigniew Bodek 	uint8_t l4_header_len; /**< in words(32-bits) */
32849b49cdaSZbigniew Bodek 
32949b49cdaSZbigniew Bodek 	/* rev 0 specific */
33049b49cdaSZbigniew Bodek 	uint8_t mss_idx_sel:3; /**< for TSO, select the register that holds the MSS */
33149b49cdaSZbigniew Bodek 
33249b49cdaSZbigniew Bodek 	/* rev 1 specific */
33349b49cdaSZbigniew Bodek 	uint8_t	ts_index:4; /**< index of regiser where to store the tx timestamp */
33449b49cdaSZbigniew Bodek 	uint16_t mss_val :14; /**< for TSO, set the mss value */
33549b49cdaSZbigniew Bodek 	uint8_t outer_l3_offset; /**< for tunneling mode. up to 64 bytes */
33649b49cdaSZbigniew Bodek 	uint8_t outer_l3_len; /**< for tunneling mode. up to 128 bytes */
33749b49cdaSZbigniew Bodek };
33849b49cdaSZbigniew Bodek 
33949b49cdaSZbigniew Bodek /* Packet Rx flags when adding buffer to receive queue */
34049b49cdaSZbigniew Bodek 
34149b49cdaSZbigniew Bodek /**<
342*3fc36ee0SWojciech Macek  * Target-ID to be assigned to the packet descriptors
343*3fc36ee0SWojciech Macek  * Requires Target-ID in descriptor to be enabled for the specific UDMA
34449b49cdaSZbigniew Bodek  * queue.
34549b49cdaSZbigniew Bodek  */
346*3fc36ee0SWojciech Macek #define AL_ETH_RX_FLAGS_TGTID_MASK	AL_FIELD_MASK(15, 0)
34749b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_NO_SNOOP	AL_M2S_DESC_NO_SNOOP_H
34849b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_INT		AL_M2S_DESC_INT_EN
34949b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_DUAL_BUF	AL_BIT(31)
35049b49cdaSZbigniew Bodek 
35149b49cdaSZbigniew Bodek /* Packet Rx flags set by HW when receiving packet */
35249b49cdaSZbigniew Bodek #define AL_ETH_RX_ERROR			AL_BIT(16) /**< layer 2 errors (FCS, bad len, etc) */
35349b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L4_CSUM_ERR	AL_BIT(14)
35449b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L3_CSUM_ERR	AL_BIT(13)
35549b49cdaSZbigniew Bodek 
35649b49cdaSZbigniew Bodek /* Packet Rx flags - word 3 in Rx completion descriptor */
35749b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_CRC						AL_BIT(31)
35849b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L3_CSUM_2				AL_BIT(30)
35949b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L4_CSUM_2				AL_BIT(29)
36049b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_SW_SRC_PORT_SHIFT		13
36149b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_SW_SRC_PORT_MASK		AL_FIELD_MASK(15, 13)
36249b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_LRO_CONTEXT_VAL_SHIFT	3
36349b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_LRO_CONTEXT_VAL_MASK	AL_FIELD_MASK(10, 3)
36449b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L4_OFFSET_SHIFT			3
36549b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L4_OFFSET_MASK			AL_FIELD_MASK(10, 3)
36649b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_PRIORITY_SHIFT			0
36749b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_PRIORITY_MASK			AL_FIELD_MASK(2, 0)
36849b49cdaSZbigniew Bodek 
36949b49cdaSZbigniew Bodek /** packet structure. used for packet transmission and reception */
37049b49cdaSZbigniew Bodek struct al_eth_pkt{
37149b49cdaSZbigniew Bodek 	uint32_t flags; /**< see flags above, depends on context(tx or rx) */
37249b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID l3_proto_idx;
37349b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID l4_proto_idx;
37449b49cdaSZbigniew Bodek 	uint8_t source_vlan_count:2;
37549b49cdaSZbigniew Bodek 	uint8_t vlan_mod_add_count:2;
37649b49cdaSZbigniew Bodek 	uint8_t vlan_mod_del_count:2;
37749b49cdaSZbigniew Bodek 	uint8_t vlan_mod_v1_ether_sel:2;
37849b49cdaSZbigniew Bodek 	uint8_t vlan_mod_v1_vid_sel:2;
37949b49cdaSZbigniew Bodek 	uint8_t vlan_mod_v1_pbits_sel:2;
38049b49cdaSZbigniew Bodek 
38149b49cdaSZbigniew Bodek 	/* rev 1 specific */
38249b49cdaSZbigniew Bodek 	enum AL_ETH_TX_TUNNEL_MODE tunnel_mode;
38349b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID outer_l3_proto_idx; /**< for tunneling mode */
38449b49cdaSZbigniew Bodek 
38549b49cdaSZbigniew Bodek 	/**<
386*3fc36ee0SWojciech Macek 	 * Target-ID to be assigned to the packet descriptors
387*3fc36ee0SWojciech Macek 	 * Requires Target-ID in descriptor to be enabled for the specific UDMA
38849b49cdaSZbigniew Bodek 	 * queue.
38949b49cdaSZbigniew Bodek 	 */
390*3fc36ee0SWojciech Macek 	uint16_t tgtid;
39149b49cdaSZbigniew Bodek 
39249b49cdaSZbigniew Bodek 	uint32_t rx_header_len; /**< header buffer length of rx packet, not used */
39349b49cdaSZbigniew Bodek 	struct al_eth_meta_data *meta; /**< if null, then no meta added */
39449b49cdaSZbigniew Bodek #ifdef AL_ETH_RX_DESC_RAW_GET
39549b49cdaSZbigniew Bodek 	uint32_t rx_desc_raw[4];
39649b49cdaSZbigniew Bodek #endif
39749b49cdaSZbigniew Bodek 	uint16_t rxhash;
39849b49cdaSZbigniew Bodek 	uint16_t l3_offset;
39949b49cdaSZbigniew Bodek 
40049b49cdaSZbigniew Bodek #ifdef AL_ETH_EX
40149b49cdaSZbigniew Bodek 	struct al_eth_ext_metadata *ext_meta_data;
40249b49cdaSZbigniew Bodek #endif
40349b49cdaSZbigniew Bodek 
40449b49cdaSZbigniew Bodek 	uint8_t num_of_bufs;
40549b49cdaSZbigniew Bodek 	struct al_buf	bufs[AL_ETH_PKT_MAX_BUFS];
40649b49cdaSZbigniew Bodek };
40749b49cdaSZbigniew Bodek 
40849b49cdaSZbigniew Bodek struct al_ec_regs;
40949b49cdaSZbigniew Bodek 
41049b49cdaSZbigniew Bodek 
41149b49cdaSZbigniew Bodek /** Ethernet Adapter private data structure used by this driver */
41249b49cdaSZbigniew Bodek struct al_hal_eth_adapter{
41349b49cdaSZbigniew Bodek 	uint8_t rev_id; /**<PCI adapter revision ID */
41449b49cdaSZbigniew Bodek 	uint8_t udma_id; /**< the id of the UDMA used by this adapter */
41549b49cdaSZbigniew Bodek 	struct unit_regs __iomem * unit_regs;
41649b49cdaSZbigniew Bodek 	void __iomem *udma_regs_base;
41749b49cdaSZbigniew Bodek 	struct al_ec_regs __iomem *ec_regs_base;
41849b49cdaSZbigniew Bodek 	void __iomem *ec_ints_base;
41949b49cdaSZbigniew Bodek 	struct al_eth_mac_regs __iomem *mac_regs_base;
42049b49cdaSZbigniew Bodek 	struct interrupt_controller_ctrl __iomem *mac_ints_base;
42149b49cdaSZbigniew Bodek 
42249b49cdaSZbigniew Bodek 	char *name; /**< the upper layer must keep the string area */
42349b49cdaSZbigniew Bodek 
42449b49cdaSZbigniew Bodek 	struct al_udma tx_udma;
42549b49cdaSZbigniew Bodek 	/*	uint8_t tx_queues;*//* number of tx queues */
42649b49cdaSZbigniew Bodek 	struct al_udma rx_udma;
42749b49cdaSZbigniew Bodek 	/*	uint8_t rx_queues;*//* number of tx queues */
42849b49cdaSZbigniew Bodek 
42949b49cdaSZbigniew Bodek 	uint8_t		enable_rx_parser; /**< config and enable rx parsing */
43049b49cdaSZbigniew Bodek 
43149b49cdaSZbigniew Bodek 	enum al_eth_flow_control_type fc_type; /**< flow control*/
43249b49cdaSZbigniew Bodek 
43349b49cdaSZbigniew Bodek 	enum al_eth_mac_mode mac_mode;
43449b49cdaSZbigniew Bodek 	enum al_eth_mdio_if	mdio_if; /**< which mac mdio interface to use */
43549b49cdaSZbigniew Bodek 	enum al_eth_mdio_type mdio_type; /**< mdio protocol type */
43649b49cdaSZbigniew Bodek 	al_bool	shared_mdio_if; /**< when AL_TRUE, the mdio interface is shared with other controllers.*/
43749b49cdaSZbigniew Bodek 	uint8_t curr_lt_unit;
438*3fc36ee0SWojciech Macek 	uint8_t serdes_lane;
43949b49cdaSZbigniew Bodek #ifdef AL_ETH_EX
44049b49cdaSZbigniew Bodek 	struct al_eth_ex_state ex_state;
44149b49cdaSZbigniew Bodek #endif
44249b49cdaSZbigniew Bodek };
44349b49cdaSZbigniew Bodek 
44449b49cdaSZbigniew Bodek /** parameters from upper layer */
44549b49cdaSZbigniew Bodek struct al_eth_adapter_params{
44649b49cdaSZbigniew Bodek 	uint8_t rev_id; /**<PCI adapter revision ID */
44749b49cdaSZbigniew Bodek 	uint8_t udma_id; /**< the id of the UDMA used by this adapter */
44849b49cdaSZbigniew Bodek 	uint8_t	enable_rx_parser; /**< when true, the rx epe parser will be enabled */
44949b49cdaSZbigniew Bodek 	void __iomem *udma_regs_base; /**< UDMA register base address */
45049b49cdaSZbigniew Bodek 	void __iomem *ec_regs_base; /**< Ethernet controller registers base address
45149b49cdaSZbigniew Bodek 				     * can be null if the function is virtual
45249b49cdaSZbigniew Bodek 				     */
45349b49cdaSZbigniew Bodek 	void __iomem *mac_regs_base; /**< Ethernet MAC registers base address
45449b49cdaSZbigniew Bodek 				      * can be null if the function is virtual
45549b49cdaSZbigniew Bodek 				      */
45649b49cdaSZbigniew Bodek 	char *name; /**< the upper layer must keep the string area */
457*3fc36ee0SWojciech Macek 
458*3fc36ee0SWojciech Macek 	uint8_t serdes_lane; /**< serdes lane (relevant to 25G macs only) */
45949b49cdaSZbigniew Bodek };
46049b49cdaSZbigniew Bodek 
46149b49cdaSZbigniew Bodek /* adapter management */
46249b49cdaSZbigniew Bodek /**
46349b49cdaSZbigniew Bodek  * initialize the ethernet adapter's DMA
46449b49cdaSZbigniew Bodek  * - initialize the adapter data structure
46549b49cdaSZbigniew Bodek  * - initialize the Tx and Rx UDMA
46649b49cdaSZbigniew Bodek  * - enable the Tx and Rx UDMA, the rings will be still disabled at this point.
46749b49cdaSZbigniew Bodek  *
46849b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
46949b49cdaSZbigniew Bodek  * @param params the parameters passed from upper layer
47049b49cdaSZbigniew Bodek  *
47149b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
47249b49cdaSZbigniew Bodek  */
47349b49cdaSZbigniew Bodek int al_eth_adapter_init(struct al_hal_eth_adapter *adapter, struct al_eth_adapter_params *params);
47449b49cdaSZbigniew Bodek 
47549b49cdaSZbigniew Bodek /**
47649b49cdaSZbigniew Bodek  * stop the DMA of the ethernet adapter
47749b49cdaSZbigniew Bodek  *
47849b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
47949b49cdaSZbigniew Bodek  *
48049b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
48149b49cdaSZbigniew Bodek  */
48249b49cdaSZbigniew Bodek int al_eth_adapter_stop(struct al_hal_eth_adapter *adapter);
48349b49cdaSZbigniew Bodek 
48449b49cdaSZbigniew Bodek int al_eth_adapter_reset(struct al_hal_eth_adapter *adapter);
48549b49cdaSZbigniew Bodek 
48649b49cdaSZbigniew Bodek /**
48749b49cdaSZbigniew Bodek  * enable the ec and mac interrupts
48849b49cdaSZbigniew Bodek  *
48949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
49049b49cdaSZbigniew Bodek  *
49149b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
49249b49cdaSZbigniew Bodek  */
49349b49cdaSZbigniew Bodek int al_eth_ec_mac_ints_config(struct al_hal_eth_adapter *adapter);
49449b49cdaSZbigniew Bodek 
49549b49cdaSZbigniew Bodek /**
49649b49cdaSZbigniew Bodek  * ec and mac interrupt service routine
49749b49cdaSZbigniew Bodek  * read and print asserted interrupts
49849b49cdaSZbigniew Bodek  *
49949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
50049b49cdaSZbigniew Bodek  *
50149b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
50249b49cdaSZbigniew Bodek  */
50349b49cdaSZbigniew Bodek int al_eth_ec_mac_isr(struct al_hal_eth_adapter *adapter);
50449b49cdaSZbigniew Bodek 
50549b49cdaSZbigniew Bodek /* Q management */
50649b49cdaSZbigniew Bodek /**
50749b49cdaSZbigniew Bodek  * Configure and enable a queue ring
50849b49cdaSZbigniew Bodek  *
50949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
51049b49cdaSZbigniew Bodek  * @param type tx or rx
51149b49cdaSZbigniew Bodek  * @param qid queue index
51249b49cdaSZbigniew Bodek  * @param q_params queue parameters
51349b49cdaSZbigniew Bodek  *
51449b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
51549b49cdaSZbigniew Bodek  */
51649b49cdaSZbigniew Bodek int al_eth_queue_config(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid,
51749b49cdaSZbigniew Bodek 			struct al_udma_q_params *q_params);
51849b49cdaSZbigniew Bodek 
51949b49cdaSZbigniew Bodek 
52049b49cdaSZbigniew Bodek /**
52149b49cdaSZbigniew Bodek  * enable a queue if it was previously disabled
52249b49cdaSZbigniew Bodek  *
52349b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
52449b49cdaSZbigniew Bodek  * @param type tx or rx
52549b49cdaSZbigniew Bodek  * @param qid queue index
52649b49cdaSZbigniew Bodek  *
52749b49cdaSZbigniew Bodek  * @return -EPERM (not implemented yet).
52849b49cdaSZbigniew Bodek  */
52949b49cdaSZbigniew Bodek int al_eth_queue_enable(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid);
53049b49cdaSZbigniew Bodek 
53149b49cdaSZbigniew Bodek /**
53249b49cdaSZbigniew Bodek  * disable a queue
53349b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
53449b49cdaSZbigniew Bodek  * @param type tx or rx
53549b49cdaSZbigniew Bodek  * @param qid queue index
53649b49cdaSZbigniew Bodek  *
53749b49cdaSZbigniew Bodek  * @return -EPERM (not implemented yet).
53849b49cdaSZbigniew Bodek  */
53949b49cdaSZbigniew Bodek int al_eth_queue_disable(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid);
54049b49cdaSZbigniew Bodek 
54149b49cdaSZbigniew Bodek /* MAC layer */
54249b49cdaSZbigniew Bodek 
54349b49cdaSZbigniew Bodek /**
54449b49cdaSZbigniew Bodek  * configure the mac media type.
54549b49cdaSZbigniew Bodek  * this function only sets the mode, but not the speed as certain mac modes
54649b49cdaSZbigniew Bodek  * support multiple speeds as will be negotiated by the link layer.
54749b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
54849b49cdaSZbigniew Bodek  * @param mode media mode
54949b49cdaSZbigniew Bodek  *
55049b49cdaSZbigniew Bodek  * @return 0 on success. negative errno on failure.
55149b49cdaSZbigniew Bodek  */
55249b49cdaSZbigniew Bodek int al_eth_mac_config(struct al_hal_eth_adapter *adapter, enum al_eth_mac_mode mode);
55349b49cdaSZbigniew Bodek 
55449b49cdaSZbigniew Bodek /**
55549b49cdaSZbigniew Bodek  * stop the mac tx and rx paths.
55649b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
55749b49cdaSZbigniew Bodek  *
55849b49cdaSZbigniew Bodek  * @return 0 on success. negative error on failure.
55949b49cdaSZbigniew Bodek  */
56049b49cdaSZbigniew Bodek int al_eth_mac_stop(struct al_hal_eth_adapter *adapter);
56149b49cdaSZbigniew Bodek 
56249b49cdaSZbigniew Bodek /**
56349b49cdaSZbigniew Bodek  * start the mac tx and rx paths.
56449b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
56549b49cdaSZbigniew Bodek  *
56649b49cdaSZbigniew Bodek  * @return 0 on success. negative error on failure.
56749b49cdaSZbigniew Bodek  */
56849b49cdaSZbigniew Bodek int al_eth_mac_start(struct al_hal_eth_adapter *adapter);
56949b49cdaSZbigniew Bodek 
570*3fc36ee0SWojciech Macek /**
571*3fc36ee0SWojciech Macek  * Perform gearbox reset for tx lanes And/Or Rx lanes.
572*3fc36ee0SWojciech Macek  * applicable only when the controller is connected to srds25G.
573*3fc36ee0SWojciech Macek  * This reset should be performed after each operation that changes the clocks
574*3fc36ee0SWojciech Macek  * (such as serdes reset, mac stop, etc.)
575*3fc36ee0SWojciech Macek  *
576*3fc36ee0SWojciech Macek  * @param adapter pointer to the private structure.
577*3fc36ee0SWojciech Macek  * @param tx_reset assert and de-assert reset for tx lanes
578*3fc36ee0SWojciech Macek  * @param rx_reset assert and de-assert reset for rx lanes
579*3fc36ee0SWojciech Macek  */
580*3fc36ee0SWojciech Macek void al_eth_gearbox_reset(struct al_hal_eth_adapter *adapter, al_bool tx_reset, al_bool rx_reset);
581*3fc36ee0SWojciech Macek 
582*3fc36ee0SWojciech Macek /**
583*3fc36ee0SWojciech Macek  * Enable / Disable forward error correction (FEC)
584*3fc36ee0SWojciech Macek  *
585*3fc36ee0SWojciech Macek  * @param adapter pointer to the private structure.
586*3fc36ee0SWojciech Macek  * @param enable true to enable FEC. false to disable FEC.
587*3fc36ee0SWojciech Macek  *
588*3fc36ee0SWojciech Macek  * @return 0 on success. negative error on failure.
589*3fc36ee0SWojciech Macek  */
590*3fc36ee0SWojciech Macek int al_eth_fec_enable(struct al_hal_eth_adapter *adapter, al_bool enable);
591*3fc36ee0SWojciech Macek 
592*3fc36ee0SWojciech Macek /**
593*3fc36ee0SWojciech Macek  * Get forward error correction (FEC) statistics
594*3fc36ee0SWojciech Macek  *
595*3fc36ee0SWojciech Macek  * @param adapter pointer to the private structure.
596*3fc36ee0SWojciech Macek  * @param corrected number of bits been corrected by the FEC
597*3fc36ee0SWojciech Macek  * @param uncorrectable number of bits that FEC couldn't correct.
598*3fc36ee0SWojciech Macek  *
599*3fc36ee0SWojciech Macek  * @return 0 on success. negative error on failure.
600*3fc36ee0SWojciech Macek  */
601*3fc36ee0SWojciech Macek int al_eth_fec_stats_get(struct al_hal_eth_adapter *adapter,
602*3fc36ee0SWojciech Macek 			uint32_t *corrected, uint32_t *uncorrectable);
60349b49cdaSZbigniew Bodek 
60449b49cdaSZbigniew Bodek /**
60549b49cdaSZbigniew Bodek  * get the adapter capabilities (speed, duplex,..)
60649b49cdaSZbigniew Bodek  * this function must not be called before configuring the mac mode using al_eth_mac_config()
60749b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
60849b49cdaSZbigniew Bodek  * @param caps pointer to structure that will be updated by this function
60949b49cdaSZbigniew Bodek  *
61049b49cdaSZbigniew Bodek  * @return 0 on success. negative errno on failure.
61149b49cdaSZbigniew Bodek  */
61249b49cdaSZbigniew Bodek int al_eth_capabilities_get(struct al_hal_eth_adapter *adapter, struct al_eth_capabilities *caps);
61349b49cdaSZbigniew Bodek 
61449b49cdaSZbigniew Bodek /**
61549b49cdaSZbigniew Bodek  * update link auto negotiation speed and duplex mode
61649b49cdaSZbigniew Bodek  * this function assumes the mac mode already set using the al_eth_mac_config()
61749b49cdaSZbigniew Bodek  * function.
61849b49cdaSZbigniew Bodek  *
61949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
62049b49cdaSZbigniew Bodek  * @param force_1000_base_x set to AL_TRUE to force the mac to work on 1000baseX
62149b49cdaSZbigniew Bodek  *	  (not relevant to RGMII)
62249b49cdaSZbigniew Bodek  * @param an_enable set to AL_TRUE to enable auto negotiation
62349b49cdaSZbigniew Bodek  *	  (not relevant to RGMII)
62449b49cdaSZbigniew Bodek  * @param speed in mega bits, e.g 1000 stands for 1Gbps (relevant only in case
62549b49cdaSZbigniew Bodek  *	  an_enable is AL_FALSE)
62649b49cdaSZbigniew Bodek  * @param full_duplex set to AL_TRUE to enable full duplex mode (relevant only
62749b49cdaSZbigniew Bodek  *	  in case an_enable is AL_FALSE)
62849b49cdaSZbigniew Bodek  *
62949b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
63049b49cdaSZbigniew Bodek  */
63149b49cdaSZbigniew Bodek int al_eth_mac_link_config(struct al_hal_eth_adapter *adapter,
63249b49cdaSZbigniew Bodek 			   al_bool force_1000_base_x,
63349b49cdaSZbigniew Bodek 			   al_bool an_enable,
63449b49cdaSZbigniew Bodek 			   uint32_t speed,
63549b49cdaSZbigniew Bodek 			   al_bool full_duplex);
63649b49cdaSZbigniew Bodek /**
63749b49cdaSZbigniew Bodek  * Enable/Disable Loopback mode
63849b49cdaSZbigniew Bodek  *
63949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
64049b49cdaSZbigniew Bodek  * @param enable set to AL_TRUE to enable full duplex mode
64149b49cdaSZbigniew Bodek  *
64249b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
64349b49cdaSZbigniew Bodek  */
64449b49cdaSZbigniew Bodek int al_eth_mac_loopback_config(struct al_hal_eth_adapter *adapter, int enable);
64549b49cdaSZbigniew Bodek 
64649b49cdaSZbigniew Bodek /**
64749b49cdaSZbigniew Bodek  * configure minimum and maximum rx packet length
64849b49cdaSZbigniew Bodek  *
64949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
65049b49cdaSZbigniew Bodek  * @param min_rx_len minimum rx packet length
65149b49cdaSZbigniew Bodek  * @param max_rx_len maximum rx packet length
65249b49cdaSZbigniew Bodek  * both length limits in bytes and it includes the MAC Layer header and FCS.
65349b49cdaSZbigniew Bodek  * @return 0 on success, otherwise on failure.
65449b49cdaSZbigniew Bodek  */
65549b49cdaSZbigniew Bodek int al_eth_rx_pkt_limit_config(struct al_hal_eth_adapter *adapter, uint32_t min_rx_len, uint32_t max_rx_len);
65649b49cdaSZbigniew Bodek 
65749b49cdaSZbigniew Bodek 
65849b49cdaSZbigniew Bodek /* MDIO */
65949b49cdaSZbigniew Bodek 
66049b49cdaSZbigniew Bodek /* Reference clock frequency (platform specific) */
66149b49cdaSZbigniew Bodek enum al_eth_ref_clk_freq {
66249b49cdaSZbigniew Bodek 	AL_ETH_REF_FREQ_375_MHZ		= 0,
66349b49cdaSZbigniew Bodek 	AL_ETH_REF_FREQ_187_5_MHZ	= 1,
66449b49cdaSZbigniew Bodek 	AL_ETH_REF_FREQ_250_MHZ		= 2,
66549b49cdaSZbigniew Bodek 	AL_ETH_REF_FREQ_500_MHZ		= 3,
66649b49cdaSZbigniew Bodek 	AL_ETH_REF_FREQ_428_MHZ         = 4,
66749b49cdaSZbigniew Bodek };
66849b49cdaSZbigniew Bodek 
66949b49cdaSZbigniew Bodek /**
67049b49cdaSZbigniew Bodek  * configure the MDIO hardware interface
67149b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
67249b49cdaSZbigniew Bodek  * @param mdio_type clause type
67349b49cdaSZbigniew Bodek  * @param shared_mdio_if set to AL_TRUE if multiple controllers using the same
67449b49cdaSZbigniew Bodek  * @param ref_clk_freq reference clock frequency
67549b49cdaSZbigniew Bodek  * @param mdio_clk_freq_khz the required MDC/MDIO clock frequency [Khz]
67649b49cdaSZbigniew Bodek  * MDIO pins of the chip.
67749b49cdaSZbigniew Bodek  *
67849b49cdaSZbigniew Bodek  * @return 0 on success, otherwise on failure.
67949b49cdaSZbigniew Bodek  */
68049b49cdaSZbigniew Bodek int al_eth_mdio_config(struct al_hal_eth_adapter *adapter,
68149b49cdaSZbigniew Bodek 		       enum al_eth_mdio_type mdio_type,
68249b49cdaSZbigniew Bodek 		       al_bool shared_mdio_if,
68349b49cdaSZbigniew Bodek 		       enum al_eth_ref_clk_freq ref_clk_freq,
68449b49cdaSZbigniew Bodek 		       unsigned int mdio_clk_freq_khz);
68549b49cdaSZbigniew Bodek 
68649b49cdaSZbigniew Bodek /**
68749b49cdaSZbigniew Bodek  * read mdio register
68849b49cdaSZbigniew Bodek  * this function uses polling mode, and as the mdio is slow interface, it might
68949b49cdaSZbigniew Bodek  * block the cpu for long time (milliseconds).
69049b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
69149b49cdaSZbigniew Bodek  * @param phy_addr address of mdio phy
69249b49cdaSZbigniew Bodek  * @param device address of mdio device (used only in CLAUSE 45)
69349b49cdaSZbigniew Bodek  * @param reg index of the register
69449b49cdaSZbigniew Bodek  * @param val pointer for read value of the register
69549b49cdaSZbigniew Bodek  *
69649b49cdaSZbigniew Bodek  * @return 0 on success, negative errno on failure
69749b49cdaSZbigniew Bodek  */
69849b49cdaSZbigniew Bodek int al_eth_mdio_read(struct al_hal_eth_adapter *adapter, uint32_t phy_addr,
69949b49cdaSZbigniew Bodek 		     uint32_t device, uint32_t reg, uint16_t *val);
70049b49cdaSZbigniew Bodek 
70149b49cdaSZbigniew Bodek /**
70249b49cdaSZbigniew Bodek  * write mdio register
70349b49cdaSZbigniew Bodek  * this function uses polling mode, and as the mdio is slow interface, it might
70449b49cdaSZbigniew Bodek  * block the cpu for long time (milliseconds).
70549b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
70649b49cdaSZbigniew Bodek  * @param phy_addr address of mdio phy
70749b49cdaSZbigniew Bodek  * @param device address of mdio device (used only in CLAUSE 45)
70849b49cdaSZbigniew Bodek  * @param reg index of the register
70949b49cdaSZbigniew Bodek  * @param val value to write
71049b49cdaSZbigniew Bodek  *
71149b49cdaSZbigniew Bodek  * @return 0 on success, negative errno on failure
71249b49cdaSZbigniew Bodek  */
71349b49cdaSZbigniew Bodek int al_eth_mdio_write(struct al_hal_eth_adapter *adapter, uint32_t phy_addr,
71449b49cdaSZbigniew Bodek 		      uint32_t device, uint32_t reg, uint16_t val);
71549b49cdaSZbigniew Bodek 
71649b49cdaSZbigniew Bodek /* TX */
71749b49cdaSZbigniew Bodek /**
71849b49cdaSZbigniew Bodek  * get number of free tx descriptors
71949b49cdaSZbigniew Bodek  *
72049b49cdaSZbigniew Bodek  * @param adapter adapter handle
72149b49cdaSZbigniew Bodek  * @param qid queue index
72249b49cdaSZbigniew Bodek  *
72349b49cdaSZbigniew Bodek  * @return num of free descriptors.
72449b49cdaSZbigniew Bodek  */
al_eth_tx_available_get(struct al_hal_eth_adapter * adapter,uint32_t qid)72549b49cdaSZbigniew Bodek static INLINE uint32_t al_eth_tx_available_get(struct al_hal_eth_adapter *adapter,
72649b49cdaSZbigniew Bodek 					       uint32_t qid)
72749b49cdaSZbigniew Bodek {
72849b49cdaSZbigniew Bodek 	struct al_udma_q *udma_q;
72949b49cdaSZbigniew Bodek 
73049b49cdaSZbigniew Bodek 	al_udma_q_handle_get(&adapter->tx_udma, qid, &udma_q);
73149b49cdaSZbigniew Bodek 
73249b49cdaSZbigniew Bodek 	return al_udma_available_get(udma_q);
73349b49cdaSZbigniew Bodek }
73449b49cdaSZbigniew Bodek 
73549b49cdaSZbigniew Bodek /**
73649b49cdaSZbigniew Bodek  * prepare packet descriptors in tx queue.
73749b49cdaSZbigniew Bodek  *
73849b49cdaSZbigniew Bodek  * This functions prepares the descriptors for the given packet in the tx
73949b49cdaSZbigniew Bodek  * submission ring. the caller must call al_eth_tx_pkt_action() below
74049b49cdaSZbigniew Bodek  * in order to notify the hardware about the new descriptors.
74149b49cdaSZbigniew Bodek  *
74249b49cdaSZbigniew Bodek  * @param tx_dma_q pointer to UDMA tx queue
74349b49cdaSZbigniew Bodek  * @param pkt the packet to transmit
74449b49cdaSZbigniew Bodek  *
74549b49cdaSZbigniew Bodek  * @return number of descriptors used for this packet, 0 if no free
74649b49cdaSZbigniew Bodek  * room in the descriptors ring
74749b49cdaSZbigniew Bodek  */
74849b49cdaSZbigniew Bodek int al_eth_tx_pkt_prepare(struct al_udma_q *tx_dma_q, struct al_eth_pkt *pkt);
74949b49cdaSZbigniew Bodek 
75049b49cdaSZbigniew Bodek 
75149b49cdaSZbigniew Bodek /**
75249b49cdaSZbigniew Bodek  * Trigger the DMA about previously added tx descriptors.
75349b49cdaSZbigniew Bodek  *
75449b49cdaSZbigniew Bodek  * @param tx_dma_q pointer to UDMA tx queue
75549b49cdaSZbigniew Bodek  * @param tx_descs number of descriptors to notify the DMA about.
75649b49cdaSZbigniew Bodek  * the tx_descs can be sum of descriptor numbers of multiple prepared packets,
75749b49cdaSZbigniew Bodek  * this way the caller can use this function to notify the DMA about multiple
75849b49cdaSZbigniew Bodek  * packets.
75949b49cdaSZbigniew Bodek  */
76049b49cdaSZbigniew Bodek void al_eth_tx_dma_action(struct al_udma_q *tx_dma_q, uint32_t tx_descs);
76149b49cdaSZbigniew Bodek 
76249b49cdaSZbigniew Bodek /**
76349b49cdaSZbigniew Bodek  * get number of completed tx descriptors, upper layer should derive from
76449b49cdaSZbigniew Bodek  * this information which packets were completed.
76549b49cdaSZbigniew Bodek  *
76649b49cdaSZbigniew Bodek  * @param tx_dma_q pointer to UDMA tx queue
76749b49cdaSZbigniew Bodek  *
76849b49cdaSZbigniew Bodek  * @return number of completed tx descriptors.
76949b49cdaSZbigniew Bodek  */
77049b49cdaSZbigniew Bodek int al_eth_comp_tx_get(struct al_udma_q *tx_dma_q);
77149b49cdaSZbigniew Bodek 
77249b49cdaSZbigniew Bodek /**
77349b49cdaSZbigniew Bodek  * configure a TSO MSS val
77449b49cdaSZbigniew Bodek  *
77549b49cdaSZbigniew Bodek  * the TSO MSS vals are preconfigured values for MSS stored in hardware and the
77649b49cdaSZbigniew Bodek  * packet could use them when not working in MSS explicit mode.
77749b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
77849b49cdaSZbigniew Bodek  * @param idx the mss index
77949b49cdaSZbigniew Bodek  * @param mss_val the MSS value
78049b49cdaSZbigniew Bodek  *
78149b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
78249b49cdaSZbigniew Bodek  */
78349b49cdaSZbigniew Bodek int al_eth_tso_mss_config(struct al_hal_eth_adapter *adapter, uint8_t idx, uint32_t mss_val);
78449b49cdaSZbigniew Bodek 
78549b49cdaSZbigniew Bodek /* RX */
78649b49cdaSZbigniew Bodek /**
78749b49cdaSZbigniew Bodek  * Config the RX descriptor fields
78849b49cdaSZbigniew Bodek  *
78949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
79049b49cdaSZbigniew Bodek  * @param lro_sel select LRO context or l4 offset
79149b49cdaSZbigniew Bodek  * @param l4_offset_sel select l4 offset source
79249b49cdaSZbigniew Bodek  * @param l4_sel  select the l4 checksum result
79349b49cdaSZbigniew Bodek  * @param l3_sel  select the l3 checksum result
79449b49cdaSZbigniew Bodek  * @param l3_proto_sel select the l3 protocol index source
79549b49cdaSZbigniew Bodek  * @param l4_proto_sel select the l4 protocol index source
79649b49cdaSZbigniew Bodek  * @param frag_sel select the frag indication source
79749b49cdaSZbigniew Bodek  */
79849b49cdaSZbigniew Bodek void al_eth_rx_desc_config(
79949b49cdaSZbigniew Bodek 			struct al_hal_eth_adapter *adapter,
80049b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_lro_context_val_res lro_sel,
80149b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l4_offset_sel l4_offset_sel,
80249b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l3_offset_sel l3_offset_sel,
80349b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l4_chk_res_sel l4_sel,
80449b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l3_chk_res_sel l3_sel,
80549b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l3_proto_idx_sel l3_proto_sel,
80649b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l4_proto_idx_sel l4_proto_sel,
80749b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_frag_sel frag_sel);
80849b49cdaSZbigniew Bodek 
80949b49cdaSZbigniew Bodek /**
81049b49cdaSZbigniew Bodek  * Configure RX header split
81149b49cdaSZbigniew Bodek  *
81249b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
81349b49cdaSZbigniew Bodek  * @param enable header split when AL_TRUE
81449b49cdaSZbigniew Bodek  * @param header_split_len length in bytes of the header split, this value used when
81549b49cdaSZbigniew Bodek  * CTRL TABLE header split len select is set to
81649b49cdaSZbigniew Bodek  * AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_REG, in this case the controller will
81749b49cdaSZbigniew Bodek  * store the first header_split_len bytes into buf2, then the rest (if any) into buf1.
81849b49cdaSZbigniew Bodek  * when CTRL_TABLE header split len select set to other value, then the header_len
81949b49cdaSZbigniew Bodek  * determined according to the parser, and the header_split_len parameter is not
82049b49cdaSZbigniew Bodek  * used.
82149b49cdaSZbigniew Bodek  *
82249b49cdaSZbigniew Bodek  * return 0 on success. otherwise on failure.
82349b49cdaSZbigniew Bodek  */
82449b49cdaSZbigniew Bodek int al_eth_rx_header_split_config(struct al_hal_eth_adapter *adapter, al_bool enable, uint32_t header_len);
82549b49cdaSZbigniew Bodek 
82649b49cdaSZbigniew Bodek /**
82749b49cdaSZbigniew Bodek  * enable / disable header split in the udma queue.
82849b49cdaSZbigniew Bodek  * length will be taken from the udma configuration to enable different length per queue.
82949b49cdaSZbigniew Bodek  *
83049b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
83149b49cdaSZbigniew Bodek  * @param enable header split when AL_TRUE
83249b49cdaSZbigniew Bodek  * @param qid the queue id to enable/disable header split
83349b49cdaSZbigniew Bodek  * @param header_len in what len the udma will cut the header
83449b49cdaSZbigniew Bodek  *
83549b49cdaSZbigniew Bodek  * return 0 on success.
83649b49cdaSZbigniew Bodek  */
83749b49cdaSZbigniew Bodek int al_eth_rx_header_split_force_len_config(struct al_hal_eth_adapter *adapter,
83849b49cdaSZbigniew Bodek 					al_bool enable,
83949b49cdaSZbigniew Bodek 					uint32_t qid,
84049b49cdaSZbigniew Bodek 					uint32_t header_len);
84149b49cdaSZbigniew Bodek 
84249b49cdaSZbigniew Bodek /**
84349b49cdaSZbigniew Bodek  * add buffer to receive queue
84449b49cdaSZbigniew Bodek  *
84549b49cdaSZbigniew Bodek  * @param rx_dma_q pointer to UDMA rx queue
84649b49cdaSZbigniew Bodek  * @param buf pointer to data buffer
84749b49cdaSZbigniew Bodek  * @param flags bitwise of AL_ETH_RX_FLAGS
84849b49cdaSZbigniew Bodek  * @param header_buf this is not used for far and header_buf should be set to
84949b49cdaSZbigniew Bodek  * NULL.
85049b49cdaSZbigniew Bodek  *
85149b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
85249b49cdaSZbigniew Bodek  */
85349b49cdaSZbigniew Bodek int al_eth_rx_buffer_add(struct al_udma_q *rx_dma_q,
85449b49cdaSZbigniew Bodek 			      struct al_buf *buf, uint32_t flags,
85549b49cdaSZbigniew Bodek 			      struct al_buf *header_buf);
85649b49cdaSZbigniew Bodek 
85749b49cdaSZbigniew Bodek /**
85849b49cdaSZbigniew Bodek  * notify the hw engine about rx descriptors that were added to the receive queue
85949b49cdaSZbigniew Bodek  *
86049b49cdaSZbigniew Bodek  * @param rx_dma_q pointer to UDMA rx queue
86149b49cdaSZbigniew Bodek  * @param descs_num number of rx descriptors
86249b49cdaSZbigniew Bodek  */
86349b49cdaSZbigniew Bodek void al_eth_rx_buffer_action(struct al_udma_q *rx_dma_q,
86449b49cdaSZbigniew Bodek 				uint32_t descs_num);
86549b49cdaSZbigniew Bodek 
86649b49cdaSZbigniew Bodek /**
86749b49cdaSZbigniew Bodek  * get packet from RX completion ring
86849b49cdaSZbigniew Bodek  *
86949b49cdaSZbigniew Bodek  * @param rx_dma_q pointer to UDMA rx queue
87049b49cdaSZbigniew Bodek  * @param pkt pointer to a packet data structure, this function fills this
87149b49cdaSZbigniew Bodek  * structure with the information about the received packet. the buffers
87249b49cdaSZbigniew Bodek  * structures filled only with the length of the data written into the buffer,
87349b49cdaSZbigniew Bodek  * the address fields are not updated as the upper layer can retrieve this
87449b49cdaSZbigniew Bodek  * information by itself because the hardware uses the buffers in the same order
87549b49cdaSZbigniew Bodek  * were those buffers inserted into the ring of the receive queue.
87649b49cdaSZbigniew Bodek  * this structure should be allocated by the caller function.
87749b49cdaSZbigniew Bodek  *
87849b49cdaSZbigniew Bodek  * @return return number of descriptors or 0 if no completed packet found.
87949b49cdaSZbigniew Bodek  */
88049b49cdaSZbigniew Bodek  uint32_t al_eth_pkt_rx(struct al_udma_q *rx_dma_q, struct al_eth_pkt *pkt);
88149b49cdaSZbigniew Bodek 
88249b49cdaSZbigniew Bodek 
88349b49cdaSZbigniew Bodek /* RX parser table */
88449b49cdaSZbigniew Bodek struct al_eth_epe_p_reg_entry {
88549b49cdaSZbigniew Bodek 	uint32_t data;
88649b49cdaSZbigniew Bodek 	uint32_t mask;
88749b49cdaSZbigniew Bodek 	uint32_t ctrl;
88849b49cdaSZbigniew Bodek };
88949b49cdaSZbigniew Bodek 
89049b49cdaSZbigniew Bodek struct al_eth_epe_control_entry {
89149b49cdaSZbigniew Bodek 	uint32_t data[6];
89249b49cdaSZbigniew Bodek };
89349b49cdaSZbigniew Bodek 
89449b49cdaSZbigniew Bodek /**
89549b49cdaSZbigniew Bodek  * update rx parser entry
89649b49cdaSZbigniew Bodek  *
89749b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
89849b49cdaSZbigniew Bodek  * @param idx the protocol index to update
89949b49cdaSZbigniew Bodek  * @param reg_entry contents of parser register entry
90049b49cdaSZbigniew Bodek  * @param control entry contents of control table entry
90149b49cdaSZbigniew Bodek  *
90249b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
90349b49cdaSZbigniew Bodek  */
90449b49cdaSZbigniew Bodek int al_eth_rx_parser_entry_update(struct al_hal_eth_adapter *adapter, uint32_t idx,
90549b49cdaSZbigniew Bodek 		struct al_eth_epe_p_reg_entry *reg_entry,
90649b49cdaSZbigniew Bodek 		struct al_eth_epe_control_entry *control_entry);
90749b49cdaSZbigniew Bodek 
90849b49cdaSZbigniew Bodek /* Flow Steering and filtering */
90949b49cdaSZbigniew Bodek int al_eth_thash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma, uint32_t queue);
91049b49cdaSZbigniew Bodek 
91149b49cdaSZbigniew Bodek /* FSM table bits */
91249b49cdaSZbigniew Bodek /** FSM table has 7 bits input address:
91349b49cdaSZbigniew Bodek  *  bits[2:0] are the outer packet's type (IPv4, TCP...)
91449b49cdaSZbigniew Bodek  *  bits[5:3] are the inner packet's type
91549b49cdaSZbigniew Bodek  *  bit[6] is set when packet is tunneled.
91649b49cdaSZbigniew Bodek  *
91749b49cdaSZbigniew Bodek  * The output of each entry:
91849b49cdaSZbigniew Bodek  *  bits[1:0] - input selection: selects the input for the thash (2/4 tuple, inner/outer)
91949b49cdaSZbigniew Bodek  *  bit[2] - selects whether to use thash output, or default values for the queue and udma
92049b49cdaSZbigniew Bodek  *  bits[6:3] default UDMA mask: the UDMAs to select when bit 2 above was unset
92149b49cdaSZbigniew Bodek  *  bits[9:5] defualt queue: the queue index to select when bit 2 above was unset
92249b49cdaSZbigniew Bodek  */
92349b49cdaSZbigniew Bodek 
92449b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV4_TCP	   0
92549b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV4_UDP	   1
92649b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV6_TCP	   2
92749b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV6_UDP	   3
92849b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV6_NO_UDP_TCP   4
92949b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV4_NO_UDP_TCP   5
93049b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV4_FRAGMENTED   6
93149b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_NOT_IP		   7
93249b49cdaSZbigniew Bodek 
93349b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_OUTER(idx)	   ((idx) & 7)
93449b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_INNER(idx)	   (((idx) >> 3) & 7)
93549b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_TUNNELED(idx)	   (((idx) >> 6) & 1)
93649b49cdaSZbigniew Bodek 
93749b49cdaSZbigniew Bodek /* FSM DATA format */
93849b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_OUTER_2_TUPLE	0
93949b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_OUTER_4_TUPLE	1
94049b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_INNER_2_TUPLE	2
94149b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_INNER_4_TUPLE	3
94249b49cdaSZbigniew Bodek 
94349b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_HASH_SEL	(1 << 2)
94449b49cdaSZbigniew Bodek 
94549b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_DEFAULT_Q_SHIFT		5
94649b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_DEFAULT_UDMA_SHIFT	3
94749b49cdaSZbigniew Bodek 
94849b49cdaSZbigniew Bodek /* set fsm table entry */
94949b49cdaSZbigniew Bodek int al_eth_fsm_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry);
95049b49cdaSZbigniew Bodek 
95149b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT {
95249b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_0 = 0,
95349b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_1 = 1,
95449b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_ANY = 2,
95549b49cdaSZbigniew Bodek };
95649b49cdaSZbigniew Bodek 
95749b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_TUNNEL {
95849b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_TUNNEL_NOT_EXIST = 0,
95949b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_TUNNEL_EXIST = 1,
96049b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_TUNNEL_ANY = 2,
96149b49cdaSZbigniew Bodek };
96249b49cdaSZbigniew Bodek 
96349b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_VLAN {
96449b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_VLAN_NOT_EXIST = 0,
96549b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_VLAN_EXIST = 1,
96649b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_VLAN_ANY = 2,
96749b49cdaSZbigniew Bodek };
96849b49cdaSZbigniew Bodek 
96949b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_MAC_TABLE {
97049b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_TABLE_NO_MATCH = 0,
97149b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_TABLE_MATCH = 1,
97249b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_TABLE_ANY = 2,
97349b49cdaSZbigniew Bodek };
97449b49cdaSZbigniew Bodek 
97549b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE {
97649b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_UC = 0, /**< unicast */
97749b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_MC = 1, /**< multicast */
97849b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_BC = 2, /**< broadcast */
97949b49cdaSZbigniew Bodek 	AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_ANY = 4, /**< for sw usage */
98049b49cdaSZbigniew Bodek };
98149b49cdaSZbigniew Bodek 
98249b49cdaSZbigniew Bodek /**
98349b49cdaSZbigniew Bodek  * This structure defines the index or group of indeces within the control table.
98449b49cdaSZbigniew Bodek  * each field has special enum value (with _ANY postfix) that indicates all
98549b49cdaSZbigniew Bodek  * possible values of that field.
98649b49cdaSZbigniew Bodek  */
98749b49cdaSZbigniew Bodek struct al_eth_fwd_ctrl_table_index {
98849b49cdaSZbigniew Bodek 	enum AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT	vlan_table_out;
98949b49cdaSZbigniew Bodek 	enum AL_ETH_FWD_CTRL_IDX_TUNNEL tunnel_exist;
99049b49cdaSZbigniew Bodek 	enum AL_ETH_FWD_CTRL_IDX_VLAN vlan_exist;
99149b49cdaSZbigniew Bodek 	enum AL_ETH_FWD_CTRL_IDX_MAC_TABLE mac_table_match;
99249b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID		protocol_id;
99349b49cdaSZbigniew Bodek 	enum AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE mac_type;
99449b49cdaSZbigniew Bodek };
99549b49cdaSZbigniew Bodek 
99649b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_PRIO_SEL {
99749b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_PBITS_TABLE	= 0,
99849b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_DSCP_TABLE	= 1,
99949b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_TC_TABLE	= 2,
100049b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG1		= 3,
100149b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG2		= 4,
100249b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG3		= 5,
100349b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG4		= 6,
100449b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG5		= 7,
100549b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG6		= 7,
100649b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG7		= 9,
100749b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_REG8		= 10,
100849b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_VAL_3	= 11,
100949b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_PRIO_SEL_VAL_0	= 12,
101049b49cdaSZbigniew Bodek };
101149b49cdaSZbigniew Bodek /** where to select the initial queue from */
101249b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_QUEUE_SEL_1 {
101349b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_PRIO_TABLE	= 0,
101449b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_THASH_TABLE	= 1,
101549b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_MAC_TABLE		= 2,
101649b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_MHASH_TABLE	= 3,
101749b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG1		= 4,
101849b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG2		= 5,
101949b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG3		= 6,
102049b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG4		= 7,
102149b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_VAL_3		= 12,
102249b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_1_VAL_0		= 13,
102349b49cdaSZbigniew Bodek };
102449b49cdaSZbigniew Bodek 
102549b49cdaSZbigniew Bodek /** target queue will be built up from the priority and initial queue */
102649b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_QUEUE_SEL_2 {
102749b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_2_PRIO_TABLE	= 0, /**< target queue is the output of priority table */
102849b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_2_PRIO		= 1, /**< target queue is the priority */
102949b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_2_PRIO_QUEUE	= 2, /**< target queue is initial queue[0], priority[1] */
103049b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_QUEUE_SEL_2_NO_PRIO		= 3, /**< target queue is the initial */
103149b49cdaSZbigniew Bodek };
103249b49cdaSZbigniew Bodek 
103349b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_UDMA_SEL {
103449b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_THASH_TABLE		= 0,
103549b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_THASH_AND_VLAN	= 1,
103649b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_VLAN_TABLE		= 2,
103749b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_VLAN_AND_MAC		= 3,
103849b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_MAC_TABLE		= 4,
103949b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_MAC_AND_MHASH	= 5,
104049b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_MHASH_TABLE		= 6,
104149b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG1			= 7,
104249b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG2			= 8,
104349b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG3			= 9,
104449b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG4			= 10,
104549b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG5			= 11,
104649b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG6			= 12,
104749b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG7			= 13,
104849b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_REG8			= 14,
104949b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_UDMA_SEL_VAL_0		= 15,
105049b49cdaSZbigniew Bodek };
105149b49cdaSZbigniew Bodek 
105249b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL {
105349b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_0		= 0,
105449b49cdaSZbigniew 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())*/
105549b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_OUTER_L3_OFFSET = 2,
105649b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_OUTER_L4_OFFSET = 3,
105749b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_TUNNEL_START_OFFSET = 4,
105849b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_INNER_L3_OFFSET = 5,
105949b49cdaSZbigniew Bodek 	AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_INNER_L4_OFFSET = 6,
106049b49cdaSZbigniew Bodek };
106149b49cdaSZbigniew Bodek 
106249b49cdaSZbigniew Bodek struct al_eth_fwd_ctrl_table_entry {
106349b49cdaSZbigniew Bodek 	enum AL_ETH_CTRL_TABLE_PRIO_SEL		prio_sel;
106449b49cdaSZbigniew Bodek 	enum AL_ETH_CTRL_TABLE_QUEUE_SEL_1	queue_sel_1; /**< queue id source */
106549b49cdaSZbigniew Bodek 	enum AL_ETH_CTRL_TABLE_QUEUE_SEL_2	queue_sel_2; /**< mix queue id with priority */
106649b49cdaSZbigniew Bodek 	enum AL_ETH_CTRL_TABLE_UDMA_SEL		udma_sel;
106749b49cdaSZbigniew Bodek 	enum AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL hdr_split_len_sel;
106849b49cdaSZbigniew Bodek 	al_bool 	filter; /**< set to AL_TRUE to enable filtering */
106949b49cdaSZbigniew Bodek };
107049b49cdaSZbigniew Bodek /**
107149b49cdaSZbigniew Bodek  * Configure default control table entry
107249b49cdaSZbigniew Bodek  *
107349b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
107449b49cdaSZbigniew Bodek  * @param use_table set to AL_TRUE if control table is used, when set to AL_FALSE
107549b49cdaSZbigniew Bodek  * then control table will be bypassed and the entry value will be used.
107649b49cdaSZbigniew Bodek  * @param entry defines the value to be used when bypassing control table.
107749b49cdaSZbigniew Bodek  *
107849b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
107949b49cdaSZbigniew Bodek  */
108049b49cdaSZbigniew Bodek int al_eth_ctrl_table_def_set(struct al_hal_eth_adapter *adapter,
108149b49cdaSZbigniew Bodek 			      al_bool use_table,
108249b49cdaSZbigniew Bodek 			      struct al_eth_fwd_ctrl_table_entry *entry);
108349b49cdaSZbigniew Bodek 
108449b49cdaSZbigniew Bodek /**
108549b49cdaSZbigniew Bodek  * Configure control table entry
108649b49cdaSZbigniew Bodek  *
108749b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
108849b49cdaSZbigniew Bodek  * @param index the entry index within the control table.
108949b49cdaSZbigniew Bodek  * @param entry the value to write to the control table entry
109049b49cdaSZbigniew Bodek  *
109149b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
109249b49cdaSZbigniew Bodek  */
109349b49cdaSZbigniew Bodek int al_eth_ctrl_table_set(struct al_hal_eth_adapter *adapter,
109449b49cdaSZbigniew Bodek 			  struct al_eth_fwd_ctrl_table_index *index,
109549b49cdaSZbigniew Bodek 			  struct al_eth_fwd_ctrl_table_entry *entry);
109649b49cdaSZbigniew Bodek 
109749b49cdaSZbigniew Bodek int al_eth_ctrl_table_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry);
109849b49cdaSZbigniew Bodek int al_eth_ctrl_table_def_raw_set(struct al_hal_eth_adapter *adapter, uint32_t val);
109949b49cdaSZbigniew Bodek 
110049b49cdaSZbigniew Bodek /**
110149b49cdaSZbigniew Bodek  * Configure hash key initial registers
110249b49cdaSZbigniew Bodek  * Those registers define the initial key values, those values used for
110349b49cdaSZbigniew Bodek  * the THASH and MHASH hash functions.
110449b49cdaSZbigniew Bodek  *
110549b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
110649b49cdaSZbigniew Bodek  * @param idx the register index
110749b49cdaSZbigniew Bodek  * @param val the register value
110849b49cdaSZbigniew Bodek  *
110949b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
111049b49cdaSZbigniew Bodek  */
111149b49cdaSZbigniew Bodek int al_eth_hash_key_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t val);
111249b49cdaSZbigniew Bodek 
111349b49cdaSZbigniew Bodek struct al_eth_fwd_mac_table_entry {
111449b49cdaSZbigniew Bodek 	uint8_t		addr[6]; /**< byte 0 is the first byte seen on the wire */
111549b49cdaSZbigniew Bodek 	uint8_t		mask[6];
111649b49cdaSZbigniew Bodek 	al_bool		tx_valid;
111749b49cdaSZbigniew Bodek 	uint8_t		tx_target;
111849b49cdaSZbigniew Bodek 	al_bool		rx_valid;
111949b49cdaSZbigniew Bodek 	uint8_t		udma_mask; /**< target udma */
112049b49cdaSZbigniew Bodek 	uint8_t		qid; /**< target queue */
112149b49cdaSZbigniew Bodek 	al_bool		filter; /**< set to AL_TRUE to enable filtering */
112249b49cdaSZbigniew Bodek };
112349b49cdaSZbigniew Bodek 
112449b49cdaSZbigniew Bodek /**
112549b49cdaSZbigniew Bodek  * Configure mac table entry
112649b49cdaSZbigniew Bodek  * The HW traverse this table and looks for match from lowest index,
112749b49cdaSZbigniew Bodek  * when the packets MAC DA & mask == addr, and the valid bit is set, then match occurs.
112849b49cdaSZbigniew Bodek  *
112949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
113049b49cdaSZbigniew Bodek  * @param idx the entry index within the mac table.
113149b49cdaSZbigniew Bodek  * @param entry the contents of the MAC table entry
113249b49cdaSZbigniew Bodek  *
113349b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
113449b49cdaSZbigniew Bodek  */
113549b49cdaSZbigniew Bodek int al_eth_fwd_mac_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
113649b49cdaSZbigniew Bodek 				struct al_eth_fwd_mac_table_entry *entry);
113749b49cdaSZbigniew Bodek 
113849b49cdaSZbigniew Bodek int al_eth_fwd_mac_addr_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
113949b49cdaSZbigniew Bodek 				uint32_t addr_lo, uint32_t addr_hi, uint32_t mask_lo, uint32_t mask_hi);
114049b49cdaSZbigniew Bodek int al_eth_fwd_mac_ctrl_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t ctrl);
114149b49cdaSZbigniew Bodek 
114249b49cdaSZbigniew Bodek int al_eth_mac_addr_store(void * __iomem ec_base, uint32_t idx, uint8_t *addr);
114349b49cdaSZbigniew Bodek int al_eth_mac_addr_read(void * __iomem ec_base, uint32_t idx, uint8_t *addr);
114449b49cdaSZbigniew Bodek 
114549b49cdaSZbigniew Bodek /**
114649b49cdaSZbigniew Bodek  * Configure pbits table entry
114749b49cdaSZbigniew Bodek  * The HW uses this table to translate between vlan pbits field to priority.
114849b49cdaSZbigniew Bodek  * The vlan pbits is used as the index of this table.
114949b49cdaSZbigniew Bodek  *
115049b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
115149b49cdaSZbigniew Bodek  * @param idx the entry index within the table.
115249b49cdaSZbigniew Bodek  * @param prio the priority to set for this entry
115349b49cdaSZbigniew Bodek  *
115449b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
115549b49cdaSZbigniew Bodek  */
115649b49cdaSZbigniew Bodek int al_eth_fwd_pbits_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio);
115749b49cdaSZbigniew Bodek 
115849b49cdaSZbigniew Bodek /**
115949b49cdaSZbigniew Bodek  * Configure priority table entry
116049b49cdaSZbigniew Bodek  * The HW uses this table to translate between priority to queue index.
116149b49cdaSZbigniew Bodek  * The priority is used as the index of this table.
116249b49cdaSZbigniew Bodek  *
116349b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
116449b49cdaSZbigniew Bodek  * @param prio the entry index within the table.
116549b49cdaSZbigniew Bodek  * @param qid the queue index to set for this entry (priority).
116649b49cdaSZbigniew Bodek  *
116749b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
116849b49cdaSZbigniew Bodek  */
116949b49cdaSZbigniew Bodek int al_eth_fwd_priority_table_set(struct al_hal_eth_adapter *adapter, uint8_t prio, uint8_t qid);
117049b49cdaSZbigniew Bodek 
117149b49cdaSZbigniew Bodek /**
117249b49cdaSZbigniew Bodek  * Configure DSCP table entry
117349b49cdaSZbigniew Bodek  * The HW uses this table to translate between IPv4 DSCP field to priority.
117449b49cdaSZbigniew Bodek  * The IPv4 byte 1 (DSCP+ECN) used as index to this table.
117549b49cdaSZbigniew Bodek  *
117649b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
117749b49cdaSZbigniew Bodek  * @param idx the entry index within the table.
117849b49cdaSZbigniew Bodek  * @param prio the queue index to set for this entry (priority).
117949b49cdaSZbigniew Bodek  *
118049b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
118149b49cdaSZbigniew Bodek  */
118249b49cdaSZbigniew Bodek int al_eth_fwd_dscp_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio);
118349b49cdaSZbigniew Bodek 
118449b49cdaSZbigniew Bodek /**
118549b49cdaSZbigniew Bodek  * Configure TC table entry
118649b49cdaSZbigniew Bodek  * The HW uses this table to translate between IPv6 TC field to priority.
118749b49cdaSZbigniew Bodek  * The IPv6 TC used as index to this table.
118849b49cdaSZbigniew Bodek  *
118949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
119049b49cdaSZbigniew Bodek  * @param idx the entry index within the table.
119149b49cdaSZbigniew Bodek  * @param prio the queue index to set for this entry (priority).
119249b49cdaSZbigniew Bodek  *
119349b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
119449b49cdaSZbigniew Bodek  */
119549b49cdaSZbigniew Bodek int al_eth_fwd_tc_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio);
119649b49cdaSZbigniew Bodek 
119749b49cdaSZbigniew Bodek /**
119849b49cdaSZbigniew Bodek  * Configure MAC HASH table entry
119949b49cdaSZbigniew Bodek  * The HW uses 8 bits from the hash result on the MAC DA as index to this table.
120049b49cdaSZbigniew Bodek  *
120149b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
120249b49cdaSZbigniew Bodek  * @param idx the entry index within the table.
120349b49cdaSZbigniew Bodek  * @param udma_mask the target udma to set for this entry.
120449b49cdaSZbigniew Bodek  * @param qid the target queue index to set for this entry.
120549b49cdaSZbigniew Bodek  *
120649b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
120749b49cdaSZbigniew Bodek  */
120849b49cdaSZbigniew Bodek int al_eth_fwd_mhash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma_mask, uint8_t qid);
120949b49cdaSZbigniew Bodek 
121049b49cdaSZbigniew Bodek struct al_eth_fwd_vid_table_entry {
121149b49cdaSZbigniew Bodek 	uint8_t	control:1; /**< used as input for the control table */
121249b49cdaSZbigniew Bodek 	uint8_t filter:1; /**< set to 1 to enable filtering */
121349b49cdaSZbigniew Bodek 	uint8_t udma_mask:4; /**< target udmas */
121449b49cdaSZbigniew Bodek };
121549b49cdaSZbigniew Bodek 
121649b49cdaSZbigniew Bodek /**
121749b49cdaSZbigniew Bodek  * Configure default vlan table entry
121849b49cdaSZbigniew Bodek  *
121949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
122049b49cdaSZbigniew Bodek  * @param use_table set to AL_TRUE if vlan table is used, when set to AL_FALSE
122149b49cdaSZbigniew Bodek  * then vid table will be bypassed and the default_entry value will be used.
122249b49cdaSZbigniew Bodek  * @param default_entry defines the value to be used when bypassing vid table.
122349b49cdaSZbigniew Bodek  * @param default_vlan defines the value will be used when untagget packet
122449b49cdaSZbigniew Bodek  * received. this value will be used only for steering and filtering control,
122549b49cdaSZbigniew Bodek  * the packet's data will not be changed.
122649b49cdaSZbigniew Bodek  *
122749b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
122849b49cdaSZbigniew Bodek  */
122949b49cdaSZbigniew Bodek int al_eth_fwd_vid_config_set(struct al_hal_eth_adapter *adapter, al_bool use_table,
123049b49cdaSZbigniew Bodek 			      struct al_eth_fwd_vid_table_entry *default_entry,
123149b49cdaSZbigniew Bodek 			      uint32_t default_vlan);
123249b49cdaSZbigniew Bodek /**
123349b49cdaSZbigniew Bodek  * Configure vlan table entry
123449b49cdaSZbigniew Bodek  *
123549b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
123649b49cdaSZbigniew Bodek  * @param idx the entry index within the vlan table. The HW uses the vlan id
123749b49cdaSZbigniew Bodek  * field of the packet when accessing this table.
123849b49cdaSZbigniew Bodek  * @param entry the value to write to the vlan table entry
123949b49cdaSZbigniew Bodek  *
124049b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
124149b49cdaSZbigniew Bodek  */
124249b49cdaSZbigniew Bodek int al_eth_fwd_vid_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
124349b49cdaSZbigniew Bodek 			     struct al_eth_fwd_vid_table_entry *entry);
124449b49cdaSZbigniew Bodek 
124549b49cdaSZbigniew Bodek 
124649b49cdaSZbigniew Bodek /**
124749b49cdaSZbigniew Bodek  * Configure default UDMA register
124849b49cdaSZbigniew Bodek  * When the control table entry udma selection set to AL_ETH_CTRL_TABLE_UDMA_SEL_REG<n>,
124949b49cdaSZbigniew Bodek  * then the target UDMA will be set according to the register n of the default
125049b49cdaSZbigniew Bodek  * UDMA registers.
125149b49cdaSZbigniew Bodek  *
125249b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
125349b49cdaSZbigniew Bodek  * @param idx the index of the default register.
125449b49cdaSZbigniew Bodek  * @param udma_mask the value of the register.
125549b49cdaSZbigniew Bodek  *
125649b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
125749b49cdaSZbigniew Bodek  */
125849b49cdaSZbigniew Bodek int al_eth_fwd_default_udma_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
125949b49cdaSZbigniew Bodek 				   uint8_t udma_mask);
126049b49cdaSZbigniew Bodek 
126149b49cdaSZbigniew Bodek /**
126249b49cdaSZbigniew Bodek  * Configure default queue register
126349b49cdaSZbigniew Bodek  * When the control table entry queue selection 1 set to AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG<n>,
126449b49cdaSZbigniew Bodek  * then the target queue will be set according to the register n of the default
126549b49cdaSZbigniew Bodek  * queue registers.
126649b49cdaSZbigniew Bodek  *
126749b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
126849b49cdaSZbigniew Bodek  * @param idx the index of the default register.
126949b49cdaSZbigniew Bodek  * @param qid the value of the register.
127049b49cdaSZbigniew Bodek  *
127149b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
127249b49cdaSZbigniew Bodek  */
127349b49cdaSZbigniew Bodek int al_eth_fwd_default_queue_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
127449b49cdaSZbigniew Bodek 				   uint8_t qid);
127549b49cdaSZbigniew Bodek 
127649b49cdaSZbigniew Bodek /**
127749b49cdaSZbigniew Bodek  * Configure default priority register
127849b49cdaSZbigniew Bodek  * When the control table entry queue selection 1 set to AL_ETH_CTRL_TABLE_PRIO_SEL_1_REG<n>,
127949b49cdaSZbigniew Bodek  * then the target priority will be set according to the register n of the default
128049b49cdaSZbigniew Bodek  * priority registers.
128149b49cdaSZbigniew Bodek  *
128249b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
128349b49cdaSZbigniew Bodek  * @param idx the index of the default register.
128449b49cdaSZbigniew Bodek  * @param prio the value of the register.
128549b49cdaSZbigniew Bodek  *
128649b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
128749b49cdaSZbigniew Bodek  */
128849b49cdaSZbigniew Bodek int al_eth_fwd_default_priority_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
128949b49cdaSZbigniew Bodek 				   uint8_t prio);
129049b49cdaSZbigniew Bodek 
129149b49cdaSZbigniew Bodek 
129249b49cdaSZbigniew Bodek 
129349b49cdaSZbigniew Bodek /* filter undetected MAC DA */
129449b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_UNDET_MAC          (1 << 0)
129549b49cdaSZbigniew Bodek /* filter specific MAC DA based on MAC table output */
129649b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_DET_MAC            (1 << 1)
129749b49cdaSZbigniew Bodek /* filter all tagged */
129849b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_TAGGED             (1 << 2)
129949b49cdaSZbigniew Bodek /* filter all untagged */
130049b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_UNTAGGED           (1 << 3)
130149b49cdaSZbigniew Bodek /* filter all broadcast */
130249b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_BC                 (1 << 4)
130349b49cdaSZbigniew Bodek /* filter all multicast */
130449b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_MC                 (1 << 5)
130549b49cdaSZbigniew Bodek /* filter packet based on parser drop */
130649b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_PARSE              (1 << 6)
130749b49cdaSZbigniew Bodek /* filter packet based on VLAN table output */
130849b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_VLAN_VID           (1 << 7)
130949b49cdaSZbigniew Bodek /* filter packet based on control table output */
131049b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_CTRL_TABLE         (1 << 8)
131149b49cdaSZbigniew Bodek /* filter packet based on protocol index */
131249b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_PROT_INDEX         (1 << 9)
131349b49cdaSZbigniew Bodek /* filter packet based on WoL decision */
131449b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_WOL		     (1 << 10)
131549b49cdaSZbigniew Bodek 
131649b49cdaSZbigniew Bodek 
131749b49cdaSZbigniew Bodek struct al_eth_filter_params {
131849b49cdaSZbigniew Bodek 	al_bool		enable;
131949b49cdaSZbigniew Bodek 	uint32_t	filters; /**< bitmask of AL_ETH_RFW_FILTER.. for filters to enable */
132049b49cdaSZbigniew Bodek 	al_bool		filter_proto[AL_ETH_PROTOCOLS_NUM]; /**< set AL_TRUE for protocols to filter */
132149b49cdaSZbigniew Bodek };
132249b49cdaSZbigniew Bodek 
132349b49cdaSZbigniew Bodek struct al_eth_filter_override_params {
132449b49cdaSZbigniew Bodek 	uint32_t	filters; /**< bitmask of AL_ETH_RFW_FILTER.. for filters to override */
132549b49cdaSZbigniew Bodek 	uint8_t		udma; /**< target udma id */
132649b49cdaSZbigniew Bodek 	uint8_t		qid; /**< target queue id */
132749b49cdaSZbigniew Bodek };
132849b49cdaSZbigniew Bodek 
132949b49cdaSZbigniew Bodek /**
133049b49cdaSZbigniew Bodek  * Configure the receive filters
133149b49cdaSZbigniew Bodek  * this function enables/disables filtering packets and which filtering
133249b49cdaSZbigniew Bodek  * types to apply.
133349b49cdaSZbigniew Bodek  * filters that indicated in tables (MAC table, VLAN and Control tables)
133449b49cdaSZbigniew Bodek  * are not configured by this function. This functions only enables/disables
133549b49cdaSZbigniew Bodek  * respecting the filter indication from those tables.
133649b49cdaSZbigniew Bodek  *
133749b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
133849b49cdaSZbigniew Bodek  * @param params the parameters passed from upper layer
133949b49cdaSZbigniew Bodek  *
134049b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
134149b49cdaSZbigniew Bodek  */
134249b49cdaSZbigniew Bodek int al_eth_filter_config(struct al_hal_eth_adapter *adapter, struct al_eth_filter_params *params);
134349b49cdaSZbigniew Bodek 
134449b49cdaSZbigniew Bodek /**
134549b49cdaSZbigniew Bodek  * Configure the receive override filters
134649b49cdaSZbigniew Bodek  * This function controls whither to force forwarding filtered packets
134749b49cdaSZbigniew Bodek  * to a specific UDMA/queue. The override filters apply only for
134849b49cdaSZbigniew Bodek  * filters that enabled by al_eth_filter_config().
134949b49cdaSZbigniew Bodek  *
135049b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
135149b49cdaSZbigniew Bodek  * @param params override config parameters
135249b49cdaSZbigniew Bodek  *
135349b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
135449b49cdaSZbigniew Bodek  */
135549b49cdaSZbigniew Bodek int al_eth_filter_override_config(struct al_hal_eth_adapter *adapter,
135649b49cdaSZbigniew Bodek 				  struct al_eth_filter_override_params *params);
135749b49cdaSZbigniew Bodek 
135849b49cdaSZbigniew Bodek 
135949b49cdaSZbigniew 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,
136049b49cdaSZbigniew Bodek 					enum al_eth_tx_switch_vid_sel_type vid_sel_type,
136149b49cdaSZbigniew Bodek 					enum al_eth_tx_switch_dec_type uc_dec,
136249b49cdaSZbigniew Bodek 					enum al_eth_tx_switch_dec_type mc_dec,
136349b49cdaSZbigniew Bodek 					enum al_eth_tx_switch_dec_type bc_dec);
136449b49cdaSZbigniew Bodek int al_eth_switching_default_bitmap_set(struct al_hal_eth_adapter *adapter, uint8_t udma_id, uint8_t udma_uc_bitmask,
136549b49cdaSZbigniew Bodek 						uint8_t udma_mc_bitmask,uint8_t udma_bc_bitmask);
136649b49cdaSZbigniew Bodek int al_eth_flow_control_config(struct al_hal_eth_adapter *adapter, struct al_eth_flow_control_params *params);
136749b49cdaSZbigniew Bodek 
136849b49cdaSZbigniew Bodek struct al_eth_eee_params{
136949b49cdaSZbigniew Bodek 	uint8_t enable;
137049b49cdaSZbigniew Bodek 	uint32_t tx_eee_timer; /**< time in cycles the interface delays prior to entering eee state */
137149b49cdaSZbigniew Bodek 	uint32_t min_interval; /**< minimum interval in cycles between two eee states */
137249b49cdaSZbigniew Bodek 	uint32_t stop_cnt; /**< time in cycles to stop Tx mac i/f after getting out of eee state */
1373*3fc36ee0SWojciech Macek 	al_bool fast_wake; /**< fast_wake is only applicable to 40/50G, otherwise the mode is deep_sleep */
137449b49cdaSZbigniew Bodek };
137549b49cdaSZbigniew Bodek 
137649b49cdaSZbigniew Bodek /**
137749b49cdaSZbigniew Bodek  * configure EEE mode
137849b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
137949b49cdaSZbigniew Bodek  * @param params pointer to the eee input parameters.
138049b49cdaSZbigniew Bodek  *
138149b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
138249b49cdaSZbigniew Bodek  */
138349b49cdaSZbigniew Bodek int al_eth_eee_config(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params);
138449b49cdaSZbigniew Bodek 
138549b49cdaSZbigniew Bodek /**
138649b49cdaSZbigniew Bodek  * get EEE configuration
138749b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
138849b49cdaSZbigniew Bodek  * @param params pointer to the eee output parameters.
138949b49cdaSZbigniew Bodek  *
139049b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
139149b49cdaSZbigniew Bodek  */
139249b49cdaSZbigniew Bodek int al_eth_eee_get(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params);
139349b49cdaSZbigniew Bodek 
139449b49cdaSZbigniew 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);
139549b49cdaSZbigniew Bodek 
139649b49cdaSZbigniew Bodek /* Timestamp
139749b49cdaSZbigniew Bodek  * This is a generic time-stamp mechanism that can be used as generic to
139849b49cdaSZbigniew Bodek  * time-stamp every received or transmit packet it can also support IEEE 1588v2
139949b49cdaSZbigniew Bodek  * PTP time synchronization protocol.
140049b49cdaSZbigniew Bodek  * In addition to time-stamp, an internal system time is maintained. For
140149b49cdaSZbigniew Bodek  * further accuracy, the chip support transmit/receive clock synchronization
140249b49cdaSZbigniew Bodek  * including recovery of master clock from one of the ports and distributing it
140349b49cdaSZbigniew Bodek  * to the rest of the ports - that is outside the scope of the Ethernet
140449b49cdaSZbigniew Bodek  * Controller - please refer to Annapurna Labs Alpine Hardware Wiki
140549b49cdaSZbigniew Bodek  */
140649b49cdaSZbigniew Bodek 
140749b49cdaSZbigniew Bodek /* Timestamp management APIs */
140849b49cdaSZbigniew Bodek 
140949b49cdaSZbigniew Bodek /**
141049b49cdaSZbigniew Bodek  * prepare the adapter for timestamping packets.
141149b49cdaSZbigniew Bodek  * Rx timestamps requires using 8 words (8x4 bytes) rx completion descriptor
141249b49cdaSZbigniew Bodek  * size as the timestamp value added into word 4.
141349b49cdaSZbigniew Bodek  *
141449b49cdaSZbigniew Bodek  * This function should be called after al_eth_mac_config() and before
141549b49cdaSZbigniew Bodek  * enabling the queues.
141649b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
141749b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
141849b49cdaSZbigniew Bodek  */
141949b49cdaSZbigniew Bodek int al_eth_ts_init(struct al_hal_eth_adapter *adapter);
142049b49cdaSZbigniew Bodek 
142149b49cdaSZbigniew Bodek /* Timestamp data path APIs */
142249b49cdaSZbigniew Bodek 
142349b49cdaSZbigniew Bodek /*
142449b49cdaSZbigniew Bodek  * This is the size of the on-chip array that keeps the time-stamp of the
142549b49cdaSZbigniew Bodek  * latest transmitted packets
142649b49cdaSZbigniew Bodek  */
142749b49cdaSZbigniew Bodek #define AL_ETH_PTH_TX_SAMPLES_NUM	16
142849b49cdaSZbigniew Bodek 
142949b49cdaSZbigniew Bodek /**
143049b49cdaSZbigniew Bodek  * read Timestamp sample value of previously transmitted packet.
143149b49cdaSZbigniew Bodek  *
143249b49cdaSZbigniew Bodek  * The adapter includes AL_ETH_PTH_TX_SAMPLES_NUM timestamp samples for tx
143349b49cdaSZbigniew Bodek  * packets, those samples shared for all the UDMAs and queues. the al_eth_pkt
143449b49cdaSZbigniew Bodek  * data structure includes the index of which sample to use for the packet
143549b49cdaSZbigniew Bodek  * to transmit. It's the caller's responsibility to manage those samples,
143649b49cdaSZbigniew Bodek  * for example, when using an index, the caller must make sure the packet
143749b49cdaSZbigniew Bodek  * is completed and the tx time is sampled before using that index for
143849b49cdaSZbigniew Bodek  * another packet.
143949b49cdaSZbigniew Bodek  *
144049b49cdaSZbigniew Bodek  * This function should be called after the completion indication of the
144149b49cdaSZbigniew Bodek  * tx packet. however, there is a little chance that the timestamp sample
144249b49cdaSZbigniew Bodek  * won't be updated yet, thus this function must be called again when it
144349b49cdaSZbigniew Bodek  * returns -EAGAIN.
144449b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
144549b49cdaSZbigniew Bodek  * @param ts_index the index (out of 16) of the timestamp register
144649b49cdaSZbigniew Bodek  * @param timestamp the timestamp value in 2^18 femtoseconds resolution.
144749b49cdaSZbigniew Bodek  * @return -EAGAIN if the sample was not updated yet. 0 when the sample
144849b49cdaSZbigniew Bodek  * was updated and no errors found.
144949b49cdaSZbigniew Bodek  */
145049b49cdaSZbigniew Bodek int al_eth_tx_ts_val_get(struct al_hal_eth_adapter *adapter, uint8_t ts_index,
145149b49cdaSZbigniew Bodek 			 uint32_t *timestamp);
145249b49cdaSZbigniew Bodek 
145349b49cdaSZbigniew Bodek /* Timestamp PTH (PTP Timestamp Handler) control and times management */
145449b49cdaSZbigniew Bodek /** structure for describing PTH epoch time */
145549b49cdaSZbigniew Bodek struct al_eth_pth_time {
145649b49cdaSZbigniew Bodek 	uint32_t	seconds; /**< seconds */
145749b49cdaSZbigniew Bodek 	uint64_t	femto; /**< femto seconds */
145849b49cdaSZbigniew Bodek };
145949b49cdaSZbigniew Bodek 
146049b49cdaSZbigniew Bodek /**
146149b49cdaSZbigniew Bodek  * Read the systime value
146249b49cdaSZbigniew Bodek  * This API should not be used to get the timestamp of packets.
146349b49cdaSZbigniew Bodek  * The HW maintains 50 bits for the sub-seconds portion in femto resolution,
146449b49cdaSZbigniew Bodek  * but this function reads only the 32 MSB bits since the LSB provides
146549b49cdaSZbigniew Bodek  * sub-nanoseconds accuracy, which is not needed.
146649b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
146749b49cdaSZbigniew Bodek  * @param systime pointer to structure where the time will be stored.
146849b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
146949b49cdaSZbigniew Bodek  */
147049b49cdaSZbigniew Bodek int al_eth_pth_systime_read(struct al_hal_eth_adapter *adapter,
147149b49cdaSZbigniew Bodek 			    struct al_eth_pth_time *systime);
147249b49cdaSZbigniew Bodek 
147349b49cdaSZbigniew Bodek /**
147449b49cdaSZbigniew Bodek  * Set the clock period to a given value.
147549b49cdaSZbigniew Bodek  * The systime will be incremented by this value on each posedge of the
147649b49cdaSZbigniew Bodek  * adapters internal clock which driven by the SouthBridge clock.
147749b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
147849b49cdaSZbigniew Bodek  * @param clk_period the clock period in femto seconds.
147949b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
148049b49cdaSZbigniew Bodek  */
148149b49cdaSZbigniew Bodek int al_eth_pth_clk_period_write(struct al_hal_eth_adapter *adapter,
148249b49cdaSZbigniew Bodek 				uint64_t clk_period);
148349b49cdaSZbigniew Bodek 
148449b49cdaSZbigniew Bodek /**< enum for methods when updating systime using triggers */
148549b49cdaSZbigniew Bodek enum al_eth_pth_update_method {
148649b49cdaSZbigniew Bodek 	AL_ETH_PTH_UPDATE_METHOD_SET = 0, /**< Set the time in int/ext update time */
148749b49cdaSZbigniew Bodek 	AL_ETH_PTH_UPDATE_METHOD_INC = 1, /**< increment */
148849b49cdaSZbigniew Bodek 	AL_ETH_PTH_UPDATE_METHOD_DEC = 2, /**< decrement */
148949b49cdaSZbigniew Bodek 	AL_ETH_PTH_UPDATE_METHOD_ADD_TO_LAST = 3, /**< Set to last time + int/ext update time.*/
149049b49cdaSZbigniew Bodek };
149149b49cdaSZbigniew Bodek 
149249b49cdaSZbigniew Bodek /**< systime internal update trigger types */
149349b49cdaSZbigniew Bodek enum al_eth_pth_int_trig {
149449b49cdaSZbigniew Bodek 	AL_ETH_PTH_INT_TRIG_OUT_PULSE_0 = 0, /**< use output pulse as trigger */
149549b49cdaSZbigniew Bodek 	AL_ETH_PTH_INT_TRIG_REG_WRITE = 1, /**< use the int update register
149649b49cdaSZbigniew Bodek 					    * write as a trigger
149749b49cdaSZbigniew Bodek 					    */
149849b49cdaSZbigniew Bodek };
149949b49cdaSZbigniew Bodek 
150049b49cdaSZbigniew Bodek /**< parameters for internal trigger update */
150149b49cdaSZbigniew Bodek struct al_eth_pth_int_update_params {
150249b49cdaSZbigniew Bodek 	al_bool		enable; /**< enable internal trigger update */
150349b49cdaSZbigniew Bodek 	enum al_eth_pth_update_method	method; /**< internal trigger update
150449b49cdaSZbigniew Bodek 						 * method
150549b49cdaSZbigniew Bodek 						 */
150649b49cdaSZbigniew Bodek 	enum al_eth_pth_int_trig	trigger; /**< which internal trigger to
150749b49cdaSZbigniew Bodek 						  * use
150849b49cdaSZbigniew Bodek 						  */
150949b49cdaSZbigniew Bodek };
151049b49cdaSZbigniew Bodek 
151149b49cdaSZbigniew Bodek /**
151249b49cdaSZbigniew Bodek  * Configure the systime internal update
151349b49cdaSZbigniew Bodek  *
151449b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
151549b49cdaSZbigniew Bodek  * @param params the configuration of the internal update.
151649b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
151749b49cdaSZbigniew Bodek  */
151849b49cdaSZbigniew Bodek int al_eth_pth_int_update_config(struct al_hal_eth_adapter *adapter,
151949b49cdaSZbigniew Bodek 				 struct al_eth_pth_int_update_params *params);
152049b49cdaSZbigniew Bodek 
152149b49cdaSZbigniew Bodek /**
152249b49cdaSZbigniew Bodek  * set internal update time
152349b49cdaSZbigniew Bodek  *
152449b49cdaSZbigniew Bodek  * The update time used when updating the systime with
152549b49cdaSZbigniew Bodek  * internal update method.
152649b49cdaSZbigniew Bodek  *
152749b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
152849b49cdaSZbigniew Bodek  * @param time the internal update time value
152949b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
153049b49cdaSZbigniew Bodek  */
153149b49cdaSZbigniew Bodek int al_eth_pth_int_update_time_set(struct al_hal_eth_adapter *adapter,
153249b49cdaSZbigniew Bodek 				   struct al_eth_pth_time *time);
153349b49cdaSZbigniew Bodek 
153449b49cdaSZbigniew Bodek /**< parameters for external trigger update */
153549b49cdaSZbigniew Bodek struct al_eth_pth_ext_update_params {
153649b49cdaSZbigniew Bodek 	uint8_t		triggers; /**< bitmask of external triggers to enable */
153749b49cdaSZbigniew Bodek 	enum al_eth_pth_update_method	method; /**< external trigger update
153849b49cdaSZbigniew Bodek 						 * method
153949b49cdaSZbigniew Bodek 						 */
154049b49cdaSZbigniew Bodek };
154149b49cdaSZbigniew Bodek 
154249b49cdaSZbigniew Bodek /**
154349b49cdaSZbigniew Bodek  * Configure the systime external update.
154449b49cdaSZbigniew Bodek  * external update triggered by external signals such as GPIO or pulses
154549b49cdaSZbigniew Bodek  * from other eth controllers on the SoC.
154649b49cdaSZbigniew Bodek  *
154749b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
154849b49cdaSZbigniew Bodek  * @param params the configuration of the external update.
154949b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
155049b49cdaSZbigniew Bodek  */
155149b49cdaSZbigniew Bodek int al_eth_pth_ext_update_config(struct al_hal_eth_adapter *adapter,
155249b49cdaSZbigniew Bodek 				 struct al_eth_pth_ext_update_params *params);
155349b49cdaSZbigniew Bodek 
155449b49cdaSZbigniew Bodek /**
155549b49cdaSZbigniew Bodek  * set external update time
155649b49cdaSZbigniew Bodek  *
155749b49cdaSZbigniew Bodek  * The update time used when updating the systime with
155849b49cdaSZbigniew Bodek  * external update method.
155949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
156049b49cdaSZbigniew Bodek  * @param time the external update time value
156149b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
156249b49cdaSZbigniew Bodek  */
156349b49cdaSZbigniew Bodek int al_eth_pth_ext_update_time_set(struct al_hal_eth_adapter *adapter,
156449b49cdaSZbigniew Bodek 				   struct al_eth_pth_time *time);
156549b49cdaSZbigniew Bodek /**
156649b49cdaSZbigniew Bodek  * set the read compensation delay
156749b49cdaSZbigniew Bodek  *
156849b49cdaSZbigniew Bodek  * When reading the systime, the HW adds this value to compensate
156949b49cdaSZbigniew Bodek  * read latency.
157049b49cdaSZbigniew Bodek  *
157149b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
157249b49cdaSZbigniew Bodek  * @param subseconds the read latency delay in femto seconds.
157349b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
157449b49cdaSZbigniew Bodek  */
157549b49cdaSZbigniew Bodek int al_eth_pth_read_compensation_set(struct al_hal_eth_adapter *adapter,
157649b49cdaSZbigniew Bodek 				     uint64_t subseconds);
157749b49cdaSZbigniew Bodek /**
157849b49cdaSZbigniew Bodek  * set the internal write compensation delay
157949b49cdaSZbigniew Bodek  *
158049b49cdaSZbigniew Bodek  * When updating the systime due to an internal trigger's event, the HW adds
158149b49cdaSZbigniew Bodek  * this value to compensate latency.
158249b49cdaSZbigniew Bodek  *
158349b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
158449b49cdaSZbigniew Bodek  * @param subseconds the write latency delay in femto seconds.
158549b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
158649b49cdaSZbigniew Bodek  */
158749b49cdaSZbigniew Bodek int al_eth_pth_int_write_compensation_set(struct al_hal_eth_adapter *adapter,
158849b49cdaSZbigniew Bodek 					  uint64_t subseconds);
158949b49cdaSZbigniew Bodek 
159049b49cdaSZbigniew Bodek /**
159149b49cdaSZbigniew Bodek  * set the external write compensation delay
159249b49cdaSZbigniew Bodek  *
159349b49cdaSZbigniew Bodek  * When updating the systime due to an external trigger's event, the HW adds
159449b49cdaSZbigniew Bodek  * this value to compensate pulse propagation latency.
159549b49cdaSZbigniew Bodek  *
159649b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
159749b49cdaSZbigniew Bodek  * @param subseconds the write latency delay in femto seconds.
159849b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
159949b49cdaSZbigniew Bodek  */
160049b49cdaSZbigniew Bodek int al_eth_pth_ext_write_compensation_set(struct al_hal_eth_adapter *adapter,
160149b49cdaSZbigniew Bodek 					  uint64_t subseconds);
160249b49cdaSZbigniew Bodek 
160349b49cdaSZbigniew Bodek /**
160449b49cdaSZbigniew Bodek  * set the sync compensation delay
160549b49cdaSZbigniew Bodek  *
160649b49cdaSZbigniew Bodek  * When the adapter passes systime from PTH to MAC to do the packets
160749b49cdaSZbigniew Bodek  * timestamping, the sync compensation delay is added to systime value to
160849b49cdaSZbigniew Bodek  * compensate the latency between the PTH and the MAC.
160949b49cdaSZbigniew Bodek  *
161049b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
161149b49cdaSZbigniew Bodek  * @param subseconds the sync latency delay in femto seconds.
161249b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
161349b49cdaSZbigniew Bodek  */
161449b49cdaSZbigniew Bodek int al_eth_pth_sync_compensation_set(struct al_hal_eth_adapter *adapter,
161549b49cdaSZbigniew Bodek 				     uint64_t subseconds);
161649b49cdaSZbigniew Bodek 
161749b49cdaSZbigniew Bodek #define AL_ETH_PTH_PULSE_OUT_NUM	8
161849b49cdaSZbigniew Bodek struct al_eth_pth_pulse_out_params {
161949b49cdaSZbigniew Bodek 	uint8_t		index; /**< id of the pulse (0..7) */
162049b49cdaSZbigniew Bodek 	al_bool		enable;
162149b49cdaSZbigniew Bodek 	al_bool		periodic; /**< when true, generate periodic pulse (PPS) */
162249b49cdaSZbigniew Bodek 	uint8_t		period_sec; /**< for periodic pulse, this is seconds
162349b49cdaSZbigniew Bodek 				     * portion of the period time
162449b49cdaSZbigniew Bodek 				     */
162549b49cdaSZbigniew Bodek 	uint32_t	period_us; /**< this is microseconds portion of the
162649b49cdaSZbigniew Bodek 				      * period
162749b49cdaSZbigniew Bodek 				      */
162849b49cdaSZbigniew Bodek 	struct al_eth_pth_time	start_time; /**< when to start pulse triggering */
162949b49cdaSZbigniew Bodek 	uint64_t	pulse_width; /**< pulse width in femto seconds */
163049b49cdaSZbigniew Bodek };
163149b49cdaSZbigniew Bodek 
163249b49cdaSZbigniew Bodek /**
163349b49cdaSZbigniew Bodek  * Configure an output pulse
163449b49cdaSZbigniew Bodek  * This function configures an output pulse coming from the internal System
163549b49cdaSZbigniew Bodek  * Time. This is typically a 1Hhz pulse that is used to synchronize the
163649b49cdaSZbigniew Bodek  * rest of the components of the system. This API configure the Ethernet
163749b49cdaSZbigniew Bodek  * Controller pulse. An additional set up is required to configure the chip
163849b49cdaSZbigniew Bodek  * General Purpose I/O (GPIO) to enable the chip output pin.
163949b49cdaSZbigniew Bodek  *
164049b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
164149b49cdaSZbigniew Bodek  * @param params output pulse configuration.
164249b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
164349b49cdaSZbigniew Bodek  */
164449b49cdaSZbigniew Bodek int al_eth_pth_pulse_out_config(struct al_hal_eth_adapter *adapter,
164549b49cdaSZbigniew Bodek 				struct al_eth_pth_pulse_out_params *params);
164649b49cdaSZbigniew Bodek 
164749b49cdaSZbigniew Bodek /* link */
164849b49cdaSZbigniew Bodek struct al_eth_link_status {
164949b49cdaSZbigniew Bodek 	al_bool		link_up;
1650*3fc36ee0SWojciech Macek 	al_bool		local_fault;
1651*3fc36ee0SWojciech Macek 	al_bool		remote_fault;
165249b49cdaSZbigniew Bodek };
165349b49cdaSZbigniew Bodek 
165449b49cdaSZbigniew Bodek /**
165549b49cdaSZbigniew Bodek  * get link status
165649b49cdaSZbigniew Bodek  *
165749b49cdaSZbigniew Bodek  * this function should be used when no external phy is used to get
165849b49cdaSZbigniew Bodek  * information about the link
165949b49cdaSZbigniew Bodek  *
166049b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
166149b49cdaSZbigniew Bodek  * @param status pointer to struct where to set link information
166249b49cdaSZbigniew Bodek  *
166349b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
166449b49cdaSZbigniew Bodek  */
1665*3fc36ee0SWojciech Macek int al_eth_link_status_get(struct al_hal_eth_adapter *adapter,
1666*3fc36ee0SWojciech Macek 			   struct al_eth_link_status *status);
1667*3fc36ee0SWojciech Macek 
1668*3fc36ee0SWojciech Macek /**
1669*3fc36ee0SWojciech Macek  * clear link status
1670*3fc36ee0SWojciech Macek  *
1671*3fc36ee0SWojciech Macek  * this function clear latched status of the link.
1672*3fc36ee0SWojciech Macek  *
1673*3fc36ee0SWojciech Macek  * @param adapter pointer to the private structure.
1674*3fc36ee0SWojciech Macek  *
1675*3fc36ee0SWojciech Macek  * @return return 0 if supported.
1676*3fc36ee0SWojciech Macek  */
1677*3fc36ee0SWojciech Macek int al_eth_link_status_clear(struct al_hal_eth_adapter *adapter);
167849b49cdaSZbigniew Bodek 
167949b49cdaSZbigniew Bodek /**
168049b49cdaSZbigniew Bodek  * Set LEDs to represent link status.
168149b49cdaSZbigniew Bodek  *
168249b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
168349b49cdaSZbigniew Bodek  * @param link_is_up boolean indicating current link status.
168449b49cdaSZbigniew Bodek  *	  In case link is down the leds will be turned off.
168549b49cdaSZbigniew Bodek  *	  In case link is up the leds will be turned on, that means
168649b49cdaSZbigniew Bodek  *	  leds will be blinking on traffic and will be constantly lighting
168749b49cdaSZbigniew Bodek  *	  on inactive link
168849b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
168949b49cdaSZbigniew Bodek  */
169049b49cdaSZbigniew Bodek int al_eth_led_set(struct al_hal_eth_adapter *adapter, al_bool link_is_up);
169149b49cdaSZbigniew Bodek 
169249b49cdaSZbigniew Bodek /* get statistics */
169349b49cdaSZbigniew Bodek 
169449b49cdaSZbigniew Bodek struct al_eth_mac_stats{
169549b49cdaSZbigniew Bodek 	/* sum the data and padding octets (i.e. without header and FCS) received with a valid frame. */
169649b49cdaSZbigniew Bodek 	uint64_t aOctetsReceivedOK;
169749b49cdaSZbigniew Bodek 	/* sum of Payload and padding octets of frames transmitted without error*/
169849b49cdaSZbigniew Bodek 	uint64_t aOctetsTransmittedOK;
169949b49cdaSZbigniew Bodek 	/* total number of packets received. Good and bad packets */
170049b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts;
170149b49cdaSZbigniew Bodek 	/* number of received unicast packets */
170249b49cdaSZbigniew Bodek 	uint32_t ifInUcastPkts;
170349b49cdaSZbigniew Bodek 	/* number of received multicast packets */
170449b49cdaSZbigniew Bodek 	uint32_t ifInMulticastPkts;
170549b49cdaSZbigniew Bodek 	/* number of received broadcast packets */
170649b49cdaSZbigniew Bodek 	uint32_t ifInBroadcastPkts;
170749b49cdaSZbigniew Bodek 	/* Number of frames received with FIFO Overflow, CRC, Payload Length, Jabber and Oversized, Alignment or PHY/PCS error indication */
170849b49cdaSZbigniew Bodek 	uint32_t ifInErrors;
170949b49cdaSZbigniew Bodek 
171049b49cdaSZbigniew Bodek 	/* number of transmitted unicast packets */
171149b49cdaSZbigniew Bodek 	uint32_t ifOutUcastPkts;
171249b49cdaSZbigniew Bodek 	/* number of transmitted multicast packets */
171349b49cdaSZbigniew Bodek 	uint32_t ifOutMulticastPkts;
171449b49cdaSZbigniew Bodek 	/* number of transmitted broadcast packets */
171549b49cdaSZbigniew Bodek 	uint32_t ifOutBroadcastPkts;
171649b49cdaSZbigniew Bodek 	/* number of frames transmitted with FIFO Overflow, FIFO Underflow or Controller indicated error */
171749b49cdaSZbigniew Bodek 	uint32_t ifOutErrors;
171849b49cdaSZbigniew Bodek 
171949b49cdaSZbigniew Bodek 	/* number of Frame received without error (Including Pause Frames). */
172049b49cdaSZbigniew Bodek 	uint32_t aFramesReceivedOK;
172149b49cdaSZbigniew Bodek 	/* number of Frames transmitter without error (Including Pause Frames) */
172249b49cdaSZbigniew Bodek 	uint32_t aFramesTransmittedOK;
172349b49cdaSZbigniew Bodek 	/* number of packets received with less than 64 octets */
172449b49cdaSZbigniew Bodek 	uint32_t etherStatsUndersizePkts;
172549b49cdaSZbigniew Bodek 	/* Too short frames with CRC error, available only for RGMII and 1G Serial modes */
172649b49cdaSZbigniew Bodek 	uint32_t etherStatsFragments;
172749b49cdaSZbigniew Bodek 	/* Too long frames with CRC error */
172849b49cdaSZbigniew Bodek 	uint32_t etherStatsJabbers;
172949b49cdaSZbigniew Bodek 	/* packet that exceeds the valid maximum programmed frame length */
173049b49cdaSZbigniew Bodek 	uint32_t etherStatsOversizePkts;
173149b49cdaSZbigniew Bodek 	/* number of frames received with a CRC error */
173249b49cdaSZbigniew Bodek 	uint32_t aFrameCheckSequenceErrors;
173349b49cdaSZbigniew Bodek 	/* number of frames received with alignment error */
173449b49cdaSZbigniew Bodek 	uint32_t aAlignmentErrors;
173549b49cdaSZbigniew Bodek 	/* number of dropped packets due to FIFO overflow */
173649b49cdaSZbigniew Bodek 	uint32_t etherStatsDropEvents;
173749b49cdaSZbigniew Bodek 	/* number of transmitted pause frames. */
173849b49cdaSZbigniew Bodek 	uint32_t aPAUSEMACCtrlFramesTransmitted;
173949b49cdaSZbigniew Bodek 	/* number of received pause frames. */
174049b49cdaSZbigniew Bodek 	uint32_t aPAUSEMACCtrlFramesReceived;
174149b49cdaSZbigniew Bodek 	/* frame received exceeded the maximum length programmed with register FRM_LGTH, available only for 10G modes */
174249b49cdaSZbigniew Bodek 	uint32_t aFrameTooLongErrors;
174349b49cdaSZbigniew Bodek 	/* received frame with bad length/type (between 46 and 0x600 or less
174449b49cdaSZbigniew Bodek 	 * than 46 for packets longer than 64), available only for 10G modes */
174549b49cdaSZbigniew Bodek 	uint32_t aInRangeLengthErrors;
174649b49cdaSZbigniew Bodek 	/* Valid VLAN tagged frames transmitted */
174749b49cdaSZbigniew Bodek 	uint32_t VLANTransmittedOK;
174849b49cdaSZbigniew Bodek 	/* Valid VLAN tagged frames received */
174949b49cdaSZbigniew Bodek 	uint32_t VLANReceivedOK;
175049b49cdaSZbigniew Bodek 	/* Total number of octets received. Good and bad packets */
175149b49cdaSZbigniew Bodek 	uint32_t etherStatsOctets;
175249b49cdaSZbigniew Bodek 
175349b49cdaSZbigniew Bodek 	/* packets of 64 octets length is received (good and bad frames are counted) */
175449b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts64Octets;
175549b49cdaSZbigniew Bodek 	/* Frames (good and bad) with 65 to 127 octets */
175649b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts65to127Octets;
175749b49cdaSZbigniew Bodek 	/* Frames (good and bad) with 128 to 255 octets */
175849b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts128to255Octets;
175949b49cdaSZbigniew Bodek 	/* Frames (good and bad) with 256 to 511 octets */
176049b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts256to511Octets;
176149b49cdaSZbigniew Bodek 	/* Frames (good and bad) with 512 to 1023 octets */
176249b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts512to1023Octets;
176349b49cdaSZbigniew Bodek 	/* Frames (good and bad) with 1024 to 1518 octets */
176449b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts1024to1518Octets;
176549b49cdaSZbigniew Bodek 	/* frames with 1519 bytes to the maximum length programmed in the register FRAME_LENGTH. */
176649b49cdaSZbigniew Bodek 	uint32_t etherStatsPkts1519toX;
176749b49cdaSZbigniew Bodek 
176849b49cdaSZbigniew Bodek 	uint32_t eee_in;
176949b49cdaSZbigniew Bodek 	uint32_t eee_out;
177049b49cdaSZbigniew Bodek };
177149b49cdaSZbigniew Bodek 
177249b49cdaSZbigniew Bodek /**
177349b49cdaSZbigniew Bodek  * get mac statistics
177449b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
177549b49cdaSZbigniew Bodek  * @param stats pointer to structure that will be filled with statistics.
177649b49cdaSZbigniew Bodek  *
177749b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
177849b49cdaSZbigniew Bodek  */
177949b49cdaSZbigniew Bodek int al_eth_mac_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_mac_stats *stats);
178049b49cdaSZbigniew Bodek 
178149b49cdaSZbigniew Bodek struct al_eth_ec_stats{
178249b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO input  packets */
178349b49cdaSZbigniew Bodek 	uint32_t faf_in_rx_pkt;
178449b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO input  short error packets */
178549b49cdaSZbigniew Bodek 	uint32_t faf_in_rx_short;
178649b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO input  long error packets */
178749b49cdaSZbigniew Bodek 	uint32_t faf_in_rx_long;
178849b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO output  packets */
178949b49cdaSZbigniew Bodek 	uint32_t faf_out_rx_pkt;
179049b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO output  short error packets */
179149b49cdaSZbigniew Bodek 	uint32_t faf_out_rx_short;
179249b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO output  long error packets */
179349b49cdaSZbigniew Bodek 	uint32_t faf_out_rx_long;
179449b49cdaSZbigniew Bodek 	/* Rx Frequency adjust FIFO output  drop packets */
179549b49cdaSZbigniew Bodek 	uint32_t faf_out_drop;
179649b49cdaSZbigniew Bodek 	/* Number of packets written into the Rx FIFO (without FIFO error indication) */
179749b49cdaSZbigniew Bodek 	uint32_t rxf_in_rx_pkt;
179849b49cdaSZbigniew Bodek 	/* Number of error packets written into the Rx FIFO (with FIFO error indication, */
179949b49cdaSZbigniew Bodek 	/* FIFO full indication during packet reception) */
180049b49cdaSZbigniew Bodek 	uint32_t rxf_in_fifo_err;
180149b49cdaSZbigniew Bodek 	/* Number of packets read from Rx FIFO 1 */
180249b49cdaSZbigniew Bodek 	uint32_t lbf_in_rx_pkt;
180349b49cdaSZbigniew Bodek 	/* Number of packets read from Rx FIFO 2 (loopback FIFO) */
180449b49cdaSZbigniew Bodek 	uint32_t lbf_in_fifo_err;
180549b49cdaSZbigniew Bodek 	/* Rx FIFO output drop packets from FIFO 1 */
180649b49cdaSZbigniew Bodek 	uint32_t rxf_out_rx_1_pkt;
180749b49cdaSZbigniew Bodek 	/* Rx FIFO output drop packets from FIFO 2 (loop back) */
180849b49cdaSZbigniew Bodek 	uint32_t rxf_out_rx_2_pkt;
180949b49cdaSZbigniew Bodek 	/* Rx FIFO output drop packets from FIFO 1 */
181049b49cdaSZbigniew Bodek 	uint32_t rxf_out_drop_1_pkt;
181149b49cdaSZbigniew Bodek 	/* Rx FIFO output drop packets from FIFO 2 (loop back) */
181249b49cdaSZbigniew Bodek 	uint32_t rxf_out_drop_2_pkt;
181349b49cdaSZbigniew Bodek 	/* Rx Parser 1, input packet counter */
181449b49cdaSZbigniew Bodek 	uint32_t rpe_1_in_rx_pkt;
181549b49cdaSZbigniew Bodek 	/* Rx Parser 1, output packet counter */
181649b49cdaSZbigniew Bodek 	uint32_t rpe_1_out_rx_pkt;
181749b49cdaSZbigniew Bodek 	/* Rx Parser 2, input packet counter */
181849b49cdaSZbigniew Bodek 	uint32_t rpe_2_in_rx_pkt;
181949b49cdaSZbigniew Bodek 	/* Rx Parser 2, output packet counter */
182049b49cdaSZbigniew Bodek 	uint32_t rpe_2_out_rx_pkt;
182149b49cdaSZbigniew Bodek 	/* Rx Parser 3 (MACsec), input packet counter */
182249b49cdaSZbigniew Bodek 	uint32_t rpe_3_in_rx_pkt;
182349b49cdaSZbigniew Bodek 	/* Rx Parser 3 (MACsec), output packet counter */
182449b49cdaSZbigniew Bodek 	uint32_t rpe_3_out_rx_pkt;
182549b49cdaSZbigniew Bodek 	/* Tx parser, input packet counter */
182649b49cdaSZbigniew Bodek 	uint32_t tpe_in_tx_pkt;
182749b49cdaSZbigniew Bodek 	/* Tx parser, output packet counter */
182849b49cdaSZbigniew Bodek 	uint32_t tpe_out_tx_pkt;
182949b49cdaSZbigniew Bodek 	/* Tx packet modification, input packet counter */
183049b49cdaSZbigniew Bodek 	uint32_t tpm_tx_pkt;
183149b49cdaSZbigniew Bodek 	/* Tx forwarding input packet counter */
183249b49cdaSZbigniew Bodek 	uint32_t tfw_in_tx_pkt;
183349b49cdaSZbigniew Bodek 	/* Tx forwarding input packet counter */
183449b49cdaSZbigniew Bodek 	uint32_t tfw_out_tx_pkt;
183549b49cdaSZbigniew Bodek 	/* Rx forwarding input packet counter */
183649b49cdaSZbigniew Bodek 	uint32_t rfw_in_rx_pkt;
183749b49cdaSZbigniew Bodek 	/* Rx Forwarding, packet with VLAN command drop indication */
183849b49cdaSZbigniew Bodek 	uint32_t rfw_in_vlan_drop;
183949b49cdaSZbigniew Bodek 	/* Rx Forwarding, packets with parse drop indication */
184049b49cdaSZbigniew Bodek 	uint32_t rfw_in_parse_drop;
184149b49cdaSZbigniew Bodek 	/* Rx Forwarding, multicast packets */
184249b49cdaSZbigniew Bodek 	uint32_t rfw_in_mc;
184349b49cdaSZbigniew Bodek 	/* Rx Forwarding, broadcast packets */
184449b49cdaSZbigniew Bodek 	uint32_t rfw_in_bc;
184549b49cdaSZbigniew Bodek 	/* Rx Forwarding, tagged packets */
184649b49cdaSZbigniew Bodek 	uint32_t rfw_in_vlan_exist;
184749b49cdaSZbigniew Bodek 	/* Rx Forwarding, untagged packets */
184849b49cdaSZbigniew Bodek 	uint32_t rfw_in_vlan_nexist;
184949b49cdaSZbigniew Bodek 	/* Rx Forwarding, packets with MAC address drop indication (from the MAC address table) */
185049b49cdaSZbigniew Bodek 	uint32_t rfw_in_mac_drop;
185149b49cdaSZbigniew Bodek 	/* Rx Forwarding, packets with undetected MAC address */
185249b49cdaSZbigniew Bodek 	uint32_t rfw_in_mac_ndet_drop;
185349b49cdaSZbigniew Bodek 	/* Rx Forwarding, packets with drop indication from the control table */
185449b49cdaSZbigniew Bodek 	uint32_t rfw_in_ctrl_drop;
185549b49cdaSZbigniew Bodek 	/* Rx Forwarding, packets with L3_protocol_index drop indication */
185649b49cdaSZbigniew Bodek 	uint32_t rfw_in_prot_i_drop;
185749b49cdaSZbigniew Bodek 	/* EEE, number of times the system went into EEE state */
185849b49cdaSZbigniew Bodek 	uint32_t eee_in;
185949b49cdaSZbigniew Bodek };
186049b49cdaSZbigniew Bodek 
186149b49cdaSZbigniew Bodek /**
186249b49cdaSZbigniew Bodek  * get ec statistics
186349b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
186449b49cdaSZbigniew Bodek  * @param stats pointer to structure that will be filled with statistics.
186549b49cdaSZbigniew Bodek  *
186649b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
186749b49cdaSZbigniew Bodek  */
186849b49cdaSZbigniew Bodek int al_eth_ec_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_ec_stats *stats);
186949b49cdaSZbigniew Bodek 
187049b49cdaSZbigniew Bodek struct al_eth_ec_stat_udma{
187149b49cdaSZbigniew Bodek 	/* Rx forwarding output packet counter */
187249b49cdaSZbigniew Bodek 	uint32_t rfw_out_rx_pkt;
187349b49cdaSZbigniew Bodek 	/* Rx forwarding output drop packet counter */
187449b49cdaSZbigniew Bodek 	uint32_t rfw_out_drop;
187549b49cdaSZbigniew Bodek 	/* Multi-stream write, number of Rx packets */
187649b49cdaSZbigniew Bodek 	uint32_t msw_in_rx_pkt;
187749b49cdaSZbigniew Bodek 	/* Multi-stream write, number of dropped packets at SOP,  Q full indication */
187849b49cdaSZbigniew Bodek 	uint32_t msw_drop_q_full;
187949b49cdaSZbigniew Bodek 	/* Multi-stream write, number of dropped packets at SOP */
188049b49cdaSZbigniew Bodek 	uint32_t msw_drop_sop;
188149b49cdaSZbigniew Bodek 	/* Multi-stream write, number of dropped packets at EOP, */
188249b49cdaSZbigniew Bodek 	/*EOP was written with error indication (not all packet data was written) */
188349b49cdaSZbigniew Bodek 	uint32_t msw_drop_eop;
188449b49cdaSZbigniew Bodek 	/* Multi-stream write, number of packets written to the stream FIFO with EOP and without packet loss */
188549b49cdaSZbigniew Bodek 	uint32_t msw_wr_eop;
188649b49cdaSZbigniew Bodek 	/* Multi-stream write, number of packets read from the FIFO into the stream */
188749b49cdaSZbigniew Bodek 	uint32_t msw_out_rx_pkt;
188849b49cdaSZbigniew Bodek 	/* Number of transmitted packets without TSO enabled */
188949b49cdaSZbigniew Bodek 	uint32_t tso_no_tso_pkt;
189049b49cdaSZbigniew Bodek 	/* Number of transmitted packets with TSO enabled */
189149b49cdaSZbigniew Bodek 	uint32_t tso_tso_pkt;
189249b49cdaSZbigniew Bodek 	/* Number of TSO segments that were generated */
189349b49cdaSZbigniew Bodek 	uint32_t tso_seg_pkt;
189449b49cdaSZbigniew Bodek 	/* Number of TSO segments that required padding */
189549b49cdaSZbigniew Bodek 	uint32_t tso_pad_pkt;
189649b49cdaSZbigniew Bodek 	/* Tx Packet modification, MAC SA spoof error */
189749b49cdaSZbigniew Bodek 	uint32_t tpm_tx_spoof;
189849b49cdaSZbigniew Bodek 	/* Tx MAC interface, input packet counter */
189949b49cdaSZbigniew Bodek 	uint32_t tmi_in_tx_pkt;
190049b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of packets forwarded to the MAC */
190149b49cdaSZbigniew Bodek 	uint32_t tmi_out_to_mac;
190249b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of packets forwarded to the Rx data path */
190349b49cdaSZbigniew Bodek 	uint32_t tmi_out_to_rx;
190449b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted bytes */
190549b49cdaSZbigniew Bodek 	uint32_t tx_q0_bytes;
190649b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted bytes */
190749b49cdaSZbigniew Bodek 	uint32_t tx_q1_bytes;
190849b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted bytes */
190949b49cdaSZbigniew Bodek 	uint32_t tx_q2_bytes;
191049b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted bytes */
191149b49cdaSZbigniew Bodek 	uint32_t tx_q3_bytes;
191249b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted packets */
191349b49cdaSZbigniew Bodek 	uint32_t tx_q0_pkts;
191449b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted packets */
191549b49cdaSZbigniew Bodek 	uint32_t tx_q1_pkts;
191649b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted packets */
191749b49cdaSZbigniew Bodek 	uint32_t tx_q2_pkts;
191849b49cdaSZbigniew Bodek 	/* Tx MAC interface, number of transmitted packets */
191949b49cdaSZbigniew Bodek 	uint32_t tx_q3_pkts;
192049b49cdaSZbigniew Bodek };
192149b49cdaSZbigniew Bodek 
192249b49cdaSZbigniew Bodek /**
192349b49cdaSZbigniew Bodek  * get per_udma statistics
192449b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure.
192549b49cdaSZbigniew Bodek  * @param idx udma_id value
192649b49cdaSZbigniew Bodek  * @param stats pointer to structure that will be filled with statistics.
192749b49cdaSZbigniew Bodek  *
192849b49cdaSZbigniew Bodek  * @return return 0 on success. otherwise on failure.
192949b49cdaSZbigniew Bodek  */
193049b49cdaSZbigniew Bodek int al_eth_ec_stat_udma_get(struct al_hal_eth_adapter *adapter, uint8_t idx, struct al_eth_ec_stat_udma *stats);
193149b49cdaSZbigniew Bodek 
193249b49cdaSZbigniew Bodek /* trafic control */
193349b49cdaSZbigniew Bodek 
193449b49cdaSZbigniew Bodek /**
193549b49cdaSZbigniew Bodek  * perform Function Level Reset RMN
193649b49cdaSZbigniew Bodek  *
193749b49cdaSZbigniew Bodek  * Addressing RMN: 714
193849b49cdaSZbigniew Bodek  *
193949b49cdaSZbigniew Bodek  * @param pci_read_config_u32 pointer to function that reads register from pci header
194049b49cdaSZbigniew Bodek  * @param pci_write_config_u32 pointer to function that writes register from pci header
194149b49cdaSZbigniew Bodek  * @param handle pointer passes to the above functions as first parameter
194249b49cdaSZbigniew Bodek  * @param mac_base base address of the MAC registers
194349b49cdaSZbigniew Bodek  *
194449b49cdaSZbigniew Bodek  * @return 0.
194549b49cdaSZbigniew Bodek  */
194649b49cdaSZbigniew Bodek int al_eth_flr_rmn(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val),
194749b49cdaSZbigniew Bodek 		   int (* pci_write_config_u32)(void *handle, int where, uint32_t val),
194849b49cdaSZbigniew Bodek 		   void *handle,
194949b49cdaSZbigniew Bodek 		   void __iomem	*mac_base);
195049b49cdaSZbigniew Bodek 
195149b49cdaSZbigniew Bodek /**
195249b49cdaSZbigniew Bodek  * perform Function Level Reset RMN but restore registers that contain board specific data
195349b49cdaSZbigniew Bodek  *
195449b49cdaSZbigniew Bodek  * the data that save and restored is the board params and mac addresses
195549b49cdaSZbigniew Bodek  *
195649b49cdaSZbigniew Bodek  * @param pci_read_config_u32 pointer to function that reads register from pci header
195749b49cdaSZbigniew Bodek  * @param pci_write_config_u32 pointer to function that writes register from pci header
195849b49cdaSZbigniew Bodek  * @param handle pointer passes to the above functions as first parameter
195949b49cdaSZbigniew Bodek  * @param mac_base base address of the MAC registers
196049b49cdaSZbigniew Bodek  * @param ec_base base address of the Ethernet Controller registers
196149b49cdaSZbigniew Bodek  * @param mac_addresses_num number of mac addresses to restore
196249b49cdaSZbigniew Bodek  *
196349b49cdaSZbigniew Bodek  * @return 0.
196449b49cdaSZbigniew Bodek  */
196549b49cdaSZbigniew Bodek int al_eth_flr_rmn_restore_params(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val),
196649b49cdaSZbigniew Bodek 		int (* pci_write_config_u32)(void *handle, int where, uint32_t val),
196749b49cdaSZbigniew Bodek 		void *handle,
196849b49cdaSZbigniew Bodek 		void __iomem	*mac_base,
196949b49cdaSZbigniew Bodek 		void __iomem	*ec_base,
197049b49cdaSZbigniew Bodek 		int	mac_addresses_num);
197149b49cdaSZbigniew Bodek 
197249b49cdaSZbigniew Bodek /* board specific information (media type, phy address, etc.. */
197349b49cdaSZbigniew Bodek 
197449b49cdaSZbigniew Bodek 
197549b49cdaSZbigniew Bodek enum al_eth_board_media_type {
197649b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_AUTO_DETECT		= 0,
197749b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_RGMII			= 1,
197849b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_10GBASE_SR		= 2,
197949b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_SGMII			= 3,
198049b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_1000BASE_X		= 4,
198149b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_AUTO_DETECT_AUTO_SPEED	= 5,
198249b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_SGMII_2_5G		= 6,
198349b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MEDIA_TYPE_NBASE_T			= 7,
1984*3fc36ee0SWojciech Macek 	AL_ETH_BOARD_MEDIA_TYPE_25G			= 8,
198549b49cdaSZbigniew Bodek };
198649b49cdaSZbigniew Bodek 
198749b49cdaSZbigniew Bodek enum al_eth_board_mdio_freq {
198849b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MDIO_FREQ_2_5_MHZ	= 0,
198949b49cdaSZbigniew Bodek 	AL_ETH_BOARD_MDIO_FREQ_1_MHZ	= 1,
199049b49cdaSZbigniew Bodek };
199149b49cdaSZbigniew Bodek 
199249b49cdaSZbigniew Bodek enum al_eth_board_ext_phy_if {
199349b49cdaSZbigniew Bodek 	AL_ETH_BOARD_PHY_IF_MDIO	= 0,
199449b49cdaSZbigniew Bodek 	AL_ETH_BOARD_PHY_IF_XMDIO	= 1,
199549b49cdaSZbigniew Bodek 	AL_ETH_BOARD_PHY_IF_I2C		= 2,
199649b49cdaSZbigniew Bodek 
199749b49cdaSZbigniew Bodek };
199849b49cdaSZbigniew Bodek 
199949b49cdaSZbigniew Bodek enum al_eth_board_auto_neg_mode {
200049b49cdaSZbigniew Bodek 	AL_ETH_BOARD_AUTONEG_OUT_OF_BAND	= 0,
200149b49cdaSZbigniew Bodek 	AL_ETH_BOARD_AUTONEG_IN_BAND		= 1,
200249b49cdaSZbigniew Bodek 
200349b49cdaSZbigniew Bodek };
200449b49cdaSZbigniew Bodek 
200549b49cdaSZbigniew Bodek /* declare the 1G mac active speed when auto negotiation disabled */
200649b49cdaSZbigniew Bodek enum al_eth_board_1g_speed {
200749b49cdaSZbigniew Bodek 	AL_ETH_BOARD_1G_SPEED_1000M		= 0,
200849b49cdaSZbigniew Bodek 	AL_ETH_BOARD_1G_SPEED_100M		= 1,
200949b49cdaSZbigniew Bodek 	AL_ETH_BOARD_1G_SPEED_10M		= 2,
201049b49cdaSZbigniew Bodek };
201149b49cdaSZbigniew Bodek 
201249b49cdaSZbigniew Bodek enum al_eth_retimer_channel {
201349b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_CHANNEL_A		= 0,
201449b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_CHANNEL_B		= 1,
201549b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_CHANNEL_C		= 2,
201649b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_CHANNEL_D		= 3,
2017*3fc36ee0SWojciech Macek 	AL_ETH_RETIMER_CHANNEL_E		= 4,
2018*3fc36ee0SWojciech Macek 	AL_ETH_RETIMER_CHANNEL_F		= 5,
2019*3fc36ee0SWojciech Macek 	AL_ETH_RETIMER_CHANNEL_G		= 6,
2020*3fc36ee0SWojciech Macek 	AL_ETH_RETIMER_CHANNEL_H		= 7,
2021*3fc36ee0SWojciech Macek 	AL_ETH_RETIMER_CHANNEL_MAX		= 8
202249b49cdaSZbigniew Bodek };
202349b49cdaSZbigniew Bodek 
202449b49cdaSZbigniew Bodek /* list of supported retimers */
202549b49cdaSZbigniew Bodek enum al_eth_retimer_type {
202649b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_BR_210			= 0,
202749b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_BR_410			= 1,
2028*3fc36ee0SWojciech Macek 	AL_ETH_RETIMER_DS_25			= 2,
202949b49cdaSZbigniew Bodek 
203049b49cdaSZbigniew Bodek 	AL_ETH_RETIMER_TYPE_MAX			= 4,
203149b49cdaSZbigniew Bodek };
203249b49cdaSZbigniew Bodek 
203349b49cdaSZbigniew Bodek /** structure represents the board information. this info set by boot loader
203449b49cdaSZbigniew Bodek  * and read by OS driver.
203549b49cdaSZbigniew Bodek  */
203649b49cdaSZbigniew Bodek struct al_eth_board_params {
203749b49cdaSZbigniew Bodek 	enum al_eth_board_media_type	media_type;
203849b49cdaSZbigniew Bodek 	al_bool		phy_exist; /**< external phy exist */
203949b49cdaSZbigniew Bodek 	uint8_t		phy_mdio_addr; /**< mdio address of external phy */
204049b49cdaSZbigniew Bodek 	al_bool		sfp_plus_module_exist; /**< SFP+ module connected */
204149b49cdaSZbigniew Bodek 	al_bool		autoneg_enable; /**< enable Auto-Negotiation */
204249b49cdaSZbigniew Bodek 	al_bool		kr_lt_enable; /**< enable KR Link-Training */
204349b49cdaSZbigniew Bodek 	al_bool		kr_fec_enable; /**< enable KR FEC */
204449b49cdaSZbigniew Bodek 	enum al_eth_board_mdio_freq	mdio_freq; /**< MDIO frequency */
204549b49cdaSZbigniew Bodek 	uint8_t		i2c_adapter_id; /**< identifier for the i2c adapter to use to access SFP+ module */
204649b49cdaSZbigniew Bodek 	enum al_eth_board_ext_phy_if	phy_if; /**< phy interface */
204749b49cdaSZbigniew Bodek 	enum al_eth_board_auto_neg_mode	an_mode; /**< auto-negotiation mode (in-band / out-of-band) */
204849b49cdaSZbigniew Bodek 	uint8_t		serdes_grp; /**< serdes's group id */
204949b49cdaSZbigniew Bodek 	uint8_t		serdes_lane; /**< serdes's lane id */
205049b49cdaSZbigniew Bodek 	enum al_eth_ref_clk_freq	ref_clk_freq; /**< reference clock frequency */
205149b49cdaSZbigniew Bodek 	al_bool		dont_override_serdes; /**< prevent override serdes parameters */
205249b49cdaSZbigniew Bodek 	al_bool		force_1000_base_x; /**< set mac to 1000 base-x mode (instead sgmii) */
205349b49cdaSZbigniew Bodek 	al_bool		an_disable; /**< disable auto negotiation */
205449b49cdaSZbigniew Bodek 	enum al_eth_board_1g_speed	speed; /**< port speed if AN disabled */
205549b49cdaSZbigniew Bodek 	al_bool		half_duplex; /**< force half duplex if AN disabled */
205649b49cdaSZbigniew Bodek 	al_bool		fc_disable; /**< disable flow control */
205749b49cdaSZbigniew Bodek 	al_bool		retimer_exist; /**< retimer is exist on the board */
205849b49cdaSZbigniew Bodek 	uint8_t		retimer_bus_id; /**< in what i2c bus the retimer is on */
205949b49cdaSZbigniew Bodek 	uint8_t		retimer_i2c_addr; /**< i2c address of the retimer */
2060*3fc36ee0SWojciech Macek 	enum al_eth_retimer_channel retimer_channel; /**< what channel connected to this port (Rx) */
206149b49cdaSZbigniew Bodek 	al_bool		dac; /**< assume direct attached cable is connected if auto detect is off or failed */
206249b49cdaSZbigniew Bodek 	uint8_t		dac_len; /**< assume this cable length if auto detect is off or failed  */
206349b49cdaSZbigniew Bodek 	enum al_eth_retimer_type retimer_type; /**< the type of the specific retimer */
2064*3fc36ee0SWojciech Macek 	enum al_eth_retimer_channel retimer_tx_channel; /**< what channel connected to this port (Tx) */
2065*3fc36ee0SWojciech Macek 	uint8_t		gpio_sfp_present; /**< gpio number of sfp present for this port. 0 if not exist */
206649b49cdaSZbigniew Bodek };
206749b49cdaSZbigniew Bodek 
206849b49cdaSZbigniew Bodek /**
206949b49cdaSZbigniew Bodek  * set board parameter of the eth port
207049b49cdaSZbigniew Bodek  * this function used to set the board parameters into scratchpad
207149b49cdaSZbigniew Bodek  * registers. those paramters can be read later by OS driver.
207249b49cdaSZbigniew Bodek  *
207349b49cdaSZbigniew Bodek  * @param mac_base the virtual address of the mac registers (PCI BAR 2)
207449b49cdaSZbigniew Bodek  * @param params pointer to structure the includes the paramters
207549b49cdaSZbigniew Bodek  *
207649b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
207749b49cdaSZbigniew Bodek  */
207849b49cdaSZbigniew Bodek int al_eth_board_params_set(void * __iomem mac_base, struct al_eth_board_params *params);
207949b49cdaSZbigniew Bodek 
208049b49cdaSZbigniew Bodek /**
208149b49cdaSZbigniew Bodek  * get board parameter of the eth port
208249b49cdaSZbigniew Bodek  * this function used to get the board parameters from scratchpad
208349b49cdaSZbigniew Bodek  * registers.
208449b49cdaSZbigniew Bodek  *
208549b49cdaSZbigniew Bodek  * @param mac_base the virtual address of the mac registers (PCI BAR 2)
208649b49cdaSZbigniew Bodek  * @param params pointer to structure where the parameters will be stored.
208749b49cdaSZbigniew Bodek  *
208849b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
208949b49cdaSZbigniew Bodek  */
209049b49cdaSZbigniew Bodek int al_eth_board_params_get(void * __iomem mac_base, struct al_eth_board_params *params);
209149b49cdaSZbigniew Bodek 
209249b49cdaSZbigniew Bodek /*
209349b49cdaSZbigniew Bodek  * Wake-On-Lan (WoL)
209449b49cdaSZbigniew Bodek  *
209549b49cdaSZbigniew Bodek  * The following few functions configure the Wake-On-Lan packet detection
209649b49cdaSZbigniew Bodek  * inside the Integrated Ethernet MAC.
209749b49cdaSZbigniew Bodek  *
209849b49cdaSZbigniew Bodek  * There are other alternative ways to set WoL, such using the
209949b49cdaSZbigniew Bodek  * external 1000Base-T transceiver to set WoL mode.
210049b49cdaSZbigniew Bodek  *
210149b49cdaSZbigniew Bodek  * These APIs do not set the system-wide power-state, nor responsible on the
210249b49cdaSZbigniew Bodek  * transition from Sleep to Normal power state.
210349b49cdaSZbigniew Bodek  *
210449b49cdaSZbigniew Bodek  * For system level considerations, please refer to Annapurna Labs Alpine Wiki.
210549b49cdaSZbigniew Bodek  */
210649b49cdaSZbigniew Bodek /* Interrupt enable WoL MAC DA Unicast detected  packet */
210749b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_UNICAST		AL_BIT(0)
210849b49cdaSZbigniew Bodek /* Interrupt enable WoL L2 Multicast detected  packet */
210949b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_MULTICAST	AL_BIT(1)
211049b49cdaSZbigniew Bodek /* Interrupt enable WoL L2 Broadcast detected  packet */
211149b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_BROADCAST	AL_BIT(2)
211249b49cdaSZbigniew Bodek /* Interrupt enable WoL IPv4 detected  packet */
211349b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_IPV4		AL_BIT(3)
211449b49cdaSZbigniew Bodek /* Interrupt enable WoL IPv6 detected  packet */
211549b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_IPV6		AL_BIT(4)
211649b49cdaSZbigniew Bodek /* Interrupt enable WoL EtherType+MAC DA detected  packet */
211749b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_ETHERTYPE_DA	AL_BIT(5)
211849b49cdaSZbigniew Bodek /* Interrupt enable WoL EtherType+L2 Broadcast detected  packet */
211949b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_ETHERTYPE_BC	AL_BIT(6)
212049b49cdaSZbigniew Bodek /* Interrupt enable WoL parser detected  packet */
212149b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_PARSER		AL_BIT(7)
212249b49cdaSZbigniew Bodek /* Interrupt enable WoL magic detected  packet */
212349b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_MAGIC		AL_BIT(8)
212449b49cdaSZbigniew Bodek /* Interrupt enable WoL magic+password detected  packet */
212549b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_MAGIC_PSWD	AL_BIT(9)
212649b49cdaSZbigniew Bodek 
212749b49cdaSZbigniew Bodek /* Forward enable WoL MAC DA Unicast detected  packet */
212849b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_UNICAST		AL_BIT(0)
212949b49cdaSZbigniew Bodek /* Forward enable WoL L2 Multicast detected  packet */
213049b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_MULTICAST	AL_BIT(1)
213149b49cdaSZbigniew Bodek /* Forward enable WoL L2 Broadcast detected  packet */
213249b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_BROADCAST	AL_BIT(2)
213349b49cdaSZbigniew Bodek /* Forward enable WoL IPv4 detected  packet */
213449b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_IPV4		AL_BIT(3)
213549b49cdaSZbigniew Bodek /* Forward enable WoL IPv6 detected  packet */
213649b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_IPV6		AL_BIT(4)
213749b49cdaSZbigniew Bodek /* Forward enable WoL EtherType+MAC DA detected  packet */
213849b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_ETHERTYPE_DA	AL_BIT(5)
213949b49cdaSZbigniew Bodek /* Forward enable WoL EtherType+L2 Broadcast detected  packet */
214049b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_ETHERTYPE_BC	AL_BIT(6)
214149b49cdaSZbigniew Bodek /* Forward enable WoL parser detected  packet */
214249b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_PARSER		AL_BIT(7)
214349b49cdaSZbigniew Bodek 
214449b49cdaSZbigniew Bodek struct al_eth_wol_params {
214549b49cdaSZbigniew Bodek 	uint8_t *dest_addr; /**< 6 bytes array of destanation address for
214649b49cdaSZbigniew Bodek 				 magic packet detection */
214749b49cdaSZbigniew Bodek 	uint8_t *pswd; /**< 6 bytes array of the password to use */
214849b49cdaSZbigniew Bodek 	uint8_t *ipv4; /**< 4 bytes array of the ipv4 to use.
214949b49cdaSZbigniew Bodek 			    example: for ip = 192.168.1.2
215049b49cdaSZbigniew Bodek 			       ipv4[0]=2, ipv4[1]=1, ipv4[2]=168, ipv4[3]=192 */
215149b49cdaSZbigniew Bodek 	uint8_t *ipv6; /** 16 bytes array of the ipv6 to use.
215249b49cdaSZbigniew Bodek 			   example: ip = 2607:f0d0:1002:0051:0000:0000:5231:1234
215349b49cdaSZbigniew Bodek 			       ipv6[0]=34, ipv6[1]=12, ipv6[2]=31 .. */
215449b49cdaSZbigniew Bodek 	uint16_t ethr_type1; /**< first ethertype to use */
215549b49cdaSZbigniew Bodek 	uint16_t ethr_type2; /**< secound ethertype to use */
215649b49cdaSZbigniew Bodek 	uint16_t forward_mask; /**< bitmask of AL_ETH_WOL_FWRD_* of the packet
215749b49cdaSZbigniew Bodek 				    types needed to be forward. */
215849b49cdaSZbigniew Bodek 	uint16_t int_mask; /**< bitmask of AL_ETH_WOL_INT_* of the packet types
215949b49cdaSZbigniew Bodek 				that will send interrupt to wake the system. */
216049b49cdaSZbigniew Bodek };
216149b49cdaSZbigniew Bodek 
216249b49cdaSZbigniew Bodek /**
216349b49cdaSZbigniew Bodek  * enable the wol mechanism
216449b49cdaSZbigniew Bodek  * set what type of packets will wake up the system and what type of packets
216549b49cdaSZbigniew Bodek  * neet to forward after the system is up
216649b49cdaSZbigniew Bodek  *
216749b49cdaSZbigniew Bodek  * beside this function wol filter also need to be set by
216849b49cdaSZbigniew Bodek  * calling al_eth_filter_config with AL_ETH_RFW_FILTER_WOL
216949b49cdaSZbigniew Bodek  *
217049b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
217149b49cdaSZbigniew Bodek  * @param wol the parameters needed to configure the wol
217249b49cdaSZbigniew Bodek  *
217349b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
217449b49cdaSZbigniew Bodek  */
217549b49cdaSZbigniew Bodek int al_eth_wol_enable(
217649b49cdaSZbigniew Bodek 		struct al_hal_eth_adapter *adapter,
217749b49cdaSZbigniew Bodek 		struct al_eth_wol_params *wol);
217849b49cdaSZbigniew Bodek 
217949b49cdaSZbigniew Bodek /**
218049b49cdaSZbigniew Bodek  * Disable the WoL mechnism.
218149b49cdaSZbigniew Bodek  *
218249b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
218349b49cdaSZbigniew Bodek  *
218449b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
218549b49cdaSZbigniew Bodek  */
218649b49cdaSZbigniew Bodek int al_eth_wol_disable(
218749b49cdaSZbigniew Bodek 		struct al_hal_eth_adapter *adapter);
218849b49cdaSZbigniew Bodek 
218949b49cdaSZbigniew Bodek /**
219049b49cdaSZbigniew Bodek  * Configure tx fwd vlan table entry
219149b49cdaSZbigniew Bodek  *
219249b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
219349b49cdaSZbigniew Bodek  * @param idx the entry index within the vlan table. The HW uses the vlan id
219449b49cdaSZbigniew Bodek  * field of the packet when accessing this table.
219549b49cdaSZbigniew Bodek  * @param udma_mask vlan table value that indicates that the packet should be forward back to
219649b49cdaSZbigniew Bodek  * the udmas, through the Rx path (udma_mask is one-hot representation)
219749b49cdaSZbigniew Bodek  * @param fwd_to_mac vlan table value that indicates that the packet should be forward to mac
219849b49cdaSZbigniew Bodek  *
219949b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
220049b49cdaSZbigniew Bodek  */
220149b49cdaSZbigniew 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);
220249b49cdaSZbigniew Bodek 
220349b49cdaSZbigniew Bodek /** Tx Generic protocol detect Cam compare table entry  */
220449b49cdaSZbigniew Bodek struct al_eth_tx_gpd_cam_entry {
220549b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID l3_proto_idx;
220649b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID l4_proto_idx;
220749b49cdaSZbigniew Bodek 	enum AL_ETH_TX_TUNNEL_MODE tunnel_control;
220849b49cdaSZbigniew Bodek 	uint8_t source_vlan_count:2;
220949b49cdaSZbigniew Bodek 	uint8_t tx_gpd_cam_ctrl:1;
221049b49cdaSZbigniew Bodek 	uint8_t l3_proto_idx_mask:5;
221149b49cdaSZbigniew Bodek 	uint8_t l4_proto_idx_mask:5;
221249b49cdaSZbigniew Bodek 	uint8_t tunnel_control_mask:3;
221349b49cdaSZbigniew Bodek 	uint8_t source_vlan_count_mask:2;
221449b49cdaSZbigniew Bodek };
221549b49cdaSZbigniew Bodek 
221649b49cdaSZbigniew Bodek /** Rx Generic protocol detect Cam compare table entry  */
221749b49cdaSZbigniew Bodek struct al_eth_rx_gpd_cam_entry {
221849b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID outer_l3_proto_idx;
221949b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID outer_l4_proto_idx;
222049b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID inner_l3_proto_idx;
222149b49cdaSZbigniew Bodek 	enum AL_ETH_PROTO_ID inner_l4_proto_idx;
222249b49cdaSZbigniew Bodek 	uint8_t parse_ctrl;
222349b49cdaSZbigniew Bodek 	uint8_t outer_l3_len;
222449b49cdaSZbigniew Bodek 	uint8_t l3_priority;
222549b49cdaSZbigniew Bodek 	uint8_t l4_dst_port_lsb;
222649b49cdaSZbigniew Bodek 	uint8_t rx_gpd_cam_ctrl:1;
222749b49cdaSZbigniew Bodek 	uint8_t outer_l3_proto_idx_mask:5;
222849b49cdaSZbigniew Bodek 	uint8_t outer_l4_proto_idx_mask:5;
222949b49cdaSZbigniew Bodek 	uint8_t inner_l3_proto_idx_mask:5;
223049b49cdaSZbigniew Bodek 	uint8_t inner_l4_proto_idx_mask:5;
223149b49cdaSZbigniew Bodek 	uint8_t parse_ctrl_mask;
223249b49cdaSZbigniew Bodek 	uint8_t outer_l3_len_mask;
223349b49cdaSZbigniew Bodek 	uint8_t l3_priority_mask;
223449b49cdaSZbigniew Bodek 	uint8_t l4_dst_port_lsb_mask;
223549b49cdaSZbigniew Bodek };
223649b49cdaSZbigniew Bodek 
223749b49cdaSZbigniew Bodek enum AL_ETH_TX_GCP_ALU_OPSEL {
223849b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_L3_OFFSET			= 0,
223949b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_OUTER_L3_OFFSET		= 1,
224049b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_L3_LEN			= 2,
224149b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_OUTER_L3_LEN			= 3,
224249b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_L4_OFFSET			= 4,
224349b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_L4_LEN			= 5,
224449b49cdaSZbigniew Bodek 	AL_ETH_TX_GCP_ALU_TABLE_VAL			= 10
224549b49cdaSZbigniew Bodek };
224649b49cdaSZbigniew Bodek 
224749b49cdaSZbigniew Bodek enum AL_ETH_RX_GCP_ALU_OPSEL {
224849b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_OUTER_L3_OFFSET		= 0,
224949b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_INNER_L3_OFFSET		= 1,
225049b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_OUTER_L4_OFFSET		= 2,
225149b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_INNER_L4_OFFSET		= 3,
225249b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_OUTER_L3_HDR_LEN_LAT		= 4,
225349b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_INNER_L3_HDR_LEN_LAT		= 5,
225449b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_OUTER_L3_HDR_LEN_SEL		= 6,
225549b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_INNER_L3_HDR_LEN_SEL		= 7,
225649b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_PARSE_RESULT_VECTOR_OFFSET_1	= 8,
225749b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_PARSE_RESULT_VECTOR_OFFSET_2	= 9,
225849b49cdaSZbigniew Bodek 	AL_ETH_RX_GCP_ALU_TABLE_VAL			= 10
225949b49cdaSZbigniew Bodek };
226049b49cdaSZbigniew Bodek 
226149b49cdaSZbigniew Bodek /** Tx Generic crc prameters table entry  */
226249b49cdaSZbigniew Bodek 
226349b49cdaSZbigniew Bodek struct al_eth_tx_gcp_table_entry {
226449b49cdaSZbigniew Bodek 	uint8_t poly_sel:1;
226549b49cdaSZbigniew Bodek 	uint8_t crc32_bit_comp:1;
226649b49cdaSZbigniew Bodek 	uint8_t crc32_bit_swap:1;
226749b49cdaSZbigniew Bodek 	uint8_t crc32_byte_swap:1;
226849b49cdaSZbigniew Bodek 	uint8_t data_bit_swap:1;
226949b49cdaSZbigniew Bodek 	uint8_t data_byte_swap:1;
227049b49cdaSZbigniew Bodek 	uint8_t trail_size:4;
227149b49cdaSZbigniew Bodek 	uint8_t head_size:8;
227249b49cdaSZbigniew Bodek 	uint8_t head_calc:1;
227349b49cdaSZbigniew Bodek 	uint8_t mask_polarity:1;
227449b49cdaSZbigniew Bodek 	enum AL_ETH_ALU_OPCODE tx_alu_opcode_1;
227549b49cdaSZbigniew Bodek 	enum AL_ETH_ALU_OPCODE tx_alu_opcode_2;
227649b49cdaSZbigniew Bodek 	enum AL_ETH_ALU_OPCODE tx_alu_opcode_3;
227749b49cdaSZbigniew Bodek 	enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_1;
227849b49cdaSZbigniew Bodek 	enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_2;
227949b49cdaSZbigniew Bodek 	enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_3;
228049b49cdaSZbigniew Bodek 	enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_4;
228149b49cdaSZbigniew Bodek 	uint32_t gcp_mask[6];
228249b49cdaSZbigniew Bodek 	uint32_t crc_init;
228349b49cdaSZbigniew Bodek 	uint8_t gcp_table_res:7;
228449b49cdaSZbigniew Bodek 	uint16_t alu_val:9;
228549b49cdaSZbigniew Bodek };
228649b49cdaSZbigniew Bodek 
228749b49cdaSZbigniew Bodek /** Rx Generic crc prameters table entry  */
228849b49cdaSZbigniew Bodek 
228949b49cdaSZbigniew Bodek struct al_eth_rx_gcp_table_entry {
229049b49cdaSZbigniew Bodek 	uint8_t poly_sel:1;
229149b49cdaSZbigniew Bodek 	uint8_t crc32_bit_comp:1;
229249b49cdaSZbigniew Bodek 	uint8_t crc32_bit_swap:1;
229349b49cdaSZbigniew Bodek 	uint8_t crc32_byte_swap:1;
229449b49cdaSZbigniew Bodek 	uint8_t data_bit_swap:1;
229549b49cdaSZbigniew Bodek 	uint8_t data_byte_swap:1;
229649b49cdaSZbigniew Bodek 	uint8_t trail_size:4;
229749b49cdaSZbigniew Bodek 	uint8_t head_size:8;
229849b49cdaSZbigniew Bodek 	uint8_t head_calc:1;
229949b49cdaSZbigniew Bodek 	uint8_t mask_polarity:1;
230049b49cdaSZbigniew Bodek 	enum AL_ETH_ALU_OPCODE rx_alu_opcode_1;
230149b49cdaSZbigniew Bodek 	enum AL_ETH_ALU_OPCODE rx_alu_opcode_2;
230249b49cdaSZbigniew Bodek 	enum AL_ETH_ALU_OPCODE rx_alu_opcode_3;
230349b49cdaSZbigniew Bodek 	enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_1;
230449b49cdaSZbigniew Bodek 	enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_2;
230549b49cdaSZbigniew Bodek 	enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_3;
230649b49cdaSZbigniew Bodek 	enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_4;
230749b49cdaSZbigniew Bodek 	uint32_t gcp_mask[6];
230849b49cdaSZbigniew Bodek 	uint32_t crc_init;
230949b49cdaSZbigniew Bodek 	uint32_t gcp_table_res:27;
231049b49cdaSZbigniew Bodek 	uint16_t alu_val:9;
231149b49cdaSZbigniew Bodek };
231249b49cdaSZbigniew Bodek 
231349b49cdaSZbigniew Bodek /** Tx per_protocol_number crc & l3_checksum & l4_checksum command table entry  */
231449b49cdaSZbigniew Bodek 
231549b49cdaSZbigniew Bodek struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry {
231649b49cdaSZbigniew Bodek         al_bool crc_en_00; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 0 */
231749b49cdaSZbigniew Bodek         al_bool crc_en_01; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 1 */
231849b49cdaSZbigniew Bodek         al_bool crc_en_10; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 0 */
231949b49cdaSZbigniew Bodek         al_bool crc_en_11; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 1 */
232049b49cdaSZbigniew Bodek         al_bool l4_csum_en_00; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 0 */
232149b49cdaSZbigniew Bodek         al_bool l4_csum_en_01; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 1 */
232249b49cdaSZbigniew Bodek         al_bool l4_csum_en_10; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 0 */
232349b49cdaSZbigniew Bodek         al_bool l4_csum_en_11; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 1 */
232449b49cdaSZbigniew Bodek         al_bool l3_csum_en_00; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 0 */
232549b49cdaSZbigniew Bodek         al_bool l3_csum_en_01; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 1 */
232649b49cdaSZbigniew Bodek         al_bool l3_csum_en_10; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 0 */
232749b49cdaSZbigniew Bodek         al_bool l3_csum_en_11; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 1 */
232849b49cdaSZbigniew Bodek };
232949b49cdaSZbigniew Bodek 
233049b49cdaSZbigniew Bodek /**
233149b49cdaSZbigniew Bodek  * Configure tx_gpd_entry
233249b49cdaSZbigniew Bodek  *
233349b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
233449b49cdaSZbigniew Bodek  * @param idx the entry index
233549b49cdaSZbigniew Bodek  * @param tx_gpd_entry entry data for the Tx protocol detect Cam compare table
233649b49cdaSZbigniew Bodek  *
233749b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
233849b49cdaSZbigniew Bodek  *
233949b49cdaSZbigniew Bodek  */
234049b49cdaSZbigniew Bodek int al_eth_tx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
234149b49cdaSZbigniew Bodek 		struct al_eth_tx_gpd_cam_entry *tx_gpd_entry);
234249b49cdaSZbigniew Bodek 
234349b49cdaSZbigniew Bodek /**
234449b49cdaSZbigniew Bodek  * Configure tx_gcp_entry
234549b49cdaSZbigniew Bodek  *
234649b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
234749b49cdaSZbigniew Bodek  * @param idx the entry index
234849b49cdaSZbigniew Bodek  * @param tx_gcp_entry entry data for the Tx Generic crc prameters table
234949b49cdaSZbigniew Bodek  *
235049b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
235149b49cdaSZbigniew Bodek  *
235249b49cdaSZbigniew Bodek  */
235349b49cdaSZbigniew Bodek int al_eth_tx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
235449b49cdaSZbigniew Bodek 		struct al_eth_tx_gcp_table_entry *tx_gcp_entry);
235549b49cdaSZbigniew Bodek 
235649b49cdaSZbigniew Bodek /**
235749b49cdaSZbigniew Bodek  * Configure tx_crc_chksum_replace_cmd_entry
235849b49cdaSZbigniew Bodek  *
235949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
236049b49cdaSZbigniew Bodek  * @param idx the entry index
236149b49cdaSZbigniew Bodek  * @param tx_replace_entry entry data for the Tx crc_&_l3_checksum_&_l4_checksum replace command table
236249b49cdaSZbigniew Bodek  *
236349b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
236449b49cdaSZbigniew Bodek  *
236549b49cdaSZbigniew Bodek  */
236649b49cdaSZbigniew Bodek int al_eth_tx_crc_chksum_replace_cmd_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
236749b49cdaSZbigniew Bodek 		struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry *tx_replace_entry);
236849b49cdaSZbigniew Bodek 
236949b49cdaSZbigniew Bodek /**
237049b49cdaSZbigniew Bodek  * Configure rx_gpd_entry
237149b49cdaSZbigniew Bodek  *
237249b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
237349b49cdaSZbigniew Bodek  * @param idx the entry index
237449b49cdaSZbigniew Bodek  * @param rx_gpd_entry entry data for the Tx protocol detect Cam compare table
237549b49cdaSZbigniew Bodek  *
237649b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
237749b49cdaSZbigniew Bodek  *
237849b49cdaSZbigniew Bodek  */
237949b49cdaSZbigniew Bodek int al_eth_rx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
238049b49cdaSZbigniew Bodek 		struct al_eth_rx_gpd_cam_entry *rx_gpd_entry);
238149b49cdaSZbigniew Bodek 
238249b49cdaSZbigniew Bodek /**
238349b49cdaSZbigniew Bodek  * Configure rx_gcp_entry
238449b49cdaSZbigniew Bodek  *
238549b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
238649b49cdaSZbigniew Bodek  * @param idx the entry index
238749b49cdaSZbigniew Bodek  * @param rx_gpd_entry entry data for the Tx protocol detect Cam compare table
238849b49cdaSZbigniew Bodek  * @param rx_gcp_entry entry data for the Tx Generic crc prameters table
238949b49cdaSZbigniew Bodek  *
239049b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
239149b49cdaSZbigniew Bodek  *
239249b49cdaSZbigniew Bodek  */
239349b49cdaSZbigniew Bodek int al_eth_rx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
239449b49cdaSZbigniew Bodek 		struct al_eth_rx_gcp_table_entry *rx_gcp_entry);
239549b49cdaSZbigniew Bodek 
239649b49cdaSZbigniew Bodek /**
239749b49cdaSZbigniew Bodek  * Configure tx_gpd_table and regs
239849b49cdaSZbigniew Bodek  *
239949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
240049b49cdaSZbigniew Bodek  *
240149b49cdaSZbigniew Bodek  */
240249b49cdaSZbigniew Bodek int al_eth_tx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter);
240349b49cdaSZbigniew Bodek 
240449b49cdaSZbigniew Bodek /**
240549b49cdaSZbigniew Bodek  * Configure crc_chksum_replace_cmd_table
240649b49cdaSZbigniew Bodek  *
240749b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
240849b49cdaSZbigniew Bodek  *
240949b49cdaSZbigniew Bodek  */
241049b49cdaSZbigniew Bodek int al_eth_tx_crc_chksum_replace_cmd_init(struct al_hal_eth_adapter *adapter);
241149b49cdaSZbigniew Bodek 
241249b49cdaSZbigniew Bodek /**
241349b49cdaSZbigniew Bodek  * Configure tx_gcp_table and regs
241449b49cdaSZbigniew Bodek  *
241549b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
241649b49cdaSZbigniew Bodek  *
241749b49cdaSZbigniew Bodek  */
241849b49cdaSZbigniew Bodek int al_eth_tx_generic_crc_table_init(struct al_hal_eth_adapter *adapter);
241949b49cdaSZbigniew Bodek 
242049b49cdaSZbigniew Bodek /**
242149b49cdaSZbigniew Bodek  * Configure rx_gpd_table and regs
242249b49cdaSZbigniew Bodek  *
242349b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
242449b49cdaSZbigniew Bodek  *
242549b49cdaSZbigniew Bodek  */
242649b49cdaSZbigniew Bodek int al_eth_rx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter);
242749b49cdaSZbigniew Bodek 
242849b49cdaSZbigniew Bodek /**
242949b49cdaSZbigniew Bodek  * Configure rx_gcp_table and regs
243049b49cdaSZbigniew Bodek  *
243149b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
243249b49cdaSZbigniew Bodek  *
243349b49cdaSZbigniew Bodek  */
243449b49cdaSZbigniew Bodek int al_eth_rx_generic_crc_table_init(struct al_hal_eth_adapter *adapter);
243549b49cdaSZbigniew Bodek 
243649b49cdaSZbigniew Bodek #ifdef __cplusplus
243749b49cdaSZbigniew Bodek }
243849b49cdaSZbigniew Bodek #endif
243949b49cdaSZbigniew Bodek /* *INDENT-ON* */
244049b49cdaSZbigniew Bodek #endif		/* __AL_HAL_ETH_H__ */
244149b49cdaSZbigniew Bodek /** @} end of Ethernet group */
2442