xref: /illumos-gate/usr/src/uts/common/io/nxge/npi/npi_rxdma.c (revision 9b6224883056ca9db111541974efeb6a4de0c074)
16f45ec7bSml29623 /*
26f45ec7bSml29623  * CDDL HEADER START
36f45ec7bSml29623  *
46f45ec7bSml29623  * The contents of this file are subject to the terms of the
56f45ec7bSml29623  * Common Development and Distribution License (the "License").
66f45ec7bSml29623  * You may not use this file except in compliance with the License.
76f45ec7bSml29623  *
86f45ec7bSml29623  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96f45ec7bSml29623  * or http://www.opensolaris.org/os/licensing.
106f45ec7bSml29623  * See the License for the specific language governing permissions
116f45ec7bSml29623  * and limitations under the License.
126f45ec7bSml29623  *
136f45ec7bSml29623  * When distributing Covered Code, include this CDDL HEADER in each
146f45ec7bSml29623  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156f45ec7bSml29623  * If applicable, add the following below this CDDL HEADER, with the
166f45ec7bSml29623  * fields enclosed by brackets "[]" replaced with your own identifying
176f45ec7bSml29623  * information: Portions Copyright [yyyy] [name of copyright owner]
186f45ec7bSml29623  *
196f45ec7bSml29623  * CDDL HEADER END
206f45ec7bSml29623  */
216f45ec7bSml29623 /*
224df55fdeSJanie Lu  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
236f45ec7bSml29623  * Use is subject to license terms.
246f45ec7bSml29623  */
256f45ec7bSml29623 
266f45ec7bSml29623 #include <npi_rxdma.h>
27678453a8Sspeer #include <npi_rx_rd64.h>
28678453a8Sspeer #include <npi_rx_wr64.h>
296f45ec7bSml29623 #include <nxge_common.h>
306f45ec7bSml29623 
316f45ec7bSml29623 #define	 RXDMA_RESET_TRY_COUNT	4
326f45ec7bSml29623 #define	 RXDMA_RESET_DELAY	5
336f45ec7bSml29623 
346f45ec7bSml29623 #define	 RXDMA_OP_DISABLE	0
356f45ec7bSml29623 #define	 RXDMA_OP_ENABLE	1
366f45ec7bSml29623 #define	 RXDMA_OP_RESET	2
376f45ec7bSml29623 
386f45ec7bSml29623 #define	 RCR_TIMEOUT_ENABLE	1
396f45ec7bSml29623 #define	 RCR_TIMEOUT_DISABLE	2
406f45ec7bSml29623 #define	 RCR_THRESHOLD	4
416f45ec7bSml29623 
426f45ec7bSml29623 /* assume weight is in byte frames unit */
436f45ec7bSml29623 #define	WEIGHT_FACTOR 3/2
446f45ec7bSml29623 
456f45ec7bSml29623 uint64_t rdc_dmc_offset[] = {
466f45ec7bSml29623 	RXDMA_CFIG1_REG, RXDMA_CFIG2_REG, RBR_CFIG_A_REG, RBR_CFIG_B_REG,
476f45ec7bSml29623 	RBR_KICK_REG, RBR_STAT_REG, RBR_HDH_REG, RBR_HDL_REG,
486f45ec7bSml29623 	RCRCFIG_A_REG, RCRCFIG_B_REG, RCRSTAT_A_REG, RCRSTAT_B_REG,
496f45ec7bSml29623 	RCRSTAT_C_REG, RX_DMA_ENT_MSK_REG, RX_DMA_CTL_STAT_REG, RCR_FLSH_REG,
506f45ec7bSml29623 	RXMISC_DISCARD_REG
516f45ec7bSml29623 };
526f45ec7bSml29623 
536f45ec7bSml29623 const char *rdc_dmc_name[] = {
546f45ec7bSml29623 	"RXDMA_CFIG1", "RXDMA_CFIG2", "RBR_CFIG_A", "RBR_CFIG_B",
556f45ec7bSml29623 	"RBR_KICK", "RBR_STAT", "RBR_HDH", "RBR_HDL",
566f45ec7bSml29623 	"RCRCFIG_A", "RCRCFIG_B", "RCRSTAT_A", "RCRSTAT_B",
576f45ec7bSml29623 	"RCRSTAT_C", "RX_DMA_ENT_MSK", "RX_DMA_CTL_STAT", "RCR_FLSH",
586f45ec7bSml29623 	"RXMISC_DISCARD"
596f45ec7bSml29623 };
606f45ec7bSml29623 
616f45ec7bSml29623 uint64_t rdc_fzc_offset [] = {
626f45ec7bSml29623 	RX_LOG_PAGE_VLD_REG, RX_LOG_PAGE_MASK1_REG, RX_LOG_PAGE_VAL1_REG,
636f45ec7bSml29623 	RX_LOG_PAGE_MASK2_REG, RX_LOG_PAGE_VAL2_REG, RX_LOG_PAGE_RELO1_REG,
646f45ec7bSml29623 	RX_LOG_PAGE_RELO2_REG, RX_LOG_PAGE_HDL_REG, RDC_RED_PARA_REG,
656f45ec7bSml29623 	RED_DIS_CNT_REG
666f45ec7bSml29623 };
676f45ec7bSml29623 
686f45ec7bSml29623 
696f45ec7bSml29623 const char *rdc_fzc_name [] = {
706f45ec7bSml29623 	"RX_LOG_PAGE_VLD", "RX_LOG_PAGE_MASK1", "RX_LOG_PAGE_VAL1",
716f45ec7bSml29623 	"RX_LOG_PAGE_MASK2", "RX_LOG_PAGE_VAL2", "RX_LOG_PAGE_RELO1",
726f45ec7bSml29623 	"RX_LOG_PAGE_RELO2", "RX_LOG_PAGE_HDL", "RDC_RED_PARA", "RED_DIS_CNT"
736f45ec7bSml29623 };
746f45ec7bSml29623 
756f45ec7bSml29623 
766f45ec7bSml29623 /*
776f45ec7bSml29623  * Dump the MEM_ADD register first so all the data registers
786f45ec7bSml29623  * will have valid data buffer pointers.
796f45ec7bSml29623  */
806f45ec7bSml29623 uint64_t rx_fzc_offset[] = {
816f45ec7bSml29623 	RX_DMA_CK_DIV_REG, DEF_PT0_RDC_REG, DEF_PT1_RDC_REG, DEF_PT2_RDC_REG,
826f45ec7bSml29623 	DEF_PT3_RDC_REG, RX_ADDR_MD_REG, PT_DRR_WT0_REG, PT_DRR_WT1_REG,
836f45ec7bSml29623 	PT_DRR_WT2_REG, PT_DRR_WT3_REG, PT_USE0_REG, PT_USE1_REG,
846f45ec7bSml29623 	PT_USE2_REG, PT_USE3_REG, RED_RAN_INIT_REG, RX_ADDR_MD_REG,
856f45ec7bSml29623 	RDMC_PRE_PAR_ERR_REG, RDMC_SHA_PAR_ERR_REG,
866f45ec7bSml29623 	RDMC_MEM_DATA4_REG, RDMC_MEM_DATA3_REG, RDMC_MEM_DATA2_REG,
876f45ec7bSml29623 	RDMC_MEM_DATA1_REG, RDMC_MEM_DATA0_REG,
886f45ec7bSml29623 	RDMC_MEM_ADDR_REG,
896f45ec7bSml29623 	RX_CTL_DAT_FIFO_STAT_REG, RX_CTL_DAT_FIFO_MASK_REG,
906f45ec7bSml29623 	RX_CTL_DAT_FIFO_STAT_DBG_REG,
916f45ec7bSml29623 	RDMC_TRAINING_VECTOR_REG,
926f45ec7bSml29623 };
936f45ec7bSml29623 
946f45ec7bSml29623 
956f45ec7bSml29623 const char *rx_fzc_name[] = {
966f45ec7bSml29623 	"RX_DMA_CK_DIV", "DEF_PT0_RDC", "DEF_PT1_RDC", "DEF_PT2_RDC",
976f45ec7bSml29623 	"DEF_PT3_RDC", "RX_ADDR_MD", "PT_DRR_WT0", "PT_DRR_WT1",
986f45ec7bSml29623 	"PT_DRR_WT2", "PT_DRR_WT3", "PT_USE0", "PT_USE1",
996f45ec7bSml29623 	"PT_USE2", "PT_USE3", "RED_RAN_INIT", "RX_ADDR_MD",
1006f45ec7bSml29623 	"RDMC_PRE_PAR_ERR", "RDMC_SHA_PAR_ERR",
1016f45ec7bSml29623 	"RDMC_MEM_DATA4", "RDMC_MEM_DATA3", "RDMC_MEM_DATA2",
1026f45ec7bSml29623 	"RDMC_MEM_DATA1", "RDMC_MEM_DATA0",
1036f45ec7bSml29623 	"RDMC_MEM_ADDR",
1046f45ec7bSml29623 	"RX_CTL_DAT_FIFO_STAT", "RX_CTL_DAT_FIFO_MASK",
1056f45ec7bSml29623 	"RDMC_TRAINING_VECTOR_REG",
1066f45ec7bSml29623 	"RX_CTL_DAT_FIFO_STAT_DBG_REG"
1076f45ec7bSml29623 };
1086f45ec7bSml29623 
1096f45ec7bSml29623 
1106f45ec7bSml29623 npi_status_t
1116f45ec7bSml29623 npi_rxdma_cfg_rdc_ctl(npi_handle_t handle, uint8_t rdc, uint8_t op);
1126f45ec7bSml29623 npi_status_t
1136f45ec7bSml29623 npi_rxdma_cfg_rdc_rcr_ctl(npi_handle_t handle, uint8_t rdc, uint8_t op,
1146f45ec7bSml29623 				uint16_t param);
1156f45ec7bSml29623 
1166f45ec7bSml29623 
1176f45ec7bSml29623 /*
1186f45ec7bSml29623  * npi_rxdma_dump_rdc_regs
1196f45ec7bSml29623  * Dumps the contents of rdc csrs and fzc registers
1206f45ec7bSml29623  *
1216f45ec7bSml29623  * Input:
1226f45ec7bSml29623  *      handle:	opaque handle interpreted by the underlying OS
1236f45ec7bSml29623  *         rdc:      RX DMA number
1246f45ec7bSml29623  *
1256f45ec7bSml29623  * return:
1266f45ec7bSml29623  *     NPI_SUCCESS
1276f45ec7bSml29623  *     NPI_RXDMA_RDC_INVALID
1286f45ec7bSml29623  *
1296f45ec7bSml29623  */
1306f45ec7bSml29623 npi_status_t
npi_rxdma_dump_rdc_regs(npi_handle_t handle,uint8_t rdc)1316f45ec7bSml29623 npi_rxdma_dump_rdc_regs(npi_handle_t handle, uint8_t rdc)
1326f45ec7bSml29623 {
1336f45ec7bSml29623 
1346f45ec7bSml29623 	uint64_t value, offset;
1356f45ec7bSml29623 	int num_regs, i;
1366f45ec7bSml29623 #ifdef NPI_DEBUG
1376f45ec7bSml29623 	extern uint64_t npi_debug_level;
1386f45ec7bSml29623 	uint64_t old_npi_debug_level = npi_debug_level;
1396f45ec7bSml29623 #endif
1406f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
1416f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
1426f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
1436f45ec7bSml29623 		    "npi_rxdma_dump_rdc_regs"
1446f45ec7bSml29623 		    " Illegal RDC number %d \n",
1456f45ec7bSml29623 		    rdc));
1466f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
1476f45ec7bSml29623 	}
1486f45ec7bSml29623 #ifdef NPI_DEBUG
1496f45ec7bSml29623 	npi_debug_level |= DUMP_ALWAYS;
1506f45ec7bSml29623 #endif
1516f45ec7bSml29623 	num_regs = sizeof (rdc_dmc_offset) / sizeof (uint64_t);
1526f45ec7bSml29623 	NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
1536f45ec7bSml29623 	    "\nDMC Register Dump for Channel %d\n",
1546f45ec7bSml29623 	    rdc));
1556f45ec7bSml29623 	for (i = 0; i < num_regs; i++) {
1566f45ec7bSml29623 		RXDMA_REG_READ64(handle, rdc_dmc_offset[i], rdc, &value);
1576f45ec7bSml29623 		offset = NXGE_RXDMA_OFFSET(rdc_dmc_offset[i], handle.is_vraddr,
1586f45ec7bSml29623 		    rdc);
1596f45ec7bSml29623 		NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
1606f45ec7bSml29623 		    "%08llx %s\t %08llx \n",
1616f45ec7bSml29623 		    offset, rdc_dmc_name[i], value));
1626f45ec7bSml29623 	}
1636f45ec7bSml29623 
1646f45ec7bSml29623 	NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
1656f45ec7bSml29623 	    "\n Register Dump for Channel %d done\n",
1666f45ec7bSml29623 	    rdc));
1676f45ec7bSml29623 #ifdef NPI_DEBUG
1686f45ec7bSml29623 	npi_debug_level = old_npi_debug_level;
1696f45ec7bSml29623 #endif
1706f45ec7bSml29623 	return (NPI_SUCCESS);
1716f45ec7bSml29623 }
1726f45ec7bSml29623 
1736f45ec7bSml29623 /*
1746f45ec7bSml29623  * npi_rxdma_dump_fzc_regs
1756f45ec7bSml29623  * Dumps the contents of rdc csrs and fzc registers
1766f45ec7bSml29623  *
1776f45ec7bSml29623  * Input:
1786f45ec7bSml29623  *      handle:	opaque handle interpreted by the underlying OS
1796f45ec7bSml29623  *
1806f45ec7bSml29623  * return:
1816f45ec7bSml29623  *     NPI_SUCCESS
1826f45ec7bSml29623  */
1836f45ec7bSml29623 npi_status_t
npi_rxdma_dump_fzc_regs(npi_handle_t handle)1846f45ec7bSml29623 npi_rxdma_dump_fzc_regs(npi_handle_t handle)
1856f45ec7bSml29623 {
1866f45ec7bSml29623 
1876f45ec7bSml29623 	uint64_t value;
1886f45ec7bSml29623 	int num_regs, i;
1896f45ec7bSml29623 
1906f45ec7bSml29623 
1916f45ec7bSml29623 	NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
1926f45ec7bSml29623 	    "\nFZC_DMC Common Register Dump\n"));
1936f45ec7bSml29623 	num_regs = sizeof (rx_fzc_offset) / sizeof (uint64_t);
1946f45ec7bSml29623 
1956f45ec7bSml29623 	for (i = 0; i < num_regs; i++) {
1966f45ec7bSml29623 		NXGE_REG_RD64(handle, rx_fzc_offset[i], &value);
1976f45ec7bSml29623 		NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
1986f45ec7bSml29623 		    "0x%08llx %s\t 0x%08llx \n",
1996f45ec7bSml29623 		    rx_fzc_offset[i],
2006f45ec7bSml29623 		    rx_fzc_name[i], value));
2016f45ec7bSml29623 	}
2026f45ec7bSml29623 	NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
2036f45ec7bSml29623 	    "\n FZC_DMC Register Dump Done \n"));
2046f45ec7bSml29623 
2056f45ec7bSml29623 	return (NPI_SUCCESS);
2066f45ec7bSml29623 }
2076f45ec7bSml29623 
2086f45ec7bSml29623 
2096f45ec7bSml29623 
2106f45ec7bSml29623 /*
2116f45ec7bSml29623  * per rdc config functions
2126f45ec7bSml29623  */
2136f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_logical_page_disable(npi_handle_t handle,uint8_t rdc,uint8_t page_num)2146f45ec7bSml29623 npi_rxdma_cfg_logical_page_disable(npi_handle_t handle, uint8_t rdc,
2156f45ec7bSml29623 				    uint8_t page_num)
2166f45ec7bSml29623 {
2176f45ec7bSml29623 	log_page_vld_t page_vld;
2186f45ec7bSml29623 	uint64_t valid_offset;
2196f45ec7bSml29623 
2206f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
2216f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
2226f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2236f45ec7bSml29623 		    "rxdma_cfg_logical_page_disable"
2246f45ec7bSml29623 		    " Illegal RDC number %d \n",
2256f45ec7bSml29623 		    rdc));
2266f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
2276f45ec7bSml29623 	}
2286f45ec7bSml29623 
2296f45ec7bSml29623 	ASSERT(RXDMA_PAGE_VALID(page_num));
2306f45ec7bSml29623 	if (!RXDMA_PAGE_VALID(page_num)) {
2316f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2326f45ec7bSml29623 		    "rxdma_cfg_logical_page_disable"
2336f45ec7bSml29623 		    " Illegal page number %d \n",
2346f45ec7bSml29623 		    page_num));
2356f45ec7bSml29623 		return (NPI_RXDMA_PAGE_INVALID);
2366f45ec7bSml29623 	}
2376f45ec7bSml29623 
2386f45ec7bSml29623 	valid_offset = REG_FZC_RDC_OFFSET(RX_LOG_PAGE_VLD_REG, rdc);
2396f45ec7bSml29623 	NXGE_REG_RD64(handle, valid_offset, &page_vld.value);
2406f45ec7bSml29623 
2416f45ec7bSml29623 	if (page_num == 0)
2426f45ec7bSml29623 		page_vld.bits.ldw.page0 = 0;
2436f45ec7bSml29623 
2446f45ec7bSml29623 	if (page_num == 1)
2456f45ec7bSml29623 		page_vld.bits.ldw.page1 = 0;
2466f45ec7bSml29623 
2476f45ec7bSml29623 	NXGE_REG_WR64(handle, valid_offset, page_vld.value);
2486f45ec7bSml29623 	return (NPI_SUCCESS);
2496f45ec7bSml29623 
2506f45ec7bSml29623 }
2516f45ec7bSml29623 
2526f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_logical_page(npi_handle_t handle,uint8_t rdc,dma_log_page_t * pg_cfg)2536f45ec7bSml29623 npi_rxdma_cfg_logical_page(npi_handle_t handle, uint8_t rdc,
2546f45ec7bSml29623 			    dma_log_page_t *pg_cfg)
2556f45ec7bSml29623 {
2566f45ec7bSml29623 	log_page_vld_t page_vld;
2576f45ec7bSml29623 	log_page_mask_t page_mask;
2586f45ec7bSml29623 	log_page_value_t page_value;
2596f45ec7bSml29623 	log_page_relo_t page_reloc;
2606f45ec7bSml29623 	uint64_t value_offset, reloc_offset, mask_offset;
2616f45ec7bSml29623 	uint64_t valid_offset;
2626f45ec7bSml29623 
263e3d11eeeSToomas Soome 	value_offset = 0;
264e3d11eeeSToomas Soome 	reloc_offset = 0;
265e3d11eeeSToomas Soome 	mask_offset = 0;
2666f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
2676f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
2686f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2696f45ec7bSml29623 		    " rxdma_cfg_logical_page"
2706f45ec7bSml29623 		    " Illegal RDC number %d \n",
2716f45ec7bSml29623 		    rdc));
2726f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
2736f45ec7bSml29623 	}
2746f45ec7bSml29623 
2756f45ec7bSml29623 	ASSERT(RXDMA_PAGE_VALID(pg_cfg->page_num));
2766f45ec7bSml29623 	if (!RXDMA_PAGE_VALID(pg_cfg->page_num)) {
2776f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
2786f45ec7bSml29623 		    " rxdma_cfg_logical_page"
2796f45ec7bSml29623 		    " Illegal page number %d \n",
2806f45ec7bSml29623 		    pg_cfg->page_num));
2816f45ec7bSml29623 		return (NPI_RXDMA_PAGE_INVALID);
2826f45ec7bSml29623 	}
2836f45ec7bSml29623 
2846f45ec7bSml29623 	valid_offset = REG_FZC_RDC_OFFSET(RX_LOG_PAGE_VLD_REG, rdc);
2856f45ec7bSml29623 	NXGE_REG_RD64(handle, valid_offset, &page_vld.value);
2866f45ec7bSml29623 
2876f45ec7bSml29623 	if (!pg_cfg->valid) {
2886f45ec7bSml29623 		if (pg_cfg->page_num == 0)
2896f45ec7bSml29623 			page_vld.bits.ldw.page0 = 0;
2906f45ec7bSml29623 
2916f45ec7bSml29623 		if (pg_cfg->page_num == 1)
2926f45ec7bSml29623 			page_vld.bits.ldw.page1 = 0;
2936f45ec7bSml29623 		NXGE_REG_WR64(handle, valid_offset, page_vld.value);
2946f45ec7bSml29623 		return (NPI_SUCCESS);
2956f45ec7bSml29623 	}
2966f45ec7bSml29623 
2976f45ec7bSml29623 	if (pg_cfg->page_num == 0) {
2986f45ec7bSml29623 		mask_offset = REG_FZC_RDC_OFFSET(RX_LOG_PAGE_MASK1_REG, rdc);
2996f45ec7bSml29623 		value_offset = REG_FZC_RDC_OFFSET(RX_LOG_PAGE_VAL1_REG, rdc);
3006f45ec7bSml29623 		reloc_offset = REG_FZC_RDC_OFFSET(RX_LOG_PAGE_RELO1_REG, rdc);
3016f45ec7bSml29623 		page_vld.bits.ldw.page0 = 1;
3026f45ec7bSml29623 	}
3036f45ec7bSml29623 
3046f45ec7bSml29623 	if (pg_cfg->page_num == 1) {
3056f45ec7bSml29623 		mask_offset = REG_FZC_RDC_OFFSET(RX_LOG_PAGE_MASK2_REG, rdc);
3066f45ec7bSml29623 		value_offset = REG_FZC_RDC_OFFSET(RX_LOG_PAGE_VAL2_REG, rdc);
3076f45ec7bSml29623 		reloc_offset = REG_FZC_RDC_OFFSET(RX_LOG_PAGE_RELO2_REG, rdc);
3086f45ec7bSml29623 		page_vld.bits.ldw.page1 = 1;
3096f45ec7bSml29623 	}
3106f45ec7bSml29623 
3116f45ec7bSml29623 
3126f45ec7bSml29623 	page_vld.bits.ldw.func = pg_cfg->func_num;
3136f45ec7bSml29623 
3146f45ec7bSml29623 	page_mask.value = 0;
3156f45ec7bSml29623 	page_value.value = 0;
3166f45ec7bSml29623 	page_reloc.value = 0;
3176f45ec7bSml29623 
3186f45ec7bSml29623 
3196f45ec7bSml29623 	page_mask.bits.ldw.mask = pg_cfg->mask >> LOG_PAGE_ADDR_SHIFT;
3206f45ec7bSml29623 	page_value.bits.ldw.value = pg_cfg->value >> LOG_PAGE_ADDR_SHIFT;
3216f45ec7bSml29623 	page_reloc.bits.ldw.relo = pg_cfg->reloc >> LOG_PAGE_ADDR_SHIFT;
3226f45ec7bSml29623 
3236f45ec7bSml29623 
3246f45ec7bSml29623 	NXGE_REG_WR64(handle, mask_offset, page_mask.value);
3256f45ec7bSml29623 	NXGE_REG_WR64(handle, value_offset, page_value.value);
3266f45ec7bSml29623 	NXGE_REG_WR64(handle, reloc_offset, page_reloc.value);
3276f45ec7bSml29623 
3286f45ec7bSml29623 
3296f45ec7bSml29623 /* enable the logical page */
3306f45ec7bSml29623 	NXGE_REG_WR64(handle, valid_offset, page_vld.value);
3316f45ec7bSml29623 	return (NPI_SUCCESS);
3326f45ec7bSml29623 }
3336f45ec7bSml29623 
3346f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_logical_page_handle(npi_handle_t handle,uint8_t rdc,uint64_t page_handle)3356f45ec7bSml29623 npi_rxdma_cfg_logical_page_handle(npi_handle_t handle, uint8_t rdc,
3366f45ec7bSml29623 				    uint64_t page_handle)
3376f45ec7bSml29623 {
3386f45ec7bSml29623 	uint64_t offset;
3396f45ec7bSml29623 	log_page_hdl_t page_hdl;
3406f45ec7bSml29623 
3416f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
3426f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
3436f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
3446f45ec7bSml29623 		    "rxdma_cfg_logical_page_handle"
3456f45ec7bSml29623 		    " Illegal RDC number %d \n", rdc));
3466f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
3476f45ec7bSml29623 	}
3486f45ec7bSml29623 
3496f45ec7bSml29623 	page_hdl.value = 0;
3506f45ec7bSml29623 
3516f45ec7bSml29623 	page_hdl.bits.ldw.handle = (uint32_t)page_handle;
3526f45ec7bSml29623 	offset = REG_FZC_RDC_OFFSET(RX_LOG_PAGE_HDL_REG, rdc);
3536f45ec7bSml29623 	NXGE_REG_WR64(handle, offset, page_hdl.value);
3546f45ec7bSml29623 
3556f45ec7bSml29623 	return (NPI_SUCCESS);
3566f45ec7bSml29623 }
3576f45ec7bSml29623 
3586f45ec7bSml29623 /*
3596f45ec7bSml29623  * RX DMA functions
3606f45ec7bSml29623  */
3616f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_rdc_ctl(npi_handle_t handle,uint8_t rdc,uint8_t op)3626f45ec7bSml29623 npi_rxdma_cfg_rdc_ctl(npi_handle_t handle, uint8_t rdc, uint8_t op)
3636f45ec7bSml29623 {
3646f45ec7bSml29623 
3656f45ec7bSml29623 	rxdma_cfig1_t cfg;
3666f45ec7bSml29623 	uint32_t count = RXDMA_RESET_TRY_COUNT;
3676f45ec7bSml29623 	uint32_t delay_time = RXDMA_RESET_DELAY;
3686f45ec7bSml29623 	uint32_t error = NPI_RXDMA_ERROR_ENCODE(NPI_RXDMA_RESET_ERR, rdc);
3696f45ec7bSml29623 
3706f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
3716f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
3726f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
3736f45ec7bSml29623 		    "npi_rxdma_cfg_rdc_ctl"
3746f45ec7bSml29623 		    " Illegal RDC number %d \n", rdc));
3756f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
3766f45ec7bSml29623 	}
3776f45ec7bSml29623 
3786f45ec7bSml29623 
3796f45ec7bSml29623 	switch (op) {
3806f45ec7bSml29623 		case RXDMA_OP_ENABLE:
3816f45ec7bSml29623 			RXDMA_REG_READ64(handle, RXDMA_CFIG1_REG, rdc,
3826f45ec7bSml29623 			    &cfg.value);
3836f45ec7bSml29623 			cfg.bits.ldw.en = 1;
3846f45ec7bSml29623 			RXDMA_REG_WRITE64(handle, RXDMA_CFIG1_REG,
3856f45ec7bSml29623 			    rdc, cfg.value);
3866f45ec7bSml29623 
3876f45ec7bSml29623 			NXGE_DELAY(delay_time);
3886f45ec7bSml29623 			RXDMA_REG_READ64(handle, RXDMA_CFIG1_REG, rdc,
3896f45ec7bSml29623 			    &cfg.value);
3906f45ec7bSml29623 			while ((count--) && (cfg.bits.ldw.qst == 0)) {
3916f45ec7bSml29623 				NXGE_DELAY(delay_time);
3926f45ec7bSml29623 				RXDMA_REG_READ64(handle, RXDMA_CFIG1_REG, rdc,
3936f45ec7bSml29623 				    &cfg.value);
3946f45ec7bSml29623 			}
3956f45ec7bSml29623 
3966f45ec7bSml29623 			if (cfg.bits.ldw.qst == 0) {
3976f45ec7bSml29623 				NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
3986f45ec7bSml29623 				    " npi_rxdma_cfg_rdc_ctl"
3996f45ec7bSml29623 				    " RXDMA_OP_ENABLE Failed for RDC %d \n",
4006f45ec7bSml29623 				    rdc));
4016f45ec7bSml29623 				return (error);
4026f45ec7bSml29623 			}
4036f45ec7bSml29623 
4046f45ec7bSml29623 			break;
4056f45ec7bSml29623 		case RXDMA_OP_DISABLE:
4066f45ec7bSml29623 			RXDMA_REG_READ64(handle, RXDMA_CFIG1_REG, rdc,
4076f45ec7bSml29623 			    &cfg.value);
4086f45ec7bSml29623 			cfg.bits.ldw.en = 0;
4096f45ec7bSml29623 			RXDMA_REG_WRITE64(handle, RXDMA_CFIG1_REG,
4106f45ec7bSml29623 			    rdc, cfg.value);
4116f45ec7bSml29623 
4126f45ec7bSml29623 			NXGE_DELAY(delay_time);
4136f45ec7bSml29623 			RXDMA_REG_READ64(handle, RXDMA_CFIG1_REG, rdc,
4146f45ec7bSml29623 			    &cfg.value);
4156f45ec7bSml29623 			while ((count--) && (cfg.bits.ldw.qst == 0)) {
4166f45ec7bSml29623 				NXGE_DELAY(delay_time);
4176f45ec7bSml29623 				RXDMA_REG_READ64(handle, RXDMA_CFIG1_REG, rdc,
4186f45ec7bSml29623 				    &cfg.value);
4196f45ec7bSml29623 			}
4206f45ec7bSml29623 			if (cfg.bits.ldw.qst == 0) {
4216f45ec7bSml29623 				NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
4226f45ec7bSml29623 				    " npi_rxdma_cfg_rdc_ctl"
4236f45ec7bSml29623 				    " RXDMA_OP_DISABLE Failed for RDC %d \n",
4246f45ec7bSml29623 				    rdc));
4256f45ec7bSml29623 				return (error);
4266f45ec7bSml29623 			}
4276f45ec7bSml29623 
4286f45ec7bSml29623 			break;
4296f45ec7bSml29623 		case RXDMA_OP_RESET:
4306f45ec7bSml29623 			cfg.value = 0;
4316f45ec7bSml29623 			cfg.bits.ldw.rst = 1;
4326f45ec7bSml29623 			RXDMA_REG_WRITE64(handle,
4336f45ec7bSml29623 			    RXDMA_CFIG1_REG,
4346f45ec7bSml29623 			    rdc, cfg.value);
4356f45ec7bSml29623 			NXGE_DELAY(delay_time);
4366f45ec7bSml29623 			RXDMA_REG_READ64(handle, RXDMA_CFIG1_REG, rdc,
4376f45ec7bSml29623 			    &cfg.value);
4386f45ec7bSml29623 			while ((count--) && (cfg.bits.ldw.rst)) {
4396f45ec7bSml29623 				NXGE_DELAY(delay_time);
4406f45ec7bSml29623 				RXDMA_REG_READ64(handle, RXDMA_CFIG1_REG, rdc,
4416f45ec7bSml29623 				    &cfg.value);
4426f45ec7bSml29623 			}
4436f45ec7bSml29623 			if (count == 0) {
4446f45ec7bSml29623 				NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
4456f45ec7bSml29623 				    " npi_rxdma_cfg_rdc_ctl"
4466f45ec7bSml29623 				    " Reset Failed for RDC %d \n",
4476f45ec7bSml29623 				    rdc));
4486f45ec7bSml29623 				return (error);
4496f45ec7bSml29623 			}
4506f45ec7bSml29623 			break;
4516f45ec7bSml29623 		default:
4526f45ec7bSml29623 			return (NPI_RXDMA_SW_PARAM_ERROR);
4536f45ec7bSml29623 	}
4546f45ec7bSml29623 
4556f45ec7bSml29623 	return (NPI_SUCCESS);
4566f45ec7bSml29623 }
4576f45ec7bSml29623 
4586f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_rdc_enable(npi_handle_t handle,uint8_t rdc)4596f45ec7bSml29623 npi_rxdma_cfg_rdc_enable(npi_handle_t handle, uint8_t rdc)
4606f45ec7bSml29623 {
4616f45ec7bSml29623 	return (npi_rxdma_cfg_rdc_ctl(handle, rdc, RXDMA_OP_ENABLE));
4626f45ec7bSml29623 }
4636f45ec7bSml29623 
4646f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_rdc_disable(npi_handle_t handle,uint8_t rdc)4656f45ec7bSml29623 npi_rxdma_cfg_rdc_disable(npi_handle_t handle, uint8_t rdc)
4666f45ec7bSml29623 {
4676f45ec7bSml29623 	return (npi_rxdma_cfg_rdc_ctl(handle, rdc, RXDMA_OP_DISABLE));
4686f45ec7bSml29623 }
4696f45ec7bSml29623 
4706f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_rdc_reset(npi_handle_t handle,uint8_t rdc)4716f45ec7bSml29623 npi_rxdma_cfg_rdc_reset(npi_handle_t handle, uint8_t rdc)
4726f45ec7bSml29623 {
4736f45ec7bSml29623 	return (npi_rxdma_cfg_rdc_ctl(handle, rdc, RXDMA_OP_RESET));
4746f45ec7bSml29623 }
4756f45ec7bSml29623 
4766f45ec7bSml29623 /*
477*9b622488SToomas Soome  * npi_rxdma_cfg_default_port_rdc()
4786f45ec7bSml29623  * Set the default rdc for the port
4796f45ec7bSml29623  *
4806f45ec7bSml29623  * Inputs:
4816f45ec7bSml29623  *	handle:		register handle interpreted by the underlying OS
4826f45ec7bSml29623  *	portnm:		Physical Port Number
4836f45ec7bSml29623  *	rdc:	RX DMA Channel number
4846f45ec7bSml29623  *
4856f45ec7bSml29623  * Return:
4866f45ec7bSml29623  * NPI_SUCCESS
4876f45ec7bSml29623  * NPI_RXDMA_RDC_INVALID
4886f45ec7bSml29623  * NPI_RXDMA_PORT_INVALID
4896f45ec7bSml29623  *
4906f45ec7bSml29623  */
npi_rxdma_cfg_default_port_rdc(npi_handle_t handle,uint8_t portnm,uint8_t rdc)4916f45ec7bSml29623 npi_status_t npi_rxdma_cfg_default_port_rdc(npi_handle_t handle,
4926f45ec7bSml29623 				    uint8_t portnm, uint8_t rdc)
4936f45ec7bSml29623 {
4946f45ec7bSml29623 
4956f45ec7bSml29623 	uint64_t offset;
4966f45ec7bSml29623 	def_pt_rdc_t cfg;
4976f45ec7bSml29623 
4986f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
4996f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
5006f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
5016f45ec7bSml29623 		    "rxdma_cfg_default_port_rdc"
5026f45ec7bSml29623 		    " Illegal RDC number %d \n",
5036f45ec7bSml29623 		    rdc));
5046f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
5056f45ec7bSml29623 	}
5066f45ec7bSml29623 
5076f45ec7bSml29623 	ASSERT(RXDMA_PORT_VALID(portnm));
5086f45ec7bSml29623 	if (!RXDMA_PORT_VALID(portnm)) {
5096f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
5106f45ec7bSml29623 		    "rxdma_cfg_default_port_rdc"
5116f45ec7bSml29623 		    " Illegal Port number %d \n",
5126f45ec7bSml29623 		    portnm));
5136f45ec7bSml29623 		return (NPI_RXDMA_PORT_INVALID);
5146f45ec7bSml29623 	}
5156f45ec7bSml29623 
5166f45ec7bSml29623 	offset = DEF_PT_RDC_REG(portnm);
5176f45ec7bSml29623 	cfg.value = 0;
5186f45ec7bSml29623 	cfg.bits.ldw.rdc = rdc;
5196f45ec7bSml29623 	NXGE_REG_WR64(handle, offset, cfg.value);
5206f45ec7bSml29623 	return (NPI_SUCCESS);
5216f45ec7bSml29623 }
5226f45ec7bSml29623 
5236f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_rdc_rcr_ctl(npi_handle_t handle,uint8_t rdc,uint8_t op,uint16_t param)5246f45ec7bSml29623 npi_rxdma_cfg_rdc_rcr_ctl(npi_handle_t handle, uint8_t rdc,
5256f45ec7bSml29623 			    uint8_t op, uint16_t param)
5266f45ec7bSml29623 {
5276f45ec7bSml29623 	rcrcfig_b_t rcr_cfgb;
5286f45ec7bSml29623 
5296f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
5306f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
5316f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
5326f45ec7bSml29623 		    "rxdma_cfg_rdc_rcr_ctl"
5336f45ec7bSml29623 		    " Illegal RDC number %d \n",
5346f45ec7bSml29623 		    rdc));
5356f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
5366f45ec7bSml29623 	}
5376f45ec7bSml29623 
5386f45ec7bSml29623 
5396f45ec7bSml29623 	RXDMA_REG_READ64(handle, RCRCFIG_B_REG, rdc, &rcr_cfgb.value);
5406f45ec7bSml29623 
5416f45ec7bSml29623 	switch (op) {
5426f45ec7bSml29623 		case RCR_TIMEOUT_ENABLE:
5436f45ec7bSml29623 			rcr_cfgb.bits.ldw.timeout = (uint8_t)param;
5446f45ec7bSml29623 			rcr_cfgb.bits.ldw.entout = 1;
5456f45ec7bSml29623 			break;
5466f45ec7bSml29623 
5476f45ec7bSml29623 		case RCR_THRESHOLD:
5486f45ec7bSml29623 			rcr_cfgb.bits.ldw.pthres = param;
5496f45ec7bSml29623 			break;
5506f45ec7bSml29623 
5516f45ec7bSml29623 		case RCR_TIMEOUT_DISABLE:
5526f45ec7bSml29623 			rcr_cfgb.bits.ldw.entout = 0;
5536f45ec7bSml29623 			break;
5546f45ec7bSml29623 
5556f45ec7bSml29623 		default:
5566f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
5576f45ec7bSml29623 		    "rxdma_cfg_rdc_rcr_ctl"
5586f45ec7bSml29623 		    " Illegal opcode %x \n",
5596f45ec7bSml29623 		    op));
5606f45ec7bSml29623 		return (NPI_RXDMA_OPCODE_INVALID(rdc));
5616f45ec7bSml29623 	}
5626f45ec7bSml29623 
5636f45ec7bSml29623 	RXDMA_REG_WRITE64(handle, RCRCFIG_B_REG, rdc, rcr_cfgb.value);
5646f45ec7bSml29623 	return (NPI_SUCCESS);
5656f45ec7bSml29623 }
5666f45ec7bSml29623 
5676f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_rdc_rcr_timeout_disable(npi_handle_t handle,uint8_t rdc)5686f45ec7bSml29623 npi_rxdma_cfg_rdc_rcr_timeout_disable(npi_handle_t handle, uint8_t rdc)
5696f45ec7bSml29623 {
5706f45ec7bSml29623 	return (npi_rxdma_cfg_rdc_rcr_ctl(handle, rdc,
5716f45ec7bSml29623 	    RCR_TIMEOUT_DISABLE, 0));
5726f45ec7bSml29623 }
5736f45ec7bSml29623 
5746f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_rdc_rcr_threshold(npi_handle_t handle,uint8_t rdc,uint16_t rcr_threshold)5756f45ec7bSml29623 npi_rxdma_cfg_rdc_rcr_threshold(npi_handle_t handle, uint8_t rdc,
5766f45ec7bSml29623 				    uint16_t rcr_threshold)
5776f45ec7bSml29623 {
5786f45ec7bSml29623 	return (npi_rxdma_cfg_rdc_rcr_ctl(handle, rdc,
5796f45ec7bSml29623 	    RCR_THRESHOLD, rcr_threshold));
5806f45ec7bSml29623 
5816f45ec7bSml29623 }
5826f45ec7bSml29623 
5836f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_rdc_rcr_timeout(npi_handle_t handle,uint8_t rdc,uint8_t rcr_timeout)5846f45ec7bSml29623 npi_rxdma_cfg_rdc_rcr_timeout(npi_handle_t handle, uint8_t rdc,
5856f45ec7bSml29623 			    uint8_t rcr_timeout)
5866f45ec7bSml29623 {
5876f45ec7bSml29623 	return (npi_rxdma_cfg_rdc_rcr_ctl(handle, rdc,
5886f45ec7bSml29623 	    RCR_TIMEOUT_ENABLE, rcr_timeout));
5896f45ec7bSml29623 
5906f45ec7bSml29623 }
5916f45ec7bSml29623 
5926f45ec7bSml29623 /*
5936f45ec7bSml29623  * npi_rxdma_cfg_rdc_ring()
5946f45ec7bSml29623  * Configure The RDC channel Rcv Buffer Ring
5956f45ec7bSml29623  */
5966f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_rdc_ring(npi_handle_t handle,uint8_t rdc,rdc_desc_cfg_t * rdc_desc_cfg,boolean_t new_off)5976f45ec7bSml29623 npi_rxdma_cfg_rdc_ring(npi_handle_t handle, uint8_t rdc,
5984df55fdeSJanie Lu 			    rdc_desc_cfg_t *rdc_desc_cfg, boolean_t new_off)
5996f45ec7bSml29623 {
6006f45ec7bSml29623 	rbr_cfig_a_t cfga;
6016f45ec7bSml29623 	rbr_cfig_b_t cfgb;
6026f45ec7bSml29623 	rxdma_cfig1_t cfg1;
6036f45ec7bSml29623 	rxdma_cfig2_t cfg2;
6046f45ec7bSml29623 	rcrcfig_a_t rcr_cfga;
6056f45ec7bSml29623 	rcrcfig_b_t rcr_cfgb;
6066f45ec7bSml29623 
6076f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
6086f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
6096f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
6106f45ec7bSml29623 		    "rxdma_cfg_rdc_ring"
6116f45ec7bSml29623 		    " Illegal RDC number %d \n",
6126f45ec7bSml29623 		    rdc));
6136f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
6146f45ec7bSml29623 	}
6156f45ec7bSml29623 
6166f45ec7bSml29623 
6176f45ec7bSml29623 	cfga.value = 0;
6186f45ec7bSml29623 	cfgb.value = 0;
6196f45ec7bSml29623 	cfg1.value = 0;
6206f45ec7bSml29623 	cfg2.value = 0;
6216f45ec7bSml29623 
6226f45ec7bSml29623 	if (rdc_desc_cfg->mbox_enable == 1) {
6236f45ec7bSml29623 		cfg1.bits.ldw.mbaddr_h =
6246f45ec7bSml29623 		    (rdc_desc_cfg->mbox_addr >> 32) & 0xfff;
6256f45ec7bSml29623 		cfg2.bits.ldw.mbaddr =
6266f45ec7bSml29623 		    ((rdc_desc_cfg->mbox_addr &
6276f45ec7bSml29623 		    RXDMA_CFIG2_MBADDR_L_MASK) >>
6286f45ec7bSml29623 		    RXDMA_CFIG2_MBADDR_L_SHIFT);
6296f45ec7bSml29623 
6306f45ec7bSml29623 
6316f45ec7bSml29623 		/*
6326f45ec7bSml29623 		 * Only after all the configurations are set, then
6336f45ec7bSml29623 		 * enable the RDC or else configuration fatal error
6346f45ec7bSml29623 		 * will be returned (especially if the Hypervisor
6356f45ec7bSml29623 		 * set up the logical pages with non-zero values.
6366f45ec7bSml29623 		 * This NPI function only sets up the configuration.
6376f45ec7bSml29623 		 */
6386f45ec7bSml29623 	}
6396f45ec7bSml29623 
6406f45ec7bSml29623 
6416f45ec7bSml29623 	if (rdc_desc_cfg->full_hdr == 1)
6426f45ec7bSml29623 		cfg2.bits.ldw.full_hdr = 1;
6436f45ec7bSml29623 
6444df55fdeSJanie Lu 	if (new_off) {
6454df55fdeSJanie Lu 		if (RXDMA_RF_BUFF_OFFSET_VALID(rdc_desc_cfg->offset)) {
6464df55fdeSJanie Lu 			switch (rdc_desc_cfg->offset) {
6474df55fdeSJanie Lu 			case SW_OFFSET_NO_OFFSET:
6484df55fdeSJanie Lu 			case SW_OFFSET_64:
6494df55fdeSJanie Lu 			case SW_OFFSET_128:
6504df55fdeSJanie Lu 			case SW_OFFSET_192:
6514df55fdeSJanie Lu 				cfg2.bits.ldw.offset = rdc_desc_cfg->offset;
6524df55fdeSJanie Lu 				cfg2.bits.ldw.offset256 = 0;
6534df55fdeSJanie Lu 				break;
6544df55fdeSJanie Lu 			case SW_OFFSET_256:
6554df55fdeSJanie Lu 			case SW_OFFSET_320:
6564df55fdeSJanie Lu 			case SW_OFFSET_384:
6574df55fdeSJanie Lu 			case SW_OFFSET_448:
6584df55fdeSJanie Lu 				cfg2.bits.ldw.offset =
6594df55fdeSJanie Lu 				    rdc_desc_cfg->offset & 0x3;
6604df55fdeSJanie Lu 				cfg2.bits.ldw.offset256 = 1;
6614df55fdeSJanie Lu 				break;
6624df55fdeSJanie Lu 			default:
6634df55fdeSJanie Lu 				cfg2.bits.ldw.offset = SW_OFFSET_NO_OFFSET;
6644df55fdeSJanie Lu 				cfg2.bits.ldw.offset256 = 0;
6654df55fdeSJanie Lu 			}
6664df55fdeSJanie Lu 		} else {
6674df55fdeSJanie Lu 			cfg2.bits.ldw.offset = SW_OFFSET_NO_OFFSET;
6684df55fdeSJanie Lu 			cfg2.bits.ldw.offset256 = 0;
6694df55fdeSJanie Lu 		}
6704df55fdeSJanie Lu 	} else {
6716f45ec7bSml29623 		if (RXDMA_BUFF_OFFSET_VALID(rdc_desc_cfg->offset)) {
6726f45ec7bSml29623 			cfg2.bits.ldw.offset = rdc_desc_cfg->offset;
6736f45ec7bSml29623 		} else {
6746f45ec7bSml29623 			cfg2.bits.ldw.offset = SW_OFFSET_NO_OFFSET;
6756f45ec7bSml29623 		}
6764df55fdeSJanie Lu 	}
6776f45ec7bSml29623 
6786f45ec7bSml29623 		/* rbr config */
6796f45ec7bSml29623 
6806f45ec7bSml29623 	cfga.value = (rdc_desc_cfg->rbr_addr & (RBR_CFIG_A_STDADDR_MASK |
6816f45ec7bSml29623 	    RBR_CFIG_A_STDADDR_BASE_MASK));
6826f45ec7bSml29623 
6836f45ec7bSml29623 	if ((rdc_desc_cfg->rbr_len < RBR_DEFAULT_MIN_LEN) ||
6846f45ec7bSml29623 	    (rdc_desc_cfg->rbr_len > RBR_DEFAULT_MAX_LEN)) {
6856f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
6866f45ec7bSml29623 		    "npi_rxdma_cfg_rdc_ring"
6876f45ec7bSml29623 		    " Illegal RBR Queue Length %d \n",
6886f45ec7bSml29623 		    rdc_desc_cfg->rbr_len));
689678453a8Sspeer 		return (NPI_RXDMA_ERROR_ENCODE(NPI_RXDMA_RBRSIZE_INVALID, rdc));
6906f45ec7bSml29623 	}
6916f45ec7bSml29623 
6926f45ec7bSml29623 
6936f45ec7bSml29623 	cfga.bits.hdw.len = rdc_desc_cfg->rbr_len;
6946f45ec7bSml29623 	NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
6956f45ec7bSml29623 	    "npi_rxdma_cfg_rdc_ring"
6966f45ec7bSml29623 	    " CFGA 0x%llx hdw.len %d (RBR LEN %d)\n",
6976f45ec7bSml29623 	    cfga.value, cfga.bits.hdw.len,
6986f45ec7bSml29623 	    rdc_desc_cfg->rbr_len));
6996f45ec7bSml29623 
7006f45ec7bSml29623 	if (rdc_desc_cfg->page_size == SIZE_4KB)
7016f45ec7bSml29623 		cfgb.bits.ldw.bksize = RBR_BKSIZE_4K;
7026f45ec7bSml29623 	else if (rdc_desc_cfg->page_size == SIZE_8KB)
7036f45ec7bSml29623 		cfgb.bits.ldw.bksize = RBR_BKSIZE_8K;
7046f45ec7bSml29623 	else if (rdc_desc_cfg->page_size == SIZE_16KB)
7056f45ec7bSml29623 		cfgb.bits.ldw.bksize = RBR_BKSIZE_16K;
7066f45ec7bSml29623 	else if (rdc_desc_cfg->page_size == SIZE_32KB)
7076f45ec7bSml29623 		cfgb.bits.ldw.bksize = RBR_BKSIZE_32K;
7086f45ec7bSml29623 	else {
7096f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
7106f45ec7bSml29623 		    "rxdma_cfg_rdc_ring"
7116f45ec7bSml29623 		    " blksize: Illegal buffer size %d \n",
7126f45ec7bSml29623 		    rdc_desc_cfg->page_size));
713678453a8Sspeer 		return (NPI_RXDMA_BUFSIZE_INVALID);
7146f45ec7bSml29623 	}
7156f45ec7bSml29623 
7166f45ec7bSml29623 	if (rdc_desc_cfg->valid0) {
7176f45ec7bSml29623 
7186f45ec7bSml29623 		if (rdc_desc_cfg->size0 == SIZE_256B)
7196f45ec7bSml29623 			cfgb.bits.ldw.bufsz0 = RBR_BUFSZ0_256B;
7206f45ec7bSml29623 		else if (rdc_desc_cfg->size0 == SIZE_512B)
7216f45ec7bSml29623 			cfgb.bits.ldw.bufsz0 = RBR_BUFSZ0_512B;
7226f45ec7bSml29623 		else if (rdc_desc_cfg->size0 == SIZE_1KB)
7236f45ec7bSml29623 			cfgb.bits.ldw.bufsz0 = RBR_BUFSZ0_1K;
7246f45ec7bSml29623 		else if (rdc_desc_cfg->size0 == SIZE_2KB)
7256f45ec7bSml29623 			cfgb.bits.ldw.bufsz0 = RBR_BUFSZ0_2K;
7266f45ec7bSml29623 		else {
7276f45ec7bSml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
7286f45ec7bSml29623 			    " rxdma_cfg_rdc_ring"
7296f45ec7bSml29623 			    " blksize0: Illegal buffer size %x \n",
7306f45ec7bSml29623 			    rdc_desc_cfg->size0));
731678453a8Sspeer 			return (NPI_RXDMA_BUFSIZE_INVALID);
7326f45ec7bSml29623 		}
7336f45ec7bSml29623 		cfgb.bits.ldw.vld0 = 1;
7346f45ec7bSml29623 	} else {
7356f45ec7bSml29623 		cfgb.bits.ldw.vld0 = 0;
7366f45ec7bSml29623 	}
7376f45ec7bSml29623 
7386f45ec7bSml29623 
7396f45ec7bSml29623 	if (rdc_desc_cfg->valid1) {
7406f45ec7bSml29623 		if (rdc_desc_cfg->size1 == SIZE_1KB)
7416f45ec7bSml29623 			cfgb.bits.ldw.bufsz1 = RBR_BUFSZ1_1K;
7426f45ec7bSml29623 		else if (rdc_desc_cfg->size1 == SIZE_2KB)
7436f45ec7bSml29623 			cfgb.bits.ldw.bufsz1 = RBR_BUFSZ1_2K;
7446f45ec7bSml29623 		else if (rdc_desc_cfg->size1 == SIZE_4KB)
7456f45ec7bSml29623 			cfgb.bits.ldw.bufsz1 = RBR_BUFSZ1_4K;
7466f45ec7bSml29623 		else if (rdc_desc_cfg->size1 == SIZE_8KB)
7476f45ec7bSml29623 			cfgb.bits.ldw.bufsz1 = RBR_BUFSZ1_8K;
7486f45ec7bSml29623 		else {
7496f45ec7bSml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
7506f45ec7bSml29623 			    " rxdma_cfg_rdc_ring"
7516f45ec7bSml29623 			    " blksize1: Illegal buffer size %x \n",
7526f45ec7bSml29623 			    rdc_desc_cfg->size1));
753678453a8Sspeer 			return (NPI_RXDMA_BUFSIZE_INVALID);
7546f45ec7bSml29623 		}
7556f45ec7bSml29623 		cfgb.bits.ldw.vld1 = 1;
7566f45ec7bSml29623 	} else {
7576f45ec7bSml29623 		cfgb.bits.ldw.vld1 = 0;
7586f45ec7bSml29623 	}
7596f45ec7bSml29623 
7606f45ec7bSml29623 
7616f45ec7bSml29623 	if (rdc_desc_cfg->valid2) {
7626f45ec7bSml29623 		if (rdc_desc_cfg->size2 == SIZE_2KB)
7636f45ec7bSml29623 			cfgb.bits.ldw.bufsz2 = RBR_BUFSZ2_2K;
7646f45ec7bSml29623 		else if (rdc_desc_cfg->size2 == SIZE_4KB)
7656f45ec7bSml29623 			cfgb.bits.ldw.bufsz2 = RBR_BUFSZ2_4K;
7666f45ec7bSml29623 		else if (rdc_desc_cfg->size2 == SIZE_8KB)
7676f45ec7bSml29623 			cfgb.bits.ldw.bufsz2 = RBR_BUFSZ2_8K;
7686f45ec7bSml29623 		else if (rdc_desc_cfg->size2 == SIZE_16KB)
7696f45ec7bSml29623 			cfgb.bits.ldw.bufsz2 = RBR_BUFSZ2_16K;
7706f45ec7bSml29623 		else {
7716f45ec7bSml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
7726f45ec7bSml29623 			    " rxdma_cfg_rdc_ring"
7736f45ec7bSml29623 			    " blksize2: Illegal buffer size %x \n",
7746f45ec7bSml29623 			    rdc_desc_cfg->size2));
775678453a8Sspeer 			return (NPI_RXDMA_BUFSIZE_INVALID);
7766f45ec7bSml29623 		}
7776f45ec7bSml29623 		cfgb.bits.ldw.vld2 = 1;
7786f45ec7bSml29623 	} else {
7796f45ec7bSml29623 		cfgb.bits.ldw.vld2 = 0;
7806f45ec7bSml29623 	}
7816f45ec7bSml29623 
7826f45ec7bSml29623 
7836f45ec7bSml29623 	rcr_cfga.value = (rdc_desc_cfg->rcr_addr &
7846f45ec7bSml29623 	    (RCRCFIG_A_STADDR_MASK |
7856f45ec7bSml29623 	    RCRCFIG_A_STADDR_BASE_MASK));
7866f45ec7bSml29623 
7876f45ec7bSml29623 
7886f45ec7bSml29623 	if ((rdc_desc_cfg->rcr_len < RCR_DEFAULT_MIN_LEN) ||
7896f45ec7bSml29623 	    (rdc_desc_cfg->rcr_len > NXGE_RCR_MAX)) {
7906f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
7916f45ec7bSml29623 		    " rxdma_cfg_rdc_ring"
7926f45ec7bSml29623 		    " Illegal RCR Queue Length %d \n",
7936f45ec7bSml29623 		    rdc_desc_cfg->rcr_len));
794678453a8Sspeer 		return (NPI_RXDMA_ERROR_ENCODE(NPI_RXDMA_RCRSIZE_INVALID, rdc));
7956f45ec7bSml29623 	}
7966f45ec7bSml29623 
7976f45ec7bSml29623 	rcr_cfga.bits.hdw.len = rdc_desc_cfg->rcr_len;
7986f45ec7bSml29623 
7996f45ec7bSml29623 
8006f45ec7bSml29623 	rcr_cfgb.value = 0;
8016f45ec7bSml29623 	if (rdc_desc_cfg->rcr_timeout_enable == 1) {
8026f45ec7bSml29623 		/* check if the rcr timeout value is valid */
8036f45ec7bSml29623 
8046f45ec7bSml29623 		if (RXDMA_RCR_TO_VALID(rdc_desc_cfg->rcr_timeout)) {
8056f45ec7bSml29623 			rcr_cfgb.bits.ldw.timeout = rdc_desc_cfg->rcr_timeout;
8066f45ec7bSml29623 			rcr_cfgb.bits.ldw.entout = 1;
8076f45ec7bSml29623 		} else {
8086f45ec7bSml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
8096f45ec7bSml29623 			    " rxdma_cfg_rdc_ring"
8106f45ec7bSml29623 			    " Illegal RCR Timeout value %d \n",
8116f45ec7bSml29623 			    rdc_desc_cfg->rcr_timeout));
8126f45ec7bSml29623 			rcr_cfgb.bits.ldw.entout = 0;
8136f45ec7bSml29623 		}
8146f45ec7bSml29623 	} else {
8156f45ec7bSml29623 		rcr_cfgb.bits.ldw.entout = 0;
8166f45ec7bSml29623 	}
8176f45ec7bSml29623 
8186f45ec7bSml29623 		/* check if the rcr threshold value is valid */
8196f45ec7bSml29623 	if (RXDMA_RCR_THRESH_VALID(rdc_desc_cfg->rcr_threshold)) {
8206f45ec7bSml29623 		rcr_cfgb.bits.ldw.pthres = rdc_desc_cfg->rcr_threshold;
8216f45ec7bSml29623 	} else {
8226f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
8236f45ec7bSml29623 		    " rxdma_cfg_rdc_ring"
8246f45ec7bSml29623 		    " Illegal RCR Threshold value %d \n",
8256f45ec7bSml29623 		    rdc_desc_cfg->rcr_threshold));
8266f45ec7bSml29623 		rcr_cfgb.bits.ldw.pthres = 1;
8276f45ec7bSml29623 	}
8286f45ec7bSml29623 
8296f45ec7bSml29623 		/* now do the actual HW configuration */
8306f45ec7bSml29623 	RXDMA_REG_WRITE64(handle, RXDMA_CFIG1_REG, rdc, cfg1.value);
8316f45ec7bSml29623 	RXDMA_REG_WRITE64(handle, RXDMA_CFIG2_REG, rdc, cfg2.value);
8326f45ec7bSml29623 
8336f45ec7bSml29623 
8346f45ec7bSml29623 	RXDMA_REG_WRITE64(handle, RBR_CFIG_A_REG, rdc, cfga.value);
8356f45ec7bSml29623 	RXDMA_REG_WRITE64(handle, RBR_CFIG_B_REG, rdc, cfgb.value);
8366f45ec7bSml29623 
8376f45ec7bSml29623 	RXDMA_REG_WRITE64(handle, RCRCFIG_A_REG, rdc, rcr_cfga.value);
8386f45ec7bSml29623 	RXDMA_REG_WRITE64(handle, RCRCFIG_B_REG, rdc, rcr_cfgb.value);
8396f45ec7bSml29623 
8406f45ec7bSml29623 	return (NPI_SUCCESS);
8416f45ec7bSml29623 
8426f45ec7bSml29623 }
8436f45ec7bSml29623 
8446f45ec7bSml29623 /*
8456f45ec7bSml29623  * npi_rxdma_red_discard_stat_get
8466f45ec7bSml29623  * Gets the current discrad count due RED
8476f45ec7bSml29623  * The counter overflow bit is cleared, if it has been set.
8486f45ec7bSml29623  *
8496f45ec7bSml29623  * Inputs:
8506f45ec7bSml29623  *      handle:	opaque handle interpreted by the underlying OS
8516f45ec7bSml29623  *	rdc:		RX DMA Channel number
8526f45ec7bSml29623  *	cnt:	Ptr to structure to write current RDC discard stat
8536f45ec7bSml29623  *
8546f45ec7bSml29623  * Return:
8556f45ec7bSml29623  * NPI_SUCCESS
8566f45ec7bSml29623  * NPI_RXDMA_RDC_INVALID
8576f45ec7bSml29623  *
8586f45ec7bSml29623  */
8596f45ec7bSml29623 npi_status_t
npi_rxdma_red_discard_stat_get(npi_handle_t handle,uint8_t rdc,rx_disc_cnt_t * cnt)8606f45ec7bSml29623 npi_rxdma_red_discard_stat_get(npi_handle_t handle, uint8_t rdc,
8616f45ec7bSml29623 				    rx_disc_cnt_t *cnt)
8626f45ec7bSml29623 {
8636f45ec7bSml29623 	uint64_t offset;
8646f45ec7bSml29623 
8656f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
8666f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
8676f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
8686f45ec7bSml29623 		    " npi_rxdma_red_discard_stat_get"
8696f45ec7bSml29623 		    " Illegal RDC Number %d \n",
8706f45ec7bSml29623 		    rdc));
8716f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
8726f45ec7bSml29623 	}
8736f45ec7bSml29623 
8746f45ec7bSml29623 	offset = RDC_RED_RDC_DISC_REG(rdc);
8756f45ec7bSml29623 	NXGE_REG_RD64(handle, offset, &cnt->value);
8766f45ec7bSml29623 	if (cnt->bits.ldw.oflow) {
8776f45ec7bSml29623 		NPI_DEBUG_MSG((handle.function, NPI_ERR_CTL,
8786f45ec7bSml29623 		    " npi_rxdma_red_discard_stat_get"
8796f45ec7bSml29623 		    " Counter overflow for channel %d ",
8806f45ec7bSml29623 		    " ..... clearing \n",
8816f45ec7bSml29623 		    rdc));
8826f45ec7bSml29623 		cnt->bits.ldw.oflow = 0;
8836f45ec7bSml29623 		NXGE_REG_WR64(handle, offset, cnt->value);
8846f45ec7bSml29623 		cnt->bits.ldw.oflow = 1;
8856f45ec7bSml29623 	}
8866f45ec7bSml29623 
8876f45ec7bSml29623 	return (NPI_SUCCESS);
8886f45ec7bSml29623 }
8896f45ec7bSml29623 
8906f45ec7bSml29623 /*
8916f45ec7bSml29623  * npi_rxdma_red_discard_oflow_clear
8926f45ec7bSml29623  * Clear RED discard counter overflow bit
8936f45ec7bSml29623  *
8946f45ec7bSml29623  * Inputs:
8956f45ec7bSml29623  *      handle:	opaque handle interpreted by the underlying OS
8966f45ec7bSml29623  *	rdc:		RX DMA Channel number
8976f45ec7bSml29623  *
8986f45ec7bSml29623  * Return:
8996f45ec7bSml29623  * NPI_SUCCESS
9006f45ec7bSml29623  * NPI_RXDMA_RDC_INVALID
9016f45ec7bSml29623  *
9026f45ec7bSml29623  */
9036f45ec7bSml29623 npi_status_t
npi_rxdma_red_discard_oflow_clear(npi_handle_t handle,uint8_t rdc)9046f45ec7bSml29623 npi_rxdma_red_discard_oflow_clear(npi_handle_t handle, uint8_t rdc)
9056f45ec7bSml29623 
9066f45ec7bSml29623 {
9076f45ec7bSml29623 	uint64_t offset;
9086f45ec7bSml29623 	rx_disc_cnt_t cnt;
9096f45ec7bSml29623 
9106f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
9116f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
9126f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
9136f45ec7bSml29623 			    " npi_rxdma_red_discard_oflow_clear"
9146f45ec7bSml29623 			    " Illegal RDC Number %d \n",
9156f45ec7bSml29623 			    rdc));
9166f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
9176f45ec7bSml29623 	}
9186f45ec7bSml29623 
9196f45ec7bSml29623 	offset = RDC_RED_RDC_DISC_REG(rdc);
9206f45ec7bSml29623 	NXGE_REG_RD64(handle, offset, &cnt.value);
9216f45ec7bSml29623 	if (cnt.bits.ldw.oflow) {
9226f45ec7bSml29623 		NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
9236f45ec7bSml29623 			    " npi_rxdma_red_discard_oflow_clear"
9246f45ec7bSml29623 			    " Counter overflow for channel %d ",
9256f45ec7bSml29623 			    " ..... clearing \n",
9266f45ec7bSml29623 			    rdc));
9276f45ec7bSml29623 		cnt.bits.ldw.oflow = 0;
9286f45ec7bSml29623 		NXGE_REG_WR64(handle, offset, cnt.value);
9296f45ec7bSml29623 	}
9306f45ec7bSml29623 	return (NPI_SUCCESS);
9316f45ec7bSml29623 }
9326f45ec7bSml29623 
9336f45ec7bSml29623 /*
9346f45ec7bSml29623  * npi_rxdma_misc_discard_stat_get
9356f45ec7bSml29623  * Gets the current discrad count for the rdc due to
9366f45ec7bSml29623  * buffer pool empty
9376f45ec7bSml29623  * The counter overflow bit is cleared, if it has been set.
9386f45ec7bSml29623  *
9396f45ec7bSml29623  * Inputs:
9406f45ec7bSml29623  *      handle:	opaque handle interpreted by the underlying OS
9416f45ec7bSml29623  *	rdc:		RX DMA Channel number
9426f45ec7bSml29623  *	cnt:	Ptr to structure to write current RDC discard stat
9436f45ec7bSml29623  *
9446f45ec7bSml29623  * Return:
9456f45ec7bSml29623  * NPI_SUCCESS
9466f45ec7bSml29623  * NPI_RXDMA_RDC_INVALID
9476f45ec7bSml29623  *
9486f45ec7bSml29623  */
9496f45ec7bSml29623 npi_status_t
npi_rxdma_misc_discard_stat_get(npi_handle_t handle,uint8_t rdc,rx_disc_cnt_t * cnt)9506f45ec7bSml29623 npi_rxdma_misc_discard_stat_get(npi_handle_t handle, uint8_t rdc,
9516f45ec7bSml29623 				    rx_disc_cnt_t *cnt)
9526f45ec7bSml29623 {
9536f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
9546f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
9556f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
9566f45ec7bSml29623 		    " npi_rxdma_misc_discard_stat_get"
9576f45ec7bSml29623 		    " Illegal RDC Number %d \n",
9586f45ec7bSml29623 		    rdc));
9596f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
9606f45ec7bSml29623 	}
9616f45ec7bSml29623 
9626f45ec7bSml29623 	RXDMA_REG_READ64(handle, RXMISC_DISCARD_REG, rdc, &cnt->value);
9636f45ec7bSml29623 	if (cnt->bits.ldw.oflow) {
9646f45ec7bSml29623 		NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
9656f45ec7bSml29623 		    " npi_rxdma_misc_discard_stat_get"
9666f45ec7bSml29623 		    " Counter overflow for channel %d ",
9676f45ec7bSml29623 		    " ..... clearing \n",
9686f45ec7bSml29623 		    rdc));
9696f45ec7bSml29623 		cnt->bits.ldw.oflow = 0;
9706f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RXMISC_DISCARD_REG, rdc, cnt->value);
9716f45ec7bSml29623 		cnt->bits.ldw.oflow = 1;
9726f45ec7bSml29623 	}
9736f45ec7bSml29623 
9746f45ec7bSml29623 	return (NPI_SUCCESS);
9756f45ec7bSml29623 }
9766f45ec7bSml29623 
9776f45ec7bSml29623 /*
9786f45ec7bSml29623  * npi_rxdma_red_discard_oflow_clear
9796f45ec7bSml29623  * Clear RED discard counter overflow bit
9806f45ec7bSml29623  * clear the overflow bit for  buffer pool empty discrad counter
9816f45ec7bSml29623  * for the rdc
9826f45ec7bSml29623  *
9836f45ec7bSml29623  * Inputs:
9846f45ec7bSml29623  *      handle:	opaque handle interpreted by the underlying OS
9856f45ec7bSml29623  *	rdc:		RX DMA Channel number
9866f45ec7bSml29623  *
9876f45ec7bSml29623  * Return:
9886f45ec7bSml29623  * NPI_SUCCESS
9896f45ec7bSml29623  * NPI_RXDMA_RDC_INVALID
9906f45ec7bSml29623  *
9916f45ec7bSml29623  */
9926f45ec7bSml29623 npi_status_t
npi_rxdma_misc_discard_oflow_clear(npi_handle_t handle,uint8_t rdc)9936f45ec7bSml29623 npi_rxdma_misc_discard_oflow_clear(npi_handle_t handle, uint8_t rdc)
9946f45ec7bSml29623 {
9956f45ec7bSml29623 	rx_disc_cnt_t cnt;
9966f45ec7bSml29623 
9976f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
9986f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
9996f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
10006f45ec7bSml29623 		    " npi_rxdma_misc_discard_oflow_clear"
10016f45ec7bSml29623 		    " Illegal RDC Number %d \n",
10026f45ec7bSml29623 		    rdc));
10036f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
10046f45ec7bSml29623 	}
10056f45ec7bSml29623 
10066f45ec7bSml29623 	RXDMA_REG_READ64(handle, RXMISC_DISCARD_REG, rdc, &cnt.value);
10076f45ec7bSml29623 	if (cnt.bits.ldw.oflow) {
10086f45ec7bSml29623 		NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
10096f45ec7bSml29623 		    " npi_rxdma_misc_discard_oflow_clear"
10106f45ec7bSml29623 		    " Counter overflow for channel %d ",
10116f45ec7bSml29623 		    " ..... clearing \n",
10126f45ec7bSml29623 		    rdc));
10136f45ec7bSml29623 		cnt.bits.ldw.oflow = 0;
10146f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RXMISC_DISCARD_REG, rdc, cnt.value);
10156f45ec7bSml29623 	}
10166f45ec7bSml29623 
10176f45ec7bSml29623 	return (NPI_SUCCESS);
10186f45ec7bSml29623 }
10196f45ec7bSml29623 
10206f45ec7bSml29623 /*
10216f45ec7bSml29623  * npi_rxdma_ring_perr_stat_get
10226f45ec7bSml29623  * Gets the current RDC Memory parity error
10236f45ec7bSml29623  * The counter overflow bit is cleared, if it has been set.
10246f45ec7bSml29623  *
10256f45ec7bSml29623  * Inputs:
10266f45ec7bSml29623  * handle:	opaque handle interpreted by the underlying OS
10276f45ec7bSml29623  * pre_log:	Structure to write current RDC Prefetch memory
10286f45ec7bSml29623  *		Parity Error stat
10296f45ec7bSml29623  * sha_log:	Structure to write current RDC Shadow memory
10306f45ec7bSml29623  *		Parity Error stat
10316f45ec7bSml29623  *
10326f45ec7bSml29623  * Return:
10336f45ec7bSml29623  * NPI_SUCCESS
10346f45ec7bSml29623  *
10356f45ec7bSml29623  */
10366f45ec7bSml29623 npi_status_t
npi_rxdma_ring_perr_stat_get(npi_handle_t handle,rdmc_par_err_log_t * pre_log,rdmc_par_err_log_t * sha_log)10376f45ec7bSml29623 npi_rxdma_ring_perr_stat_get(npi_handle_t handle,
10386f45ec7bSml29623 			    rdmc_par_err_log_t *pre_log,
10396f45ec7bSml29623 			    rdmc_par_err_log_t *sha_log)
10406f45ec7bSml29623 {
10416f45ec7bSml29623 	uint64_t pre_offset, sha_offset;
10426f45ec7bSml29623 	rdmc_par_err_log_t clr;
10436f45ec7bSml29623 	int clr_bits = 0;
10446f45ec7bSml29623 
10456f45ec7bSml29623 	pre_offset = RDMC_PRE_PAR_ERR_REG;
10466f45ec7bSml29623 	sha_offset = RDMC_SHA_PAR_ERR_REG;
10476f45ec7bSml29623 	NXGE_REG_RD64(handle, pre_offset, &pre_log->value);
10486f45ec7bSml29623 	NXGE_REG_RD64(handle, sha_offset, &sha_log->value);
10496f45ec7bSml29623 
10506f45ec7bSml29623 	clr.value = pre_log->value;
10516f45ec7bSml29623 	if (pre_log->bits.ldw.err) {
10526f45ec7bSml29623 		NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
10536f45ec7bSml29623 		    " npi_rxdma_ring_perr_stat_get"
10546f45ec7bSml29623 		    " PRE ERR Bit set ..... clearing \n"));
10556f45ec7bSml29623 		clr.bits.ldw.err = 0;
10566f45ec7bSml29623 		clr_bits++;
10576f45ec7bSml29623 	}
10586f45ec7bSml29623 
10596f45ec7bSml29623 	if (pre_log->bits.ldw.merr) {
10606f45ec7bSml29623 		NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
10616f45ec7bSml29623 		    " npi_rxdma_ring_perr_stat_get"
10626f45ec7bSml29623 		    " PRE MERR Bit set ..... clearing \n"));
10636f45ec7bSml29623 		clr.bits.ldw.merr = 0;
10646f45ec7bSml29623 		clr_bits++;
10656f45ec7bSml29623 	}
10666f45ec7bSml29623 
10676f45ec7bSml29623 	if (clr_bits) {
10686f45ec7bSml29623 		NXGE_REG_WR64(handle, pre_offset, clr.value);
10696f45ec7bSml29623 	}
10706f45ec7bSml29623 
10716f45ec7bSml29623 	clr_bits = 0;
10726f45ec7bSml29623 	clr.value = sha_log->value;
10736f45ec7bSml29623 	if (sha_log->bits.ldw.err) {
10746f45ec7bSml29623 		NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
10756f45ec7bSml29623 		    " npi_rxdma_ring_perr_stat_get"
10766f45ec7bSml29623 		    " SHA ERR Bit set ..... clearing \n"));
10776f45ec7bSml29623 		clr.bits.ldw.err = 0;
10786f45ec7bSml29623 		clr_bits++;
10796f45ec7bSml29623 	}
10806f45ec7bSml29623 
10816f45ec7bSml29623 	if (sha_log->bits.ldw.merr) {
10826f45ec7bSml29623 		NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
10836f45ec7bSml29623 		    " npi_rxdma_ring_perr_stat_get"
10846f45ec7bSml29623 		    " SHA MERR Bit set ..... clearing \n"));
10856f45ec7bSml29623 		clr.bits.ldw.merr = 0;
10866f45ec7bSml29623 		clr_bits++;
10876f45ec7bSml29623 	}
10886f45ec7bSml29623 
10896f45ec7bSml29623 	if (clr_bits) {
10906f45ec7bSml29623 		NXGE_REG_WR64(handle, sha_offset, clr.value);
10916f45ec7bSml29623 	}
10926f45ec7bSml29623 
10936f45ec7bSml29623 	return (NPI_SUCCESS);
10946f45ec7bSml29623 }
10956f45ec7bSml29623 
10966f45ec7bSml29623 /*
10976f45ec7bSml29623  * npi_rxdma_ring_perr_stat_clear
10986f45ec7bSml29623  * Clear RDC Memory Parity Error counter overflow bits
10996f45ec7bSml29623  *
11006f45ec7bSml29623  * Inputs:
11016f45ec7bSml29623  *      handle:	opaque handle interpreted by the underlying OS
11026f45ec7bSml29623  * Return:
11036f45ec7bSml29623  * NPI_SUCCESS
11046f45ec7bSml29623  *
11056f45ec7bSml29623  */
11066f45ec7bSml29623 npi_status_t
npi_rxdma_ring_perr_stat_clear(npi_handle_t handle)11076f45ec7bSml29623 npi_rxdma_ring_perr_stat_clear(npi_handle_t handle)
11086f45ec7bSml29623 {
11096f45ec7bSml29623 	uint64_t pre_offset, sha_offset;
11106f45ec7bSml29623 	rdmc_par_err_log_t clr;
11116f45ec7bSml29623 	int clr_bits = 0;
11126f45ec7bSml29623 	pre_offset = RDMC_PRE_PAR_ERR_REG;
11136f45ec7bSml29623 	sha_offset = RDMC_SHA_PAR_ERR_REG;
11146f45ec7bSml29623 
11156f45ec7bSml29623 	NXGE_REG_RD64(handle, pre_offset, &clr.value);
11166f45ec7bSml29623 
11176f45ec7bSml29623 	if (clr.bits.ldw.err) {
11186f45ec7bSml29623 		NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
11196f45ec7bSml29623 		    " npi_rxdma_ring_perr_stat_get"
11206f45ec7bSml29623 		    " PRE ERR Bit set ..... clearing \n"));
11216f45ec7bSml29623 		clr.bits.ldw.err = 0;
11226f45ec7bSml29623 		clr_bits++;
11236f45ec7bSml29623 	}
11246f45ec7bSml29623 
11256f45ec7bSml29623 	if (clr.bits.ldw.merr) {
11266f45ec7bSml29623 		NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
11276f45ec7bSml29623 		    " npi_rxdma_ring_perr_stat_get"
11286f45ec7bSml29623 		    " PRE MERR Bit set ..... clearing \n"));
11296f45ec7bSml29623 		clr.bits.ldw.merr = 0;
11306f45ec7bSml29623 		clr_bits++;
11316f45ec7bSml29623 	}
11326f45ec7bSml29623 
11336f45ec7bSml29623 	if (clr_bits) {
11346f45ec7bSml29623 		NXGE_REG_WR64(handle, pre_offset, clr.value);
11356f45ec7bSml29623 	}
11366f45ec7bSml29623 
11376f45ec7bSml29623 	clr_bits = 0;
11386f45ec7bSml29623 	NXGE_REG_RD64(handle, sha_offset, &clr.value);
11396f45ec7bSml29623 	if (clr.bits.ldw.err) {
11406f45ec7bSml29623 		NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
11416f45ec7bSml29623 		    " npi_rxdma_ring_perr_stat_get"
11426f45ec7bSml29623 		    " SHA ERR Bit set ..... clearing \n"));
11436f45ec7bSml29623 		clr.bits.ldw.err = 0;
11446f45ec7bSml29623 		clr_bits++;
11456f45ec7bSml29623 	}
11466f45ec7bSml29623 
11476f45ec7bSml29623 	if (clr.bits.ldw.merr) {
11486f45ec7bSml29623 		NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
11496f45ec7bSml29623 		    " npi_rxdma_ring_perr_stat_get"
11506f45ec7bSml29623 		    " SHA MERR Bit set ..... clearing \n"));
11516f45ec7bSml29623 		clr.bits.ldw.merr = 0;
11526f45ec7bSml29623 		clr_bits++;
11536f45ec7bSml29623 	}
11546f45ec7bSml29623 
11556f45ec7bSml29623 	if (clr_bits) {
11566f45ec7bSml29623 		NXGE_REG_WR64(handle, sha_offset, clr.value);
11576f45ec7bSml29623 	}
11586f45ec7bSml29623 
11596f45ec7bSml29623 	return (NPI_SUCCESS);
11606f45ec7bSml29623 }
11616f45ec7bSml29623 
11626f45ec7bSml29623 /*
11636f45ec7bSml29623  * Access the RDMC Memory: used for debugging
11646f45ec7bSml29623  */
11656f45ec7bSml29623 npi_status_t
npi_rxdma_rdmc_memory_io(npi_handle_t handle,rdmc_mem_access_t * data,uint8_t op)11666f45ec7bSml29623 npi_rxdma_rdmc_memory_io(npi_handle_t handle,
11676f45ec7bSml29623 			    rdmc_mem_access_t *data, uint8_t op)
11686f45ec7bSml29623 {
11696f45ec7bSml29623 	uint64_t d0_offset, d1_offset, d2_offset, d3_offset, d4_offset;
11706f45ec7bSml29623 	uint64_t addr_offset;
11716f45ec7bSml29623 	rdmc_mem_addr_t addr;
11726f45ec7bSml29623 	rdmc_mem_data_t d0, d1, d2, d3, d4;
11736f45ec7bSml29623 	d0.value = 0;
11746f45ec7bSml29623 	d1.value = 0;
11756f45ec7bSml29623 	d2.value = 0;
11766f45ec7bSml29623 	d3.value = 0;
11776f45ec7bSml29623 	d4.value = 0;
11786f45ec7bSml29623 	addr.value = 0;
11796f45ec7bSml29623 
11806f45ec7bSml29623 
11816f45ec7bSml29623 	if ((data->location != RDMC_MEM_ADDR_PREFETCH) &&
11826f45ec7bSml29623 	    (data->location != RDMC_MEM_ADDR_SHADOW)) {
11836f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
11846f45ec7bSml29623 		    " npi_rxdma_rdmc_memory_io"
11856f45ec7bSml29623 		    " Illegal memory Type %x \n",
11866f45ec7bSml29623 		    data->location));
11876f45ec7bSml29623 		return (NPI_RXDMA_OPCODE_INVALID(0));
11886f45ec7bSml29623 	}
11896f45ec7bSml29623 
11906f45ec7bSml29623 	addr_offset = RDMC_MEM_ADDR_REG;
11916f45ec7bSml29623 	addr.bits.ldw.addr = data->addr;
11926f45ec7bSml29623 	addr.bits.ldw.pre_shad = data->location;
11936f45ec7bSml29623 
11946f45ec7bSml29623 	d0_offset = RDMC_MEM_DATA0_REG;
11956f45ec7bSml29623 	d1_offset = RDMC_MEM_DATA1_REG;
11966f45ec7bSml29623 	d2_offset = RDMC_MEM_DATA2_REG;
11976f45ec7bSml29623 	d3_offset = RDMC_MEM_DATA3_REG;
11986f45ec7bSml29623 	d4_offset = RDMC_MEM_DATA4_REG;
11996f45ec7bSml29623 
12006f45ec7bSml29623 
12016f45ec7bSml29623 	if (op == RDMC_MEM_WRITE) {
12026f45ec7bSml29623 		d0.bits.ldw.data = data->data[0];
12036f45ec7bSml29623 		d1.bits.ldw.data = data->data[1];
12046f45ec7bSml29623 		d2.bits.ldw.data = data->data[2];
12056f45ec7bSml29623 		d3.bits.ldw.data = data->data[3];
12066f45ec7bSml29623 		d4.bits.ldw.data = data->data[4];
12076f45ec7bSml29623 		NXGE_REG_WR64(handle, addr_offset, addr.value);
12086f45ec7bSml29623 		NXGE_REG_WR64(handle, d0_offset, d0.value);
12096f45ec7bSml29623 		NXGE_REG_WR64(handle, d1_offset, d1.value);
12106f45ec7bSml29623 		NXGE_REG_WR64(handle, d2_offset, d2.value);
12116f45ec7bSml29623 		NXGE_REG_WR64(handle, d3_offset, d3.value);
12126f45ec7bSml29623 		NXGE_REG_WR64(handle, d4_offset, d4.value);
12136f45ec7bSml29623 	}
12146f45ec7bSml29623 
12156f45ec7bSml29623 	if (op == RDMC_MEM_READ) {
12166f45ec7bSml29623 		NXGE_REG_WR64(handle, addr_offset, addr.value);
12176f45ec7bSml29623 		NXGE_REG_RD64(handle, d4_offset, &d4.value);
12186f45ec7bSml29623 		NXGE_REG_RD64(handle, d3_offset, &d3.value);
12196f45ec7bSml29623 		NXGE_REG_RD64(handle, d2_offset, &d2.value);
12206f45ec7bSml29623 		NXGE_REG_RD64(handle, d1_offset, &d1.value);
12216f45ec7bSml29623 		NXGE_REG_RD64(handle, d0_offset, &d0.value);
12226f45ec7bSml29623 
12236f45ec7bSml29623 		data->data[0] = d0.bits.ldw.data;
12246f45ec7bSml29623 		data->data[1] = d1.bits.ldw.data;
12256f45ec7bSml29623 		data->data[2] = d2.bits.ldw.data;
12266f45ec7bSml29623 		data->data[3] = d3.bits.ldw.data;
12276f45ec7bSml29623 		data->data[4] = d4.bits.ldw.data;
12286f45ec7bSml29623 	} else {
12296f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
12306f45ec7bSml29623 		    " npi_rxdma_rdmc_memory_io"
12316f45ec7bSml29623 		    " Illegal opcode %x \n",
12326f45ec7bSml29623 		    op));
12336f45ec7bSml29623 		return (NPI_RXDMA_OPCODE_INVALID(0));
12346f45ec7bSml29623 
12356f45ec7bSml29623 	}
12366f45ec7bSml29623 
12376f45ec7bSml29623 	return (NPI_SUCCESS);
12386f45ec7bSml29623 }
12396f45ec7bSml29623 
12406f45ec7bSml29623 /*
12416f45ec7bSml29623  * system wide conf functions
12426f45ec7bSml29623  */
12436f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_clock_div_set(npi_handle_t handle,uint16_t count)12446f45ec7bSml29623 npi_rxdma_cfg_clock_div_set(npi_handle_t handle, uint16_t count)
12456f45ec7bSml29623 {
12466f45ec7bSml29623 	uint64_t offset;
12476f45ec7bSml29623 	rx_dma_ck_div_t clk_div;
12486f45ec7bSml29623 
12496f45ec7bSml29623 	offset = RX_DMA_CK_DIV_REG;
12506f45ec7bSml29623 
12516f45ec7bSml29623 	clk_div.value = 0;
12526f45ec7bSml29623 	clk_div.bits.ldw.cnt = count;
12536f45ec7bSml29623 	NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
12546f45ec7bSml29623 	    " npi_rxdma_cfg_clock_div_set: add 0x%llx "
12556f45ec7bSml29623 	    "handle 0x%llx value 0x%llx",
12566f45ec7bSml29623 	    handle.regp, handle.regh, clk_div.value));
12576f45ec7bSml29623 
12586f45ec7bSml29623 	NXGE_REG_WR64(handle, offset, clk_div.value);
12596f45ec7bSml29623 
12606f45ec7bSml29623 	return (NPI_SUCCESS);
12616f45ec7bSml29623 }
12626f45ec7bSml29623 
12636f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_red_rand_init(npi_handle_t handle,uint16_t init_value)12646f45ec7bSml29623 npi_rxdma_cfg_red_rand_init(npi_handle_t handle, uint16_t init_value)
12656f45ec7bSml29623 {
12666f45ec7bSml29623 	uint64_t offset;
12676f45ec7bSml29623 	red_ran_init_t rand_reg;
12686f45ec7bSml29623 
12696f45ec7bSml29623 	offset = RED_RAN_INIT_REG;
12706f45ec7bSml29623 
12716f45ec7bSml29623 	rand_reg.value = 0;
12726f45ec7bSml29623 	rand_reg.bits.ldw.init = init_value;
12736f45ec7bSml29623 	rand_reg.bits.ldw.enable = 1;
12746f45ec7bSml29623 	NXGE_REG_WR64(handle, offset, rand_reg.value);
12756f45ec7bSml29623 
12766f45ec7bSml29623 	return (NPI_SUCCESS);
12776f45ec7bSml29623 
12786f45ec7bSml29623 }
12796f45ec7bSml29623 
12806f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_red_rand_disable(npi_handle_t handle)12816f45ec7bSml29623 npi_rxdma_cfg_red_rand_disable(npi_handle_t handle)
12826f45ec7bSml29623 {
12836f45ec7bSml29623 	uint64_t offset;
12846f45ec7bSml29623 	red_ran_init_t rand_reg;
12856f45ec7bSml29623 
12866f45ec7bSml29623 	offset = RED_RAN_INIT_REG;
12876f45ec7bSml29623 
12886f45ec7bSml29623 	NXGE_REG_RD64(handle, offset, &rand_reg.value);
12896f45ec7bSml29623 	rand_reg.bits.ldw.enable = 0;
12906f45ec7bSml29623 	NXGE_REG_WR64(handle, offset, rand_reg.value);
12916f45ec7bSml29623 
12926f45ec7bSml29623 	return (NPI_SUCCESS);
12936f45ec7bSml29623 
12946f45ec7bSml29623 }
12956f45ec7bSml29623 
12966f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_32bitmode_enable(npi_handle_t handle)12976f45ec7bSml29623 npi_rxdma_cfg_32bitmode_enable(npi_handle_t handle)
12986f45ec7bSml29623 {
12996f45ec7bSml29623 	uint64_t offset;
13006f45ec7bSml29623 	rx_addr_md_t md_reg;
13016f45ec7bSml29623 	offset = RX_ADDR_MD_REG;
13026f45ec7bSml29623 	md_reg.value = 0;
13036f45ec7bSml29623 	md_reg.bits.ldw.mode32 = 1;
13046f45ec7bSml29623 
13056f45ec7bSml29623 	NXGE_REG_WR64(handle, offset, md_reg.value);
13066f45ec7bSml29623 	return (NPI_SUCCESS);
13076f45ec7bSml29623 
13086f45ec7bSml29623 }
13096f45ec7bSml29623 
13106f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_32bitmode_disable(npi_handle_t handle)13116f45ec7bSml29623 npi_rxdma_cfg_32bitmode_disable(npi_handle_t handle)
13126f45ec7bSml29623 {
13136f45ec7bSml29623 	uint64_t offset;
13146f45ec7bSml29623 	rx_addr_md_t md_reg;
13156f45ec7bSml29623 	offset = RX_ADDR_MD_REG;
13166f45ec7bSml29623 	md_reg.value = 0;
13176f45ec7bSml29623 
13186f45ec7bSml29623 	NXGE_REG_WR64(handle, offset, md_reg.value);
13196f45ec7bSml29623 	return (NPI_SUCCESS);
13206f45ec7bSml29623 
13216f45ec7bSml29623 }
13226f45ec7bSml29623 
13236f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_ram_access_enable(npi_handle_t handle)13246f45ec7bSml29623 npi_rxdma_cfg_ram_access_enable(npi_handle_t handle)
13256f45ec7bSml29623 {
13266f45ec7bSml29623 	uint64_t offset;
13276f45ec7bSml29623 	rx_addr_md_t md_reg;
13286f45ec7bSml29623 	offset = RX_ADDR_MD_REG;
13296f45ec7bSml29623 	NXGE_REG_RD64(handle, offset, &md_reg.value);
13306f45ec7bSml29623 	md_reg.bits.ldw.ram_acc = 1;
13316f45ec7bSml29623 	NXGE_REG_WR64(handle, offset, md_reg.value);
13326f45ec7bSml29623 	return (NPI_SUCCESS);
13336f45ec7bSml29623 
13346f45ec7bSml29623 }
13356f45ec7bSml29623 
13366f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_ram_access_disable(npi_handle_t handle)13376f45ec7bSml29623 npi_rxdma_cfg_ram_access_disable(npi_handle_t handle)
13386f45ec7bSml29623 {
13396f45ec7bSml29623 	uint64_t offset;
13406f45ec7bSml29623 	rx_addr_md_t md_reg;
13416f45ec7bSml29623 	offset = RX_ADDR_MD_REG;
13426f45ec7bSml29623 	NXGE_REG_RD64(handle, offset, &md_reg.value);
13436f45ec7bSml29623 	md_reg.bits.ldw.ram_acc = 0;
13446f45ec7bSml29623 	NXGE_REG_WR64(handle, offset, md_reg.value);
13456f45ec7bSml29623 	return (NPI_SUCCESS);
13466f45ec7bSml29623 
13476f45ec7bSml29623 }
13486f45ec7bSml29623 
13496f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_port_ddr_weight(npi_handle_t handle,uint8_t portnm,uint32_t weight)13506f45ec7bSml29623 npi_rxdma_cfg_port_ddr_weight(npi_handle_t handle,
13516f45ec7bSml29623 				    uint8_t portnm, uint32_t weight)
13526f45ec7bSml29623 {
13536f45ec7bSml29623 
13546f45ec7bSml29623 	pt_drr_wt_t wt_reg;
13556f45ec7bSml29623 	uint64_t offset;
13566f45ec7bSml29623 
13576f45ec7bSml29623 	ASSERT(RXDMA_PORT_VALID(portnm));
13586f45ec7bSml29623 	if (!RXDMA_PORT_VALID(portnm)) {
13596f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
13606f45ec7bSml29623 		    " rxdma_cfg_port_ddr_weight"
13616f45ec7bSml29623 		    " Illegal Port Number %d \n",
13626f45ec7bSml29623 		    portnm));
13636f45ec7bSml29623 		return (NPI_RXDMA_PORT_INVALID);
13646f45ec7bSml29623 	}
13656f45ec7bSml29623 
13666f45ec7bSml29623 	offset = PT_DRR_WT_REG(portnm);
13676f45ec7bSml29623 	wt_reg.value = 0;
13686f45ec7bSml29623 	wt_reg.bits.ldw.wt = weight;
13696f45ec7bSml29623 	NXGE_REG_WR64(handle, offset, wt_reg.value);
13706f45ec7bSml29623 	return (NPI_SUCCESS);
13716f45ec7bSml29623 }
13726f45ec7bSml29623 
13736f45ec7bSml29623 npi_status_t
npi_rxdma_port_usage_get(npi_handle_t handle,uint8_t portnm,uint32_t * blocks)13746f45ec7bSml29623 npi_rxdma_port_usage_get(npi_handle_t handle,
13756f45ec7bSml29623 				    uint8_t portnm, uint32_t *blocks)
13766f45ec7bSml29623 {
13776f45ec7bSml29623 
13786f45ec7bSml29623 	pt_use_t use_reg;
13796f45ec7bSml29623 	uint64_t offset;
13806f45ec7bSml29623 
13816f45ec7bSml29623 	ASSERT(RXDMA_PORT_VALID(portnm));
13826f45ec7bSml29623 	if (!RXDMA_PORT_VALID(portnm)) {
13836f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
13846f45ec7bSml29623 		    " rxdma_port_usage_get"
13856f45ec7bSml29623 		    " Illegal Port Number %d \n",
13866f45ec7bSml29623 		    portnm));
13876f45ec7bSml29623 		return (NPI_RXDMA_PORT_INVALID);
13886f45ec7bSml29623 	}
13896f45ec7bSml29623 
13906f45ec7bSml29623 	offset = PT_USE_REG(portnm);
13916f45ec7bSml29623 	NXGE_REG_RD64(handle, offset, &use_reg.value);
13926f45ec7bSml29623 	*blocks = use_reg.bits.ldw.cnt;
13936f45ec7bSml29623 	return (NPI_SUCCESS);
13946f45ec7bSml29623 
13956f45ec7bSml29623 }
13966f45ec7bSml29623 
13976f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_wred_param(npi_handle_t handle,uint8_t rdc,rdc_red_para_t * wred_params)13986f45ec7bSml29623 npi_rxdma_cfg_wred_param(npi_handle_t handle, uint8_t rdc,
13996f45ec7bSml29623 				    rdc_red_para_t *wred_params)
14006f45ec7bSml29623 {
14016f45ec7bSml29623 	rdc_red_para_t wred_reg;
14026f45ec7bSml29623 	uint64_t offset;
14036f45ec7bSml29623 
14046f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
14056f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
14066f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
14076f45ec7bSml29623 		    " rxdma_cfg_wred_param"
14086f45ec7bSml29623 		    " Illegal RDC Number %d \n",
14096f45ec7bSml29623 		    rdc));
14106f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
14116f45ec7bSml29623 	}
14126f45ec7bSml29623 
14136f45ec7bSml29623 	/*
14146f45ec7bSml29623 	 * need to update RDC_RED_PARA_REG as well as bit defs in
14156f45ec7bSml29623 	 * the hw header file
14166f45ec7bSml29623 	 */
14176f45ec7bSml29623 	offset = RDC_RED_RDC_PARA_REG(rdc);
14186f45ec7bSml29623 
14196f45ec7bSml29623 	NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
14206f45ec7bSml29623 	    " npi_rxdma_cfg_wred_param: "
14216f45ec7bSml29623 	    "set RED_PARA: passed value 0x%llx "
14226f45ec7bSml29623 	    "win 0x%x thre 0x%x sync 0x%x thre_sync 0x%x",
14236f45ec7bSml29623 	    wred_params->value,
14246f45ec7bSml29623 	    wred_params->bits.ldw.win,
14256f45ec7bSml29623 	    wred_params->bits.ldw.thre,
14266f45ec7bSml29623 	    wred_params->bits.ldw.win_syn,
14276f45ec7bSml29623 	    wred_params->bits.ldw.thre_sync));
14286f45ec7bSml29623 
14296f45ec7bSml29623 	wred_reg.value = 0;
14306f45ec7bSml29623 	wred_reg.bits.ldw.win = wred_params->bits.ldw.win;
14316f45ec7bSml29623 	wred_reg.bits.ldw.thre = wred_params->bits.ldw.thre;
14326f45ec7bSml29623 	wred_reg.bits.ldw.win_syn = wred_params->bits.ldw.win_syn;
14336f45ec7bSml29623 	wred_reg.bits.ldw.thre_sync = wred_params->bits.ldw.thre_sync;
14346f45ec7bSml29623 	NXGE_REG_WR64(handle, offset, wred_reg.value);
14356f45ec7bSml29623 
14366f45ec7bSml29623 	NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
14376f45ec7bSml29623 	    "set RED_PARA: value 0x%llx "
14386f45ec7bSml29623 	    "win 0x%x thre 0x%x sync 0x%x thre_sync 0x%x",
14396f45ec7bSml29623 	    wred_reg.value,
14406f45ec7bSml29623 	    wred_reg.bits.ldw.win,
14416f45ec7bSml29623 	    wred_reg.bits.ldw.thre,
14426f45ec7bSml29623 	    wred_reg.bits.ldw.win_syn,
14436f45ec7bSml29623 	    wred_reg.bits.ldw.thre_sync));
14446f45ec7bSml29623 
14456f45ec7bSml29623 	return (NPI_SUCCESS);
14466f45ec7bSml29623 }
14476f45ec7bSml29623 
14486f45ec7bSml29623 /*
1449678453a8Sspeer  * npi_rxdma_rdc_table_config()
14506f45ec7bSml29623  * Configure/populate the RDC table
14516f45ec7bSml29623  *
14526f45ec7bSml29623  * Inputs:
14536f45ec7bSml29623  *	handle:	register handle interpreted by the underlying OS
14546f45ec7bSml29623  *	table:	RDC Group Number
1455678453a8Sspeer  *	map:	A bitmap of the RDCs to populate with.
1456678453a8Sspeer  *	count:	A count of the RDCs expressed in <map>.
1457678453a8Sspeer  *
1458678453a8Sspeer  * Notes:
1459678453a8Sspeer  *	This function assumes that we are not using the TCAM, but are
1460678453a8Sspeer  *	hashing all fields of the incoming ethernet packet!
14616f45ec7bSml29623  *
14626f45ec7bSml29623  * Return:
14636f45ec7bSml29623  *	NPI_SUCCESS
14646f45ec7bSml29623  *	NPI_RXDMA_TABLE_INVALID
14656f45ec7bSml29623  *
14666f45ec7bSml29623  */
14676f45ec7bSml29623 npi_status_t
npi_rxdma_rdc_table_config(npi_handle_t handle,uint8_t table,dc_map_t rdc_map,int count)1468678453a8Sspeer npi_rxdma_rdc_table_config(
1469678453a8Sspeer 	npi_handle_t handle,
1470678453a8Sspeer 	uint8_t table,
1471678453a8Sspeer 	dc_map_t rdc_map,
1472678453a8Sspeer 	int count)
14736f45ec7bSml29623 {
1474678453a8Sspeer 	int8_t set[NXGE_MAX_RDCS];
1475678453a8Sspeer 	int i, cursor;
1476678453a8Sspeer 
1477678453a8Sspeer 	rdc_tbl_t rdc_tbl;
14786f45ec7bSml29623 	uint64_t offset;
14796f45ec7bSml29623 
14806f45ec7bSml29623 	ASSERT(RXDMA_TABLE_VALID(table));
14816f45ec7bSml29623 	if (!RXDMA_TABLE_VALID(table)) {
14826f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
14836f45ec7bSml29623 		    " npi_rxdma_cfg_rdc_table"
1484678453a8Sspeer 		    " Illegal RDC Table Number %d \n",
1485678453a8Sspeer 		    table));
14866f45ec7bSml29623 		return (NPI_RXDMA_TABLE_INVALID);
14876f45ec7bSml29623 	}
14886f45ec7bSml29623 
1489678453a8Sspeer 	if (count == 0)		/* This shouldn't happen */
14906f45ec7bSml29623 		return (NPI_SUCCESS);
14916f45ec7bSml29623 
1492678453a8Sspeer 	for (i = 0, cursor = 0; i < NXGE_MAX_RDCS; i++) {
1493678453a8Sspeer 		if ((1 << i) & rdc_map) {
1494678453a8Sspeer 			set[cursor++] = (int8_t)i;
1495678453a8Sspeer 			if (cursor == count)
1496678453a8Sspeer 				break;
1497678453a8Sspeer 		}
1498678453a8Sspeer 	}
1499678453a8Sspeer 
1500678453a8Sspeer 	rdc_tbl.value = 0;
1501678453a8Sspeer 	offset = REG_RDC_TABLE_OFFSET(table);
1502678453a8Sspeer 
1503678453a8Sspeer 	/* Now write ( NXGE_MAX_RDCS / count ) sets of RDC numbers. */
1504678453a8Sspeer 	for (i = 0, cursor = 0; i < NXGE_MAX_RDCS; i++) {
1505678453a8Sspeer 		rdc_tbl.bits.ldw.rdc = set[cursor++];
1506678453a8Sspeer 		NXGE_REG_WR64(handle, offset, rdc_tbl.value);
1507678453a8Sspeer 		offset += sizeof (rdc_tbl.value);
1508678453a8Sspeer 		if (cursor == count)
1509678453a8Sspeer 			cursor = 0;
1510678453a8Sspeer 	}
1511678453a8Sspeer 
1512678453a8Sspeer 	/*
1513678453a8Sspeer 	 * Here is what the resulting table looks like with:
1514678453a8Sspeer 	 *
1515678453a8Sspeer 	 *  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
1516678453a8Sspeer 	 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1517678453a8Sspeer 	 * |v |w |x |y |z |v |w |x |y |z |v |w |x |y |z |v | 5 RDCs
1518678453a8Sspeer 	 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1519678453a8Sspeer 	 * |w |x |y |z |w |x |y |z |w |x |y |z |w |x |y |z | 4 RDCs
1520678453a8Sspeer 	 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1521678453a8Sspeer 	 * |x |y |z |x |y |z |x |y |z |x |y |z |x |y |z |x | 3 RDCs
1522678453a8Sspeer 	 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1523678453a8Sspeer 	 * |x |y |x |y |x |y |x |y |x |y |x |y |x |y |x |y | 2 RDCs
1524678453a8Sspeer 	 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1525678453a8Sspeer 	 * |x |x |x |x |x |x |x |x |x |x |x |x |x |x |x |x | 1 RDC
1526678453a8Sspeer 	 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1527678453a8Sspeer 	 */
1528678453a8Sspeer 
1529678453a8Sspeer 	return (NPI_SUCCESS);
15306f45ec7bSml29623 }
15316f45ec7bSml29623 
15326f45ec7bSml29623 npi_status_t
npi_rxdma_cfg_rdc_table_default_rdc(npi_handle_t handle,uint8_t table,uint8_t rdc)15336f45ec7bSml29623 npi_rxdma_cfg_rdc_table_default_rdc(npi_handle_t handle,
15346f45ec7bSml29623 			    uint8_t table, uint8_t rdc)
15356f45ec7bSml29623 {
15366f45ec7bSml29623 	uint64_t offset;
15376f45ec7bSml29623 	rdc_tbl_t tbl_reg;
15386f45ec7bSml29623 	tbl_reg.value = 0;
15396f45ec7bSml29623 
15406f45ec7bSml29623 	ASSERT(RXDMA_TABLE_VALID(table));
15416f45ec7bSml29623 	if (!RXDMA_TABLE_VALID(table)) {
15426f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
15436f45ec7bSml29623 		    " npi_rxdma_cfg_rdc_table"
15446f45ec7bSml29623 		    " Illegal RDC table Number %d \n",
15456f45ec7bSml29623 		    rdc));
15466f45ec7bSml29623 		return (NPI_RXDMA_TABLE_INVALID);
15476f45ec7bSml29623 	}
15486f45ec7bSml29623 
15496f45ec7bSml29623 	offset = REG_RDC_TABLE_OFFSET(table);
15506f45ec7bSml29623 	tbl_reg.bits.ldw.rdc = rdc;
15516f45ec7bSml29623 	NXGE_REG_WR64(handle, offset, tbl_reg.value);
15526f45ec7bSml29623 	return (NPI_SUCCESS);
15536f45ec7bSml29623 
15546f45ec7bSml29623 }
15556f45ec7bSml29623 
15566f45ec7bSml29623 npi_status_t
npi_rxdma_dump_rdc_table(npi_handle_t handle,uint8_t table)15576f45ec7bSml29623 npi_rxdma_dump_rdc_table(npi_handle_t handle,
15586f45ec7bSml29623 			    uint8_t table)
15596f45ec7bSml29623 {
15606f45ec7bSml29623 	uint64_t offset;
15616f45ec7bSml29623 	int tbl_offset;
15626f45ec7bSml29623 	uint64_t value;
15636f45ec7bSml29623 
15646f45ec7bSml29623 	ASSERT(RXDMA_TABLE_VALID(table));
15656f45ec7bSml29623 	if (!RXDMA_TABLE_VALID(table)) {
15666f45ec7bSml29623 		NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
15676f45ec7bSml29623 		    " npi_rxdma_dump_rdc_table"
15686f45ec7bSml29623 		    " Illegal RDC Rable Number %d \n",
15696f45ec7bSml29623 		    table));
15706f45ec7bSml29623 		return (NPI_RXDMA_TABLE_INVALID);
15716f45ec7bSml29623 	}
15726f45ec7bSml29623 	NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
15736f45ec7bSml29623 	    "\n Register Dump for RDC Table %d \n",
15746f45ec7bSml29623 	    table));
15756f45ec7bSml29623 	offset = REG_RDC_TABLE_OFFSET(table);
15766f45ec7bSml29623 	for (tbl_offset = 0; tbl_offset < NXGE_MAX_RDCS; tbl_offset++) {
15776f45ec7bSml29623 		NXGE_REG_RD64(handle, offset, &value);
15786f45ec7bSml29623 		NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
15796f45ec7bSml29623 		    " 0x%08llx 0x%08llx \n",
15806f45ec7bSml29623 		    offset, value));
15816f45ec7bSml29623 		offset += 8;
15826f45ec7bSml29623 	}
15836f45ec7bSml29623 	NPI_REG_DUMP_MSG((handle.function, NPI_REG_CTL,
15846f45ec7bSml29623 	    "\n Register Dump for RDC Table %d done\n",
15856f45ec7bSml29623 	    table));
15866f45ec7bSml29623 	return (NPI_SUCCESS);
15876f45ec7bSml29623 
15886f45ec7bSml29623 }
15896f45ec7bSml29623 
15906f45ec7bSml29623 npi_status_t
npi_rxdma_rdc_rbr_stat_get(npi_handle_t handle,uint8_t rdc,rbr_stat_t * rbr_stat)15916f45ec7bSml29623 npi_rxdma_rdc_rbr_stat_get(npi_handle_t handle, uint8_t rdc,
15926f45ec7bSml29623 			    rbr_stat_t *rbr_stat)
15936f45ec7bSml29623 {
15946f45ec7bSml29623 
15956f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
15966f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
15976f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
15986f45ec7bSml29623 		    " rxdma_rdc_rbr_stat_get"
15996f45ec7bSml29623 		    " Illegal RDC Number %d \n",
16006f45ec7bSml29623 		    rdc));
16016f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
16026f45ec7bSml29623 	}
16036f45ec7bSml29623 
16046f45ec7bSml29623 	RXDMA_REG_READ64(handle, RBR_STAT_REG, rdc, &rbr_stat->value);
16056f45ec7bSml29623 	return (NPI_SUCCESS);
16066f45ec7bSml29623 }
16076f45ec7bSml29623 
16086f45ec7bSml29623 /*
16096f45ec7bSml29623  * npi_rxdma_rdc_rbr_head_get
16106f45ec7bSml29623  * Gets the current rbr head pointer.
16116f45ec7bSml29623  *
16126f45ec7bSml29623  * Inputs:
16136f45ec7bSml29623  *      handle:	opaque handle interpreted by the underlying OS
16146f45ec7bSml29623  *	rdc:		RX DMA Channel number
16156f45ec7bSml29623  *	hdptr		ptr to write the rbr head value
16166f45ec7bSml29623  *
16176f45ec7bSml29623  * Return:
16186f45ec7bSml29623  * NPI_SUCCESS
16196f45ec7bSml29623  * NPI_RXDMA_RDC_INVALID
16206f45ec7bSml29623  */
16216f45ec7bSml29623 npi_status_t
npi_rxdma_rdc_rbr_head_get(npi_handle_t handle,uint8_t rdc,addr44_t * hdptr)16226f45ec7bSml29623 npi_rxdma_rdc_rbr_head_get(npi_handle_t handle,
16236f45ec7bSml29623 			    uint8_t rdc, addr44_t *hdptr)
16246f45ec7bSml29623 {
16256f45ec7bSml29623 	rbr_hdh_t hh_ptr;
16266f45ec7bSml29623 	rbr_hdl_t hl_ptr;
16276f45ec7bSml29623 
16286f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
16296f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
16306f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
16316f45ec7bSml29623 		    " rxdma_rdc_rbr_head_get"
16326f45ec7bSml29623 		    " Illegal RDC Number %d \n",
16336f45ec7bSml29623 		    rdc));
16346f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
16356f45ec7bSml29623 	}
16366f45ec7bSml29623 	hh_ptr.value = 0;
16376f45ec7bSml29623 	hl_ptr.value = 0;
16386f45ec7bSml29623 	RXDMA_REG_READ64(handle, RBR_HDH_REG, rdc, &hh_ptr.value);
16396f45ec7bSml29623 	RXDMA_REG_READ64(handle, RBR_HDL_REG, rdc, &hl_ptr.value);
16406f45ec7bSml29623 	hdptr->bits.ldw = hl_ptr.bits.ldw.head_l << 2;
16416f45ec7bSml29623 	hdptr->bits.hdw = hh_ptr.bits.ldw.head_h;
16426f45ec7bSml29623 	return (NPI_SUCCESS);
16436f45ec7bSml29623 
16446f45ec7bSml29623 }
16456f45ec7bSml29623 
16466f45ec7bSml29623 npi_status_t
npi_rxdma_rdc_rcr_qlen_get(npi_handle_t handle,uint8_t rdc,uint16_t * rcr_qlen)16476f45ec7bSml29623 npi_rxdma_rdc_rcr_qlen_get(npi_handle_t handle, uint8_t rdc,
16486f45ec7bSml29623 			    uint16_t *rcr_qlen)
16496f45ec7bSml29623 {
16506f45ec7bSml29623 
16516f45ec7bSml29623 	rcrstat_a_t stats;
16526f45ec7bSml29623 
16536f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
16546f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
16556f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
16566f45ec7bSml29623 		    " rxdma_rdc_rcr_qlen_get"
16576f45ec7bSml29623 		    " Illegal RDC Number %d \n",
16586f45ec7bSml29623 		    rdc));
16596f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
16606f45ec7bSml29623 	}
16616f45ec7bSml29623 
16626f45ec7bSml29623 	RXDMA_REG_READ64(handle, RCRSTAT_A_REG, rdc, &stats.value);
16636f45ec7bSml29623 	*rcr_qlen =  stats.bits.ldw.qlen;
16646f45ec7bSml29623 	NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
16656f45ec7bSml29623 	    " rxdma_rdc_rcr_qlen_get"
16666f45ec7bSml29623 	    " RDC %d qlen %x qlen %x\n",
16676f45ec7bSml29623 	    rdc, *rcr_qlen, stats.bits.ldw.qlen));
16686f45ec7bSml29623 	return (NPI_SUCCESS);
16696f45ec7bSml29623 }
16706f45ec7bSml29623 
16716f45ec7bSml29623 npi_status_t
npi_rxdma_rdc_rcr_tail_get(npi_handle_t handle,uint8_t rdc,addr44_t * tail_addr)16726f45ec7bSml29623 npi_rxdma_rdc_rcr_tail_get(npi_handle_t handle,
16736f45ec7bSml29623 			    uint8_t rdc, addr44_t *tail_addr)
16746f45ec7bSml29623 {
16756f45ec7bSml29623 
16766f45ec7bSml29623 	rcrstat_b_t th_ptr;
16776f45ec7bSml29623 	rcrstat_c_t tl_ptr;
16786f45ec7bSml29623 
16796f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(rdc));
16806f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(rdc)) {
16816f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
16826f45ec7bSml29623 		    " rxdma_rdc_rcr_tail_get"
16836f45ec7bSml29623 		    " Illegal RDC Number %d \n",
16846f45ec7bSml29623 		    rdc));
16856f45ec7bSml29623 		return (NPI_RXDMA_RDC_INVALID);
16866f45ec7bSml29623 	}
16876f45ec7bSml29623 	th_ptr.value = 0;
16886f45ec7bSml29623 	tl_ptr.value = 0;
16896f45ec7bSml29623 	RXDMA_REG_READ64(handle, RCRSTAT_B_REG, rdc, &th_ptr.value);
16906f45ec7bSml29623 	RXDMA_REG_READ64(handle, RCRSTAT_C_REG, rdc, &tl_ptr.value);
16916f45ec7bSml29623 	tail_addr->bits.ldw = tl_ptr.bits.ldw.tlptr_l << 3;
16926f45ec7bSml29623 	tail_addr->bits.hdw = th_ptr.bits.ldw.tlptr_h;
16936f45ec7bSml29623 	NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
16946f45ec7bSml29623 	    " rxdma_rdc_rcr_tail_get"
16956f45ec7bSml29623 	    " RDC %d rcr_tail %llx tl %x\n",
16966f45ec7bSml29623 	    rdc, tl_ptr.value,
16976f45ec7bSml29623 	    tl_ptr.bits.ldw.tlptr_l));
16986f45ec7bSml29623 
16996f45ec7bSml29623 	return (NPI_SUCCESS);
17006f45ec7bSml29623 
17016f45ec7bSml29623 
17026f45ec7bSml29623 }
17036f45ec7bSml29623 
17046f45ec7bSml29623 /*
17056f45ec7bSml29623  * npi_rxdma_rxctl_fifo_error_intr_set
17066f45ec7bSml29623  * Configure The RX ctrl fifo error interrupt generation
17076f45ec7bSml29623  *
17086f45ec7bSml29623  * Inputs:
17096f45ec7bSml29623  *      handle:	opaque handle interpreted by the underlying OS
17106f45ec7bSml29623  *	mask:	rx_ctl_dat_fifo_mask_t specifying the errors
17116f45ec7bSml29623  * valid fields in  rx_ctl_dat_fifo_mask_t structure are:
17126f45ec7bSml29623  * zcp_eop_err, ipp_eop_err, id_mismatch. If a field is set
17136f45ec7bSml29623  * to 1, we will enable interrupt generation for the
17146f45ec7bSml29623  * corresponding error condition. In the hardware, the bit(s)
17156f45ec7bSml29623  * have to be cleared to enable interrupt.
17166f45ec7bSml29623  *
17176f45ec7bSml29623  * Return:
17186f45ec7bSml29623  * NPI_SUCCESS
17196f45ec7bSml29623  *
17206f45ec7bSml29623  */
17216f45ec7bSml29623 npi_status_t
npi_rxdma_rxctl_fifo_error_intr_set(npi_handle_t handle,rx_ctl_dat_fifo_mask_t * mask)17226f45ec7bSml29623 npi_rxdma_rxctl_fifo_error_intr_set(npi_handle_t handle,
17236f45ec7bSml29623 				    rx_ctl_dat_fifo_mask_t *mask)
17246f45ec7bSml29623 {
17256f45ec7bSml29623 	uint64_t offset;
17266f45ec7bSml29623 	rx_ctl_dat_fifo_mask_t intr_mask;
17276f45ec7bSml29623 	offset = RX_CTL_DAT_FIFO_MASK_REG;
17286f45ec7bSml29623 	NXGE_REG_RD64(handle, offset, &intr_mask.value);
17296f45ec7bSml29623 
17306f45ec7bSml29623 	if (mask->bits.ldw.ipp_eop_err) {
17316f45ec7bSml29623 		intr_mask.bits.ldw.ipp_eop_err = 0;
17326f45ec7bSml29623 	}
17336f45ec7bSml29623 
17346f45ec7bSml29623 	if (mask->bits.ldw.zcp_eop_err) {
17356f45ec7bSml29623 		intr_mask.bits.ldw.zcp_eop_err = 0;
17366f45ec7bSml29623 	}
17376f45ec7bSml29623 
17386f45ec7bSml29623 	if (mask->bits.ldw.id_mismatch) {
17396f45ec7bSml29623 		intr_mask.bits.ldw.id_mismatch = 0;
17406f45ec7bSml29623 	}
17416f45ec7bSml29623 
17426f45ec7bSml29623 	NXGE_REG_WR64(handle, offset, intr_mask.value);
17436f45ec7bSml29623 	return (NPI_SUCCESS);
17446f45ec7bSml29623 }
17456f45ec7bSml29623 
17466f45ec7bSml29623 /*
17476f45ec7bSml29623  * npi_rxdma_rxctl_fifo_error_stat_get
17486f45ec7bSml29623  * Read The RX ctrl fifo error Status
17496f45ec7bSml29623  *
17506f45ec7bSml29623  * Inputs:
17516f45ec7bSml29623  *      handle:	opaque handle interpreted by the underlying OS
17526f45ec7bSml29623  *	stat:	rx_ctl_dat_fifo_stat_t to read the errors to
17536f45ec7bSml29623  * valid fields in  rx_ctl_dat_fifo_stat_t structure are:
17546f45ec7bSml29623  * zcp_eop_err, ipp_eop_err, id_mismatch.
17556f45ec7bSml29623  * Return:
17566f45ec7bSml29623  * NPI_SUCCESS
17576f45ec7bSml29623  *
17586f45ec7bSml29623  */
17596f45ec7bSml29623 npi_status_t
npi_rxdma_rxctl_fifo_error_intr_get(npi_handle_t handle,rx_ctl_dat_fifo_stat_t * stat)17606f45ec7bSml29623 npi_rxdma_rxctl_fifo_error_intr_get(npi_handle_t handle,
17616f45ec7bSml29623 			    rx_ctl_dat_fifo_stat_t *stat)
17626f45ec7bSml29623 {
17636f45ec7bSml29623 	uint64_t offset = RX_CTL_DAT_FIFO_STAT_REG;
17646f45ec7bSml29623 	NXGE_REG_RD64(handle, offset, &stat->value);
17656f45ec7bSml29623 	return (NPI_SUCCESS);
17666f45ec7bSml29623 }
17676f45ec7bSml29623 
17686f45ec7bSml29623 npi_status_t
npi_rxdma_rdc_rcr_pktread_update(npi_handle_t handle,uint8_t channel,uint16_t pkts_read)17696f45ec7bSml29623 npi_rxdma_rdc_rcr_pktread_update(npi_handle_t handle, uint8_t channel,
17706f45ec7bSml29623 				    uint16_t pkts_read)
17716f45ec7bSml29623 {
17726f45ec7bSml29623 
17736f45ec7bSml29623 	rx_dma_ctl_stat_t	cs;
17746f45ec7bSml29623 	uint16_t min_read = 0;
17756f45ec7bSml29623 
17766f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(channel));
17776f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(channel)) {
17786f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
17796f45ec7bSml29623 		    " npi_rxdma_rdc_rcr_pktread_update ",
17806f45ec7bSml29623 		    " channel %d", channel));
17816f45ec7bSml29623 		return (NPI_FAILURE | NPI_RXDMA_CHANNEL_INVALID(channel));
17826f45ec7bSml29623 	}
17836f45ec7bSml29623 
17846f45ec7bSml29623 	if ((pkts_read < min_read) && (pkts_read > 512)) {
17856f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
17866f45ec7bSml29623 		    " npi_rxdma_rdc_rcr_pktread_update ",
17876f45ec7bSml29623 		    " pkts %d out of bound", pkts_read));
17886f45ec7bSml29623 		return (NPI_RXDMA_OPCODE_INVALID(pkts_read));
17896f45ec7bSml29623 	}
17906f45ec7bSml29623 
17916f45ec7bSml29623 	RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
17926f45ec7bSml29623 	    &cs.value);
17936f45ec7bSml29623 	cs.bits.ldw.pktread = pkts_read;
17946f45ec7bSml29623 	RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG,
17956f45ec7bSml29623 	    channel, cs.value);
17966f45ec7bSml29623 
17976f45ec7bSml29623 	return (NPI_SUCCESS);
17986f45ec7bSml29623 }
17996f45ec7bSml29623 
18006f45ec7bSml29623 npi_status_t
npi_rxdma_rdc_rcr_bufread_update(npi_handle_t handle,uint8_t channel,uint16_t bufs_read)18016f45ec7bSml29623 npi_rxdma_rdc_rcr_bufread_update(npi_handle_t handle, uint8_t channel,
18026f45ec7bSml29623 					    uint16_t bufs_read)
18036f45ec7bSml29623 {
18046f45ec7bSml29623 
18056f45ec7bSml29623 	rx_dma_ctl_stat_t	cs;
18066f45ec7bSml29623 	uint16_t min_read = 0;
18076f45ec7bSml29623 
18086f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(channel));
18096f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(channel)) {
18106f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
18116f45ec7bSml29623 		    " npi_rxdma_rdc_rcr_bufread_update ",
18126f45ec7bSml29623 		    " channel %d", channel));
18136f45ec7bSml29623 		return (NPI_FAILURE | NPI_RXDMA_CHANNEL_INVALID(channel));
18146f45ec7bSml29623 	}
18156f45ec7bSml29623 
18166f45ec7bSml29623 	if ((bufs_read < min_read) && (bufs_read > 512)) {
18176f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
18186f45ec7bSml29623 		    " npi_rxdma_rdc_rcr_bufread_update ",
18196f45ec7bSml29623 		    " bufs read %d out of bound", bufs_read));
18206f45ec7bSml29623 		return (NPI_RXDMA_OPCODE_INVALID(bufs_read));
18216f45ec7bSml29623 	}
18226f45ec7bSml29623 
18236f45ec7bSml29623 	RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
18246f45ec7bSml29623 	    &cs.value);
18256f45ec7bSml29623 	cs.bits.ldw.ptrread = bufs_read;
18266f45ec7bSml29623 	RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG,
18276f45ec7bSml29623 	    channel, cs.value);
18286f45ec7bSml29623 
18296f45ec7bSml29623 	return (NPI_SUCCESS);
18306f45ec7bSml29623 }
18316f45ec7bSml29623 
18326f45ec7bSml29623 npi_status_t
npi_rxdma_rdc_rcr_read_update(npi_handle_t handle,uint8_t channel,uint16_t pkts_read,uint16_t bufs_read)18336f45ec7bSml29623 npi_rxdma_rdc_rcr_read_update(npi_handle_t handle, uint8_t channel,
18346f45ec7bSml29623 				    uint16_t pkts_read, uint16_t bufs_read)
18356f45ec7bSml29623 {
18366f45ec7bSml29623 
18376f45ec7bSml29623 	rx_dma_ctl_stat_t	cs;
18386f45ec7bSml29623 
18396f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(channel));
18406f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(channel)) {
18416f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
18426f45ec7bSml29623 		    " npi_rxdma_rdc_rcr_read_update ",
18436f45ec7bSml29623 		    " channel %d", channel));
18446f45ec7bSml29623 		return (NPI_FAILURE | NPI_RXDMA_CHANNEL_INVALID(channel));
18456f45ec7bSml29623 	}
18466f45ec7bSml29623 
18476f45ec7bSml29623 	NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
18486f45ec7bSml29623 	    " npi_rxdma_rdc_rcr_read_update "
18496f45ec7bSml29623 	    " bufs read %d pkt read %d",
18506f45ec7bSml29623 	    bufs_read, pkts_read));
18516f45ec7bSml29623 
18526f45ec7bSml29623 	RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
18536f45ec7bSml29623 	    &cs.value);
18546f45ec7bSml29623 
18556f45ec7bSml29623 	NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
18566f45ec7bSml29623 	    " npi_rxdma_rdc_rcr_read_update: "
18576f45ec7bSml29623 	    " value: 0x%llx bufs read %d pkt read %d",
18586f45ec7bSml29623 	    cs.value,
18596f45ec7bSml29623 	    cs.bits.ldw.ptrread, cs.bits.ldw.pktread));
18606f45ec7bSml29623 
18616f45ec7bSml29623 	cs.bits.ldw.pktread = pkts_read;
18626f45ec7bSml29623 	cs.bits.ldw.ptrread = bufs_read;
18636f45ec7bSml29623 
18646f45ec7bSml29623 	RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG,
18656f45ec7bSml29623 	    channel, cs.value);
18666f45ec7bSml29623 
18676f45ec7bSml29623 	RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
18686f45ec7bSml29623 	    &cs.value);
18696f45ec7bSml29623 
18706f45ec7bSml29623 	NPI_DEBUG_MSG((handle.function, NPI_RDC_CTL,
18716f45ec7bSml29623 	    " npi_rxdma_rdc_rcr_read_update: read back after update "
18726f45ec7bSml29623 	    " value: 0x%llx bufs read %d pkt read %d",
18736f45ec7bSml29623 	    cs.value,
18746f45ec7bSml29623 	    cs.bits.ldw.ptrread, cs.bits.ldw.pktread));
18756f45ec7bSml29623 
18766f45ec7bSml29623 	return (NPI_SUCCESS);
18776f45ec7bSml29623 }
18786f45ec7bSml29623 
18796f45ec7bSml29623 /*
18806f45ec7bSml29623  * npi_rxdma_channel_mex_set():
18816f45ec7bSml29623  *	This function is called to arm the DMA channel with
18826f45ec7bSml29623  *	mailbox updating capability. Software needs to rearm
18836f45ec7bSml29623  *	for each update by writing to the control and status register.
18846f45ec7bSml29623  *
18856f45ec7bSml29623  * Parameters:
18866f45ec7bSml29623  *	handle		- NPI handle (virtualization flag must be defined).
18876f45ec7bSml29623  *	channel		- logical RXDMA channel from 0 to 23.
18886f45ec7bSml29623  *			  (If virtualization flag is not set, then
18896f45ec7bSml29623  *			   logical channel is the same as the hardware
18906f45ec7bSml29623  *			   channel number).
18916f45ec7bSml29623  *
18926f45ec7bSml29623  * Return:
18936f45ec7bSml29623  *	NPI_SUCCESS		- If enable channel with mailbox update
18946f45ec7bSml29623  *				  is completed successfully.
18956f45ec7bSml29623  *
18966f45ec7bSml29623  *	Error:
18976f45ec7bSml29623  *	NPI error status code
18986f45ec7bSml29623  */
18996f45ec7bSml29623 npi_status_t
npi_rxdma_channel_mex_set(npi_handle_t handle,uint8_t channel)19006f45ec7bSml29623 npi_rxdma_channel_mex_set(npi_handle_t handle, uint8_t channel)
19016f45ec7bSml29623 {
19026f45ec7bSml29623 	return (npi_rxdma_channel_control(handle, RXDMA_MEX_SET, channel));
19036f45ec7bSml29623 }
19046f45ec7bSml29623 
19056f45ec7bSml29623 /*
19066f45ec7bSml29623  * npi_rxdma_channel_rcrto_clear():
19076f45ec7bSml29623  *	This function is called to reset RCRTO bit to 0.
19086f45ec7bSml29623  *
19096f45ec7bSml29623  * Parameters:
19106f45ec7bSml29623  *	handle		- NPI handle (virtualization flag must be defined).
19116f45ec7bSml29623  *	channel		- logical RXDMA channel from 0 to 23.
19126f45ec7bSml29623  *			  (If virtualization flag is not set, then
19136f45ec7bSml29623  *			   logical channel is the same as the hardware
19146f45ec7bSml29623  *			   channel number).
19156f45ec7bSml29623  * Return:
19166f45ec7bSml29623  *	NPI_SUCCESS
19176f45ec7bSml29623  *
19186f45ec7bSml29623  *	Error:
19196f45ec7bSml29623  *	NPI error status code
19206f45ec7bSml29623  */
19216f45ec7bSml29623 npi_status_t
npi_rxdma_channel_rcrto_clear(npi_handle_t handle,uint8_t channel)19226f45ec7bSml29623 npi_rxdma_channel_rcrto_clear(npi_handle_t handle, uint8_t channel)
19236f45ec7bSml29623 {
19246f45ec7bSml29623 	return (npi_rxdma_channel_control(handle, RXDMA_RCRTO_CLEAR, channel));
19256f45ec7bSml29623 }
19266f45ec7bSml29623 
19276f45ec7bSml29623 /*
19286f45ec7bSml29623  * npi_rxdma_channel_pt_drop_pkt_clear():
19296f45ec7bSml29623  *	This function is called to clear the port drop packet bit (debug).
19306f45ec7bSml29623  *
19316f45ec7bSml29623  * Parameters:
19326f45ec7bSml29623  *	handle		- NPI handle (virtualization flag must be defined).
19336f45ec7bSml29623  *	channel		- logical RXDMA channel from 0 to 23.
19346f45ec7bSml29623  *			  (If virtualization flag is not set, then
19356f45ec7bSml29623  *			   logical channel is the same as the hardware
19366f45ec7bSml29623  *			   channel number).
19376f45ec7bSml29623  * Return:
19386f45ec7bSml29623  *	NPI_SUCCESS
19396f45ec7bSml29623  *
19406f45ec7bSml29623  *	Error:
19416f45ec7bSml29623  *	NPI error status code
19426f45ec7bSml29623  */
19436f45ec7bSml29623 npi_status_t
npi_rxdma_channel_pt_drop_pkt_clear(npi_handle_t handle,uint8_t channel)19446f45ec7bSml29623 npi_rxdma_channel_pt_drop_pkt_clear(npi_handle_t handle, uint8_t channel)
19456f45ec7bSml29623 {
19466f45ec7bSml29623 	return (npi_rxdma_channel_control(handle, RXDMA_PT_DROP_PKT_CLEAR,
19476f45ec7bSml29623 	    channel));
19486f45ec7bSml29623 }
19496f45ec7bSml29623 
19506f45ec7bSml29623 /*
19516f45ec7bSml29623  * npi_rxdma_channel_wred_drop_clear():
19526f45ec7bSml29623  *	This function is called to wred drop bit (debug only).
19536f45ec7bSml29623  *
19546f45ec7bSml29623  * Parameters:
19556f45ec7bSml29623  *	handle		- NPI handle (virtualization flag must be defined).
19566f45ec7bSml29623  *	channel		- logical RXDMA channel from 0 to 23.
19576f45ec7bSml29623  *			  (If virtualization flag is not set, then
19586f45ec7bSml29623  *			   logical channel is the same as the hardware
19596f45ec7bSml29623  *			   channel number).
19606f45ec7bSml29623  * Return:
19616f45ec7bSml29623  *	NPI_SUCCESS
19626f45ec7bSml29623  *
19636f45ec7bSml29623  *	Error:
19646f45ec7bSml29623  *	NPI error status code
19656f45ec7bSml29623  */
19666f45ec7bSml29623 npi_status_t
npi_rxdma_channel_wred_dop_clear(npi_handle_t handle,uint8_t channel)19676f45ec7bSml29623 npi_rxdma_channel_wred_dop_clear(npi_handle_t handle, uint8_t channel)
19686f45ec7bSml29623 {
19696f45ec7bSml29623 	return (npi_rxdma_channel_control(handle, RXDMA_WRED_DROP_CLEAR,
19706f45ec7bSml29623 	    channel));
19716f45ec7bSml29623 }
19726f45ec7bSml29623 
19736f45ec7bSml29623 /*
19746f45ec7bSml29623  * npi_rxdma_channel_rcr_shfull_clear():
19756f45ec7bSml29623  *	This function is called to clear RCR shadow full bit.
19766f45ec7bSml29623  *
19776f45ec7bSml29623  * Parameters:
19786f45ec7bSml29623  *	handle		- NPI handle (virtualization flag must be defined).
19796f45ec7bSml29623  *	channel		- logical RXDMA channel from 0 to 23.
19806f45ec7bSml29623  *			  (If virtualization flag is not set, then
19816f45ec7bSml29623  *			   logical channel is the same as the hardware
19826f45ec7bSml29623  *			   channel number).
19836f45ec7bSml29623  * Return:
19846f45ec7bSml29623  *	NPI_SUCCESS
19856f45ec7bSml29623  *
19866f45ec7bSml29623  *	Error:
19876f45ec7bSml29623  *	NPI error status code
19886f45ec7bSml29623  */
19896f45ec7bSml29623 npi_status_t
npi_rxdma_channel_rcr_shfull_clear(npi_handle_t handle,uint8_t channel)19906f45ec7bSml29623 npi_rxdma_channel_rcr_shfull_clear(npi_handle_t handle, uint8_t channel)
19916f45ec7bSml29623 {
19926f45ec7bSml29623 	return (npi_rxdma_channel_control(handle, RXDMA_RCR_SFULL_CLEAR,
19936f45ec7bSml29623 	    channel));
19946f45ec7bSml29623 }
19956f45ec7bSml29623 
19966f45ec7bSml29623 /*
19976f45ec7bSml29623  * npi_rxdma_channel_rcrfull_clear():
19986f45ec7bSml29623  *	This function is called to clear RCR full bit.
19996f45ec7bSml29623  *
20006f45ec7bSml29623  * Parameters:
20016f45ec7bSml29623  *	handle		- NPI handle (virtualization flag must be defined).
20026f45ec7bSml29623  *	channel		- logical RXDMA channel from 0 to 23.
20036f45ec7bSml29623  *			  (If virtualization flag is not set, then
20046f45ec7bSml29623  *			   logical channel is the same as the hardware
20056f45ec7bSml29623  *			   channel number).
20066f45ec7bSml29623  * Return:
20076f45ec7bSml29623  *	NPI_SUCCESS
20086f45ec7bSml29623  *
20096f45ec7bSml29623  *	Error:
20106f45ec7bSml29623  *	NPI error status code
20116f45ec7bSml29623  */
20126f45ec7bSml29623 npi_status_t
npi_rxdma_channel_rcr_full_clear(npi_handle_t handle,uint8_t channel)20136f45ec7bSml29623 npi_rxdma_channel_rcr_full_clear(npi_handle_t handle, uint8_t channel)
20146f45ec7bSml29623 {
20156f45ec7bSml29623 	return (npi_rxdma_channel_control(handle, RXDMA_RCR_FULL_CLEAR,
20166f45ec7bSml29623 	    channel));
20176f45ec7bSml29623 }
20186f45ec7bSml29623 
20196f45ec7bSml29623 npi_status_t
npi_rxdma_channel_rbr_empty_clear(npi_handle_t handle,uint8_t channel)20206f45ec7bSml29623 npi_rxdma_channel_rbr_empty_clear(npi_handle_t handle, uint8_t channel)
20216f45ec7bSml29623 {
20226f45ec7bSml29623 	return (npi_rxdma_channel_control(handle,
20236f45ec7bSml29623 	    RXDMA_RBR_EMPTY_CLEAR, channel));
20246f45ec7bSml29623 }
20256f45ec7bSml29623 
20266f45ec7bSml29623 npi_status_t
npi_rxdma_channel_cs_clear_all(npi_handle_t handle,uint8_t channel)20276f45ec7bSml29623 npi_rxdma_channel_cs_clear_all(npi_handle_t handle, uint8_t channel)
20286f45ec7bSml29623 {
20296f45ec7bSml29623 	return (npi_rxdma_channel_control(handle, RXDMA_CS_CLEAR_ALL, channel));
20306f45ec7bSml29623 }
20316f45ec7bSml29623 
20326f45ec7bSml29623 /*
20336f45ec7bSml29623  * npi_rxdma_channel_control():
20346f45ec7bSml29623  *	This function is called to control a receive DMA channel
20356f45ec7bSml29623  *	for arming the channel with mailbox updates, resetting
20366f45ec7bSml29623  *	various event status bits (control and status register).
20376f45ec7bSml29623  *
20386f45ec7bSml29623  * Parameters:
20396f45ec7bSml29623  *	handle		- NPI handle (virtualization flag must be defined).
20406f45ec7bSml29623  *	control		- NPI defined control type supported:
20416f45ec7bSml29623  *				- RXDMA_MEX_SET
20426f45ec7bSml29623  * 				- RXDMA_RCRTO_CLEAR
20436f45ec7bSml29623  *				- RXDMA_PT_DROP_PKT_CLEAR
20446f45ec7bSml29623  *				- RXDMA_WRED_DROP_CLEAR
20456f45ec7bSml29623  *				- RXDMA_RCR_SFULL_CLEAR
20466f45ec7bSml29623  *				- RXDMA_RCR_FULL_CLEAR
20476f45ec7bSml29623  *				- RXDMA_RBR_PRE_EMPTY_CLEAR
20486f45ec7bSml29623  *				- RXDMA_RBR_EMPTY_CLEAR
20496f45ec7bSml29623  *	channel		- logical RXDMA channel from 0 to 23.
20506f45ec7bSml29623  *			  (If virtualization flag is not set, then
20516f45ec7bSml29623  *			   logical channel is the same as the hardware.
20526f45ec7bSml29623  * Return:
20536f45ec7bSml29623  *	NPI_SUCCESS
20546f45ec7bSml29623  *
20556f45ec7bSml29623  *	Error:
20566f45ec7bSml29623  *	NPI error status code
20576f45ec7bSml29623  */
20586f45ec7bSml29623 npi_status_t
npi_rxdma_channel_control(npi_handle_t handle,rxdma_cs_cntl_t control,uint8_t channel)20596f45ec7bSml29623 npi_rxdma_channel_control(npi_handle_t handle, rxdma_cs_cntl_t control,
20606f45ec7bSml29623 			uint8_t channel)
20616f45ec7bSml29623 {
20626f45ec7bSml29623 
20636f45ec7bSml29623 	rx_dma_ctl_stat_t	cs;
20646f45ec7bSml29623 
20656f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(channel));
20666f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(channel)) {
20676f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
20686f45ec7bSml29623 		    " npi_rxdma_channel_control",
20696f45ec7bSml29623 		    " channel", channel));
20706f45ec7bSml29623 		return (NPI_FAILURE | NPI_RXDMA_CHANNEL_INVALID(channel));
20716f45ec7bSml29623 	}
20726f45ec7bSml29623 
20736f45ec7bSml29623 	switch (control) {
20746f45ec7bSml29623 	case RXDMA_MEX_SET:
20756f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
20766f45ec7bSml29623 		    &cs.value);
20776f45ec7bSml29623 		cs.bits.hdw.mex = 1;
20786f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG,
20796f45ec7bSml29623 		    channel, cs.value);
20806f45ec7bSml29623 		break;
20816f45ec7bSml29623 
20826f45ec7bSml29623 	case RXDMA_RCRTO_CLEAR:
20836f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
20846f45ec7bSml29623 		    &cs.value);
20856f45ec7bSml29623 		cs.bits.hdw.rcrto = 0;
20866f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG, channel,
20876f45ec7bSml29623 		    cs.value);
20886f45ec7bSml29623 		break;
20896f45ec7bSml29623 
20906f45ec7bSml29623 	case RXDMA_PT_DROP_PKT_CLEAR:
20916f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
20926f45ec7bSml29623 		    &cs.value);
20936f45ec7bSml29623 		cs.bits.hdw.port_drop_pkt = 0;
20946f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG, channel,
20956f45ec7bSml29623 		    cs.value);
20966f45ec7bSml29623 		break;
20976f45ec7bSml29623 
20986f45ec7bSml29623 	case RXDMA_WRED_DROP_CLEAR:
20996f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
21006f45ec7bSml29623 		    &cs.value);
21016f45ec7bSml29623 		cs.bits.hdw.wred_drop = 0;
21026f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG, channel,
21036f45ec7bSml29623 		    cs.value);
21046f45ec7bSml29623 		break;
21056f45ec7bSml29623 
21066f45ec7bSml29623 	case RXDMA_RCR_SFULL_CLEAR:
21076f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
21086f45ec7bSml29623 		    &cs.value);
21096f45ec7bSml29623 		cs.bits.hdw.rcr_shadow_full = 0;
21106f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG, channel,
21116f45ec7bSml29623 		    cs.value);
21126f45ec7bSml29623 		break;
21136f45ec7bSml29623 
21146f45ec7bSml29623 	case RXDMA_RCR_FULL_CLEAR:
21156f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
21166f45ec7bSml29623 		    &cs.value);
21176f45ec7bSml29623 		cs.bits.hdw.rcrfull = 0;
21186f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG, channel,
21196f45ec7bSml29623 		    cs.value);
21206f45ec7bSml29623 		break;
21216f45ec7bSml29623 
21226f45ec7bSml29623 	case RXDMA_RBR_PRE_EMPTY_CLEAR:
21236f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
21246f45ec7bSml29623 		    &cs.value);
21256f45ec7bSml29623 		cs.bits.hdw.rbr_pre_empty = 0;
21266f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG, channel,
21276f45ec7bSml29623 		    cs.value);
21286f45ec7bSml29623 		break;
21296f45ec7bSml29623 
21306f45ec7bSml29623 	case RXDMA_RBR_EMPTY_CLEAR:
21316f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
21326f45ec7bSml29623 		    &cs.value);
21336f45ec7bSml29623 		cs.bits.hdw.rbr_empty = 1;
21346f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG, channel,
21356f45ec7bSml29623 		    cs.value);
21366f45ec7bSml29623 		break;
21376f45ec7bSml29623 
21386f45ec7bSml29623 	case RXDMA_CS_CLEAR_ALL:
21396f45ec7bSml29623 		cs.value = 0;
21406f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG, channel,
21416f45ec7bSml29623 		    cs.value);
21426f45ec7bSml29623 		break;
21436f45ec7bSml29623 
21446f45ec7bSml29623 	default:
21456f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
21466f45ec7bSml29623 		    "npi_rxdma_channel_control",
21476f45ec7bSml29623 		    "control", control));
21486f45ec7bSml29623 		return (NPI_FAILURE | NPI_RXDMA_OPCODE_INVALID(channel));
21496f45ec7bSml29623 	}
21506f45ec7bSml29623 
21516f45ec7bSml29623 	return (NPI_SUCCESS);
21526f45ec7bSml29623 }
21536f45ec7bSml29623 
21546f45ec7bSml29623 /*
21556f45ec7bSml29623  * npi_rxdma_control_status():
21566f45ec7bSml29623  *	This function is called to operate on the control
21576f45ec7bSml29623  *	and status register.
21586f45ec7bSml29623  *
21596f45ec7bSml29623  * Parameters:
21606f45ec7bSml29623  *	handle		- NPI handle
21616f45ec7bSml29623  *	op_mode		- OP_GET: get hardware control and status
21626f45ec7bSml29623  *			  OP_SET: set hardware control and status
21636f45ec7bSml29623  *			  OP_UPDATE: update hardware control and status.
21646f45ec7bSml29623  *			  OP_CLEAR: clear control and status register to 0s.
21656f45ec7bSml29623  *	channel		- hardware RXDMA channel from 0 to 23.
21666f45ec7bSml29623  *	cs_p		- pointer to hardware defined control and status
21676f45ec7bSml29623  *			  structure.
21686f45ec7bSml29623  * Return:
21696f45ec7bSml29623  *	NPI_SUCCESS
21706f45ec7bSml29623  *
21716f45ec7bSml29623  *	Error:
21726f45ec7bSml29623  *	NPI error status code
21736f45ec7bSml29623  */
21746f45ec7bSml29623 npi_status_t
npi_rxdma_control_status(npi_handle_t handle,io_op_t op_mode,uint8_t channel,p_rx_dma_ctl_stat_t cs_p)21756f45ec7bSml29623 npi_rxdma_control_status(npi_handle_t handle, io_op_t op_mode,
21766f45ec7bSml29623 			uint8_t channel, p_rx_dma_ctl_stat_t cs_p)
21776f45ec7bSml29623 {
21786f45ec7bSml29623 	int			status = NPI_SUCCESS;
21796f45ec7bSml29623 	rx_dma_ctl_stat_t	cs;
21806f45ec7bSml29623 
21816f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(channel));
21826f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(channel)) {
21836f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
21846f45ec7bSml29623 		    "npi_rxdma_control_status",
21856f45ec7bSml29623 		    "channel", channel));
21866f45ec7bSml29623 		return (NPI_FAILURE | NPI_RXDMA_CHANNEL_INVALID(channel));
21876f45ec7bSml29623 	}
21886f45ec7bSml29623 
21896f45ec7bSml29623 	switch (op_mode) {
21906f45ec7bSml29623 	case OP_GET:
21916f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
21926f45ec7bSml29623 		    &cs_p->value);
21936f45ec7bSml29623 		break;
21946f45ec7bSml29623 
21956f45ec7bSml29623 	case OP_SET:
21966f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG, channel,
21976f45ec7bSml29623 		    cs_p->value);
21986f45ec7bSml29623 		break;
21996f45ec7bSml29623 
22006f45ec7bSml29623 	case OP_UPDATE:
22016f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_CTL_STAT_REG, channel,
22026f45ec7bSml29623 		    &cs.value);
22036f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_CTL_STAT_REG, channel,
22046f45ec7bSml29623 		    cs_p->value | cs.value);
22056f45ec7bSml29623 		break;
22066f45ec7bSml29623 
22076f45ec7bSml29623 	default:
22086f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
22096f45ec7bSml29623 		    "npi_rxdma_control_status",
22106f45ec7bSml29623 		    "control", op_mode));
22116f45ec7bSml29623 		return (NPI_FAILURE | NPI_RXDMA_OPCODE_INVALID(channel));
22126f45ec7bSml29623 	}
22136f45ec7bSml29623 
22146f45ec7bSml29623 	return (status);
22156f45ec7bSml29623 }
22166f45ec7bSml29623 
22176f45ec7bSml29623 /*
22186f45ec7bSml29623  * npi_rxdma_event_mask():
22196f45ec7bSml29623  *	This function is called to operate on the event mask
22206f45ec7bSml29623  *	register which is used for generating interrupts.
22216f45ec7bSml29623  *
22226f45ec7bSml29623  * Parameters:
22236f45ec7bSml29623  *	handle		- NPI handle
22246f45ec7bSml29623  *	op_mode		- OP_GET: get hardware event mask
22256f45ec7bSml29623  *			  OP_SET: set hardware interrupt event masks
22266f45ec7bSml29623  *			  OP_CLEAR: clear control and status register to 0s.
22276f45ec7bSml29623  *	channel		- hardware RXDMA channel from 0 to 23.
22286f45ec7bSml29623  *	mask_p		- pointer to hardware defined event mask
22296f45ec7bSml29623  *			  structure.
22306f45ec7bSml29623  * Return:
22316f45ec7bSml29623  *	NPI_SUCCESS		- If set is complete successfully.
22326f45ec7bSml29623  *
22336f45ec7bSml29623  *	Error:
22346f45ec7bSml29623  *	NPI error status code
22356f45ec7bSml29623  */
22366f45ec7bSml29623 npi_status_t
npi_rxdma_event_mask(npi_handle_t handle,io_op_t op_mode,uint8_t channel,p_rx_dma_ent_msk_t mask_p)22376f45ec7bSml29623 npi_rxdma_event_mask(npi_handle_t handle, io_op_t op_mode,
22386f45ec7bSml29623 		uint8_t channel, p_rx_dma_ent_msk_t mask_p)
22396f45ec7bSml29623 {
22406f45ec7bSml29623 	int			status = NPI_SUCCESS;
22416f45ec7bSml29623 	rx_dma_ent_msk_t	mask;
22426f45ec7bSml29623 
22436f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(channel));
22446f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(channel)) {
22456f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
22466f45ec7bSml29623 		    "npi_rxdma_event_mask",
22476f45ec7bSml29623 		    "channel", channel));
22486f45ec7bSml29623 		return (NPI_FAILURE | NPI_RXDMA_CHANNEL_INVALID(channel));
22496f45ec7bSml29623 	}
22506f45ec7bSml29623 
22516f45ec7bSml29623 	switch (op_mode) {
22526f45ec7bSml29623 	case OP_GET:
22536f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_ENT_MSK_REG, channel,
22546f45ec7bSml29623 		    &mask_p->value);
22556f45ec7bSml29623 		break;
22566f45ec7bSml29623 
22576f45ec7bSml29623 	case OP_SET:
22586f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_ENT_MSK_REG, channel,
22596f45ec7bSml29623 		    mask_p->value);
22606f45ec7bSml29623 		break;
22616f45ec7bSml29623 
22626f45ec7bSml29623 	case OP_UPDATE:
22636f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_ENT_MSK_REG, channel,
22646f45ec7bSml29623 		    &mask.value);
22656f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_ENT_MSK_REG, channel,
22666f45ec7bSml29623 		    mask_p->value | mask.value);
22676f45ec7bSml29623 		break;
22686f45ec7bSml29623 
22696f45ec7bSml29623 	default:
22706f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
22716f45ec7bSml29623 		    "npi_rxdma_event_mask",
22726f45ec7bSml29623 		    "eventmask", op_mode));
22736f45ec7bSml29623 		return (NPI_FAILURE | NPI_RXDMA_OPCODE_INVALID(channel));
22746f45ec7bSml29623 	}
22756f45ec7bSml29623 
22766f45ec7bSml29623 	return (status);
22776f45ec7bSml29623 }
22786f45ec7bSml29623 
22796f45ec7bSml29623 /*
22806f45ec7bSml29623  * npi_rxdma_event_mask_config():
22816f45ec7bSml29623  *	This function is called to operate on the event mask
22826f45ec7bSml29623  *	register which is used for generating interrupts
22836f45ec7bSml29623  *	and status register.
22846f45ec7bSml29623  *
22856f45ec7bSml29623  * Parameters:
22866f45ec7bSml29623  *	handle		- NPI handle
22876f45ec7bSml29623  *	op_mode		- OP_GET: get hardware event mask
22886f45ec7bSml29623  *			  OP_SET: set hardware interrupt event masks
22896f45ec7bSml29623  *			  OP_CLEAR: clear control and status register to 0s.
22906f45ec7bSml29623  *	channel		- hardware RXDMA channel from 0 to 23.
22916f45ec7bSml29623  *	mask_cfgp		- pointer to NPI defined event mask
22926f45ec7bSml29623  *			  enum data type.
22936f45ec7bSml29623  * Return:
22946f45ec7bSml29623  *	NPI_SUCCESS		- If set is complete successfully.
22956f45ec7bSml29623  *
22966f45ec7bSml29623  *	Error:
22976f45ec7bSml29623  *	NPI error status code
22986f45ec7bSml29623  */
22996f45ec7bSml29623 npi_status_t
npi_rxdma_event_mask_config(npi_handle_t handle,io_op_t op_mode,uint8_t channel,rxdma_ent_msk_cfg_t * mask_cfgp)23006f45ec7bSml29623 npi_rxdma_event_mask_config(npi_handle_t handle, io_op_t op_mode,
23016f45ec7bSml29623 		uint8_t channel, rxdma_ent_msk_cfg_t *mask_cfgp)
23026f45ec7bSml29623 {
23036f45ec7bSml29623 	int		status = NPI_SUCCESS;
2304678453a8Sspeer 	uint64_t	configuration = *mask_cfgp;
23056f45ec7bSml29623 	uint64_t	value;
23066f45ec7bSml29623 
23076f45ec7bSml29623 	ASSERT(RXDMA_CHANNEL_VALID(channel));
23086f45ec7bSml29623 	if (!RXDMA_CHANNEL_VALID(channel)) {
23096f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
23106f45ec7bSml29623 		    "npi_rxdma_event_mask_config",
23116f45ec7bSml29623 		    "channel", channel));
23126f45ec7bSml29623 		return (NPI_FAILURE | NPI_RXDMA_CHANNEL_INVALID(channel));
23136f45ec7bSml29623 	}
23146f45ec7bSml29623 
23156f45ec7bSml29623 	switch (op_mode) {
23166f45ec7bSml29623 	case OP_GET:
23176f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_ENT_MSK_REG, channel,
2318678453a8Sspeer 		    (uint64_t *)mask_cfgp);
23196f45ec7bSml29623 		break;
23206f45ec7bSml29623 
23216f45ec7bSml29623 	case OP_SET:
23226f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_ENT_MSK_REG, channel,
2323678453a8Sspeer 		    configuration);
23246f45ec7bSml29623 		break;
23256f45ec7bSml29623 
23266f45ec7bSml29623 	case OP_UPDATE:
23276f45ec7bSml29623 		RXDMA_REG_READ64(handle, RX_DMA_ENT_MSK_REG, channel, &value);
23286f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_ENT_MSK_REG, channel,
2329678453a8Sspeer 		    configuration | value);
23306f45ec7bSml29623 		break;
23316f45ec7bSml29623 
23326f45ec7bSml29623 	case OP_CLEAR:
23336f45ec7bSml29623 		RXDMA_REG_WRITE64(handle, RX_DMA_ENT_MSK_REG, channel,
23346f45ec7bSml29623 		    CFG_RXDMA_MASK_ALL);
23356f45ec7bSml29623 		break;
23366f45ec7bSml29623 	default:
23376f45ec7bSml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
23386f45ec7bSml29623 		    "npi_rxdma_event_mask_config",
23396f45ec7bSml29623 		    "eventmask", op_mode));
23406f45ec7bSml29623 		return (NPI_FAILURE | NPI_RXDMA_OPCODE_INVALID(channel));
23416f45ec7bSml29623 	}
23426f45ec7bSml29623 
23436f45ec7bSml29623 	return (status);
23446f45ec7bSml29623 }
2345