xref: /freebsd/sys/contrib/alpine-hal/eth/al_hal_eth_main.c (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  *  @{
3949b49cdaSZbigniew Bodek  * @file   al_hal_eth_main.c
4049b49cdaSZbigniew Bodek  *
4149b49cdaSZbigniew Bodek  * @brief  XG Ethernet unit HAL driver for main functions (initialization, data path)
4249b49cdaSZbigniew Bodek  *
4349b49cdaSZbigniew Bodek  */
4449b49cdaSZbigniew Bodek 
4549b49cdaSZbigniew Bodek #include "al_hal_eth.h"
46*3fc36ee0SWojciech Macek #include "al_hal_udma_iofic.h"
47*3fc36ee0SWojciech Macek #include "al_hal_udma_config.h"
4849b49cdaSZbigniew Bodek #include "al_hal_eth_ec_regs.h"
4949b49cdaSZbigniew Bodek #include "al_hal_eth_mac_regs.h"
50*3fc36ee0SWojciech Macek #include "al_hal_unit_adapter_regs.h"
5149b49cdaSZbigniew Bodek #ifdef AL_ETH_EX
5249b49cdaSZbigniew Bodek #include "al_hal_eth_ex_internal.h"
5349b49cdaSZbigniew Bodek #endif
5449b49cdaSZbigniew Bodek 
5549b49cdaSZbigniew Bodek /* Number of xfi_txclk cycles that accumulate into 100ns */
56*3fc36ee0SWojciech Macek #define ETH_MAC_KR_10_PCS_CFG_EEE_TIMER_VAL 52
57*3fc36ee0SWojciech Macek #define ETH_MAC_KR_25_PCS_CFG_EEE_TIMER_VAL 80
58*3fc36ee0SWojciech Macek #define ETH_MAC_XLG_40_PCS_CFG_EEE_TIMER_VAL 63
59*3fc36ee0SWojciech Macek #define ETH_MAC_XLG_50_PCS_CFG_EEE_TIMER_VAL 85
6049b49cdaSZbigniew Bodek 
6149b49cdaSZbigniew Bodek #define AL_ETH_TX_PKT_UDMA_FLAGS	(AL_ETH_TX_FLAGS_NO_SNOOP | \
6249b49cdaSZbigniew Bodek 					 AL_ETH_TX_FLAGS_INT)
6349b49cdaSZbigniew Bodek 
6449b49cdaSZbigniew Bodek #define AL_ETH_TX_PKT_META_FLAGS	(AL_ETH_TX_FLAGS_IPV4_L3_CSUM | \
6549b49cdaSZbigniew Bodek 					 AL_ETH_TX_FLAGS_L4_CSUM |	\
6649b49cdaSZbigniew Bodek 					 AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM |	\
6749b49cdaSZbigniew Bodek 					 AL_ETH_TX_FLAGS_L2_MACSEC_PKT | \
6849b49cdaSZbigniew Bodek 					 AL_ETH_TX_FLAGS_L2_DIS_FCS |\
6949b49cdaSZbigniew Bodek 					 AL_ETH_TX_FLAGS_TSO |\
7049b49cdaSZbigniew Bodek 					 AL_ETH_TX_FLAGS_TS)
7149b49cdaSZbigniew Bodek 
7249b49cdaSZbigniew Bodek #define AL_ETH_TX_SRC_VLAN_CNT_MASK	3
7349b49cdaSZbigniew Bodek #define AL_ETH_TX_SRC_VLAN_CNT_SHIFT	5
7449b49cdaSZbigniew Bodek #define AL_ETH_TX_L4_PROTO_IDX_MASK	0x1F
7549b49cdaSZbigniew Bodek #define AL_ETH_TX_L4_PROTO_IDX_SHIFT	8
7649b49cdaSZbigniew Bodek #define AL_ETH_TX_TUNNEL_MODE_SHIFT		18
7749b49cdaSZbigniew Bodek #define AL_ETH_TX_OUTER_L3_PROTO_SHIFT		20
7849b49cdaSZbigniew Bodek #define AL_ETH_TX_VLAN_MOD_ADD_SHIFT		22
7949b49cdaSZbigniew Bodek #define AL_ETH_TX_VLAN_MOD_DEL_SHIFT		24
8049b49cdaSZbigniew Bodek #define AL_ETH_TX_VLAN_MOD_E_SEL_SHIFT		26
8149b49cdaSZbigniew Bodek #define AL_ETH_TX_VLAN_MOD_VID_SEL_SHIFT	28
8249b49cdaSZbigniew Bodek #define AL_ETH_TX_VLAN_MOD_PBIT_SEL_SHIFT	30
8349b49cdaSZbigniew Bodek 
8449b49cdaSZbigniew Bodek /* tx Meta Descriptor defines */
8549b49cdaSZbigniew Bodek #define AL_ETH_TX_META_STORE			(1 << 21)
8649b49cdaSZbigniew Bodek #define AL_ETH_TX_META_L3_LEN_MASK		0xff
8749b49cdaSZbigniew Bodek #define AL_ETH_TX_META_L3_OFF_MASK		0xff
8849b49cdaSZbigniew Bodek #define AL_ETH_TX_META_L3_OFF_SHIFT		8
8949b49cdaSZbigniew Bodek #define AL_ETH_TX_META_MSS_LSB_VAL_SHIFT	22
9049b49cdaSZbigniew Bodek #define AL_ETH_TX_META_MSS_MSB_TS_VAL_SHIFT	16
9149b49cdaSZbigniew Bodek #define AL_ETH_TX_META_OUTER_L3_LEN_MASK	0x1f
9249b49cdaSZbigniew Bodek #define AL_ETH_TX_META_OUTER_L3_LEN_SHIFT	24
9349b49cdaSZbigniew Bodek #define AL_ETH_TX_META_OUTER_L3_OFF_HIGH_MASK	0x18
9449b49cdaSZbigniew Bodek #define AL_ETH_TX_META_OUTER_L3_OFF_HIGH_SHIFT	10
9549b49cdaSZbigniew Bodek #define AL_ETH_TX_META_OUTER_L3_OFF_LOW_MASK	0x07
9649b49cdaSZbigniew Bodek #define AL_ETH_TX_META_OUTER_L3_OFF_LOW_SHIFT	29
9749b49cdaSZbigniew Bodek 
9849b49cdaSZbigniew Bodek /* tx Meta Descriptor defines - MacSec */
9949b49cdaSZbigniew Bodek #define AL_ETH_TX_MACSEC_SIGN_SHIFT			  0		/* Sign TX pkt */
10049b49cdaSZbigniew Bodek #define AL_ETH_TX_MACSEC_ENCRYPT_SHIFT			  1		/* Encrypt TX pkt */
10149b49cdaSZbigniew Bodek #define AL_ETH_TX_MACSEC_AN_LSB_SHIFT			  2		/* Association Number */
10249b49cdaSZbigniew Bodek #define AL_ETH_TX_MACSEC_AN_MSB_SHIFT			  3
10349b49cdaSZbigniew Bodek #define AL_ETH_TX_MACSEC_SC_LSB_SHIFT			  4		/* Secured Channel */
10449b49cdaSZbigniew Bodek #define AL_ETH_TX_MACSEC_SC_MSB_SHIFT			  9
10549b49cdaSZbigniew Bodek #define AL_ETH_TX_MACSEC_SECURED_PYLD_LEN_LSB_SHIFT	 10		/* Secure Payload Length (0x3FFF for non-SL packets) */
10649b49cdaSZbigniew Bodek #define AL_ETH_TX_MACSEC_SECURED_PYLD_LEN_MSB_SHIFT	 23
10749b49cdaSZbigniew Bodek 
10849b49cdaSZbigniew Bodek /* Rx Descriptor defines */
10949b49cdaSZbigniew Bodek #define AL_ETH_RX_L3_PROTO_IDX_MASK	0x1F
11049b49cdaSZbigniew Bodek #define AL_ETH_RX_SRC_VLAN_CNT_MASK	3
11149b49cdaSZbigniew Bodek #define AL_ETH_RX_SRC_VLAN_CNT_SHIFT	5
11249b49cdaSZbigniew Bodek #define AL_ETH_RX_L4_PROTO_IDX_MASK	0x1F
11349b49cdaSZbigniew Bodek #define AL_ETH_RX_L4_PROTO_IDX_SHIFT	8
11449b49cdaSZbigniew Bodek 
11549b49cdaSZbigniew Bodek #define AL_ETH_RX_L3_OFFSET_SHIFT	9
11649b49cdaSZbigniew Bodek #define AL_ETH_RX_L3_OFFSET_MASK	(0x7f << AL_ETH_RX_L3_OFFSET_SHIFT)
11749b49cdaSZbigniew Bodek #define AL_ETH_RX_HASH_SHIFT		16
11849b49cdaSZbigniew Bodek #define AL_ETH_RX_HASH_MASK		(0xffff 	<< AL_ETH_RX_HASH_SHIFT)
11949b49cdaSZbigniew Bodek 
12049b49cdaSZbigniew Bodek #define ETH_MAC_GEN_LED_CFG_BLINK_TIMER_VAL 5
12149b49cdaSZbigniew Bodek #define ETH_MAC_GEN_LED_CFG_ACT_TIMER_VAL 7
12249b49cdaSZbigniew Bodek 
12349b49cdaSZbigniew Bodek /* Tx VID Table*/
12449b49cdaSZbigniew Bodek #define AL_ETH_TX_VLAN_TABLE_UDMA_MASK		0xF
12549b49cdaSZbigniew Bodek #define AL_ETH_TX_VLAN_TABLE_FWD_TO_MAC		(1 << 4)
12649b49cdaSZbigniew Bodek 
12749b49cdaSZbigniew Bodek /* tx gpd defines */
12849b49cdaSZbigniew Bodek #define AL_ETH_TX_GPD_L3_PROTO_MASK		0x1f
12949b49cdaSZbigniew Bodek #define AL_ETH_TX_GPD_L3_PROTO_SHIFT		0
13049b49cdaSZbigniew Bodek #define AL_ETH_TX_GPD_L4_PROTO_MASK		0x1f
13149b49cdaSZbigniew Bodek #define AL_ETH_TX_GPD_L4_PROTO_SHIFT		5
13249b49cdaSZbigniew Bodek #define AL_ETH_TX_GPD_TUNNEL_CTRL_MASK		0x7
13349b49cdaSZbigniew Bodek #define AL_ETH_TX_GPD_TUNNEL_CTRL_SHIFT		10
13449b49cdaSZbigniew Bodek #define AL_ETH_TX_GPD_SRC_VLAN_CNT_MASK		0x3
13549b49cdaSZbigniew Bodek #define AL_ETH_TX_GPD_SRC_VLAN_CNT_SHIFT	13
13649b49cdaSZbigniew Bodek #define AL_ETH_TX_GPD_CAM_DATA_2_SHIFT		32
13749b49cdaSZbigniew Bodek #define AL_ETH_TX_GPD_CAM_MASK_2_SHIFT		32
13849b49cdaSZbigniew Bodek #define AL_ETH_TX_GPD_CAM_CTRL_VALID_SHIFT	31
13949b49cdaSZbigniew Bodek 
14049b49cdaSZbigniew Bodek /* tx gcp defines */
14149b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_POLY_SEL_MASK		0x1
14249b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_POLY_SEL_SHIFT		0
14349b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_CRC32_BIT_COMP_MASK	0x1
14449b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_CRC32_BIT_COMP_SHIFT	1
14549b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_CRC32_BIT_SWAP_MASK	0x1
14649b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_CRC32_BIT_SWAP_SHIFT	2
14749b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_CRC32_BYTE_SWAP_MASK	0x1
14849b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_CRC32_BYTE_SWAP_SHIFT	3
14949b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_DATA_BIT_SWAP_MASK	0x1
15049b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_DATA_BIT_SWAP_SHIFT	4
15149b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_DATA_BYTE_SWAP_MASK	0x1
15249b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_DATA_BYTE_SWAP_SHIFT	5
15349b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_TRAIL_SIZE_MASK		0xF
15449b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_TRAIL_SIZE_SHIFT		6
15549b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_HEAD_SIZE_MASK		0xFF
15649b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_HEAD_SIZE_SHIFT		16
15749b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_HEAD_CALC_MASK		0x1
15849b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_HEAD_CALC_SHIFT		24
15949b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_MASK_POLARITY_MASK	0x1
16049b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_MASK_POLARITY_SHIFT	25
16149b49cdaSZbigniew Bodek 
16249b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPCODE_1_MASK		0x3F
16349b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPCODE_1_SHIFT		0
16449b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPCODE_2_MASK		0x3F
16549b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPCODE_2_SHIFT		6
16649b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPCODE_3_MASK		0x3F
16749b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPCODE_3_SHIFT		12
16849b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPSEL_1_MASK		0xF
16949b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPSEL_1_SHIFT		0
17049b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPSEL_2_MASK		0xF
17149b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPSEL_2_SHIFT		4
17249b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPSEL_3_MASK		0xF
17349b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPSEL_3_SHIFT		8
17449b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPSEL_4_MASK		0xF
17549b49cdaSZbigniew Bodek #define AL_ETH_TX_GCP_OPSEL_4_SHIFT		12
17649b49cdaSZbigniew Bodek 
17749b49cdaSZbigniew Bodek /*  Tx crc_chksum_replace defines */
17849b49cdaSZbigniew Bodek #define L4_CHECKSUM_DIS_AND_L3_CHECKSUM_DIS     0x00
17949b49cdaSZbigniew Bodek #define L4_CHECKSUM_DIS_AND_L3_CHECKSUM_EN      0x20
18049b49cdaSZbigniew Bodek #define L4_CHECKSUM_EN_AND_L3_CHECKSUM_DIS      0x40
18149b49cdaSZbigniew Bodek #define L4_CHECKSUM_EN_AND_L3_CHECKSUM_EN       0x60
18249b49cdaSZbigniew Bodek 
18349b49cdaSZbigniew Bodek /* rx gpd defines */
18449b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_OUTER_L3_PROTO_MASK		0x1f
18549b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_OUTER_L3_PROTO_SHIFT		(3 + 0)
18649b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_OUTER_L4_PROTO_MASK		0x1f
18749b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_OUTER_L4_PROTO_SHIFT		(3 + 8)
18849b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_INNER_L3_PROTO_MASK		0x1f
18949b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_INNER_L3_PROTO_SHIFT		(3 + 16)
19049b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_INNER_L4_PROTO_MASK		0x1f
19149b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_INNER_L4_PROTO_SHIFT		(3 + 24)
19249b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_OUTER_PARSE_CTRL_MASK		0xFF
19349b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_OUTER_PARSE_CTRL_SHIFT	32
19449b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_INNER_PARSE_CTRL_MASK		0xFF
19549b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_INNER_PARSE_CTRL_SHIFT	40
19649b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_L3_PRIORITY_MASK			0xFF
19749b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_L3_PRIORITY_SHIFT			48
19849b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_L4_DST_PORT_LSB_MASK		0xFF
19949b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_L4_DST_PORT_LSB_SHIFT		56
20049b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_CAM_DATA_2_SHIFT			32
20149b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_CAM_MASK_2_SHIFT			32
20249b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_CAM_CTRL_VALID_SHIFT		31
20349b49cdaSZbigniew Bodek 
20449b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L3_PROTO_IDX_OFFSET	(106 + 5)
20549b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L4_PROTO_IDX_OFFSET	(106 + 10)
20649b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_PARSE_RESULT_INNER_L3_PROTO_IDX_OFFSET	(0 + 5)
20749b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_PARSE_RESULT_INNER_L4_PROTO_IDX_OFFSET	(0 + 10)
20849b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_PARSE_RESULT_OUTER_PARSE_CTRL			(106 + 4)
20949b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_PARSE_RESULT_INNER_PARSE_CTRL			4
21049b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_PARSE_RESULT_L3_PRIORITY			(106 + 13)
21149b49cdaSZbigniew Bodek #define AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L4_DST_PORT_LSB	(106 + 65)
21249b49cdaSZbigniew Bodek 
21349b49cdaSZbigniew Bodek /* rx gcp defines */
21449b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_POLY_SEL_MASK		0x1
21549b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_POLY_SEL_SHIFT		0
21649b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_CRC32_BIT_COMP_MASK	0x1
21749b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_CRC32_BIT_COMP_SHIFT	1
21849b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_CRC32_BIT_SWAP_MASK	0x1
21949b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_CRC32_BIT_SWAP_SHIFT	2
22049b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_CRC32_BYTE_SWAP_MASK      0x1
22149b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_CRC32_BYTE_SWAP_SHIFT	3
22249b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_DATA_BIT_SWAP_MASK	0x1
22349b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_DATA_BIT_SWAP_SHIFT	4
22449b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_DATA_BYTE_SWAP_MASK       0x1
22549b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_DATA_BYTE_SWAP_SHIFT	5
22649b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_TRAIL_SIZE_MASK		0xF
22749b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_TRAIL_SIZE_SHIFT		6
22849b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_HEAD_SIZE_MASK		0xFF
22949b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_HEAD_SIZE_SHIFT		16
23049b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_HEAD_CALC_MASK		0x1
23149b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_HEAD_CALC_SHIFT		24
23249b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_MASK_POLARITY_MASK	0x1
23349b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_MASK_POLARITY_SHIFT	25
23449b49cdaSZbigniew Bodek 
23549b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPCODE_1_MASK		0x3F
23649b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPCODE_1_SHIFT		0
23749b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPCODE_2_MASK		0x3F
23849b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPCODE_2_SHIFT		6
23949b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPCODE_3_MASK		0x3F
24049b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPCODE_3_SHIFT		12
24149b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPSEL_1_MASK		0xF
24249b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPSEL_1_SHIFT		0
24349b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPSEL_2_MASK		0xF
24449b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPSEL_2_SHIFT		4
24549b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPSEL_3_MASK		0xF
24649b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPSEL_3_SHIFT		8
24749b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPSEL_4_MASK		0xF
24849b49cdaSZbigniew Bodek #define AL_ETH_RX_GCP_OPSEL_4_SHIFT		12
24949b49cdaSZbigniew Bodek 
25049b49cdaSZbigniew Bodek #define AL_ETH_MDIO_DELAY_PERIOD	1 /* micro seconds to wait when polling mdio status */
25149b49cdaSZbigniew Bodek #define AL_ETH_MDIO_DELAY_COUNT		150 /* number of times to poll */
25249b49cdaSZbigniew Bodek #define AL_ETH_S2M_UDMA_COMP_COAL_TIMEOUT	200 /* Rx descriptors coalescing timeout in SB clocks */
25349b49cdaSZbigniew Bodek 
25449b49cdaSZbigniew Bodek #define AL_ETH_EPE_ENTRIES_NUM 26
25549b49cdaSZbigniew Bodek static struct al_eth_epe_p_reg_entry al_eth_epe_p_regs[AL_ETH_EPE_ENTRIES_NUM] = {
25649b49cdaSZbigniew Bodek 	{ 0x0, 0x0, 0x0 },
25749b49cdaSZbigniew Bodek 	{ 0x0, 0x0, 0x1 },
25849b49cdaSZbigniew Bodek 	{ 0x0, 0x0, 0x2 },
25949b49cdaSZbigniew Bodek 	{ 0x0, 0x0, 0x3 },
26049b49cdaSZbigniew Bodek 	{ 0x18100, 0xFFFFF, 0x80000004 },
26149b49cdaSZbigniew Bodek 	{ 0x188A8, 0xFFFFF, 0x80000005 },
26249b49cdaSZbigniew Bodek 	{ 0x99100, 0xFFFFF, 0x80000006 },
26349b49cdaSZbigniew Bodek 	{ 0x98100, 0xFFFFF, 0x80000007 },
26449b49cdaSZbigniew Bodek 	{ 0x10800, 0x7FFFF, 0x80000008 },
26549b49cdaSZbigniew Bodek 	{ 0x20000, 0x73FFF, 0x80000009 },
26649b49cdaSZbigniew Bodek 	{ 0x20000, 0x70000, 0x8000000A },
26749b49cdaSZbigniew Bodek 	{ 0x186DD, 0x7FFFF, 0x8000000B },
26849b49cdaSZbigniew Bodek 	{ 0x30600, 0x7FF00, 0x8000000C },
26949b49cdaSZbigniew Bodek 	{ 0x31100, 0x7FF00, 0x8000000D },
27049b49cdaSZbigniew Bodek 	{ 0x32F00, 0x7FF00, 0x8000000E },
27149b49cdaSZbigniew Bodek 	{ 0x32900, 0x7FF00, 0x8000000F },
27249b49cdaSZbigniew Bodek 	{ 0x105DC, 0x7FFFF, 0x80010010 },
27349b49cdaSZbigniew Bodek 	{ 0x188E5, 0x7FFFF, 0x80000011 },
27449b49cdaSZbigniew Bodek 	{ 0x72000, 0x72000, 0x80000012 },
27549b49cdaSZbigniew Bodek 	{ 0x70000, 0x72000, 0x80000013 },
27649b49cdaSZbigniew Bodek 	{ 0x46558, 0x7FFFF, 0x80000001 },
27749b49cdaSZbigniew Bodek 	{ 0x18906, 0x7FFFF, 0x80000015 },
27849b49cdaSZbigniew Bodek 	{ 0x18915, 0x7FFFF, 0x80000016 },
27949b49cdaSZbigniew Bodek 	{ 0x31B00, 0x7FF00, 0x80000017 },
28049b49cdaSZbigniew Bodek 	{ 0x30400, 0x7FF00, 0x80000018 },
28149b49cdaSZbigniew Bodek 	{ 0x0, 0x0, 0x8000001F }
28249b49cdaSZbigniew Bodek };
28349b49cdaSZbigniew Bodek 
28449b49cdaSZbigniew Bodek 
28549b49cdaSZbigniew Bodek static struct al_eth_epe_control_entry al_eth_epe_control_table[AL_ETH_EPE_ENTRIES_NUM] = {
28649b49cdaSZbigniew Bodek 	{{ 0x2800000, 0x0, 0x0, 0x0, 0x1, 0x400000 }},
28749b49cdaSZbigniew Bodek 	{{ 0x280004C, 0x746000, 0xA46030, 0xE00000, 0x2, 0x400000 }},
28849b49cdaSZbigniew Bodek 	{{ 0x2800054, 0x746000, 0xA46030, 0x1600000, 0x2, 0x400000 }},
28949b49cdaSZbigniew Bodek 	{{ 0x280005C, 0x746000, 0xA46030, 0x1E00000, 0x2, 0x400000 }},
29049b49cdaSZbigniew Bodek 	{{ 0x2800042, 0xD42000, 0x0, 0x400000, 0x1010412, 0x400000 }},
29149b49cdaSZbigniew Bodek 	{{ 0x2800042, 0xD42000, 0x0, 0x400000, 0x1010412, 0x400000 }},
29249b49cdaSZbigniew Bodek 	{{ 0x2800042, 0xE42000, 0x0, 0x400000, 0x2020002, 0x400000 }},
29349b49cdaSZbigniew Bodek 	{{ 0x2800042, 0xE42000, 0x0, 0x400000, 0x2020002, 0x400000 }},
29449b49cdaSZbigniew Bodek 	{{ 0x280B046, 0x0, 0x6C1008, 0x0, 0x4, 0x406800 }},
29549b49cdaSZbigniew Bodek 	{{ 0x2800049, 0xF44060, 0x1744080, 0x14404, 0x6, 0x400011 }},
29649b49cdaSZbigniew Bodek 	{{ 0x2015049, 0xF44060, 0x1744080, 0x14404, 0x8080007, 0x400011 }},
29749b49cdaSZbigniew Bodek 	{{ 0x280B046, 0xF60040, 0x6C1004, 0x2800000, 0x6, 0x406811 }},
29849b49cdaSZbigniew Bodek 	{{ 0x2815042, 0x1F42000, 0x2042010, 0x1414460, 0x10100009, 0x40B800 }},
29949b49cdaSZbigniew Bodek 	{{ 0x2815042, 0x1F42000, 0x2042010, 0x800000, 0x10100009, 0x40B800 }},
30049b49cdaSZbigniew Bodek 	{{ 0x280B042, 0x0, 0x0, 0x430400, 0x4040009, 0x0 }},
30149b49cdaSZbigniew Bodek 	{{ 0x2815580, 0x0, 0x0, 0x0, 0x4040005, 0x0 }},
30249b49cdaSZbigniew Bodek 	{{ 0x280B000, 0x0, 0x0, 0x0, 0x1, 0x400000 }},
30349b49cdaSZbigniew Bodek 	{{ 0x2800040, 0x174E000, 0x0, 0x0, 0xE, 0x406800 }},
30449b49cdaSZbigniew Bodek 	{{ 0x280B000, 0x0, 0x0, 0x600000, 0x1, 0x406800 }},
30549b49cdaSZbigniew Bodek 	{{ 0x280B000, 0x0, 0x0, 0xE00000, 0x1, 0x406800 }},
30649b49cdaSZbigniew Bodek 	{{ 0x2800000, 0x0, 0x0, 0x0, 0x1, 0x400000 }},
30749b49cdaSZbigniew Bodek 	{{ 0x280B046, 0x0, 0x0, 0x2800000, 0x7, 0x400000 }},
30849b49cdaSZbigniew Bodek 	{{ 0x280B046, 0xF60040, 0x6C1004, 0x2800000, 0x6, 0x406811 }},
30949b49cdaSZbigniew Bodek 	{{ 0x2815042, 0x1F43028, 0x2000000, 0xC00000, 0x10100009, 0x40B800 }},
31049b49cdaSZbigniew Bodek 	{{ 0x2815400, 0x0, 0x0, 0x0, 0x4040005, 0x0 }},
31149b49cdaSZbigniew Bodek 	{{ 0x2800000, 0x0, 0x0, 0x0, 0x1, 0x400000 }}
31249b49cdaSZbigniew Bodek };
31349b49cdaSZbigniew Bodek 
31449b49cdaSZbigniew Bodek 
31549b49cdaSZbigniew Bodek #define AL_ETH_IS_1G_MAC(mac_mode) (((mac_mode) == AL_ETH_MAC_MODE_RGMII) || ((mac_mode) == AL_ETH_MAC_MODE_SGMII))
31649b49cdaSZbigniew Bodek #define AL_ETH_IS_10G_MAC(mac_mode)	(((mac_mode) == AL_ETH_MAC_MODE_10GbE_Serial) ||	\
31749b49cdaSZbigniew Bodek 					((mac_mode) == AL_ETH_MAC_MODE_10G_SGMII) ||		\
31849b49cdaSZbigniew Bodek 					((mac_mode) == AL_ETH_MAC_MODE_SGMII_2_5G))
31949b49cdaSZbigniew Bodek #define AL_ETH_IS_25G_MAC(mac_mode) ((mac_mode) == AL_ETH_MAC_MODE_KR_LL_25G)
32049b49cdaSZbigniew Bodek 
al_eth_mac_mode_str(enum al_eth_mac_mode mode)32149b49cdaSZbigniew Bodek static const char *al_eth_mac_mode_str(enum al_eth_mac_mode mode)
32249b49cdaSZbigniew Bodek {
32349b49cdaSZbigniew Bodek 	switch(mode) {
32449b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_RGMII:
32549b49cdaSZbigniew Bodek 		return "RGMII";
32649b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_SGMII:
32749b49cdaSZbigniew Bodek 		return "SGMII";
32849b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_SGMII_2_5G:
32949b49cdaSZbigniew Bodek 		return "SGMII_2_5G";
33049b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_10GbE_Serial:
33149b49cdaSZbigniew Bodek 		return "KR";
33249b49cdaSZbigniew Bodek         case AL_ETH_MAC_MODE_KR_LL_25G:
33349b49cdaSZbigniew Bodek 		return "KR_LL_25G";
33449b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_10G_SGMII:
33549b49cdaSZbigniew Bodek 		return "10G_SGMII";
33649b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_XLG_LL_40G:
33749b49cdaSZbigniew Bodek 		return "40G_LL";
33849b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_XLG_LL_50G:
33949b49cdaSZbigniew Bodek 		return "50G_LL";
340*3fc36ee0SWojciech Macek 	case AL_ETH_MAC_MODE_XLG_LL_25G:
341*3fc36ee0SWojciech Macek 		return "25G_LL";
34249b49cdaSZbigniew Bodek 	default:
34349b49cdaSZbigniew Bodek 		return "N/A";
34449b49cdaSZbigniew Bodek 	}
34549b49cdaSZbigniew Bodek }
34649b49cdaSZbigniew Bodek 
34749b49cdaSZbigniew Bodek /**
34849b49cdaSZbigniew Bodek  * change and wait udma state
34949b49cdaSZbigniew Bodek  *
35049b49cdaSZbigniew Bodek  * @param dma the udma to change its state
35149b49cdaSZbigniew Bodek  * @param new_state
35249b49cdaSZbigniew Bodek  *
35349b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
35449b49cdaSZbigniew Bodek  */
al_udma_state_set_wait(struct al_udma * dma,enum al_udma_state new_state)35549b49cdaSZbigniew Bodek static int al_udma_state_set_wait(struct al_udma *dma, enum al_udma_state new_state)
35649b49cdaSZbigniew Bodek {
35749b49cdaSZbigniew Bodek 	enum al_udma_state state;
35849b49cdaSZbigniew Bodek 	enum al_udma_state expected_state = new_state;
35949b49cdaSZbigniew Bodek 	int count = 1000;
36049b49cdaSZbigniew Bodek 	int rc;
36149b49cdaSZbigniew Bodek 
36249b49cdaSZbigniew Bodek 	rc = al_udma_state_set(dma, new_state);
36349b49cdaSZbigniew Bodek 	if (rc != 0) {
36449b49cdaSZbigniew Bodek 		al_warn("[%s] warn: failed to change state, error %d\n", dma->name, rc);
36549b49cdaSZbigniew Bodek 		return rc;
36649b49cdaSZbigniew Bodek 	}
36749b49cdaSZbigniew Bodek 
36849b49cdaSZbigniew Bodek 	if ((new_state == UDMA_NORMAL) || (new_state == UDMA_DISABLE))
36949b49cdaSZbigniew Bodek 		expected_state = UDMA_IDLE;
37049b49cdaSZbigniew Bodek 
37149b49cdaSZbigniew Bodek 	do {
37249b49cdaSZbigniew Bodek 		state = al_udma_state_get(dma);
37349b49cdaSZbigniew Bodek 		if (state == expected_state)
37449b49cdaSZbigniew Bodek 			break;
37549b49cdaSZbigniew Bodek 		al_udelay(1);
37649b49cdaSZbigniew Bodek 		if (count-- == 0) {
37749b49cdaSZbigniew Bodek 			al_warn("[%s] warn: dma state didn't change to %s\n",
37849b49cdaSZbigniew Bodek 				 dma->name, al_udma_states_name[new_state]);
37949b49cdaSZbigniew Bodek 			return -ETIMEDOUT;
38049b49cdaSZbigniew Bodek 		}
38149b49cdaSZbigniew Bodek 	} while (1);
38249b49cdaSZbigniew Bodek 	return 0;
38349b49cdaSZbigniew Bodek }
38449b49cdaSZbigniew Bodek 
al_eth_epe_entry_set(struct al_hal_eth_adapter * adapter,uint32_t idx,struct al_eth_epe_p_reg_entry * reg_entry,struct al_eth_epe_control_entry * control_entry)38549b49cdaSZbigniew Bodek static void al_eth_epe_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
38649b49cdaSZbigniew Bodek 		struct al_eth_epe_p_reg_entry *reg_entry,
38749b49cdaSZbigniew Bodek 		struct al_eth_epe_control_entry *control_entry)
38849b49cdaSZbigniew Bodek {
38949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe_p[idx].comp_data, reg_entry->data);
39049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe_p[idx].comp_mask, reg_entry->mask);
39149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe_p[idx].comp_ctrl, reg_entry->ctrl);
39249b49cdaSZbigniew Bodek 
39349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->msp_c[idx].p_comp_data, reg_entry->data);
39449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->msp_c[idx].p_comp_mask, reg_entry->mask);
39549b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->msp_c[idx].p_comp_ctrl, reg_entry->ctrl);
39649b49cdaSZbigniew Bodek 
39749b49cdaSZbigniew Bodek 	/*control table  0*/
39849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_addr, idx);
39949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_6,
40049b49cdaSZbigniew Bodek 			control_entry->data[5]);
40149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_2,
40249b49cdaSZbigniew Bodek 			control_entry->data[1]);
40349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_3,
40449b49cdaSZbigniew Bodek 			control_entry->data[2]);
40549b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_4,
40649b49cdaSZbigniew Bodek 			control_entry->data[3]);
40749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_5,
40849b49cdaSZbigniew Bodek 			control_entry->data[4]);
40949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_1,
41049b49cdaSZbigniew Bodek 			control_entry->data[0]);
41149b49cdaSZbigniew Bodek 
41249b49cdaSZbigniew Bodek 	/*control table 1*/
41349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_addr, idx);
41449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_6,
41549b49cdaSZbigniew Bodek 			control_entry->data[5]);
41649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_2,
41749b49cdaSZbigniew Bodek 			control_entry->data[1]);
41849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_3,
41949b49cdaSZbigniew Bodek 			control_entry->data[2]);
42049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_4,
42149b49cdaSZbigniew Bodek 			control_entry->data[3]);
42249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_5,
42349b49cdaSZbigniew Bodek 			control_entry->data[4]);
42449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_1,
42549b49cdaSZbigniew Bodek 			control_entry->data[0]);
42649b49cdaSZbigniew Bodek }
42749b49cdaSZbigniew Bodek 
al_eth_epe_init(struct al_hal_eth_adapter * adapter)42849b49cdaSZbigniew Bodek static void al_eth_epe_init(struct al_hal_eth_adapter *adapter)
42949b49cdaSZbigniew Bodek {
43049b49cdaSZbigniew Bodek 	int idx;
43149b49cdaSZbigniew Bodek 
43249b49cdaSZbigniew Bodek 	if (adapter->enable_rx_parser == 0) {
43349b49cdaSZbigniew Bodek 		al_dbg("eth [%s]: disable rx parser\n", adapter->name);
43449b49cdaSZbigniew Bodek 
43549b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->epe[0].res_def, 0x08000000);
43649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->epe[0].res_in, 0x7);
43749b49cdaSZbigniew Bodek 
43849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->epe[1].res_def, 0x08000000);
43949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->epe[1].res_in, 0x7);
44049b49cdaSZbigniew Bodek 
44149b49cdaSZbigniew Bodek 		return;
44249b49cdaSZbigniew Bodek 	}
44349b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: enable rx parser\n", adapter->name);
44449b49cdaSZbigniew Bodek 	for (idx = 0; idx < AL_ETH_EPE_ENTRIES_NUM; idx++)
44549b49cdaSZbigniew Bodek 		al_eth_epe_entry_set(adapter, idx, &al_eth_epe_p_regs[idx], &al_eth_epe_control_table[idx]);
44649b49cdaSZbigniew Bodek 
44749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[0].res_def, 0x08000080);
44849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[0].res_in, 0x7);
44949b49cdaSZbigniew Bodek 
45049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[1].res_def, 0x08000080);
45149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe[1].res_in, 0);
45249b49cdaSZbigniew Bodek 
45349b49cdaSZbigniew Bodek 	/* header length as function of 4 bits value, for GRE, when C bit is set, the header len should be increase by 4*/
45449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->epe_h[8].hdr_len, (4 << 16) | 4);
45549b49cdaSZbigniew Bodek 
45649b49cdaSZbigniew Bodek 	/* select the outer information when writing the rx descriptor (l3 protocol index etc) */
45749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.meta, EC_RFW_META_L3_LEN_CALC);
45849b49cdaSZbigniew Bodek 
45949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.checksum, EC_RFW_CHECKSUM_HDR_SEL);
46049b49cdaSZbigniew Bodek }
46149b49cdaSZbigniew Bodek 
46249b49cdaSZbigniew Bodek /**
46349b49cdaSZbigniew Bodek  * read 40G MAC registers (indirect access)
46449b49cdaSZbigniew Bodek  *
46549b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
46649b49cdaSZbigniew Bodek  * @param reg_addr address in the an registers
46749b49cdaSZbigniew Bodek  *
46849b49cdaSZbigniew Bodek  * @return the register value
46949b49cdaSZbigniew Bodek  */
al_eth_40g_mac_reg_read(struct al_hal_eth_adapter * adapter,uint32_t reg_addr)47049b49cdaSZbigniew Bodek static uint32_t al_eth_40g_mac_reg_read(
47149b49cdaSZbigniew Bodek 			struct al_hal_eth_adapter *adapter,
47249b49cdaSZbigniew Bodek 			uint32_t reg_addr)
47349b49cdaSZbigniew Bodek {
47449b49cdaSZbigniew Bodek 	uint32_t val;
47549b49cdaSZbigniew Bodek 
47649b49cdaSZbigniew Bodek 	/* indirect access */
47749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, reg_addr);
47849b49cdaSZbigniew Bodek 	val = al_reg_read32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data);
47949b49cdaSZbigniew Bodek 
48049b49cdaSZbigniew Bodek 	al_dbg("[%s]: %s - reg %d. val 0x%x",
48149b49cdaSZbigniew Bodek 	       adapter->name, __func__, reg_addr, val);
48249b49cdaSZbigniew Bodek 
48349b49cdaSZbigniew Bodek 	return val;
48449b49cdaSZbigniew Bodek }
48549b49cdaSZbigniew Bodek 
48649b49cdaSZbigniew Bodek /**
48749b49cdaSZbigniew Bodek  * write 40G MAC registers (indirect access)
48849b49cdaSZbigniew Bodek  *
48949b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
49049b49cdaSZbigniew Bodek  * @param reg_addr address in the an registers
49149b49cdaSZbigniew Bodek  * @param reg_data value to write to the register
49249b49cdaSZbigniew Bodek  *
49349b49cdaSZbigniew Bodek  */
al_eth_40g_mac_reg_write(struct al_hal_eth_adapter * adapter,uint32_t reg_addr,uint32_t reg_data)49449b49cdaSZbigniew Bodek static void al_eth_40g_mac_reg_write(
49549b49cdaSZbigniew Bodek 			struct al_hal_eth_adapter *adapter,
49649b49cdaSZbigniew Bodek 			uint32_t reg_addr,
49749b49cdaSZbigniew Bodek 			uint32_t reg_data)
49849b49cdaSZbigniew Bodek {
49949b49cdaSZbigniew Bodek 	/* indirect access */
50049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, reg_addr);
50149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, reg_data);
50249b49cdaSZbigniew Bodek 
50349b49cdaSZbigniew Bodek 	al_dbg("[%s]: %s - reg %d. val 0x%x",
50449b49cdaSZbigniew Bodek 	       adapter->name, __func__, reg_addr, reg_data);
50549b49cdaSZbigniew Bodek }
50649b49cdaSZbigniew Bodek 
50749b49cdaSZbigniew Bodek /**
50849b49cdaSZbigniew Bodek  * read 40G PCS registers (indirect access)
50949b49cdaSZbigniew Bodek  *
51049b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
51149b49cdaSZbigniew Bodek  * @param reg_addr address in the an registers
51249b49cdaSZbigniew Bodek  *
51349b49cdaSZbigniew Bodek  * @return the register value
51449b49cdaSZbigniew Bodek  */
al_eth_40g_pcs_reg_read(struct al_hal_eth_adapter * adapter,uint32_t reg_addr)51549b49cdaSZbigniew Bodek static uint32_t al_eth_40g_pcs_reg_read(
51649b49cdaSZbigniew Bodek 			struct al_hal_eth_adapter *adapter,
51749b49cdaSZbigniew Bodek 			uint32_t reg_addr)
51849b49cdaSZbigniew Bodek {
51949b49cdaSZbigniew Bodek 	uint32_t val;
52049b49cdaSZbigniew Bodek 
52149b49cdaSZbigniew Bodek 	/* indirect access */
52249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, reg_addr);
52349b49cdaSZbigniew Bodek 	val = al_reg_read32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data);
52449b49cdaSZbigniew Bodek 
52549b49cdaSZbigniew Bodek 	al_dbg("[%s]: %s - reg %d. val 0x%x",
52649b49cdaSZbigniew Bodek 	       adapter->name, __func__, reg_addr, val);
52749b49cdaSZbigniew Bodek 
52849b49cdaSZbigniew Bodek 	return val;
52949b49cdaSZbigniew Bodek }
53049b49cdaSZbigniew Bodek 
53149b49cdaSZbigniew Bodek /**
53249b49cdaSZbigniew Bodek  * write 40G PCS registers (indirect access)
53349b49cdaSZbigniew Bodek  *
53449b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
53549b49cdaSZbigniew Bodek  * @param reg_addr address in the an registers
53649b49cdaSZbigniew Bodek  * @param reg_data value to write to the register
53749b49cdaSZbigniew Bodek  *
53849b49cdaSZbigniew Bodek  */
al_eth_40g_pcs_reg_write(struct al_hal_eth_adapter * adapter,uint32_t reg_addr,uint32_t reg_data)53949b49cdaSZbigniew Bodek static void al_eth_40g_pcs_reg_write(
54049b49cdaSZbigniew Bodek 			struct al_hal_eth_adapter *adapter,
54149b49cdaSZbigniew Bodek 			uint32_t reg_addr,
54249b49cdaSZbigniew Bodek 			uint32_t reg_data)
54349b49cdaSZbigniew Bodek {
54449b49cdaSZbigniew Bodek 	/* indirect access */
54549b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, reg_addr);
54649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, reg_data);
54749b49cdaSZbigniew Bodek 
54849b49cdaSZbigniew Bodek 	al_dbg("[%s]: %s - reg %d. val 0x%x",
54949b49cdaSZbigniew Bodek 	       adapter->name, __func__, reg_addr, reg_data);
55049b49cdaSZbigniew Bodek }
55149b49cdaSZbigniew Bodek 
55249b49cdaSZbigniew Bodek /*****************************API Functions  **********************************/
55349b49cdaSZbigniew Bodek /*adapter management */
55449b49cdaSZbigniew Bodek /**
55549b49cdaSZbigniew Bodek  * initialize the ethernet adapter's DMA
55649b49cdaSZbigniew Bodek  */
al_eth_adapter_init(struct al_hal_eth_adapter * adapter,struct al_eth_adapter_params * params)55749b49cdaSZbigniew Bodek int al_eth_adapter_init(struct al_hal_eth_adapter *adapter, struct al_eth_adapter_params *params)
55849b49cdaSZbigniew Bodek {
55949b49cdaSZbigniew Bodek 	struct al_udma_params udma_params;
56049b49cdaSZbigniew Bodek 	struct al_udma_m2s_pkt_len_conf conf;
56149b49cdaSZbigniew Bodek 	int i;
56249b49cdaSZbigniew Bodek 	uint32_t reg;
56349b49cdaSZbigniew Bodek 	int rc;
56449b49cdaSZbigniew Bodek 
56549b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: initialize controller's UDMA. id = %d\n", params->name, params->udma_id);
56649b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: UDMA base regs: %p\n", params->name, params->udma_regs_base);
56749b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: EC base regs: %p\n", params->name, params->ec_regs_base);
56849b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: MAC base regs: %p\n", params->name, params->mac_regs_base);
56949b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: enable_rx_parser: %x\n", params->name, params->enable_rx_parser);
57049b49cdaSZbigniew Bodek 
57149b49cdaSZbigniew Bodek 	adapter->name = params->name;
57249b49cdaSZbigniew Bodek 	adapter->rev_id = params->rev_id;
57349b49cdaSZbigniew Bodek 	adapter->udma_id = params->udma_id;
57449b49cdaSZbigniew Bodek 	adapter->udma_regs_base = params->udma_regs_base;
57549b49cdaSZbigniew Bodek 	adapter->ec_regs_base = (struct al_ec_regs __iomem*)params->ec_regs_base;
57649b49cdaSZbigniew Bodek 	adapter->mac_regs_base = (struct al_eth_mac_regs __iomem*)params->mac_regs_base;
57749b49cdaSZbigniew Bodek 	adapter->unit_regs = (struct unit_regs __iomem *)params->udma_regs_base;
57849b49cdaSZbigniew Bodek 	adapter->enable_rx_parser = params->enable_rx_parser;
579*3fc36ee0SWojciech Macek 	adapter->serdes_lane = params->serdes_lane;
580*3fc36ee0SWojciech Macek 	adapter->ec_ints_base = (uint8_t __iomem *)adapter->ec_regs_base + 0x1c00;
581*3fc36ee0SWojciech Macek 	adapter->mac_ints_base = (struct interrupt_controller_ctrl __iomem *)
582*3fc36ee0SWojciech Macek 			((uint8_t __iomem *)adapter->mac_regs_base + 0x800);
58349b49cdaSZbigniew Bodek 
58449b49cdaSZbigniew Bodek 	/* initialize Tx udma */
58549b49cdaSZbigniew Bodek 	udma_params.udma_regs_base = adapter->unit_regs;
58649b49cdaSZbigniew Bodek 	udma_params.type = UDMA_TX;
58749b49cdaSZbigniew Bodek 	udma_params.num_of_queues = AL_ETH_UDMA_TX_QUEUES;
58849b49cdaSZbigniew Bodek 	udma_params.name = "eth tx";
58949b49cdaSZbigniew Bodek 	rc = al_udma_init(&adapter->tx_udma, &udma_params);
59049b49cdaSZbigniew Bodek 
59149b49cdaSZbigniew Bodek 	if (rc != 0) {
59249b49cdaSZbigniew Bodek 		al_err("failed to initialize %s, error %d\n",
59349b49cdaSZbigniew Bodek 			 udma_params.name, rc);
59449b49cdaSZbigniew Bodek 		return rc;
59549b49cdaSZbigniew Bodek 	}
59649b49cdaSZbigniew Bodek 	rc = al_udma_state_set_wait(&adapter->tx_udma, UDMA_NORMAL);
59749b49cdaSZbigniew Bodek 	if (rc != 0) {
59849b49cdaSZbigniew Bodek 		al_err("[%s]: failed to change state, error %d\n",
59949b49cdaSZbigniew Bodek 			 udma_params.name, rc);
60049b49cdaSZbigniew Bodek 		return rc;
60149b49cdaSZbigniew Bodek 	}
60249b49cdaSZbigniew Bodek 	/* initialize Rx udma */
60349b49cdaSZbigniew Bodek 	udma_params.udma_regs_base = adapter->unit_regs;
60449b49cdaSZbigniew Bodek 	udma_params.type = UDMA_RX;
60549b49cdaSZbigniew Bodek 	udma_params.num_of_queues = AL_ETH_UDMA_RX_QUEUES;
60649b49cdaSZbigniew Bodek 	udma_params.name = "eth rx";
60749b49cdaSZbigniew Bodek 	rc = al_udma_init(&adapter->rx_udma, &udma_params);
60849b49cdaSZbigniew Bodek 
60949b49cdaSZbigniew Bodek 	if (rc != 0) {
61049b49cdaSZbigniew Bodek 		al_err("failed to initialize %s, error %d\n",
61149b49cdaSZbigniew Bodek 			 udma_params.name, rc);
61249b49cdaSZbigniew Bodek 		return rc;
61349b49cdaSZbigniew Bodek 	}
61449b49cdaSZbigniew Bodek 
61549b49cdaSZbigniew Bodek 	rc = al_udma_state_set_wait(&adapter->rx_udma, UDMA_NORMAL);
61649b49cdaSZbigniew Bodek 	if (rc != 0) {
61749b49cdaSZbigniew Bodek 		al_err("[%s]: failed to change state, error %d\n",
61849b49cdaSZbigniew Bodek 			 udma_params.name, rc);
61949b49cdaSZbigniew Bodek 		return rc;
62049b49cdaSZbigniew Bodek 	}
62149b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: controller's UDMA successfully initialized\n",
62249b49cdaSZbigniew Bodek 		 params->name);
62349b49cdaSZbigniew Bodek 
62449b49cdaSZbigniew Bodek 	/* set max packet size to 1M (for TSO) */
62549b49cdaSZbigniew Bodek 	conf.encode_64k_as_zero = AL_TRUE;
62649b49cdaSZbigniew Bodek 	conf.max_pkt_size = 0xfffff;
62749b49cdaSZbigniew Bodek 	al_udma_m2s_packet_size_cfg_set(&adapter->tx_udma, &conf);
62849b49cdaSZbigniew Bodek 
62949b49cdaSZbigniew Bodek 	/* set m2s (tx) max descriptors to max data buffers number and one for
63049b49cdaSZbigniew Bodek 	 * meta descriptor
63149b49cdaSZbigniew Bodek 	 */
63249b49cdaSZbigniew Bodek 	al_udma_m2s_max_descs_set(&adapter->tx_udma, AL_ETH_PKT_MAX_BUFS + 1);
63349b49cdaSZbigniew Bodek 
63449b49cdaSZbigniew Bodek 	/* set s2m (rx) max descriptors to max data buffers */
63549b49cdaSZbigniew Bodek 	al_udma_s2m_max_descs_set(&adapter->rx_udma, AL_ETH_PKT_MAX_BUFS);
63649b49cdaSZbigniew Bodek 
63749b49cdaSZbigniew Bodek 	/* set s2m burst lenght when writing completion descriptors to 64 bytes
63849b49cdaSZbigniew Bodek 	 */
63949b49cdaSZbigniew Bodek 	al_udma_s2m_compl_desc_burst_config(&adapter->rx_udma, 64);
64049b49cdaSZbigniew Bodek 
64149b49cdaSZbigniew Bodek 	/* if pointer to ec regs provided, then init the tx meta cache of this udma*/
64249b49cdaSZbigniew Bodek 	if (adapter->ec_regs_base != NULL) {
64349b49cdaSZbigniew Bodek 		// INIT TX CACHE TABLE:
64449b49cdaSZbigniew Bodek 		for (i = 0; i < 4; i++) {
64549b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->tso.cache_table_addr, i + (adapter->udma_id * 4));
64649b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->tso.cache_table_data_1, 0x00000000);
64749b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->tso.cache_table_data_2, 0x00000000);
64849b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->tso.cache_table_data_3, 0x00000000);
64949b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->tso.cache_table_data_4, 0x00000000);
65049b49cdaSZbigniew Bodek 		}
65149b49cdaSZbigniew Bodek 	}
65249b49cdaSZbigniew Bodek 	// only udma 0 allowed to init ec
65349b49cdaSZbigniew Bodek 	if (adapter->udma_id != 0) {
65449b49cdaSZbigniew Bodek 		return 0;
65549b49cdaSZbigniew Bodek 	}
65649b49cdaSZbigniew Bodek 	/* enable Ethernet controller: */
65749b49cdaSZbigniew Bodek 	/* enable internal machines*/
65849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->gen.en, 0xffffffff);
65949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->gen.fifo_en, 0xffffffff);
66049b49cdaSZbigniew Bodek 
66149b49cdaSZbigniew Bodek 	if (adapter->rev_id > AL_ETH_REV_ID_0) {
66249b49cdaSZbigniew Bodek 		/* enable A0 descriptor structure */
66349b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->ec_regs_base->gen.en_ext,
66449b49cdaSZbigniew Bodek 				      EC_GEN_EN_EXT_CACHE_WORD_SPLIT,
66549b49cdaSZbigniew Bodek 				      EC_GEN_EN_EXT_CACHE_WORD_SPLIT);
66649b49cdaSZbigniew Bodek 
66749b49cdaSZbigniew Bodek 		/* use mss value in the descriptor */
66849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->tso.cfg_add_0,
66949b49cdaSZbigniew Bodek 						EC_TSO_CFG_ADD_0_MSS_SEL);
67049b49cdaSZbigniew Bodek 
67149b49cdaSZbigniew Bodek 		/* enable tunnel TSO */
67249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->tso.cfg_tunnel,
67349b49cdaSZbigniew Bodek 						(EC_TSO_CFG_TUNNEL_EN_TUNNEL_TSO |
67449b49cdaSZbigniew Bodek 						 EC_TSO_CFG_TUNNEL_EN_UDP_CHKSUM |
67549b49cdaSZbigniew Bodek 						 EC_TSO_CFG_TUNNEL_EN_UDP_LEN |
67649b49cdaSZbigniew Bodek 						 EC_TSO_CFG_TUNNEL_EN_IPV6_PLEN |
67749b49cdaSZbigniew Bodek 						 EC_TSO_CFG_TUNNEL_EN_IPV4_CHKSUM |
67849b49cdaSZbigniew Bodek 						 EC_TSO_CFG_TUNNEL_EN_IPV4_IDEN |
67949b49cdaSZbigniew Bodek 						 EC_TSO_CFG_TUNNEL_EN_IPV4_TLEN));
68049b49cdaSZbigniew Bodek 	}
68149b49cdaSZbigniew Bodek 
68249b49cdaSZbigniew Bodek 	/* swap input byts from MAC RX */
68349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->mac.gen, 0x00000001);
68449b49cdaSZbigniew Bodek 	/* swap output bytes to MAC TX*/
68549b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tmi.tx_cfg, EC_TMI_TX_CFG_EN_FWD_TO_RX|EC_TMI_TX_CFG_SWAP_BYTES);
68649b49cdaSZbigniew Bodek 
68749b49cdaSZbigniew Bodek 	/* TODO: check if we need this line*/
68849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_udma[0].fwd_dec, 0x000003fb);
68949b49cdaSZbigniew Bodek 
69049b49cdaSZbigniew Bodek 	/* RFW configuration: default 0 */
69149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_default[0].opt_1, 0x00000001);
69249b49cdaSZbigniew Bodek 
69349b49cdaSZbigniew Bodek 	/* VLAN table address*/
69449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_addr, 0x00000000);
69549b49cdaSZbigniew Bodek 	/* VLAN table data*/
69649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_data, 0x00000000);
69749b49cdaSZbigniew Bodek 	/* HASH config (select toeplitz and bits 7:0 of the thash result, enable
69849b49cdaSZbigniew Bodek 	 * symmetric hash) */
69949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.thash_cfg_1,
70049b49cdaSZbigniew Bodek 			EC_RFW_THASH_CFG_1_ENABLE_IP_SWAP |
70149b49cdaSZbigniew Bodek 			EC_RFW_THASH_CFG_1_ENABLE_PORT_SWAP);
70249b49cdaSZbigniew Bodek 
70349b49cdaSZbigniew Bodek 	al_eth_epe_init(adapter);
70449b49cdaSZbigniew Bodek 
70549b49cdaSZbigniew Bodek 	/* disable TSO padding and use mac padding instead */
70649b49cdaSZbigniew Bodek 	reg = al_reg_read32(&adapter->ec_regs_base->tso.in_cfg);
70749b49cdaSZbigniew Bodek 	reg &= ~0x7F00; /*clear bits 14:8 */
70849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tso.in_cfg, reg);
70949b49cdaSZbigniew Bodek 
71049b49cdaSZbigniew Bodek 	return 0;
71149b49cdaSZbigniew Bodek }
71249b49cdaSZbigniew Bodek 
71349b49cdaSZbigniew Bodek /*****************************API Functions  **********************************/
71449b49cdaSZbigniew Bodek /*adapter management */
71549b49cdaSZbigniew Bodek /**
71649b49cdaSZbigniew Bodek  * enable the ec and mac interrupts
71749b49cdaSZbigniew Bodek  */
al_eth_ec_mac_ints_config(struct al_hal_eth_adapter * adapter)71849b49cdaSZbigniew Bodek int al_eth_ec_mac_ints_config(struct al_hal_eth_adapter *adapter)
71949b49cdaSZbigniew Bodek {
72049b49cdaSZbigniew Bodek 
72149b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: enable ethernet and mac interrupts\n", adapter->name);
72249b49cdaSZbigniew Bodek 
72349b49cdaSZbigniew Bodek 	// only udma 0 allowed to init ec
72449b49cdaSZbigniew Bodek 	if (adapter->udma_id != 0)
72549b49cdaSZbigniew Bodek 		return -EPERM;
72649b49cdaSZbigniew Bodek 
72749b49cdaSZbigniew Bodek 	/* enable mac ints */
72849b49cdaSZbigniew Bodek 	al_iofic_config(adapter->ec_ints_base, AL_INT_GROUP_A,
72949b49cdaSZbigniew Bodek 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
73049b49cdaSZbigniew Bodek 	al_iofic_config(adapter->ec_ints_base, AL_INT_GROUP_B,
73149b49cdaSZbigniew Bodek 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
73249b49cdaSZbigniew Bodek 	al_iofic_config(adapter->ec_ints_base, AL_INT_GROUP_C,
73349b49cdaSZbigniew Bodek 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
73449b49cdaSZbigniew Bodek 	al_iofic_config(adapter->ec_ints_base, AL_INT_GROUP_D,
73549b49cdaSZbigniew Bodek 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
73649b49cdaSZbigniew Bodek 
73749b49cdaSZbigniew Bodek 	/* unmask MAC int */
73849b49cdaSZbigniew Bodek 	al_iofic_unmask(adapter->ec_ints_base, AL_INT_GROUP_A, 8);
73949b49cdaSZbigniew Bodek 
74049b49cdaSZbigniew Bodek 	/* enable ec interrupts */
74149b49cdaSZbigniew Bodek 	al_iofic_config(adapter->mac_ints_base, AL_INT_GROUP_A,
74249b49cdaSZbigniew Bodek 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
74349b49cdaSZbigniew Bodek 	al_iofic_config(adapter->mac_ints_base, AL_INT_GROUP_B,
74449b49cdaSZbigniew Bodek 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
74549b49cdaSZbigniew Bodek 	al_iofic_config(adapter->mac_ints_base, AL_INT_GROUP_C,
74649b49cdaSZbigniew Bodek 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
74749b49cdaSZbigniew Bodek 	al_iofic_config(adapter->mac_ints_base, AL_INT_GROUP_D,
74849b49cdaSZbigniew Bodek 		INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
74949b49cdaSZbigniew Bodek 
75049b49cdaSZbigniew Bodek 	/* eee active */
75149b49cdaSZbigniew Bodek 	al_iofic_unmask(adapter->mac_ints_base, AL_INT_GROUP_B, AL_BIT(14));
75249b49cdaSZbigniew Bodek 
75349b49cdaSZbigniew Bodek 	al_iofic_unmask(adapter->unit_regs, AL_INT_GROUP_D, AL_BIT(11));
75449b49cdaSZbigniew Bodek 	return 0;
75549b49cdaSZbigniew Bodek }
75649b49cdaSZbigniew Bodek 
75749b49cdaSZbigniew Bodek /**
75849b49cdaSZbigniew Bodek  * ec and mac interrupt service routine
75949b49cdaSZbigniew Bodek  * read and print asserted interrupts
76049b49cdaSZbigniew Bodek  *
76149b49cdaSZbigniew Bodek  * @param adapter pointer to the private structure
76249b49cdaSZbigniew Bodek  *
76349b49cdaSZbigniew Bodek  * @return 0 on success. otherwise on failure.
76449b49cdaSZbigniew Bodek  */
al_eth_ec_mac_isr(struct al_hal_eth_adapter * adapter)76549b49cdaSZbigniew Bodek int al_eth_ec_mac_isr(struct al_hal_eth_adapter *adapter)
76649b49cdaSZbigniew Bodek {
76749b49cdaSZbigniew Bodek 	uint32_t cause;
76849b49cdaSZbigniew Bodek 	al_dbg("[%s]: ethernet interrupts handler\n", adapter->name);
76949b49cdaSZbigniew Bodek 
77049b49cdaSZbigniew Bodek 	// only udma 0 allowed to init ec
77149b49cdaSZbigniew Bodek 	if (adapter->udma_id != 0)
77249b49cdaSZbigniew Bodek 		return -EPERM;
77349b49cdaSZbigniew Bodek 
77449b49cdaSZbigniew Bodek 	/* read ec cause */
77549b49cdaSZbigniew Bodek 	cause = al_iofic_read_cause(adapter->ec_ints_base, AL_INT_GROUP_A);
77649b49cdaSZbigniew Bodek 	al_dbg("[%s]: ethernet group A cause 0x%08x\n", adapter->name, cause);
77749b49cdaSZbigniew Bodek 	if (cause & 1)
77849b49cdaSZbigniew Bodek 	{
77949b49cdaSZbigniew Bodek 		cause = al_iofic_read_cause(adapter->mac_ints_base, AL_INT_GROUP_A);
78049b49cdaSZbigniew Bodek 		al_dbg("[%s]: mac group A cause 0x%08x\n", adapter->name, cause);
78149b49cdaSZbigniew Bodek 
78249b49cdaSZbigniew Bodek 		cause = al_iofic_read_cause(adapter->mac_ints_base, AL_INT_GROUP_B);
78349b49cdaSZbigniew Bodek 		al_dbg("[%s]: mac group B cause 0x%08x\n", adapter->name, cause);
78449b49cdaSZbigniew Bodek 
78549b49cdaSZbigniew Bodek 		cause = al_iofic_read_cause(adapter->mac_ints_base, AL_INT_GROUP_C);
78649b49cdaSZbigniew Bodek 		al_dbg("[%s]: mac group C cause 0x%08x\n", adapter->name, cause);
78749b49cdaSZbigniew Bodek 
78849b49cdaSZbigniew Bodek 		cause = al_iofic_read_cause(adapter->mac_ints_base, AL_INT_GROUP_D);
78949b49cdaSZbigniew Bodek 		al_dbg("[%s]: mac group D cause 0x%08x\n", adapter->name, cause);
79049b49cdaSZbigniew Bodek 	}
79149b49cdaSZbigniew Bodek 	cause = al_iofic_read_cause(adapter->ec_ints_base, AL_INT_GROUP_B);
79249b49cdaSZbigniew Bodek 	al_dbg("[%s]: ethernet group B cause 0x%08x\n", adapter->name, cause);
79349b49cdaSZbigniew Bodek 	cause = al_iofic_read_cause(adapter->ec_ints_base, AL_INT_GROUP_C);
79449b49cdaSZbigniew Bodek 	al_dbg("[%s]: ethernet group C cause 0x%08x\n", adapter->name, cause);
79549b49cdaSZbigniew Bodek 	cause = al_iofic_read_cause(adapter->ec_ints_base, AL_INT_GROUP_D);
79649b49cdaSZbigniew Bodek 	al_dbg("[%s]: ethernet group D cause 0x%08x\n", adapter->name, cause);
79749b49cdaSZbigniew Bodek 
79849b49cdaSZbigniew Bodek 	return 0;
79949b49cdaSZbigniew Bodek }
80049b49cdaSZbigniew Bodek 
80149b49cdaSZbigniew Bodek /**
80249b49cdaSZbigniew Bodek  * stop the DMA of the ethernet adapter
80349b49cdaSZbigniew Bodek  */
al_eth_adapter_stop(struct al_hal_eth_adapter * adapter)80449b49cdaSZbigniew Bodek int al_eth_adapter_stop(struct al_hal_eth_adapter *adapter)
80549b49cdaSZbigniew Bodek {
80649b49cdaSZbigniew Bodek 	int rc;
80749b49cdaSZbigniew Bodek 
80849b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: stop controller's UDMA\n", adapter->name);
80949b49cdaSZbigniew Bodek 
81049b49cdaSZbigniew Bodek 	/* disable Tx dma*/
81149b49cdaSZbigniew Bodek 	rc = al_udma_state_set_wait(&adapter->tx_udma, UDMA_DISABLE);
81249b49cdaSZbigniew Bodek 	if (rc != 0) {
81349b49cdaSZbigniew Bodek 		al_warn("[%s] warn: failed to change state, error %d\n",
81449b49cdaSZbigniew Bodek 			 adapter->tx_udma.name, rc);
81549b49cdaSZbigniew Bodek 		return rc;
81649b49cdaSZbigniew Bodek 	}
81749b49cdaSZbigniew Bodek 
81849b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: controller's TX UDMA stopped\n",
81949b49cdaSZbigniew Bodek 		 adapter->name);
82049b49cdaSZbigniew Bodek 	/* disable Rx dma*/
82149b49cdaSZbigniew Bodek 	rc = al_udma_state_set_wait(&adapter->rx_udma, UDMA_DISABLE);
82249b49cdaSZbigniew Bodek 	if (rc != 0) {
82349b49cdaSZbigniew Bodek 		al_warn("[%s] warn: failed to change state, error %d\n",
82449b49cdaSZbigniew Bodek 			 adapter->rx_udma.name, rc);
82549b49cdaSZbigniew Bodek 		return rc;
82649b49cdaSZbigniew Bodek 	}
82749b49cdaSZbigniew Bodek 
82849b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: controller's RX UDMA stopped\n",
82949b49cdaSZbigniew Bodek 		 adapter->name);
83049b49cdaSZbigniew Bodek 	return 0;
83149b49cdaSZbigniew Bodek }
83249b49cdaSZbigniew Bodek 
al_eth_adapter_reset(struct al_hal_eth_adapter * adapter)83349b49cdaSZbigniew Bodek int al_eth_adapter_reset(struct al_hal_eth_adapter *adapter)
83449b49cdaSZbigniew Bodek {
83549b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: reset controller's UDMA\n", adapter->name);
83649b49cdaSZbigniew Bodek 
83749b49cdaSZbigniew Bodek 	return -EPERM;
83849b49cdaSZbigniew Bodek }
83949b49cdaSZbigniew Bodek 
84049b49cdaSZbigniew Bodek /* Q management */
84149b49cdaSZbigniew Bodek /**
84249b49cdaSZbigniew Bodek  * Configure and enable a queue ring
84349b49cdaSZbigniew Bodek  */
al_eth_queue_config(struct al_hal_eth_adapter * adapter,enum al_udma_type type,uint32_t qid,struct al_udma_q_params * q_params)84449b49cdaSZbigniew Bodek int al_eth_queue_config(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid,
84549b49cdaSZbigniew Bodek 			     struct al_udma_q_params *q_params)
84649b49cdaSZbigniew Bodek {
84749b49cdaSZbigniew Bodek 	struct al_udma *udma;
84849b49cdaSZbigniew Bodek 	int rc;
84949b49cdaSZbigniew Bodek 
85049b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: config UDMA %s queue %d\n", adapter->name,
85149b49cdaSZbigniew Bodek 		 type == UDMA_TX ? "Tx" : "Rx", qid);
85249b49cdaSZbigniew Bodek 
85349b49cdaSZbigniew Bodek 	if (type == UDMA_TX) {
85449b49cdaSZbigniew Bodek 		udma = &adapter->tx_udma;
85549b49cdaSZbigniew Bodek 	} else {
85649b49cdaSZbigniew Bodek 		udma = &adapter->rx_udma;
85749b49cdaSZbigniew Bodek 	}
85849b49cdaSZbigniew Bodek 
85949b49cdaSZbigniew Bodek 	q_params->adapter_rev_id = adapter->rev_id;
86049b49cdaSZbigniew Bodek 
86149b49cdaSZbigniew Bodek 	rc = al_udma_q_init(udma, qid, q_params);
86249b49cdaSZbigniew Bodek 
86349b49cdaSZbigniew Bodek 	if (rc)
86449b49cdaSZbigniew Bodek 		return rc;
86549b49cdaSZbigniew Bodek 
86649b49cdaSZbigniew Bodek 	if (type == UDMA_RX) {
86749b49cdaSZbigniew Bodek 		rc = al_udma_s2m_q_compl_coal_config(&udma->udma_q[qid],
86849b49cdaSZbigniew Bodek 				AL_TRUE, AL_ETH_S2M_UDMA_COMP_COAL_TIMEOUT);
86949b49cdaSZbigniew Bodek 
87049b49cdaSZbigniew Bodek 		al_assert(q_params->cdesc_size <= 32);
87149b49cdaSZbigniew Bodek 
87249b49cdaSZbigniew Bodek 		if (q_params->cdesc_size > 16)
87349b49cdaSZbigniew Bodek 			al_reg_write32_masked(&adapter->ec_regs_base->rfw.out_cfg,
87449b49cdaSZbigniew Bodek 					EC_RFW_OUT_CFG_META_CNT_MASK, 2);
87549b49cdaSZbigniew Bodek 	}
87649b49cdaSZbigniew Bodek 	return rc;
87749b49cdaSZbigniew Bodek }
87849b49cdaSZbigniew Bodek 
al_eth_queue_enable(struct al_hal_eth_adapter * adapter,enum al_udma_type type,uint32_t qid)87949b49cdaSZbigniew Bodek int al_eth_queue_enable(struct al_hal_eth_adapter *adapter __attribute__((__unused__)),
88049b49cdaSZbigniew Bodek 			enum al_udma_type type __attribute__((__unused__)),
88149b49cdaSZbigniew Bodek 			uint32_t qid __attribute__((__unused__)))
88249b49cdaSZbigniew Bodek {
88349b49cdaSZbigniew Bodek 	return -EPERM;
88449b49cdaSZbigniew Bodek }
al_eth_queue_disable(struct al_hal_eth_adapter * adapter,enum al_udma_type type,uint32_t qid)88549b49cdaSZbigniew Bodek int al_eth_queue_disable(struct al_hal_eth_adapter *adapter __attribute__((__unused__)),
88649b49cdaSZbigniew Bodek 			 enum al_udma_type type __attribute__((__unused__)),
88749b49cdaSZbigniew Bodek 			 uint32_t qid __attribute__((__unused__)))
88849b49cdaSZbigniew Bodek {
88949b49cdaSZbigniew Bodek 	return -EPERM;
89049b49cdaSZbigniew Bodek }
89149b49cdaSZbigniew Bodek 
89249b49cdaSZbigniew Bodek /* MAC layer */
al_eth_rx_pkt_limit_config(struct al_hal_eth_adapter * adapter,uint32_t min_rx_len,uint32_t max_rx_len)89349b49cdaSZbigniew Bodek int al_eth_rx_pkt_limit_config(struct al_hal_eth_adapter *adapter, uint32_t min_rx_len, uint32_t max_rx_len)
89449b49cdaSZbigniew Bodek {
89549b49cdaSZbigniew Bodek 	al_assert(max_rx_len <= AL_ETH_MAX_FRAME_LEN);
89649b49cdaSZbigniew Bodek 
89749b49cdaSZbigniew Bodek 	/* EC minimum packet length [bytes] in RX */
89849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->mac.min_pkt, min_rx_len);
89949b49cdaSZbigniew Bodek 	/* EC maximum packet length [bytes] in RX */
90049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->mac.max_pkt, max_rx_len);
90149b49cdaSZbigniew Bodek 
90249b49cdaSZbigniew Bodek 	if (adapter->rev_id > AL_ETH_REV_ID_2) {
90349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, min_rx_len);
90449b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, max_rx_len);
90549b49cdaSZbigniew Bodek 	}
90649b49cdaSZbigniew Bodek 
90749b49cdaSZbigniew Bodek 	/* configure the MAC's max rx length, add 16 bytes so the packet get
90849b49cdaSZbigniew Bodek 	 * trimmed by the EC/Async_fifo rather by the MAC
90949b49cdaSZbigniew Bodek 	*/
91049b49cdaSZbigniew Bodek 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
91149b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.frm_len, max_rx_len + 16);
91249b49cdaSZbigniew Bodek 	else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode))
91349b49cdaSZbigniew Bodek 		/* 10G MAC control register  */
91449b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_10g.frm_len, (max_rx_len + 16));
91549b49cdaSZbigniew Bodek 	else
91649b49cdaSZbigniew Bodek 		al_eth_40g_mac_reg_write(adapter, ETH_MAC_GEN_V3_MAC_40G_FRM_LENGTH_ADDR, (max_rx_len + 16));
91749b49cdaSZbigniew Bodek 
91849b49cdaSZbigniew Bodek 	return 0;
91949b49cdaSZbigniew Bodek }
92049b49cdaSZbigniew Bodek 
92149b49cdaSZbigniew Bodek /* configure the mac media type. */
al_eth_mac_config(struct al_hal_eth_adapter * adapter,enum al_eth_mac_mode mode)92249b49cdaSZbigniew Bodek int al_eth_mac_config(struct al_hal_eth_adapter *adapter, enum al_eth_mac_mode mode)
92349b49cdaSZbigniew Bodek {
92449b49cdaSZbigniew Bodek 	switch(mode) {
92549b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_RGMII:
92649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x40003210);
92749b49cdaSZbigniew Bodek 
92849b49cdaSZbigniew Bodek 		/* 1G MAC control register */
92949b49cdaSZbigniew Bodek 		/* bit[0]  - TX_ENA - zeroed by default. Should be asserted by al_eth_mac_start
93049b49cdaSZbigniew Bodek 		 * bit[1]  - RX_ENA - zeroed by default. Should be asserted by al_eth_mac_start
93149b49cdaSZbigniew Bodek 		 * bit[3]  - ETH_SPEED - zeroed to enable 10/100 Mbps Ethernet
93249b49cdaSZbigniew Bodek 		 * bit[4]  - PROMIS_EN - asserted to enable MAC promiscuous mode
93349b49cdaSZbigniew Bodek 		 * bit[23] - CNTL_FRM-ENA - asserted to enable control frames
93449b49cdaSZbigniew Bodek 		 * bit[24] - NO_LGTH_CHECK - asserted to disable length checks, which is done in the controller
93549b49cdaSZbigniew Bodek 		 */
93649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.cmd_cfg, 0x01800010);
93749b49cdaSZbigniew Bodek 
93849b49cdaSZbigniew Bodek 		/* RX_SECTION_EMPTY,  */
93949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_section_empty, 0x00000000);
94049b49cdaSZbigniew Bodek 		/* RX_SECTION_FULL,  */
94149b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_section_full, 0x0000000c); /* must be larger than almost empty */
94249b49cdaSZbigniew Bodek 		/* RX_ALMOST_EMPTY,  */
94349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_almost_empty, 0x00000008);
94449b49cdaSZbigniew Bodek 		/* RX_ALMOST_FULL,  */
94549b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_almost_full, 0x00000008);
94649b49cdaSZbigniew Bodek 
94749b49cdaSZbigniew Bodek 
94849b49cdaSZbigniew Bodek 		/* TX_SECTION_EMPTY,  */
94949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_section_empty, 0x00000008); /* 8 ? */
95049b49cdaSZbigniew Bodek 		/* TX_SECTION_FULL, 0 - store and forward, */
95149b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_section_full, 0x0000000c);
95249b49cdaSZbigniew Bodek 		/* TX_ALMOST_EMPTY,  */
95349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_almost_empty, 0x00000008);
95449b49cdaSZbigniew Bodek 		/* TX_ALMOST_FULL,  */
95549b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_almost_full, 0x00000008);
95649b49cdaSZbigniew Bodek 
95749b49cdaSZbigniew Bodek 		/* XAUI MAC control register */
95849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000000);
95949b49cdaSZbigniew Bodek 
96049b49cdaSZbigniew Bodek 		/* 1G MACSET 1G */
96149b49cdaSZbigniew Bodek 		/* taking sel_1000/sel_10 inputs from rgmii PHY, and not from register.
96249b49cdaSZbigniew Bodek 		 * disabling magic_packets detection in mac */
96349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.mac_1g_cfg, 0x00000002);
96449b49cdaSZbigniew Bodek 		/* RGMII set 1G */
96549b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00063910);
96649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.rgmii_sel, 0xF);
96749b49cdaSZbigniew Bodek 		break;
96849b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_SGMII:
96949b49cdaSZbigniew Bodek 		if (adapter->rev_id > AL_ETH_REV_ID_2) {
97049b49cdaSZbigniew Bodek 			/* configure and enable the ASYNC FIFO between the MACs and the EC */
97149b49cdaSZbigniew Bodek 			/* TX min packet size */
972*3fc36ee0SWojciech Macek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
97349b49cdaSZbigniew Bodek 			/* TX max packet size */
97449b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
97549b49cdaSZbigniew Bodek 			/* TX input bus configuration */
97649b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
97749b49cdaSZbigniew Bodek 			/* TX output bus configuration */
97849b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00030020);
97949b49cdaSZbigniew Bodek 			/* TX Valid/ready configuration */
98049b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000121);
98149b49cdaSZbigniew Bodek 			/* RX min packet size */
98249b49cdaSZbigniew Bodek 			/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
98349b49cdaSZbigniew Bodek 			/* RX max packet size */
98449b49cdaSZbigniew Bodek 			/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
98549b49cdaSZbigniew Bodek 			/* RX input bus configuration */
98649b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00030020);
98749b49cdaSZbigniew Bodek 			/* RX output bus configuration */
98849b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
98949b49cdaSZbigniew Bodek 			/* RX Valid/ready configuration */
99049b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000212);
99149b49cdaSZbigniew Bodek 			/* V3 additional MAC selection */
99249b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000000);
99349b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000001);
99449b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
99549b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000000);
99649b49cdaSZbigniew Bodek 			/* ASYNC FIFO ENABLE */
99749b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
99849b49cdaSZbigniew Bodek 			/* Timestamp_configuration */
99949b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.spare,
100049b49cdaSZbigniew Bodek 					ETH_MAC_GEN_V3_SPARE_CHICKEN_DISABLE_TIMESTAMP_STRETCH);
100149b49cdaSZbigniew Bodek 		}
100249b49cdaSZbigniew Bodek 
100349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x40053210);
100449b49cdaSZbigniew Bodek 
100549b49cdaSZbigniew Bodek 		/* 1G MAC control register */
100649b49cdaSZbigniew Bodek 		/* bit[0]  - TX_ENA - zeroed by default. Should be asserted by al_eth_mac_start
100749b49cdaSZbigniew Bodek 		 * bit[1]  - RX_ENA - zeroed by default. Should be asserted by al_eth_mac_start
100849b49cdaSZbigniew Bodek 		 * bit[3]  - ETH_SPEED - zeroed to enable 10/100 Mbps Ethernet
100949b49cdaSZbigniew Bodek 		 * bit[4]  - PROMIS_EN - asserted to enable MAC promiscuous mode
101049b49cdaSZbigniew Bodek 		 * bit[23] - CNTL_FRM-ENA - asserted to enable control frames
101149b49cdaSZbigniew Bodek 		 * bit[24] - NO_LGTH_CHECK - asserted to disable length checks, which is done in the controller
101249b49cdaSZbigniew Bodek 		 */
101349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.cmd_cfg, 0x01800010);
101449b49cdaSZbigniew Bodek 
101549b49cdaSZbigniew Bodek 		/* RX_SECTION_EMPTY,  */
101649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_section_empty, 0x00000000);
101749b49cdaSZbigniew Bodek 		/* RX_SECTION_FULL,  */
101849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_section_full, 0x0000000c); /* must be larger than almost empty */
101949b49cdaSZbigniew Bodek 		/* RX_ALMOST_EMPTY,  */
102049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_almost_empty, 0x00000008);
102149b49cdaSZbigniew Bodek 		/* RX_ALMOST_FULL,  */
102249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_almost_full, 0x00000008);
102349b49cdaSZbigniew Bodek 
102449b49cdaSZbigniew Bodek 
102549b49cdaSZbigniew Bodek 		/* TX_SECTION_EMPTY,  */
102649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_section_empty, 0x00000008); /* 8 ? */
102749b49cdaSZbigniew Bodek 		/* TX_SECTION_FULL, 0 - store and forward, */
102849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_section_full, 0x0000000c);
102949b49cdaSZbigniew Bodek 		/* TX_ALMOST_EMPTY,  */
103049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_almost_empty, 0x00000008);
103149b49cdaSZbigniew Bodek 		/* TX_ALMOST_FULL,  */
103249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_almost_full, 0x00000008);
103349b49cdaSZbigniew Bodek 
103449b49cdaSZbigniew Bodek 		/* XAUI MAC control register */
103549b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x000000c0);
103649b49cdaSZbigniew Bodek 
103749b49cdaSZbigniew Bodek 		/* 1G MACSET 1G */
103849b49cdaSZbigniew Bodek 		/* taking sel_1000/sel_10 inputs from rgmii_converter, and not from register.
103949b49cdaSZbigniew Bodek 		 * disabling magic_packets detection in mac */
104049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.mac_1g_cfg, 0x00000002);
104149b49cdaSZbigniew Bodek 		/* SerDes configuration */
104249b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00063910);
104349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0);
104449b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
104549b49cdaSZbigniew Bodek 
104649b49cdaSZbigniew Bodek 		// FAST AN -- Testing only
104749b49cdaSZbigniew Bodek #ifdef AL_HAL_ETH_FAST_AN
104849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 0x00000012);
104949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data, 0x00000040);
105049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 0x00000013);
105149b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data, 0x00000000);
105249b49cdaSZbigniew Bodek #endif
105349b49cdaSZbigniew Bodek 
105449b49cdaSZbigniew Bodek 		/* Setting PCS i/f mode to SGMII (instead of default 1000Base-X) */
105549b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 0x00000014);
105649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data, 0x0000000b);
105749b49cdaSZbigniew Bodek 		/* setting dev_ability to have speed of 1000Mb, [11:10] = 2'b10 */
105849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 0x00000004);
105949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data, 0x000009A0);
106049b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
106149b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
106249b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
106349b49cdaSZbigniew Bodek 		break;
106449b49cdaSZbigniew Bodek 
106549b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_SGMII_2_5G:
106649b49cdaSZbigniew Bodek 		if (adapter->rev_id > AL_ETH_REV_ID_2) {
106749b49cdaSZbigniew Bodek 			/* configure and enable the ASYNC FIFO between the MACs and the EC */
106849b49cdaSZbigniew Bodek 			/* TX min packet size */
1069*3fc36ee0SWojciech Macek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
107049b49cdaSZbigniew Bodek 			/* TX max packet size */
107149b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
107249b49cdaSZbigniew Bodek 			/* TX input bus configuration */
107349b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
107449b49cdaSZbigniew Bodek 			/* TX output bus configuration */
107549b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00030020);
107649b49cdaSZbigniew Bodek 			/* TX Valid/ready configuration */
107749b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
107849b49cdaSZbigniew Bodek 			/* RX input bus configuration */
107949b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00030020);
108049b49cdaSZbigniew Bodek 			/* RX output bus configuration */
108149b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
108249b49cdaSZbigniew Bodek 			/* RX Valid/ready configuration */
108349b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000012);
108449b49cdaSZbigniew Bodek 			/* V3 additional MAC selection */
108549b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000000);
108649b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
108749b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
108849b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000050);
108949b49cdaSZbigniew Bodek 			/* ASYNC FIFO ENABLE */
109049b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
109149b49cdaSZbigniew Bodek 		}
109249b49cdaSZbigniew Bodek 
109349b49cdaSZbigniew Bodek 		/* MAC register file */
109449b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022830);
109549b49cdaSZbigniew Bodek 		/* XAUI MAC control register */
109649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000001);
109749b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_10g.if_mode, 0x00000028);
109849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_10g.control, 0x00001140);
109949b49cdaSZbigniew Bodek 		/* RXAUI MAC control register */
110049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
110149b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
110249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
110349b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
110449b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
110549b49cdaSZbigniew Bodek 				      ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00063910);
110649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x40003210);
110749b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0);
110849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
110949b49cdaSZbigniew Bodek 
111049b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
111149b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
111249b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
111349b49cdaSZbigniew Bodek 		break;
111449b49cdaSZbigniew Bodek 
111549b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_10GbE_Serial:
111649b49cdaSZbigniew Bodek 		if (adapter->rev_id > AL_ETH_REV_ID_2) {
111749b49cdaSZbigniew Bodek 			/* configure and enable the ASYNC FIFO between the MACs and the EC */
111849b49cdaSZbigniew Bodek 			/* TX min packet size */
1119*3fc36ee0SWojciech Macek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
112049b49cdaSZbigniew Bodek 			/* TX max packet size */
112149b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
112249b49cdaSZbigniew Bodek 			/* TX input bus configuration */
112349b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
112449b49cdaSZbigniew Bodek 			/* TX output bus configuration */
112549b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00030020);
112649b49cdaSZbigniew Bodek 			/* TX Valid/ready configuration */
112749b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
112849b49cdaSZbigniew Bodek 			/* RX min packet size */
112949b49cdaSZbigniew Bodek 			/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
113049b49cdaSZbigniew Bodek 			/* RX max packet size */
113149b49cdaSZbigniew Bodek 			/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
113249b49cdaSZbigniew Bodek 			/* RX input bus configuration */
113349b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00030020);
113449b49cdaSZbigniew Bodek 			/* RX output bus configuration */
113549b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
113649b49cdaSZbigniew Bodek 			/* RX Valid/ready configuration */
113749b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000012);
113849b49cdaSZbigniew Bodek 			/* V3 additional MAC selection */
113949b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000000);
114049b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
114149b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
114249b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000050);
114349b49cdaSZbigniew Bodek 			/* ASYNC FIFO ENABLE */
114449b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
114549b49cdaSZbigniew Bodek 		}
114649b49cdaSZbigniew Bodek 
114749b49cdaSZbigniew Bodek 		/* MAC register file */
114849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810);
114949b49cdaSZbigniew Bodek 		/* XAUI MAC control register */
115049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
115149b49cdaSZbigniew Bodek 		/* RXAUI MAC control register */
115249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
115349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
115449b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
115549b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
115649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
115749b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
115849b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
115949b49cdaSZbigniew Bodek 					~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00073910);
116049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
116149b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0);
116249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
116349b49cdaSZbigniew Bodek 
116449b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
116549b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
116649b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
116749b49cdaSZbigniew Bodek 		break;
116849b49cdaSZbigniew Bodek 
116949b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_KR_LL_25G:
117049b49cdaSZbigniew Bodek 			/* select 25G SERDES lane 0 and lane 1 */
1171*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, 0x0002110f);
1172*3fc36ee0SWojciech Macek 
117349b49cdaSZbigniew Bodek 		if (adapter->rev_id > AL_ETH_REV_ID_2) {
117449b49cdaSZbigniew Bodek 			/* configure and enable the ASYNC FIFO between the MACs and the EC */
117549b49cdaSZbigniew Bodek 			/* TX min packet size */
1176*3fc36ee0SWojciech Macek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
117749b49cdaSZbigniew Bodek 			/* TX max packet size */
117849b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
117949b49cdaSZbigniew Bodek 			/* TX input bus configuration */
118049b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
118149b49cdaSZbigniew Bodek 			/* TX output bus configuration */
118249b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00030020);
118349b49cdaSZbigniew Bodek 			/* TX Valid/ready configuration */
118449b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
118549b49cdaSZbigniew Bodek 			/* RX min packet size */
118649b49cdaSZbigniew Bodek 			/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
118749b49cdaSZbigniew Bodek 			/* RX max packet size */
118849b49cdaSZbigniew Bodek 			/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
118949b49cdaSZbigniew Bodek 			/* RX input bus configuration */
119049b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00030020);
119149b49cdaSZbigniew Bodek 			/* RX output bus configuration */
119249b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
119349b49cdaSZbigniew Bodek 			/* RX Valid/ready configuration */
119449b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000012);
119549b49cdaSZbigniew Bodek 			/* V3 additional MAC selection */
119649b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000000);
119749b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
119849b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
119949b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x000000a0);
120049b49cdaSZbigniew Bodek 			/* ASYNC FIFO ENABLE */
120149b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
120249b49cdaSZbigniew Bodek 		}
120349b49cdaSZbigniew Bodek 
120449b49cdaSZbigniew Bodek 		/* MAC register file */
120549b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810);
120649b49cdaSZbigniew Bodek 		/* XAUI MAC control register */
120749b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
120849b49cdaSZbigniew Bodek 		/* RXAUI MAC control register */
120949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
121049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
121149b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
121249b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
121349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
121449b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
1215*3fc36ee0SWojciech Macek 
1216*3fc36ee0SWojciech Macek 		if (adapter->serdes_lane == 0)
121749b49cdaSZbigniew Bodek 			al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
121849b49cdaSZbigniew Bodek 					~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00073910);
1219*3fc36ee0SWojciech Macek 		else
1220*3fc36ee0SWojciech Macek 			al_reg_write32(&adapter->mac_regs_base->gen.mux_sel, 0x00077910);
1221*3fc36ee0SWojciech Macek 
1222*3fc36ee0SWojciech Macek 		if (adapter->serdes_lane == 0)
122349b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
1224*3fc36ee0SWojciech Macek 		else
1225*3fc36ee0SWojciech Macek 			al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10000101);
1226*3fc36ee0SWojciech Macek 
122749b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0);
122849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
122949b49cdaSZbigniew Bodek 
123049b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
123149b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
123249b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
1233*3fc36ee0SWojciech Macek 
1234*3fc36ee0SWojciech Macek 		if (adapter->serdes_lane == 1)
1235*3fc36ee0SWojciech Macek 			al_reg_write32(&adapter->mac_regs_base->gen.los_sel, 0x101);
1236*3fc36ee0SWojciech Macek 
1237*3fc36ee0SWojciech Macek 
123849b49cdaSZbigniew Bodek 		break;
123949b49cdaSZbigniew Bodek 
124049b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_10G_SGMII:
124149b49cdaSZbigniew Bodek 		/* MAC register file */
124249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810);
124349b49cdaSZbigniew Bodek 
124449b49cdaSZbigniew Bodek 		/* XAUI MAC control register */
124549b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000001);
124649b49cdaSZbigniew Bodek 
124749b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_10g.if_mode, 0x0000002b);
124849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_10g.control, 0x00009140);
124949b49cdaSZbigniew Bodek 		// FAST AN -- Testing only
125049b49cdaSZbigniew Bodek #ifdef AL_HAL_ETH_FAST_AN
125149b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_10g.link_timer_lo, 0x00000040);
125249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_10g.link_timer_hi, 0x00000000);
125349b49cdaSZbigniew Bodek #endif
125449b49cdaSZbigniew Bodek 
125549b49cdaSZbigniew Bodek 		/* RXAUI MAC control register */
125649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
125749b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
125849b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
125949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
126049b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
126149b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
126249b49cdaSZbigniew Bodek 					~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00063910);
126349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x40003210);
126449b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
126549b49cdaSZbigniew Bodek 
126649b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
126749b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
126849b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
126949b49cdaSZbigniew Bodek 		break;
127049b49cdaSZbigniew Bodek 
127149b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_XLG_LL_40G:
127249b49cdaSZbigniew Bodek 		/* configure and enable the ASYNC FIFO between the MACs and the EC */
127349b49cdaSZbigniew Bodek 		/* TX min packet size */
1274*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
127549b49cdaSZbigniew Bodek 		/* TX max packet size */
127649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
127749b49cdaSZbigniew Bodek 		/* TX input bus configuration */
127849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
127949b49cdaSZbigniew Bodek 		/* TX output bus configuration */
128049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00010040);
128149b49cdaSZbigniew Bodek 		/* TX Valid/ready configuration */
128249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
128349b49cdaSZbigniew Bodek 		/* RX min packet size */
128449b49cdaSZbigniew Bodek 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
128549b49cdaSZbigniew Bodek 		/* RX max packet size */
128649b49cdaSZbigniew Bodek 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
128749b49cdaSZbigniew Bodek 		/* RX input bus configuration */
128849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00010040);
128949b49cdaSZbigniew Bodek 		/* RX output bus configuration */
129049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
129149b49cdaSZbigniew Bodek 		/* RX Valid/ready configuration */
129249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000112);
129349b49cdaSZbigniew Bodek 		/* V3 additional MAC selection */
129449b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000010);
129549b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
129649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
129749b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000000);
129849b49cdaSZbigniew Bodek 		/* ASYNC FIFO ENABLE */
129949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
130049b49cdaSZbigniew Bodek 
130149b49cdaSZbigniew Bodek 		/* cmd_cfg */
130249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, 0x00000008);
130349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, 0x01022810);
130449b49cdaSZbigniew Bodek 		/* speed_ability //Read-Only */
130549b49cdaSZbigniew Bodek 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, 0x00000008); */
130649b49cdaSZbigniew Bodek 		/* 40G capable */
130749b49cdaSZbigniew Bodek 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, 0x00000002); */
130849b49cdaSZbigniew Bodek 
130949b49cdaSZbigniew Bodek #ifdef AL_HAL_ETH_FAST_AN
131049b49cdaSZbigniew Bodek 		al_eth_40g_pcs_reg_write(adapter, 0x00010004, 1023);
131149b49cdaSZbigniew Bodek 		al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0xA04c);
131249b49cdaSZbigniew Bodek 		al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0x204c);
131349b49cdaSZbigniew Bodek 
131449b49cdaSZbigniew Bodek #endif
131549b49cdaSZbigniew Bodek 
131649b49cdaSZbigniew Bodek 		/* XAUI MAC control register */
131749b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
131849b49cdaSZbigniew Bodek 					~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x06883910);
131949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x0000040f);
132049b49cdaSZbigniew Bodek 
132149b49cdaSZbigniew Bodek 		/* MAC register file */
132249b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810); */
132349b49cdaSZbigniew Bodek 		/* XAUI MAC control register */
132449b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
132549b49cdaSZbigniew Bodek 		/* RXAUI MAC control register */
132649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
132749b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
132849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
132949b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
133049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
133149b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
133249b49cdaSZbigniew Bodek /*		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00073910); *//* XLG_LL_40G change */
133349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
133449b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0); *//* XLG_LL_40G change */
133549b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401); *//* XLG_LL_40G change */
133649b49cdaSZbigniew Bodek 
133749b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
133849b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
133949b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
134049b49cdaSZbigniew Bodek 		break;
134149b49cdaSZbigniew Bodek 
1342*3fc36ee0SWojciech Macek 	case AL_ETH_MAC_MODE_XLG_LL_25G:
1343*3fc36ee0SWojciech Macek 		/* xgmii_mode: 0=xlgmii, 1=xgmii */
1344*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, 0x0080);
1345*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, 0x00000001);
1346*3fc36ee0SWojciech Macek 
1347*3fc36ee0SWojciech Macek 		/* configure and enable the ASYNC FIFO between the MACs and the EC */
1348*3fc36ee0SWojciech Macek 		/* TX min packet size */
1349*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
1350*3fc36ee0SWojciech Macek 		/* TX max packet size */
1351*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
1352*3fc36ee0SWojciech Macek 		/* TX input bus configuration */
1353*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
1354*3fc36ee0SWojciech Macek 		/* TX output bus configuration */
1355*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00010040);
1356*3fc36ee0SWojciech Macek 		/* TX Valid/ready configuration */
1357*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
1358*3fc36ee0SWojciech Macek 		/* RX min packet size */
1359*3fc36ee0SWojciech Macek 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
1360*3fc36ee0SWojciech Macek 		/* RX max packet size */
1361*3fc36ee0SWojciech Macek 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
1362*3fc36ee0SWojciech Macek 		/* RX input bus configuration */
1363*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00010040);
1364*3fc36ee0SWojciech Macek 		/* RX output bus configuration */
1365*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
1366*3fc36ee0SWojciech Macek 		/* RX Valid/ready configuration */
1367*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000112);
1368*3fc36ee0SWojciech Macek 		/* V3 additional MAC selection */
1369*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000010);
1370*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
1371*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
1372*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000000);
1373*3fc36ee0SWojciech Macek 		/* ASYNC FIFO ENABLE */
1374*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
1375*3fc36ee0SWojciech Macek 
1376*3fc36ee0SWojciech Macek 		/* cmd_cfg */
1377*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, 0x00000008);
1378*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, 0x01022810);
1379*3fc36ee0SWojciech Macek 		/* speed_ability //Read-Only */
1380*3fc36ee0SWojciech Macek 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, 0x00000008); */
1381*3fc36ee0SWojciech Macek 		/* 40G capable */
1382*3fc36ee0SWojciech Macek 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, 0x00000002); */
1383*3fc36ee0SWojciech Macek 
1384*3fc36ee0SWojciech Macek 		/* select the 25G serdes for lanes 0/1 */
1385*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, 0x0002110f);
1386*3fc36ee0SWojciech Macek 		/* configure the PCS to work with 2 lanes */
1387*3fc36ee0SWojciech Macek 		/* configure which two of the 4 PCS Lanes (VL) are combined to one RXLAUI lane */
1388*3fc36ee0SWojciech Macek 		/* use VL 0-2 for RXLAUI lane 0, use VL 1-3 for RXLAUI lane 1 */
1389*3fc36ee0SWojciech Macek 		al_eth_40g_pcs_reg_write(adapter, 0x00010008, 0x0d80);
1390*3fc36ee0SWojciech Macek 		/* configure the PCS to work 32 bit interface */
1391*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_cfg, 0x00440000);
1392*3fc36ee0SWojciech Macek 
1393*3fc36ee0SWojciech Macek 		/* disable MLD and move to clause 49 PCS: */
1394*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, 0xE);
1395*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, 0);
1396*3fc36ee0SWojciech Macek 
1397*3fc36ee0SWojciech Macek #ifdef AL_HAL_ETH_FAST_AN
1398*3fc36ee0SWojciech Macek 		al_eth_40g_pcs_reg_write(adapter, 0x00010004, 1023);
1399*3fc36ee0SWojciech Macek 		al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0xA04c);
1400*3fc36ee0SWojciech Macek 		al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0x204c);
1401*3fc36ee0SWojciech Macek #endif
1402*3fc36ee0SWojciech Macek 
1403*3fc36ee0SWojciech Macek 		/* XAUI MAC control register */
1404*3fc36ee0SWojciech Macek 		if (adapter->serdes_lane == 0)
1405*3fc36ee0SWojciech Macek 			al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
1406*3fc36ee0SWojciech Macek 					      ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x06883910);
1407*3fc36ee0SWojciech Macek 		else
1408*3fc36ee0SWojciech Macek 			al_reg_write32(&adapter->mac_regs_base->gen.mux_sel, 0x06803950);
1409*3fc36ee0SWojciech Macek 
1410*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x0000040f);
1411*3fc36ee0SWojciech Macek 
1412*3fc36ee0SWojciech Macek 		/* XAUI MAC control register */
1413*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
1414*3fc36ee0SWojciech Macek 		/* RXAUI MAC control register */
1415*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
1416*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
1417*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
1418*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
1419*3fc36ee0SWojciech Macek 		if (adapter->serdes_lane == 0)
1420*3fc36ee0SWojciech Macek 			al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
1421*3fc36ee0SWojciech Macek 		else
1422*3fc36ee0SWojciech Macek 			al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10000101);
1423*3fc36ee0SWojciech Macek 
1424*3fc36ee0SWojciech Macek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
1425*3fc36ee0SWojciech Macek 					ETH_MAC_GEN_LED_CFG_SEL_MASK,
1426*3fc36ee0SWojciech Macek 					ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
1427*3fc36ee0SWojciech Macek 
1428*3fc36ee0SWojciech Macek 		if (adapter->serdes_lane == 1)
1429*3fc36ee0SWojciech Macek 			al_reg_write32(&adapter->mac_regs_base->gen.los_sel, 0x101);
1430*3fc36ee0SWojciech Macek 
1431*3fc36ee0SWojciech Macek 		break;
1432*3fc36ee0SWojciech Macek 
143349b49cdaSZbigniew Bodek 	case AL_ETH_MAC_MODE_XLG_LL_50G:
143449b49cdaSZbigniew Bodek 
143549b49cdaSZbigniew Bodek 		/* configure and enable the ASYNC FIFO between the MACs and the EC */
143649b49cdaSZbigniew Bodek 		/* TX min packet size */
1437*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
143849b49cdaSZbigniew Bodek 		/* TX max packet size */
143949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
144049b49cdaSZbigniew Bodek 		/* TX input bus configuration */
144149b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
144249b49cdaSZbigniew Bodek 		/* TX output bus configuration */
144349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00010040);
144449b49cdaSZbigniew Bodek 		/* TX Valid/ready configuration */
144549b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
144649b49cdaSZbigniew Bodek 		/* RX min packet size */
144749b49cdaSZbigniew Bodek 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
144849b49cdaSZbigniew Bodek 		/* RX max packet size */
144949b49cdaSZbigniew Bodek 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
145049b49cdaSZbigniew Bodek 		/* RX input bus configuration */
145149b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00010040);
145249b49cdaSZbigniew Bodek 		/* RX output bus configuration */
145349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
145449b49cdaSZbigniew Bodek 		/* RX Valid/ready configuration */
145549b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000112);
145649b49cdaSZbigniew Bodek 		/* V3 additional MAC selection */
145749b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000010);
145849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
145949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
146049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000000);
146149b49cdaSZbigniew Bodek 		/* ASYNC FIFO ENABLE */
146249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
146349b49cdaSZbigniew Bodek 
146449b49cdaSZbigniew Bodek 		/* cmd_cfg */
146549b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, 0x00000008);
146649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, 0x01022810);
146749b49cdaSZbigniew Bodek 		/* speed_ability //Read-Only */
146849b49cdaSZbigniew Bodek 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, 0x00000008); */
146949b49cdaSZbigniew Bodek 		/* 40G capable */
147049b49cdaSZbigniew Bodek 		/* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, 0x00000002); */
147149b49cdaSZbigniew Bodek 
147249b49cdaSZbigniew Bodek 		/* select the 25G serdes for lanes 0/1 */
147349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, 0x0382110F);
147449b49cdaSZbigniew Bodek 		/* configure the PCS to work with 2 lanes */
147549b49cdaSZbigniew Bodek 		/* configure which two of the 4 PCS Lanes (VL) are combined to one RXLAUI lane */
147649b49cdaSZbigniew Bodek 		/* use VL 0-2 for RXLAUI lane 0, use VL 1-3 for RXLAUI lane 1 */
147749b49cdaSZbigniew Bodek 		al_eth_40g_pcs_reg_write(adapter, 0x00010008, 0x0d81);
147849b49cdaSZbigniew Bodek 		/* configure the PCS to work 32 bit interface */
147949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_cfg, 0x00440000);
148049b49cdaSZbigniew Bodek 
148149b49cdaSZbigniew Bodek 
148249b49cdaSZbigniew Bodek #ifdef AL_HAL_ETH_FAST_AN
148349b49cdaSZbigniew Bodek 		al_eth_40g_pcs_reg_write(adapter, 0x00010004, 1023);
148449b49cdaSZbigniew Bodek 		al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0xA04c);
148549b49cdaSZbigniew Bodek 		al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0x204c);
148649b49cdaSZbigniew Bodek #endif
148749b49cdaSZbigniew Bodek 
148849b49cdaSZbigniew Bodek 		/* XAUI MAC control register */
148949b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x06883910);
149049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x0000040f);
149149b49cdaSZbigniew Bodek 
149249b49cdaSZbigniew Bodek 		/* MAC register file */
149349b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810); */
149449b49cdaSZbigniew Bodek 		/* XAUI MAC control register */
149549b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
149649b49cdaSZbigniew Bodek 		/* RXAUI MAC control register */
149749b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
149849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
149949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
150049b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
150149b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
150249b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
150349b49cdaSZbigniew Bodek /*		al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00073910); *//* XLG_LL_40G change */
150449b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
150549b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0); *//* XLG_LL_40G change */
150649b49cdaSZbigniew Bodek /*		al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401); *//* XLG_LL_40G change */
150749b49cdaSZbigniew Bodek 
150849b49cdaSZbigniew Bodek 		al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
150949b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_MASK,
151049b49cdaSZbigniew Bodek 				      ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
151149b49cdaSZbigniew Bodek 		break;
151249b49cdaSZbigniew Bodek 
151349b49cdaSZbigniew Bodek 
151449b49cdaSZbigniew Bodek 	default:
151549b49cdaSZbigniew Bodek 		al_err("Eth: unsupported MAC mode %d", mode);
151649b49cdaSZbigniew Bodek 		return -EPERM;
151749b49cdaSZbigniew Bodek 	}
151849b49cdaSZbigniew Bodek 	adapter->mac_mode = mode;
151949b49cdaSZbigniew Bodek 	al_info("configured MAC to %s mode:\n", al_eth_mac_mode_str(mode));
152049b49cdaSZbigniew Bodek 
152149b49cdaSZbigniew Bodek 	return 0;
152249b49cdaSZbigniew Bodek }
152349b49cdaSZbigniew Bodek 
152449b49cdaSZbigniew Bodek /* start the mac */
al_eth_mac_start(struct al_hal_eth_adapter * adapter)152549b49cdaSZbigniew Bodek int al_eth_mac_start(struct al_hal_eth_adapter *adapter)
152649b49cdaSZbigniew Bodek {
152749b49cdaSZbigniew Bodek 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
152849b49cdaSZbigniew Bodek 		/* 1G MAC control register */
1529*3fc36ee0SWojciech Macek 		al_reg_write32_masked(&adapter->mac_regs_base->mac_1g.cmd_cfg,
1530*3fc36ee0SWojciech Macek 				ETH_1G_MAC_CMD_CFG_TX_ENA | ETH_1G_MAC_CMD_CFG_RX_ENA,
1531*3fc36ee0SWojciech Macek 				ETH_1G_MAC_CMD_CFG_TX_ENA | ETH_1G_MAC_CMD_CFG_RX_ENA);
153249b49cdaSZbigniew Bodek 	} else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
153349b49cdaSZbigniew Bodek 		/* 10G MAC control register  */
1534*3fc36ee0SWojciech Macek 		al_reg_write32_masked(&adapter->mac_regs_base->mac_10g.cmd_cfg,
1535*3fc36ee0SWojciech Macek 				ETH_10G_MAC_CMD_CFG_TX_ENA | ETH_10G_MAC_CMD_CFG_RX_ENA,
1536*3fc36ee0SWojciech Macek 				ETH_10G_MAC_CMD_CFG_TX_ENA | ETH_10G_MAC_CMD_CFG_RX_ENA);
153749b49cdaSZbigniew Bodek 	} else {
153849b49cdaSZbigniew Bodek 		uint32_t cmd_cfg;
153949b49cdaSZbigniew Bodek 
1540*3fc36ee0SWojciech Macek 		cmd_cfg = al_eth_40g_mac_reg_read(adapter,
1541*3fc36ee0SWojciech Macek 				ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR);
154249b49cdaSZbigniew Bodek 
154349b49cdaSZbigniew Bodek 		cmd_cfg |= (ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_TX_ENA |
154449b49cdaSZbigniew Bodek 			    ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_RX_ENA);
154549b49cdaSZbigniew Bodek 
1546*3fc36ee0SWojciech Macek 		al_eth_40g_mac_reg_write(adapter,
1547*3fc36ee0SWojciech Macek 				ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR,
1548*3fc36ee0SWojciech Macek 				cmd_cfg);
154949b49cdaSZbigniew Bodek 	}
155049b49cdaSZbigniew Bodek 
155149b49cdaSZbigniew Bodek 	return 0;
155249b49cdaSZbigniew Bodek }
155349b49cdaSZbigniew Bodek 
155449b49cdaSZbigniew Bodek /* stop the mac */
al_eth_mac_stop(struct al_hal_eth_adapter * adapter)155549b49cdaSZbigniew Bodek int al_eth_mac_stop(struct al_hal_eth_adapter *adapter)
155649b49cdaSZbigniew Bodek {
155749b49cdaSZbigniew Bodek 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
155849b49cdaSZbigniew Bodek 		/* 1G MAC control register */
1559*3fc36ee0SWojciech Macek 		al_reg_write32_masked(&adapter->mac_regs_base->mac_1g.cmd_cfg,
1560*3fc36ee0SWojciech Macek 				ETH_1G_MAC_CMD_CFG_TX_ENA | ETH_1G_MAC_CMD_CFG_RX_ENA,
1561*3fc36ee0SWojciech Macek 				0);
156249b49cdaSZbigniew Bodek 	else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode))
156349b49cdaSZbigniew Bodek 		/* 10G MAC control register  */
1564*3fc36ee0SWojciech Macek 		al_reg_write32_masked(&adapter->mac_regs_base->mac_10g.cmd_cfg,
1565*3fc36ee0SWojciech Macek 				ETH_10G_MAC_CMD_CFG_TX_ENA | ETH_10G_MAC_CMD_CFG_RX_ENA,
1566*3fc36ee0SWojciech Macek 				0);
1567*3fc36ee0SWojciech Macek 	else {
1568*3fc36ee0SWojciech Macek 		uint32_t cmd_cfg;
1569*3fc36ee0SWojciech Macek 
1570*3fc36ee0SWojciech Macek 		cmd_cfg = al_eth_40g_mac_reg_read(adapter,
1571*3fc36ee0SWojciech Macek 				ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR);
1572*3fc36ee0SWojciech Macek 
1573*3fc36ee0SWojciech Macek 		cmd_cfg &= ~(ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_TX_ENA |
1574*3fc36ee0SWojciech Macek 			    ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_RX_ENA);
1575*3fc36ee0SWojciech Macek 
1576*3fc36ee0SWojciech Macek 		al_eth_40g_mac_reg_write(adapter,
1577*3fc36ee0SWojciech Macek 				ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR,
1578*3fc36ee0SWojciech Macek 				cmd_cfg);
1579*3fc36ee0SWojciech Macek 	}
158049b49cdaSZbigniew Bodek 
158149b49cdaSZbigniew Bodek 	return 0;
158249b49cdaSZbigniew Bodek }
158349b49cdaSZbigniew Bodek 
al_eth_gearbox_reset(struct al_hal_eth_adapter * adapter,al_bool tx_reset,al_bool rx_reset)1584*3fc36ee0SWojciech Macek void al_eth_gearbox_reset(struct al_hal_eth_adapter *adapter, al_bool tx_reset, al_bool rx_reset)
1585*3fc36ee0SWojciech Macek {
1586*3fc36ee0SWojciech Macek 	uint32_t reg, orig_val;
1587*3fc36ee0SWojciech Macek 
1588*3fc36ee0SWojciech Macek 	/* Gearbox is exist only from revision 3 */
1589*3fc36ee0SWojciech Macek 	al_assert(adapter->rev_id > AL_ETH_REV_ID_2);
1590*3fc36ee0SWojciech Macek 
1591*3fc36ee0SWojciech Macek 	orig_val = al_reg_read32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl);
1592*3fc36ee0SWojciech Macek 	reg = orig_val;
1593*3fc36ee0SWojciech Macek 
1594*3fc36ee0SWojciech Macek 	if (tx_reset) {
1595*3fc36ee0SWojciech Macek 		reg |= (ETH_MAC_GEN_V3_EXT_SERDES_CTRL_LANE_0_TX_25_GS_SW_RESET |
1596*3fc36ee0SWojciech Macek 			ETH_MAC_GEN_V3_EXT_SERDES_CTRL_LANE_1_TX_25_GS_SW_RESET);
1597*3fc36ee0SWojciech Macek 	}
1598*3fc36ee0SWojciech Macek 
1599*3fc36ee0SWojciech Macek 	if (rx_reset) {
1600*3fc36ee0SWojciech Macek 		reg |= (ETH_MAC_GEN_V3_EXT_SERDES_CTRL_LANE_0_RX_25_GS_SW_RESET |
1601*3fc36ee0SWojciech Macek 			ETH_MAC_GEN_V3_EXT_SERDES_CTRL_LANE_1_RX_25_GS_SW_RESET);
1602*3fc36ee0SWojciech Macek 	}
1603*3fc36ee0SWojciech Macek 
1604*3fc36ee0SWojciech Macek 	al_dbg("%s: perform gearbox reset (Tx %d, Rx %d) \n", __func__, tx_reset, rx_reset);
1605*3fc36ee0SWojciech Macek 	al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, reg);
1606*3fc36ee0SWojciech Macek 
1607*3fc36ee0SWojciech Macek 	al_udelay(10);
1608*3fc36ee0SWojciech Macek 
1609*3fc36ee0SWojciech Macek 	al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, orig_val);
1610*3fc36ee0SWojciech Macek }
1611*3fc36ee0SWojciech Macek 
al_eth_fec_enable(struct al_hal_eth_adapter * adapter,al_bool enable)1612*3fc36ee0SWojciech Macek int al_eth_fec_enable(struct al_hal_eth_adapter *adapter, al_bool enable)
1613*3fc36ee0SWojciech Macek {
1614*3fc36ee0SWojciech Macek 	if (adapter->rev_id <= AL_ETH_REV_ID_2)
1615*3fc36ee0SWojciech Macek 		return -1;
1616*3fc36ee0SWojciech Macek 
1617*3fc36ee0SWojciech Macek 	if (enable)
1618*3fc36ee0SWojciech Macek 		al_reg_write32_masked(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg,
1619*3fc36ee0SWojciech Macek 					(ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_RX |
1620*3fc36ee0SWojciech Macek 					 ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_TX),
1621*3fc36ee0SWojciech Macek 					(ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_RX |
1622*3fc36ee0SWojciech Macek 					 ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_TX));
1623*3fc36ee0SWojciech Macek 	else
1624*3fc36ee0SWojciech Macek 		al_reg_write32_masked(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg,
1625*3fc36ee0SWojciech Macek 					(ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_RX |
1626*3fc36ee0SWojciech Macek 					 ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_TX),
1627*3fc36ee0SWojciech Macek 					0);
1628*3fc36ee0SWojciech Macek 	return 0;
1629*3fc36ee0SWojciech Macek }
1630*3fc36ee0SWojciech Macek 
al_eth_fec_stats_get(struct al_hal_eth_adapter * adapter,uint32_t * corrected,uint32_t * uncorrectable)1631*3fc36ee0SWojciech Macek int al_eth_fec_stats_get(struct al_hal_eth_adapter *adapter,
1632*3fc36ee0SWojciech Macek 			uint32_t *corrected, uint32_t *uncorrectable)
1633*3fc36ee0SWojciech Macek {
1634*3fc36ee0SWojciech Macek 	if (adapter->rev_id <= AL_ETH_REV_ID_2)
1635*3fc36ee0SWojciech Macek 		return -1;
1636*3fc36ee0SWojciech Macek 
1637*3fc36ee0SWojciech Macek 	*corrected = al_reg_read32(&adapter->mac_regs_base->stat.v3_pcs_10g_ll_cerr);
1638*3fc36ee0SWojciech Macek 	*uncorrectable = al_reg_read32(&adapter->mac_regs_base->stat.v3_pcs_10g_ll_ncerr);
1639*3fc36ee0SWojciech Macek 
1640*3fc36ee0SWojciech Macek 	return 0;
1641*3fc36ee0SWojciech Macek }
1642*3fc36ee0SWojciech Macek 
1643*3fc36ee0SWojciech Macek 
al_eth_capabilities_get(struct al_hal_eth_adapter * adapter,struct al_eth_capabilities * caps)164449b49cdaSZbigniew Bodek int al_eth_capabilities_get(struct al_hal_eth_adapter *adapter, struct al_eth_capabilities *caps)
164549b49cdaSZbigniew Bodek {
164649b49cdaSZbigniew Bodek 	al_assert(caps);
164749b49cdaSZbigniew Bodek 
164849b49cdaSZbigniew Bodek 	caps->speed_10_HD = AL_FALSE;
164949b49cdaSZbigniew Bodek 	caps->speed_10_FD = AL_FALSE;
165049b49cdaSZbigniew Bodek 	caps->speed_100_HD = AL_FALSE;
165149b49cdaSZbigniew Bodek 	caps->speed_100_FD = AL_FALSE;
165249b49cdaSZbigniew Bodek 	caps->speed_1000_HD = AL_FALSE;
165349b49cdaSZbigniew Bodek 	caps->speed_1000_FD = AL_FALSE;
165449b49cdaSZbigniew Bodek 	caps->speed_10000_HD = AL_FALSE;
165549b49cdaSZbigniew Bodek 	caps->speed_10000_FD = AL_FALSE;
165649b49cdaSZbigniew Bodek 	caps->pfc = AL_FALSE;
165749b49cdaSZbigniew Bodek 	caps->eee = AL_FALSE;
165849b49cdaSZbigniew Bodek 
165949b49cdaSZbigniew Bodek 	switch (adapter->mac_mode) {
166049b49cdaSZbigniew Bodek 		case AL_ETH_MAC_MODE_RGMII:
166149b49cdaSZbigniew Bodek 		case AL_ETH_MAC_MODE_SGMII:
166249b49cdaSZbigniew Bodek 			caps->speed_10_HD = AL_TRUE;
166349b49cdaSZbigniew Bodek 			caps->speed_10_FD = AL_TRUE;
166449b49cdaSZbigniew Bodek 			caps->speed_100_HD = AL_TRUE;
166549b49cdaSZbigniew Bodek 			caps->speed_100_FD = AL_TRUE;
166649b49cdaSZbigniew Bodek 			caps->speed_1000_FD = AL_TRUE;
166749b49cdaSZbigniew Bodek 			caps->eee = AL_TRUE;
166849b49cdaSZbigniew Bodek 			break;
166949b49cdaSZbigniew Bodek 		case AL_ETH_MAC_MODE_10GbE_Serial:
167049b49cdaSZbigniew Bodek 			caps->speed_10000_FD = AL_TRUE;
167149b49cdaSZbigniew Bodek 			caps->pfc = AL_TRUE;
167249b49cdaSZbigniew Bodek 			break;
167349b49cdaSZbigniew Bodek 		default:
167449b49cdaSZbigniew Bodek 		al_err("Eth: unsupported MAC mode %d", adapter->mac_mode);
167549b49cdaSZbigniew Bodek 		return -EPERM;
167649b49cdaSZbigniew Bodek 	}
167749b49cdaSZbigniew Bodek 	return 0;
167849b49cdaSZbigniew Bodek }
167949b49cdaSZbigniew Bodek 
al_eth_mac_link_config_1g_mac(struct al_hal_eth_adapter * adapter,al_bool force_1000_base_x,al_bool an_enable,uint32_t speed,al_bool full_duplex)1680*3fc36ee0SWojciech Macek static void al_eth_mac_link_config_1g_mac(
1681*3fc36ee0SWojciech Macek 				struct al_hal_eth_adapter *adapter,
168249b49cdaSZbigniew Bodek 				al_bool force_1000_base_x,
168349b49cdaSZbigniew Bodek 				al_bool an_enable,
168449b49cdaSZbigniew Bodek 				uint32_t speed,
168549b49cdaSZbigniew Bodek 				al_bool full_duplex)
168649b49cdaSZbigniew Bodek {
168749b49cdaSZbigniew Bodek 	uint32_t mac_ctrl;
168849b49cdaSZbigniew Bodek 	uint32_t sgmii_ctrl = 0;
168949b49cdaSZbigniew Bodek 	uint32_t sgmii_if_mode = 0;
169049b49cdaSZbigniew Bodek 	uint32_t rgmii_ctrl = 0;
169149b49cdaSZbigniew Bodek 
169249b49cdaSZbigniew Bodek 	mac_ctrl = al_reg_read32(&adapter->mac_regs_base->mac_1g.cmd_cfg);
169349b49cdaSZbigniew Bodek 
169449b49cdaSZbigniew Bodek 	if (adapter->mac_mode == AL_ETH_MAC_MODE_SGMII) {
169549b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr,
169649b49cdaSZbigniew Bodek 			       ETH_MAC_SGMII_REG_ADDR_CTRL_REG);
169749b49cdaSZbigniew Bodek 		sgmii_ctrl = al_reg_read32(&adapter->mac_regs_base->sgmii.reg_data);
169849b49cdaSZbigniew Bodek 		/*
169949b49cdaSZbigniew Bodek 		 * in case bit 0 is off in sgmii_if_mode register all the other
170049b49cdaSZbigniew Bodek 		 * bits are ignored.
170149b49cdaSZbigniew Bodek 		 */
170249b49cdaSZbigniew Bodek 		if (force_1000_base_x == AL_FALSE)
170349b49cdaSZbigniew Bodek 			sgmii_if_mode = ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_EN;
170449b49cdaSZbigniew Bodek 
170549b49cdaSZbigniew Bodek 		if (an_enable == AL_TRUE) {
170649b49cdaSZbigniew Bodek 			sgmii_if_mode |= ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_AN;
170749b49cdaSZbigniew Bodek 			sgmii_ctrl |= ETH_MAC_SGMII_REG_DATA_CTRL_AN_ENABLE;
170849b49cdaSZbigniew Bodek 		} else {
170949b49cdaSZbigniew Bodek 			sgmii_ctrl &= ~(ETH_MAC_SGMII_REG_DATA_CTRL_AN_ENABLE);
171049b49cdaSZbigniew Bodek 		}
171149b49cdaSZbigniew Bodek 	}
171249b49cdaSZbigniew Bodek 
171349b49cdaSZbigniew Bodek 	if (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII) {
171449b49cdaSZbigniew Bodek 		/*
171549b49cdaSZbigniew Bodek 		 * Use the speed provided by the MAC instead of the PHY
171649b49cdaSZbigniew Bodek 		 */
171749b49cdaSZbigniew Bodek 		rgmii_ctrl = al_reg_read32(&adapter->mac_regs_base->gen.rgmii_cfg);
171849b49cdaSZbigniew Bodek 
171949b49cdaSZbigniew Bodek 		AL_REG_MASK_CLEAR(rgmii_ctrl, ETH_MAC_GEN_RGMII_CFG_ENA_AUTO);
172049b49cdaSZbigniew Bodek 		AL_REG_MASK_CLEAR(rgmii_ctrl, ETH_MAC_GEN_RGMII_CFG_SET_1000_SEL);
172149b49cdaSZbigniew Bodek 		AL_REG_MASK_CLEAR(rgmii_ctrl, ETH_MAC_GEN_RGMII_CFG_SET_10_SEL);
172249b49cdaSZbigniew Bodek 
172349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->gen.rgmii_cfg, rgmii_ctrl);
172449b49cdaSZbigniew Bodek 	}
172549b49cdaSZbigniew Bodek 
172649b49cdaSZbigniew Bodek 	if (full_duplex == AL_TRUE) {
1727*3fc36ee0SWojciech Macek 		AL_REG_MASK_CLEAR(mac_ctrl, ETH_1G_MAC_CMD_CFG_HD_EN);
172849b49cdaSZbigniew Bodek 	} else {
1729*3fc36ee0SWojciech Macek 		AL_REG_MASK_SET(mac_ctrl, ETH_1G_MAC_CMD_CFG_HD_EN);
173049b49cdaSZbigniew Bodek 		sgmii_if_mode |= ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_DUPLEX;
173149b49cdaSZbigniew Bodek 	}
173249b49cdaSZbigniew Bodek 
173349b49cdaSZbigniew Bodek 	if (speed == 1000) {
1734*3fc36ee0SWojciech Macek 		AL_REG_MASK_SET(mac_ctrl, ETH_1G_MAC_CMD_CFG_1G_SPD);
173549b49cdaSZbigniew Bodek 		sgmii_if_mode |= ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_SPEED_1000;
173649b49cdaSZbigniew Bodek 	} else {
1737*3fc36ee0SWojciech Macek 		AL_REG_MASK_CLEAR(mac_ctrl, ETH_1G_MAC_CMD_CFG_1G_SPD);
173849b49cdaSZbigniew Bodek 		if (speed == 10) {
1739*3fc36ee0SWojciech Macek 			AL_REG_MASK_SET(mac_ctrl, ETH_1G_MAC_CMD_CFG_10M_SPD);
174049b49cdaSZbigniew Bodek 		} else {
174149b49cdaSZbigniew Bodek 			sgmii_if_mode |= ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_SPEED_100;
1742*3fc36ee0SWojciech Macek 			AL_REG_MASK_CLEAR(mac_ctrl, ETH_1G_MAC_CMD_CFG_10M_SPD);
174349b49cdaSZbigniew Bodek 		}
174449b49cdaSZbigniew Bodek 	}
174549b49cdaSZbigniew Bodek 
174649b49cdaSZbigniew Bodek 	if (adapter->mac_mode == AL_ETH_MAC_MODE_SGMII) {
174749b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr,
174849b49cdaSZbigniew Bodek 			       ETH_MAC_SGMII_REG_ADDR_IF_MODE_REG);
174949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data,
175049b49cdaSZbigniew Bodek 			       sgmii_if_mode);
175149b49cdaSZbigniew Bodek 
175249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr,
175349b49cdaSZbigniew Bodek 			       ETH_MAC_SGMII_REG_ADDR_CTRL_REG);
175449b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data,
175549b49cdaSZbigniew Bodek 			       sgmii_ctrl);
175649b49cdaSZbigniew Bodek 	}
175749b49cdaSZbigniew Bodek 
175849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->mac_regs_base->mac_1g.cmd_cfg, mac_ctrl);
1759*3fc36ee0SWojciech Macek }
1760*3fc36ee0SWojciech Macek 
al_eth_mac_link_config_10g_mac(struct al_hal_eth_adapter * adapter,al_bool force_1000_base_x,al_bool an_enable,uint32_t speed,al_bool full_duplex)1761*3fc36ee0SWojciech Macek static void al_eth_mac_link_config_10g_mac(
1762*3fc36ee0SWojciech Macek 				struct al_hal_eth_adapter *adapter,
1763*3fc36ee0SWojciech Macek 				al_bool force_1000_base_x,
1764*3fc36ee0SWojciech Macek 				al_bool an_enable,
1765*3fc36ee0SWojciech Macek 				uint32_t speed,
1766*3fc36ee0SWojciech Macek 				al_bool full_duplex)
1767*3fc36ee0SWojciech Macek {
1768*3fc36ee0SWojciech Macek 	uint32_t if_mode;
1769*3fc36ee0SWojciech Macek 	uint32_t val;
1770*3fc36ee0SWojciech Macek 
1771*3fc36ee0SWojciech Macek 	if_mode = al_reg_read32(&adapter->mac_regs_base->mac_10g.if_mode);
1772*3fc36ee0SWojciech Macek 
1773*3fc36ee0SWojciech Macek 	if (force_1000_base_x) {
1774*3fc36ee0SWojciech Macek 		uint32_t control;
1775*3fc36ee0SWojciech Macek 
1776*3fc36ee0SWojciech Macek 		AL_REG_MASK_CLEAR(if_mode, ETH_10G_MAC_IF_MODE_SGMII_EN_MASK);
1777*3fc36ee0SWojciech Macek 
1778*3fc36ee0SWojciech Macek 		control = al_reg_read32(&adapter->mac_regs_base->mac_10g.control);
1779*3fc36ee0SWojciech Macek 
1780*3fc36ee0SWojciech Macek 		if (an_enable)
1781*3fc36ee0SWojciech Macek 			AL_REG_MASK_SET(control, ETH_10G_MAC_CONTROL_AN_EN_MASK);
1782*3fc36ee0SWojciech Macek 		else
1783*3fc36ee0SWojciech Macek 			AL_REG_MASK_CLEAR(control, ETH_10G_MAC_CONTROL_AN_EN_MASK);
1784*3fc36ee0SWojciech Macek 
1785*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->mac_10g.control, control);
1786*3fc36ee0SWojciech Macek 
1787*3fc36ee0SWojciech Macek 	} else {
1788*3fc36ee0SWojciech Macek 		AL_REG_MASK_SET(if_mode, ETH_10G_MAC_IF_MODE_SGMII_EN_MASK);
1789*3fc36ee0SWojciech Macek 		if (an_enable) {
1790*3fc36ee0SWojciech Macek 			AL_REG_MASK_SET(if_mode, ETH_10G_MAC_IF_MODE_SGMII_AN_MASK);
1791*3fc36ee0SWojciech Macek 		} else {
1792*3fc36ee0SWojciech Macek 			AL_REG_MASK_CLEAR(if_mode, ETH_10G_MAC_IF_MODE_SGMII_AN_MASK);
1793*3fc36ee0SWojciech Macek 
1794*3fc36ee0SWojciech Macek 			if (speed == 1000)
1795*3fc36ee0SWojciech Macek 				val = ETH_10G_MAC_IF_MODE_SGMII_SPEED_1G;
1796*3fc36ee0SWojciech Macek 			else if (speed == 100)
1797*3fc36ee0SWojciech Macek 				val = ETH_10G_MAC_IF_MODE_SGMII_SPEED_100M;
1798*3fc36ee0SWojciech Macek 			else
1799*3fc36ee0SWojciech Macek 				val = ETH_10G_MAC_IF_MODE_SGMII_SPEED_10M;
1800*3fc36ee0SWojciech Macek 
1801*3fc36ee0SWojciech Macek 			AL_REG_FIELD_SET(if_mode,
1802*3fc36ee0SWojciech Macek 					 ETH_10G_MAC_IF_MODE_SGMII_SPEED_MASK,
1803*3fc36ee0SWojciech Macek 					 ETH_10G_MAC_IF_MODE_SGMII_SPEED_SHIFT,
1804*3fc36ee0SWojciech Macek 					 val);
1805*3fc36ee0SWojciech Macek 
1806*3fc36ee0SWojciech Macek 			AL_REG_FIELD_SET(if_mode,
1807*3fc36ee0SWojciech Macek 					 ETH_10G_MAC_IF_MODE_SGMII_DUPLEX_MASK,
1808*3fc36ee0SWojciech Macek 					 ETH_10G_MAC_IF_MODE_SGMII_DUPLEX_SHIFT,
1809*3fc36ee0SWojciech Macek 					 ((full_duplex) ?
1810*3fc36ee0SWojciech Macek 						ETH_10G_MAC_IF_MODE_SGMII_DUPLEX_FULL :
1811*3fc36ee0SWojciech Macek 						ETH_10G_MAC_IF_MODE_SGMII_DUPLEX_HALF));
1812*3fc36ee0SWojciech Macek 		}
1813*3fc36ee0SWojciech Macek 	}
1814*3fc36ee0SWojciech Macek 
1815*3fc36ee0SWojciech Macek 	al_reg_write32(&adapter->mac_regs_base->mac_10g.if_mode, if_mode);
1816*3fc36ee0SWojciech Macek }
1817*3fc36ee0SWojciech Macek 
1818*3fc36ee0SWojciech Macek /* update link speed and duplex mode */
al_eth_mac_link_config(struct al_hal_eth_adapter * adapter,al_bool force_1000_base_x,al_bool an_enable,uint32_t speed,al_bool full_duplex)1819*3fc36ee0SWojciech Macek int al_eth_mac_link_config(struct al_hal_eth_adapter *adapter,
1820*3fc36ee0SWojciech Macek 			   al_bool force_1000_base_x,
1821*3fc36ee0SWojciech Macek 			   al_bool an_enable,
1822*3fc36ee0SWojciech Macek 			   uint32_t speed,
1823*3fc36ee0SWojciech Macek 			   al_bool full_duplex)
1824*3fc36ee0SWojciech Macek {
1825*3fc36ee0SWojciech Macek 	if ((!AL_ETH_IS_1G_MAC(adapter->mac_mode)) &&
1826*3fc36ee0SWojciech Macek 		(adapter->mac_mode != AL_ETH_MAC_MODE_SGMII_2_5G)) {
1827*3fc36ee0SWojciech Macek 		al_err("eth [%s]: this function not supported in this mac mode.\n",
1828*3fc36ee0SWojciech Macek 			       adapter->name);
1829*3fc36ee0SWojciech Macek 		return -EINVAL;
1830*3fc36ee0SWojciech Macek 	}
1831*3fc36ee0SWojciech Macek 
1832*3fc36ee0SWojciech Macek 	if ((adapter->mac_mode != AL_ETH_MAC_MODE_RGMII) && (an_enable)) {
1833*3fc36ee0SWojciech Macek 		/*
1834*3fc36ee0SWojciech Macek 		 * an_enable is not relevant to RGMII mode.
1835*3fc36ee0SWojciech Macek 		 * in AN mode speed and duplex aren't relevant.
1836*3fc36ee0SWojciech Macek 		 */
1837*3fc36ee0SWojciech Macek 		al_info("eth [%s]: set auto negotiation to enable\n", adapter->name);
1838*3fc36ee0SWojciech Macek 	} else {
1839*3fc36ee0SWojciech Macek 		al_info("eth [%s]: set link speed to %dMbps. %s duplex.\n", adapter->name,
1840*3fc36ee0SWojciech Macek 			speed, full_duplex == AL_TRUE ? "full" : "half");
1841*3fc36ee0SWojciech Macek 
1842*3fc36ee0SWojciech Macek 		if ((speed != 10) && (speed != 100) && (speed != 1000)) {
1843*3fc36ee0SWojciech Macek 			al_err("eth [%s]: bad speed parameter (%d).\n",
1844*3fc36ee0SWojciech Macek 				       adapter->name, speed);
1845*3fc36ee0SWojciech Macek 			return -EINVAL;
1846*3fc36ee0SWojciech Macek 		}
1847*3fc36ee0SWojciech Macek 		if ((speed == 1000) && (full_duplex == AL_FALSE)) {
1848*3fc36ee0SWojciech Macek 			al_err("eth [%s]: half duplex in 1Gbps is not supported.\n",
1849*3fc36ee0SWojciech Macek 				       adapter->name);
1850*3fc36ee0SWojciech Macek 			return -EINVAL;
1851*3fc36ee0SWojciech Macek 		}
1852*3fc36ee0SWojciech Macek 	}
1853*3fc36ee0SWojciech Macek 
1854*3fc36ee0SWojciech Macek 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
1855*3fc36ee0SWojciech Macek 		al_eth_mac_link_config_1g_mac(adapter,
1856*3fc36ee0SWojciech Macek 					      force_1000_base_x,
1857*3fc36ee0SWojciech Macek 					      an_enable,
1858*3fc36ee0SWojciech Macek 					      speed,
1859*3fc36ee0SWojciech Macek 					      full_duplex);
1860*3fc36ee0SWojciech Macek 	else
1861*3fc36ee0SWojciech Macek 		al_eth_mac_link_config_10g_mac(adapter,
1862*3fc36ee0SWojciech Macek 					       force_1000_base_x,
1863*3fc36ee0SWojciech Macek 					       an_enable,
1864*3fc36ee0SWojciech Macek 					       speed,
1865*3fc36ee0SWojciech Macek 					       full_duplex);
186649b49cdaSZbigniew Bodek 
186749b49cdaSZbigniew Bodek 	return 0;
186849b49cdaSZbigniew Bodek }
186949b49cdaSZbigniew Bodek 
al_eth_mac_loopback_config(struct al_hal_eth_adapter * adapter,int enable)187049b49cdaSZbigniew Bodek int al_eth_mac_loopback_config(struct al_hal_eth_adapter *adapter, int enable)
187149b49cdaSZbigniew Bodek {
187249b49cdaSZbigniew Bodek 	const char *state = (enable) ? "enable" : "disable";
187349b49cdaSZbigniew Bodek 
187449b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: loopback %s\n", adapter->name, state);
187549b49cdaSZbigniew Bodek 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
187649b49cdaSZbigniew Bodek 		uint32_t reg;
187749b49cdaSZbigniew Bodek 		reg = al_reg_read32(&adapter->mac_regs_base->mac_1g.cmd_cfg);
187849b49cdaSZbigniew Bodek 		if (enable)
187949b49cdaSZbigniew Bodek 			reg |= AL_BIT(15);
188049b49cdaSZbigniew Bodek 		else
188149b49cdaSZbigniew Bodek 			reg &= ~AL_BIT(15);
188249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_1g.cmd_cfg, reg);
188349b49cdaSZbigniew Bodek 	} else if ((AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode))
188449b49cdaSZbigniew Bodek 			&& (adapter->rev_id == AL_ETH_REV_ID_3)) {
188549b49cdaSZbigniew Bodek 		uint32_t reg;
188649b49cdaSZbigniew Bodek 		al_reg_write16(
188749b49cdaSZbigniew Bodek 			(uint16_t *)&adapter->mac_regs_base->kr.pcs_addr, ETH_MAC_KR_PCS_CONTROL_1_ADDR);
188849b49cdaSZbigniew Bodek 		reg = al_reg_read16(
188949b49cdaSZbigniew Bodek 			(uint16_t *)&adapter->mac_regs_base->kr.pcs_data);
189049b49cdaSZbigniew Bodek 		if (enable)
189149b49cdaSZbigniew Bodek 			reg |= AL_BIT(14);
189249b49cdaSZbigniew Bodek 		else
189349b49cdaSZbigniew Bodek 			reg &= ~AL_BIT(14);
189449b49cdaSZbigniew Bodek 		al_reg_write16(
189549b49cdaSZbigniew Bodek 			(uint16_t *)&adapter->mac_regs_base->kr.pcs_addr, ETH_MAC_KR_PCS_CONTROL_1_ADDR);
189649b49cdaSZbigniew Bodek 		al_reg_write16(
189749b49cdaSZbigniew Bodek 			(uint16_t *)&adapter->mac_regs_base->kr.pcs_data, reg);
189849b49cdaSZbigniew Bodek 	} else if (adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_40G ||
189949b49cdaSZbigniew Bodek 			(adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_50G)) {
190049b49cdaSZbigniew Bodek 		uint32_t reg;
190149b49cdaSZbigniew Bodek 		reg = al_eth_40g_pcs_reg_read(adapter, ETH_MAC_GEN_V3_PCS_40G_CONTROL_STATUS_ADDR);
190249b49cdaSZbigniew Bodek 		if (enable)
190349b49cdaSZbigniew Bodek 			reg |= AL_BIT(14);
190449b49cdaSZbigniew Bodek 		else
190549b49cdaSZbigniew Bodek 			reg &= ~AL_BIT(14);
190649b49cdaSZbigniew Bodek 		al_eth_40g_pcs_reg_write(adapter, ETH_MAC_GEN_V3_PCS_40G_CONTROL_STATUS_ADDR, reg);
190749b49cdaSZbigniew Bodek 	} else {
190849b49cdaSZbigniew Bodek 		al_err("Eth: mac loopback not supported in this mode %d", adapter->mac_mode);
190949b49cdaSZbigniew Bodek 		return -EPERM;
191049b49cdaSZbigniew Bodek 	}
191149b49cdaSZbigniew Bodek 	return 0;
191249b49cdaSZbigniew Bodek }
191349b49cdaSZbigniew Bodek 
191449b49cdaSZbigniew Bodek /* MDIO */
al_eth_mdio_config(struct al_hal_eth_adapter * adapter,enum al_eth_mdio_type mdio_type,al_bool shared_mdio_if,enum al_eth_ref_clk_freq ref_clk_freq,unsigned int mdio_clk_freq_khz)191549b49cdaSZbigniew Bodek int al_eth_mdio_config(
191649b49cdaSZbigniew Bodek 	struct al_hal_eth_adapter	*adapter,
191749b49cdaSZbigniew Bodek 	enum al_eth_mdio_type		mdio_type,
191849b49cdaSZbigniew Bodek 	al_bool				shared_mdio_if,
191949b49cdaSZbigniew Bodek 	enum al_eth_ref_clk_freq	ref_clk_freq,
192049b49cdaSZbigniew Bodek 	unsigned int			mdio_clk_freq_khz)
192149b49cdaSZbigniew Bodek {
192249b49cdaSZbigniew Bodek 	enum al_eth_mdio_if mdio_if = AL_ETH_MDIO_IF_10G_MAC;
192349b49cdaSZbigniew Bodek 	const char *if_name = (mdio_if == AL_ETH_MDIO_IF_1G_MAC) ? "10/100/1G MAC" : "10G MAC";
192449b49cdaSZbigniew Bodek 	const char *type_name = (mdio_type == AL_ETH_MDIO_TYPE_CLAUSE_22) ? "Clause 22" : "Clause 45";
192549b49cdaSZbigniew Bodek 	const char *shared_name = (shared_mdio_if == AL_TRUE) ? "Yes" : "No";
192649b49cdaSZbigniew Bodek 
192749b49cdaSZbigniew Bodek 	unsigned int ref_clk_freq_khz;
192849b49cdaSZbigniew Bodek 	uint32_t val;
192949b49cdaSZbigniew Bodek 
193049b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: mdio config: interface %s. type %s. shared: %s\n", adapter->name, if_name, type_name, shared_name);
193149b49cdaSZbigniew Bodek 	adapter->shared_mdio_if = shared_mdio_if;
193249b49cdaSZbigniew Bodek 
193349b49cdaSZbigniew Bodek 	val = al_reg_read32(&adapter->mac_regs_base->gen.cfg);
193449b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: mdio config: 10G mac \n", adapter->name);
193549b49cdaSZbigniew Bodek 
193649b49cdaSZbigniew Bodek 	switch(mdio_if)
193749b49cdaSZbigniew Bodek 	{
193849b49cdaSZbigniew Bodek 		case AL_ETH_MDIO_IF_1G_MAC:
193949b49cdaSZbigniew Bodek 			val &= ~AL_BIT(10);
194049b49cdaSZbigniew Bodek 			break;
194149b49cdaSZbigniew Bodek 		case AL_ETH_MDIO_IF_10G_MAC:
194249b49cdaSZbigniew Bodek 			val |= AL_BIT(10);
194349b49cdaSZbigniew Bodek 			break;
194449b49cdaSZbigniew Bodek 	}
194549b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->mac_regs_base->gen.cfg, val);
194649b49cdaSZbigniew Bodek 	adapter->mdio_if = mdio_if;
194749b49cdaSZbigniew Bodek 
194849b49cdaSZbigniew Bodek 
194949b49cdaSZbigniew Bodek 	if (mdio_if == AL_ETH_MDIO_IF_10G_MAC)
195049b49cdaSZbigniew Bodek 	{
195149b49cdaSZbigniew Bodek 		val = al_reg_read32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status);
195249b49cdaSZbigniew Bodek 		switch(mdio_type)
195349b49cdaSZbigniew Bodek 		{
195449b49cdaSZbigniew Bodek 			case AL_ETH_MDIO_TYPE_CLAUSE_22:
195549b49cdaSZbigniew Bodek 				val &= ~AL_BIT(6);
195649b49cdaSZbigniew Bodek 				break;
195749b49cdaSZbigniew Bodek 			case AL_ETH_MDIO_TYPE_CLAUSE_45:
195849b49cdaSZbigniew Bodek 				val |= AL_BIT(6);
195949b49cdaSZbigniew Bodek 				break;
196049b49cdaSZbigniew Bodek 		}
196149b49cdaSZbigniew Bodek 
196249b49cdaSZbigniew Bodek 		/* set clock div to get 'mdio_clk_freq_khz' */
196349b49cdaSZbigniew Bodek 		switch (ref_clk_freq) {
196449b49cdaSZbigniew Bodek 		default:
196549b49cdaSZbigniew Bodek 			al_err("eth [%s]: %s: invalid reference clock frequency"
196649b49cdaSZbigniew Bodek 				" (%d)\n",
196749b49cdaSZbigniew Bodek 				adapter->name, __func__, ref_clk_freq);
196849b49cdaSZbigniew Bodek 		case AL_ETH_REF_FREQ_375_MHZ:
196949b49cdaSZbigniew Bodek 			ref_clk_freq_khz = 375000;
197049b49cdaSZbigniew Bodek 			break;
197149b49cdaSZbigniew Bodek 		case AL_ETH_REF_FREQ_187_5_MHZ:
197249b49cdaSZbigniew Bodek 			ref_clk_freq_khz = 187500;
197349b49cdaSZbigniew Bodek 			break;
197449b49cdaSZbigniew Bodek 		case AL_ETH_REF_FREQ_250_MHZ:
197549b49cdaSZbigniew Bodek 			ref_clk_freq_khz = 250000;
197649b49cdaSZbigniew Bodek 			break;
197749b49cdaSZbigniew Bodek 		case AL_ETH_REF_FREQ_500_MHZ:
197849b49cdaSZbigniew Bodek 			ref_clk_freq_khz = 500000;
197949b49cdaSZbigniew Bodek 			break;
198049b49cdaSZbigniew Bodek                 case AL_ETH_REF_FREQ_428_MHZ:
198149b49cdaSZbigniew Bodek                         ref_clk_freq_khz = 428000;
198249b49cdaSZbigniew Bodek                         break;
198349b49cdaSZbigniew Bodek 		};
198449b49cdaSZbigniew Bodek 
198549b49cdaSZbigniew Bodek 		val &= ~(0x1FF << 7);
198649b49cdaSZbigniew Bodek 		val |= (ref_clk_freq_khz / (2 * mdio_clk_freq_khz)) << 7;
198749b49cdaSZbigniew Bodek 		AL_REG_FIELD_SET(val, ETH_10G_MAC_MDIO_CFG_HOLD_TIME_MASK,
198849b49cdaSZbigniew Bodek 				 ETH_10G_MAC_MDIO_CFG_HOLD_TIME_SHIFT,
198949b49cdaSZbigniew Bodek 				 ETH_10G_MAC_MDIO_CFG_HOLD_TIME_7_CLK);
199049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status, val);
199149b49cdaSZbigniew Bodek 	}else{
199249b49cdaSZbigniew Bodek 		if(mdio_type != AL_ETH_MDIO_TYPE_CLAUSE_22) {
199349b49cdaSZbigniew Bodek 			al_err("eth [%s] mdio type not supported for this interface\n",
199449b49cdaSZbigniew Bodek 				 adapter->name);
199549b49cdaSZbigniew Bodek 			return -EINVAL;
199649b49cdaSZbigniew Bodek 		}
199749b49cdaSZbigniew Bodek 	}
199849b49cdaSZbigniew Bodek 	adapter->mdio_type = mdio_type;
199949b49cdaSZbigniew Bodek 
200049b49cdaSZbigniew Bodek 	return 0;
200149b49cdaSZbigniew Bodek }
200249b49cdaSZbigniew Bodek 
al_eth_mdio_1g_mac_read(struct al_hal_eth_adapter * adapter,uint32_t phy_addr,uint32_t reg,uint16_t * val)200349b49cdaSZbigniew Bodek static int al_eth_mdio_1g_mac_read(struct al_hal_eth_adapter *adapter,
200449b49cdaSZbigniew Bodek 			    uint32_t phy_addr __attribute__((__unused__)),
200549b49cdaSZbigniew Bodek 			    uint32_t reg, uint16_t *val)
200649b49cdaSZbigniew Bodek {
200749b49cdaSZbigniew Bodek 	*val = al_reg_read32(
200849b49cdaSZbigniew Bodek 		&adapter->mac_regs_base->mac_1g.phy_regs_base + reg);
200949b49cdaSZbigniew Bodek 	return 0;
201049b49cdaSZbigniew Bodek }
201149b49cdaSZbigniew Bodek 
al_eth_mdio_1g_mac_write(struct al_hal_eth_adapter * adapter,uint32_t phy_addr,uint32_t reg,uint16_t val)201249b49cdaSZbigniew Bodek static int al_eth_mdio_1g_mac_write(struct al_hal_eth_adapter *adapter,
201349b49cdaSZbigniew Bodek 			     uint32_t phy_addr __attribute__((__unused__)),
201449b49cdaSZbigniew Bodek 			     uint32_t reg, uint16_t val)
201549b49cdaSZbigniew Bodek {
201649b49cdaSZbigniew Bodek 	al_reg_write32(
201749b49cdaSZbigniew Bodek 		&adapter->mac_regs_base->mac_1g.phy_regs_base + reg, val);
201849b49cdaSZbigniew Bodek 	return 0;
201949b49cdaSZbigniew Bodek }
202049b49cdaSZbigniew Bodek 
al_eth_mdio_10g_mac_wait_busy(struct al_hal_eth_adapter * adapter)202149b49cdaSZbigniew Bodek static int al_eth_mdio_10g_mac_wait_busy(struct al_hal_eth_adapter *adapter)
202249b49cdaSZbigniew Bodek {
202349b49cdaSZbigniew Bodek 	int	count = 0;
202449b49cdaSZbigniew Bodek 	uint32_t mdio_cfg_status;
202549b49cdaSZbigniew Bodek 
202649b49cdaSZbigniew Bodek 	do {
202749b49cdaSZbigniew Bodek 		mdio_cfg_status = al_reg_read32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status);
202849b49cdaSZbigniew Bodek /*
202949b49cdaSZbigniew Bodek 		if (mdio_cfg_status & AL_BIT(1)){ //error
203049b49cdaSZbigniew Bodek 			al_err(" %s mdio read failed on error. phy_addr 0x%x reg 0x%x\n",
203149b49cdaSZbigniew Bodek 				udma_params.name, phy_addr, reg);
203249b49cdaSZbigniew Bodek 			return -EIO;
203349b49cdaSZbigniew Bodek 		}*/
203449b49cdaSZbigniew Bodek 		if (mdio_cfg_status & AL_BIT(0)){
203549b49cdaSZbigniew Bodek 			if (count > 0)
203649b49cdaSZbigniew Bodek 				al_dbg("eth [%s] mdio: still busy!\n", adapter->name);
203749b49cdaSZbigniew Bodek 		}else{
203849b49cdaSZbigniew Bodek 			return 0;
203949b49cdaSZbigniew Bodek 		}
204049b49cdaSZbigniew Bodek 		al_udelay(AL_ETH_MDIO_DELAY_PERIOD);
204149b49cdaSZbigniew Bodek 	}while(count++ < AL_ETH_MDIO_DELAY_COUNT);
204249b49cdaSZbigniew Bodek 
204349b49cdaSZbigniew Bodek 	return -ETIMEDOUT;
204449b49cdaSZbigniew Bodek }
204549b49cdaSZbigniew Bodek 
al_eth_mdio_10g_mac_type22(struct al_hal_eth_adapter * adapter,int read,uint32_t phy_addr,uint32_t reg,uint16_t * val)204649b49cdaSZbigniew Bodek static int al_eth_mdio_10g_mac_type22(
204749b49cdaSZbigniew Bodek 	struct al_hal_eth_adapter *adapter,
204849b49cdaSZbigniew Bodek 	int read, uint32_t phy_addr, uint32_t reg, uint16_t *val)
204949b49cdaSZbigniew Bodek {
205049b49cdaSZbigniew Bodek 	int rc;
205149b49cdaSZbigniew Bodek 	const char *op = (read == 1) ? "read":"write";
205249b49cdaSZbigniew Bodek 	uint32_t mdio_cfg_status;
205349b49cdaSZbigniew Bodek 	uint16_t mdio_cmd;
205449b49cdaSZbigniew Bodek 
205549b49cdaSZbigniew Bodek 	//wait if the HW is busy
205649b49cdaSZbigniew Bodek 	rc = al_eth_mdio_10g_mac_wait_busy(adapter);
205749b49cdaSZbigniew Bodek 	if (rc) {
205849b49cdaSZbigniew Bodek 		al_err(" eth [%s] mdio %s failed. HW is busy\n", adapter->name, op);
205949b49cdaSZbigniew Bodek 		return rc;
206049b49cdaSZbigniew Bodek 	}
206149b49cdaSZbigniew Bodek 
206249b49cdaSZbigniew Bodek 	mdio_cmd = (uint16_t)(0x1F & reg);
206349b49cdaSZbigniew Bodek 	mdio_cmd |= (0x1F & phy_addr) << 5;
206449b49cdaSZbigniew Bodek 
206549b49cdaSZbigniew Bodek 	if (read)
206649b49cdaSZbigniew Bodek 		mdio_cmd |= AL_BIT(15); //READ command
206749b49cdaSZbigniew Bodek 
206849b49cdaSZbigniew Bodek 	al_reg_write16(&adapter->mac_regs_base->mac_10g.mdio_cmd,
206949b49cdaSZbigniew Bodek 			mdio_cmd);
207049b49cdaSZbigniew Bodek 	if (!read)
207149b49cdaSZbigniew Bodek 		al_reg_write16(&adapter->mac_regs_base->mac_10g.mdio_data,
207249b49cdaSZbigniew Bodek 				*val);
207349b49cdaSZbigniew Bodek 
207449b49cdaSZbigniew Bodek 	//wait for the busy to clear
207549b49cdaSZbigniew Bodek 	rc = al_eth_mdio_10g_mac_wait_busy(adapter);
207649b49cdaSZbigniew Bodek 	if (rc != 0) {
207749b49cdaSZbigniew Bodek 		al_err(" %s mdio %s failed on timeout\n", adapter->name, op);
207849b49cdaSZbigniew Bodek 		return -ETIMEDOUT;
207949b49cdaSZbigniew Bodek 	}
208049b49cdaSZbigniew Bodek 
208149b49cdaSZbigniew Bodek 	mdio_cfg_status = al_reg_read32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status);
208249b49cdaSZbigniew Bodek 
208349b49cdaSZbigniew Bodek 	if (mdio_cfg_status & AL_BIT(1)){ //error
208449b49cdaSZbigniew Bodek 		al_err(" %s mdio %s failed on error. phy_addr 0x%x reg 0x%x\n",
208549b49cdaSZbigniew Bodek 			adapter->name, op, phy_addr, reg);
208649b49cdaSZbigniew Bodek 			return -EIO;
208749b49cdaSZbigniew Bodek 	}
208849b49cdaSZbigniew Bodek 	if (read)
208949b49cdaSZbigniew Bodek 		*val = al_reg_read16(
209049b49cdaSZbigniew Bodek 			(uint16_t *)&adapter->mac_regs_base->mac_10g.mdio_data);
209149b49cdaSZbigniew Bodek 	return 0;
209249b49cdaSZbigniew Bodek }
209349b49cdaSZbigniew Bodek 
al_eth_mdio_10g_mac_type45(struct al_hal_eth_adapter * adapter,int read,uint32_t port_addr,uint32_t device,uint32_t reg,uint16_t * val)209449b49cdaSZbigniew Bodek static int al_eth_mdio_10g_mac_type45(
209549b49cdaSZbigniew Bodek 	struct al_hal_eth_adapter *adapter,
209649b49cdaSZbigniew Bodek 	int read, uint32_t port_addr, uint32_t device, uint32_t reg, uint16_t *val)
209749b49cdaSZbigniew Bodek {
209849b49cdaSZbigniew Bodek 	int rc;
209949b49cdaSZbigniew Bodek 	const char *op = (read == 1) ? "read":"write";
210049b49cdaSZbigniew Bodek 	uint32_t mdio_cfg_status;
210149b49cdaSZbigniew Bodek 	uint16_t mdio_cmd;
210249b49cdaSZbigniew Bodek 
210349b49cdaSZbigniew Bodek 	//wait if the HW is busy
210449b49cdaSZbigniew Bodek 	rc = al_eth_mdio_10g_mac_wait_busy(adapter);
210549b49cdaSZbigniew Bodek 	if (rc) {
210649b49cdaSZbigniew Bodek 		al_err(" %s mdio %s failed. HW is busy\n", adapter->name, op);
210749b49cdaSZbigniew Bodek 		return rc;
210849b49cdaSZbigniew Bodek 	}
210949b49cdaSZbigniew Bodek 	// set command register
211049b49cdaSZbigniew Bodek 	mdio_cmd = (uint16_t)(0x1F & device);
211149b49cdaSZbigniew Bodek 	mdio_cmd |= (0x1F & port_addr) << 5;
211249b49cdaSZbigniew Bodek 	al_reg_write16(&adapter->mac_regs_base->mac_10g.mdio_cmd,
211349b49cdaSZbigniew Bodek 			mdio_cmd);
211449b49cdaSZbigniew Bodek 
211549b49cdaSZbigniew Bodek 	// send address frame
211649b49cdaSZbigniew Bodek 	al_reg_write16(&adapter->mac_regs_base->mac_10g.mdio_regaddr, reg);
211749b49cdaSZbigniew Bodek 	//wait for the busy to clear
211849b49cdaSZbigniew Bodek 	rc = al_eth_mdio_10g_mac_wait_busy(adapter);
211949b49cdaSZbigniew Bodek 	if (rc) {
212049b49cdaSZbigniew Bodek 		al_err(" %s mdio %s (address frame) failed on timeout\n", adapter->name, op);
212149b49cdaSZbigniew Bodek 		return rc;
212249b49cdaSZbigniew Bodek 	}
212349b49cdaSZbigniew Bodek 
212449b49cdaSZbigniew Bodek 	// if read, write again to the command register with READ bit set
212549b49cdaSZbigniew Bodek 	if (read) {
212649b49cdaSZbigniew Bodek 		mdio_cmd |= AL_BIT(15); //READ command
212749b49cdaSZbigniew Bodek 		al_reg_write16(
212849b49cdaSZbigniew Bodek 			(uint16_t *)&adapter->mac_regs_base->mac_10g.mdio_cmd,
212949b49cdaSZbigniew Bodek 			mdio_cmd);
213049b49cdaSZbigniew Bodek 	} else {
213149b49cdaSZbigniew Bodek 		al_reg_write16(
213249b49cdaSZbigniew Bodek 			(uint16_t *)&adapter->mac_regs_base->mac_10g.mdio_data,
213349b49cdaSZbigniew Bodek 			*val);
213449b49cdaSZbigniew Bodek 	}
213549b49cdaSZbigniew Bodek 	//wait for the busy to clear
213649b49cdaSZbigniew Bodek 	rc = al_eth_mdio_10g_mac_wait_busy(adapter);
213749b49cdaSZbigniew Bodek 	if (rc) {
213849b49cdaSZbigniew Bodek 		al_err(" %s mdio %s failed on timeout\n", adapter->name, op);
213949b49cdaSZbigniew Bodek 		return rc;
214049b49cdaSZbigniew Bodek 	}
214149b49cdaSZbigniew Bodek 
214249b49cdaSZbigniew Bodek 	mdio_cfg_status = al_reg_read32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status);
214349b49cdaSZbigniew Bodek 
214449b49cdaSZbigniew Bodek 	if (mdio_cfg_status & AL_BIT(1)){ //error
214549b49cdaSZbigniew Bodek 		al_err(" %s mdio %s failed on error. port 0x%x, device 0x%x reg 0x%x\n",
214649b49cdaSZbigniew Bodek 			adapter->name, op, port_addr, device, reg);
214749b49cdaSZbigniew Bodek 			return -EIO;
214849b49cdaSZbigniew Bodek 	}
214949b49cdaSZbigniew Bodek 	if (read)
215049b49cdaSZbigniew Bodek 		*val = al_reg_read16(
215149b49cdaSZbigniew Bodek 			(uint16_t *)&adapter->mac_regs_base->mac_10g.mdio_data);
215249b49cdaSZbigniew Bodek 	return 0;
215349b49cdaSZbigniew Bodek }
215449b49cdaSZbigniew Bodek 
215549b49cdaSZbigniew Bodek /**
215649b49cdaSZbigniew Bodek  * acquire mdio interface ownership
215749b49cdaSZbigniew Bodek  * when mdio interface shared between multiple eth controllers, this function waits until the ownership granted for this controller.
215849b49cdaSZbigniew Bodek  * this function does nothing when the mdio interface is used only by this controller.
215949b49cdaSZbigniew Bodek  *
216049b49cdaSZbigniew Bodek  * @param adapter
216149b49cdaSZbigniew Bodek  * @return 0 on success, -ETIMEDOUT  on timeout.
216249b49cdaSZbigniew Bodek  */
al_eth_mdio_lock(struct al_hal_eth_adapter * adapter)216349b49cdaSZbigniew Bodek static int al_eth_mdio_lock(struct al_hal_eth_adapter *adapter)
216449b49cdaSZbigniew Bodek {
216549b49cdaSZbigniew Bodek 	int	count = 0;
216649b49cdaSZbigniew Bodek 	uint32_t mdio_ctrl_1;
216749b49cdaSZbigniew Bodek 
216849b49cdaSZbigniew Bodek 	if (adapter->shared_mdio_if == AL_FALSE)
216949b49cdaSZbigniew Bodek 		return 0; /* nothing to do when interface is not shared */
217049b49cdaSZbigniew Bodek 
217149b49cdaSZbigniew Bodek 	do {
217249b49cdaSZbigniew Bodek 		mdio_ctrl_1 = al_reg_read32(&adapter->mac_regs_base->gen.mdio_ctrl_1);
217349b49cdaSZbigniew Bodek /*
217449b49cdaSZbigniew Bodek 		if (mdio_cfg_status & AL_BIT(1)){ //error
217549b49cdaSZbigniew Bodek 			al_err(" %s mdio read failed on error. phy_addr 0x%x reg 0x%x\n",
217649b49cdaSZbigniew Bodek 				udma_params.name, phy_addr, reg);
217749b49cdaSZbigniew Bodek 			return -EIO;
217849b49cdaSZbigniew Bodek 		}*/
217949b49cdaSZbigniew Bodek 		if (mdio_ctrl_1 & AL_BIT(0)){
218049b49cdaSZbigniew Bodek 			if (count > 0)
218149b49cdaSZbigniew Bodek 				al_dbg("eth %s mdio interface still busy!\n", adapter->name);
218249b49cdaSZbigniew Bodek 		}else{
218349b49cdaSZbigniew Bodek 			return 0;
218449b49cdaSZbigniew Bodek 		}
218549b49cdaSZbigniew Bodek 		al_udelay(AL_ETH_MDIO_DELAY_PERIOD);
218649b49cdaSZbigniew Bodek 	}while(count++ < (AL_ETH_MDIO_DELAY_COUNT * 4));
218749b49cdaSZbigniew Bodek 	al_err(" %s mdio failed to take ownership. MDIO info reg: 0x%08x\n",
218849b49cdaSZbigniew Bodek 		adapter->name, al_reg_read32(&adapter->mac_regs_base->gen.mdio_1));
218949b49cdaSZbigniew Bodek 
219049b49cdaSZbigniew Bodek 	return -ETIMEDOUT;
219149b49cdaSZbigniew Bodek }
219249b49cdaSZbigniew Bodek 
219349b49cdaSZbigniew Bodek /**
219449b49cdaSZbigniew Bodek  * free mdio interface ownership
219549b49cdaSZbigniew Bodek  * when mdio interface shared between multiple eth controllers, this function releases the ownership granted for this controller.
219649b49cdaSZbigniew Bodek  * this function does nothing when the mdio interface is used only by this controller.
219749b49cdaSZbigniew Bodek  *
219849b49cdaSZbigniew Bodek  * @param adapter
219949b49cdaSZbigniew Bodek  * @return 0.
220049b49cdaSZbigniew Bodek  */
al_eth_mdio_free(struct al_hal_eth_adapter * adapter)220149b49cdaSZbigniew Bodek static int al_eth_mdio_free(struct al_hal_eth_adapter *adapter)
220249b49cdaSZbigniew Bodek {
220349b49cdaSZbigniew Bodek 	if (adapter->shared_mdio_if == AL_FALSE)
220449b49cdaSZbigniew Bodek 		return 0; /* nothing to do when interface is not shared */
220549b49cdaSZbigniew Bodek 
220649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->mac_regs_base->gen.mdio_ctrl_1, 0);
220749b49cdaSZbigniew Bodek 
220849b49cdaSZbigniew Bodek 	/*
220949b49cdaSZbigniew Bodek 	 * Addressing RMN: 2917
221049b49cdaSZbigniew Bodek 	 *
221149b49cdaSZbigniew Bodek 	 * RMN description:
221249b49cdaSZbigniew Bodek 	 * The HW spin-lock is stateless and doesn't maintain any scheduling
221349b49cdaSZbigniew Bodek 	 * policy.
221449b49cdaSZbigniew Bodek 	 *
221549b49cdaSZbigniew Bodek 	 * Software flow:
221649b49cdaSZbigniew Bodek 	 * After getting the lock wait 2 times the delay period in order to give
221749b49cdaSZbigniew Bodek 	 * the other port chance to take the lock and prevent starvation.
221849b49cdaSZbigniew Bodek 	 * This is not scalable to more than two ports.
221949b49cdaSZbigniew Bodek 	 */
222049b49cdaSZbigniew Bodek 	al_udelay(2 * AL_ETH_MDIO_DELAY_PERIOD);
222149b49cdaSZbigniew Bodek 
222249b49cdaSZbigniew Bodek 	return 0;
222349b49cdaSZbigniew Bodek }
222449b49cdaSZbigniew Bodek 
al_eth_mdio_read(struct al_hal_eth_adapter * adapter,uint32_t phy_addr,uint32_t device,uint32_t reg,uint16_t * val)222549b49cdaSZbigniew Bodek int al_eth_mdio_read(struct al_hal_eth_adapter *adapter, uint32_t phy_addr, uint32_t device, uint32_t reg, uint16_t *val)
222649b49cdaSZbigniew Bodek {
222749b49cdaSZbigniew Bodek 	int rc;
222849b49cdaSZbigniew Bodek 	rc = al_eth_mdio_lock(adapter);
222949b49cdaSZbigniew Bodek 
223049b49cdaSZbigniew Bodek 	/*"interface ownership taken"*/
223149b49cdaSZbigniew Bodek 	if (rc)
223249b49cdaSZbigniew Bodek 		return rc;
223349b49cdaSZbigniew Bodek 
223449b49cdaSZbigniew Bodek 	if (adapter->mdio_if == AL_ETH_MDIO_IF_1G_MAC)
223549b49cdaSZbigniew Bodek 		rc = al_eth_mdio_1g_mac_read(adapter, phy_addr, reg, val);
223649b49cdaSZbigniew Bodek 	else
223749b49cdaSZbigniew Bodek 		if (adapter->mdio_type == AL_ETH_MDIO_TYPE_CLAUSE_22)
223849b49cdaSZbigniew Bodek 			rc = al_eth_mdio_10g_mac_type22(adapter, 1, phy_addr, reg, val);
223949b49cdaSZbigniew Bodek 		else
224049b49cdaSZbigniew Bodek 			rc = al_eth_mdio_10g_mac_type45(adapter, 1, phy_addr, device, reg, val);
224149b49cdaSZbigniew Bodek 
224249b49cdaSZbigniew Bodek 	al_eth_mdio_free(adapter);
224349b49cdaSZbigniew Bodek 	al_dbg("eth mdio read: phy_addr %x, device %x, reg %x val %x\n", phy_addr, device, reg, *val);
224449b49cdaSZbigniew Bodek 	return rc;
224549b49cdaSZbigniew Bodek }
224649b49cdaSZbigniew Bodek 
al_eth_mdio_write(struct al_hal_eth_adapter * adapter,uint32_t phy_addr,uint32_t device,uint32_t reg,uint16_t val)224749b49cdaSZbigniew Bodek int al_eth_mdio_write(struct al_hal_eth_adapter *adapter, uint32_t phy_addr, uint32_t device, uint32_t reg, uint16_t val)
224849b49cdaSZbigniew Bodek {
224949b49cdaSZbigniew Bodek 	int rc;
225049b49cdaSZbigniew Bodek 	al_dbg("eth mdio write: phy_addr %x, device %x, reg %x, val %x\n", phy_addr, device, reg, val);
225149b49cdaSZbigniew Bodek 	rc = al_eth_mdio_lock(adapter);
225249b49cdaSZbigniew Bodek 	/* interface ownership taken */
225349b49cdaSZbigniew Bodek 	if (rc)
225449b49cdaSZbigniew Bodek 		return rc;
225549b49cdaSZbigniew Bodek 
225649b49cdaSZbigniew Bodek 	if (adapter->mdio_if == AL_ETH_MDIO_IF_1G_MAC)
225749b49cdaSZbigniew Bodek 		rc = al_eth_mdio_1g_mac_write(adapter, phy_addr, reg, val);
225849b49cdaSZbigniew Bodek 	else
225949b49cdaSZbigniew Bodek 		if (adapter->mdio_type == AL_ETH_MDIO_TYPE_CLAUSE_22)
226049b49cdaSZbigniew Bodek 			rc = al_eth_mdio_10g_mac_type22(adapter, 0, phy_addr, reg, &val);
226149b49cdaSZbigniew Bodek 		else
226249b49cdaSZbigniew Bodek 			rc = al_eth_mdio_10g_mac_type45(adapter, 0, phy_addr, device, reg, &val);
226349b49cdaSZbigniew Bodek 
226449b49cdaSZbigniew Bodek 	al_eth_mdio_free(adapter);
226549b49cdaSZbigniew Bodek 	return rc;
226649b49cdaSZbigniew Bodek }
226749b49cdaSZbigniew Bodek 
al_dump_tx_desc(union al_udma_desc * tx_desc)226849b49cdaSZbigniew Bodek static void al_dump_tx_desc(union al_udma_desc *tx_desc)
226949b49cdaSZbigniew Bodek {
227049b49cdaSZbigniew Bodek 	uint32_t *ptr = (uint32_t *)tx_desc;
227149b49cdaSZbigniew Bodek 	al_dbg("eth tx desc:\n");
227249b49cdaSZbigniew Bodek 	al_dbg("0x%08x\n", *(ptr++));
227349b49cdaSZbigniew Bodek 	al_dbg("0x%08x\n", *(ptr++));
227449b49cdaSZbigniew Bodek 	al_dbg("0x%08x\n", *(ptr++));
227549b49cdaSZbigniew Bodek 	al_dbg("0x%08x\n", *(ptr++));
227649b49cdaSZbigniew Bodek }
227749b49cdaSZbigniew Bodek 
227849b49cdaSZbigniew Bodek static void
al_dump_tx_pkt(struct al_udma_q * tx_dma_q,struct al_eth_pkt * pkt)227949b49cdaSZbigniew Bodek al_dump_tx_pkt(struct al_udma_q *tx_dma_q, struct al_eth_pkt *pkt)
228049b49cdaSZbigniew Bodek {
228149b49cdaSZbigniew Bodek 	const char *tso = (pkt->flags & AL_ETH_TX_FLAGS_TSO) ? "TSO" : "";
228249b49cdaSZbigniew Bodek 	const char *l3_csum = (pkt->flags & AL_ETH_TX_FLAGS_IPV4_L3_CSUM) ? "L3 CSUM" : "";
228349b49cdaSZbigniew Bodek 	const char *l4_csum = (pkt->flags & AL_ETH_TX_FLAGS_L4_CSUM) ?
228449b49cdaSZbigniew Bodek 	  ((pkt->flags & AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM) ? "L4 PARTIAL CSUM" : "L4 FULL CSUM") : "";
228549b49cdaSZbigniew Bodek 	const char *fcs = (pkt->flags & AL_ETH_TX_FLAGS_L2_DIS_FCS) ? "Disable FCS" : "";
228649b49cdaSZbigniew Bodek 	const char *ptp = (pkt->flags & AL_ETH_TX_FLAGS_TS) ? "TX_PTP" : "";
228749b49cdaSZbigniew Bodek 	const char *l3_proto_name = "unknown";
228849b49cdaSZbigniew Bodek 	const char *l4_proto_name = "unknown";
228949b49cdaSZbigniew Bodek 	const char *outer_l3_proto_name = "N/A";
2290*3fc36ee0SWojciech Macek 	const char *tunnel_mode = (((pkt->tunnel_mode &
2291*3fc36ee0SWojciech Macek 				AL_ETH_TUNNEL_WITH_UDP) == AL_ETH_TUNNEL_WITH_UDP) ?
229249b49cdaSZbigniew Bodek 				"TUNNEL_WITH_UDP" :
2293*3fc36ee0SWojciech Macek 				(((pkt->tunnel_mode &
2294*3fc36ee0SWojciech Macek 				AL_ETH_TUNNEL_NO_UDP) == AL_ETH_TUNNEL_NO_UDP) ?
2295*3fc36ee0SWojciech Macek 				"TUNNEL_NO_UDP" : ""));
229649b49cdaSZbigniew Bodek 	uint32_t total_len = 0;
229749b49cdaSZbigniew Bodek 	int i;
229849b49cdaSZbigniew Bodek 
229949b49cdaSZbigniew Bodek 	al_dbg("[%s %d]: flags: %s %s %s %s %s %s\n", tx_dma_q->udma->name, tx_dma_q->qid,
230049b49cdaSZbigniew Bodek 		 tso, l3_csum, l4_csum, fcs, ptp, tunnel_mode);
230149b49cdaSZbigniew Bodek 
230249b49cdaSZbigniew Bodek 	switch (pkt->l3_proto_idx) {
230349b49cdaSZbigniew Bodek 	case AL_ETH_PROTO_ID_IPv4:
230449b49cdaSZbigniew Bodek 		l3_proto_name = "IPv4";
230549b49cdaSZbigniew Bodek 		break;
230649b49cdaSZbigniew Bodek 	case AL_ETH_PROTO_ID_IPv6:
230749b49cdaSZbigniew Bodek 		l3_proto_name = "IPv6";
230849b49cdaSZbigniew Bodek 		break;
230949b49cdaSZbigniew Bodek 	default:
231049b49cdaSZbigniew Bodek 		l3_proto_name = "unknown";
231149b49cdaSZbigniew Bodek 		break;
231249b49cdaSZbigniew Bodek 	}
231349b49cdaSZbigniew Bodek 
231449b49cdaSZbigniew Bodek 	switch (pkt->l4_proto_idx) {
231549b49cdaSZbigniew Bodek 	case AL_ETH_PROTO_ID_TCP:
231649b49cdaSZbigniew Bodek 		l4_proto_name = "TCP";
231749b49cdaSZbigniew Bodek 		break;
231849b49cdaSZbigniew Bodek 	case AL_ETH_PROTO_ID_UDP:
231949b49cdaSZbigniew Bodek 		l4_proto_name = "UDP";
232049b49cdaSZbigniew Bodek 		break;
232149b49cdaSZbigniew Bodek 	default:
232249b49cdaSZbigniew Bodek 		l4_proto_name = "unknown";
232349b49cdaSZbigniew Bodek 		break;
232449b49cdaSZbigniew Bodek 	}
232549b49cdaSZbigniew Bodek 
232649b49cdaSZbigniew Bodek 	switch (pkt->outer_l3_proto_idx) {
232749b49cdaSZbigniew Bodek 	case AL_ETH_PROTO_ID_IPv4:
232849b49cdaSZbigniew Bodek 		outer_l3_proto_name = "IPv4";
232949b49cdaSZbigniew Bodek 		break;
233049b49cdaSZbigniew Bodek 	case AL_ETH_PROTO_ID_IPv6:
233149b49cdaSZbigniew Bodek 		outer_l3_proto_name = "IPv6";
233249b49cdaSZbigniew Bodek 		break;
233349b49cdaSZbigniew Bodek 	default:
233449b49cdaSZbigniew Bodek 		outer_l3_proto_name = "N/A";
233549b49cdaSZbigniew Bodek 		break;
233649b49cdaSZbigniew Bodek 	}
233749b49cdaSZbigniew Bodek 
233849b49cdaSZbigniew Bodek 	al_dbg("[%s %d]: L3 proto: %d (%s). L4 proto: %d (%s). Outer_L3 proto: %d (%s). vlan source count %d. mod add %d. mod del %d\n",
233949b49cdaSZbigniew Bodek 			tx_dma_q->udma->name, tx_dma_q->qid, pkt->l3_proto_idx,
234049b49cdaSZbigniew Bodek 			l3_proto_name, pkt->l4_proto_idx, l4_proto_name,
234149b49cdaSZbigniew Bodek 			pkt->outer_l3_proto_idx, outer_l3_proto_name,
234249b49cdaSZbigniew Bodek 			pkt->source_vlan_count, pkt->vlan_mod_add_count,
234349b49cdaSZbigniew Bodek 			pkt->vlan_mod_del_count);
234449b49cdaSZbigniew Bodek 
234549b49cdaSZbigniew Bodek 	if (pkt->meta) {
234649b49cdaSZbigniew Bodek 		const char * store = pkt->meta->store ? "Yes" : "No";
2347*3fc36ee0SWojciech Macek 		const char *ptp_val = (pkt->flags & AL_ETH_TX_FLAGS_TS) ? "Yes" : "No";
234849b49cdaSZbigniew Bodek 
234949b49cdaSZbigniew Bodek 		al_dbg("[%s %d]: tx pkt with meta data. words valid %x\n",
235049b49cdaSZbigniew Bodek 			tx_dma_q->udma->name, tx_dma_q->qid,
235149b49cdaSZbigniew Bodek 			pkt->meta->words_valid);
2352*3fc36ee0SWojciech Macek 		al_dbg("[%s %d]: meta: store to cache %s. l3 hdr len %d. l3 hdr offset %d. "
2353*3fc36ee0SWojciech Macek 			"l4 hdr len %d. mss val %d ts_index %d ts_val:%s\n"
235449b49cdaSZbigniew Bodek 			, tx_dma_q->udma->name, tx_dma_q->qid, store,
235549b49cdaSZbigniew Bodek 			pkt->meta->l3_header_len, pkt->meta->l3_header_offset,
235649b49cdaSZbigniew Bodek 			pkt->meta->l4_header_len, pkt->meta->mss_val,
235749b49cdaSZbigniew Bodek 			pkt->meta->ts_index, ptp_val);
235849b49cdaSZbigniew Bodek 		al_dbg("outer_l3_hdr_offset %d. outer_l3_len %d.\n",
235949b49cdaSZbigniew Bodek 			pkt->meta->outer_l3_offset, pkt->meta->outer_l3_len);
236049b49cdaSZbigniew Bodek 	}
236149b49cdaSZbigniew Bodek 
236249b49cdaSZbigniew Bodek 	al_dbg("[%s %d]: num of bufs: %d\n", tx_dma_q->udma->name, tx_dma_q->qid,
236349b49cdaSZbigniew Bodek 		pkt->num_of_bufs);
236449b49cdaSZbigniew Bodek 	for (i = 0; i < pkt->num_of_bufs; i++) {
236549b49cdaSZbigniew Bodek 		al_dbg("eth [%s %d]: buf[%d]: len 0x%08x. address 0x%016llx\n", tx_dma_q->udma->name, tx_dma_q->qid,
236649b49cdaSZbigniew Bodek 			i, pkt->bufs[i].len, (unsigned long long)pkt->bufs[i].addr);
236749b49cdaSZbigniew Bodek 		total_len += pkt->bufs[i].len;
236849b49cdaSZbigniew Bodek 	}
236949b49cdaSZbigniew Bodek 	al_dbg("[%s %d]: total len: 0x%08x\n", tx_dma_q->udma->name, tx_dma_q->qid, total_len);
237049b49cdaSZbigniew Bodek 
237149b49cdaSZbigniew Bodek }
237249b49cdaSZbigniew Bodek 
237349b49cdaSZbigniew Bodek /* TX */
237449b49cdaSZbigniew Bodek /**
237549b49cdaSZbigniew Bodek  * add packet to transmission queue
237649b49cdaSZbigniew Bodek  */
al_eth_tx_pkt_prepare(struct al_udma_q * tx_dma_q,struct al_eth_pkt * pkt)237749b49cdaSZbigniew Bodek int al_eth_tx_pkt_prepare(struct al_udma_q *tx_dma_q, struct al_eth_pkt *pkt)
237849b49cdaSZbigniew Bodek {
237949b49cdaSZbigniew Bodek 	union al_udma_desc *tx_desc;
238049b49cdaSZbigniew Bodek 	uint32_t tx_descs;
238149b49cdaSZbigniew Bodek 	uint32_t flags = AL_M2S_DESC_FIRST |
238249b49cdaSZbigniew Bodek 			AL_M2S_DESC_CONCAT |
238349b49cdaSZbigniew Bodek 			(pkt->flags & AL_ETH_TX_FLAGS_INT);
2384*3fc36ee0SWojciech Macek 	uint64_t tgtid = ((uint64_t)pkt->tgtid) << AL_UDMA_DESC_TGTID_SHIFT;
238549b49cdaSZbigniew Bodek 	uint32_t meta_ctrl;
238649b49cdaSZbigniew Bodek 	uint32_t ring_id;
238749b49cdaSZbigniew Bodek 	int buf_idx;
238849b49cdaSZbigniew Bodek 
238949b49cdaSZbigniew Bodek 	al_dbg("[%s %d]: new tx pkt\n", tx_dma_q->udma->name, tx_dma_q->qid);
239049b49cdaSZbigniew Bodek 
239149b49cdaSZbigniew Bodek 	al_dump_tx_pkt(tx_dma_q, pkt);
239249b49cdaSZbigniew Bodek 
239349b49cdaSZbigniew Bodek 	tx_descs = pkt->num_of_bufs;
239449b49cdaSZbigniew Bodek 	if (pkt->meta) {
239549b49cdaSZbigniew Bodek 		tx_descs += 1;
239649b49cdaSZbigniew Bodek 	}
239749b49cdaSZbigniew Bodek #ifdef AL_ETH_EX
239849b49cdaSZbigniew Bodek 	al_assert((pkt->ext_meta_data == NULL) || (tx_dma_q->adapter_rev_id > AL_ETH_REV_ID_2));
239949b49cdaSZbigniew Bodek 
240049b49cdaSZbigniew Bodek 	tx_descs += al_eth_ext_metadata_needed_descs(pkt->ext_meta_data);
240149b49cdaSZbigniew Bodek 	al_dbg("[%s %d]: %d Descriptors: ext_meta (%d). meta (%d). buffer (%d) ",
240249b49cdaSZbigniew Bodek 			tx_dma_q->udma->name, tx_dma_q->qid, tx_descs,
240349b49cdaSZbigniew Bodek 			al_eth_ext_metadata_needed_descs(pkt->ext_meta_data),
240449b49cdaSZbigniew Bodek 			(pkt->meta != NULL), pkt->num_of_bufs);
240549b49cdaSZbigniew Bodek #endif
240649b49cdaSZbigniew Bodek 
240749b49cdaSZbigniew Bodek 	if (unlikely(al_udma_available_get(tx_dma_q) < tx_descs)) {
240849b49cdaSZbigniew Bodek 		al_dbg("[%s %d]: failed to allocate (%d) descriptors",
240949b49cdaSZbigniew Bodek 			 tx_dma_q->udma->name, tx_dma_q->qid, tx_descs);
241049b49cdaSZbigniew Bodek 		return 0;
241149b49cdaSZbigniew Bodek 	}
241249b49cdaSZbigniew Bodek 
241349b49cdaSZbigniew Bodek #ifdef AL_ETH_EX
241449b49cdaSZbigniew Bodek 	if (pkt->ext_meta_data != NULL) {
241549b49cdaSZbigniew Bodek 		al_eth_ext_metadata_create(tx_dma_q, &flags, pkt->ext_meta_data);
241649b49cdaSZbigniew Bodek 		flags &= ~(AL_M2S_DESC_FIRST | AL_ETH_TX_FLAGS_INT);
241749b49cdaSZbigniew Bodek 	}
241849b49cdaSZbigniew Bodek #endif
241949b49cdaSZbigniew Bodek 
242049b49cdaSZbigniew Bodek 	if (pkt->meta) {
242149b49cdaSZbigniew Bodek 		uint32_t meta_word_0 = 0;
242249b49cdaSZbigniew Bodek 		uint32_t meta_word_1 = 0;
242349b49cdaSZbigniew Bodek 		uint32_t meta_word_2 = 0;
242449b49cdaSZbigniew Bodek 		uint32_t meta_word_3 = 0;
242549b49cdaSZbigniew Bodek 
242649b49cdaSZbigniew Bodek 		meta_word_0 |= flags | AL_M2S_DESC_META_DATA;
242749b49cdaSZbigniew Bodek 		meta_word_0 &=  ~AL_M2S_DESC_CONCAT;
242849b49cdaSZbigniew Bodek 		flags &= ~(AL_M2S_DESC_FIRST | AL_ETH_TX_FLAGS_INT);
242949b49cdaSZbigniew Bodek 
243049b49cdaSZbigniew Bodek 		tx_desc = al_udma_desc_get(tx_dma_q);
243149b49cdaSZbigniew Bodek 		/* get ring id, and clear FIRST and Int flags */
243249b49cdaSZbigniew Bodek 		ring_id = al_udma_ring_id_get(tx_dma_q) <<
243349b49cdaSZbigniew Bodek 			AL_M2S_DESC_RING_ID_SHIFT;
243449b49cdaSZbigniew Bodek 
243549b49cdaSZbigniew Bodek 		meta_word_0 |= ring_id;
243649b49cdaSZbigniew Bodek 		meta_word_0 |= pkt->meta->words_valid << 12;
243749b49cdaSZbigniew Bodek 
243849b49cdaSZbigniew Bodek 		if (pkt->meta->store)
243949b49cdaSZbigniew Bodek 			meta_word_0 |= AL_ETH_TX_META_STORE;
244049b49cdaSZbigniew Bodek 
244149b49cdaSZbigniew Bodek 		if (pkt->meta->words_valid & 1) {
244249b49cdaSZbigniew Bodek 			meta_word_0 |= pkt->meta->vlan1_cfi_sel;
244349b49cdaSZbigniew Bodek 			meta_word_0 |= pkt->meta->vlan2_vid_sel << 2;
244449b49cdaSZbigniew Bodek 			meta_word_0 |= pkt->meta->vlan2_cfi_sel << 4;
244549b49cdaSZbigniew Bodek 			meta_word_0 |= pkt->meta->vlan2_pbits_sel << 6;
244649b49cdaSZbigniew Bodek 			meta_word_0 |= pkt->meta->vlan2_ether_sel << 8;
244749b49cdaSZbigniew Bodek 		}
244849b49cdaSZbigniew Bodek 
244949b49cdaSZbigniew Bodek 		if (pkt->meta->words_valid & 2) {
245049b49cdaSZbigniew Bodek 			meta_word_1 = pkt->meta->vlan1_new_vid;
245149b49cdaSZbigniew Bodek 			meta_word_1 |= pkt->meta->vlan1_new_cfi << 12;
245249b49cdaSZbigniew Bodek 			meta_word_1 |= pkt->meta->vlan1_new_pbits << 13;
245349b49cdaSZbigniew Bodek 			meta_word_1 |= pkt->meta->vlan2_new_vid << 16;
245449b49cdaSZbigniew Bodek 			meta_word_1 |= pkt->meta->vlan2_new_cfi << 28;
245549b49cdaSZbigniew Bodek 			meta_word_1 |= pkt->meta->vlan2_new_pbits << 29;
245649b49cdaSZbigniew Bodek 		}
245749b49cdaSZbigniew Bodek 
245849b49cdaSZbigniew Bodek 		if (pkt->meta->words_valid & 4) {
2459*3fc36ee0SWojciech Macek 			uint32_t l3_offset;
2460*3fc36ee0SWojciech Macek 
246149b49cdaSZbigniew Bodek 			meta_word_2 = pkt->meta->l3_header_len & AL_ETH_TX_META_L3_LEN_MASK;
246249b49cdaSZbigniew Bodek 			meta_word_2 |= (pkt->meta->l3_header_offset & AL_ETH_TX_META_L3_OFF_MASK) <<
246349b49cdaSZbigniew Bodek 				AL_ETH_TX_META_L3_OFF_SHIFT;
246449b49cdaSZbigniew Bodek 			meta_word_2 |= (pkt->meta->l4_header_len & 0x3f) << 16;
246549b49cdaSZbigniew Bodek 
246649b49cdaSZbigniew Bodek 			if (unlikely(pkt->flags & AL_ETH_TX_FLAGS_TS))
2467*3fc36ee0SWojciech Macek 				meta_word_0 |= pkt->meta->ts_index <<
2468*3fc36ee0SWojciech Macek 					AL_ETH_TX_META_MSS_MSB_TS_VAL_SHIFT;
246949b49cdaSZbigniew Bodek 			else
247049b49cdaSZbigniew Bodek 				meta_word_0 |= (((pkt->meta->mss_val & 0x3c00) >> 10)
247149b49cdaSZbigniew Bodek 						<< AL_ETH_TX_META_MSS_MSB_TS_VAL_SHIFT);
247249b49cdaSZbigniew Bodek 			meta_word_2 |= ((pkt->meta->mss_val & 0x03ff)
247349b49cdaSZbigniew Bodek 					<< AL_ETH_TX_META_MSS_LSB_VAL_SHIFT);
247449b49cdaSZbigniew Bodek 
247549b49cdaSZbigniew Bodek 			/*
247649b49cdaSZbigniew Bodek 			 * move from bytes to multiplication of 2 as the HW
247749b49cdaSZbigniew Bodek 			 * expect to get it
247849b49cdaSZbigniew Bodek 			 */
247949b49cdaSZbigniew Bodek 			l3_offset = (pkt->meta->outer_l3_offset >> 1);
248049b49cdaSZbigniew Bodek 
248149b49cdaSZbigniew Bodek 			meta_word_0 |=
248249b49cdaSZbigniew Bodek 				(((l3_offset &
248349b49cdaSZbigniew Bodek 				   AL_ETH_TX_META_OUTER_L3_OFF_HIGH_MASK) >> 3)
248449b49cdaSZbigniew Bodek 				   << AL_ETH_TX_META_OUTER_L3_OFF_HIGH_SHIFT);
248549b49cdaSZbigniew Bodek 
248649b49cdaSZbigniew Bodek 			meta_word_3 |=
248749b49cdaSZbigniew Bodek 				((l3_offset &
248849b49cdaSZbigniew Bodek 				   AL_ETH_TX_META_OUTER_L3_OFF_LOW_MASK)
248949b49cdaSZbigniew Bodek 				   << AL_ETH_TX_META_OUTER_L3_OFF_LOW_SHIFT);
249049b49cdaSZbigniew Bodek 
249149b49cdaSZbigniew Bodek 			/*
249249b49cdaSZbigniew Bodek 			 * shift right 2 bits to work in multiplication of 4
249349b49cdaSZbigniew Bodek 			 * as the HW expect to get it
249449b49cdaSZbigniew Bodek 			 */
249549b49cdaSZbigniew Bodek 			meta_word_3 |=
249649b49cdaSZbigniew Bodek 				(((pkt->meta->outer_l3_len >> 2) &
249749b49cdaSZbigniew Bodek 				   AL_ETH_TX_META_OUTER_L3_LEN_MASK)
249849b49cdaSZbigniew Bodek 				   << AL_ETH_TX_META_OUTER_L3_LEN_SHIFT);
249949b49cdaSZbigniew Bodek 		}
250049b49cdaSZbigniew Bodek 
250149b49cdaSZbigniew Bodek 		tx_desc->tx_meta.len_ctrl = swap32_to_le(meta_word_0);
250249b49cdaSZbigniew Bodek 		tx_desc->tx_meta.meta_ctrl = swap32_to_le(meta_word_1);
250349b49cdaSZbigniew Bodek 		tx_desc->tx_meta.meta1 = swap32_to_le(meta_word_2);
250449b49cdaSZbigniew Bodek 		tx_desc->tx_meta.meta2 = swap32_to_le(meta_word_3);
250549b49cdaSZbigniew Bodek 		al_dump_tx_desc(tx_desc);
250649b49cdaSZbigniew Bodek 	}
250749b49cdaSZbigniew Bodek 
250849b49cdaSZbigniew Bodek 	meta_ctrl = pkt->flags & AL_ETH_TX_PKT_META_FLAGS;
250949b49cdaSZbigniew Bodek 
251049b49cdaSZbigniew Bodek 	/* L4_PARTIAL_CSUM without L4_CSUM is invalid option  */
251149b49cdaSZbigniew Bodek 	al_assert((pkt->flags & (AL_ETH_TX_FLAGS_L4_CSUM|AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM)) !=
251249b49cdaSZbigniew Bodek 		  AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM);
251349b49cdaSZbigniew Bodek 
251449b49cdaSZbigniew Bodek 	/* TSO packets can't have Timestamp enabled */
251549b49cdaSZbigniew Bodek 	al_assert((pkt->flags & (AL_ETH_TX_FLAGS_TSO|AL_ETH_TX_FLAGS_TS)) !=
251649b49cdaSZbigniew Bodek 		  (AL_ETH_TX_FLAGS_TSO|AL_ETH_TX_FLAGS_TS));
251749b49cdaSZbigniew Bodek 
251849b49cdaSZbigniew Bodek 	meta_ctrl |= pkt->l3_proto_idx;
251949b49cdaSZbigniew Bodek 	meta_ctrl |= pkt->l4_proto_idx << AL_ETH_TX_L4_PROTO_IDX_SHIFT;
252049b49cdaSZbigniew Bodek 	meta_ctrl |= pkt->source_vlan_count << AL_ETH_TX_SRC_VLAN_CNT_SHIFT;
252149b49cdaSZbigniew Bodek 	meta_ctrl |= pkt->vlan_mod_add_count << AL_ETH_TX_VLAN_MOD_ADD_SHIFT;
252249b49cdaSZbigniew Bodek 	meta_ctrl |= pkt->vlan_mod_del_count << AL_ETH_TX_VLAN_MOD_DEL_SHIFT;
252349b49cdaSZbigniew Bodek 	meta_ctrl |= pkt->vlan_mod_v1_ether_sel << AL_ETH_TX_VLAN_MOD_E_SEL_SHIFT;
252449b49cdaSZbigniew Bodek 	meta_ctrl |= pkt->vlan_mod_v1_vid_sel << AL_ETH_TX_VLAN_MOD_VID_SEL_SHIFT;
252549b49cdaSZbigniew Bodek 	meta_ctrl |= pkt->vlan_mod_v1_pbits_sel << AL_ETH_TX_VLAN_MOD_PBIT_SEL_SHIFT;
252649b49cdaSZbigniew Bodek 
252749b49cdaSZbigniew Bodek #ifdef AL_ETH_EX
252849b49cdaSZbigniew Bodek 	if ((pkt->ext_meta_data != NULL) && (pkt->ext_meta_data->tx_crypto_data != NULL))
252949b49cdaSZbigniew Bodek 		meta_ctrl |= AL_ETH_TX_FLAGS_ENCRYPT;
253049b49cdaSZbigniew Bodek #endif
253149b49cdaSZbigniew Bodek 
253249b49cdaSZbigniew Bodek 	meta_ctrl |= pkt->tunnel_mode << AL_ETH_TX_TUNNEL_MODE_SHIFT;
253349b49cdaSZbigniew Bodek 	if (pkt->outer_l3_proto_idx == AL_ETH_PROTO_ID_IPv4)
253449b49cdaSZbigniew Bodek 		meta_ctrl |= 1 << AL_ETH_TX_OUTER_L3_PROTO_SHIFT;
253549b49cdaSZbigniew Bodek 
253649b49cdaSZbigniew Bodek 	flags |= pkt->flags & AL_ETH_TX_PKT_UDMA_FLAGS;
253749b49cdaSZbigniew Bodek 	for(buf_idx = 0; buf_idx < pkt->num_of_bufs; buf_idx++ ) {
253849b49cdaSZbigniew Bodek 		uint32_t flags_len = flags;
253949b49cdaSZbigniew Bodek 
254049b49cdaSZbigniew Bodek 		tx_desc = al_udma_desc_get(tx_dma_q);
254149b49cdaSZbigniew Bodek 		/* get ring id, and clear FIRST and Int flags */
254249b49cdaSZbigniew Bodek 		ring_id = al_udma_ring_id_get(tx_dma_q) <<
254349b49cdaSZbigniew Bodek 			AL_M2S_DESC_RING_ID_SHIFT;
254449b49cdaSZbigniew Bodek 
254549b49cdaSZbigniew Bodek 		flags_len |= ring_id;
254649b49cdaSZbigniew Bodek 
254749b49cdaSZbigniew Bodek 		if (buf_idx == (pkt->num_of_bufs - 1))
254849b49cdaSZbigniew Bodek 			flags_len |= AL_M2S_DESC_LAST;
254949b49cdaSZbigniew Bodek 
255049b49cdaSZbigniew Bodek 		/* clear First and Int flags */
255149b49cdaSZbigniew Bodek 		flags &= AL_ETH_TX_FLAGS_NO_SNOOP;
255249b49cdaSZbigniew Bodek 		flags |= AL_M2S_DESC_CONCAT;
255349b49cdaSZbigniew Bodek 
255449b49cdaSZbigniew Bodek 		flags_len |= pkt->bufs[buf_idx].len & AL_M2S_DESC_LEN_MASK;
255549b49cdaSZbigniew Bodek 		tx_desc->tx.len_ctrl = swap32_to_le(flags_len);
255649b49cdaSZbigniew Bodek 		if (buf_idx == 0)
255749b49cdaSZbigniew Bodek 			tx_desc->tx.meta_ctrl = swap32_to_le(meta_ctrl);
255849b49cdaSZbigniew Bodek 		tx_desc->tx.buf_ptr = swap64_to_le(
2559*3fc36ee0SWojciech Macek 			pkt->bufs[buf_idx].addr | tgtid);
256049b49cdaSZbigniew Bodek 		al_dump_tx_desc(tx_desc);
256149b49cdaSZbigniew Bodek 	}
256249b49cdaSZbigniew Bodek 
256349b49cdaSZbigniew Bodek 	al_dbg("[%s %d]: pkt descriptors written into the tx queue. descs num (%d)\n",
256449b49cdaSZbigniew Bodek 		tx_dma_q->udma->name, tx_dma_q->qid, tx_descs);
256549b49cdaSZbigniew Bodek 
256649b49cdaSZbigniew Bodek 	return tx_descs;
256749b49cdaSZbigniew Bodek }
256849b49cdaSZbigniew Bodek 
256949b49cdaSZbigniew Bodek 
al_eth_tx_dma_action(struct al_udma_q * tx_dma_q,uint32_t tx_descs)257049b49cdaSZbigniew Bodek void al_eth_tx_dma_action(struct al_udma_q *tx_dma_q, uint32_t tx_descs)
257149b49cdaSZbigniew Bodek {
257249b49cdaSZbigniew Bodek 	/* add tx descriptors */
257349b49cdaSZbigniew Bodek 	al_udma_desc_action_add(tx_dma_q, tx_descs);
257449b49cdaSZbigniew Bodek }
257549b49cdaSZbigniew Bodek 
257649b49cdaSZbigniew Bodek /**
257749b49cdaSZbigniew Bodek  * get number of completed tx descriptors, upper layer should derive from
257849b49cdaSZbigniew Bodek  */
al_eth_comp_tx_get(struct al_udma_q * tx_dma_q)257949b49cdaSZbigniew Bodek int al_eth_comp_tx_get(struct al_udma_q *tx_dma_q)
258049b49cdaSZbigniew Bodek {
258149b49cdaSZbigniew Bodek 	int rc;
258249b49cdaSZbigniew Bodek 
258349b49cdaSZbigniew Bodek 	rc = al_udma_cdesc_get_all(tx_dma_q, NULL);
258449b49cdaSZbigniew Bodek 	if (rc != 0) {
258549b49cdaSZbigniew Bodek 		al_udma_cdesc_ack(tx_dma_q, rc);
258649b49cdaSZbigniew Bodek 		al_dbg("[%s %d]: tx completion: descs (%d)\n",
258749b49cdaSZbigniew Bodek 			 tx_dma_q->udma->name, tx_dma_q->qid, rc);
258849b49cdaSZbigniew Bodek 	}
258949b49cdaSZbigniew Bodek 
259049b49cdaSZbigniew Bodek 	return rc;
259149b49cdaSZbigniew Bodek }
259249b49cdaSZbigniew Bodek 
259349b49cdaSZbigniew Bodek /**
259449b49cdaSZbigniew Bodek  * configure the TSO MSS val
259549b49cdaSZbigniew Bodek  */
al_eth_tso_mss_config(struct al_hal_eth_adapter * adapter,uint8_t idx,uint32_t mss_val)259649b49cdaSZbigniew Bodek int al_eth_tso_mss_config(struct al_hal_eth_adapter *adapter, uint8_t idx, uint32_t mss_val)
259749b49cdaSZbigniew Bodek {
259849b49cdaSZbigniew Bodek 
259949b49cdaSZbigniew Bodek 	al_assert(idx <= 8); /*valid MSS index*/
260049b49cdaSZbigniew Bodek 	al_assert(mss_val <= AL_ETH_TSO_MSS_MAX_VAL); /*valid MSS val*/
260149b49cdaSZbigniew Bodek 	al_assert(mss_val >= AL_ETH_TSO_MSS_MIN_VAL); /*valid MSS val*/
260249b49cdaSZbigniew Bodek 
260349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tso_sel[idx].mss, mss_val);
260449b49cdaSZbigniew Bodek 	return 0;
260549b49cdaSZbigniew Bodek }
260649b49cdaSZbigniew Bodek 
260749b49cdaSZbigniew Bodek 
260849b49cdaSZbigniew Bodek /* RX */
260949b49cdaSZbigniew Bodek /**
261049b49cdaSZbigniew Bodek  * config the rx descriptor fields
261149b49cdaSZbigniew Bodek  */
al_eth_rx_desc_config(struct al_hal_eth_adapter * adapter,enum al_eth_rx_desc_lro_context_val_res lro_sel,enum al_eth_rx_desc_l4_offset_sel l4_offset_sel,enum al_eth_rx_desc_l3_offset_sel l3_offset_sel,enum al_eth_rx_desc_l4_chk_res_sel l4_sel,enum al_eth_rx_desc_l3_chk_res_sel l3_sel,enum al_eth_rx_desc_l3_proto_idx_sel l3_proto_sel,enum al_eth_rx_desc_l4_proto_idx_sel l4_proto_sel,enum al_eth_rx_desc_frag_sel frag_sel)261249b49cdaSZbigniew Bodek void al_eth_rx_desc_config(
261349b49cdaSZbigniew Bodek 			struct al_hal_eth_adapter *adapter,
261449b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_lro_context_val_res lro_sel,
261549b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l4_offset_sel l4_offset_sel,
261649b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l3_offset_sel l3_offset_sel,
261749b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l4_chk_res_sel l4_sel,
261849b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l3_chk_res_sel l3_sel,
261949b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l3_proto_idx_sel l3_proto_sel,
262049b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_l4_proto_idx_sel l4_proto_sel,
262149b49cdaSZbigniew Bodek 			enum al_eth_rx_desc_frag_sel frag_sel)
262249b49cdaSZbigniew Bodek {
262349b49cdaSZbigniew Bodek 	uint32_t reg_val = 0;
262449b49cdaSZbigniew Bodek 
262549b49cdaSZbigniew Bodek 	reg_val |= (lro_sel == AL_ETH_L4_OFFSET) ?
262649b49cdaSZbigniew Bodek 			EC_RFW_CFG_A_0_LRO_CONTEXT_SEL : 0;
262749b49cdaSZbigniew Bodek 
262849b49cdaSZbigniew Bodek 	reg_val |= (l4_sel == AL_ETH_L4_INNER_OUTER_CHK) ?
262949b49cdaSZbigniew Bodek 			EC_RFW_CFG_A_0_META_L4_CHK_RES_SEL : 0;
263049b49cdaSZbigniew Bodek 
263149b49cdaSZbigniew Bodek 	reg_val |= l3_sel << EC_RFW_CFG_A_0_META_L3_CHK_RES_SEL_SHIFT;
263249b49cdaSZbigniew Bodek 
263349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.cfg_a_0, reg_val);
263449b49cdaSZbigniew Bodek 
263549b49cdaSZbigniew Bodek 	reg_val = al_reg_read32(&adapter->ec_regs_base->rfw.meta);
263649b49cdaSZbigniew Bodek 	if (l3_proto_sel == AL_ETH_L3_PROTO_IDX_INNER)
263749b49cdaSZbigniew Bodek 		reg_val |= EC_RFW_META_L3_PROT_SEL;
263849b49cdaSZbigniew Bodek 	else
263949b49cdaSZbigniew Bodek 		reg_val &= ~EC_RFW_META_L3_PROT_SEL;
264049b49cdaSZbigniew Bodek 
264149b49cdaSZbigniew Bodek 	if (l4_proto_sel == AL_ETH_L4_PROTO_IDX_INNER)
264249b49cdaSZbigniew Bodek 		reg_val |= EC_RFW_META_L4_PROT_SEL;
264349b49cdaSZbigniew Bodek 	else
264449b49cdaSZbigniew Bodek 		reg_val &= ~EC_RFW_META_L4_PROT_SEL;
264549b49cdaSZbigniew Bodek 
264649b49cdaSZbigniew Bodek 	if (l4_offset_sel == AL_ETH_L4_OFFSET_INNER)
264749b49cdaSZbigniew Bodek 		reg_val |= EC_RFW_META_L4_OFFSET_SEL;
264849b49cdaSZbigniew Bodek 	else
264949b49cdaSZbigniew Bodek 		reg_val &= ~EC_RFW_META_L4_OFFSET_SEL;
265049b49cdaSZbigniew Bodek 
265149b49cdaSZbigniew Bodek 	if (l3_offset_sel == AL_ETH_L3_OFFSET_INNER)
265249b49cdaSZbigniew Bodek 		reg_val |= EC_RFW_META_L3_OFFSET_SEL;
265349b49cdaSZbigniew Bodek 	else
265449b49cdaSZbigniew Bodek 		reg_val &= ~EC_RFW_META_L3_OFFSET_SEL;
265549b49cdaSZbigniew Bodek 
265649b49cdaSZbigniew Bodek 	if (frag_sel == AL_ETH_FRAG_INNER)
265749b49cdaSZbigniew Bodek 		reg_val |= EC_RFW_META_FRAG_SEL;
265849b49cdaSZbigniew Bodek 	else
265949b49cdaSZbigniew Bodek 		reg_val &= ~EC_RFW_META_FRAG_SEL;
266049b49cdaSZbigniew Bodek 
266149b49cdaSZbigniew Bodek 
266249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.meta, reg_val);
266349b49cdaSZbigniew Bodek }
266449b49cdaSZbigniew Bodek 
266549b49cdaSZbigniew Bodek /**
266649b49cdaSZbigniew Bodek  * Configure RX header split
266749b49cdaSZbigniew Bodek  */
al_eth_rx_header_split_config(struct al_hal_eth_adapter * adapter,al_bool enable,uint32_t header_len)266849b49cdaSZbigniew Bodek int al_eth_rx_header_split_config(struct al_hal_eth_adapter *adapter, al_bool enable, uint32_t header_len)
266949b49cdaSZbigniew Bodek {
267049b49cdaSZbigniew Bodek 	uint32_t	reg;
267149b49cdaSZbigniew Bodek 
267249b49cdaSZbigniew Bodek 	reg = al_reg_read32(&adapter->ec_regs_base->rfw.hdr_split);
267349b49cdaSZbigniew Bodek 	if (enable == AL_TRUE)
267449b49cdaSZbigniew Bodek 		reg |= EC_RFW_HDR_SPLIT_EN;
267549b49cdaSZbigniew Bodek 	else
267649b49cdaSZbigniew Bodek 		reg &= ~EC_RFW_HDR_SPLIT_EN;
267749b49cdaSZbigniew Bodek 
267849b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, EC_RFW_HDR_SPLIT_DEF_LEN_MASK, EC_RFW_HDR_SPLIT_DEF_LEN_SHIFT, header_len);
267949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.hdr_split, reg);
268049b49cdaSZbigniew Bodek 	return 0;
268149b49cdaSZbigniew Bodek }
268249b49cdaSZbigniew Bodek 
268349b49cdaSZbigniew Bodek 
268449b49cdaSZbigniew Bodek /**
268549b49cdaSZbigniew Bodek  * enable / disable header split in the udma queue.
268649b49cdaSZbigniew Bodek  * length will be taken from the udma configuration to enable different length per queue.
268749b49cdaSZbigniew Bodek  */
al_eth_rx_header_split_force_len_config(struct al_hal_eth_adapter * adapter,al_bool enable,uint32_t qid,uint32_t header_len)268849b49cdaSZbigniew Bodek int al_eth_rx_header_split_force_len_config(struct al_hal_eth_adapter *adapter,
268949b49cdaSZbigniew Bodek 					al_bool enable,
269049b49cdaSZbigniew Bodek 					uint32_t qid,
269149b49cdaSZbigniew Bodek 					uint32_t header_len)
269249b49cdaSZbigniew Bodek {
269349b49cdaSZbigniew Bodek 	al_udma_s2m_q_compl_hdr_split_config(&(adapter->rx_udma.udma_q[qid]), enable,
269449b49cdaSZbigniew Bodek 					     AL_TRUE, header_len);
269549b49cdaSZbigniew Bodek 
269649b49cdaSZbigniew Bodek 	return 0;
269749b49cdaSZbigniew Bodek }
269849b49cdaSZbigniew Bodek 
269949b49cdaSZbigniew Bodek 
270049b49cdaSZbigniew Bodek /**
270149b49cdaSZbigniew Bodek  * add buffer to receive queue
270249b49cdaSZbigniew Bodek  */
al_eth_rx_buffer_add(struct al_udma_q * rx_dma_q,struct al_buf * buf,uint32_t flags,struct al_buf * header_buf)270349b49cdaSZbigniew Bodek int al_eth_rx_buffer_add(struct al_udma_q *rx_dma_q,
270449b49cdaSZbigniew Bodek 			      struct al_buf *buf, uint32_t flags,
270549b49cdaSZbigniew Bodek 			      struct al_buf *header_buf)
270649b49cdaSZbigniew Bodek {
2707*3fc36ee0SWojciech Macek 	uint64_t tgtid = ((uint64_t)flags & AL_ETH_RX_FLAGS_TGTID_MASK) <<
2708*3fc36ee0SWojciech Macek 		AL_UDMA_DESC_TGTID_SHIFT;
2709*3fc36ee0SWojciech Macek 	uint32_t flags_len = flags & ~AL_ETH_RX_FLAGS_TGTID_MASK;
271049b49cdaSZbigniew Bodek 	union al_udma_desc *rx_desc;
271149b49cdaSZbigniew Bodek 
271249b49cdaSZbigniew Bodek 	al_dbg("[%s %d]: add rx buffer.\n", rx_dma_q->udma->name, rx_dma_q->qid);
271349b49cdaSZbigniew Bodek 
271449b49cdaSZbigniew Bodek #if 1
271549b49cdaSZbigniew Bodek 	if (unlikely(al_udma_available_get(rx_dma_q) < 1)) {
271649b49cdaSZbigniew Bodek 		al_dbg("[%s]: rx q (%d) has no enough free descriptor",
271749b49cdaSZbigniew Bodek 			 rx_dma_q->udma->name, rx_dma_q->qid);
271849b49cdaSZbigniew Bodek 		return -ENOSPC;
271949b49cdaSZbigniew Bodek 	}
272049b49cdaSZbigniew Bodek #endif
272149b49cdaSZbigniew Bodek 	rx_desc = al_udma_desc_get(rx_dma_q);
272249b49cdaSZbigniew Bodek 
272349b49cdaSZbigniew Bodek 	flags_len |= al_udma_ring_id_get(rx_dma_q) << AL_S2M_DESC_RING_ID_SHIFT;
272449b49cdaSZbigniew Bodek 	flags_len |= buf->len & AL_S2M_DESC_LEN_MASK;
272549b49cdaSZbigniew Bodek 
272649b49cdaSZbigniew Bodek 	if (flags & AL_S2M_DESC_DUAL_BUF) {
272749b49cdaSZbigniew Bodek 		al_assert(header_buf != NULL); /*header valid in dual buf */
272849b49cdaSZbigniew Bodek 		al_assert((rx_dma_q->udma->rev_id >= AL_UDMA_REV_ID_2) ||
272949b49cdaSZbigniew Bodek 			(AL_ADDR_HIGH(buf->addr) == AL_ADDR_HIGH(header_buf->addr)));
273049b49cdaSZbigniew Bodek 
273149b49cdaSZbigniew Bodek 		flags_len |= ((header_buf->len >> AL_S2M_DESC_LEN2_GRANULARITY_SHIFT)
273249b49cdaSZbigniew Bodek 			<< AL_S2M_DESC_LEN2_SHIFT) & AL_S2M_DESC_LEN2_MASK;
273349b49cdaSZbigniew Bodek 		rx_desc->rx.buf2_ptr_lo = swap32_to_le(AL_ADDR_LOW(header_buf->addr));
273449b49cdaSZbigniew Bodek 	}
273549b49cdaSZbigniew Bodek 	rx_desc->rx.len_ctrl = swap32_to_le(flags_len);
2736*3fc36ee0SWojciech Macek 	rx_desc->rx.buf1_ptr = swap64_to_le(buf->addr | tgtid);
273749b49cdaSZbigniew Bodek 
273849b49cdaSZbigniew Bodek 	return 0;
273949b49cdaSZbigniew Bodek }
274049b49cdaSZbigniew Bodek 
274149b49cdaSZbigniew Bodek /**
274249b49cdaSZbigniew Bodek  * notify the hw engine about rx descriptors that were added to the receive queue
274349b49cdaSZbigniew Bodek  */
al_eth_rx_buffer_action(struct al_udma_q * rx_dma_q,uint32_t descs_num)274449b49cdaSZbigniew Bodek void al_eth_rx_buffer_action(struct al_udma_q *rx_dma_q, uint32_t descs_num)
274549b49cdaSZbigniew Bodek {
274649b49cdaSZbigniew Bodek 	al_dbg("[%s]: update the rx engine tail pointer: queue %d. descs %d\n",
274749b49cdaSZbigniew Bodek 		 rx_dma_q->udma->name, rx_dma_q->qid, descs_num);
274849b49cdaSZbigniew Bodek 
274949b49cdaSZbigniew Bodek 	/* add rx descriptor */
275049b49cdaSZbigniew Bodek 	al_udma_desc_action_add(rx_dma_q, descs_num);
275149b49cdaSZbigniew Bodek }
275249b49cdaSZbigniew Bodek 
275349b49cdaSZbigniew Bodek /**
275449b49cdaSZbigniew Bodek  * get packet from RX completion ring
275549b49cdaSZbigniew Bodek  */
al_eth_pkt_rx(struct al_udma_q * rx_dma_q,struct al_eth_pkt * pkt)275649b49cdaSZbigniew Bodek uint32_t al_eth_pkt_rx(struct al_udma_q *rx_dma_q,
275749b49cdaSZbigniew Bodek 			      struct al_eth_pkt *pkt)
275849b49cdaSZbigniew Bodek {
275949b49cdaSZbigniew Bodek 	volatile union al_udma_cdesc *cdesc;
276049b49cdaSZbigniew Bodek 	volatile al_eth_rx_cdesc *rx_desc;
276149b49cdaSZbigniew Bodek 	uint32_t i;
276249b49cdaSZbigniew Bodek 	uint32_t rc;
276349b49cdaSZbigniew Bodek 
276449b49cdaSZbigniew Bodek 	rc = al_udma_cdesc_packet_get(rx_dma_q, &cdesc);
276549b49cdaSZbigniew Bodek 	if (rc == 0)
276649b49cdaSZbigniew Bodek 		return 0;
276749b49cdaSZbigniew Bodek 
276849b49cdaSZbigniew Bodek 	al_assert(rc <= AL_ETH_PKT_MAX_BUFS);
276949b49cdaSZbigniew Bodek 
277049b49cdaSZbigniew Bodek 	al_dbg("[%s]: fetch rx packet: queue %d.\n",
277149b49cdaSZbigniew Bodek 		 rx_dma_q->udma->name, rx_dma_q->qid);
277249b49cdaSZbigniew Bodek 
277349b49cdaSZbigniew Bodek 	pkt->rx_header_len = 0;
277449b49cdaSZbigniew Bodek 	for (i = 0; i < rc; i++) {
277549b49cdaSZbigniew Bodek 		uint32_t buf1_len, buf2_len;
277649b49cdaSZbigniew Bodek 
277749b49cdaSZbigniew Bodek 		/* get next descriptor */
277849b49cdaSZbigniew Bodek 		rx_desc = (volatile al_eth_rx_cdesc *)al_cdesc_next(rx_dma_q, cdesc, i);
277949b49cdaSZbigniew Bodek 
278049b49cdaSZbigniew Bodek 		buf1_len = swap32_from_le(rx_desc->len);
278149b49cdaSZbigniew Bodek 
278249b49cdaSZbigniew Bodek 		if ((i == 0) && (swap32_from_le(rx_desc->word2) &
278349b49cdaSZbigniew Bodek 			AL_UDMA_CDESC_BUF2_USED)) {
278449b49cdaSZbigniew Bodek 			buf2_len = swap32_from_le(rx_desc->word2);
278549b49cdaSZbigniew Bodek 			pkt->rx_header_len = (buf2_len & AL_S2M_DESC_LEN2_MASK) >>
278649b49cdaSZbigniew Bodek 			AL_S2M_DESC_LEN2_SHIFT;
278749b49cdaSZbigniew Bodek 			}
278849b49cdaSZbigniew Bodek 		if ((swap32_from_le(rx_desc->ctrl_meta) & AL_UDMA_CDESC_BUF1_USED) &&
278949b49cdaSZbigniew Bodek 			((swap32_from_le(rx_desc->ctrl_meta) & AL_UDMA_CDESC_DDP) == 0))
279049b49cdaSZbigniew Bodek 			pkt->bufs[i].len = buf1_len & AL_S2M_DESC_LEN_MASK;
279149b49cdaSZbigniew Bodek 		else
279249b49cdaSZbigniew Bodek 			pkt->bufs[i].len = 0;
279349b49cdaSZbigniew Bodek 	}
279449b49cdaSZbigniew Bodek 	/* get flags from last desc */
279549b49cdaSZbigniew Bodek 	pkt->flags = swap32_from_le(rx_desc->ctrl_meta);
279649b49cdaSZbigniew Bodek #ifdef AL_ETH_RX_DESC_RAW_GET
279749b49cdaSZbigniew Bodek 	pkt->rx_desc_raw[0] = pkt->flags;
279849b49cdaSZbigniew Bodek 	pkt->rx_desc_raw[1] = swap32_from_le(rx_desc->len);
279949b49cdaSZbigniew Bodek 	pkt->rx_desc_raw[2] = swap32_from_le(rx_desc->word2);
280049b49cdaSZbigniew Bodek 	pkt->rx_desc_raw[3] = swap32_from_le(rx_desc->word3);
280149b49cdaSZbigniew Bodek #endif
280249b49cdaSZbigniew Bodek 	/* update L3/L4 proto index */
280349b49cdaSZbigniew Bodek 	pkt->l3_proto_idx = pkt->flags & AL_ETH_RX_L3_PROTO_IDX_MASK;
280449b49cdaSZbigniew Bodek 	pkt->l4_proto_idx = (pkt->flags >> AL_ETH_RX_L4_PROTO_IDX_SHIFT) &
280549b49cdaSZbigniew Bodek 				AL_ETH_RX_L4_PROTO_IDX_MASK;
280649b49cdaSZbigniew Bodek 	pkt->rxhash = (swap32_from_le(rx_desc->len) & AL_ETH_RX_HASH_MASK) >>
280749b49cdaSZbigniew Bodek 			AL_ETH_RX_HASH_SHIFT;
280849b49cdaSZbigniew Bodek 	pkt->l3_offset = (swap32_from_le(rx_desc->word2) & AL_ETH_RX_L3_OFFSET_MASK) >> AL_ETH_RX_L3_OFFSET_SHIFT;
280949b49cdaSZbigniew Bodek 
281049b49cdaSZbigniew Bodek 	al_udma_cdesc_ack(rx_dma_q, rc);
281149b49cdaSZbigniew Bodek 	return rc;
281249b49cdaSZbigniew Bodek }
281349b49cdaSZbigniew Bodek 
281449b49cdaSZbigniew Bodek 
al_eth_rx_parser_entry_update(struct al_hal_eth_adapter * adapter,uint32_t idx,struct al_eth_epe_p_reg_entry * reg_entry,struct al_eth_epe_control_entry * control_entry)281549b49cdaSZbigniew Bodek int al_eth_rx_parser_entry_update(struct al_hal_eth_adapter *adapter, uint32_t idx,
281649b49cdaSZbigniew Bodek 		struct al_eth_epe_p_reg_entry *reg_entry,
281749b49cdaSZbigniew Bodek 		struct al_eth_epe_control_entry *control_entry)
281849b49cdaSZbigniew Bodek {
281949b49cdaSZbigniew Bodek 	al_eth_epe_entry_set(adapter, idx, reg_entry, control_entry);
282049b49cdaSZbigniew Bodek 	return 0;
282149b49cdaSZbigniew Bodek }
282249b49cdaSZbigniew Bodek 
282349b49cdaSZbigniew Bodek #define AL_ETH_THASH_UDMA_SHIFT		0
282449b49cdaSZbigniew Bodek #define AL_ETH_THASH_UDMA_MASK		(0xF << AL_ETH_THASH_UDMA_SHIFT)
282549b49cdaSZbigniew Bodek 
282649b49cdaSZbigniew Bodek #define AL_ETH_THASH_Q_SHIFT		4
282749b49cdaSZbigniew Bodek #define AL_ETH_THASH_Q_MASK		(0x3 << AL_ETH_THASH_Q_SHIFT)
282849b49cdaSZbigniew Bodek 
al_eth_thash_table_set(struct al_hal_eth_adapter * adapter,uint32_t idx,uint8_t udma,uint32_t queue)282949b49cdaSZbigniew Bodek int al_eth_thash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma, uint32_t queue)
283049b49cdaSZbigniew Bodek {
283149b49cdaSZbigniew Bodek 	uint32_t entry;
283249b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_RX_THASH_TABLE_SIZE); /*valid THASH index*/
283349b49cdaSZbigniew Bodek 
283449b49cdaSZbigniew Bodek 	entry = (udma << AL_ETH_THASH_UDMA_SHIFT) & AL_ETH_THASH_UDMA_MASK;
283549b49cdaSZbigniew Bodek 	entry |= (queue << AL_ETH_THASH_Q_SHIFT) & AL_ETH_THASH_Q_MASK;
283649b49cdaSZbigniew Bodek 
283749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.thash_table_addr, idx);
283849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.thash_table_data, entry);
283949b49cdaSZbigniew Bodek 	return 0;
284049b49cdaSZbigniew Bodek }
284149b49cdaSZbigniew Bodek 
al_eth_fsm_table_set(struct al_hal_eth_adapter * adapter,uint32_t idx,uint32_t entry)284249b49cdaSZbigniew Bodek int al_eth_fsm_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry)
284349b49cdaSZbigniew Bodek {
284449b49cdaSZbigniew Bodek 
284549b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_RX_FSM_TABLE_SIZE); /*valid FSM index*/
284649b49cdaSZbigniew Bodek 
284749b49cdaSZbigniew Bodek 
284849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.fsm_table_addr, idx);
284949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.fsm_table_data, entry);
285049b49cdaSZbigniew Bodek 	return 0;
285149b49cdaSZbigniew Bodek }
285249b49cdaSZbigniew Bodek 
al_eth_fwd_ctrl_entry_to_val(struct al_eth_fwd_ctrl_table_entry * entry)285349b49cdaSZbigniew Bodek static uint32_t	al_eth_fwd_ctrl_entry_to_val(struct al_eth_fwd_ctrl_table_entry *entry)
285449b49cdaSZbigniew Bodek {
285549b49cdaSZbigniew Bodek 	uint32_t val = 0;
285649b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(3,0), 0, entry->prio_sel);
285749b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(7,4), 4, entry->queue_sel_1);
285849b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(9,8), 8, entry->queue_sel_2);
285949b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(13,10), 10, entry->udma_sel);
286049b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(17,15), 15, entry->hdr_split_len_sel);
286149b49cdaSZbigniew Bodek 	if (entry->hdr_split_len_sel != AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_0)
286249b49cdaSZbigniew Bodek 		val |= AL_BIT(18);
286349b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(val, 19, !!(entry->filter == AL_TRUE));
286449b49cdaSZbigniew Bodek 
286549b49cdaSZbigniew Bodek 	return val;
286649b49cdaSZbigniew Bodek }
286749b49cdaSZbigniew Bodek 
al_eth_ctrl_index_match(struct al_eth_fwd_ctrl_table_index * index,uint32_t i)286849b49cdaSZbigniew Bodek static int al_eth_ctrl_index_match(struct al_eth_fwd_ctrl_table_index *index, uint32_t i) {
286949b49cdaSZbigniew Bodek 	if ((index->vlan_table_out != AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_ANY)
287049b49cdaSZbigniew Bodek 		&& (index->vlan_table_out != AL_REG_BIT_GET(i, 0)))
287149b49cdaSZbigniew Bodek 		return 0;
287249b49cdaSZbigniew Bodek 	if ((index->tunnel_exist != AL_ETH_FWD_CTRL_IDX_TUNNEL_ANY)
287349b49cdaSZbigniew Bodek 		&& (index->tunnel_exist != AL_REG_BIT_GET(i, 1)))
287449b49cdaSZbigniew Bodek 		return 0;
287549b49cdaSZbigniew Bodek 	if ((index->vlan_exist != AL_ETH_FWD_CTRL_IDX_VLAN_ANY)
287649b49cdaSZbigniew Bodek 		&& (index->vlan_exist != AL_REG_BIT_GET(i, 2)))
287749b49cdaSZbigniew Bodek 		return 0;
287849b49cdaSZbigniew Bodek 	if ((index->mac_table_match != AL_ETH_FWD_CTRL_IDX_MAC_TABLE_ANY)
287949b49cdaSZbigniew Bodek 		&& (index->mac_table_match != AL_REG_BIT_GET(i, 3)))
288049b49cdaSZbigniew Bodek 		return 0;
288149b49cdaSZbigniew Bodek 	if ((index->protocol_id != AL_ETH_PROTO_ID_ANY)
288249b49cdaSZbigniew Bodek 		&& (index->protocol_id != AL_REG_FIELD_GET(i, AL_FIELD_MASK(8,4),4)))
288349b49cdaSZbigniew Bodek 		return 0;
288449b49cdaSZbigniew Bodek 	if ((index->mac_type != AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_ANY)
288549b49cdaSZbigniew Bodek 		&& (index->mac_type != AL_REG_FIELD_GET(i, AL_FIELD_MASK(10,9),9)))
288649b49cdaSZbigniew Bodek 		return 0;
288749b49cdaSZbigniew Bodek 	return 1;
288849b49cdaSZbigniew Bodek }
288949b49cdaSZbigniew Bodek 
al_eth_ctrl_table_set(struct al_hal_eth_adapter * adapter,struct al_eth_fwd_ctrl_table_index * index,struct al_eth_fwd_ctrl_table_entry * entry)289049b49cdaSZbigniew Bodek int al_eth_ctrl_table_set(struct al_hal_eth_adapter *adapter,
289149b49cdaSZbigniew Bodek 			  struct al_eth_fwd_ctrl_table_index *index,
289249b49cdaSZbigniew Bodek 			  struct al_eth_fwd_ctrl_table_entry *entry)
289349b49cdaSZbigniew Bodek {
289449b49cdaSZbigniew Bodek 	uint32_t val = al_eth_fwd_ctrl_entry_to_val(entry);
289549b49cdaSZbigniew Bodek 	uint32_t i;
289649b49cdaSZbigniew Bodek 
289749b49cdaSZbigniew Bodek 	for (i = 0; i < AL_ETH_RX_CTRL_TABLE_SIZE; i++) {
289849b49cdaSZbigniew Bodek 		if (al_eth_ctrl_index_match(index, i)) {
289949b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_addr, i);
290049b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_data, val);
290149b49cdaSZbigniew Bodek 		}
290249b49cdaSZbigniew Bodek 	}
290349b49cdaSZbigniew Bodek 	return 0;
290449b49cdaSZbigniew Bodek }
290549b49cdaSZbigniew Bodek 
al_eth_ctrl_table_def_set(struct al_hal_eth_adapter * adapter,al_bool use_table,struct al_eth_fwd_ctrl_table_entry * entry)290649b49cdaSZbigniew Bodek int al_eth_ctrl_table_def_set(struct al_hal_eth_adapter *adapter,
290749b49cdaSZbigniew Bodek 			      al_bool use_table,
290849b49cdaSZbigniew Bodek 			      struct al_eth_fwd_ctrl_table_entry *entry)
290949b49cdaSZbigniew Bodek {
291049b49cdaSZbigniew Bodek 	uint32_t val = al_eth_fwd_ctrl_entry_to_val(entry);
291149b49cdaSZbigniew Bodek 
291249b49cdaSZbigniew Bodek 	if (use_table)
291349b49cdaSZbigniew Bodek 		val |= EC_RFW_CTRL_TABLE_DEF_SEL;
291449b49cdaSZbigniew Bodek 
291549b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_def, val);
291649b49cdaSZbigniew Bodek 
291749b49cdaSZbigniew Bodek 	return 0;
291849b49cdaSZbigniew Bodek }
291949b49cdaSZbigniew Bodek 
al_eth_ctrl_table_raw_set(struct al_hal_eth_adapter * adapter,uint32_t idx,uint32_t entry)292049b49cdaSZbigniew Bodek int al_eth_ctrl_table_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry)
292149b49cdaSZbigniew Bodek {
292249b49cdaSZbigniew Bodek 
292349b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_RX_CTRL_TABLE_SIZE); /* valid CTRL index */
292449b49cdaSZbigniew Bodek 
292549b49cdaSZbigniew Bodek 
292649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_addr, idx);
292749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_data, entry);
292849b49cdaSZbigniew Bodek 	return 0;
292949b49cdaSZbigniew Bodek }
293049b49cdaSZbigniew Bodek 
al_eth_ctrl_table_def_raw_set(struct al_hal_eth_adapter * adapter,uint32_t val)293149b49cdaSZbigniew Bodek int al_eth_ctrl_table_def_raw_set(struct al_hal_eth_adapter *adapter, uint32_t val)
293249b49cdaSZbigniew Bodek {
293349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_def, val);
293449b49cdaSZbigniew Bodek 
293549b49cdaSZbigniew Bodek 	return 0;
293649b49cdaSZbigniew Bodek }
293749b49cdaSZbigniew Bodek 
al_eth_hash_key_set(struct al_hal_eth_adapter * adapter,uint32_t idx,uint32_t val)293849b49cdaSZbigniew Bodek int al_eth_hash_key_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t val)
293949b49cdaSZbigniew Bodek {
294049b49cdaSZbigniew Bodek 
294149b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_RX_HASH_KEY_NUM); /*valid CTRL index*/
294249b49cdaSZbigniew Bodek 
294349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_hash[idx].key, val);
294449b49cdaSZbigniew Bodek 
294549b49cdaSZbigniew Bodek 	return 0;
294649b49cdaSZbigniew Bodek }
294749b49cdaSZbigniew Bodek 
al_eth_fwd_mac_table_entry_to_val(struct al_eth_fwd_mac_table_entry * entry)294849b49cdaSZbigniew Bodek static uint32_t	al_eth_fwd_mac_table_entry_to_val(struct al_eth_fwd_mac_table_entry *entry)
294949b49cdaSZbigniew Bodek {
295049b49cdaSZbigniew Bodek 	uint32_t val = 0;
295149b49cdaSZbigniew Bodek 
295249b49cdaSZbigniew Bodek 	val |= (entry->filter == AL_TRUE) ? EC_FWD_MAC_CTRL_RX_VAL_DROP : 0;
295349b49cdaSZbigniew Bodek 	val |= ((entry->udma_mask << EC_FWD_MAC_CTRL_RX_VAL_UDMA_SHIFT) &
295449b49cdaSZbigniew Bodek 					EC_FWD_MAC_CTRL_RX_VAL_UDMA_MASK);
295549b49cdaSZbigniew Bodek 
295649b49cdaSZbigniew Bodek 	val |= ((entry->qid << EC_FWD_MAC_CTRL_RX_VAL_QID_SHIFT) &
295749b49cdaSZbigniew Bodek 					EC_FWD_MAC_CTRL_RX_VAL_QID_MASK);
295849b49cdaSZbigniew Bodek 
295949b49cdaSZbigniew Bodek 	val |= (entry->rx_valid == AL_TRUE) ? EC_FWD_MAC_CTRL_RX_VALID : 0;
296049b49cdaSZbigniew Bodek 
296149b49cdaSZbigniew Bodek 	val |= ((entry->tx_target << EC_FWD_MAC_CTRL_TX_VAL_SHIFT) &
296249b49cdaSZbigniew Bodek 					EC_FWD_MAC_CTRL_TX_VAL_MASK);
296349b49cdaSZbigniew Bodek 
296449b49cdaSZbigniew Bodek 	val |= (entry->tx_valid == AL_TRUE) ? EC_FWD_MAC_CTRL_TX_VALID : 0;
296549b49cdaSZbigniew Bodek 
296649b49cdaSZbigniew Bodek 	return val;
296749b49cdaSZbigniew Bodek }
296849b49cdaSZbigniew Bodek 
al_eth_fwd_mac_table_set(struct al_hal_eth_adapter * adapter,uint32_t idx,struct al_eth_fwd_mac_table_entry * entry)296949b49cdaSZbigniew Bodek int al_eth_fwd_mac_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
297049b49cdaSZbigniew Bodek 			     struct al_eth_fwd_mac_table_entry *entry)
297149b49cdaSZbigniew Bodek {
297249b49cdaSZbigniew Bodek 	uint32_t val;
297349b49cdaSZbigniew Bodek 
297449b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_FWD_MAC_NUM); /*valid FWD MAC index */
297549b49cdaSZbigniew Bodek 
297649b49cdaSZbigniew Bodek 	val = (entry->addr[2] << 24) | (entry->addr[3] << 16) |
297749b49cdaSZbigniew Bodek 	      (entry->addr[4] << 8) | entry->addr[5];
297849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].data_l, val);
297949b49cdaSZbigniew Bodek 	val = (entry->addr[0] << 8) | entry->addr[1];
298049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].data_h, val);
298149b49cdaSZbigniew Bodek 	val = (entry->mask[2] << 24) | (entry->mask[3] << 16) |
298249b49cdaSZbigniew Bodek 	      (entry->mask[4] << 8) | entry->mask[5];
298349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].mask_l, val);
298449b49cdaSZbigniew Bodek 	val = (entry->mask[0] << 8) | entry->mask[1];
298549b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].mask_h, val);
298649b49cdaSZbigniew Bodek 
298749b49cdaSZbigniew Bodek 	val = al_eth_fwd_mac_table_entry_to_val(entry);
298849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].ctrl, val);
298949b49cdaSZbigniew Bodek 	return 0;
299049b49cdaSZbigniew Bodek }
299149b49cdaSZbigniew Bodek 
299249b49cdaSZbigniew Bodek 
299349b49cdaSZbigniew Bodek 
al_eth_fwd_mac_addr_raw_set(struct al_hal_eth_adapter * adapter,uint32_t idx,uint32_t addr_lo,uint32_t addr_hi,uint32_t mask_lo,uint32_t mask_hi)299449b49cdaSZbigniew Bodek int al_eth_fwd_mac_addr_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t addr_lo, uint32_t addr_hi, uint32_t mask_lo, uint32_t mask_hi)
299549b49cdaSZbigniew Bodek {
299649b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_FWD_MAC_NUM); /*valid FWD MAC index */
299749b49cdaSZbigniew Bodek 
299849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].data_l, addr_lo);
299949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].data_h, addr_hi);
300049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].mask_l, mask_lo);
300149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].mask_h, mask_hi);
300249b49cdaSZbigniew Bodek 
300349b49cdaSZbigniew Bodek 	return 0;
300449b49cdaSZbigniew Bodek }
300549b49cdaSZbigniew Bodek 
al_eth_fwd_mac_ctrl_raw_set(struct al_hal_eth_adapter * adapter,uint32_t idx,uint32_t ctrl)300649b49cdaSZbigniew Bodek int al_eth_fwd_mac_ctrl_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t ctrl)
300749b49cdaSZbigniew Bodek {
300849b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_FWD_MAC_NUM); /*valid FWD MAC index */
300949b49cdaSZbigniew Bodek 
301049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].ctrl, ctrl);
301149b49cdaSZbigniew Bodek 
301249b49cdaSZbigniew Bodek 	return 0;
301349b49cdaSZbigniew Bodek }
301449b49cdaSZbigniew Bodek 
al_eth_mac_addr_store(void * __iomem ec_base,uint32_t idx,uint8_t * addr)301549b49cdaSZbigniew Bodek int al_eth_mac_addr_store(void * __iomem ec_base, uint32_t idx, uint8_t *addr)
301649b49cdaSZbigniew Bodek {
301749b49cdaSZbigniew Bodek 	struct al_ec_regs __iomem *ec_regs_base = (struct al_ec_regs __iomem*)ec_base;
301849b49cdaSZbigniew Bodek 	uint32_t val;
301949b49cdaSZbigniew Bodek 
302049b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_FWD_MAC_NUM); /*valid FWD MAC index */
302149b49cdaSZbigniew Bodek 
302249b49cdaSZbigniew Bodek 	val = (addr[2] << 24) | (addr[3] << 16) | (addr[4] << 8) | addr[5];
302349b49cdaSZbigniew Bodek 	al_reg_write32(&ec_regs_base->fwd_mac[idx].data_l, val);
302449b49cdaSZbigniew Bodek 	val = (addr[0] << 8) | addr[1];
302549b49cdaSZbigniew Bodek 	al_reg_write32(&ec_regs_base->fwd_mac[idx].data_h, val);
302649b49cdaSZbigniew Bodek 	return 0;
302749b49cdaSZbigniew Bodek }
302849b49cdaSZbigniew Bodek 
al_eth_mac_addr_read(void * __iomem ec_base,uint32_t idx,uint8_t * addr)302949b49cdaSZbigniew Bodek int al_eth_mac_addr_read(void * __iomem ec_base, uint32_t idx, uint8_t *addr)
303049b49cdaSZbigniew Bodek {
303149b49cdaSZbigniew Bodek 	struct al_ec_regs __iomem *ec_regs_base = (struct al_ec_regs __iomem*)ec_base;
303249b49cdaSZbigniew Bodek 	uint32_t addr_lo = al_reg_read32(&ec_regs_base->fwd_mac[idx].data_l);
303349b49cdaSZbigniew Bodek 	uint16_t addr_hi = al_reg_read32(&ec_regs_base->fwd_mac[idx].data_h);
303449b49cdaSZbigniew Bodek 
303549b49cdaSZbigniew Bodek 	addr[5] = addr_lo & 0xff;
303649b49cdaSZbigniew Bodek 	addr[4] = (addr_lo >> 8) & 0xff;
303749b49cdaSZbigniew Bodek 	addr[3] = (addr_lo >> 16) & 0xff;
303849b49cdaSZbigniew Bodek 	addr[2] = (addr_lo >> 24) & 0xff;
303949b49cdaSZbigniew Bodek 	addr[1] = addr_hi & 0xff;
304049b49cdaSZbigniew Bodek 	addr[0] = (addr_hi >> 8) & 0xff;
304149b49cdaSZbigniew Bodek 	return 0;
304249b49cdaSZbigniew Bodek }
304349b49cdaSZbigniew Bodek 
al_eth_fwd_mhash_table_set(struct al_hal_eth_adapter * adapter,uint32_t idx,uint8_t udma_mask,uint8_t qid)304449b49cdaSZbigniew Bodek int al_eth_fwd_mhash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma_mask, uint8_t qid)
304549b49cdaSZbigniew Bodek {
304649b49cdaSZbigniew Bodek 	uint32_t val = 0;
304749b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_FWD_MAC_HASH_NUM); /* valid MHASH index */
304849b49cdaSZbigniew Bodek 
304949b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(3,0), 0, udma_mask);
305049b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(val,  AL_FIELD_MASK(5,4), 4, qid);
305149b49cdaSZbigniew Bodek 
305249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.mhash_table_addr, idx);
305349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.mhash_table_data, val);
305449b49cdaSZbigniew Bodek 	return 0;
305549b49cdaSZbigniew Bodek }
al_eth_fwd_vid_entry_to_val(struct al_eth_fwd_vid_table_entry * entry)305649b49cdaSZbigniew Bodek static uint32_t	al_eth_fwd_vid_entry_to_val(struct al_eth_fwd_vid_table_entry *entry)
305749b49cdaSZbigniew Bodek {
305849b49cdaSZbigniew Bodek 	uint32_t val = 0;
305949b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(val, 0, entry->control);
306049b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(val, 1, entry->filter);
306149b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(val, AL_FIELD_MASK(5,2), 2, entry->udma_mask);
306249b49cdaSZbigniew Bodek 
306349b49cdaSZbigniew Bodek 	return val;
306449b49cdaSZbigniew Bodek }
306549b49cdaSZbigniew Bodek 
al_eth_fwd_vid_config_set(struct al_hal_eth_adapter * adapter,al_bool use_table,struct al_eth_fwd_vid_table_entry * default_entry,uint32_t default_vlan)306649b49cdaSZbigniew Bodek int al_eth_fwd_vid_config_set(struct al_hal_eth_adapter *adapter, al_bool use_table,
306749b49cdaSZbigniew Bodek 			      struct al_eth_fwd_vid_table_entry *default_entry,
306849b49cdaSZbigniew Bodek 			      uint32_t default_vlan)
306949b49cdaSZbigniew Bodek {
307049b49cdaSZbigniew Bodek 	uint32_t reg;
307149b49cdaSZbigniew Bodek 
307249b49cdaSZbigniew Bodek 	reg = al_eth_fwd_vid_entry_to_val(default_entry);
307349b49cdaSZbigniew Bodek 	if (use_table)
307449b49cdaSZbigniew Bodek 		reg |= EC_RFW_VID_TABLE_DEF_SEL;
307549b49cdaSZbigniew Bodek 	else
307649b49cdaSZbigniew Bodek 		reg &= ~EC_RFW_VID_TABLE_DEF_SEL;
307749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_def, reg);
307849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.default_vlan, default_vlan);
307949b49cdaSZbigniew Bodek 
308049b49cdaSZbigniew Bodek 	return 0;
308149b49cdaSZbigniew Bodek }
308249b49cdaSZbigniew Bodek 
al_eth_fwd_vid_table_set(struct al_hal_eth_adapter * adapter,uint32_t idx,struct al_eth_fwd_vid_table_entry * entry)308349b49cdaSZbigniew Bodek int al_eth_fwd_vid_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
308449b49cdaSZbigniew Bodek 			     struct al_eth_fwd_vid_table_entry *entry)
308549b49cdaSZbigniew Bodek {
308649b49cdaSZbigniew Bodek 	uint32_t val;
308749b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_FWD_VID_TABLE_NUM); /* valid VID index */
308849b49cdaSZbigniew Bodek 
308949b49cdaSZbigniew Bodek 	val = al_eth_fwd_vid_entry_to_val(entry);
309049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_addr, idx);
309149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_data, val);
309249b49cdaSZbigniew Bodek 	return 0;
309349b49cdaSZbigniew Bodek }
309449b49cdaSZbigniew Bodek 
al_eth_fwd_pbits_table_set(struct al_hal_eth_adapter * adapter,uint32_t idx,uint8_t prio)309549b49cdaSZbigniew Bodek int al_eth_fwd_pbits_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio)
309649b49cdaSZbigniew Bodek {
309749b49cdaSZbigniew Bodek 
309849b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_FWD_PBITS_TABLE_NUM); /* valid PBIT index */
309949b49cdaSZbigniew Bodek 	al_assert(prio < AL_ETH_FWD_PRIO_TABLE_NUM); /* valid PRIO index */
310049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.pbits_table_addr, idx);
310149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.pbits_table_data, prio);
310249b49cdaSZbigniew Bodek 	return 0;
310349b49cdaSZbigniew Bodek }
310449b49cdaSZbigniew Bodek 
al_eth_fwd_priority_table_set(struct al_hal_eth_adapter * adapter,uint8_t prio,uint8_t qid)310549b49cdaSZbigniew Bodek int al_eth_fwd_priority_table_set(struct al_hal_eth_adapter *adapter, uint8_t prio, uint8_t qid)
310649b49cdaSZbigniew Bodek {
310749b49cdaSZbigniew Bodek 	al_assert(prio < AL_ETH_FWD_PRIO_TABLE_NUM); /* valid PRIO index */
310849b49cdaSZbigniew Bodek 
310949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_priority[prio].queue, qid);
311049b49cdaSZbigniew Bodek 	return 0;
311149b49cdaSZbigniew Bodek }
311249b49cdaSZbigniew Bodek 
311349b49cdaSZbigniew Bodek 
al_eth_fwd_dscp_table_set(struct al_hal_eth_adapter * adapter,uint32_t idx,uint8_t prio)311449b49cdaSZbigniew Bodek int al_eth_fwd_dscp_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio)
311549b49cdaSZbigniew Bodek {
311649b49cdaSZbigniew Bodek 
311749b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_FWD_DSCP_TABLE_NUM); /* valid DSCP index */
311849b49cdaSZbigniew Bodek 
311949b49cdaSZbigniew Bodek 
312049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.dscp_table_addr, idx);
312149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.dscp_table_data, prio);
312249b49cdaSZbigniew Bodek 	return 0;
312349b49cdaSZbigniew Bodek }
312449b49cdaSZbigniew Bodek 
al_eth_fwd_tc_table_set(struct al_hal_eth_adapter * adapter,uint32_t idx,uint8_t prio)312549b49cdaSZbigniew Bodek int al_eth_fwd_tc_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio)
312649b49cdaSZbigniew Bodek {
312749b49cdaSZbigniew Bodek 
312849b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_FWD_TC_TABLE_NUM); /* valid TC index */
312949b49cdaSZbigniew Bodek 
313049b49cdaSZbigniew Bodek 
313149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.tc_table_addr, idx);
313249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.tc_table_data, prio);
313349b49cdaSZbigniew Bodek 	return 0;
313449b49cdaSZbigniew Bodek }
313549b49cdaSZbigniew Bodek 
313649b49cdaSZbigniew Bodek /** Configure default UDMA register */
al_eth_fwd_default_udma_config(struct al_hal_eth_adapter * adapter,uint32_t idx,uint8_t udma_mask)313749b49cdaSZbigniew Bodek int al_eth_fwd_default_udma_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
313849b49cdaSZbigniew Bodek 				   uint8_t udma_mask)
313949b49cdaSZbigniew Bodek {
314049b49cdaSZbigniew Bodek 	al_reg_write32_masked(&adapter->ec_regs_base->rfw_default[idx].opt_1,
314149b49cdaSZbigniew Bodek 			       EC_RFW_DEFAULT_OPT_1_UDMA_MASK,
314249b49cdaSZbigniew Bodek 			       udma_mask << EC_RFW_DEFAULT_OPT_1_UDMA_SHIFT);
314349b49cdaSZbigniew Bodek 	return 0;
314449b49cdaSZbigniew Bodek }
314549b49cdaSZbigniew Bodek 
314649b49cdaSZbigniew Bodek /** Configure default queue register */
al_eth_fwd_default_queue_config(struct al_hal_eth_adapter * adapter,uint32_t idx,uint8_t qid)314749b49cdaSZbigniew Bodek int al_eth_fwd_default_queue_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
314849b49cdaSZbigniew Bodek 				   uint8_t qid)
314949b49cdaSZbigniew Bodek {
315049b49cdaSZbigniew Bodek 	al_reg_write32_masked(&adapter->ec_regs_base->rfw_default[idx].opt_1,
315149b49cdaSZbigniew Bodek 			       EC_RFW_DEFAULT_OPT_1_QUEUE_MASK,
315249b49cdaSZbigniew Bodek 			       qid << EC_RFW_DEFAULT_OPT_1_QUEUE_SHIFT);
315349b49cdaSZbigniew Bodek 	return 0;
315449b49cdaSZbigniew Bodek }
315549b49cdaSZbigniew Bodek 
315649b49cdaSZbigniew Bodek /** Configure default priority register */
al_eth_fwd_default_priority_config(struct al_hal_eth_adapter * adapter,uint32_t idx,uint8_t prio)315749b49cdaSZbigniew Bodek int al_eth_fwd_default_priority_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
315849b49cdaSZbigniew Bodek 				   uint8_t prio)
315949b49cdaSZbigniew Bodek {
316049b49cdaSZbigniew Bodek 	al_reg_write32_masked(&adapter->ec_regs_base->rfw_default[idx].opt_1,
316149b49cdaSZbigniew Bodek 			       EC_RFW_DEFAULT_OPT_1_PRIORITY_MASK,
316249b49cdaSZbigniew Bodek 			       prio << EC_RFW_DEFAULT_OPT_1_PRIORITY_SHIFT);
316349b49cdaSZbigniew Bodek 	return 0;
316449b49cdaSZbigniew Bodek }
316549b49cdaSZbigniew Bodek 
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,enum al_eth_tx_switch_vid_sel_type vid_sel_type,enum al_eth_tx_switch_dec_type uc_dec,enum al_eth_tx_switch_dec_type mc_dec,enum al_eth_tx_switch_dec_type bc_dec)316649b49cdaSZbigniew 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,
316749b49cdaSZbigniew Bodek 					enum al_eth_tx_switch_vid_sel_type vid_sel_type,
316849b49cdaSZbigniew Bodek 					enum al_eth_tx_switch_dec_type uc_dec,
316949b49cdaSZbigniew Bodek 					enum al_eth_tx_switch_dec_type mc_dec,
317049b49cdaSZbigniew Bodek 					enum al_eth_tx_switch_dec_type bc_dec)
317149b49cdaSZbigniew Bodek {
317249b49cdaSZbigniew Bodek 	uint32_t reg;
317349b49cdaSZbigniew Bodek 
317449b49cdaSZbigniew Bodek 	if (udma_id == 0) {
317549b49cdaSZbigniew Bodek 		reg = al_reg_read32(&adapter->ec_regs_base->tfw.tx_gen);
317649b49cdaSZbigniew Bodek 		if (forward_all_to_mac)
317749b49cdaSZbigniew Bodek 			reg |= EC_TFW_TX_GEN_FWD_ALL_TO_MAC;
317849b49cdaSZbigniew Bodek 		else
317949b49cdaSZbigniew Bodek 			reg &= ~EC_TFW_TX_GEN_FWD_ALL_TO_MAC;
318049b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->tfw.tx_gen, reg);
318149b49cdaSZbigniew Bodek 	}
318249b49cdaSZbigniew Bodek 
318349b49cdaSZbigniew Bodek 	reg = enable_int_switching;
318449b49cdaSZbigniew Bodek 	reg |= (vid_sel_type & 7) << 1;
318549b49cdaSZbigniew Bodek 	reg |= (bc_dec & 3) << 4;
318649b49cdaSZbigniew Bodek 	reg |= (mc_dec & 3) << 6;
318749b49cdaSZbigniew Bodek 	reg |= (uc_dec & 3) << 8;
318849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_udma[udma_id].fwd_dec, reg);
318949b49cdaSZbigniew Bodek 
319049b49cdaSZbigniew Bodek 	return 0;
319149b49cdaSZbigniew Bodek }
319249b49cdaSZbigniew Bodek 
319349b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_SUPPORTED(rev_id)	\
319449b49cdaSZbigniew Bodek 	(AL_ETH_RFW_FILTER_UNDET_MAC | \
319549b49cdaSZbigniew Bodek 	AL_ETH_RFW_FILTER_DET_MAC | \
319649b49cdaSZbigniew Bodek 	AL_ETH_RFW_FILTER_TAGGED | \
319749b49cdaSZbigniew Bodek 	AL_ETH_RFW_FILTER_UNTAGGED | \
319849b49cdaSZbigniew Bodek 	AL_ETH_RFW_FILTER_BC | \
319949b49cdaSZbigniew Bodek 	AL_ETH_RFW_FILTER_MC | \
320049b49cdaSZbigniew Bodek 	AL_ETH_RFW_FILTER_VLAN_VID | \
320149b49cdaSZbigniew Bodek 	AL_ETH_RFW_FILTER_CTRL_TABLE | \
320249b49cdaSZbigniew Bodek 	AL_ETH_RFW_FILTER_PROT_INDEX | \
3203*3fc36ee0SWojciech Macek 	AL_ETH_RFW_FILTER_WOL | \
3204*3fc36ee0SWojciech Macek 	AL_ETH_RFW_FILTER_PARSE)
320549b49cdaSZbigniew Bodek 
320649b49cdaSZbigniew Bodek /* Configure the receive filters */
al_eth_filter_config(struct al_hal_eth_adapter * adapter,struct al_eth_filter_params * params)320749b49cdaSZbigniew Bodek int al_eth_filter_config(struct al_hal_eth_adapter *adapter, struct al_eth_filter_params *params)
320849b49cdaSZbigniew Bodek {
320949b49cdaSZbigniew Bodek 	uint32_t reg;
321049b49cdaSZbigniew Bodek 
321149b49cdaSZbigniew Bodek 	al_assert(params); /* valid params pointer */
321249b49cdaSZbigniew Bodek 
321349b49cdaSZbigniew Bodek 	if (params->filters & ~(AL_ETH_RFW_FILTER_SUPPORTED(adapter->rev_id))) {
321449b49cdaSZbigniew Bodek 		al_err("[%s]: unsupported filter options (0x%08x)\n", adapter->name, params->filters);
321549b49cdaSZbigniew Bodek 		return -EINVAL;
321649b49cdaSZbigniew Bodek 	}
321749b49cdaSZbigniew Bodek 
321849b49cdaSZbigniew Bodek 	reg = al_reg_read32(&adapter->ec_regs_base->rfw.out_cfg);
321949b49cdaSZbigniew Bodek 	if (params->enable == AL_TRUE)
322049b49cdaSZbigniew Bodek 		AL_REG_MASK_SET(reg, EC_RFW_OUT_CFG_DROP_EN);
322149b49cdaSZbigniew Bodek 	else
322249b49cdaSZbigniew Bodek 		AL_REG_MASK_CLEAR(reg, EC_RFW_OUT_CFG_DROP_EN);
322349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.out_cfg, reg);
322449b49cdaSZbigniew Bodek 
322549b49cdaSZbigniew Bodek 	al_reg_write32_masked(
322649b49cdaSZbigniew Bodek 		&adapter->ec_regs_base->rfw.filter,
322749b49cdaSZbigniew Bodek 		AL_ETH_RFW_FILTER_SUPPORTED(adapter->rev_id),
322849b49cdaSZbigniew Bodek 		params->filters);
322949b49cdaSZbigniew Bodek 	if (params->filters & AL_ETH_RFW_FILTER_PROT_INDEX) {
323049b49cdaSZbigniew Bodek 		int i;
323149b49cdaSZbigniew Bodek 		for (i = 0; i < AL_ETH_PROTOCOLS_NUM; i++) {
323249b49cdaSZbigniew Bodek 			reg = al_reg_read32(&adapter->ec_regs_base->epe_a[i].prot_act);
323349b49cdaSZbigniew Bodek 			if (params->filter_proto[i] == AL_TRUE)
323449b49cdaSZbigniew Bodek 				AL_REG_MASK_SET(reg, EC_EPE_A_PROT_ACT_DROP);
323549b49cdaSZbigniew Bodek 			else
323649b49cdaSZbigniew Bodek 				AL_REG_MASK_CLEAR(reg, EC_EPE_A_PROT_ACT_DROP);
323749b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->epe_a[i].prot_act, reg);
323849b49cdaSZbigniew Bodek 		}
323949b49cdaSZbigniew Bodek 	}
324049b49cdaSZbigniew Bodek 	return 0;
324149b49cdaSZbigniew Bodek }
324249b49cdaSZbigniew Bodek 
324349b49cdaSZbigniew Bodek /* Configure the receive override filters */
al_eth_filter_override_config(struct al_hal_eth_adapter * adapter,struct al_eth_filter_override_params * params)324449b49cdaSZbigniew Bodek int al_eth_filter_override_config(struct al_hal_eth_adapter *adapter,
324549b49cdaSZbigniew Bodek 				  struct al_eth_filter_override_params *params)
324649b49cdaSZbigniew Bodek {
324749b49cdaSZbigniew Bodek 	uint32_t reg;
324849b49cdaSZbigniew Bodek 
324949b49cdaSZbigniew Bodek 	al_assert(params); /* valid params pointer */
325049b49cdaSZbigniew Bodek 
325149b49cdaSZbigniew Bodek 	if (params->filters & ~(AL_ETH_RFW_FILTER_SUPPORTED(adapter->rev_id))) {
325249b49cdaSZbigniew Bodek 		al_err("[%s]: unsupported override filter options (0x%08x)\n", adapter->name, params->filters);
325349b49cdaSZbigniew Bodek 		return -EINVAL;
325449b49cdaSZbigniew Bodek 	}
325549b49cdaSZbigniew Bodek 
325649b49cdaSZbigniew Bodek 	al_reg_write32_masked(
325749b49cdaSZbigniew Bodek 		&adapter->ec_regs_base->rfw.filter,
325849b49cdaSZbigniew Bodek 		AL_ETH_RFW_FILTER_SUPPORTED(adapter->rev_id) << 16,
325949b49cdaSZbigniew Bodek 		params->filters << 16);
326049b49cdaSZbigniew Bodek 
326149b49cdaSZbigniew Bodek 	reg = al_reg_read32(&adapter->ec_regs_base->rfw.default_or);
326249b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, EC_RFW_DEFAULT_OR_UDMA_MASK, EC_RFW_DEFAULT_OR_UDMA_SHIFT, params->udma);
326349b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, EC_RFW_DEFAULT_OR_QUEUE_MASK, EC_RFW_DEFAULT_OR_QUEUE_SHIFT, params->qid);
326449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw.default_or, reg);
326549b49cdaSZbigniew Bodek 	return 0;
326649b49cdaSZbigniew Bodek }
326749b49cdaSZbigniew Bodek 
326849b49cdaSZbigniew Bodek 
326949b49cdaSZbigniew Bodek 
al_eth_switching_default_bitmap_set(struct al_hal_eth_adapter * adapter,uint8_t udma_id,uint8_t udma_uc_bitmask,uint8_t udma_mc_bitmask,uint8_t udma_bc_bitmask)327049b49cdaSZbigniew Bodek int al_eth_switching_default_bitmap_set(struct al_hal_eth_adapter *adapter, uint8_t udma_id, uint8_t udma_uc_bitmask,
327149b49cdaSZbigniew Bodek 						uint8_t udma_mc_bitmask,uint8_t udma_bc_bitmask)
327249b49cdaSZbigniew Bodek {
327349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_udma[udma_id].uc_udma, udma_uc_bitmask);
327449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_udma[udma_id].mc_udma, udma_mc_bitmask);
327549b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_udma[udma_id].bc_udma, udma_bc_bitmask);
327649b49cdaSZbigniew Bodek 
327749b49cdaSZbigniew Bodek 	return 0;
327849b49cdaSZbigniew Bodek }
327949b49cdaSZbigniew Bodek 
al_eth_flow_control_config(struct al_hal_eth_adapter * adapter,struct al_eth_flow_control_params * params)328049b49cdaSZbigniew Bodek int al_eth_flow_control_config(struct al_hal_eth_adapter *adapter, struct al_eth_flow_control_params *params)
328149b49cdaSZbigniew Bodek {
328249b49cdaSZbigniew Bodek 	uint32_t reg;
328349b49cdaSZbigniew Bodek 	int i;
328449b49cdaSZbigniew Bodek 	al_assert(params); /* valid params pointer */
328549b49cdaSZbigniew Bodek 
328649b49cdaSZbigniew Bodek 	switch(params->type){
328749b49cdaSZbigniew Bodek 	case AL_ETH_FLOW_CONTROL_TYPE_LINK_PAUSE:
328849b49cdaSZbigniew Bodek 		al_dbg("[%s]: config flow control to link pause mode.\n", adapter->name);
328949b49cdaSZbigniew Bodek 
329049b49cdaSZbigniew Bodek 		/* config the mac */
329149b49cdaSZbigniew Bodek 		if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
329249b49cdaSZbigniew Bodek 			/* set quanta value */
329349b49cdaSZbigniew Bodek 			al_reg_write32(
329449b49cdaSZbigniew Bodek 				&adapter->mac_regs_base->mac_1g.pause_quant,
329549b49cdaSZbigniew Bodek 				params->quanta);
329649b49cdaSZbigniew Bodek 			al_reg_write32(
329749b49cdaSZbigniew Bodek 				&adapter->ec_regs_base->efc.xoff_timer_1g,
329849b49cdaSZbigniew Bodek 				params->quanta_th);
329949b49cdaSZbigniew Bodek 
330049b49cdaSZbigniew Bodek 		} else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
330149b49cdaSZbigniew Bodek 			/* set quanta value */
330249b49cdaSZbigniew Bodek 			al_reg_write32(
330349b49cdaSZbigniew Bodek 				&adapter->mac_regs_base->mac_10g.cl01_pause_quanta,
330449b49cdaSZbigniew Bodek 				params->quanta);
330549b49cdaSZbigniew Bodek 			/* set quanta threshold value */
330649b49cdaSZbigniew Bodek 			al_reg_write32(
330749b49cdaSZbigniew Bodek 				&adapter->mac_regs_base->mac_10g.cl01_quanta_thresh,
330849b49cdaSZbigniew Bodek 				params->quanta_th);
330949b49cdaSZbigniew Bodek 		} else {
331049b49cdaSZbigniew Bodek 			/* set quanta value */
331149b49cdaSZbigniew Bodek 			al_eth_40g_mac_reg_write(adapter,
331249b49cdaSZbigniew Bodek 				ETH_MAC_GEN_V3_MAC_40G_CL01_PAUSE_QUANTA_ADDR,
331349b49cdaSZbigniew Bodek 				params->quanta);
331449b49cdaSZbigniew Bodek 			/* set quanta threshold value */
331549b49cdaSZbigniew Bodek 			al_eth_40g_mac_reg_write(adapter,
331649b49cdaSZbigniew Bodek 				ETH_MAC_GEN_V3_MAC_40G_CL01_QUANTA_THRESH_ADDR,
331749b49cdaSZbigniew Bodek 				params->quanta_th);
331849b49cdaSZbigniew Bodek 		}
331949b49cdaSZbigniew Bodek 
332049b49cdaSZbigniew Bodek 		if (params->obay_enable == AL_TRUE)
332149b49cdaSZbigniew Bodek 			/* Tx path FIFO, unmask pause_on from MAC when PAUSE packet received */
332249b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->efc.ec_pause, 1);
332349b49cdaSZbigniew Bodek 		else
332449b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->efc.ec_pause, 0);
332549b49cdaSZbigniew Bodek 
332649b49cdaSZbigniew Bodek 
332749b49cdaSZbigniew Bodek 		/* Rx path */
332849b49cdaSZbigniew Bodek 		if (params->gen_enable == AL_TRUE)
332949b49cdaSZbigniew Bodek 			/* enable generating xoff from ec fifo almost full indication in hysteresis mode */
333049b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->efc.ec_xoff, 1 << EC_EFC_EC_XOFF_MASK_2_SHIFT);
333149b49cdaSZbigniew Bodek 		else
333249b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->efc.ec_xoff, 0);
333349b49cdaSZbigniew Bodek 
333449b49cdaSZbigniew Bodek 		if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
333549b49cdaSZbigniew Bodek 			/* in 1G mode, enable generating xon from ec fifo in hysteresis mode*/
333649b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->efc.xon, EC_EFC_XON_MASK_2 | EC_EFC_XON_MASK_1);
333749b49cdaSZbigniew Bodek 
333849b49cdaSZbigniew Bodek 		/* set hysteresis mode thresholds */
333949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->efc.rx_fifo_hyst, params->rx_fifo_th_low | (params->rx_fifo_th_high << EC_EFC_RX_FIFO_HYST_TH_HIGH_SHIFT));
334049b49cdaSZbigniew Bodek 
334149b49cdaSZbigniew Bodek 		for (i = 0; i < 4; i++) {
334249b49cdaSZbigniew Bodek 			if (params->obay_enable == AL_TRUE)
334349b49cdaSZbigniew Bodek 				/* Tx path UDMA, unmask pause_on for all queues */
334449b49cdaSZbigniew Bodek 				al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_pause_0,
334549b49cdaSZbigniew Bodek 						params->prio_q_map[i][0]);
334649b49cdaSZbigniew Bodek 			else
334749b49cdaSZbigniew Bodek 				al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_pause_0, 0);
334849b49cdaSZbigniew Bodek 
334949b49cdaSZbigniew Bodek 			if (params->gen_enable == AL_TRUE)
335049b49cdaSZbigniew Bodek 				/* Rx path UDMA, enable generating xoff from UDMA queue almost full indication */
335149b49cdaSZbigniew Bodek 				al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_xoff_0, params->prio_q_map[i][0]);
335249b49cdaSZbigniew Bodek 			else
335349b49cdaSZbigniew Bodek 				al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_xoff_0, 0);
335449b49cdaSZbigniew Bodek 		}
335549b49cdaSZbigniew Bodek 	break;
335649b49cdaSZbigniew Bodek 	case AL_ETH_FLOW_CONTROL_TYPE_PFC:
335749b49cdaSZbigniew Bodek 		al_dbg("[%s]: config flow control to PFC mode.\n", adapter->name);
335849b49cdaSZbigniew Bodek 		al_assert(!AL_ETH_IS_1G_MAC(adapter->mac_mode)); /* pfc not available for RGMII mode */;
335949b49cdaSZbigniew Bodek 
336049b49cdaSZbigniew Bodek 		for (i = 0; i < 4; i++) {
336149b49cdaSZbigniew Bodek 			int prio;
336249b49cdaSZbigniew Bodek 			for (prio = 0; prio < 8; prio++) {
336349b49cdaSZbigniew Bodek 				if (params->obay_enable == AL_TRUE)
336449b49cdaSZbigniew Bodek 					/* Tx path UDMA, unmask pause_on for all queues */
336549b49cdaSZbigniew Bodek 					al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_pause_0 + prio,
336649b49cdaSZbigniew Bodek 							params->prio_q_map[i][prio]);
336749b49cdaSZbigniew Bodek 				else
336849b49cdaSZbigniew Bodek 					al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_pause_0 + prio,
336949b49cdaSZbigniew Bodek 							0);
337049b49cdaSZbigniew Bodek 
337149b49cdaSZbigniew Bodek 				if (params->gen_enable == AL_TRUE)
337249b49cdaSZbigniew Bodek 					al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_xoff_0 + prio,
337349b49cdaSZbigniew Bodek 							params->prio_q_map[i][prio]);
337449b49cdaSZbigniew Bodek 				else
337549b49cdaSZbigniew Bodek 					al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_xoff_0 + prio,
337649b49cdaSZbigniew Bodek 							0);
337749b49cdaSZbigniew Bodek 			}
337849b49cdaSZbigniew Bodek 		}
337949b49cdaSZbigniew Bodek 
338049b49cdaSZbigniew Bodek 		/* Rx path */
338149b49cdaSZbigniew Bodek 		/* enable generating xoff from ec fifo almost full indication in hysteresis mode */
338249b49cdaSZbigniew Bodek 		if (params->gen_enable == AL_TRUE)
338349b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->efc.ec_xoff, 0xFF << EC_EFC_EC_XOFF_MASK_2_SHIFT);
338449b49cdaSZbigniew Bodek 		else
338549b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->ec_regs_base->efc.ec_xoff, 0);
338649b49cdaSZbigniew Bodek 
338749b49cdaSZbigniew Bodek 		/* set hysteresis mode thresholds */
338849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->efc.rx_fifo_hyst, params->rx_fifo_th_low | (params->rx_fifo_th_high << EC_EFC_RX_FIFO_HYST_TH_HIGH_SHIFT));
338949b49cdaSZbigniew Bodek 
339049b49cdaSZbigniew Bodek 		if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
339149b49cdaSZbigniew Bodek 			/* config the 10g_mac */
339249b49cdaSZbigniew Bodek 			/* set quanta value (same value for all prios) */
339349b49cdaSZbigniew Bodek 			reg = params->quanta | (params->quanta << 16);
339449b49cdaSZbigniew Bodek 			al_reg_write32(
339549b49cdaSZbigniew Bodek 				&adapter->mac_regs_base->mac_10g.cl01_pause_quanta, reg);
339649b49cdaSZbigniew Bodek 			al_reg_write32(
339749b49cdaSZbigniew Bodek 				&adapter->mac_regs_base->mac_10g.cl23_pause_quanta, reg);
339849b49cdaSZbigniew Bodek 			al_reg_write32(
339949b49cdaSZbigniew Bodek 				&adapter->mac_regs_base->mac_10g.cl45_pause_quanta, reg);
340049b49cdaSZbigniew Bodek 			al_reg_write32(
340149b49cdaSZbigniew Bodek 				&adapter->mac_regs_base->mac_10g.cl67_pause_quanta, reg);
340249b49cdaSZbigniew Bodek 			/* set quanta threshold value (same value for all prios) */
340349b49cdaSZbigniew Bodek 			reg = params->quanta_th | (params->quanta_th << 16);
340449b49cdaSZbigniew Bodek 			al_reg_write32(
340549b49cdaSZbigniew Bodek 				&adapter->mac_regs_base->mac_10g.cl01_quanta_thresh, reg);
340649b49cdaSZbigniew Bodek 			al_reg_write32(
340749b49cdaSZbigniew Bodek 				&adapter->mac_regs_base->mac_10g.cl23_quanta_thresh, reg);
340849b49cdaSZbigniew Bodek 			al_reg_write32(
340949b49cdaSZbigniew Bodek 				&adapter->mac_regs_base->mac_10g.cl45_quanta_thresh, reg);
341049b49cdaSZbigniew Bodek 			al_reg_write32(
341149b49cdaSZbigniew Bodek 				&adapter->mac_regs_base->mac_10g.cl67_quanta_thresh, reg);
341249b49cdaSZbigniew Bodek 
341349b49cdaSZbigniew Bodek 			/* enable PFC in the 10g_MAC */
341449b49cdaSZbigniew Bodek 			reg = al_reg_read32(&adapter->mac_regs_base->mac_10g.cmd_cfg);
341549b49cdaSZbigniew Bodek 			reg |= 1 << 19;
341649b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, reg);
341749b49cdaSZbigniew Bodek 		} else {
341849b49cdaSZbigniew Bodek 			/* config the 40g_mac */
341949b49cdaSZbigniew Bodek 			/* set quanta value (same value for all prios) */
342049b49cdaSZbigniew Bodek 			reg = params->quanta | (params->quanta << 16);
342149b49cdaSZbigniew Bodek 			al_eth_40g_mac_reg_write(adapter,
342249b49cdaSZbigniew Bodek 				ETH_MAC_GEN_V3_MAC_40G_CL01_PAUSE_QUANTA_ADDR, reg);
342349b49cdaSZbigniew Bodek 			al_eth_40g_mac_reg_write(adapter,
342449b49cdaSZbigniew Bodek 				ETH_MAC_GEN_V3_MAC_40G_CL23_PAUSE_QUANTA_ADDR, reg);
342549b49cdaSZbigniew Bodek 			al_eth_40g_mac_reg_write(adapter,
342649b49cdaSZbigniew Bodek 				ETH_MAC_GEN_V3_MAC_40G_CL45_PAUSE_QUANTA_ADDR, reg);
342749b49cdaSZbigniew Bodek 			al_eth_40g_mac_reg_write(adapter,
342849b49cdaSZbigniew Bodek 				ETH_MAC_GEN_V3_MAC_40G_CL67_PAUSE_QUANTA_ADDR, reg);
342949b49cdaSZbigniew Bodek 			/* set quanta threshold value (same value for all prios) */
343049b49cdaSZbigniew Bodek 			reg = params->quanta_th | (params->quanta_th << 16);
343149b49cdaSZbigniew Bodek 			al_eth_40g_mac_reg_write(adapter,
343249b49cdaSZbigniew Bodek 				ETH_MAC_GEN_V3_MAC_40G_CL01_QUANTA_THRESH_ADDR, reg);
343349b49cdaSZbigniew Bodek 			al_eth_40g_mac_reg_write(adapter,
343449b49cdaSZbigniew Bodek 				ETH_MAC_GEN_V3_MAC_40G_CL23_QUANTA_THRESH_ADDR, reg);
343549b49cdaSZbigniew Bodek 			al_eth_40g_mac_reg_write(adapter,
343649b49cdaSZbigniew Bodek 				ETH_MAC_GEN_V3_MAC_40G_CL45_QUANTA_THRESH_ADDR, reg);
343749b49cdaSZbigniew Bodek 			al_eth_40g_mac_reg_write(adapter,
343849b49cdaSZbigniew Bodek 				ETH_MAC_GEN_V3_MAC_40G_CL67_QUANTA_THRESH_ADDR, reg);
343949b49cdaSZbigniew Bodek 
344049b49cdaSZbigniew Bodek 			/* enable PFC in the 40g_MAC */
344149b49cdaSZbigniew Bodek 			reg = al_reg_read32(&adapter->mac_regs_base->mac_10g.cmd_cfg);
344249b49cdaSZbigniew Bodek 			reg |= 1 << 19;
344349b49cdaSZbigniew Bodek 			al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, reg);
344449b49cdaSZbigniew Bodek 			reg = al_eth_40g_mac_reg_read(adapter, ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR);
344549b49cdaSZbigniew Bodek 
344649b49cdaSZbigniew Bodek 			reg |= ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_PFC_MODE;
344749b49cdaSZbigniew Bodek 
344849b49cdaSZbigniew Bodek 			al_eth_40g_mac_reg_write(adapter, ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR, reg);
344949b49cdaSZbigniew Bodek 		}
345049b49cdaSZbigniew Bodek 
345149b49cdaSZbigniew Bodek 	break;
345249b49cdaSZbigniew Bodek 	default:
345349b49cdaSZbigniew Bodek 		al_err("[%s]: unsupported flow control type %d\n", adapter->name, params->type);
345449b49cdaSZbigniew Bodek 		return -EINVAL;
345549b49cdaSZbigniew Bodek 
345649b49cdaSZbigniew Bodek 	}
345749b49cdaSZbigniew Bodek 	return 0;
345849b49cdaSZbigniew Bodek }
345949b49cdaSZbigniew Bodek 
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)346049b49cdaSZbigniew 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)
346149b49cdaSZbigniew Bodek {
346249b49cdaSZbigniew Bodek 	al_dbg("[%s]: config vlan modification registers. udma id %d.\n", adapter->name, udma_id);
346349b49cdaSZbigniew Bodek 
346449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tpm_sel[udma_id].etype, udma_etype);
346549b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tpm_udma[udma_id].vlan_data, vlan1_data | (vlan2_data << 16));
346649b49cdaSZbigniew Bodek 
346749b49cdaSZbigniew Bodek 	return 0;
346849b49cdaSZbigniew Bodek }
346949b49cdaSZbigniew Bodek 
al_eth_eee_get(struct al_hal_eth_adapter * adapter,struct al_eth_eee_params * params)347049b49cdaSZbigniew Bodek int al_eth_eee_get(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params)
347149b49cdaSZbigniew Bodek {
347249b49cdaSZbigniew Bodek 	uint32_t reg;
347349b49cdaSZbigniew Bodek 
347449b49cdaSZbigniew Bodek 	al_dbg("[%s]: getting eee.\n", adapter->name);
347549b49cdaSZbigniew Bodek 
347649b49cdaSZbigniew Bodek 	reg = al_reg_read32(&adapter->ec_regs_base->eee.cfg_e);
347749b49cdaSZbigniew Bodek 	params->enable = (reg & EC_EEE_CFG_E_ENABLE) ? AL_TRUE : AL_FALSE;
347849b49cdaSZbigniew Bodek 
347949b49cdaSZbigniew Bodek 	params->tx_eee_timer = al_reg_read32(&adapter->ec_regs_base->eee.pre_cnt);
348049b49cdaSZbigniew Bodek 	params->min_interval = al_reg_read32(&adapter->ec_regs_base->eee.post_cnt);
348149b49cdaSZbigniew Bodek 	params->stop_cnt = al_reg_read32(&adapter->ec_regs_base->eee.stop_cnt);
348249b49cdaSZbigniew Bodek 
348349b49cdaSZbigniew Bodek 	return 0;
348449b49cdaSZbigniew Bodek }
348549b49cdaSZbigniew Bodek 
348649b49cdaSZbigniew Bodek 
al_eth_eee_config(struct al_hal_eth_adapter * adapter,struct al_eth_eee_params * params)348749b49cdaSZbigniew Bodek int al_eth_eee_config(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params)
348849b49cdaSZbigniew Bodek {
348949b49cdaSZbigniew Bodek 	uint32_t reg;
349049b49cdaSZbigniew Bodek 	al_dbg("[%s]: config eee.\n", adapter->name);
349149b49cdaSZbigniew Bodek 
349249b49cdaSZbigniew Bodek 	if (params->enable == 0) {
349349b49cdaSZbigniew Bodek 		al_dbg("[%s]: disable eee.\n", adapter->name);
349449b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->eee.cfg_e, 0);
349549b49cdaSZbigniew Bodek 		return 0;
349649b49cdaSZbigniew Bodek 	}
3497*3fc36ee0SWojciech Macek 	if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
349849b49cdaSZbigniew Bodek 		al_reg_write32_masked(
349949b49cdaSZbigniew Bodek 			&adapter->mac_regs_base->kr.pcs_cfg,
3500*3fc36ee0SWojciech Macek 			ETH_MAC_KR_PCS_CFG_EEE_TIMER_VAL_MASK,
3501*3fc36ee0SWojciech Macek 			((AL_ETH_IS_10G_MAC(adapter->mac_mode)) ?
3502*3fc36ee0SWojciech Macek 			ETH_MAC_KR_10_PCS_CFG_EEE_TIMER_VAL :
3503*3fc36ee0SWojciech Macek 			ETH_MAC_KR_25_PCS_CFG_EEE_TIMER_VAL) <<
3504*3fc36ee0SWojciech Macek 			ETH_MAC_KR_PCS_CFG_EEE_TIMER_VAL_SHIFT);
3505*3fc36ee0SWojciech Macek 	}
3506*3fc36ee0SWojciech Macek 	if ((adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_40G) ||
3507*3fc36ee0SWojciech Macek 		(adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_50G)) {
3508*3fc36ee0SWojciech Macek 		al_reg_write32_masked(
3509*3fc36ee0SWojciech Macek 			&adapter->mac_regs_base->gen_v3.pcs_40g_ll_eee_cfg,
3510*3fc36ee0SWojciech Macek 			ETH_MAC_GEN_V3_PCS_40G_LL_EEE_CFG_TIMER_VAL_MASK,
3511*3fc36ee0SWojciech Macek 			((adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_40G) ?
3512*3fc36ee0SWojciech Macek 			ETH_MAC_XLG_40_PCS_CFG_EEE_TIMER_VAL :
3513*3fc36ee0SWojciech Macek 			ETH_MAC_XLG_50_PCS_CFG_EEE_TIMER_VAL) <<
3514*3fc36ee0SWojciech Macek 			ETH_MAC_GEN_V3_PCS_40G_LL_EEE_CFG_TIMER_VAL_SHIFT);
3515*3fc36ee0SWojciech Macek 		/* set Deep sleep mode as the LPI function (instead of Fast wake mode) */
3516*3fc36ee0SWojciech Macek 		al_eth_40g_pcs_reg_write(adapter, ETH_MAC_GEN_V3_PCS_40G_EEE_CONTROL_ADDR,
3517*3fc36ee0SWojciech Macek 			params->fast_wake ? 1 : 0);
351849b49cdaSZbigniew Bodek 	}
351949b49cdaSZbigniew Bodek 
352049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->eee.pre_cnt, params->tx_eee_timer);
352149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->eee.post_cnt, params->min_interval);
352249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->eee.stop_cnt, params->stop_cnt);
352349b49cdaSZbigniew Bodek 
352449b49cdaSZbigniew Bodek 	reg = EC_EEE_CFG_E_MASK_EC_TMI_STOP | EC_EEE_CFG_E_MASK_MAC_EEE |
352549b49cdaSZbigniew Bodek 	       EC_EEE_CFG_E_ENABLE |
352649b49cdaSZbigniew Bodek 	       EC_EEE_CFG_E_USE_EC_TX_FIFO | EC_EEE_CFG_E_USE_EC_RX_FIFO;
352749b49cdaSZbigniew Bodek 
352849b49cdaSZbigniew Bodek 	/*
352949b49cdaSZbigniew Bodek 	 * Addressing RMN: 3732
353049b49cdaSZbigniew Bodek 	 *
353149b49cdaSZbigniew Bodek 	 * RMN description:
353249b49cdaSZbigniew Bodek 	 * When the HW get into eee mode, it can't transmit any pause packet
353349b49cdaSZbigniew Bodek 	 * (when flow control policy is enabled).
353449b49cdaSZbigniew Bodek 	 * In such case, the HW has no way to handle extreme pushback from
353549b49cdaSZbigniew Bodek 	 * the Rx_path fifos.
353649b49cdaSZbigniew Bodek 	 *
353749b49cdaSZbigniew Bodek 	 * Software flow:
353849b49cdaSZbigniew Bodek 	 * Configure RX_FIFO empty as eee mode term.
353949b49cdaSZbigniew Bodek 	 * That way, nothing will prevent pause packet transmittion in
354049b49cdaSZbigniew Bodek 	 * case of extreme pushback from the Rx_path fifos.
354149b49cdaSZbigniew Bodek 	 *
354249b49cdaSZbigniew Bodek 	 */
354349b49cdaSZbigniew Bodek 
354449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->eee.cfg_e, reg);
354549b49cdaSZbigniew Bodek 
354649b49cdaSZbigniew Bodek 	return 0;
354749b49cdaSZbigniew Bodek }
354849b49cdaSZbigniew Bodek 
354949b49cdaSZbigniew Bodek /* Timestamp */
355049b49cdaSZbigniew Bodek /* prepare the adapter for doing Timestamps for Rx packets. */
al_eth_ts_init(struct al_hal_eth_adapter * adapter)355149b49cdaSZbigniew Bodek int al_eth_ts_init(struct al_hal_eth_adapter *adapter)
355249b49cdaSZbigniew Bodek {
355349b49cdaSZbigniew Bodek 	uint32_t reg;
355449b49cdaSZbigniew Bodek 
355549b49cdaSZbigniew Bodek 	/*TODO:
355649b49cdaSZbigniew Bodek 	 * return error when:
355749b49cdaSZbigniew Bodek 	 * - working in 1G mode and MACSEC enabled
355849b49cdaSZbigniew Bodek 	 * - RX completion descriptor is not 8 words
355949b49cdaSZbigniew Bodek 	 */
356049b49cdaSZbigniew Bodek 	reg = al_reg_read32(&adapter->ec_regs_base->gen.en_ext);
356149b49cdaSZbigniew Bodek 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
356249b49cdaSZbigniew Bodek 		reg &= ~EC_GEN_EN_EXT_PTH_1_10_SEL;
356349b49cdaSZbigniew Bodek 	else
356449b49cdaSZbigniew Bodek 		reg |= EC_GEN_EN_EXT_PTH_1_10_SEL;
356549b49cdaSZbigniew Bodek 	/*
356649b49cdaSZbigniew Bodek 	 * set completion bypass so tx timestamps won't be inserted to tx cmpl
356749b49cdaSZbigniew Bodek 	 * (in order to disable unverified flow)
356849b49cdaSZbigniew Bodek 	 */
356949b49cdaSZbigniew Bodek 	reg |= EC_GEN_EN_EXT_PTH_COMPLETION_BYPASS;
357049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->gen.en_ext, reg);
357149b49cdaSZbigniew Bodek 
357249b49cdaSZbigniew Bodek 	/*TODO: add the following when we have updated regs file:
357349b49cdaSZbigniew Bodek 	 * reg_rfw_out_cfg_timestamp_sample_out
357449b49cdaSZbigniew Bodek 		0 (default) – use the timestamp from the SOP info (10G MAC)
357549b49cdaSZbigniew Bodek 		1 – use the timestamp from the EOP (1G MAC) (noly when MACSEC is disabled)
357649b49cdaSZbigniew Bodek 	 */
357749b49cdaSZbigniew Bodek 	return 0;
357849b49cdaSZbigniew Bodek }
357949b49cdaSZbigniew Bodek 
358049b49cdaSZbigniew Bodek /* read Timestamp sample value of previously transmitted packet. */
al_eth_tx_ts_val_get(struct al_hal_eth_adapter * adapter,uint8_t ts_index,uint32_t * timestamp)358149b49cdaSZbigniew Bodek int al_eth_tx_ts_val_get(struct al_hal_eth_adapter *adapter, uint8_t ts_index,
358249b49cdaSZbigniew Bodek 			 uint32_t *timestamp)
358349b49cdaSZbigniew Bodek {
358449b49cdaSZbigniew Bodek 	al_assert(ts_index < AL_ETH_PTH_TX_SAMPLES_NUM);
358549b49cdaSZbigniew Bodek 
358649b49cdaSZbigniew Bodek 	/* in 1G mode, only indexes 1-7 are allowed*/
358749b49cdaSZbigniew Bodek 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
358849b49cdaSZbigniew Bodek 		al_assert(ts_index <= 7);
358949b49cdaSZbigniew Bodek 		al_assert(ts_index >= 1);
359049b49cdaSZbigniew Bodek 	}
359149b49cdaSZbigniew Bodek 
359249b49cdaSZbigniew Bodek 	/*TODO: check if sample is valid */
359349b49cdaSZbigniew Bodek 	*timestamp = al_reg_read32(&adapter->ec_regs_base->pth_db[ts_index].ts);
359449b49cdaSZbigniew Bodek 	return 0;
359549b49cdaSZbigniew Bodek }
359649b49cdaSZbigniew Bodek 
359749b49cdaSZbigniew Bodek /* Read the systime value */
al_eth_pth_systime_read(struct al_hal_eth_adapter * adapter,struct al_eth_pth_time * systime)359849b49cdaSZbigniew Bodek int al_eth_pth_systime_read(struct al_hal_eth_adapter *adapter,
359949b49cdaSZbigniew Bodek 			    struct al_eth_pth_time *systime)
360049b49cdaSZbigniew Bodek {
360149b49cdaSZbigniew Bodek 	uint32_t reg;
360249b49cdaSZbigniew Bodek 
360349b49cdaSZbigniew Bodek 	/* first we must read the subseconds MSB so the seconds register will be
360449b49cdaSZbigniew Bodek 	 * shadowed
360549b49cdaSZbigniew Bodek 	 */
360649b49cdaSZbigniew Bodek 	reg = al_reg_read32(&adapter->ec_regs_base->pth.system_time_subseconds_msb);
360749b49cdaSZbigniew Bodek 	systime->femto = (uint64_t)reg << 18;
360849b49cdaSZbigniew Bodek 	reg = al_reg_read32(&adapter->ec_regs_base->pth.system_time_seconds);
360949b49cdaSZbigniew Bodek 	systime->seconds = reg;
361049b49cdaSZbigniew Bodek 
361149b49cdaSZbigniew Bodek 	return 0;
361249b49cdaSZbigniew Bodek }
361349b49cdaSZbigniew Bodek 
361449b49cdaSZbigniew Bodek /* Set the clock period to a given value. */
al_eth_pth_clk_period_write(struct al_hal_eth_adapter * adapter,uint64_t clk_period)361549b49cdaSZbigniew Bodek int al_eth_pth_clk_period_write(struct al_hal_eth_adapter *adapter,
361649b49cdaSZbigniew Bodek 				uint64_t clk_period)
361749b49cdaSZbigniew Bodek {
361849b49cdaSZbigniew Bodek 	uint32_t reg;
361949b49cdaSZbigniew Bodek 	/* first write the LSB so it will be shadowed */
362049b49cdaSZbigniew Bodek 	/* bits 31:14 of the clock period lsb register contains bits 17:0 of the
362149b49cdaSZbigniew Bodek 	 * period.
362249b49cdaSZbigniew Bodek 	 */
362349b49cdaSZbigniew Bodek 	reg = (clk_period & AL_BIT_MASK(18)) << EC_PTH_CLOCK_PERIOD_LSB_VAL_SHIFT;
362449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.clock_period_lsb, reg);
362549b49cdaSZbigniew Bodek 	reg = clk_period >> 18;
362649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.clock_period_msb, reg);
362749b49cdaSZbigniew Bodek 
362849b49cdaSZbigniew Bodek 	return 0;
362949b49cdaSZbigniew Bodek }
363049b49cdaSZbigniew Bodek 
363149b49cdaSZbigniew Bodek /* Configure the systime internal update */
al_eth_pth_int_update_config(struct al_hal_eth_adapter * adapter,struct al_eth_pth_int_update_params * params)363249b49cdaSZbigniew Bodek int al_eth_pth_int_update_config(struct al_hal_eth_adapter *adapter,
363349b49cdaSZbigniew Bodek 				 struct al_eth_pth_int_update_params *params)
363449b49cdaSZbigniew Bodek {
363549b49cdaSZbigniew Bodek 	uint32_t reg;
363649b49cdaSZbigniew Bodek 
363749b49cdaSZbigniew Bodek 	reg = al_reg_read32(&adapter->ec_regs_base->pth.int_update_ctrl);
363849b49cdaSZbigniew Bodek 	if (params->enable == AL_FALSE) {
363949b49cdaSZbigniew Bodek 		reg &= ~EC_PTH_INT_UPDATE_CTRL_INT_TRIG_EN;
364049b49cdaSZbigniew Bodek 	} else {
364149b49cdaSZbigniew Bodek 		reg |= EC_PTH_INT_UPDATE_CTRL_INT_TRIG_EN;
364249b49cdaSZbigniew Bodek 		AL_REG_FIELD_SET(reg, EC_PTH_INT_UPDATE_CTRL_UPDATE_METHOD_MASK,
364349b49cdaSZbigniew Bodek 				 EC_PTH_INT_UPDATE_CTRL_UPDATE_METHOD_SHIFT,
364449b49cdaSZbigniew Bodek 				 params->method);
364549b49cdaSZbigniew Bodek 		if (params->trigger == AL_ETH_PTH_INT_TRIG_REG_WRITE)
364649b49cdaSZbigniew Bodek 			reg |= EC_PTH_INT_UPDATE_CTRL_UPDATE_TRIG;
364749b49cdaSZbigniew Bodek 		else
364849b49cdaSZbigniew Bodek 			reg &= ~EC_PTH_INT_UPDATE_CTRL_UPDATE_TRIG;
364949b49cdaSZbigniew Bodek 	}
365049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.int_update_ctrl, reg);
365149b49cdaSZbigniew Bodek 	return 0;
365249b49cdaSZbigniew Bodek }
365349b49cdaSZbigniew Bodek /* set internal update time */
al_eth_pth_int_update_time_set(struct al_hal_eth_adapter * adapter,struct al_eth_pth_time * time)365449b49cdaSZbigniew Bodek int al_eth_pth_int_update_time_set(struct al_hal_eth_adapter *adapter,
365549b49cdaSZbigniew Bodek 				   struct al_eth_pth_time *time)
365649b49cdaSZbigniew Bodek {
365749b49cdaSZbigniew Bodek 	uint32_t reg;
365849b49cdaSZbigniew Bodek 
365949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.int_update_seconds,
366049b49cdaSZbigniew Bodek 		       time->seconds);
366149b49cdaSZbigniew Bodek 	reg = time->femto & AL_BIT_MASK(18);
366249b49cdaSZbigniew Bodek 	reg = reg << EC_PTH_INT_UPDATE_SUBSECONDS_LSB_VAL_SHIFT;
366349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.int_update_subseconds_lsb,
366449b49cdaSZbigniew Bodek 		       reg);
366549b49cdaSZbigniew Bodek 	reg = time->femto >> 18;
366649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.int_update_subseconds_msb,
366749b49cdaSZbigniew Bodek 		       reg);
366849b49cdaSZbigniew Bodek 
366949b49cdaSZbigniew Bodek 	return 0;
367049b49cdaSZbigniew Bodek }
367149b49cdaSZbigniew Bodek 
367249b49cdaSZbigniew Bodek /* Configure the systime external update */
al_eth_pth_ext_update_config(struct al_hal_eth_adapter * adapter,struct al_eth_pth_ext_update_params * params)367349b49cdaSZbigniew Bodek int al_eth_pth_ext_update_config(struct al_hal_eth_adapter *adapter,
367449b49cdaSZbigniew Bodek 				 struct al_eth_pth_ext_update_params * params)
367549b49cdaSZbigniew Bodek {
367649b49cdaSZbigniew Bodek 	uint32_t reg;
367749b49cdaSZbigniew Bodek 
367849b49cdaSZbigniew Bodek 	reg = al_reg_read32(&adapter->ec_regs_base->pth.int_update_ctrl);
367949b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, EC_PTH_INT_UPDATE_CTRL_UPDATE_METHOD_MASK,
368049b49cdaSZbigniew Bodek 			 EC_PTH_INT_UPDATE_CTRL_UPDATE_METHOD_SHIFT,
368149b49cdaSZbigniew Bodek 			 params->method);
368249b49cdaSZbigniew Bodek 
368349b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, EC_PTH_EXT_UPDATE_CTRL_EXT_TRIG_EN_MASK,
368449b49cdaSZbigniew Bodek 			 EC_PTH_EXT_UPDATE_CTRL_EXT_TRIG_EN_SHIFT,
368549b49cdaSZbigniew Bodek 			 params->triggers);
368649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.int_update_ctrl, reg);
368749b49cdaSZbigniew Bodek 	return 0;
368849b49cdaSZbigniew Bodek }
368949b49cdaSZbigniew Bodek 
369049b49cdaSZbigniew Bodek /* set external update time */
al_eth_pth_ext_update_time_set(struct al_hal_eth_adapter * adapter,struct al_eth_pth_time * time)369149b49cdaSZbigniew Bodek int al_eth_pth_ext_update_time_set(struct al_hal_eth_adapter *adapter,
369249b49cdaSZbigniew Bodek 				   struct al_eth_pth_time *time)
369349b49cdaSZbigniew Bodek {
369449b49cdaSZbigniew Bodek 	uint32_t reg;
369549b49cdaSZbigniew Bodek 
369649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.ext_update_seconds,
369749b49cdaSZbigniew Bodek 		       time->seconds);
369849b49cdaSZbigniew Bodek 	reg = time->femto & AL_BIT_MASK(18);
369949b49cdaSZbigniew Bodek 	reg = reg << EC_PTH_EXT_UPDATE_SUBSECONDS_LSB_VAL_SHIFT;
370049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.ext_update_subseconds_lsb,
370149b49cdaSZbigniew Bodek 		       reg);
370249b49cdaSZbigniew Bodek 	reg = time->femto >> 18;
370349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.ext_update_subseconds_msb,
370449b49cdaSZbigniew Bodek 		       reg);
370549b49cdaSZbigniew Bodek 
370649b49cdaSZbigniew Bodek 	return 0;
370749b49cdaSZbigniew Bodek };
370849b49cdaSZbigniew Bodek 
370949b49cdaSZbigniew Bodek /* set the read compensation delay */
al_eth_pth_read_compensation_set(struct al_hal_eth_adapter * adapter,uint64_t subseconds)371049b49cdaSZbigniew Bodek int al_eth_pth_read_compensation_set(struct al_hal_eth_adapter *adapter,
371149b49cdaSZbigniew Bodek 				     uint64_t subseconds)
371249b49cdaSZbigniew Bodek {
371349b49cdaSZbigniew Bodek 	uint32_t reg;
371449b49cdaSZbigniew Bodek 
371549b49cdaSZbigniew Bodek 	/* first write to lsb to ensure atomicity */
371649b49cdaSZbigniew Bodek 	reg = (subseconds & AL_BIT_MASK(18)) << EC_PTH_READ_COMPENSATION_SUBSECONDS_LSB_VAL_SHIFT;
371749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.read_compensation_subseconds_lsb, reg);
371849b49cdaSZbigniew Bodek 
371949b49cdaSZbigniew Bodek 	reg = subseconds >> 18;
372049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.read_compensation_subseconds_msb, reg);
372149b49cdaSZbigniew Bodek 	return 0;
372249b49cdaSZbigniew Bodek }
372349b49cdaSZbigniew Bodek 
372449b49cdaSZbigniew Bodek /* set the internal write compensation delay */
al_eth_pth_int_write_compensation_set(struct al_hal_eth_adapter * adapter,uint64_t subseconds)372549b49cdaSZbigniew Bodek int al_eth_pth_int_write_compensation_set(struct al_hal_eth_adapter *adapter,
372649b49cdaSZbigniew Bodek 					  uint64_t subseconds)
372749b49cdaSZbigniew Bodek {
372849b49cdaSZbigniew Bodek 	uint32_t reg;
372949b49cdaSZbigniew Bodek 
373049b49cdaSZbigniew Bodek 	/* first write to lsb to ensure atomicity */
373149b49cdaSZbigniew Bodek 	reg = (subseconds & AL_BIT_MASK(18)) << EC_PTH_INT_WRITE_COMPENSATION_SUBSECONDS_LSB_VAL_SHIFT;
373249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.int_write_compensation_subseconds_lsb, reg);
373349b49cdaSZbigniew Bodek 
373449b49cdaSZbigniew Bodek 	reg = subseconds >> 18;
373549b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.int_write_compensation_subseconds_msb, reg);
373649b49cdaSZbigniew Bodek 	return 0;
373749b49cdaSZbigniew Bodek }
373849b49cdaSZbigniew Bodek 
373949b49cdaSZbigniew Bodek /* set the external write compensation delay */
al_eth_pth_ext_write_compensation_set(struct al_hal_eth_adapter * adapter,uint64_t subseconds)374049b49cdaSZbigniew Bodek int al_eth_pth_ext_write_compensation_set(struct al_hal_eth_adapter *adapter,
374149b49cdaSZbigniew Bodek 					  uint64_t subseconds)
374249b49cdaSZbigniew Bodek {
374349b49cdaSZbigniew Bodek 	uint32_t reg;
374449b49cdaSZbigniew Bodek 
374549b49cdaSZbigniew Bodek 	/* first write to lsb to ensure atomicity */
374649b49cdaSZbigniew Bodek 	reg = (subseconds & AL_BIT_MASK(18)) << EC_PTH_EXT_WRITE_COMPENSATION_SUBSECONDS_LSB_VAL_SHIFT;
374749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.ext_write_compensation_subseconds_lsb, reg);
374849b49cdaSZbigniew Bodek 
374949b49cdaSZbigniew Bodek 	reg = subseconds >> 18;
375049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.ext_write_compensation_subseconds_msb, reg);
375149b49cdaSZbigniew Bodek 	return 0;
375249b49cdaSZbigniew Bodek }
375349b49cdaSZbigniew Bodek 
375449b49cdaSZbigniew Bodek /* set the sync compensation delay */
al_eth_pth_sync_compensation_set(struct al_hal_eth_adapter * adapter,uint64_t subseconds)375549b49cdaSZbigniew Bodek int al_eth_pth_sync_compensation_set(struct al_hal_eth_adapter *adapter,
375649b49cdaSZbigniew Bodek 				     uint64_t subseconds)
375749b49cdaSZbigniew Bodek {
375849b49cdaSZbigniew Bodek 	uint32_t reg;
375949b49cdaSZbigniew Bodek 
376049b49cdaSZbigniew Bodek 	/* first write to lsb to ensure atomicity */
376149b49cdaSZbigniew Bodek 	reg = (subseconds & AL_BIT_MASK(18)) << EC_PTH_SYNC_COMPENSATION_SUBSECONDS_LSB_VAL_SHIFT;
376249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.sync_compensation_subseconds_lsb, reg);
376349b49cdaSZbigniew Bodek 
376449b49cdaSZbigniew Bodek 	reg = subseconds >> 18;
376549b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth.sync_compensation_subseconds_msb, reg);
376649b49cdaSZbigniew Bodek 	return 0;
376749b49cdaSZbigniew Bodek }
376849b49cdaSZbigniew Bodek 
376949b49cdaSZbigniew Bodek /* Configure an output pulse */
al_eth_pth_pulse_out_config(struct al_hal_eth_adapter * adapter,struct al_eth_pth_pulse_out_params * params)377049b49cdaSZbigniew Bodek int al_eth_pth_pulse_out_config(struct al_hal_eth_adapter *adapter,
377149b49cdaSZbigniew Bodek 				struct al_eth_pth_pulse_out_params *params)
377249b49cdaSZbigniew Bodek {
377349b49cdaSZbigniew Bodek 	uint32_t reg;
377449b49cdaSZbigniew Bodek 
377549b49cdaSZbigniew Bodek 	if (params->index >= AL_ETH_PTH_PULSE_OUT_NUM) {
377649b49cdaSZbigniew Bodek 		al_err("eth [%s] PTH out pulse index out of range\n",
377749b49cdaSZbigniew Bodek 				 adapter->name);
377849b49cdaSZbigniew Bodek 		return -EINVAL;
377949b49cdaSZbigniew Bodek 	}
378049b49cdaSZbigniew Bodek 	reg = al_reg_read32(&adapter->ec_regs_base->pth_egress[params->index].trigger_ctrl);
378149b49cdaSZbigniew Bodek 	if (params->enable == AL_FALSE) {
378249b49cdaSZbigniew Bodek 		reg &= ~EC_PTH_EGRESS_TRIGGER_CTRL_EN;
378349b49cdaSZbigniew Bodek 	} else {
378449b49cdaSZbigniew Bodek 		reg |= EC_PTH_EGRESS_TRIGGER_CTRL_EN;
378549b49cdaSZbigniew Bodek 		if (params->periodic == AL_FALSE)
378649b49cdaSZbigniew Bodek 			reg &= ~EC_PTH_EGRESS_TRIGGER_CTRL_PERIODIC;
378749b49cdaSZbigniew Bodek 		else
378849b49cdaSZbigniew Bodek 			reg |= EC_PTH_EGRESS_TRIGGER_CTRL_PERIODIC;
378949b49cdaSZbigniew Bodek 
379049b49cdaSZbigniew Bodek 		AL_REG_FIELD_SET(reg, EC_PTH_EGRESS_TRIGGER_CTRL_PERIOD_SUBSEC_MASK,
379149b49cdaSZbigniew Bodek 				 EC_PTH_EGRESS_TRIGGER_CTRL_PERIOD_SUBSEC_SHIFT,
379249b49cdaSZbigniew Bodek 				 params->period_us);
379349b49cdaSZbigniew Bodek 		AL_REG_FIELD_SET(reg, EC_PTH_EGRESS_TRIGGER_CTRL_PERIOD_SEC_MASK,
379449b49cdaSZbigniew Bodek 				 EC_PTH_EGRESS_TRIGGER_CTRL_PERIOD_SEC_SHIFT,
379549b49cdaSZbigniew Bodek 				 params->period_sec);
379649b49cdaSZbigniew Bodek 	}
379749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].trigger_ctrl, reg);
379849b49cdaSZbigniew Bodek 
379949b49cdaSZbigniew Bodek 	/* set trigger time */
380049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].trigger_seconds,
380149b49cdaSZbigniew Bodek 		       params->start_time.seconds);
380249b49cdaSZbigniew Bodek 	reg = params->start_time.femto & AL_BIT_MASK(18);
380349b49cdaSZbigniew Bodek 	reg = reg << EC_PTH_EGRESS_TRIGGER_SUBSECONDS_LSB_VAL_SHIFT;
380449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].trigger_subseconds_lsb,
380549b49cdaSZbigniew Bodek 		       reg);
380649b49cdaSZbigniew Bodek 	reg = params->start_time.femto >> 18;
380749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].trigger_subseconds_msb,
380849b49cdaSZbigniew Bodek 		       reg);
380949b49cdaSZbigniew Bodek 
381049b49cdaSZbigniew Bodek 	/* set pulse width */
381149b49cdaSZbigniew Bodek 	reg = params->pulse_width & AL_BIT_MASK(18);
381249b49cdaSZbigniew Bodek 	reg = reg << EC_PTH_EGRESS_PULSE_WIDTH_SUBSECONDS_LSB_VAL_SHIFT;
381349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].pulse_width_subseconds_lsb, reg);
381449b49cdaSZbigniew Bodek 
381549b49cdaSZbigniew Bodek 	reg = params->pulse_width  >> 18;
381649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].pulse_width_subseconds_msb, reg);
381749b49cdaSZbigniew Bodek 
381849b49cdaSZbigniew Bodek 	return 0;
381949b49cdaSZbigniew Bodek }
382049b49cdaSZbigniew Bodek 
382149b49cdaSZbigniew Bodek /** get link status */
al_eth_link_status_get(struct al_hal_eth_adapter * adapter,struct al_eth_link_status * status)382249b49cdaSZbigniew Bodek int al_eth_link_status_get(struct al_hal_eth_adapter *adapter,
382349b49cdaSZbigniew Bodek 			   struct al_eth_link_status *status)
382449b49cdaSZbigniew Bodek {
382549b49cdaSZbigniew Bodek 	uint32_t reg;
382649b49cdaSZbigniew Bodek 
382749b49cdaSZbigniew Bodek 	if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
382849b49cdaSZbigniew Bodek 		status->link_up = AL_FALSE;
3829*3fc36ee0SWojciech Macek 		status->local_fault = AL_TRUE;
3830*3fc36ee0SWojciech Macek 		status->remote_fault = AL_TRUE;
3831*3fc36ee0SWojciech Macek 
3832*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->kr.pcs_addr, ETH_MAC_KR_PCS_BASE_R_STATUS2);
3833*3fc36ee0SWojciech Macek 		reg = al_reg_read32(&adapter->mac_regs_base->kr.pcs_data);
3834*3fc36ee0SWojciech Macek 
3835*3fc36ee0SWojciech Macek 		if (reg & AL_BIT(15)) {
3836*3fc36ee0SWojciech Macek 			reg = al_reg_read32(&adapter->mac_regs_base->mac_10g.status);
3837*3fc36ee0SWojciech Macek 
3838*3fc36ee0SWojciech Macek 			status->remote_fault = ((reg & ETH_MAC_GEN_MAC_10G_STAT_REM_FAULT) ?
3839*3fc36ee0SWojciech Macek 							AL_TRUE : AL_FALSE);
3840*3fc36ee0SWojciech Macek 			status->local_fault = ((reg & ETH_MAC_GEN_MAC_10G_STAT_LOC_FAULT) ?
3841*3fc36ee0SWojciech Macek 							AL_TRUE : AL_FALSE);
3842*3fc36ee0SWojciech Macek 
3843*3fc36ee0SWojciech Macek 			status->link_up = ((status->remote_fault == AL_FALSE) &&
3844*3fc36ee0SWojciech Macek 					   (status->local_fault == AL_FALSE));
3845*3fc36ee0SWojciech Macek 		}
384649b49cdaSZbigniew Bodek 
384749b49cdaSZbigniew Bodek 	} else if (adapter->mac_mode == AL_ETH_MAC_MODE_SGMII) {
384849b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 1);
384949b49cdaSZbigniew Bodek 		/*
385049b49cdaSZbigniew Bodek 		 * This register is latched low so need to read twice to get
385149b49cdaSZbigniew Bodek 		 * the current link status
385249b49cdaSZbigniew Bodek 		 */
385349b49cdaSZbigniew Bodek 		reg = al_reg_read32(&adapter->mac_regs_base->sgmii.reg_data);
385449b49cdaSZbigniew Bodek 		reg = al_reg_read32(&adapter->mac_regs_base->sgmii.reg_data);
385549b49cdaSZbigniew Bodek 
385649b49cdaSZbigniew Bodek 		status->link_up = AL_FALSE;
385749b49cdaSZbigniew Bodek 
385849b49cdaSZbigniew Bodek 		if (reg & AL_BIT(2))
385949b49cdaSZbigniew Bodek 			status->link_up = AL_TRUE;
386049b49cdaSZbigniew Bodek 
386149b49cdaSZbigniew Bodek 		reg = al_reg_read32(&adapter->mac_regs_base->sgmii.link_stat);
386249b49cdaSZbigniew Bodek 
386349b49cdaSZbigniew Bodek 		if ((reg & AL_BIT(3)) == 0)
386449b49cdaSZbigniew Bodek 			status->link_up = AL_FALSE;
386549b49cdaSZbigniew Bodek 
386649b49cdaSZbigniew Bodek 	} else if (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII) {
386749b49cdaSZbigniew Bodek 		reg = al_reg_read32(&adapter->mac_regs_base->gen.rgmii_stat);
386849b49cdaSZbigniew Bodek 
386949b49cdaSZbigniew Bodek 		status->link_up = AL_FALSE;
387049b49cdaSZbigniew Bodek 
387149b49cdaSZbigniew Bodek 		if (reg & AL_BIT(4))
387249b49cdaSZbigniew Bodek 			status->link_up = AL_TRUE;
387349b49cdaSZbigniew Bodek 
3874*3fc36ee0SWojciech Macek 	} else if (adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_25G) {
3875*3fc36ee0SWojciech Macek 		status->link_up = AL_FALSE;
3876*3fc36ee0SWojciech Macek 		status->local_fault = AL_TRUE;
3877*3fc36ee0SWojciech Macek 		status->remote_fault = AL_TRUE;
3878*3fc36ee0SWojciech Macek 
3879*3fc36ee0SWojciech Macek 		reg = al_reg_read32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_status);
3880*3fc36ee0SWojciech Macek 
3881*3fc36ee0SWojciech Macek 		status->link_up = AL_FALSE;
3882*3fc36ee0SWojciech Macek 
3883*3fc36ee0SWojciech Macek 		if ((reg & 0xF) == 0xF) {
3884*3fc36ee0SWojciech Macek 			reg = al_reg_read32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_status);
3885*3fc36ee0SWojciech Macek 
3886*3fc36ee0SWojciech Macek 			status->remote_fault = ((reg & ETH_MAC_GEN_V3_MAC_40G_LL_STATUS_REM_FAULT) ?
3887*3fc36ee0SWojciech Macek 							AL_TRUE : AL_FALSE);
3888*3fc36ee0SWojciech Macek 			status->local_fault = ((reg & ETH_MAC_GEN_V3_MAC_40G_LL_STATUS_LOC_FAULT) ?
3889*3fc36ee0SWojciech Macek 							AL_TRUE : AL_FALSE);
3890*3fc36ee0SWojciech Macek 
3891*3fc36ee0SWojciech Macek 			status->link_up = ((status->remote_fault == AL_FALSE) &&
3892*3fc36ee0SWojciech Macek 					   (status->local_fault == AL_FALSE));
3893*3fc36ee0SWojciech Macek 		}
3894*3fc36ee0SWojciech Macek 
389549b49cdaSZbigniew Bodek 	} else if ((adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_40G) ||
389649b49cdaSZbigniew Bodek 			(adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_50G)) {
389749b49cdaSZbigniew Bodek 		reg = al_reg_read32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_status);
389849b49cdaSZbigniew Bodek 
389949b49cdaSZbigniew Bodek 		status->link_up = AL_FALSE;
390049b49cdaSZbigniew Bodek 
390149b49cdaSZbigniew Bodek 		if ((reg & 0x1F) == 0x1F) {
390249b49cdaSZbigniew Bodek 			reg = al_reg_read32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_status);
390349b49cdaSZbigniew Bodek 			if ((reg & (ETH_MAC_GEN_V3_MAC_40G_LL_STATUS_REM_FAULT |
390449b49cdaSZbigniew Bodek 					ETH_MAC_GEN_V3_MAC_40G_LL_STATUS_LOC_FAULT)) == 0)
390549b49cdaSZbigniew Bodek 				status->link_up = AL_TRUE;
390649b49cdaSZbigniew Bodek 		}
390749b49cdaSZbigniew Bodek 
390849b49cdaSZbigniew Bodek 	} else {
390949b49cdaSZbigniew Bodek 		/* not implemented yet */
391049b49cdaSZbigniew Bodek 		return -EPERM;
391149b49cdaSZbigniew Bodek 	}
391249b49cdaSZbigniew Bodek 
391349b49cdaSZbigniew Bodek 	al_dbg("[%s]: mac %s port. link_status: %s.\n", adapter->name,
391449b49cdaSZbigniew Bodek 		al_eth_mac_mode_str(adapter->mac_mode),
391549b49cdaSZbigniew Bodek 		(status->link_up == AL_TRUE) ? "LINK_UP" : "LINK_DOWN");
391649b49cdaSZbigniew Bodek 
391749b49cdaSZbigniew Bodek 	return 0;
391849b49cdaSZbigniew Bodek }
391949b49cdaSZbigniew Bodek 
al_eth_link_status_clear(struct al_hal_eth_adapter * adapter)3920*3fc36ee0SWojciech Macek int al_eth_link_status_clear(struct al_hal_eth_adapter *adapter)
3921*3fc36ee0SWojciech Macek {
3922*3fc36ee0SWojciech Macek 	int status = 0;
3923*3fc36ee0SWojciech Macek 
3924*3fc36ee0SWojciech Macek 	if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
3925*3fc36ee0SWojciech Macek 		al_reg_write32(&adapter->mac_regs_base->kr.pcs_addr, ETH_MAC_KR_PCS_BASE_R_STATUS2);
3926*3fc36ee0SWojciech Macek 		al_reg_read32(&adapter->mac_regs_base->kr.pcs_data);
3927*3fc36ee0SWojciech Macek 
3928*3fc36ee0SWojciech Macek 		al_reg_read32(&adapter->mac_regs_base->mac_10g.status);
3929*3fc36ee0SWojciech Macek 	} else {
3930*3fc36ee0SWojciech Macek 		status = -1;
3931*3fc36ee0SWojciech Macek 	}
3932*3fc36ee0SWojciech Macek 
3933*3fc36ee0SWojciech Macek 	return status;
3934*3fc36ee0SWojciech Macek }
3935*3fc36ee0SWojciech Macek 
393649b49cdaSZbigniew Bodek /** set LED mode and value */
al_eth_led_set(struct al_hal_eth_adapter * adapter,al_bool link_is_up)393749b49cdaSZbigniew Bodek int al_eth_led_set(struct al_hal_eth_adapter *adapter, al_bool link_is_up)
393849b49cdaSZbigniew Bodek {
393949b49cdaSZbigniew Bodek 	uint32_t reg = 0;
394049b49cdaSZbigniew Bodek 	uint32_t mode  = ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG;
394149b49cdaSZbigniew Bodek 
394249b49cdaSZbigniew Bodek 	if (link_is_up)
394349b49cdaSZbigniew Bodek 		mode = ETH_MAC_GEN_LED_CFG_SEL_LINK_ACTIVITY;
394449b49cdaSZbigniew Bodek 
394549b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg,  ETH_MAC_GEN_LED_CFG_SEL_MASK,
394649b49cdaSZbigniew Bodek 			 ETH_MAC_GEN_LED_CFG_SEL_SHIFT, mode);
394749b49cdaSZbigniew Bodek 
394849b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, ETH_MAC_GEN_LED_CFG_BLINK_TIMER_MASK,
394949b49cdaSZbigniew Bodek 			 ETH_MAC_GEN_LED_CFG_BLINK_TIMER_SHIFT,
395049b49cdaSZbigniew Bodek 			 ETH_MAC_GEN_LED_CFG_BLINK_TIMER_VAL);
395149b49cdaSZbigniew Bodek 
395249b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, ETH_MAC_GEN_LED_CFG_ACT_TIMER_MASK,
395349b49cdaSZbigniew Bodek 			 ETH_MAC_GEN_LED_CFG_ACT_TIMER_SHIFT,
395449b49cdaSZbigniew Bodek 			 ETH_MAC_GEN_LED_CFG_ACT_TIMER_VAL);
395549b49cdaSZbigniew Bodek 
395649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->mac_regs_base->gen.led_cfg, reg);
395749b49cdaSZbigniew Bodek 
395849b49cdaSZbigniew Bodek 	return 0;
395949b49cdaSZbigniew Bodek }
396049b49cdaSZbigniew Bodek 
396149b49cdaSZbigniew Bodek /* get statistics */
al_eth_mac_stats_get(struct al_hal_eth_adapter * adapter,struct al_eth_mac_stats * stats)396249b49cdaSZbigniew Bodek int al_eth_mac_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_mac_stats *stats)
396349b49cdaSZbigniew Bodek {
396449b49cdaSZbigniew Bodek 	al_assert(stats);
396549b49cdaSZbigniew Bodek 
3966*3fc36ee0SWojciech Macek 	al_memset(stats, 0, sizeof(struct al_eth_mac_stats));
3967*3fc36ee0SWojciech Macek 
396849b49cdaSZbigniew Bodek 	if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
3969*3fc36ee0SWojciech Macek 		struct al_eth_mac_1g_stats __iomem *reg_stats =
3970*3fc36ee0SWojciech Macek 			&adapter->mac_regs_base->mac_1g.stats;
397149b49cdaSZbigniew Bodek 
3972*3fc36ee0SWojciech Macek 		stats->ifInUcastPkts = al_reg_read32(&reg_stats->ifInUcastPkts);
3973*3fc36ee0SWojciech Macek 		stats->ifInMulticastPkts = al_reg_read32(&reg_stats->ifInMulticastPkts);
3974*3fc36ee0SWojciech Macek 		stats->ifInBroadcastPkts = al_reg_read32(&reg_stats->ifInBroadcastPkts);
3975*3fc36ee0SWojciech Macek 		stats->etherStatsPkts = al_reg_read32(&reg_stats->etherStatsPkts);
3976*3fc36ee0SWojciech Macek 		stats->ifOutUcastPkts = al_reg_read32(&reg_stats->ifOutUcastPkts);
3977*3fc36ee0SWojciech Macek 		stats->ifOutMulticastPkts = al_reg_read32(&reg_stats->ifOutMulticastPkts);
3978*3fc36ee0SWojciech Macek 		stats->ifOutBroadcastPkts = al_reg_read32(&reg_stats->ifOutBroadcastPkts);
3979*3fc36ee0SWojciech Macek 		stats->ifInErrors = al_reg_read32(&reg_stats->ifInErrors);
3980*3fc36ee0SWojciech Macek 		stats->ifOutErrors = al_reg_read32(&reg_stats->ifOutErrors);
3981*3fc36ee0SWojciech Macek 		stats->aFramesReceivedOK = al_reg_read32(&reg_stats->aFramesReceivedOK);
3982*3fc36ee0SWojciech Macek 		stats->aFramesTransmittedOK = al_reg_read32(&reg_stats->aFramesTransmittedOK);
3983*3fc36ee0SWojciech Macek 		stats->aOctetsReceivedOK = al_reg_read32(&reg_stats->aOctetsReceivedOK);
3984*3fc36ee0SWojciech Macek 		stats->aOctetsTransmittedOK = al_reg_read32(&reg_stats->aOctetsTransmittedOK);
3985*3fc36ee0SWojciech Macek 		stats->etherStatsUndersizePkts = al_reg_read32(&reg_stats->etherStatsUndersizePkts);
3986*3fc36ee0SWojciech Macek 		stats->etherStatsFragments = al_reg_read32(&reg_stats->etherStatsFragments);
3987*3fc36ee0SWojciech Macek 		stats->etherStatsJabbers = al_reg_read32(&reg_stats->etherStatsJabbers);
3988*3fc36ee0SWojciech Macek 		stats->etherStatsOversizePkts = al_reg_read32(&reg_stats->etherStatsOversizePkts);
3989*3fc36ee0SWojciech Macek 		stats->aFrameCheckSequenceErrors =
3990*3fc36ee0SWojciech Macek 			al_reg_read32(&reg_stats->aFrameCheckSequenceErrors);
3991*3fc36ee0SWojciech Macek 		stats->aAlignmentErrors = al_reg_read32(&reg_stats->aAlignmentErrors);
3992*3fc36ee0SWojciech Macek 		stats->etherStatsDropEvents = al_reg_read32(&reg_stats->etherStatsDropEvents);
3993*3fc36ee0SWojciech Macek 		stats->aPAUSEMACCtrlFramesTransmitted =
3994*3fc36ee0SWojciech Macek 			al_reg_read32(&reg_stats->aPAUSEMACCtrlFramesTransmitted);
3995*3fc36ee0SWojciech Macek 		stats->aPAUSEMACCtrlFramesReceived =
3996*3fc36ee0SWojciech Macek 			al_reg_read32(&reg_stats->aPAUSEMACCtrlFramesReceived);
399749b49cdaSZbigniew Bodek 		stats->aFrameTooLongErrors = 0; /* N/A */
399849b49cdaSZbigniew Bodek 		stats->aInRangeLengthErrors = 0; /* N/A */
399949b49cdaSZbigniew Bodek 		stats->VLANTransmittedOK = 0; /* N/A */
400049b49cdaSZbigniew Bodek 		stats->VLANReceivedOK = 0; /* N/A */
4001*3fc36ee0SWojciech Macek 		stats->etherStatsOctets = al_reg_read32(&reg_stats->etherStatsOctets);
4002*3fc36ee0SWojciech Macek 		stats->etherStatsPkts64Octets = al_reg_read32(&reg_stats->etherStatsPkts64Octets);
4003*3fc36ee0SWojciech Macek 		stats->etherStatsPkts65to127Octets =
4004*3fc36ee0SWojciech Macek 			al_reg_read32(&reg_stats->etherStatsPkts65to127Octets);
4005*3fc36ee0SWojciech Macek 		stats->etherStatsPkts128to255Octets =
4006*3fc36ee0SWojciech Macek 			al_reg_read32(&reg_stats->etherStatsPkts128to255Octets);
4007*3fc36ee0SWojciech Macek 		stats->etherStatsPkts256to511Octets =
4008*3fc36ee0SWojciech Macek 			al_reg_read32(&reg_stats->etherStatsPkts256to511Octets);
4009*3fc36ee0SWojciech Macek 		stats->etherStatsPkts512to1023Octets =
4010*3fc36ee0SWojciech Macek 			al_reg_read32(&reg_stats->etherStatsPkts512to1023Octets);
4011*3fc36ee0SWojciech Macek 		stats->etherStatsPkts1024to1518Octets =
4012*3fc36ee0SWojciech Macek 			al_reg_read32(&reg_stats->etherStatsPkts1024to1518Octets);
4013*3fc36ee0SWojciech Macek 		stats->etherStatsPkts1519toX = al_reg_read32(&reg_stats->etherStatsPkts1519toX);
401449b49cdaSZbigniew Bodek 	} else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
401549b49cdaSZbigniew Bodek 		if (adapter->rev_id < AL_ETH_REV_ID_3) {
4016*3fc36ee0SWojciech Macek 			struct al_eth_mac_10g_stats_v2 __iomem *reg_stats =
4017*3fc36ee0SWojciech Macek 				&adapter->mac_regs_base->mac_10g.stats.v2;
401849b49cdaSZbigniew Bodek 			uint64_t octets;
401949b49cdaSZbigniew Bodek 
4020*3fc36ee0SWojciech Macek 			stats->ifInUcastPkts = al_reg_read32(&reg_stats->ifInUcastPkts);
4021*3fc36ee0SWojciech Macek 			stats->ifInMulticastPkts = al_reg_read32(&reg_stats->ifInMulticastPkts);
4022*3fc36ee0SWojciech Macek 			stats->ifInBroadcastPkts = al_reg_read32(&reg_stats->ifInBroadcastPkts);
4023*3fc36ee0SWojciech Macek 			stats->etherStatsPkts = al_reg_read32(&reg_stats->etherStatsPkts);
4024*3fc36ee0SWojciech Macek 			stats->ifOutUcastPkts = al_reg_read32(&reg_stats->ifOutUcastPkts);
4025*3fc36ee0SWojciech Macek 			stats->ifOutMulticastPkts = al_reg_read32(&reg_stats->ifOutMulticastPkts);
4026*3fc36ee0SWojciech Macek 			stats->ifOutBroadcastPkts = al_reg_read32(&reg_stats->ifOutBroadcastPkts);
4027*3fc36ee0SWojciech Macek 			stats->ifInErrors = al_reg_read32(&reg_stats->ifInErrors);
4028*3fc36ee0SWojciech Macek 			stats->ifOutErrors = al_reg_read32(&reg_stats->ifOutErrors);
4029*3fc36ee0SWojciech Macek 			stats->aFramesReceivedOK = al_reg_read32(&reg_stats->aFramesReceivedOK);
4030*3fc36ee0SWojciech Macek 			stats->aFramesTransmittedOK = al_reg_read32(&reg_stats->aFramesTransmittedOK);
403149b49cdaSZbigniew Bodek 
403249b49cdaSZbigniew Bodek 			/* aOctetsReceivedOK = ifInOctets - 18 * aFramesReceivedOK - 4 * VLANReceivedOK */
4033*3fc36ee0SWojciech Macek 			octets = al_reg_read32(&reg_stats->ifInOctetsL);
4034*3fc36ee0SWojciech Macek 			octets |= (uint64_t)(al_reg_read32(&reg_stats->ifInOctetsH)) << 32;
403549b49cdaSZbigniew Bodek 			octets -= 18 * stats->aFramesReceivedOK;
4036*3fc36ee0SWojciech Macek 			octets -= 4 * al_reg_read32(&reg_stats->VLANReceivedOK);
403749b49cdaSZbigniew Bodek 			stats->aOctetsReceivedOK = octets;
403849b49cdaSZbigniew Bodek 
403949b49cdaSZbigniew Bodek 			/* aOctetsTransmittedOK = ifOutOctets - 18 * aFramesTransmittedOK - 4 * VLANTransmittedOK */
4040*3fc36ee0SWojciech Macek 			octets = al_reg_read32(&reg_stats->ifOutOctetsL);
4041*3fc36ee0SWojciech Macek 			octets |= (uint64_t)(al_reg_read32(&reg_stats->ifOutOctetsH)) << 32;
404249b49cdaSZbigniew Bodek 			octets -= 18 * stats->aFramesTransmittedOK;
4043*3fc36ee0SWojciech Macek 			octets -= 4 * al_reg_read32(&reg_stats->VLANTransmittedOK);
404449b49cdaSZbigniew Bodek 			stats->aOctetsTransmittedOK = octets;
404549b49cdaSZbigniew Bodek 
4046*3fc36ee0SWojciech Macek 			stats->etherStatsUndersizePkts = al_reg_read32(&reg_stats->etherStatsUndersizePkts);
4047*3fc36ee0SWojciech Macek 			stats->etherStatsFragments = al_reg_read32(&reg_stats->etherStatsFragments);
4048*3fc36ee0SWojciech Macek 			stats->etherStatsJabbers = al_reg_read32(&reg_stats->etherStatsJabbers);
4049*3fc36ee0SWojciech Macek 			stats->etherStatsOversizePkts = al_reg_read32(&reg_stats->etherStatsOversizePkts);
4050*3fc36ee0SWojciech Macek 			stats->aFrameCheckSequenceErrors = al_reg_read32(&reg_stats->aFrameCheckSequenceErrors);
4051*3fc36ee0SWojciech Macek 			stats->aAlignmentErrors = al_reg_read32(&reg_stats->aAlignmentErrors);
4052*3fc36ee0SWojciech Macek 			stats->etherStatsDropEvents = al_reg_read32(&reg_stats->etherStatsDropEvents);
4053*3fc36ee0SWojciech Macek 			stats->aPAUSEMACCtrlFramesTransmitted = al_reg_read32(&reg_stats->aPAUSEMACCtrlFramesTransmitted);
4054*3fc36ee0SWojciech Macek 			stats->aPAUSEMACCtrlFramesReceived = al_reg_read32(&reg_stats->aPAUSEMACCtrlFramesReceived);
4055*3fc36ee0SWojciech Macek 			stats->aFrameTooLongErrors = al_reg_read32(&reg_stats->aFrameTooLongErrors);
4056*3fc36ee0SWojciech Macek 			stats->aInRangeLengthErrors = al_reg_read32(&reg_stats->aInRangeLengthErrors);
4057*3fc36ee0SWojciech Macek 			stats->VLANTransmittedOK = al_reg_read32(&reg_stats->VLANTransmittedOK);
4058*3fc36ee0SWojciech Macek 			stats->VLANReceivedOK = al_reg_read32(&reg_stats->VLANReceivedOK);
4059*3fc36ee0SWojciech Macek 			stats->etherStatsOctets = al_reg_read32(&reg_stats->etherStatsOctets);
4060*3fc36ee0SWojciech Macek 			stats->etherStatsPkts64Octets = al_reg_read32(&reg_stats->etherStatsPkts64Octets);
4061*3fc36ee0SWojciech Macek 			stats->etherStatsPkts65to127Octets = al_reg_read32(&reg_stats->etherStatsPkts65to127Octets);
4062*3fc36ee0SWojciech Macek 			stats->etherStatsPkts128to255Octets = al_reg_read32(&reg_stats->etherStatsPkts128to255Octets);
4063*3fc36ee0SWojciech Macek 			stats->etherStatsPkts256to511Octets = al_reg_read32(&reg_stats->etherStatsPkts256to511Octets);
4064*3fc36ee0SWojciech Macek 			stats->etherStatsPkts512to1023Octets = al_reg_read32(&reg_stats->etherStatsPkts512to1023Octets);
4065*3fc36ee0SWojciech Macek 			stats->etherStatsPkts1024to1518Octets = al_reg_read32(&reg_stats->etherStatsPkts1024to1518Octets);
4066*3fc36ee0SWojciech Macek 			stats->etherStatsPkts1519toX = al_reg_read32(&reg_stats->etherStatsPkts1519toX);
406749b49cdaSZbigniew Bodek 		} else {
4068*3fc36ee0SWojciech Macek 			struct al_eth_mac_10g_stats_v3_rx __iomem *reg_rx_stats =
4069*3fc36ee0SWojciech Macek 				&adapter->mac_regs_base->mac_10g.stats.v3.rx;
4070*3fc36ee0SWojciech Macek 			struct al_eth_mac_10g_stats_v3_tx __iomem *reg_tx_stats =
4071*3fc36ee0SWojciech Macek 				&adapter->mac_regs_base->mac_10g.stats.v3.tx;
407249b49cdaSZbigniew Bodek 			uint64_t octets;
407349b49cdaSZbigniew Bodek 
4074*3fc36ee0SWojciech Macek 			stats->ifInUcastPkts = al_reg_read32(&reg_rx_stats->ifInUcastPkts);
4075*3fc36ee0SWojciech Macek 			stats->ifInMulticastPkts = al_reg_read32(&reg_rx_stats->ifInMulticastPkts);
4076*3fc36ee0SWojciech Macek 			stats->ifInBroadcastPkts = al_reg_read32(&reg_rx_stats->ifInBroadcastPkts);
4077*3fc36ee0SWojciech Macek 			stats->etherStatsPkts = al_reg_read32(&reg_rx_stats->etherStatsPkts);
4078*3fc36ee0SWojciech Macek 			stats->ifOutUcastPkts = al_reg_read32(&reg_tx_stats->ifUcastPkts);
4079*3fc36ee0SWojciech Macek 			stats->ifOutMulticastPkts = al_reg_read32(&reg_tx_stats->ifMulticastPkts);
4080*3fc36ee0SWojciech Macek 			stats->ifOutBroadcastPkts = al_reg_read32(&reg_tx_stats->ifBroadcastPkts);
4081*3fc36ee0SWojciech Macek 			stats->ifInErrors = al_reg_read32(&reg_rx_stats->ifInErrors);
4082*3fc36ee0SWojciech Macek 			stats->ifOutErrors = al_reg_read32(&reg_tx_stats->ifOutErrors);
4083*3fc36ee0SWojciech Macek 			stats->aFramesReceivedOK = al_reg_read32(&reg_rx_stats->FramesOK);
4084*3fc36ee0SWojciech Macek 			stats->aFramesTransmittedOK = al_reg_read32(&reg_tx_stats->FramesOK);
4085*3fc36ee0SWojciech Macek 
408649b49cdaSZbigniew Bodek 			/* aOctetsReceivedOK = ifInOctets - 18 * aFramesReceivedOK - 4 * VLANReceivedOK */
4087*3fc36ee0SWojciech Macek 			octets = al_reg_read32(&reg_rx_stats->ifOctetsL);
4088*3fc36ee0SWojciech Macek 			octets |= (uint64_t)(al_reg_read32(&reg_rx_stats->ifOctetsH)) << 32;
408949b49cdaSZbigniew Bodek 			octets -= 18 * stats->aFramesReceivedOK;
4090*3fc36ee0SWojciech Macek 			octets -= 4 * al_reg_read32(&reg_rx_stats->VLANOK);
409149b49cdaSZbigniew Bodek 			stats->aOctetsReceivedOK = octets;
409249b49cdaSZbigniew Bodek 
409349b49cdaSZbigniew Bodek 			/* aOctetsTransmittedOK = ifOutOctets - 18 * aFramesTransmittedOK - 4 * VLANTransmittedOK */
4094*3fc36ee0SWojciech Macek 			octets = al_reg_read32(&reg_tx_stats->ifOctetsL);
4095*3fc36ee0SWojciech Macek 			octets |= (uint64_t)(al_reg_read32(&reg_tx_stats->ifOctetsH)) << 32;
409649b49cdaSZbigniew Bodek 			octets -= 18 * stats->aFramesTransmittedOK;
4097*3fc36ee0SWojciech Macek 			octets -= 4 * al_reg_read32(&reg_tx_stats->VLANOK);
409849b49cdaSZbigniew Bodek 			stats->aOctetsTransmittedOK = octets;
409949b49cdaSZbigniew Bodek 
4100*3fc36ee0SWojciech Macek 			stats->etherStatsUndersizePkts = al_reg_read32(&reg_rx_stats->etherStatsUndersizePkts);
4101*3fc36ee0SWojciech Macek 			stats->etherStatsFragments = al_reg_read32(&reg_rx_stats->etherStatsFragments);
4102*3fc36ee0SWojciech Macek 			stats->etherStatsJabbers = al_reg_read32(&reg_rx_stats->etherStatsJabbers);
4103*3fc36ee0SWojciech Macek 			stats->etherStatsOversizePkts = al_reg_read32(&reg_rx_stats->etherStatsOversizePkts);
4104*3fc36ee0SWojciech Macek 			stats->aFrameCheckSequenceErrors = al_reg_read32(&reg_rx_stats->CRCErrors);
4105*3fc36ee0SWojciech Macek 			stats->aAlignmentErrors = al_reg_read32(&reg_rx_stats->aAlignmentErrors);
4106*3fc36ee0SWojciech Macek 			stats->etherStatsDropEvents = al_reg_read32(&reg_rx_stats->etherStatsDropEvents);
4107*3fc36ee0SWojciech Macek 			stats->aPAUSEMACCtrlFramesTransmitted = al_reg_read32(&reg_tx_stats->aPAUSEMACCtrlFrames);
4108*3fc36ee0SWojciech Macek 			stats->aPAUSEMACCtrlFramesReceived = al_reg_read32(&reg_rx_stats->aPAUSEMACCtrlFrames);
4109*3fc36ee0SWojciech Macek 			stats->aFrameTooLongErrors = al_reg_read32(&reg_rx_stats->aFrameTooLong);
4110*3fc36ee0SWojciech Macek 			stats->aInRangeLengthErrors = al_reg_read32(&reg_rx_stats->aInRangeLengthErrors);
4111*3fc36ee0SWojciech Macek 			stats->VLANTransmittedOK = al_reg_read32(&reg_tx_stats->VLANOK);
4112*3fc36ee0SWojciech Macek 			stats->VLANReceivedOK = al_reg_read32(&reg_rx_stats->VLANOK);
4113*3fc36ee0SWojciech Macek 			stats->etherStatsOctets = al_reg_read32(&reg_rx_stats->etherStatsOctets);
4114*3fc36ee0SWojciech Macek 			stats->etherStatsPkts64Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts64Octets);
4115*3fc36ee0SWojciech Macek 			stats->etherStatsPkts65to127Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts65to127Octets);
4116*3fc36ee0SWojciech Macek 			stats->etherStatsPkts128to255Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts128to255Octets);
4117*3fc36ee0SWojciech Macek 			stats->etherStatsPkts256to511Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts256to511Octets);
4118*3fc36ee0SWojciech Macek 			stats->etherStatsPkts512to1023Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts512to1023Octets);
4119*3fc36ee0SWojciech Macek 			stats->etherStatsPkts1024to1518Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts1024to1518Octets);
4120*3fc36ee0SWojciech Macek 			stats->etherStatsPkts1519toX = al_reg_read32(&reg_rx_stats->etherStatsPkts1519toMax);
412149b49cdaSZbigniew Bodek 		}
412249b49cdaSZbigniew Bodek 	} else {
4123*3fc36ee0SWojciech Macek 		struct al_eth_mac_10g_stats_v3_rx __iomem *reg_rx_stats =
4124*3fc36ee0SWojciech Macek 			&adapter->mac_regs_base->mac_10g.stats.v3.rx;
4125*3fc36ee0SWojciech Macek 		struct al_eth_mac_10g_stats_v3_tx __iomem *reg_tx_stats =
4126*3fc36ee0SWojciech Macek 			&adapter->mac_regs_base->mac_10g.stats.v3.tx;
412749b49cdaSZbigniew Bodek 		uint64_t octets;
4128*3fc36ee0SWojciech Macek 
4129*3fc36ee0SWojciech Macek 		/* 40G MAC statistics registers are the same, only read indirectly */
4130*3fc36ee0SWojciech Macek 		#define _40g_mac_reg_read32(field)	al_eth_40g_mac_reg_read(adapter,	\
4131*3fc36ee0SWojciech Macek 			((uint8_t *)(field)) - ((uint8_t *)&adapter->mac_regs_base->mac_10g))
4132*3fc36ee0SWojciech Macek 
4133*3fc36ee0SWojciech Macek 		stats->ifInUcastPkts = _40g_mac_reg_read32(&reg_rx_stats->ifInUcastPkts);
4134*3fc36ee0SWojciech Macek 		stats->ifInMulticastPkts = _40g_mac_reg_read32(&reg_rx_stats->ifInMulticastPkts);
4135*3fc36ee0SWojciech Macek 		stats->ifInBroadcastPkts = _40g_mac_reg_read32(&reg_rx_stats->ifInBroadcastPkts);
4136*3fc36ee0SWojciech Macek 		stats->etherStatsPkts = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts);
4137*3fc36ee0SWojciech Macek 		stats->ifOutUcastPkts = _40g_mac_reg_read32(&reg_tx_stats->ifUcastPkts);
4138*3fc36ee0SWojciech Macek 		stats->ifOutMulticastPkts = _40g_mac_reg_read32(&reg_tx_stats->ifMulticastPkts);
4139*3fc36ee0SWojciech Macek 		stats->ifOutBroadcastPkts = _40g_mac_reg_read32(&reg_tx_stats->ifBroadcastPkts);
4140*3fc36ee0SWojciech Macek 		stats->ifInErrors = _40g_mac_reg_read32(&reg_rx_stats->ifInErrors);
4141*3fc36ee0SWojciech Macek 		stats->ifOutErrors = _40g_mac_reg_read32(&reg_tx_stats->ifOutErrors);
4142*3fc36ee0SWojciech Macek 		stats->aFramesReceivedOK = _40g_mac_reg_read32(&reg_rx_stats->FramesOK);
4143*3fc36ee0SWojciech Macek 		stats->aFramesTransmittedOK = _40g_mac_reg_read32(&reg_tx_stats->FramesOK);
414449b49cdaSZbigniew Bodek 
414549b49cdaSZbigniew Bodek 		/* aOctetsReceivedOK = ifInOctets - 18 * aFramesReceivedOK - 4 * VLANReceivedOK */
4146*3fc36ee0SWojciech Macek 		octets = _40g_mac_reg_read32(&reg_rx_stats->ifOctetsL);
4147*3fc36ee0SWojciech Macek 		octets |= (uint64_t)(_40g_mac_reg_read32(&reg_rx_stats->ifOctetsH)) << 32;
414849b49cdaSZbigniew Bodek 		octets -= 18 * stats->aFramesReceivedOK;
4149*3fc36ee0SWojciech Macek 		octets -= 4 * _40g_mac_reg_read32(&reg_rx_stats->VLANOK);
415049b49cdaSZbigniew Bodek 		stats->aOctetsReceivedOK = octets;
415149b49cdaSZbigniew Bodek 
4152*3fc36ee0SWojciech Macek 		/* aOctetsTransmittedOK = ifOutOctets - 18 * aFramesTransmittedOK - 4 * VLANTransmittedOK */
4153*3fc36ee0SWojciech Macek 		octets = _40g_mac_reg_read32(&reg_tx_stats->ifOctetsL);
4154*3fc36ee0SWojciech Macek 		octets |= (uint64_t)(_40g_mac_reg_read32(&reg_tx_stats->ifOctetsH)) << 32;
4155*3fc36ee0SWojciech Macek 		octets -= 18 * stats->aFramesTransmittedOK;
4156*3fc36ee0SWojciech Macek 		octets -= 4 * _40g_mac_reg_read32(&reg_tx_stats->VLANOK);
4157*3fc36ee0SWojciech Macek 		stats->aOctetsTransmittedOK = octets;
4158*3fc36ee0SWojciech Macek 
4159*3fc36ee0SWojciech Macek 		stats->etherStatsUndersizePkts = _40g_mac_reg_read32(&reg_rx_stats->etherStatsUndersizePkts);
4160*3fc36ee0SWojciech Macek 		stats->etherStatsFragments = _40g_mac_reg_read32(&reg_rx_stats->etherStatsFragments);
4161*3fc36ee0SWojciech Macek 		stats->etherStatsJabbers = _40g_mac_reg_read32(&reg_rx_stats->etherStatsJabbers);
4162*3fc36ee0SWojciech Macek 		stats->etherStatsOversizePkts = _40g_mac_reg_read32(&reg_rx_stats->etherStatsOversizePkts);
4163*3fc36ee0SWojciech Macek 		stats->aFrameCheckSequenceErrors = _40g_mac_reg_read32(&reg_rx_stats->CRCErrors);
4164*3fc36ee0SWojciech Macek 		stats->aAlignmentErrors = _40g_mac_reg_read32(&reg_rx_stats->aAlignmentErrors);
4165*3fc36ee0SWojciech Macek 		stats->etherStatsDropEvents = _40g_mac_reg_read32(&reg_rx_stats->etherStatsDropEvents);
4166*3fc36ee0SWojciech Macek 		stats->aPAUSEMACCtrlFramesTransmitted = _40g_mac_reg_read32(&reg_tx_stats->aPAUSEMACCtrlFrames);
4167*3fc36ee0SWojciech Macek 		stats->aPAUSEMACCtrlFramesReceived = _40g_mac_reg_read32(&reg_rx_stats->aPAUSEMACCtrlFrames);
4168*3fc36ee0SWojciech Macek 		stats->aFrameTooLongErrors = _40g_mac_reg_read32(&reg_rx_stats->aFrameTooLong);
4169*3fc36ee0SWojciech Macek 		stats->aInRangeLengthErrors = _40g_mac_reg_read32(&reg_rx_stats->aInRangeLengthErrors);
4170*3fc36ee0SWojciech Macek 		stats->VLANTransmittedOK = _40g_mac_reg_read32(&reg_tx_stats->VLANOK);
4171*3fc36ee0SWojciech Macek 		stats->VLANReceivedOK = _40g_mac_reg_read32(&reg_rx_stats->VLANOK);
4172*3fc36ee0SWojciech Macek 		stats->etherStatsOctets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsOctets);
4173*3fc36ee0SWojciech Macek 		stats->etherStatsPkts64Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts64Octets);
4174*3fc36ee0SWojciech Macek 		stats->etherStatsPkts65to127Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts65to127Octets);
4175*3fc36ee0SWojciech Macek 		stats->etherStatsPkts128to255Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts128to255Octets);
4176*3fc36ee0SWojciech Macek 		stats->etherStatsPkts256to511Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts256to511Octets);
4177*3fc36ee0SWojciech Macek 		stats->etherStatsPkts512to1023Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts512to1023Octets);
4178*3fc36ee0SWojciech Macek 		stats->etherStatsPkts1024to1518Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts1024to1518Octets);
4179*3fc36ee0SWojciech Macek 		stats->etherStatsPkts1519toX = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts1519toMax);
418049b49cdaSZbigniew Bodek 	}
418149b49cdaSZbigniew Bodek 
418249b49cdaSZbigniew Bodek 	stats->eee_in = al_reg_read32(&adapter->mac_regs_base->stat.eee_in);
418349b49cdaSZbigniew Bodek 	stats->eee_out = al_reg_read32(&adapter->mac_regs_base->stat.eee_out);
418449b49cdaSZbigniew Bodek 
418549b49cdaSZbigniew Bodek /*	stats->etherStatsPkts = 1; */
418649b49cdaSZbigniew Bodek 	return 0;
418749b49cdaSZbigniew Bodek }
418849b49cdaSZbigniew Bodek 
418949b49cdaSZbigniew Bodek /**
419049b49cdaSZbigniew Bodek * read ec_stat_counters
419149b49cdaSZbigniew Bodek */
al_eth_ec_stats_get(struct al_hal_eth_adapter * adapter,struct al_eth_ec_stats * stats)419249b49cdaSZbigniew Bodek int al_eth_ec_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_ec_stats *stats)
419349b49cdaSZbigniew Bodek {
419449b49cdaSZbigniew Bodek 	al_assert(stats);
419549b49cdaSZbigniew Bodek 	stats->faf_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.faf_in_rx_pkt);
419649b49cdaSZbigniew Bodek 	stats->faf_in_rx_short = al_reg_read32(&adapter->ec_regs_base->stat.faf_in_rx_short);
419749b49cdaSZbigniew Bodek 	stats->faf_in_rx_long = al_reg_read32(&adapter->ec_regs_base->stat.faf_in_rx_long);
419849b49cdaSZbigniew Bodek 	stats->faf_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.faf_out_rx_pkt);
419949b49cdaSZbigniew Bodek 	stats->faf_out_rx_short = al_reg_read32(&adapter->ec_regs_base->stat.faf_out_rx_short);
420049b49cdaSZbigniew Bodek 	stats->faf_out_rx_long = al_reg_read32(&adapter->ec_regs_base->stat.faf_out_rx_long);
420149b49cdaSZbigniew Bodek 	stats->faf_out_drop = al_reg_read32(&adapter->ec_regs_base->stat.faf_out_drop);
420249b49cdaSZbigniew Bodek 	stats->rxf_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_in_rx_pkt);
420349b49cdaSZbigniew Bodek 	stats->rxf_in_fifo_err = al_reg_read32(&adapter->ec_regs_base->stat.rxf_in_fifo_err);
420449b49cdaSZbigniew Bodek 	stats->lbf_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.lbf_in_rx_pkt);
420549b49cdaSZbigniew Bodek 	stats->lbf_in_fifo_err = al_reg_read32(&adapter->ec_regs_base->stat.lbf_in_fifo_err);
420649b49cdaSZbigniew Bodek 	stats->rxf_out_rx_1_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_out_rx_1_pkt);
420749b49cdaSZbigniew Bodek 	stats->rxf_out_rx_2_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_out_rx_2_pkt);
420849b49cdaSZbigniew Bodek 	stats->rxf_out_drop_1_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_out_drop_1_pkt);
420949b49cdaSZbigniew Bodek 	stats->rxf_out_drop_2_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_out_drop_2_pkt);
421049b49cdaSZbigniew Bodek 	stats->rpe_1_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_1_in_rx_pkt);
421149b49cdaSZbigniew Bodek 	stats->rpe_1_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_1_out_rx_pkt);
421249b49cdaSZbigniew Bodek 	stats->rpe_2_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_2_in_rx_pkt);
421349b49cdaSZbigniew Bodek 	stats->rpe_2_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_2_out_rx_pkt);
421449b49cdaSZbigniew Bodek 	stats->rpe_3_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_3_in_rx_pkt);
421549b49cdaSZbigniew Bodek 	stats->rpe_3_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_3_out_rx_pkt);
421649b49cdaSZbigniew Bodek 	stats->tpe_in_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tpe_in_tx_pkt);
421749b49cdaSZbigniew Bodek 	stats->tpe_out_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tpe_out_tx_pkt);
421849b49cdaSZbigniew Bodek 	stats->tpm_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tpm_tx_pkt);
421949b49cdaSZbigniew Bodek 	stats->tfw_in_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tfw_in_tx_pkt);
422049b49cdaSZbigniew Bodek 	stats->tfw_out_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tfw_out_tx_pkt);
422149b49cdaSZbigniew Bodek 	stats->rfw_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_rx_pkt);
422249b49cdaSZbigniew Bodek 	stats->rfw_in_vlan_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_vlan_drop);
422349b49cdaSZbigniew Bodek 	stats->rfw_in_parse_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_parse_drop);
422449b49cdaSZbigniew Bodek 	stats->rfw_in_mc = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_mc);
422549b49cdaSZbigniew Bodek 	stats->rfw_in_bc = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_bc);
422649b49cdaSZbigniew Bodek 	stats->rfw_in_vlan_exist = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_vlan_exist);
422749b49cdaSZbigniew Bodek 	stats->rfw_in_vlan_nexist = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_vlan_nexist);
422849b49cdaSZbigniew Bodek 	stats->rfw_in_mac_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_mac_drop);
422949b49cdaSZbigniew Bodek 	stats->rfw_in_mac_ndet_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_mac_ndet_drop);
423049b49cdaSZbigniew Bodek 	stats->rfw_in_ctrl_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_ctrl_drop);
423149b49cdaSZbigniew Bodek 	stats->rfw_in_prot_i_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_prot_i_drop);
423249b49cdaSZbigniew Bodek 	stats->eee_in = al_reg_read32(&adapter->ec_regs_base->stat.eee_in);
423349b49cdaSZbigniew Bodek 	return 0;
423449b49cdaSZbigniew Bodek }
423549b49cdaSZbigniew Bodek 
423649b49cdaSZbigniew Bodek /**
423749b49cdaSZbigniew Bodek  * read per_udma_counters
423849b49cdaSZbigniew Bodek  */
al_eth_ec_stat_udma_get(struct al_hal_eth_adapter * adapter,uint8_t idx,struct al_eth_ec_stat_udma * stats)423949b49cdaSZbigniew Bodek int al_eth_ec_stat_udma_get(struct al_hal_eth_adapter *adapter, uint8_t idx, struct al_eth_ec_stat_udma *stats)
424049b49cdaSZbigniew Bodek {
424149b49cdaSZbigniew Bodek 
424249b49cdaSZbigniew Bodek 	al_assert(idx <= 3); /*valid udma_id*/
424349b49cdaSZbigniew Bodek 	al_assert(stats);
424449b49cdaSZbigniew Bodek 	stats->rfw_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].rfw_out_rx_pkt);
424549b49cdaSZbigniew Bodek 	stats->rfw_out_drop = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].rfw_out_drop);
424649b49cdaSZbigniew Bodek 	stats->msw_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_in_rx_pkt);
424749b49cdaSZbigniew Bodek 	stats->msw_drop_q_full = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_drop_q_full);
424849b49cdaSZbigniew Bodek 	stats->msw_drop_sop = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_drop_sop);
424949b49cdaSZbigniew Bodek 	stats->msw_drop_eop = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_drop_eop);
425049b49cdaSZbigniew Bodek 	stats->msw_wr_eop = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_wr_eop);
425149b49cdaSZbigniew Bodek 	stats->msw_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_out_rx_pkt);
425249b49cdaSZbigniew Bodek 	stats->tso_no_tso_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tso_no_tso_pkt);
425349b49cdaSZbigniew Bodek 	stats->tso_tso_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tso_tso_pkt);
425449b49cdaSZbigniew Bodek 	stats->tso_seg_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tso_seg_pkt);
425549b49cdaSZbigniew Bodek 	stats->tso_pad_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tso_pad_pkt);
425649b49cdaSZbigniew Bodek 	stats->tpm_tx_spoof = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tpm_tx_spoof);
425749b49cdaSZbigniew Bodek 	stats->tmi_in_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tmi_in_tx_pkt);
425849b49cdaSZbigniew Bodek 	stats->tmi_out_to_mac = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tmi_out_to_mac);
425949b49cdaSZbigniew Bodek 	stats->tmi_out_to_rx = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tmi_out_to_rx);
426049b49cdaSZbigniew Bodek 	stats->tx_q0_bytes = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q0_bytes);
426149b49cdaSZbigniew Bodek 	stats->tx_q1_bytes = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q1_bytes);
426249b49cdaSZbigniew Bodek 	stats->tx_q2_bytes = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q2_bytes);
426349b49cdaSZbigniew Bodek 	stats->tx_q3_bytes = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q3_bytes);
426449b49cdaSZbigniew Bodek 	stats->tx_q0_pkts = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q0_pkts);
426549b49cdaSZbigniew Bodek 	stats->tx_q1_pkts = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q1_pkts);
426649b49cdaSZbigniew Bodek 	stats->tx_q2_pkts = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q2_pkts);
426749b49cdaSZbigniew Bodek 	stats->tx_q3_pkts = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q3_pkts);
426849b49cdaSZbigniew Bodek 	return 0;
426949b49cdaSZbigniew Bodek }
427049b49cdaSZbigniew Bodek 
427149b49cdaSZbigniew Bodek /* Traffic control */
427249b49cdaSZbigniew Bodek 
427349b49cdaSZbigniew Bodek 
al_eth_flr_rmn(int (* pci_read_config_u32)(void * handle,int where,uint32_t * val),int (* pci_write_config_u32)(void * handle,int where,uint32_t val),void * handle,void __iomem * mac_base)427449b49cdaSZbigniew Bodek int al_eth_flr_rmn(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val),
427549b49cdaSZbigniew Bodek 		   int (* pci_write_config_u32)(void *handle, int where, uint32_t val),
427649b49cdaSZbigniew Bodek 		   void *handle,
427749b49cdaSZbigniew Bodek 		   void __iomem	*mac_base)
427849b49cdaSZbigniew Bodek {
427949b49cdaSZbigniew Bodek 	struct al_eth_mac_regs __iomem *mac_regs_base =
428049b49cdaSZbigniew Bodek 		(struct	al_eth_mac_regs __iomem *)mac_base;
428149b49cdaSZbigniew Bodek 	uint32_t cfg_reg_store[6];
428249b49cdaSZbigniew Bodek 	uint32_t reg;
428349b49cdaSZbigniew Bodek 	uint32_t mux_sel;
428449b49cdaSZbigniew Bodek 	int i = 0;
428549b49cdaSZbigniew Bodek 
428649b49cdaSZbigniew Bodek 	(*pci_read_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, &reg);
428749b49cdaSZbigniew Bodek 
428849b49cdaSZbigniew Bodek 	/* reset 1G mac */
428949b49cdaSZbigniew Bodek 	AL_REG_MASK_SET(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC);
429049b49cdaSZbigniew Bodek 	(*pci_write_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, reg);
429149b49cdaSZbigniew Bodek 	al_udelay(1000);
429249b49cdaSZbigniew Bodek 	/* don't reset 1G mac */
429349b49cdaSZbigniew Bodek 	AL_REG_MASK_CLEAR(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC);
429449b49cdaSZbigniew Bodek 	/* prevent 1G mac reset on FLR */
429549b49cdaSZbigniew Bodek 	AL_REG_MASK_CLEAR(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC_ON_FLR);
429649b49cdaSZbigniew Bodek 	/* prevent adapter reset */
429749b49cdaSZbigniew Bodek 	(*pci_write_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, reg);
429849b49cdaSZbigniew Bodek 
429949b49cdaSZbigniew Bodek 	mux_sel = al_reg_read32(&mac_regs_base->gen.mux_sel);
430049b49cdaSZbigniew Bodek 
430149b49cdaSZbigniew Bodek 	/* save pci register that get reset due to flr*/
430249b49cdaSZbigniew Bodek 	(*pci_read_config_u32)(handle, AL_PCI_COMMAND, &cfg_reg_store[i++]);
430349b49cdaSZbigniew Bodek 	(*pci_read_config_u32)(handle, 0xC, &cfg_reg_store[i++]);
430449b49cdaSZbigniew Bodek 	(*pci_read_config_u32)(handle, 0x10, &cfg_reg_store[i++]);
430549b49cdaSZbigniew Bodek 	(*pci_read_config_u32)(handle, 0x18, &cfg_reg_store[i++]);
430649b49cdaSZbigniew Bodek 	(*pci_read_config_u32)(handle, 0x20, &cfg_reg_store[i++]);
430749b49cdaSZbigniew Bodek 	(*pci_read_config_u32)(handle, 0x110, &cfg_reg_store[i++]);
430849b49cdaSZbigniew Bodek 
430949b49cdaSZbigniew Bodek 	/* do flr */
431049b49cdaSZbigniew Bodek 	(*pci_write_config_u32)(handle, AL_PCI_EXP_CAP_BASE + AL_PCI_EXP_DEVCTL, AL_PCI_EXP_DEVCTL_BCR_FLR);
431149b49cdaSZbigniew Bodek 	al_udelay(1000);
431249b49cdaSZbigniew Bodek 	/* restore command */
431349b49cdaSZbigniew Bodek 	i = 0;
431449b49cdaSZbigniew Bodek 	(*pci_write_config_u32)(handle, AL_PCI_COMMAND, cfg_reg_store[i++]);
431549b49cdaSZbigniew Bodek 	(*pci_write_config_u32)(handle, 0xC, cfg_reg_store[i++]);
431649b49cdaSZbigniew Bodek 	(*pci_write_config_u32)(handle, 0x10, cfg_reg_store[i++]);
431749b49cdaSZbigniew Bodek 	(*pci_write_config_u32)(handle, 0x18, cfg_reg_store[i++]);
431849b49cdaSZbigniew Bodek 	(*pci_write_config_u32)(handle, 0x20, cfg_reg_store[i++]);
431949b49cdaSZbigniew Bodek 	(*pci_write_config_u32)(handle, 0x110, cfg_reg_store[i++]);
432049b49cdaSZbigniew Bodek 
432149b49cdaSZbigniew Bodek 	al_reg_write32_masked(&mac_regs_base->gen.mux_sel, ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, mux_sel);
432249b49cdaSZbigniew Bodek 
432349b49cdaSZbigniew Bodek 	/* set SGMII clock to 125MHz */
4324*3fc36ee0SWojciech Macek 	al_reg_write32(&mac_regs_base->sgmii.clk_div, 0x03320501);
432549b49cdaSZbigniew Bodek 
432649b49cdaSZbigniew Bodek 	/* reset 1G mac */
432749b49cdaSZbigniew Bodek 	AL_REG_MASK_SET(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC);
432849b49cdaSZbigniew Bodek 	(*pci_write_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, reg);
432949b49cdaSZbigniew Bodek 
433049b49cdaSZbigniew Bodek 	al_udelay(1000);
433149b49cdaSZbigniew Bodek 
433249b49cdaSZbigniew Bodek 	/* clear 1G mac reset */
433349b49cdaSZbigniew Bodek 	AL_REG_MASK_CLEAR(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC);
433449b49cdaSZbigniew Bodek 	(*pci_write_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, reg);
433549b49cdaSZbigniew Bodek 
433649b49cdaSZbigniew Bodek 	/* reset SGMII mac clock to default */
4337*3fc36ee0SWojciech Macek 	al_reg_write32(&mac_regs_base->sgmii.clk_div, 0x00320501);
433849b49cdaSZbigniew Bodek 	al_udelay(1000);
433949b49cdaSZbigniew Bodek 	/* reset async fifo */
4340*3fc36ee0SWojciech Macek 	reg = al_reg_read32(&mac_regs_base->gen.sd_fifo_ctrl);
434149b49cdaSZbigniew Bodek 	AL_REG_MASK_SET(reg, 0xF0);
4342*3fc36ee0SWojciech Macek 	al_reg_write32(&mac_regs_base->gen.sd_fifo_ctrl, reg);
4343*3fc36ee0SWojciech Macek 	reg = al_reg_read32(&mac_regs_base->gen.sd_fifo_ctrl);
434449b49cdaSZbigniew Bodek 	AL_REG_MASK_CLEAR(reg, 0xF0);
4345*3fc36ee0SWojciech Macek 	al_reg_write32(&mac_regs_base->gen.sd_fifo_ctrl, reg);
434649b49cdaSZbigniew Bodek 
434749b49cdaSZbigniew Bodek 	return 0;
434849b49cdaSZbigniew Bodek }
434949b49cdaSZbigniew Bodek 
al_eth_flr_rmn_restore_params(int (* pci_read_config_u32)(void * handle,int where,uint32_t * val),int (* pci_write_config_u32)(void * handle,int where,uint32_t val),void * handle,void __iomem * mac_base,void __iomem * ec_base,int mac_addresses_num)435049b49cdaSZbigniew Bodek int al_eth_flr_rmn_restore_params(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val),
435149b49cdaSZbigniew Bodek 		int (* pci_write_config_u32)(void *handle, int where, uint32_t val),
435249b49cdaSZbigniew Bodek 		void *handle,
435349b49cdaSZbigniew Bodek 		void __iomem    *mac_base,
435449b49cdaSZbigniew Bodek 		void __iomem    *ec_base,
435549b49cdaSZbigniew Bodek 		int     mac_addresses_num
435649b49cdaSZbigniew Bodek 		)
435749b49cdaSZbigniew Bodek {
435849b49cdaSZbigniew Bodek 	struct al_eth_board_params params = { .media_type = 0 };
435949b49cdaSZbigniew Bodek 	uint8_t mac_addr[6];
436049b49cdaSZbigniew Bodek 	int rc;
436149b49cdaSZbigniew Bodek 
436249b49cdaSZbigniew Bodek 	/* not implemented yet */
436349b49cdaSZbigniew Bodek 	if (mac_addresses_num > 1)
436449b49cdaSZbigniew Bodek 		return -EPERM;
436549b49cdaSZbigniew Bodek 
436649b49cdaSZbigniew Bodek 	/* save board params so we restore it after reset */
436749b49cdaSZbigniew Bodek 	al_eth_board_params_get(mac_base, &params);
436849b49cdaSZbigniew Bodek 	al_eth_mac_addr_read(ec_base, 0, mac_addr);
436949b49cdaSZbigniew Bodek 
437049b49cdaSZbigniew Bodek 	rc = al_eth_flr_rmn(pci_read_config_u32, pci_write_config_u32, handle, mac_base);
437149b49cdaSZbigniew Bodek 	al_eth_board_params_set(mac_base, &params);
437249b49cdaSZbigniew Bodek 	al_eth_mac_addr_store(ec_base, 0, mac_addr);
437349b49cdaSZbigniew Bodek 
437449b49cdaSZbigniew Bodek 	return rc;
437549b49cdaSZbigniew Bodek }
437649b49cdaSZbigniew Bodek 
437749b49cdaSZbigniew Bodek /* board params register 1 */
437849b49cdaSZbigniew Bodek #define AL_HAL_ETH_MEDIA_TYPE_MASK	(AL_FIELD_MASK(3, 0))
437949b49cdaSZbigniew Bodek #define AL_HAL_ETH_MEDIA_TYPE_SHIFT	0
438049b49cdaSZbigniew Bodek #define AL_HAL_ETH_EXT_PHY_SHIFT	4
438149b49cdaSZbigniew Bodek #define AL_HAL_ETH_PHY_ADDR_MASK	(AL_FIELD_MASK(9, 5))
438249b49cdaSZbigniew Bodek #define AL_HAL_ETH_PHY_ADDR_SHIFT	5
438349b49cdaSZbigniew Bodek #define AL_HAL_ETH_SFP_EXIST_SHIFT	10
438449b49cdaSZbigniew Bodek #define AL_HAL_ETH_AN_ENABLE_SHIFT	11
438549b49cdaSZbigniew Bodek #define AL_HAL_ETH_KR_LT_ENABLE_SHIFT	12
438649b49cdaSZbigniew Bodek #define AL_HAL_ETH_KR_FEC_ENABLE_SHIFT	13
438749b49cdaSZbigniew Bodek #define AL_HAL_ETH_MDIO_FREQ_MASK	(AL_FIELD_MASK(15, 14))
438849b49cdaSZbigniew Bodek #define AL_HAL_ETH_MDIO_FREQ_SHIFT	14
438949b49cdaSZbigniew Bodek #define AL_HAL_ETH_I2C_ADAPTER_ID_MASK	(AL_FIELD_MASK(19, 16))
439049b49cdaSZbigniew Bodek #define AL_HAL_ETH_I2C_ADAPTER_ID_SHIFT	16
439149b49cdaSZbigniew Bodek #define AL_HAL_ETH_EXT_PHY_IF_MASK	(AL_FIELD_MASK(21, 20))
439249b49cdaSZbigniew Bodek #define AL_HAL_ETH_EXT_PHY_IF_SHIFT	20
439349b49cdaSZbigniew Bodek #define AL_HAL_ETH_AUTO_NEG_MODE_SHIFT	22
4394*3fc36ee0SWojciech Macek #define AL_HAL_ETH_SERDES_GRP_2_SHIFT	23
439549b49cdaSZbigniew Bodek #define AL_HAL_ETH_SERDES_GRP_MASK	(AL_FIELD_MASK(26, 25))
439649b49cdaSZbigniew Bodek #define AL_HAL_ETH_SERDES_GRP_SHIFT	25
439749b49cdaSZbigniew Bodek #define AL_HAL_ETH_SERDES_LANE_MASK	(AL_FIELD_MASK(28, 27))
439849b49cdaSZbigniew Bodek #define AL_HAL_ETH_SERDES_LANE_SHIFT	27
439949b49cdaSZbigniew Bodek #define AL_HAL_ETH_REF_CLK_FREQ_MASK	(AL_FIELD_MASK(31, 29))
440049b49cdaSZbigniew Bodek #define AL_HAL_ETH_REF_CLK_FREQ_SHIFT	29
440149b49cdaSZbigniew Bodek 
440249b49cdaSZbigniew Bodek /* board params register 2 */
440349b49cdaSZbigniew Bodek #define AL_HAL_ETH_DONT_OVERRIDE_SERDES_SHIFT	0
440449b49cdaSZbigniew Bodek #define AL_HAL_ETH_1000_BASE_X_SHIFT		1
440549b49cdaSZbigniew Bodek #define AL_HAL_ETH_1G_AN_DISABLE_SHIFT		2
440649b49cdaSZbigniew Bodek #define AL_HAL_ETH_1G_SPEED_MASK		(AL_FIELD_MASK(4, 3))
440749b49cdaSZbigniew Bodek #define AL_HAL_ETH_1G_SPEED_SHIFT		3
440849b49cdaSZbigniew Bodek #define AL_HAL_ETH_1G_HALF_DUPLEX_SHIFT		5
440949b49cdaSZbigniew Bodek #define AL_HAL_ETH_1G_FC_DISABLE_SHIFT		6
441049b49cdaSZbigniew Bodek #define AL_HAL_ETH_RETIMER_EXIST_SHIFT		7
441149b49cdaSZbigniew Bodek #define AL_HAL_ETH_RETIMER_BUS_ID_MASK		(AL_FIELD_MASK(11, 8))
441249b49cdaSZbigniew Bodek #define AL_HAL_ETH_RETIMER_BUS_ID_SHIFT		8
441349b49cdaSZbigniew Bodek #define AL_HAL_ETH_RETIMER_I2C_ADDR_MASK	(AL_FIELD_MASK(18, 12))
441449b49cdaSZbigniew Bodek #define AL_HAL_ETH_RETIMER_I2C_ADDR_SHIFT	12
441549b49cdaSZbigniew Bodek #define AL_HAL_ETH_RETIMER_CHANNEL_SHIFT	19
441649b49cdaSZbigniew Bodek #define AL_HAL_ETH_DAC_LENGTH_MASK		(AL_FIELD_MASK(23, 20))
441749b49cdaSZbigniew Bodek #define AL_HAL_ETH_DAC_LENGTH_SHIFT		20
441849b49cdaSZbigniew Bodek #define AL_HAL_ETH_DAC_SHIFT			24
441949b49cdaSZbigniew Bodek #define AL_HAL_ETH_RETIMER_TYPE_MASK		(AL_FIELD_MASK(26, 25))
442049b49cdaSZbigniew Bodek #define AL_HAL_ETH_RETIMER_TYPE_SHIFT		25
4421*3fc36ee0SWojciech Macek #define AL_HAL_ETH_RETIMER_CHANNEL_2_MASK	(AL_FIELD_MASK(28, 27))
442249b49cdaSZbigniew Bodek #define AL_HAL_ETH_RETIMER_CHANNEL_2_SHIFT	27
4423*3fc36ee0SWojciech Macek #define AL_HAL_ETH_RETIMER_TX_CHANNEL_MASK	(AL_FIELD_MASK(31, 29))
4424*3fc36ee0SWojciech Macek #define AL_HAL_ETH_RETIMER_TX_CHANNEL_SHIFT	29
442549b49cdaSZbigniew Bodek 
4426*3fc36ee0SWojciech Macek /* board params register 3 */
4427*3fc36ee0SWojciech Macek #define AL_HAL_ETH_GPIO_SFP_PRESENT_MASK	(AL_FIELD_MASK(5, 0))
4428*3fc36ee0SWojciech Macek #define AL_HAL_ETH_GPIO_SFP_PRESENT_SHIFT	0
4429*3fc36ee0SWojciech Macek 
al_eth_board_params_set(void * __iomem mac_base,struct al_eth_board_params * params)4430*3fc36ee0SWojciech Macek int al_eth_board_params_set(void * __iomem mac_base, struct al_eth_board_params *params)
4431*3fc36ee0SWojciech Macek {
4432*3fc36ee0SWojciech Macek 	struct al_eth_mac_regs __iomem *mac_regs_base =
4433*3fc36ee0SWojciech Macek 		(struct	al_eth_mac_regs __iomem *)mac_base;
443449b49cdaSZbigniew Bodek 	uint32_t	reg = 0;
443549b49cdaSZbigniew Bodek 
443649b49cdaSZbigniew Bodek 	/* ************* Setting Board params register 1 **************** */
443749b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_MEDIA_TYPE_MASK,
443849b49cdaSZbigniew Bodek 			 AL_HAL_ETH_MEDIA_TYPE_SHIFT, params->media_type);
443949b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_EXT_PHY_SHIFT, params->phy_exist == AL_TRUE);
444049b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_PHY_ADDR_MASK,
444149b49cdaSZbigniew Bodek 			 AL_HAL_ETH_PHY_ADDR_SHIFT, params->phy_mdio_addr);
444249b49cdaSZbigniew Bodek 
444349b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_SFP_EXIST_SHIFT, params->sfp_plus_module_exist == AL_TRUE);
444449b49cdaSZbigniew Bodek 
444549b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_AN_ENABLE_SHIFT, params->autoneg_enable == AL_TRUE);
444649b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_KR_LT_ENABLE_SHIFT, params->kr_lt_enable == AL_TRUE);
444749b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_KR_FEC_ENABLE_SHIFT, params->kr_fec_enable == AL_TRUE);
444849b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_MDIO_FREQ_MASK,
444949b49cdaSZbigniew Bodek 			 AL_HAL_ETH_MDIO_FREQ_SHIFT, params->mdio_freq);
445049b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_I2C_ADAPTER_ID_MASK,
445149b49cdaSZbigniew Bodek 			 AL_HAL_ETH_I2C_ADAPTER_ID_SHIFT, params->i2c_adapter_id);
445249b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_EXT_PHY_IF_MASK,
445349b49cdaSZbigniew Bodek 			 AL_HAL_ETH_EXT_PHY_IF_SHIFT, params->phy_if);
445449b49cdaSZbigniew Bodek 
445549b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_AUTO_NEG_MODE_SHIFT,
445649b49cdaSZbigniew Bodek 			   params->an_mode == AL_ETH_BOARD_AUTONEG_IN_BAND);
445749b49cdaSZbigniew Bodek 
445849b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_SERDES_GRP_MASK,
445949b49cdaSZbigniew Bodek 			 AL_HAL_ETH_SERDES_GRP_SHIFT, params->serdes_grp);
4460*3fc36ee0SWojciech Macek 
4461*3fc36ee0SWojciech Macek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_SERDES_GRP_2_SHIFT,
4462*3fc36ee0SWojciech Macek 			(params->serdes_grp & AL_BIT(2)) ? 1 : 0);
4463*3fc36ee0SWojciech Macek 
446449b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_SERDES_LANE_MASK,
446549b49cdaSZbigniew Bodek 			 AL_HAL_ETH_SERDES_LANE_SHIFT, params->serdes_lane);
446649b49cdaSZbigniew Bodek 
446749b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_REF_CLK_FREQ_MASK,
446849b49cdaSZbigniew Bodek 			 AL_HAL_ETH_REF_CLK_FREQ_SHIFT, params->ref_clk_freq);
446949b49cdaSZbigniew Bodek 
447049b49cdaSZbigniew Bodek 	al_assert(reg != 0);
447149b49cdaSZbigniew Bodek 
4472*3fc36ee0SWojciech Macek 	al_reg_write32(&mac_regs_base->mac_1g.scratch, reg);
447349b49cdaSZbigniew Bodek 
447449b49cdaSZbigniew Bodek 	/* ************* Setting Board params register 2 **************** */
447549b49cdaSZbigniew Bodek 	reg = 0;
447649b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_DONT_OVERRIDE_SERDES_SHIFT,
447749b49cdaSZbigniew Bodek 			   params->dont_override_serdes == AL_TRUE);
447849b49cdaSZbigniew Bodek 
447949b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_1000_BASE_X_SHIFT,
448049b49cdaSZbigniew Bodek 			   params->force_1000_base_x == AL_TRUE);
448149b49cdaSZbigniew Bodek 
448249b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_1G_AN_DISABLE_SHIFT,
448349b49cdaSZbigniew Bodek 			   params->an_disable == AL_TRUE);
448449b49cdaSZbigniew Bodek 
448549b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_1G_SPEED_MASK,
448649b49cdaSZbigniew Bodek 			 AL_HAL_ETH_1G_SPEED_SHIFT, params->speed);
448749b49cdaSZbigniew Bodek 
448849b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_1G_HALF_DUPLEX_SHIFT,
448949b49cdaSZbigniew Bodek 			   params->half_duplex == AL_TRUE);
449049b49cdaSZbigniew Bodek 
449149b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_1G_FC_DISABLE_SHIFT,
449249b49cdaSZbigniew Bodek 			   params->fc_disable == AL_TRUE);
449349b49cdaSZbigniew Bodek 
449449b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_RETIMER_EXIST_SHIFT, params->retimer_exist == AL_TRUE);
449549b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_BUS_ID_MASK,
449649b49cdaSZbigniew Bodek 			 AL_HAL_ETH_RETIMER_BUS_ID_SHIFT, params->retimer_bus_id);
449749b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_I2C_ADDR_MASK,
449849b49cdaSZbigniew Bodek 			 AL_HAL_ETH_RETIMER_I2C_ADDR_SHIFT, params->retimer_i2c_addr);
449949b49cdaSZbigniew Bodek 
450049b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_RETIMER_CHANNEL_SHIFT,
4501*3fc36ee0SWojciech Macek 				(params->retimer_channel & AL_BIT(0)));
450249b49cdaSZbigniew Bodek 
4503*3fc36ee0SWojciech Macek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_CHANNEL_2_MASK,
4504*3fc36ee0SWojciech Macek 			 AL_HAL_ETH_RETIMER_CHANNEL_2_SHIFT,
4505*3fc36ee0SWojciech Macek 			 (AL_REG_FIELD_GET(params->retimer_channel, 0x6, 1)));
450649b49cdaSZbigniew Bodek 
450749b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_DAC_LENGTH_MASK,
450849b49cdaSZbigniew Bodek 			 AL_HAL_ETH_DAC_LENGTH_SHIFT, params->dac_len);
450949b49cdaSZbigniew Bodek 	AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_DAC_SHIFT, params->dac);
451049b49cdaSZbigniew Bodek 
451149b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_TYPE_MASK,
451249b49cdaSZbigniew Bodek 			 AL_HAL_ETH_RETIMER_TYPE_SHIFT, params->retimer_type);
451349b49cdaSZbigniew Bodek 
4514*3fc36ee0SWojciech Macek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_TX_CHANNEL_MASK,
4515*3fc36ee0SWojciech Macek 			 AL_HAL_ETH_RETIMER_TX_CHANNEL_SHIFT,
4516*3fc36ee0SWojciech Macek 			 params->retimer_tx_channel);
4517*3fc36ee0SWojciech Macek 
4518*3fc36ee0SWojciech Macek 	al_reg_write32(&mac_regs_base->mac_10g.scratch, reg);
4519*3fc36ee0SWojciech Macek 
4520*3fc36ee0SWojciech Macek 	/* ************* Setting Board params register 3 **************** */
4521*3fc36ee0SWojciech Macek 	reg = 0;
4522*3fc36ee0SWojciech Macek 
4523*3fc36ee0SWojciech Macek 	AL_REG_FIELD_SET(reg, AL_HAL_ETH_GPIO_SFP_PRESENT_MASK,
4524*3fc36ee0SWojciech Macek 			 AL_HAL_ETH_GPIO_SFP_PRESENT_SHIFT,
4525*3fc36ee0SWojciech Macek 			 params->gpio_sfp_present);
4526*3fc36ee0SWojciech Macek 
4527*3fc36ee0SWojciech Macek 	al_reg_write32(&mac_regs_base->mac_1g.mac_0, reg);
4528*3fc36ee0SWojciech Macek 
452949b49cdaSZbigniew Bodek 	return 0;
453049b49cdaSZbigniew Bodek }
453149b49cdaSZbigniew Bodek 
al_eth_board_params_get(void * __iomem mac_base,struct al_eth_board_params * params)4532*3fc36ee0SWojciech Macek int al_eth_board_params_get(void * __iomem mac_base, struct al_eth_board_params *params)
4533*3fc36ee0SWojciech Macek {
4534*3fc36ee0SWojciech Macek 	struct al_eth_mac_regs __iomem *mac_regs_base =
4535*3fc36ee0SWojciech Macek 		(struct	al_eth_mac_regs __iomem *)mac_base;
4536*3fc36ee0SWojciech Macek 	uint32_t	reg = al_reg_read32(&mac_regs_base->mac_1g.scratch);
453749b49cdaSZbigniew Bodek 
453849b49cdaSZbigniew Bodek 	/* check if the register was initialized, 0 is not a valid value */
453949b49cdaSZbigniew Bodek 	if (reg == 0)
454049b49cdaSZbigniew Bodek 		return -ENOENT;
454149b49cdaSZbigniew Bodek 
454249b49cdaSZbigniew Bodek 	/* ************* Getting Board params register 1 **************** */
454349b49cdaSZbigniew Bodek 	params->media_type = AL_REG_FIELD_GET(reg, AL_HAL_ETH_MEDIA_TYPE_MASK,
454449b49cdaSZbigniew Bodek 					      AL_HAL_ETH_MEDIA_TYPE_SHIFT);
454549b49cdaSZbigniew Bodek 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_EXT_PHY_SHIFT))
454649b49cdaSZbigniew Bodek 		params->phy_exist = AL_TRUE;
454749b49cdaSZbigniew Bodek 	else
454849b49cdaSZbigniew Bodek 		params->phy_exist = AL_FALSE;
454949b49cdaSZbigniew Bodek 
455049b49cdaSZbigniew Bodek 	params->phy_mdio_addr = AL_REG_FIELD_GET(reg, AL_HAL_ETH_PHY_ADDR_MASK,
455149b49cdaSZbigniew Bodek 						 AL_HAL_ETH_PHY_ADDR_SHIFT);
455249b49cdaSZbigniew Bodek 
455349b49cdaSZbigniew Bodek 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_SFP_EXIST_SHIFT))
455449b49cdaSZbigniew Bodek 		params->sfp_plus_module_exist = AL_TRUE;
455549b49cdaSZbigniew Bodek 	else
455649b49cdaSZbigniew Bodek 		params->sfp_plus_module_exist = AL_FALSE;
455749b49cdaSZbigniew Bodek 
455849b49cdaSZbigniew Bodek 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_AN_ENABLE_SHIFT))
455949b49cdaSZbigniew Bodek 		params->autoneg_enable = AL_TRUE;
456049b49cdaSZbigniew Bodek 	else
456149b49cdaSZbigniew Bodek 		params->autoneg_enable = AL_FALSE;
456249b49cdaSZbigniew Bodek 
456349b49cdaSZbigniew Bodek 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_KR_LT_ENABLE_SHIFT))
456449b49cdaSZbigniew Bodek 		params->kr_lt_enable = AL_TRUE;
456549b49cdaSZbigniew Bodek 	else
456649b49cdaSZbigniew Bodek 		params->kr_lt_enable = AL_FALSE;
456749b49cdaSZbigniew Bodek 
456849b49cdaSZbigniew Bodek 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_KR_FEC_ENABLE_SHIFT))
456949b49cdaSZbigniew Bodek 		params->kr_fec_enable = AL_TRUE;
457049b49cdaSZbigniew Bodek 	else
457149b49cdaSZbigniew Bodek 		params->kr_fec_enable = AL_FALSE;
457249b49cdaSZbigniew Bodek 
457349b49cdaSZbigniew Bodek 	params->mdio_freq = AL_REG_FIELD_GET(reg,
457449b49cdaSZbigniew Bodek 					     AL_HAL_ETH_MDIO_FREQ_MASK,
457549b49cdaSZbigniew Bodek 					     AL_HAL_ETH_MDIO_FREQ_SHIFT);
457649b49cdaSZbigniew Bodek 
457749b49cdaSZbigniew Bodek 	params->i2c_adapter_id = AL_REG_FIELD_GET(reg,
457849b49cdaSZbigniew Bodek 						  AL_HAL_ETH_I2C_ADAPTER_ID_MASK,
457949b49cdaSZbigniew Bodek 						  AL_HAL_ETH_I2C_ADAPTER_ID_SHIFT);
458049b49cdaSZbigniew Bodek 
458149b49cdaSZbigniew Bodek 	params->phy_if = AL_REG_FIELD_GET(reg,
458249b49cdaSZbigniew Bodek 					  AL_HAL_ETH_EXT_PHY_IF_MASK,
458349b49cdaSZbigniew Bodek 					  AL_HAL_ETH_EXT_PHY_IF_SHIFT);
458449b49cdaSZbigniew Bodek 
458549b49cdaSZbigniew Bodek 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_AUTO_NEG_MODE_SHIFT))
458649b49cdaSZbigniew Bodek 		params->an_mode = AL_TRUE;
458749b49cdaSZbigniew Bodek 	else
458849b49cdaSZbigniew Bodek 		params->an_mode = AL_FALSE;
458949b49cdaSZbigniew Bodek 
459049b49cdaSZbigniew Bodek 	params->serdes_grp = AL_REG_FIELD_GET(reg,
459149b49cdaSZbigniew Bodek 					      AL_HAL_ETH_SERDES_GRP_MASK,
459249b49cdaSZbigniew Bodek 					      AL_HAL_ETH_SERDES_GRP_SHIFT);
459349b49cdaSZbigniew Bodek 
4594*3fc36ee0SWojciech Macek 	params->serdes_grp |= (AL_REG_BIT_GET(reg, AL_HAL_ETH_SERDES_GRP_2_SHIFT) ? AL_BIT(2) : 0);
4595*3fc36ee0SWojciech Macek 
459649b49cdaSZbigniew Bodek 	params->serdes_lane = AL_REG_FIELD_GET(reg,
459749b49cdaSZbigniew Bodek 					       AL_HAL_ETH_SERDES_LANE_MASK,
459849b49cdaSZbigniew Bodek 					       AL_HAL_ETH_SERDES_LANE_SHIFT);
459949b49cdaSZbigniew Bodek 
460049b49cdaSZbigniew Bodek 	params->ref_clk_freq = AL_REG_FIELD_GET(reg,
460149b49cdaSZbigniew Bodek 						AL_HAL_ETH_REF_CLK_FREQ_MASK,
460249b49cdaSZbigniew Bodek 						AL_HAL_ETH_REF_CLK_FREQ_SHIFT);
460349b49cdaSZbigniew Bodek 
460449b49cdaSZbigniew Bodek 	/* ************* Getting Board params register 2 **************** */
4605*3fc36ee0SWojciech Macek 	reg = al_reg_read32(&mac_regs_base->mac_10g.scratch);
460649b49cdaSZbigniew Bodek 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_DONT_OVERRIDE_SERDES_SHIFT))
460749b49cdaSZbigniew Bodek 		params->dont_override_serdes = AL_TRUE;
460849b49cdaSZbigniew Bodek 	else
460949b49cdaSZbigniew Bodek 		params->dont_override_serdes = AL_FALSE;
461049b49cdaSZbigniew Bodek 
461149b49cdaSZbigniew Bodek 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_1000_BASE_X_SHIFT))
461249b49cdaSZbigniew Bodek 		params->force_1000_base_x = AL_TRUE;
461349b49cdaSZbigniew Bodek 	else
461449b49cdaSZbigniew Bodek 		params->force_1000_base_x = AL_FALSE;
461549b49cdaSZbigniew Bodek 
461649b49cdaSZbigniew Bodek 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_1G_AN_DISABLE_SHIFT))
461749b49cdaSZbigniew Bodek 		params->an_disable = AL_TRUE;
461849b49cdaSZbigniew Bodek 	else
461949b49cdaSZbigniew Bodek 		params->an_disable = AL_FALSE;
462049b49cdaSZbigniew Bodek 
462149b49cdaSZbigniew Bodek 	params->speed = AL_REG_FIELD_GET(reg,
462249b49cdaSZbigniew Bodek 					 AL_HAL_ETH_1G_SPEED_MASK,
462349b49cdaSZbigniew Bodek 					 AL_HAL_ETH_1G_SPEED_SHIFT);
462449b49cdaSZbigniew Bodek 
462549b49cdaSZbigniew Bodek 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_1G_HALF_DUPLEX_SHIFT))
462649b49cdaSZbigniew Bodek 		params->half_duplex = AL_TRUE;
462749b49cdaSZbigniew Bodek 	else
462849b49cdaSZbigniew Bodek 		params->half_duplex = AL_FALSE;
462949b49cdaSZbigniew Bodek 
463049b49cdaSZbigniew Bodek 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_1G_FC_DISABLE_SHIFT))
463149b49cdaSZbigniew Bodek 		params->fc_disable = AL_TRUE;
463249b49cdaSZbigniew Bodek 	else
463349b49cdaSZbigniew Bodek 		params->fc_disable = AL_FALSE;
463449b49cdaSZbigniew Bodek 
463549b49cdaSZbigniew Bodek 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_RETIMER_EXIST_SHIFT))
463649b49cdaSZbigniew Bodek 		params->retimer_exist = AL_TRUE;
463749b49cdaSZbigniew Bodek 	else
463849b49cdaSZbigniew Bodek 		params->retimer_exist = AL_FALSE;
463949b49cdaSZbigniew Bodek 
464049b49cdaSZbigniew Bodek 	params->retimer_bus_id = AL_REG_FIELD_GET(reg,
464149b49cdaSZbigniew Bodek 					       AL_HAL_ETH_RETIMER_BUS_ID_MASK,
464249b49cdaSZbigniew Bodek 					       AL_HAL_ETH_RETIMER_BUS_ID_SHIFT);
464349b49cdaSZbigniew Bodek 	params->retimer_i2c_addr = AL_REG_FIELD_GET(reg,
464449b49cdaSZbigniew Bodek 					       AL_HAL_ETH_RETIMER_I2C_ADDR_MASK,
464549b49cdaSZbigniew Bodek 					       AL_HAL_ETH_RETIMER_I2C_ADDR_SHIFT);
464649b49cdaSZbigniew Bodek 
464749b49cdaSZbigniew Bodek 	params->retimer_channel =
464849b49cdaSZbigniew Bodek 		((AL_REG_BIT_GET(reg, AL_HAL_ETH_RETIMER_CHANNEL_SHIFT)) |
4649*3fc36ee0SWojciech Macek 		 (AL_REG_FIELD_GET(reg, AL_HAL_ETH_RETIMER_CHANNEL_2_MASK,
4650*3fc36ee0SWojciech Macek 				   AL_HAL_ETH_RETIMER_CHANNEL_2_SHIFT) << 1));
465149b49cdaSZbigniew Bodek 
465249b49cdaSZbigniew Bodek 	params->dac_len = AL_REG_FIELD_GET(reg,
465349b49cdaSZbigniew Bodek 					   AL_HAL_ETH_DAC_LENGTH_MASK,
465449b49cdaSZbigniew Bodek 					   AL_HAL_ETH_DAC_LENGTH_SHIFT);
465549b49cdaSZbigniew Bodek 
465649b49cdaSZbigniew Bodek 	if (AL_REG_BIT_GET(reg, AL_HAL_ETH_DAC_SHIFT))
465749b49cdaSZbigniew Bodek 		params->dac = AL_TRUE;
465849b49cdaSZbigniew Bodek 	else
465949b49cdaSZbigniew Bodek 		params->dac = AL_FALSE;
466049b49cdaSZbigniew Bodek 
466149b49cdaSZbigniew Bodek 	params->retimer_type = AL_REG_FIELD_GET(reg,
466249b49cdaSZbigniew Bodek 					   AL_HAL_ETH_RETIMER_TYPE_MASK,
466349b49cdaSZbigniew Bodek 					   AL_HAL_ETH_RETIMER_TYPE_SHIFT);
466449b49cdaSZbigniew Bodek 
4665*3fc36ee0SWojciech Macek 	params->retimer_tx_channel = AL_REG_FIELD_GET(reg,
4666*3fc36ee0SWojciech Macek 					   AL_HAL_ETH_RETIMER_TX_CHANNEL_MASK,
4667*3fc36ee0SWojciech Macek 					   AL_HAL_ETH_RETIMER_TX_CHANNEL_SHIFT);
4668*3fc36ee0SWojciech Macek 
4669*3fc36ee0SWojciech Macek 	/* ************* Getting Board params register 3 **************** */
4670*3fc36ee0SWojciech Macek 	reg = al_reg_read32(&mac_regs_base->mac_1g.mac_0);
4671*3fc36ee0SWojciech Macek 
4672*3fc36ee0SWojciech Macek 	params->gpio_sfp_present = AL_REG_FIELD_GET(reg,
4673*3fc36ee0SWojciech Macek 					AL_HAL_ETH_GPIO_SFP_PRESENT_MASK,
4674*3fc36ee0SWojciech Macek 					AL_HAL_ETH_GPIO_SFP_PRESENT_SHIFT);
4675*3fc36ee0SWojciech Macek 
467649b49cdaSZbigniew Bodek 	return 0;
467749b49cdaSZbigniew Bodek }
467849b49cdaSZbigniew Bodek 
467949b49cdaSZbigniew Bodek /* Wake-On-Lan (WoL) */
al_eth_byte_arr_to_reg(uint32_t * reg,uint8_t * arr,unsigned int num_bytes)468049b49cdaSZbigniew Bodek static inline void al_eth_byte_arr_to_reg(
468149b49cdaSZbigniew Bodek 		uint32_t *reg, uint8_t *arr, unsigned int num_bytes)
468249b49cdaSZbigniew Bodek {
468349b49cdaSZbigniew Bodek 	uint32_t mask = 0xff;
468449b49cdaSZbigniew Bodek 	unsigned int i;
468549b49cdaSZbigniew Bodek 
468649b49cdaSZbigniew Bodek 	al_assert(num_bytes <= 4);
468749b49cdaSZbigniew Bodek 
468849b49cdaSZbigniew Bodek 	*reg = 0;
468949b49cdaSZbigniew Bodek 
469049b49cdaSZbigniew Bodek 	for (i = 0 ; i < num_bytes ; i++) {
469149b49cdaSZbigniew Bodek 		AL_REG_FIELD_SET(*reg, mask, (sizeof(uint8_t) * i), arr[i]);
469249b49cdaSZbigniew Bodek 		mask = mask << sizeof(uint8_t);
469349b49cdaSZbigniew Bodek 	}
469449b49cdaSZbigniew Bodek }
469549b49cdaSZbigniew Bodek 
al_eth_wol_enable(struct al_hal_eth_adapter * adapter,struct al_eth_wol_params * wol)469649b49cdaSZbigniew Bodek int al_eth_wol_enable(
469749b49cdaSZbigniew Bodek 		struct al_hal_eth_adapter *adapter,
469849b49cdaSZbigniew Bodek 		struct al_eth_wol_params *wol)
469949b49cdaSZbigniew Bodek {
470049b49cdaSZbigniew Bodek 	uint32_t reg = 0;
470149b49cdaSZbigniew Bodek 
470249b49cdaSZbigniew Bodek 	if (wol->int_mask & AL_ETH_WOL_INT_MAGIC_PSWD) {
470349b49cdaSZbigniew Bodek 		al_assert(wol->pswd != NULL);
470449b49cdaSZbigniew Bodek 
470549b49cdaSZbigniew Bodek 		al_eth_byte_arr_to_reg(&reg, &wol->pswd[0], 4);
470649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->wol.magic_pswd_l, reg);
470749b49cdaSZbigniew Bodek 
470849b49cdaSZbigniew Bodek 		al_eth_byte_arr_to_reg(&reg, &wol->pswd[4], 2);
470949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->wol.magic_pswd_h, reg);
471049b49cdaSZbigniew Bodek 	}
471149b49cdaSZbigniew Bodek 
471249b49cdaSZbigniew Bodek 	if (wol->int_mask & AL_ETH_WOL_INT_IPV4) {
471349b49cdaSZbigniew Bodek 		al_assert(wol->ipv4 != NULL);
471449b49cdaSZbigniew Bodek 
471549b49cdaSZbigniew Bodek 		al_eth_byte_arr_to_reg(&reg, &wol->ipv4[0], 4);
471649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->wol.ipv4_dip, reg);
471749b49cdaSZbigniew Bodek 	}
471849b49cdaSZbigniew Bodek 
471949b49cdaSZbigniew Bodek 	if (wol->int_mask & AL_ETH_WOL_INT_IPV6) {
472049b49cdaSZbigniew Bodek 		al_assert(wol->ipv6 != NULL);
472149b49cdaSZbigniew Bodek 
472249b49cdaSZbigniew Bodek 		al_eth_byte_arr_to_reg(&reg, &wol->ipv6[0], 4);
472349b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->wol.ipv6_dip_word0, reg);
472449b49cdaSZbigniew Bodek 
472549b49cdaSZbigniew Bodek 		al_eth_byte_arr_to_reg(&reg, &wol->ipv6[4], 4);
472649b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->wol.ipv6_dip_word1, reg);
472749b49cdaSZbigniew Bodek 
472849b49cdaSZbigniew Bodek 		al_eth_byte_arr_to_reg(&reg, &wol->ipv6[8], 4);
472949b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->wol.ipv6_dip_word2, reg);
473049b49cdaSZbigniew Bodek 
473149b49cdaSZbigniew Bodek 		al_eth_byte_arr_to_reg(&reg, &wol->ipv6[12], 4);
473249b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->wol.ipv6_dip_word3, reg);
473349b49cdaSZbigniew Bodek 	}
473449b49cdaSZbigniew Bodek 
473549b49cdaSZbigniew Bodek 	if (wol->int_mask &
473649b49cdaSZbigniew Bodek 		(AL_ETH_WOL_INT_ETHERTYPE_BC | AL_ETH_WOL_INT_ETHERTYPE_DA)) {
473749b49cdaSZbigniew Bodek 
473849b49cdaSZbigniew Bodek 		reg = ((uint32_t)wol->ethr_type2 << 16);
473949b49cdaSZbigniew Bodek 		reg |= wol->ethr_type1;
474049b49cdaSZbigniew Bodek 
474149b49cdaSZbigniew Bodek 		al_reg_write32(&adapter->ec_regs_base->wol.ethertype, reg);
474249b49cdaSZbigniew Bodek 	}
474349b49cdaSZbigniew Bodek 
474449b49cdaSZbigniew Bodek 	/* make sure we dont forwarding packets without interrupt */
474549b49cdaSZbigniew Bodek 	al_assert((wol->forward_mask | wol->int_mask) == wol->int_mask);
474649b49cdaSZbigniew Bodek 
474749b49cdaSZbigniew Bodek 	reg = ((uint32_t)wol->forward_mask << 16);
474849b49cdaSZbigniew Bodek 	reg |= wol->int_mask;
474949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->wol.wol_en, reg);
475049b49cdaSZbigniew Bodek 
475149b49cdaSZbigniew Bodek 	return 0;
475249b49cdaSZbigniew Bodek }
475349b49cdaSZbigniew Bodek 
al_eth_wol_disable(struct al_hal_eth_adapter * adapter)475449b49cdaSZbigniew Bodek int al_eth_wol_disable(
475549b49cdaSZbigniew Bodek 		struct al_hal_eth_adapter *adapter)
475649b49cdaSZbigniew Bodek {
475749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->wol.wol_en, 0);
475849b49cdaSZbigniew Bodek 
475949b49cdaSZbigniew Bodek 	return 0;
476049b49cdaSZbigniew Bodek }
476149b49cdaSZbigniew Bodek 
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)476249b49cdaSZbigniew Bodek int al_eth_tx_fwd_vid_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
476349b49cdaSZbigniew Bodek 				uint8_t udma_mask, al_bool fwd_to_mac)
476449b49cdaSZbigniew Bodek {
476549b49cdaSZbigniew Bodek 	uint32_t	val = 0;
476649b49cdaSZbigniew Bodek 	al_assert(idx < AL_ETH_FWD_VID_TABLE_NUM); /* valid VID index */
476749b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(val,  AL_ETH_TX_VLAN_TABLE_UDMA_MASK, 0, udma_mask);
476849b49cdaSZbigniew Bodek 	AL_REG_FIELD_SET(val,  AL_ETH_TX_VLAN_TABLE_FWD_TO_MAC, 4, fwd_to_mac);
476949b49cdaSZbigniew Bodek 
477049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw.tx_vid_table_addr, idx);
477149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw.tx_vid_table_data, val);
477249b49cdaSZbigniew Bodek 	return 0;
477349b49cdaSZbigniew Bodek }
477449b49cdaSZbigniew Bodek 
al_eth_tx_protocol_detect_table_entry_set(struct al_hal_eth_adapter * adapter,uint32_t idx,struct al_eth_tx_gpd_cam_entry * tx_gpd_entry)477549b49cdaSZbigniew Bodek int al_eth_tx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
477649b49cdaSZbigniew Bodek 		struct al_eth_tx_gpd_cam_entry *tx_gpd_entry)
477749b49cdaSZbigniew Bodek {
477849b49cdaSZbigniew Bodek 	uint64_t gpd_data;
477949b49cdaSZbigniew Bodek 	uint64_t gpd_mask;
478049b49cdaSZbigniew Bodek 
478149b49cdaSZbigniew Bodek 	gpd_data = ((uint64_t)tx_gpd_entry->l3_proto_idx & AL_ETH_TX_GPD_L3_PROTO_MASK) <<
478249b49cdaSZbigniew Bodek 		AL_ETH_TX_GPD_L3_PROTO_SHIFT;
478349b49cdaSZbigniew Bodek 	gpd_data |= ((uint64_t)tx_gpd_entry->l4_proto_idx & AL_ETH_TX_GPD_L4_PROTO_MASK) <<
478449b49cdaSZbigniew Bodek 		AL_ETH_TX_GPD_L4_PROTO_SHIFT;
478549b49cdaSZbigniew Bodek 	gpd_data |= ((uint64_t)tx_gpd_entry->tunnel_control & AL_ETH_TX_GPD_TUNNEL_CTRL_MASK) <<
478649b49cdaSZbigniew Bodek 		AL_ETH_TX_GPD_TUNNEL_CTRL_SHIFT;
478749b49cdaSZbigniew Bodek 	gpd_data |= ((uint64_t)tx_gpd_entry->source_vlan_count & AL_ETH_TX_GPD_SRC_VLAN_CNT_MASK) <<
478849b49cdaSZbigniew Bodek 		AL_ETH_TX_GPD_SRC_VLAN_CNT_SHIFT;
478949b49cdaSZbigniew Bodek 	gpd_mask  = ((uint64_t)tx_gpd_entry->l3_proto_idx_mask & AL_ETH_TX_GPD_L3_PROTO_MASK) <<
479049b49cdaSZbigniew Bodek 		AL_ETH_TX_GPD_L3_PROTO_SHIFT;
479149b49cdaSZbigniew Bodek 	gpd_mask |= ((uint64_t)tx_gpd_entry->l4_proto_idx_mask & AL_ETH_TX_GPD_L4_PROTO_MASK) <<
479249b49cdaSZbigniew Bodek 		AL_ETH_TX_GPD_L4_PROTO_SHIFT;
479349b49cdaSZbigniew Bodek 	gpd_mask |= ((uint64_t)tx_gpd_entry->tunnel_control_mask & AL_ETH_TX_GPD_TUNNEL_CTRL_MASK) <<
479449b49cdaSZbigniew Bodek 		AL_ETH_TX_GPD_TUNNEL_CTRL_SHIFT;
479549b49cdaSZbigniew Bodek 	gpd_mask |= ((uint64_t)tx_gpd_entry->source_vlan_count_mask & AL_ETH_TX_GPD_SRC_VLAN_CNT_MASK) <<
479649b49cdaSZbigniew Bodek 		AL_ETH_TX_GPD_SRC_VLAN_CNT_SHIFT;
479749b49cdaSZbigniew Bodek 
479849b49cdaSZbigniew Bodek 	/* Tx Generic protocol detect Cam compare table */
479949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_addr, idx);
480049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_ctrl,
480149b49cdaSZbigniew Bodek 			(uint32_t)((tx_gpd_entry->tx_gpd_cam_ctrl) << AL_ETH_TX_GPD_CAM_CTRL_VALID_SHIFT));
480249b49cdaSZbigniew Bodek 	al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_ctrl: %#x", idx, tx_gpd_entry->tx_gpd_cam_ctrl);
480349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_mask_2,
480449b49cdaSZbigniew Bodek 			(uint32_t)(gpd_mask >> AL_ETH_TX_GPD_CAM_MASK_2_SHIFT));
480549b49cdaSZbigniew Bodek 	al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_mask_2: %#x", idx, (uint32_t)(gpd_mask >> AL_ETH_TX_GPD_CAM_MASK_2_SHIFT));
480649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_mask_1,
480749b49cdaSZbigniew Bodek 			(uint32_t)(gpd_mask));
480849b49cdaSZbigniew Bodek 	al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_mask_1: %#x", idx, (uint32_t)(gpd_mask));
480949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_data_2,
481049b49cdaSZbigniew Bodek 			(uint32_t)(gpd_data >> AL_ETH_TX_GPD_CAM_DATA_2_SHIFT));
481149b49cdaSZbigniew Bodek 	al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_data_2: %#x", idx, (uint32_t)(gpd_data >> AL_ETH_TX_GPD_CAM_DATA_2_SHIFT));
481249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_data_1,
481349b49cdaSZbigniew Bodek 			(uint32_t)(gpd_data));
481449b49cdaSZbigniew Bodek 	al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_data_1: %#x", idx, (uint32_t)(gpd_data));
481549b49cdaSZbigniew Bodek 	return 0;
481649b49cdaSZbigniew Bodek }
481749b49cdaSZbigniew Bodek 
al_eth_tx_generic_crc_table_entry_set(struct al_hal_eth_adapter * adapter,uint32_t idx,struct al_eth_tx_gcp_table_entry * tx_gcp_entry)481849b49cdaSZbigniew Bodek int al_eth_tx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
481949b49cdaSZbigniew Bodek 		struct al_eth_tx_gcp_table_entry *tx_gcp_entry)
482049b49cdaSZbigniew Bodek {
482149b49cdaSZbigniew Bodek 	uint32_t gcp_table_gen;
482249b49cdaSZbigniew Bodek 	uint32_t tx_alu_opcode;
482349b49cdaSZbigniew Bodek 	uint32_t tx_alu_opsel;
482449b49cdaSZbigniew Bodek 
482549b49cdaSZbigniew Bodek 	gcp_table_gen  = (tx_gcp_entry->poly_sel & AL_ETH_TX_GCP_POLY_SEL_MASK) <<
482649b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_POLY_SEL_SHIFT;
482749b49cdaSZbigniew Bodek 	gcp_table_gen |= (tx_gcp_entry->crc32_bit_comp & AL_ETH_TX_GCP_CRC32_BIT_COMP_MASK) <<
482849b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_CRC32_BIT_COMP_SHIFT;
482949b49cdaSZbigniew Bodek 	gcp_table_gen |= (tx_gcp_entry->crc32_bit_swap & AL_ETH_TX_GCP_CRC32_BIT_SWAP_MASK) <<
483049b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_CRC32_BIT_SWAP_SHIFT;
483149b49cdaSZbigniew Bodek 	gcp_table_gen |= (tx_gcp_entry->crc32_byte_swap & AL_ETH_TX_GCP_CRC32_BYTE_SWAP_MASK) <<
483249b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_CRC32_BYTE_SWAP_SHIFT;
483349b49cdaSZbigniew Bodek 	gcp_table_gen |= (tx_gcp_entry->data_bit_swap & AL_ETH_TX_GCP_DATA_BIT_SWAP_MASK) <<
483449b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_DATA_BIT_SWAP_SHIFT;
483549b49cdaSZbigniew Bodek 	gcp_table_gen |= (tx_gcp_entry->data_byte_swap & AL_ETH_TX_GCP_DATA_BYTE_SWAP_MASK) <<
483649b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_DATA_BYTE_SWAP_SHIFT;
483749b49cdaSZbigniew Bodek 	gcp_table_gen |= (tx_gcp_entry->trail_size & AL_ETH_TX_GCP_TRAIL_SIZE_MASK) <<
483849b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_TRAIL_SIZE_SHIFT;
483949b49cdaSZbigniew Bodek 	gcp_table_gen |= (tx_gcp_entry->head_size & AL_ETH_TX_GCP_HEAD_SIZE_MASK) <<
484049b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_HEAD_SIZE_SHIFT;
484149b49cdaSZbigniew Bodek 	gcp_table_gen |= (tx_gcp_entry->head_calc & AL_ETH_TX_GCP_HEAD_CALC_MASK) <<
484249b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_HEAD_CALC_SHIFT;
484349b49cdaSZbigniew Bodek 	gcp_table_gen |= (tx_gcp_entry->mask_polarity & AL_ETH_TX_GCP_MASK_POLARITY_MASK) <<
484449b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_MASK_POLARITY_SHIFT;
484549b49cdaSZbigniew Bodek 	al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], gcp_table_gen: %#x", idx, gcp_table_gen);
484649b49cdaSZbigniew Bodek 
484749b49cdaSZbigniew Bodek 	tx_alu_opcode  = (tx_gcp_entry->tx_alu_opcode_1 & AL_ETH_TX_GCP_OPCODE_1_MASK) <<
484849b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_OPCODE_1_SHIFT;
484949b49cdaSZbigniew Bodek 	tx_alu_opcode |= (tx_gcp_entry->tx_alu_opcode_2 & AL_ETH_TX_GCP_OPCODE_2_MASK) <<
485049b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_OPCODE_2_SHIFT;
485149b49cdaSZbigniew Bodek 	tx_alu_opcode |= (tx_gcp_entry->tx_alu_opcode_3 & AL_ETH_TX_GCP_OPCODE_3_MASK) <<
485249b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_OPCODE_3_SHIFT;
485349b49cdaSZbigniew Bodek 	tx_alu_opsel  = (tx_gcp_entry->tx_alu_opsel_1 & AL_ETH_TX_GCP_OPSEL_1_MASK) <<
485449b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_OPSEL_1_SHIFT;
485549b49cdaSZbigniew Bodek 	tx_alu_opsel |= (tx_gcp_entry->tx_alu_opsel_2 & AL_ETH_TX_GCP_OPSEL_2_MASK) <<
485649b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_OPSEL_2_SHIFT;
485749b49cdaSZbigniew Bodek 	tx_alu_opsel |= (tx_gcp_entry->tx_alu_opsel_3 & AL_ETH_TX_GCP_OPSEL_3_MASK) <<
485849b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_OPSEL_3_SHIFT;
485949b49cdaSZbigniew Bodek 	tx_alu_opsel |= (tx_gcp_entry->tx_alu_opsel_4 & AL_ETH_TX_GCP_OPSEL_4_MASK) <<
486049b49cdaSZbigniew Bodek 		AL_ETH_TX_GCP_OPSEL_4_SHIFT;
486149b49cdaSZbigniew Bodek 
486249b49cdaSZbigniew Bodek 	/*  Tx Generic crc prameters table general */
486349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_addr, idx);
486449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_gen,
486549b49cdaSZbigniew Bodek 			gcp_table_gen);
486649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_1,
486749b49cdaSZbigniew Bodek 			tx_gcp_entry->gcp_mask[0]);
486849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_2,
486949b49cdaSZbigniew Bodek 			tx_gcp_entry->gcp_mask[1]);
487049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_3,
487149b49cdaSZbigniew Bodek 			tx_gcp_entry->gcp_mask[2]);
487249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_4,
487349b49cdaSZbigniew Bodek 			tx_gcp_entry->gcp_mask[3]);
487449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_5,
487549b49cdaSZbigniew Bodek 			tx_gcp_entry->gcp_mask[4]);
487649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_6,
487749b49cdaSZbigniew Bodek 			tx_gcp_entry->gcp_mask[5]);
487849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_crc_init,
487949b49cdaSZbigniew Bodek 			tx_gcp_entry->crc_init);
488049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_res,
488149b49cdaSZbigniew Bodek 			tx_gcp_entry->gcp_table_res);
488249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_alu_opcode,
488349b49cdaSZbigniew Bodek 			tx_alu_opcode);
488449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_alu_opsel,
488549b49cdaSZbigniew Bodek 			tx_alu_opsel);
488649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_alu_val,
488749b49cdaSZbigniew Bodek 			tx_gcp_entry->alu_val);
488849b49cdaSZbigniew Bodek 	return 0;
488949b49cdaSZbigniew Bodek }
489049b49cdaSZbigniew Bodek 
al_eth_tx_crc_chksum_replace_cmd_entry_set(struct al_hal_eth_adapter * adapter,uint32_t idx,struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry * tx_replace_entry)489149b49cdaSZbigniew Bodek int al_eth_tx_crc_chksum_replace_cmd_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
489249b49cdaSZbigniew Bodek 		struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry *tx_replace_entry)
489349b49cdaSZbigniew Bodek {
489449b49cdaSZbigniew Bodek 	uint32_t replace_table_address;
489549b49cdaSZbigniew Bodek 	uint32_t tx_replace_cmd;
489649b49cdaSZbigniew Bodek 
489749b49cdaSZbigniew Bodek 	/*  Tx crc_chksum_replace_cmd */
489849b49cdaSZbigniew Bodek 	replace_table_address = L4_CHECKSUM_DIS_AND_L3_CHECKSUM_DIS | idx;
489949b49cdaSZbigniew Bodek 	tx_replace_cmd  = (uint32_t)(tx_replace_entry->l3_csum_en_00) << 0;
490049b49cdaSZbigniew Bodek 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->l4_csum_en_00) << 1;
490149b49cdaSZbigniew Bodek 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->crc_en_00)     << 2;
490249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table_addr, replace_table_address);
490349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table,
490449b49cdaSZbigniew Bodek 			tx_replace_cmd);
490549b49cdaSZbigniew Bodek 	replace_table_address = L4_CHECKSUM_DIS_AND_L3_CHECKSUM_EN | idx;
490649b49cdaSZbigniew Bodek 	tx_replace_cmd  = (uint32_t)(tx_replace_entry->l3_csum_en_01) << 0;
490749b49cdaSZbigniew Bodek 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->l4_csum_en_01) << 1;
490849b49cdaSZbigniew Bodek 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->crc_en_01)     << 2;
490949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table_addr, replace_table_address);
491049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table,
491149b49cdaSZbigniew Bodek 			tx_replace_cmd);
491249b49cdaSZbigniew Bodek 	replace_table_address = L4_CHECKSUM_EN_AND_L3_CHECKSUM_DIS | idx;
491349b49cdaSZbigniew Bodek 	tx_replace_cmd  = (uint32_t)(tx_replace_entry->l3_csum_en_10) << 0;
491449b49cdaSZbigniew Bodek 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->l4_csum_en_10) << 1;
491549b49cdaSZbigniew Bodek 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->crc_en_10)     << 2;
491649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table_addr, replace_table_address);
491749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table,
491849b49cdaSZbigniew Bodek 			tx_replace_cmd);
491949b49cdaSZbigniew Bodek 	replace_table_address = L4_CHECKSUM_EN_AND_L3_CHECKSUM_EN | idx;
492049b49cdaSZbigniew Bodek 	tx_replace_cmd  = (uint32_t)(tx_replace_entry->l3_csum_en_11) << 0;
492149b49cdaSZbigniew Bodek 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->l4_csum_en_11) << 1;
492249b49cdaSZbigniew Bodek 	tx_replace_cmd |= (uint32_t)(tx_replace_entry->crc_en_11)     << 2;
492349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table_addr, replace_table_address);
492449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table,
492549b49cdaSZbigniew Bodek 			tx_replace_cmd);
492649b49cdaSZbigniew Bodek 
492749b49cdaSZbigniew Bodek 	return 0;
492849b49cdaSZbigniew Bodek }
492949b49cdaSZbigniew Bodek 
al_eth_rx_protocol_detect_table_entry_set(struct al_hal_eth_adapter * adapter,uint32_t idx,struct al_eth_rx_gpd_cam_entry * rx_gpd_entry)493049b49cdaSZbigniew Bodek int al_eth_rx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
493149b49cdaSZbigniew Bodek 		struct al_eth_rx_gpd_cam_entry *rx_gpd_entry)
493249b49cdaSZbigniew Bodek {
493349b49cdaSZbigniew Bodek 	uint64_t gpd_data;
493449b49cdaSZbigniew Bodek 	uint64_t gpd_mask;
493549b49cdaSZbigniew Bodek 
493649b49cdaSZbigniew Bodek 	gpd_data  = ((uint64_t)rx_gpd_entry->outer_l3_proto_idx & AL_ETH_RX_GPD_OUTER_L3_PROTO_MASK) <<
493749b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_OUTER_L3_PROTO_SHIFT;
493849b49cdaSZbigniew Bodek 	gpd_data |= ((uint64_t)rx_gpd_entry->outer_l4_proto_idx & AL_ETH_RX_GPD_OUTER_L4_PROTO_MASK) <<
493949b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_OUTER_L4_PROTO_SHIFT;
494049b49cdaSZbigniew Bodek 	gpd_data |= ((uint64_t)rx_gpd_entry->inner_l3_proto_idx & AL_ETH_RX_GPD_INNER_L3_PROTO_MASK) <<
494149b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_INNER_L3_PROTO_SHIFT;
494249b49cdaSZbigniew Bodek 	gpd_data |= ((uint64_t)rx_gpd_entry->inner_l4_proto_idx & AL_ETH_RX_GPD_INNER_L4_PROTO_MASK) <<
494349b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_INNER_L4_PROTO_SHIFT;
494449b49cdaSZbigniew Bodek 	gpd_data |= ((uint64_t)rx_gpd_entry->parse_ctrl & AL_ETH_RX_GPD_OUTER_PARSE_CTRL_MASK) <<
494549b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_OUTER_PARSE_CTRL_SHIFT;
494649b49cdaSZbigniew Bodek 	gpd_data |= ((uint64_t)rx_gpd_entry->outer_l3_len & AL_ETH_RX_GPD_INNER_PARSE_CTRL_MASK) <<
494749b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_INNER_PARSE_CTRL_SHIFT;
494849b49cdaSZbigniew Bodek 	gpd_data |= ((uint64_t)rx_gpd_entry->l3_priority & AL_ETH_RX_GPD_L3_PRIORITY_MASK) <<
494949b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_L3_PRIORITY_SHIFT;
495049b49cdaSZbigniew Bodek 	gpd_data |= ((uint64_t)rx_gpd_entry->l4_dst_port_lsb & AL_ETH_RX_GPD_L4_DST_PORT_LSB_MASK) <<
495149b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_L4_DST_PORT_LSB_SHIFT;
495249b49cdaSZbigniew Bodek 
495349b49cdaSZbigniew Bodek 	gpd_mask  = ((uint64_t)rx_gpd_entry->outer_l3_proto_idx_mask & AL_ETH_RX_GPD_OUTER_L3_PROTO_MASK) <<
495449b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_OUTER_L3_PROTO_SHIFT;
495549b49cdaSZbigniew Bodek 	gpd_mask |= ((uint64_t)rx_gpd_entry->outer_l4_proto_idx_mask & AL_ETH_RX_GPD_OUTER_L4_PROTO_MASK) <<
495649b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_OUTER_L4_PROTO_SHIFT;
495749b49cdaSZbigniew Bodek 	gpd_mask |= ((uint64_t)rx_gpd_entry->inner_l3_proto_idx_mask & AL_ETH_RX_GPD_INNER_L3_PROTO_MASK) <<
495849b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_INNER_L3_PROTO_SHIFT;
495949b49cdaSZbigniew Bodek 	gpd_mask |= ((uint64_t)rx_gpd_entry->inner_l4_proto_idx_mask & AL_ETH_RX_GPD_INNER_L4_PROTO_MASK) <<
496049b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_INNER_L4_PROTO_SHIFT;
496149b49cdaSZbigniew Bodek 	gpd_mask |= ((uint64_t)rx_gpd_entry->parse_ctrl_mask & AL_ETH_RX_GPD_OUTER_PARSE_CTRL_MASK) <<
496249b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_OUTER_PARSE_CTRL_SHIFT;
496349b49cdaSZbigniew Bodek 	gpd_mask |= ((uint64_t)rx_gpd_entry->outer_l3_len_mask & AL_ETH_RX_GPD_INNER_PARSE_CTRL_MASK) <<
496449b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_INNER_PARSE_CTRL_SHIFT;
496549b49cdaSZbigniew Bodek 	gpd_mask |= ((uint64_t)rx_gpd_entry->l3_priority_mask & AL_ETH_RX_GPD_L3_PRIORITY_MASK) <<
496649b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_L3_PRIORITY_SHIFT;
496749b49cdaSZbigniew Bodek 	gpd_mask |= ((uint64_t)rx_gpd_entry->l4_dst_port_lsb_mask & AL_ETH_RX_GPD_L4_DST_PORT_LSB_MASK) <<
496849b49cdaSZbigniew Bodek 		AL_ETH_RX_GPD_L4_DST_PORT_LSB_SHIFT;
496949b49cdaSZbigniew Bodek 
497049b49cdaSZbigniew Bodek 	/* Rx Generic protocol detect Cam compare table */
497149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_addr, idx);
497249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_ctrl,
497349b49cdaSZbigniew Bodek 			(uint32_t)((rx_gpd_entry->rx_gpd_cam_ctrl) << AL_ETH_RX_GPD_CAM_CTRL_VALID_SHIFT));
497449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_mask_2,
497549b49cdaSZbigniew Bodek 			(uint32_t)(gpd_mask >> AL_ETH_RX_GPD_CAM_MASK_2_SHIFT));
497649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_mask_1,
497749b49cdaSZbigniew Bodek 			(uint32_t)(gpd_mask));
497849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_data_2,
497949b49cdaSZbigniew Bodek 			(uint32_t)(gpd_data >> AL_ETH_RX_GPD_CAM_DATA_2_SHIFT));
498049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_data_1,
498149b49cdaSZbigniew Bodek 			(uint32_t)(gpd_data));
498249b49cdaSZbigniew Bodek 	return 0;
498349b49cdaSZbigniew Bodek }
498449b49cdaSZbigniew Bodek 
al_eth_rx_generic_crc_table_entry_set(struct al_hal_eth_adapter * adapter,uint32_t idx,struct al_eth_rx_gcp_table_entry * rx_gcp_entry)498549b49cdaSZbigniew Bodek int al_eth_rx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
498649b49cdaSZbigniew Bodek 		struct al_eth_rx_gcp_table_entry *rx_gcp_entry)
498749b49cdaSZbigniew Bodek {
498849b49cdaSZbigniew Bodek 	uint32_t gcp_table_gen;
498949b49cdaSZbigniew Bodek 	uint32_t rx_alu_opcode;
499049b49cdaSZbigniew Bodek 	uint32_t rx_alu_opsel;
499149b49cdaSZbigniew Bodek 
499249b49cdaSZbigniew Bodek 	gcp_table_gen  = (rx_gcp_entry->poly_sel & AL_ETH_RX_GCP_POLY_SEL_MASK) <<
499349b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_POLY_SEL_SHIFT;
499449b49cdaSZbigniew Bodek 	gcp_table_gen |= (rx_gcp_entry->crc32_bit_comp & AL_ETH_RX_GCP_CRC32_BIT_COMP_MASK) <<
499549b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_CRC32_BIT_COMP_SHIFT;
499649b49cdaSZbigniew Bodek 	gcp_table_gen |= (rx_gcp_entry->crc32_bit_swap & AL_ETH_RX_GCP_CRC32_BIT_SWAP_MASK) <<
499749b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_CRC32_BIT_SWAP_SHIFT;
499849b49cdaSZbigniew Bodek 	gcp_table_gen |= (rx_gcp_entry->crc32_byte_swap & AL_ETH_RX_GCP_CRC32_BYTE_SWAP_MASK) <<
499949b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_CRC32_BYTE_SWAP_SHIFT;
500049b49cdaSZbigniew Bodek 	gcp_table_gen |= (rx_gcp_entry->data_bit_swap & AL_ETH_RX_GCP_DATA_BIT_SWAP_MASK) <<
500149b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_DATA_BIT_SWAP_SHIFT;
500249b49cdaSZbigniew Bodek 	gcp_table_gen |= (rx_gcp_entry->data_byte_swap & AL_ETH_RX_GCP_DATA_BYTE_SWAP_MASK) <<
500349b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_DATA_BYTE_SWAP_SHIFT;
500449b49cdaSZbigniew Bodek 	gcp_table_gen |= (rx_gcp_entry->trail_size & AL_ETH_RX_GCP_TRAIL_SIZE_MASK) <<
500549b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_TRAIL_SIZE_SHIFT;
500649b49cdaSZbigniew Bodek 	gcp_table_gen |= (rx_gcp_entry->head_size & AL_ETH_RX_GCP_HEAD_SIZE_MASK) <<
500749b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_HEAD_SIZE_SHIFT;
500849b49cdaSZbigniew Bodek 	gcp_table_gen |= (rx_gcp_entry->head_calc & AL_ETH_RX_GCP_HEAD_CALC_MASK) <<
500949b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_HEAD_CALC_SHIFT;
501049b49cdaSZbigniew Bodek 	gcp_table_gen |= (rx_gcp_entry->mask_polarity & AL_ETH_RX_GCP_MASK_POLARITY_MASK) <<
501149b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_MASK_POLARITY_SHIFT;
501249b49cdaSZbigniew Bodek 
501349b49cdaSZbigniew Bodek 	rx_alu_opcode  = (rx_gcp_entry->rx_alu_opcode_1 & AL_ETH_RX_GCP_OPCODE_1_MASK) <<
501449b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_OPCODE_1_SHIFT;
501549b49cdaSZbigniew Bodek 	rx_alu_opcode |= (rx_gcp_entry->rx_alu_opcode_2 & AL_ETH_RX_GCP_OPCODE_2_MASK) <<
501649b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_OPCODE_2_SHIFT;
501749b49cdaSZbigniew Bodek 	rx_alu_opcode |= (rx_gcp_entry->rx_alu_opcode_3 & AL_ETH_RX_GCP_OPCODE_3_MASK) <<
501849b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_OPCODE_3_SHIFT;
501949b49cdaSZbigniew Bodek 	rx_alu_opsel  = (rx_gcp_entry->rx_alu_opsel_1 & AL_ETH_RX_GCP_OPSEL_1_MASK) <<
502049b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_OPSEL_1_SHIFT;
502149b49cdaSZbigniew Bodek 	rx_alu_opsel |= (rx_gcp_entry->rx_alu_opsel_2 & AL_ETH_RX_GCP_OPSEL_2_MASK) <<
502249b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_OPSEL_2_SHIFT;
502349b49cdaSZbigniew Bodek 	rx_alu_opsel |= (rx_gcp_entry->rx_alu_opsel_3 & AL_ETH_RX_GCP_OPSEL_3_MASK) <<
502449b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_OPSEL_3_SHIFT;
502549b49cdaSZbigniew Bodek 	rx_alu_opsel |= (rx_gcp_entry->rx_alu_opsel_4 & AL_ETH_RX_GCP_OPSEL_4_MASK) <<
502649b49cdaSZbigniew Bodek 		AL_ETH_RX_GCP_OPSEL_4_SHIFT;
502749b49cdaSZbigniew Bodek 
502849b49cdaSZbigniew Bodek 	/*  Rx Generic crc prameters table general */
502949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_addr, idx);
503049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_gen,
503149b49cdaSZbigniew Bodek 			gcp_table_gen);
503249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_1,
503349b49cdaSZbigniew Bodek 			rx_gcp_entry->gcp_mask[0]);
503449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_2,
503549b49cdaSZbigniew Bodek 			rx_gcp_entry->gcp_mask[1]);
503649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_3,
503749b49cdaSZbigniew Bodek 			rx_gcp_entry->gcp_mask[2]);
503849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_4,
503949b49cdaSZbigniew Bodek 			rx_gcp_entry->gcp_mask[3]);
504049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_5,
504149b49cdaSZbigniew Bodek 			rx_gcp_entry->gcp_mask[4]);
504249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_6,
504349b49cdaSZbigniew Bodek 			rx_gcp_entry->gcp_mask[5]);
504449b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_crc_init,
504549b49cdaSZbigniew Bodek 			rx_gcp_entry->crc_init);
504649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_res,
504749b49cdaSZbigniew Bodek 			rx_gcp_entry->gcp_table_res);
504849b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_alu_opcode,
504949b49cdaSZbigniew Bodek 			rx_alu_opcode);
505049b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_alu_opsel,
505149b49cdaSZbigniew Bodek 			rx_alu_opsel);
505249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_alu_val,
505349b49cdaSZbigniew Bodek 			rx_gcp_entry->alu_val);
505449b49cdaSZbigniew Bodek 	return 0;
505549b49cdaSZbigniew Bodek }
505649b49cdaSZbigniew Bodek 
505749b49cdaSZbigniew Bodek 
505849b49cdaSZbigniew Bodek #define AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM 9
505949b49cdaSZbigniew Bodek #define AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM 32
506049b49cdaSZbigniew Bodek 
506149b49cdaSZbigniew Bodek static struct al_eth_tx_gpd_cam_entry
506249b49cdaSZbigniew Bodek al_eth_generic_tx_crc_gpd[AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM] = {
506349b49cdaSZbigniew Bodek 
506449b49cdaSZbigniew Bodek 	/* [0] roce (with grh, bth) */
506549b49cdaSZbigniew Bodek 	{22,		0,		0,		0,		1,
506649b49cdaSZbigniew Bodek 	 0x1f,		0x0,		0x0,		0x0,		},
506749b49cdaSZbigniew Bodek 	/* [1] fcoe */
506849b49cdaSZbigniew Bodek 	{21,		0,		0,		0,		1,
506949b49cdaSZbigniew Bodek 	 0x1f,		0x0,		0x0,		0x0,		},
507049b49cdaSZbigniew Bodek 	/* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
507149b49cdaSZbigniew Bodek 	{8,		23,		0,		0,		1,
507249b49cdaSZbigniew Bodek 	 0x1f,		0x1f,		0x0,		0x0,		},
507349b49cdaSZbigniew Bodek 	/* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
507449b49cdaSZbigniew Bodek 	{11,		23,		0,		0,		1,
507549b49cdaSZbigniew Bodek 	 0x1f,		0x1f,		0x0,		0x0,		},
507649b49cdaSZbigniew Bodek 	/* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
507749b49cdaSZbigniew Bodek 	{23,		0,		5,		0,		1,
507849b49cdaSZbigniew Bodek 	 0x1f,		0x0,		0x5,		0x0,		},
507949b49cdaSZbigniew Bodek 	/* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
508049b49cdaSZbigniew Bodek 	{23,		0,		3,		0,		1,
508149b49cdaSZbigniew Bodek 	 0x1f,		0x0,		0x5,		0x0		},
508249b49cdaSZbigniew Bodek 	/* [6] GENERIC_STORAGE_READ over IPV4 (and udp) */
508349b49cdaSZbigniew Bodek 	{8,		2,		0,		0,		1,
508449b49cdaSZbigniew Bodek 	 0x1f,		0x1f,		0x0,		0x0,		},
508549b49cdaSZbigniew Bodek 	/* [7] GENERIC_STORAGE_READ over IPV6 (and udp) */
508649b49cdaSZbigniew Bodek 	{11,		2,		0,		0,		1,
508749b49cdaSZbigniew Bodek 	 0x1f,		0x1f,		0x0,		0x0,		},
508849b49cdaSZbigniew Bodek 	/* [8] default match */
508949b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		1,
509049b49cdaSZbigniew Bodek 	 0x0,		0x0,		0x0,		0x0		}
509149b49cdaSZbigniew Bodek };
509249b49cdaSZbigniew Bodek 
509349b49cdaSZbigniew Bodek static struct al_eth_tx_gcp_table_entry
509449b49cdaSZbigniew Bodek al_eth_generic_tx_crc_gcp[AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM] = {
509549b49cdaSZbigniew Bodek 
509649b49cdaSZbigniew Bodek 	/* [0] roce (with grh, bth) */
509749b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
509849b49cdaSZbigniew Bodek 	 0,		4,		8,		0,		1,
509949b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
510049b49cdaSZbigniew Bodek 	 0,		0,		{0xffff7f03,	0x00000000,	0x00000000,
510149b49cdaSZbigniew Bodek 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
510249b49cdaSZbigniew Bodek 	 0},
510349b49cdaSZbigniew Bodek 	/* [1] fcoe */
510449b49cdaSZbigniew Bodek 	{0,		1,		0,		0,		1,
510549b49cdaSZbigniew Bodek 	 0,		8,		14,		1,		1,
510649b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
510749b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
510849b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
510949b49cdaSZbigniew Bodek 	 0},
511049b49cdaSZbigniew Bodek 	/* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
511149b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
511249b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
511349b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
511449b49cdaSZbigniew Bodek 	 0,		0,		{0x3000cf00,	0x00000f00,	0xc0000000,
511549b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
511649b49cdaSZbigniew Bodek 	 0},
511749b49cdaSZbigniew Bodek 	/* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
511849b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
511949b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
512049b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
512149b49cdaSZbigniew Bodek 	 0,		0,		{0x7f030000,	0x00000000,	0x00000003,
512249b49cdaSZbigniew Bodek 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
512349b49cdaSZbigniew Bodek 	 0},
512449b49cdaSZbigniew Bodek 	/* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
512549b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
512649b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
512749b49cdaSZbigniew Bodek 	 2,		0,		0,		0,		10,
512849b49cdaSZbigniew Bodek 	 0,		0,		{0x3000cf00,	0x00000f00,	0xc0000000,
512949b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
513049b49cdaSZbigniew Bodek 	 28},
513149b49cdaSZbigniew Bodek 	/* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
513249b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
513349b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
513449b49cdaSZbigniew Bodek 	 2,		0,		0,		0,		10,
513549b49cdaSZbigniew Bodek 	 0,		0,		{0x7f030000,	0x00000000,	0x00000003,
513649b49cdaSZbigniew Bodek 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
513749b49cdaSZbigniew Bodek 	 48},
513849b49cdaSZbigniew Bodek 	/* [6] GENERIC_STORAGE_READ over IPV4 (and udp) */
513949b49cdaSZbigniew Bodek 	{1,		1,		1,		0,		1,
514049b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
514149b49cdaSZbigniew Bodek 	 1,		0,		1,		0,		2,
514249b49cdaSZbigniew Bodek 	 10,		0,		{0x00000000,	0x00000000,	0x00000000,
514349b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
514449b49cdaSZbigniew Bodek 	 8},
514549b49cdaSZbigniew Bodek 	/* [7] GENERIC_STORAGE_READ over IPV6 (and udp) */
514649b49cdaSZbigniew Bodek 	{1,		1,		1,		0,		1,
514749b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
514849b49cdaSZbigniew Bodek 	 1,		0,		1,		0,		2,
514949b49cdaSZbigniew Bodek 	 10,		0,		{0x00000000,	0x00000000,	0x00000000,
515049b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x0,
515149b49cdaSZbigniew Bodek 	 8},
515249b49cdaSZbigniew Bodek 	/* [8] default match */
515349b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
515449b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
515549b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
515649b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
515749b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	  0x00000000},	0x00000000,	0x0,
515849b49cdaSZbigniew Bodek 	 0}
515949b49cdaSZbigniew Bodek };
516049b49cdaSZbigniew Bodek 
516149b49cdaSZbigniew Bodek static struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry
516249b49cdaSZbigniew Bodek al_eth_tx_crc_chksum_replace_cmd[AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM] = {
516349b49cdaSZbigniew Bodek 
516449b49cdaSZbigniew Bodek 	/* [0] roce (with grh, bth) */
516549b49cdaSZbigniew Bodek 	{0,1,0,1,		0,0,0,0,		0,0,0,0},
516649b49cdaSZbigniew Bodek 	/* [1] fcoe */
516749b49cdaSZbigniew Bodek 	{0,1,0,1,		0,0,0,0,		0,0,0,0},
516849b49cdaSZbigniew Bodek 	/* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
516949b49cdaSZbigniew Bodek 	{0,0,1,1,		0,0,0,0,		0,1,0,1},
517049b49cdaSZbigniew Bodek 	/* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
517149b49cdaSZbigniew Bodek 	{0,0,1,1,		0,0,0,0,		0,0,0,0},
517249b49cdaSZbigniew Bodek 	/* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
517349b49cdaSZbigniew Bodek 	{0,1,0,1,		0,0,0,0,		0,0,0,0},
517449b49cdaSZbigniew Bodek 	/* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
517549b49cdaSZbigniew Bodek 	{0,1,0,1,		0,0,0,0,		0,0,0,0},
517649b49cdaSZbigniew Bodek 	/* [6] GENERIC_STORAGE_READ over IPV4 (and udp) */
517749b49cdaSZbigniew Bodek 	{0,0,1,1,		0,0,0,0,		0,1,0,1},
517849b49cdaSZbigniew Bodek 	/* [7] GENERIC_STORAGE_READ over IPV6 (and udp) */
517949b49cdaSZbigniew Bodek 	{0,0,1,1,		0,0,0,0,		0,0,0,0},
518049b49cdaSZbigniew Bodek 	/* [8] default match */
518149b49cdaSZbigniew Bodek 	{0,0,0,0,		0,0,1,1,		0,1,0,1}
518249b49cdaSZbigniew Bodek };
518349b49cdaSZbigniew Bodek 
518449b49cdaSZbigniew Bodek static struct al_eth_rx_gpd_cam_entry
518549b49cdaSZbigniew Bodek al_eth_generic_rx_crc_gpd[AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM] = {
518649b49cdaSZbigniew Bodek 
518749b49cdaSZbigniew Bodek 	/* [0] roce (with grh, bth) */
518849b49cdaSZbigniew Bodek 	{22,		0,		0,		0,
518949b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		1,
519049b49cdaSZbigniew Bodek 	 0x1f,		0x0,		0x0,		0x0,
519149b49cdaSZbigniew Bodek 	 0x4,		0x0,		0x0,		0x0},
519249b49cdaSZbigniew Bodek 	/* [1] fcoe */
519349b49cdaSZbigniew Bodek 	{21,		0,		0,		0,
519449b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		1,
519549b49cdaSZbigniew Bodek 	 0x1f,		0x0,		0x0,		0x0,
519649b49cdaSZbigniew Bodek 	 0x4,		0x0,		0x0,		0x0},
519749b49cdaSZbigniew Bodek 	/* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
519849b49cdaSZbigniew Bodek 	{8,		23,		0,		0,
519949b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		1,
520049b49cdaSZbigniew Bodek 	 0x1f,		0x1f,		0x0,		0x0,
520149b49cdaSZbigniew Bodek 	 0x4,		0x0,		0x0,		0x0},
520249b49cdaSZbigniew Bodek 	/* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
520349b49cdaSZbigniew Bodek 	{11,		23,		0,		0,
520449b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		1,
520549b49cdaSZbigniew Bodek 	 0x1f,		0x1f,		0x0,		0x0,
520649b49cdaSZbigniew Bodek 	 0x4,		0x0,		0x0,		0x0},
520749b49cdaSZbigniew Bodek 	/* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
520849b49cdaSZbigniew Bodek 	{8,		13,		23,		0,
520949b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		1,
521049b49cdaSZbigniew Bodek 	 0x1f,		0x1f,		0x1f,		0x0,
521149b49cdaSZbigniew Bodek 	 0x4,		0x0,		0x0,		0x0},
521249b49cdaSZbigniew Bodek 	/* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
521349b49cdaSZbigniew Bodek 	{11,		13,		23,		0,
521449b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		1,
521549b49cdaSZbigniew Bodek 	 0x1f,		0x1f,		0x1f,		0x0,
521649b49cdaSZbigniew Bodek 	 0x4,		0x0,		0x0,		0x0},
521749b49cdaSZbigniew Bodek 	/* [6] tunneled roce (with grh, bth) over GRE over IPV4 */
521849b49cdaSZbigniew Bodek 	{8,		0,		22,		0,
521949b49cdaSZbigniew Bodek 	 4,		0,		0,		0,		1,
522049b49cdaSZbigniew Bodek 	 0x1f,		0x0,		0x1f,		0x0,
522149b49cdaSZbigniew Bodek 	 0x4,		0x0,		0x0,		0x0},
522249b49cdaSZbigniew Bodek 	/* [7] tunneled roce (with grh, bth) over GRE over IPV6 */
522349b49cdaSZbigniew Bodek 	{11,		0,		22,		0,
522449b49cdaSZbigniew Bodek 	 4,		0,		0,		0,		1,
522549b49cdaSZbigniew Bodek 	 0x1f,		0x0,		0x1f,		0x0,
522649b49cdaSZbigniew Bodek 	 0x4,		0x0,		0x0,		0x0},
522749b49cdaSZbigniew Bodek 	/* [8] tunneled fcoe over IPV4 */
522849b49cdaSZbigniew Bodek 	{8,		0,		21,		0,
522949b49cdaSZbigniew Bodek 	 4,		0,		0,		0,		1,
523049b49cdaSZbigniew Bodek 	 0x1f,		0x0,		0x1f,		0x0,
523149b49cdaSZbigniew Bodek 	 0x4,		0x0,		0x0,		0x0},
523249b49cdaSZbigniew Bodek         /* [9] tunneled fcoe over IPV6 */
523349b49cdaSZbigniew Bodek         {11,		0,		21,		0,
523449b49cdaSZbigniew Bodek 	 4,		0,		0,		0,		1,
523549b49cdaSZbigniew Bodek          0x1f,		0x0,		0x1f,		0x0,
523649b49cdaSZbigniew Bodek 	 0x4,		0x0,		0x0,		0x0},
523749b49cdaSZbigniew Bodek 	/* [10] tunneled routable_roce that is refered as l4_protocol, over IPV4 (and udp) over IPV4 */
523849b49cdaSZbigniew Bodek 	{8,             0,              8,              23,
523949b49cdaSZbigniew Bodek 	 4,		0,		0,		0,		1,
524049b49cdaSZbigniew Bodek 	0x1f,		0x0,		0x1f,		0x1f,
524149b49cdaSZbigniew Bodek 	 0x4,		0x0,		0x0,		0x0},
524249b49cdaSZbigniew Bodek 	/* [11] tunneled routable_roce that is refered as l4_protocol, over IPV4 (and udp) over IPV6 */
524349b49cdaSZbigniew Bodek 	{11,		0,		8,		23,
524449b49cdaSZbigniew Bodek 	4,		0,		0,		0,		1,
524549b49cdaSZbigniew Bodek 	0x1f,		0x0,		0x1f,		0x1f,
524649b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
524749b49cdaSZbigniew Bodek 	/* [12] tunneled routable_roce that is refered as l4_protocol, over IPV6 (and udp) over IPV4 */
524849b49cdaSZbigniew Bodek 	{8,		0,		11,		23,
524949b49cdaSZbigniew Bodek 	4,		0,		0,		0,		1,
525049b49cdaSZbigniew Bodek 	0x1f,		0x0,		0x1f,		0x1f,
525149b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
525249b49cdaSZbigniew Bodek 	/* [13] tunneled routable_roce that is refered as l4_protocol, over IPV6 (and udp) over IPV6 */
525349b49cdaSZbigniew Bodek 	{11,		0,		11,		23,
525449b49cdaSZbigniew Bodek 	4,		0,		0,		0,		1,
525549b49cdaSZbigniew Bodek 	0x1f,		0x0,		0x1f,		0x1f,
525649b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
525749b49cdaSZbigniew Bodek 	/* [14] l3_pkt - IPV4 */
525849b49cdaSZbigniew Bodek 	{8,		0,		0,		0,
525949b49cdaSZbigniew Bodek 	0,		0,		0,		0,		1,
526049b49cdaSZbigniew Bodek 	0x1f,		0x1f,		0x0,		0x0,
526149b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
526249b49cdaSZbigniew Bodek 	/* [15] l4_hdr over IPV4 */
526349b49cdaSZbigniew Bodek 	{8,		12,		0,		0,
526449b49cdaSZbigniew Bodek 	0,		0,		0,		0,		1,
526549b49cdaSZbigniew Bodek 	0x1f,		0x1e,		0x0,		0x0,
526649b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
526749b49cdaSZbigniew Bodek 	/* [16] l3_pkt - IPV6 */
526849b49cdaSZbigniew Bodek 	{11,		0,		0,		0,
526949b49cdaSZbigniew Bodek 	0,		0,		0,		0,		1,
527049b49cdaSZbigniew Bodek 	0x1f,		0x1f,		0x0,		0x0,
527149b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
527249b49cdaSZbigniew Bodek 	/* [17] l4_hdr over IPV6 */
527349b49cdaSZbigniew Bodek 	{11,		12,		0,		0,
527449b49cdaSZbigniew Bodek 	0,		0,		0,		0,		1,
527549b49cdaSZbigniew Bodek 	0x1f,		0x1e,		0x0,		0x0,
527649b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
527749b49cdaSZbigniew Bodek 	/* [18] IPV4 over IPV4 */
527849b49cdaSZbigniew Bodek 	{8,		0,		8,		0,
527949b49cdaSZbigniew Bodek 	4,		0,		0,		0,		1,
528049b49cdaSZbigniew Bodek 	0x1f,		0x0,		0x1f,		0x1f,
528149b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
528249b49cdaSZbigniew Bodek 	/* [19] l4_hdr over IPV4 over IPV4 */
528349b49cdaSZbigniew Bodek 	{8,		0,		8,		12,
528449b49cdaSZbigniew Bodek 	4,		0,		0,		0,		1,
528549b49cdaSZbigniew Bodek 	0x1f,		0x0,		0x1f,		0x1e,
528649b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
528749b49cdaSZbigniew Bodek 	/* [20] IPV4 over IPV6 */
528849b49cdaSZbigniew Bodek 	{11,		0,		8,		0,
528949b49cdaSZbigniew Bodek 	4,		0,		0,		0,		1,
529049b49cdaSZbigniew Bodek 	0x1f,		0x0,		0x1f,		0x1f,
529149b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
529249b49cdaSZbigniew Bodek 	/* [21] l4_hdr over IPV4 over IPV6 */
529349b49cdaSZbigniew Bodek 	{11,		0,		8,		12,
529449b49cdaSZbigniew Bodek 	4,		0,		0,		0,		1,
529549b49cdaSZbigniew Bodek 	0x1f,		0x0,		0x1f,		0x1e,
529649b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
529749b49cdaSZbigniew Bodek 	/* [22] IPV6 over IPV4 */
529849b49cdaSZbigniew Bodek 	{8,		0,		11,		0,
529949b49cdaSZbigniew Bodek 	4,		0,		0,		0,		1,
530049b49cdaSZbigniew Bodek 	0x1f,		0x0,		0x1f,		0x1f,
530149b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
530249b49cdaSZbigniew Bodek 	/* [23] l4_hdr over IPV6 over IPV4 */
530349b49cdaSZbigniew Bodek 	{8,		0,		11,		12,
530449b49cdaSZbigniew Bodek 	4,		0,		0,		0,		1,
530549b49cdaSZbigniew Bodek 	0x1f,		0x0,		0x1f,		0x1e,
530649b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
530749b49cdaSZbigniew Bodek 	/* [24] IPV6 over IPV6 */
530849b49cdaSZbigniew Bodek 	{11,		0,		11,		0,
530949b49cdaSZbigniew Bodek 	4,		0,		0,		0,		1,
531049b49cdaSZbigniew Bodek 	0x1f,		0x0,		0x1f,		0x1f,
531149b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
531249b49cdaSZbigniew Bodek 	/* [25] l4_hdr over IPV6 over IPV6 */
531349b49cdaSZbigniew Bodek 	{11,		0,		11,		12,
531449b49cdaSZbigniew Bodek 	4,		0,		0,		0,		1,
531549b49cdaSZbigniew Bodek 	0x1f,		0x0,		0x1f,		0x1e,
531649b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
531749b49cdaSZbigniew Bodek 	/* [26] GENERIC_STORAGE_READ, over IPV4 (and udp) */
531849b49cdaSZbigniew Bodek 	{8,		2,		0,		0,
531949b49cdaSZbigniew Bodek 	0,		0,		0,		0,		1,
532049b49cdaSZbigniew Bodek 	0x1f,		0x1f,		0x0,		0x0,
532149b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
532249b49cdaSZbigniew Bodek 	/* [27] GENERIC_STORAGE_READ, over IPV6 (and udp) */
532349b49cdaSZbigniew Bodek 	{11,		2,		0,		0,
532449b49cdaSZbigniew Bodek 	0,		0,		0,		0,		1,
532549b49cdaSZbigniew Bodek 	0x1f,		0x1f,		0x0,		0x0,
532649b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
532749b49cdaSZbigniew Bodek 	/* [28] tunneled GENERIC_STORAGE_READ over IPV4 (and udp) over IPV4/IPV6 */
532849b49cdaSZbigniew Bodek 	{8,		0,		8,		2,
532949b49cdaSZbigniew Bodek 	4,		0,		0,		0,		1,
533049b49cdaSZbigniew Bodek 	0x18,		0x0,		0x1f,		0x1f,
533149b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
533249b49cdaSZbigniew Bodek 	/* [29] tunneled GENERIC_STORAGE_READ over IPV6 (and udp)  over IPV4/IPV6 */
533349b49cdaSZbigniew Bodek 	{8,		0,		11,		2,
533449b49cdaSZbigniew Bodek 	4,		0,		0,		0,		1,
533549b49cdaSZbigniew Bodek 	0x18,		0x0,		0x1f,		0x1f,
533649b49cdaSZbigniew Bodek 	0x4,		0x0,		0x0,		0x0},
533749b49cdaSZbigniew Bodek 	/* [30] tunneled L2 over GRE over IPV4 */
533849b49cdaSZbigniew Bodek 	{8,		0,		0,		0,
533949b49cdaSZbigniew Bodek 	 4,		0,		0,		0,		1,
534049b49cdaSZbigniew Bodek 	 0x1f,		0x0,		0x1f,		0x0,
534149b49cdaSZbigniew Bodek 	 0x4,		0x0,		0x0,		0x0},
534249b49cdaSZbigniew Bodek 	/* [31] default match */
534349b49cdaSZbigniew Bodek 	{0,		0,		0,		0,
534449b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		1,
534549b49cdaSZbigniew Bodek 	 0x0,		0x0,		0x0,		0x0,
534649b49cdaSZbigniew Bodek 	 0x0,		0x0,		0x0,		0x0}
534749b49cdaSZbigniew Bodek };
534849b49cdaSZbigniew Bodek 
534949b49cdaSZbigniew Bodek static struct al_eth_rx_gcp_table_entry
535049b49cdaSZbigniew Bodek al_eth_generic_rx_crc_gcp[AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM] = {
535149b49cdaSZbigniew Bodek 
535249b49cdaSZbigniew Bodek 	/* [0] roce (with grh, bth) */
535349b49cdaSZbigniew Bodek 	{0,		 1,		1,		0,		1,
535449b49cdaSZbigniew Bodek 	 0,		4,		8,		0,		1,
535549b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
535649b49cdaSZbigniew Bodek 	 0,		0,		{0xffff7f03,	0x00000000,	0x00000000,
535749b49cdaSZbigniew Bodek 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
535849b49cdaSZbigniew Bodek 	 0},
535949b49cdaSZbigniew Bodek 	/* [1] fcoe */
536049b49cdaSZbigniew Bodek 	{0,		1,		0,		0,		1,
536149b49cdaSZbigniew Bodek 	 0,		8,		14,		1,		1,
536249b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
536349b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
536449b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
536549b49cdaSZbigniew Bodek 	 0},
536649b49cdaSZbigniew Bodek 	/* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
536749b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
536849b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
536949b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
537049b49cdaSZbigniew Bodek 	 0,		0,		{0x3000cf00,	0x00000f00,	0xc0000000,
537149b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000011,
537249b49cdaSZbigniew Bodek 	 0},
537349b49cdaSZbigniew Bodek 	/* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
537449b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
537549b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
537649b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
537749b49cdaSZbigniew Bodek 	 0,		0,		{0x7f030000,	0x00000000,	0x00000003,
537849b49cdaSZbigniew Bodek 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
537949b49cdaSZbigniew Bodek 	 0},
538049b49cdaSZbigniew Bodek 	/* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
538149b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
538249b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
538349b49cdaSZbigniew Bodek 	 2,		0,		0,		0,		10,
538449b49cdaSZbigniew Bodek 	 0,		0,		{0x3000cf00,	0x00000f00,	0xc0000000,
538549b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x0302201c,
538649b49cdaSZbigniew Bodek 	 28},
538749b49cdaSZbigniew Bodek 	/* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
538849b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
538949b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
539049b49cdaSZbigniew Bodek 	 2,		0,		0,		0,		10,
539149b49cdaSZbigniew Bodek 	 0,		0,		{0x7f030000,	0x00000000,	0x00000003,
539249b49cdaSZbigniew Bodek 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03002018,
539349b49cdaSZbigniew Bodek 	 48},
539449b49cdaSZbigniew Bodek 	/* [6] tunneled roce (with grh, bth) over IPV4 */
539549b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
539649b49cdaSZbigniew Bodek 	 0,		4,		8,		0,		1,
539749b49cdaSZbigniew Bodek 	 0,		0,		0,		1,		0,
539849b49cdaSZbigniew Bodek 	 0,		0,		{0xffff7f03,	0x00000000,	0x00000000,
539949b49cdaSZbigniew Bodek 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03020014,
540049b49cdaSZbigniew Bodek 	 0},
540149b49cdaSZbigniew Bodek 	/* [7] tunneled roce (with grh, bth) over IPV6 */
540249b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
540349b49cdaSZbigniew Bodek 	 0,		4,		8,		0,		1,
540449b49cdaSZbigniew Bodek 	 0,		0,		0,		1,		0,
540549b49cdaSZbigniew Bodek 	 0,		0,		{0xffff7f03,	0x00000000,	0x00000000,
540649b49cdaSZbigniew Bodek 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
540749b49cdaSZbigniew Bodek 	 0},
540849b49cdaSZbigniew Bodek 	/* [8] tunneled fcoe over IPV4 */
540949b49cdaSZbigniew Bodek 	{0,		1,		0,		0,		1,
541049b49cdaSZbigniew Bodek 	 0,		8,		14,		1,		1,
541149b49cdaSZbigniew Bodek 	 0,		0,		0,		1,		0,
541249b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
541349b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03020014,
541449b49cdaSZbigniew Bodek 	 0},
541549b49cdaSZbigniew Bodek 	/* [9] tunneled fcoe over IPV6 */
541649b49cdaSZbigniew Bodek 	{0,		1,		0,		0,		1,
541749b49cdaSZbigniew Bodek 	 0,		8,		14,		1,		1,
541849b49cdaSZbigniew Bodek 	 0,		0,		0,		1,		0,
541949b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
542049b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
542149b49cdaSZbigniew Bodek 	 0},
542249b49cdaSZbigniew Bodek 	/* [10] tunneled routable_roce that is refered as l4_protocol, over IPV4 (and udp) over IPV4 */
542349b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
542449b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
542549b49cdaSZbigniew Bodek 	 0,		0,		0,		1,		0,
542649b49cdaSZbigniew Bodek 	 0,		0,		{0x3000cf00,	0x00000f00,	0xc0000000,
542749b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03020015,
542849b49cdaSZbigniew Bodek 	 0},
542949b49cdaSZbigniew Bodek 	/* [11] tunneled routable_roce that is refered as l4_protocol, over IPV4 (and udp) over IPV6 */
543049b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
543149b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
543249b49cdaSZbigniew Bodek 	 0,		0,		0,		1,		0,
543349b49cdaSZbigniew Bodek 	 0,		0,		{0x3000cf00,	0x00000f00,	0xc0000000,
543449b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000011,
543549b49cdaSZbigniew Bodek 	 0},
543649b49cdaSZbigniew Bodek 	/* [12] tunneled routable_roce that is refered as l4_protocol, over IPV6 (and udp) over IPV4 */
543749b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
543849b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
543949b49cdaSZbigniew Bodek 	 0,		0,		0,		1,		0,
544049b49cdaSZbigniew Bodek 	 0,		0,		{0x7f030000,	0x00000000,	0x00000003,
544149b49cdaSZbigniew Bodek 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03020014,
544249b49cdaSZbigniew Bodek 	 0},
544349b49cdaSZbigniew Bodek 	/* [13] tunneled routable_roce that is refered as l4_protocol, over IPV6 (and udp) over IPV6 */
544449b49cdaSZbigniew Bodek 	{0,		1,		1,		0,		1,
544549b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
544649b49cdaSZbigniew Bodek 	 0,		0,		0,		1,		0,
544749b49cdaSZbigniew Bodek 	 0,		0,		{0x7f030000,	0x00000000,	0x00000003,
544849b49cdaSZbigniew Bodek 	 0x00c00000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
544949b49cdaSZbigniew Bodek 	 0},
545049b49cdaSZbigniew Bodek 	/* [14] l3_pkt - IPV4 */
545149b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
545249b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
545349b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
545449b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
545549b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000001,
545649b49cdaSZbigniew Bodek 	 0},
545749b49cdaSZbigniew Bodek 	/* [15] l4_hdr over IPV4 */
545849b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
545949b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
546049b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
546149b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
546249b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000003,
546349b49cdaSZbigniew Bodek 	 0},
546449b49cdaSZbigniew Bodek 	/* [16] l3_pkt - IPV6 */
546549b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
546649b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
546749b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
546849b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
546949b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000000,
547049b49cdaSZbigniew Bodek 	 0},
547149b49cdaSZbigniew Bodek 	/* [17] l4_hdr over IPV6 */
547249b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
547349b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
547449b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
547549b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
547649b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000002,
547749b49cdaSZbigniew Bodek 	 0},
547849b49cdaSZbigniew Bodek 	/* [18] IPV4 over IPV4 */
547949b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
548049b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
548149b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
548249b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
548349b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00020005,
548449b49cdaSZbigniew Bodek 	 0},
548549b49cdaSZbigniew Bodek 	/* [19] l4_hdr over IPV4 over IPV4 */
548649b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
548749b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
548849b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
548949b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
549049b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00020007,
549149b49cdaSZbigniew Bodek 	 0},
549249b49cdaSZbigniew Bodek 	/* [20] IPV4 over IPV6 */
549349b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
549449b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
549549b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
549649b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
549749b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000001,
549849b49cdaSZbigniew Bodek 	 0},
549949b49cdaSZbigniew Bodek 	/* [21] l4_hdr over IPV4 over IPV6 */
550049b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
550149b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
550249b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
550349b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
550449b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000003,
550549b49cdaSZbigniew Bodek 	 0},
550649b49cdaSZbigniew Bodek 	/* [22] IPV6 over IPV4 */
550749b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
550849b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
550949b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
551049b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
551149b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00020004,
551249b49cdaSZbigniew Bodek 	 0},
551349b49cdaSZbigniew Bodek 	/* [23] l4_hdr over IPV6 over IPV4 */
551449b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
551549b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
551649b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
551749b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
551849b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00020006,
551949b49cdaSZbigniew Bodek 	 0},
552049b49cdaSZbigniew Bodek 	/* [24] IPV6 over IPV6 */
552149b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
552249b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
552349b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
552449b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
552549b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000000,
552649b49cdaSZbigniew Bodek 	 0},
552749b49cdaSZbigniew Bodek 	/* [25] l4_hdr over IPV6 over IPV6 */
552849b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
552949b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
553049b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
553149b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
553249b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00000002,
553349b49cdaSZbigniew Bodek 	 0},
553449b49cdaSZbigniew Bodek 	/* [26] GENERIC_STORAGE_READ, over IPV4 (and udp) */
553549b49cdaSZbigniew Bodek 	{1,		1,		1,		0,		1,
553649b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
553749b49cdaSZbigniew Bodek 	 0,		0,		0,		2,		0,
553849b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
553949b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000011,
554049b49cdaSZbigniew Bodek 	 0},
554149b49cdaSZbigniew Bodek 	/* [27] GENERIC_STORAGE_READ, over IPV6 (and udp) */
554249b49cdaSZbigniew Bodek 	{1,		1,		1,		0,		1,
554349b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
554449b49cdaSZbigniew Bodek 	 0,		0,		0,		2,		0,
554549b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
554649b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
554749b49cdaSZbigniew Bodek 	 0},
554849b49cdaSZbigniew Bodek 	/* [28] tunneled GENERIC_STORAGE_READ over IPV4 (and udp) over IPV4/IPV6 */
554949b49cdaSZbigniew Bodek 	{1,		1,		1,		0,		1,
555049b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
555149b49cdaSZbigniew Bodek 	 0,		0,		0,		3,		0,
555249b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
555349b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000011,
555449b49cdaSZbigniew Bodek 	 0},
555549b49cdaSZbigniew Bodek 	/* [29] tunneled GENERIC_STORAGE_READ over IPV6 (and udp)  over IPV4/IPV6 */
555649b49cdaSZbigniew Bodek 	{1,		1,		1,		0,		1,
555749b49cdaSZbigniew Bodek 	 0,		4,		0,		0,		1,
555849b49cdaSZbigniew Bodek 	 0,		0,		0,		3,		0,
555949b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
556049b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0xffffffff,	0x03000010,
556149b49cdaSZbigniew Bodek 	 0},
556249b49cdaSZbigniew Bodek 	/* [30] tunneled L2 over GRE over IPV4 */
556349b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
556449b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
556549b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
556649b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
556749b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x00020004,
556849b49cdaSZbigniew Bodek 	 0},
556949b49cdaSZbigniew Bodek 	/* [31] default match */
557049b49cdaSZbigniew Bodek 	{0,		0,		0,		0,		0,
557149b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
557249b49cdaSZbigniew Bodek 	 0,		0,		0,		0,		0,
557349b49cdaSZbigniew Bodek 	 0,		0,		{0x00000000,	0x00000000,	0x00000000,
557449b49cdaSZbigniew Bodek 	 0x00000000,	0x00000000,	0x00000000},	0x00000000,	0x0,
557549b49cdaSZbigniew Bodek 	 0}
557649b49cdaSZbigniew Bodek };
557749b49cdaSZbigniew Bodek 
al_eth_tx_protocol_detect_table_init(struct al_hal_eth_adapter * adapter)557849b49cdaSZbigniew Bodek int al_eth_tx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter)
557949b49cdaSZbigniew Bodek {
558049b49cdaSZbigniew Bodek 	int idx;
558149b49cdaSZbigniew Bodek 	al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
558249b49cdaSZbigniew Bodek 
558349b49cdaSZbigniew Bodek 	for (idx = 0; idx < AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM; idx++)
558449b49cdaSZbigniew Bodek 		al_eth_tx_protocol_detect_table_entry_set(adapter, idx,
558549b49cdaSZbigniew Bodek 				&al_eth_generic_tx_crc_gpd[idx]);
558649b49cdaSZbigniew Bodek 
558749b49cdaSZbigniew Bodek 	return 0;
558849b49cdaSZbigniew Bodek }
558949b49cdaSZbigniew Bodek 
al_eth_tx_generic_crc_table_init(struct al_hal_eth_adapter * adapter)559049b49cdaSZbigniew Bodek int al_eth_tx_generic_crc_table_init(struct al_hal_eth_adapter *adapter)
559149b49cdaSZbigniew Bodek {
559249b49cdaSZbigniew Bodek 	int idx;
559349b49cdaSZbigniew Bodek 	al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
559449b49cdaSZbigniew Bodek 
559549b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: enable tx_generic_crc\n", adapter->name);
559649b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_legacy, 0x0);
559749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace, 0x0);
559849b49cdaSZbigniew Bodek 	for (idx = 0; idx < AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM; idx++)
559949b49cdaSZbigniew Bodek 		al_eth_tx_generic_crc_table_entry_set(adapter, idx,
560049b49cdaSZbigniew Bodek 				&al_eth_generic_tx_crc_gcp[idx]);
560149b49cdaSZbigniew Bodek 
560249b49cdaSZbigniew Bodek 	return 0;
560349b49cdaSZbigniew Bodek }
560449b49cdaSZbigniew Bodek 
al_eth_tx_crc_chksum_replace_cmd_init(struct al_hal_eth_adapter * adapter)560549b49cdaSZbigniew Bodek int al_eth_tx_crc_chksum_replace_cmd_init(struct al_hal_eth_adapter *adapter)
560649b49cdaSZbigniew Bodek {
560749b49cdaSZbigniew Bodek 	int idx;
560849b49cdaSZbigniew Bodek 	al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
560949b49cdaSZbigniew Bodek 
561049b49cdaSZbigniew Bodek 	for (idx = 0; idx < AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM; idx++)
561149b49cdaSZbigniew Bodek 		al_eth_tx_crc_chksum_replace_cmd_entry_set(adapter, idx,
561249b49cdaSZbigniew Bodek 				&al_eth_tx_crc_chksum_replace_cmd[idx]);
561349b49cdaSZbigniew Bodek 
561449b49cdaSZbigniew Bodek 	return 0;
561549b49cdaSZbigniew Bodek }
561649b49cdaSZbigniew Bodek 
al_eth_rx_protocol_detect_table_init(struct al_hal_eth_adapter * adapter)561749b49cdaSZbigniew Bodek int al_eth_rx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter)
561849b49cdaSZbigniew Bodek {
561949b49cdaSZbigniew Bodek 	int idx;
562049b49cdaSZbigniew Bodek 	al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
562149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p1,
562249b49cdaSZbigniew Bodek 			AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L3_PROTO_IDX_OFFSET);
562349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p2,
562449b49cdaSZbigniew Bodek 			AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L4_PROTO_IDX_OFFSET);
562549b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p3,
562649b49cdaSZbigniew Bodek 			AL_ETH_RX_GPD_PARSE_RESULT_INNER_L3_PROTO_IDX_OFFSET);
562749b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p4,
562849b49cdaSZbigniew Bodek 			AL_ETH_RX_GPD_PARSE_RESULT_INNER_L4_PROTO_IDX_OFFSET);
562949b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p5,
563049b49cdaSZbigniew Bodek 			AL_ETH_RX_GPD_PARSE_RESULT_OUTER_PARSE_CTRL);
563149b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p6,
563249b49cdaSZbigniew Bodek 			AL_ETH_RX_GPD_PARSE_RESULT_INNER_PARSE_CTRL);
563349b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p7,
563449b49cdaSZbigniew Bodek 			AL_ETH_RX_GPD_PARSE_RESULT_L3_PRIORITY);
563549b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p8,
563649b49cdaSZbigniew Bodek 			AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L4_DST_PORT_LSB);
563749b49cdaSZbigniew Bodek 
563849b49cdaSZbigniew Bodek 	for (idx = 0; idx < AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM; idx++)
563949b49cdaSZbigniew Bodek 		al_eth_rx_protocol_detect_table_entry_set(adapter, idx,
564049b49cdaSZbigniew Bodek 				&al_eth_generic_rx_crc_gpd[idx]);
564149b49cdaSZbigniew Bodek 	return 0;
564249b49cdaSZbigniew Bodek }
564349b49cdaSZbigniew Bodek 
al_eth_rx_generic_crc_table_init(struct al_hal_eth_adapter * adapter)564449b49cdaSZbigniew Bodek int al_eth_rx_generic_crc_table_init(struct al_hal_eth_adapter *adapter)
564549b49cdaSZbigniew Bodek 	{
564649b49cdaSZbigniew Bodek 	int idx;
564749b49cdaSZbigniew Bodek 	uint32_t val;
564849b49cdaSZbigniew Bodek 
564949b49cdaSZbigniew Bodek 	al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
565049b49cdaSZbigniew Bodek 
565149b49cdaSZbigniew Bodek 	al_dbg("eth [%s]: enable rx_generic_crc\n", adapter->name);
565249b49cdaSZbigniew Bodek 	al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_legacy, 0x0);
565349b49cdaSZbigniew Bodek 
565449b49cdaSZbigniew Bodek 	for (idx = 0; idx < AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM; idx++)
565549b49cdaSZbigniew Bodek 		al_eth_rx_generic_crc_table_entry_set(adapter, idx,
565649b49cdaSZbigniew Bodek 				&al_eth_generic_rx_crc_gcp[idx]);
565749b49cdaSZbigniew Bodek 
565849b49cdaSZbigniew Bodek 	val = EC_GEN_V3_RX_COMP_DESC_W3_DEC_STAT_15_CRC_RES_SEL |
565949b49cdaSZbigniew Bodek 			EC_GEN_V3_RX_COMP_DESC_W3_DEC_STAT_14_L3_CKS_RES_SEL |
566049b49cdaSZbigniew Bodek 			EC_GEN_V3_RX_COMP_DESC_W3_DEC_STAT_13_L4_CKS_RES_SEL |
566149b49cdaSZbigniew Bodek 			EC_GEN_V3_RX_COMP_DESC_W0_L3_CKS_RES_SEL;
566249b49cdaSZbigniew Bodek 	al_reg_write32_masked(&adapter->ec_regs_base->gen_v3.rx_comp_desc,
566349b49cdaSZbigniew Bodek 			val, val);
566449b49cdaSZbigniew Bodek 	return 0;
566549b49cdaSZbigniew Bodek }
566649b49cdaSZbigniew Bodek 
566749b49cdaSZbigniew Bodek /** @} end of Ethernet group */
566849b49cdaSZbigniew Bodek 
5669