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 /* 226003Sml29623 * Copyright 2008 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, 3063859Sml29623 RXDMA_RCR_TO_DEFAULT, 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, 3103859Sml29623 RXDMA_RCR_PTHRES_DEFAULT, 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 ((mblk_t *)np)->b_wptr += print_len; 9843859Sml29623 buf_len -= print_len; 9853859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 9866512Ssowmini "TDC\t HW TDC\t\n"); 9873859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 9883859Sml29623 buf_len -= print_len; 9896495Sspeer 9906495Sspeer set = &nxgep->tx_set; 9916495Sspeer for (tdc = 0; tdc < NXGE_MAX_RDCS; tdc++) { 9926495Sspeer if ((1 << tdc) & set->owned.map) { 9936495Sspeer print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 9946495Sspeer buf_len, "%d\n", tdc); 9956495Sspeer ((mblk_t *)np)->b_wptr += print_len; 9966495Sspeer buf_len -= print_len; 9976495Sspeer } 9983859Sml29623 } 9993859Sml29623 10003859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_txdma_info")); 10013859Sml29623 return (0); 10023859Sml29623 } 10033859Sml29623 10043859Sml29623 /* ARGSUSED */ 10053859Sml29623 int 10063859Sml29623 nxge_param_get_rxdma_info(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 10073859Sml29623 { 10083859Sml29623 uint_t print_len, buf_len; 10093859Sml29623 p_mblk_t np; 10103859Sml29623 int rdc; 10113859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 10123859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 10133859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE; 10143859Sml29623 p_rx_rcr_rings_t rx_rcr_rings; 10153859Sml29623 p_rx_rcr_ring_t *rcr_rings; 10163859Sml29623 p_rx_rbr_rings_t rx_rbr_rings; 10173859Sml29623 p_rx_rbr_ring_t *rbr_rings; 10186495Sspeer nxge_grp_set_t *set; 10193859Sml29623 10203859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_rxdma_info")); 10213859Sml29623 10223859Sml29623 (void) mi_mpprintf(mp, "RXDMA Information for Port\t %d \n", 10236512Ssowmini nxgep->function_num); 10243859Sml29623 10253859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 10263859Sml29623 /* The following may work even if we cannot get a large buf. */ 10273859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 10283859Sml29623 return (0); 10293859Sml29623 } 10303859Sml29623 10313859Sml29623 buf_len = buff_alloc_size; 10323859Sml29623 mp->b_cont = np; 10333859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 10343859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 10353859Sml29623 10363859Sml29623 rx_rcr_rings = nxgep->rx_rcr_rings; 10373859Sml29623 rcr_rings = rx_rcr_rings->rcr_rings; 10383859Sml29623 rx_rbr_rings = nxgep->rx_rbr_rings; 10393859Sml29623 rbr_rings = rx_rbr_rings->rbr_rings; 10403859Sml29623 10413859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 10426512Ssowmini "Total RDCs\t %d\n", p_cfgp->max_rdcs); 10433859Sml29623 10443859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 10453859Sml29623 buf_len -= print_len; 10463859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 10476512Ssowmini "RDC\t HW RDC\t Timeout\t Packets RBR ptr \t" 10486512Ssowmini "chunks\t RCR ptr\n"); 10493859Sml29623 10503859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 10513859Sml29623 buf_len -= print_len; 10526495Sspeer 10536495Sspeer set = &nxgep->rx_set; 10546495Sspeer for (rdc = 0; rdc < NXGE_MAX_RDCS; rdc++) { 10556495Sspeer if ((1 << rdc) & set->owned.map) { 10566495Sspeer print_len = snprintf((char *) 10576495Sspeer ((mblk_t *)np)->b_wptr, buf_len, 10586495Sspeer " %d\t %x\t\t %x\t $%p\t 0x%x\t $%p\n", 10596495Sspeer rdc, 10606495Sspeer p_dma_cfgp->rcr_timeout[rdc], 10616495Sspeer p_dma_cfgp->rcr_threshold[rdc], 1062*7632SNick.Todd@Sun.COM (void *)rbr_rings[rdc], 1063*7632SNick.Todd@Sun.COM rbr_rings[rdc]->num_blocks, (void *)rcr_rings[rdc]); 10643859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 10653859Sml29623 buf_len -= print_len; 10666495Sspeer } 10673859Sml29623 } 10683859Sml29623 10693859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_rxdma_info")); 10703859Sml29623 return (0); 10713859Sml29623 } 10723859Sml29623 10733859Sml29623 /* ARGSUSED */ 10743859Sml29623 int 10753859Sml29623 nxge_param_get_rxdma_rdcgrp_info(p_nxge_t nxgep, queue_t *q, 10763859Sml29623 p_mblk_t mp, caddr_t cp) 10773859Sml29623 { 10783859Sml29623 uint_t print_len, buf_len; 10793859Sml29623 p_mblk_t np; 10803859Sml29623 int offset, rdc, i, rdc_grp; 10813859Sml29623 p_nxge_rdc_grp_t rdc_grp_p; 10823859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 10833859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 10843859Sml29623 10853859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE; 10863859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 10876512Ssowmini "==> nxge_param_get_rxdma_rdcgrp_info")); 10883859Sml29623 10893859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 10903859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 10913859Sml29623 10923859Sml29623 (void) mi_mpprintf(mp, "RXDMA RDC Group Information for Port\t %d \n", 10936512Ssowmini nxgep->function_num); 10943859Sml29623 10956495Sspeer rdc_grp = p_cfgp->def_mac_rxdma_grpid; 10963859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 10973859Sml29623 /* The following may work even if we cannot get a large buf. */ 10983859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 10993859Sml29623 return (0); 11003859Sml29623 } 11013859Sml29623 11023859Sml29623 buf_len = buff_alloc_size; 11033859Sml29623 mp->b_cont = np; 11043859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 11056512Ssowmini "Total RDC Groups\t %d \n" 11066512Ssowmini "default RDC group\t %d\n", 11076512Ssowmini p_cfgp->max_rdc_grpids, 11086512Ssowmini p_cfgp->def_mac_rxdma_grpid); 11093859Sml29623 11103859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 11113859Sml29623 buf_len -= print_len; 11123859Sml29623 11136495Sspeer for (i = 0; i < NXGE_MAX_RDCS; i++) { 11146495Sspeer if (p_cfgp->grpids[i]) { 11156495Sspeer rdc_grp_p = &p_dma_cfgp->rdc_grps[i]; 11166495Sspeer print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 11176495Sspeer buf_len, 11186495Sspeer "\nRDC Group Info for Group [%d] %d\n" 11196495Sspeer "RDC Count %d\tstart RDC %d\n" 11206495Sspeer "RDC Group Population Information" 11216495Sspeer " (offsets 0 - 15)\n", 11226495Sspeer i, rdc_grp, rdc_grp_p->max_rdcs, 11236495Sspeer rdc_grp_p->start_rdc); 11246495Sspeer 11256495Sspeer ((mblk_t *)np)->b_wptr += print_len; 11266495Sspeer buf_len -= print_len; 11273859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 11286495Sspeer buf_len, "\n"); 11296495Sspeer ((mblk_t *)np)->b_wptr += print_len; 11306495Sspeer buf_len -= print_len; 11316495Sspeer 11326495Sspeer for (rdc = 0; rdc < rdc_grp_p->max_rdcs; rdc++) { 11336495Sspeer print_len = snprintf( 11346512Ssowmini (char *)((mblk_t *)np)->b_wptr, 11356512Ssowmini buf_len, "[%d]=%d ", rdc, 11366512Ssowmini rdc_grp_p->start_rdc + rdc); 11376495Sspeer ((mblk_t *)np)->b_wptr += print_len; 11386495Sspeer buf_len -= print_len; 11396495Sspeer } 11406495Sspeer print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 11416495Sspeer buf_len, "\n"); 11426495Sspeer ((mblk_t *)np)->b_wptr += print_len; 11436495Sspeer buf_len -= print_len; 11446495Sspeer 11456495Sspeer for (offset = 0; offset < 16; offset++) { 11466495Sspeer print_len = snprintf( 11476512Ssowmini (char *)((mblk_t *)np)->b_wptr, 11486512Ssowmini buf_len, " %c", 11496512Ssowmini rdc_grp_p->map & (1 << offset) ? 11506512Ssowmini '1' : '0'); 11516495Sspeer ((mblk_t *)np)->b_wptr += print_len; 11526495Sspeer buf_len -= print_len; 11536495Sspeer } 11546495Sspeer print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 11556495Sspeer buf_len, "\n"); 11563859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 11573859Sml29623 buf_len -= print_len; 11583859Sml29623 } 11593859Sml29623 } 11603859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 11616512Ssowmini "<== nxge_param_get_rxdma_rdcgrp_info")); 11623859Sml29623 return (0); 11633859Sml29623 } 11643859Sml29623 11653859Sml29623 int 11663859Sml29623 nxge_mk_mblk_tail_space(p_mblk_t mp, p_mblk_t *nmp, size_t size) 11673859Sml29623 { 11683859Sml29623 p_mblk_t tmp; 11693859Sml29623 11703859Sml29623 tmp = mp; 11713859Sml29623 while (tmp->b_cont) 11723859Sml29623 tmp = tmp->b_cont; 11733859Sml29623 if ((tmp->b_wptr + size) >= tmp->b_datap->db_lim) { 11743859Sml29623 tmp->b_cont = allocb(1024, BPRI_HI); 11753859Sml29623 tmp = tmp->b_cont; 11763859Sml29623 if (!tmp) 11773859Sml29623 return (ENOMEM); 11783859Sml29623 } 11793859Sml29623 11803859Sml29623 *nmp = tmp; 11813859Sml29623 return (0); 11823859Sml29623 } 11833859Sml29623 11843859Sml29623 11853859Sml29623 /* ARGSUSED */ 11863859Sml29623 int 11873859Sml29623 nxge_param_set_generic(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 11883859Sml29623 char *value, caddr_t cp) 11893859Sml29623 { 11903859Sml29623 char *end; 11913859Sml29623 uint32_t new_value; 11923859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 11933859Sml29623 11943859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, " ==> nxge_param_set_generic")); 11953859Sml29623 new_value = (uint32_t)mi_strtol(value, &end, 10); 11963859Sml29623 if (end == value || new_value < pa->minimum || 11976512Ssowmini new_value > pa->maximum) { 11983859Sml29623 return (EINVAL); 11993859Sml29623 } 12003859Sml29623 pa->value = new_value; 12013859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, " <== nxge_param_set_generic")); 12023859Sml29623 return (0); 12033859Sml29623 } 12043859Sml29623 12053859Sml29623 12063859Sml29623 /* ARGSUSED */ 12073859Sml29623 int 12083859Sml29623 nxge_param_set_instance(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 12093859Sml29623 char *value, caddr_t cp) 12103859Sml29623 { 12113859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " ==> nxge_param_set_instance")); 12123859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_set_instance")); 12133859Sml29623 return (0); 12143859Sml29623 } 12153859Sml29623 12163859Sml29623 12173859Sml29623 /* ARGSUSED */ 12183859Sml29623 int 12193859Sml29623 nxge_param_set_mac(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 12203859Sml29623 char *value, caddr_t cp) 12213859Sml29623 { 12223859Sml29623 char *end; 12233859Sml29623 uint32_t new_value; 12243859Sml29623 int status = 0; 12253859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 12263859Sml29623 12273859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_mac")); 12283859Sml29623 new_value = (uint32_t)mi_strtol(value, &end, BASE_DECIMAL); 12293859Sml29623 if (PARAM_OUTOF_RANGE(value, end, new_value, pa)) { 12303859Sml29623 return (EINVAL); 12313859Sml29623 } 12323859Sml29623 12333859Sml29623 if (pa->value != new_value) { 12343859Sml29623 pa->old_value = pa->value; 12353859Sml29623 pa->value = new_value; 12363859Sml29623 } 12373859Sml29623 12383859Sml29623 if (!nxge_param_link_update(nxgep)) { 12393859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 12406512Ssowmini " false ret from nxge_param_link_update")); 12413859Sml29623 status = EINVAL; 12423859Sml29623 } 12433859Sml29623 12443859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_mac")); 12453859Sml29623 return (status); 12463859Sml29623 } 12473859Sml29623 12483859Sml29623 /* ARGSUSED */ 12496439Sml29623 int 12503859Sml29623 nxge_param_rx_intr_pkts(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 12513859Sml29623 char *value, caddr_t cp) 12523859Sml29623 { 12533859Sml29623 char *end; 12543859Sml29623 uint32_t cfg_value; 12553859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 12563859Sml29623 12573859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_rx_intr_pkts")); 12583859Sml29623 12593859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY); 12603859Sml29623 12613859Sml29623 if ((cfg_value > NXGE_RDC_RCR_THRESHOLD_MAX) || 12626512Ssowmini (cfg_value < NXGE_RDC_RCR_THRESHOLD_MIN)) { 12633859Sml29623 return (EINVAL); 12643859Sml29623 } 12653859Sml29623 12663859Sml29623 if ((pa->value != cfg_value)) { 12673859Sml29623 pa->old_value = pa->value; 12683859Sml29623 pa->value = cfg_value; 12693859Sml29623 nxgep->intr_threshold = pa->value; 12703859Sml29623 } 12713859Sml29623 12723859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_rx_intr_pkts")); 12733859Sml29623 return (0); 12743859Sml29623 } 12753859Sml29623 12763859Sml29623 /* ARGSUSED */ 12776439Sml29623 int 12783859Sml29623 nxge_param_rx_intr_time(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 12793859Sml29623 char *value, caddr_t cp) 12803859Sml29623 { 12813859Sml29623 char *end; 12823859Sml29623 uint32_t cfg_value; 12833859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 12843859Sml29623 12853859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_rx_intr_time")); 12863859Sml29623 12873859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY); 12883859Sml29623 12893859Sml29623 if ((cfg_value > NXGE_RDC_RCR_TIMEOUT_MAX) || 12906512Ssowmini (cfg_value < NXGE_RDC_RCR_TIMEOUT_MIN)) { 12913859Sml29623 return (EINVAL); 12923859Sml29623 } 12933859Sml29623 12943859Sml29623 if ((pa->value != cfg_value)) { 12953859Sml29623 pa->old_value = pa->value; 12963859Sml29623 pa->value = cfg_value; 12973859Sml29623 nxgep->intr_timeout = pa->value; 12983859Sml29623 } 12993859Sml29623 13003859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_rx_intr_time")); 13013859Sml29623 return (0); 13023859Sml29623 } 13033859Sml29623 13043859Sml29623 /* ARGSUSED */ 13053859Sml29623 static int 13063859Sml29623 nxge_param_set_mac_rdcgrp(p_nxge_t nxgep, queue_t *q, 13073859Sml29623 mblk_t *mp, char *value, caddr_t cp) 13083859Sml29623 { 13093859Sml29623 char *end; 13103859Sml29623 uint32_t status = 0, cfg_value; 13113859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 13123859Sml29623 uint32_t cfg_it = B_FALSE; 13133859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 13143859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 13153859Sml29623 uint32_t *val_ptr, *old_val_ptr; 13163859Sml29623 nxge_param_map_t *mac_map; 13173859Sml29623 p_nxge_class_pt_cfg_t p_class_cfgp; 13183859Sml29623 nxge_mv_cfg_t *mac_host_info; 13193859Sml29623 13203859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_mac_rdcgrp ")); 13213859Sml29623 13223859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 13233859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 13243859Sml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config; 13253859Sml29623 mac_host_info = (nxge_mv_cfg_t *)&p_class_cfgp->mac_host_info[0]; 13263859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 13273859Sml29623 13283859Sml29623 /* 13293859Sml29623 * now do decoding 13303859Sml29623 */ 13313859Sml29623 mac_map = (nxge_param_map_t *)&cfg_value; 13323859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " cfg_value %x id %x map_to %x", 13336512Ssowmini cfg_value, mac_map->param_id, mac_map->map_to)); 13343859Sml29623 13353859Sml29623 if ((mac_map->param_id < p_cfgp->max_macs) && 13366495Sspeer p_cfgp->grpids[mac_map->map_to]) { 13373859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 13386495Sspeer " nxge_param_set_mac_rdcgrp mapping" 13396495Sspeer " id %d grp %d", mac_map->param_id, mac_map->map_to)); 13405125Sjoycey #if defined(__i386) 13415125Sjoycey val_ptr = (uint32_t *)(uint32_t)pa->value; 13425125Sjoycey #else 13433859Sml29623 val_ptr = (uint32_t *)pa->value; 13445125Sjoycey #endif 13455125Sjoycey #if defined(__i386) 13465125Sjoycey old_val_ptr = (uint32_t *)(uint32_t)pa->old_value; 13475125Sjoycey #else 13483859Sml29623 old_val_ptr = (uint32_t *)pa->old_value; 13495125Sjoycey #endif 13503859Sml29623 if (val_ptr[mac_map->param_id] != cfg_value) { 13513859Sml29623 old_val_ptr[mac_map->param_id] = 13526495Sspeer val_ptr[mac_map->param_id]; 13533859Sml29623 val_ptr[mac_map->param_id] = cfg_value; 13543859Sml29623 mac_host_info[mac_map->param_id].mpr_npr = 13556495Sspeer mac_map->pref; 13563859Sml29623 mac_host_info[mac_map->param_id].flag = 1; 13573859Sml29623 mac_host_info[mac_map->param_id].rdctbl = 13586495Sspeer mac_map->map_to; 13593859Sml29623 cfg_it = B_TRUE; 13603859Sml29623 } 13613859Sml29623 } else { 13623859Sml29623 return (EINVAL); 13633859Sml29623 } 13643859Sml29623 13653859Sml29623 if (cfg_it == B_TRUE) { 13663859Sml29623 status = nxge_logical_mac_assign_rdc_table(nxgep, 13676495Sspeer (uint8_t)mac_map->param_id); 13683859Sml29623 if (status != NXGE_OK) 13693859Sml29623 return (EINVAL); 13703859Sml29623 } 13713859Sml29623 13723859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_mac_rdcgrp")); 13733859Sml29623 return (0); 13743859Sml29623 } 13753859Sml29623 13763859Sml29623 /* ARGSUSED */ 13773859Sml29623 static int 13783859Sml29623 nxge_param_set_vlan_rdcgrp(p_nxge_t nxgep, queue_t *q, 13793859Sml29623 mblk_t *mp, char *value, caddr_t cp) 13803859Sml29623 { 13813859Sml29623 char *end; 13823859Sml29623 uint32_t status = 0, cfg_value; 13833859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 13843859Sml29623 uint32_t cfg_it = B_FALSE; 13853859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 13863859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 13873859Sml29623 uint32_t *val_ptr, *old_val_ptr; 13883859Sml29623 nxge_param_map_t *vmap, *old_map; 13893859Sml29623 p_nxge_class_pt_cfg_t p_class_cfgp; 13903859Sml29623 uint64_t cfgd_vlans; 13913859Sml29623 int i, inc = 0, cfg_position; 13923859Sml29623 nxge_mv_cfg_t *vlan_tbl; 13933859Sml29623 13943859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_vlan_rdcgrp ")); 13953859Sml29623 13963859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 13973859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 13983859Sml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config; 13993859Sml29623 vlan_tbl = (nxge_mv_cfg_t *)&p_class_cfgp->vlan_tbl[0]; 14003859Sml29623 14013859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 14023859Sml29623 14033859Sml29623 /* now do decoding */ 14043859Sml29623 cfgd_vlans = ((pa->type & NXGE_PARAM_ARRAY_CNT_MASK) >> 14056512Ssowmini NXGE_PARAM_ARRAY_CNT_SHIFT); 14063859Sml29623 14073859Sml29623 if (cfgd_vlans == NXGE_PARAM_ARRAY_INIT_SIZE) { 14083859Sml29623 /* 14093859Sml29623 * for now, we process only upto max 14103859Sml29623 * NXGE_PARAM_ARRAY_INIT_SIZE parameters 14113859Sml29623 * In the future, we may want to expand 14123859Sml29623 * the storage array and continue 14133859Sml29623 */ 14143859Sml29623 return (EINVAL); 14153859Sml29623 } 14163859Sml29623 14173859Sml29623 vmap = (nxge_param_map_t *)&cfg_value; 14183859Sml29623 if ((vmap->param_id) && 14196512Ssowmini (vmap->param_id < NXGE_MAX_VLANS) && 14206512Ssowmini (vmap->map_to < p_cfgp->max_rdc_grpids)) { 14213859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 14226512Ssowmini "nxge_param_set_vlan_rdcgrp mapping" 14236512Ssowmini " id %d grp %d", 14246512Ssowmini vmap->param_id, vmap->map_to)); 14255125Sjoycey #if defined(__i386) 14265125Sjoycey val_ptr = (uint32_t *)(uint32_t)pa->value; 14275125Sjoycey #else 14283859Sml29623 val_ptr = (uint32_t *)pa->value; 14295125Sjoycey #endif 14305125Sjoycey #if defined(__i386) 14315125Sjoycey old_val_ptr = (uint32_t *)(uint32_t)pa->old_value; 14325125Sjoycey #else 14333859Sml29623 old_val_ptr = (uint32_t *)pa->old_value; 14345125Sjoycey #endif 14353859Sml29623 14363859Sml29623 /* search to see if this vlan id is already configured */ 14373859Sml29623 for (i = 0; i < cfgd_vlans; i++) { 14383859Sml29623 old_map = (nxge_param_map_t *)&val_ptr[i]; 14393859Sml29623 if ((old_map->param_id == 0) || 14406512Ssowmini (vmap->param_id == old_map->param_id) || 14416512Ssowmini (vlan_tbl[vmap->param_id].flag)) { 14423859Sml29623 cfg_position = i; 14433859Sml29623 break; 14443859Sml29623 } 14453859Sml29623 } 14463859Sml29623 14473859Sml29623 if (cfgd_vlans == 0) { 14483859Sml29623 cfg_position = 0; 14493859Sml29623 inc++; 14503859Sml29623 } 14513859Sml29623 14523859Sml29623 if (i == cfgd_vlans) { 14533859Sml29623 cfg_position = i; 14543859Sml29623 inc++; 14553859Sml29623 } 14563859Sml29623 14573859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL, 14586512Ssowmini "set_vlan_rdcgrp mapping" 14596512Ssowmini " i %d cfgd_vlans %llx position %d ", 14606512Ssowmini i, cfgd_vlans, cfg_position)); 14613859Sml29623 if (val_ptr[cfg_position] != cfg_value) { 14623859Sml29623 old_val_ptr[cfg_position] = val_ptr[cfg_position]; 14633859Sml29623 val_ptr[cfg_position] = cfg_value; 14643859Sml29623 vlan_tbl[vmap->param_id].mpr_npr = vmap->pref; 14653859Sml29623 vlan_tbl[vmap->param_id].flag = 1; 14663859Sml29623 vlan_tbl[vmap->param_id].rdctbl = 14676495Sspeer vmap->map_to + p_cfgp->def_mac_rxdma_grpid; 14683859Sml29623 cfg_it = B_TRUE; 14693859Sml29623 if (inc) { 14703859Sml29623 cfgd_vlans++; 14713859Sml29623 pa->type &= ~NXGE_PARAM_ARRAY_CNT_MASK; 14723859Sml29623 pa->type |= (cfgd_vlans << 14736512Ssowmini NXGE_PARAM_ARRAY_CNT_SHIFT); 14743859Sml29623 14753859Sml29623 } 14763859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL, 14776512Ssowmini "after: param_set_vlan_rdcgrp " 14786512Ssowmini " cfg_vlans %llx position %d \n", 14796512Ssowmini cfgd_vlans, cfg_position)); 14803859Sml29623 } 14813859Sml29623 } else { 14823859Sml29623 return (EINVAL); 14833859Sml29623 } 14843859Sml29623 14853859Sml29623 if (cfg_it == B_TRUE) { 14863859Sml29623 status = nxge_fflp_config_vlan_table(nxgep, 14876512Ssowmini (uint16_t)vmap->param_id); 14883859Sml29623 if (status != NXGE_OK) 14893859Sml29623 return (EINVAL); 14903859Sml29623 } 14913859Sml29623 14923859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_vlan_rdcgrp")); 14933859Sml29623 return (0); 14943859Sml29623 } 14953859Sml29623 14963859Sml29623 /* ARGSUSED */ 14973859Sml29623 static int 14983859Sml29623 nxge_param_get_vlan_rdcgrp(p_nxge_t nxgep, queue_t *q, 14993859Sml29623 mblk_t *mp, caddr_t cp) 15003859Sml29623 { 15013859Sml29623 15023859Sml29623 uint_t print_len, buf_len; 15033859Sml29623 p_mblk_t np; 15043859Sml29623 int i; 15053859Sml29623 uint32_t *val_ptr; 15063859Sml29623 nxge_param_map_t *vmap; 15073859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 15083859Sml29623 p_nxge_class_pt_cfg_t p_class_cfgp; 15093859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 15103859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 15113859Sml29623 uint64_t cfgd_vlans = 0; 15123859Sml29623 nxge_mv_cfg_t *vlan_tbl; 15133859Sml29623 int buff_alloc_size = 15146512Ssowmini NXGE_NDD_INFODUMP_BUFF_SIZE * 32; 15153859Sml29623 15163859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_vlan_rdcgrp ")); 15173859Sml29623 (void) mi_mpprintf(mp, "VLAN RDC Mapping Information for Port\t %d \n", 15186512Ssowmini nxgep->function_num); 15193859Sml29623 15203859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 15213859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 15223859Sml29623 return (0); 15233859Sml29623 } 15243859Sml29623 15253859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 15263859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 15273859Sml29623 15283859Sml29623 buf_len = buff_alloc_size; 15293859Sml29623 mp->b_cont = np; 15303859Sml29623 cfgd_vlans = (pa->type & NXGE_PARAM_ARRAY_CNT_MASK) >> 15316512Ssowmini NXGE_PARAM_ARRAY_CNT_SHIFT; 15323859Sml29623 15333859Sml29623 i = (int)cfgd_vlans; 15343859Sml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config; 15353859Sml29623 vlan_tbl = (nxge_mv_cfg_t *)&p_class_cfgp->vlan_tbl[0]; 15363859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 15376512Ssowmini "Configured VLANs %d\n" 15386512Ssowmini "VLAN ID\t RDC GRP (Actual/Port)\t" 15396512Ssowmini " Prefernce\n", i); 15403859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 15413859Sml29623 buf_len -= print_len; 15425125Sjoycey #if defined(__i386) 15435125Sjoycey val_ptr = (uint32_t *)(uint32_t)pa->value; 15445125Sjoycey #else 15453859Sml29623 val_ptr = (uint32_t *)pa->value; 15465125Sjoycey #endif 15473859Sml29623 15483859Sml29623 for (i = 0; i < cfgd_vlans; i++) { 15493859Sml29623 vmap = (nxge_param_map_t *)&val_ptr[i]; 15503859Sml29623 if (p_class_cfgp->vlan_tbl[vmap->param_id].flag) { 15513859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 15526512Ssowmini buf_len, 15536512Ssowmini " %d\t\t %d/%d\t\t %d\n", 15546512Ssowmini vmap->param_id, 15556512Ssowmini vlan_tbl[vmap->param_id].rdctbl, 15566512Ssowmini vlan_tbl[vmap->param_id].rdctbl - 15576512Ssowmini p_cfgp->def_mac_rxdma_grpid, 15586512Ssowmini vlan_tbl[vmap->param_id].mpr_npr); 15593859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 15603859Sml29623 buf_len -= print_len; 15613859Sml29623 } 15623859Sml29623 } 15633859Sml29623 15643859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_vlan_rdcgrp")); 15653859Sml29623 return (0); 15663859Sml29623 } 15673859Sml29623 15683859Sml29623 /* ARGSUSED */ 15693859Sml29623 static int 15703859Sml29623 nxge_param_get_mac_rdcgrp(p_nxge_t nxgep, queue_t *q, 15713859Sml29623 mblk_t *mp, caddr_t cp) 15723859Sml29623 { 15733859Sml29623 uint_t print_len, buf_len; 15743859Sml29623 p_mblk_t np; 15753859Sml29623 int i; 15763859Sml29623 p_nxge_class_pt_cfg_t p_class_cfgp; 15773859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 15783859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 15793859Sml29623 nxge_mv_cfg_t *mac_host_info; 15803859Sml29623 15813859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE * 32; 15823859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_mac_rdcgrp ")); 15833859Sml29623 (void) mi_mpprintf(mp, 15846512Ssowmini "MAC ADDR RDC Mapping Information for Port\t %d\n", 15856512Ssowmini nxgep->function_num); 15863859Sml29623 15873859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 15883859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 15893859Sml29623 return (0); 15903859Sml29623 } 15913859Sml29623 15923859Sml29623 buf_len = buff_alloc_size; 15933859Sml29623 mp->b_cont = np; 15943859Sml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config; 15953859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 15963859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 15973859Sml29623 mac_host_info = (nxge_mv_cfg_t *)&p_class_cfgp->mac_host_info[0]; 15983859Sml29623 print_len = snprintf((char *)np->b_wptr, buf_len, 15996512Ssowmini "MAC ID\t RDC GRP (Actual/Port)\t" 16006512Ssowmini " Prefernce\n"); 16013859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 16023859Sml29623 buf_len -= print_len; 16033859Sml29623 for (i = 0; i < p_cfgp->max_macs; i++) { 16043859Sml29623 if (mac_host_info[i].flag) { 16053859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 16066512Ssowmini buf_len, 16076512Ssowmini " %d\t %d/%d\t\t %d\n", 16086512Ssowmini i, mac_host_info[i].rdctbl, 16096512Ssowmini mac_host_info[i].rdctbl - 16106512Ssowmini p_cfgp->def_mac_rxdma_grpid, 16116512Ssowmini mac_host_info[i].mpr_npr); 16123859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 16133859Sml29623 buf_len -= print_len; 16143859Sml29623 } 16153859Sml29623 } 16163859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 16176512Ssowmini "Done Info Dumping \n"); 16183859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 16193859Sml29623 buf_len -= print_len; 16203859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_macrdcgrp")); 16213859Sml29623 return (0); 16223859Sml29623 } 16233859Sml29623 16243859Sml29623 /* ARGSUSED */ 16253859Sml29623 static int 16263859Sml29623 nxge_param_tcam_enable(p_nxge_t nxgep, queue_t *q, 16273859Sml29623 mblk_t *mp, char *value, caddr_t cp) 16283859Sml29623 { 16293859Sml29623 uint32_t status = 0, cfg_value; 16303859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 16313859Sml29623 uint32_t cfg_it = B_FALSE; 16323859Sml29623 char *end; 16333859Sml29623 16343859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_tcam_enable")); 16353859Sml29623 16363859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_BINARY); 16373859Sml29623 if (pa->value != cfg_value) { 16383859Sml29623 pa->old_value = pa->value; 16393859Sml29623 pa->value = cfg_value; 16403859Sml29623 cfg_it = B_TRUE; 16413859Sml29623 } 16423859Sml29623 16433859Sml29623 if (cfg_it == B_TRUE) { 16443859Sml29623 if (pa->value) 16453859Sml29623 status = nxge_fflp_config_tcam_enable(nxgep); 16463859Sml29623 else 16473859Sml29623 status = nxge_fflp_config_tcam_disable(nxgep); 16483859Sml29623 if (status != NXGE_OK) 16493859Sml29623 return (EINVAL); 16503859Sml29623 } 16513859Sml29623 16523859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_tcam_enable")); 16533859Sml29623 return (0); 16543859Sml29623 } 16553859Sml29623 16563859Sml29623 /* ARGSUSED */ 16573859Sml29623 static int 16583859Sml29623 nxge_param_hash_lookup_enable(p_nxge_t nxgep, queue_t *q, 16593859Sml29623 mblk_t *mp, char *value, caddr_t cp) 16603859Sml29623 { 16613859Sml29623 uint32_t status = 0, cfg_value; 16623859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 16633859Sml29623 uint32_t cfg_it = B_FALSE; 16643859Sml29623 char *end; 16653859Sml29623 16663859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_hash_lookup_enable")); 16673859Sml29623 16683859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_BINARY); 16693859Sml29623 if (pa->value != cfg_value) { 16703859Sml29623 pa->old_value = pa->value; 16713859Sml29623 pa->value = cfg_value; 16723859Sml29623 cfg_it = B_TRUE; 16733859Sml29623 } 16743859Sml29623 16753859Sml29623 if (cfg_it == B_TRUE) { 16763859Sml29623 if (pa->value) 16773859Sml29623 status = nxge_fflp_config_hash_lookup_enable(nxgep); 16783859Sml29623 else 16793859Sml29623 status = nxge_fflp_config_hash_lookup_disable(nxgep); 16803859Sml29623 if (status != NXGE_OK) 16813859Sml29623 return (EINVAL); 16823859Sml29623 } 16833859Sml29623 16843859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_hash_lookup_enable")); 16853859Sml29623 return (0); 16863859Sml29623 } 16873859Sml29623 16883859Sml29623 /* ARGSUSED */ 16893859Sml29623 static int 16903859Sml29623 nxge_param_llc_snap_enable(p_nxge_t nxgep, queue_t *q, 16913859Sml29623 mblk_t *mp, char *value, caddr_t cp) 16923859Sml29623 { 16933859Sml29623 char *end; 16943859Sml29623 uint32_t status = 0, cfg_value; 16953859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 16963859Sml29623 uint32_t cfg_it = B_FALSE; 16973859Sml29623 16983859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_llc_snap_enable")); 16993859Sml29623 17003859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_BINARY); 17013859Sml29623 if (pa->value != cfg_value) { 17023859Sml29623 pa->old_value = pa->value; 17033859Sml29623 pa->value = cfg_value; 17043859Sml29623 cfg_it = B_TRUE; 17053859Sml29623 } 17063859Sml29623 17073859Sml29623 if (cfg_it == B_TRUE) { 17083859Sml29623 if (pa->value) 17093859Sml29623 status = nxge_fflp_config_tcam_enable(nxgep); 17103859Sml29623 else 17113859Sml29623 status = nxge_fflp_config_tcam_disable(nxgep); 17123859Sml29623 if (status != NXGE_OK) 17133859Sml29623 return (EINVAL); 17143859Sml29623 } 17153859Sml29623 17163859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_llc_snap_enable")); 17173859Sml29623 return (0); 17183859Sml29623 } 17193859Sml29623 17203859Sml29623 /* ARGSUSED */ 17213859Sml29623 static int 17223859Sml29623 nxge_param_set_ether_usr(p_nxge_t nxgep, queue_t *q, 17233859Sml29623 mblk_t *mp, char *value, caddr_t cp) 17243859Sml29623 { 17253859Sml29623 char *end; 17263859Sml29623 uint8_t ether_class; 17273859Sml29623 uint32_t status = 0, cfg_value; 17283859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 17293859Sml29623 uint8_t cfg_it = B_FALSE; 17303859Sml29623 17313859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_ether_usr")); 17323859Sml29623 17333859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 17343859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 17353859Sml29623 return (EINVAL); 17363859Sml29623 } 17373859Sml29623 17383859Sml29623 if (pa->value != cfg_value) { 17393859Sml29623 pa->old_value = pa->value; 17403859Sml29623 pa->value = cfg_value; 17413859Sml29623 cfg_it = B_TRUE; 17423859Sml29623 } 17433859Sml29623 17443859Sml29623 /* do the actual hw setup */ 17453859Sml29623 if (cfg_it == B_TRUE) { 17463859Sml29623 ether_class = mi_strtol(pa->name, &end, 10); 17473859Sml29623 #ifdef lint 17483859Sml29623 ether_class = ether_class; 17493859Sml29623 #endif 17503859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " nxge_param_set_ether_usr")); 17513859Sml29623 } 17523859Sml29623 17533859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_ether_usr")); 17543859Sml29623 return (status); 17553859Sml29623 } 17563859Sml29623 17573859Sml29623 /* ARGSUSED */ 17583859Sml29623 static int 17593859Sml29623 nxge_param_set_ip_usr(p_nxge_t nxgep, queue_t *q, 17603859Sml29623 mblk_t *mp, char *value, caddr_t cp) 17613859Sml29623 { 17623859Sml29623 char *end; 17633859Sml29623 tcam_class_t class; 17643859Sml29623 uint32_t status, cfg_value; 17653859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 17663859Sml29623 uint32_t cfg_it = B_FALSE; 17673859Sml29623 17683859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_ip_usr")); 17693859Sml29623 17703859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 17713859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 17723859Sml29623 return (EINVAL); 17733859Sml29623 } 17743859Sml29623 17753859Sml29623 if (pa->value != cfg_value) { 17763859Sml29623 pa->old_value = pa->value; 17773859Sml29623 pa->value = cfg_value; 17783859Sml29623 cfg_it = B_TRUE; 17793859Sml29623 } 17803859Sml29623 17813859Sml29623 /* do the actual hw setup with cfg_value. */ 17823859Sml29623 if (cfg_it == B_TRUE) { 17833859Sml29623 class = mi_strtol(pa->name, &end, 10); 17843859Sml29623 status = nxge_fflp_ip_usr_class_config(nxgep, class, pa->value); 17853859Sml29623 } 17863859Sml29623 17873859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_ip_usr")); 17883859Sml29623 return (status); 17893859Sml29623 } 17903859Sml29623 17913859Sml29623 /* ARGSUSED */ 17923859Sml29623 static int 17933859Sml29623 nxge_class_name_2value(p_nxge_t nxgep, char *name) 17943859Sml29623 { 17953859Sml29623 int i; 17963859Sml29623 int class_instance = param_class_opt_ip_usr4; 17973859Sml29623 p_nxge_param_t param_arr; 17983859Sml29623 17993859Sml29623 param_arr = nxgep->param_arr; 18003859Sml29623 for (i = TCAM_CLASS_IP_USER_4; i <= TCAM_CLASS_SCTP_IPV6; i++) { 18013859Sml29623 if (strcmp(param_arr[class_instance].name, name) == 0) 18023859Sml29623 return (i); 18033859Sml29623 class_instance++; 18043859Sml29623 } 18053859Sml29623 return (-1); 18063859Sml29623 } 18073859Sml29623 18083859Sml29623 /* ARGSUSED */ 18096439Sml29623 int 18103859Sml29623 nxge_param_set_ip_opt(p_nxge_t nxgep, queue_t *q, 18113859Sml29623 mblk_t *mp, char *value, caddr_t cp) 18123859Sml29623 { 18133859Sml29623 char *end; 18143859Sml29623 uint32_t status, cfg_value; 18153859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 18163859Sml29623 tcam_class_t class; 18173859Sml29623 uint32_t cfg_it = B_FALSE; 18183859Sml29623 18193859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_ip_opt")); 18203859Sml29623 18213859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 18223859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 18233859Sml29623 return (EINVAL); 18243859Sml29623 } 18253859Sml29623 18263859Sml29623 if (pa->value != cfg_value) { 18273859Sml29623 pa->old_value = pa->value; 18283859Sml29623 pa->value = cfg_value; 18293859Sml29623 cfg_it = B_TRUE; 18303859Sml29623 } 18313859Sml29623 18323859Sml29623 if (cfg_it == B_TRUE) { 18333859Sml29623 /* do the actual hw setup */ 18343859Sml29623 class = nxge_class_name_2value(nxgep, pa->name); 18353859Sml29623 if (class == -1) 18363859Sml29623 return (EINVAL); 18373859Sml29623 18383859Sml29623 status = nxge_fflp_ip_class_config(nxgep, class, pa->value); 18393859Sml29623 if (status != NXGE_OK) 18403859Sml29623 return (EINVAL); 18413859Sml29623 } 18423859Sml29623 18433859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_ip_opt")); 18443859Sml29623 return (0); 18453859Sml29623 } 18463859Sml29623 18473859Sml29623 /* ARGSUSED */ 18483859Sml29623 static int 18493859Sml29623 nxge_param_get_ip_opt(p_nxge_t nxgep, queue_t *q, 18503859Sml29623 mblk_t *mp, caddr_t cp) 18513859Sml29623 { 18523859Sml29623 uint32_t status, cfg_value; 18533859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 18543859Sml29623 tcam_class_t class; 18553859Sml29623 18563859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_ip_opt")); 18573859Sml29623 18583859Sml29623 /* do the actual hw setup */ 18593859Sml29623 class = nxge_class_name_2value(nxgep, pa->name); 18603859Sml29623 if (class == -1) 18613859Sml29623 return (EINVAL); 18623859Sml29623 18633859Sml29623 cfg_value = 0; 18643859Sml29623 status = nxge_fflp_ip_class_config_get(nxgep, class, &cfg_value); 18653859Sml29623 if (status != NXGE_OK) 18663859Sml29623 return (EINVAL); 18673859Sml29623 18683859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 18696512Ssowmini "nxge_param_get_ip_opt_get %x ", cfg_value)); 18703859Sml29623 18713859Sml29623 pa->value = cfg_value; 18723859Sml29623 (void) mi_mpprintf(mp, "%x", cfg_value); 18733859Sml29623 18743859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_ip_opt status ")); 18753859Sml29623 return (0); 18763859Sml29623 } 18773859Sml29623 18783859Sml29623 /* ARGSUSED */ 18793859Sml29623 static int 18803859Sml29623 nxge_param_fflp_hash_init(p_nxge_t nxgep, queue_t *q, 18813859Sml29623 mblk_t *mp, char *value, caddr_t cp) 18823859Sml29623 { 18833859Sml29623 char *end; 18843859Sml29623 uint32_t status, cfg_value; 18853859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 18863859Sml29623 tcam_class_t class; 18873859Sml29623 uint32_t cfg_it = B_FALSE; 18883859Sml29623 18893859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_fflp_hash_init")); 18903859Sml29623 18913859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 18923859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 18933859Sml29623 return (EINVAL); 18943859Sml29623 } 18953859Sml29623 18963859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 18976512Ssowmini "nxge_param_fflp_hash_init value %x", cfg_value)); 18983859Sml29623 18993859Sml29623 if (pa->value != cfg_value) { 19003859Sml29623 pa->old_value = pa->value; 19013859Sml29623 pa->value = cfg_value; 19023859Sml29623 cfg_it = B_TRUE; 19033859Sml29623 } 19043859Sml29623 19053859Sml29623 if (cfg_it == B_TRUE) { 19063859Sml29623 char *h_name; 19073859Sml29623 19083859Sml29623 /* do the actual hw setup */ 19093859Sml29623 h_name = pa->name; 19103859Sml29623 h_name++; 19113859Sml29623 class = mi_strtol(h_name, &end, 10); 19123859Sml29623 switch (class) { 19133859Sml29623 case 1: 19143859Sml29623 status = nxge_fflp_set_hash1(nxgep, 19156512Ssowmini (uint32_t)pa->value); 19163859Sml29623 break; 19173859Sml29623 case 2: 19183859Sml29623 status = nxge_fflp_set_hash2(nxgep, 19196512Ssowmini (uint16_t)pa->value); 19203859Sml29623 break; 19213859Sml29623 19223859Sml29623 default: 19233859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 19246512Ssowmini " nxge_param_fflp_hash_init" 19256512Ssowmini " %s Wrong hash var %d", 19266512Ssowmini pa->name, class)); 19273859Sml29623 return (EINVAL); 19283859Sml29623 } 19293859Sml29623 if (status != NXGE_OK) 19303859Sml29623 return (EINVAL); 19313859Sml29623 } 19323859Sml29623 19333859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_fflp_hash_init")); 19343859Sml29623 return (0); 19353859Sml29623 } 19363859Sml29623 19373859Sml29623 /* ARGSUSED */ 19383859Sml29623 static int 19393859Sml29623 nxge_param_set_grp_rdc(p_nxge_t nxgep, queue_t *q, 19403859Sml29623 mblk_t *mp, char *value, caddr_t cp) 19413859Sml29623 { 19423859Sml29623 char *end; 19433859Sml29623 uint32_t status = 0, cfg_value; 19443859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 19453859Sml29623 uint32_t cfg_it = B_FALSE; 19463859Sml29623 int rdc_grp; 19473859Sml29623 uint8_t real_rdc; 19483859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 19493859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 19503859Sml29623 p_nxge_rdc_grp_t rdc_grp_p; 19513859Sml29623 19523859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 19533859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 19543859Sml29623 19553859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_grp_rdc")); 19563859Sml29623 19573859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY); 19583859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 19593859Sml29623 return (EINVAL); 19603859Sml29623 } 19613859Sml29623 19623859Sml29623 if (cfg_value >= p_cfgp->max_rdcs) { 19633859Sml29623 return (EINVAL); 19643859Sml29623 } 19653859Sml29623 19663859Sml29623 if (pa->value != cfg_value) { 19673859Sml29623 pa->old_value = pa->value; 19683859Sml29623 pa->value = cfg_value; 19693859Sml29623 cfg_it = B_TRUE; 19703859Sml29623 } 19713859Sml29623 19723859Sml29623 if (cfg_it == B_TRUE) { 19733859Sml29623 char *grp_name; 19743859Sml29623 grp_name = pa->name; 19753859Sml29623 grp_name += strlen("default-grp"); 19763859Sml29623 rdc_grp = mi_strtol(grp_name, &end, 10); 19773859Sml29623 rdc_grp_p = &p_dma_cfgp->rdc_grps[rdc_grp]; 19783859Sml29623 real_rdc = rdc_grp_p->start_rdc + cfg_value; 19793859Sml29623 if (nxge_check_rxdma_rdcgrp_member(nxgep, rdc_grp, 19806512Ssowmini cfg_value) == B_FALSE) { 19813859Sml29623 pa->value = pa->old_value; 19823859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 19836512Ssowmini " nxge_param_set_grp_rdc" 19846512Ssowmini " %d read %d actual %d outof range", 19856512Ssowmini rdc_grp, cfg_value, real_rdc)); 19863859Sml29623 return (EINVAL); 19873859Sml29623 } 19883859Sml29623 status = nxge_rxdma_cfg_rdcgrp_default_rdc(nxgep, rdc_grp, 19896512Ssowmini real_rdc); 19903859Sml29623 if (status != NXGE_OK) 19913859Sml29623 return (EINVAL); 19923859Sml29623 } 19933859Sml29623 19943859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_grp_rdc")); 19953859Sml29623 return (0); 19963859Sml29623 } 19973859Sml29623 19983859Sml29623 /* ARGSUSED */ 19993859Sml29623 static int 20003859Sml29623 nxge_param_set_port_rdc(p_nxge_t nxgep, queue_t *q, 20013859Sml29623 mblk_t *mp, char *value, caddr_t cp) 20023859Sml29623 { 20033859Sml29623 char *end; 20043859Sml29623 uint32_t status = B_TRUE, cfg_value; 20053859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 20063859Sml29623 uint32_t cfg_it = B_FALSE; 20073859Sml29623 20083859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 20093859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 20103859Sml29623 20113859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_port_rdc")); 20123859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 20133859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 20143859Sml29623 20153859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY); 20163859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 20173859Sml29623 return (EINVAL); 20183859Sml29623 } 20193859Sml29623 20203859Sml29623 if (pa->value != cfg_value) { 20213859Sml29623 if (cfg_value >= p_cfgp->max_rdcs) 20223859Sml29623 return (EINVAL); 20233859Sml29623 pa->old_value = pa->value; 20243859Sml29623 pa->value = cfg_value; 20253859Sml29623 cfg_it = B_TRUE; 20263859Sml29623 } 20273859Sml29623 20283859Sml29623 if (cfg_it == B_TRUE) { 20296495Sspeer int rdc; 20306495Sspeer if ((rdc = nxge_dci_map(nxgep, VP_BOUND_RX, cfg_value)) < 0) 20316495Sspeer return (EINVAL); 20323859Sml29623 status = nxge_rxdma_cfg_port_default_rdc(nxgep, 20336495Sspeer nxgep->function_num, rdc); 20343859Sml29623 if (status != NXGE_OK) 20353859Sml29623 return (EINVAL); 20363859Sml29623 } 20373859Sml29623 20383859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_port_rdc")); 20393859Sml29623 return (0); 20403859Sml29623 } 20413859Sml29623 20423859Sml29623 /* ARGSUSED */ 20433859Sml29623 static int 20443859Sml29623 nxge_param_set_nxge_debug_flag(p_nxge_t nxgep, queue_t *q, 20453859Sml29623 mblk_t *mp, char *value, caddr_t cp) 20463859Sml29623 { 20473859Sml29623 char *end; 20483859Sml29623 uint32_t status = 0; 20493859Sml29623 uint64_t cfg_value = 0; 20503859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 20513859Sml29623 uint32_t cfg_it = B_FALSE; 20523859Sml29623 20533859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_nxge_debug_flag")); 20543859Sml29623 cfg_value = mi_strtol(value, &end, BASE_HEX); 20553859Sml29623 20563859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 20573859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 20586512Ssowmini " nxge_param_set_nxge_debug_flag" 20596512Ssowmini " outof range %llx", cfg_value)); 20603859Sml29623 return (EINVAL); 20613859Sml29623 } 20623859Sml29623 if (pa->value != cfg_value) { 20633859Sml29623 pa->old_value = pa->value; 20643859Sml29623 pa->value = cfg_value; 20653859Sml29623 cfg_it = B_TRUE; 20663859Sml29623 } 20673859Sml29623 20683859Sml29623 if (cfg_it == B_TRUE) { 20693859Sml29623 nxgep->nxge_debug_level = pa->value; 20703859Sml29623 } 20713859Sml29623 20723859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_nxge_debug_flag")); 20733859Sml29623 return (status); 20743859Sml29623 } 20753859Sml29623 20763859Sml29623 /* ARGSUSED */ 20773859Sml29623 static int 20783859Sml29623 nxge_param_get_debug_flag(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 20793859Sml29623 { 20803859Sml29623 int status = 0; 20813859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 20823859Sml29623 20833859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_debug_flag")); 20843859Sml29623 20853859Sml29623 if (pa->value > 0xffffffff) 20863859Sml29623 (void) mi_mpprintf(mp, "%x%x", (int)(pa->value >> 32), 20876512Ssowmini (int)(pa->value & 0xffffffff)); 20883859Sml29623 else 20893859Sml29623 (void) mi_mpprintf(mp, "%x", (int)pa->value); 20903859Sml29623 20913859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_debug_flag")); 20923859Sml29623 return (status); 20933859Sml29623 } 20943859Sml29623 20953859Sml29623 /* ARGSUSED */ 20963859Sml29623 static int 20973859Sml29623 nxge_param_set_npi_debug_flag(p_nxge_t nxgep, queue_t *q, 20983859Sml29623 mblk_t *mp, char *value, caddr_t cp) 20993859Sml29623 { 21003859Sml29623 char *end; 21013859Sml29623 uint32_t status = 0; 21023859Sml29623 uint64_t cfg_value = 0; 21033859Sml29623 p_nxge_param_t pa; 21043859Sml29623 uint32_t cfg_it = B_FALSE; 21053859Sml29623 21063859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_npi_debug_flag")); 21073859Sml29623 cfg_value = mi_strtol(value, &end, BASE_HEX); 21083859Sml29623 pa = (p_nxge_param_t)cp; 21093859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 21103859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " nxge_param_set_npi_debug_flag" 21116512Ssowmini " outof range %llx", cfg_value)); 21123859Sml29623 return (EINVAL); 21133859Sml29623 } 21143859Sml29623 if (pa->value != cfg_value) { 21153859Sml29623 pa->old_value = pa->value; 21163859Sml29623 pa->value = cfg_value; 21173859Sml29623 cfg_it = B_TRUE; 21183859Sml29623 } 21193859Sml29623 21203859Sml29623 if (cfg_it == B_TRUE) { 21213859Sml29623 npi_debug_level = pa->value; 21223859Sml29623 } 21233859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_debug_flag")); 21243859Sml29623 return (status); 21253859Sml29623 } 21263859Sml29623 21273859Sml29623 /* ARGSUSED */ 21283859Sml29623 static int 21293859Sml29623 nxge_param_dump_rdc(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21303859Sml29623 { 21316495Sspeer nxge_grp_set_t *set = &nxgep->rx_set; 21326495Sspeer int rdc; 21333859Sml29623 21343859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_rdc")); 21353859Sml29623 21366495Sspeer if (!isLDOMguest(nxgep)) 21376512Ssowmini (void) npi_rxdma_dump_fzc_regs(NXGE_DEV_NPI_HANDLE(nxgep)); 21386495Sspeer 21396495Sspeer for (rdc = 0; rdc < NXGE_MAX_TDCS; rdc++) { 21406495Sspeer if ((1 << rdc) & set->owned.map) { 21416495Sspeer (void) nxge_dump_rxdma_channel(nxgep, rdc); 21426495Sspeer } 21436495Sspeer } 21443859Sml29623 21453859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_rdc")); 21463859Sml29623 return (0); 21473859Sml29623 } 21483859Sml29623 21493859Sml29623 /* ARGSUSED */ 21503859Sml29623 static int 21513859Sml29623 nxge_param_dump_tdc(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21523859Sml29623 { 21536495Sspeer nxge_grp_set_t *set = &nxgep->tx_set; 21546495Sspeer int tdc; 21553859Sml29623 21563859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_tdc")); 21573859Sml29623 21586495Sspeer for (tdc = 0; tdc < NXGE_MAX_TDCS; tdc++) { 21596495Sspeer if ((1 << tdc) & set->owned.map) { 21606495Sspeer (void) nxge_txdma_regs_dump(nxgep, tdc); 21616495Sspeer } 21626495Sspeer } 21633859Sml29623 21643859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_tdc")); 21653859Sml29623 return (0); 21663859Sml29623 } 21673859Sml29623 21683859Sml29623 /* ARGSUSED */ 21693859Sml29623 static int 21703859Sml29623 nxge_param_dump_fflp_regs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21713859Sml29623 { 21723859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_fflp_regs")); 21733859Sml29623 21743859Sml29623 (void) npi_fflp_dump_regs(NXGE_DEV_NPI_HANDLE(nxgep)); 21753859Sml29623 21763859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_fflp_regs")); 21773859Sml29623 return (0); 21783859Sml29623 } 21793859Sml29623 21803859Sml29623 /* ARGSUSED */ 21813859Sml29623 static int 21823859Sml29623 nxge_param_dump_mac_regs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21833859Sml29623 { 21843859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_mac_regs")); 21853859Sml29623 21863859Sml29623 (void) npi_mac_dump_regs(NXGE_DEV_NPI_HANDLE(nxgep), 21876512Ssowmini nxgep->function_num); 21883859Sml29623 21893859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_mac_regs")); 21903859Sml29623 return (0); 21913859Sml29623 } 21923859Sml29623 21933859Sml29623 /* ARGSUSED */ 21943859Sml29623 static int 21953859Sml29623 nxge_param_dump_ipp_regs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21963859Sml29623 { 21973859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_ipp_regs")); 21983859Sml29623 21993859Sml29623 (void) npi_ipp_dump_regs(NXGE_DEV_NPI_HANDLE(nxgep), 22006512Ssowmini nxgep->function_num); 22013859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_ipp_regs")); 22023859Sml29623 return (0); 22033859Sml29623 } 22043859Sml29623 22053859Sml29623 /* ARGSUSED */ 22063859Sml29623 static int 22073859Sml29623 nxge_param_dump_vlan_table(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 22083859Sml29623 { 22093859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_dump_vlan_table")); 22103859Sml29623 22113859Sml29623 (void) npi_fflp_vlan_tbl_dump(NXGE_DEV_NPI_HANDLE(nxgep)); 22123859Sml29623 22133859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_dump_vlan_table")); 22143859Sml29623 return (0); 22153859Sml29623 } 22163859Sml29623 22173859Sml29623 /* ARGSUSED */ 22183859Sml29623 static int 22193859Sml29623 nxge_param_dump_rdc_table(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 22203859Sml29623 { 22213859Sml29623 uint8_t table; 22223859Sml29623 22233859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_dump_rdc_table")); 22243859Sml29623 for (table = 0; table < NXGE_MAX_RDC_GROUPS; table++) { 22253859Sml29623 (void) npi_rxdma_dump_rdc_table(NXGE_DEV_NPI_HANDLE(nxgep), 22266512Ssowmini table); 22273859Sml29623 } 22283859Sml29623 22293859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_dump_rdc_table")); 22303859Sml29623 return (0); 22313859Sml29623 } 22323859Sml29623 22333859Sml29623 typedef struct block_info { 22343859Sml29623 char *name; 22353859Sml29623 uint32_t offset; 22363859Sml29623 } block_info_t; 22373859Sml29623 22383859Sml29623 block_info_t reg_block[] = { 22393859Sml29623 {"PIO", PIO}, 22403859Sml29623 {"FZC_PIO", FZC_PIO}, 22413859Sml29623 {"FZC_XMAC", FZC_MAC}, 22423859Sml29623 {"FZC_IPP", FZC_IPP}, 22433859Sml29623 {"FFLP", FFLP}, 22443859Sml29623 {"FZC_FFLP", FZC_FFLP}, 22453859Sml29623 {"PIO_VADDR", PIO_VADDR}, 22463859Sml29623 {"ZCP", ZCP}, 22473859Sml29623 {"FZC_ZCP", FZC_ZCP}, 22483859Sml29623 {"DMC", DMC}, 22493859Sml29623 {"FZC_DMC", FZC_DMC}, 22503859Sml29623 {"TXC", TXC}, 22513859Sml29623 {"FZC_TXC", FZC_TXC}, 22523859Sml29623 {"PIO_LDSV", PIO_LDSV}, 22533859Sml29623 {"PIO_LDGIM", PIO_LDGIM}, 22543859Sml29623 {"PIO_IMASK0", PIO_IMASK0}, 22553859Sml29623 {"PIO_IMASK1", PIO_IMASK1}, 22563859Sml29623 {"FZC_PROM", FZC_PROM}, 22573859Sml29623 {"END", ALL_FF_32}, 22583859Sml29623 }; 22593859Sml29623 22603859Sml29623 /* ARGSUSED */ 22613859Sml29623 static int 22623859Sml29623 nxge_param_dump_ptrs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 22633859Sml29623 { 22643859Sml29623 uint_t print_len, buf_len; 22653859Sml29623 p_mblk_t np; 22663859Sml29623 int rdc, tdc, block; 22673859Sml29623 uint64_t base; 22683859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 22693859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 22703859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_8K; 22713859Sml29623 p_tx_ring_t *tx_rings; 22723859Sml29623 p_rx_rcr_rings_t rx_rcr_rings; 22733859Sml29623 p_rx_rcr_ring_t *rcr_rings; 22743859Sml29623 p_rx_rbr_rings_t rx_rbr_rings; 22753859Sml29623 p_rx_rbr_ring_t *rbr_rings; 22763859Sml29623 22773859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, 22786512Ssowmini "==> nxge_param_dump_ptrs")); 22793859Sml29623 22803859Sml29623 (void) mi_mpprintf(mp, "ptr information for Port\t %d \n", 22816512Ssowmini nxgep->function_num); 22823859Sml29623 22833859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 22843859Sml29623 /* The following may work even if we cannot get a large buf. */ 22853859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 22863859Sml29623 return (0); 22873859Sml29623 } 22883859Sml29623 22893859Sml29623 buf_len = buff_alloc_size; 22903859Sml29623 mp->b_cont = np; 22913859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 22923859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 22933859Sml29623 22943859Sml29623 rx_rcr_rings = nxgep->rx_rcr_rings; 22953859Sml29623 rcr_rings = rx_rcr_rings->rcr_rings; 22963859Sml29623 rx_rbr_rings = nxgep->rx_rbr_rings; 22973859Sml29623 rbr_rings = rx_rbr_rings->rbr_rings; 22983859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 22996512Ssowmini "nxgep (nxge_t) $%p\n" 23006512Ssowmini "dev_regs (dev_regs_t) $%p\n", 2301*7632SNick.Todd@Sun.COM (void *)nxgep, (void *)nxgep->dev_regs); 23023859Sml29623 23033859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23043859Sml29623 23053859Sml29623 /* do register pointers */ 23063859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23076512Ssowmini "reg base (npi_reg_ptr_t) $%p\t " 23086512Ssowmini "pci reg (npi_reg_ptr_t) $%p\n", 2309*7632SNick.Todd@Sun.COM (void *)nxgep->dev_regs->nxge_regp, 2310*7632SNick.Todd@Sun.COM (void *)nxgep->dev_regs->nxge_pciregp); 23113859Sml29623 23123859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23133859Sml29623 23143859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23156512Ssowmini "\nBlock \t Offset \n"); 23163859Sml29623 23173859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23183859Sml29623 block = 0; 23195125Sjoycey #if defined(__i386) 23205125Sjoycey base = (uint64_t)(uint32_t)nxgep->dev_regs->nxge_regp; 23215125Sjoycey #else 23223859Sml29623 base = (uint64_t)nxgep->dev_regs->nxge_regp; 23235125Sjoycey #endif 23243859Sml29623 while (reg_block[block].offset != ALL_FF_32) { 23253859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23266512Ssowmini "%9s\t 0x%llx\n", 23276512Ssowmini reg_block[block].name, 23286512Ssowmini (unsigned long long)(reg_block[block].offset + base)); 23293859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23303859Sml29623 block++; 23313859Sml29623 } 23323859Sml29623 23333859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23346512Ssowmini "\nRDC\t rcrp (rx_rcr_ring_t)\t " 23356512Ssowmini "rbrp (rx_rbr_ring_t)\n"); 23363859Sml29623 23373859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23383859Sml29623 23393859Sml29623 for (rdc = 0; rdc < p_cfgp->max_rdcs; rdc++) { 23403859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23416512Ssowmini " %d\t $%p\t\t $%p\n", 2342*7632SNick.Todd@Sun.COM rdc, (void *)rcr_rings[rdc], 2343*7632SNick.Todd@Sun.COM (void *)rbr_rings[rdc]); 23443859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23453859Sml29623 } 23463859Sml29623 23473859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23486512Ssowmini "\nTDC\t tdcp (tx_ring_t)\n"); 23493859Sml29623 23503859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23513859Sml29623 tx_rings = nxgep->tx_rings->rings; 23526495Sspeer for (tdc = 0; tdc < p_cfgp->tdc.count; tdc++) { 23533859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 2354*7632SNick.Todd@Sun.COM " %d\t $%p\n", tdc, (void *)tx_rings[tdc]); 23553859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23563859Sml29623 } 23573859Sml29623 23583859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, "\n\n"); 23593859Sml29623 23603859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23613859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_ptrs")); 23623859Sml29623 return (0); 23633859Sml29623 } 23643859Sml29623 23653859Sml29623 23663859Sml29623 /* ARGSUSED */ 23673859Sml29623 int 23683859Sml29623 nxge_nd_get_names(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t param) 23693859Sml29623 { 23703859Sml29623 ND *nd; 23713859Sml29623 NDE *nde; 23723859Sml29623 char *rwtag; 23733859Sml29623 boolean_t get_ok, set_ok; 23743859Sml29623 size_t param_len; 23753859Sml29623 int status = 0; 23763859Sml29623 23773859Sml29623 nd = (ND *)param; 23783859Sml29623 if (!nd) 23793859Sml29623 return (ENOENT); 23803859Sml29623 23813859Sml29623 for (nde = nd->nd_tbl; nde->nde_name; nde++) { 23823859Sml29623 get_ok = (nde->nde_get_pfi != nxge_get_default) && 23836512Ssowmini (nde->nde_get_pfi != NULL); 23843859Sml29623 set_ok = (nde->nde_set_pfi != nxge_set_default) && 23856512Ssowmini (nde->nde_set_pfi != NULL); 23863859Sml29623 if (get_ok) { 23873859Sml29623 if (set_ok) 23883859Sml29623 rwtag = "read and write"; 23893859Sml29623 else 23903859Sml29623 rwtag = "read only"; 23913859Sml29623 } else if (set_ok) 23923859Sml29623 rwtag = "write only"; 23933859Sml29623 else { 23943859Sml29623 continue; 23953859Sml29623 } 23963859Sml29623 param_len = strlen(rwtag); 23973859Sml29623 param_len += strlen(nde->nde_name); 23983859Sml29623 param_len += 4; 23993859Sml29623 24003859Sml29623 (void) mi_mpprintf(mp, "%s (%s)", nde->nde_name, rwtag); 24013859Sml29623 } 24023859Sml29623 return (status); 24033859Sml29623 } 24043859Sml29623 24053859Sml29623 /* ARGSUSED */ 24063859Sml29623 int 24073859Sml29623 nxge_get_default(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t data) 24083859Sml29623 { 24093859Sml29623 return (EACCES); 24103859Sml29623 } 24113859Sml29623 24123859Sml29623 /* ARGSUSED */ 24133859Sml29623 int 24143859Sml29623 nxge_set_default(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, char *value, 24153859Sml29623 caddr_t data) 24163859Sml29623 { 24173859Sml29623 return (EACCES); 24183859Sml29623 } 24193859Sml29623 24206439Sml29623 boolean_t 24213859Sml29623 nxge_param_link_update(p_nxge_t nxgep) 24223859Sml29623 { 24233859Sml29623 p_nxge_param_t param_arr; 24243859Sml29623 nxge_param_index_t i; 24253859Sml29623 boolean_t update_xcvr; 24263859Sml29623 boolean_t update_dev; 24273859Sml29623 int instance; 24283859Sml29623 boolean_t status = B_TRUE; 24293859Sml29623 24306439Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_link_update")); 24313859Sml29623 24323859Sml29623 param_arr = nxgep->param_arr; 24333859Sml29623 instance = nxgep->instance; 24343859Sml29623 update_xcvr = B_FALSE; 24353859Sml29623 for (i = param_anar_1000fdx; i < param_anar_asmpause; i++) { 24363859Sml29623 update_xcvr |= param_arr[i].value; 24373859Sml29623 } 24383859Sml29623 24393859Sml29623 if (update_xcvr) { 24403859Sml29623 update_xcvr = B_FALSE; 24413859Sml29623 for (i = param_autoneg; i < param_enable_ipg0; i++) { 24423859Sml29623 update_xcvr |= 24436512Ssowmini (param_arr[i].value != param_arr[i].old_value); 24443859Sml29623 param_arr[i].old_value = param_arr[i].value; 24453859Sml29623 } 24463859Sml29623 if (update_xcvr) { 24476439Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 24486439Sml29623 "==> nxge_param_link_update: update xcvr")); 24493859Sml29623 RW_ENTER_WRITER(&nxgep->filter_lock); 24503859Sml29623 (void) nxge_link_monitor(nxgep, LINK_MONITOR_STOP); 24513859Sml29623 (void) nxge_link_init(nxgep); 24523859Sml29623 (void) nxge_mac_init(nxgep); 24533859Sml29623 (void) nxge_link_monitor(nxgep, LINK_MONITOR_START); 24543859Sml29623 RW_EXIT(&nxgep->filter_lock); 24553859Sml29623 } 24563859Sml29623 } else { 24573859Sml29623 cmn_err(CE_WARN, " Last setting will leave nxge%d with " 24586512Ssowmini " no link capabilities.", instance); 24593859Sml29623 cmn_err(CE_WARN, " Restoring previous setting."); 24603859Sml29623 for (i = param_anar_1000fdx; i < param_anar_asmpause; i++) 24613859Sml29623 param_arr[i].value = param_arr[i].old_value; 24623859Sml29623 } 24633859Sml29623 24643859Sml29623 update_dev = B_FALSE; 24653859Sml29623 24663859Sml29623 if (update_dev) { 24673859Sml29623 RW_ENTER_WRITER(&nxgep->filter_lock); 24686439Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 24696439Sml29623 "==> nxge_param_link_update: update dev")); 24703859Sml29623 (void) nxge_rx_mac_disable(nxgep); 24713859Sml29623 (void) nxge_tx_mac_disable(nxgep); 24723859Sml29623 (void) nxge_tx_mac_enable(nxgep); 24733859Sml29623 (void) nxge_rx_mac_enable(nxgep); 24743859Sml29623 RW_EXIT(&nxgep->filter_lock); 24753859Sml29623 } 24763859Sml29623 24773859Sml29623 nxge_param_hw_update_exit: 24783859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, 24796512Ssowmini "<== nxge_param_link_update status = 0x%08x", status)); 24803859Sml29623 return (status); 24813859Sml29623 } 24826439Sml29623 24836439Sml29623 /* 24846439Sml29623 * synchronize the adv* and en* parameters. 24856439Sml29623 * 24866439Sml29623 * See comments in <sys/dld.h> for details of the *_en_* 24876439Sml29623 * parameters. The usage of ndd for setting adv parameters will 24886439Sml29623 * synchronize all the en parameters with the nxge parameters, 24896439Sml29623 * implicitly disabling any settings made via dladm. 24906439Sml29623 */ 24916439Sml29623 static void 24926439Sml29623 nxge_param_sync(p_nxge_t nxgep) 24936439Sml29623 { 24946439Sml29623 p_nxge_param_t param_arr; 24956439Sml29623 param_arr = nxgep->param_arr; 24966439Sml29623 24976439Sml29623 nxgep->param_en_pause = param_arr[param_anar_pause].value; 24986439Sml29623 nxgep->param_en_1000fdx = param_arr[param_anar_1000fdx].value; 24996439Sml29623 nxgep->param_en_100fdx = param_arr[param_anar_100fdx].value; 25006439Sml29623 nxgep->param_en_10fdx = param_arr[param_anar_10fdx].value; 25016439Sml29623 } 25026439Sml29623 25036439Sml29623 /* ARGSUSED */ 25046439Sml29623 int 25056439Sml29623 nxge_dld_get_ip_opt(p_nxge_t nxgep, caddr_t cp) 25066439Sml29623 { 25076439Sml29623 uint32_t status, cfg_value; 25086439Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 25096439Sml29623 tcam_class_t class; 25106439Sml29623 25116439Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_dld_get_ip_opt")); 25126439Sml29623 25136439Sml29623 /* do the actual hw setup */ 25146439Sml29623 class = nxge_class_name_2value(nxgep, pa->name); 25156439Sml29623 if (class == -1) 25166439Sml29623 return (EINVAL); 25176439Sml29623 25186439Sml29623 cfg_value = 0; 25196439Sml29623 status = nxge_fflp_ip_class_config_get(nxgep, class, &cfg_value); 25206439Sml29623 if (status != NXGE_OK) 25216439Sml29623 return (EINVAL); 25226439Sml29623 25236439Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 25246439Sml29623 "nxge_param_get_ip_opt_get %x ", cfg_value)); 25256439Sml29623 25266439Sml29623 pa->value = cfg_value; 25276439Sml29623 25286439Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_ip_opt status ")); 25296439Sml29623 return (0); 25306439Sml29623 } 2531