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 /*
227b26d9ffSSantwona Behera * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
236f45ec7bSml29623 * Use is subject to license terms.
246f45ec7bSml29623 */
256f45ec7bSml29623
266f45ec7bSml29623 #include <sys/nxge/nxge_impl.h>
27678453a8Sspeer #include <sys/nxge/nxge_hio.h>
28678453a8Sspeer
296f45ec7bSml29623 #include <inet/common.h>
306f45ec7bSml29623 #include <inet/mi.h>
316f45ec7bSml29623 #include <inet/nd.h>
326f45ec7bSml29623
336f45ec7bSml29623 extern uint64_t npi_debug_level;
346f45ec7bSml29623
356f45ec7bSml29623 #define NXGE_PARAM_MAC_RW \
366f45ec7bSml29623 NXGE_PARAM_RW | NXGE_PARAM_MAC | \
376f45ec7bSml29623 NXGE_PARAM_NDD_WR_OK | NXGE_PARAM_READ_PROP
386f45ec7bSml29623
396f45ec7bSml29623 #define NXGE_PARAM_MAC_DONT_SHOW \
406f45ec7bSml29623 NXGE_PARAM_RW | NXGE_PARAM_MAC | NXGE_PARAM_DONT_SHOW
416f45ec7bSml29623
426f45ec7bSml29623 #define NXGE_PARAM_RXDMA_RW \
436f45ec7bSml29623 NXGE_PARAM_RWP | NXGE_PARAM_RXDMA | NXGE_PARAM_NDD_WR_OK | \
446f45ec7bSml29623 NXGE_PARAM_READ_PROP
456f45ec7bSml29623
466f45ec7bSml29623 #define NXGE_PARAM_RXDMA_RWC \
476f45ec7bSml29623 NXGE_PARAM_RWP | NXGE_PARAM_RXDMA | NXGE_PARAM_INIT_ONLY | \
486f45ec7bSml29623 NXGE_PARAM_READ_PROP
496f45ec7bSml29623
506f45ec7bSml29623 #define NXGE_PARAM_L2CLASS_CFG \
516f45ec7bSml29623 NXGE_PARAM_RW | NXGE_PARAM_PROP_ARR32 | NXGE_PARAM_READ_PROP | \
526f45ec7bSml29623 NXGE_PARAM_NDD_WR_OK
536f45ec7bSml29623
546f45ec7bSml29623 #define NXGE_PARAM_CLASS_RWS \
556f45ec7bSml29623 NXGE_PARAM_RWS | NXGE_PARAM_READ_PROP
566f45ec7bSml29623
576f45ec7bSml29623 #define NXGE_PARAM_ARRAY_INIT_SIZE 0x20ULL
586f45ec7bSml29623
596f45ec7bSml29623 #define SET_RX_INTR_TIME_DISABLE 0
606f45ec7bSml29623 #define SET_RX_INTR_TIME_ENABLE 1
616f45ec7bSml29623 #define SET_RX_INTR_PKTS 2
626f45ec7bSml29623
636f45ec7bSml29623 #define BASE_ANY 0
646f45ec7bSml29623 #define BASE_BINARY 2
656f45ec7bSml29623 #define BASE_HEX 16
666f45ec7bSml29623 #define BASE_DECIMAL 10
676f45ec7bSml29623 #define ALL_FF_64 0xFFFFFFFFFFFFFFFFULL
686f45ec7bSml29623 #define ALL_FF_32 0xFFFFFFFFUL
696f45ec7bSml29623
706f45ec7bSml29623 #define NXGE_NDD_INFODUMP_BUFF_SIZE 2048 /* is 2k enough? */
716f45ec7bSml29623 #define NXGE_NDD_INFODUMP_BUFF_8K 8192
726f45ec7bSml29623 #define NXGE_NDD_INFODUMP_BUFF_16K 0x2000
736f45ec7bSml29623 #define NXGE_NDD_INFODUMP_BUFF_64K 0x8000
746f45ec7bSml29623
756f45ec7bSml29623 #define PARAM_OUTOF_RANGE(vptr, eptr, rval, pa) \
766f45ec7bSml29623 ((vptr == eptr) || (rval < pa->minimum) || (rval > pa->maximum))
776f45ec7bSml29623
786f45ec7bSml29623 #define ADVANCE_PRINT_BUFFER(pmp, plen, rlen) { \
796f45ec7bSml29623 ((mblk_t *)pmp)->b_wptr += plen; \
806f45ec7bSml29623 rlen -= plen; \
816f45ec7bSml29623 }
826f45ec7bSml29623
834045d941Ssowmini int nxge_param_set_mac(p_nxge_t, queue_t *,
846f45ec7bSml29623 mblk_t *, char *, caddr_t);
856f45ec7bSml29623 static int nxge_param_set_port_rdc(p_nxge_t, queue_t *,
866f45ec7bSml29623 mblk_t *, char *, caddr_t);
876f45ec7bSml29623 static int nxge_param_set_grp_rdc(p_nxge_t, queue_t *,
886f45ec7bSml29623 mblk_t *, char *, caddr_t);
896f45ec7bSml29623 static int nxge_param_set_ether_usr(p_nxge_t,
906f45ec7bSml29623 queue_t *, mblk_t *, char *, caddr_t);
916f45ec7bSml29623 static int nxge_param_set_ip_usr(p_nxge_t,
926f45ec7bSml29623 queue_t *, mblk_t *, char *, caddr_t);
936f45ec7bSml29623 static int nxge_param_set_vlan_rdcgrp(p_nxge_t,
946f45ec7bSml29623 queue_t *, mblk_t *, char *, caddr_t);
956f45ec7bSml29623 static int nxge_param_set_mac_rdcgrp(p_nxge_t,
966f45ec7bSml29623 queue_t *, mblk_t *, char *, caddr_t);
976f45ec7bSml29623 static int nxge_param_fflp_hash_init(p_nxge_t,
986f45ec7bSml29623 queue_t *, mblk_t *, char *, caddr_t);
996f45ec7bSml29623 static int nxge_param_llc_snap_enable(p_nxge_t, queue_t *,
1006f45ec7bSml29623 mblk_t *, char *, caddr_t);
1016f45ec7bSml29623 static int nxge_param_hash_lookup_enable(p_nxge_t, queue_t *,
1026f45ec7bSml29623 mblk_t *, char *, caddr_t);
1036f45ec7bSml29623 static int nxge_param_tcam_enable(p_nxge_t, queue_t *,
1046f45ec7bSml29623 mblk_t *, char *, caddr_t);
10556d930aeSspeer static int nxge_param_get_fw_ver(p_nxge_t, queue_t *, p_mblk_t, caddr_t);
1062e59129aSraghus static int nxge_param_get_port_mode(p_nxge_t, queue_t *, p_mblk_t, caddr_t);
1076f45ec7bSml29623 static int nxge_param_get_rxdma_info(p_nxge_t, queue_t *q,
1086f45ec7bSml29623 p_mblk_t, caddr_t);
1096f45ec7bSml29623 static int nxge_param_get_txdma_info(p_nxge_t, queue_t *q,
1106f45ec7bSml29623 p_mblk_t, caddr_t);
1116f45ec7bSml29623 static int nxge_param_get_vlan_rdcgrp(p_nxge_t, queue_t *,
1126f45ec7bSml29623 p_mblk_t, caddr_t);
1136f45ec7bSml29623 static int nxge_param_get_mac_rdcgrp(p_nxge_t, queue_t *,
1146f45ec7bSml29623 p_mblk_t, caddr_t);
1156f45ec7bSml29623 static int nxge_param_get_rxdma_rdcgrp_info(p_nxge_t, queue_t *,
1166f45ec7bSml29623 p_mblk_t, caddr_t);
117c1f9c6e5SSantwona Behera static int nxge_param_get_rx_intr_time(p_nxge_t, queue_t *, p_mblk_t, caddr_t);
118c1f9c6e5SSantwona Behera static int nxge_param_get_rx_intr_pkts(p_nxge_t, queue_t *, p_mblk_t, caddr_t);
1196f45ec7bSml29623 static int nxge_param_get_ip_opt(p_nxge_t, queue_t *, mblk_t *, caddr_t);
1206f45ec7bSml29623 static int nxge_param_get_mac(p_nxge_t, queue_t *q, p_mblk_t, caddr_t);
1216f45ec7bSml29623 static int nxge_param_get_debug_flag(p_nxge_t, queue_t *, p_mblk_t, caddr_t);
1226f45ec7bSml29623 static int nxge_param_set_nxge_debug_flag(p_nxge_t, queue_t *, mblk_t *,
1236f45ec7bSml29623 char *, caddr_t);
1246f45ec7bSml29623 static int nxge_param_set_npi_debug_flag(p_nxge_t,
1256f45ec7bSml29623 queue_t *, mblk_t *, char *, caddr_t);
1266f45ec7bSml29623 static int nxge_param_dump_rdc(p_nxge_t, queue_t *q, p_mblk_t, caddr_t);
1276f45ec7bSml29623 static int nxge_param_dump_tdc(p_nxge_t, queue_t *q, p_mblk_t, caddr_t);
1286f45ec7bSml29623 static int nxge_param_dump_mac_regs(p_nxge_t, queue_t *, p_mblk_t, caddr_t);
1296f45ec7bSml29623 static int nxge_param_dump_ipp_regs(p_nxge_t, queue_t *, p_mblk_t, caddr_t);
1306f45ec7bSml29623 static int nxge_param_dump_fflp_regs(p_nxge_t, queue_t *, p_mblk_t, caddr_t);
1316f45ec7bSml29623 static int nxge_param_dump_vlan_table(p_nxge_t, queue_t *, p_mblk_t, caddr_t);
1326f45ec7bSml29623 static int nxge_param_dump_rdc_table(p_nxge_t, queue_t *, p_mblk_t, caddr_t);
1336f45ec7bSml29623 static int nxge_param_dump_ptrs(p_nxge_t, queue_t *, p_mblk_t, caddr_t);
1341bd6825cSml29623 static void nxge_param_sync(p_nxge_t);
1356f45ec7bSml29623
1366f45ec7bSml29623 /*
1376f45ec7bSml29623 * Global array of Neptune changable parameters.
1386f45ec7bSml29623 * This array is initialized to correspond to the default
1396f45ec7bSml29623 * Neptune 4 port configuration. This array would be copied
1406f45ec7bSml29623 * into each port's parameter structure and modifed per
1416f45ec7bSml29623 * fcode and nxge.conf configuration. Later, the parameters are
1426f45ec7bSml29623 * exported to ndd to display and run-time configuration (at least
1436f45ec7bSml29623 * some of them).
1446f45ec7bSml29623 *
14500161856Syc148097 * Parameters with DONT_SHOW are not shown by ndd.
14600161856Syc148097 *
1476f45ec7bSml29623 */
1486f45ec7bSml29623
1496f45ec7bSml29623 static nxge_param_t nxge_param_arr[] = {
1506f45ec7bSml29623 /*
1516f45ec7bSml29623 * min max value old hw-name conf-name
1526f45ec7bSml29623 */
153846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW,
1546f45ec7bSml29623 0, 999, 1000, 0, "instance", "instance"},
1556f45ec7bSml29623
156846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW,
1576f45ec7bSml29623 0, 999, 1000, 0, "main-instance", "main_instance"},
1586f45ec7bSml29623
1596f45ec7bSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ,
1606f45ec7bSml29623 0, 3, 0, 0, "function-number", "function_number"},
1616f45ec7bSml29623
1626f45ec7bSml29623 /* Partition Id */
163846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW,
1646f45ec7bSml29623 0, 8, 0, 0, "partition-id", "partition_id"},
1656f45ec7bSml29623
1666f45ec7bSml29623 /* Read Write Permission Mode */
167846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW,
1686f45ec7bSml29623 0, 2, 0, 0, "read-write-mode", "read_write_mode"},
1696f45ec7bSml29623
17056d930aeSspeer { nxge_param_get_fw_ver, NULL, NXGE_PARAM_READ,
17156d930aeSspeer 0, 32, 0, 0, "version", "fw_version"},
17256d930aeSspeer
1732e59129aSraghus { nxge_param_get_port_mode, NULL, NXGE_PARAM_READ,
1742e59129aSraghus 0, 32, 0, 0, "port-mode", "port_mode"},
1752e59129aSraghus
1766f45ec7bSml29623 /* hw cfg types */
1776f45ec7bSml29623 /* control the DMA config of Neptune/NIU */
178846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW,
1796f45ec7bSml29623 CFG_DEFAULT, CFG_CUSTOM, CFG_DEFAULT, CFG_DEFAULT,
1806f45ec7bSml29623 "niu-cfg-type", "niu_cfg_type"},
1816f45ec7bSml29623
1826f45ec7bSml29623 /* control the TXDMA config of the Port controlled by tx-quick-cfg */
183846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW,
1846f45ec7bSml29623 CFG_DEFAULT, CFG_CUSTOM, CFG_NOT_SPECIFIED, CFG_DEFAULT,
1856f45ec7bSml29623 "tx-qcfg-type", "tx_qcfg_type"},
1866f45ec7bSml29623
1876f45ec7bSml29623 /* control the RXDMA config of the Port controlled by rx-quick-cfg */
188846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW,
1896f45ec7bSml29623 CFG_DEFAULT, CFG_CUSTOM, CFG_NOT_SPECIFIED, CFG_DEFAULT,
1906f45ec7bSml29623 "rx-qcfg-type", "rx_qcfg_type"},
1916f45ec7bSml29623
1926f45ec7bSml29623 { nxge_param_get_mac, nxge_param_set_mac,
1936f45ec7bSml29623 NXGE_PARAM_RW | NXGE_PARAM_DONT_SHOW,
1946f45ec7bSml29623 0, 1, 0, 0, "master-cfg-enable", "master_cfg_enable"},
1956f45ec7bSml29623
1966f45ec7bSml29623 { nxge_param_get_mac, nxge_param_set_mac,
197846a903dSml29623 NXGE_PARAM_DONT_SHOW,
1986f45ec7bSml29623 0, 1, 0, 0, "master-cfg-value", "master_cfg_value"},
1996f45ec7bSml29623
2006f45ec7bSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW,
2016f45ec7bSml29623 0, 1, 1, 1, "adv-autoneg-cap", "adv_autoneg_cap"},
2026f45ec7bSml29623
2036f45ec7bSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW,
2046f45ec7bSml29623 0, 1, 1, 1, "adv-10gfdx-cap", "adv_10gfdx_cap"},
2056f45ec7bSml29623
2066f45ec7bSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW,
2076f45ec7bSml29623 0, 1, 0, 0, "adv-10ghdx-cap", "adv_10ghdx_cap"},
2086f45ec7bSml29623
2096f45ec7bSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW,
2106f45ec7bSml29623 0, 1, 1, 1, "adv-1000fdx-cap", "adv_1000fdx_cap"},
2116f45ec7bSml29623
2126f45ec7bSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW,
2136f45ec7bSml29623 0, 1, 0, 0, "adv-1000hdx-cap", "adv_1000hdx_cap"},
2146f45ec7bSml29623
2156f45ec7bSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW,
2166f45ec7bSml29623 0, 1, 0, 0, "adv-100T4-cap", "adv_100T4_cap"},
2176f45ec7bSml29623
2186f45ec7bSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW,
2196f45ec7bSml29623 0, 1, 1, 1, "adv-100fdx-cap", "adv_100fdx_cap"},
2206f45ec7bSml29623
2216f45ec7bSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW,
2226f45ec7bSml29623 0, 1, 0, 0, "adv-100hdx-cap", "adv_100hdx_cap"},
2236f45ec7bSml29623
2246f45ec7bSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW,
2256f45ec7bSml29623 0, 1, 1, 1, "adv-10fdx-cap", "adv_10fdx_cap"},
2266f45ec7bSml29623
2276f45ec7bSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW,
2286f45ec7bSml29623 0, 1, 0, 0, "adv-10hdx-cap", "adv_10hdx_cap"},
2296f45ec7bSml29623
230846a903dSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW,
2316f45ec7bSml29623 0, 1, 0, 0, "adv-asmpause-cap", "adv_asmpause_cap"},
2326f45ec7bSml29623
2336f45ec7bSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW,
2346f45ec7bSml29623 0, 1, 0, 0, "adv-pause-cap", "adv_pause_cap"},
2356f45ec7bSml29623
236846a903dSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW,
2376f45ec7bSml29623 0, 1, 0, 0, "use-int-xcvr", "use_int_xcvr"},
2386f45ec7bSml29623
239846a903dSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW,
2406f45ec7bSml29623 0, 1, 1, 1, "enable-ipg0", "enable_ipg0"},
2416f45ec7bSml29623
242846a903dSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW,
2436f45ec7bSml29623 0, 255, 8, 8, "ipg0", "ipg0"},
2446f45ec7bSml29623
245846a903dSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW,
2466f45ec7bSml29623 0, 255, 8, 8, "ipg1", "ipg1"},
2476f45ec7bSml29623
248846a903dSml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW,
2496f45ec7bSml29623 0, 255, 4, 4, "ipg2", "ipg2"},
2506f45ec7bSml29623
2516f45ec7bSml29623 /* Transmit DMA channels */
252846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ |
253846a903dSml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW,
2546f45ec7bSml29623 0, 3, 0, 0, "tx-dma-weight", "tx_dma_weight"},
2556f45ec7bSml29623
256846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ |
257846a903dSml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW,
2586f45ec7bSml29623 0, 31, 0, 0, "tx-dma-channels-begin", "tx_dma_channels_begin"},
2596f45ec7bSml29623
260846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ |
261846a903dSml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW,
2626f45ec7bSml29623 0, 32, 0, 0, "tx-dma-channels", "tx_dma_channels"},
2636f45ec7bSml29623 { nxge_param_get_txdma_info, NULL,
264846a903dSml29623 NXGE_PARAM_READ | NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW,
2656f45ec7bSml29623 0, 32, 0, 0, "tx-dma-info", "tx_dma_info"},
2666f45ec7bSml29623
2676f45ec7bSml29623 /* Receive DMA channels */
2686f45ec7bSml29623 { nxge_param_get_generic, NULL,
269846a903dSml29623 NXGE_PARAM_READ | NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW,
2706f45ec7bSml29623 0, 31, 0, 0, "rx-dma-channels-begin", "rx_dma_channels_begin"},
2716f45ec7bSml29623
272846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ |
273846a903dSml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW,
2746f45ec7bSml29623 0, 32, 0, 0, "rx-dma-channels", "rx_dma_channels"},
2756f45ec7bSml29623
276846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ |
277846a903dSml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW,
2786f45ec7bSml29623 0, 65535, PT_DRR_WT_DEFAULT_10G, 0,
2796f45ec7bSml29623 "rx-drr-weight", "rx_drr_weight"},
2806f45ec7bSml29623
281846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ |
282846a903dSml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW,
2836f45ec7bSml29623 0, 1, 1, 0, "rx-full-header", "rx_full_header"},
2846f45ec7bSml29623
285846a903dSml29623 { nxge_param_get_rxdma_info, NULL, NXGE_PARAM_READ |
286846a903dSml29623 NXGE_PARAM_DONT_SHOW,
2876f45ec7bSml29623 0, 32, 0, 0, "rx-dma-info", "rx_dma_info"},
2886f45ec7bSml29623
2896f45ec7bSml29623 { nxge_param_get_rxdma_info, NULL,
2906f45ec7bSml29623 NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW,
2916f45ec7bSml29623 NXGE_RBR_RBB_MIN, NXGE_RBR_RBB_MAX, NXGE_RBR_RBB_DEFAULT, 0,
2926f45ec7bSml29623 "rx-rbr-size", "rx_rbr_size"},
2936f45ec7bSml29623
2946f45ec7bSml29623 { nxge_param_get_rxdma_info, NULL,
2956f45ec7bSml29623 NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW,
2966f45ec7bSml29623 NXGE_RCR_MIN, NXGE_RCR_MAX, NXGE_RCR_DEFAULT, 0,
2976f45ec7bSml29623 "rx-rcr-size", "rx_rcr_size"},
2986f45ec7bSml29623
299846a903dSml29623 { nxge_param_get_generic, nxge_param_set_port_rdc,
300846a903dSml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW,
3016f45ec7bSml29623 0, 15, 0, 0, "default-port-rdc", "default_port_rdc"},
3026f45ec7bSml29623
303c1f9c6e5SSantwona Behera { nxge_param_get_rx_intr_time, nxge_param_rx_intr_time,
304c1f9c6e5SSantwona Behera NXGE_PARAM_RXDMA_RW,
3056f45ec7bSml29623 NXGE_RDC_RCR_TIMEOUT_MIN, NXGE_RDC_RCR_TIMEOUT_MAX,
3067b26d9ffSSantwona Behera NXGE_RDC_RCR_TIMEOUT, 0, "rxdma-intr-time", "rxdma_intr_time"},
3076f45ec7bSml29623
308c1f9c6e5SSantwona Behera { nxge_param_get_rx_intr_pkts, nxge_param_rx_intr_pkts,
309c1f9c6e5SSantwona Behera NXGE_PARAM_RXDMA_RW,
3106f45ec7bSml29623 NXGE_RDC_RCR_THRESHOLD_MIN, NXGE_RDC_RCR_THRESHOLD_MAX,
3117b26d9ffSSantwona Behera NXGE_RDC_RCR_THRESHOLD, 0,
3126f45ec7bSml29623 "rxdma-intr-pkts", "rxdma_intr_pkts"},
3136f45ec7bSml29623
314846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ_PROP |
315846a903dSml29623 NXGE_PARAM_DONT_SHOW,
3166f45ec7bSml29623 0, 8, 0, 0, "rx-rdc-grps-begin", "rx_rdc_grps_begin"},
3176f45ec7bSml29623
318846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ_PROP |
319846a903dSml29623 NXGE_PARAM_DONT_SHOW,
3206f45ec7bSml29623 0, 8, 0, 0, "rx-rdc-grps", "rx_rdc_grps"},
3216f45ec7bSml29623
322846a903dSml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc,
323846a903dSml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW,
3246f45ec7bSml29623 0, 15, 0, 0, "default-grp0-rdc", "default_grp0_rdc"},
3256f45ec7bSml29623
326846a903dSml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc,
327846a903dSml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW,
3286f45ec7bSml29623 0, 15, 2, 0, "default-grp1-rdc", "default_grp1_rdc"},
3296f45ec7bSml29623
330846a903dSml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc,
331846a903dSml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW,
3326f45ec7bSml29623 0, 15, 4, 0, "default-grp2-rdc", "default_grp2_rdc"},
3336f45ec7bSml29623
334846a903dSml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc,
335846a903dSml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW,
3366f45ec7bSml29623 0, 15, 6, 0, "default-grp3-rdc", "default_grp3_rdc"},
3376f45ec7bSml29623
338846a903dSml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc,
339846a903dSml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW,
3406f45ec7bSml29623 0, 15, 8, 0, "default-grp4-rdc", "default_grp4_rdc"},
3416f45ec7bSml29623
342846a903dSml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc,
343846a903dSml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW,
3446f45ec7bSml29623 0, 15, 10, 0, "default-grp5-rdc", "default_grp5_rdc"},
3456f45ec7bSml29623
346846a903dSml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc,
347846a903dSml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW,
3486f45ec7bSml29623 0, 15, 12, 0, "default-grp6-rdc", "default_grp6_rdc"},
3496f45ec7bSml29623
350846a903dSml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc,
351846a903dSml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW,
3526f45ec7bSml29623 0, 15, 14, 0, "default-grp7-rdc", "default_grp7_rdc"},
3536f45ec7bSml29623
3546f45ec7bSml29623 { nxge_param_get_rxdma_rdcgrp_info, NULL,
355846a903dSml29623 NXGE_PARAM_READ | NXGE_PARAM_CMPLX | NXGE_PARAM_DONT_SHOW,
3566f45ec7bSml29623 0, 8, 0, 0, "rdc-groups-info", "rdc_groups_info"},
3576f45ec7bSml29623
3586f45ec7bSml29623 /* Logical device groups */
359846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW,
3606f45ec7bSml29623 0, 63, 0, 0, "start-ldg", "start_ldg"},
3616f45ec7bSml29623
362846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW,
3636f45ec7bSml29623 0, 64, 0, 0, "max-ldg", "max_ldg" },
3646f45ec7bSml29623
3656f45ec7bSml29623 /* MAC table information */
3666f45ec7bSml29623 { nxge_param_get_mac_rdcgrp, nxge_param_set_mac_rdcgrp,
367846a903dSml29623 NXGE_PARAM_L2CLASS_CFG | NXGE_PARAM_DONT_SHOW,
3686f45ec7bSml29623 0, 31, 0, 0, "mac-2rdc-grp", "mac_2rdc_grp"},
3696f45ec7bSml29623
3706f45ec7bSml29623 /* VLAN table information */
3716f45ec7bSml29623 { nxge_param_get_vlan_rdcgrp, nxge_param_set_vlan_rdcgrp,
372846a903dSml29623 NXGE_PARAM_L2CLASS_CFG | NXGE_PARAM_DONT_SHOW,
3736f45ec7bSml29623 0, 31, 0, 0, "vlan-2rdc-grp", "vlan_2rdc_grp"},
3746f45ec7bSml29623
3756f45ec7bSml29623 { nxge_param_get_generic, NULL,
376846a903dSml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_READ |
377846a903dSml29623 NXGE_PARAM_PROP_ARR32 | NXGE_PARAM_DONT_SHOW,
3786f45ec7bSml29623 0, 0x0ffff, 0x0ffff, 0, "fcram-part-cfg", "fcram_part_cfg"},
3796f45ec7bSml29623
380846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_CLASS_RWS |
381846a903dSml29623 NXGE_PARAM_DONT_SHOW,
3826f45ec7bSml29623 0, 0x10, 0xa, 0, "fcram-access-ratio", "fcram_access_ratio"},
3836f45ec7bSml29623
384846a903dSml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_CLASS_RWS |
385846a903dSml29623 NXGE_PARAM_DONT_SHOW,
3866f45ec7bSml29623 0, 0x10, 0xa, 0, "tcam-access-ratio", "tcam_access_ratio"},
3876f45ec7bSml29623
3886f45ec7bSml29623 { nxge_param_get_generic, nxge_param_tcam_enable,
389846a903dSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
3906f45ec7bSml29623 0, 0x1, 0x0, 0, "tcam-enable", "tcam_enable"},
3916f45ec7bSml29623
3926f45ec7bSml29623 { nxge_param_get_generic, nxge_param_hash_lookup_enable,
393846a903dSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
3946f45ec7bSml29623 0, 0x01, 0x0, 0, "hash-lookup-enable", "hash_lookup_enable"},
3956f45ec7bSml29623
3966f45ec7bSml29623 { nxge_param_get_generic, nxge_param_llc_snap_enable,
397846a903dSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
3986f45ec7bSml29623 0, 0x01, 0x01, 0, "llc-snap-enable", "llc_snap_enable"},
3996f45ec7bSml29623
4006f45ec7bSml29623 { nxge_param_get_generic, nxge_param_fflp_hash_init,
401846a903dSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
4026f45ec7bSml29623 0, ALL_FF_32, ALL_FF_32, 0, "h1-init-value", "h1_init_value"},
4036f45ec7bSml29623
4046f45ec7bSml29623 { nxge_param_get_generic, nxge_param_fflp_hash_init,
405846a903dSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
4066f45ec7bSml29623 0, 0x0ffff, 0x0ffff, 0, "h2-init-value", "h2_init_value"},
4076f45ec7bSml29623
4086f45ec7bSml29623 { nxge_param_get_generic, nxge_param_set_ether_usr,
4096f45ec7bSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
4106f45ec7bSml29623 0, ALL_FF_32, 0x0, 0,
4116f45ec7bSml29623 "class-cfg-ether-usr1", "class_cfg_ether_usr1"},
4126f45ec7bSml29623
4136f45ec7bSml29623 { nxge_param_get_generic, nxge_param_set_ether_usr,
4146f45ec7bSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
4156f45ec7bSml29623 0, ALL_FF_32, 0x0, 0,
4166f45ec7bSml29623 "class-cfg-ether-usr2", "class_cfg_ether_usr2"},
4176f45ec7bSml29623
4186f45ec7bSml29623 { nxge_param_get_generic, nxge_param_set_ip_usr,
4196f45ec7bSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
4206f45ec7bSml29623 0, ALL_FF_32, 0x0, 0,
4216f45ec7bSml29623 "class-cfg-ip-usr4", "class_cfg_ip_usr4"},
4226f45ec7bSml29623
4236f45ec7bSml29623 { nxge_param_get_generic, nxge_param_set_ip_usr,
4246f45ec7bSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
4256f45ec7bSml29623 0, ALL_FF_32, 0x0, 0,
4266f45ec7bSml29623 "class-cfg-ip-usr5", "class_cfg_ip_usr5"},
4276f45ec7bSml29623
4286f45ec7bSml29623 { nxge_param_get_generic, nxge_param_set_ip_usr,
4296f45ec7bSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
4306f45ec7bSml29623 0, ALL_FF_32, 0x0, 0,
4316f45ec7bSml29623 "class-cfg-ip-usr6", "class_cfg_ip_usr6"},
4326f45ec7bSml29623
4336f45ec7bSml29623 { nxge_param_get_generic, nxge_param_set_ip_usr,
4346f45ec7bSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
4356f45ec7bSml29623 0, ALL_FF_32, 0x0, 0,
4366f45ec7bSml29623 "class-cfg-ip-usr7", "class_cfg_ip_usr7"},
4376f45ec7bSml29623
4386f45ec7bSml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt,
4396f45ec7bSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
4406f45ec7bSml29623 0, ALL_FF_32, 0x0, 0,
4416f45ec7bSml29623 "class-opt-ip-usr4", "class_opt_ip_usr4"},
4426f45ec7bSml29623
4436f45ec7bSml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt,
4446f45ec7bSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
4456f45ec7bSml29623 0, ALL_FF_32, 0x0, 0,
4466f45ec7bSml29623 "class-opt-ip-usr5", "class_opt_ip_usr5"},
4476f45ec7bSml29623
4486f45ec7bSml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt,
4496f45ec7bSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
4506f45ec7bSml29623 0, ALL_FF_32, 0x0, 0,
4516f45ec7bSml29623 "class-opt-ip-usr6", "class_opt_ip_usr6"},
4526f45ec7bSml29623
4536f45ec7bSml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt,
4546f45ec7bSml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW,
4556f45ec7bSml29623 0, ALL_FF_32, 0x0, 0,
4566f45ec7bSml29623 "class-opt-ip-usr7", "class_opt_ip_usr7"},
4576f45ec7bSml29623
4586f45ec7bSml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt,
4596f45ec7bSml29623 NXGE_PARAM_CLASS_RWS,
4606f45ec7bSml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0,
4616f45ec7bSml29623 "class-opt-ipv4-tcp", "class_opt_ipv4_tcp"},
4626f45ec7bSml29623
4636f45ec7bSml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt,
4646f45ec7bSml29623 NXGE_PARAM_CLASS_RWS,
4656f45ec7bSml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0,
4666f45ec7bSml29623 "class-opt-ipv4-udp", "class_opt_ipv4_udp"},
4676f45ec7bSml29623
4686f45ec7bSml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt,
4696f45ec7bSml29623 NXGE_PARAM_CLASS_RWS,
4706f45ec7bSml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0,
4716f45ec7bSml29623 "class-opt-ipv4-ah", "class_opt_ipv4_ah"},
4726f45ec7bSml29623
4736f45ec7bSml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt,
4746f45ec7bSml29623 NXGE_PARAM_CLASS_RWS,
4756f45ec7bSml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0,
4766f45ec7bSml29623 "class-opt-ipv4-sctp", "class_opt_ipv4_sctp"},
4776f45ec7bSml29623
4786f45ec7bSml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, NXGE_PARAM_CLASS_RWS,
4796f45ec7bSml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0,
4806f45ec7bSml29623 "class-opt-ipv6-tcp", "class_opt_ipv6_tcp"},
4816f45ec7bSml29623
4826f45ec7bSml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, NXGE_PARAM_CLASS_RWS,
4836f45ec7bSml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0,
4846f45ec7bSml29623 "class-opt-ipv6-udp", "class_opt_ipv6_udp"},
4856f45ec7bSml29623
4866f45ec7bSml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, NXGE_PARAM_CLASS_RWS,
4876f45ec7bSml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0,
4886f45ec7bSml29623 "class-opt-ipv6-ah", "class_opt_ipv6_ah"},
4896f45ec7bSml29623
4906f45ec7bSml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, NXGE_PARAM_CLASS_RWS,
4916f45ec7bSml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0,
4926f45ec7bSml29623 "class-opt-ipv6-sctp", "class_opt_ipv6_sctp"},
4936f45ec7bSml29623
4946f45ec7bSml29623 { nxge_param_get_debug_flag, nxge_param_set_nxge_debug_flag,
495846a903dSml29623 NXGE_PARAM_RW | NXGE_PARAM_DONT_SHOW,
4966f45ec7bSml29623 0ULL, ALL_FF_64, 0ULL, 0ULL,
4976f45ec7bSml29623 "nxge-debug-flag", "nxge_debug_flag"},
4986f45ec7bSml29623
4996f45ec7bSml29623 { nxge_param_get_debug_flag, nxge_param_set_npi_debug_flag,
500846a903dSml29623 NXGE_PARAM_RW | NXGE_PARAM_DONT_SHOW,
5016f45ec7bSml29623 0ULL, ALL_FF_64, 0ULL, 0ULL,
5026f45ec7bSml29623 "npi-debug-flag", "npi_debug_flag"},
5036f45ec7bSml29623
504846a903dSml29623 { nxge_param_dump_tdc, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW,
5056f45ec7bSml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-tdc", "dump_tdc"},
5066f45ec7bSml29623
507846a903dSml29623 { nxge_param_dump_rdc, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW,
5086f45ec7bSml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-rdc", "dump_rdc"},
5096f45ec7bSml29623
510846a903dSml29623 { nxge_param_dump_mac_regs, NULL, NXGE_PARAM_READ |
511846a903dSml29623 NXGE_PARAM_DONT_SHOW,
5126f45ec7bSml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-mac-regs", "dump_mac_regs"},
5136f45ec7bSml29623
514846a903dSml29623 { nxge_param_dump_ipp_regs, NULL, NXGE_PARAM_READ |
515846a903dSml29623 NXGE_PARAM_DONT_SHOW,
5166f45ec7bSml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-ipp-regs", "dump_ipp_regs"},
5176f45ec7bSml29623
518846a903dSml29623 { nxge_param_dump_fflp_regs, NULL, NXGE_PARAM_READ |
519846a903dSml29623 NXGE_PARAM_DONT_SHOW,
5206f45ec7bSml29623 0, 0x0fffffff, 0x0fffffff, 0,
5216f45ec7bSml29623 "dump-fflp-regs", "dump_fflp_regs"},
5226f45ec7bSml29623
523846a903dSml29623 { nxge_param_dump_vlan_table, NULL, NXGE_PARAM_READ |
524846a903dSml29623 NXGE_PARAM_DONT_SHOW,
5256f45ec7bSml29623 0, 0x0fffffff, 0x0fffffff, 0,
5266f45ec7bSml29623 "dump-vlan-table", "dump_vlan_table"},
5276f45ec7bSml29623
528846a903dSml29623 { nxge_param_dump_rdc_table, NULL, NXGE_PARAM_READ |
529846a903dSml29623 NXGE_PARAM_DONT_SHOW,
5306f45ec7bSml29623 0, 0x0fffffff, 0x0fffffff, 0,
5316f45ec7bSml29623 "dump-rdc-table", "dump_rdc_table"},
5326f45ec7bSml29623
533846a903dSml29623 { nxge_param_dump_ptrs, NULL, NXGE_PARAM_READ |
534846a903dSml29623 NXGE_PARAM_DONT_SHOW,
5356f45ec7bSml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-ptrs", "dump_ptrs"},
5366f45ec7bSml29623
5376f45ec7bSml29623 { NULL, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW,
5386f45ec7bSml29623 0, 0x0fffffff, 0x0fffffff, 0, "end", "end"},
5396f45ec7bSml29623 };
5406f45ec7bSml29623
5416f45ec7bSml29623 extern void *nxge_list;
5426f45ec7bSml29623
5436f45ec7bSml29623 void
nxge_get_param_soft_properties(p_nxge_t nxgep)5446f45ec7bSml29623 nxge_get_param_soft_properties(p_nxge_t nxgep)
5456f45ec7bSml29623 {
5466f45ec7bSml29623
5476f45ec7bSml29623 p_nxge_param_t param_arr;
5486f45ec7bSml29623 uint_t prop_len;
5496f45ec7bSml29623 int i, j;
5506f45ec7bSml29623 uint32_t param_count;
5516f45ec7bSml29623 uint32_t *int_prop_val;
5526f45ec7bSml29623
5536f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, " ==> nxge_get_param_soft_properties"));
5546f45ec7bSml29623
5556f45ec7bSml29623 param_arr = nxgep->param_arr;
5566f45ec7bSml29623 param_count = nxgep->param_count;
5576f45ec7bSml29623 for (i = 0; i < param_count; i++) {
5586f45ec7bSml29623 if ((param_arr[i].type & NXGE_PARAM_READ_PROP) == 0)
5596f45ec7bSml29623 continue;
5606f45ec7bSml29623 if ((param_arr[i].type & NXGE_PARAM_PROP_STR))
5616f45ec7bSml29623 continue;
5626f45ec7bSml29623 if ((param_arr[i].type & NXGE_PARAM_PROP_ARR32) ||
5636f45ec7bSml29623 (param_arr[i].type & NXGE_PARAM_PROP_ARR64)) {
5646f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY,
5656f45ec7bSml29623 nxgep->dip, 0, param_arr[i].fcode_name,
5666f45ec7bSml29623 (int **)&int_prop_val,
5676f45ec7bSml29623 (uint_t *)&prop_len)
5686f45ec7bSml29623 == DDI_PROP_SUCCESS) {
5696f45ec7bSml29623 uint32_t *cfg_value;
5706f45ec7bSml29623 uint64_t prop_count;
5716f45ec7bSml29623
5726f45ec7bSml29623 if (prop_len > NXGE_PARAM_ARRAY_INIT_SIZE)
5736f45ec7bSml29623 prop_len = NXGE_PARAM_ARRAY_INIT_SIZE;
5746f45ec7bSml29623 cfg_value = (uint32_t *)param_arr[i].value;
5756f45ec7bSml29623 for (j = 0; j < prop_len; j++) {
5766f45ec7bSml29623 cfg_value[j] = int_prop_val[j];
5776f45ec7bSml29623 }
5786f45ec7bSml29623 prop_count = prop_len;
5796f45ec7bSml29623 param_arr[i].type |=
5806f45ec7bSml29623 (prop_count << NXGE_PARAM_ARRAY_CNT_SHIFT);
5816f45ec7bSml29623 ddi_prop_free(int_prop_val);
5826f45ec7bSml29623 }
5836f45ec7bSml29623 continue;
5846f45ec7bSml29623 }
5856f45ec7bSml29623
5866f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0,
5876f45ec7bSml29623 param_arr[i].fcode_name,
5886f45ec7bSml29623 (int **)&int_prop_val,
5896f45ec7bSml29623 &prop_len) == DDI_PROP_SUCCESS) {
5906f45ec7bSml29623 if ((*int_prop_val >= param_arr[i].minimum) &&
5916f45ec7bSml29623 (*int_prop_val <= param_arr[i].maximum))
5926f45ec7bSml29623 param_arr[i].value = *int_prop_val;
5936f45ec7bSml29623 #ifdef NXGE_DEBUG_ERROR
5946f45ec7bSml29623 else {
5956f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL,
5966f45ec7bSml29623 "nxge%d: 'prom' file parameter error\n",
5976f45ec7bSml29623 nxgep->instance));
5986f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL,
5996f45ec7bSml29623 "Parameter keyword '%s'"
6006f45ec7bSml29623 " is outside valid range\n",
6016f45ec7bSml29623 param_arr[i].name));
6026f45ec7bSml29623 }
6036f45ec7bSml29623 #endif
6046f45ec7bSml29623 ddi_prop_free(int_prop_val);
6056f45ec7bSml29623 }
6066f45ec7bSml29623
6076f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0,
6086f45ec7bSml29623 param_arr[i].name,
6096f45ec7bSml29623 (int **)&int_prop_val,
6106f45ec7bSml29623 &prop_len) == DDI_PROP_SUCCESS) {
6116f45ec7bSml29623 if ((*int_prop_val >= param_arr[i].minimum) &&
6126f45ec7bSml29623 (*int_prop_val <= param_arr[i].maximum))
6136f45ec7bSml29623 param_arr[i].value = *int_prop_val;
6146f45ec7bSml29623 #ifdef NXGE_DEBUG_ERROR
6156f45ec7bSml29623 else {
6166f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL,
6176f45ec7bSml29623 "nxge%d: 'conf' file parameter error\n",
6186f45ec7bSml29623 nxgep->instance));
6196f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL,
6206f45ec7bSml29623 "Parameter keyword '%s'"
6216f45ec7bSml29623 "is outside valid range\n",
6226f45ec7bSml29623 param_arr[i].name));
6236f45ec7bSml29623 }
6246f45ec7bSml29623 #endif
6256f45ec7bSml29623 ddi_prop_free(int_prop_val);
6266f45ec7bSml29623 }
6276f45ec7bSml29623 }
6286f45ec7bSml29623 }
6296f45ec7bSml29623
6306f45ec7bSml29623 static int
nxge_private_param_register(p_nxge_t nxgep,p_nxge_param_t param_arr)6316f45ec7bSml29623 nxge_private_param_register(p_nxge_t nxgep, p_nxge_param_t param_arr)
6326f45ec7bSml29623 {
6336f45ec7bSml29623 int status = B_TRUE;
6346f45ec7bSml29623 int channel;
6356f45ec7bSml29623 uint8_t grp;
6366f45ec7bSml29623 char *prop_name;
6376f45ec7bSml29623 char *end;
6386f45ec7bSml29623 uint32_t name_chars;
6396f45ec7bSml29623
6406f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL,
6416f45ec7bSml29623 "nxge_private_param_register %s", param_arr->name));
6426f45ec7bSml29623
6436f45ec7bSml29623 if ((param_arr->type & NXGE_PARAM_PRIV) != NXGE_PARAM_PRIV)
6446f45ec7bSml29623 return (B_TRUE);
6456f45ec7bSml29623
6466f45ec7bSml29623 prop_name = param_arr->name;
6476f45ec7bSml29623 if (param_arr->type & NXGE_PARAM_RXDMA) {
6486f45ec7bSml29623 if (strncmp("rxdma_intr", prop_name, 10) == 0)
6496f45ec7bSml29623 return (B_TRUE);
6506f45ec7bSml29623 name_chars = strlen("default_grp");
6516f45ec7bSml29623 if (strncmp("default_grp", prop_name, name_chars) == 0) {
6526f45ec7bSml29623 prop_name += name_chars;
6536f45ec7bSml29623 grp = mi_strtol(prop_name, &end, 10);
6546f45ec7bSml29623 /* now check if this rdcgrp is in config */
6556f45ec7bSml29623 return (nxge_check_rdcgrp_port_member(nxgep, grp));
6566f45ec7bSml29623 }
6576f45ec7bSml29623 name_chars = strlen(prop_name);
6586f45ec7bSml29623 if (strncmp("default_port_rdc", prop_name, name_chars) == 0) {
6596f45ec7bSml29623 return (B_TRUE);
6606f45ec7bSml29623 }
6616f45ec7bSml29623 return (B_FALSE);
6626f45ec7bSml29623 }
6636f45ec7bSml29623
6646f45ec7bSml29623 if (param_arr->type & NXGE_PARAM_TXDMA) {
6656f45ec7bSml29623 name_chars = strlen("txdma");
6666f45ec7bSml29623 if (strncmp("txdma", prop_name, name_chars) == 0) {
6676f45ec7bSml29623 prop_name += name_chars;
6686f45ec7bSml29623 channel = mi_strtol(prop_name, &end, 10);
6696f45ec7bSml29623 /* now check if this rdc is in config */
6706f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL,
6716f45ec7bSml29623 " nxge_private_param_register: %d",
6726f45ec7bSml29623 channel));
6736f45ec7bSml29623 return (nxge_check_txdma_port_member(nxgep, channel));
6746f45ec7bSml29623 }
6756f45ec7bSml29623 return (B_FALSE);
6766f45ec7bSml29623 }
6776f45ec7bSml29623
6786f45ec7bSml29623 status = B_FALSE;
6796f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL, "<== nxge_private_param_register"));
6806f45ec7bSml29623
6816f45ec7bSml29623 return (status);
6826f45ec7bSml29623 }
6836f45ec7bSml29623
6846f45ec7bSml29623 void
nxge_setup_param(p_nxge_t nxgep)6856f45ec7bSml29623 nxge_setup_param(p_nxge_t nxgep)
6866f45ec7bSml29623 {
6876f45ec7bSml29623 p_nxge_param_t param_arr;
6886f45ec7bSml29623 int i;
6896f45ec7bSml29623 pfi_t set_pfi;
6906f45ec7bSml29623
6916f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_setup_param"));
6926f45ec7bSml29623
6936f45ec7bSml29623 /*
6946f45ec7bSml29623 * Make sure the param_instance is set to a valid device instance.
6956f45ec7bSml29623 */
6966f45ec7bSml29623 if (nxge_param_arr[param_instance].value == 1000)
6976f45ec7bSml29623 nxge_param_arr[param_instance].value = nxgep->instance;
6986f45ec7bSml29623
6996f45ec7bSml29623 param_arr = nxgep->param_arr;
7006f45ec7bSml29623 param_arr[param_instance].value = nxgep->instance;
7016f45ec7bSml29623 param_arr[param_function_number].value = nxgep->function_num;
7026f45ec7bSml29623
7036f45ec7bSml29623 for (i = 0; i < nxgep->param_count; i++) {
7046f45ec7bSml29623 if ((param_arr[i].type & NXGE_PARAM_PRIV) &&
7056f45ec7bSml29623 (nxge_private_param_register(nxgep,
7066f45ec7bSml29623 ¶m_arr[i]) == B_FALSE)) {
7076f45ec7bSml29623 param_arr[i].setf = NULL;
7086f45ec7bSml29623 param_arr[i].getf = NULL;
7096f45ec7bSml29623 }
7106f45ec7bSml29623
7116f45ec7bSml29623 if (param_arr[i].type & NXGE_PARAM_CMPLX)
7126f45ec7bSml29623 param_arr[i].setf = NULL;
7136f45ec7bSml29623
7146f45ec7bSml29623 if (param_arr[i].type & NXGE_PARAM_DONT_SHOW) {
7156f45ec7bSml29623 param_arr[i].setf = NULL;
7166f45ec7bSml29623 param_arr[i].getf = NULL;
7176f45ec7bSml29623 }
7186f45ec7bSml29623
7196f45ec7bSml29623 set_pfi = (pfi_t)param_arr[i].setf;
7206f45ec7bSml29623
7216f45ec7bSml29623 if ((set_pfi) && (param_arr[i].type & NXGE_PARAM_INIT_ONLY)) {
7226f45ec7bSml29623 set_pfi = NULL;
7236f45ec7bSml29623 }
7246f45ec7bSml29623
7256f45ec7bSml29623 }
7266f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_setup_param"));
7276f45ec7bSml29623 }
7286f45ec7bSml29623
7296f45ec7bSml29623 void
nxge_init_param(p_nxge_t nxgep)7306f45ec7bSml29623 nxge_init_param(p_nxge_t nxgep)
7316f45ec7bSml29623 {
7326f45ec7bSml29623 p_nxge_param_t param_arr;
7336f45ec7bSml29623 int i, alloc_size;
7346f45ec7bSml29623 uint64_t alloc_count;
7356f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "==> nxge_init_param"));
7366f45ec7bSml29623 /*
7376f45ec7bSml29623 * Make sure the param_instance is set to a valid device instance.
7386f45ec7bSml29623 */
7396f45ec7bSml29623 if (nxge_param_arr[param_instance].value == 1000)
7406f45ec7bSml29623 nxge_param_arr[param_instance].value = nxgep->instance;
7416f45ec7bSml29623
7426f45ec7bSml29623 param_arr = nxgep->param_arr;
7436f45ec7bSml29623 if (param_arr == NULL) {
7446f45ec7bSml29623 param_arr = (p_nxge_param_t)
7456f45ec7bSml29623 KMEM_ZALLOC(sizeof (nxge_param_arr), KM_SLEEP);
7466f45ec7bSml29623 }
7476f45ec7bSml29623
7486f45ec7bSml29623 for (i = 0; i < sizeof (nxge_param_arr)/sizeof (nxge_param_t); i++) {
7496f45ec7bSml29623 param_arr[i] = nxge_param_arr[i];
7506f45ec7bSml29623 if ((param_arr[i].type & NXGE_PARAM_PROP_ARR32) ||
7516f45ec7bSml29623 (param_arr[i].type & NXGE_PARAM_PROP_ARR64)) {
7526f45ec7bSml29623 alloc_count = NXGE_PARAM_ARRAY_INIT_SIZE;
7536f45ec7bSml29623 alloc_size = alloc_count * sizeof (uint64_t);
7546f45ec7bSml29623 param_arr[i].value =
7556f45ec7bSml29623 (uint64_t)KMEM_ZALLOC(alloc_size, KM_SLEEP);
7566f45ec7bSml29623 param_arr[i].old_value =
7576f45ec7bSml29623 (uint64_t)KMEM_ZALLOC(alloc_size, KM_SLEEP);
7586f45ec7bSml29623 param_arr[i].type |=
7596f45ec7bSml29623 (alloc_count << NXGE_PARAM_ARRAY_ALLOC_SHIFT);
7606f45ec7bSml29623 }
7616f45ec7bSml29623 }
7626f45ec7bSml29623
7636f45ec7bSml29623 nxgep->param_arr = param_arr;
7646f45ec7bSml29623 nxgep->param_count = sizeof (nxge_param_arr)/sizeof (nxge_param_t);
7651bd6825cSml29623
7661bd6825cSml29623 nxge_param_sync(nxgep);
7671bd6825cSml29623
7686f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "<== nxge_init_param: count %d",
7696f45ec7bSml29623 nxgep->param_count));
7706f45ec7bSml29623 }
7716f45ec7bSml29623
7726f45ec7bSml29623 void
nxge_destroy_param(p_nxge_t nxgep)7736f45ec7bSml29623 nxge_destroy_param(p_nxge_t nxgep)
7746f45ec7bSml29623 {
7756f45ec7bSml29623 int i;
7766f45ec7bSml29623 uint64_t free_size, free_count;
7776f45ec7bSml29623
7786f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "==> nxge_destroy_param"));
7796f45ec7bSml29623
78059ac0c16Sdavemq if (nxgep->param_arr == NULL)
78159ac0c16Sdavemq return;
7826f45ec7bSml29623 /*
7836f45ec7bSml29623 * Make sure the param_instance is set to a valid device instance.
7846f45ec7bSml29623 */
7856f45ec7bSml29623 if (nxge_param_arr[param_instance].value == nxgep->instance) {
7866f45ec7bSml29623 for (i = 0; i <= nxge_param_arr[param_instance].maximum; i++) {
7876f45ec7bSml29623 if ((ddi_get_soft_state(nxge_list, i) != NULL) &&
7886f45ec7bSml29623 (i != nxgep->instance))
7896f45ec7bSml29623 break;
7906f45ec7bSml29623 }
7916f45ec7bSml29623 nxge_param_arr[param_instance].value = i;
7926f45ec7bSml29623 }
7936f45ec7bSml29623
7946f45ec7bSml29623 for (i = 0; i < nxgep->param_count; i++)
7956f45ec7bSml29623 if ((nxgep->param_arr[i].type & NXGE_PARAM_PROP_ARR32) ||
7966f45ec7bSml29623 (nxgep->param_arr[i].type & NXGE_PARAM_PROP_ARR64)) {
7976f45ec7bSml29623 free_count = ((nxgep->param_arr[i].type &
7986f45ec7bSml29623 NXGE_PARAM_ARRAY_ALLOC_MASK) >>
7996f45ec7bSml29623 NXGE_PARAM_ARRAY_ALLOC_SHIFT);
8006f45ec7bSml29623 free_count = NXGE_PARAM_ARRAY_INIT_SIZE;
8016f45ec7bSml29623 free_size = sizeof (uint64_t) * free_count;
8026f45ec7bSml29623 KMEM_FREE((void *)nxgep->param_arr[i].value, free_size);
8036f45ec7bSml29623 KMEM_FREE((void *)nxgep->param_arr[i].old_value,
8046f45ec7bSml29623 free_size);
8056f45ec7bSml29623 }
8066f45ec7bSml29623
8076f45ec7bSml29623 KMEM_FREE(nxgep->param_arr, sizeof (nxge_param_arr));
8086f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "<== nxge_destroy_param"));
8096f45ec7bSml29623 }
8106f45ec7bSml29623
8116f45ec7bSml29623 /*
8126f45ec7bSml29623 * Extracts the value from the 'nxge' parameter array and prints the
8136f45ec7bSml29623 * parameter value. cp points to the required parameter.
8146f45ec7bSml29623 */
8156f45ec7bSml29623
8166f45ec7bSml29623 /* ARGSUSED */
8176f45ec7bSml29623 int
nxge_param_get_generic(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)8186f45ec7bSml29623 nxge_param_get_generic(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
8196f45ec7bSml29623 {
8206f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
8216f45ec7bSml29623
8226f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
8236f45ec7bSml29623 "==> nxge_param_get_generic name %s ", pa->name));
8246f45ec7bSml29623
8256f45ec7bSml29623 if (pa->value > 0xffffffff)
8266f45ec7bSml29623 (void) mi_mpprintf(mp, "%x%x",
8276f45ec7bSml29623 (int)(pa->value >> 32), (int)(pa->value & 0xffffffff));
8286f45ec7bSml29623 else
8296f45ec7bSml29623 (void) mi_mpprintf(mp, "%x", (int)pa->value);
8306f45ec7bSml29623
8316f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_generic"));
8326f45ec7bSml29623 return (0);
8336f45ec7bSml29623 }
8346f45ec7bSml29623
8356f45ec7bSml29623 /* ARGSUSED */
8366f45ec7bSml29623 static int
nxge_param_get_mac(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)8376f45ec7bSml29623 nxge_param_get_mac(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
8386f45ec7bSml29623 {
8396f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
8406f45ec7bSml29623
8416f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_mac"));
8426f45ec7bSml29623
8436f45ec7bSml29623 (void) mi_mpprintf(mp, "%d", (uint32_t)pa->value);
8446f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_mac"));
8456f45ec7bSml29623 return (0);
8466f45ec7bSml29623 }
8476f45ec7bSml29623
8486f45ec7bSml29623 /* ARGSUSED */
84956d930aeSspeer static int
nxge_param_get_fw_ver(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)85056d930aeSspeer nxge_param_get_fw_ver(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
85156d930aeSspeer {
85256d930aeSspeer NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_fw_ver"));
85356d930aeSspeer
85456d930aeSspeer (void) mi_mpprintf(mp, "Firmware version for nxge%d: %s\n",
85556d930aeSspeer nxgep->instance, nxgep->vpd_info.ver);
85656d930aeSspeer
85756d930aeSspeer NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_fw_ver"));
85856d930aeSspeer return (0);
85956d930aeSspeer }
86056d930aeSspeer
86156d930aeSspeer /* ARGSUSED */
8622e59129aSraghus static int
nxge_param_get_port_mode(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)8632e59129aSraghus nxge_param_get_port_mode(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
8642e59129aSraghus {
8652e59129aSraghus NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_port_mode"));
8662e59129aSraghus
8672e59129aSraghus switch (nxgep->mac.portmode) {
8682e59129aSraghus case PORT_1G_COPPER:
8692d17280bSsbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: 1G Copper %s\n",
8702d17280bSsbehera nxgep->instance,
8712d17280bSsbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : "");
8722e59129aSraghus break;
8732e59129aSraghus case PORT_1G_FIBER:
8742d17280bSsbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: 1G Fiber %s\n",
8752d17280bSsbehera nxgep->instance,
8762d17280bSsbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : "");
8772e59129aSraghus break;
8782e59129aSraghus case PORT_10G_COPPER:
8792d17280bSsbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: 10G Copper "
8802d17280bSsbehera "%s\n", nxgep->instance,
8812d17280bSsbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : "");
8822e59129aSraghus break;
8832e59129aSraghus case PORT_10G_FIBER:
8842d17280bSsbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: 10G Fiber %s\n",
8852d17280bSsbehera nxgep->instance,
8862d17280bSsbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : "");
8872e59129aSraghus break;
8882e59129aSraghus case PORT_10G_SERDES:
8892d17280bSsbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: 10G Serdes "
8902d17280bSsbehera "%s\n", nxgep->instance,
8912d17280bSsbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : "");
8922e59129aSraghus break;
8932e59129aSraghus case PORT_1G_SERDES:
8942d17280bSsbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: 1G Serdes %s\n",
8952d17280bSsbehera nxgep->instance,
8962d17280bSsbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : "");
8972e59129aSraghus break;
8982e59129aSraghus case PORT_1G_RGMII_FIBER:
8992e59129aSraghus (void) mi_mpprintf(mp, "Port mode for nxge%d: 1G RGMII "
9002d17280bSsbehera "Fiber %s\n", nxgep->instance,
9012d17280bSsbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : "");
9022d17280bSsbehera break;
9032d17280bSsbehera case PORT_HSP_MODE:
9042d17280bSsbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: Hot Swappable "
9052d17280bSsbehera "PHY, Currently NOT present\n", nxgep->instance);
9062e59129aSraghus break;
90700161856Syc148097 case PORT_10G_TN1010:
90800161856Syc148097 (void) mi_mpprintf(mp, "Port mode for nxge%d:"
90900161856Syc148097 " 10G Copper with TN1010 %s\n", nxgep->instance,
91000161856Syc148097 nxgep->hot_swappable_phy ? "[Hot Swappable]" : "");
91100161856Syc148097 break;
91200161856Syc148097 case PORT_1G_TN1010:
91300161856Syc148097 (void) mi_mpprintf(mp, "Port mode for nxge%d:"
91400161856Syc148097 " 1G Copper with TN1010 %s\n", nxgep->instance,
91500161856Syc148097 nxgep->hot_swappable_phy ? "[Hot Swappable]" : "");
91600161856Syc148097 break;
9172e59129aSraghus default:
9182d17280bSsbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: Unknown %s\n",
9192d17280bSsbehera nxgep->instance,
9202d17280bSsbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : "");
9212e59129aSraghus break;
9222e59129aSraghus }
9232e59129aSraghus
9243d16f8e7Sml29623 (void) mi_mpprintf(mp, "Software LSO for nxge%d: %s\n",
9253d16f8e7Sml29623 nxgep->instance,
9263d16f8e7Sml29623 nxgep->soft_lso_enable ? "enable" : "disable");
9273d16f8e7Sml29623
9282e59129aSraghus NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_port_mode"));
9292e59129aSraghus return (0);
9302e59129aSraghus }
9312e59129aSraghus
9322e59129aSraghus /* ARGSUSED */
933c1f9c6e5SSantwona Behera static int
nxge_param_get_rx_intr_time(p_nxge_t nxgep,queue_t * q,mblk_t * mp,caddr_t cp)934c1f9c6e5SSantwona Behera nxge_param_get_rx_intr_time(p_nxge_t nxgep, queue_t *q, mblk_t *mp, caddr_t cp)
935c1f9c6e5SSantwona Behera {
936c1f9c6e5SSantwona Behera p_nxge_param_t pa = (p_nxge_param_t)cp;
937c1f9c6e5SSantwona Behera
938c1f9c6e5SSantwona Behera NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_rx_intr_time"));
939c1f9c6e5SSantwona Behera
940c1f9c6e5SSantwona Behera pa->value = (uint32_t)nxgep->intr_timeout;
941c1f9c6e5SSantwona Behera (void) mi_mpprintf(mp, "%d", (uint32_t)nxgep->intr_timeout);
942c1f9c6e5SSantwona Behera
943c1f9c6e5SSantwona Behera NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_rx_intr_time"));
944c1f9c6e5SSantwona Behera return (0);
945c1f9c6e5SSantwona Behera }
946c1f9c6e5SSantwona Behera
947c1f9c6e5SSantwona Behera /* ARGSUSED */
948c1f9c6e5SSantwona Behera static int
nxge_param_get_rx_intr_pkts(p_nxge_t nxgep,queue_t * q,mblk_t * mp,caddr_t cp)949c1f9c6e5SSantwona Behera nxge_param_get_rx_intr_pkts(p_nxge_t nxgep, queue_t *q, mblk_t *mp, caddr_t cp)
950c1f9c6e5SSantwona Behera {
951c1f9c6e5SSantwona Behera p_nxge_param_t pa = (p_nxge_param_t)cp;
952c1f9c6e5SSantwona Behera
953c1f9c6e5SSantwona Behera NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_rx_intr_pkts"));
954c1f9c6e5SSantwona Behera
955c1f9c6e5SSantwona Behera pa->value = (uint32_t)nxgep->intr_threshold;
956c1f9c6e5SSantwona Behera (void) mi_mpprintf(mp, "%d", (uint32_t)nxgep->intr_threshold);
957c1f9c6e5SSantwona Behera
958c1f9c6e5SSantwona Behera NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_rx_intr_pkts"));
959c1f9c6e5SSantwona Behera return (0);
960c1f9c6e5SSantwona Behera }
961c1f9c6e5SSantwona Behera
962c1f9c6e5SSantwona Behera /* ARGSUSED */
9636f45ec7bSml29623 int
nxge_param_get_txdma_info(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)9646f45ec7bSml29623 nxge_param_get_txdma_info(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
9656f45ec7bSml29623 {
9666f45ec7bSml29623
9676f45ec7bSml29623 uint_t print_len, buf_len;
9686f45ec7bSml29623 p_mblk_t np;
9696f45ec7bSml29623
9706f45ec7bSml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE;
971678453a8Sspeer int tdc;
972678453a8Sspeer
973678453a8Sspeer nxge_grp_set_t *set;
974678453a8Sspeer
9756f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_txdma_info"));
9766f45ec7bSml29623
9776f45ec7bSml29623 (void) mi_mpprintf(mp, "TXDMA Information for Port\t %d \n",
9786f45ec7bSml29623 nxgep->function_num);
9796f45ec7bSml29623
9806f45ec7bSml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) {
9816f45ec7bSml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer");
9826f45ec7bSml29623 return (0);
9836f45ec7bSml29623 }
9846f45ec7bSml29623
9856f45ec7bSml29623 buf_len = buff_alloc_size;
9866f45ec7bSml29623 mp->b_cont = np;
987678453a8Sspeer print_len = 0;
9886f45ec7bSml29623
9896f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
9906f45ec7bSml29623 "TDC\t HW TDC\t\n");
9916f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
9926f45ec7bSml29623 buf_len -= print_len;
993678453a8Sspeer
994678453a8Sspeer set = &nxgep->tx_set;
995da14cebeSEric Cheng for (tdc = 0; tdc < NXGE_MAX_TDCS; tdc++) {
996678453a8Sspeer if ((1 << tdc) & set->owned.map) {
9976f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr,
998678453a8Sspeer buf_len, "%d\n", tdc);
9996f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
10006f45ec7bSml29623 buf_len -= print_len;
10016f45ec7bSml29623 }
1002678453a8Sspeer }
10036f45ec7bSml29623
10046f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_txdma_info"));
10056f45ec7bSml29623 return (0);
10066f45ec7bSml29623 }
10076f45ec7bSml29623
10086f45ec7bSml29623 /* ARGSUSED */
10096f45ec7bSml29623 int
nxge_param_get_rxdma_info(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)10106f45ec7bSml29623 nxge_param_get_rxdma_info(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
10116f45ec7bSml29623 {
10126f45ec7bSml29623 uint_t print_len, buf_len;
10136f45ec7bSml29623 p_mblk_t np;
10146f45ec7bSml29623 int rdc;
10156f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
10166f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
10176f45ec7bSml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE;
10186f45ec7bSml29623 p_rx_rcr_rings_t rx_rcr_rings;
10196f45ec7bSml29623 p_rx_rcr_ring_t *rcr_rings;
10206f45ec7bSml29623 p_rx_rbr_rings_t rx_rbr_rings;
10216f45ec7bSml29623 p_rx_rbr_ring_t *rbr_rings;
1022678453a8Sspeer nxge_grp_set_t *set;
10236f45ec7bSml29623
10246f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_rxdma_info"));
10256f45ec7bSml29623
10266f45ec7bSml29623 (void) mi_mpprintf(mp, "RXDMA Information for Port\t %d \n",
10276f45ec7bSml29623 nxgep->function_num);
10286f45ec7bSml29623
10296f45ec7bSml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) {
10306f45ec7bSml29623 /* The following may work even if we cannot get a large buf. */
10316f45ec7bSml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer");
10326f45ec7bSml29623 return (0);
10336f45ec7bSml29623 }
10346f45ec7bSml29623
10356f45ec7bSml29623 buf_len = buff_alloc_size;
10366f45ec7bSml29623 mp->b_cont = np;
10376f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
10386f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
10396f45ec7bSml29623
10406f45ec7bSml29623 rx_rcr_rings = nxgep->rx_rcr_rings;
10416f45ec7bSml29623 rcr_rings = rx_rcr_rings->rcr_rings;
10426f45ec7bSml29623 rx_rbr_rings = nxgep->rx_rbr_rings;
10436f45ec7bSml29623 rbr_rings = rx_rbr_rings->rbr_rings;
10446f45ec7bSml29623
10456f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
10466f45ec7bSml29623 "Total RDCs\t %d\n", p_cfgp->max_rdcs);
10476f45ec7bSml29623
10486f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
10496f45ec7bSml29623 buf_len -= print_len;
10506f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
10516f45ec7bSml29623 "RDC\t HW RDC\t Timeout\t Packets RBR ptr \t"
10526f45ec7bSml29623 "chunks\t RCR ptr\n");
10536f45ec7bSml29623
10546f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
10556f45ec7bSml29623 buf_len -= print_len;
1056678453a8Sspeer
1057678453a8Sspeer set = &nxgep->rx_set;
1058678453a8Sspeer for (rdc = 0; rdc < NXGE_MAX_RDCS; rdc++) {
1059678453a8Sspeer if ((1 << rdc) & set->owned.map) {
1060678453a8Sspeer print_len = snprintf((char *)
1061678453a8Sspeer ((mblk_t *)np)->b_wptr, buf_len,
1062678453a8Sspeer " %d\t %x\t\t %x\t $%p\t 0x%x\t $%p\n",
1063678453a8Sspeer rdc,
10646f45ec7bSml29623 p_dma_cfgp->rcr_timeout[rdc],
10656f45ec7bSml29623 p_dma_cfgp->rcr_threshold[rdc],
10668793b36bSNick Todd (void *)rbr_rings[rdc],
10678793b36bSNick Todd rbr_rings[rdc]->num_blocks, (void *)rcr_rings[rdc]);
10686f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
10696f45ec7bSml29623 buf_len -= print_len;
10706f45ec7bSml29623 }
1071678453a8Sspeer }
10726f45ec7bSml29623
10736f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_rxdma_info"));
10746f45ec7bSml29623 return (0);
10756f45ec7bSml29623 }
10766f45ec7bSml29623
10776f45ec7bSml29623 /* ARGSUSED */
10786f45ec7bSml29623 int
nxge_param_get_rxdma_rdcgrp_info(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)10796f45ec7bSml29623 nxge_param_get_rxdma_rdcgrp_info(p_nxge_t nxgep, queue_t *q,
10806f45ec7bSml29623 p_mblk_t mp, caddr_t cp)
10816f45ec7bSml29623 {
10826f45ec7bSml29623 uint_t print_len, buf_len;
10836f45ec7bSml29623 p_mblk_t np;
10846f45ec7bSml29623 int offset, rdc, i, rdc_grp;
10856f45ec7bSml29623 p_nxge_rdc_grp_t rdc_grp_p;
10866f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
10876f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
10886f45ec7bSml29623
10896f45ec7bSml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE;
10906f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
10916f45ec7bSml29623 "==> nxge_param_get_rxdma_rdcgrp_info"));
10926f45ec7bSml29623
10936f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
10946f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
10956f45ec7bSml29623
10966f45ec7bSml29623 (void) mi_mpprintf(mp, "RXDMA RDC Group Information for Port\t %d \n",
10976f45ec7bSml29623 nxgep->function_num);
10986f45ec7bSml29623
1099678453a8Sspeer rdc_grp = p_cfgp->def_mac_rxdma_grpid;
11006f45ec7bSml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) {
11016f45ec7bSml29623 /* The following may work even if we cannot get a large buf. */
11026f45ec7bSml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer");
11036f45ec7bSml29623 return (0);
11046f45ec7bSml29623 }
11056f45ec7bSml29623
11066f45ec7bSml29623 buf_len = buff_alloc_size;
11076f45ec7bSml29623 mp->b_cont = np;
11086f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
11096f45ec7bSml29623 "Total RDC Groups\t %d \n"
1110678453a8Sspeer "default RDC group\t %d\n",
11116f45ec7bSml29623 p_cfgp->max_rdc_grpids,
1112678453a8Sspeer p_cfgp->def_mac_rxdma_grpid);
11136f45ec7bSml29623
11146f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
11156f45ec7bSml29623 buf_len -= print_len;
11166f45ec7bSml29623
11177b26d9ffSSantwona Behera for (i = 0; i < NXGE_MAX_RDC_GROUPS; i++) {
1118678453a8Sspeer if (p_cfgp->grpids[i]) {
11196f45ec7bSml29623 rdc_grp_p = &p_dma_cfgp->rdc_grps[i];
1120678453a8Sspeer print_len = snprintf((char *)((mblk_t *)np)->b_wptr,
1121678453a8Sspeer buf_len,
11226f45ec7bSml29623 "\nRDC Group Info for Group [%d] %d\n"
11236f45ec7bSml29623 "RDC Count %d\tstart RDC %d\n"
11246f45ec7bSml29623 "RDC Group Population Information"
11256f45ec7bSml29623 " (offsets 0 - 15)\n",
11266f45ec7bSml29623 i, rdc_grp, rdc_grp_p->max_rdcs,
11276f45ec7bSml29623 rdc_grp_p->start_rdc);
11286f45ec7bSml29623
11296f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
11306f45ec7bSml29623 buf_len -= print_len;
11316f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr,
11326f45ec7bSml29623 buf_len, "\n");
11336f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
11346f45ec7bSml29623 buf_len -= print_len;
11356f45ec7bSml29623
11366f45ec7bSml29623 for (rdc = 0; rdc < rdc_grp_p->max_rdcs; rdc++) {
1137678453a8Sspeer print_len = snprintf(
1138678453a8Sspeer (char *)((mblk_t *)np)->b_wptr,
11396f45ec7bSml29623 buf_len, "[%d]=%d ", rdc,
11406f45ec7bSml29623 rdc_grp_p->start_rdc + rdc);
11416f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
11426f45ec7bSml29623 buf_len -= print_len;
11436f45ec7bSml29623 }
11446f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr,
11456f45ec7bSml29623 buf_len, "\n");
11466f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
11476f45ec7bSml29623 buf_len -= print_len;
11486f45ec7bSml29623
11496f45ec7bSml29623 for (offset = 0; offset < 16; offset++) {
1150678453a8Sspeer print_len = snprintf(
1151678453a8Sspeer (char *)((mblk_t *)np)->b_wptr,
1152678453a8Sspeer buf_len, " %c",
1153678453a8Sspeer rdc_grp_p->map & (1 << offset) ?
1154678453a8Sspeer '1' : '0');
11556f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
11566f45ec7bSml29623 buf_len -= print_len;
11576f45ec7bSml29623 }
11586f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr,
11596f45ec7bSml29623 buf_len, "\n");
11606f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
11616f45ec7bSml29623 buf_len -= print_len;
11626f45ec7bSml29623 }
1163678453a8Sspeer }
11646f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
11656f45ec7bSml29623 "<== nxge_param_get_rxdma_rdcgrp_info"));
11666f45ec7bSml29623 return (0);
11676f45ec7bSml29623 }
11686f45ec7bSml29623
11696f45ec7bSml29623 int
nxge_mk_mblk_tail_space(p_mblk_t mp,p_mblk_t * nmp,size_t size)11706f45ec7bSml29623 nxge_mk_mblk_tail_space(p_mblk_t mp, p_mblk_t *nmp, size_t size)
11716f45ec7bSml29623 {
11726f45ec7bSml29623 p_mblk_t tmp;
11736f45ec7bSml29623
11746f45ec7bSml29623 tmp = mp;
11756f45ec7bSml29623 while (tmp->b_cont)
11766f45ec7bSml29623 tmp = tmp->b_cont;
11776f45ec7bSml29623 if ((tmp->b_wptr + size) >= tmp->b_datap->db_lim) {
11786f45ec7bSml29623 tmp->b_cont = allocb(1024, BPRI_HI);
11796f45ec7bSml29623 tmp = tmp->b_cont;
11806f45ec7bSml29623 if (!tmp)
11816f45ec7bSml29623 return (ENOMEM);
11826f45ec7bSml29623 }
11836f45ec7bSml29623
11846f45ec7bSml29623 *nmp = tmp;
11856f45ec7bSml29623 return (0);
11866f45ec7bSml29623 }
11876f45ec7bSml29623
11886f45ec7bSml29623
11896f45ec7bSml29623 /* ARGSUSED */
11906f45ec7bSml29623 int
nxge_param_set_generic(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)11916f45ec7bSml29623 nxge_param_set_generic(p_nxge_t nxgep, queue_t *q, mblk_t *mp,
11926f45ec7bSml29623 char *value, caddr_t cp)
11936f45ec7bSml29623 {
11946f45ec7bSml29623 char *end;
11956f45ec7bSml29623 uint32_t new_value;
11966f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
11976f45ec7bSml29623
11986f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, " ==> nxge_param_set_generic"));
11996f45ec7bSml29623 new_value = (uint32_t)mi_strtol(value, &end, 10);
12006f45ec7bSml29623 if (end == value || new_value < pa->minimum ||
12016f45ec7bSml29623 new_value > pa->maximum) {
12026f45ec7bSml29623 return (EINVAL);
12036f45ec7bSml29623 }
12046f45ec7bSml29623 pa->value = new_value;
12056f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, " <== nxge_param_set_generic"));
12066f45ec7bSml29623 return (0);
12076f45ec7bSml29623 }
12086f45ec7bSml29623
12096f45ec7bSml29623
12106f45ec7bSml29623 /* ARGSUSED */
12116f45ec7bSml29623 int
nxge_param_set_instance(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)12126f45ec7bSml29623 nxge_param_set_instance(p_nxge_t nxgep, queue_t *q, mblk_t *mp,
12136f45ec7bSml29623 char *value, caddr_t cp)
12146f45ec7bSml29623 {
12156f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " ==> nxge_param_set_instance"));
12166f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_set_instance"));
12176f45ec7bSml29623 return (0);
12186f45ec7bSml29623 }
12196f45ec7bSml29623
12206f45ec7bSml29623
12216f45ec7bSml29623 /* ARGSUSED */
12226f45ec7bSml29623 int
nxge_param_set_mac(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)12236f45ec7bSml29623 nxge_param_set_mac(p_nxge_t nxgep, queue_t *q, mblk_t *mp,
12246f45ec7bSml29623 char *value, caddr_t cp)
12256f45ec7bSml29623 {
12266f45ec7bSml29623 char *end;
12276f45ec7bSml29623 uint32_t new_value;
12286f45ec7bSml29623 int status = 0;
12296f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
12306f45ec7bSml29623
12316f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_mac"));
12326f45ec7bSml29623 new_value = (uint32_t)mi_strtol(value, &end, BASE_DECIMAL);
12336f45ec7bSml29623 if (PARAM_OUTOF_RANGE(value, end, new_value, pa)) {
12346f45ec7bSml29623 return (EINVAL);
12356f45ec7bSml29623 }
12366f45ec7bSml29623
12376f45ec7bSml29623 if (pa->value != new_value) {
12386f45ec7bSml29623 pa->old_value = pa->value;
12396f45ec7bSml29623 pa->value = new_value;
12406f45ec7bSml29623 }
12416f45ec7bSml29623
12426f45ec7bSml29623 if (!nxge_param_link_update(nxgep)) {
12436f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
12446f45ec7bSml29623 " false ret from nxge_param_link_update"));
12456f45ec7bSml29623 status = EINVAL;
12466f45ec7bSml29623 }
12476f45ec7bSml29623
12486f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_mac"));
12496f45ec7bSml29623 return (status);
12506f45ec7bSml29623 }
12516f45ec7bSml29623
12526f45ec7bSml29623 /* ARGSUSED */
12531bd6825cSml29623 int
nxge_param_rx_intr_pkts(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)12546f45ec7bSml29623 nxge_param_rx_intr_pkts(p_nxge_t nxgep, queue_t *q, mblk_t *mp,
12556f45ec7bSml29623 char *value, caddr_t cp)
12566f45ec7bSml29623 {
12576f45ec7bSml29623 char *end;
12586f45ec7bSml29623 uint32_t cfg_value;
12596f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
12606f45ec7bSml29623
12616f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_rx_intr_pkts"));
12626f45ec7bSml29623
12636f45ec7bSml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY);
12646f45ec7bSml29623
12656f45ec7bSml29623 if ((cfg_value > NXGE_RDC_RCR_THRESHOLD_MAX) ||
12666f45ec7bSml29623 (cfg_value < NXGE_RDC_RCR_THRESHOLD_MIN)) {
12676f45ec7bSml29623 return (EINVAL);
12686f45ec7bSml29623 }
12696f45ec7bSml29623
12706f45ec7bSml29623 if ((pa->value != cfg_value)) {
12716f45ec7bSml29623 pa->old_value = pa->value;
12726f45ec7bSml29623 pa->value = cfg_value;
12736f45ec7bSml29623 nxgep->intr_threshold = pa->value;
12746f45ec7bSml29623 }
12756f45ec7bSml29623
12766f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_rx_intr_pkts"));
12776f45ec7bSml29623 return (0);
12786f45ec7bSml29623 }
12796f45ec7bSml29623
12806f45ec7bSml29623 /* ARGSUSED */
12811bd6825cSml29623 int
nxge_param_rx_intr_time(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)12826f45ec7bSml29623 nxge_param_rx_intr_time(p_nxge_t nxgep, queue_t *q, mblk_t *mp,
12836f45ec7bSml29623 char *value, caddr_t cp)
12846f45ec7bSml29623 {
12856f45ec7bSml29623 char *end;
12866f45ec7bSml29623 uint32_t cfg_value;
12876f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
12886f45ec7bSml29623
12896f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_rx_intr_time"));
12906f45ec7bSml29623
12916f45ec7bSml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY);
12926f45ec7bSml29623
12936f45ec7bSml29623 if ((cfg_value > NXGE_RDC_RCR_TIMEOUT_MAX) ||
12946f45ec7bSml29623 (cfg_value < NXGE_RDC_RCR_TIMEOUT_MIN)) {
12956f45ec7bSml29623 return (EINVAL);
12966f45ec7bSml29623 }
12976f45ec7bSml29623
12986f45ec7bSml29623 if ((pa->value != cfg_value)) {
12996f45ec7bSml29623 pa->old_value = pa->value;
13006f45ec7bSml29623 pa->value = cfg_value;
13016f45ec7bSml29623 nxgep->intr_timeout = pa->value;
13026f45ec7bSml29623 }
13036f45ec7bSml29623
13046f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_rx_intr_time"));
13056f45ec7bSml29623 return (0);
13066f45ec7bSml29623 }
13076f45ec7bSml29623
13086f45ec7bSml29623 /* ARGSUSED */
13096f45ec7bSml29623 static int
nxge_param_set_mac_rdcgrp(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)13106f45ec7bSml29623 nxge_param_set_mac_rdcgrp(p_nxge_t nxgep, queue_t *q,
13116f45ec7bSml29623 mblk_t *mp, char *value, caddr_t cp)
13126f45ec7bSml29623 {
13136f45ec7bSml29623 char *end;
13146f45ec7bSml29623 uint32_t status = 0, cfg_value;
13156f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
13166f45ec7bSml29623 uint32_t cfg_it = B_FALSE;
13176f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
13186f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
13196f45ec7bSml29623 uint32_t *val_ptr, *old_val_ptr;
13206f45ec7bSml29623 nxge_param_map_t *mac_map;
13216f45ec7bSml29623 p_nxge_class_pt_cfg_t p_class_cfgp;
13226f45ec7bSml29623 nxge_mv_cfg_t *mac_host_info;
13236f45ec7bSml29623
13246f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_mac_rdcgrp "));
13256f45ec7bSml29623
13266f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
13276f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
13286f45ec7bSml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config;
13296f45ec7bSml29623 mac_host_info = (nxge_mv_cfg_t *)&p_class_cfgp->mac_host_info[0];
13306f45ec7bSml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX);
13316f45ec7bSml29623
13326f45ec7bSml29623 /*
13336f45ec7bSml29623 * now do decoding
13346f45ec7bSml29623 */
13356f45ec7bSml29623 mac_map = (nxge_param_map_t *)&cfg_value;
13366f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " cfg_value %x id %x map_to %x",
13376f45ec7bSml29623 cfg_value, mac_map->param_id, mac_map->map_to));
13386f45ec7bSml29623
13396f45ec7bSml29623 if ((mac_map->param_id < p_cfgp->max_macs) &&
1340678453a8Sspeer p_cfgp->grpids[mac_map->map_to]) {
13416f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
13426f45ec7bSml29623 " nxge_param_set_mac_rdcgrp mapping"
13436f45ec7bSml29623 " id %d grp %d", mac_map->param_id, mac_map->map_to));
13446f45ec7bSml29623 val_ptr = (uint32_t *)pa->value;
13456f45ec7bSml29623 old_val_ptr = (uint32_t *)pa->old_value;
13466f45ec7bSml29623 if (val_ptr[mac_map->param_id] != cfg_value) {
13476f45ec7bSml29623 old_val_ptr[mac_map->param_id] =
13486f45ec7bSml29623 val_ptr[mac_map->param_id];
13496f45ec7bSml29623 val_ptr[mac_map->param_id] = cfg_value;
13506f45ec7bSml29623 mac_host_info[mac_map->param_id].mpr_npr =
13516f45ec7bSml29623 mac_map->pref;
13526f45ec7bSml29623 mac_host_info[mac_map->param_id].flag = 1;
13536f45ec7bSml29623 mac_host_info[mac_map->param_id].rdctbl =
13546f45ec7bSml29623 mac_map->map_to;
13556f45ec7bSml29623 cfg_it = B_TRUE;
13566f45ec7bSml29623 }
13576f45ec7bSml29623 } else {
13586f45ec7bSml29623 return (EINVAL);
13596f45ec7bSml29623 }
13606f45ec7bSml29623
13616f45ec7bSml29623 if (cfg_it == B_TRUE) {
13626f45ec7bSml29623 status = nxge_logical_mac_assign_rdc_table(nxgep,
13636f45ec7bSml29623 (uint8_t)mac_map->param_id);
13646f45ec7bSml29623 if (status != NXGE_OK)
13656f45ec7bSml29623 return (EINVAL);
13666f45ec7bSml29623 }
13676f45ec7bSml29623
13686f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_mac_rdcgrp"));
13696f45ec7bSml29623 return (0);
13706f45ec7bSml29623 }
13716f45ec7bSml29623
13726f45ec7bSml29623 /* ARGSUSED */
13736f45ec7bSml29623 static int
nxge_param_set_vlan_rdcgrp(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)13746f45ec7bSml29623 nxge_param_set_vlan_rdcgrp(p_nxge_t nxgep, queue_t *q,
13756f45ec7bSml29623 mblk_t *mp, char *value, caddr_t cp)
13766f45ec7bSml29623 {
13776f45ec7bSml29623 char *end;
13786f45ec7bSml29623 uint32_t status = 0, cfg_value;
13796f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
13806f45ec7bSml29623 uint32_t cfg_it = B_FALSE;
13816f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
13826f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
13836f45ec7bSml29623 uint32_t *val_ptr, *old_val_ptr;
13846f45ec7bSml29623 nxge_param_map_t *vmap, *old_map;
13856f45ec7bSml29623 p_nxge_class_pt_cfg_t p_class_cfgp;
13866f45ec7bSml29623 uint64_t cfgd_vlans;
13876f45ec7bSml29623 int i, inc = 0, cfg_position;
13886f45ec7bSml29623 nxge_mv_cfg_t *vlan_tbl;
13896f45ec7bSml29623
13906f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_vlan_rdcgrp "));
13916f45ec7bSml29623
13926f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
13936f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
13946f45ec7bSml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config;
13956f45ec7bSml29623 vlan_tbl = (nxge_mv_cfg_t *)&p_class_cfgp->vlan_tbl[0];
13966f45ec7bSml29623
13976f45ec7bSml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX);
13986f45ec7bSml29623
13996f45ec7bSml29623 /* now do decoding */
14006f45ec7bSml29623 cfgd_vlans = ((pa->type & NXGE_PARAM_ARRAY_CNT_MASK) >>
14016f45ec7bSml29623 NXGE_PARAM_ARRAY_CNT_SHIFT);
14026f45ec7bSml29623
14036f45ec7bSml29623 if (cfgd_vlans == NXGE_PARAM_ARRAY_INIT_SIZE) {
14046f45ec7bSml29623 /*
14056f45ec7bSml29623 * for now, we process only upto max
14066f45ec7bSml29623 * NXGE_PARAM_ARRAY_INIT_SIZE parameters
14076f45ec7bSml29623 * In the future, we may want to expand
14086f45ec7bSml29623 * the storage array and continue
14096f45ec7bSml29623 */
14106f45ec7bSml29623 return (EINVAL);
14116f45ec7bSml29623 }
14126f45ec7bSml29623
14136f45ec7bSml29623 vmap = (nxge_param_map_t *)&cfg_value;
14146f45ec7bSml29623 if ((vmap->param_id) &&
14156f45ec7bSml29623 (vmap->param_id < NXGE_MAX_VLANS) &&
14166f45ec7bSml29623 (vmap->map_to < p_cfgp->max_rdc_grpids)) {
14176f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
14186f45ec7bSml29623 "nxge_param_set_vlan_rdcgrp mapping"
14196f45ec7bSml29623 " id %d grp %d",
14206f45ec7bSml29623 vmap->param_id, vmap->map_to));
14216f45ec7bSml29623 val_ptr = (uint32_t *)pa->value;
14226f45ec7bSml29623 old_val_ptr = (uint32_t *)pa->old_value;
14236f45ec7bSml29623
14246f45ec7bSml29623 /* search to see if this vlan id is already configured */
14256f45ec7bSml29623 for (i = 0; i < cfgd_vlans; i++) {
14266f45ec7bSml29623 old_map = (nxge_param_map_t *)&val_ptr[i];
14276f45ec7bSml29623 if ((old_map->param_id == 0) ||
14286f45ec7bSml29623 (vmap->param_id == old_map->param_id) ||
14296f45ec7bSml29623 (vlan_tbl[vmap->param_id].flag)) {
14306f45ec7bSml29623 cfg_position = i;
14316f45ec7bSml29623 break;
14326f45ec7bSml29623 }
14336f45ec7bSml29623 }
14346f45ec7bSml29623
14356f45ec7bSml29623 if (cfgd_vlans == 0) {
14366f45ec7bSml29623 cfg_position = 0;
14376f45ec7bSml29623 inc++;
14386f45ec7bSml29623 }
14396f45ec7bSml29623
14406f45ec7bSml29623 if (i == cfgd_vlans) {
14416f45ec7bSml29623 cfg_position = i;
14426f45ec7bSml29623 inc++;
14436f45ec7bSml29623 }
14446f45ec7bSml29623
14456f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL,
14466f45ec7bSml29623 "set_vlan_rdcgrp mapping"
14476f45ec7bSml29623 " i %d cfgd_vlans %llx position %d ",
14486f45ec7bSml29623 i, cfgd_vlans, cfg_position));
14496f45ec7bSml29623 if (val_ptr[cfg_position] != cfg_value) {
14506f45ec7bSml29623 old_val_ptr[cfg_position] = val_ptr[cfg_position];
14516f45ec7bSml29623 val_ptr[cfg_position] = cfg_value;
14526f45ec7bSml29623 vlan_tbl[vmap->param_id].mpr_npr = vmap->pref;
14536f45ec7bSml29623 vlan_tbl[vmap->param_id].flag = 1;
14546f45ec7bSml29623 vlan_tbl[vmap->param_id].rdctbl =
1455678453a8Sspeer vmap->map_to + p_cfgp->def_mac_rxdma_grpid;
14566f45ec7bSml29623 cfg_it = B_TRUE;
14576f45ec7bSml29623 if (inc) {
14586f45ec7bSml29623 cfgd_vlans++;
14596f45ec7bSml29623 pa->type &= ~NXGE_PARAM_ARRAY_CNT_MASK;
14606f45ec7bSml29623 pa->type |= (cfgd_vlans <<
14616f45ec7bSml29623 NXGE_PARAM_ARRAY_CNT_SHIFT);
14626f45ec7bSml29623
14636f45ec7bSml29623 }
14646f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL,
14656f45ec7bSml29623 "after: param_set_vlan_rdcgrp "
14666f45ec7bSml29623 " cfg_vlans %llx position %d \n",
14676f45ec7bSml29623 cfgd_vlans, cfg_position));
14686f45ec7bSml29623 }
14696f45ec7bSml29623 } else {
14706f45ec7bSml29623 return (EINVAL);
14716f45ec7bSml29623 }
14726f45ec7bSml29623
14736f45ec7bSml29623 if (cfg_it == B_TRUE) {
14746f45ec7bSml29623 status = nxge_fflp_config_vlan_table(nxgep,
14756f45ec7bSml29623 (uint16_t)vmap->param_id);
14766f45ec7bSml29623 if (status != NXGE_OK)
14776f45ec7bSml29623 return (EINVAL);
14786f45ec7bSml29623 }
14796f45ec7bSml29623
14806f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_vlan_rdcgrp"));
14816f45ec7bSml29623 return (0);
14826f45ec7bSml29623 }
14836f45ec7bSml29623
14846f45ec7bSml29623 /* ARGSUSED */
14856f45ec7bSml29623 static int
nxge_param_get_vlan_rdcgrp(p_nxge_t nxgep,queue_t * q,mblk_t * mp,caddr_t cp)14866f45ec7bSml29623 nxge_param_get_vlan_rdcgrp(p_nxge_t nxgep, queue_t *q,
14876f45ec7bSml29623 mblk_t *mp, caddr_t cp)
14886f45ec7bSml29623 {
14896f45ec7bSml29623
14906f45ec7bSml29623 uint_t print_len, buf_len;
14916f45ec7bSml29623 p_mblk_t np;
14926f45ec7bSml29623 int i;
14936f45ec7bSml29623 uint32_t *val_ptr;
14946f45ec7bSml29623 nxge_param_map_t *vmap;
14956f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
14966f45ec7bSml29623 p_nxge_class_pt_cfg_t p_class_cfgp;
14976f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
14986f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
14996f45ec7bSml29623 uint64_t cfgd_vlans = 0;
15006f45ec7bSml29623 nxge_mv_cfg_t *vlan_tbl;
15016f45ec7bSml29623 int buff_alloc_size =
15026f45ec7bSml29623 NXGE_NDD_INFODUMP_BUFF_SIZE * 32;
15036f45ec7bSml29623
15046f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_vlan_rdcgrp "));
15056f45ec7bSml29623 (void) mi_mpprintf(mp, "VLAN RDC Mapping Information for Port\t %d \n",
15066f45ec7bSml29623 nxgep->function_num);
15076f45ec7bSml29623
15086f45ec7bSml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) {
15096f45ec7bSml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer");
15106f45ec7bSml29623 return (0);
15116f45ec7bSml29623 }
15126f45ec7bSml29623
15136f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
15146f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
15156f45ec7bSml29623
15166f45ec7bSml29623 buf_len = buff_alloc_size;
15176f45ec7bSml29623 mp->b_cont = np;
15186f45ec7bSml29623 cfgd_vlans = (pa->type & NXGE_PARAM_ARRAY_CNT_MASK) >>
15196f45ec7bSml29623 NXGE_PARAM_ARRAY_CNT_SHIFT;
15206f45ec7bSml29623
15216f45ec7bSml29623 i = (int)cfgd_vlans;
15226f45ec7bSml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config;
15236f45ec7bSml29623 vlan_tbl = (nxge_mv_cfg_t *)&p_class_cfgp->vlan_tbl[0];
15246f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
15256f45ec7bSml29623 "Configured VLANs %d\n"
15266f45ec7bSml29623 "VLAN ID\t RDC GRP (Actual/Port)\t"
15276f45ec7bSml29623 " Prefernce\n", i);
15286f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
15296f45ec7bSml29623 buf_len -= print_len;
15306f45ec7bSml29623 val_ptr = (uint32_t *)pa->value;
15316f45ec7bSml29623
15326f45ec7bSml29623 for (i = 0; i < cfgd_vlans; i++) {
15336f45ec7bSml29623 vmap = (nxge_param_map_t *)&val_ptr[i];
15346f45ec7bSml29623 if (p_class_cfgp->vlan_tbl[vmap->param_id].flag) {
15356f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr,
15366f45ec7bSml29623 buf_len,
15376f45ec7bSml29623 " %d\t\t %d/%d\t\t %d\n",
15386f45ec7bSml29623 vmap->param_id,
15396f45ec7bSml29623 vlan_tbl[vmap->param_id].rdctbl,
15406f45ec7bSml29623 vlan_tbl[vmap->param_id].rdctbl -
1541678453a8Sspeer p_cfgp->def_mac_rxdma_grpid,
15426f45ec7bSml29623 vlan_tbl[vmap->param_id].mpr_npr);
15436f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
15446f45ec7bSml29623 buf_len -= print_len;
15456f45ec7bSml29623 }
15466f45ec7bSml29623 }
15476f45ec7bSml29623
15486f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_vlan_rdcgrp"));
15496f45ec7bSml29623 return (0);
15506f45ec7bSml29623 }
15516f45ec7bSml29623
15526f45ec7bSml29623 /* ARGSUSED */
15536f45ec7bSml29623 static int
nxge_param_get_mac_rdcgrp(p_nxge_t nxgep,queue_t * q,mblk_t * mp,caddr_t cp)15546f45ec7bSml29623 nxge_param_get_mac_rdcgrp(p_nxge_t nxgep, queue_t *q,
15556f45ec7bSml29623 mblk_t *mp, caddr_t cp)
15566f45ec7bSml29623 {
15576f45ec7bSml29623 uint_t print_len, buf_len;
15586f45ec7bSml29623 p_mblk_t np;
15596f45ec7bSml29623 int i;
15606f45ec7bSml29623 p_nxge_class_pt_cfg_t p_class_cfgp;
15616f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
15626f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
15636f45ec7bSml29623 nxge_mv_cfg_t *mac_host_info;
15646f45ec7bSml29623
15656f45ec7bSml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE * 32;
15666f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_mac_rdcgrp "));
15676f45ec7bSml29623 (void) mi_mpprintf(mp,
15686f45ec7bSml29623 "MAC ADDR RDC Mapping Information for Port\t %d\n",
15696f45ec7bSml29623 nxgep->function_num);
15706f45ec7bSml29623
15716f45ec7bSml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) {
15726f45ec7bSml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer");
15736f45ec7bSml29623 return (0);
15746f45ec7bSml29623 }
15756f45ec7bSml29623
15766f45ec7bSml29623 buf_len = buff_alloc_size;
15776f45ec7bSml29623 mp->b_cont = np;
15786f45ec7bSml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config;
15796f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
15806f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
15816f45ec7bSml29623 mac_host_info = (nxge_mv_cfg_t *)&p_class_cfgp->mac_host_info[0];
15826f45ec7bSml29623 print_len = snprintf((char *)np->b_wptr, buf_len,
15836f45ec7bSml29623 "MAC ID\t RDC GRP (Actual/Port)\t"
15846f45ec7bSml29623 " Prefernce\n");
15856f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
15866f45ec7bSml29623 buf_len -= print_len;
15876f45ec7bSml29623 for (i = 0; i < p_cfgp->max_macs; i++) {
15886f45ec7bSml29623 if (mac_host_info[i].flag) {
15896f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr,
15906f45ec7bSml29623 buf_len,
15916f45ec7bSml29623 " %d\t %d/%d\t\t %d\n",
15926f45ec7bSml29623 i, mac_host_info[i].rdctbl,
15936f45ec7bSml29623 mac_host_info[i].rdctbl -
1594678453a8Sspeer p_cfgp->def_mac_rxdma_grpid,
15956f45ec7bSml29623 mac_host_info[i].mpr_npr);
15966f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
15976f45ec7bSml29623 buf_len -= print_len;
15986f45ec7bSml29623 }
15996f45ec7bSml29623 }
16006f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
16016f45ec7bSml29623 "Done Info Dumping \n");
16026f45ec7bSml29623 ((mblk_t *)np)->b_wptr += print_len;
16036f45ec7bSml29623 buf_len -= print_len;
16046f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_macrdcgrp"));
16056f45ec7bSml29623 return (0);
16066f45ec7bSml29623 }
16076f45ec7bSml29623
16086f45ec7bSml29623 /* ARGSUSED */
16096f45ec7bSml29623 static int
nxge_param_tcam_enable(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)16106f45ec7bSml29623 nxge_param_tcam_enable(p_nxge_t nxgep, queue_t *q,
16116f45ec7bSml29623 mblk_t *mp, char *value, caddr_t cp)
16126f45ec7bSml29623 {
16136f45ec7bSml29623 uint32_t status = 0, cfg_value;
16146f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
16156f45ec7bSml29623 uint32_t cfg_it = B_FALSE;
16166f45ec7bSml29623 char *end;
16176f45ec7bSml29623
16186f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_tcam_enable"));
16196f45ec7bSml29623
16206f45ec7bSml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_BINARY);
16216f45ec7bSml29623 if (pa->value != cfg_value) {
16226f45ec7bSml29623 pa->old_value = pa->value;
16236f45ec7bSml29623 pa->value = cfg_value;
16246f45ec7bSml29623 cfg_it = B_TRUE;
16256f45ec7bSml29623 }
16266f45ec7bSml29623
16276f45ec7bSml29623 if (cfg_it == B_TRUE) {
16286f45ec7bSml29623 if (pa->value)
16296f45ec7bSml29623 status = nxge_fflp_config_tcam_enable(nxgep);
16306f45ec7bSml29623 else
16316f45ec7bSml29623 status = nxge_fflp_config_tcam_disable(nxgep);
16326f45ec7bSml29623 if (status != NXGE_OK)
16336f45ec7bSml29623 return (EINVAL);
16346f45ec7bSml29623 }
16356f45ec7bSml29623
16366f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_tcam_enable"));
16376f45ec7bSml29623 return (0);
16386f45ec7bSml29623 }
16396f45ec7bSml29623
16406f45ec7bSml29623 /* ARGSUSED */
16416f45ec7bSml29623 static int
nxge_param_hash_lookup_enable(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)16426f45ec7bSml29623 nxge_param_hash_lookup_enable(p_nxge_t nxgep, queue_t *q,
16436f45ec7bSml29623 mblk_t *mp, char *value, caddr_t cp)
16446f45ec7bSml29623 {
16456f45ec7bSml29623 uint32_t status = 0, cfg_value;
16466f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
16476f45ec7bSml29623 uint32_t cfg_it = B_FALSE;
16486f45ec7bSml29623 char *end;
16496f45ec7bSml29623
16506f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_hash_lookup_enable"));
16516f45ec7bSml29623
16526f45ec7bSml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_BINARY);
16536f45ec7bSml29623 if (pa->value != cfg_value) {
16546f45ec7bSml29623 pa->old_value = pa->value;
16556f45ec7bSml29623 pa->value = cfg_value;
16566f45ec7bSml29623 cfg_it = B_TRUE;
16576f45ec7bSml29623 }
16586f45ec7bSml29623
16596f45ec7bSml29623 if (cfg_it == B_TRUE) {
16606f45ec7bSml29623 if (pa->value)
16616f45ec7bSml29623 status = nxge_fflp_config_hash_lookup_enable(nxgep);
16626f45ec7bSml29623 else
16636f45ec7bSml29623 status = nxge_fflp_config_hash_lookup_disable(nxgep);
16646f45ec7bSml29623 if (status != NXGE_OK)
16656f45ec7bSml29623 return (EINVAL);
16666f45ec7bSml29623 }
16676f45ec7bSml29623
16686f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_hash_lookup_enable"));
16696f45ec7bSml29623 return (0);
16706f45ec7bSml29623 }
16716f45ec7bSml29623
16726f45ec7bSml29623 /* ARGSUSED */
16736f45ec7bSml29623 static int
nxge_param_llc_snap_enable(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)16746f45ec7bSml29623 nxge_param_llc_snap_enable(p_nxge_t nxgep, queue_t *q,
16756f45ec7bSml29623 mblk_t *mp, char *value, caddr_t cp)
16766f45ec7bSml29623 {
16776f45ec7bSml29623 char *end;
16786f45ec7bSml29623 uint32_t status = 0, cfg_value;
16796f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
16806f45ec7bSml29623 uint32_t cfg_it = B_FALSE;
16816f45ec7bSml29623
16826f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_llc_snap_enable"));
16836f45ec7bSml29623
16846f45ec7bSml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_BINARY);
16856f45ec7bSml29623 if (pa->value != cfg_value) {
16866f45ec7bSml29623 pa->old_value = pa->value;
16876f45ec7bSml29623 pa->value = cfg_value;
16886f45ec7bSml29623 cfg_it = B_TRUE;
16896f45ec7bSml29623 }
16906f45ec7bSml29623
16916f45ec7bSml29623 if (cfg_it == B_TRUE) {
16926f45ec7bSml29623 if (pa->value)
16936f45ec7bSml29623 status = nxge_fflp_config_tcam_enable(nxgep);
16946f45ec7bSml29623 else
16956f45ec7bSml29623 status = nxge_fflp_config_tcam_disable(nxgep);
16966f45ec7bSml29623 if (status != NXGE_OK)
16976f45ec7bSml29623 return (EINVAL);
16986f45ec7bSml29623 }
16996f45ec7bSml29623
17006f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_llc_snap_enable"));
17016f45ec7bSml29623 return (0);
17026f45ec7bSml29623 }
17036f45ec7bSml29623
17046f45ec7bSml29623 /* ARGSUSED */
17056f45ec7bSml29623 static int
nxge_param_set_ether_usr(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)17066f45ec7bSml29623 nxge_param_set_ether_usr(p_nxge_t nxgep, queue_t *q,
17076f45ec7bSml29623 mblk_t *mp, char *value, caddr_t cp)
17086f45ec7bSml29623 {
17096f45ec7bSml29623 char *end;
17106f45ec7bSml29623 uint32_t status = 0, cfg_value;
17116f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
17126f45ec7bSml29623 uint8_t cfg_it = B_FALSE;
17136f45ec7bSml29623
17146f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_ether_usr"));
17156f45ec7bSml29623
17166f45ec7bSml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX);
17176f45ec7bSml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) {
17186f45ec7bSml29623 return (EINVAL);
17196f45ec7bSml29623 }
17206f45ec7bSml29623
17216f45ec7bSml29623 if (pa->value != cfg_value) {
17226f45ec7bSml29623 pa->old_value = pa->value;
17236f45ec7bSml29623 pa->value = cfg_value;
17246f45ec7bSml29623 cfg_it = B_TRUE;
17256f45ec7bSml29623 }
17266f45ec7bSml29623
17276f45ec7bSml29623 /* do the actual hw setup */
17286f45ec7bSml29623 if (cfg_it == B_TRUE) {
1729fe054a6cSToomas Soome (void) mi_strtol(pa->name, &end, BASE_DECIMAL);
17306f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " nxge_param_set_ether_usr"));
17316f45ec7bSml29623 }
17326f45ec7bSml29623
17336f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_ether_usr"));
17346f45ec7bSml29623 return (status);
17356f45ec7bSml29623 }
17366f45ec7bSml29623
17376f45ec7bSml29623 /* ARGSUSED */
17386f45ec7bSml29623 static int
nxge_param_set_ip_usr(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)17396f45ec7bSml29623 nxge_param_set_ip_usr(p_nxge_t nxgep, queue_t *q,
17406f45ec7bSml29623 mblk_t *mp, char *value, caddr_t cp)
17416f45ec7bSml29623 {
17426f45ec7bSml29623 char *end;
17436f45ec7bSml29623 tcam_class_t class;
17446f45ec7bSml29623 uint32_t status, cfg_value;
17456f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
17466f45ec7bSml29623 uint32_t cfg_it = B_FALSE;
17476f45ec7bSml29623
17486f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_ip_usr"));
17496f45ec7bSml29623
17506f45ec7bSml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX);
17516f45ec7bSml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) {
17526f45ec7bSml29623 return (EINVAL);
17536f45ec7bSml29623 }
17546f45ec7bSml29623
17556f45ec7bSml29623 if (pa->value != cfg_value) {
17566f45ec7bSml29623 pa->old_value = pa->value;
17576f45ec7bSml29623 pa->value = cfg_value;
17586f45ec7bSml29623 cfg_it = B_TRUE;
17596f45ec7bSml29623 }
17606f45ec7bSml29623
17616f45ec7bSml29623 /* do the actual hw setup with cfg_value. */
1762*e3d11eeeSToomas Soome status = 0;
17636f45ec7bSml29623 if (cfg_it == B_TRUE) {
17646f45ec7bSml29623 class = mi_strtol(pa->name, &end, 10);
17656f45ec7bSml29623 status = nxge_fflp_ip_usr_class_config(nxgep, class, pa->value);
17666f45ec7bSml29623 }
17676f45ec7bSml29623
17686f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_ip_usr"));
17696f45ec7bSml29623 return (status);
17706f45ec7bSml29623 }
17716f45ec7bSml29623
17726f45ec7bSml29623 static int
nxge_class_name_2value(p_nxge_t nxgep,char * name)17736f45ec7bSml29623 nxge_class_name_2value(p_nxge_t nxgep, char *name)
17746f45ec7bSml29623 {
17756f45ec7bSml29623 int i;
17766f45ec7bSml29623 int class_instance = param_class_opt_ip_usr4;
17776f45ec7bSml29623 p_nxge_param_t param_arr;
17786f45ec7bSml29623
17796f45ec7bSml29623 param_arr = nxgep->param_arr;
17806f45ec7bSml29623 for (i = TCAM_CLASS_IP_USER_4; i <= TCAM_CLASS_SCTP_IPV6; i++) {
17816f45ec7bSml29623 if (strcmp(param_arr[class_instance].name, name) == 0)
17826f45ec7bSml29623 return (i);
17836f45ec7bSml29623 class_instance++;
17846f45ec7bSml29623 }
17856f45ec7bSml29623 return (-1);
17866f45ec7bSml29623 }
17876f45ec7bSml29623
17881bd6825cSml29623 int
nxge_param_set_ip_opt(p_nxge_t nxgep,queue_t * q __unused,mblk_t * mp __unused,char * value,caddr_t cp)1789*e3d11eeeSToomas Soome nxge_param_set_ip_opt(p_nxge_t nxgep, queue_t *q __unused,
1790*e3d11eeeSToomas Soome mblk_t *mp __unused, char *value, caddr_t cp)
17916f45ec7bSml29623 {
17926f45ec7bSml29623 char *end;
17936f45ec7bSml29623 uint32_t status, cfg_value;
17946f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
17956f45ec7bSml29623 tcam_class_t class;
17966f45ec7bSml29623 uint32_t cfg_it = B_FALSE;
17976f45ec7bSml29623
17986f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_ip_opt"));
17996f45ec7bSml29623
18006f45ec7bSml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX);
18016f45ec7bSml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) {
18026f45ec7bSml29623 return (EINVAL);
18036f45ec7bSml29623 }
18046f45ec7bSml29623
18056f45ec7bSml29623 if (pa->value != cfg_value) {
18066f45ec7bSml29623 pa->old_value = pa->value;
18076f45ec7bSml29623 pa->value = cfg_value;
18086f45ec7bSml29623 cfg_it = B_TRUE;
18096f45ec7bSml29623 }
18106f45ec7bSml29623
18116f45ec7bSml29623 if (cfg_it == B_TRUE) {
18126f45ec7bSml29623 /* do the actual hw setup */
18136f45ec7bSml29623 class = nxge_class_name_2value(nxgep, pa->name);
18146f45ec7bSml29623 if (class == -1)
18156f45ec7bSml29623 return (EINVAL);
18166f45ec7bSml29623
1817c1f9c6e5SSantwona Behera /* Filter out the allowed bits */
1818c1f9c6e5SSantwona Behera pa->value &= (NXGE_CLASS_FLOW_USE_PORTNUM |
1819c1f9c6e5SSantwona Behera NXGE_CLASS_FLOW_USE_L2DA | NXGE_CLASS_FLOW_USE_VLAN |
1820c1f9c6e5SSantwona Behera NXGE_CLASS_FLOW_USE_PROTO | NXGE_CLASS_FLOW_USE_IPSRC |
1821c1f9c6e5SSantwona Behera NXGE_CLASS_FLOW_USE_IPDST | NXGE_CLASS_FLOW_USE_SRC_PORT |
1822c1f9c6e5SSantwona Behera NXGE_CLASS_FLOW_USE_DST_PORT);
1823c1f9c6e5SSantwona Behera
18246f45ec7bSml29623 status = nxge_fflp_ip_class_config(nxgep, class, pa->value);
18256f45ec7bSml29623 if (status != NXGE_OK)
18266f45ec7bSml29623 return (EINVAL);
18276f45ec7bSml29623 }
18286f45ec7bSml29623
18296f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_ip_opt"));
18306f45ec7bSml29623 return (0);
18316f45ec7bSml29623 }
18326f45ec7bSml29623
18336f45ec7bSml29623 /* ARGSUSED */
18346f45ec7bSml29623 static int
nxge_param_get_ip_opt(p_nxge_t nxgep,queue_t * q,mblk_t * mp,caddr_t cp)18356f45ec7bSml29623 nxge_param_get_ip_opt(p_nxge_t nxgep, queue_t *q,
18366f45ec7bSml29623 mblk_t *mp, caddr_t cp)
18376f45ec7bSml29623 {
18386f45ec7bSml29623 uint32_t status, cfg_value;
18396f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
18406f45ec7bSml29623 tcam_class_t class;
18416f45ec7bSml29623
18426f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_ip_opt"));
18436f45ec7bSml29623
18446f45ec7bSml29623 /* do the actual hw setup */
18456f45ec7bSml29623 class = nxge_class_name_2value(nxgep, pa->name);
18466f45ec7bSml29623 if (class == -1)
18476f45ec7bSml29623 return (EINVAL);
18486f45ec7bSml29623
18496f45ec7bSml29623 cfg_value = 0;
18506f45ec7bSml29623 status = nxge_fflp_ip_class_config_get(nxgep, class, &cfg_value);
18516f45ec7bSml29623 if (status != NXGE_OK)
18526f45ec7bSml29623 return (EINVAL);
18536f45ec7bSml29623
1854c1f9c6e5SSantwona Behera /* Filter out the allowed bits */
1855c1f9c6e5SSantwona Behera cfg_value &= (NXGE_CLASS_FLOW_USE_PORTNUM | NXGE_CLASS_FLOW_USE_L2DA |
1856c1f9c6e5SSantwona Behera NXGE_CLASS_FLOW_USE_VLAN | NXGE_CLASS_FLOW_USE_PROTO |
1857c1f9c6e5SSantwona Behera NXGE_CLASS_FLOW_USE_IPSRC | NXGE_CLASS_FLOW_USE_IPDST |
1858c1f9c6e5SSantwona Behera NXGE_CLASS_FLOW_USE_SRC_PORT | NXGE_CLASS_FLOW_USE_DST_PORT);
1859c1f9c6e5SSantwona Behera
18606f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
18616f45ec7bSml29623 "nxge_param_get_ip_opt_get %x ", cfg_value));
18626f45ec7bSml29623
18636f45ec7bSml29623 pa->value = cfg_value;
18646f45ec7bSml29623 (void) mi_mpprintf(mp, "%x", cfg_value);
18656f45ec7bSml29623
18666f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_ip_opt status "));
18676f45ec7bSml29623 return (0);
18686f45ec7bSml29623 }
18696f45ec7bSml29623
18706f45ec7bSml29623 /* ARGSUSED */
18716f45ec7bSml29623 static int
nxge_param_fflp_hash_init(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)18726f45ec7bSml29623 nxge_param_fflp_hash_init(p_nxge_t nxgep, queue_t *q,
18736f45ec7bSml29623 mblk_t *mp, char *value, caddr_t cp)
18746f45ec7bSml29623 {
18756f45ec7bSml29623 char *end;
18766f45ec7bSml29623 uint32_t status, cfg_value;
18776f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
18786f45ec7bSml29623 tcam_class_t class;
18796f45ec7bSml29623 uint32_t cfg_it = B_FALSE;
18806f45ec7bSml29623
18816f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_fflp_hash_init"));
18826f45ec7bSml29623
18836f45ec7bSml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX);
18846f45ec7bSml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) {
18856f45ec7bSml29623 return (EINVAL);
18866f45ec7bSml29623 }
18876f45ec7bSml29623
18886f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
18896f45ec7bSml29623 "nxge_param_fflp_hash_init value %x", cfg_value));
18906f45ec7bSml29623
18916f45ec7bSml29623 if (pa->value != cfg_value) {
18926f45ec7bSml29623 pa->old_value = pa->value;
18936f45ec7bSml29623 pa->value = cfg_value;
18946f45ec7bSml29623 cfg_it = B_TRUE;
18956f45ec7bSml29623 }
18966f45ec7bSml29623
18976f45ec7bSml29623 if (cfg_it == B_TRUE) {
18986f45ec7bSml29623 char *h_name;
18996f45ec7bSml29623
19006f45ec7bSml29623 /* do the actual hw setup */
19016f45ec7bSml29623 h_name = pa->name;
19026f45ec7bSml29623 h_name++;
19036f45ec7bSml29623 class = mi_strtol(h_name, &end, 10);
19046f45ec7bSml29623 switch (class) {
19056f45ec7bSml29623 case 1:
19066f45ec7bSml29623 status = nxge_fflp_set_hash1(nxgep,
19076f45ec7bSml29623 (uint32_t)pa->value);
19086f45ec7bSml29623 break;
19096f45ec7bSml29623 case 2:
19106f45ec7bSml29623 status = nxge_fflp_set_hash2(nxgep,
19116f45ec7bSml29623 (uint16_t)pa->value);
19126f45ec7bSml29623 break;
19136f45ec7bSml29623
19146f45ec7bSml29623 default:
19156f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
19166f45ec7bSml29623 " nxge_param_fflp_hash_init"
19176f45ec7bSml29623 " %s Wrong hash var %d",
19186f45ec7bSml29623 pa->name, class));
19196f45ec7bSml29623 return (EINVAL);
19206f45ec7bSml29623 }
19216f45ec7bSml29623 if (status != NXGE_OK)
19226f45ec7bSml29623 return (EINVAL);
19236f45ec7bSml29623 }
19246f45ec7bSml29623
19256f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_fflp_hash_init"));
19266f45ec7bSml29623 return (0);
19276f45ec7bSml29623 }
19286f45ec7bSml29623
19296f45ec7bSml29623 /* ARGSUSED */
19306f45ec7bSml29623 static int
nxge_param_set_grp_rdc(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)19316f45ec7bSml29623 nxge_param_set_grp_rdc(p_nxge_t nxgep, queue_t *q,
19326f45ec7bSml29623 mblk_t *mp, char *value, caddr_t cp)
19336f45ec7bSml29623 {
19346f45ec7bSml29623 char *end;
19356f45ec7bSml29623 uint32_t status = 0, cfg_value;
19366f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
19376f45ec7bSml29623 uint32_t cfg_it = B_FALSE;
19386f45ec7bSml29623 int rdc_grp;
19396f45ec7bSml29623 uint8_t real_rdc;
19406f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
19416f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
19426f45ec7bSml29623 p_nxge_rdc_grp_t rdc_grp_p;
19436f45ec7bSml29623
19446f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
19456f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
19466f45ec7bSml29623
19476f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_grp_rdc"));
19486f45ec7bSml29623
19496f45ec7bSml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY);
19506f45ec7bSml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) {
19516f45ec7bSml29623 return (EINVAL);
19526f45ec7bSml29623 }
19536f45ec7bSml29623
19546f45ec7bSml29623 if (cfg_value >= p_cfgp->max_rdcs) {
19556f45ec7bSml29623 return (EINVAL);
19566f45ec7bSml29623 }
19576f45ec7bSml29623
19586f45ec7bSml29623 if (pa->value != cfg_value) {
19596f45ec7bSml29623 pa->old_value = pa->value;
19606f45ec7bSml29623 pa->value = cfg_value;
19616f45ec7bSml29623 cfg_it = B_TRUE;
19626f45ec7bSml29623 }
19636f45ec7bSml29623
19646f45ec7bSml29623 if (cfg_it == B_TRUE) {
19656f45ec7bSml29623 char *grp_name;
19666f45ec7bSml29623 grp_name = pa->name;
19676f45ec7bSml29623 grp_name += strlen("default-grp");
19686f45ec7bSml29623 rdc_grp = mi_strtol(grp_name, &end, 10);
19696f45ec7bSml29623 rdc_grp_p = &p_dma_cfgp->rdc_grps[rdc_grp];
19706f45ec7bSml29623 real_rdc = rdc_grp_p->start_rdc + cfg_value;
19716f45ec7bSml29623 if (nxge_check_rxdma_rdcgrp_member(nxgep, rdc_grp,
19726f45ec7bSml29623 cfg_value) == B_FALSE) {
19736f45ec7bSml29623 pa->value = pa->old_value;
19746f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
19756f45ec7bSml29623 " nxge_param_set_grp_rdc"
19766f45ec7bSml29623 " %d read %d actual %d outof range",
19776f45ec7bSml29623 rdc_grp, cfg_value, real_rdc));
19786f45ec7bSml29623 return (EINVAL);
19796f45ec7bSml29623 }
19806f45ec7bSml29623 status = nxge_rxdma_cfg_rdcgrp_default_rdc(nxgep, rdc_grp,
19816f45ec7bSml29623 real_rdc);
19826f45ec7bSml29623 if (status != NXGE_OK)
19836f45ec7bSml29623 return (EINVAL);
19846f45ec7bSml29623 }
19856f45ec7bSml29623
19866f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_grp_rdc"));
19876f45ec7bSml29623 return (0);
19886f45ec7bSml29623 }
19896f45ec7bSml29623
19906f45ec7bSml29623 /* ARGSUSED */
19916f45ec7bSml29623 static int
nxge_param_set_port_rdc(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)19926f45ec7bSml29623 nxge_param_set_port_rdc(p_nxge_t nxgep, queue_t *q,
19936f45ec7bSml29623 mblk_t *mp, char *value, caddr_t cp)
19946f45ec7bSml29623 {
19956f45ec7bSml29623 char *end;
19966f45ec7bSml29623 uint32_t status = B_TRUE, cfg_value;
19976f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
19986f45ec7bSml29623 uint32_t cfg_it = B_FALSE;
19996f45ec7bSml29623
20006f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
20016f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
20026f45ec7bSml29623
20036f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_port_rdc"));
20046f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
20056f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
20066f45ec7bSml29623
20076f45ec7bSml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY);
20086f45ec7bSml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) {
20096f45ec7bSml29623 return (EINVAL);
20106f45ec7bSml29623 }
20116f45ec7bSml29623
20126f45ec7bSml29623 if (pa->value != cfg_value) {
20136f45ec7bSml29623 if (cfg_value >= p_cfgp->max_rdcs)
20146f45ec7bSml29623 return (EINVAL);
20156f45ec7bSml29623 pa->old_value = pa->value;
20166f45ec7bSml29623 pa->value = cfg_value;
20176f45ec7bSml29623 cfg_it = B_TRUE;
20186f45ec7bSml29623 }
20196f45ec7bSml29623
20206f45ec7bSml29623 if (cfg_it == B_TRUE) {
2021678453a8Sspeer int rdc;
2022678453a8Sspeer if ((rdc = nxge_dci_map(nxgep, VP_BOUND_RX, cfg_value)) < 0)
2023678453a8Sspeer return (EINVAL);
20246f45ec7bSml29623 status = nxge_rxdma_cfg_port_default_rdc(nxgep,
2025678453a8Sspeer nxgep->function_num, rdc);
20266f45ec7bSml29623 if (status != NXGE_OK)
20276f45ec7bSml29623 return (EINVAL);
20286f45ec7bSml29623 }
20296f45ec7bSml29623
20306f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_port_rdc"));
20316f45ec7bSml29623 return (0);
20326f45ec7bSml29623 }
20336f45ec7bSml29623
20346f45ec7bSml29623 /* ARGSUSED */
20356f45ec7bSml29623 static int
nxge_param_set_nxge_debug_flag(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)20366f45ec7bSml29623 nxge_param_set_nxge_debug_flag(p_nxge_t nxgep, queue_t *q,
20376f45ec7bSml29623 mblk_t *mp, char *value, caddr_t cp)
20386f45ec7bSml29623 {
20396f45ec7bSml29623 char *end;
20406f45ec7bSml29623 uint32_t status = 0;
20416f45ec7bSml29623 uint64_t cfg_value = 0;
20426f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
20436f45ec7bSml29623 uint32_t cfg_it = B_FALSE;
20446f45ec7bSml29623
20456f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_nxge_debug_flag"));
20466f45ec7bSml29623 cfg_value = mi_strtol(value, &end, BASE_HEX);
20476f45ec7bSml29623
20486f45ec7bSml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) {
20496f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
20506f45ec7bSml29623 " nxge_param_set_nxge_debug_flag"
20516f45ec7bSml29623 " outof range %llx", cfg_value));
20526f45ec7bSml29623 return (EINVAL);
20536f45ec7bSml29623 }
20546f45ec7bSml29623 if (pa->value != cfg_value) {
20556f45ec7bSml29623 pa->old_value = pa->value;
20566f45ec7bSml29623 pa->value = cfg_value;
20576f45ec7bSml29623 cfg_it = B_TRUE;
20586f45ec7bSml29623 }
20596f45ec7bSml29623
20606f45ec7bSml29623 if (cfg_it == B_TRUE) {
20616f45ec7bSml29623 nxgep->nxge_debug_level = pa->value;
20626f45ec7bSml29623 }
20636f45ec7bSml29623
20646f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_nxge_debug_flag"));
20656f45ec7bSml29623 return (status);
20666f45ec7bSml29623 }
20676f45ec7bSml29623
20686f45ec7bSml29623 /* ARGSUSED */
20696f45ec7bSml29623 static int
nxge_param_get_debug_flag(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)20706f45ec7bSml29623 nxge_param_get_debug_flag(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
20716f45ec7bSml29623 {
20726f45ec7bSml29623 int status = 0;
20736f45ec7bSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
20746f45ec7bSml29623
20756f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_debug_flag"));
20766f45ec7bSml29623
20776f45ec7bSml29623 if (pa->value > 0xffffffff)
20786f45ec7bSml29623 (void) mi_mpprintf(mp, "%x%x", (int)(pa->value >> 32),
20796f45ec7bSml29623 (int)(pa->value & 0xffffffff));
20806f45ec7bSml29623 else
20816f45ec7bSml29623 (void) mi_mpprintf(mp, "%x", (int)pa->value);
20826f45ec7bSml29623
20836f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_debug_flag"));
20846f45ec7bSml29623 return (status);
20856f45ec7bSml29623 }
20866f45ec7bSml29623
20876f45ec7bSml29623 /* ARGSUSED */
20886f45ec7bSml29623 static int
nxge_param_set_npi_debug_flag(p_nxge_t nxgep,queue_t * q,mblk_t * mp,char * value,caddr_t cp)20896f45ec7bSml29623 nxge_param_set_npi_debug_flag(p_nxge_t nxgep, queue_t *q,
20906f45ec7bSml29623 mblk_t *mp, char *value, caddr_t cp)
20916f45ec7bSml29623 {
20926f45ec7bSml29623 char *end;
20936f45ec7bSml29623 uint32_t status = 0;
20946f45ec7bSml29623 uint64_t cfg_value = 0;
20956f45ec7bSml29623 p_nxge_param_t pa;
20966f45ec7bSml29623 uint32_t cfg_it = B_FALSE;
20976f45ec7bSml29623
20986f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_npi_debug_flag"));
20996f45ec7bSml29623 cfg_value = mi_strtol(value, &end, BASE_HEX);
21006f45ec7bSml29623 pa = (p_nxge_param_t)cp;
21016f45ec7bSml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) {
21026f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " nxge_param_set_npi_debug_flag"
21036f45ec7bSml29623 " outof range %llx", cfg_value));
21046f45ec7bSml29623 return (EINVAL);
21056f45ec7bSml29623 }
21066f45ec7bSml29623 if (pa->value != cfg_value) {
21076f45ec7bSml29623 pa->old_value = pa->value;
21086f45ec7bSml29623 pa->value = cfg_value;
21096f45ec7bSml29623 cfg_it = B_TRUE;
21106f45ec7bSml29623 }
21116f45ec7bSml29623
21126f45ec7bSml29623 if (cfg_it == B_TRUE) {
21136f45ec7bSml29623 npi_debug_level = pa->value;
21146f45ec7bSml29623 }
21156f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_debug_flag"));
21166f45ec7bSml29623 return (status);
21176f45ec7bSml29623 }
21186f45ec7bSml29623
21196f45ec7bSml29623 /* ARGSUSED */
21206f45ec7bSml29623 static int
nxge_param_dump_rdc(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)21216f45ec7bSml29623 nxge_param_dump_rdc(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
21226f45ec7bSml29623 {
2123678453a8Sspeer nxge_grp_set_t *set = &nxgep->rx_set;
2124678453a8Sspeer int rdc;
21256f45ec7bSml29623
21266f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_rdc"));
21276f45ec7bSml29623
2128678453a8Sspeer if (!isLDOMguest(nxgep))
21296f45ec7bSml29623 (void) npi_rxdma_dump_fzc_regs(NXGE_DEV_NPI_HANDLE(nxgep));
2130678453a8Sspeer
2131678453a8Sspeer for (rdc = 0; rdc < NXGE_MAX_TDCS; rdc++) {
2132678453a8Sspeer if ((1 << rdc) & set->owned.map) {
2133678453a8Sspeer (void) nxge_dump_rxdma_channel(nxgep, rdc);
2134678453a8Sspeer }
2135678453a8Sspeer }
21366f45ec7bSml29623
21376f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_rdc"));
21386f45ec7bSml29623 return (0);
21396f45ec7bSml29623 }
21406f45ec7bSml29623
21416f45ec7bSml29623 /* ARGSUSED */
21426f45ec7bSml29623 static int
nxge_param_dump_tdc(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)21436f45ec7bSml29623 nxge_param_dump_tdc(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
21446f45ec7bSml29623 {
2145678453a8Sspeer nxge_grp_set_t *set = &nxgep->tx_set;
2146678453a8Sspeer int tdc;
21476f45ec7bSml29623
21486f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_tdc"));
21496f45ec7bSml29623
2150678453a8Sspeer for (tdc = 0; tdc < NXGE_MAX_TDCS; tdc++) {
2151678453a8Sspeer if ((1 << tdc) & set->owned.map) {
2152678453a8Sspeer (void) nxge_txdma_regs_dump(nxgep, tdc);
2153678453a8Sspeer }
2154678453a8Sspeer }
21556f45ec7bSml29623
21566f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_tdc"));
21576f45ec7bSml29623 return (0);
21586f45ec7bSml29623 }
21596f45ec7bSml29623
21606f45ec7bSml29623 /* ARGSUSED */
21616f45ec7bSml29623 static int
nxge_param_dump_fflp_regs(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)21626f45ec7bSml29623 nxge_param_dump_fflp_regs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
21636f45ec7bSml29623 {
21646f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_fflp_regs"));
21656f45ec7bSml29623
21666f45ec7bSml29623 (void) npi_fflp_dump_regs(NXGE_DEV_NPI_HANDLE(nxgep));
21676f45ec7bSml29623
21686f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_fflp_regs"));
21696f45ec7bSml29623 return (0);
21706f45ec7bSml29623 }
21716f45ec7bSml29623
21726f45ec7bSml29623 /* ARGSUSED */
21736f45ec7bSml29623 static int
nxge_param_dump_mac_regs(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)21746f45ec7bSml29623 nxge_param_dump_mac_regs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
21756f45ec7bSml29623 {
21766f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_mac_regs"));
21776f45ec7bSml29623
21786f45ec7bSml29623 (void) npi_mac_dump_regs(NXGE_DEV_NPI_HANDLE(nxgep),
21796f45ec7bSml29623 nxgep->function_num);
21806f45ec7bSml29623
21816f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_mac_regs"));
21826f45ec7bSml29623 return (0);
21836f45ec7bSml29623 }
21846f45ec7bSml29623
21856f45ec7bSml29623 /* ARGSUSED */
21866f45ec7bSml29623 static int
nxge_param_dump_ipp_regs(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)21876f45ec7bSml29623 nxge_param_dump_ipp_regs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
21886f45ec7bSml29623 {
21896f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_ipp_regs"));
21906f45ec7bSml29623
21916f45ec7bSml29623 (void) npi_ipp_dump_regs(NXGE_DEV_NPI_HANDLE(nxgep),
21926f45ec7bSml29623 nxgep->function_num);
21936f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_ipp_regs"));
21946f45ec7bSml29623 return (0);
21956f45ec7bSml29623 }
21966f45ec7bSml29623
21976f45ec7bSml29623 /* ARGSUSED */
21986f45ec7bSml29623 static int
nxge_param_dump_vlan_table(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)21996f45ec7bSml29623 nxge_param_dump_vlan_table(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
22006f45ec7bSml29623 {
22016f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_dump_vlan_table"));
22026f45ec7bSml29623
22036f45ec7bSml29623 (void) npi_fflp_vlan_tbl_dump(NXGE_DEV_NPI_HANDLE(nxgep));
22046f45ec7bSml29623
22056f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_dump_vlan_table"));
22066f45ec7bSml29623 return (0);
22076f45ec7bSml29623 }
22086f45ec7bSml29623
22096f45ec7bSml29623 /* ARGSUSED */
22106f45ec7bSml29623 static int
nxge_param_dump_rdc_table(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)22116f45ec7bSml29623 nxge_param_dump_rdc_table(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
22126f45ec7bSml29623 {
22136f45ec7bSml29623 uint8_t table;
22146f45ec7bSml29623
22156f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_dump_rdc_table"));
22166f45ec7bSml29623 for (table = 0; table < NXGE_MAX_RDC_GROUPS; table++) {
22176f45ec7bSml29623 (void) npi_rxdma_dump_rdc_table(NXGE_DEV_NPI_HANDLE(nxgep),
22186f45ec7bSml29623 table);
22196f45ec7bSml29623 }
22206f45ec7bSml29623
22216f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_dump_rdc_table"));
22226f45ec7bSml29623 return (0);
22236f45ec7bSml29623 }
22246f45ec7bSml29623
22256f45ec7bSml29623 typedef struct block_info {
22266f45ec7bSml29623 char *name;
22276f45ec7bSml29623 uint32_t offset;
22286f45ec7bSml29623 } block_info_t;
22296f45ec7bSml29623
22306f45ec7bSml29623 block_info_t reg_block[] = {
22316f45ec7bSml29623 {"PIO", PIO},
22326f45ec7bSml29623 {"FZC_PIO", FZC_PIO},
22336f45ec7bSml29623 {"FZC_XMAC", FZC_MAC},
22346f45ec7bSml29623 {"FZC_IPP", FZC_IPP},
22356f45ec7bSml29623 {"FFLP", FFLP},
22366f45ec7bSml29623 {"FZC_FFLP", FZC_FFLP},
22376f45ec7bSml29623 {"PIO_VADDR", PIO_VADDR},
22386f45ec7bSml29623 {"ZCP", ZCP},
22396f45ec7bSml29623 {"FZC_ZCP", FZC_ZCP},
22406f45ec7bSml29623 {"DMC", DMC},
22416f45ec7bSml29623 {"FZC_DMC", FZC_DMC},
22426f45ec7bSml29623 {"TXC", TXC},
22436f45ec7bSml29623 {"FZC_TXC", FZC_TXC},
22446f45ec7bSml29623 {"PIO_LDSV", PIO_LDSV},
22456f45ec7bSml29623 {"PIO_LDGIM", PIO_LDGIM},
22466f45ec7bSml29623 {"PIO_IMASK0", PIO_IMASK0},
22476f45ec7bSml29623 {"PIO_IMASK1", PIO_IMASK1},
22486f45ec7bSml29623 {"FZC_PROM", FZC_PROM},
22496f45ec7bSml29623 {"END", ALL_FF_32},
22506f45ec7bSml29623 };
22516f45ec7bSml29623
22526f45ec7bSml29623 /* ARGSUSED */
22536f45ec7bSml29623 static int
nxge_param_dump_ptrs(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t cp)22546f45ec7bSml29623 nxge_param_dump_ptrs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp)
22556f45ec7bSml29623 {
22566f45ec7bSml29623 uint_t print_len, buf_len;
22576f45ec7bSml29623 p_mblk_t np;
22586f45ec7bSml29623 int rdc, tdc, block;
22596f45ec7bSml29623 uint64_t base;
22606f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
22616f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
22626f45ec7bSml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_8K;
22636f45ec7bSml29623 p_tx_ring_t *tx_rings;
22646f45ec7bSml29623 p_rx_rcr_rings_t rx_rcr_rings;
22656f45ec7bSml29623 p_rx_rcr_ring_t *rcr_rings;
22666f45ec7bSml29623 p_rx_rbr_rings_t rx_rbr_rings;
22676f45ec7bSml29623 p_rx_rbr_ring_t *rbr_rings;
22686f45ec7bSml29623
22696f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL,
22706f45ec7bSml29623 "==> nxge_param_dump_ptrs"));
22716f45ec7bSml29623
22726f45ec7bSml29623 (void) mi_mpprintf(mp, "ptr information for Port\t %d \n",
22736f45ec7bSml29623 nxgep->function_num);
22746f45ec7bSml29623
22756f45ec7bSml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) {
22766f45ec7bSml29623 /* The following may work even if we cannot get a large buf. */
22776f45ec7bSml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer");
22786f45ec7bSml29623 return (0);
22796f45ec7bSml29623 }
22806f45ec7bSml29623
22816f45ec7bSml29623 buf_len = buff_alloc_size;
22826f45ec7bSml29623 mp->b_cont = np;
22836f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
22846f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
22856f45ec7bSml29623
22866f45ec7bSml29623 rx_rcr_rings = nxgep->rx_rcr_rings;
22876f45ec7bSml29623 rcr_rings = rx_rcr_rings->rcr_rings;
22886f45ec7bSml29623 rx_rbr_rings = nxgep->rx_rbr_rings;
22896f45ec7bSml29623 rbr_rings = rx_rbr_rings->rbr_rings;
22906f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
22916f45ec7bSml29623 "nxgep (nxge_t) $%p\n"
22926f45ec7bSml29623 "dev_regs (dev_regs_t) $%p\n",
22938793b36bSNick Todd (void *)nxgep, (void *)nxgep->dev_regs);
22946f45ec7bSml29623
22956f45ec7bSml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len);
22966f45ec7bSml29623
22976f45ec7bSml29623 /* do register pointers */
22986f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
22996f45ec7bSml29623 "reg base (npi_reg_ptr_t) $%p\t "
23006f45ec7bSml29623 "pci reg (npi_reg_ptr_t) $%p\n",
23018793b36bSNick Todd (void *)nxgep->dev_regs->nxge_regp,
23028793b36bSNick Todd (void *)nxgep->dev_regs->nxge_pciregp);
23036f45ec7bSml29623
23046f45ec7bSml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len);
23056f45ec7bSml29623
23066f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
23076f45ec7bSml29623 "\nBlock \t Offset \n");
23086f45ec7bSml29623
23096f45ec7bSml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len);
23106f45ec7bSml29623 block = 0;
23116f45ec7bSml29623 base = (uint64_t)nxgep->dev_regs->nxge_regp;
23126f45ec7bSml29623 while (reg_block[block].offset != ALL_FF_32) {
23136f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
23146f45ec7bSml29623 "%9s\t 0x%llx\n",
23156f45ec7bSml29623 reg_block[block].name,
23166f45ec7bSml29623 (unsigned long long)(reg_block[block].offset + base));
23176f45ec7bSml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len);
23186f45ec7bSml29623 block++;
23196f45ec7bSml29623 }
23206f45ec7bSml29623
23216f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
23226f45ec7bSml29623 "\nRDC\t rcrp (rx_rcr_ring_t)\t "
23236f45ec7bSml29623 "rbrp (rx_rbr_ring_t)\n");
23246f45ec7bSml29623
23256f45ec7bSml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len);
23266f45ec7bSml29623
23276f45ec7bSml29623 for (rdc = 0; rdc < p_cfgp->max_rdcs; rdc++) {
23286f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
23296f45ec7bSml29623 " %d\t $%p\t\t $%p\n",
23308793b36bSNick Todd rdc, (void *)rcr_rings[rdc],
23318793b36bSNick Todd (void *)rbr_rings[rdc]);
23326f45ec7bSml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len);
23336f45ec7bSml29623 }
23346f45ec7bSml29623
23356f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
23366f45ec7bSml29623 "\nTDC\t tdcp (tx_ring_t)\n");
23376f45ec7bSml29623
23386f45ec7bSml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len);
23396f45ec7bSml29623 tx_rings = nxgep->tx_rings->rings;
2340678453a8Sspeer for (tdc = 0; tdc < p_cfgp->tdc.count; tdc++) {
23416f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len,
23428793b36bSNick Todd " %d\t $%p\n", tdc, (void *)tx_rings[tdc]);
23436f45ec7bSml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len);
23446f45ec7bSml29623 }
23456f45ec7bSml29623
23466f45ec7bSml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, "\n\n");
23476f45ec7bSml29623
23486f45ec7bSml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len);
23496f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_ptrs"));
23506f45ec7bSml29623 return (0);
23516f45ec7bSml29623 }
23526f45ec7bSml29623
23536f45ec7bSml29623
23546f45ec7bSml29623 /* ARGSUSED */
23556f45ec7bSml29623 int
nxge_nd_get_names(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t param)23566f45ec7bSml29623 nxge_nd_get_names(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t param)
23576f45ec7bSml29623 {
23586f45ec7bSml29623 ND *nd;
23596f45ec7bSml29623 NDE *nde;
23606f45ec7bSml29623 char *rwtag;
23616f45ec7bSml29623 boolean_t get_ok, set_ok;
23626f45ec7bSml29623 size_t param_len;
23636f45ec7bSml29623 int status = 0;
23646f45ec7bSml29623
23656f45ec7bSml29623 nd = (ND *)param;
23666f45ec7bSml29623 if (!nd)
23676f45ec7bSml29623 return (ENOENT);
23686f45ec7bSml29623
23696f45ec7bSml29623 for (nde = nd->nd_tbl; nde->nde_name; nde++) {
23706f45ec7bSml29623 get_ok = (nde->nde_get_pfi != nxge_get_default) &&
23716f45ec7bSml29623 (nde->nde_get_pfi != NULL);
23726f45ec7bSml29623 set_ok = (nde->nde_set_pfi != nxge_set_default) &&
23736f45ec7bSml29623 (nde->nde_set_pfi != NULL);
23746f45ec7bSml29623 if (get_ok) {
23756f45ec7bSml29623 if (set_ok)
23766f45ec7bSml29623 rwtag = "read and write";
23776f45ec7bSml29623 else
23786f45ec7bSml29623 rwtag = "read only";
23796f45ec7bSml29623 } else if (set_ok)
23806f45ec7bSml29623 rwtag = "write only";
23816f45ec7bSml29623 else {
23826f45ec7bSml29623 continue;
23836f45ec7bSml29623 }
23846f45ec7bSml29623 param_len = strlen(rwtag);
23856f45ec7bSml29623 param_len += strlen(nde->nde_name);
23866f45ec7bSml29623 param_len += 4;
23876f45ec7bSml29623
23886f45ec7bSml29623 (void) mi_mpprintf(mp, "%s (%s)", nde->nde_name, rwtag);
23896f45ec7bSml29623 }
23906f45ec7bSml29623 return (status);
23916f45ec7bSml29623 }
23926f45ec7bSml29623
23936f45ec7bSml29623 /* ARGSUSED */
23946f45ec7bSml29623 int
nxge_get_default(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,caddr_t data)23956f45ec7bSml29623 nxge_get_default(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t data)
23966f45ec7bSml29623 {
23976f45ec7bSml29623 return (EACCES);
23986f45ec7bSml29623 }
23996f45ec7bSml29623
24006f45ec7bSml29623 /* ARGSUSED */
24016f45ec7bSml29623 int
nxge_set_default(p_nxge_t nxgep,queue_t * q,p_mblk_t mp,char * value,caddr_t data)24026f45ec7bSml29623 nxge_set_default(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, char *value,
24036f45ec7bSml29623 caddr_t data)
24046f45ec7bSml29623 {
24056f45ec7bSml29623 return (EACCES);
24066f45ec7bSml29623 }
24076f45ec7bSml29623
24081bd6825cSml29623 boolean_t
nxge_param_link_update(p_nxge_t nxgep)24096f45ec7bSml29623 nxge_param_link_update(p_nxge_t nxgep)
24106f45ec7bSml29623 {
24116f45ec7bSml29623 p_nxge_param_t param_arr;
24126f45ec7bSml29623 nxge_param_index_t i;
24136f45ec7bSml29623 boolean_t update_xcvr;
24146f45ec7bSml29623 boolean_t update_dev;
24156f45ec7bSml29623 int instance;
24166f45ec7bSml29623 boolean_t status = B_TRUE;
24176f45ec7bSml29623
24181bd6825cSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_link_update"));
24196f45ec7bSml29623
24206f45ec7bSml29623 param_arr = nxgep->param_arr;
24216f45ec7bSml29623 instance = nxgep->instance;
24226f45ec7bSml29623 update_xcvr = B_FALSE;
24236f45ec7bSml29623 for (i = param_anar_1000fdx; i < param_anar_asmpause; i++) {
24246f45ec7bSml29623 update_xcvr |= param_arr[i].value;
24256f45ec7bSml29623 }
24266f45ec7bSml29623
24276f45ec7bSml29623 if (update_xcvr) {
24286f45ec7bSml29623 update_xcvr = B_FALSE;
24296f45ec7bSml29623 for (i = param_autoneg; i < param_enable_ipg0; i++) {
24306f45ec7bSml29623 update_xcvr |=
24316f45ec7bSml29623 (param_arr[i].value != param_arr[i].old_value);
24326f45ec7bSml29623 param_arr[i].old_value = param_arr[i].value;
24336f45ec7bSml29623 }
24346f45ec7bSml29623 if (update_xcvr) {
24351bd6825cSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
24361bd6825cSml29623 "==> nxge_param_link_update: update xcvr"));
24376f45ec7bSml29623 RW_ENTER_WRITER(&nxgep->filter_lock);
24386f45ec7bSml29623 (void) nxge_link_monitor(nxgep, LINK_MONITOR_STOP);
24396f45ec7bSml29623 (void) nxge_link_init(nxgep);
24406f45ec7bSml29623 (void) nxge_mac_init(nxgep);
24416f45ec7bSml29623 (void) nxge_link_monitor(nxgep, LINK_MONITOR_START);
24426f45ec7bSml29623 RW_EXIT(&nxgep->filter_lock);
24436f45ec7bSml29623 }
24446f45ec7bSml29623 } else {
24456f45ec7bSml29623 cmn_err(CE_WARN, " Last setting will leave nxge%d with "
24466f45ec7bSml29623 " no link capabilities.", instance);
24476f45ec7bSml29623 cmn_err(CE_WARN, " Restoring previous setting.");
24486f45ec7bSml29623 for (i = param_anar_1000fdx; i < param_anar_asmpause; i++)
24496f45ec7bSml29623 param_arr[i].value = param_arr[i].old_value;
24506f45ec7bSml29623 }
24516f45ec7bSml29623
24526f45ec7bSml29623 update_dev = B_FALSE;
24536f45ec7bSml29623
24546f45ec7bSml29623 if (update_dev) {
24556f45ec7bSml29623 RW_ENTER_WRITER(&nxgep->filter_lock);
24561bd6825cSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
24571bd6825cSml29623 "==> nxge_param_link_update: update dev"));
24586f45ec7bSml29623 (void) nxge_rx_mac_disable(nxgep);
24596f45ec7bSml29623 (void) nxge_tx_mac_disable(nxgep);
24606f45ec7bSml29623 (void) nxge_tx_mac_enable(nxgep);
24616f45ec7bSml29623 (void) nxge_rx_mac_enable(nxgep);
24626f45ec7bSml29623 RW_EXIT(&nxgep->filter_lock);
24636f45ec7bSml29623 }
24646f45ec7bSml29623
24656f45ec7bSml29623 nxge_param_hw_update_exit:
24666f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL,
24676f45ec7bSml29623 "<== nxge_param_link_update status = 0x%08x", status));
24686f45ec7bSml29623 return (status);
24696f45ec7bSml29623 }
24701bd6825cSml29623
24711bd6825cSml29623 /*
24721bd6825cSml29623 * synchronize the adv* and en* parameters.
24731bd6825cSml29623 *
24741bd6825cSml29623 * See comments in <sys/dld.h> for details of the *_en_*
24751bd6825cSml29623 * parameters. The usage of ndd for setting adv parameters will
24761bd6825cSml29623 * synchronize all the en parameters with the nxge parameters,
24771bd6825cSml29623 * implicitly disabling any settings made via dladm.
24781bd6825cSml29623 */
24791bd6825cSml29623 static void
nxge_param_sync(p_nxge_t nxgep)24801bd6825cSml29623 nxge_param_sync(p_nxge_t nxgep)
24811bd6825cSml29623 {
24821bd6825cSml29623 p_nxge_param_t param_arr;
24831bd6825cSml29623 param_arr = nxgep->param_arr;
24841bd6825cSml29623
24851bd6825cSml29623 nxgep->param_en_pause = param_arr[param_anar_pause].value;
24861bd6825cSml29623 nxgep->param_en_1000fdx = param_arr[param_anar_1000fdx].value;
24871bd6825cSml29623 nxgep->param_en_100fdx = param_arr[param_anar_100fdx].value;
24881bd6825cSml29623 nxgep->param_en_10fdx = param_arr[param_anar_10fdx].value;
24891bd6825cSml29623 }
24901bd6825cSml29623
24911bd6825cSml29623 /* ARGSUSED */
24921bd6825cSml29623 int
nxge_dld_get_ip_opt(p_nxge_t nxgep,caddr_t cp)24931bd6825cSml29623 nxge_dld_get_ip_opt(p_nxge_t nxgep, caddr_t cp)
24941bd6825cSml29623 {
24951bd6825cSml29623 uint32_t status, cfg_value;
24961bd6825cSml29623 p_nxge_param_t pa = (p_nxge_param_t)cp;
24971bd6825cSml29623 tcam_class_t class;
24981bd6825cSml29623
24991bd6825cSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_dld_get_ip_opt"));
25001bd6825cSml29623
25011bd6825cSml29623 /* do the actual hw setup */
25021bd6825cSml29623 class = nxge_class_name_2value(nxgep, pa->name);
25031bd6825cSml29623 if (class == -1)
25041bd6825cSml29623 return (EINVAL);
25051bd6825cSml29623
25061bd6825cSml29623 cfg_value = 0;
25071bd6825cSml29623 status = nxge_fflp_ip_class_config_get(nxgep, class, &cfg_value);
25081bd6825cSml29623 if (status != NXGE_OK)
25091bd6825cSml29623 return (EINVAL);
25101bd6825cSml29623
2511c1f9c6e5SSantwona Behera /* Filter out the allowed bits */
2512c1f9c6e5SSantwona Behera cfg_value &= (NXGE_CLASS_FLOW_USE_PORTNUM | NXGE_CLASS_FLOW_USE_L2DA |
2513c1f9c6e5SSantwona Behera NXGE_CLASS_FLOW_USE_VLAN | NXGE_CLASS_FLOW_USE_PROTO |
2514c1f9c6e5SSantwona Behera NXGE_CLASS_FLOW_USE_IPSRC | NXGE_CLASS_FLOW_USE_IPDST |
2515c1f9c6e5SSantwona Behera NXGE_CLASS_FLOW_USE_SRC_PORT | NXGE_CLASS_FLOW_USE_DST_PORT);
2516c1f9c6e5SSantwona Behera
25171bd6825cSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL,
25181bd6825cSml29623 "nxge_param_get_ip_opt_get %x ", cfg_value));
25191bd6825cSml29623
25201bd6825cSml29623 pa->value = cfg_value;
25211bd6825cSml29623
25221bd6825cSml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_ip_opt status "));
25231bd6825cSml29623 return (0);
25241bd6825cSml29623 }
2525