13859Sml29623 /* 23859Sml29623 * CDDL HEADER START 33859Sml29623 * 43859Sml29623 * The contents of this file are subject to the terms of the 53859Sml29623 * Common Development and Distribution License (the "License"). 63859Sml29623 * You may not use this file except in compliance with the License. 73859Sml29623 * 83859Sml29623 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 93859Sml29623 * or http://www.opensolaris.org/os/licensing. 103859Sml29623 * See the License for the specific language governing permissions 113859Sml29623 * and limitations under the License. 123859Sml29623 * 133859Sml29623 * When distributing Covered Code, include this CDDL HEADER in each 143859Sml29623 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 153859Sml29623 * If applicable, add the following below this CDDL HEADER, with the 163859Sml29623 * fields enclosed by brackets "[]" replaced with your own identifying 173859Sml29623 * information: Portions Copyright [yyyy] [name of copyright owner] 183859Sml29623 * 193859Sml29623 * CDDL HEADER END 203859Sml29623 */ 213859Sml29623 /* 22*8661SSantwona.Behera@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 233859Sml29623 * Use is subject to license terms. 243859Sml29623 */ 253859Sml29623 263859Sml29623 #include <sys/nxge/nxge_impl.h> 276495Sspeer #include <sys/nxge/nxge_hio.h> 286495Sspeer 293859Sml29623 #include <inet/common.h> 303859Sml29623 #include <inet/mi.h> 313859Sml29623 #include <inet/nd.h> 323859Sml29623 333859Sml29623 extern uint64_t npi_debug_level; 343859Sml29623 353859Sml29623 #define NXGE_PARAM_MAC_RW \ 363859Sml29623 NXGE_PARAM_RW | NXGE_PARAM_MAC | \ 373859Sml29623 NXGE_PARAM_NDD_WR_OK | NXGE_PARAM_READ_PROP 383859Sml29623 393859Sml29623 #define NXGE_PARAM_MAC_DONT_SHOW \ 403859Sml29623 NXGE_PARAM_RW | NXGE_PARAM_MAC | NXGE_PARAM_DONT_SHOW 413859Sml29623 423859Sml29623 #define NXGE_PARAM_RXDMA_RW \ 433859Sml29623 NXGE_PARAM_RWP | NXGE_PARAM_RXDMA | NXGE_PARAM_NDD_WR_OK | \ 443859Sml29623 NXGE_PARAM_READ_PROP 453859Sml29623 463859Sml29623 #define NXGE_PARAM_RXDMA_RWC \ 473859Sml29623 NXGE_PARAM_RWP | NXGE_PARAM_RXDMA | NXGE_PARAM_INIT_ONLY | \ 483859Sml29623 NXGE_PARAM_READ_PROP 493859Sml29623 503859Sml29623 #define NXGE_PARAM_L2CLASS_CFG \ 513859Sml29623 NXGE_PARAM_RW | NXGE_PARAM_PROP_ARR32 | NXGE_PARAM_READ_PROP | \ 523859Sml29623 NXGE_PARAM_NDD_WR_OK 533859Sml29623 543859Sml29623 #define NXGE_PARAM_CLASS_RWS \ 553859Sml29623 NXGE_PARAM_RWS | NXGE_PARAM_READ_PROP 563859Sml29623 573859Sml29623 #define NXGE_PARAM_ARRAY_INIT_SIZE 0x20ULL 583859Sml29623 593859Sml29623 #define SET_RX_INTR_TIME_DISABLE 0 603859Sml29623 #define SET_RX_INTR_TIME_ENABLE 1 613859Sml29623 #define SET_RX_INTR_PKTS 2 623859Sml29623 633859Sml29623 #define BASE_ANY 0 643859Sml29623 #define BASE_BINARY 2 653859Sml29623 #define BASE_HEX 16 663859Sml29623 #define BASE_DECIMAL 10 673859Sml29623 #define ALL_FF_64 0xFFFFFFFFFFFFFFFFULL 683859Sml29623 #define ALL_FF_32 0xFFFFFFFFUL 693859Sml29623 703859Sml29623 #define NXGE_NDD_INFODUMP_BUFF_SIZE 2048 /* is 2k enough? */ 713859Sml29623 #define NXGE_NDD_INFODUMP_BUFF_8K 8192 723859Sml29623 #define NXGE_NDD_INFODUMP_BUFF_16K 0x2000 733859Sml29623 #define NXGE_NDD_INFODUMP_BUFF_64K 0x8000 743859Sml29623 753859Sml29623 #define PARAM_OUTOF_RANGE(vptr, eptr, rval, pa) \ 763859Sml29623 ((vptr == eptr) || (rval < pa->minimum) || (rval > pa->maximum)) 773859Sml29623 783859Sml29623 #define ADVANCE_PRINT_BUFFER(pmp, plen, rlen) { \ 793859Sml29623 ((mblk_t *)pmp)->b_wptr += plen; \ 803859Sml29623 rlen -= plen; \ 813859Sml29623 } 823859Sml29623 836512Ssowmini int nxge_param_set_mac(p_nxge_t, queue_t *, 843859Sml29623 mblk_t *, char *, caddr_t); 853859Sml29623 static int nxge_param_set_port_rdc(p_nxge_t, queue_t *, 863859Sml29623 mblk_t *, char *, caddr_t); 873859Sml29623 static int nxge_param_set_grp_rdc(p_nxge_t, queue_t *, 883859Sml29623 mblk_t *, char *, caddr_t); 893859Sml29623 static int nxge_param_set_ether_usr(p_nxge_t, 903859Sml29623 queue_t *, mblk_t *, char *, caddr_t); 913859Sml29623 static int nxge_param_set_ip_usr(p_nxge_t, 923859Sml29623 queue_t *, mblk_t *, char *, caddr_t); 933859Sml29623 static int nxge_param_set_vlan_rdcgrp(p_nxge_t, 943859Sml29623 queue_t *, mblk_t *, char *, caddr_t); 953859Sml29623 static int nxge_param_set_mac_rdcgrp(p_nxge_t, 963859Sml29623 queue_t *, mblk_t *, char *, caddr_t); 973859Sml29623 static int nxge_param_fflp_hash_init(p_nxge_t, 983859Sml29623 queue_t *, mblk_t *, char *, caddr_t); 993859Sml29623 static int nxge_param_llc_snap_enable(p_nxge_t, queue_t *, 1003859Sml29623 mblk_t *, char *, caddr_t); 1013859Sml29623 static int nxge_param_hash_lookup_enable(p_nxge_t, queue_t *, 1023859Sml29623 mblk_t *, char *, caddr_t); 1033859Sml29623 static int nxge_param_tcam_enable(p_nxge_t, queue_t *, 1043859Sml29623 mblk_t *, char *, caddr_t); 1054185Sspeer static int nxge_param_get_fw_ver(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1064977Sraghus static int nxge_param_get_port_mode(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1073859Sml29623 static int nxge_param_get_rxdma_info(p_nxge_t, queue_t *q, 1083859Sml29623 p_mblk_t, caddr_t); 1093859Sml29623 static int nxge_param_get_txdma_info(p_nxge_t, queue_t *q, 1103859Sml29623 p_mblk_t, caddr_t); 1113859Sml29623 static int nxge_param_get_vlan_rdcgrp(p_nxge_t, queue_t *, 1123859Sml29623 p_mblk_t, caddr_t); 1133859Sml29623 static int nxge_param_get_mac_rdcgrp(p_nxge_t, queue_t *, 1143859Sml29623 p_mblk_t, caddr_t); 1153859Sml29623 static int nxge_param_get_rxdma_rdcgrp_info(p_nxge_t, queue_t *, 1163859Sml29623 p_mblk_t, caddr_t); 1173859Sml29623 static int nxge_param_get_ip_opt(p_nxge_t, queue_t *, mblk_t *, caddr_t); 1183859Sml29623 static int nxge_param_get_mac(p_nxge_t, queue_t *q, p_mblk_t, caddr_t); 1193859Sml29623 static int nxge_param_get_debug_flag(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1203859Sml29623 static int nxge_param_set_nxge_debug_flag(p_nxge_t, queue_t *, mblk_t *, 1213859Sml29623 char *, caddr_t); 1223859Sml29623 static int nxge_param_set_npi_debug_flag(p_nxge_t, 1233859Sml29623 queue_t *, mblk_t *, char *, caddr_t); 1243859Sml29623 static int nxge_param_dump_rdc(p_nxge_t, queue_t *q, p_mblk_t, caddr_t); 1253859Sml29623 static int nxge_param_dump_tdc(p_nxge_t, queue_t *q, p_mblk_t, caddr_t); 1263859Sml29623 static int nxge_param_dump_mac_regs(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1273859Sml29623 static int nxge_param_dump_ipp_regs(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1283859Sml29623 static int nxge_param_dump_fflp_regs(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1293859Sml29623 static int nxge_param_dump_vlan_table(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1303859Sml29623 static int nxge_param_dump_rdc_table(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1313859Sml29623 static int nxge_param_dump_ptrs(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1326439Sml29623 static void nxge_param_sync(p_nxge_t); 1333859Sml29623 1343859Sml29623 /* 1353859Sml29623 * Global array of Neptune changable parameters. 1363859Sml29623 * This array is initialized to correspond to the default 1373859Sml29623 * Neptune 4 port configuration. This array would be copied 1383859Sml29623 * into each port's parameter structure and modifed per 1393859Sml29623 * fcode and nxge.conf configuration. Later, the parameters are 1403859Sml29623 * exported to ndd to display and run-time configuration (at least 1413859Sml29623 * some of them). 1423859Sml29623 * 1436835Syc148097 * Parameters with DONT_SHOW are not shown by ndd. 1446835Syc148097 * 1453859Sml29623 */ 1463859Sml29623 1473859Sml29623 static nxge_param_t nxge_param_arr[] = { 1483859Sml29623 /* 1493859Sml29623 * min max value old hw-name conf-name 1503859Sml29623 */ 1514439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1523859Sml29623 0, 999, 1000, 0, "instance", "instance"}, 1533859Sml29623 1544439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1553859Sml29623 0, 999, 1000, 0, "main-instance", "main_instance"}, 1563859Sml29623 1573859Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ, 1583859Sml29623 0, 3, 0, 0, "function-number", "function_number"}, 1593859Sml29623 1603859Sml29623 /* Partition Id */ 1614439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1623859Sml29623 0, 8, 0, 0, "partition-id", "partition_id"}, 1633859Sml29623 1643859Sml29623 /* Read Write Permission Mode */ 1654439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1663859Sml29623 0, 2, 0, 0, "read-write-mode", "read_write_mode"}, 1673859Sml29623 1684185Sspeer { nxge_param_get_fw_ver, NULL, NXGE_PARAM_READ, 1694185Sspeer 0, 32, 0, 0, "version", "fw_version"}, 1704185Sspeer 1714977Sraghus { nxge_param_get_port_mode, NULL, NXGE_PARAM_READ, 1724977Sraghus 0, 32, 0, 0, "port-mode", "port_mode"}, 1734977Sraghus 1743859Sml29623 /* hw cfg types */ 1753859Sml29623 /* control the DMA config of Neptune/NIU */ 1764439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1773859Sml29623 CFG_DEFAULT, CFG_CUSTOM, CFG_DEFAULT, CFG_DEFAULT, 1783859Sml29623 "niu-cfg-type", "niu_cfg_type"}, 1793859Sml29623 1803859Sml29623 /* control the TXDMA config of the Port controlled by tx-quick-cfg */ 1814439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1823859Sml29623 CFG_DEFAULT, CFG_CUSTOM, CFG_NOT_SPECIFIED, CFG_DEFAULT, 1833859Sml29623 "tx-qcfg-type", "tx_qcfg_type"}, 1843859Sml29623 1853859Sml29623 /* control the RXDMA config of the Port controlled by rx-quick-cfg */ 1864439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1873859Sml29623 CFG_DEFAULT, CFG_CUSTOM, CFG_NOT_SPECIFIED, CFG_DEFAULT, 1883859Sml29623 "rx-qcfg-type", "rx_qcfg_type"}, 1893859Sml29623 1903859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, 1913859Sml29623 NXGE_PARAM_RW | NXGE_PARAM_DONT_SHOW, 1923859Sml29623 0, 1, 0, 0, "master-cfg-enable", "master_cfg_enable"}, 1933859Sml29623 1943859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, 1954439Sml29623 NXGE_PARAM_DONT_SHOW, 1963859Sml29623 0, 1, 0, 0, "master-cfg-value", "master_cfg_value"}, 1973859Sml29623 1983859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 1993859Sml29623 0, 1, 1, 1, "adv-autoneg-cap", "adv_autoneg_cap"}, 2003859Sml29623 2013859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 2023859Sml29623 0, 1, 1, 1, "adv-10gfdx-cap", "adv_10gfdx_cap"}, 2033859Sml29623 2043859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW, 2053859Sml29623 0, 1, 0, 0, "adv-10ghdx-cap", "adv_10ghdx_cap"}, 2063859Sml29623 2073859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 2083859Sml29623 0, 1, 1, 1, "adv-1000fdx-cap", "adv_1000fdx_cap"}, 2093859Sml29623 2103859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW, 2113859Sml29623 0, 1, 0, 0, "adv-1000hdx-cap", "adv_1000hdx_cap"}, 2123859Sml29623 2133859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW, 2143859Sml29623 0, 1, 0, 0, "adv-100T4-cap", "adv_100T4_cap"}, 2153859Sml29623 2163859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 2173859Sml29623 0, 1, 1, 1, "adv-100fdx-cap", "adv_100fdx_cap"}, 2183859Sml29623 2193859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW, 2203859Sml29623 0, 1, 0, 0, "adv-100hdx-cap", "adv_100hdx_cap"}, 2213859Sml29623 2223859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 2233859Sml29623 0, 1, 1, 1, "adv-10fdx-cap", "adv_10fdx_cap"}, 2243859Sml29623 2253859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW, 2263859Sml29623 0, 1, 0, 0, "adv-10hdx-cap", "adv_10hdx_cap"}, 2273859Sml29623 2284439Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW, 2293859Sml29623 0, 1, 0, 0, "adv-asmpause-cap", "adv_asmpause_cap"}, 2303859Sml29623 2313859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 2323859Sml29623 0, 1, 0, 0, "adv-pause-cap", "adv_pause_cap"}, 2333859Sml29623 2344439Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW, 2353859Sml29623 0, 1, 0, 0, "use-int-xcvr", "use_int_xcvr"}, 2363859Sml29623 2374439Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW, 2383859Sml29623 0, 1, 1, 1, "enable-ipg0", "enable_ipg0"}, 2393859Sml29623 2404439Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW, 2413859Sml29623 0, 255, 8, 8, "ipg0", "ipg0"}, 2423859Sml29623 2434439Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW, 2443859Sml29623 0, 255, 8, 8, "ipg1", "ipg1"}, 2453859Sml29623 2464439Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW, 2473859Sml29623 0, 255, 4, 4, "ipg2", "ipg2"}, 2483859Sml29623 2493859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 2503859Sml29623 0, 1, 0, 0, "accept-jumbo", "accept_jumbo"}, 2513859Sml29623 2523859Sml29623 /* Transmit DMA channels */ 2534439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | 2544439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2553859Sml29623 0, 3, 0, 0, "tx-dma-weight", "tx_dma_weight"}, 2563859Sml29623 2574439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | 2584439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2593859Sml29623 0, 31, 0, 0, "tx-dma-channels-begin", "tx_dma_channels_begin"}, 2603859Sml29623 2614439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | 2624439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2633859Sml29623 0, 32, 0, 0, "tx-dma-channels", "tx_dma_channels"}, 2643859Sml29623 { nxge_param_get_txdma_info, NULL, 2654439Sml29623 NXGE_PARAM_READ | NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2663859Sml29623 0, 32, 0, 0, "tx-dma-info", "tx_dma_info"}, 2673859Sml29623 2683859Sml29623 /* Receive DMA channels */ 2693859Sml29623 { nxge_param_get_generic, NULL, 2704439Sml29623 NXGE_PARAM_READ | NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2713859Sml29623 0, 31, 0, 0, "rx-dma-channels-begin", "rx_dma_channels_begin"}, 2723859Sml29623 2734439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | 2744439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2753859Sml29623 0, 32, 0, 0, "rx-dma-channels", "rx_dma_channels"}, 2763859Sml29623 2774439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | 2784439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2793859Sml29623 0, 65535, PT_DRR_WT_DEFAULT_10G, 0, 2803859Sml29623 "rx-drr-weight", "rx_drr_weight"}, 2813859Sml29623 2824439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | 2834439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2843859Sml29623 0, 1, 1, 0, "rx-full-header", "rx_full_header"}, 2853859Sml29623 2864439Sml29623 { nxge_param_get_rxdma_info, NULL, NXGE_PARAM_READ | 2874439Sml29623 NXGE_PARAM_DONT_SHOW, 2883859Sml29623 0, 32, 0, 0, "rx-dma-info", "rx_dma_info"}, 2893859Sml29623 2903859Sml29623 { nxge_param_get_rxdma_info, NULL, 2913859Sml29623 NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 2923859Sml29623 NXGE_RBR_RBB_MIN, NXGE_RBR_RBB_MAX, NXGE_RBR_RBB_DEFAULT, 0, 2933859Sml29623 "rx-rbr-size", "rx_rbr_size"}, 2943859Sml29623 2953859Sml29623 { nxge_param_get_rxdma_info, NULL, 2963859Sml29623 NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 2973859Sml29623 NXGE_RCR_MIN, NXGE_RCR_MAX, NXGE_RCR_DEFAULT, 0, 2983859Sml29623 "rx-rcr-size", "rx_rcr_size"}, 2993859Sml29623 3004439Sml29623 { nxge_param_get_generic, nxge_param_set_port_rdc, 3014439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3023859Sml29623 0, 15, 0, 0, "default-port-rdc", "default_port_rdc"}, 3033859Sml29623 3043859Sml29623 { nxge_param_get_generic, nxge_param_rx_intr_time, NXGE_PARAM_RXDMA_RW, 3053859Sml29623 NXGE_RDC_RCR_TIMEOUT_MIN, NXGE_RDC_RCR_TIMEOUT_MAX, 306*8661SSantwona.Behera@Sun.COM NXGE_RDC_RCR_TIMEOUT, 0, "rxdma-intr-time", "rxdma_intr_time"}, 3073859Sml29623 3083859Sml29623 { nxge_param_get_generic, nxge_param_rx_intr_pkts, NXGE_PARAM_RXDMA_RW, 3093859Sml29623 NXGE_RDC_RCR_THRESHOLD_MIN, NXGE_RDC_RCR_THRESHOLD_MAX, 310*8661SSantwona.Behera@Sun.COM NXGE_RDC_RCR_THRESHOLD, 0, 3113859Sml29623 "rxdma-intr-pkts", "rxdma_intr_pkts"}, 3123859Sml29623 3134439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ_PROP | 3144439Sml29623 NXGE_PARAM_DONT_SHOW, 3153859Sml29623 0, 8, 0, 0, "rx-rdc-grps-begin", "rx_rdc_grps_begin"}, 3163859Sml29623 3174439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ_PROP | 3184439Sml29623 NXGE_PARAM_DONT_SHOW, 3193859Sml29623 0, 8, 0, 0, "rx-rdc-grps", "rx_rdc_grps"}, 3203859Sml29623 3214439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3224439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3233859Sml29623 0, 15, 0, 0, "default-grp0-rdc", "default_grp0_rdc"}, 3243859Sml29623 3254439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3264439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3273859Sml29623 0, 15, 2, 0, "default-grp1-rdc", "default_grp1_rdc"}, 3283859Sml29623 3294439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3304439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3313859Sml29623 0, 15, 4, 0, "default-grp2-rdc", "default_grp2_rdc"}, 3323859Sml29623 3334439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3344439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3353859Sml29623 0, 15, 6, 0, "default-grp3-rdc", "default_grp3_rdc"}, 3363859Sml29623 3374439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3384439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3393859Sml29623 0, 15, 8, 0, "default-grp4-rdc", "default_grp4_rdc"}, 3403859Sml29623 3414439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3424439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3433859Sml29623 0, 15, 10, 0, "default-grp5-rdc", "default_grp5_rdc"}, 3443859Sml29623 3454439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3464439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3473859Sml29623 0, 15, 12, 0, "default-grp6-rdc", "default_grp6_rdc"}, 3483859Sml29623 3494439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3504439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3513859Sml29623 0, 15, 14, 0, "default-grp7-rdc", "default_grp7_rdc"}, 3523859Sml29623 3533859Sml29623 { nxge_param_get_rxdma_rdcgrp_info, NULL, 3544439Sml29623 NXGE_PARAM_READ | NXGE_PARAM_CMPLX | NXGE_PARAM_DONT_SHOW, 3553859Sml29623 0, 8, 0, 0, "rdc-groups-info", "rdc_groups_info"}, 3563859Sml29623 3573859Sml29623 /* Logical device groups */ 3584439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 3593859Sml29623 0, 63, 0, 0, "start-ldg", "start_ldg"}, 3603859Sml29623 3614439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 3623859Sml29623 0, 64, 0, 0, "max-ldg", "max_ldg" }, 3633859Sml29623 3643859Sml29623 /* MAC table information */ 3653859Sml29623 { nxge_param_get_mac_rdcgrp, nxge_param_set_mac_rdcgrp, 3664439Sml29623 NXGE_PARAM_L2CLASS_CFG | NXGE_PARAM_DONT_SHOW, 3673859Sml29623 0, 31, 0, 0, "mac-2rdc-grp", "mac_2rdc_grp"}, 3683859Sml29623 3693859Sml29623 /* VLAN table information */ 3703859Sml29623 { nxge_param_get_vlan_rdcgrp, nxge_param_set_vlan_rdcgrp, 3714439Sml29623 NXGE_PARAM_L2CLASS_CFG | NXGE_PARAM_DONT_SHOW, 3723859Sml29623 0, 31, 0, 0, "vlan-2rdc-grp", "vlan_2rdc_grp"}, 3733859Sml29623 3743859Sml29623 { nxge_param_get_generic, NULL, 3754439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_READ | 3764439Sml29623 NXGE_PARAM_PROP_ARR32 | NXGE_PARAM_DONT_SHOW, 3773859Sml29623 0, 0x0ffff, 0x0ffff, 0, "fcram-part-cfg", "fcram_part_cfg"}, 3783859Sml29623 3794439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_CLASS_RWS | 3804439Sml29623 NXGE_PARAM_DONT_SHOW, 3813859Sml29623 0, 0x10, 0xa, 0, "fcram-access-ratio", "fcram_access_ratio"}, 3823859Sml29623 3834439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_CLASS_RWS | 3844439Sml29623 NXGE_PARAM_DONT_SHOW, 3853859Sml29623 0, 0x10, 0xa, 0, "tcam-access-ratio", "tcam_access_ratio"}, 3863859Sml29623 3873859Sml29623 { nxge_param_get_generic, nxge_param_tcam_enable, 3884439Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 3893859Sml29623 0, 0x1, 0x0, 0, "tcam-enable", "tcam_enable"}, 3903859Sml29623 3913859Sml29623 { nxge_param_get_generic, nxge_param_hash_lookup_enable, 3924439Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 3933859Sml29623 0, 0x01, 0x0, 0, "hash-lookup-enable", "hash_lookup_enable"}, 3943859Sml29623 3953859Sml29623 { nxge_param_get_generic, nxge_param_llc_snap_enable, 3964439Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 3973859Sml29623 0, 0x01, 0x01, 0, "llc-snap-enable", "llc_snap_enable"}, 3983859Sml29623 3993859Sml29623 { nxge_param_get_generic, nxge_param_fflp_hash_init, 4004439Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4013859Sml29623 0, ALL_FF_32, ALL_FF_32, 0, "h1-init-value", "h1_init_value"}, 4023859Sml29623 4033859Sml29623 { nxge_param_get_generic, nxge_param_fflp_hash_init, 4044439Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4053859Sml29623 0, 0x0ffff, 0x0ffff, 0, "h2-init-value", "h2_init_value"}, 4063859Sml29623 4073859Sml29623 { nxge_param_get_generic, nxge_param_set_ether_usr, 4083859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4093859Sml29623 0, ALL_FF_32, 0x0, 0, 4103859Sml29623 "class-cfg-ether-usr1", "class_cfg_ether_usr1"}, 4113859Sml29623 4123859Sml29623 { nxge_param_get_generic, nxge_param_set_ether_usr, 4133859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4143859Sml29623 0, ALL_FF_32, 0x0, 0, 4153859Sml29623 "class-cfg-ether-usr2", "class_cfg_ether_usr2"}, 4163859Sml29623 4173859Sml29623 { nxge_param_get_generic, nxge_param_set_ip_usr, 4183859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4193859Sml29623 0, ALL_FF_32, 0x0, 0, 4203859Sml29623 "class-cfg-ip-usr4", "class_cfg_ip_usr4"}, 4213859Sml29623 4223859Sml29623 { nxge_param_get_generic, nxge_param_set_ip_usr, 4233859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4243859Sml29623 0, ALL_FF_32, 0x0, 0, 4253859Sml29623 "class-cfg-ip-usr5", "class_cfg_ip_usr5"}, 4263859Sml29623 4273859Sml29623 { nxge_param_get_generic, nxge_param_set_ip_usr, 4283859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4293859Sml29623 0, ALL_FF_32, 0x0, 0, 4303859Sml29623 "class-cfg-ip-usr6", "class_cfg_ip_usr6"}, 4313859Sml29623 4323859Sml29623 { nxge_param_get_generic, nxge_param_set_ip_usr, 4333859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4343859Sml29623 0, ALL_FF_32, 0x0, 0, 4353859Sml29623 "class-cfg-ip-usr7", "class_cfg_ip_usr7"}, 4363859Sml29623 4373859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4383859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4393859Sml29623 0, ALL_FF_32, 0x0, 0, 4403859Sml29623 "class-opt-ip-usr4", "class_opt_ip_usr4"}, 4413859Sml29623 4423859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4433859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4443859Sml29623 0, ALL_FF_32, 0x0, 0, 4453859Sml29623 "class-opt-ip-usr5", "class_opt_ip_usr5"}, 4463859Sml29623 4473859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4483859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4493859Sml29623 0, ALL_FF_32, 0x0, 0, 4503859Sml29623 "class-opt-ip-usr6", "class_opt_ip_usr6"}, 4513859Sml29623 4523859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4533859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4543859Sml29623 0, ALL_FF_32, 0x0, 0, 4553859Sml29623 "class-opt-ip-usr7", "class_opt_ip_usr7"}, 4563859Sml29623 4573859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4583859Sml29623 NXGE_PARAM_CLASS_RWS, 4593859Sml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0, 4603859Sml29623 "class-opt-ipv4-tcp", "class_opt_ipv4_tcp"}, 4613859Sml29623 4623859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4633859Sml29623 NXGE_PARAM_CLASS_RWS, 4643859Sml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0, 4653859Sml29623 "class-opt-ipv4-udp", "class_opt_ipv4_udp"}, 4663859Sml29623 4673859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4683859Sml29623 NXGE_PARAM_CLASS_RWS, 4693859Sml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0, 4703859Sml29623 "class-opt-ipv4-ah", "class_opt_ipv4_ah"}, 4713859Sml29623 4723859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4733859Sml29623 NXGE_PARAM_CLASS_RWS, 4743859Sml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0, 4753859Sml29623 "class-opt-ipv4-sctp", "class_opt_ipv4_sctp"}, 4763859Sml29623 4773859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, NXGE_PARAM_CLASS_RWS, 4783859Sml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0, 4793859Sml29623 "class-opt-ipv6-tcp", "class_opt_ipv6_tcp"}, 4803859Sml29623 4813859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, NXGE_PARAM_CLASS_RWS, 4823859Sml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0, 4833859Sml29623 "class-opt-ipv6-udp", "class_opt_ipv6_udp"}, 4843859Sml29623 4853859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, NXGE_PARAM_CLASS_RWS, 4863859Sml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0, 4873859Sml29623 "class-opt-ipv6-ah", "class_opt_ipv6_ah"}, 4883859Sml29623 4893859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, NXGE_PARAM_CLASS_RWS, 4903859Sml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0, 4913859Sml29623 "class-opt-ipv6-sctp", "class_opt_ipv6_sctp"}, 4923859Sml29623 4933859Sml29623 { nxge_param_get_debug_flag, nxge_param_set_nxge_debug_flag, 4944439Sml29623 NXGE_PARAM_RW | NXGE_PARAM_DONT_SHOW, 4953859Sml29623 0ULL, ALL_FF_64, 0ULL, 0ULL, 4963859Sml29623 "nxge-debug-flag", "nxge_debug_flag"}, 4973859Sml29623 4983859Sml29623 { nxge_param_get_debug_flag, nxge_param_set_npi_debug_flag, 4994439Sml29623 NXGE_PARAM_RW | NXGE_PARAM_DONT_SHOW, 5003859Sml29623 0ULL, ALL_FF_64, 0ULL, 0ULL, 5013859Sml29623 "npi-debug-flag", "npi_debug_flag"}, 5023859Sml29623 5034439Sml29623 { nxge_param_dump_tdc, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 5043859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-tdc", "dump_tdc"}, 5053859Sml29623 5064439Sml29623 { nxge_param_dump_rdc, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 5073859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-rdc", "dump_rdc"}, 5083859Sml29623 5094439Sml29623 { nxge_param_dump_mac_regs, NULL, NXGE_PARAM_READ | 5104439Sml29623 NXGE_PARAM_DONT_SHOW, 5113859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-mac-regs", "dump_mac_regs"}, 5123859Sml29623 5134439Sml29623 { nxge_param_dump_ipp_regs, NULL, NXGE_PARAM_READ | 5144439Sml29623 NXGE_PARAM_DONT_SHOW, 5153859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-ipp-regs", "dump_ipp_regs"}, 5163859Sml29623 5174439Sml29623 { nxge_param_dump_fflp_regs, NULL, NXGE_PARAM_READ | 5184439Sml29623 NXGE_PARAM_DONT_SHOW, 5193859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, 5203859Sml29623 "dump-fflp-regs", "dump_fflp_regs"}, 5213859Sml29623 5224439Sml29623 { nxge_param_dump_vlan_table, NULL, NXGE_PARAM_READ | 5234439Sml29623 NXGE_PARAM_DONT_SHOW, 5243859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, 5253859Sml29623 "dump-vlan-table", "dump_vlan_table"}, 5263859Sml29623 5274439Sml29623 { nxge_param_dump_rdc_table, NULL, NXGE_PARAM_READ | 5284439Sml29623 NXGE_PARAM_DONT_SHOW, 5293859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, 5303859Sml29623 "dump-rdc-table", "dump_rdc_table"}, 5313859Sml29623 5324439Sml29623 { nxge_param_dump_ptrs, NULL, NXGE_PARAM_READ | 5334439Sml29623 NXGE_PARAM_DONT_SHOW, 5343859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-ptrs", "dump_ptrs"}, 5353859Sml29623 5363859Sml29623 { NULL, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 5373859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, "end", "end"}, 5383859Sml29623 }; 5393859Sml29623 5403859Sml29623 extern void *nxge_list; 5413859Sml29623 5423859Sml29623 void 5433859Sml29623 nxge_get_param_soft_properties(p_nxge_t nxgep) 5443859Sml29623 { 5453859Sml29623 5463859Sml29623 p_nxge_param_t param_arr; 5473859Sml29623 uint_t prop_len; 5483859Sml29623 int i, j; 5493859Sml29623 uint32_t param_count; 5503859Sml29623 uint32_t *int_prop_val; 5513859Sml29623 5523859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, " ==> nxge_get_param_soft_properties")); 5533859Sml29623 5543859Sml29623 param_arr = nxgep->param_arr; 5553859Sml29623 param_count = nxgep->param_count; 5563859Sml29623 for (i = 0; i < param_count; i++) { 5573859Sml29623 if ((param_arr[i].type & NXGE_PARAM_READ_PROP) == 0) 5583859Sml29623 continue; 5593859Sml29623 if ((param_arr[i].type & NXGE_PARAM_PROP_STR)) 5603859Sml29623 continue; 5613859Sml29623 if ((param_arr[i].type & NXGE_PARAM_PROP_ARR32) || 5626512Ssowmini (param_arr[i].type & NXGE_PARAM_PROP_ARR64)) { 5633859Sml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, 5646512Ssowmini nxgep->dip, 0, param_arr[i].fcode_name, 5656512Ssowmini (int **)&int_prop_val, 5666512Ssowmini (uint_t *)&prop_len) 5676512Ssowmini == DDI_PROP_SUCCESS) { 5683859Sml29623 uint32_t *cfg_value; 5693859Sml29623 uint64_t prop_count; 5703859Sml29623 5713859Sml29623 if (prop_len > NXGE_PARAM_ARRAY_INIT_SIZE) 5723859Sml29623 prop_len = NXGE_PARAM_ARRAY_INIT_SIZE; 5735125Sjoycey #if defined(__i386) 5745125Sjoycey cfg_value = 5756512Ssowmini (uint32_t *)(int32_t)param_arr[i].value; 5765125Sjoycey #else 5773859Sml29623 cfg_value = (uint32_t *)param_arr[i].value; 5785125Sjoycey #endif 5793859Sml29623 for (j = 0; j < prop_len; j++) { 5803859Sml29623 cfg_value[j] = int_prop_val[j]; 5813859Sml29623 } 5823859Sml29623 prop_count = prop_len; 5833859Sml29623 param_arr[i].type |= 5843859Sml29623 (prop_count << NXGE_PARAM_ARRAY_CNT_SHIFT); 5853859Sml29623 ddi_prop_free(int_prop_val); 5863859Sml29623 } 5873859Sml29623 continue; 5883859Sml29623 } 5893859Sml29623 5903859Sml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0, 5916512Ssowmini param_arr[i].fcode_name, 5926512Ssowmini (int **)&int_prop_val, 5936512Ssowmini &prop_len) == DDI_PROP_SUCCESS) { 5943859Sml29623 if ((*int_prop_val >= param_arr[i].minimum) && 5956512Ssowmini (*int_prop_val <= param_arr[i].maximum)) 5963859Sml29623 param_arr[i].value = *int_prop_val; 5973859Sml29623 #ifdef NXGE_DEBUG_ERROR 5983859Sml29623 else { 5993859Sml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL, 6006512Ssowmini "nxge%d: 'prom' file parameter error\n", 6016512Ssowmini nxgep->instance)); 6023859Sml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL, 6036512Ssowmini "Parameter keyword '%s'" 6046512Ssowmini " is outside valid range\n", 6056512Ssowmini param_arr[i].name)); 6063859Sml29623 } 6073859Sml29623 #endif 6083859Sml29623 ddi_prop_free(int_prop_val); 6093859Sml29623 } 6103859Sml29623 6113859Sml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0, 6126512Ssowmini param_arr[i].name, 6136512Ssowmini (int **)&int_prop_val, 6146512Ssowmini &prop_len) == DDI_PROP_SUCCESS) { 6153859Sml29623 if ((*int_prop_val >= param_arr[i].minimum) && 6166512Ssowmini (*int_prop_val <= param_arr[i].maximum)) 6173859Sml29623 param_arr[i].value = *int_prop_val; 6183859Sml29623 #ifdef NXGE_DEBUG_ERROR 6193859Sml29623 else { 6203859Sml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL, 6216512Ssowmini "nxge%d: 'conf' file parameter error\n", 6226512Ssowmini nxgep->instance)); 6233859Sml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL, 6246512Ssowmini "Parameter keyword '%s'" 6256512Ssowmini "is outside valid range\n", 6266512Ssowmini param_arr[i].name)); 6273859Sml29623 } 6283859Sml29623 #endif 6293859Sml29623 ddi_prop_free(int_prop_val); 6303859Sml29623 } 6313859Sml29623 } 6323859Sml29623 } 6333859Sml29623 6343859Sml29623 static int 6353859Sml29623 nxge_private_param_register(p_nxge_t nxgep, p_nxge_param_t param_arr) 6363859Sml29623 { 6373859Sml29623 int status = B_TRUE; 6383859Sml29623 int channel; 6393859Sml29623 uint8_t grp; 6403859Sml29623 char *prop_name; 6413859Sml29623 char *end; 6423859Sml29623 uint32_t name_chars; 6433859Sml29623 6443859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL, 6456512Ssowmini "nxge_private_param_register %s", param_arr->name)); 6463859Sml29623 6473859Sml29623 if ((param_arr->type & NXGE_PARAM_PRIV) != NXGE_PARAM_PRIV) 6483859Sml29623 return (B_TRUE); 6493859Sml29623 6503859Sml29623 prop_name = param_arr->name; 6513859Sml29623 if (param_arr->type & NXGE_PARAM_RXDMA) { 6523859Sml29623 if (strncmp("rxdma_intr", prop_name, 10) == 0) 6533859Sml29623 return (B_TRUE); 6543859Sml29623 name_chars = strlen("default_grp"); 6553859Sml29623 if (strncmp("default_grp", prop_name, name_chars) == 0) { 6563859Sml29623 prop_name += name_chars; 6573859Sml29623 grp = mi_strtol(prop_name, &end, 10); 6583859Sml29623 /* now check if this rdcgrp is in config */ 6593859Sml29623 return (nxge_check_rdcgrp_port_member(nxgep, grp)); 6603859Sml29623 } 6613859Sml29623 name_chars = strlen(prop_name); 6623859Sml29623 if (strncmp("default_port_rdc", prop_name, name_chars) == 0) { 6633859Sml29623 return (B_TRUE); 6643859Sml29623 } 6653859Sml29623 return (B_FALSE); 6663859Sml29623 } 6673859Sml29623 6683859Sml29623 if (param_arr->type & NXGE_PARAM_TXDMA) { 6693859Sml29623 name_chars = strlen("txdma"); 6703859Sml29623 if (strncmp("txdma", prop_name, name_chars) == 0) { 6713859Sml29623 prop_name += name_chars; 6723859Sml29623 channel = mi_strtol(prop_name, &end, 10); 6733859Sml29623 /* now check if this rdc is in config */ 6743859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL, 6756512Ssowmini " nxge_private_param_register: %d", 6766512Ssowmini channel)); 6773859Sml29623 return (nxge_check_txdma_port_member(nxgep, channel)); 6783859Sml29623 } 6793859Sml29623 return (B_FALSE); 6803859Sml29623 } 6813859Sml29623 6823859Sml29623 status = B_FALSE; 6833859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL, "<== nxge_private_param_register")); 6843859Sml29623 6853859Sml29623 return (status); 6863859Sml29623 } 6873859Sml29623 6883859Sml29623 void 6893859Sml29623 nxge_setup_param(p_nxge_t nxgep) 6903859Sml29623 { 6913859Sml29623 p_nxge_param_t param_arr; 6923859Sml29623 int i; 6933859Sml29623 pfi_t set_pfi; 6943859Sml29623 6953859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_setup_param")); 6963859Sml29623 6973859Sml29623 /* 6983859Sml29623 * Make sure the param_instance is set to a valid device instance. 6993859Sml29623 */ 7003859Sml29623 if (nxge_param_arr[param_instance].value == 1000) 7013859Sml29623 nxge_param_arr[param_instance].value = nxgep->instance; 7023859Sml29623 7033859Sml29623 param_arr = nxgep->param_arr; 7043859Sml29623 param_arr[param_instance].value = nxgep->instance; 7053859Sml29623 param_arr[param_function_number].value = nxgep->function_num; 7063859Sml29623 7073859Sml29623 for (i = 0; i < nxgep->param_count; i++) { 7083859Sml29623 if ((param_arr[i].type & NXGE_PARAM_PRIV) && 7096512Ssowmini (nxge_private_param_register(nxgep, 7106512Ssowmini ¶m_arr[i]) == B_FALSE)) { 7113859Sml29623 param_arr[i].setf = NULL; 7123859Sml29623 param_arr[i].getf = NULL; 7133859Sml29623 } 7143859Sml29623 7153859Sml29623 if (param_arr[i].type & NXGE_PARAM_CMPLX) 7163859Sml29623 param_arr[i].setf = NULL; 7173859Sml29623 7183859Sml29623 if (param_arr[i].type & NXGE_PARAM_DONT_SHOW) { 7193859Sml29623 param_arr[i].setf = NULL; 7203859Sml29623 param_arr[i].getf = NULL; 7213859Sml29623 } 7223859Sml29623 7233859Sml29623 set_pfi = (pfi_t)param_arr[i].setf; 7243859Sml29623 7253859Sml29623 if ((set_pfi) && (param_arr[i].type & NXGE_PARAM_INIT_ONLY)) { 7263859Sml29623 set_pfi = NULL; 7273859Sml29623 } 7283859Sml29623 7293859Sml29623 } 7303859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_setup_param")); 7313859Sml29623 } 7323859Sml29623 7333859Sml29623 void 7343859Sml29623 nxge_init_param(p_nxge_t nxgep) 7353859Sml29623 { 7363859Sml29623 p_nxge_param_t param_arr; 7373859Sml29623 int i, alloc_size; 7383859Sml29623 uint64_t alloc_count; 7393859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "==> nxge_init_param")); 7403859Sml29623 /* 7413859Sml29623 * Make sure the param_instance is set to a valid device instance. 7423859Sml29623 */ 7433859Sml29623 if (nxge_param_arr[param_instance].value == 1000) 7443859Sml29623 nxge_param_arr[param_instance].value = nxgep->instance; 7453859Sml29623 7463859Sml29623 param_arr = nxgep->param_arr; 7473859Sml29623 if (param_arr == NULL) { 7483859Sml29623 param_arr = (p_nxge_param_t) 7496512Ssowmini KMEM_ZALLOC(sizeof (nxge_param_arr), KM_SLEEP); 7503859Sml29623 } 7513859Sml29623 7523859Sml29623 for (i = 0; i < sizeof (nxge_param_arr)/sizeof (nxge_param_t); i++) { 7533859Sml29623 param_arr[i] = nxge_param_arr[i]; 7543859Sml29623 if ((param_arr[i].type & NXGE_PARAM_PROP_ARR32) || 7556512Ssowmini (param_arr[i].type & NXGE_PARAM_PROP_ARR64)) { 7563859Sml29623 alloc_count = NXGE_PARAM_ARRAY_INIT_SIZE; 7573859Sml29623 alloc_size = alloc_count * sizeof (uint64_t); 7583859Sml29623 param_arr[i].value = 7595125Sjoycey #if defined(__i386) 7606512Ssowmini (uint64_t)(uint32_t)KMEM_ZALLOC(alloc_size, 7616512Ssowmini KM_SLEEP); 7625125Sjoycey #else 7636439Sml29623 (uint64_t)KMEM_ZALLOC(alloc_size, KM_SLEEP); 7645125Sjoycey #endif 7653859Sml29623 param_arr[i].old_value = 7665125Sjoycey #if defined(__i386) 7676512Ssowmini (uint64_t)(uint32_t)KMEM_ZALLOC(alloc_size, 7686512Ssowmini KM_SLEEP); 7695125Sjoycey #else 7706512Ssowmini (uint64_t)KMEM_ZALLOC(alloc_size, KM_SLEEP); 7715125Sjoycey #endif 7723859Sml29623 param_arr[i].type |= 7736512Ssowmini (alloc_count << NXGE_PARAM_ARRAY_ALLOC_SHIFT); 7743859Sml29623 } 7753859Sml29623 } 7763859Sml29623 7773859Sml29623 nxgep->param_arr = param_arr; 7783859Sml29623 nxgep->param_count = sizeof (nxge_param_arr)/sizeof (nxge_param_t); 7796439Sml29623 7806439Sml29623 nxge_param_sync(nxgep); 7816439Sml29623 7823859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "<== nxge_init_param: count %d", 7836512Ssowmini nxgep->param_count)); 7843859Sml29623 } 7853859Sml29623 7863859Sml29623 void 7873859Sml29623 nxge_destroy_param(p_nxge_t nxgep) 7883859Sml29623 { 7893859Sml29623 int i; 7903859Sml29623 uint64_t free_size, free_count; 7913859Sml29623 7923859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "==> nxge_destroy_param")); 7933859Sml29623 7944732Sdavemq if (nxgep->param_arr == NULL) 7954732Sdavemq return; 7963859Sml29623 /* 7973859Sml29623 * Make sure the param_instance is set to a valid device instance. 7983859Sml29623 */ 7993859Sml29623 if (nxge_param_arr[param_instance].value == nxgep->instance) { 8003859Sml29623 for (i = 0; i <= nxge_param_arr[param_instance].maximum; i++) { 8013859Sml29623 if ((ddi_get_soft_state(nxge_list, i) != NULL) && 8026512Ssowmini (i != nxgep->instance)) 8033859Sml29623 break; 8043859Sml29623 } 8053859Sml29623 nxge_param_arr[param_instance].value = i; 8063859Sml29623 } 8073859Sml29623 8083859Sml29623 for (i = 0; i < nxgep->param_count; i++) 8093859Sml29623 if ((nxgep->param_arr[i].type & NXGE_PARAM_PROP_ARR32) || 8106512Ssowmini (nxgep->param_arr[i].type & NXGE_PARAM_PROP_ARR64)) { 8113859Sml29623 free_count = ((nxgep->param_arr[i].type & 8126512Ssowmini NXGE_PARAM_ARRAY_ALLOC_MASK) >> 8136512Ssowmini NXGE_PARAM_ARRAY_ALLOC_SHIFT); 8143859Sml29623 free_count = NXGE_PARAM_ARRAY_INIT_SIZE; 8153859Sml29623 free_size = sizeof (uint64_t) * free_count; 8165125Sjoycey #if defined(__i386) 8175125Sjoycey KMEM_FREE((void *)(uint32_t)nxgep->param_arr[i].value, 8186512Ssowmini free_size); 8195125Sjoycey #else 8203859Sml29623 KMEM_FREE((void *)nxgep->param_arr[i].value, free_size); 8215125Sjoycey #endif 8225125Sjoycey #if defined(__i386) 8235125Sjoycey KMEM_FREE((void *)(uint32_t) 8246512Ssowmini nxgep->param_arr[i].old_value, free_size); 8255125Sjoycey #else 8263859Sml29623 KMEM_FREE((void *)nxgep->param_arr[i].old_value, 8276512Ssowmini free_size); 8285125Sjoycey #endif 8293859Sml29623 } 8303859Sml29623 8313859Sml29623 KMEM_FREE(nxgep->param_arr, sizeof (nxge_param_arr)); 8323859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "<== nxge_destroy_param")); 8333859Sml29623 } 8343859Sml29623 8353859Sml29623 /* 8363859Sml29623 * Extracts the value from the 'nxge' parameter array and prints the 8373859Sml29623 * parameter value. cp points to the required parameter. 8383859Sml29623 */ 8393859Sml29623 8403859Sml29623 /* ARGSUSED */ 8413859Sml29623 int 8423859Sml29623 nxge_param_get_generic(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 8433859Sml29623 { 8443859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 8453859Sml29623 8463859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 8476512Ssowmini "==> nxge_param_get_generic name %s ", pa->name)); 8483859Sml29623 8493859Sml29623 if (pa->value > 0xffffffff) 8503859Sml29623 (void) mi_mpprintf(mp, "%x%x", 8516512Ssowmini (int)(pa->value >> 32), (int)(pa->value & 0xffffffff)); 8523859Sml29623 else 8533859Sml29623 (void) mi_mpprintf(mp, "%x", (int)pa->value); 8543859Sml29623 8553859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_generic")); 8563859Sml29623 return (0); 8573859Sml29623 } 8583859Sml29623 8593859Sml29623 /* ARGSUSED */ 8603859Sml29623 static int 8613859Sml29623 nxge_param_get_mac(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 8623859Sml29623 { 8633859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 8643859Sml29623 8653859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_mac")); 8663859Sml29623 8673859Sml29623 (void) mi_mpprintf(mp, "%d", (uint32_t)pa->value); 8683859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_mac")); 8693859Sml29623 return (0); 8703859Sml29623 } 8713859Sml29623 8723859Sml29623 /* ARGSUSED */ 8734185Sspeer static int 8744185Sspeer nxge_param_get_fw_ver(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 8754185Sspeer { 8764185Sspeer NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_fw_ver")); 8774185Sspeer 8784185Sspeer (void) mi_mpprintf(mp, "Firmware version for nxge%d: %s\n", 8794185Sspeer nxgep->instance, nxgep->vpd_info.ver); 8804185Sspeer 8814185Sspeer NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_fw_ver")); 8824185Sspeer return (0); 8834185Sspeer } 8844185Sspeer 8854185Sspeer /* ARGSUSED */ 8864977Sraghus static int 8874977Sraghus nxge_param_get_port_mode(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 8884977Sraghus { 8894977Sraghus NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_port_mode")); 8904977Sraghus 8914977Sraghus switch (nxgep->mac.portmode) { 8924977Sraghus case PORT_1G_COPPER: 8935572Ssbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: 1G Copper %s\n", 8945572Ssbehera nxgep->instance, 8955572Ssbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : ""); 8964977Sraghus break; 8974977Sraghus case PORT_1G_FIBER: 8985572Ssbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: 1G Fiber %s\n", 8995572Ssbehera nxgep->instance, 9005572Ssbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : ""); 9014977Sraghus break; 9024977Sraghus case PORT_10G_COPPER: 9035572Ssbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: 10G Copper " 9045572Ssbehera "%s\n", nxgep->instance, 9055572Ssbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : ""); 9064977Sraghus break; 9074977Sraghus case PORT_10G_FIBER: 9085572Ssbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: 10G Fiber %s\n", 9095572Ssbehera nxgep->instance, 9105572Ssbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : ""); 9114977Sraghus break; 9124977Sraghus case PORT_10G_SERDES: 9135572Ssbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: 10G Serdes " 9145572Ssbehera "%s\n", nxgep->instance, 9155572Ssbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : ""); 9164977Sraghus break; 9174977Sraghus case PORT_1G_SERDES: 9185572Ssbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: 1G Serdes %s\n", 9195572Ssbehera nxgep->instance, 9205572Ssbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : ""); 9214977Sraghus break; 9224977Sraghus case PORT_1G_RGMII_FIBER: 9234977Sraghus (void) mi_mpprintf(mp, "Port mode for nxge%d: 1G RGMII " 9245572Ssbehera "Fiber %s\n", nxgep->instance, 9255572Ssbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : ""); 9265572Ssbehera break; 9275572Ssbehera case PORT_HSP_MODE: 9285572Ssbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: Hot Swappable " 9295572Ssbehera "PHY, Currently NOT present\n", nxgep->instance); 9304977Sraghus break; 9316835Syc148097 case PORT_10G_TN1010: 9326835Syc148097 (void) mi_mpprintf(mp, "Port mode for nxge%d:" 9336835Syc148097 " 10G Copper with TN1010 %s\n", nxgep->instance, 9346835Syc148097 nxgep->hot_swappable_phy ? "[Hot Swappable]" : ""); 9356835Syc148097 break; 9366835Syc148097 case PORT_1G_TN1010: 9376837Syc148097 (void) mi_mpprintf(mp, "Port mode for nxge%d:" 9386835Syc148097 " 1G Copper with TN1010 %s\n", nxgep->instance, 9396835Syc148097 nxgep->hot_swappable_phy ? "[Hot Swappable]" : ""); 9406835Syc148097 break; 9414977Sraghus default: 9425572Ssbehera (void) mi_mpprintf(mp, "Port mode for nxge%d: Unknown %s\n", 9435572Ssbehera nxgep->instance, 9445572Ssbehera nxgep->hot_swappable_phy ? "[Hot Swappable]" : ""); 9454977Sraghus break; 9464977Sraghus } 9474977Sraghus 9486003Sml29623 (void) mi_mpprintf(mp, "Software LSO for nxge%d: %s\n", 9496003Sml29623 nxgep->instance, 9506003Sml29623 nxgep->soft_lso_enable ? "enable" : "disable"); 9516003Sml29623 9524977Sraghus NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_port_mode")); 9534977Sraghus return (0); 9544977Sraghus } 9554977Sraghus 9564977Sraghus /* ARGSUSED */ 9573859Sml29623 int 9583859Sml29623 nxge_param_get_txdma_info(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 9593859Sml29623 { 9603859Sml29623 9616495Sspeer uint_t print_len, buf_len; 9623859Sml29623 p_mblk_t np; 9633859Sml29623 9643859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE; 9656495Sspeer int tdc; 9666495Sspeer 9676495Sspeer nxge_grp_set_t *set; 9686495Sspeer 9693859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_txdma_info")); 9703859Sml29623 9713859Sml29623 (void) mi_mpprintf(mp, "TXDMA Information for Port\t %d \n", 9726512Ssowmini nxgep->function_num); 9733859Sml29623 9743859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 9753859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 9763859Sml29623 return (0); 9773859Sml29623 } 9783859Sml29623 9793859Sml29623 buf_len = buff_alloc_size; 9803859Sml29623 mp->b_cont = np; 9816495Sspeer print_len = 0; 9823859Sml29623 9833859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 9846512Ssowmini "TDC\t HW TDC\t\n"); 9853859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 9863859Sml29623 buf_len -= print_len; 9876495Sspeer 9886495Sspeer set = &nxgep->tx_set; 9898275SEric Cheng for (tdc = 0; tdc < NXGE_MAX_TDCS; tdc++) { 9906495Sspeer if ((1 << tdc) & set->owned.map) { 9916495Sspeer print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 9926495Sspeer buf_len, "%d\n", tdc); 9936495Sspeer ((mblk_t *)np)->b_wptr += print_len; 9946495Sspeer buf_len -= print_len; 9956495Sspeer } 9963859Sml29623 } 9973859Sml29623 9983859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_txdma_info")); 9993859Sml29623 return (0); 10003859Sml29623 } 10013859Sml29623 10023859Sml29623 /* ARGSUSED */ 10033859Sml29623 int 10043859Sml29623 nxge_param_get_rxdma_info(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 10053859Sml29623 { 10063859Sml29623 uint_t print_len, buf_len; 10073859Sml29623 p_mblk_t np; 10083859Sml29623 int rdc; 10093859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 10103859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 10113859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE; 10123859Sml29623 p_rx_rcr_rings_t rx_rcr_rings; 10133859Sml29623 p_rx_rcr_ring_t *rcr_rings; 10143859Sml29623 p_rx_rbr_rings_t rx_rbr_rings; 10153859Sml29623 p_rx_rbr_ring_t *rbr_rings; 10166495Sspeer nxge_grp_set_t *set; 10173859Sml29623 10183859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_rxdma_info")); 10193859Sml29623 10203859Sml29623 (void) mi_mpprintf(mp, "RXDMA Information for Port\t %d \n", 10216512Ssowmini nxgep->function_num); 10223859Sml29623 10233859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 10243859Sml29623 /* The following may work even if we cannot get a large buf. */ 10253859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 10263859Sml29623 return (0); 10273859Sml29623 } 10283859Sml29623 10293859Sml29623 buf_len = buff_alloc_size; 10303859Sml29623 mp->b_cont = np; 10313859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 10323859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 10333859Sml29623 10343859Sml29623 rx_rcr_rings = nxgep->rx_rcr_rings; 10353859Sml29623 rcr_rings = rx_rcr_rings->rcr_rings; 10363859Sml29623 rx_rbr_rings = nxgep->rx_rbr_rings; 10373859Sml29623 rbr_rings = rx_rbr_rings->rbr_rings; 10383859Sml29623 10393859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 10406512Ssowmini "Total RDCs\t %d\n", p_cfgp->max_rdcs); 10413859Sml29623 10423859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 10433859Sml29623 buf_len -= print_len; 10443859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 10456512Ssowmini "RDC\t HW RDC\t Timeout\t Packets RBR ptr \t" 10466512Ssowmini "chunks\t RCR ptr\n"); 10473859Sml29623 10483859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 10493859Sml29623 buf_len -= print_len; 10506495Sspeer 10516495Sspeer set = &nxgep->rx_set; 10526495Sspeer for (rdc = 0; rdc < NXGE_MAX_RDCS; rdc++) { 10536495Sspeer if ((1 << rdc) & set->owned.map) { 10546495Sspeer print_len = snprintf((char *) 10556495Sspeer ((mblk_t *)np)->b_wptr, buf_len, 10566495Sspeer " %d\t %x\t\t %x\t $%p\t 0x%x\t $%p\n", 10576495Sspeer rdc, 10586495Sspeer p_dma_cfgp->rcr_timeout[rdc], 10596495Sspeer p_dma_cfgp->rcr_threshold[rdc], 10607632SNick.Todd@Sun.COM (void *)rbr_rings[rdc], 10617632SNick.Todd@Sun.COM rbr_rings[rdc]->num_blocks, (void *)rcr_rings[rdc]); 10623859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 10633859Sml29623 buf_len -= print_len; 10646495Sspeer } 10653859Sml29623 } 10663859Sml29623 10673859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_rxdma_info")); 10683859Sml29623 return (0); 10693859Sml29623 } 10703859Sml29623 10713859Sml29623 /* ARGSUSED */ 10723859Sml29623 int 10733859Sml29623 nxge_param_get_rxdma_rdcgrp_info(p_nxge_t nxgep, queue_t *q, 10743859Sml29623 p_mblk_t mp, caddr_t cp) 10753859Sml29623 { 10763859Sml29623 uint_t print_len, buf_len; 10773859Sml29623 p_mblk_t np; 10783859Sml29623 int offset, rdc, i, rdc_grp; 10793859Sml29623 p_nxge_rdc_grp_t rdc_grp_p; 10803859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 10813859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 10823859Sml29623 10833859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE; 10843859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 10856512Ssowmini "==> nxge_param_get_rxdma_rdcgrp_info")); 10863859Sml29623 10873859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 10883859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 10893859Sml29623 10903859Sml29623 (void) mi_mpprintf(mp, "RXDMA RDC Group Information for Port\t %d \n", 10916512Ssowmini nxgep->function_num); 10923859Sml29623 10936495Sspeer rdc_grp = p_cfgp->def_mac_rxdma_grpid; 10943859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 10953859Sml29623 /* The following may work even if we cannot get a large buf. */ 10963859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 10973859Sml29623 return (0); 10983859Sml29623 } 10993859Sml29623 11003859Sml29623 buf_len = buff_alloc_size; 11013859Sml29623 mp->b_cont = np; 11023859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 11036512Ssowmini "Total RDC Groups\t %d \n" 11046512Ssowmini "default RDC group\t %d\n", 11056512Ssowmini p_cfgp->max_rdc_grpids, 11066512Ssowmini p_cfgp->def_mac_rxdma_grpid); 11073859Sml29623 11083859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 11093859Sml29623 buf_len -= print_len; 11103859Sml29623 1111*8661SSantwona.Behera@Sun.COM for (i = 0; i < NXGE_MAX_RDC_GROUPS; i++) { 11126495Sspeer if (p_cfgp->grpids[i]) { 11136495Sspeer rdc_grp_p = &p_dma_cfgp->rdc_grps[i]; 11146495Sspeer print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 11156495Sspeer buf_len, 11166495Sspeer "\nRDC Group Info for Group [%d] %d\n" 11176495Sspeer "RDC Count %d\tstart RDC %d\n" 11186495Sspeer "RDC Group Population Information" 11196495Sspeer " (offsets 0 - 15)\n", 11206495Sspeer i, rdc_grp, rdc_grp_p->max_rdcs, 11216495Sspeer rdc_grp_p->start_rdc); 11226495Sspeer 11236495Sspeer ((mblk_t *)np)->b_wptr += print_len; 11246495Sspeer buf_len -= print_len; 11253859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 11266495Sspeer buf_len, "\n"); 11276495Sspeer ((mblk_t *)np)->b_wptr += print_len; 11286495Sspeer buf_len -= print_len; 11296495Sspeer 11306495Sspeer for (rdc = 0; rdc < rdc_grp_p->max_rdcs; rdc++) { 11316495Sspeer print_len = snprintf( 11326512Ssowmini (char *)((mblk_t *)np)->b_wptr, 11336512Ssowmini buf_len, "[%d]=%d ", rdc, 11346512Ssowmini rdc_grp_p->start_rdc + rdc); 11356495Sspeer ((mblk_t *)np)->b_wptr += print_len; 11366495Sspeer buf_len -= print_len; 11376495Sspeer } 11386495Sspeer print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 11396495Sspeer buf_len, "\n"); 11406495Sspeer ((mblk_t *)np)->b_wptr += print_len; 11416495Sspeer buf_len -= print_len; 11426495Sspeer 11436495Sspeer for (offset = 0; offset < 16; offset++) { 11446495Sspeer print_len = snprintf( 11456512Ssowmini (char *)((mblk_t *)np)->b_wptr, 11466512Ssowmini buf_len, " %c", 11476512Ssowmini rdc_grp_p->map & (1 << offset) ? 11486512Ssowmini '1' : '0'); 11496495Sspeer ((mblk_t *)np)->b_wptr += print_len; 11506495Sspeer buf_len -= print_len; 11516495Sspeer } 11526495Sspeer print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 11536495Sspeer buf_len, "\n"); 11543859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 11553859Sml29623 buf_len -= print_len; 11563859Sml29623 } 11573859Sml29623 } 11583859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 11596512Ssowmini "<== nxge_param_get_rxdma_rdcgrp_info")); 11603859Sml29623 return (0); 11613859Sml29623 } 11623859Sml29623 11633859Sml29623 int 11643859Sml29623 nxge_mk_mblk_tail_space(p_mblk_t mp, p_mblk_t *nmp, size_t size) 11653859Sml29623 { 11663859Sml29623 p_mblk_t tmp; 11673859Sml29623 11683859Sml29623 tmp = mp; 11693859Sml29623 while (tmp->b_cont) 11703859Sml29623 tmp = tmp->b_cont; 11713859Sml29623 if ((tmp->b_wptr + size) >= tmp->b_datap->db_lim) { 11723859Sml29623 tmp->b_cont = allocb(1024, BPRI_HI); 11733859Sml29623 tmp = tmp->b_cont; 11743859Sml29623 if (!tmp) 11753859Sml29623 return (ENOMEM); 11763859Sml29623 } 11773859Sml29623 11783859Sml29623 *nmp = tmp; 11793859Sml29623 return (0); 11803859Sml29623 } 11813859Sml29623 11823859Sml29623 11833859Sml29623 /* ARGSUSED */ 11843859Sml29623 int 11853859Sml29623 nxge_param_set_generic(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 11863859Sml29623 char *value, caddr_t cp) 11873859Sml29623 { 11883859Sml29623 char *end; 11893859Sml29623 uint32_t new_value; 11903859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 11913859Sml29623 11923859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, " ==> nxge_param_set_generic")); 11933859Sml29623 new_value = (uint32_t)mi_strtol(value, &end, 10); 11943859Sml29623 if (end == value || new_value < pa->minimum || 11956512Ssowmini new_value > pa->maximum) { 11963859Sml29623 return (EINVAL); 11973859Sml29623 } 11983859Sml29623 pa->value = new_value; 11993859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, " <== nxge_param_set_generic")); 12003859Sml29623 return (0); 12013859Sml29623 } 12023859Sml29623 12033859Sml29623 12043859Sml29623 /* ARGSUSED */ 12053859Sml29623 int 12063859Sml29623 nxge_param_set_instance(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 12073859Sml29623 char *value, caddr_t cp) 12083859Sml29623 { 12093859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " ==> nxge_param_set_instance")); 12103859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_set_instance")); 12113859Sml29623 return (0); 12123859Sml29623 } 12133859Sml29623 12143859Sml29623 12153859Sml29623 /* ARGSUSED */ 12163859Sml29623 int 12173859Sml29623 nxge_param_set_mac(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 12183859Sml29623 char *value, caddr_t cp) 12193859Sml29623 { 12203859Sml29623 char *end; 12213859Sml29623 uint32_t new_value; 12223859Sml29623 int status = 0; 12233859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 12243859Sml29623 12253859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_mac")); 12263859Sml29623 new_value = (uint32_t)mi_strtol(value, &end, BASE_DECIMAL); 12273859Sml29623 if (PARAM_OUTOF_RANGE(value, end, new_value, pa)) { 12283859Sml29623 return (EINVAL); 12293859Sml29623 } 12303859Sml29623 12313859Sml29623 if (pa->value != new_value) { 12323859Sml29623 pa->old_value = pa->value; 12333859Sml29623 pa->value = new_value; 12343859Sml29623 } 12353859Sml29623 12363859Sml29623 if (!nxge_param_link_update(nxgep)) { 12373859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 12386512Ssowmini " false ret from nxge_param_link_update")); 12393859Sml29623 status = EINVAL; 12403859Sml29623 } 12413859Sml29623 12423859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_mac")); 12433859Sml29623 return (status); 12443859Sml29623 } 12453859Sml29623 12463859Sml29623 /* ARGSUSED */ 12476439Sml29623 int 12483859Sml29623 nxge_param_rx_intr_pkts(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 12493859Sml29623 char *value, caddr_t cp) 12503859Sml29623 { 12513859Sml29623 char *end; 12523859Sml29623 uint32_t cfg_value; 12533859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 12543859Sml29623 12553859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_rx_intr_pkts")); 12563859Sml29623 12573859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY); 12583859Sml29623 12593859Sml29623 if ((cfg_value > NXGE_RDC_RCR_THRESHOLD_MAX) || 12606512Ssowmini (cfg_value < NXGE_RDC_RCR_THRESHOLD_MIN)) { 12613859Sml29623 return (EINVAL); 12623859Sml29623 } 12633859Sml29623 12643859Sml29623 if ((pa->value != cfg_value)) { 12653859Sml29623 pa->old_value = pa->value; 12663859Sml29623 pa->value = cfg_value; 12673859Sml29623 nxgep->intr_threshold = pa->value; 12683859Sml29623 } 12693859Sml29623 12703859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_rx_intr_pkts")); 12713859Sml29623 return (0); 12723859Sml29623 } 12733859Sml29623 12743859Sml29623 /* ARGSUSED */ 12756439Sml29623 int 12763859Sml29623 nxge_param_rx_intr_time(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 12773859Sml29623 char *value, caddr_t cp) 12783859Sml29623 { 12793859Sml29623 char *end; 12803859Sml29623 uint32_t cfg_value; 12813859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 12823859Sml29623 12833859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_rx_intr_time")); 12843859Sml29623 12853859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY); 12863859Sml29623 12873859Sml29623 if ((cfg_value > NXGE_RDC_RCR_TIMEOUT_MAX) || 12886512Ssowmini (cfg_value < NXGE_RDC_RCR_TIMEOUT_MIN)) { 12893859Sml29623 return (EINVAL); 12903859Sml29623 } 12913859Sml29623 12923859Sml29623 if ((pa->value != cfg_value)) { 12933859Sml29623 pa->old_value = pa->value; 12943859Sml29623 pa->value = cfg_value; 12953859Sml29623 nxgep->intr_timeout = pa->value; 12963859Sml29623 } 12973859Sml29623 12983859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_rx_intr_time")); 12993859Sml29623 return (0); 13003859Sml29623 } 13013859Sml29623 13023859Sml29623 /* ARGSUSED */ 13033859Sml29623 static int 13043859Sml29623 nxge_param_set_mac_rdcgrp(p_nxge_t nxgep, queue_t *q, 13053859Sml29623 mblk_t *mp, char *value, caddr_t cp) 13063859Sml29623 { 13073859Sml29623 char *end; 13083859Sml29623 uint32_t status = 0, cfg_value; 13093859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 13103859Sml29623 uint32_t cfg_it = B_FALSE; 13113859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 13123859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 13133859Sml29623 uint32_t *val_ptr, *old_val_ptr; 13143859Sml29623 nxge_param_map_t *mac_map; 13153859Sml29623 p_nxge_class_pt_cfg_t p_class_cfgp; 13163859Sml29623 nxge_mv_cfg_t *mac_host_info; 13173859Sml29623 13183859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_mac_rdcgrp ")); 13193859Sml29623 13203859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 13213859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 13223859Sml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config; 13233859Sml29623 mac_host_info = (nxge_mv_cfg_t *)&p_class_cfgp->mac_host_info[0]; 13243859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 13253859Sml29623 13263859Sml29623 /* 13273859Sml29623 * now do decoding 13283859Sml29623 */ 13293859Sml29623 mac_map = (nxge_param_map_t *)&cfg_value; 13303859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " cfg_value %x id %x map_to %x", 13316512Ssowmini cfg_value, mac_map->param_id, mac_map->map_to)); 13323859Sml29623 13333859Sml29623 if ((mac_map->param_id < p_cfgp->max_macs) && 13346495Sspeer p_cfgp->grpids[mac_map->map_to]) { 13353859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 13366495Sspeer " nxge_param_set_mac_rdcgrp mapping" 13376495Sspeer " id %d grp %d", mac_map->param_id, mac_map->map_to)); 13385125Sjoycey #if defined(__i386) 13395125Sjoycey val_ptr = (uint32_t *)(uint32_t)pa->value; 13405125Sjoycey #else 13413859Sml29623 val_ptr = (uint32_t *)pa->value; 13425125Sjoycey #endif 13435125Sjoycey #if defined(__i386) 13445125Sjoycey old_val_ptr = (uint32_t *)(uint32_t)pa->old_value; 13455125Sjoycey #else 13463859Sml29623 old_val_ptr = (uint32_t *)pa->old_value; 13475125Sjoycey #endif 13483859Sml29623 if (val_ptr[mac_map->param_id] != cfg_value) { 13493859Sml29623 old_val_ptr[mac_map->param_id] = 13506495Sspeer val_ptr[mac_map->param_id]; 13513859Sml29623 val_ptr[mac_map->param_id] = cfg_value; 13523859Sml29623 mac_host_info[mac_map->param_id].mpr_npr = 13536495Sspeer mac_map->pref; 13543859Sml29623 mac_host_info[mac_map->param_id].flag = 1; 13553859Sml29623 mac_host_info[mac_map->param_id].rdctbl = 13566495Sspeer mac_map->map_to; 13573859Sml29623 cfg_it = B_TRUE; 13583859Sml29623 } 13593859Sml29623 } else { 13603859Sml29623 return (EINVAL); 13613859Sml29623 } 13623859Sml29623 13633859Sml29623 if (cfg_it == B_TRUE) { 13643859Sml29623 status = nxge_logical_mac_assign_rdc_table(nxgep, 13656495Sspeer (uint8_t)mac_map->param_id); 13663859Sml29623 if (status != NXGE_OK) 13673859Sml29623 return (EINVAL); 13683859Sml29623 } 13693859Sml29623 13703859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_mac_rdcgrp")); 13713859Sml29623 return (0); 13723859Sml29623 } 13733859Sml29623 13743859Sml29623 /* ARGSUSED */ 13753859Sml29623 static int 13763859Sml29623 nxge_param_set_vlan_rdcgrp(p_nxge_t nxgep, queue_t *q, 13773859Sml29623 mblk_t *mp, char *value, caddr_t cp) 13783859Sml29623 { 13793859Sml29623 char *end; 13803859Sml29623 uint32_t status = 0, cfg_value; 13813859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 13823859Sml29623 uint32_t cfg_it = B_FALSE; 13833859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 13843859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 13853859Sml29623 uint32_t *val_ptr, *old_val_ptr; 13863859Sml29623 nxge_param_map_t *vmap, *old_map; 13873859Sml29623 p_nxge_class_pt_cfg_t p_class_cfgp; 13883859Sml29623 uint64_t cfgd_vlans; 13893859Sml29623 int i, inc = 0, cfg_position; 13903859Sml29623 nxge_mv_cfg_t *vlan_tbl; 13913859Sml29623 13923859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_vlan_rdcgrp ")); 13933859Sml29623 13943859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 13953859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 13963859Sml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config; 13973859Sml29623 vlan_tbl = (nxge_mv_cfg_t *)&p_class_cfgp->vlan_tbl[0]; 13983859Sml29623 13993859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 14003859Sml29623 14013859Sml29623 /* now do decoding */ 14023859Sml29623 cfgd_vlans = ((pa->type & NXGE_PARAM_ARRAY_CNT_MASK) >> 14036512Ssowmini NXGE_PARAM_ARRAY_CNT_SHIFT); 14043859Sml29623 14053859Sml29623 if (cfgd_vlans == NXGE_PARAM_ARRAY_INIT_SIZE) { 14063859Sml29623 /* 14073859Sml29623 * for now, we process only upto max 14083859Sml29623 * NXGE_PARAM_ARRAY_INIT_SIZE parameters 14093859Sml29623 * In the future, we may want to expand 14103859Sml29623 * the storage array and continue 14113859Sml29623 */ 14123859Sml29623 return (EINVAL); 14133859Sml29623 } 14143859Sml29623 14153859Sml29623 vmap = (nxge_param_map_t *)&cfg_value; 14163859Sml29623 if ((vmap->param_id) && 14176512Ssowmini (vmap->param_id < NXGE_MAX_VLANS) && 14186512Ssowmini (vmap->map_to < p_cfgp->max_rdc_grpids)) { 14193859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 14206512Ssowmini "nxge_param_set_vlan_rdcgrp mapping" 14216512Ssowmini " id %d grp %d", 14226512Ssowmini vmap->param_id, vmap->map_to)); 14235125Sjoycey #if defined(__i386) 14245125Sjoycey val_ptr = (uint32_t *)(uint32_t)pa->value; 14255125Sjoycey #else 14263859Sml29623 val_ptr = (uint32_t *)pa->value; 14275125Sjoycey #endif 14285125Sjoycey #if defined(__i386) 14295125Sjoycey old_val_ptr = (uint32_t *)(uint32_t)pa->old_value; 14305125Sjoycey #else 14313859Sml29623 old_val_ptr = (uint32_t *)pa->old_value; 14325125Sjoycey #endif 14333859Sml29623 14343859Sml29623 /* search to see if this vlan id is already configured */ 14353859Sml29623 for (i = 0; i < cfgd_vlans; i++) { 14363859Sml29623 old_map = (nxge_param_map_t *)&val_ptr[i]; 14373859Sml29623 if ((old_map->param_id == 0) || 14386512Ssowmini (vmap->param_id == old_map->param_id) || 14396512Ssowmini (vlan_tbl[vmap->param_id].flag)) { 14403859Sml29623 cfg_position = i; 14413859Sml29623 break; 14423859Sml29623 } 14433859Sml29623 } 14443859Sml29623 14453859Sml29623 if (cfgd_vlans == 0) { 14463859Sml29623 cfg_position = 0; 14473859Sml29623 inc++; 14483859Sml29623 } 14493859Sml29623 14503859Sml29623 if (i == cfgd_vlans) { 14513859Sml29623 cfg_position = i; 14523859Sml29623 inc++; 14533859Sml29623 } 14543859Sml29623 14553859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL, 14566512Ssowmini "set_vlan_rdcgrp mapping" 14576512Ssowmini " i %d cfgd_vlans %llx position %d ", 14586512Ssowmini i, cfgd_vlans, cfg_position)); 14593859Sml29623 if (val_ptr[cfg_position] != cfg_value) { 14603859Sml29623 old_val_ptr[cfg_position] = val_ptr[cfg_position]; 14613859Sml29623 val_ptr[cfg_position] = cfg_value; 14623859Sml29623 vlan_tbl[vmap->param_id].mpr_npr = vmap->pref; 14633859Sml29623 vlan_tbl[vmap->param_id].flag = 1; 14643859Sml29623 vlan_tbl[vmap->param_id].rdctbl = 14656495Sspeer vmap->map_to + p_cfgp->def_mac_rxdma_grpid; 14663859Sml29623 cfg_it = B_TRUE; 14673859Sml29623 if (inc) { 14683859Sml29623 cfgd_vlans++; 14693859Sml29623 pa->type &= ~NXGE_PARAM_ARRAY_CNT_MASK; 14703859Sml29623 pa->type |= (cfgd_vlans << 14716512Ssowmini NXGE_PARAM_ARRAY_CNT_SHIFT); 14723859Sml29623 14733859Sml29623 } 14743859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL, 14756512Ssowmini "after: param_set_vlan_rdcgrp " 14766512Ssowmini " cfg_vlans %llx position %d \n", 14776512Ssowmini cfgd_vlans, cfg_position)); 14783859Sml29623 } 14793859Sml29623 } else { 14803859Sml29623 return (EINVAL); 14813859Sml29623 } 14823859Sml29623 14833859Sml29623 if (cfg_it == B_TRUE) { 14843859Sml29623 status = nxge_fflp_config_vlan_table(nxgep, 14856512Ssowmini (uint16_t)vmap->param_id); 14863859Sml29623 if (status != NXGE_OK) 14873859Sml29623 return (EINVAL); 14883859Sml29623 } 14893859Sml29623 14903859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_vlan_rdcgrp")); 14913859Sml29623 return (0); 14923859Sml29623 } 14933859Sml29623 14943859Sml29623 /* ARGSUSED */ 14953859Sml29623 static int 14963859Sml29623 nxge_param_get_vlan_rdcgrp(p_nxge_t nxgep, queue_t *q, 14973859Sml29623 mblk_t *mp, caddr_t cp) 14983859Sml29623 { 14993859Sml29623 15003859Sml29623 uint_t print_len, buf_len; 15013859Sml29623 p_mblk_t np; 15023859Sml29623 int i; 15033859Sml29623 uint32_t *val_ptr; 15043859Sml29623 nxge_param_map_t *vmap; 15053859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 15063859Sml29623 p_nxge_class_pt_cfg_t p_class_cfgp; 15073859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 15083859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 15093859Sml29623 uint64_t cfgd_vlans = 0; 15103859Sml29623 nxge_mv_cfg_t *vlan_tbl; 15113859Sml29623 int buff_alloc_size = 15126512Ssowmini NXGE_NDD_INFODUMP_BUFF_SIZE * 32; 15133859Sml29623 15143859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_vlan_rdcgrp ")); 15153859Sml29623 (void) mi_mpprintf(mp, "VLAN RDC Mapping Information for Port\t %d \n", 15166512Ssowmini nxgep->function_num); 15173859Sml29623 15183859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 15193859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 15203859Sml29623 return (0); 15213859Sml29623 } 15223859Sml29623 15233859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 15243859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 15253859Sml29623 15263859Sml29623 buf_len = buff_alloc_size; 15273859Sml29623 mp->b_cont = np; 15283859Sml29623 cfgd_vlans = (pa->type & NXGE_PARAM_ARRAY_CNT_MASK) >> 15296512Ssowmini NXGE_PARAM_ARRAY_CNT_SHIFT; 15303859Sml29623 15313859Sml29623 i = (int)cfgd_vlans; 15323859Sml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config; 15333859Sml29623 vlan_tbl = (nxge_mv_cfg_t *)&p_class_cfgp->vlan_tbl[0]; 15343859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 15356512Ssowmini "Configured VLANs %d\n" 15366512Ssowmini "VLAN ID\t RDC GRP (Actual/Port)\t" 15376512Ssowmini " Prefernce\n", i); 15383859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 15393859Sml29623 buf_len -= print_len; 15405125Sjoycey #if defined(__i386) 15415125Sjoycey val_ptr = (uint32_t *)(uint32_t)pa->value; 15425125Sjoycey #else 15433859Sml29623 val_ptr = (uint32_t *)pa->value; 15445125Sjoycey #endif 15453859Sml29623 15463859Sml29623 for (i = 0; i < cfgd_vlans; i++) { 15473859Sml29623 vmap = (nxge_param_map_t *)&val_ptr[i]; 15483859Sml29623 if (p_class_cfgp->vlan_tbl[vmap->param_id].flag) { 15493859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 15506512Ssowmini buf_len, 15516512Ssowmini " %d\t\t %d/%d\t\t %d\n", 15526512Ssowmini vmap->param_id, 15536512Ssowmini vlan_tbl[vmap->param_id].rdctbl, 15546512Ssowmini vlan_tbl[vmap->param_id].rdctbl - 15556512Ssowmini p_cfgp->def_mac_rxdma_grpid, 15566512Ssowmini vlan_tbl[vmap->param_id].mpr_npr); 15573859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 15583859Sml29623 buf_len -= print_len; 15593859Sml29623 } 15603859Sml29623 } 15613859Sml29623 15623859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_vlan_rdcgrp")); 15633859Sml29623 return (0); 15643859Sml29623 } 15653859Sml29623 15663859Sml29623 /* ARGSUSED */ 15673859Sml29623 static int 15683859Sml29623 nxge_param_get_mac_rdcgrp(p_nxge_t nxgep, queue_t *q, 15693859Sml29623 mblk_t *mp, caddr_t cp) 15703859Sml29623 { 15713859Sml29623 uint_t print_len, buf_len; 15723859Sml29623 p_mblk_t np; 15733859Sml29623 int i; 15743859Sml29623 p_nxge_class_pt_cfg_t p_class_cfgp; 15753859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 15763859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 15773859Sml29623 nxge_mv_cfg_t *mac_host_info; 15783859Sml29623 15793859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE * 32; 15803859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_mac_rdcgrp ")); 15813859Sml29623 (void) mi_mpprintf(mp, 15826512Ssowmini "MAC ADDR RDC Mapping Information for Port\t %d\n", 15836512Ssowmini nxgep->function_num); 15843859Sml29623 15853859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 15863859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 15873859Sml29623 return (0); 15883859Sml29623 } 15893859Sml29623 15903859Sml29623 buf_len = buff_alloc_size; 15913859Sml29623 mp->b_cont = np; 15923859Sml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config; 15933859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 15943859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 15953859Sml29623 mac_host_info = (nxge_mv_cfg_t *)&p_class_cfgp->mac_host_info[0]; 15963859Sml29623 print_len = snprintf((char *)np->b_wptr, buf_len, 15976512Ssowmini "MAC ID\t RDC GRP (Actual/Port)\t" 15986512Ssowmini " Prefernce\n"); 15993859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 16003859Sml29623 buf_len -= print_len; 16013859Sml29623 for (i = 0; i < p_cfgp->max_macs; i++) { 16023859Sml29623 if (mac_host_info[i].flag) { 16033859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 16046512Ssowmini buf_len, 16056512Ssowmini " %d\t %d/%d\t\t %d\n", 16066512Ssowmini i, mac_host_info[i].rdctbl, 16076512Ssowmini mac_host_info[i].rdctbl - 16086512Ssowmini p_cfgp->def_mac_rxdma_grpid, 16096512Ssowmini mac_host_info[i].mpr_npr); 16103859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 16113859Sml29623 buf_len -= print_len; 16123859Sml29623 } 16133859Sml29623 } 16143859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 16156512Ssowmini "Done Info Dumping \n"); 16163859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 16173859Sml29623 buf_len -= print_len; 16183859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_macrdcgrp")); 16193859Sml29623 return (0); 16203859Sml29623 } 16213859Sml29623 16223859Sml29623 /* ARGSUSED */ 16233859Sml29623 static int 16243859Sml29623 nxge_param_tcam_enable(p_nxge_t nxgep, queue_t *q, 16253859Sml29623 mblk_t *mp, char *value, caddr_t cp) 16263859Sml29623 { 16273859Sml29623 uint32_t status = 0, cfg_value; 16283859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 16293859Sml29623 uint32_t cfg_it = B_FALSE; 16303859Sml29623 char *end; 16313859Sml29623 16323859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_tcam_enable")); 16333859Sml29623 16343859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_BINARY); 16353859Sml29623 if (pa->value != cfg_value) { 16363859Sml29623 pa->old_value = pa->value; 16373859Sml29623 pa->value = cfg_value; 16383859Sml29623 cfg_it = B_TRUE; 16393859Sml29623 } 16403859Sml29623 16413859Sml29623 if (cfg_it == B_TRUE) { 16423859Sml29623 if (pa->value) 16433859Sml29623 status = nxge_fflp_config_tcam_enable(nxgep); 16443859Sml29623 else 16453859Sml29623 status = nxge_fflp_config_tcam_disable(nxgep); 16463859Sml29623 if (status != NXGE_OK) 16473859Sml29623 return (EINVAL); 16483859Sml29623 } 16493859Sml29623 16503859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_tcam_enable")); 16513859Sml29623 return (0); 16523859Sml29623 } 16533859Sml29623 16543859Sml29623 /* ARGSUSED */ 16553859Sml29623 static int 16563859Sml29623 nxge_param_hash_lookup_enable(p_nxge_t nxgep, queue_t *q, 16573859Sml29623 mblk_t *mp, char *value, caddr_t cp) 16583859Sml29623 { 16593859Sml29623 uint32_t status = 0, cfg_value; 16603859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 16613859Sml29623 uint32_t cfg_it = B_FALSE; 16623859Sml29623 char *end; 16633859Sml29623 16643859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_hash_lookup_enable")); 16653859Sml29623 16663859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_BINARY); 16673859Sml29623 if (pa->value != cfg_value) { 16683859Sml29623 pa->old_value = pa->value; 16693859Sml29623 pa->value = cfg_value; 16703859Sml29623 cfg_it = B_TRUE; 16713859Sml29623 } 16723859Sml29623 16733859Sml29623 if (cfg_it == B_TRUE) { 16743859Sml29623 if (pa->value) 16753859Sml29623 status = nxge_fflp_config_hash_lookup_enable(nxgep); 16763859Sml29623 else 16773859Sml29623 status = nxge_fflp_config_hash_lookup_disable(nxgep); 16783859Sml29623 if (status != NXGE_OK) 16793859Sml29623 return (EINVAL); 16803859Sml29623 } 16813859Sml29623 16823859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_hash_lookup_enable")); 16833859Sml29623 return (0); 16843859Sml29623 } 16853859Sml29623 16863859Sml29623 /* ARGSUSED */ 16873859Sml29623 static int 16883859Sml29623 nxge_param_llc_snap_enable(p_nxge_t nxgep, queue_t *q, 16893859Sml29623 mblk_t *mp, char *value, caddr_t cp) 16903859Sml29623 { 16913859Sml29623 char *end; 16923859Sml29623 uint32_t status = 0, cfg_value; 16933859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 16943859Sml29623 uint32_t cfg_it = B_FALSE; 16953859Sml29623 16963859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_llc_snap_enable")); 16973859Sml29623 16983859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_BINARY); 16993859Sml29623 if (pa->value != cfg_value) { 17003859Sml29623 pa->old_value = pa->value; 17013859Sml29623 pa->value = cfg_value; 17023859Sml29623 cfg_it = B_TRUE; 17033859Sml29623 } 17043859Sml29623 17053859Sml29623 if (cfg_it == B_TRUE) { 17063859Sml29623 if (pa->value) 17073859Sml29623 status = nxge_fflp_config_tcam_enable(nxgep); 17083859Sml29623 else 17093859Sml29623 status = nxge_fflp_config_tcam_disable(nxgep); 17103859Sml29623 if (status != NXGE_OK) 17113859Sml29623 return (EINVAL); 17123859Sml29623 } 17133859Sml29623 17143859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_llc_snap_enable")); 17153859Sml29623 return (0); 17163859Sml29623 } 17173859Sml29623 17183859Sml29623 /* ARGSUSED */ 17193859Sml29623 static int 17203859Sml29623 nxge_param_set_ether_usr(p_nxge_t nxgep, queue_t *q, 17213859Sml29623 mblk_t *mp, char *value, caddr_t cp) 17223859Sml29623 { 17233859Sml29623 char *end; 17243859Sml29623 uint8_t ether_class; 17253859Sml29623 uint32_t status = 0, cfg_value; 17263859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 17273859Sml29623 uint8_t cfg_it = B_FALSE; 17283859Sml29623 17293859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_ether_usr")); 17303859Sml29623 17313859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 17323859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 17333859Sml29623 return (EINVAL); 17343859Sml29623 } 17353859Sml29623 17363859Sml29623 if (pa->value != cfg_value) { 17373859Sml29623 pa->old_value = pa->value; 17383859Sml29623 pa->value = cfg_value; 17393859Sml29623 cfg_it = B_TRUE; 17403859Sml29623 } 17413859Sml29623 17423859Sml29623 /* do the actual hw setup */ 17433859Sml29623 if (cfg_it == B_TRUE) { 17443859Sml29623 ether_class = mi_strtol(pa->name, &end, 10); 17453859Sml29623 #ifdef lint 17463859Sml29623 ether_class = ether_class; 17473859Sml29623 #endif 17483859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " nxge_param_set_ether_usr")); 17493859Sml29623 } 17503859Sml29623 17513859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_ether_usr")); 17523859Sml29623 return (status); 17533859Sml29623 } 17543859Sml29623 17553859Sml29623 /* ARGSUSED */ 17563859Sml29623 static int 17573859Sml29623 nxge_param_set_ip_usr(p_nxge_t nxgep, queue_t *q, 17583859Sml29623 mblk_t *mp, char *value, caddr_t cp) 17593859Sml29623 { 17603859Sml29623 char *end; 17613859Sml29623 tcam_class_t class; 17623859Sml29623 uint32_t status, cfg_value; 17633859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 17643859Sml29623 uint32_t cfg_it = B_FALSE; 17653859Sml29623 17663859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_ip_usr")); 17673859Sml29623 17683859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 17693859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 17703859Sml29623 return (EINVAL); 17713859Sml29623 } 17723859Sml29623 17733859Sml29623 if (pa->value != cfg_value) { 17743859Sml29623 pa->old_value = pa->value; 17753859Sml29623 pa->value = cfg_value; 17763859Sml29623 cfg_it = B_TRUE; 17773859Sml29623 } 17783859Sml29623 17793859Sml29623 /* do the actual hw setup with cfg_value. */ 17803859Sml29623 if (cfg_it == B_TRUE) { 17813859Sml29623 class = mi_strtol(pa->name, &end, 10); 17823859Sml29623 status = nxge_fflp_ip_usr_class_config(nxgep, class, pa->value); 17833859Sml29623 } 17843859Sml29623 17853859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_ip_usr")); 17863859Sml29623 return (status); 17873859Sml29623 } 17883859Sml29623 17893859Sml29623 /* ARGSUSED */ 17903859Sml29623 static int 17913859Sml29623 nxge_class_name_2value(p_nxge_t nxgep, char *name) 17923859Sml29623 { 17933859Sml29623 int i; 17943859Sml29623 int class_instance = param_class_opt_ip_usr4; 17953859Sml29623 p_nxge_param_t param_arr; 17963859Sml29623 17973859Sml29623 param_arr = nxgep->param_arr; 17983859Sml29623 for (i = TCAM_CLASS_IP_USER_4; i <= TCAM_CLASS_SCTP_IPV6; i++) { 17993859Sml29623 if (strcmp(param_arr[class_instance].name, name) == 0) 18003859Sml29623 return (i); 18013859Sml29623 class_instance++; 18023859Sml29623 } 18033859Sml29623 return (-1); 18043859Sml29623 } 18053859Sml29623 18063859Sml29623 /* ARGSUSED */ 18076439Sml29623 int 18083859Sml29623 nxge_param_set_ip_opt(p_nxge_t nxgep, queue_t *q, 18093859Sml29623 mblk_t *mp, char *value, caddr_t cp) 18103859Sml29623 { 18113859Sml29623 char *end; 18123859Sml29623 uint32_t status, cfg_value; 18133859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 18143859Sml29623 tcam_class_t class; 18153859Sml29623 uint32_t cfg_it = B_FALSE; 18163859Sml29623 18173859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_ip_opt")); 18183859Sml29623 18193859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 18203859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 18213859Sml29623 return (EINVAL); 18223859Sml29623 } 18233859Sml29623 18243859Sml29623 if (pa->value != cfg_value) { 18253859Sml29623 pa->old_value = pa->value; 18263859Sml29623 pa->value = cfg_value; 18273859Sml29623 cfg_it = B_TRUE; 18283859Sml29623 } 18293859Sml29623 18303859Sml29623 if (cfg_it == B_TRUE) { 18313859Sml29623 /* do the actual hw setup */ 18323859Sml29623 class = nxge_class_name_2value(nxgep, pa->name); 18333859Sml29623 if (class == -1) 18343859Sml29623 return (EINVAL); 18353859Sml29623 18363859Sml29623 status = nxge_fflp_ip_class_config(nxgep, class, pa->value); 18373859Sml29623 if (status != NXGE_OK) 18383859Sml29623 return (EINVAL); 18393859Sml29623 } 18403859Sml29623 18413859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_ip_opt")); 18423859Sml29623 return (0); 18433859Sml29623 } 18443859Sml29623 18453859Sml29623 /* ARGSUSED */ 18463859Sml29623 static int 18473859Sml29623 nxge_param_get_ip_opt(p_nxge_t nxgep, queue_t *q, 18483859Sml29623 mblk_t *mp, caddr_t cp) 18493859Sml29623 { 18503859Sml29623 uint32_t status, cfg_value; 18513859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 18523859Sml29623 tcam_class_t class; 18533859Sml29623 18543859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_ip_opt")); 18553859Sml29623 18563859Sml29623 /* do the actual hw setup */ 18573859Sml29623 class = nxge_class_name_2value(nxgep, pa->name); 18583859Sml29623 if (class == -1) 18593859Sml29623 return (EINVAL); 18603859Sml29623 18613859Sml29623 cfg_value = 0; 18623859Sml29623 status = nxge_fflp_ip_class_config_get(nxgep, class, &cfg_value); 18633859Sml29623 if (status != NXGE_OK) 18643859Sml29623 return (EINVAL); 18653859Sml29623 18663859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 18676512Ssowmini "nxge_param_get_ip_opt_get %x ", cfg_value)); 18683859Sml29623 18693859Sml29623 pa->value = cfg_value; 18703859Sml29623 (void) mi_mpprintf(mp, "%x", cfg_value); 18713859Sml29623 18723859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_ip_opt status ")); 18733859Sml29623 return (0); 18743859Sml29623 } 18753859Sml29623 18763859Sml29623 /* ARGSUSED */ 18773859Sml29623 static int 18783859Sml29623 nxge_param_fflp_hash_init(p_nxge_t nxgep, queue_t *q, 18793859Sml29623 mblk_t *mp, char *value, caddr_t cp) 18803859Sml29623 { 18813859Sml29623 char *end; 18823859Sml29623 uint32_t status, cfg_value; 18833859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 18843859Sml29623 tcam_class_t class; 18853859Sml29623 uint32_t cfg_it = B_FALSE; 18863859Sml29623 18873859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_fflp_hash_init")); 18883859Sml29623 18893859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 18903859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 18913859Sml29623 return (EINVAL); 18923859Sml29623 } 18933859Sml29623 18943859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 18956512Ssowmini "nxge_param_fflp_hash_init value %x", cfg_value)); 18963859Sml29623 18973859Sml29623 if (pa->value != cfg_value) { 18983859Sml29623 pa->old_value = pa->value; 18993859Sml29623 pa->value = cfg_value; 19003859Sml29623 cfg_it = B_TRUE; 19013859Sml29623 } 19023859Sml29623 19033859Sml29623 if (cfg_it == B_TRUE) { 19043859Sml29623 char *h_name; 19053859Sml29623 19063859Sml29623 /* do the actual hw setup */ 19073859Sml29623 h_name = pa->name; 19083859Sml29623 h_name++; 19093859Sml29623 class = mi_strtol(h_name, &end, 10); 19103859Sml29623 switch (class) { 19113859Sml29623 case 1: 19123859Sml29623 status = nxge_fflp_set_hash1(nxgep, 19136512Ssowmini (uint32_t)pa->value); 19143859Sml29623 break; 19153859Sml29623 case 2: 19163859Sml29623 status = nxge_fflp_set_hash2(nxgep, 19176512Ssowmini (uint16_t)pa->value); 19183859Sml29623 break; 19193859Sml29623 19203859Sml29623 default: 19213859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 19226512Ssowmini " nxge_param_fflp_hash_init" 19236512Ssowmini " %s Wrong hash var %d", 19246512Ssowmini pa->name, class)); 19253859Sml29623 return (EINVAL); 19263859Sml29623 } 19273859Sml29623 if (status != NXGE_OK) 19283859Sml29623 return (EINVAL); 19293859Sml29623 } 19303859Sml29623 19313859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_fflp_hash_init")); 19323859Sml29623 return (0); 19333859Sml29623 } 19343859Sml29623 19353859Sml29623 /* ARGSUSED */ 19363859Sml29623 static int 19373859Sml29623 nxge_param_set_grp_rdc(p_nxge_t nxgep, queue_t *q, 19383859Sml29623 mblk_t *mp, char *value, caddr_t cp) 19393859Sml29623 { 19403859Sml29623 char *end; 19413859Sml29623 uint32_t status = 0, cfg_value; 19423859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 19433859Sml29623 uint32_t cfg_it = B_FALSE; 19443859Sml29623 int rdc_grp; 19453859Sml29623 uint8_t real_rdc; 19463859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 19473859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 19483859Sml29623 p_nxge_rdc_grp_t rdc_grp_p; 19493859Sml29623 19503859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 19513859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 19523859Sml29623 19533859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_grp_rdc")); 19543859Sml29623 19553859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY); 19563859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 19573859Sml29623 return (EINVAL); 19583859Sml29623 } 19593859Sml29623 19603859Sml29623 if (cfg_value >= p_cfgp->max_rdcs) { 19613859Sml29623 return (EINVAL); 19623859Sml29623 } 19633859Sml29623 19643859Sml29623 if (pa->value != cfg_value) { 19653859Sml29623 pa->old_value = pa->value; 19663859Sml29623 pa->value = cfg_value; 19673859Sml29623 cfg_it = B_TRUE; 19683859Sml29623 } 19693859Sml29623 19703859Sml29623 if (cfg_it == B_TRUE) { 19713859Sml29623 char *grp_name; 19723859Sml29623 grp_name = pa->name; 19733859Sml29623 grp_name += strlen("default-grp"); 19743859Sml29623 rdc_grp = mi_strtol(grp_name, &end, 10); 19753859Sml29623 rdc_grp_p = &p_dma_cfgp->rdc_grps[rdc_grp]; 19763859Sml29623 real_rdc = rdc_grp_p->start_rdc + cfg_value; 19773859Sml29623 if (nxge_check_rxdma_rdcgrp_member(nxgep, rdc_grp, 19786512Ssowmini cfg_value) == B_FALSE) { 19793859Sml29623 pa->value = pa->old_value; 19803859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 19816512Ssowmini " nxge_param_set_grp_rdc" 19826512Ssowmini " %d read %d actual %d outof range", 19836512Ssowmini rdc_grp, cfg_value, real_rdc)); 19843859Sml29623 return (EINVAL); 19853859Sml29623 } 19863859Sml29623 status = nxge_rxdma_cfg_rdcgrp_default_rdc(nxgep, rdc_grp, 19876512Ssowmini real_rdc); 19883859Sml29623 if (status != NXGE_OK) 19893859Sml29623 return (EINVAL); 19903859Sml29623 } 19913859Sml29623 19923859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_grp_rdc")); 19933859Sml29623 return (0); 19943859Sml29623 } 19953859Sml29623 19963859Sml29623 /* ARGSUSED */ 19973859Sml29623 static int 19983859Sml29623 nxge_param_set_port_rdc(p_nxge_t nxgep, queue_t *q, 19993859Sml29623 mblk_t *mp, char *value, caddr_t cp) 20003859Sml29623 { 20013859Sml29623 char *end; 20023859Sml29623 uint32_t status = B_TRUE, cfg_value; 20033859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 20043859Sml29623 uint32_t cfg_it = B_FALSE; 20053859Sml29623 20063859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 20073859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 20083859Sml29623 20093859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_port_rdc")); 20103859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 20113859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 20123859Sml29623 20133859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY); 20143859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 20153859Sml29623 return (EINVAL); 20163859Sml29623 } 20173859Sml29623 20183859Sml29623 if (pa->value != cfg_value) { 20193859Sml29623 if (cfg_value >= p_cfgp->max_rdcs) 20203859Sml29623 return (EINVAL); 20213859Sml29623 pa->old_value = pa->value; 20223859Sml29623 pa->value = cfg_value; 20233859Sml29623 cfg_it = B_TRUE; 20243859Sml29623 } 20253859Sml29623 20263859Sml29623 if (cfg_it == B_TRUE) { 20276495Sspeer int rdc; 20286495Sspeer if ((rdc = nxge_dci_map(nxgep, VP_BOUND_RX, cfg_value)) < 0) 20296495Sspeer return (EINVAL); 20303859Sml29623 status = nxge_rxdma_cfg_port_default_rdc(nxgep, 20316495Sspeer nxgep->function_num, rdc); 20323859Sml29623 if (status != NXGE_OK) 20333859Sml29623 return (EINVAL); 20343859Sml29623 } 20353859Sml29623 20363859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_port_rdc")); 20373859Sml29623 return (0); 20383859Sml29623 } 20393859Sml29623 20403859Sml29623 /* ARGSUSED */ 20413859Sml29623 static int 20423859Sml29623 nxge_param_set_nxge_debug_flag(p_nxge_t nxgep, queue_t *q, 20433859Sml29623 mblk_t *mp, char *value, caddr_t cp) 20443859Sml29623 { 20453859Sml29623 char *end; 20463859Sml29623 uint32_t status = 0; 20473859Sml29623 uint64_t cfg_value = 0; 20483859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 20493859Sml29623 uint32_t cfg_it = B_FALSE; 20503859Sml29623 20513859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_nxge_debug_flag")); 20523859Sml29623 cfg_value = mi_strtol(value, &end, BASE_HEX); 20533859Sml29623 20543859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 20553859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 20566512Ssowmini " nxge_param_set_nxge_debug_flag" 20576512Ssowmini " outof range %llx", cfg_value)); 20583859Sml29623 return (EINVAL); 20593859Sml29623 } 20603859Sml29623 if (pa->value != cfg_value) { 20613859Sml29623 pa->old_value = pa->value; 20623859Sml29623 pa->value = cfg_value; 20633859Sml29623 cfg_it = B_TRUE; 20643859Sml29623 } 20653859Sml29623 20663859Sml29623 if (cfg_it == B_TRUE) { 20673859Sml29623 nxgep->nxge_debug_level = pa->value; 20683859Sml29623 } 20693859Sml29623 20703859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_nxge_debug_flag")); 20713859Sml29623 return (status); 20723859Sml29623 } 20733859Sml29623 20743859Sml29623 /* ARGSUSED */ 20753859Sml29623 static int 20763859Sml29623 nxge_param_get_debug_flag(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 20773859Sml29623 { 20783859Sml29623 int status = 0; 20793859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 20803859Sml29623 20813859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_debug_flag")); 20823859Sml29623 20833859Sml29623 if (pa->value > 0xffffffff) 20843859Sml29623 (void) mi_mpprintf(mp, "%x%x", (int)(pa->value >> 32), 20856512Ssowmini (int)(pa->value & 0xffffffff)); 20863859Sml29623 else 20873859Sml29623 (void) mi_mpprintf(mp, "%x", (int)pa->value); 20883859Sml29623 20893859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_debug_flag")); 20903859Sml29623 return (status); 20913859Sml29623 } 20923859Sml29623 20933859Sml29623 /* ARGSUSED */ 20943859Sml29623 static int 20953859Sml29623 nxge_param_set_npi_debug_flag(p_nxge_t nxgep, queue_t *q, 20963859Sml29623 mblk_t *mp, char *value, caddr_t cp) 20973859Sml29623 { 20983859Sml29623 char *end; 20993859Sml29623 uint32_t status = 0; 21003859Sml29623 uint64_t cfg_value = 0; 21013859Sml29623 p_nxge_param_t pa; 21023859Sml29623 uint32_t cfg_it = B_FALSE; 21033859Sml29623 21043859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_npi_debug_flag")); 21053859Sml29623 cfg_value = mi_strtol(value, &end, BASE_HEX); 21063859Sml29623 pa = (p_nxge_param_t)cp; 21073859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 21083859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " nxge_param_set_npi_debug_flag" 21096512Ssowmini " outof range %llx", cfg_value)); 21103859Sml29623 return (EINVAL); 21113859Sml29623 } 21123859Sml29623 if (pa->value != cfg_value) { 21133859Sml29623 pa->old_value = pa->value; 21143859Sml29623 pa->value = cfg_value; 21153859Sml29623 cfg_it = B_TRUE; 21163859Sml29623 } 21173859Sml29623 21183859Sml29623 if (cfg_it == B_TRUE) { 21193859Sml29623 npi_debug_level = pa->value; 21203859Sml29623 } 21213859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_debug_flag")); 21223859Sml29623 return (status); 21233859Sml29623 } 21243859Sml29623 21253859Sml29623 /* ARGSUSED */ 21263859Sml29623 static int 21273859Sml29623 nxge_param_dump_rdc(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21283859Sml29623 { 21296495Sspeer nxge_grp_set_t *set = &nxgep->rx_set; 21306495Sspeer int rdc; 21313859Sml29623 21323859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_rdc")); 21333859Sml29623 21346495Sspeer if (!isLDOMguest(nxgep)) 21356512Ssowmini (void) npi_rxdma_dump_fzc_regs(NXGE_DEV_NPI_HANDLE(nxgep)); 21366495Sspeer 21376495Sspeer for (rdc = 0; rdc < NXGE_MAX_TDCS; rdc++) { 21386495Sspeer if ((1 << rdc) & set->owned.map) { 21396495Sspeer (void) nxge_dump_rxdma_channel(nxgep, rdc); 21406495Sspeer } 21416495Sspeer } 21423859Sml29623 21433859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_rdc")); 21443859Sml29623 return (0); 21453859Sml29623 } 21463859Sml29623 21473859Sml29623 /* ARGSUSED */ 21483859Sml29623 static int 21493859Sml29623 nxge_param_dump_tdc(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21503859Sml29623 { 21516495Sspeer nxge_grp_set_t *set = &nxgep->tx_set; 21526495Sspeer int tdc; 21533859Sml29623 21543859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_tdc")); 21553859Sml29623 21566495Sspeer for (tdc = 0; tdc < NXGE_MAX_TDCS; tdc++) { 21576495Sspeer if ((1 << tdc) & set->owned.map) { 21586495Sspeer (void) nxge_txdma_regs_dump(nxgep, tdc); 21596495Sspeer } 21606495Sspeer } 21613859Sml29623 21623859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_tdc")); 21633859Sml29623 return (0); 21643859Sml29623 } 21653859Sml29623 21663859Sml29623 /* ARGSUSED */ 21673859Sml29623 static int 21683859Sml29623 nxge_param_dump_fflp_regs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21693859Sml29623 { 21703859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_fflp_regs")); 21713859Sml29623 21723859Sml29623 (void) npi_fflp_dump_regs(NXGE_DEV_NPI_HANDLE(nxgep)); 21733859Sml29623 21743859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_fflp_regs")); 21753859Sml29623 return (0); 21763859Sml29623 } 21773859Sml29623 21783859Sml29623 /* ARGSUSED */ 21793859Sml29623 static int 21803859Sml29623 nxge_param_dump_mac_regs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21813859Sml29623 { 21823859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_mac_regs")); 21833859Sml29623 21843859Sml29623 (void) npi_mac_dump_regs(NXGE_DEV_NPI_HANDLE(nxgep), 21856512Ssowmini nxgep->function_num); 21863859Sml29623 21873859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_mac_regs")); 21883859Sml29623 return (0); 21893859Sml29623 } 21903859Sml29623 21913859Sml29623 /* ARGSUSED */ 21923859Sml29623 static int 21933859Sml29623 nxge_param_dump_ipp_regs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21943859Sml29623 { 21953859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_ipp_regs")); 21963859Sml29623 21973859Sml29623 (void) npi_ipp_dump_regs(NXGE_DEV_NPI_HANDLE(nxgep), 21986512Ssowmini nxgep->function_num); 21993859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_ipp_regs")); 22003859Sml29623 return (0); 22013859Sml29623 } 22023859Sml29623 22033859Sml29623 /* ARGSUSED */ 22043859Sml29623 static int 22053859Sml29623 nxge_param_dump_vlan_table(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 22063859Sml29623 { 22073859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_dump_vlan_table")); 22083859Sml29623 22093859Sml29623 (void) npi_fflp_vlan_tbl_dump(NXGE_DEV_NPI_HANDLE(nxgep)); 22103859Sml29623 22113859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_dump_vlan_table")); 22123859Sml29623 return (0); 22133859Sml29623 } 22143859Sml29623 22153859Sml29623 /* ARGSUSED */ 22163859Sml29623 static int 22173859Sml29623 nxge_param_dump_rdc_table(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 22183859Sml29623 { 22193859Sml29623 uint8_t table; 22203859Sml29623 22213859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_dump_rdc_table")); 22223859Sml29623 for (table = 0; table < NXGE_MAX_RDC_GROUPS; table++) { 22233859Sml29623 (void) npi_rxdma_dump_rdc_table(NXGE_DEV_NPI_HANDLE(nxgep), 22246512Ssowmini table); 22253859Sml29623 } 22263859Sml29623 22273859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_dump_rdc_table")); 22283859Sml29623 return (0); 22293859Sml29623 } 22303859Sml29623 22313859Sml29623 typedef struct block_info { 22323859Sml29623 char *name; 22333859Sml29623 uint32_t offset; 22343859Sml29623 } block_info_t; 22353859Sml29623 22363859Sml29623 block_info_t reg_block[] = { 22373859Sml29623 {"PIO", PIO}, 22383859Sml29623 {"FZC_PIO", FZC_PIO}, 22393859Sml29623 {"FZC_XMAC", FZC_MAC}, 22403859Sml29623 {"FZC_IPP", FZC_IPP}, 22413859Sml29623 {"FFLP", FFLP}, 22423859Sml29623 {"FZC_FFLP", FZC_FFLP}, 22433859Sml29623 {"PIO_VADDR", PIO_VADDR}, 22443859Sml29623 {"ZCP", ZCP}, 22453859Sml29623 {"FZC_ZCP", FZC_ZCP}, 22463859Sml29623 {"DMC", DMC}, 22473859Sml29623 {"FZC_DMC", FZC_DMC}, 22483859Sml29623 {"TXC", TXC}, 22493859Sml29623 {"FZC_TXC", FZC_TXC}, 22503859Sml29623 {"PIO_LDSV", PIO_LDSV}, 22513859Sml29623 {"PIO_LDGIM", PIO_LDGIM}, 22523859Sml29623 {"PIO_IMASK0", PIO_IMASK0}, 22533859Sml29623 {"PIO_IMASK1", PIO_IMASK1}, 22543859Sml29623 {"FZC_PROM", FZC_PROM}, 22553859Sml29623 {"END", ALL_FF_32}, 22563859Sml29623 }; 22573859Sml29623 22583859Sml29623 /* ARGSUSED */ 22593859Sml29623 static int 22603859Sml29623 nxge_param_dump_ptrs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 22613859Sml29623 { 22623859Sml29623 uint_t print_len, buf_len; 22633859Sml29623 p_mblk_t np; 22643859Sml29623 int rdc, tdc, block; 22653859Sml29623 uint64_t base; 22663859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 22673859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 22683859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_8K; 22693859Sml29623 p_tx_ring_t *tx_rings; 22703859Sml29623 p_rx_rcr_rings_t rx_rcr_rings; 22713859Sml29623 p_rx_rcr_ring_t *rcr_rings; 22723859Sml29623 p_rx_rbr_rings_t rx_rbr_rings; 22733859Sml29623 p_rx_rbr_ring_t *rbr_rings; 22743859Sml29623 22753859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, 22766512Ssowmini "==> nxge_param_dump_ptrs")); 22773859Sml29623 22783859Sml29623 (void) mi_mpprintf(mp, "ptr information for Port\t %d \n", 22796512Ssowmini nxgep->function_num); 22803859Sml29623 22813859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 22823859Sml29623 /* The following may work even if we cannot get a large buf. */ 22833859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 22843859Sml29623 return (0); 22853859Sml29623 } 22863859Sml29623 22873859Sml29623 buf_len = buff_alloc_size; 22883859Sml29623 mp->b_cont = np; 22893859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 22903859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 22913859Sml29623 22923859Sml29623 rx_rcr_rings = nxgep->rx_rcr_rings; 22933859Sml29623 rcr_rings = rx_rcr_rings->rcr_rings; 22943859Sml29623 rx_rbr_rings = nxgep->rx_rbr_rings; 22953859Sml29623 rbr_rings = rx_rbr_rings->rbr_rings; 22963859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 22976512Ssowmini "nxgep (nxge_t) $%p\n" 22986512Ssowmini "dev_regs (dev_regs_t) $%p\n", 22997632SNick.Todd@Sun.COM (void *)nxgep, (void *)nxgep->dev_regs); 23003859Sml29623 23013859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23023859Sml29623 23033859Sml29623 /* do register pointers */ 23043859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23056512Ssowmini "reg base (npi_reg_ptr_t) $%p\t " 23066512Ssowmini "pci reg (npi_reg_ptr_t) $%p\n", 23077632SNick.Todd@Sun.COM (void *)nxgep->dev_regs->nxge_regp, 23087632SNick.Todd@Sun.COM (void *)nxgep->dev_regs->nxge_pciregp); 23093859Sml29623 23103859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23113859Sml29623 23123859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23136512Ssowmini "\nBlock \t Offset \n"); 23143859Sml29623 23153859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23163859Sml29623 block = 0; 23175125Sjoycey #if defined(__i386) 23185125Sjoycey base = (uint64_t)(uint32_t)nxgep->dev_regs->nxge_regp; 23195125Sjoycey #else 23203859Sml29623 base = (uint64_t)nxgep->dev_regs->nxge_regp; 23215125Sjoycey #endif 23223859Sml29623 while (reg_block[block].offset != ALL_FF_32) { 23233859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23246512Ssowmini "%9s\t 0x%llx\n", 23256512Ssowmini reg_block[block].name, 23266512Ssowmini (unsigned long long)(reg_block[block].offset + base)); 23273859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23283859Sml29623 block++; 23293859Sml29623 } 23303859Sml29623 23313859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23326512Ssowmini "\nRDC\t rcrp (rx_rcr_ring_t)\t " 23336512Ssowmini "rbrp (rx_rbr_ring_t)\n"); 23343859Sml29623 23353859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23363859Sml29623 23373859Sml29623 for (rdc = 0; rdc < p_cfgp->max_rdcs; rdc++) { 23383859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23396512Ssowmini " %d\t $%p\t\t $%p\n", 23407632SNick.Todd@Sun.COM rdc, (void *)rcr_rings[rdc], 23417632SNick.Todd@Sun.COM (void *)rbr_rings[rdc]); 23423859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23433859Sml29623 } 23443859Sml29623 23453859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23466512Ssowmini "\nTDC\t tdcp (tx_ring_t)\n"); 23473859Sml29623 23483859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23493859Sml29623 tx_rings = nxgep->tx_rings->rings; 23506495Sspeer for (tdc = 0; tdc < p_cfgp->tdc.count; tdc++) { 23513859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23527632SNick.Todd@Sun.COM " %d\t $%p\n", tdc, (void *)tx_rings[tdc]); 23533859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23543859Sml29623 } 23553859Sml29623 23563859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, "\n\n"); 23573859Sml29623 23583859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23593859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_ptrs")); 23603859Sml29623 return (0); 23613859Sml29623 } 23623859Sml29623 23633859Sml29623 23643859Sml29623 /* ARGSUSED */ 23653859Sml29623 int 23663859Sml29623 nxge_nd_get_names(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t param) 23673859Sml29623 { 23683859Sml29623 ND *nd; 23693859Sml29623 NDE *nde; 23703859Sml29623 char *rwtag; 23713859Sml29623 boolean_t get_ok, set_ok; 23723859Sml29623 size_t param_len; 23733859Sml29623 int status = 0; 23743859Sml29623 23753859Sml29623 nd = (ND *)param; 23763859Sml29623 if (!nd) 23773859Sml29623 return (ENOENT); 23783859Sml29623 23793859Sml29623 for (nde = nd->nd_tbl; nde->nde_name; nde++) { 23803859Sml29623 get_ok = (nde->nde_get_pfi != nxge_get_default) && 23816512Ssowmini (nde->nde_get_pfi != NULL); 23823859Sml29623 set_ok = (nde->nde_set_pfi != nxge_set_default) && 23836512Ssowmini (nde->nde_set_pfi != NULL); 23843859Sml29623 if (get_ok) { 23853859Sml29623 if (set_ok) 23863859Sml29623 rwtag = "read and write"; 23873859Sml29623 else 23883859Sml29623 rwtag = "read only"; 23893859Sml29623 } else if (set_ok) 23903859Sml29623 rwtag = "write only"; 23913859Sml29623 else { 23923859Sml29623 continue; 23933859Sml29623 } 23943859Sml29623 param_len = strlen(rwtag); 23953859Sml29623 param_len += strlen(nde->nde_name); 23963859Sml29623 param_len += 4; 23973859Sml29623 23983859Sml29623 (void) mi_mpprintf(mp, "%s (%s)", nde->nde_name, rwtag); 23993859Sml29623 } 24003859Sml29623 return (status); 24013859Sml29623 } 24023859Sml29623 24033859Sml29623 /* ARGSUSED */ 24043859Sml29623 int 24053859Sml29623 nxge_get_default(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t data) 24063859Sml29623 { 24073859Sml29623 return (EACCES); 24083859Sml29623 } 24093859Sml29623 24103859Sml29623 /* ARGSUSED */ 24113859Sml29623 int 24123859Sml29623 nxge_set_default(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, char *value, 24133859Sml29623 caddr_t data) 24143859Sml29623 { 24153859Sml29623 return (EACCES); 24163859Sml29623 } 24173859Sml29623 24186439Sml29623 boolean_t 24193859Sml29623 nxge_param_link_update(p_nxge_t nxgep) 24203859Sml29623 { 24213859Sml29623 p_nxge_param_t param_arr; 24223859Sml29623 nxge_param_index_t i; 24233859Sml29623 boolean_t update_xcvr; 24243859Sml29623 boolean_t update_dev; 24253859Sml29623 int instance; 24263859Sml29623 boolean_t status = B_TRUE; 24273859Sml29623 24286439Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_link_update")); 24293859Sml29623 24303859Sml29623 param_arr = nxgep->param_arr; 24313859Sml29623 instance = nxgep->instance; 24323859Sml29623 update_xcvr = B_FALSE; 24333859Sml29623 for (i = param_anar_1000fdx; i < param_anar_asmpause; i++) { 24343859Sml29623 update_xcvr |= param_arr[i].value; 24353859Sml29623 } 24363859Sml29623 24373859Sml29623 if (update_xcvr) { 24383859Sml29623 update_xcvr = B_FALSE; 24393859Sml29623 for (i = param_autoneg; i < param_enable_ipg0; i++) { 24403859Sml29623 update_xcvr |= 24416512Ssowmini (param_arr[i].value != param_arr[i].old_value); 24423859Sml29623 param_arr[i].old_value = param_arr[i].value; 24433859Sml29623 } 24443859Sml29623 if (update_xcvr) { 24456439Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 24466439Sml29623 "==> nxge_param_link_update: update xcvr")); 24473859Sml29623 RW_ENTER_WRITER(&nxgep->filter_lock); 24483859Sml29623 (void) nxge_link_monitor(nxgep, LINK_MONITOR_STOP); 24493859Sml29623 (void) nxge_link_init(nxgep); 24503859Sml29623 (void) nxge_mac_init(nxgep); 24513859Sml29623 (void) nxge_link_monitor(nxgep, LINK_MONITOR_START); 24523859Sml29623 RW_EXIT(&nxgep->filter_lock); 24533859Sml29623 } 24543859Sml29623 } else { 24553859Sml29623 cmn_err(CE_WARN, " Last setting will leave nxge%d with " 24566512Ssowmini " no link capabilities.", instance); 24573859Sml29623 cmn_err(CE_WARN, " Restoring previous setting."); 24583859Sml29623 for (i = param_anar_1000fdx; i < param_anar_asmpause; i++) 24593859Sml29623 param_arr[i].value = param_arr[i].old_value; 24603859Sml29623 } 24613859Sml29623 24623859Sml29623 update_dev = B_FALSE; 24633859Sml29623 24643859Sml29623 if (update_dev) { 24653859Sml29623 RW_ENTER_WRITER(&nxgep->filter_lock); 24666439Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 24676439Sml29623 "==> nxge_param_link_update: update dev")); 24683859Sml29623 (void) nxge_rx_mac_disable(nxgep); 24693859Sml29623 (void) nxge_tx_mac_disable(nxgep); 24703859Sml29623 (void) nxge_tx_mac_enable(nxgep); 24713859Sml29623 (void) nxge_rx_mac_enable(nxgep); 24723859Sml29623 RW_EXIT(&nxgep->filter_lock); 24733859Sml29623 } 24743859Sml29623 24753859Sml29623 nxge_param_hw_update_exit: 24763859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, 24776512Ssowmini "<== nxge_param_link_update status = 0x%08x", status)); 24783859Sml29623 return (status); 24793859Sml29623 } 24806439Sml29623 24816439Sml29623 /* 24826439Sml29623 * synchronize the adv* and en* parameters. 24836439Sml29623 * 24846439Sml29623 * See comments in <sys/dld.h> for details of the *_en_* 24856439Sml29623 * parameters. The usage of ndd for setting adv parameters will 24866439Sml29623 * synchronize all the en parameters with the nxge parameters, 24876439Sml29623 * implicitly disabling any settings made via dladm. 24886439Sml29623 */ 24896439Sml29623 static void 24906439Sml29623 nxge_param_sync(p_nxge_t nxgep) 24916439Sml29623 { 24926439Sml29623 p_nxge_param_t param_arr; 24936439Sml29623 param_arr = nxgep->param_arr; 24946439Sml29623 24956439Sml29623 nxgep->param_en_pause = param_arr[param_anar_pause].value; 24966439Sml29623 nxgep->param_en_1000fdx = param_arr[param_anar_1000fdx].value; 24976439Sml29623 nxgep->param_en_100fdx = param_arr[param_anar_100fdx].value; 24986439Sml29623 nxgep->param_en_10fdx = param_arr[param_anar_10fdx].value; 24996439Sml29623 } 25006439Sml29623 25016439Sml29623 /* ARGSUSED */ 25026439Sml29623 int 25036439Sml29623 nxge_dld_get_ip_opt(p_nxge_t nxgep, caddr_t cp) 25046439Sml29623 { 25056439Sml29623 uint32_t status, cfg_value; 25066439Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 25076439Sml29623 tcam_class_t class; 25086439Sml29623 25096439Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_dld_get_ip_opt")); 25106439Sml29623 25116439Sml29623 /* do the actual hw setup */ 25126439Sml29623 class = nxge_class_name_2value(nxgep, pa->name); 25136439Sml29623 if (class == -1) 25146439Sml29623 return (EINVAL); 25156439Sml29623 25166439Sml29623 cfg_value = 0; 25176439Sml29623 status = nxge_fflp_ip_class_config_get(nxgep, class, &cfg_value); 25186439Sml29623 if (status != NXGE_OK) 25196439Sml29623 return (EINVAL); 25206439Sml29623 25216439Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 25226439Sml29623 "nxge_param_get_ip_opt_get %x ", cfg_value)); 25236439Sml29623 25246439Sml29623 pa->value = cfg_value; 25256439Sml29623 25266439Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_ip_opt status ")); 25276439Sml29623 return (0); 25286439Sml29623 } 2529