xref: /onnv-gate/usr/src/uts/common/io/nxge/npi/npi_ipp.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 /*
22*6929Smisaki  * 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_ipp.h>
293859Sml29623 
303859Sml29623 uint64_t ipp_fzc_offset[] = {
313859Sml29623 		IPP_CONFIG_REG,
323859Sml29623 		IPP_DISCARD_PKT_CNT_REG,
335523Syc148097 		IPP_BAD_CKSUM_ERR_CNT_REG,
343859Sml29623 		IPP_ECC_ERR_COUNTER_REG,
353859Sml29623 		IPP_INT_STATUS_REG,
363859Sml29623 		IPP_INT_MASK_REG,
373859Sml29623 		IPP_PFIFO_RD_DATA0_REG,
383859Sml29623 		IPP_PFIFO_RD_DATA1_REG,
393859Sml29623 		IPP_PFIFO_RD_DATA2_REG,
403859Sml29623 		IPP_PFIFO_RD_DATA3_REG,
413859Sml29623 		IPP_PFIFO_RD_DATA4_REG,
423859Sml29623 		IPP_PFIFO_WR_DATA0_REG,
433859Sml29623 		IPP_PFIFO_WR_DATA1_REG,
443859Sml29623 		IPP_PFIFO_WR_DATA2_REG,
453859Sml29623 		IPP_PFIFO_WR_DATA3_REG,
463859Sml29623 		IPP_PFIFO_WR_DATA4_REG,
473859Sml29623 		IPP_PFIFO_RD_PTR_REG,
483859Sml29623 		IPP_PFIFO_WR_PTR_REG,
493859Sml29623 		IPP_DFIFO_RD_DATA0_REG,
503859Sml29623 		IPP_DFIFO_RD_DATA1_REG,
513859Sml29623 		IPP_DFIFO_RD_DATA2_REG,
523859Sml29623 		IPP_DFIFO_RD_DATA3_REG,
533859Sml29623 		IPP_DFIFO_RD_DATA4_REG,
543859Sml29623 		IPP_DFIFO_WR_DATA0_REG,
553859Sml29623 		IPP_DFIFO_WR_DATA1_REG,
563859Sml29623 		IPP_DFIFO_WR_DATA2_REG,
573859Sml29623 		IPP_DFIFO_WR_DATA3_REG,
583859Sml29623 		IPP_DFIFO_WR_DATA4_REG,
593859Sml29623 		IPP_DFIFO_RD_PTR_REG,
603859Sml29623 		IPP_DFIFO_WR_PTR_REG,
613859Sml29623 		IPP_STATE_MACHINE_REG,
623859Sml29623 		IPP_CKSUM_STATUS_REG,
633859Sml29623 		IPP_FFLP_CKSUM_INFO_REG,
643859Sml29623 		IPP_DEBUG_SELECT_REG,
653859Sml29623 		IPP_DFIFO_ECC_SYNDROME_REG,
663859Sml29623 		IPP_DFIFO_EOPM_RD_PTR_REG,
673859Sml29623 		IPP_ECC_CTRL_REG
683859Sml29623 };
693859Sml29623 
703859Sml29623 const char *ipp_fzc_name[] = {
713859Sml29623 		"IPP_CONFIG_REG",
723859Sml29623 		"IPP_DISCARD_PKT_CNT_REG",
735523Syc148097 		"IPP_BAD_CKSUM_ERR_CNT_REG",
743859Sml29623 		"IPP_ECC_ERR_COUNTER_REG",
753859Sml29623 		"IPP_INT_STATUS_REG",
763859Sml29623 		"IPP_INT_MASK_REG",
773859Sml29623 		"IPP_PFIFO_RD_DATA0_REG",
783859Sml29623 		"IPP_PFIFO_RD_DATA1_REG",
793859Sml29623 		"IPP_PFIFO_RD_DATA2_REG",
803859Sml29623 		"IPP_PFIFO_RD_DATA3_REG",
813859Sml29623 		"IPP_PFIFO_RD_DATA4_REG",
823859Sml29623 		"IPP_PFIFO_WR_DATA0_REG",
833859Sml29623 		"IPP_PFIFO_WR_DATA1_REG",
843859Sml29623 		"IPP_PFIFO_WR_DATA2_REG",
853859Sml29623 		"IPP_PFIFO_WR_DATA3_REG",
863859Sml29623 		"IPP_PFIFO_WR_DATA4_REG",
873859Sml29623 		"IPP_PFIFO_RD_PTR_REG",
883859Sml29623 		"IPP_PFIFO_WR_PTR_REG",
893859Sml29623 		"IPP_DFIFO_RD_DATA0_REG",
903859Sml29623 		"IPP_DFIFO_RD_DATA1_REG",
913859Sml29623 		"IPP_DFIFO_RD_DATA2_REG",
923859Sml29623 		"IPP_DFIFO_RD_DATA3_REG",
933859Sml29623 		"IPP_DFIFO_RD_DATA4_REG",
943859Sml29623 		"IPP_DFIFO_WR_DATA0_REG",
953859Sml29623 		"IPP_DFIFO_WR_DATA1_REG",
963859Sml29623 		"IPP_DFIFO_WR_DATA2_REG",
973859Sml29623 		"IPP_DFIFO_WR_DATA3_REG",
983859Sml29623 		"IPP_DFIFO_WR_DATA4_REG",
993859Sml29623 		"IPP_DFIFO_RD_PTR_REG",
1003859Sml29623 		"IPP_DFIFO_WR_PTR_REG",
1013859Sml29623 		"IPP_STATE_MACHINE_REG",
1023859Sml29623 		"IPP_CKSUM_STATUS_REG",
1033859Sml29623 		"IPP_FFLP_CKSUM_INFO_REG",
1043859Sml29623 		"IPP_DEBUG_SELECT_REG",
1053859Sml29623 		"IPP_DFIFO_ECC_SYNDROME_REG",
1063859Sml29623 		"IPP_DFIFO_EOPM_RD_PTR_REG",
1073859Sml29623 		"IPP_ECC_CTRL_REG",
1083859Sml29623 };
1093859Sml29623 
1103859Sml29623 npi_status_t
npi_ipp_dump_regs(npi_handle_t handle,uint8_t port)1113859Sml29623 npi_ipp_dump_regs(npi_handle_t handle, uint8_t port)
1123859Sml29623 {
1133859Sml29623 	uint64_t		value, offset;
1143859Sml29623 	int 			num_regs, i;
1153859Sml29623 
1163859Sml29623 	ASSERT(IS_PORT_NUM_VALID(port));
1173859Sml29623 
1183859Sml29623 	NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
119*6929Smisaki 	    "\nIPP PORT Register Dump for port %d\n", port));
1203859Sml29623 
1213859Sml29623 	num_regs = sizeof (ipp_fzc_offset) / sizeof (uint64_t);
1223859Sml29623 	for (i = 0; i < num_regs; i++) {
1233859Sml29623 		offset = IPP_REG_ADDR(port, ipp_fzc_offset[i]);
1245125Sjoycey #if defined(__i386)
1255125Sjoycey 		NXGE_REG_RD64(handle, (uint32_t)offset, &value);
1265125Sjoycey #else
1273859Sml29623 		NXGE_REG_RD64(handle, offset, &value);
1285125Sjoycey #endif
1293859Sml29623 		NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL, "0x%08llx "
130*6929Smisaki 		    "%s\t 0x%08llx \n",
131*6929Smisaki 		    offset, ipp_fzc_name[i], value));
1323859Sml29623 	}
1333859Sml29623 
1343859Sml29623 	NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
135*6929Smisaki 	    "\n IPP FZC Register Dump for port %d done\n", port));
1363859Sml29623 
1373859Sml29623 	return (NPI_SUCCESS);
1383859Sml29623 }
1393859Sml29623 
1403859Sml29623 void
npi_ipp_read_regs(npi_handle_t handle,uint8_t port)1413859Sml29623 npi_ipp_read_regs(npi_handle_t handle, uint8_t port)
1423859Sml29623 {
1433859Sml29623 	uint64_t		value, offset;
1443859Sml29623 	int 			num_regs, i;
1453859Sml29623 
1463859Sml29623 	ASSERT(IS_PORT_NUM_VALID(port));
1473859Sml29623 
1483859Sml29623 	NPI_DEBUG_MSG((handle.function, NPI_IPP_CTL,
149*6929Smisaki 	    "\nIPP PORT Register read (to clear) for port %d\n", port));
1503859Sml29623 
1513859Sml29623 	num_regs = sizeof (ipp_fzc_offset) / sizeof (uint64_t);
1523859Sml29623 	for (i = 0; i < num_regs; i++) {
1533859Sml29623 		offset = IPP_REG_ADDR(port, ipp_fzc_offset[i]);
1545125Sjoycey #if defined(__i386)
1555125Sjoycey 		NXGE_REG_RD64(handle, (uint32_t)offset, &value);
1565125Sjoycey #else
1573859Sml29623 		NXGE_REG_RD64(handle, offset, &value);
1585125Sjoycey #endif
1593859Sml29623 	}
1603859Sml29623 
1613859Sml29623 }
1623859Sml29623 
1633859Sml29623 /*
1643859Sml29623  * IPP Reset Routine
1653859Sml29623  */
1663859Sml29623 npi_status_t
npi_ipp_reset(npi_handle_t handle,uint8_t portn)1673859Sml29623 npi_ipp_reset(npi_handle_t handle, uint8_t portn)
1683859Sml29623 {
1693859Sml29623 	uint64_t val = 0;
1703859Sml29623 	uint32_t cnt = MAX_PIO_RETRIES;
1713859Sml29623 
1723859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
1733859Sml29623 
1743859Sml29623 	IPP_REG_RD(handle, portn, IPP_CONFIG_REG, &val);
1753859Sml29623 	val |= IPP_SOFT_RESET;
1763859Sml29623 	IPP_REG_WR(handle, portn, IPP_CONFIG_REG, val);
1773859Sml29623 
1783859Sml29623 	do {
1793859Sml29623 		NXGE_DELAY(IPP_RESET_WAIT);
1803859Sml29623 		IPP_REG_RD(handle, portn, IPP_CONFIG_REG, &val);
1813859Sml29623 		cnt--;
1823859Sml29623 	} while (((val & IPP_SOFT_RESET) != 0) && (cnt > 0));
1833859Sml29623 
1843859Sml29623 	if (cnt == 0) {
1853859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
186*6929Smisaki 		    " npi_ipp_reset"
187*6929Smisaki 		    " HW Error: IPP_RESET  <0x%x>", val));
1883859Sml29623 		return (NPI_FAILURE | NPI_IPP_RESET_FAILED(portn));
1893859Sml29623 	}
1903859Sml29623 
1913859Sml29623 	return (NPI_SUCCESS);
1923859Sml29623 }
1933859Sml29623 
1943859Sml29623 
1953859Sml29623 /*
1963859Sml29623  * IPP Configuration Routine
1973859Sml29623  */
1983859Sml29623 npi_status_t
npi_ipp_config(npi_handle_t handle,config_op_t op,uint8_t portn,ipp_config_t config)1993859Sml29623 npi_ipp_config(npi_handle_t handle, config_op_t op, uint8_t portn,
2003859Sml29623 		ipp_config_t config)
2013859Sml29623 {
2023859Sml29623 	uint64_t val = 0;
2033859Sml29623 
2043859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
2053859Sml29623 
2063859Sml29623 	switch (op) {
2073859Sml29623 
2083859Sml29623 	case ENABLE:
2093859Sml29623 	case DISABLE:
2103859Sml29623 		if ((config == 0) || ((config & ~CFG_IPP_ALL) != 0)) {
2113859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
212*6929Smisaki 			    " npi_ipp_config",
213*6929Smisaki 			    " Invalid Input config <0x%x>",
214*6929Smisaki 			    config));
2153859Sml29623 			return (NPI_FAILURE | NPI_IPP_CONFIG_INVALID(portn));
2163859Sml29623 		}
2173859Sml29623 
2183859Sml29623 		IPP_REG_RD(handle, portn, IPP_CONFIG_REG, &val);
2193859Sml29623 
2203859Sml29623 		if (op == ENABLE)
2213859Sml29623 			val |= config;
2223859Sml29623 		else
2233859Sml29623 			val &= ~config;
2243859Sml29623 		break;
2253859Sml29623 
2263859Sml29623 	case INIT:
2273859Sml29623 		if ((config & ~CFG_IPP_ALL) != 0) {
2283859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
229*6929Smisaki 			    " npi_ipp_config"
230*6929Smisaki 			    " Invalid Input config <0x%x>",
231*6929Smisaki 			    config));
2323859Sml29623 			return (NPI_FAILURE | NPI_IPP_CONFIG_INVALID(portn));
2333859Sml29623 		}
2343859Sml29623 		IPP_REG_RD(handle, portn, IPP_CONFIG_REG, &val);
2353859Sml29623 
2363859Sml29623 
2373859Sml29623 		val &= (IPP_IP_MAX_PKT_BYTES_MASK);
2383859Sml29623 		val |= config;
2393859Sml29623 		break;
2403859Sml29623 
2413859Sml29623 	default:
2423859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
243*6929Smisaki 		    " npi_ipp_config"
244*6929Smisaki 		    " Invalid Input op <0x%x>", op));
2453859Sml29623 		return (NPI_FAILURE | NPI_IPP_OPCODE_INVALID(portn));
2463859Sml29623 	}
2473859Sml29623 
2483859Sml29623 	IPP_REG_WR(handle, portn, IPP_CONFIG_REG, val);
2493859Sml29623 	return (NPI_SUCCESS);
2503859Sml29623 }
2513859Sml29623 
2523859Sml29623 npi_status_t
npi_ipp_set_max_pktsize(npi_handle_t handle,uint8_t portn,uint32_t bytes)2533859Sml29623 npi_ipp_set_max_pktsize(npi_handle_t handle, uint8_t portn, uint32_t bytes)
2543859Sml29623 {
2553859Sml29623 	uint64_t val = 0;
2563859Sml29623 
2573859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
2583859Sml29623 
2593859Sml29623 	if (bytes > IPP_IP_MAX_PKT_BYTES_MASK) {
2603859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
261*6929Smisaki 		    " npi_ipp_set_max_pktsize"
262*6929Smisaki 		    " Invalid Input Max bytes <0x%x>",
263*6929Smisaki 		    bytes));
2643859Sml29623 		return (NPI_FAILURE | NPI_IPP_MAX_PKT_BYTES_INVALID(portn));
2653859Sml29623 	}
2663859Sml29623 
2673859Sml29623 	IPP_REG_RD(handle, portn, IPP_CONFIG_REG, &val);
2683859Sml29623 	val &= ~(IPP_IP_MAX_PKT_BYTES_MASK << IPP_IP_MAX_PKT_BYTES_SHIFT);
2693859Sml29623 
2703859Sml29623 	val |= (bytes << IPP_IP_MAX_PKT_BYTES_SHIFT);
2713859Sml29623 	IPP_REG_WR(handle, portn, IPP_CONFIG_REG, val);
2723859Sml29623 
2733859Sml29623 	return (NPI_SUCCESS);
2743859Sml29623 }
2753859Sml29623 
2763859Sml29623 /*
2773859Sml29623  * IPP Interrupt Configuration Routine
2783859Sml29623  */
2793859Sml29623 npi_status_t
npi_ipp_iconfig(npi_handle_t handle,config_op_t op,uint8_t portn,ipp_iconfig_t iconfig)2803859Sml29623 npi_ipp_iconfig(npi_handle_t handle, config_op_t op, uint8_t portn,
2813859Sml29623 		ipp_iconfig_t iconfig)
2823859Sml29623 {
2833859Sml29623 	uint64_t val = 0;
2843859Sml29623 
2853859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
2863859Sml29623 
2873859Sml29623 	switch (op) {
2883859Sml29623 	case ENABLE:
2893859Sml29623 	case DISABLE:
2903859Sml29623 
2913859Sml29623 		if ((iconfig == 0) || ((iconfig & ~ICFG_IPP_ALL) != 0)) {
2923859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
293*6929Smisaki 			    " npi_ipp_iconfig"
294*6929Smisaki 			    " Invalid Input iconfig <0x%x>",
295*6929Smisaki 			    iconfig));
2963859Sml29623 			return (NPI_FAILURE | NPI_IPP_CONFIG_INVALID(portn));
2973859Sml29623 		}
2983859Sml29623 
2993859Sml29623 		IPP_REG_RD(handle, portn, IPP_INT_MASK_REG, &val);
3003859Sml29623 		if (op == ENABLE)
3013859Sml29623 			val &= ~iconfig;
3023859Sml29623 		else
3033859Sml29623 			val |= iconfig;
3043859Sml29623 		IPP_REG_WR(handle, portn, IPP_INT_MASK_REG, val);
3053859Sml29623 
3063859Sml29623 		break;
3073859Sml29623 	case INIT:
3083859Sml29623 
3093859Sml29623 		if ((iconfig & ~ICFG_IPP_ALL) != 0) {
3103859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
311*6929Smisaki 			    " npi_ipp_iconfig"
312*6929Smisaki 			    " Invalid Input iconfig <0x%x>",
313*6929Smisaki 			    iconfig));
3143859Sml29623 			return (NPI_FAILURE | NPI_IPP_CONFIG_INVALID(portn));
3153859Sml29623 		}
3163859Sml29623 		IPP_REG_WR(handle, portn, IPP_INT_MASK_REG, ~iconfig);
3173859Sml29623 
3183859Sml29623 		break;
3193859Sml29623 	default:
3203859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
321*6929Smisaki 		    " npi_ipp_iconfig"
322*6929Smisaki 		    " Invalid Input iconfig <0x%x>",
323*6929Smisaki 		    iconfig));
3243859Sml29623 		return (NPI_FAILURE | NPI_IPP_OPCODE_INVALID(portn));
3253859Sml29623 	}
3263859Sml29623 
3273859Sml29623 	return (NPI_SUCCESS);
3283859Sml29623 }
3293859Sml29623 
3303859Sml29623 npi_status_t
npi_ipp_get_status(npi_handle_t handle,uint8_t portn,ipp_status_t * status)3313859Sml29623 npi_ipp_get_status(npi_handle_t handle, uint8_t portn, ipp_status_t *status)
3323859Sml29623 {
3333859Sml29623 	uint64_t val;
3343859Sml29623 
3353859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
3363859Sml29623 
3373859Sml29623 	IPP_REG_RD(handle, portn, IPP_INT_STATUS_REG, &val);
3383859Sml29623 
3393859Sml29623 	status->value = val;
3403859Sml29623 	return (NPI_SUCCESS);
3413859Sml29623 }
3423859Sml29623 
3433859Sml29623 npi_status_t
npi_ipp_get_pfifo_rd_ptr(npi_handle_t handle,uint8_t portn,uint16_t * rd_ptr)3443859Sml29623 npi_ipp_get_pfifo_rd_ptr(npi_handle_t handle, uint8_t portn, uint16_t *rd_ptr)
3453859Sml29623 {
3463859Sml29623 	uint64_t value;
3473859Sml29623 
3483859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
3493859Sml29623 
3503859Sml29623 	IPP_REG_RD(handle, portn, IPP_PFIFO_RD_PTR_REG, &value);
3513859Sml29623 	*rd_ptr = value & 0xfff;
3523859Sml29623 	return (NPI_SUCCESS);
3533859Sml29623 }
3543859Sml29623 
3553859Sml29623 npi_status_t
npi_ipp_get_pfifo_wr_ptr(npi_handle_t handle,uint8_t portn,uint16_t * wr_ptr)3563859Sml29623 npi_ipp_get_pfifo_wr_ptr(npi_handle_t handle, uint8_t portn, uint16_t *wr_ptr)
3573859Sml29623 {
3583859Sml29623 	uint64_t value;
3593859Sml29623 
3603859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
3613859Sml29623 
3623859Sml29623 	IPP_REG_RD(handle, portn, IPP_PFIFO_WR_PTR_REG, &value);
3633859Sml29623 	*wr_ptr = value & 0xfff;
3643859Sml29623 	return (NPI_SUCCESS);
3653859Sml29623 }
3663859Sml29623 
3673859Sml29623 npi_status_t
npi_ipp_get_dfifo_rd_ptr(npi_handle_t handle,uint8_t portn,uint16_t * rd_ptr)3683859Sml29623 npi_ipp_get_dfifo_rd_ptr(npi_handle_t handle, uint8_t portn, uint16_t *rd_ptr)
3693859Sml29623 {
3703859Sml29623 	uint64_t value;
3713859Sml29623 
3723859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
3733859Sml29623 
3743859Sml29623 	IPP_REG_RD(handle, portn, IPP_DFIFO_RD_PTR_REG, &value);
3753859Sml29623 	*rd_ptr = (uint16_t)(value & ((portn < 2) ? IPP_XMAC_DFIFO_PTR_MASK :
376*6929Smisaki 	    IPP_BMAC_DFIFO_PTR_MASK));
3773859Sml29623 	return (NPI_SUCCESS);
3783859Sml29623 }
3793859Sml29623 
3803859Sml29623 npi_status_t
npi_ipp_get_dfifo_wr_ptr(npi_handle_t handle,uint8_t portn,uint16_t * wr_ptr)3813859Sml29623 npi_ipp_get_dfifo_wr_ptr(npi_handle_t handle, uint8_t portn, uint16_t *wr_ptr)
3823859Sml29623 {
3833859Sml29623 	uint64_t value;
3843859Sml29623 
3853859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
3863859Sml29623 
3873859Sml29623 	IPP_REG_RD(handle, portn, IPP_DFIFO_WR_PTR_REG, &value);
3883859Sml29623 	*wr_ptr = (uint16_t)(value & ((portn < 2) ? IPP_XMAC_DFIFO_PTR_MASK :
389*6929Smisaki 	    IPP_BMAC_DFIFO_PTR_MASK));
3903859Sml29623 	return (NPI_SUCCESS);
3913859Sml29623 }
3923859Sml29623 
3933859Sml29623 npi_status_t
npi_ipp_write_pfifo(npi_handle_t handle,uint8_t portn,uint8_t addr,uint32_t d0,uint32_t d1,uint32_t d2,uint32_t d3,uint32_t d4)3943859Sml29623 npi_ipp_write_pfifo(npi_handle_t handle, uint8_t portn, uint8_t addr,
3953859Sml29623 		uint32_t d0, uint32_t d1, uint32_t d2, uint32_t d3, uint32_t d4)
3963859Sml29623 {
3973859Sml29623 	uint64_t val;
3983859Sml29623 
3993859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
4003859Sml29623 
4013859Sml29623 	if (addr >= 64) {
4023859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
403*6929Smisaki 		    " npi_ipp_write_pfifo"
404*6929Smisaki 		    " Invalid PFIFO address <0x%x>", addr));
4053859Sml29623 		return (NPI_FAILURE | NPI_IPP_FIFO_ADDR_INVALID(portn));
4063859Sml29623 	}
4073859Sml29623 
4083859Sml29623 	IPP_REG_RD(handle, portn, IPP_CONFIG_REG, &val);
4093859Sml29623 	val |= IPP_PRE_FIFO_PIO_WR_EN;
4103859Sml29623 	IPP_REG_WR(handle, portn, IPP_CONFIG_REG, val);
4113859Sml29623 
4123859Sml29623 	IPP_REG_WR(handle, portn, IPP_PFIFO_WR_PTR_REG, addr);
4133859Sml29623 	IPP_REG_WR(handle, portn, IPP_PFIFO_WR_DATA0_REG, d0);
4143859Sml29623 	IPP_REG_WR(handle, portn, IPP_PFIFO_WR_DATA1_REG, d1);
4153859Sml29623 	IPP_REG_WR(handle, portn, IPP_PFIFO_WR_DATA2_REG, d2);
4163859Sml29623 	IPP_REG_WR(handle, portn, IPP_PFIFO_WR_DATA3_REG, d3);
4173859Sml29623 	IPP_REG_WR(handle, portn, IPP_PFIFO_WR_DATA4_REG, d4);
4183859Sml29623 
4193859Sml29623 	val &= ~IPP_PRE_FIFO_PIO_WR_EN;
4203859Sml29623 	IPP_REG_WR(handle, portn, IPP_CONFIG_REG, val);
4213859Sml29623 
4223859Sml29623 	return (NPI_SUCCESS);
4233859Sml29623 }
4243859Sml29623 
4253859Sml29623 npi_status_t
npi_ipp_read_pfifo(npi_handle_t handle,uint8_t portn,uint8_t addr,uint32_t * d0,uint32_t * d1,uint32_t * d2,uint32_t * d3,uint32_t * d4)4263859Sml29623 npi_ipp_read_pfifo(npi_handle_t handle, uint8_t portn, uint8_t addr,
4273859Sml29623 		uint32_t *d0, uint32_t *d1, uint32_t *d2, uint32_t *d3,
4283859Sml29623 		uint32_t *d4)
4293859Sml29623 {
4303859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
4313859Sml29623 
4323859Sml29623 	if (addr >= 64) {
4333859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
434*6929Smisaki 		    " npi_ipp_read_pfifo"
435*6929Smisaki 		    " Invalid PFIFO address <0x%x>", addr));
4363859Sml29623 		return (NPI_FAILURE | NPI_IPP_FIFO_ADDR_INVALID(portn));
4373859Sml29623 	}
4383859Sml29623 
4393859Sml29623 	IPP_REG_WR(handle, portn, IPP_PFIFO_RD_PTR_REG, addr);
4403859Sml29623 	IPP_REG_RD(handle, portn, IPP_PFIFO_RD_DATA0_REG, d0);
4413859Sml29623 	IPP_REG_RD(handle, portn, IPP_PFIFO_RD_DATA1_REG, d1);
4423859Sml29623 	IPP_REG_RD(handle, portn, IPP_PFIFO_RD_DATA2_REG, d2);
4433859Sml29623 	IPP_REG_RD(handle, portn, IPP_PFIFO_RD_DATA3_REG, d3);
4443859Sml29623 	IPP_REG_RD(handle, portn, IPP_PFIFO_RD_DATA4_REG, d4);
4453859Sml29623 
4463859Sml29623 	return (NPI_SUCCESS);
4473859Sml29623 }
4483859Sml29623 
4493859Sml29623 npi_status_t
npi_ipp_write_dfifo(npi_handle_t handle,uint8_t portn,uint16_t addr,uint32_t d0,uint32_t d1,uint32_t d2,uint32_t d3,uint32_t d4)4503859Sml29623 npi_ipp_write_dfifo(npi_handle_t handle, uint8_t portn, uint16_t addr,
4513859Sml29623 		uint32_t d0, uint32_t d1, uint32_t d2, uint32_t d3, uint32_t d4)
4523859Sml29623 {
4533859Sml29623 	uint64_t val;
4543859Sml29623 
4553859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
4563859Sml29623 
4573859Sml29623 	if (addr >= 2048) {
4583859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
459*6929Smisaki 		    " npi_ipp_write_dfifo"
460*6929Smisaki 		    " Invalid DFIFO address <0x%x>", addr));
4613859Sml29623 		return (NPI_FAILURE | NPI_IPP_FIFO_ADDR_INVALID(portn));
4623859Sml29623 	}
4633859Sml29623 
4643859Sml29623 	IPP_REG_RD(handle, portn, IPP_CONFIG_REG, &val);
4653859Sml29623 	val |= IPP_DFIFO_PIO_WR_EN;
4663859Sml29623 	IPP_REG_WR(handle, portn, IPP_CONFIG_REG, val);
4673859Sml29623 
4683859Sml29623 	IPP_REG_WR(handle, portn, IPP_DFIFO_WR_PTR_REG, addr);
4693859Sml29623 	IPP_REG_WR(handle, portn, IPP_DFIFO_WR_DATA0_REG, d0);
4703859Sml29623 	IPP_REG_WR(handle, portn, IPP_DFIFO_WR_DATA1_REG, d1);
4713859Sml29623 	IPP_REG_WR(handle, portn, IPP_DFIFO_WR_DATA2_REG, d2);
4723859Sml29623 	IPP_REG_WR(handle, portn, IPP_DFIFO_WR_DATA3_REG, d3);
4733859Sml29623 	IPP_REG_WR(handle, portn, IPP_DFIFO_WR_DATA4_REG, d4);
4743859Sml29623 
4753859Sml29623 	val &= ~IPP_DFIFO_PIO_WR_EN;
4763859Sml29623 	IPP_REG_WR(handle, portn, IPP_CONFIG_REG, val);
4773859Sml29623 
4783859Sml29623 	return (NPI_SUCCESS);
4793859Sml29623 }
4803859Sml29623 
4813859Sml29623 npi_status_t
npi_ipp_read_dfifo(npi_handle_t handle,uint8_t portn,uint16_t addr,uint32_t * d0,uint32_t * d1,uint32_t * d2,uint32_t * d3,uint32_t * d4)4823859Sml29623 npi_ipp_read_dfifo(npi_handle_t handle, uint8_t portn, uint16_t addr,
4833859Sml29623 		uint32_t *d0, uint32_t *d1, uint32_t *d2, uint32_t *d3,
4843859Sml29623 		uint32_t *d4)
4853859Sml29623 {
4863859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
4873859Sml29623 
4883859Sml29623 	if (addr >= 2048) {
4893859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
490*6929Smisaki 		    " npi_ipp_read_dfifo"
491*6929Smisaki 		    " Invalid DFIFO address <0x%x>", addr));
4923859Sml29623 		return (NPI_FAILURE | NPI_IPP_FIFO_ADDR_INVALID(portn));
4933859Sml29623 	}
4943859Sml29623 
4953859Sml29623 	IPP_REG_WR(handle, portn, IPP_DFIFO_RD_PTR_REG, addr);
4963859Sml29623 	IPP_REG_RD(handle, portn, IPP_DFIFO_RD_DATA0_REG, d0);
4973859Sml29623 	IPP_REG_RD(handle, portn, IPP_DFIFO_RD_DATA1_REG, d1);
4983859Sml29623 	IPP_REG_RD(handle, portn, IPP_DFIFO_RD_DATA2_REG, d2);
4993859Sml29623 	IPP_REG_RD(handle, portn, IPP_DFIFO_RD_DATA3_REG, d3);
5003859Sml29623 	IPP_REG_RD(handle, portn, IPP_DFIFO_RD_DATA4_REG, d4);
5013859Sml29623 
5023859Sml29623 	return (NPI_SUCCESS);
5033859Sml29623 }
5043859Sml29623 
5053859Sml29623 npi_status_t
npi_ipp_get_ecc_syndrome(npi_handle_t handle,uint8_t portn,uint16_t * syndrome)5063859Sml29623 npi_ipp_get_ecc_syndrome(npi_handle_t handle, uint8_t portn, uint16_t *syndrome)
5073859Sml29623 {
5083859Sml29623 	uint64_t val;
5093859Sml29623 
5103859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
5113859Sml29623 
5123859Sml29623 	IPP_REG_RD(handle, portn, IPP_DFIFO_ECC_SYNDROME_REG, &val);
5133859Sml29623 
5143859Sml29623 	*syndrome = (uint16_t)val;
5153859Sml29623 	return (NPI_SUCCESS);
5163859Sml29623 }
5173859Sml29623 
5183859Sml29623 npi_status_t
npi_ipp_get_dfifo_eopm_rdptr(npi_handle_t handle,uint8_t portn,uint16_t * rdptr)5193859Sml29623 npi_ipp_get_dfifo_eopm_rdptr(npi_handle_t handle, uint8_t portn,
5203859Sml29623 							uint16_t *rdptr)
5213859Sml29623 {
5223859Sml29623 	uint64_t val;
5233859Sml29623 
5243859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
5253859Sml29623 
5263859Sml29623 	IPP_REG_RD(handle, portn, IPP_DFIFO_EOPM_RD_PTR_REG, &val);
5273859Sml29623 
5283859Sml29623 	*rdptr = (uint16_t)val;
5293859Sml29623 	return (NPI_SUCCESS);
5303859Sml29623 }
5313859Sml29623 
5323859Sml29623 npi_status_t
npi_ipp_get_state_mach(npi_handle_t handle,uint8_t portn,uint32_t * sm)5333859Sml29623 npi_ipp_get_state_mach(npi_handle_t handle, uint8_t portn, uint32_t *sm)
5343859Sml29623 {
5353859Sml29623 	uint64_t val;
5363859Sml29623 
5373859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
5383859Sml29623 
5393859Sml29623 	IPP_REG_RD(handle, portn, IPP_STATE_MACHINE_REG, &val);
5403859Sml29623 
5413859Sml29623 	*sm = (uint32_t)val;
5423859Sml29623 	return (NPI_SUCCESS);
5433859Sml29623 }
5443859Sml29623 
5453859Sml29623 npi_status_t
npi_ipp_get_ecc_err_count(npi_handle_t handle,uint8_t portn,uint8_t * err_cnt)5463859Sml29623 npi_ipp_get_ecc_err_count(npi_handle_t handle, uint8_t portn, uint8_t *err_cnt)
5473859Sml29623 {
5483859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
5493859Sml29623 
5503859Sml29623 	IPP_REG_RD(handle, portn, IPP_ECC_ERR_COUNTER_REG, err_cnt);
5513859Sml29623 
5523859Sml29623 	return (NPI_SUCCESS);
5533859Sml29623 }
5543859Sml29623 
5553859Sml29623 npi_status_t
npi_ipp_get_pkt_dis_count(npi_handle_t handle,uint8_t portn,uint16_t * dis_cnt)5563859Sml29623 npi_ipp_get_pkt_dis_count(npi_handle_t handle, uint8_t portn, uint16_t *dis_cnt)
5573859Sml29623 {
5583859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
5593859Sml29623 
5603859Sml29623 	IPP_REG_RD(handle, portn, IPP_DISCARD_PKT_CNT_REG, dis_cnt);
5613859Sml29623 
5623859Sml29623 	return (NPI_SUCCESS);
5633859Sml29623 }
5643859Sml29623 
5653859Sml29623 npi_status_t
npi_ipp_get_cs_err_count(npi_handle_t handle,uint8_t portn,uint16_t * err_cnt)5663859Sml29623 npi_ipp_get_cs_err_count(npi_handle_t handle, uint8_t portn, uint16_t *err_cnt)
5673859Sml29623 {
5683859Sml29623 	ASSERT(IS_PORT_NUM_VALID(portn));
5693859Sml29623 
5705523Syc148097 	IPP_REG_RD(handle, portn, IPP_BAD_CKSUM_ERR_CNT_REG, err_cnt);
5713859Sml29623 
5723859Sml29623 	return (NPI_SUCCESS);
5733859Sml29623 }
574