xref: /onnv-gate/usr/src/uts/common/io/nxge/npi/npi_mac.c (revision 6929:a596171cbf16)
13859Sml29623 /*
23859Sml29623  * CDDL HEADER START
33859Sml29623  *
43859Sml29623  * The contents of this file are subject to the terms of the
53859Sml29623  * Common Development and Distribution License (the "License").
63859Sml29623  * You may not use this file except in compliance with the License.
73859Sml29623  *
83859Sml29623  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93859Sml29623  * or http://www.opensolaris.org/os/licensing.
103859Sml29623  * See the License for the specific language governing permissions
113859Sml29623  * and limitations under the License.
123859Sml29623  *
133859Sml29623  * When distributing Covered Code, include this CDDL HEADER in each
143859Sml29623  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153859Sml29623  * If applicable, add the following below this CDDL HEADER, with the
163859Sml29623  * fields enclosed by brackets "[]" replaced with your own identifying
173859Sml29623  * information: Portions Copyright [yyyy] [name of copyright owner]
183859Sml29623  *
193859Sml29623  * CDDL HEADER END
203859Sml29623  */
213859Sml29623 /*
226028Ssbehera  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
233859Sml29623  * Use is subject to license terms.
243859Sml29623  */
253859Sml29623 
263859Sml29623 #pragma ident	"%Z%%M%	%I%	%E% SMI"
273859Sml29623 
283859Sml29623 #include <npi_mac.h>
293859Sml29623 
303859Sml29623 #define	MIF_DELAY	500
313859Sml29623 
323859Sml29623 #define	MAX_FRAME_SZ1	0x5EE
333859Sml29623 #define	MAX_FRAME_SZ2	0x5F6
343859Sml29623 #define	MAX_FRAME_SZ3	0x7D6
353859Sml29623 #define	MAX_FRAME_SZ4	0x232E
363859Sml29623 #define	MAX_FRAME_SZ5	0x2406
373859Sml29623 
383859Sml29623 #define	XMAC_WAIT_REG(handle, portn, reg, val) {\
393859Sml29623 	uint32_t cnt = MAX_PIO_RETRIES;\
403859Sml29623 	do {\
413859Sml29623 		NXGE_DELAY(MAC_RESET_WAIT);\
423859Sml29623 		XMAC_REG_RD(handle, portn, reg, &val);\
433859Sml29623 		cnt--;\
443859Sml29623 	} while (((val & 0x3) != 0) && (cnt > 0));\
453859Sml29623 }
463859Sml29623 
473859Sml29623 #define	BMAC_WAIT_REG(handle, portn, reg, val) {\
483859Sml29623 	uint32_t cnt = MAX_PIO_RETRIES;\
493859Sml29623 	do {\
503859Sml29623 		NXGE_DELAY(MAC_RESET_WAIT);\
513859Sml29623 		BMAC_REG_RD(handle, portn, reg, &val);\
523859Sml29623 		cnt--;\
533859Sml29623 	} while (((val & 0x3) != 0) && (cnt > 0));\
543859Sml29623 }
553859Sml29623 
563859Sml29623 #define	MIF_WAIT_REG(handle, m_frame, t_delay, interval, max_delay) {	  \
573859Sml29623 	do {								  \
583859Sml29623 		NXGE_DELAY(interval);					  \
593859Sml29623 		MIF_REG_RD(handle, MIF_OUTPUT_FRAME_REG, &m_frame.value); \
603859Sml29623 		t_delay++;						  \
613859Sml29623 	} while ((m_frame.bits.w0.ta_lsb == 0) && t_delay < max_delay);	  \
623859Sml29623 }
633859Sml29623 
643859Sml29623 uint64_t xmac_offset[] = {
653859Sml29623 	XTXMAC_SW_RST_REG,
663859Sml29623 	XRXMAC_SW_RST_REG,
673859Sml29623 	XTXMAC_STATUS_REG,
683859Sml29623 	XRXMAC_STATUS_REG,
693859Sml29623 	XMAC_CTRL_STAT_REG,
703859Sml29623 	XTXMAC_STAT_MSK_REG,
713859Sml29623 	XRXMAC_STAT_MSK_REG,
723859Sml29623 	XMAC_C_S_MSK_REG,
733859Sml29623 	XMAC_CONFIG_REG,
743859Sml29623 	XMAC_IPG_REG,
753859Sml29623 	XMAC_MIN_REG,
763859Sml29623 	XMAC_MAX_REG,
773859Sml29623 	XMAC_ADDR0_REG,
783859Sml29623 	XMAC_ADDR1_REG,
793859Sml29623 	XMAC_ADDR2_REG,
803859Sml29623 	XRXMAC_BT_CNT_REG,
813859Sml29623 	XRXMAC_BC_FRM_CNT_REG,
823859Sml29623 	XRXMAC_MC_FRM_CNT_REG,
833859Sml29623 	XRXMAC_FRAG_CNT_REG,
843859Sml29623 	XRXMAC_HIST_CNT1_REG,
853859Sml29623 	XRXMAC_HIST_CNT2_REG,
863859Sml29623 	XRXMAC_HIST_CNT3_REG,
873859Sml29623 	XRXMAC_HIST_CNT4_REG,
883859Sml29623 	XRXMAC_HIST_CNT5_REG,
893859Sml29623 	XRXMAC_HIST_CNT6_REG,
903859Sml29623 	XRXMAC_MPSZER_CNT_REG,
913859Sml29623 	XRXMAC_CRC_ER_CNT_REG,
923859Sml29623 	XRXMAC_CD_VIO_CNT_REG,
933859Sml29623 	XRXMAC_AL_ER_CNT_REG,
943859Sml29623 	XTXMAC_FRM_CNT_REG,
953859Sml29623 	XTXMAC_BYTE_CNT_REG,
963859Sml29623 	XMAC_LINK_FLT_CNT_REG,
973859Sml29623 	XRXMAC_HIST_CNT7_REG,
983859Sml29623 	XMAC_SM_REG,
993859Sml29623 	XMAC_INTERN1_REG,
1005572Ssbehera 	XMAC_INTERN2_REG,
1013859Sml29623 	XMAC_ADDR_CMPEN_REG,
1023859Sml29623 	XMAC_ADDR3_REG,
1033859Sml29623 	XMAC_ADDR4_REG,
1043859Sml29623 	XMAC_ADDR5_REG,
1053859Sml29623 	XMAC_ADDR6_REG,
1063859Sml29623 	XMAC_ADDR7_REG,
1073859Sml29623 	XMAC_ADDR8_REG,
1083859Sml29623 	XMAC_ADDR9_REG,
1093859Sml29623 	XMAC_ADDR10_REG,
1103859Sml29623 	XMAC_ADDR11_REG,
1113859Sml29623 	XMAC_ADDR12_REG,
1123859Sml29623 	XMAC_ADDR13_REG,
1133859Sml29623 	XMAC_ADDR14_REG,
1143859Sml29623 	XMAC_ADDR15_REG,
1153859Sml29623 	XMAC_ADDR16_REG,
1163859Sml29623 	XMAC_ADDR17_REG,
1173859Sml29623 	XMAC_ADDR18_REG,
1183859Sml29623 	XMAC_ADDR19_REG,
1193859Sml29623 	XMAC_ADDR20_REG,
1203859Sml29623 	XMAC_ADDR21_REG,
1213859Sml29623 	XMAC_ADDR22_REG,
1223859Sml29623 	XMAC_ADDR23_REG,
1233859Sml29623 	XMAC_ADDR24_REG,
1243859Sml29623 	XMAC_ADDR25_REG,
1253859Sml29623 	XMAC_ADDR26_REG,
1263859Sml29623 	XMAC_ADDR27_REG,
1273859Sml29623 	XMAC_ADDR28_REG,
1283859Sml29623 	XMAC_ADDR29_REG,
1293859Sml29623 	XMAC_ADDR30_REG,
1303859Sml29623 	XMAC_ADDR31_REG,
1313859Sml29623 	XMAC_ADDR32_REG,
1323859Sml29623 	XMAC_ADDR33_REG,
1333859Sml29623 	XMAC_ADDR34_REG,
1343859Sml29623 	XMAC_ADDR35_REG,
1353859Sml29623 	XMAC_ADDR36_REG,
1363859Sml29623 	XMAC_ADDR37_REG,
1373859Sml29623 	XMAC_ADDR38_REG,
1383859Sml29623 	XMAC_ADDR39_REG,
1393859Sml29623 	XMAC_ADDR40_REG,
1403859Sml29623 	XMAC_ADDR41_REG,
1413859Sml29623 	XMAC_ADDR42_REG,
1423859Sml29623 	XMAC_ADDR43_REG,
1433859Sml29623 	XMAC_ADDR44_REG,
1443859Sml29623 	XMAC_ADDR45_REG,
1453859Sml29623 	XMAC_ADDR46_REG,
1463859Sml29623 	XMAC_ADDR47_REG,
1473859Sml29623 	XMAC_ADDR48_REG,
1483859Sml29623 	XMAC_ADDR49_REG,
1493859Sml29623 	XMAC_ADDR50_REG,
1503859Sml29623 	XMAC_ADDR_FILT0_REG,
1513859Sml29623 	XMAC_ADDR_FILT1_REG,
1523859Sml29623 	XMAC_ADDR_FILT2_REG,
1533859Sml29623 	XMAC_ADDR_FILT12_MASK_REG,
1543859Sml29623 	XMAC_ADDR_FILT0_MASK_REG,
1553859Sml29623 	XMAC_HASH_TBL0_REG,
1563859Sml29623 	XMAC_HASH_TBL1_REG,
1573859Sml29623 	XMAC_HASH_TBL2_REG,
1583859Sml29623 	XMAC_HASH_TBL3_REG,
1593859Sml29623 	XMAC_HASH_TBL4_REG,
1603859Sml29623 	XMAC_HASH_TBL5_REG,
1613859Sml29623 	XMAC_HASH_TBL6_REG,
1623859Sml29623 	XMAC_HASH_TBL7_REG,
1633859Sml29623 	XMAC_HASH_TBL8_REG,
1643859Sml29623 	XMAC_HASH_TBL9_REG,
1653859Sml29623 	XMAC_HASH_TBL10_REG,
1663859Sml29623 	XMAC_HASH_TBL11_REG,
1673859Sml29623 	XMAC_HASH_TBL12_REG,
1683859Sml29623 	XMAC_HASH_TBL13_REG,
1693859Sml29623 	XMAC_HASH_TBL14_REG,
1703859Sml29623 	XMAC_HASH_TBL15_REG,
1713859Sml29623 	XMAC_HOST_INF0_REG,
1723859Sml29623 	XMAC_HOST_INF1_REG,
1733859Sml29623 	XMAC_HOST_INF2_REG,
1743859Sml29623 	XMAC_HOST_INF3_REG,
1753859Sml29623 	XMAC_HOST_INF4_REG,
1763859Sml29623 	XMAC_HOST_INF5_REG,
1773859Sml29623 	XMAC_HOST_INF6_REG,
1783859Sml29623 	XMAC_HOST_INF7_REG,
1793859Sml29623 	XMAC_HOST_INF8_REG,
1803859Sml29623 	XMAC_HOST_INF9_REG,
1813859Sml29623 	XMAC_HOST_INF10_REG,
1823859Sml29623 	XMAC_HOST_INF11_REG,
1833859Sml29623 	XMAC_HOST_INF12_REG,
1843859Sml29623 	XMAC_HOST_INF13_REG,
1853859Sml29623 	XMAC_HOST_INF14_REG,
1863859Sml29623 	XMAC_HOST_INF15_REG,
1873859Sml29623 	XMAC_HOST_INF16_REG,
1883859Sml29623 	XMAC_HOST_INF17_REG,
1893859Sml29623 	XMAC_HOST_INF18_REG,
1903859Sml29623 	XMAC_HOST_INF19_REG,
1913859Sml29623 	XMAC_PA_DATA0_REG,
1923859Sml29623 	XMAC_PA_DATA1_REG,
1933859Sml29623 	XMAC_DEBUG_SEL_REG,
1943859Sml29623 	XMAC_TRAINING_VECT_REG,
1953859Sml29623 };
1963859Sml29623 
1973859Sml29623 const char *xmac_name[] = {
1983859Sml29623 	"XTXMAC_SW_RST_REG",
1993859Sml29623 	"XRXMAC_SW_RST_REG",
2003859Sml29623 	"XTXMAC_STATUS_REG",
2013859Sml29623 	"XRXMAC_STATUS_REG",
2023859Sml29623 	"XMAC_CTRL_STAT_REG",
2033859Sml29623 	"XTXMAC_STAT_MSK_REG",
2043859Sml29623 	"XRXMAC_STAT_MSK_REG",
2053859Sml29623 	"XMAC_C_S_MSK_REG",
2063859Sml29623 	"XMAC_CONFIG_REG",
2073859Sml29623 	"XMAC_IPG_REG",
2083859Sml29623 	"XMAC_MIN_REG",
2093859Sml29623 	"XMAC_MAX_REG",
2103859Sml29623 	"XMAC_ADDR0_REG",
2113859Sml29623 	"XMAC_ADDR1_REG",
2123859Sml29623 	"XMAC_ADDR2_REG",
2133859Sml29623 	"XRXMAC_BT_CNT_REG",
2143859Sml29623 	"XRXMAC_BC_FRM_CNT_REG",
2153859Sml29623 	"XRXMAC_MC_FRM_CNT_REG",
2163859Sml29623 	"XRXMAC_FRAG_CNT_REG",
2173859Sml29623 	"XRXMAC_HIST_CNT1_REG",
2183859Sml29623 	"XRXMAC_HIST_CNT2_REG",
2193859Sml29623 	"XRXMAC_HIST_CNT3_REG",
2203859Sml29623 	"XRXMAC_HIST_CNT4_REG",
2213859Sml29623 	"XRXMAC_HIST_CNT5_REG",
2223859Sml29623 	"XRXMAC_HIST_CNT6_REG",
2233859Sml29623 	"XRXMAC_MPSZER_CNT_REG",
2243859Sml29623 	"XRXMAC_CRC_ER_CNT_REG",
2253859Sml29623 	"XRXMAC_CD_VIO_CNT_REG",
2263859Sml29623 	"XRXMAC_AL_ER_CNT_REG",
2273859Sml29623 	"XTXMAC_FRM_CNT_REG",
2283859Sml29623 	"XTXMAC_BYTE_CNT_REG",
2293859Sml29623 	"XMAC_LINK_FLT_CNT_REG",
2303859Sml29623 	"XRXMAC_HIST_CNT7_REG",
2313859Sml29623 	"XMAC_SM_REG",
2323859Sml29623 	"XMAC_INTERN1_REG",
2335572Ssbehera 	"XMAC_INTERN2_REG",
2343859Sml29623 	"XMAC_ADDR_CMPEN_REG",
2353859Sml29623 	"XMAC_ADDR3_REG",
2363859Sml29623 	"XMAC_ADDR4_REG",
2373859Sml29623 	"XMAC_ADDR5_REG",
2383859Sml29623 	"XMAC_ADDR6_REG",
2393859Sml29623 	"XMAC_ADDR7_REG",
2403859Sml29623 	"XMAC_ADDR8_REG",
2413859Sml29623 	"XMAC_ADDR9_REG",
2423859Sml29623 	"XMAC_ADDR10_REG",
2433859Sml29623 	"XMAC_ADDR11_REG",
2443859Sml29623 	"XMAC_ADDR12_REG",
2453859Sml29623 	"XMAC_ADDR13_REG",
2463859Sml29623 	"XMAC_ADDR14_REG",
2473859Sml29623 	"XMAC_ADDR15_REG",
2483859Sml29623 	"XMAC_ADDR16_REG",
2493859Sml29623 	"XMAC_ADDR17_REG",
2503859Sml29623 	"XMAC_ADDR18_REG",
2513859Sml29623 	"XMAC_ADDR19_REG",
2523859Sml29623 	"XMAC_ADDR20_REG",
2533859Sml29623 	"XMAC_ADDR21_REG",
2543859Sml29623 	"XMAC_ADDR22_REG",
2553859Sml29623 	"XMAC_ADDR23_REG",
2563859Sml29623 	"XMAC_ADDR24_REG",
2573859Sml29623 	"XMAC_ADDR25_REG",
2583859Sml29623 	"XMAC_ADDR26_REG",
2593859Sml29623 	"XMAC_ADDR27_REG",
2603859Sml29623 	"XMAC_ADDR28_REG",
2613859Sml29623 	"XMAC_ADDR29_REG",
2623859Sml29623 	"XMAC_ADDR30_REG",
2633859Sml29623 	"XMAC_ADDR31_REG",
2643859Sml29623 	"XMAC_ADDR32_REG",
2653859Sml29623 	"XMAC_ADDR33_REG",
2663859Sml29623 	"XMAC_ADDR34_REG",
2673859Sml29623 	"XMAC_ADDR35_REG",
2683859Sml29623 	"XMAC_ADDR36_REG",
2693859Sml29623 	"XMAC_ADDR37_REG",
2703859Sml29623 	"XMAC_ADDR38_REG",
2713859Sml29623 	"XMAC_ADDR39_REG",
2723859Sml29623 	"XMAC_ADDR40_REG",
2733859Sml29623 	"XMAC_ADDR41_REG",
2743859Sml29623 	"XMAC_ADDR42_REG",
2753859Sml29623 	"XMAC_ADDR43_REG",
2763859Sml29623 	"XMAC_ADDR44_REG",
2773859Sml29623 	"XMAC_ADDR45_REG",
2783859Sml29623 	"XMAC_ADDR46_REG",
2793859Sml29623 	"XMAC_ADDR47_REG",
2803859Sml29623 	"XMAC_ADDR48_REG",
2813859Sml29623 	"XMAC_ADDR49_REG",
2823859Sml29623 	"XMAC_ADDR50_RE",
2833859Sml29623 	"XMAC_ADDR_FILT0_REG",
2843859Sml29623 	"XMAC_ADDR_FILT1_REG",
2853859Sml29623 	"XMAC_ADDR_FILT2_REG",
2863859Sml29623 	"XMAC_ADDR_FILT12_MASK_REG",
2873859Sml29623 	"XMAC_ADDR_FILT0_MASK_REG",
2883859Sml29623 	"XMAC_HASH_TBL0_REG",
2893859Sml29623 	"XMAC_HASH_TBL1_REG",
2903859Sml29623 	"XMAC_HASH_TBL2_REG",
2913859Sml29623 	"XMAC_HASH_TBL3_REG",
2923859Sml29623 	"XMAC_HASH_TBL4_REG",
2933859Sml29623 	"XMAC_HASH_TBL5_REG",
2943859Sml29623 	"XMAC_HASH_TBL6_REG",
2953859Sml29623 	"XMAC_HASH_TBL7_REG",
2963859Sml29623 	"XMAC_HASH_TBL8_REG",
2973859Sml29623 	"XMAC_HASH_TBL9_REG",
2983859Sml29623 	"XMAC_HASH_TBL10_REG",
2993859Sml29623 	"XMAC_HASH_TBL11_REG",
3003859Sml29623 	"XMAC_HASH_TBL12_REG",
3013859Sml29623 	"XMAC_HASH_TBL13_REG",
3023859Sml29623 	"XMAC_HASH_TBL14_REG",
3033859Sml29623 	"XMAC_HASH_TBL15_REG",
3043859Sml29623 	"XMAC_HOST_INF0_REG",
3053859Sml29623 	"XMAC_HOST_INF1_REG",
3063859Sml29623 	"XMAC_HOST_INF2_REG",
3073859Sml29623 	"XMAC_HOST_INF3_REG",
3083859Sml29623 	"XMAC_HOST_INF4_REG",
3093859Sml29623 	"XMAC_HOST_INF5_REG",
3103859Sml29623 	"XMAC_HOST_INF6_REG",
3113859Sml29623 	"XMAC_HOST_INF7_REG",
3123859Sml29623 	"XMAC_HOST_INF8_REG",
3133859Sml29623 	"XMAC_HOST_INF9_REG",
3143859Sml29623 	"XMAC_HOST_INF10_REG",
3153859Sml29623 	"XMAC_HOST_INF11_REG",
3163859Sml29623 	"XMAC_HOST_INF12_REG",
3173859Sml29623 	"XMAC_HOST_INF13_REG",
3183859Sml29623 	"XMAC_HOST_INF14_REG",
3193859Sml29623 	"XMAC_HOST_INF15_REG",
3203859Sml29623 	"XMAC_HOST_INF16_REG",
3213859Sml29623 	"XMAC_HOST_INF17_REG",
3223859Sml29623 	"XMAC_HOST_INF18_REG",
3233859Sml29623 	"XMAC_HOST_INF19_REG",
3243859Sml29623 	"XMAC_PA_DATA0_REG",
3253859Sml29623 	"XMAC_PA_DATA1_REG",
3263859Sml29623 	"XMAC_DEBUG_SEL_REG",
3273859Sml29623 	"XMAC_TRAINING_VECT_REG",
3283859Sml29623 };
3293859Sml29623 
3303859Sml29623 uint64_t bmac_offset[] = {
3313859Sml29623 	BTXMAC_SW_RST_REG,
3323859Sml29623 	BRXMAC_SW_RST_REG,
3333859Sml29623 	MAC_SEND_PAUSE_REG,
3343859Sml29623 	BTXMAC_STATUS_REG,
3353859Sml29623 	BRXMAC_STATUS_REG,
3363859Sml29623 	BMAC_CTRL_STAT_REG,
3373859Sml29623 	BTXMAC_STAT_MSK_REG,
3383859Sml29623 	BRXMAC_STAT_MSK_REG,
3393859Sml29623 	BMAC_C_S_MSK_REG,
3403859Sml29623 	TXMAC_CONFIG_REG,
3413859Sml29623 	RXMAC_CONFIG_REG,
3423859Sml29623 	MAC_CTRL_CONFIG_REG,
3433859Sml29623 	MAC_XIF_CONFIG_REG,
3443859Sml29623 	BMAC_MIN_REG,
3453859Sml29623 	BMAC_MAX_REG,
3463859Sml29623 	MAC_PA_SIZE_REG,
3473859Sml29623 	MAC_CTRL_TYPE_REG,
3483859Sml29623 	BMAC_ADDR0_REG,
3493859Sml29623 	BMAC_ADDR1_REG,
3503859Sml29623 	BMAC_ADDR2_REG,
3513859Sml29623 	BMAC_ADDR3_REG,
3523859Sml29623 	BMAC_ADDR4_REG,
3533859Sml29623 	BMAC_ADDR5_REG,
3543859Sml29623 	BMAC_ADDR6_REG,
3553859Sml29623 	BMAC_ADDR7_REG,
3563859Sml29623 	BMAC_ADDR8_REG,
3573859Sml29623 	BMAC_ADDR9_REG,
3583859Sml29623 	BMAC_ADDR10_REG,
3593859Sml29623 	BMAC_ADDR11_REG,
3603859Sml29623 	BMAC_ADDR12_REG,
3613859Sml29623 	BMAC_ADDR13_REG,
3623859Sml29623 	BMAC_ADDR14_REG,
3633859Sml29623 	BMAC_ADDR15_REG,
3643859Sml29623 	BMAC_ADDR16_REG,
3653859Sml29623 	BMAC_ADDR17_REG,
3663859Sml29623 	BMAC_ADDR18_REG,
3673859Sml29623 	BMAC_ADDR19_REG,
3683859Sml29623 	BMAC_ADDR20_REG,
3693859Sml29623 	BMAC_ADDR21_REG,
3703859Sml29623 	BMAC_ADDR22_REG,
3713859Sml29623 	BMAC_ADDR23_REG,
3723859Sml29623 	MAC_FC_ADDR0_REG,
3733859Sml29623 	MAC_FC_ADDR1_REG,
3743859Sml29623 	MAC_FC_ADDR2_REG,
3753859Sml29623 	MAC_ADDR_FILT0_REG,
3763859Sml29623 	MAC_ADDR_FILT1_REG,
3773859Sml29623 	MAC_ADDR_FILT2_REG,
3783859Sml29623 	MAC_ADDR_FILT12_MASK_REG,
3793859Sml29623 	MAC_ADDR_FILT00_MASK_REG,
3803859Sml29623 	MAC_HASH_TBL0_REG,
3813859Sml29623 	MAC_HASH_TBL1_REG,
3823859Sml29623 	MAC_HASH_TBL2_REG,
3833859Sml29623 	MAC_HASH_TBL3_REG,
3843859Sml29623 	MAC_HASH_TBL4_REG,
3853859Sml29623 	MAC_HASH_TBL5_REG,
3863859Sml29623 	MAC_HASH_TBL6_REG,
3873859Sml29623 	MAC_HASH_TBL7_REG,
3883859Sml29623 	MAC_HASH_TBL8_REG,
3893859Sml29623 	MAC_HASH_TBL9_REG,
3903859Sml29623 	MAC_HASH_TBL10_REG,
3913859Sml29623 	MAC_HASH_TBL11_REG,
3923859Sml29623 	MAC_HASH_TBL12_REG,
3933859Sml29623 	MAC_HASH_TBL13_REG,
3943859Sml29623 	MAC_HASH_TBL14_REG,
3953859Sml29623 	MAC_HASH_TBL15_REG,
3963859Sml29623 	RXMAC_FRM_CNT_REG,
3973859Sml29623 	MAC_LEN_ER_CNT_REG,
3983859Sml29623 	BMAC_AL_ER_CNT_REG,
3993859Sml29623 	BMAC_CRC_ER_CNT_REG,
4003859Sml29623 	BMAC_CD_VIO_CNT_REG,
4013859Sml29623 	BMAC_SM_REG,
4023859Sml29623 	BMAC_ALTAD_CMPEN_REG,
4033859Sml29623 	BMAC_HOST_INF0_REG,
4043859Sml29623 	BMAC_HOST_INF1_REG,
4053859Sml29623 	BMAC_HOST_INF2_REG,
4063859Sml29623 	BMAC_HOST_INF3_REG,
4073859Sml29623 	BMAC_HOST_INF4_REG,
4083859Sml29623 	BMAC_HOST_INF5_REG,
4093859Sml29623 	BMAC_HOST_INF6_REG,
4103859Sml29623 	BMAC_HOST_INF7_REG,
4113859Sml29623 	BMAC_HOST_INF8_REG,
4123859Sml29623 	BTXMAC_BYTE_CNT_REG,
4133859Sml29623 	BTXMAC_FRM_CNT_REG,
4143859Sml29623 	BRXMAC_BYTE_CNT_REG,
4153859Sml29623 };
4163859Sml29623 
4173859Sml29623 const char *bmac_name[] = {
4183859Sml29623 	"BTXMAC_SW_RST_REG",
4193859Sml29623 	"BRXMAC_SW_RST_REG",
4203859Sml29623 	"MAC_SEND_PAUSE_REG",
4213859Sml29623 	"BTXMAC_STATUS_REG",
4223859Sml29623 	"BRXMAC_STATUS_REG",
4233859Sml29623 	"BMAC_CTRL_STAT_REG",
4243859Sml29623 	"BTXMAC_STAT_MSK_REG",
4253859Sml29623 	"BRXMAC_STAT_MSK_REG",
4263859Sml29623 	"BMAC_C_S_MSK_REG",
4273859Sml29623 	"TXMAC_CONFIG_REG",
4283859Sml29623 	"RXMAC_CONFIG_REG",
4293859Sml29623 	"MAC_CTRL_CONFIG_REG",
4303859Sml29623 	"MAC_XIF_CONFIG_REG",
4313859Sml29623 	"BMAC_MIN_REG",
4323859Sml29623 	"BMAC_MAX_REG",
4333859Sml29623 	"MAC_PA_SIZE_REG",
4343859Sml29623 	"MAC_CTRL_TYPE_REG",
4353859Sml29623 	"BMAC_ADDR0_REG",
4363859Sml29623 	"BMAC_ADDR1_REG",
4373859Sml29623 	"BMAC_ADDR2_REG",
4383859Sml29623 	"BMAC_ADDR3_REG",
4393859Sml29623 	"BMAC_ADDR4_REG",
4403859Sml29623 	"BMAC_ADDR5_REG",
4413859Sml29623 	"BMAC_ADDR6_REG",
4423859Sml29623 	"BMAC_ADDR7_REG",
4433859Sml29623 	"BMAC_ADDR8_REG",
4443859Sml29623 	"BMAC_ADDR9_REG",
4453859Sml29623 	"BMAC_ADDR10_REG",
4463859Sml29623 	"BMAC_ADDR11_REG",
4473859Sml29623 	"BMAC_ADDR12_REG",
4483859Sml29623 	"BMAC_ADDR13_REG",
4493859Sml29623 	"BMAC_ADDR14_REG",
4503859Sml29623 	"BMAC_ADDR15_REG",
4513859Sml29623 	"BMAC_ADDR16_REG",
4523859Sml29623 	"BMAC_ADDR17_REG",
4533859Sml29623 	"BMAC_ADDR18_REG",
4543859Sml29623 	"BMAC_ADDR19_REG",
4553859Sml29623 	"BMAC_ADDR20_REG",
4563859Sml29623 	"BMAC_ADDR21_REG",
4573859Sml29623 	"BMAC_ADDR22_REG",
4583859Sml29623 	"BMAC_ADDR23_REG",
4593859Sml29623 	"MAC_FC_ADDR0_REG",
4603859Sml29623 	"MAC_FC_ADDR1_REG",
4613859Sml29623 	"MAC_FC_ADDR2_REG",
4623859Sml29623 	"MAC_ADDR_FILT0_REG",
4633859Sml29623 	"MAC_ADDR_FILT1_REG",
4643859Sml29623 	"MAC_ADDR_FILT2_REG",
4653859Sml29623 	"MAC_ADDR_FILT12_MASK_REG",
4663859Sml29623 	"MAC_ADDR_FILT00_MASK_REG",
4673859Sml29623 	"MAC_HASH_TBL0_REG",
4683859Sml29623 	"MAC_HASH_TBL1_REG",
4693859Sml29623 	"MAC_HASH_TBL2_REG",
4703859Sml29623 	"MAC_HASH_TBL3_REG",
4713859Sml29623 	"MAC_HASH_TBL4_REG",
4723859Sml29623 	"MAC_HASH_TBL5_REG",
4733859Sml29623 	"MAC_HASH_TBL6_REG",
4743859Sml29623 	"MAC_HASH_TBL7_REG",
4753859Sml29623 	"MAC_HASH_TBL8_REG",
4763859Sml29623 	"MAC_HASH_TBL9_REG",
4773859Sml29623 	"MAC_HASH_TBL10_REG",
4783859Sml29623 	"MAC_HASH_TBL11_REG",
4793859Sml29623 	"MAC_HASH_TBL12_REG",
4803859Sml29623 	"MAC_HASH_TBL13_REG",
4813859Sml29623 	"MAC_HASH_TBL14_REG",
4823859Sml29623 	"MAC_HASH_TBL15_REG",
4833859Sml29623 	"RXMAC_FRM_CNT_REG",
4843859Sml29623 	"MAC_LEN_ER_CNT_REG",
4853859Sml29623 	"BMAC_AL_ER_CNT_REG",
4863859Sml29623 	"BMAC_CRC_ER_CNT_REG",
4873859Sml29623 	"BMAC_CD_VIO_CNT_REG",
4883859Sml29623 	"BMAC_SM_REG",
4893859Sml29623 	"BMAC_ALTAD_CMPEN_REG",
4903859Sml29623 	"BMAC_HOST_INF0_REG",
4913859Sml29623 	"BMAC_HOST_INF1_REG",
4923859Sml29623 	"BMAC_HOST_INF2_REG",
4933859Sml29623 	"BMAC_HOST_INF3_REG",
4943859Sml29623 	"BMAC_HOST_INF4_REG",
4953859Sml29623 	"BMAC_HOST_INF5_REG",
4963859Sml29623 	"BMAC_HOST_INF6_REG",
4973859Sml29623 	"BMAC_HOST_INF7_REG",
4983859Sml29623 	"BMAC_HOST_INF8_REG",
4993859Sml29623 	"BTXMAC_BYTE_CNT_REG",
5003859Sml29623 	"BTXMAC_FRM_CNT_REG",
5013859Sml29623 	"BRXMAC_BYTE_CNT_REG",
5023859Sml29623 };
5033859Sml29623 
5043859Sml29623 npi_status_t
npi_mac_dump_regs(npi_handle_t handle,uint8_t port)5053859Sml29623 npi_mac_dump_regs(npi_handle_t handle, uint8_t port)
5063859Sml29623 {
5073859Sml29623 
5083859Sml29623 	uint64_t value;
5093859Sml29623 	int num_regs, i;
5103859Sml29623 
5113859Sml29623 	ASSERT(IS_PORT_NUM_VALID(port));
5123859Sml29623 
5133859Sml29623 	switch (port) {
5143859Sml29623 	case 0:
5153859Sml29623 	case 1:
5163859Sml29623 		num_regs = sizeof (xmac_offset) / sizeof (uint64_t);
5173859Sml29623 		NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
518*6929Smisaki 		    "\nXMAC Register Dump for port %d\n",
519*6929Smisaki 		    port));
5203859Sml29623 		for (i = 0; i < num_regs; i++) {
5215125Sjoycey #if defined(__i386)
5225125Sjoycey 			XMAC_REG_RD(handle, port, (uint32_t)xmac_offset[i],
523*6929Smisaki 			    &value);
5245125Sjoycey #else
5253859Sml29623 			XMAC_REG_RD(handle, port, xmac_offset[i], &value);
5265125Sjoycey #endif
5273859Sml29623 			NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
528*6929Smisaki 			    "%08llx %s\t %08llx \n",
529*6929Smisaki 			    (XMAC_REG_ADDR((port), (xmac_offset[i]))),
530*6929Smisaki 			    xmac_name[i], value));
5313859Sml29623 		}
5323859Sml29623 
5333859Sml29623 		NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
534*6929Smisaki 		    "\n XMAC Register Dump for port %d done\n",
535*6929Smisaki 		    port));
5363859Sml29623 		break;
5373859Sml29623 
5383859Sml29623 	case 2:
5393859Sml29623 	case 3:
5403859Sml29623 		num_regs = sizeof (bmac_offset) / sizeof (uint64_t);
5413859Sml29623 		NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
542*6929Smisaki 		    "\nBMAC Register Dump for port %d\n",
543*6929Smisaki 		    port));
5443859Sml29623 		for (i = 0; i < num_regs; i++) {
5455125Sjoycey #if defined(__i386)
5465125Sjoycey 			BMAC_REG_RD(handle, port, (uint32_t)bmac_offset[i],
547*6929Smisaki 			    &value);
5485125Sjoycey #else
5493859Sml29623 			BMAC_REG_RD(handle, port, bmac_offset[i], &value);
5505125Sjoycey #endif
5513859Sml29623 			NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
552*6929Smisaki 			    "%08llx %s\t %08llx \n",
553*6929Smisaki 			    (BMAC_REG_ADDR((port), (bmac_offset[i]))),
554*6929Smisaki 			    bmac_name[i], value));
5553859Sml29623 		}
5563859Sml29623 
5573859Sml29623 		NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
558*6929Smisaki 		    "\n BMAC Register Dump for port %d done\n",
559*6929Smisaki 		    port));
5603859Sml29623 		break;
5613859Sml29623 	}
5623859Sml29623 
5633859Sml29623 	return (NPI_SUCCESS);
5643859Sml29623 }
5653859Sml29623 
5663859Sml29623 npi_status_t
npi_mac_pcs_link_intr_enable(npi_handle_t handle,uint8_t portn)5673859Sml29623 npi_mac_pcs_link_intr_enable(npi_handle_t handle, uint8_t portn)
5683859Sml29623 {
5693859Sml29623 	pcs_cfg_t pcs_cfg;
5703859Sml29623 
5713859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
5723859Sml29623 
5733859Sml29623 	PCS_REG_RD(handle, portn, PCS_CONFIG_REG, &pcs_cfg.value);
5743859Sml29623 	pcs_cfg.bits.w0.mask = 0;
5753859Sml29623 	PCS_REG_WR(handle, portn, PCS_CONFIG_REG, pcs_cfg.value);
5763859Sml29623 
5773859Sml29623 	return (NPI_SUCCESS);
5783859Sml29623 }
5793859Sml29623 
5803859Sml29623 npi_status_t
npi_mac_pcs_link_intr_disable(npi_handle_t handle,uint8_t portn)5813859Sml29623 npi_mac_pcs_link_intr_disable(npi_handle_t handle, uint8_t portn)
5823859Sml29623 {
5833859Sml29623 	pcs_cfg_t pcs_cfg;
5843859Sml29623 
5853859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
5863859Sml29623 
5873859Sml29623 	PCS_REG_RD(handle, portn, PCS_CONFIG_REG, &pcs_cfg.val.lsw);
5883859Sml29623 	pcs_cfg.bits.w0.mask = 1;
5893859Sml29623 	PCS_REG_WR(handle, portn, PCS_CONFIG_REG, pcs_cfg.val.lsw);
5903859Sml29623 
5913859Sml29623 	return (NPI_SUCCESS);
5923859Sml29623 }
5933859Sml29623 
5943859Sml29623 npi_status_t
npi_xmac_xpcs_link_intr_enable(npi_handle_t handle,uint8_t portn)5953859Sml29623 npi_xmac_xpcs_link_intr_enable(npi_handle_t handle, uint8_t portn)
5963859Sml29623 {
5973859Sml29623 	xpcs_stat1_t xpcs_mask1;
5983859Sml29623 
5993859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
6003859Sml29623 
6013859Sml29623 	XPCS_REG_RD(handle, portn, XPCS_MASK_1_REG, &xpcs_mask1.val.lsw);
6023859Sml29623 	xpcs_mask1.bits.w0.csr_rx_link_stat = 1;
6033859Sml29623 	XPCS_REG_WR(handle, portn, XPCS_MASK_1_REG, xpcs_mask1.val.lsw);
6043859Sml29623 
6053859Sml29623 	return (NPI_SUCCESS);
6063859Sml29623 }
6073859Sml29623 
6083859Sml29623 npi_status_t
npi_xmac_xpcs_link_intr_disable(npi_handle_t handle,uint8_t portn)6093859Sml29623 npi_xmac_xpcs_link_intr_disable(npi_handle_t handle, uint8_t portn)
6103859Sml29623 {
6113859Sml29623 	xpcs_stat1_t xpcs_mask1;
6123859Sml29623 
6133859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
6143859Sml29623 
6153859Sml29623 	XPCS_REG_RD(handle, portn, XPCS_MASK_1_REG, &xpcs_mask1.val.lsw);
6163859Sml29623 	xpcs_mask1.bits.w0.csr_rx_link_stat = 0;
6173859Sml29623 	XPCS_REG_WR(handle, portn, XPCS_MASK_1_REG, xpcs_mask1.val.lsw);
6183859Sml29623 
6193859Sml29623 	return (NPI_SUCCESS);
6203859Sml29623 }
6213859Sml29623 
6223859Sml29623 npi_status_t
npi_mac_mif_link_intr_disable(npi_handle_t handle,uint8_t portn)6233859Sml29623 npi_mac_mif_link_intr_disable(npi_handle_t handle, uint8_t portn)
6243859Sml29623 {
6253859Sml29623 	mif_cfg_t mif_cfg;
6263859Sml29623 
6273859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
6283859Sml29623 
6293859Sml29623 	MIF_REG_RD(handle, MIF_CONFIG_REG, &mif_cfg.val.lsw);
6303859Sml29623 
6313859Sml29623 	mif_cfg.bits.w0.phy_addr = portn;
6323859Sml29623 	mif_cfg.bits.w0.poll_en = 0;
6333859Sml29623 
6343859Sml29623 	MIF_REG_WR(handle, MIF_CONFIG_REG, mif_cfg.val.lsw);
6353859Sml29623 
6363859Sml29623 	NXGE_DELAY(20);
6373859Sml29623 
6383859Sml29623 	return (NPI_SUCCESS);
6393859Sml29623 }
6403859Sml29623 
6413859Sml29623 npi_status_t
npi_mac_hashtab_entry(npi_handle_t handle,io_op_t op,uint8_t portn,uint8_t entryn,uint16_t * data)6423859Sml29623 npi_mac_hashtab_entry(npi_handle_t handle, io_op_t op, uint8_t portn,
6433859Sml29623 			uint8_t entryn, uint16_t *data)
6443859Sml29623 {
6453859Sml29623 	uint64_t val;
6463859Sml29623 
6473859Sml29623 	ASSERT((op == OP_GET) || (op == OP_SET));
6483859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
6493859Sml29623 
6503859Sml29623 	ASSERT(entryn < MAC_MAX_HASH_ENTRY);
6513859Sml29623 	if (entryn >= MAC_MAX_HASH_ENTRY) {
6523859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
653*6929Smisaki 		    " npi_mac_hashtab_entry"
654*6929Smisaki 		    " Invalid Input: entryn <0x%x>",
655*6929Smisaki 		    entryn));
6563859Sml29623 		return (NPI_FAILURE | NPI_MAC_HASHTAB_ENTRY_INVALID(portn));
6573859Sml29623 	}
6583859Sml29623 
6593859Sml29623 	if (op == OP_SET) {
6603859Sml29623 		val = *data;
6613859Sml29623 		if ((portn == XMAC_PORT_0) || (portn == XMAC_PORT_1)) {
6623859Sml29623 			XMAC_REG_WR(handle, portn,
663*6929Smisaki 			    XMAC_HASH_TBLN_REG_ADDR(entryn), val);
6643859Sml29623 		} else {
6653859Sml29623 			BMAC_REG_WR(handle, portn,
666*6929Smisaki 			    BMAC_HASH_TBLN_REG_ADDR(entryn), val);
6673859Sml29623 		}
6683859Sml29623 	} else {
6693859Sml29623 		if ((portn == XMAC_PORT_0) || (portn == XMAC_PORT_1)) {
6703859Sml29623 			XMAC_REG_RD(handle, portn,
671*6929Smisaki 			    XMAC_HASH_TBLN_REG_ADDR(entryn), &val);
6723859Sml29623 		} else {
6733859Sml29623 			BMAC_REG_RD(handle, portn,
674*6929Smisaki 			    BMAC_HASH_TBLN_REG_ADDR(entryn), &val);
6753859Sml29623 		}
6763859Sml29623 		*data = val & 0xFFFF;
6773859Sml29623 	}
6783859Sml29623 
6793859Sml29623 	return (NPI_SUCCESS);
6803859Sml29623 }
6813859Sml29623 
6823859Sml29623 npi_status_t
npi_mac_hostinfo_entry(npi_handle_t handle,io_op_t op,uint8_t portn,uint8_t entryn,hostinfo_t * hostinfo)6833859Sml29623 npi_mac_hostinfo_entry(npi_handle_t handle, io_op_t op, uint8_t portn,
6843859Sml29623 				uint8_t entryn, hostinfo_t *hostinfo)
6853859Sml29623 {
6863859Sml29623 	ASSERT((op == OP_GET) || (op == OP_SET));
6873859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
6883859Sml29623 
6893859Sml29623 	if ((portn == XMAC_PORT_0) || (portn == XMAC_PORT_1)) {
6903859Sml29623 		ASSERT(entryn < XMAC_MAX_HOST_INFO_ENTRY);
6913859Sml29623 		if (entryn >= XMAC_MAX_HOST_INFO_ENTRY) {
6923859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
693*6929Smisaki 			    " npi_mac_hostinfo_entry"
694*6929Smisaki 			    " Invalid Input: entryn <0x%x>",
695*6929Smisaki 			    entryn));
6963859Sml29623 			return (NPI_FAILURE |
697*6929Smisaki 			    NPI_MAC_HOSTINFO_ENTRY_INVALID(portn));
6983859Sml29623 		}
6993859Sml29623 	} else {
7003859Sml29623 		ASSERT(entryn < BMAC_MAX_HOST_INFO_ENTRY);
7013859Sml29623 		if (entryn >= BMAC_MAX_HOST_INFO_ENTRY) {
7023859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
703*6929Smisaki 			    " npi_mac_hostinfo_entry"
704*6929Smisaki 			    " Invalid Input: entryn <0x%x>",
705*6929Smisaki 			    entryn));
7063859Sml29623 			return (NPI_FAILURE |
707*6929Smisaki 			    NPI_MAC_HOSTINFO_ENTRY_INVALID(portn));
7083859Sml29623 		}
7093859Sml29623 	}
7103859Sml29623 
7113859Sml29623 	if (op == OP_SET) {
7123859Sml29623 		if ((portn == XMAC_PORT_0) || (portn == XMAC_PORT_1)) {
7133859Sml29623 			XMAC_REG_WR(handle, portn,
714*6929Smisaki 			    XMAC_HOST_INFN_REG_ADDR(entryn),
715*6929Smisaki 			    hostinfo->value);
7163859Sml29623 		} else {
7173859Sml29623 			BMAC_REG_WR(handle, portn,
718*6929Smisaki 			    BMAC_HOST_INFN_REG_ADDR(entryn),
719*6929Smisaki 			    hostinfo->value);
7203859Sml29623 		}
7213859Sml29623 	} else {
7223859Sml29623 		if ((portn == XMAC_PORT_0) || (portn == XMAC_PORT_1)) {
7233859Sml29623 			XMAC_REG_RD(handle, portn,
724*6929Smisaki 			    XMAC_HOST_INFN_REG_ADDR(entryn),
725*6929Smisaki 			    &hostinfo->value);
7263859Sml29623 		} else {
7273859Sml29623 			BMAC_REG_RD(handle, portn,
728*6929Smisaki 			    BMAC_HOST_INFN_REG_ADDR(entryn),
729*6929Smisaki 			    &hostinfo->value);
7303859Sml29623 		}
7313859Sml29623 	}
7323859Sml29623 
7333859Sml29623 	return (NPI_SUCCESS);
7343859Sml29623 }
7353859Sml29623 
7363859Sml29623 npi_status_t
npi_mac_altaddr_enable(npi_handle_t handle,uint8_t portn,uint8_t addrn)7373859Sml29623 npi_mac_altaddr_enable(npi_handle_t handle, uint8_t portn, uint8_t addrn)
7383859Sml29623 {
7393859Sml29623 	uint64_t val;
7403859Sml29623 
7413859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
7423859Sml29623 
7433859Sml29623 	if ((portn == XMAC_PORT_0) || (portn == XMAC_PORT_1)) {
7443859Sml29623 		ASSERT(addrn <= XMAC_MAX_ALT_ADDR_ENTRY);
7453859Sml29623 		if (addrn > XMAC_MAX_ALT_ADDR_ENTRY) {
7463859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
747*6929Smisaki 			    " npi_mac_altaddr_enable"
748*6929Smisaki 			    " Invalid Input: addrn <0x%x>",
749*6929Smisaki 			    addrn));
7503859Sml29623 			return (NPI_FAILURE |
751*6929Smisaki 			    NPI_MAC_ALT_ADDR_ENTRY_INVALID(portn));
7523859Sml29623 		}
7533859Sml29623 		XMAC_REG_RD(handle, portn, XMAC_ADDR_CMPEN_REG, &val);
7543859Sml29623 		val |= (1 << addrn);
7553859Sml29623 		XMAC_REG_WR(handle, portn, XMAC_ADDR_CMPEN_REG, val);
7563859Sml29623 	} else {
7573859Sml29623 		ASSERT(addrn <= BMAC_MAX_ALT_ADDR_ENTRY);
7583859Sml29623 		if (addrn > BMAC_MAX_ALT_ADDR_ENTRY) {
7593859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
760*6929Smisaki 			    " npi_mac_altaddr_enable"
761*6929Smisaki 			    " Invalid Input: addrn <0x%x>",
762*6929Smisaki 			    addrn));
7633859Sml29623 			return (NPI_FAILURE |
764*6929Smisaki 			    NPI_MAC_ALT_ADDR_ENTRY_INVALID(portn));
7653859Sml29623 		}
7663859Sml29623 		BMAC_REG_RD(handle, portn, BMAC_ALTAD_CMPEN_REG, &val);
7673859Sml29623 		val |= (1 << addrn);
7683859Sml29623 		BMAC_REG_WR(handle, portn, BMAC_ALTAD_CMPEN_REG, val);
7693859Sml29623 	}
7703859Sml29623 
7713859Sml29623 	return (NPI_SUCCESS);
7723859Sml29623 }
7733859Sml29623 
7743859Sml29623 /*
7753859Sml29623  * While all bits of XMAC_ADDR_CMPEN_REG are for alternate MAC addresses,
7763859Sml29623  * bit0 of BMAC_ALTAD_CMPEN_REG is for unique MAC address.
7773859Sml29623  */
7783859Sml29623 npi_status_t
npi_mac_altaddr_disable(npi_handle_t handle,uint8_t portn,uint8_t addrn)7793859Sml29623 npi_mac_altaddr_disable(npi_handle_t handle, uint8_t portn, uint8_t addrn)
7803859Sml29623 {
7813859Sml29623 	uint64_t val;
7823859Sml29623 
7833859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
7843859Sml29623 
7853859Sml29623 	if ((portn == XMAC_PORT_0) || (portn == XMAC_PORT_1)) {
7863859Sml29623 		ASSERT(addrn <= XMAC_MAX_ALT_ADDR_ENTRY);
7873859Sml29623 		if (addrn > XMAC_MAX_ALT_ADDR_ENTRY) {
7883859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
789*6929Smisaki 			    " npi_mac_altaddr_disable"
790*6929Smisaki 			    " Invalid Input: addrn <0x%x>",
791*6929Smisaki 			    addrn));
7923859Sml29623 			return (NPI_FAILURE |
793*6929Smisaki 			    NPI_MAC_ALT_ADDR_ENTRY_INVALID(portn));
7943859Sml29623 		}
7953859Sml29623 		XMAC_REG_RD(handle, portn, XMAC_ADDR_CMPEN_REG, &val);
7963859Sml29623 		val &= ~(1 << addrn);
7973859Sml29623 		XMAC_REG_WR(handle, portn, XMAC_ADDR_CMPEN_REG, val);
7983859Sml29623 	} else {
7993859Sml29623 		ASSERT(addrn <= BMAC_MAX_ALT_ADDR_ENTRY);
8003859Sml29623 		if (addrn > BMAC_MAX_ALT_ADDR_ENTRY) {
8013859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
802*6929Smisaki 			    " npi_mac_altaddr_disable"
803*6929Smisaki 			    " Invalid Input: addrn <0x%x>",
804*6929Smisaki 			    addrn));
8053859Sml29623 			return (NPI_FAILURE |
806*6929Smisaki 			    NPI_MAC_ALT_ADDR_ENTRY_INVALID(portn));
8073859Sml29623 		}
8083859Sml29623 		BMAC_REG_RD(handle, portn, BMAC_ALTAD_CMPEN_REG, &val);
8093859Sml29623 		val &= ~(1 << addrn);
8103859Sml29623 		BMAC_REG_WR(handle, portn, BMAC_ALTAD_CMPEN_REG, val);
8113859Sml29623 	}
8123859Sml29623 
8133859Sml29623 	return (NPI_SUCCESS);
8143859Sml29623 }
8153859Sml29623 
8163859Sml29623 npi_status_t
npi_mac_altaddr_entry(npi_handle_t handle,io_op_t op,uint8_t portn,uint8_t entryn,npi_mac_addr_t * data)8173859Sml29623 npi_mac_altaddr_entry(npi_handle_t handle, io_op_t op, uint8_t portn,
8183859Sml29623 			uint8_t entryn, npi_mac_addr_t *data)
8193859Sml29623 {
8203859Sml29623 	uint64_t val0, val1, val2;
8213859Sml29623 
8223859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
8233859Sml29623 	ASSERT((op == OP_GET) || (op == OP_SET));
8243859Sml29623 
8253859Sml29623 	if ((portn == XMAC_PORT_0) || (portn == XMAC_PORT_1)) {
8263859Sml29623 		ASSERT(entryn <= XMAC_MAX_ALT_ADDR_ENTRY);
8273859Sml29623 		if (entryn > XMAC_MAX_ALT_ADDR_ENTRY) {
8283859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
829*6929Smisaki 			    " npi_mac_altaddr_entry"
830*6929Smisaki 			    " Invalid Input: entryn <0x%x>",
831*6929Smisaki 			    entryn));
8323859Sml29623 			return (NPI_FAILURE |
833*6929Smisaki 			    NPI_MAC_ALT_ADDR_ENTRY_INVALID(portn));
8343859Sml29623 		}
8353859Sml29623 		if (op == OP_SET) {
8363859Sml29623 			val0 = data->w0;
8373859Sml29623 			val1 = data->w1;
8383859Sml29623 			val2 = data->w2;
8393859Sml29623 			XMAC_REG_WR(handle, portn,
840*6929Smisaki 			    XMAC_ALT_ADDR0N_REG_ADDR(entryn), val0);
8413859Sml29623 			XMAC_REG_WR(handle, portn,
842*6929Smisaki 			    XMAC_ALT_ADDR1N_REG_ADDR(entryn), val1);
8433859Sml29623 			XMAC_REG_WR(handle, portn,
844*6929Smisaki 			    XMAC_ALT_ADDR2N_REG_ADDR(entryn), val2);
8453859Sml29623 		} else {
8463859Sml29623 			XMAC_REG_RD(handle, portn,
847*6929Smisaki 			    XMAC_ALT_ADDR0N_REG_ADDR(entryn), &val0);
8483859Sml29623 			XMAC_REG_RD(handle, portn,
849*6929Smisaki 			    XMAC_ALT_ADDR1N_REG_ADDR(entryn), &val1);
8503859Sml29623 			XMAC_REG_RD(handle, portn,
851*6929Smisaki 			    XMAC_ALT_ADDR2N_REG_ADDR(entryn), &val2);
8523859Sml29623 			data->w0 = val0 & 0xFFFF;
8533859Sml29623 			data->w1 = val1 & 0xFFFF;
8543859Sml29623 			data->w2 = val2 & 0xFFFF;
8553859Sml29623 		}
8563859Sml29623 	} else {
8573859Sml29623 		ASSERT(entryn <= BMAC_MAX_ALT_ADDR_ENTRY);
8583859Sml29623 		if (entryn > BMAC_MAX_ALT_ADDR_ENTRY) {
8593859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
860*6929Smisaki 			    " npi_mac_altaddr_entry"
861*6929Smisaki 			    " Invalid Input: entryn <0x%x>",
862*6929Smisaki 			    entryn));
8633859Sml29623 			return (NPI_FAILURE |
864*6929Smisaki 			    NPI_MAC_ALT_ADDR_ENTRY_INVALID(portn));
8653859Sml29623 		}
8663859Sml29623 		if (op == OP_SET) {
8673859Sml29623 			val0 = data->w0;
8683859Sml29623 			val1 = data->w1;
8693859Sml29623 			val2 = data->w2;
8703859Sml29623 			BMAC_REG_WR(handle, portn,
871*6929Smisaki 			    BMAC_ALT_ADDR0N_REG_ADDR(entryn), val0);
8723859Sml29623 			BMAC_REG_WR(handle, portn,
873*6929Smisaki 			    BMAC_ALT_ADDR1N_REG_ADDR(entryn), val1);
8743859Sml29623 			BMAC_REG_WR(handle, portn,
875*6929Smisaki 			    BMAC_ALT_ADDR2N_REG_ADDR(entryn), val2);
8763859Sml29623 		} else {
8773859Sml29623 			BMAC_REG_RD(handle, portn,
878*6929Smisaki 			    BMAC_ALT_ADDR0N_REG_ADDR(entryn), &val0);
8793859Sml29623 			BMAC_REG_RD(handle, portn,
880*6929Smisaki 			    BMAC_ALT_ADDR1N_REG_ADDR(entryn), &val1);
8813859Sml29623 			BMAC_REG_RD(handle, portn,
882*6929Smisaki 			    BMAC_ALT_ADDR2N_REG_ADDR(entryn), &val2);
8833859Sml29623 			data->w0 = val0 & 0xFFFF;
8843859Sml29623 			data->w1 = val1 & 0xFFFF;
8853859Sml29623 			data->w2 = val2 & 0xFFFF;
8863859Sml29623 		}
8873859Sml29623 	}
8883859Sml29623 
8893859Sml29623 	return (NPI_SUCCESS);
8903859Sml29623 }
8913859Sml29623 
8923859Sml29623 npi_status_t
npi_mac_port_attr(npi_handle_t handle,io_op_t op,uint8_t portn,npi_attr_t * attrp)8933859Sml29623 npi_mac_port_attr(npi_handle_t handle, io_op_t op, uint8_t portn,
8943859Sml29623 			npi_attr_t *attrp)
8953859Sml29623 {
8963859Sml29623 	uint64_t val = 0;
8973859Sml29623 	uint32_t attr;
8983859Sml29623 
8993859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
9003859Sml29623 	ASSERT((op == OP_GET) || (op == OP_SET));
9013859Sml29623 
9023859Sml29623 	switch (attrp->type) {
9033859Sml29623 	case MAC_PORT_MODE:
9043859Sml29623 		switch (portn) {
9053859Sml29623 		case XMAC_PORT_0:
9063859Sml29623 		case XMAC_PORT_1:
9073859Sml29623 			if (op == OP_SET) {
9083859Sml29623 				attr = attrp->idata[0];
9093859Sml29623 				ASSERT((attr == MAC_MII_MODE) ||	\
910*6929Smisaki 				    (attr == MAC_GMII_MODE) ||	\
911*6929Smisaki 				    (attr == MAC_XGMII_MODE));
9123859Sml29623 				if ((attr != MAC_MII_MODE) &&
913*6929Smisaki 				    (attr != MAC_GMII_MODE) &&
914*6929Smisaki 				    (attr != MAC_XGMII_MODE)) {
9153859Sml29623 					NPI_ERROR_MSG((handle.function,
916*6929Smisaki 					    NPI_ERR_CTL,
917*6929Smisaki 					    " npi_mac_port_attr"
918*6929Smisaki 					    " Invalid Input:"
919*6929Smisaki 					    " MAC_PORT_MODE <0x%x>",
920*6929Smisaki 					    attr));
9213859Sml29623 					return (NPI_FAILURE |
922*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
9233859Sml29623 				}
9243859Sml29623 				XMAC_REG_RD(handle, portn, XMAC_CONFIG_REG,
925*6929Smisaki 				    &val);
9263859Sml29623 				val &= ~XMAC_XIF_MII_MODE_MASK;
9273859Sml29623 				switch (attr) {
9283859Sml29623 				case MAC_MII_MODE:
9293859Sml29623 					val |= (XMAC_XIF_MII_MODE <<
930*6929Smisaki 					    XMAC_XIF_MII_MODE_SHIFT);
9313859Sml29623 					break;
9323859Sml29623 				case MAC_GMII_MODE:
9333859Sml29623 					val |= (XMAC_XIF_GMII_MODE <<
934*6929Smisaki 					    XMAC_XIF_MII_MODE_SHIFT);
9353859Sml29623 					break;
9363859Sml29623 				case MAC_XGMII_MODE:
9373859Sml29623 					val |= (XMAC_XIF_XGMII_MODE <<
938*6929Smisaki 					    XMAC_XIF_MII_MODE_SHIFT);
9393859Sml29623 					break;
9403859Sml29623 				default:
9413859Sml29623 					return (NPI_FAILURE |
942*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
9433859Sml29623 				}
9443859Sml29623 				XMAC_REG_WR(handle, portn, XMAC_CONFIG_REG,
945*6929Smisaki 				    val);
9463859Sml29623 			} else {
9473859Sml29623 				XMAC_REG_RD(handle, portn, XMAC_CONFIG_REG,
948*6929Smisaki 				    &val);
9493859Sml29623 				val &= XMAC_XIF_MII_MODE_MASK;
9503859Sml29623 				attr = val >> XMAC_XIF_MII_MODE_SHIFT;
9513859Sml29623 				attrp->odata[0] = attr;
9523859Sml29623 			}
9533859Sml29623 			break;
9543859Sml29623 		case BMAC_PORT_0:
9553859Sml29623 		case BMAC_PORT_1:
9563859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
957*6929Smisaki 			    " npi_mac_port_attr"
958*6929Smisaki 			    " Invalid Input:"
959*6929Smisaki 			    " MAC_PORT_MODE <0x%x>",
960*6929Smisaki 			    attrp->type));
9613859Sml29623 			return (NPI_FAILURE |
962*6929Smisaki 			    NPI_MAC_PORT_ATTR_INVALID(portn));
9633859Sml29623 		default:
9643859Sml29623 			return (NPI_FAILURE | NPI_MAC_PORT_INVALID(portn));
9653859Sml29623 		}
9663859Sml29623 		break;
9673859Sml29623 
9683859Sml29623 	case MAC_PORT_FRAME_SIZE: {
9693859Sml29623 		uint32_t min_fsize;
9703859Sml29623 		uint32_t max_fsize;
9713859Sml29623 
9723859Sml29623 		switch (portn) {
9733859Sml29623 		case XMAC_PORT_0:
9743859Sml29623 		case XMAC_PORT_1:
9753859Sml29623 			if (op == OP_SET) {
9763859Sml29623 				min_fsize = attrp->idata[0];
9773859Sml29623 				max_fsize = attrp->idata[1];
9783859Sml29623 				ASSERT((min_fsize &	\
979*6929Smisaki 				    ~XMAC_MIN_TX_FRM_SZ_MASK) == 0);
9803859Sml29623 				if ((min_fsize & ~XMAC_MIN_TX_FRM_SZ_MASK)
981*6929Smisaki 				    != 0) {
9823859Sml29623 					NPI_ERROR_MSG((handle.function,
983*6929Smisaki 					    NPI_ERR_CTL,
984*6929Smisaki 					    " npi_mac_port_attr"
985*6929Smisaki 					    " MAC_PORT_FRAME_SIZE:"
986*6929Smisaki 					    " Invalid Input:"
987*6929Smisaki 					    " xmac_min_fsize <0x%x>",
988*6929Smisaki 					    min_fsize));
9893859Sml29623 					return (NPI_FAILURE |
990*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
9913859Sml29623 				}
9923859Sml29623 				ASSERT((max_fsize &	\
993*6929Smisaki 				    ~XMAC_MAX_FRM_SZ_MASK) == 0);
9943859Sml29623 				if ((max_fsize & ~XMAC_MAX_FRM_SZ_MASK)
995*6929Smisaki 				    != 0) {
9963859Sml29623 					NPI_ERROR_MSG((handle.function,
997*6929Smisaki 					    NPI_ERR_CTL,
998*6929Smisaki 					    " npi_mac_port_attr"
999*6929Smisaki 					    " MAC_PORT_FRAME_SIZE:"
1000*6929Smisaki 					    " Invalid Input:"
1001*6929Smisaki 					    " xmac_max_fsize <0x%x>",
1002*6929Smisaki 					    max_fsize));
10033859Sml29623 					return (NPI_FAILURE |
1004*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
10053859Sml29623 				}
10063859Sml29623 				XMAC_REG_RD(handle, portn, XMAC_MIN_REG, &val);
10073859Sml29623 				val &= ~(XMAC_MIN_TX_FRM_SZ_MASK |
1008*6929Smisaki 				    XMAC_MIN_RX_FRM_SZ_MASK);
10093859Sml29623 				val |= (min_fsize << XMAC_MIN_TX_FRM_SZ_SHIFT);
10103859Sml29623 				val |= (min_fsize << XMAC_MIN_RX_FRM_SZ_SHIFT);
10113859Sml29623 				XMAC_REG_WR(handle, portn, XMAC_MIN_REG, val);
10123859Sml29623 				XMAC_REG_WR(handle, portn, XMAC_MAX_REG,
1013*6929Smisaki 				    max_fsize);
10143859Sml29623 			} else {
10153859Sml29623 				XMAC_REG_RD(handle, portn, XMAC_MIN_REG, &val);
10163859Sml29623 				min_fsize = (val & XMAC_MIN_TX_FRM_SZ_MASK)
1017*6929Smisaki 				    >> XMAC_MIN_TX_FRM_SZ_SHIFT;
10183859Sml29623 				XMAC_REG_RD(handle, portn, XMAC_MAX_REG, &val);
10193859Sml29623 				attrp->odata[0] = min_fsize;
10203859Sml29623 				attrp->odata[1] = max_fsize;
10213859Sml29623 			}
10223859Sml29623 			break;
10233859Sml29623 		case BMAC_PORT_0:
10243859Sml29623 		case BMAC_PORT_1:
10253859Sml29623 			if (op == OP_SET) {
10263859Sml29623 				min_fsize = attrp->idata[0];
10273859Sml29623 				max_fsize = attrp->idata[1];
10283859Sml29623 				ASSERT((min_fsize & ~BMAC_MIN_FRAME_MASK) == 0);
10293859Sml29623 				if ((min_fsize & ~BMAC_MIN_FRAME_MASK)
1030*6929Smisaki 				    != 0) {
10313859Sml29623 					NPI_ERROR_MSG((handle.function,
1032*6929Smisaki 					    NPI_ERR_CTL,
1033*6929Smisaki 					    " npi_mac_port_attr"
1034*6929Smisaki 					    " MAC_FRAME_SIZE:"
1035*6929Smisaki 					    " Invalid Input:"
1036*6929Smisaki 					    " bmac_min_fsize <0x%x>",
1037*6929Smisaki 					    min_fsize));
10383859Sml29623 					return (NPI_FAILURE |
1039*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
10403859Sml29623 				}
10413859Sml29623 				ASSERT((max_fsize & ~BMAC_MAX_FRAME_MASK) == 0);
10423859Sml29623 				if ((max_fsize & ~BMAC_MAX_FRAME_MASK)
1043*6929Smisaki 				    != 0) {
10443859Sml29623 					NPI_ERROR_MSG((handle.function,
1045*6929Smisaki 					    NPI_ERR_CTL,
1046*6929Smisaki 					    " npi_mac_port_attr"
1047*6929Smisaki 					    " MAC_FRAME_SIZE:"
1048*6929Smisaki 					    " Invalid Input:"
1049*6929Smisaki 					    " bmac_max_fsize <0x%x>",
1050*6929Smisaki 					    max_fsize));
10513859Sml29623 					return (NPI_FAILURE |
1052*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
10533859Sml29623 				}
10543859Sml29623 				BMAC_REG_RD(handle, portn, BMAC_MAX_REG, &val);
10553859Sml29623 				val &= ~BMAC_MAX_FRAME_MASK;
10563859Sml29623 				if (max_fsize <= MAX_FRAME_SZ1)
10573859Sml29623 					val |= MAX_FRAME_SZ1;
10583859Sml29623 				else if ((max_fsize > MAX_FRAME_SZ1) &&
1059*6929Smisaki 				    (max_fsize <= MAX_FRAME_SZ2))
10603859Sml29623 					val |= MAX_FRAME_SZ2;
10613859Sml29623 				else if ((max_fsize > MAX_FRAME_SZ2) &&
1062*6929Smisaki 				    (max_fsize <= MAX_FRAME_SZ3))
10633859Sml29623 					val |= MAX_FRAME_SZ3;
10643859Sml29623 				else if ((max_fsize > MAX_FRAME_SZ3) &&
1065*6929Smisaki 				    (max_fsize <= MAX_FRAME_SZ4))
10663859Sml29623 					val |= MAX_FRAME_SZ4;
10673859Sml29623 				else if ((max_fsize > MAX_FRAME_SZ4) &&
1068*6929Smisaki 				    (max_fsize <= MAX_FRAME_SZ5))
10693859Sml29623 					val |= MAX_FRAME_SZ5;
10703859Sml29623 				BMAC_REG_WR(handle, portn, BMAC_MAX_REG, val);
10713859Sml29623 				BMAC_REG_WR(handle, portn, BMAC_MIN_REG,
1072*6929Smisaki 				    min_fsize);
10733859Sml29623 			} else {
10743859Sml29623 				BMAC_REG_RD(handle, portn, BMAC_MIN_REG, &val);
10753859Sml29623 				min_fsize = val & BMAC_MIN_FRAME_MASK;
10763859Sml29623 				BMAC_REG_RD(handle, portn, BMAC_MAX_REG, &val);
10773859Sml29623 				max_fsize = val & BMAC_MAX_FRAME_MASK;
10783859Sml29623 				attrp->odata[0] = min_fsize;
10793859Sml29623 				attrp->odata[1] = max_fsize;
10803859Sml29623 			}
10813859Sml29623 			break;
10823859Sml29623 		default:
10833859Sml29623 			return (NPI_FAILURE | NPI_MAC_PORT_INVALID(portn));
10843859Sml29623 		}
1085*6929Smisaki 		break;
1086*6929Smisaki 	}
10873859Sml29623 
10883859Sml29623 	case BMAC_PORT_MAX_BURST_SIZE: {
10893859Sml29623 		uint32_t burst_size;
10903859Sml29623 		switch (portn) {
10913859Sml29623 		case XMAC_PORT_0:
10923859Sml29623 		case XMAC_PORT_1:
10933859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1094*6929Smisaki 			    " npi_mac_port_attr"
1095*6929Smisaki 			    " BMAC_PORT_MAX_BURST_SIZE:"
1096*6929Smisaki 			    " Invalid Input: portn <%d>",
1097*6929Smisaki 			    portn));
10983859Sml29623 			return (NPI_FAILURE | NPI_MAC_PORT_ATTR_INVALID(portn));
10993859Sml29623 		case BMAC_PORT_0:
11003859Sml29623 		case BMAC_PORT_1:
11013859Sml29623 			/* NOTE: Not used in Full duplex mode */
11023859Sml29623 			if (op == OP_SET) {
11033859Sml29623 				burst_size = attrp->idata[0];
11043859Sml29623 				ASSERT((burst_size & ~0x7FFF) == 0);
11053859Sml29623 				if ((burst_size & ~0x7FFF) != 0) {
11063859Sml29623 					NPI_ERROR_MSG((handle.function,
1107*6929Smisaki 					    NPI_ERR_CTL,
1108*6929Smisaki 					    " npi_mac_port_attr"
1109*6929Smisaki 					    " BMAC_MAX_BURST_SIZE:"
1110*6929Smisaki 					    " Invalid Input:"
1111*6929Smisaki 					    " burst_size <0x%x>",
1112*6929Smisaki 					    burst_size));
11133859Sml29623 					return (NPI_FAILURE |
1114*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
11153859Sml29623 				}
11163859Sml29623 				BMAC_REG_RD(handle, portn, BMAC_MAX_REG, &val);
11173859Sml29623 				val &= ~BMAC_MAX_BURST_MASK;
11183859Sml29623 				val |= (burst_size << BMAC_MAX_BURST_SHIFT);
11193859Sml29623 				BMAC_REG_WR(handle, portn, BMAC_MAX_REG, val);
11203859Sml29623 			} else {
11213859Sml29623 				BMAC_REG_RD(handle, portn, BMAC_MAX_REG, &val);
11223859Sml29623 				burst_size = (val & BMAC_MAX_BURST_MASK)
1123*6929Smisaki 				    >> BMAC_MAX_BURST_SHIFT;
11243859Sml29623 				attrp->odata[0] = burst_size;
11253859Sml29623 			}
11263859Sml29623 			break;
11273859Sml29623 		default:
11283859Sml29623 			return (NPI_FAILURE | NPI_MAC_PORT_INVALID(portn));
11293859Sml29623 		}
1130*6929Smisaki 		break;
1131*6929Smisaki 	}
11323859Sml29623 
11333859Sml29623 	case BMAC_PORT_PA_SIZE: {
11343859Sml29623 		uint32_t pa_size;
11353859Sml29623 		switch (portn) {
11363859Sml29623 		case XMAC_PORT_0:
11373859Sml29623 		case XMAC_PORT_1:
11383859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1139*6929Smisaki 			    " npi_mac_port_attr"
1140*6929Smisaki 			    " BMAC_PORT_PA_SIZE:"
1141*6929Smisaki 			    " Invalid Input: portn <%d>",
1142*6929Smisaki 			    portn));
11433859Sml29623 			return (NPI_FAILURE | NPI_MAC_PORT_ATTR_INVALID(portn));
11443859Sml29623 		case BMAC_PORT_0:
11453859Sml29623 		case BMAC_PORT_1:
11463859Sml29623 			if (op == OP_SET) {
11473859Sml29623 				pa_size = attrp->idata[0];
11483859Sml29623 				ASSERT((pa_size & ~0x3FF) == 0);
11493859Sml29623 				if ((pa_size & ~0x3FF) != 0) {
11503859Sml29623 					NPI_ERROR_MSG((handle.function,
11513859Sml29623 					    NPI_ERR_CTL,
11523859Sml29623 					    " npi_mac_port_attr"
11533859Sml29623 					    " BMAC_PORT_PA_SIZE:"
11543859Sml29623 					    " Invalid Input: pa_size <0x%x>",
11553859Sml29623 					    pa_size));
11563859Sml29623 
11573859Sml29623 					return (NPI_FAILURE |
1158*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
11593859Sml29623 				}
11603859Sml29623 				BMAC_REG_RD(handle, portn, MAC_PA_SIZE_REG,
1161*6929Smisaki 				    &val);
11623859Sml29623 				val &= ~BMAC_PA_SIZE_MASK;
11633859Sml29623 				val |= (pa_size << 0);
11643859Sml29623 				BMAC_REG_WR(handle, portn, MAC_PA_SIZE_REG,
1165*6929Smisaki 				    val);
11663859Sml29623 			} else {
11673859Sml29623 				BMAC_REG_RD(handle, portn, MAC_PA_SIZE_REG,
1168*6929Smisaki 				    &val);
11693859Sml29623 				pa_size = (val & BMAC_PA_SIZE_MASK) >> 0;
11703859Sml29623 				attrp->odata[0] = pa_size;
11713859Sml29623 			}
11723859Sml29623 			break;
11733859Sml29623 		default:
11743859Sml29623 			return (NPI_FAILURE | NPI_MAC_PORT_INVALID(portn));
11753859Sml29623 		}
1176*6929Smisaki 		break;
1177*6929Smisaki 	}
11783859Sml29623 
11793859Sml29623 	case BMAC_PORT_CTRL_TYPE: {
11803859Sml29623 		uint32_t ctrl_type;
11813859Sml29623 		switch (portn) {
11823859Sml29623 		case XMAC_PORT_0:
11833859Sml29623 		case XMAC_PORT_1:
11843859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1185*6929Smisaki 			    " npi_mac_port_attr"
1186*6929Smisaki 			    " BMAC_PORT_CTRL_TYPE:"
1187*6929Smisaki 			    " Invalid Input: portn <%d>",
1188*6929Smisaki 			    portn));
11893859Sml29623 			return (NPI_FAILURE | NPI_MAC_PORT_ATTR_INVALID(portn));
11903859Sml29623 		case BMAC_PORT_0:
11913859Sml29623 		case BMAC_PORT_1:
11923859Sml29623 			if (op == OP_SET) {
11933859Sml29623 				ctrl_type = attrp->idata[0];
11943859Sml29623 				ASSERT((ctrl_type & ~0xFFFF) == 0);
11953859Sml29623 				if ((ctrl_type & ~0xFFFF) != 0) {
11963859Sml29623 					NPI_ERROR_MSG((handle.function,
1197*6929Smisaki 					    NPI_ERR_CTL,
1198*6929Smisaki 					    " npi_mac_port_attr"
1199*6929Smisaki 					    " BMAC_PORT_CTRL_TYPE:"
1200*6929Smisaki 					    " Invalid Input:"
1201*6929Smisaki 					    " ctrl_type <0x%x>",
1202*6929Smisaki 					    ctrl_type));
12033859Sml29623 					return (NPI_FAILURE |
1204*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
12053859Sml29623 				}
12063859Sml29623 				BMAC_REG_WR(handle, portn, MAC_CTRL_TYPE_REG,
1207*6929Smisaki 				    val);
12083859Sml29623 			} else {
12093859Sml29623 				BMAC_REG_RD(handle, portn, MAC_CTRL_TYPE_REG,
1210*6929Smisaki 				    &val);
12113859Sml29623 				ctrl_type = (val & 0xFFFF);
12123859Sml29623 				attrp->odata[0] = ctrl_type;
12133859Sml29623 			}
12143859Sml29623 			break;
12153859Sml29623 		default:
12163859Sml29623 			return (NPI_FAILURE | NPI_MAC_PORT_INVALID(portn));
12173859Sml29623 		}
1218*6929Smisaki 		break;
1219*6929Smisaki 	}
12203859Sml29623 
12213859Sml29623 	case XMAC_10G_PORT_IPG:
12223859Sml29623 		{
12233859Sml29623 		uint32_t	ipg0;
12243859Sml29623 
12253859Sml29623 		switch (portn) {
12263859Sml29623 		case XMAC_PORT_0:
12273859Sml29623 		case XMAC_PORT_1:
12283859Sml29623 			if (op == OP_SET) {
12293859Sml29623 				ipg0 = attrp->idata[0];
12303859Sml29623 				ASSERT((ipg0 == XGMII_IPG_12_15) ||	\
1231*6929Smisaki 				    (ipg0 == XGMII_IPG_16_19) ||	\
1232*6929Smisaki 				    (ipg0 == XGMII_IPG_20_23));
12333859Sml29623 				if ((ipg0 != XGMII_IPG_12_15) &&
1234*6929Smisaki 				    (ipg0 != XGMII_IPG_16_19) &&
1235*6929Smisaki 				    (ipg0 != XGMII_IPG_20_23)) {
12363859Sml29623 					NPI_ERROR_MSG((handle.function,
1237*6929Smisaki 					    NPI_ERR_CTL,
1238*6929Smisaki 					    " npi_mac_port_attr"
1239*6929Smisaki 					    " MAC_10G_PORT_IPG:"
1240*6929Smisaki 					    " Invalid Input:"
1241*6929Smisaki 					    " xgmii_ipg <0x%x>",
1242*6929Smisaki 					    ipg0));
12433859Sml29623 					return (NPI_FAILURE |
1244*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
12453859Sml29623 				}
12463859Sml29623 
12473859Sml29623 				XMAC_REG_RD(handle, portn, XMAC_IPG_REG, &val);
12483859Sml29623 				val &= ~(XMAC_IPG_VALUE_MASK |
1249*6929Smisaki 				    XMAC_IPG_VALUE1_MASK);
12503859Sml29623 
12513859Sml29623 				switch (ipg0) {
12523859Sml29623 				case XGMII_IPG_12_15:
12533859Sml29623 					val |= (IPG_12_15_BYTE <<
1254*6929Smisaki 					    XMAC_IPG_VALUE_SHIFT);
12553859Sml29623 					break;
12563859Sml29623 				case XGMII_IPG_16_19:
12573859Sml29623 					val |= (IPG_16_19_BYTE <<
1258*6929Smisaki 					    XMAC_IPG_VALUE_SHIFT);
12593859Sml29623 					break;
12603859Sml29623 				case XGMII_IPG_20_23:
12613859Sml29623 					val |= (IPG_20_23_BYTE <<
1262*6929Smisaki 					    XMAC_IPG_VALUE_SHIFT);
12633859Sml29623 					break;
12643859Sml29623 				default:
12653859Sml29623 					return (NPI_FAILURE |
1266*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
12673859Sml29623 				}
12683859Sml29623 				XMAC_REG_WR(handle, portn, XMAC_IPG_REG, val);
12693859Sml29623 			} else {
12703859Sml29623 				XMAC_REG_RD(handle, portn, XMAC_IPG_REG, &val);
12713859Sml29623 				ipg0 = (val & XMAC_IPG_VALUE_MASK) >>
1272*6929Smisaki 				    XMAC_IPG_VALUE_SHIFT;
12733859Sml29623 				switch (ipg0) {
12743859Sml29623 				case IPG_12_15_BYTE:
12753859Sml29623 					attrp->odata[0] = XGMII_IPG_12_15;
12763859Sml29623 					break;
12773859Sml29623 				case IPG_16_19_BYTE:
12783859Sml29623 					attrp->odata[0] = XGMII_IPG_16_19;
12793859Sml29623 					break;
12803859Sml29623 				case IPG_20_23_BYTE:
12813859Sml29623 					attrp->odata[0] = XGMII_IPG_20_23;
12823859Sml29623 					break;
12833859Sml29623 				default:
12843859Sml29623 					return (NPI_FAILURE |
1285*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
12863859Sml29623 				}
12873859Sml29623 			}
12883859Sml29623 			break;
12893859Sml29623 		case BMAC_PORT_0:
12903859Sml29623 		case BMAC_PORT_1:
12913859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1292*6929Smisaki 			    " npi_mac_port_attr" "MAC_PORT_IPG:"
1293*6929Smisaki 			    "  Invalid Input: portn <%d>",
1294*6929Smisaki 			    portn));
12953859Sml29623 		default:
12963859Sml29623 			return (NPI_FAILURE | NPI_MAC_PORT_INVALID(portn));
12973859Sml29623 		}
12983859Sml29623 		break;
12993859Sml29623 	}
13003859Sml29623 
13013859Sml29623 	case XMAC_PORT_IPG:
13023859Sml29623 		{
13033859Sml29623 		uint32_t	ipg1;
13043859Sml29623 		switch (portn) {
13053859Sml29623 		case XMAC_PORT_0:
13063859Sml29623 		case XMAC_PORT_1:
13073859Sml29623 			if (op == OP_SET) {
13083859Sml29623 				ipg1 = attrp->idata[0];
13093859Sml29623 				ASSERT((ipg1 == MII_GMII_IPG_12) ||	\
1310*6929Smisaki 				    (ipg1 == MII_GMII_IPG_13) ||	\
1311*6929Smisaki 				    (ipg1 == MII_GMII_IPG_14) ||	\
1312*6929Smisaki 				    (ipg1 == MII_GMII_IPG_15) ||	\
1313*6929Smisaki 				    (ipg1 == MII_GMII_IPG_16));
13143859Sml29623 				if ((ipg1 != MII_GMII_IPG_12) &&
1315*6929Smisaki 				    (ipg1 != MII_GMII_IPG_13) &&
1316*6929Smisaki 				    (ipg1 != MII_GMII_IPG_14) &&
1317*6929Smisaki 				    (ipg1 != MII_GMII_IPG_15) &&
1318*6929Smisaki 				    (ipg1 != MII_GMII_IPG_16)) {
13193859Sml29623 					NPI_ERROR_MSG((handle.function,
1320*6929Smisaki 					    NPI_ERR_CTL,
1321*6929Smisaki 					    " npi_mac_port_attr"
1322*6929Smisaki 					    " XMAC_PORT_IPG:"
1323*6929Smisaki 					    " Invalid Input:"
1324*6929Smisaki 					    " mii_gmii_ipg <0x%x>",
1325*6929Smisaki 					    ipg1));
13263859Sml29623 					return (NPI_FAILURE |
1327*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
13283859Sml29623 				}
13293859Sml29623 
13303859Sml29623 				XMAC_REG_RD(handle, portn, XMAC_IPG_REG, &val);
13313859Sml29623 				val &= ~(XMAC_IPG_VALUE_MASK |
1332*6929Smisaki 				    XMAC_IPG_VALUE1_MASK);
13333859Sml29623 
13343859Sml29623 				switch (ipg1) {
13353859Sml29623 				case MII_GMII_IPG_12:
13363859Sml29623 					val |= (IPG1_12_BYTES <<
1337*6929Smisaki 					    XMAC_IPG_VALUE1_SHIFT);
13383859Sml29623 					break;
13393859Sml29623 				case MII_GMII_IPG_13:
13403859Sml29623 					val |= (IPG1_13_BYTES <<
1341*6929Smisaki 					    XMAC_IPG_VALUE1_SHIFT);
13423859Sml29623 					break;
13433859Sml29623 				case MII_GMII_IPG_14:
13443859Sml29623 					val |= (IPG1_14_BYTES <<
1345*6929Smisaki 					    XMAC_IPG_VALUE1_SHIFT);
13463859Sml29623 					break;
13473859Sml29623 				case MII_GMII_IPG_15:
13483859Sml29623 					val |= (IPG1_15_BYTES <<
1349*6929Smisaki 					    XMAC_IPG_VALUE1_SHIFT);
13503859Sml29623 					break;
13513859Sml29623 				case MII_GMII_IPG_16:
13523859Sml29623 					val |= (IPG1_16_BYTES <<
1353*6929Smisaki 					    XMAC_IPG_VALUE1_SHIFT);
13543859Sml29623 					break;
13553859Sml29623 				default:
13563859Sml29623 					return (NPI_FAILURE |
1357*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
13583859Sml29623 				}
13593859Sml29623 				XMAC_REG_WR(handle, portn, XMAC_IPG_REG, val);
13603859Sml29623 			} else {
13613859Sml29623 				XMAC_REG_RD(handle, portn, XMAC_IPG_REG, &val);
13623859Sml29623 				ipg1 = (val & XMAC_IPG_VALUE1_MASK) >>
1363*6929Smisaki 				    XMAC_IPG_VALUE1_SHIFT;
13643859Sml29623 				switch (ipg1) {
13653859Sml29623 				case IPG1_12_BYTES:
13663859Sml29623 					attrp->odata[1] = MII_GMII_IPG_12;
13673859Sml29623 					break;
13683859Sml29623 				case IPG1_13_BYTES:
13693859Sml29623 					attrp->odata[1] = MII_GMII_IPG_13;
13703859Sml29623 					break;
13713859Sml29623 				case IPG1_14_BYTES:
13723859Sml29623 					attrp->odata[1] = MII_GMII_IPG_14;
13733859Sml29623 					break;
13743859Sml29623 				case IPG1_15_BYTES:
13753859Sml29623 					attrp->odata[1] = MII_GMII_IPG_15;
13763859Sml29623 					break;
13773859Sml29623 				case IPG1_16_BYTES:
13783859Sml29623 					attrp->odata[1] = MII_GMII_IPG_16;
13793859Sml29623 					break;
13803859Sml29623 				default:
13813859Sml29623 					return (NPI_FAILURE |
1382*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
13833859Sml29623 				}
13843859Sml29623 			}
13853859Sml29623 			break;
13863859Sml29623 		case BMAC_PORT_0:
13873859Sml29623 		case BMAC_PORT_1:
13883859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1389*6929Smisaki 			    " npi_mac_port_attr"
1390*6929Smisaki 			    " MAC_PORT_IPG:"
1391*6929Smisaki 			    " Invalid Input: portn <%d>",
1392*6929Smisaki 			    portn));
13933859Sml29623 		default:
13943859Sml29623 			return (NPI_FAILURE | NPI_MAC_PORT_INVALID(portn));
13953859Sml29623 		}
13963859Sml29623 		break;
13973859Sml29623 	}
13983859Sml29623 
13993859Sml29623 	case MAC_PORT_ADDR: {
14003859Sml29623 		uint32_t addr0;
14013859Sml29623 		uint32_t addr1;
14023859Sml29623 		uint32_t addr2;
14033859Sml29623 
14043859Sml29623 		switch (portn) {
14053859Sml29623 		case XMAC_PORT_0:
14063859Sml29623 		case XMAC_PORT_1:
14073859Sml29623 			if (op == OP_SET) {
14083859Sml29623 				addr0 = attrp->idata[0];
14093859Sml29623 				addr1 = attrp->idata[1];
14103859Sml29623 				addr2 = attrp->idata[2];
14113859Sml29623 				ASSERT((addr0 & ~0xFFFF) == 0);
14123859Sml29623 				if ((addr0 & ~0xFFFF) != 0) {
14133859Sml29623 					NPI_ERROR_MSG((handle.function,
1414*6929Smisaki 					    NPI_ERR_CTL,
1415*6929Smisaki 					    " npi_mac_port_attr"
1416*6929Smisaki 					    " MAC_PORT_ADDR:"
1417*6929Smisaki 					    " Invalid Input:"
1418*6929Smisaki 					    " addr0 <0x%x>", addr0));
14193859Sml29623 
14203859Sml29623 					return (NPI_FAILURE |
1421*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
14223859Sml29623 				}
14233859Sml29623 				ASSERT((addr1 & ~0xFFFF) == 0);
14243859Sml29623 				if ((addr1 & ~0xFFFF) != 0) {
14253859Sml29623 					NPI_ERROR_MSG((handle.function,
1426*6929Smisaki 					    NPI_ERR_CTL,
1427*6929Smisaki 					    " npi_mac_port_attr"
1428*6929Smisaki 					    " MAC_PORT_ADDR:"
1429*6929Smisaki 					    " Invalid Input:"
1430*6929Smisaki 					    " addr1 <0x%x>", addr1));
14313859Sml29623 					return (NPI_FAILURE |
1432*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
14333859Sml29623 				}
14343859Sml29623 				ASSERT((addr2 & ~0xFFFF) == 0);
14353859Sml29623 				if ((addr2 & ~0xFFFF) != 0) {
14363859Sml29623 					NPI_ERROR_MSG((handle.function,
1437*6929Smisaki 					    NPI_ERR_CTL,
1438*6929Smisaki 					    " npi_mac_port_attr"
1439*6929Smisaki 					    " MAC_PORT_ADDR:"
1440*6929Smisaki 					    " Invalid Input:"
1441*6929Smisaki 					    " addr2 <0x%x.",
1442*6929Smisaki 					    addr2));
14433859Sml29623 
14443859Sml29623 					return (NPI_FAILURE |
1445*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
14463859Sml29623 				}
14473859Sml29623 				XMAC_REG_WR(handle, portn, XMAC_ADDR0_REG,
1448*6929Smisaki 				    addr0);
14493859Sml29623 				XMAC_REG_WR(handle, portn, XMAC_ADDR1_REG,
1450*6929Smisaki 				    addr1);
14513859Sml29623 				XMAC_REG_WR(handle, portn, XMAC_ADDR2_REG,
1452*6929Smisaki 				    addr2);
14533859Sml29623 			} else {
14543859Sml29623 				XMAC_REG_RD(handle, portn, XMAC_ADDR0_REG,
1455*6929Smisaki 				    &addr0);
14563859Sml29623 				XMAC_REG_RD(handle, portn, XMAC_ADDR1_REG,
1457*6929Smisaki 				    &addr1);
14583859Sml29623 				XMAC_REG_RD(handle, portn, XMAC_ADDR2_REG,
1459*6929Smisaki 				    &addr2);
14603859Sml29623 				attrp->odata[0] = addr0 & MAC_ADDR_REG_MASK;
14613859Sml29623 				attrp->odata[1] = addr1 & MAC_ADDR_REG_MASK;
14623859Sml29623 				attrp->odata[2] = addr2 & MAC_ADDR_REG_MASK;
14633859Sml29623 			}
14643859Sml29623 			break;
14653859Sml29623 		case BMAC_PORT_0:
14663859Sml29623 		case BMAC_PORT_1:
14673859Sml29623 			if (op == OP_SET) {
14683859Sml29623 				addr0 = attrp->idata[0];
14693859Sml29623 				addr1 = attrp->idata[1];
14703859Sml29623 				addr2 = attrp->idata[2];
14713859Sml29623 				ASSERT((addr0 & ~0xFFFF) == 0);
14723859Sml29623 				if ((addr0 & ~0xFFFF) != 0) {
14733859Sml29623 					NPI_ERROR_MSG((handle.function,
1474*6929Smisaki 					    NPI_ERR_CTL,
1475*6929Smisaki 					    " npi_mac_port_attr"
1476*6929Smisaki 					    " MAC_PORT_ADDR:"
1477*6929Smisaki 					    " Invalid Input:"
1478*6929Smisaki 					    " addr0 <0x%x>",
1479*6929Smisaki 					    addr0));
14803859Sml29623 					return (NPI_FAILURE |
1481*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
14823859Sml29623 				}
14833859Sml29623 				ASSERT((addr1 & ~0xFFFF) == 0);
14843859Sml29623 				if ((addr1 & ~0xFFFF) != 0) {
14853859Sml29623 					NPI_ERROR_MSG((handle.function,
1486*6929Smisaki 					    NPI_ERR_CTL,
1487*6929Smisaki 					    " npi_mac_port_attr"
1488*6929Smisaki 					    " MAC_PORT_ADDR:"
1489*6929Smisaki 					    " Invalid Input:"
1490*6929Smisaki 					    " addr1 <0x%x>",
1491*6929Smisaki 					    addr1));
14923859Sml29623 					return (NPI_FAILURE |
1493*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
14943859Sml29623 				}
14953859Sml29623 				ASSERT((addr2 & ~0xFFFF) == 0);
14963859Sml29623 				if ((addr2 & ~0xFFFF) != 0) {
14973859Sml29623 					NPI_ERROR_MSG((handle.function,
1498*6929Smisaki 					    NPI_ERR_CTL,
1499*6929Smisaki 					    " npi_mac_port_attr"
1500*6929Smisaki 					    " MAC_PORT_ADDR:"
1501*6929Smisaki 					    " Invalid Input:"
1502*6929Smisaki 					    " addr2 <0x%x>",
1503*6929Smisaki 					    addr2));
15043859Sml29623 					return (NPI_FAILURE |
1505*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
15063859Sml29623 				}
15073859Sml29623 				BMAC_REG_WR(handle, portn, BMAC_ADDR0_REG,
1508*6929Smisaki 				    addr0);
15093859Sml29623 				BMAC_REG_WR(handle, portn, BMAC_ADDR1_REG,
1510*6929Smisaki 				    addr1);
15113859Sml29623 				BMAC_REG_WR(handle, portn, BMAC_ADDR2_REG,
1512*6929Smisaki 				    addr2);
15133859Sml29623 			} else {
15143859Sml29623 				BMAC_REG_RD(handle, portn, BMAC_ADDR0_REG,
1515*6929Smisaki 				    &addr0);
15163859Sml29623 				BMAC_REG_RD(handle, portn, BMAC_ADDR1_REG,
1517*6929Smisaki 				    &addr1);
15183859Sml29623 				BMAC_REG_RD(handle, portn, BMAC_ADDR2_REG,
1519*6929Smisaki 				    &addr2);
15203859Sml29623 				attrp->odata[0] = addr0 & MAC_ADDR_REG_MASK;
15213859Sml29623 				attrp->odata[1] = addr1 & MAC_ADDR_REG_MASK;
15223859Sml29623 				attrp->odata[2] = addr2 & MAC_ADDR_REG_MASK;
15233859Sml29623 			}
15243859Sml29623 			break;
15253859Sml29623 		default:
15263859Sml29623 			return (NPI_FAILURE | NPI_MAC_PORT_INVALID(portn));
15273859Sml29623 		}
1528*6929Smisaki 		break;
1529*6929Smisaki 	}
15303859Sml29623 
15313859Sml29623 	case MAC_PORT_ADDR_FILTER: {
15323859Sml29623 		uint32_t addr0;
15333859Sml29623 		uint32_t addr1;
15343859Sml29623 		uint32_t addr2;
15353859Sml29623 
15363859Sml29623 		switch (portn) {
15373859Sml29623 		case XMAC_PORT_0:
15383859Sml29623 		case XMAC_PORT_1:
15393859Sml29623 			if (op == OP_SET) {
15403859Sml29623 				addr0 = attrp->idata[0];
15413859Sml29623 				addr1 = attrp->idata[1];
15423859Sml29623 				addr2 = attrp->idata[2];
15433859Sml29623 				ASSERT((addr0 & ~0xFFFF) == 0);
15443859Sml29623 				if ((addr0 & ~0xFFFF) != 0) {
15453859Sml29623 					NPI_ERROR_MSG((handle.function,
1546*6929Smisaki 					    NPI_ERR_CTL,
1547*6929Smisaki 					    " npi_mac_port_attr"
1548*6929Smisaki 					    " MAC_PORT_ADDR_FILTER:"
1549*6929Smisaki 					    " Invalid Input:"
1550*6929Smisaki 					    " addr0 <0x%x>",
1551*6929Smisaki 					    addr0));
15523859Sml29623 					return (NPI_FAILURE |
1553*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
15543859Sml29623 				}
15553859Sml29623 				ASSERT((addr1 & ~0xFFFF) == 0);
15563859Sml29623 				if ((addr1 & ~0xFFFF) != 0) {
15573859Sml29623 					NPI_ERROR_MSG((handle.function,
1558*6929Smisaki 					    NPI_ERR_CTL,
1559*6929Smisaki 					    " npi_mac_port_attr"
1560*6929Smisaki 					    " MAC_PORT_ADDR_FILTER:"
1561*6929Smisaki 					    " Invalid Input:"
1562*6929Smisaki 					    " addr1 <0x%x>",
1563*6929Smisaki 					    addr1));
15643859Sml29623 					return (NPI_FAILURE |
1565*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
15663859Sml29623 				}
15673859Sml29623 				ASSERT((addr2 & ~0xFFFF) == 0);
15683859Sml29623 				if ((addr2 & ~0xFFFF) != 0) {
15693859Sml29623 					NPI_ERROR_MSG((handle.function,
1570*6929Smisaki 					    NPI_ERR_CTL,
1571*6929Smisaki 					    " npi_mac_port_attr"
1572*6929Smisaki 					    " MAC_PORT_ADDR_FILTER:"
1573*6929Smisaki 					    " Invalid Input:"
1574*6929Smisaki 					    " addr2 <0x%x>",
1575*6929Smisaki 					    addr2));
15763859Sml29623 					return (NPI_FAILURE |
1577*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
15783859Sml29623 				}
15793859Sml29623 				XMAC_REG_WR(handle, portn,
1580*6929Smisaki 				    XMAC_ADDR_FILT0_REG, addr0);
15813859Sml29623 				XMAC_REG_WR(handle, portn,
1582*6929Smisaki 				    XMAC_ADDR_FILT1_REG, addr1);
15833859Sml29623 				XMAC_REG_WR(handle, portn,
1584*6929Smisaki 				    XMAC_ADDR_FILT2_REG, addr2);
15853859Sml29623 			} else {
15863859Sml29623 				XMAC_REG_RD(handle, portn,
1587*6929Smisaki 				    XMAC_ADDR_FILT0_REG, &addr0);
15883859Sml29623 				XMAC_REG_RD(handle, portn,
1589*6929Smisaki 				    XMAC_ADDR_FILT1_REG, &addr1);
15903859Sml29623 				XMAC_REG_RD(handle, portn,
1591*6929Smisaki 				    XMAC_ADDR_FILT2_REG, &addr2);
15923859Sml29623 				attrp->odata[0] = addr0 & MAC_ADDR_REG_MASK;
15933859Sml29623 				attrp->odata[1] = addr1 & MAC_ADDR_REG_MASK;
15943859Sml29623 				attrp->odata[2] = addr2 & MAC_ADDR_REG_MASK;
15953859Sml29623 			}
15963859Sml29623 			break;
15973859Sml29623 		case BMAC_PORT_0:
15983859Sml29623 		case BMAC_PORT_1:
15993859Sml29623 			if (op == OP_SET) {
16003859Sml29623 				addr0 = attrp->idata[0];
16013859Sml29623 				addr1 = attrp->idata[1];
16023859Sml29623 				addr2 = attrp->idata[2];
16033859Sml29623 				ASSERT((addr0 & ~0xFFFF) == 0);
16043859Sml29623 				if ((addr0 & ~0xFFFF) != 0) {
16053859Sml29623 					NPI_ERROR_MSG((handle.function,
1606*6929Smisaki 					    NPI_ERR_CTL,
1607*6929Smisaki 					    " npi_mac_port_attr"
1608*6929Smisaki 					    " MAC_PORT_ADDR_FILTER:"
1609*6929Smisaki 					    " addr0",
1610*6929Smisaki 					    addr0));
16113859Sml29623 					return (NPI_FAILURE |
1612*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
16133859Sml29623 				}
16143859Sml29623 				ASSERT((addr1 & ~0xFFFF) == 0);
16153859Sml29623 				if ((addr1 & ~0xFFFF) != 0) {
16163859Sml29623 					NPI_ERROR_MSG((handle.function,
1617*6929Smisaki 					    NPI_ERR_CTL,
1618*6929Smisaki 					    " npi_mac_port_attr"
1619*6929Smisaki 					    " MAC_PORT_ADDR_FILTER:"
1620*6929Smisaki 					    " Invalid Input:"
1621*6929Smisaki 					    " addr1 <0x%x>",
1622*6929Smisaki 					    addr1));
16233859Sml29623 					return (NPI_FAILURE |
1624*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
16253859Sml29623 				}
16263859Sml29623 				ASSERT((addr2 & ~0xFFFF) == 0);
16273859Sml29623 				if ((addr2 & ~0xFFFF) != 0) {
16283859Sml29623 					NPI_ERROR_MSG((handle.function,
1629*6929Smisaki 					    NPI_ERR_CTL,
1630*6929Smisaki 					    " npi_mac_port_attr"
1631*6929Smisaki 					    " MAC_PORT_ADDR_FILTER:"
1632*6929Smisaki 					    " Invalid Input:"
1633*6929Smisaki 					    " addr2 <0x%x>",
1634*6929Smisaki 					    addr2));
16353859Sml29623 					return (NPI_FAILURE |
1636*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
16373859Sml29623 				}
16383859Sml29623 				BMAC_REG_WR(handle, portn, MAC_ADDR_FILT0_REG,
1639*6929Smisaki 				    addr0);
16403859Sml29623 				BMAC_REG_WR(handle, portn, MAC_ADDR_FILT1_REG,
1641*6929Smisaki 				    addr1);
16423859Sml29623 				BMAC_REG_WR(handle, portn, MAC_ADDR_FILT2_REG,
1643*6929Smisaki 				    addr2);
16443859Sml29623 			} else {
16453859Sml29623 				BMAC_REG_RD(handle, portn, MAC_ADDR_FILT0_REG,
1646*6929Smisaki 				    &addr0);
16473859Sml29623 				BMAC_REG_RD(handle, portn, MAC_ADDR_FILT1_REG,
1648*6929Smisaki 				    &addr1);
16493859Sml29623 				BMAC_REG_RD(handle, portn, MAC_ADDR_FILT2_REG,
1650*6929Smisaki 				    &addr2);
16513859Sml29623 				attrp->odata[0] = addr0 & MAC_ADDR_REG_MASK;
16523859Sml29623 				attrp->odata[1] = addr1 & MAC_ADDR_REG_MASK;
16533859Sml29623 				attrp->odata[2] = addr2 & MAC_ADDR_REG_MASK;
16543859Sml29623 			}
16553859Sml29623 			break;
16563859Sml29623 		default:
16573859Sml29623 			return (NPI_FAILURE | NPI_MAC_PORT_INVALID(portn));
16583859Sml29623 		}
1659*6929Smisaki 		break;
1660*6929Smisaki 	}
16613859Sml29623 
16623859Sml29623 	case MAC_PORT_ADDR_FILTER_MASK: {
16633859Sml29623 		uint32_t mask_1_2;
16643859Sml29623 		uint32_t mask_0;
16653859Sml29623 
16663859Sml29623 		switch (portn) {
16673859Sml29623 		case XMAC_PORT_0:
16683859Sml29623 		case XMAC_PORT_1:
16693859Sml29623 			if (op == OP_SET) {
16703859Sml29623 				mask_0 = attrp->idata[0];
16713859Sml29623 				mask_1_2 = attrp->idata[1];
16723859Sml29623 				ASSERT((mask_0 & ~0xFFFF) == 0);
16733859Sml29623 				if ((mask_0 & ~0xFFFF) != 0) {
16743859Sml29623 					NPI_ERROR_MSG((handle.function,
1675*6929Smisaki 					    NPI_ERR_CTL,
1676*6929Smisaki 					    " npi_mac_port_attr"
1677*6929Smisaki 					    " MAC_ADDR_FILTER_MASK:"
1678*6929Smisaki 					    " Invalid Input:"
1679*6929Smisaki 					    " mask_0 <0x%x>",
1680*6929Smisaki 					    mask_0));
16813859Sml29623 					return (NPI_FAILURE |
1682*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
16833859Sml29623 				}
16843859Sml29623 				ASSERT((mask_1_2 & ~0xFF) == 0);
16853859Sml29623 				if ((mask_1_2 & ~0xFF) != 0) {
16863859Sml29623 					NPI_ERROR_MSG((handle.function,
1687*6929Smisaki 					    NPI_ERR_CTL,
1688*6929Smisaki 					    " npi_mac_port_attr"
1689*6929Smisaki 					    " MAC_ADDR_FILTER_MASK:"
1690*6929Smisaki 					    " Invalid Input:"
1691*6929Smisaki 					    " mask_1_2 <0x%x>",
1692*6929Smisaki 					    mask_1_2));
16933859Sml29623 					return (NPI_FAILURE |
1694*6929Smisaki 					    NPI_MAC_PORT_ATTR_INVALID(portn));
16953859Sml29623 				}
16963859Sml29623 				XMAC_REG_WR(handle, portn,
1697*6929Smisaki 				    XMAC_ADDR_FILT0_MASK_REG, mask_0);
16983859Sml29623 				XMAC_REG_WR(handle, portn,
1699*6929Smisaki 				    XMAC_ADDR_FILT12_MASK_REG, mask_1_2);
17003859Sml29623 			} else {
17013859Sml29623 				XMAC_REG_RD(handle, portn,
1702*6929Smisaki 				    XMAC_ADDR_FILT0_MASK_REG, &mask_0);
17033859Sml29623 				XMAC_REG_RD(handle, portn,
1704*6929Smisaki 				    XMAC_ADDR_FILT12_MASK_REG, &mask_1_2);
17053859Sml29623 				attrp->odata[0] = mask_0 & 0xFFFF;
17063859Sml29623 				attrp->odata[1] = mask_1_2 & 0xFF;
17073859Sml29623 			}
17083859Sml29623 			break;
17093859Sml29623 		case BMAC_PORT_0:
17103859Sml29623 		case BMAC_PORT_1:
17113859Sml29623 			if (op == OP_SET) {
17123859Sml29623 				mask_0 = attrp->idata[0];
17133859Sml29623 				mask_1_2 = attrp->idata[1];
17143859Sml29623 				BMAC_REG_WR(handle, portn,
1715*6929Smisaki 				    MAC_ADDR_FILT00_MASK_REG, mask_0);
17163859Sml29623 				BMAC_REG_WR(handle, portn,
1717*6929Smisaki 				    MAC_ADDR_FILT12_MASK_REG, mask_1_2);
17183859Sml29623 			} else {
17193859Sml29623 				BMAC_REG_RD(handle, portn,
1720*6929Smisaki 				    MAC_ADDR_FILT00_MASK_REG, &mask_0);
17213859Sml29623 				BMAC_REG_RD(handle, portn,
1722*6929Smisaki 				    MAC_ADDR_FILT12_MASK_REG, &mask_1_2);
17233859Sml29623 				attrp->odata[0] = mask_0;
17243859Sml29623 				attrp->odata[1] = mask_1_2;
17253859Sml29623 			}
17263859Sml29623 			break;
17273859Sml29623 		default:
17283859Sml29623 			return (NPI_FAILURE | NPI_MAC_PORT_INVALID(portn));
17293859Sml29623 		}
1730*6929Smisaki 		break;
1731*6929Smisaki 	}
17323859Sml29623 
17333859Sml29623 	default:
17343859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1735*6929Smisaki 		    " npi_mac_port_attr"
1736*6929Smisaki 		    " Invalid Input:"
1737*6929Smisaki 		    " attr <0x%x>", attrp->type));
17383859Sml29623 		return (NPI_FAILURE | NPI_MAC_PORT_ATTR_INVALID(portn));
17393859Sml29623 	}
17403859Sml29623 
17413859Sml29623 	return (NPI_SUCCESS);
17423859Sml29623 }
17433859Sml29623 
17443859Sml29623 npi_status_t
npi_xmac_reset(npi_handle_t handle,uint8_t portn,npi_mac_reset_t mode)17453859Sml29623 npi_xmac_reset(npi_handle_t handle, uint8_t portn, npi_mac_reset_t mode)
17463859Sml29623 {
17473859Sml29623 	uint64_t val;
17483859Sml29623 	boolean_t txmac = B_FALSE;
17493859Sml29623 
17503859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
17513859Sml29623 
17523859Sml29623 	switch (mode) {
17533859Sml29623 	case XTX_MAC_REG_RESET:
17543859Sml29623 		XMAC_REG_WR(handle, portn, XTXMAC_SW_RST_REG, XTXMAC_REG_RST);
17553859Sml29623 		XMAC_WAIT_REG(handle, portn, XTXMAC_SW_RST_REG, val);
17563859Sml29623 		txmac = B_TRUE;
17573859Sml29623 		break;
17583859Sml29623 	case XRX_MAC_REG_RESET:
17593859Sml29623 		XMAC_REG_WR(handle, portn, XRXMAC_SW_RST_REG, XRXMAC_REG_RST);
17603859Sml29623 		XMAC_WAIT_REG(handle, portn, XRXMAC_SW_RST_REG, val);
17613859Sml29623 		break;
17623859Sml29623 	case XTX_MAC_LOGIC_RESET:
17633859Sml29623 		XMAC_REG_WR(handle, portn, XTXMAC_SW_RST_REG, XTXMAC_SOFT_RST);
17643859Sml29623 		XMAC_WAIT_REG(handle, portn, XTXMAC_SW_RST_REG, val);
17653859Sml29623 		txmac = B_TRUE;
17663859Sml29623 		break;
17673859Sml29623 	case XRX_MAC_LOGIC_RESET:
17683859Sml29623 		XMAC_REG_WR(handle, portn, XRXMAC_SW_RST_REG, XRXMAC_SOFT_RST);
17693859Sml29623 		XMAC_WAIT_REG(handle, portn, XRXMAC_SW_RST_REG, val);
17703859Sml29623 		break;
17713859Sml29623 	case XTX_MAC_RESET_ALL:
17723859Sml29623 		XMAC_REG_WR(handle, portn, XTXMAC_SW_RST_REG,
1773*6929Smisaki 		    XTXMAC_SOFT_RST | XTXMAC_REG_RST);
17743859Sml29623 		XMAC_WAIT_REG(handle, portn, XTXMAC_SW_RST_REG, val);
17753859Sml29623 		txmac = B_TRUE;
17763859Sml29623 		break;
17773859Sml29623 	case XRX_MAC_RESET_ALL:
17783859Sml29623 		XMAC_REG_WR(handle, portn, XRXMAC_SW_RST_REG,
1779*6929Smisaki 		    XRXMAC_SOFT_RST | XRXMAC_REG_RST);
17803859Sml29623 		XMAC_WAIT_REG(handle, portn, XRXMAC_SW_RST_REG, val);
17813859Sml29623 		break;
17823859Sml29623 	default:
17833859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1784*6929Smisaki 		    " npi_mac_reset"
1785*6929Smisaki 		    " Invalid Input: mode <0x%x>",
1786*6929Smisaki 		    mode));
17873859Sml29623 		return (NPI_FAILURE | NPI_MAC_RESET_MODE_INVALID(portn));
17883859Sml29623 	}
17893859Sml29623 
17903859Sml29623 	if (val != 0) {
17913859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1792*6929Smisaki 		    " npi_xmac_reset"
1793*6929Smisaki 		    " HW ERROR: MAC_RESET  failed <0x%x>",
1794*6929Smisaki 		    val));
17953859Sml29623 
17963859Sml29623 		if (txmac)
17973859Sml29623 			return (NPI_FAILURE | NPI_TXMAC_RESET_FAILED(portn));
17983859Sml29623 		else
17993859Sml29623 			return (NPI_FAILURE | NPI_RXMAC_RESET_FAILED(portn));
18003859Sml29623 	}
18013859Sml29623 
18023859Sml29623 	return (NPI_SUCCESS);
18033859Sml29623 }
18043859Sml29623 
18053859Sml29623 npi_status_t
npi_xmac_xif_config(npi_handle_t handle,config_op_t op,uint8_t portn,xmac_xif_config_t config)18063859Sml29623 npi_xmac_xif_config(npi_handle_t handle, config_op_t op, uint8_t portn,
18073859Sml29623 			xmac_xif_config_t config)
18083859Sml29623 {
18093859Sml29623 	uint64_t val = 0;
18103859Sml29623 
18113859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
18123859Sml29623 
18133859Sml29623 	switch (op) {
18143859Sml29623 	case ENABLE:
18153859Sml29623 	case DISABLE:
18163859Sml29623 		ASSERT((config != 0) && ((config & ~CFG_XMAC_XIF_ALL) == 0));
18173859Sml29623 		if ((config == 0) || (config & ~CFG_XMAC_XIF_ALL) != 0) {
18183859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1819*6929Smisaki 			    " npi_xmac_xif_config"
1820*6929Smisaki 			    " Invalid Input:"
1821*6929Smisaki 			    " config <0x%x>", config));
18223859Sml29623 			return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
18233859Sml29623 		}
18243859Sml29623 		if (op == ENABLE) {
18253859Sml29623 			XMAC_REG_RD(handle, portn, XMAC_CONFIG_REG, &val);
18263859Sml29623 			if (config & CFG_XMAC_XIF_LED_FORCE)
18273859Sml29623 				val |= XMAC_XIF_FORCE_LED_ON;
18283859Sml29623 			if (config & CFG_XMAC_XIF_LED_POLARITY)
18293859Sml29623 				val |= XMAC_XIF_LED_POLARITY;
18303859Sml29623 			if (config & CFG_XMAC_XIF_SEL_POR_CLK_SRC)
18313859Sml29623 				val |= XMAC_XIF_SEL_POR_CLK_SRC;
18323859Sml29623 			if (config & CFG_XMAC_XIF_TX_OUTPUT)
18333859Sml29623 				val |= XMAC_XIF_TX_OUTPUT_EN;
18343859Sml29623 
18353859Sml29623 			if (config & CFG_XMAC_XIF_LOOPBACK) {
18363859Sml29623 				val &= ~XMAC_XIF_SEL_POR_CLK_SRC;
18373859Sml29623 				val |= XMAC_XIF_LOOPBACK;
18383859Sml29623 			}
18393859Sml29623 
18403859Sml29623 			if (config & CFG_XMAC_XIF_LFS)
18413859Sml29623 				val &= ~XMAC_XIF_LFS_DISABLE;
18423859Sml29623 			if (config & CFG_XMAC_XIF_XPCS_BYPASS)
18433859Sml29623 				val |= XMAC_XIF_XPCS_BYPASS;
18443859Sml29623 			if (config & CFG_XMAC_XIF_1G_PCS_BYPASS)
18453859Sml29623 				val |= XMAC_XIF_1G_PCS_BYPASS;
18463859Sml29623 			if (config & CFG_XMAC_XIF_SEL_CLK_25MHZ)
18473859Sml29623 				val |= XMAC_XIF_SEL_CLK_25MHZ;
18483859Sml29623 			XMAC_REG_WR(handle, portn, XMAC_CONFIG_REG, val);
18493859Sml29623 
18503859Sml29623 		} else {
18513859Sml29623 			XMAC_REG_RD(handle, portn, XMAC_CONFIG_REG, &val);
18523859Sml29623 			if (config & CFG_XMAC_XIF_LED_FORCE)
18533859Sml29623 				val &= ~XMAC_XIF_FORCE_LED_ON;
18543859Sml29623 			if (config & CFG_XMAC_XIF_LED_POLARITY)
18553859Sml29623 				val &= ~XMAC_XIF_LED_POLARITY;
18563859Sml29623 			if (config & CFG_XMAC_XIF_SEL_POR_CLK_SRC)
18573859Sml29623 				val &= ~XMAC_XIF_SEL_POR_CLK_SRC;
18583859Sml29623 			if (config & CFG_XMAC_XIF_TX_OUTPUT)
18593859Sml29623 				val &= ~XMAC_XIF_TX_OUTPUT_EN;
18603859Sml29623 			if (config & CFG_XMAC_XIF_LOOPBACK)
18613859Sml29623 				val &= ~XMAC_XIF_LOOPBACK;
18623859Sml29623 			if (config & CFG_XMAC_XIF_LFS)
18633859Sml29623 				val |= XMAC_XIF_LFS_DISABLE;
18643859Sml29623 			if (config & CFG_XMAC_XIF_XPCS_BYPASS)
18653859Sml29623 				val &= ~XMAC_XIF_XPCS_BYPASS;
18663859Sml29623 			if (config & CFG_XMAC_XIF_1G_PCS_BYPASS)
18673859Sml29623 				val &= ~XMAC_XIF_1G_PCS_BYPASS;
18683859Sml29623 			if (config & CFG_XMAC_XIF_SEL_CLK_25MHZ)
18693859Sml29623 				val &= ~XMAC_XIF_SEL_CLK_25MHZ;
18703859Sml29623 			XMAC_REG_WR(handle, portn, XMAC_CONFIG_REG, val);
18713859Sml29623 		}
18723859Sml29623 		break;
18733859Sml29623 	case INIT:
18743859Sml29623 		ASSERT((config & ~CFG_XMAC_XIF_ALL) == 0);
18753859Sml29623 		if ((config & ~CFG_XMAC_XIF_ALL) != 0) {
18763859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1877*6929Smisaki 			    " npi_xmac_xif_config"
1878*6929Smisaki 			    " Invalid Input: config <0x%x>",
1879*6929Smisaki 			    config));
18803859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
18813859Sml29623 		}
18823859Sml29623 		XMAC_REG_RD(handle, portn, XMAC_CONFIG_REG, &val);
18833859Sml29623 
18843859Sml29623 		if (config & CFG_XMAC_XIF_LED_FORCE)
18853859Sml29623 			val |= XMAC_XIF_FORCE_LED_ON;
18863859Sml29623 		else
18873859Sml29623 			val &= ~XMAC_XIF_FORCE_LED_ON;
18883859Sml29623 		if (config & CFG_XMAC_XIF_LED_POLARITY)
18893859Sml29623 			val |= XMAC_XIF_LED_POLARITY;
18903859Sml29623 		else
18913859Sml29623 			val &= ~XMAC_XIF_LED_POLARITY;
18923859Sml29623 		if (config & CFG_XMAC_XIF_SEL_POR_CLK_SRC)
18933859Sml29623 			val |= XMAC_XIF_SEL_POR_CLK_SRC;
18943859Sml29623 		else
18953859Sml29623 			val &= ~XMAC_XIF_SEL_POR_CLK_SRC;
18963859Sml29623 		if (config & CFG_XMAC_XIF_TX_OUTPUT)
18973859Sml29623 			val |= XMAC_XIF_TX_OUTPUT_EN;
18983859Sml29623 		else
18993859Sml29623 			val &= ~XMAC_XIF_TX_OUTPUT_EN;
19003859Sml29623 
19013859Sml29623 		if (config & CFG_XMAC_XIF_LOOPBACK) {
19023859Sml29623 			val &= ~XMAC_XIF_SEL_POR_CLK_SRC;
19033859Sml29623 			val |= XMAC_XIF_LOOPBACK;
19043859Sml29623 #ifdef	AXIS_DEBUG_LB
19053859Sml29623 			val |= XMAC_RX_MAC2IPP_PKT_CNT_EN;
19063859Sml29623 #endif
19073859Sml29623 		} else {
19083859Sml29623 			val &= ~XMAC_XIF_LOOPBACK;
19093859Sml29623 		}
19103859Sml29623 
19113859Sml29623 		if (config & CFG_XMAC_XIF_LFS)
19123859Sml29623 			val &= ~XMAC_XIF_LFS_DISABLE;
19133859Sml29623 		else
19143859Sml29623 			val |= XMAC_XIF_LFS_DISABLE;
19153859Sml29623 		if (config & CFG_XMAC_XIF_XPCS_BYPASS)
19163859Sml29623 			val |= XMAC_XIF_XPCS_BYPASS;
19173859Sml29623 		else
19183859Sml29623 			val &= ~XMAC_XIF_XPCS_BYPASS;
19193859Sml29623 		if (config & CFG_XMAC_XIF_1G_PCS_BYPASS)
19203859Sml29623 			val |= XMAC_XIF_1G_PCS_BYPASS;
19213859Sml29623 		else
19223859Sml29623 			val &= ~XMAC_XIF_1G_PCS_BYPASS;
19233859Sml29623 		if (config & CFG_XMAC_XIF_SEL_CLK_25MHZ)
19243859Sml29623 			val |= XMAC_XIF_SEL_CLK_25MHZ;
19253859Sml29623 		else
19263859Sml29623 			val &= ~XMAC_XIF_SEL_CLK_25MHZ;
19273859Sml29623 		XMAC_REG_WR(handle, portn, XMAC_CONFIG_REG, val);
19283859Sml29623 
19293859Sml29623 		break;
19303859Sml29623 	default:
19313859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1932*6929Smisaki 		    " npi_xmac_xif_config"
1933*6929Smisaki 		    " Invalid Input: op <0x%x>", op));
19343859Sml29623 		return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
19353859Sml29623 	}
19363859Sml29623 
19373859Sml29623 	return (NPI_SUCCESS);
19383859Sml29623 }
19393859Sml29623 
19403859Sml29623 npi_status_t
npi_xmac_tx_config(npi_handle_t handle,config_op_t op,uint8_t portn,xmac_tx_config_t config)19413859Sml29623 npi_xmac_tx_config(npi_handle_t handle, config_op_t op, uint8_t portn,
19423859Sml29623 			xmac_tx_config_t config)
19433859Sml29623 {
19443859Sml29623 	uint64_t val = 0;
19453859Sml29623 
19463859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
19473859Sml29623 
19483859Sml29623 	switch (op) {
19493859Sml29623 	case ENABLE:
19503859Sml29623 	case DISABLE:
19513859Sml29623 		ASSERT((config != 0) && ((config & ~CFG_XMAC_TX_ALL) == 0));
19523859Sml29623 		if ((config == 0) || (config & ~CFG_XMAC_TX_ALL) != 0) {
19533859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1954*6929Smisaki 			    " npi_xmac_tx_config"
1955*6929Smisaki 			    " Invalid Input: config <0x%x>",
1956*6929Smisaki 			    config));
19573859Sml29623 			return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
19583859Sml29623 		}
19593859Sml29623 		if (op == ENABLE) {
19603859Sml29623 			XMAC_REG_RD(handle, portn, XMAC_CONFIG_REG, &val);
19613859Sml29623 			if (config & CFG_XMAC_TX)
19623859Sml29623 				val |= XMAC_TX_CFG_TX_ENABLE;
19633859Sml29623 			if (config & CFG_XMAC_TX_STRETCH_MODE)
19643859Sml29623 				val |= XMAC_TX_CFG_STRETCH_MD;
19653859Sml29623 			if (config & CFG_XMAC_VAR_IPG)
19663859Sml29623 				val |= XMAC_TX_CFG_VAR_MIN_IPG_EN;
19673859Sml29623 			if (config & CFG_XMAC_TX_CRC)
19683859Sml29623 				val &= ~XMAC_TX_CFG_ALWAYS_NO_CRC;
19693859Sml29623 			XMAC_REG_WR(handle, portn, XMAC_CONFIG_REG, val);
19703859Sml29623 		} else {
19713859Sml29623 			XMAC_REG_RD(handle, portn, XMAC_CONFIG_REG, &val);
19723859Sml29623 			if (config & CFG_XMAC_TX)
19733859Sml29623 				val &= ~XMAC_TX_CFG_TX_ENABLE;
19743859Sml29623 			if (config & CFG_XMAC_TX_STRETCH_MODE)
19753859Sml29623 				val &= ~XMAC_TX_CFG_STRETCH_MD;
19763859Sml29623 			if (config & CFG_XMAC_VAR_IPG)
19773859Sml29623 				val &= ~XMAC_TX_CFG_VAR_MIN_IPG_EN;
19783859Sml29623 			if (config & CFG_XMAC_TX_CRC)
19793859Sml29623 				val |= XMAC_TX_CFG_ALWAYS_NO_CRC;
19803859Sml29623 			XMAC_REG_WR(handle, portn, XMAC_CONFIG_REG, val);
19813859Sml29623 		}
19823859Sml29623 		break;
19833859Sml29623 	case INIT:
19843859Sml29623 		ASSERT((config & ~CFG_XMAC_TX_ALL) == 0);
19853859Sml29623 		if ((config & ~CFG_XMAC_TX_ALL) != 0) {
19863859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1987*6929Smisaki 			    " npi_xmac_tx_config"
1988*6929Smisaki 			    " Invalid Input: config <0x%x>",
1989*6929Smisaki 			    config));
19903859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
19913859Sml29623 		}
19923859Sml29623 		XMAC_REG_RD(handle, portn, XMAC_CONFIG_REG, &val);
19933859Sml29623 		if (config & CFG_XMAC_TX)
19943859Sml29623 			val |= XMAC_TX_CFG_TX_ENABLE;
19953859Sml29623 		else
19963859Sml29623 			val &= ~XMAC_TX_CFG_TX_ENABLE;
19973859Sml29623 		if (config & CFG_XMAC_TX_STRETCH_MODE)
19983859Sml29623 			val |= XMAC_TX_CFG_STRETCH_MD;
19993859Sml29623 		else
20003859Sml29623 			val &= ~XMAC_TX_CFG_STRETCH_MD;
20013859Sml29623 		if (config & CFG_XMAC_VAR_IPG)
20023859Sml29623 			val |= XMAC_TX_CFG_VAR_MIN_IPG_EN;
20033859Sml29623 		else
20043859Sml29623 			val &= ~XMAC_TX_CFG_VAR_MIN_IPG_EN;
20053859Sml29623 		if (config & CFG_XMAC_TX_CRC)
20063859Sml29623 			val &= ~XMAC_TX_CFG_ALWAYS_NO_CRC;
20073859Sml29623 		else
20083859Sml29623 			val |= XMAC_TX_CFG_ALWAYS_NO_CRC;
20093859Sml29623 
20103859Sml29623 		XMAC_REG_WR(handle, portn, XMAC_CONFIG_REG, val);
20113859Sml29623 		break;
20123859Sml29623 	default:
20133859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2014*6929Smisaki 		    " npi_xmac_tx_config"
2015*6929Smisaki 		    " Invalid Input: op <0x%x>",
2016*6929Smisaki 		    op));
20173859Sml29623 		return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
20183859Sml29623 	}
20193859Sml29623 
20203859Sml29623 	return (NPI_SUCCESS);
20213859Sml29623 }
20223859Sml29623 
20233859Sml29623 npi_status_t
npi_xmac_rx_config(npi_handle_t handle,config_op_t op,uint8_t portn,xmac_rx_config_t config)20243859Sml29623 npi_xmac_rx_config(npi_handle_t handle, config_op_t op, uint8_t portn,
20253859Sml29623 			xmac_rx_config_t config)
20263859Sml29623 {
20273859Sml29623 	uint64_t val = 0;
20283859Sml29623 
20293859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
20303859Sml29623 
20313859Sml29623 	switch (op) {
20323859Sml29623 	case ENABLE:
20333859Sml29623 	case DISABLE:
20343859Sml29623 		ASSERT((config != 0) && ((config & ~CFG_XMAC_RX_ALL) == 0));
20353859Sml29623 		if ((config == 0) || (config & ~CFG_XMAC_RX_ALL) != 0) {
20363859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2037*6929Smisaki 			    " npi_xmac_rx_config"
2038*6929Smisaki 			    " Invalid Input: config <0x%x>",
2039*6929Smisaki 			    config));
20403859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
20413859Sml29623 		}
20423859Sml29623 		if (op == ENABLE) {
20433859Sml29623 			XMAC_REG_RD(handle, portn, XMAC_CONFIG_REG, &val);
20443859Sml29623 			if (config & CFG_XMAC_RX)
20453859Sml29623 				val |= XMAC_RX_CFG_RX_ENABLE;
20463859Sml29623 			if (config & CFG_XMAC_RX_PROMISCUOUS)
20473859Sml29623 				val |= XMAC_RX_CFG_PROMISC;
20483859Sml29623 			if (config & CFG_XMAC_RX_PROMISCUOUSGROUP)
20493859Sml29623 				val |= XMAC_RX_CFG_PROMISC_GROUP;
20503859Sml29623 			if (config & CFG_XMAC_RX_ERRCHK)
20513859Sml29623 				val &= ~XMAC_RX_CFG_ERR_CHK_DISABLE;
20523859Sml29623 			if (config & CFG_XMAC_RX_CRC_CHK)
20533859Sml29623 				val &= ~XMAC_RX_CFG_CRC_CHK_DISABLE;
20543859Sml29623 			if (config & CFG_XMAC_RX_RESV_MULTICAST)
20553859Sml29623 				val |= XMAC_RX_CFG_RESERVED_MCAST;
20563859Sml29623 			if (config & CFG_XMAC_RX_CODE_VIO_CHK)
20573859Sml29623 				val &= ~XMAC_RX_CFG_CD_VIO_CHK;
20583859Sml29623 			if (config & CFG_XMAC_RX_HASH_FILTER)
20593859Sml29623 				val |= XMAC_RX_CFG_HASH_FILTER_EN;
20603859Sml29623 			if (config & CFG_XMAC_RX_ADDR_FILTER)
20613859Sml29623 				val |= XMAC_RX_CFG_ADDR_FILTER_EN;
20623859Sml29623 			if (config & CFG_XMAC_RX_STRIP_CRC)
20633859Sml29623 				val |= XMAC_RX_CFG_STRIP_CRC;
20643859Sml29623 			if (config & CFG_XMAC_RX_PAUSE)
20653859Sml29623 				val |= XMAC_RX_CFG_RX_PAUSE_EN;
20663859Sml29623 			if (config & CFG_XMAC_RX_PASS_FC_FRAME)
20673859Sml29623 				val |= XMAC_RX_CFG_PASS_FLOW_CTRL;
20683859Sml29623 			XMAC_REG_WR(handle, portn, XMAC_CONFIG_REG, val);
20693859Sml29623 		} else {
20703859Sml29623 			XMAC_REG_RD(handle, portn, XMAC_CONFIG_REG, &val);
20713859Sml29623 			if (config & CFG_XMAC_RX)
20723859Sml29623 				val &= ~XMAC_RX_CFG_RX_ENABLE;
20733859Sml29623 			if (config & CFG_XMAC_RX_PROMISCUOUS)
20743859Sml29623 				val &= ~XMAC_RX_CFG_PROMISC;
20753859Sml29623 			if (config & CFG_XMAC_RX_PROMISCUOUSGROUP)
20763859Sml29623 				val &= ~XMAC_RX_CFG_PROMISC_GROUP;
20773859Sml29623 			if (config & CFG_XMAC_RX_ERRCHK)
20783859Sml29623 				val |= XMAC_RX_CFG_ERR_CHK_DISABLE;
20793859Sml29623 			if (config & CFG_XMAC_RX_CRC_CHK)
20803859Sml29623 				val |= XMAC_RX_CFG_CRC_CHK_DISABLE;
20813859Sml29623 			if (config & CFG_XMAC_RX_RESV_MULTICAST)
20823859Sml29623 				val &= ~XMAC_RX_CFG_RESERVED_MCAST;
20833859Sml29623 			if (config & CFG_XMAC_RX_CODE_VIO_CHK)
20843859Sml29623 				val |= XMAC_RX_CFG_CD_VIO_CHK;
20853859Sml29623 			if (config & CFG_XMAC_RX_HASH_FILTER)
20863859Sml29623 				val &= ~XMAC_RX_CFG_HASH_FILTER_EN;
20873859Sml29623 			if (config & CFG_XMAC_RX_ADDR_FILTER)
20883859Sml29623 				val &= ~XMAC_RX_CFG_ADDR_FILTER_EN;
20893859Sml29623 			if (config & CFG_XMAC_RX_STRIP_CRC)
20903859Sml29623 				val &= ~XMAC_RX_CFG_STRIP_CRC;
20913859Sml29623 			if (config & CFG_XMAC_RX_PAUSE)
20923859Sml29623 				val &= ~XMAC_RX_CFG_RX_PAUSE_EN;
20933859Sml29623 			if (config & CFG_XMAC_RX_PASS_FC_FRAME)
20943859Sml29623 				val &= ~XMAC_RX_CFG_PASS_FLOW_CTRL;
20953859Sml29623 			XMAC_REG_WR(handle, portn, XMAC_CONFIG_REG, val);
20963859Sml29623 		}
20973859Sml29623 		break;
20983859Sml29623 	case INIT:
20993859Sml29623 		ASSERT((config & ~CFG_XMAC_RX_ALL) == 0);
21003859Sml29623 		if ((config & ~CFG_XMAC_RX_ALL) != 0) {
21013859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2102*6929Smisaki 			    " npi_xmac_rx_config"
2103*6929Smisaki 			    " Invalid Input: config <0x%x>",
2104*6929Smisaki 			    config));
21053859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
21063859Sml29623 		}
21073859Sml29623 		XMAC_REG_RD(handle, portn, XMAC_CONFIG_REG, &val);
21083859Sml29623 		if (config & CFG_XMAC_RX)
21093859Sml29623 			val |= XMAC_RX_CFG_RX_ENABLE;
21103859Sml29623 		else
21113859Sml29623 			val &= ~XMAC_RX_CFG_RX_ENABLE;
21123859Sml29623 		if (config & CFG_XMAC_RX_PROMISCUOUS)
21133859Sml29623 			val |= XMAC_RX_CFG_PROMISC;
21143859Sml29623 		else
21153859Sml29623 			val &= ~XMAC_RX_CFG_PROMISC;
21163859Sml29623 		if (config & CFG_XMAC_RX_PROMISCUOUSGROUP)
21173859Sml29623 			val |= XMAC_RX_CFG_PROMISC_GROUP;
21183859Sml29623 		else
21193859Sml29623 			val &= ~XMAC_RX_CFG_PROMISC_GROUP;
21203859Sml29623 		if (config & CFG_XMAC_RX_ERRCHK)
21213859Sml29623 			val &= ~XMAC_RX_CFG_ERR_CHK_DISABLE;
21223859Sml29623 		else
21233859Sml29623 			val |= XMAC_RX_CFG_ERR_CHK_DISABLE;
21243859Sml29623 		if (config & CFG_XMAC_RX_CRC_CHK)
21253859Sml29623 			val &= ~XMAC_RX_CFG_CRC_CHK_DISABLE;
21263859Sml29623 		else
21273859Sml29623 			val |= XMAC_RX_CFG_CRC_CHK_DISABLE;
21283859Sml29623 		if (config & CFG_XMAC_RX_RESV_MULTICAST)
21293859Sml29623 			val |= XMAC_RX_CFG_RESERVED_MCAST;
21303859Sml29623 		else
21313859Sml29623 			val &= ~XMAC_RX_CFG_RESERVED_MCAST;
21323859Sml29623 		if (config & CFG_XMAC_RX_CODE_VIO_CHK)
21333859Sml29623 			val &= ~XMAC_RX_CFG_CD_VIO_CHK;
21343859Sml29623 		else
21353859Sml29623 			val |= XMAC_RX_CFG_CD_VIO_CHK;
21363859Sml29623 		if (config & CFG_XMAC_RX_HASH_FILTER)
21373859Sml29623 			val |= XMAC_RX_CFG_HASH_FILTER_EN;
21383859Sml29623 		else
21393859Sml29623 			val &= ~XMAC_RX_CFG_HASH_FILTER_EN;
21403859Sml29623 		if (config & CFG_XMAC_RX_ADDR_FILTER)
21413859Sml29623 			val |= XMAC_RX_CFG_ADDR_FILTER_EN;
21423859Sml29623 		else
21433859Sml29623 			val &= ~XMAC_RX_CFG_ADDR_FILTER_EN;
21443859Sml29623 		if (config & CFG_XMAC_RX_PAUSE)
21453859Sml29623 			val |= XMAC_RX_CFG_RX_PAUSE_EN;
21463859Sml29623 		else
21473859Sml29623 			val &= ~XMAC_RX_CFG_RX_PAUSE_EN;
21483859Sml29623 		if (config & CFG_XMAC_RX_STRIP_CRC)
21493859Sml29623 			val |= XMAC_RX_CFG_STRIP_CRC;
21503859Sml29623 		else
21513859Sml29623 			val &= ~XMAC_RX_CFG_STRIP_CRC;
21523859Sml29623 		if (config & CFG_XMAC_RX_PASS_FC_FRAME)
21533859Sml29623 			val |= XMAC_RX_CFG_PASS_FLOW_CTRL;
21543859Sml29623 		else
21553859Sml29623 			val &= ~XMAC_RX_CFG_PASS_FLOW_CTRL;
21563859Sml29623 
21573859Sml29623 		XMAC_REG_WR(handle, portn, XMAC_CONFIG_REG, val);
21583859Sml29623 		break;
21593859Sml29623 	default:
21603859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2161*6929Smisaki 		    " npi_xmac_rx_config"
2162*6929Smisaki 		    " Invalid Input: op <0x%x>", op));
21633859Sml29623 		return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
21643859Sml29623 	}
21653859Sml29623 
21663859Sml29623 	return (NPI_SUCCESS);
21673859Sml29623 }
21683859Sml29623 
21693859Sml29623 npi_status_t
npi_xmac_tx_iconfig(npi_handle_t handle,config_op_t op,uint8_t portn,xmac_tx_iconfig_t iconfig)21703859Sml29623 npi_xmac_tx_iconfig(npi_handle_t handle, config_op_t op, uint8_t portn,
21713859Sml29623 		    xmac_tx_iconfig_t iconfig)
21723859Sml29623 {
21733859Sml29623 	uint64_t val = 0;
21743859Sml29623 
21753859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
21763859Sml29623 
21773859Sml29623 	switch (op) {
21783859Sml29623 	case ENABLE:
21793859Sml29623 	case DISABLE:
21803859Sml29623 		ASSERT((iconfig != 0) && ((iconfig & ~ICFG_XMAC_TX_ALL) == 0));
21813859Sml29623 		if ((iconfig == 0) || (iconfig & ~ICFG_XMAC_TX_ALL) != 0) {
21823859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2183*6929Smisaki 			    " npi_xmac_tx_iconfig"
2184*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
2185*6929Smisaki 			    iconfig));
21863859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
21873859Sml29623 		}
21883859Sml29623 		XMAC_REG_RD(handle, portn, XTXMAC_STAT_MSK_REG, &val);
21893859Sml29623 		if (op == ENABLE)
21903859Sml29623 			val &= ~iconfig;
21913859Sml29623 		else
21923859Sml29623 			val |= iconfig;
21933859Sml29623 		XMAC_REG_WR(handle, portn, XTXMAC_STAT_MSK_REG, val);
21943859Sml29623 
21953859Sml29623 		break;
21963859Sml29623 	case INIT:
21973859Sml29623 		ASSERT((iconfig & ~ICFG_XMAC_TX_ALL) == 0);
21983859Sml29623 		if ((iconfig & ~ICFG_XMAC_TX_ALL) != 0) {
21993859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2200*6929Smisaki 			    " npi_xmac_tx_iconfig"
2201*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
2202*6929Smisaki 			    iconfig));
22033859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
22043859Sml29623 		}
22053859Sml29623 		XMAC_REG_WR(handle, portn, XTXMAC_STAT_MSK_REG, ~iconfig);
22063859Sml29623 
22073859Sml29623 		break;
22083859Sml29623 	default:
22093859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2210*6929Smisaki 		    " npi_xmac_tx_iconfig"
2211*6929Smisaki 		    " Invalid Input: iconfig <0x%x>",
2212*6929Smisaki 		    iconfig));
22133859Sml29623 		return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
22143859Sml29623 	}
22153859Sml29623 
22163859Sml29623 	return (NPI_SUCCESS);
22173859Sml29623 }
22183859Sml29623 
22193859Sml29623 npi_status_t
npi_xmac_rx_iconfig(npi_handle_t handle,config_op_t op,uint8_t portn,xmac_rx_iconfig_t iconfig)22203859Sml29623 npi_xmac_rx_iconfig(npi_handle_t handle, config_op_t op, uint8_t portn,
22213859Sml29623 		    xmac_rx_iconfig_t iconfig)
22223859Sml29623 {
22233859Sml29623 	uint64_t val = 0;
22243859Sml29623 
22253859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
22263859Sml29623 
22273859Sml29623 	switch (op) {
22283859Sml29623 	case ENABLE:
22293859Sml29623 	case DISABLE:
22303859Sml29623 		ASSERT((iconfig != 0) && ((iconfig & ~ICFG_XMAC_RX_ALL) == 0));
22313859Sml29623 		if ((iconfig == 0) || (iconfig & ~ICFG_XMAC_RX_ALL) != 0) {
22323859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2233*6929Smisaki 			    " npi_xmac_rx_iconfig"
2234*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
2235*6929Smisaki 			    iconfig));
22363859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
22373859Sml29623 		}
22383859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_STAT_MSK_REG, &val);
22393859Sml29623 		if (op == ENABLE)
22403859Sml29623 			val &= ~iconfig;
22413859Sml29623 		else
22423859Sml29623 			val |= iconfig;
22433859Sml29623 		XMAC_REG_WR(handle, portn, XRXMAC_STAT_MSK_REG, val);
22443859Sml29623 
22453859Sml29623 		break;
22463859Sml29623 	case INIT:
22473859Sml29623 		ASSERT((iconfig & ~ICFG_XMAC_RX_ALL) == 0);
22483859Sml29623 		if ((iconfig & ~ICFG_XMAC_RX_ALL) != 0) {
22493859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2250*6929Smisaki 			    " npi_xmac_rx_iconfig"
2251*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
2252*6929Smisaki 			    iconfig));
22533859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
22543859Sml29623 		}
22553859Sml29623 		XMAC_REG_WR(handle, portn, XRXMAC_STAT_MSK_REG, ~iconfig);
22563859Sml29623 
22573859Sml29623 		break;
22583859Sml29623 	default:
22593859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2260*6929Smisaki 		    " npi_xmac_rx_iconfig"
2261*6929Smisaki 		    " Invalid Input: iconfig <0x%x>",
2262*6929Smisaki 		    iconfig));
22633859Sml29623 		return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
22643859Sml29623 	}
22653859Sml29623 
22663859Sml29623 	return (NPI_SUCCESS);
22673859Sml29623 }
22683859Sml29623 
22693859Sml29623 npi_status_t
npi_xmac_ctl_iconfig(npi_handle_t handle,config_op_t op,uint8_t portn,xmac_ctl_iconfig_t iconfig)22703859Sml29623 npi_xmac_ctl_iconfig(npi_handle_t handle, config_op_t op, uint8_t portn,
22713859Sml29623 			xmac_ctl_iconfig_t iconfig)
22723859Sml29623 {
22733859Sml29623 	uint64_t val = 0;
22743859Sml29623 
22753859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
22763859Sml29623 
22773859Sml29623 	switch (op) {
22783859Sml29623 	case ENABLE:
22793859Sml29623 	case DISABLE:
22803859Sml29623 		ASSERT((iconfig != 0) &&	\
2281*6929Smisaki 		    ((iconfig & ~ICFG_XMAC_CTRL_ALL) == 0));
22823859Sml29623 		if ((iconfig == 0) || (iconfig & ~ICFG_XMAC_CTRL_ALL) != 0) {
22833859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2284*6929Smisaki 			    " npi_xmac_ctl_iconfig"
2285*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
2286*6929Smisaki 			    iconfig));
22873859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
22883859Sml29623 		}
22893859Sml29623 		XMAC_REG_RD(handle, portn, XMAC_C_S_MSK_REG, &val);
22903859Sml29623 		if (op == ENABLE)
22913859Sml29623 			val &= ~iconfig;
22923859Sml29623 		else
22933859Sml29623 			val |= iconfig;
22943859Sml29623 		XMAC_REG_WR(handle, portn, XMAC_C_S_MSK_REG, val);
22953859Sml29623 
22963859Sml29623 		break;
22973859Sml29623 	case INIT:
22983859Sml29623 		ASSERT((iconfig & ~ICFG_XMAC_CTRL_ALL) == 0);
22993859Sml29623 		if ((iconfig & ~ICFG_XMAC_CTRL_ALL) != 0) {
23003859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2301*6929Smisaki 			    " npi_xmac_ctl_iconfig"
2302*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
2303*6929Smisaki 			    iconfig));
23043859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
23053859Sml29623 		}
23063859Sml29623 		XMAC_REG_WR(handle, portn, XMAC_C_S_MSK_REG, ~iconfig);
23073859Sml29623 
23083859Sml29623 		break;
23093859Sml29623 	default:
23103859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2311*6929Smisaki 		    " npi_xmac_ctl_iconfig"
2312*6929Smisaki 		    " Invalid Input: iconfig <0x%x>",
2313*6929Smisaki 		    iconfig));
23143859Sml29623 		return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
23153859Sml29623 	}
23163859Sml29623 
23173859Sml29623 	return (NPI_SUCCESS);
23183859Sml29623 }
23193859Sml29623 
23203859Sml29623 npi_status_t
npi_xmac_tx_get_istatus(npi_handle_t handle,uint8_t portn,xmac_tx_iconfig_t * istatus)23213859Sml29623 npi_xmac_tx_get_istatus(npi_handle_t handle, uint8_t portn,
23223859Sml29623 			xmac_tx_iconfig_t *istatus)
23233859Sml29623 {
23243859Sml29623 	uint64_t val;
23253859Sml29623 
23263859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
23273859Sml29623 
23283859Sml29623 	XMAC_REG_RD(handle, portn, XTXMAC_STATUS_REG, &val);
23293859Sml29623 	*istatus = (uint32_t)val;
23303859Sml29623 
23313859Sml29623 	return (NPI_SUCCESS);
23323859Sml29623 }
23333859Sml29623 
23343859Sml29623 npi_status_t
npi_xmac_rx_get_istatus(npi_handle_t handle,uint8_t portn,xmac_rx_iconfig_t * istatus)23353859Sml29623 npi_xmac_rx_get_istatus(npi_handle_t handle, uint8_t portn,
23363859Sml29623 			xmac_rx_iconfig_t *istatus)
23373859Sml29623 {
23383859Sml29623 	uint64_t val;
23393859Sml29623 
23403859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
23413859Sml29623 
23423859Sml29623 	XMAC_REG_RD(handle, portn, XRXMAC_STATUS_REG, &val);
23433859Sml29623 	*istatus = (uint32_t)val;
23443859Sml29623 
23453859Sml29623 	return (NPI_SUCCESS);
23463859Sml29623 }
23473859Sml29623 
23483859Sml29623 npi_status_t
npi_xmac_ctl_get_istatus(npi_handle_t handle,uint8_t portn,xmac_ctl_iconfig_t * istatus)23493859Sml29623 npi_xmac_ctl_get_istatus(npi_handle_t handle, uint8_t portn,
23503859Sml29623 			xmac_ctl_iconfig_t *istatus)
23513859Sml29623 {
23523859Sml29623 	uint64_t val;
23533859Sml29623 
23543859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
23553859Sml29623 
23563859Sml29623 	XMAC_REG_RD(handle, portn, XMAC_CTRL_STAT_REG, &val);
23573859Sml29623 	*istatus = (uint32_t)val;
23583859Sml29623 
23593859Sml29623 	return (NPI_SUCCESS);
23603859Sml29623 }
23613859Sml29623 
23623859Sml29623 npi_status_t
npi_xmac_xpcs_reset(npi_handle_t handle,uint8_t portn)23633859Sml29623 npi_xmac_xpcs_reset(npi_handle_t handle, uint8_t portn)
23643859Sml29623 {
23653859Sml29623 	uint64_t val;
23666028Ssbehera 	int delay = 100;
23673859Sml29623 
23683859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
23693859Sml29623 
23703859Sml29623 	XPCS_REG_RD(handle, portn, XPCS_CTRL_1_REG, &val);
23713859Sml29623 	val |= XPCS_CTRL1_RST;
23723859Sml29623 	XPCS_REG_WR(handle, portn, XPCS_CTRL_1_REG, val);
23733859Sml29623 
23746028Ssbehera 	while ((--delay) && (val & XPCS_CTRL1_RST)) {
23756028Ssbehera 		NXGE_DELAY(10);
23766028Ssbehera 		XPCS_REG_RD(handle, portn, XPCS_CTRL_1_REG, &val);
23776028Ssbehera 	}
23786028Ssbehera 
23796028Ssbehera 	if (delay == 0) {
23806028Ssbehera 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
23816028Ssbehera 		    " npi_xmac_xpcs_reset portn <%d> failed", portn));
23826028Ssbehera 		return (NPI_FAILURE);
23836028Ssbehera 	}
23846028Ssbehera 
23853859Sml29623 	return (NPI_SUCCESS);
23863859Sml29623 }
23873859Sml29623 
23883859Sml29623 npi_status_t
npi_xmac_xpcs_enable(npi_handle_t handle,uint8_t portn)23893859Sml29623 npi_xmac_xpcs_enable(npi_handle_t handle, uint8_t portn)
23903859Sml29623 {
23913859Sml29623 	uint64_t val;
23923859Sml29623 
23933859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
23943859Sml29623 
23953859Sml29623 	XPCS_REG_RD(handle, portn, XPCS_CFG_VENDOR_1_REG, &val);
23963859Sml29623 	val |= XPCS_CFG_XPCS_ENABLE;
23973859Sml29623 	XPCS_REG_WR(handle, portn, XPCS_CFG_VENDOR_1_REG, val);
23983859Sml29623 
23993859Sml29623 	return (NPI_SUCCESS);
24003859Sml29623 }
24013859Sml29623 
24023859Sml29623 npi_status_t
npi_xmac_xpcs_disable(npi_handle_t handle,uint8_t portn)24033859Sml29623 npi_xmac_xpcs_disable(npi_handle_t handle, uint8_t portn)
24043859Sml29623 {
24053859Sml29623 	uint64_t val;
24063859Sml29623 
24073859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
24083859Sml29623 
24093859Sml29623 	XPCS_REG_RD(handle, portn, XPCS_CFG_VENDOR_1_REG, &val);
24103859Sml29623 	val &= ~XPCS_CFG_XPCS_ENABLE;
24113859Sml29623 	XPCS_REG_WR(handle, portn, XPCS_CFG_VENDOR_1_REG, val);
24123859Sml29623 
24133859Sml29623 	return (NPI_SUCCESS);
24143859Sml29623 }
24153859Sml29623 
24163859Sml29623 npi_status_t
npi_xmac_xpcs_read(npi_handle_t handle,uint8_t portn,uint8_t xpcs_reg,uint32_t * value)24173859Sml29623 npi_xmac_xpcs_read(npi_handle_t handle, uint8_t portn, uint8_t xpcs_reg,
24183859Sml29623 			uint32_t *value)
24193859Sml29623 {
24203859Sml29623 	uint32_t reg;
24213859Sml29623 	uint64_t val;
24223859Sml29623 
24233859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
24243859Sml29623 
24253859Sml29623 	switch (xpcs_reg) {
24263859Sml29623 	case XPCS_REG_CONTROL1:
24273859Sml29623 		reg = XPCS_CTRL_1_REG;
24283859Sml29623 		break;
24293859Sml29623 	case XPCS_REG_STATUS1:
24303859Sml29623 		reg = XPCS_STATUS_1_REG;
24313859Sml29623 		break;
24323859Sml29623 	case XPCS_REG_DEVICE_ID:
24333859Sml29623 		reg = XPCS_DEV_ID_REG;
24343859Sml29623 		break;
24353859Sml29623 	case XPCS_REG_SPEED_ABILITY:
24363859Sml29623 		reg = XPCS_SPEED_ABILITY_REG;
24373859Sml29623 		break;
24383859Sml29623 	case XPCS_REG_DEVICE_IN_PKG:
24393859Sml29623 		reg = XPCS_DEV_IN_PKG_REG;
24403859Sml29623 		break;
24413859Sml29623 	case XPCS_REG_CONTROL2:
24423859Sml29623 		reg = XPCS_CTRL_2_REG;
24433859Sml29623 		break;
24443859Sml29623 	case XPCS_REG_STATUS2:
24453859Sml29623 		reg = XPCS_STATUS_2_REG;
24463859Sml29623 		break;
24473859Sml29623 	case XPCS_REG_PKG_ID:
24483859Sml29623 		reg = XPCS_PKG_ID_REG;
24493859Sml29623 		break;
24503859Sml29623 	case XPCS_REG_STATUS:
24513859Sml29623 		reg = XPCS_STATUS_REG;
24523859Sml29623 		break;
24533859Sml29623 	case XPCS_REG_TEST_CONTROL:
24543859Sml29623 		reg = XPCS_TEST_CTRL_REG;
24553859Sml29623 		break;
24563859Sml29623 	case XPCS_REG_CONFIG_VENDOR1:
24573859Sml29623 		reg = XPCS_CFG_VENDOR_1_REG;
24583859Sml29623 		break;
24593859Sml29623 	case XPCS_REG_DIAG_VENDOR2:
24603859Sml29623 		reg = XPCS_DIAG_VENDOR_2_REG;
24613859Sml29623 		break;
24623859Sml29623 	case XPCS_REG_MASK1:
24633859Sml29623 		reg = XPCS_MASK_1_REG;
24643859Sml29623 		break;
24653859Sml29623 	case XPCS_REG_PACKET_COUNTER:
24663859Sml29623 		reg = XPCS_PKT_CNTR_REG;
24673859Sml29623 		break;
24683859Sml29623 	case XPCS_REG_TX_STATEMACHINE:
24693859Sml29623 		reg = XPCS_TX_STATE_MC_REG;
24703859Sml29623 		break;
24713859Sml29623 	case XPCS_REG_DESCWERR_COUNTER:
24723859Sml29623 		reg = XPCS_DESKEW_ERR_CNTR_REG;
24733859Sml29623 		break;
24743859Sml29623 	case XPCS_REG_SYMBOL_ERR_L0_1_COUNTER:
24753859Sml29623 		reg = XPCS_SYM_ERR_CNTR_L0_L1_REG;
24763859Sml29623 		break;
24773859Sml29623 	case XPCS_REG_SYMBOL_ERR_L2_3_COUNTER:
24783859Sml29623 		reg = XPCS_SYM_ERR_CNTR_L2_L3_REG;
24793859Sml29623 		break;
24803859Sml29623 	case XPCS_REG_TRAINING_VECTOR:
24813859Sml29623 		reg = XPCS_TRAINING_VECTOR_REG;
24823859Sml29623 		break;
24833859Sml29623 	default:
24843859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2485*6929Smisaki 		    " npi_xmac_xpcs_read"
2486*6929Smisaki 		    " Invalid Input: xpcs_reg <0x%x>",
2487*6929Smisaki 		    xpcs_reg));
24883859Sml29623 		return (NPI_FAILURE | NPI_MAC_REG_INVALID(portn));
24893859Sml29623 	}
24903859Sml29623 	XPCS_REG_RD(handle, portn, reg, &val);
24913859Sml29623 	*value = val & 0xFFFFFFFF;
24923859Sml29623 
24933859Sml29623 	return (NPI_SUCCESS);
24943859Sml29623 }
24953859Sml29623 
24963859Sml29623 npi_status_t
npi_xmac_xpcs_write(npi_handle_t handle,uint8_t portn,uint8_t xpcs_reg,uint32_t value)24973859Sml29623 npi_xmac_xpcs_write(npi_handle_t handle, uint8_t portn, uint8_t xpcs_reg,
24983859Sml29623 			uint32_t value)
24993859Sml29623 {
25003859Sml29623 	uint32_t reg;
25013859Sml29623 	uint64_t val;
25023859Sml29623 
25033859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
25043859Sml29623 
25053859Sml29623 	switch (xpcs_reg) {
25063859Sml29623 	case XPCS_REG_CONTROL1:
25073859Sml29623 		reg = XPCS_CTRL_1_REG;
25083859Sml29623 		break;
25093859Sml29623 	case XPCS_REG_TEST_CONTROL:
25103859Sml29623 		reg = XPCS_TEST_CTRL_REG;
25113859Sml29623 		break;
25123859Sml29623 	case XPCS_REG_CONFIG_VENDOR1:
25133859Sml29623 		reg = XPCS_CFG_VENDOR_1_REG;
25143859Sml29623 		break;
25153859Sml29623 	case XPCS_REG_DIAG_VENDOR2:
25163859Sml29623 		reg = XPCS_DIAG_VENDOR_2_REG;
25173859Sml29623 		break;
25183859Sml29623 	case XPCS_REG_MASK1:
25193859Sml29623 		reg = XPCS_MASK_1_REG;
25203859Sml29623 		break;
25213859Sml29623 	case XPCS_REG_PACKET_COUNTER:
25223859Sml29623 		reg = XPCS_PKT_CNTR_REG;
25233859Sml29623 		break;
25243859Sml29623 	case XPCS_REG_DESCWERR_COUNTER:
25253859Sml29623 		reg = XPCS_DESKEW_ERR_CNTR_REG;
25263859Sml29623 		break;
25273859Sml29623 	case XPCS_REG_TRAINING_VECTOR:
25283859Sml29623 		reg = XPCS_TRAINING_VECTOR_REG;
25293859Sml29623 		break;
25303859Sml29623 	default:
25313859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2532*6929Smisaki 		    " npi_xmac_xpcs_write"
2533*6929Smisaki 		    " Invalid Input: xpcs_reg <0x%x>",
2534*6929Smisaki 		    xpcs_reg));
25353859Sml29623 		return (NPI_FAILURE | NPI_MAC_PCS_REG_INVALID(portn));
25363859Sml29623 	}
25373859Sml29623 	val = value;
25383859Sml29623 
25393859Sml29623 	XPCS_REG_WR(handle, portn, reg, val);
25403859Sml29623 
25413859Sml29623 	return (NPI_SUCCESS);
25423859Sml29623 }
25433859Sml29623 
25443859Sml29623 npi_status_t
npi_bmac_reset(npi_handle_t handle,uint8_t portn,npi_mac_reset_t mode)25453859Sml29623 npi_bmac_reset(npi_handle_t handle, uint8_t portn, npi_mac_reset_t mode)
25463859Sml29623 {
25473859Sml29623 	uint64_t val = 0;
25483859Sml29623 	boolean_t txmac = B_FALSE;
25493859Sml29623 
25503859Sml29623 	ASSERT(IS_BMAC_PORT_NUM_VALID(portn));
25513859Sml29623 
25523859Sml29623 	switch (mode) {
25533859Sml29623 	case TX_MAC_RESET:
25543859Sml29623 		BMAC_REG_WR(handle, portn, BTXMAC_SW_RST_REG, 0x1);
25553859Sml29623 		BMAC_WAIT_REG(handle, portn, BTXMAC_SW_RST_REG, val);
25563859Sml29623 		txmac = B_TRUE;
25573859Sml29623 		break;
25583859Sml29623 	case RX_MAC_RESET:
25593859Sml29623 		BMAC_REG_WR(handle, portn, BRXMAC_SW_RST_REG, 0x1);
25603859Sml29623 		BMAC_WAIT_REG(handle, portn, BRXMAC_SW_RST_REG, val);
25613859Sml29623 		break;
25623859Sml29623 	default:
25633859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2564*6929Smisaki 		    " npi_bmac_reset"
2565*6929Smisaki 		    " Invalid Input: mode <0x%x>",
2566*6929Smisaki 		    mode));
25673859Sml29623 		return (NPI_FAILURE | NPI_MAC_RESET_MODE_INVALID(portn));
25683859Sml29623 	}
25693859Sml29623 
25703859Sml29623 	if (val != 0) {
25713859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2572*6929Smisaki 		    " npi_bmac_reset"
2573*6929Smisaki 		    " BMAC_RESET HW Error: ret <0x%x>",
2574*6929Smisaki 		    val));
25753859Sml29623 		if (txmac)
25763859Sml29623 			return (NPI_FAILURE | NPI_TXMAC_RESET_FAILED(portn));
25773859Sml29623 		else
25783859Sml29623 			return (NPI_FAILURE | NPI_RXMAC_RESET_FAILED(portn));
25793859Sml29623 	}
25803859Sml29623 
25813859Sml29623 	return (NPI_SUCCESS);
25823859Sml29623 }
25833859Sml29623 
25843859Sml29623 npi_status_t
npi_mac_pcs_reset(npi_handle_t handle,uint8_t portn)25853859Sml29623 npi_mac_pcs_reset(npi_handle_t handle, uint8_t portn)
25863859Sml29623 {
25873859Sml29623 	/* what to do here ? */
25883859Sml29623 	uint64_t val = 0;
25896028Ssbehera 	int delay = 100;
25903859Sml29623 
25913859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
25923859Sml29623 
25933859Sml29623 	PCS_REG_RD(handle, portn, PCS_MII_CTRL_REG, &val);
25943859Sml29623 	val |= PCS_MII_RESET;
25953859Sml29623 	PCS_REG_WR(handle, portn, PCS_MII_CTRL_REG, val);
25966028Ssbehera 	while ((delay) && (val & PCS_MII_RESET)) {
25976028Ssbehera 		NXGE_DELAY(10);
25986028Ssbehera 		PCS_REG_RD(handle, portn, PCS_MII_CTRL_REG, &val);
25996028Ssbehera 		delay--;
26006028Ssbehera 	}
26016028Ssbehera 	if (delay == 0) {
26026028Ssbehera 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
26036028Ssbehera 		    " npi_bmac_pcs_reset portn <%d> failed", portn));
26046028Ssbehera 		return (NPI_FAILURE);
26056028Ssbehera 	}
26063859Sml29623 	return (NPI_SUCCESS);
26073859Sml29623 }
26083859Sml29623 
26093859Sml29623 npi_status_t
npi_mac_get_link_status(npi_handle_t handle,uint8_t portn,boolean_t * link_up)26103859Sml29623 npi_mac_get_link_status(npi_handle_t handle, uint8_t portn,
26113859Sml29623 			boolean_t *link_up)
26123859Sml29623 {
26133859Sml29623 	uint64_t val;
26143859Sml29623 
26153859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
26163859Sml29623 
26173859Sml29623 	PCS_REG_RD(handle, portn, PCS_MII_STATUS_REG, &val);
26183859Sml29623 
26193859Sml29623 	if (val & PCS_MII_STATUS_LINK_STATUS) {
26203859Sml29623 		*link_up = B_TRUE;
26213859Sml29623 	} else {
26223859Sml29623 		*link_up = B_FALSE;
26233859Sml29623 	}
26243859Sml29623 
26253859Sml29623 	return (NPI_SUCCESS);
26263859Sml29623 }
26273859Sml29623 
26283859Sml29623 npi_status_t
npi_bmac_tx_config(npi_handle_t handle,config_op_t op,uint8_t portn,bmac_tx_config_t config)26293859Sml29623 npi_bmac_tx_config(npi_handle_t handle, config_op_t op, uint8_t portn,
26303859Sml29623 			bmac_tx_config_t config)
26313859Sml29623 {
26323859Sml29623 	uint64_t val = 0;
26333859Sml29623 
26343859Sml29623 	ASSERT(IS_BMAC_PORT_NUM_VALID(portn));
26353859Sml29623 
26363859Sml29623 	switch (op) {
26373859Sml29623 	case ENABLE:
26383859Sml29623 	case DISABLE:
26393859Sml29623 		ASSERT((config != 0) && ((config & ~CFG_BMAC_TX_ALL) == 0));
26403859Sml29623 		if ((config == 0) || (config & ~CFG_BMAC_TX_ALL) != 0) {
26413859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2642*6929Smisaki 			    " npi_bmac_tx_config"
2643*6929Smisaki 			    " Invalid Input: config <0x%x>",
2644*6929Smisaki 			    config));
26453859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
26463859Sml29623 		}
26473859Sml29623 		if (op == ENABLE) {
26483859Sml29623 			BMAC_REG_RD(handle, portn, TXMAC_CONFIG_REG, &val);
26493859Sml29623 			if (config & CFG_BMAC_TX)
26503859Sml29623 				val |= MAC_TX_CFG_TXMAC_ENABLE;
26513859Sml29623 			if (config & CFG_BMAC_TX_CRC)
26523859Sml29623 				val &= ~MAC_TX_CFG_NO_FCS;
26533859Sml29623 			BMAC_REG_WR(handle, portn, TXMAC_CONFIG_REG, val);
26543859Sml29623 		} else {
26553859Sml29623 			BMAC_REG_RD(handle, portn, TXMAC_CONFIG_REG, &val);
26563859Sml29623 			if (config & CFG_BMAC_TX)
26573859Sml29623 				val &= ~MAC_TX_CFG_TXMAC_ENABLE;
26583859Sml29623 			if (config & CFG_BMAC_TX_CRC)
26593859Sml29623 				val |= MAC_TX_CFG_NO_FCS;
26603859Sml29623 			BMAC_REG_WR(handle, portn, TXMAC_CONFIG_REG, val);
26613859Sml29623 		}
26623859Sml29623 		break;
26633859Sml29623 	case INIT:
26643859Sml29623 		ASSERT((config & ~CFG_BMAC_TX_ALL) == 0);
26653859Sml29623 		if ((config & ~CFG_BMAC_TX_ALL) != 0) {
26663859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2667*6929Smisaki 			    " npi_bmac_tx_config"
2668*6929Smisaki 			    " Invalid Input: config <0x%x>",
2669*6929Smisaki 			    config));
26703859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
26713859Sml29623 		}
26723859Sml29623 		BMAC_REG_RD(handle, portn, TXMAC_CONFIG_REG, &val);
26733859Sml29623 		if (config & CFG_BMAC_TX)
26743859Sml29623 			val |= MAC_TX_CFG_TXMAC_ENABLE;
26753859Sml29623 		else
26763859Sml29623 			val &= ~MAC_TX_CFG_TXMAC_ENABLE;
26773859Sml29623 		if (config & CFG_BMAC_TX_CRC)
26783859Sml29623 			val &= ~MAC_TX_CFG_NO_FCS;
26793859Sml29623 		else
26803859Sml29623 			val |= MAC_TX_CFG_NO_FCS;
26813859Sml29623 		BMAC_REG_WR(handle, portn, TXMAC_CONFIG_REG, val);
26823859Sml29623 		break;
26833859Sml29623 	default:
26843859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2685*6929Smisaki 		    " npi_bmac_tx_config"
2686*6929Smisaki 		    " Invalid Input: op <0x%x>",
2687*6929Smisaki 		    op));
26883859Sml29623 		return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
26893859Sml29623 	}
26903859Sml29623 
26913859Sml29623 	return (NPI_SUCCESS);
26923859Sml29623 }
26933859Sml29623 
26943859Sml29623 npi_status_t
npi_bmac_rx_config(npi_handle_t handle,config_op_t op,uint8_t portn,bmac_rx_config_t config)26953859Sml29623 npi_bmac_rx_config(npi_handle_t handle, config_op_t op, uint8_t portn,
26963859Sml29623 			bmac_rx_config_t config)
26973859Sml29623 {
26983859Sml29623 	uint64_t val = 0;
26993859Sml29623 
27003859Sml29623 	ASSERT(IS_BMAC_PORT_NUM_VALID(portn));
27013859Sml29623 
27023859Sml29623 	switch (op) {
27033859Sml29623 	case ENABLE:
27043859Sml29623 	case DISABLE:
27053859Sml29623 		ASSERT((config != 0) && ((config & ~CFG_BMAC_RX_ALL) == 0));
27063859Sml29623 		if ((config == 0) || (config & ~CFG_BMAC_RX_ALL) != 0) {
27073859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2708*6929Smisaki 			    " npi_bmac_rx_config"
2709*6929Smisaki 			    " Invalid Input: config <0x%x>",
2710*6929Smisaki 			    config));
27113859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
27123859Sml29623 		}
27133859Sml29623 		if (op == ENABLE) {
27143859Sml29623 			BMAC_REG_RD(handle, portn, RXMAC_CONFIG_REG, &val);
27153859Sml29623 			if (config & CFG_BMAC_RX)
27163859Sml29623 				val |= MAC_RX_CFG_RXMAC_ENABLE;
27173859Sml29623 			if (config & CFG_BMAC_RX_STRIP_PAD)
27183859Sml29623 				val |= MAC_RX_CFG_STRIP_PAD;
27193859Sml29623 			if (config & CFG_BMAC_RX_STRIP_CRC)
27203859Sml29623 				val |= MAC_RX_CFG_STRIP_FCS;
27213859Sml29623 			if (config & CFG_BMAC_RX_PROMISCUOUS)
27223859Sml29623 				val |= MAC_RX_CFG_PROMISC;
27233859Sml29623 			if (config & CFG_BMAC_RX_PROMISCUOUSGROUP)
27243859Sml29623 				val |= MAC_RX_CFG_PROMISC_GROUP;
27253859Sml29623 			if (config & CFG_BMAC_RX_HASH_FILTER)
27263859Sml29623 				val |= MAC_RX_CFG_HASH_FILTER_EN;
27273859Sml29623 			if (config & CFG_BMAC_RX_ADDR_FILTER)
27283859Sml29623 				val |= MAC_RX_CFG_ADDR_FILTER_EN;
27293859Sml29623 			if (config & CFG_BMAC_RX_DISCARD_ON_ERR)
27303859Sml29623 				val &= ~MAC_RX_CFG_DISABLE_DISCARD;
27313859Sml29623 			BMAC_REG_WR(handle, portn, RXMAC_CONFIG_REG, val);
27323859Sml29623 		} else {
27333859Sml29623 			BMAC_REG_RD(handle, portn, RXMAC_CONFIG_REG, &val);
27343859Sml29623 			if (config & CFG_BMAC_RX)
27353859Sml29623 				val &= ~MAC_RX_CFG_RXMAC_ENABLE;
27363859Sml29623 			if (config & CFG_BMAC_RX_STRIP_PAD)
27373859Sml29623 				val &= ~MAC_RX_CFG_STRIP_PAD;
27383859Sml29623 			if (config & CFG_BMAC_RX_STRIP_CRC)
27393859Sml29623 				val &= ~MAC_RX_CFG_STRIP_FCS;
27403859Sml29623 			if (config & CFG_BMAC_RX_PROMISCUOUS)
27413859Sml29623 				val &= ~MAC_RX_CFG_PROMISC;
27423859Sml29623 			if (config & CFG_BMAC_RX_PROMISCUOUSGROUP)
27433859Sml29623 				val &= ~MAC_RX_CFG_PROMISC_GROUP;
27443859Sml29623 			if (config & CFG_BMAC_RX_HASH_FILTER)
27453859Sml29623 				val &= ~MAC_RX_CFG_HASH_FILTER_EN;
27463859Sml29623 			if (config & CFG_BMAC_RX_ADDR_FILTER)
27473859Sml29623 				val &= ~MAC_RX_CFG_ADDR_FILTER_EN;
27483859Sml29623 			if (config & CFG_BMAC_RX_DISCARD_ON_ERR)
27493859Sml29623 				val |= MAC_RX_CFG_DISABLE_DISCARD;
27503859Sml29623 			BMAC_REG_WR(handle, portn, RXMAC_CONFIG_REG, val);
27513859Sml29623 		}
27523859Sml29623 		break;
27533859Sml29623 	case INIT:
27543859Sml29623 		ASSERT((config & ~CFG_BMAC_RX_ALL) == 0);
27553859Sml29623 		if ((config & ~CFG_BMAC_RX_ALL) != 0) {
27563859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2757*6929Smisaki 			    " npi_bmac_rx_config"
2758*6929Smisaki 			    " Invalid Input: config <0x%x>",
2759*6929Smisaki 			    config));
27603859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
27613859Sml29623 		}
27623859Sml29623 		BMAC_REG_RD(handle, portn, RXMAC_CONFIG_REG, &val);
27633859Sml29623 		if (config & CFG_BMAC_RX)
27643859Sml29623 			val |= MAC_RX_CFG_RXMAC_ENABLE;
27653859Sml29623 		else
27663859Sml29623 			val &= ~MAC_RX_CFG_RXMAC_ENABLE;
27673859Sml29623 		if (config & CFG_BMAC_RX_STRIP_PAD)
27683859Sml29623 			val |= MAC_RX_CFG_STRIP_PAD;
27693859Sml29623 		else
27703859Sml29623 			val &= ~MAC_RX_CFG_STRIP_PAD;
27713859Sml29623 		if (config & CFG_BMAC_RX_STRIP_CRC)
27723859Sml29623 			val |= MAC_RX_CFG_STRIP_FCS;
27733859Sml29623 		else
27743859Sml29623 			val &= ~MAC_RX_CFG_STRIP_FCS;
27753859Sml29623 		if (config & CFG_BMAC_RX_PROMISCUOUS)
27763859Sml29623 			val |= MAC_RX_CFG_PROMISC;
27773859Sml29623 		else
27783859Sml29623 			val &= ~MAC_RX_CFG_PROMISC;
27793859Sml29623 		if (config & CFG_BMAC_RX_PROMISCUOUSGROUP)
27803859Sml29623 			val |= MAC_RX_CFG_PROMISC_GROUP;
27813859Sml29623 		else
27823859Sml29623 			val &= ~MAC_RX_CFG_PROMISC_GROUP;
27833859Sml29623 		if (config & CFG_BMAC_RX_HASH_FILTER)
27843859Sml29623 			val |= MAC_RX_CFG_HASH_FILTER_EN;
27853859Sml29623 		else
27863859Sml29623 			val &= ~MAC_RX_CFG_HASH_FILTER_EN;
27873859Sml29623 		if (config & CFG_BMAC_RX_ADDR_FILTER)
27883859Sml29623 			val |= MAC_RX_CFG_ADDR_FILTER_EN;
27893859Sml29623 		else
27903859Sml29623 			val &= ~MAC_RX_CFG_ADDR_FILTER_EN;
27913859Sml29623 		if (config & CFG_BMAC_RX_DISCARD_ON_ERR)
27923859Sml29623 			val &= ~MAC_RX_CFG_DISABLE_DISCARD;
27933859Sml29623 		else
27943859Sml29623 			val |= MAC_RX_CFG_DISABLE_DISCARD;
27953859Sml29623 
27963859Sml29623 		BMAC_REG_WR(handle, portn, RXMAC_CONFIG_REG, val);
27973859Sml29623 		break;
27983859Sml29623 	default:
27993859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2800*6929Smisaki 		    " npi_bmac_rx_config"
2801*6929Smisaki 		    " Invalid Input: op <0x%x>", op));
28023859Sml29623 		return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
28033859Sml29623 	}
28043859Sml29623 
28053859Sml29623 	return (NPI_SUCCESS);
28063859Sml29623 }
28073859Sml29623 
28083859Sml29623 npi_status_t
npi_bmac_rx_iconfig(npi_handle_t handle,config_op_t op,uint8_t portn,bmac_rx_iconfig_t iconfig)28093859Sml29623 npi_bmac_rx_iconfig(npi_handle_t handle, config_op_t op, uint8_t portn,
28103859Sml29623 		    bmac_rx_iconfig_t iconfig)
28113859Sml29623 {
28123859Sml29623 	uint64_t val = 0;
28133859Sml29623 
28143859Sml29623 	ASSERT(IS_BMAC_PORT_NUM_VALID(portn));
28153859Sml29623 
28163859Sml29623 	switch (op) {
28173859Sml29623 	case ENABLE:
28183859Sml29623 	case DISABLE:
28193859Sml29623 		ASSERT((iconfig != 0) && ((iconfig & ~ICFG_BMAC_RX_ALL) == 0));
28203859Sml29623 		if ((iconfig == 0) || (iconfig & ~ICFG_BMAC_RX_ALL) != 0) {
28213859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2822*6929Smisaki 			    " npi_bmac_rx_iconfig"
2823*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
2824*6929Smisaki 			    iconfig));
28253859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
28263859Sml29623 		}
28273859Sml29623 		BMAC_REG_RD(handle, portn, BRXMAC_STAT_MSK_REG, &val);
28283859Sml29623 		if (op == ENABLE)
28293859Sml29623 			val &= ~iconfig;
28303859Sml29623 		else
28313859Sml29623 			val |= iconfig;
28323859Sml29623 		BMAC_REG_WR(handle, portn, BRXMAC_STAT_MSK_REG, val);
28333859Sml29623 
28343859Sml29623 		break;
28353859Sml29623 	case INIT:
28363859Sml29623 		ASSERT((iconfig & ~ICFG_BMAC_RX_ALL) == 0);
28373859Sml29623 		if ((iconfig & ~ICFG_BMAC_RX_ALL) != 0) {
28383859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2839*6929Smisaki 			    " npi_bmac_rx_iconfig"
2840*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
2841*6929Smisaki 			    iconfig));
28423859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
28433859Sml29623 		}
28443859Sml29623 		BMAC_REG_WR(handle, portn, BRXMAC_STAT_MSK_REG, ~iconfig);
28453859Sml29623 
28463859Sml29623 		break;
28473859Sml29623 	default:
28483859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2849*6929Smisaki 		    " npi_bmac_rx_iconfig"
2850*6929Smisaki 		    " Invalid Input: iconfig <0x%x>",
2851*6929Smisaki 		    iconfig));
28523859Sml29623 		return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
28533859Sml29623 	}
28543859Sml29623 
28553859Sml29623 	return (NPI_SUCCESS);
28563859Sml29623 }
28573859Sml29623 
28583859Sml29623 npi_status_t
npi_bmac_xif_config(npi_handle_t handle,config_op_t op,uint8_t portn,bmac_xif_config_t config)28593859Sml29623 npi_bmac_xif_config(npi_handle_t handle, config_op_t op, uint8_t portn,
28603859Sml29623 		    bmac_xif_config_t config)
28613859Sml29623 {
28623859Sml29623 	uint64_t val = 0;
28633859Sml29623 
28643859Sml29623 	ASSERT(IS_BMAC_PORT_NUM_VALID(portn));
28653859Sml29623 
28663859Sml29623 	switch (op) {
28673859Sml29623 	case ENABLE:
28683859Sml29623 	case DISABLE:
28693859Sml29623 		ASSERT((config != 0) && ((config & ~CFG_BMAC_XIF_ALL) == 0));
28703859Sml29623 		if ((config == 0) || (config & ~CFG_BMAC_XIF_ALL) != 0) {
28713859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2872*6929Smisaki 			    " npi_bmac_xif_config"
2873*6929Smisaki 			    " Invalid Input: config <0x%x>",
2874*6929Smisaki 			    config));
28753859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
28763859Sml29623 		}
28773859Sml29623 		if (op == ENABLE) {
28783859Sml29623 			BMAC_REG_RD(handle, portn, MAC_XIF_CONFIG_REG, &val);
28793859Sml29623 			if (config & CFG_BMAC_XIF_TX_OUTPUT)
28803859Sml29623 				val |= MAC_XIF_TX_OUTPUT_EN;
28813859Sml29623 			if (config & CFG_BMAC_XIF_LOOPBACK)
28823859Sml29623 				val |= MAC_XIF_MII_INT_LOOPBACK;
28833859Sml29623 			if (config & CFG_BMAC_XIF_GMII_MODE)
28843859Sml29623 				val |= MAC_XIF_GMII_MODE;
28853859Sml29623 			if (config & CFG_BMAC_XIF_LINKLED)
28863859Sml29623 				val |= MAC_XIF_LINK_LED;
28873859Sml29623 			if (config & CFG_BMAC_XIF_LED_POLARITY)
28883859Sml29623 				val |= MAC_XIF_LED_POLARITY;
28893859Sml29623 			if (config & CFG_BMAC_XIF_SEL_CLK_25MHZ)
28903859Sml29623 				val |= MAC_XIF_SEL_CLK_25MHZ;
28913859Sml29623 			BMAC_REG_WR(handle, portn, MAC_XIF_CONFIG_REG, val);
28923859Sml29623 		} else {
28933859Sml29623 			BMAC_REG_RD(handle, portn, MAC_XIF_CONFIG_REG, &val);
28943859Sml29623 			if (config & CFG_BMAC_XIF_TX_OUTPUT)
28953859Sml29623 				val &= ~MAC_XIF_TX_OUTPUT_EN;
28963859Sml29623 			if (config & CFG_BMAC_XIF_LOOPBACK)
28973859Sml29623 				val &= ~MAC_XIF_MII_INT_LOOPBACK;
28983859Sml29623 			if (config & CFG_BMAC_XIF_GMII_MODE)
28993859Sml29623 				val &= ~MAC_XIF_GMII_MODE;
29003859Sml29623 			if (config & CFG_BMAC_XIF_LINKLED)
29013859Sml29623 				val &= ~MAC_XIF_LINK_LED;
29023859Sml29623 			if (config & CFG_BMAC_XIF_LED_POLARITY)
29033859Sml29623 				val &= ~MAC_XIF_LED_POLARITY;
29043859Sml29623 			if (config & CFG_BMAC_XIF_SEL_CLK_25MHZ)
29053859Sml29623 				val &= ~MAC_XIF_SEL_CLK_25MHZ;
29063859Sml29623 			BMAC_REG_WR(handle, portn, MAC_XIF_CONFIG_REG, val);
29073859Sml29623 		}
29083859Sml29623 		break;
29093859Sml29623 	case INIT:
29103859Sml29623 		ASSERT((config & ~CFG_BMAC_XIF_ALL) == 0);
29113859Sml29623 		if ((config & ~CFG_BMAC_XIF_ALL) != 0) {
29123859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2913*6929Smisaki 			    " npi_bmac_xif_config"
2914*6929Smisaki 			    " Invalid Input: config <0x%x>",
2915*6929Smisaki 			    config));
29163859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
29173859Sml29623 		}
29183859Sml29623 		BMAC_REG_RD(handle, portn, MAC_XIF_CONFIG_REG, &val);
29193859Sml29623 		if (config & CFG_BMAC_XIF_TX_OUTPUT)
29203859Sml29623 			val |= MAC_XIF_TX_OUTPUT_EN;
29213859Sml29623 		else
29223859Sml29623 			val &= ~MAC_XIF_TX_OUTPUT_EN;
29233859Sml29623 		if (config & CFG_BMAC_XIF_LOOPBACK)
29243859Sml29623 			val |= MAC_XIF_MII_INT_LOOPBACK;
29253859Sml29623 		else
29263859Sml29623 			val &= ~MAC_XIF_MII_INT_LOOPBACK;
29273859Sml29623 		if (config & CFG_BMAC_XIF_GMII_MODE)
29283859Sml29623 			val |= MAC_XIF_GMII_MODE;
29293859Sml29623 		else
29303859Sml29623 			val &= ~MAC_XIF_GMII_MODE;
29313859Sml29623 		if (config & CFG_BMAC_XIF_LINKLED)
29323859Sml29623 			val |= MAC_XIF_LINK_LED;
29333859Sml29623 		else
29343859Sml29623 			val &= ~MAC_XIF_LINK_LED;
29353859Sml29623 		if (config & CFG_BMAC_XIF_LED_POLARITY)
29363859Sml29623 			val |= MAC_XIF_LED_POLARITY;
29373859Sml29623 		else
29383859Sml29623 			val &= ~MAC_XIF_LED_POLARITY;
29393859Sml29623 		if (config & CFG_BMAC_XIF_SEL_CLK_25MHZ)
29403859Sml29623 			val |= MAC_XIF_SEL_CLK_25MHZ;
29413859Sml29623 		else
29423859Sml29623 			val &= ~MAC_XIF_SEL_CLK_25MHZ;
29433859Sml29623 		BMAC_REG_WR(handle, portn, MAC_XIF_CONFIG_REG, val);
29443859Sml29623 		break;
29453859Sml29623 	default:
29463859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2947*6929Smisaki 		    " npi_bmac_xif_config"
2948*6929Smisaki 		    " Invalid Input: op <0x%x>",
2949*6929Smisaki 		    op));
29503859Sml29623 		return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
29513859Sml29623 	}
29523859Sml29623 
29533859Sml29623 	return (NPI_SUCCESS);
29543859Sml29623 }
29553859Sml29623 
29563859Sml29623 npi_status_t
npi_bmac_tx_iconfig(npi_handle_t handle,config_op_t op,uint8_t portn,bmac_tx_iconfig_t iconfig)29573859Sml29623 npi_bmac_tx_iconfig(npi_handle_t handle, config_op_t op, uint8_t portn,
29583859Sml29623 		    bmac_tx_iconfig_t iconfig)
29593859Sml29623 {
29603859Sml29623 	uint64_t val = 0;
29613859Sml29623 
29623859Sml29623 	ASSERT(IS_BMAC_PORT_NUM_VALID(portn));
29633859Sml29623 
29643859Sml29623 	switch (op) {
29653859Sml29623 	case ENABLE:
29663859Sml29623 	case DISABLE:
29673859Sml29623 		ASSERT((iconfig != 0) && ((iconfig & ~ICFG_XMAC_TX_ALL) == 0));
29683859Sml29623 		if ((iconfig == 0) || (iconfig & ~ICFG_XMAC_TX_ALL) != 0) {
29693859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2970*6929Smisaki 			    " npi_bmac_tx_iconfig"
2971*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
2972*6929Smisaki 			    iconfig));
29733859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
29743859Sml29623 		}
29753859Sml29623 		BMAC_REG_RD(handle, portn, BTXMAC_STAT_MSK_REG, &val);
29763859Sml29623 		if (op == ENABLE)
29773859Sml29623 			val &= ~iconfig;
29783859Sml29623 		else
29793859Sml29623 			val |= iconfig;
29803859Sml29623 		BMAC_REG_WR(handle, portn, BTXMAC_STAT_MSK_REG, val);
29813859Sml29623 
29823859Sml29623 		break;
29833859Sml29623 	case INIT:
29843859Sml29623 		ASSERT((iconfig & ~ICFG_XMAC_TX_ALL) == 0);
29853859Sml29623 		if ((iconfig & ~ICFG_XMAC_TX_ALL) != 0) {
29863859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2987*6929Smisaki 			    " npi_bmac_tx_iconfig"
2988*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
2989*6929Smisaki 			    iconfig));
29903859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
29913859Sml29623 		}
29923859Sml29623 		BMAC_REG_WR(handle, portn, BTXMAC_STAT_MSK_REG, ~iconfig);
29933859Sml29623 
29943859Sml29623 		break;
29953859Sml29623 	default:
29963859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2997*6929Smisaki 		    " npi_bmac_tx_iconfig"
2998*6929Smisaki 		    " Invalid Input: iconfig <0x%x>",
2999*6929Smisaki 		    iconfig));
30003859Sml29623 		return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
30013859Sml29623 	}
30023859Sml29623 
30033859Sml29623 	return (NPI_SUCCESS);
30043859Sml29623 }
30053859Sml29623 
30063859Sml29623 npi_status_t
npi_bmac_ctl_iconfig(npi_handle_t handle,config_op_t op,uint8_t portn,bmac_ctl_iconfig_t iconfig)30073859Sml29623 npi_bmac_ctl_iconfig(npi_handle_t handle, config_op_t op, uint8_t portn,
30083859Sml29623 			bmac_ctl_iconfig_t iconfig)
30093859Sml29623 {
30103859Sml29623 	uint64_t val = 0;
30113859Sml29623 
30123859Sml29623 	ASSERT(IS_BMAC_PORT_NUM_VALID(portn));
30133859Sml29623 
30143859Sml29623 	switch (op) {
30153859Sml29623 	case ENABLE:
30163859Sml29623 	case DISABLE:
30173859Sml29623 		ASSERT((iconfig != 0) && ((iconfig & ~ICFG_BMAC_CTL_ALL) == 0));
30183859Sml29623 		if ((iconfig == 0) || (iconfig & ~ICFG_BMAC_CTL_ALL) != 0) {
30193859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
3020*6929Smisaki 			    " npi_bmac_ctl_iconfig"
3021*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
3022*6929Smisaki 			    iconfig));
30233859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
30243859Sml29623 		}
30253859Sml29623 		BMAC_REG_RD(handle, portn, BMAC_C_S_MSK_REG, &val);
30263859Sml29623 		if (op == ENABLE)
30273859Sml29623 			val &= ~iconfig;
30283859Sml29623 		else
30293859Sml29623 			val |= iconfig;
30303859Sml29623 		BMAC_REG_WR(handle, portn, BMAC_C_S_MSK_REG, val);
30313859Sml29623 
30323859Sml29623 		break;
30333859Sml29623 	case INIT:
30343859Sml29623 		ASSERT((iconfig & ~ICFG_BMAC_RX_ALL) == 0);
30353859Sml29623 		if ((iconfig & ~ICFG_BMAC_RX_ALL) != 0) {
30363859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
3037*6929Smisaki 			    " npi_bmac_ctl_iconfig"
3038*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
3039*6929Smisaki 			    iconfig));
30403859Sml29623 			return (NPI_FAILURE | NPI_MAC_CONFIG_INVALID(portn));
30413859Sml29623 		}
30423859Sml29623 		BMAC_REG_WR(handle, portn, BMAC_C_S_MSK_REG, ~iconfig);
30433859Sml29623 
30443859Sml29623 		break;
30453859Sml29623 	default:
30463859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
3047*6929Smisaki 		    " npi_bmac_ctl_iconfig"
3048*6929Smisaki 		    " Invalid Input: iconfig <0x%x>",
3049*6929Smisaki 		    iconfig));
30503859Sml29623 		return (NPI_FAILURE | NPI_MAC_OPCODE_INVALID(portn));
30513859Sml29623 	}
30523859Sml29623 
30533859Sml29623 	return (NPI_SUCCESS);
30543859Sml29623 }
30553859Sml29623 
30563859Sml29623 npi_status_t
npi_bmac_tx_get_istatus(npi_handle_t handle,uint8_t portn,bmac_tx_iconfig_t * istatus)30573859Sml29623 npi_bmac_tx_get_istatus(npi_handle_t handle, uint8_t portn,
30583859Sml29623 			bmac_tx_iconfig_t *istatus)
30593859Sml29623 {
30603859Sml29623 	uint64_t val = 0;
30613859Sml29623 
30623859Sml29623 	ASSERT(IS_BMAC_PORT_NUM_VALID(portn));
30633859Sml29623 
30643859Sml29623 	BMAC_REG_RD(handle, portn, BTXMAC_STATUS_REG, &val);
30653859Sml29623 	*istatus = (uint32_t)val;
30663859Sml29623 
30673859Sml29623 	return (NPI_SUCCESS);
30683859Sml29623 }
30693859Sml29623 
30703859Sml29623 npi_status_t
npi_bmac_rx_get_istatus(npi_handle_t handle,uint8_t portn,bmac_rx_iconfig_t * istatus)30713859Sml29623 npi_bmac_rx_get_istatus(npi_handle_t handle, uint8_t portn,
30723859Sml29623 			bmac_rx_iconfig_t *istatus)
30733859Sml29623 {
30743859Sml29623 	uint64_t val = 0;
30753859Sml29623 
30763859Sml29623 	ASSERT(IS_BMAC_PORT_NUM_VALID(portn));
30773859Sml29623 
30783859Sml29623 	BMAC_REG_RD(handle, portn, BRXMAC_STATUS_REG, &val);
30793859Sml29623 	*istatus = (uint32_t)val;
30803859Sml29623 
30813859Sml29623 	return (NPI_SUCCESS);
30823859Sml29623 }
30833859Sml29623 
30843859Sml29623 npi_status_t
npi_bmac_ctl_get_istatus(npi_handle_t handle,uint8_t portn,bmac_ctl_iconfig_t * istatus)30853859Sml29623 npi_bmac_ctl_get_istatus(npi_handle_t handle, uint8_t portn,
30863859Sml29623 				bmac_ctl_iconfig_t *istatus)
30873859Sml29623 {
30883859Sml29623 	uint64_t val = 0;
30893859Sml29623 
30903859Sml29623 	ASSERT(IS_BMAC_PORT_NUM_VALID(portn));
30913859Sml29623 
30923859Sml29623 	BMAC_REG_RD(handle, portn, BMAC_CTRL_STAT_REG, &val);
30933859Sml29623 	*istatus = (uint32_t)val;
30943859Sml29623 
30953859Sml29623 	return (NPI_SUCCESS);
30963859Sml29623 }
30973859Sml29623 
30983859Sml29623 npi_status_t
npi_mac_mif_mdio_read(npi_handle_t handle,uint8_t portn,uint8_t device,uint16_t xcvr_reg,uint16_t * value)30993859Sml29623 npi_mac_mif_mdio_read(npi_handle_t handle, uint8_t portn, uint8_t device,
31003859Sml29623 			uint16_t xcvr_reg, uint16_t *value)
31013859Sml29623 {
31023859Sml29623 	mif_frame_t frame;
31033859Sml29623 	uint_t delay;
31043859Sml29623 
31053859Sml29623 	frame.value = 0;
31063859Sml29623 	frame.bits.w0.st = FRAME45_ST;		/* Clause 45	*/
31073859Sml29623 	frame.bits.w0.op = FRAME45_OP_ADDR;	/* Select address	*/
31083859Sml29623 	frame.bits.w0.phyad = portn;		/* Port number	*/
31093859Sml29623 	frame.bits.w0.regad = device;		/* Device number	*/
31103859Sml29623 	frame.bits.w0.ta_msb = 1;
31113859Sml29623 	frame.bits.w0.ta_lsb = 0;
31123859Sml29623 	frame.bits.w0.data = xcvr_reg;	/* register address */
31133859Sml29623 
31143859Sml29623 	NPI_DEBUG_MSG((handle.function, MIF_CTL,
3115*6929Smisaki 	    "mdio read port %d addr val=0x%x\n", portn, frame.value));
31163859Sml29623 
31173859Sml29623 	MIF_REG_WR(handle, MIF_OUTPUT_FRAME_REG, frame.value);
31183859Sml29623 
31193859Sml29623 	delay = 0;
31203859Sml29623 	MIF_WAIT_REG(handle, frame, delay, MIF_DELAY, MIF_DELAY);
31213859Sml29623 
31223859Sml29623 	NPI_DEBUG_MSG((handle.function, MIF_CTL,
3123*6929Smisaki 	    "mdio read port %d addr poll=0x%x\n", portn, frame.value));
31243859Sml29623 
31253859Sml29623 	if (delay == MIF_DELAY) {
31263859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
3127*6929Smisaki 		    "mdio read no response1\n"));
31283859Sml29623 	}
31293859Sml29623 
31303859Sml29623 	frame.bits.w0.st = FRAME45_ST; /* Clause 45 */
31313859Sml29623 	frame.bits.w0.op = FRAME45_OP_READ; /* Read */
31323859Sml29623 	frame.bits.w0.phyad = portn; /* Port Number */
31333859Sml29623 	frame.bits.w0.regad = device; /* Device Number */
31343859Sml29623 	frame.bits.w0.ta_msb = 1;
31353859Sml29623 	frame.bits.w0.ta_lsb = 0;
31363859Sml29623 
31373859Sml29623 	NPI_DEBUG_MSG((handle.function, MIF_CTL,
3138*6929Smisaki 	    "mdio read port %d data frame=0x%x\n", portn, frame.value));
31393859Sml29623 
31403859Sml29623 	MIF_REG_WR(handle, MIF_OUTPUT_FRAME_REG, frame.value);
31413859Sml29623 
31423859Sml29623 	delay = 0;
31433859Sml29623 	MIF_WAIT_REG(handle, frame, delay, MIF_DELAY, MIF_DELAY);
31443859Sml29623 
31453859Sml29623 	NPI_DEBUG_MSG((handle.function, MIF_CTL,
3146*6929Smisaki 	    "mdio read port %d data poll=0x%x\n", portn, frame.value));
31473859Sml29623 
31483859Sml29623 	*value = frame.bits.w0.data;
31493859Sml29623 	NPI_DEBUG_MSG((handle.function, MIF_CTL,
3150*6929Smisaki 	    "mdio read port=%d val=0x%x\n", portn, *value));
31513859Sml29623 
31523859Sml29623 	if (delay == MIF_DELAY) {
31533859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
3154*6929Smisaki 		    "mdio read no response2\n"));
31553859Sml29623 	}
31563859Sml29623 
31573859Sml29623 	return (NPI_SUCCESS);
31583859Sml29623 }
31593859Sml29623 
31603859Sml29623 npi_status_t
npi_mac_mif_mii_read(npi_handle_t handle,uint8_t portn,uint8_t xcvr_reg,uint16_t * value)31613859Sml29623 npi_mac_mif_mii_read(npi_handle_t handle, uint8_t portn, uint8_t xcvr_reg,
31623859Sml29623 			uint16_t *value)
31633859Sml29623 {
31643859Sml29623 	mif_frame_t frame;
31653859Sml29623 	uint_t delay;
31663859Sml29623 
31673859Sml29623 	frame.bits.w0.st = 0x1; /* Clause 22 */
31683859Sml29623 	frame.bits.w0.op = 0x2;
31693859Sml29623 	frame.bits.w0.phyad = portn;
31703859Sml29623 	frame.bits.w0.regad = xcvr_reg;
31713859Sml29623 	frame.bits.w0.ta_msb = 1;
31723859Sml29623 	frame.bits.w0.ta_lsb = 0;
31733859Sml29623 	MIF_REG_WR(handle, MIF_OUTPUT_FRAME_REG, frame.value);
31743859Sml29623 
31753859Sml29623 	delay = 0;
31763859Sml29623 	MIF_WAIT_REG(handle, frame, delay, MIF_DELAY, MAX_PIO_RETRIES);
31773859Sml29623 
31783859Sml29623 	if (delay == MAX_PIO_RETRIES)
31793859Sml29623 		return (NPI_FAILURE | NPI_MAC_MII_READ_FAILED(portn));
31803859Sml29623 
31813859Sml29623 	*value = frame.bits.w0.data;
31823859Sml29623 	NPI_DEBUG_MSG((handle.function, MIF_CTL,
3183*6929Smisaki 	    "mif mii read port %d reg=0x%x frame=0x%x\n", portn,
3184*6929Smisaki 	    xcvr_reg, frame.bits.w0.data));
31853859Sml29623 
31863859Sml29623 	return (NPI_SUCCESS);
31873859Sml29623 }
31883859Sml29623 
31893859Sml29623 npi_status_t
npi_mac_mif_mdio_write(npi_handle_t handle,uint8_t portn,uint8_t device,uint16_t xcvr_reg,uint16_t value)31903859Sml29623 npi_mac_mif_mdio_write(npi_handle_t handle, uint8_t portn, uint8_t device,
31913859Sml29623 			uint16_t xcvr_reg, uint16_t value)
31923859Sml29623 {
31933859Sml29623 	mif_frame_t frame;
31943859Sml29623 	uint_t delay;
31953859Sml29623 
31963859Sml29623 	frame.value = 0;
31973859Sml29623 	frame.bits.w0.st = FRAME45_ST; /* Clause 45 */
31983859Sml29623 	frame.bits.w0.op = FRAME45_OP_ADDR; /* Select Address */
31993859Sml29623 	frame.bits.w0.phyad = portn; /* Port Number */
32003859Sml29623 	frame.bits.w0.regad = device; /* Device Number */
32013859Sml29623 	frame.bits.w0.ta_msb = 1;
32023859Sml29623 	frame.bits.w0.ta_lsb = 0;
32033859Sml29623 	frame.bits.w0.data = xcvr_reg;	/* register address */
32043859Sml29623 
32053859Sml29623 	MIF_REG_WR(handle, MIF_OUTPUT_FRAME_REG, frame.value);
32063859Sml29623 
32073859Sml29623 	NPI_DEBUG_MSG((handle.function, MIF_CTL,
3208*6929Smisaki 	    "mdio write port %d addr val=0x%x\n", portn, frame.value));
32093859Sml29623 
32103859Sml29623 	delay = 0;
32113859Sml29623 	MIF_WAIT_REG(handle, frame, delay, MIF_DELAY, MIF_DELAY);
32123859Sml29623 
32133859Sml29623 	NPI_DEBUG_MSG((handle.function, MIF_CTL,
3214*6929Smisaki 	    "mdio write port %d addr poll=0x%x\n", portn, frame.value));
32153859Sml29623 
32163859Sml29623 	if (delay == MIF_DELAY) {
32173859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
3218*6929Smisaki 		    "mdio write no response1\n"));
32193859Sml29623 	}
32203859Sml29623 
32213859Sml29623 	frame.bits.w0.st = FRAME45_ST; /* Clause 45 */
32223859Sml29623 	frame.bits.w0.op = FRAME45_OP_WRITE; /* Write */
32233859Sml29623 	frame.bits.w0.phyad = portn; /* Port number   */
32243859Sml29623 	frame.bits.w0.regad = device; /* Device number */
32253859Sml29623 	frame.bits.w0.ta_msb = 1;
32263859Sml29623 	frame.bits.w0.ta_lsb = 0;
32273859Sml29623 	frame.bits.w0.data = value;
32283859Sml29623 	MIF_REG_WR(handle, MIF_OUTPUT_FRAME_REG, frame.value);
32293859Sml29623 
32303859Sml29623 	NPI_DEBUG_MSG((handle.function, MIF_CTL,
3231*6929Smisaki 	    "mdio write port %d data val=0x%x\n", portn, frame.value));
32323859Sml29623 
32333859Sml29623 	delay = 0;
32343859Sml29623 	MIF_WAIT_REG(handle, frame, delay, MIF_DELAY, MIF_DELAY);
32353859Sml29623 
32363859Sml29623 	NPI_DEBUG_MSG((handle.function, MIF_CTL,
3237*6929Smisaki 	    "mdio write port %d data poll=0x%x\n", portn, frame.value));
32383859Sml29623 
32393859Sml29623 	if (delay == MIF_DELAY) {
32403859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
3241*6929Smisaki 		    "mdio write no response2\n"));
32423859Sml29623 	}
32433859Sml29623 
32443859Sml29623 	return (NPI_SUCCESS);
32453859Sml29623 }
32463859Sml29623 
32473859Sml29623 npi_status_t
npi_mac_mif_mii_write(npi_handle_t handle,uint8_t portn,uint8_t xcvr_reg,uint16_t value)32483859Sml29623 npi_mac_mif_mii_write(npi_handle_t handle, uint8_t portn, uint8_t xcvr_reg,
32493859Sml29623 			uint16_t value)
32503859Sml29623 {
32513859Sml29623 	mif_frame_t frame;
32523859Sml29623 	uint_t delay;
32533859Sml29623 
32543859Sml29623 	frame.bits.w0.st = 0x1; /* Clause 22 */
32553859Sml29623 	frame.bits.w0.op = 0x1;
32563859Sml29623 	frame.bits.w0.phyad = portn;
32573859Sml29623 	frame.bits.w0.regad = xcvr_reg;
32583859Sml29623 	frame.bits.w0.ta_msb = 1;
32593859Sml29623 	frame.bits.w0.ta_lsb = 0;
32603859Sml29623 	frame.bits.w0.data = value;
32613859Sml29623 	MIF_REG_WR(handle, MIF_OUTPUT_FRAME_REG, frame.value);
32623859Sml29623 
32633859Sml29623 	delay = 0;
32643859Sml29623 	MIF_WAIT_REG(handle, frame, delay, MIF_DELAY, MAX_PIO_RETRIES);
32653859Sml29623 
32663859Sml29623 	NPI_DEBUG_MSG((handle.function, MIF_CTL,
3267*6929Smisaki 	    "mif mii write port %d reg=0x%x frame=0x%x\n", portn,
3268*6929Smisaki 	    xcvr_reg, frame.value));
32693859Sml29623 
32703859Sml29623 	if (delay == MAX_PIO_RETRIES)
32713859Sml29623 		return (NPI_FAILURE | NPI_MAC_MII_WRITE_FAILED(portn));
32723859Sml29623 
32733859Sml29623 	return (NPI_SUCCESS);
32743859Sml29623 }
32753859Sml29623 
32763859Sml29623 npi_status_t
npi_mac_pcs_mii_read(npi_handle_t handle,uint8_t portn,uint8_t xcvr_reg,uint16_t * value)32773859Sml29623 npi_mac_pcs_mii_read(npi_handle_t handle, uint8_t portn, uint8_t xcvr_reg,
32783859Sml29623 			uint16_t *value)
32793859Sml29623 {
32803859Sml29623 	pcs_anar_t pcs_anar;
32813859Sml29623 	pcs_anar_t pcs_anlpar;
32823859Sml29623 	pcs_stat_t pcs_stat;
32833859Sml29623 	pcs_stat_mc_t pcs_stat_mc;
32843859Sml29623 	mii_anar_t anar;
32853859Sml29623 	mii_anar_t anlpar;
32863859Sml29623 	mii_aner_t aner;
32873859Sml29623 	mii_esr_t esr;
32883859Sml29623 	mii_gsr_t gsr;
32893859Sml29623 	uint64_t val = 0;
32903859Sml29623 
32913859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
32923859Sml29623 
32933859Sml29623 	switch (xcvr_reg) {
32945203Ssbehera 	case MII_CONTROL:
32953859Sml29623 		PCS_REG_RD(handle, portn, PCS_MII_CTRL_REG, &val);
32963859Sml29623 		*value = (uint16_t)val;
32973859Sml29623 		break;
32985203Ssbehera 	case MII_STATUS:
32993859Sml29623 		PCS_REG_RD(handle, portn, PCS_MII_STATUS_REG, &val);
33003859Sml29623 		pcs_stat.value = val;
33013859Sml29623 		PCS_REG_RD(handle, portn, PCS_STATE_MACHINE_REG, &val);
33023859Sml29623 		pcs_stat_mc.value = val;
33033859Sml29623 		if ((pcs_stat_mc.bits.w0.link_cfg_stat == 0xB) &&
3304*6929Smisaki 		    (pcs_stat_mc.bits.w0.word_sync != 0)) {
33053859Sml29623 			pcs_stat.bits.w0.link_stat = 1;
33063859Sml29623 		} else if (pcs_stat_mc.bits.w0.link_cfg_stat != 0xB) {
33073859Sml29623 			pcs_stat.bits.w0.link_stat = 0;
33083859Sml29623 		}
33093859Sml29623 		*value = (uint16_t)pcs_stat.value;
33103859Sml29623 		break;
33115203Ssbehera 	case NXGE_MII_ESR:
33123859Sml29623 		PCS_REG_RD(handle, portn, PCS_MII_ADVERT_REG, &val);
33133859Sml29623 		pcs_anar.value = (uint16_t)val;
33143859Sml29623 		esr.value = 0;
33153859Sml29623 		esr.bits.link_1000fdx = pcs_anar.bits.w0.full_duplex;
33163859Sml29623 		esr.bits.link_1000hdx = pcs_anar.bits.w0.half_duplex;
33173859Sml29623 		*value = esr.value;
33183859Sml29623 		break;
33195203Ssbehera 	case MII_AN_ADVERT:
33203859Sml29623 		PCS_REG_RD(handle, portn, PCS_MII_ADVERT_REG, &val);
33213859Sml29623 		pcs_anar.value = (uint16_t)val;
33223859Sml29623 		anar.value = 0;
33233859Sml29623 		anar.bits.cap_pause = pcs_anar.bits.w0.pause;
33243859Sml29623 		anar.bits.cap_asmpause = pcs_anar.bits.w0.asm_pause;
33253859Sml29623 		*value = anar.value;
33263859Sml29623 		break;
33275203Ssbehera 	case MII_AN_LPABLE:
33283859Sml29623 		PCS_REG_RD(handle, portn, PCS_MII_LPA_REG, &val);
33293859Sml29623 		pcs_anlpar.value = (uint16_t)val;
33303859Sml29623 		anlpar.bits.cap_pause = pcs_anlpar.bits.w0.pause;
33313859Sml29623 		anlpar.bits.cap_asmpause = pcs_anlpar.bits.w0.asm_pause;
33323859Sml29623 		*value = anlpar.value;
33333859Sml29623 		break;
33345203Ssbehera 	case MII_AN_EXPANSION:
33353859Sml29623 		PCS_REG_RD(handle, portn, PCS_MII_ADVERT_REG, &val);
33363859Sml29623 		pcs_anar.value = (uint16_t)val;
33373859Sml29623 		aner.value = 0;
33383859Sml29623 		aner.bits.lp_an_able = pcs_anar.bits.w0.full_duplex |
3339*6929Smisaki 		    pcs_anar.bits.w0.half_duplex;
33403859Sml29623 		*value = aner.value;
33413859Sml29623 		break;
33425203Ssbehera 	case NXGE_MII_GSR:
33433859Sml29623 		PCS_REG_RD(handle, portn, PCS_MII_LPA_REG, &val);
33443859Sml29623 		pcs_anar.value = (uint16_t)val;
33453859Sml29623 		gsr.value = 0;
33463859Sml29623 		gsr.bits.link_1000fdx = pcs_anar.bits.w0.full_duplex;
33473859Sml29623 		gsr.bits.link_1000hdx = pcs_anar.bits.w0.half_duplex;
33483859Sml29623 		*value = gsr.value;
33493859Sml29623 		break;
33503859Sml29623 	default:
33513859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
3352*6929Smisaki 		    " npi_mac_pcs_mii_read"
3353*6929Smisaki 		    " Invalid Input: xcvr_reg <0x%x>",
3354*6929Smisaki 		    xcvr_reg));
33553859Sml29623 		return (NPI_FAILURE | NPI_MAC_REG_INVALID(portn));
33563859Sml29623 	}
33573859Sml29623 
33583859Sml29623 	return (NPI_SUCCESS);
33593859Sml29623 }
33603859Sml29623 
33613859Sml29623 npi_status_t
npi_mac_pcs_mii_write(npi_handle_t handle,uint8_t portn,uint8_t xcvr_reg,uint16_t value)33623859Sml29623 npi_mac_pcs_mii_write(npi_handle_t handle, uint8_t portn, uint8_t xcvr_reg,
33633859Sml29623 			uint16_t value)
33643859Sml29623 {
33653859Sml29623 	pcs_anar_t pcs_anar;
33663859Sml29623 	mii_anar_t anar;
33673859Sml29623 	mii_gcr_t gcr;
33683859Sml29623 	uint64_t val;
33693859Sml29623 
33703859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
33713859Sml29623 
33723859Sml29623 	switch (xcvr_reg) {
33735203Ssbehera 	case MII_CONTROL:
33743859Sml29623 		val = (uint16_t)value;
33753859Sml29623 		PCS_REG_WR(handle, portn, PCS_MII_CTRL_REG, val);
33763859Sml29623 		break;
33775203Ssbehera 	case MII_AN_ADVERT:
33783859Sml29623 		PCS_REG_RD(handle, portn, PCS_MII_ADVERT_REG, &val);
33793859Sml29623 		pcs_anar.value = (uint16_t)val;
33803859Sml29623 		anar.value = value;
33813859Sml29623 		pcs_anar.bits.w0.asm_pause = anar.bits.cap_asmpause;
33823859Sml29623 		pcs_anar.bits.w0.pause = anar.bits.cap_pause;
33833859Sml29623 		val = pcs_anar.value;
33843859Sml29623 		PCS_REG_WR(handle, portn, PCS_MII_ADVERT_REG, val);
33853859Sml29623 		break;
33865203Ssbehera 	case NXGE_MII_GCR:
33873859Sml29623 		PCS_REG_RD(handle, portn, PCS_MII_ADVERT_REG, &val);
33883859Sml29623 		pcs_anar.value = (uint16_t)val;
33893859Sml29623 		gcr.value = value;
33903859Sml29623 		pcs_anar.bits.w0.full_duplex = gcr.bits.link_1000fdx;
33913859Sml29623 		pcs_anar.bits.w0.half_duplex = gcr.bits.link_1000hdx;
33923859Sml29623 		val = pcs_anar.value;
33933859Sml29623 		PCS_REG_WR(handle, portn, PCS_MII_ADVERT_REG, val);
33943859Sml29623 		break;
33953859Sml29623 	default:
33963859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
3397*6929Smisaki 		    " npi_mac_pcs_mii_write"
3398*6929Smisaki 		    " Invalid Input: xcvr_reg <0x%x>",
3399*6929Smisaki 		    xcvr_reg));
34003859Sml29623 		return (NPI_FAILURE | NPI_MAC_REG_INVALID(portn));
34013859Sml29623 	}
34023859Sml29623 
34033859Sml29623 	return (NPI_SUCCESS);
34043859Sml29623 }
34053859Sml29623 
34063859Sml29623 npi_status_t
npi_mac_mif_link_intr_enable(npi_handle_t handle,uint8_t portn,uint8_t xcvr_reg,uint16_t mask)34073859Sml29623 npi_mac_mif_link_intr_enable(npi_handle_t handle, uint8_t portn,
34083859Sml29623 				uint8_t xcvr_reg, uint16_t mask)
34093859Sml29623 {
34103859Sml29623 	mif_cfg_t mif_cfg;
34113859Sml29623 
34123859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
34133859Sml29623 
34143859Sml29623 	ASSERT(xcvr_reg <= NXGE_MAX_MII_REGS);
34153859Sml29623 	if (xcvr_reg > NXGE_MAX_MII_REGS) {
34163859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
3417*6929Smisaki 		    " npi_mac_mif_link_intr_enable"
3418*6929Smisaki 		    " Invalid Input: xcvr_reg <0x%x>",
3419*6929Smisaki 		    xcvr_reg));
34203859Sml29623 		return (NPI_FAILURE | NPI_MAC_REG_INVALID(portn));
34213859Sml29623 	}
34223859Sml29623 
34233859Sml29623 	MIF_REG_RD(handle, MIF_CONFIG_REG, &mif_cfg.value);
34243859Sml29623 
34253859Sml29623 	mif_cfg.bits.w0.phy_addr = portn;		/* Port number */
34263859Sml29623 	mif_cfg.bits.w0.reg_addr = xcvr_reg;		/* Register address */
34273859Sml29623 	mif_cfg.bits.w0.indirect_md = 0; 		/* Clause 22 */
34283859Sml29623 	mif_cfg.bits.w0.poll_en = 1;
34293859Sml29623 
34303859Sml29623 	MIF_REG_WR(handle, MIF_MASK_REG, ~mask);
34313859Sml29623 	MIF_REG_WR(handle, MIF_CONFIG_REG, mif_cfg.value);
34323859Sml29623 
34333859Sml29623 	NXGE_DELAY(20);
34343859Sml29623 
34353859Sml29623 	return (NPI_SUCCESS);
34363859Sml29623 }
34373859Sml29623 
34383859Sml29623 npi_status_t
npi_mac_mif_mdio_link_intr_enable(npi_handle_t handle,uint8_t portn,uint8_t device,uint16_t xcvr_reg,uint16_t mask)34393859Sml29623 npi_mac_mif_mdio_link_intr_enable(npi_handle_t handle, uint8_t portn,
34403859Sml29623 			uint8_t device, uint16_t xcvr_reg, uint16_t mask)
34413859Sml29623 {
34423859Sml29623 	mif_cfg_t mif_cfg;
34433859Sml29623 	mif_frame_t frame;
34443859Sml29623 	uint_t delay;
34453859Sml29623 
34463859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
34473859Sml29623 
34483859Sml29623 	frame.bits.w0.st = 0;		/* Clause 45 */
34493859Sml29623 	frame.bits.w0.op = 0;		/* Select address */
34503859Sml29623 	frame.bits.w0.phyad = portn;	/* Port number */
34513859Sml29623 	frame.bits.w0.regad = device;	/* Device number */
34523859Sml29623 	frame.bits.w0.ta_msb = 1;
34533859Sml29623 	frame.bits.w0.ta_lsb = 0;
34543859Sml29623 	frame.bits.w0.data = xcvr_reg;	/* register address */
34553859Sml29623 
34563859Sml29623 	MIF_REG_WR(handle, MIF_OUTPUT_FRAME_REG, frame.value);
34573859Sml29623 
34583859Sml29623 	delay = 0;
34593859Sml29623 	MIF_WAIT_REG(handle, frame, delay, MIF_DELAY, MAX_PIO_RETRIES);
34603859Sml29623 	if (delay == MAX_PIO_RETRIES)
34613859Sml29623 		return (NPI_FAILURE);
34623859Sml29623 
34633859Sml29623 	MIF_REG_RD(handle, MIF_CONFIG_REG, &mif_cfg.value);
34643859Sml29623 
34653859Sml29623 	mif_cfg.bits.w0.phy_addr = portn;		/* Port number */
34663859Sml29623 	mif_cfg.bits.w0.reg_addr = device;		/* Register address */
34673859Sml29623 	mif_cfg.bits.w0.indirect_md = 1; 		/* Clause 45 */
34683859Sml29623 	mif_cfg.bits.w0.poll_en = 1;
34693859Sml29623 
34703859Sml29623 	MIF_REG_WR(handle, MIF_MASK_REG, ~mask);
34713859Sml29623 	MIF_REG_WR(handle, MIF_CONFIG_REG, mif_cfg.value);
34723859Sml29623 
34733859Sml29623 	NXGE_DELAY(20);
34743859Sml29623 
34753859Sml29623 	return (NPI_SUCCESS);
34763859Sml29623 }
34773859Sml29623 
34783859Sml29623 void
npi_mac_mif_set_indirect_mode(npi_handle_t handle,boolean_t on_off)34793859Sml29623 npi_mac_mif_set_indirect_mode(npi_handle_t handle, boolean_t on_off)
34803859Sml29623 {
34813859Sml29623 	mif_cfg_t mif_cfg;
34823859Sml29623 
34833859Sml29623 	MIF_REG_RD(handle, MIF_CONFIG_REG, &mif_cfg.value);
34843859Sml29623 	mif_cfg.bits.w0.indirect_md = on_off;
34853859Sml29623 	MIF_REG_WR(handle, MIF_CONFIG_REG, mif_cfg.value);
34863859Sml29623 }
34873859Sml29623 
34885196Ssbehera void
npi_mac_mif_set_atca_mode(npi_handle_t handle,boolean_t on_off)34895196Ssbehera npi_mac_mif_set_atca_mode(npi_handle_t handle, boolean_t on_off)
34905196Ssbehera {
34915196Ssbehera 	mif_cfg_t mif_cfg;
34925196Ssbehera 
34935196Ssbehera 	MIF_REG_RD(handle, MIF_CONFIG_REG, &mif_cfg.value);
34945196Ssbehera 	mif_cfg.bits.w0.atca_ge = on_off;
34955196Ssbehera 	MIF_REG_WR(handle, MIF_CONFIG_REG, mif_cfg.value);
34965196Ssbehera }
34975196Ssbehera 
34983859Sml29623 npi_status_t
npi_bmac_send_pause(npi_handle_t handle,uint8_t portn,uint16_t pause_time)34993859Sml29623 npi_bmac_send_pause(npi_handle_t handle, uint8_t portn, uint16_t pause_time)
35003859Sml29623 {
35013859Sml29623 	uint64_t val;
35023859Sml29623 
35033859Sml29623 	ASSERT(IS_BMAC_PORT_NUM_VALID(portn));
35043859Sml29623 
35053859Sml29623 	val = MAC_SEND_PAUSE_SEND | pause_time;
35063859Sml29623 	BMAC_REG_WR(handle, portn, MAC_SEND_PAUSE_REG, val);
35073859Sml29623 
35083859Sml29623 	return (NPI_SUCCESS);
35093859Sml29623 }
35103859Sml29623 
35113859Sml29623 npi_status_t
npi_xmac_xif_led(npi_handle_t handle,uint8_t portn,boolean_t on_off)35123859Sml29623 npi_xmac_xif_led(npi_handle_t handle, uint8_t portn, boolean_t on_off)
35133859Sml29623 {
35143859Sml29623 	uint64_t val = 0;
35153859Sml29623 
35163859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
35173859Sml29623 
35183859Sml29623 	XMAC_REG_RD(handle, portn, XMAC_CONFIG_REG, &val);
35193859Sml29623 
35203859Sml29623 	if (on_off) {
35213859Sml29623 		val |= XMAC_XIF_LED_POLARITY;
35223859Sml29623 		val &= ~XMAC_XIF_FORCE_LED_ON;
35233859Sml29623 	} else {
35243859Sml29623 		val &= ~XMAC_XIF_LED_POLARITY;
35253859Sml29623 		val |= XMAC_XIF_FORCE_LED_ON;
35263859Sml29623 	}
35273859Sml29623 
35283859Sml29623 	XMAC_REG_WR(handle, portn, XMAC_CONFIG_REG, val);
35293859Sml29623 
35303859Sml29623 	return (NPI_SUCCESS);
35313859Sml29623 }
35323859Sml29623 
35333859Sml29623 npi_status_t
npi_xmac_zap_tx_counters(npi_handle_t handle,uint8_t portn)35343859Sml29623 npi_xmac_zap_tx_counters(npi_handle_t handle, uint8_t portn)
35353859Sml29623 {
35363859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
35373859Sml29623 
35383859Sml29623 	XMAC_REG_WR(handle, portn, XTXMAC_FRM_CNT_REG, 0);
35393859Sml29623 	XMAC_REG_WR(handle, portn, XTXMAC_BYTE_CNT_REG, 0);
35403859Sml29623 
35413859Sml29623 	return (NPI_SUCCESS);
35423859Sml29623 }
35433859Sml29623 
35443859Sml29623 npi_status_t
npi_xmac_zap_rx_counters(npi_handle_t handle,uint8_t portn)35453859Sml29623 npi_xmac_zap_rx_counters(npi_handle_t handle, uint8_t portn)
35463859Sml29623 {
35473859Sml29623 	ASSERT(IS_XMAC_PORT_NUM_VALID(portn));
35483859Sml29623 
35493859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_BT_CNT_REG, 0);
35503859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_BC_FRM_CNT_REG, 0);
35513859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_MC_FRM_CNT_REG, 0);
35523859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_FRAG_CNT_REG, 0);
35533859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_HIST_CNT1_REG, 0);
35543859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_HIST_CNT2_REG, 0);
35553859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_HIST_CNT3_REG, 0);
35563859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_HIST_CNT4_REG, 0);
35573859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_HIST_CNT5_REG, 0);
35583859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_HIST_CNT6_REG, 0);
35593859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_MPSZER_CNT_REG, 0);
35603859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_CRC_ER_CNT_REG, 0);
35613859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_CD_VIO_CNT_REG, 0);
35623859Sml29623 	XMAC_REG_WR(handle, portn, XRXMAC_AL_ER_CNT_REG, 0);
35633859Sml29623 	XMAC_REG_WR(handle, portn, XMAC_LINK_FLT_CNT_REG, 0);
35643859Sml29623 
35653859Sml29623 	return (NPI_SUCCESS);
35663859Sml29623 }
3567