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 /* 223859Sml29623 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 233859Sml29623 * Use is subject to license terms. 243859Sml29623 */ 253859Sml29623 263859Sml29623 #pragma ident "%Z%%M% %I% %E% SMI" 273859Sml29623 283859Sml29623 #include <sys/nxge/nxge_impl.h> 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 833859Sml29623 static int nxge_param_rx_intr_pkts(p_nxge_t, queue_t *, 843859Sml29623 mblk_t *, char *, caddr_t); 853859Sml29623 static int nxge_param_rx_intr_time(p_nxge_t, queue_t *, 863859Sml29623 mblk_t *, char *, caddr_t); 873859Sml29623 static int nxge_param_set_mac(p_nxge_t, queue_t *, 883859Sml29623 mblk_t *, char *, caddr_t); 893859Sml29623 static int nxge_param_set_port_rdc(p_nxge_t, queue_t *, 903859Sml29623 mblk_t *, char *, caddr_t); 913859Sml29623 static int nxge_param_set_grp_rdc(p_nxge_t, queue_t *, 923859Sml29623 mblk_t *, char *, caddr_t); 933859Sml29623 static int nxge_param_set_ether_usr(p_nxge_t, 943859Sml29623 queue_t *, mblk_t *, char *, caddr_t); 953859Sml29623 static int nxge_param_set_ip_usr(p_nxge_t, 963859Sml29623 queue_t *, mblk_t *, char *, caddr_t); 973859Sml29623 static int nxge_param_set_ip_opt(p_nxge_t, 983859Sml29623 queue_t *, mblk_t *, char *, caddr_t); 993859Sml29623 static int nxge_param_set_vlan_rdcgrp(p_nxge_t, 1003859Sml29623 queue_t *, mblk_t *, char *, caddr_t); 1013859Sml29623 static int nxge_param_set_mac_rdcgrp(p_nxge_t, 1023859Sml29623 queue_t *, mblk_t *, char *, caddr_t); 1033859Sml29623 static int nxge_param_fflp_hash_init(p_nxge_t, 1043859Sml29623 queue_t *, mblk_t *, char *, caddr_t); 1053859Sml29623 static int nxge_param_llc_snap_enable(p_nxge_t, queue_t *, 1063859Sml29623 mblk_t *, char *, caddr_t); 1073859Sml29623 static int nxge_param_hash_lookup_enable(p_nxge_t, queue_t *, 1083859Sml29623 mblk_t *, char *, caddr_t); 1093859Sml29623 static int nxge_param_tcam_enable(p_nxge_t, queue_t *, 1103859Sml29623 mblk_t *, char *, caddr_t); 1114185Sspeer static int nxge_param_get_fw_ver(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1124977Sraghus static int nxge_param_get_port_mode(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1133859Sml29623 static int nxge_param_get_rxdma_info(p_nxge_t, queue_t *q, 1143859Sml29623 p_mblk_t, caddr_t); 1153859Sml29623 static int nxge_param_get_txdma_info(p_nxge_t, queue_t *q, 1163859Sml29623 p_mblk_t, caddr_t); 1173859Sml29623 static int nxge_param_get_vlan_rdcgrp(p_nxge_t, queue_t *, 1183859Sml29623 p_mblk_t, caddr_t); 1193859Sml29623 static int nxge_param_get_mac_rdcgrp(p_nxge_t, queue_t *, 1203859Sml29623 p_mblk_t, caddr_t); 1213859Sml29623 static int nxge_param_get_rxdma_rdcgrp_info(p_nxge_t, queue_t *, 1223859Sml29623 p_mblk_t, caddr_t); 1233859Sml29623 static int nxge_param_get_ip_opt(p_nxge_t, queue_t *, mblk_t *, caddr_t); 1243859Sml29623 static int nxge_param_get_mac(p_nxge_t, queue_t *q, p_mblk_t, caddr_t); 1253859Sml29623 static int nxge_param_get_debug_flag(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1263859Sml29623 static int nxge_param_set_nxge_debug_flag(p_nxge_t, queue_t *, mblk_t *, 1273859Sml29623 char *, caddr_t); 1283859Sml29623 static int nxge_param_set_npi_debug_flag(p_nxge_t, 1293859Sml29623 queue_t *, mblk_t *, char *, caddr_t); 1303859Sml29623 static int nxge_param_dump_rdc(p_nxge_t, queue_t *q, p_mblk_t, caddr_t); 1313859Sml29623 static int nxge_param_dump_tdc(p_nxge_t, queue_t *q, p_mblk_t, caddr_t); 1323859Sml29623 static int nxge_param_dump_mac_regs(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1333859Sml29623 static int nxge_param_dump_ipp_regs(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1343859Sml29623 static int nxge_param_dump_fflp_regs(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1353859Sml29623 static int nxge_param_dump_vlan_table(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1363859Sml29623 static int nxge_param_dump_rdc_table(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1373859Sml29623 static int nxge_param_dump_ptrs(p_nxge_t, queue_t *, p_mblk_t, caddr_t); 1383859Sml29623 static boolean_t nxge_param_link_update(p_nxge_t); 1393859Sml29623 1403859Sml29623 /* 1413859Sml29623 * Global array of Neptune changable parameters. 1423859Sml29623 * This array is initialized to correspond to the default 1433859Sml29623 * Neptune 4 port configuration. This array would be copied 1443859Sml29623 * into each port's parameter structure and modifed per 1453859Sml29623 * fcode and nxge.conf configuration. Later, the parameters are 1463859Sml29623 * exported to ndd to display and run-time configuration (at least 1473859Sml29623 * some of them). 1483859Sml29623 * 1493859Sml29623 */ 1503859Sml29623 1513859Sml29623 static nxge_param_t nxge_param_arr[] = { 1523859Sml29623 /* 1533859Sml29623 * min max value old hw-name conf-name 1543859Sml29623 */ 1554439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1563859Sml29623 0, 999, 1000, 0, "instance", "instance"}, 1573859Sml29623 1584439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1593859Sml29623 0, 999, 1000, 0, "main-instance", "main_instance"}, 1603859Sml29623 1613859Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ, 1623859Sml29623 0, 3, 0, 0, "function-number", "function_number"}, 1633859Sml29623 1643859Sml29623 /* Partition Id */ 1654439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1663859Sml29623 0, 8, 0, 0, "partition-id", "partition_id"}, 1673859Sml29623 1683859Sml29623 /* Read Write Permission Mode */ 1694439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1703859Sml29623 0, 2, 0, 0, "read-write-mode", "read_write_mode"}, 1713859Sml29623 1724185Sspeer { nxge_param_get_fw_ver, NULL, NXGE_PARAM_READ, 1734185Sspeer 0, 32, 0, 0, "version", "fw_version"}, 1744185Sspeer 1754977Sraghus { nxge_param_get_port_mode, NULL, NXGE_PARAM_READ, 1764977Sraghus 0, 32, 0, 0, "port-mode", "port_mode"}, 1774977Sraghus 1783859Sml29623 /* hw cfg types */ 1793859Sml29623 /* control the DMA config of Neptune/NIU */ 1804439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1813859Sml29623 CFG_DEFAULT, CFG_CUSTOM, CFG_DEFAULT, CFG_DEFAULT, 1823859Sml29623 "niu-cfg-type", "niu_cfg_type"}, 1833859Sml29623 1843859Sml29623 /* control the TXDMA config of the Port controlled by tx-quick-cfg */ 1854439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1863859Sml29623 CFG_DEFAULT, CFG_CUSTOM, CFG_NOT_SPECIFIED, CFG_DEFAULT, 1873859Sml29623 "tx-qcfg-type", "tx_qcfg_type"}, 1883859Sml29623 1893859Sml29623 /* control the RXDMA config of the Port controlled by rx-quick-cfg */ 1904439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_DONT_SHOW, 1913859Sml29623 CFG_DEFAULT, CFG_CUSTOM, CFG_NOT_SPECIFIED, CFG_DEFAULT, 1923859Sml29623 "rx-qcfg-type", "rx_qcfg_type"}, 1933859Sml29623 1943859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, 1953859Sml29623 NXGE_PARAM_RW | NXGE_PARAM_DONT_SHOW, 1963859Sml29623 0, 1, 0, 0, "master-cfg-enable", "master_cfg_enable"}, 1973859Sml29623 1983859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, 1994439Sml29623 NXGE_PARAM_DONT_SHOW, 2003859Sml29623 0, 1, 0, 0, "master-cfg-value", "master_cfg_value"}, 2013859Sml29623 2023859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 2033859Sml29623 0, 1, 1, 1, "adv-autoneg-cap", "adv_autoneg_cap"}, 2043859Sml29623 2053859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 2063859Sml29623 0, 1, 1, 1, "adv-10gfdx-cap", "adv_10gfdx_cap"}, 2073859Sml29623 2083859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW, 2093859Sml29623 0, 1, 0, 0, "adv-10ghdx-cap", "adv_10ghdx_cap"}, 2103859Sml29623 2113859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 2123859Sml29623 0, 1, 1, 1, "adv-1000fdx-cap", "adv_1000fdx_cap"}, 2133859Sml29623 2143859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW, 2153859Sml29623 0, 1, 0, 0, "adv-1000hdx-cap", "adv_1000hdx_cap"}, 2163859Sml29623 2173859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW, 2183859Sml29623 0, 1, 0, 0, "adv-100T4-cap", "adv_100T4_cap"}, 2193859Sml29623 2203859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 2213859Sml29623 0, 1, 1, 1, "adv-100fdx-cap", "adv_100fdx_cap"}, 2223859Sml29623 2233859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW, 2243859Sml29623 0, 1, 0, 0, "adv-100hdx-cap", "adv_100hdx_cap"}, 2253859Sml29623 2263859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 2273859Sml29623 0, 1, 1, 1, "adv-10fdx-cap", "adv_10fdx_cap"}, 2283859Sml29623 2293859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_DONT_SHOW, 2303859Sml29623 0, 1, 0, 0, "adv-10hdx-cap", "adv_10hdx_cap"}, 2313859Sml29623 2324439Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW, 2333859Sml29623 0, 1, 0, 0, "adv-asmpause-cap", "adv_asmpause_cap"}, 2343859Sml29623 2353859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 2363859Sml29623 0, 1, 0, 0, "adv-pause-cap", "adv_pause_cap"}, 2373859Sml29623 2384439Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW, 2393859Sml29623 0, 1, 0, 0, "use-int-xcvr", "use_int_xcvr"}, 2403859Sml29623 2414439Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW, 2423859Sml29623 0, 1, 1, 1, "enable-ipg0", "enable_ipg0"}, 2433859Sml29623 2444439Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW, 2453859Sml29623 0, 255, 8, 8, "ipg0", "ipg0"}, 2463859Sml29623 2474439Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW, 2483859Sml29623 0, 255, 8, 8, "ipg1", "ipg1"}, 2493859Sml29623 2504439Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_DONT_SHOW, 2513859Sml29623 0, 255, 4, 4, "ipg2", "ipg2"}, 2523859Sml29623 2533859Sml29623 { nxge_param_get_mac, nxge_param_set_mac, NXGE_PARAM_MAC_RW, 2543859Sml29623 0, 1, 0, 0, "accept-jumbo", "accept_jumbo"}, 2553859Sml29623 2563859Sml29623 /* Transmit DMA channels */ 2574439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | 2584439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2593859Sml29623 0, 3, 0, 0, "tx-dma-weight", "tx_dma_weight"}, 2603859Sml29623 2614439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | 2624439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2633859Sml29623 0, 31, 0, 0, "tx-dma-channels-begin", "tx_dma_channels_begin"}, 2643859Sml29623 2654439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | 2664439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2673859Sml29623 0, 32, 0, 0, "tx-dma-channels", "tx_dma_channels"}, 2683859Sml29623 { nxge_param_get_txdma_info, NULL, 2694439Sml29623 NXGE_PARAM_READ | NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2703859Sml29623 0, 32, 0, 0, "tx-dma-info", "tx_dma_info"}, 2713859Sml29623 2723859Sml29623 /* Receive DMA channels */ 2733859Sml29623 { nxge_param_get_generic, NULL, 2744439Sml29623 NXGE_PARAM_READ | NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2753859Sml29623 0, 31, 0, 0, "rx-dma-channels-begin", "rx_dma_channels_begin"}, 2763859Sml29623 2774439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | 2784439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2793859Sml29623 0, 32, 0, 0, "rx-dma-channels", "rx_dma_channels"}, 2803859Sml29623 2814439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | 2824439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2833859Sml29623 0, 65535, PT_DRR_WT_DEFAULT_10G, 0, 2843859Sml29623 "rx-drr-weight", "rx_drr_weight"}, 2853859Sml29623 2864439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | 2874439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_DONT_SHOW, 2883859Sml29623 0, 1, 1, 0, "rx-full-header", "rx_full_header"}, 2893859Sml29623 2904439Sml29623 { nxge_param_get_rxdma_info, NULL, NXGE_PARAM_READ | 2914439Sml29623 NXGE_PARAM_DONT_SHOW, 2923859Sml29623 0, 32, 0, 0, "rx-dma-info", "rx_dma_info"}, 2933859Sml29623 2943859Sml29623 { nxge_param_get_rxdma_info, NULL, 2953859Sml29623 NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 2963859Sml29623 NXGE_RBR_RBB_MIN, NXGE_RBR_RBB_MAX, NXGE_RBR_RBB_DEFAULT, 0, 2973859Sml29623 "rx-rbr-size", "rx_rbr_size"}, 2983859Sml29623 2993859Sml29623 { nxge_param_get_rxdma_info, NULL, 3003859Sml29623 NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 3013859Sml29623 NXGE_RCR_MIN, NXGE_RCR_MAX, NXGE_RCR_DEFAULT, 0, 3023859Sml29623 "rx-rcr-size", "rx_rcr_size"}, 3033859Sml29623 3044439Sml29623 { nxge_param_get_generic, nxge_param_set_port_rdc, 3054439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3063859Sml29623 0, 15, 0, 0, "default-port-rdc", "default_port_rdc"}, 3073859Sml29623 3083859Sml29623 { nxge_param_get_generic, nxge_param_rx_intr_time, NXGE_PARAM_RXDMA_RW, 3093859Sml29623 NXGE_RDC_RCR_TIMEOUT_MIN, NXGE_RDC_RCR_TIMEOUT_MAX, 3103859Sml29623 RXDMA_RCR_TO_DEFAULT, 0, "rxdma-intr-time", "rxdma_intr_time"}, 3113859Sml29623 3123859Sml29623 { nxge_param_get_generic, nxge_param_rx_intr_pkts, NXGE_PARAM_RXDMA_RW, 3133859Sml29623 NXGE_RDC_RCR_THRESHOLD_MIN, NXGE_RDC_RCR_THRESHOLD_MAX, 3143859Sml29623 RXDMA_RCR_PTHRES_DEFAULT, 0, 3153859Sml29623 "rxdma-intr-pkts", "rxdma_intr_pkts"}, 3163859Sml29623 3174439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ_PROP | 3184439Sml29623 NXGE_PARAM_DONT_SHOW, 3193859Sml29623 0, 8, 0, 0, "rx-rdc-grps-begin", "rx_rdc_grps_begin"}, 3203859Sml29623 3214439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ_PROP | 3224439Sml29623 NXGE_PARAM_DONT_SHOW, 3233859Sml29623 0, 8, 0, 0, "rx-rdc-grps", "rx_rdc_grps"}, 3243859Sml29623 3254439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3264439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3273859Sml29623 0, 15, 0, 0, "default-grp0-rdc", "default_grp0_rdc"}, 3283859Sml29623 3294439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3304439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3313859Sml29623 0, 15, 2, 0, "default-grp1-rdc", "default_grp1_rdc"}, 3323859Sml29623 3334439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3344439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3353859Sml29623 0, 15, 4, 0, "default-grp2-rdc", "default_grp2_rdc"}, 3363859Sml29623 3374439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3384439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3393859Sml29623 0, 15, 6, 0, "default-grp3-rdc", "default_grp3_rdc"}, 3403859Sml29623 3414439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3424439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3433859Sml29623 0, 15, 8, 0, "default-grp4-rdc", "default_grp4_rdc"}, 3443859Sml29623 3454439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3464439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3473859Sml29623 0, 15, 10, 0, "default-grp5-rdc", "default_grp5_rdc"}, 3483859Sml29623 3494439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3504439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3513859Sml29623 0, 15, 12, 0, "default-grp6-rdc", "default_grp6_rdc"}, 3523859Sml29623 3534439Sml29623 { nxge_param_get_generic, nxge_param_set_grp_rdc, 3544439Sml29623 NXGE_PARAM_RXDMA_RW | NXGE_PARAM_DONT_SHOW, 3553859Sml29623 0, 15, 14, 0, "default-grp7-rdc", "default_grp7_rdc"}, 3563859Sml29623 3573859Sml29623 { nxge_param_get_rxdma_rdcgrp_info, NULL, 3584439Sml29623 NXGE_PARAM_READ | NXGE_PARAM_CMPLX | NXGE_PARAM_DONT_SHOW, 3593859Sml29623 0, 8, 0, 0, "rdc-groups-info", "rdc_groups_info"}, 3603859Sml29623 3613859Sml29623 /* Logical device groups */ 3624439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 3633859Sml29623 0, 63, 0, 0, "start-ldg", "start_ldg"}, 3643859Sml29623 3654439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 3663859Sml29623 0, 64, 0, 0, "max-ldg", "max_ldg" }, 3673859Sml29623 3683859Sml29623 /* MAC table information */ 3693859Sml29623 { nxge_param_get_mac_rdcgrp, nxge_param_set_mac_rdcgrp, 3704439Sml29623 NXGE_PARAM_L2CLASS_CFG | NXGE_PARAM_DONT_SHOW, 3713859Sml29623 0, 31, 0, 0, "mac-2rdc-grp", "mac_2rdc_grp"}, 3723859Sml29623 3733859Sml29623 /* VLAN table information */ 3743859Sml29623 { nxge_param_get_vlan_rdcgrp, nxge_param_set_vlan_rdcgrp, 3754439Sml29623 NXGE_PARAM_L2CLASS_CFG | NXGE_PARAM_DONT_SHOW, 3763859Sml29623 0, 31, 0, 0, "vlan-2rdc-grp", "vlan_2rdc_grp"}, 3773859Sml29623 3783859Sml29623 { nxge_param_get_generic, NULL, 3794439Sml29623 NXGE_PARAM_READ_PROP | NXGE_PARAM_READ | 3804439Sml29623 NXGE_PARAM_PROP_ARR32 | NXGE_PARAM_DONT_SHOW, 3813859Sml29623 0, 0x0ffff, 0x0ffff, 0, "fcram-part-cfg", "fcram_part_cfg"}, 3823859Sml29623 3834439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_CLASS_RWS | 3844439Sml29623 NXGE_PARAM_DONT_SHOW, 3853859Sml29623 0, 0x10, 0xa, 0, "fcram-access-ratio", "fcram_access_ratio"}, 3863859Sml29623 3874439Sml29623 { nxge_param_get_generic, NULL, NXGE_PARAM_CLASS_RWS | 3884439Sml29623 NXGE_PARAM_DONT_SHOW, 3893859Sml29623 0, 0x10, 0xa, 0, "tcam-access-ratio", "tcam_access_ratio"}, 3903859Sml29623 3913859Sml29623 { nxge_param_get_generic, nxge_param_tcam_enable, 3924439Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 3933859Sml29623 0, 0x1, 0x0, 0, "tcam-enable", "tcam_enable"}, 3943859Sml29623 3953859Sml29623 { nxge_param_get_generic, nxge_param_hash_lookup_enable, 3964439Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 3973859Sml29623 0, 0x01, 0x0, 0, "hash-lookup-enable", "hash_lookup_enable"}, 3983859Sml29623 3993859Sml29623 { nxge_param_get_generic, nxge_param_llc_snap_enable, 4004439Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4013859Sml29623 0, 0x01, 0x01, 0, "llc-snap-enable", "llc_snap_enable"}, 4023859Sml29623 4033859Sml29623 { nxge_param_get_generic, nxge_param_fflp_hash_init, 4044439Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4053859Sml29623 0, ALL_FF_32, ALL_FF_32, 0, "h1-init-value", "h1_init_value"}, 4063859Sml29623 4073859Sml29623 { nxge_param_get_generic, nxge_param_fflp_hash_init, 4084439Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4093859Sml29623 0, 0x0ffff, 0x0ffff, 0, "h2-init-value", "h2_init_value"}, 4103859Sml29623 4113859Sml29623 { nxge_param_get_generic, nxge_param_set_ether_usr, 4123859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4133859Sml29623 0, ALL_FF_32, 0x0, 0, 4143859Sml29623 "class-cfg-ether-usr1", "class_cfg_ether_usr1"}, 4153859Sml29623 4163859Sml29623 { nxge_param_get_generic, nxge_param_set_ether_usr, 4173859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4183859Sml29623 0, ALL_FF_32, 0x0, 0, 4193859Sml29623 "class-cfg-ether-usr2", "class_cfg_ether_usr2"}, 4203859Sml29623 4213859Sml29623 { nxge_param_get_generic, nxge_param_set_ip_usr, 4223859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4233859Sml29623 0, ALL_FF_32, 0x0, 0, 4243859Sml29623 "class-cfg-ip-usr4", "class_cfg_ip_usr4"}, 4253859Sml29623 4263859Sml29623 { nxge_param_get_generic, nxge_param_set_ip_usr, 4273859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4283859Sml29623 0, ALL_FF_32, 0x0, 0, 4293859Sml29623 "class-cfg-ip-usr5", "class_cfg_ip_usr5"}, 4303859Sml29623 4313859Sml29623 { nxge_param_get_generic, nxge_param_set_ip_usr, 4323859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4333859Sml29623 0, ALL_FF_32, 0x0, 0, 4343859Sml29623 "class-cfg-ip-usr6", "class_cfg_ip_usr6"}, 4353859Sml29623 4363859Sml29623 { nxge_param_get_generic, nxge_param_set_ip_usr, 4373859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4383859Sml29623 0, ALL_FF_32, 0x0, 0, 4393859Sml29623 "class-cfg-ip-usr7", "class_cfg_ip_usr7"}, 4403859Sml29623 4413859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4423859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4433859Sml29623 0, ALL_FF_32, 0x0, 0, 4443859Sml29623 "class-opt-ip-usr4", "class_opt_ip_usr4"}, 4453859Sml29623 4463859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4473859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4483859Sml29623 0, ALL_FF_32, 0x0, 0, 4493859Sml29623 "class-opt-ip-usr5", "class_opt_ip_usr5"}, 4503859Sml29623 4513859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4523859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4533859Sml29623 0, ALL_FF_32, 0x0, 0, 4543859Sml29623 "class-opt-ip-usr6", "class_opt_ip_usr6"}, 4553859Sml29623 4563859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4573859Sml29623 NXGE_PARAM_CLASS_RWS | NXGE_PARAM_DONT_SHOW, 4583859Sml29623 0, ALL_FF_32, 0x0, 0, 4593859Sml29623 "class-opt-ip-usr7", "class_opt_ip_usr7"}, 4603859Sml29623 4613859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4623859Sml29623 NXGE_PARAM_CLASS_RWS, 4633859Sml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0, 4643859Sml29623 "class-opt-ipv4-tcp", "class_opt_ipv4_tcp"}, 4653859Sml29623 4663859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4673859Sml29623 NXGE_PARAM_CLASS_RWS, 4683859Sml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0, 4693859Sml29623 "class-opt-ipv4-udp", "class_opt_ipv4_udp"}, 4703859Sml29623 4713859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4723859Sml29623 NXGE_PARAM_CLASS_RWS, 4733859Sml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0, 4743859Sml29623 "class-opt-ipv4-ah", "class_opt_ipv4_ah"}, 4753859Sml29623 4763859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, 4773859Sml29623 NXGE_PARAM_CLASS_RWS, 4783859Sml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0, 4793859Sml29623 "class-opt-ipv4-sctp", "class_opt_ipv4_sctp"}, 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-tcp", "class_opt_ipv6_tcp"}, 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-udp", "class_opt_ipv6_udp"}, 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-ah", "class_opt_ipv6_ah"}, 4923859Sml29623 4933859Sml29623 { nxge_param_get_ip_opt, nxge_param_set_ip_opt, NXGE_PARAM_CLASS_RWS, 4943859Sml29623 0, ALL_FF_32, NXGE_CLASS_FLOW_GEN_SERVER, 0, 4953859Sml29623 "class-opt-ipv6-sctp", "class_opt_ipv6_sctp"}, 4963859Sml29623 4973859Sml29623 { nxge_param_get_debug_flag, nxge_param_set_nxge_debug_flag, 4984439Sml29623 NXGE_PARAM_RW | NXGE_PARAM_DONT_SHOW, 4993859Sml29623 0ULL, ALL_FF_64, 0ULL, 0ULL, 5003859Sml29623 "nxge-debug-flag", "nxge_debug_flag"}, 5013859Sml29623 5023859Sml29623 { nxge_param_get_debug_flag, nxge_param_set_npi_debug_flag, 5034439Sml29623 NXGE_PARAM_RW | NXGE_PARAM_DONT_SHOW, 5043859Sml29623 0ULL, ALL_FF_64, 0ULL, 0ULL, 5053859Sml29623 "npi-debug-flag", "npi_debug_flag"}, 5063859Sml29623 5074439Sml29623 { nxge_param_dump_tdc, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 5083859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-tdc", "dump_tdc"}, 5093859Sml29623 5104439Sml29623 { nxge_param_dump_rdc, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 5113859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-rdc", "dump_rdc"}, 5123859Sml29623 5134439Sml29623 { nxge_param_dump_mac_regs, NULL, NXGE_PARAM_READ | 5144439Sml29623 NXGE_PARAM_DONT_SHOW, 5153859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-mac-regs", "dump_mac_regs"}, 5163859Sml29623 5174439Sml29623 { nxge_param_dump_ipp_regs, NULL, NXGE_PARAM_READ | 5184439Sml29623 NXGE_PARAM_DONT_SHOW, 5193859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-ipp-regs", "dump_ipp_regs"}, 5203859Sml29623 5214439Sml29623 { nxge_param_dump_fflp_regs, NULL, NXGE_PARAM_READ | 5224439Sml29623 NXGE_PARAM_DONT_SHOW, 5233859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, 5243859Sml29623 "dump-fflp-regs", "dump_fflp_regs"}, 5253859Sml29623 5264439Sml29623 { nxge_param_dump_vlan_table, NULL, NXGE_PARAM_READ | 5274439Sml29623 NXGE_PARAM_DONT_SHOW, 5283859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, 5293859Sml29623 "dump-vlan-table", "dump_vlan_table"}, 5303859Sml29623 5314439Sml29623 { nxge_param_dump_rdc_table, NULL, NXGE_PARAM_READ | 5324439Sml29623 NXGE_PARAM_DONT_SHOW, 5333859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, 5343859Sml29623 "dump-rdc-table", "dump_rdc_table"}, 5353859Sml29623 5364439Sml29623 { nxge_param_dump_ptrs, NULL, NXGE_PARAM_READ | 5374439Sml29623 NXGE_PARAM_DONT_SHOW, 5383859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, "dump-ptrs", "dump_ptrs"}, 5393859Sml29623 5403859Sml29623 { NULL, NULL, NXGE_PARAM_READ | NXGE_PARAM_DONT_SHOW, 5413859Sml29623 0, 0x0fffffff, 0x0fffffff, 0, "end", "end"}, 5423859Sml29623 }; 5433859Sml29623 5443859Sml29623 extern void *nxge_list; 5453859Sml29623 5463859Sml29623 void 5473859Sml29623 nxge_get_param_soft_properties(p_nxge_t nxgep) 5483859Sml29623 { 5493859Sml29623 5503859Sml29623 p_nxge_param_t param_arr; 5513859Sml29623 uint_t prop_len; 5523859Sml29623 int i, j; 5533859Sml29623 uint32_t param_count; 5543859Sml29623 uint32_t *int_prop_val; 5553859Sml29623 5563859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, " ==> nxge_get_param_soft_properties")); 5573859Sml29623 5583859Sml29623 param_arr = nxgep->param_arr; 5593859Sml29623 param_count = nxgep->param_count; 5603859Sml29623 for (i = 0; i < param_count; i++) { 5613859Sml29623 if ((param_arr[i].type & NXGE_PARAM_READ_PROP) == 0) 5623859Sml29623 continue; 5633859Sml29623 if ((param_arr[i].type & NXGE_PARAM_PROP_STR)) 5643859Sml29623 continue; 5653859Sml29623 if ((param_arr[i].type & NXGE_PARAM_PROP_ARR32) || 5663859Sml29623 (param_arr[i].type & NXGE_PARAM_PROP_ARR64)) { 5673859Sml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, 5683859Sml29623 nxgep->dip, 0, param_arr[i].fcode_name, 5693859Sml29623 (int **)&int_prop_val, 5703859Sml29623 (uint_t *)&prop_len) 5713859Sml29623 == DDI_PROP_SUCCESS) { 5723859Sml29623 uint32_t *cfg_value; 5733859Sml29623 uint64_t prop_count; 5743859Sml29623 5753859Sml29623 if (prop_len > NXGE_PARAM_ARRAY_INIT_SIZE) 5763859Sml29623 prop_len = NXGE_PARAM_ARRAY_INIT_SIZE; 577*5125Sjoycey #if defined(__i386) 578*5125Sjoycey cfg_value = 579*5125Sjoycey (uint32_t *)(int32_t)param_arr[i].value; 580*5125Sjoycey #else 5813859Sml29623 cfg_value = (uint32_t *)param_arr[i].value; 582*5125Sjoycey #endif 5833859Sml29623 for (j = 0; j < prop_len; j++) { 5843859Sml29623 cfg_value[j] = int_prop_val[j]; 5853859Sml29623 } 5863859Sml29623 prop_count = prop_len; 5873859Sml29623 param_arr[i].type |= 5883859Sml29623 (prop_count << NXGE_PARAM_ARRAY_CNT_SHIFT); 5893859Sml29623 ddi_prop_free(int_prop_val); 5903859Sml29623 } 5913859Sml29623 continue; 5923859Sml29623 } 5933859Sml29623 5943859Sml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0, 5953859Sml29623 param_arr[i].fcode_name, 5963859Sml29623 (int **)&int_prop_val, 5973859Sml29623 &prop_len) == DDI_PROP_SUCCESS) { 5983859Sml29623 if ((*int_prop_val >= param_arr[i].minimum) && 5993859Sml29623 (*int_prop_val <= param_arr[i].maximum)) 6003859Sml29623 param_arr[i].value = *int_prop_val; 6013859Sml29623 #ifdef NXGE_DEBUG_ERROR 6023859Sml29623 else { 6033859Sml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL, 6043859Sml29623 "nxge%d: 'prom' file parameter error\n", 6053859Sml29623 nxgep->instance)); 6063859Sml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL, 6073859Sml29623 "Parameter keyword '%s'" 6083859Sml29623 " is outside valid range\n", 6093859Sml29623 param_arr[i].name)); 6103859Sml29623 } 6113859Sml29623 #endif 6123859Sml29623 ddi_prop_free(int_prop_val); 6133859Sml29623 } 6143859Sml29623 6153859Sml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0, 6163859Sml29623 param_arr[i].name, 6173859Sml29623 (int **)&int_prop_val, 6183859Sml29623 &prop_len) == DDI_PROP_SUCCESS) { 6193859Sml29623 if ((*int_prop_val >= param_arr[i].minimum) && 6203859Sml29623 (*int_prop_val <= param_arr[i].maximum)) 6213859Sml29623 param_arr[i].value = *int_prop_val; 6223859Sml29623 #ifdef NXGE_DEBUG_ERROR 6233859Sml29623 else { 6243859Sml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL, 6253859Sml29623 "nxge%d: 'conf' file parameter error\n", 6263859Sml29623 nxgep->instance)); 6273859Sml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL, 6283859Sml29623 "Parameter keyword '%s'" 6293859Sml29623 "is outside valid range\n", 6303859Sml29623 param_arr[i].name)); 6313859Sml29623 } 6323859Sml29623 #endif 6333859Sml29623 ddi_prop_free(int_prop_val); 6343859Sml29623 } 6353859Sml29623 } 6363859Sml29623 } 6373859Sml29623 6383859Sml29623 static int 6393859Sml29623 nxge_private_param_register(p_nxge_t nxgep, p_nxge_param_t param_arr) 6403859Sml29623 { 6413859Sml29623 int status = B_TRUE; 6423859Sml29623 int channel; 6433859Sml29623 uint8_t grp; 6443859Sml29623 char *prop_name; 6453859Sml29623 char *end; 6463859Sml29623 uint32_t name_chars; 6473859Sml29623 6483859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL, 6493859Sml29623 "nxge_private_param_register %s", param_arr->name)); 6503859Sml29623 6513859Sml29623 if ((param_arr->type & NXGE_PARAM_PRIV) != NXGE_PARAM_PRIV) 6523859Sml29623 return (B_TRUE); 6533859Sml29623 6543859Sml29623 prop_name = param_arr->name; 6553859Sml29623 if (param_arr->type & NXGE_PARAM_RXDMA) { 6563859Sml29623 if (strncmp("rxdma_intr", prop_name, 10) == 0) 6573859Sml29623 return (B_TRUE); 6583859Sml29623 name_chars = strlen("default_grp"); 6593859Sml29623 if (strncmp("default_grp", prop_name, name_chars) == 0) { 6603859Sml29623 prop_name += name_chars; 6613859Sml29623 grp = mi_strtol(prop_name, &end, 10); 6623859Sml29623 /* now check if this rdcgrp is in config */ 6633859Sml29623 return (nxge_check_rdcgrp_port_member(nxgep, grp)); 6643859Sml29623 } 6653859Sml29623 name_chars = strlen(prop_name); 6663859Sml29623 if (strncmp("default_port_rdc", prop_name, name_chars) == 0) { 6673859Sml29623 return (B_TRUE); 6683859Sml29623 } 6693859Sml29623 return (B_FALSE); 6703859Sml29623 } 6713859Sml29623 6723859Sml29623 if (param_arr->type & NXGE_PARAM_TXDMA) { 6733859Sml29623 name_chars = strlen("txdma"); 6743859Sml29623 if (strncmp("txdma", prop_name, name_chars) == 0) { 6753859Sml29623 prop_name += name_chars; 6763859Sml29623 channel = mi_strtol(prop_name, &end, 10); 6773859Sml29623 /* now check if this rdc is in config */ 6783859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL, 6793859Sml29623 " nxge_private_param_register: %d", 6803859Sml29623 channel)); 6813859Sml29623 return (nxge_check_txdma_port_member(nxgep, channel)); 6823859Sml29623 } 6833859Sml29623 return (B_FALSE); 6843859Sml29623 } 6853859Sml29623 6863859Sml29623 status = B_FALSE; 6873859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL, "<== nxge_private_param_register")); 6883859Sml29623 6893859Sml29623 return (status); 6903859Sml29623 } 6913859Sml29623 6923859Sml29623 void 6933859Sml29623 nxge_setup_param(p_nxge_t nxgep) 6943859Sml29623 { 6953859Sml29623 p_nxge_param_t param_arr; 6963859Sml29623 int i; 6973859Sml29623 pfi_t set_pfi; 6983859Sml29623 6993859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_setup_param")); 7003859Sml29623 7013859Sml29623 /* 7023859Sml29623 * Make sure the param_instance is set to a valid device instance. 7033859Sml29623 */ 7043859Sml29623 if (nxge_param_arr[param_instance].value == 1000) 7053859Sml29623 nxge_param_arr[param_instance].value = nxgep->instance; 7063859Sml29623 7073859Sml29623 param_arr = nxgep->param_arr; 7083859Sml29623 param_arr[param_instance].value = nxgep->instance; 7093859Sml29623 param_arr[param_function_number].value = nxgep->function_num; 7103859Sml29623 7113859Sml29623 for (i = 0; i < nxgep->param_count; i++) { 7123859Sml29623 if ((param_arr[i].type & NXGE_PARAM_PRIV) && 7133859Sml29623 (nxge_private_param_register(nxgep, 7143859Sml29623 ¶m_arr[i]) == B_FALSE)) { 7153859Sml29623 param_arr[i].setf = NULL; 7163859Sml29623 param_arr[i].getf = NULL; 7173859Sml29623 } 7183859Sml29623 7193859Sml29623 if (param_arr[i].type & NXGE_PARAM_CMPLX) 7203859Sml29623 param_arr[i].setf = NULL; 7213859Sml29623 7223859Sml29623 if (param_arr[i].type & NXGE_PARAM_DONT_SHOW) { 7233859Sml29623 param_arr[i].setf = NULL; 7243859Sml29623 param_arr[i].getf = NULL; 7253859Sml29623 } 7263859Sml29623 7273859Sml29623 set_pfi = (pfi_t)param_arr[i].setf; 7283859Sml29623 7293859Sml29623 if ((set_pfi) && (param_arr[i].type & NXGE_PARAM_INIT_ONLY)) { 7303859Sml29623 set_pfi = NULL; 7313859Sml29623 } 7323859Sml29623 7333859Sml29623 if (!nxge_nd_load(&nxgep->param_list, param_arr[i].name, 7343859Sml29623 (pfi_t)param_arr[i].getf, set_pfi, 7353859Sml29623 (caddr_t)¶m_arr[i])) { 7363859Sml29623 (void) nxge_nd_free(&nxgep->param_list); 7373859Sml29623 break; 7383859Sml29623 } 7393859Sml29623 } 7403859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_setup_param")); 7413859Sml29623 } 7423859Sml29623 7433859Sml29623 void 7443859Sml29623 nxge_init_param(p_nxge_t nxgep) 7453859Sml29623 { 7463859Sml29623 p_nxge_param_t param_arr; 7473859Sml29623 int i, alloc_size; 7483859Sml29623 uint64_t alloc_count; 7493859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "==> nxge_init_param")); 7503859Sml29623 /* 7513859Sml29623 * Make sure the param_instance is set to a valid device instance. 7523859Sml29623 */ 7533859Sml29623 if (nxge_param_arr[param_instance].value == 1000) 7543859Sml29623 nxge_param_arr[param_instance].value = nxgep->instance; 7553859Sml29623 7563859Sml29623 param_arr = nxgep->param_arr; 7573859Sml29623 if (param_arr == NULL) { 7583859Sml29623 param_arr = (p_nxge_param_t) 7593859Sml29623 KMEM_ZALLOC(sizeof (nxge_param_arr), KM_SLEEP); 7603859Sml29623 } 7613859Sml29623 7623859Sml29623 for (i = 0; i < sizeof (nxge_param_arr)/sizeof (nxge_param_t); i++) { 7633859Sml29623 param_arr[i] = nxge_param_arr[i]; 7643859Sml29623 if ((param_arr[i].type & NXGE_PARAM_PROP_ARR32) || 7653859Sml29623 (param_arr[i].type & NXGE_PARAM_PROP_ARR64)) { 7663859Sml29623 alloc_count = NXGE_PARAM_ARRAY_INIT_SIZE; 7673859Sml29623 alloc_size = alloc_count * sizeof (uint64_t); 7683859Sml29623 param_arr[i].value = 769*5125Sjoycey #if defined(__i386) 770*5125Sjoycey (uint64_t)(uint32_t)KMEM_ZALLOC(alloc_size, 771*5125Sjoycey KM_SLEEP); 772*5125Sjoycey #else 7733859Sml29623 (uint64_t)KMEM_ZALLOC(alloc_size, KM_SLEEP); 774*5125Sjoycey #endif 7753859Sml29623 param_arr[i].old_value = 776*5125Sjoycey #if defined(__i386) 777*5125Sjoycey (uint64_t)(uint32_t)KMEM_ZALLOC(alloc_size, 778*5125Sjoycey KM_SLEEP); 779*5125Sjoycey #else 780*5125Sjoycey (uint64_t)KMEM_ZALLOC(alloc_size, KM_SLEEP); 781*5125Sjoycey #endif 7823859Sml29623 param_arr[i].type |= 7833859Sml29623 (alloc_count << NXGE_PARAM_ARRAY_ALLOC_SHIFT); 7843859Sml29623 } 7853859Sml29623 } 7863859Sml29623 7873859Sml29623 nxgep->param_arr = param_arr; 7883859Sml29623 nxgep->param_count = sizeof (nxge_param_arr)/sizeof (nxge_param_t); 7893859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "<== nxge_init_param: count %d", 7903859Sml29623 nxgep->param_count)); 7913859Sml29623 } 7923859Sml29623 7933859Sml29623 void 7943859Sml29623 nxge_destroy_param(p_nxge_t nxgep) 7953859Sml29623 { 7963859Sml29623 int i; 7973859Sml29623 uint64_t free_size, free_count; 7983859Sml29623 7993859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "==> nxge_destroy_param")); 8003859Sml29623 8014732Sdavemq if (nxgep->param_arr == NULL) 8024732Sdavemq return; 8033859Sml29623 /* 8043859Sml29623 * Make sure the param_instance is set to a valid device instance. 8053859Sml29623 */ 8063859Sml29623 if (nxge_param_arr[param_instance].value == nxgep->instance) { 8073859Sml29623 for (i = 0; i <= nxge_param_arr[param_instance].maximum; i++) { 8083859Sml29623 if ((ddi_get_soft_state(nxge_list, i) != NULL) && 8093859Sml29623 (i != nxgep->instance)) 8103859Sml29623 break; 8113859Sml29623 } 8123859Sml29623 nxge_param_arr[param_instance].value = i; 8133859Sml29623 } 8143859Sml29623 8153859Sml29623 if (nxgep->param_list) 8163859Sml29623 nxge_nd_free(&nxgep->param_list); 8173859Sml29623 for (i = 0; i < nxgep->param_count; i++) 8183859Sml29623 if ((nxgep->param_arr[i].type & NXGE_PARAM_PROP_ARR32) || 8193859Sml29623 (nxgep->param_arr[i].type & NXGE_PARAM_PROP_ARR64)) { 8203859Sml29623 free_count = ((nxgep->param_arr[i].type & 8213859Sml29623 NXGE_PARAM_ARRAY_ALLOC_MASK) >> 8223859Sml29623 NXGE_PARAM_ARRAY_ALLOC_SHIFT); 8233859Sml29623 free_count = NXGE_PARAM_ARRAY_INIT_SIZE; 8243859Sml29623 free_size = sizeof (uint64_t) * free_count; 825*5125Sjoycey #if defined(__i386) 826*5125Sjoycey KMEM_FREE((void *)(uint32_t)nxgep->param_arr[i].value, 827*5125Sjoycey free_size); 828*5125Sjoycey #else 8293859Sml29623 KMEM_FREE((void *)nxgep->param_arr[i].value, free_size); 830*5125Sjoycey #endif 831*5125Sjoycey #if defined(__i386) 832*5125Sjoycey KMEM_FREE((void *)(uint32_t) 833*5125Sjoycey nxgep->param_arr[i].old_value, free_size); 834*5125Sjoycey #else 8353859Sml29623 KMEM_FREE((void *)nxgep->param_arr[i].old_value, 8363859Sml29623 free_size); 837*5125Sjoycey #endif 8383859Sml29623 } 8393859Sml29623 8403859Sml29623 KMEM_FREE(nxgep->param_arr, sizeof (nxge_param_arr)); 8413859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "<== nxge_destroy_param")); 8423859Sml29623 } 8433859Sml29623 8443859Sml29623 /* 8453859Sml29623 * Extracts the value from the 'nxge' parameter array and prints the 8463859Sml29623 * parameter value. cp points to the required parameter. 8473859Sml29623 */ 8483859Sml29623 8493859Sml29623 /* ARGSUSED */ 8503859Sml29623 int 8513859Sml29623 nxge_param_get_generic(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 8523859Sml29623 { 8533859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 8543859Sml29623 8553859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 8563859Sml29623 "==> nxge_param_get_generic name %s ", pa->name)); 8573859Sml29623 8583859Sml29623 if (pa->value > 0xffffffff) 8593859Sml29623 (void) mi_mpprintf(mp, "%x%x", 8603859Sml29623 (int)(pa->value >> 32), (int)(pa->value & 0xffffffff)); 8613859Sml29623 else 8623859Sml29623 (void) mi_mpprintf(mp, "%x", (int)pa->value); 8633859Sml29623 8643859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_generic")); 8653859Sml29623 return (0); 8663859Sml29623 } 8673859Sml29623 8683859Sml29623 /* ARGSUSED */ 8693859Sml29623 static int 8703859Sml29623 nxge_param_get_mac(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 8713859Sml29623 { 8723859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 8733859Sml29623 8743859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_mac")); 8753859Sml29623 8763859Sml29623 (void) mi_mpprintf(mp, "%d", (uint32_t)pa->value); 8773859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_mac")); 8783859Sml29623 return (0); 8793859Sml29623 } 8803859Sml29623 8813859Sml29623 /* ARGSUSED */ 8824185Sspeer static int 8834185Sspeer nxge_param_get_fw_ver(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 8844185Sspeer { 8854185Sspeer NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_fw_ver")); 8864185Sspeer 8874185Sspeer (void) mi_mpprintf(mp, "Firmware version for nxge%d: %s\n", 8884185Sspeer nxgep->instance, nxgep->vpd_info.ver); 8894185Sspeer 8904185Sspeer NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_fw_ver")); 8914185Sspeer return (0); 8924185Sspeer } 8934185Sspeer 8944185Sspeer /* ARGSUSED */ 8954977Sraghus static int 8964977Sraghus nxge_param_get_port_mode(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 8974977Sraghus { 8984977Sraghus NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_port_mode")); 8994977Sraghus 9004977Sraghus switch (nxgep->mac.portmode) { 9014977Sraghus case PORT_1G_COPPER: 9024977Sraghus (void) mi_mpprintf(mp, "Port mode for nxge%d: 1G Copper\n", 9034977Sraghus nxgep->instance); 9044977Sraghus break; 9054977Sraghus case PORT_1G_FIBER: 9064977Sraghus (void) mi_mpprintf(mp, "Port mode for nxge%d: 1G Fiber\n", 9074977Sraghus nxgep->instance); 9084977Sraghus break; 9094977Sraghus case PORT_10G_COPPER: 9104977Sraghus (void) mi_mpprintf(mp, "Port mode for nxge%d: 10G Copper\n", 9114977Sraghus nxgep->instance); 9124977Sraghus break; 9134977Sraghus case PORT_10G_FIBER: 9144977Sraghus (void) mi_mpprintf(mp, "Port mode for nxge%d: 10G Fiber\n", 9154977Sraghus nxgep->instance); 9164977Sraghus break; 9174977Sraghus case PORT_10G_SERDES: 9184977Sraghus (void) mi_mpprintf(mp, "Port mode for nxge%d: 10G Serdes\n", 9194977Sraghus nxgep->instance); 9204977Sraghus break; 9214977Sraghus case PORT_1G_SERDES: 9224977Sraghus (void) mi_mpprintf(mp, "Port mode for nxge%d: 1G Serdes\n", 9234977Sraghus nxgep->instance); 9244977Sraghus break; 9254977Sraghus case PORT_1G_RGMII_FIBER: 9264977Sraghus (void) mi_mpprintf(mp, "Port mode for nxge%d: 1G RGMII " 9274977Sraghus "Fiber\n", nxgep->instance); 9284977Sraghus break; 9294977Sraghus default: 9304977Sraghus (void) mi_mpprintf(mp, "Port mode for nxge%d: Unknown\n", 9314977Sraghus nxgep->instance); 9324977Sraghus break; 9334977Sraghus } 9344977Sraghus 9354977Sraghus NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_port_mode")); 9364977Sraghus return (0); 9374977Sraghus } 9384977Sraghus 9394977Sraghus /* ARGSUSED */ 9403859Sml29623 int 9413859Sml29623 nxge_param_get_txdma_info(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 9423859Sml29623 { 9433859Sml29623 9443859Sml29623 uint_t print_len, buf_len; 9453859Sml29623 p_mblk_t np; 9463859Sml29623 int tdc; 9473859Sml29623 9483859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE; 9493859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_txdma_info")); 9503859Sml29623 9513859Sml29623 (void) mi_mpprintf(mp, "TXDMA Information for Port\t %d \n", 9523859Sml29623 nxgep->function_num); 9533859Sml29623 9543859Sml29623 9553859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 9563859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 9573859Sml29623 return (0); 9583859Sml29623 } 9593859Sml29623 9603859Sml29623 buf_len = buff_alloc_size; 9613859Sml29623 mp->b_cont = np; 9623859Sml29623 9633859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 9643859Sml29623 "Total TDCs\t %d\n", nxgep->ntdc); 9653859Sml29623 9663859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 9673859Sml29623 buf_len -= print_len; 9683859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 9693859Sml29623 "TDC\t HW TDC\t\n"); 9703859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 9713859Sml29623 9723859Sml29623 buf_len -= print_len; 9733859Sml29623 for (tdc = 0; tdc < nxgep->ntdc; tdc++) { 9743859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 9753859Sml29623 buf_len, "%d\t %d\n", 9763859Sml29623 tdc, nxgep->tdc[tdc]); 9773859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 9783859Sml29623 buf_len -= print_len; 9793859Sml29623 } 9803859Sml29623 9813859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_txdma_info")); 9823859Sml29623 return (0); 9833859Sml29623 } 9843859Sml29623 9853859Sml29623 /* ARGSUSED */ 9863859Sml29623 int 9873859Sml29623 nxge_param_get_rxdma_info(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 9883859Sml29623 { 9893859Sml29623 uint_t print_len, buf_len; 9903859Sml29623 p_mblk_t np; 9913859Sml29623 int rdc; 9923859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 9933859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 9943859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE; 9953859Sml29623 p_rx_rcr_rings_t rx_rcr_rings; 9963859Sml29623 p_rx_rcr_ring_t *rcr_rings; 9973859Sml29623 p_rx_rbr_rings_t rx_rbr_rings; 9983859Sml29623 p_rx_rbr_ring_t *rbr_rings; 9993859Sml29623 10003859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_rxdma_info")); 10013859Sml29623 10023859Sml29623 (void) mi_mpprintf(mp, "RXDMA Information for Port\t %d \n", 10033859Sml29623 nxgep->function_num); 10043859Sml29623 10053859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 10063859Sml29623 /* The following may work even if we cannot get a large buf. */ 10073859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 10083859Sml29623 return (0); 10093859Sml29623 } 10103859Sml29623 10113859Sml29623 buf_len = buff_alloc_size; 10123859Sml29623 mp->b_cont = np; 10133859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 10143859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 10153859Sml29623 10163859Sml29623 rx_rcr_rings = nxgep->rx_rcr_rings; 10173859Sml29623 rcr_rings = rx_rcr_rings->rcr_rings; 10183859Sml29623 rx_rbr_rings = nxgep->rx_rbr_rings; 10193859Sml29623 rbr_rings = rx_rbr_rings->rbr_rings; 10203859Sml29623 10213859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 10223859Sml29623 "Total RDCs\t %d\n", p_cfgp->max_rdcs); 10233859Sml29623 10243859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 10253859Sml29623 buf_len -= print_len; 10263859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 10273859Sml29623 "RDC\t HW RDC\t Timeout\t Packets RBR ptr \t" 10283859Sml29623 "chunks\t RCR ptr\n"); 10293859Sml29623 10303859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 10313859Sml29623 buf_len -= print_len; 10323859Sml29623 for (rdc = 0; rdc < p_cfgp->max_rdcs; rdc++) { 10333859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 10343859Sml29623 " %d\t %d\t %x\t\t %x\t $%p\t 0x%x\t $%p\n", 10353859Sml29623 rdc, nxgep->rdc[rdc], 10363859Sml29623 p_dma_cfgp->rcr_timeout[rdc], 10373859Sml29623 p_dma_cfgp->rcr_threshold[rdc], 10383859Sml29623 rbr_rings[rdc], 10393859Sml29623 rbr_rings[rdc]->num_blocks, rcr_rings[rdc]); 10403859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 10413859Sml29623 buf_len -= print_len; 10423859Sml29623 } 10433859Sml29623 10443859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_rxdma_info")); 10453859Sml29623 return (0); 10463859Sml29623 } 10473859Sml29623 10483859Sml29623 /* ARGSUSED */ 10493859Sml29623 int 10503859Sml29623 nxge_param_get_rxdma_rdcgrp_info(p_nxge_t nxgep, queue_t *q, 10513859Sml29623 p_mblk_t mp, caddr_t cp) 10523859Sml29623 { 10533859Sml29623 uint_t print_len, buf_len; 10543859Sml29623 p_mblk_t np; 10553859Sml29623 int offset, rdc, i, rdc_grp; 10563859Sml29623 p_nxge_rdc_grp_t rdc_grp_p; 10573859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 10583859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 10593859Sml29623 10603859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE; 10613859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 10623859Sml29623 "==> nxge_param_get_rxdma_rdcgrp_info")); 10633859Sml29623 10643859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 10653859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 10663859Sml29623 10673859Sml29623 (void) mi_mpprintf(mp, "RXDMA RDC Group Information for Port\t %d \n", 10683859Sml29623 nxgep->function_num); 10693859Sml29623 10703859Sml29623 rdc_grp = p_cfgp->start_rdc_grpid; 10713859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 10723859Sml29623 /* The following may work even if we cannot get a large buf. */ 10733859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 10743859Sml29623 return (0); 10753859Sml29623 } 10763859Sml29623 10773859Sml29623 buf_len = buff_alloc_size; 10783859Sml29623 mp->b_cont = np; 10793859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 10803859Sml29623 "Total RDC Groups\t %d \n" 10813859Sml29623 "start RDC group\t %d\n", 10823859Sml29623 p_cfgp->max_rdc_grpids, 10833859Sml29623 p_cfgp->start_rdc_grpid); 10843859Sml29623 10853859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 10863859Sml29623 buf_len -= print_len; 10873859Sml29623 10883859Sml29623 for (i = 0, rdc_grp = p_cfgp->start_rdc_grpid; 10893859Sml29623 rdc_grp < (p_cfgp->max_rdc_grpids + p_cfgp->start_rdc_grpid); 10903859Sml29623 rdc_grp++, i++) { 10913859Sml29623 rdc_grp_p = &p_dma_cfgp->rdc_grps[i]; 10923859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 10933859Sml29623 "\nRDC Group Info for Group [%d] %d\n" 10943859Sml29623 "RDC Count %d\tstart RDC %d\n" 10953859Sml29623 "RDC Group Population Information" 10963859Sml29623 " (offsets 0 - 15)\n", 10973859Sml29623 i, rdc_grp, rdc_grp_p->max_rdcs, 10983859Sml29623 rdc_grp_p->start_rdc); 10993859Sml29623 11003859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 11013859Sml29623 buf_len -= print_len; 11023859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 11033859Sml29623 buf_len, "\n"); 11043859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 11053859Sml29623 buf_len -= print_len; 11063859Sml29623 11073859Sml29623 for (rdc = 0; rdc < rdc_grp_p->max_rdcs; rdc++) { 11083859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 11093859Sml29623 buf_len, "[%d]=%d ", rdc, 11103859Sml29623 rdc_grp_p->start_rdc + rdc); 11113859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 11123859Sml29623 buf_len -= print_len; 11133859Sml29623 } 11143859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 11153859Sml29623 buf_len, "\n"); 11163859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 11173859Sml29623 buf_len -= print_len; 11183859Sml29623 11193859Sml29623 for (offset = 0; offset < 16; offset++) { 11203859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 11213859Sml29623 buf_len, " %2d ", 11223859Sml29623 rdc_grp_p->rdc[offset]); 11233859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 11243859Sml29623 buf_len -= print_len; 11253859Sml29623 } 11263859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 11273859Sml29623 buf_len, "\n"); 11283859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 11293859Sml29623 buf_len -= print_len; 11303859Sml29623 } 11313859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 11323859Sml29623 "<== nxge_param_get_rxdma_rdcgrp_info")); 11333859Sml29623 return (0); 11343859Sml29623 } 11353859Sml29623 11363859Sml29623 int 11373859Sml29623 nxge_mk_mblk_tail_space(p_mblk_t mp, p_mblk_t *nmp, size_t size) 11383859Sml29623 { 11393859Sml29623 p_mblk_t tmp; 11403859Sml29623 11413859Sml29623 tmp = mp; 11423859Sml29623 while (tmp->b_cont) 11433859Sml29623 tmp = tmp->b_cont; 11443859Sml29623 if ((tmp->b_wptr + size) >= tmp->b_datap->db_lim) { 11453859Sml29623 tmp->b_cont = allocb(1024, BPRI_HI); 11463859Sml29623 tmp = tmp->b_cont; 11473859Sml29623 if (!tmp) 11483859Sml29623 return (ENOMEM); 11493859Sml29623 } 11503859Sml29623 11513859Sml29623 *nmp = tmp; 11523859Sml29623 return (0); 11533859Sml29623 } 11543859Sml29623 11553859Sml29623 /* 11563859Sml29623 * Sets the ge parameter to the value in the nxge_param_register using 11573859Sml29623 * nxge_nd_load(). 11583859Sml29623 */ 11593859Sml29623 11603859Sml29623 /* ARGSUSED */ 11613859Sml29623 int 11623859Sml29623 nxge_param_set_generic(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 11633859Sml29623 char *value, caddr_t cp) 11643859Sml29623 { 11653859Sml29623 char *end; 11663859Sml29623 uint32_t new_value; 11673859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 11683859Sml29623 11693859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, " ==> nxge_param_set_generic")); 11703859Sml29623 new_value = (uint32_t)mi_strtol(value, &end, 10); 11713859Sml29623 if (end == value || new_value < pa->minimum || 11723859Sml29623 new_value > pa->maximum) { 11733859Sml29623 return (EINVAL); 11743859Sml29623 } 11753859Sml29623 pa->value = new_value; 11763859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, " <== nxge_param_set_generic")); 11773859Sml29623 return (0); 11783859Sml29623 } 11793859Sml29623 11803859Sml29623 /* 11813859Sml29623 * Sets the ge parameter to the value in the nxge_param_register using 11823859Sml29623 * nxge_nd_load(). 11833859Sml29623 */ 11843859Sml29623 11853859Sml29623 /* ARGSUSED */ 11863859Sml29623 int 11873859Sml29623 nxge_param_set_instance(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 11883859Sml29623 char *value, caddr_t cp) 11893859Sml29623 { 11903859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " ==> nxge_param_set_instance")); 11913859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_set_instance")); 11923859Sml29623 return (0); 11933859Sml29623 } 11943859Sml29623 11953859Sml29623 /* 11963859Sml29623 * Sets the ge parameter to the value in the nxge_param_register using 11973859Sml29623 * nxge_nd_load(). 11983859Sml29623 */ 11993859Sml29623 12003859Sml29623 /* ARGSUSED */ 12013859Sml29623 int 12023859Sml29623 nxge_param_set_mac(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 12033859Sml29623 char *value, caddr_t cp) 12043859Sml29623 { 12053859Sml29623 char *end; 12063859Sml29623 uint32_t new_value; 12073859Sml29623 int status = 0; 12083859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 12093859Sml29623 12103859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_mac")); 12113859Sml29623 new_value = (uint32_t)mi_strtol(value, &end, BASE_DECIMAL); 12123859Sml29623 if (PARAM_OUTOF_RANGE(value, end, new_value, pa)) { 12133859Sml29623 return (EINVAL); 12143859Sml29623 } 12153859Sml29623 12163859Sml29623 if (pa->value != new_value) { 12173859Sml29623 pa->old_value = pa->value; 12183859Sml29623 pa->value = new_value; 12193859Sml29623 } 12203859Sml29623 12213859Sml29623 if (!nxge_param_link_update(nxgep)) { 12223859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 12233859Sml29623 " false ret from nxge_param_link_update")); 12243859Sml29623 status = EINVAL; 12253859Sml29623 } 12263859Sml29623 12273859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_mac")); 12283859Sml29623 return (status); 12293859Sml29623 } 12303859Sml29623 12313859Sml29623 /* ARGSUSED */ 12323859Sml29623 static int 12333859Sml29623 nxge_param_rx_intr_pkts(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 12343859Sml29623 char *value, caddr_t cp) 12353859Sml29623 { 12363859Sml29623 char *end; 12373859Sml29623 uint32_t cfg_value; 12383859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 12393859Sml29623 12403859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_rx_intr_pkts")); 12413859Sml29623 12423859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY); 12433859Sml29623 12443859Sml29623 if ((cfg_value > NXGE_RDC_RCR_THRESHOLD_MAX) || 12453859Sml29623 (cfg_value < NXGE_RDC_RCR_THRESHOLD_MIN)) { 12463859Sml29623 return (EINVAL); 12473859Sml29623 } 12483859Sml29623 12493859Sml29623 if ((pa->value != cfg_value)) { 12503859Sml29623 pa->old_value = pa->value; 12513859Sml29623 pa->value = cfg_value; 12523859Sml29623 nxgep->intr_threshold = pa->value; 12533859Sml29623 } 12543859Sml29623 12553859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_rx_intr_pkts")); 12563859Sml29623 return (0); 12573859Sml29623 } 12583859Sml29623 12593859Sml29623 /* ARGSUSED */ 12603859Sml29623 static int 12613859Sml29623 nxge_param_rx_intr_time(p_nxge_t nxgep, queue_t *q, mblk_t *mp, 12623859Sml29623 char *value, caddr_t cp) 12633859Sml29623 { 12643859Sml29623 char *end; 12653859Sml29623 uint32_t cfg_value; 12663859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 12673859Sml29623 12683859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_rx_intr_time")); 12693859Sml29623 12703859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY); 12713859Sml29623 12723859Sml29623 if ((cfg_value > NXGE_RDC_RCR_TIMEOUT_MAX) || 12733859Sml29623 (cfg_value < NXGE_RDC_RCR_TIMEOUT_MIN)) { 12743859Sml29623 return (EINVAL); 12753859Sml29623 } 12763859Sml29623 12773859Sml29623 if ((pa->value != cfg_value)) { 12783859Sml29623 pa->old_value = pa->value; 12793859Sml29623 pa->value = cfg_value; 12803859Sml29623 nxgep->intr_timeout = pa->value; 12813859Sml29623 } 12823859Sml29623 12833859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_rx_intr_time")); 12843859Sml29623 return (0); 12853859Sml29623 } 12863859Sml29623 12873859Sml29623 /* ARGSUSED */ 12883859Sml29623 static int 12893859Sml29623 nxge_param_set_mac_rdcgrp(p_nxge_t nxgep, queue_t *q, 12903859Sml29623 mblk_t *mp, char *value, caddr_t cp) 12913859Sml29623 { 12923859Sml29623 char *end; 12933859Sml29623 uint32_t status = 0, cfg_value; 12943859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 12953859Sml29623 uint32_t cfg_it = B_FALSE; 12963859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 12973859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 12983859Sml29623 uint32_t *val_ptr, *old_val_ptr; 12993859Sml29623 nxge_param_map_t *mac_map; 13003859Sml29623 p_nxge_class_pt_cfg_t p_class_cfgp; 13013859Sml29623 nxge_mv_cfg_t *mac_host_info; 13023859Sml29623 13033859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_mac_rdcgrp ")); 13043859Sml29623 13053859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 13063859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 13073859Sml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config; 13083859Sml29623 mac_host_info = (nxge_mv_cfg_t *)&p_class_cfgp->mac_host_info[0]; 13093859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 13103859Sml29623 13113859Sml29623 /* 13123859Sml29623 * now do decoding 13133859Sml29623 */ 13143859Sml29623 mac_map = (nxge_param_map_t *)&cfg_value; 13153859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " cfg_value %x id %x map_to %x", 13163859Sml29623 cfg_value, mac_map->param_id, mac_map->map_to)); 13173859Sml29623 13183859Sml29623 if ((mac_map->param_id < p_cfgp->max_macs) && 13193859Sml29623 (mac_map->map_to < (p_cfgp->max_rdc_grpids + 13203859Sml29623 p_cfgp->start_rdc_grpid)) && (mac_map->map_to >= 13213859Sml29623 p_cfgp->start_rdc_grpid)) { 13223859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 13233859Sml29623 " nxge_param_set_mac_rdcgrp mapping" 13243859Sml29623 " id %d grp %d", mac_map->param_id, mac_map->map_to)); 1325*5125Sjoycey #if defined(__i386) 1326*5125Sjoycey val_ptr = (uint32_t *)(uint32_t)pa->value; 1327*5125Sjoycey #else 13283859Sml29623 val_ptr = (uint32_t *)pa->value; 1329*5125Sjoycey #endif 1330*5125Sjoycey #if defined(__i386) 1331*5125Sjoycey old_val_ptr = (uint32_t *)(uint32_t)pa->old_value; 1332*5125Sjoycey #else 13333859Sml29623 old_val_ptr = (uint32_t *)pa->old_value; 1334*5125Sjoycey #endif 13353859Sml29623 if (val_ptr[mac_map->param_id] != cfg_value) { 13363859Sml29623 old_val_ptr[mac_map->param_id] = 13373859Sml29623 val_ptr[mac_map->param_id]; 13383859Sml29623 val_ptr[mac_map->param_id] = cfg_value; 13393859Sml29623 mac_host_info[mac_map->param_id].mpr_npr = 13403859Sml29623 mac_map->pref; 13413859Sml29623 mac_host_info[mac_map->param_id].flag = 1; 13423859Sml29623 mac_host_info[mac_map->param_id].rdctbl = 13433859Sml29623 mac_map->map_to; 13443859Sml29623 cfg_it = B_TRUE; 13453859Sml29623 } 13463859Sml29623 } else { 13473859Sml29623 return (EINVAL); 13483859Sml29623 } 13493859Sml29623 13503859Sml29623 if (cfg_it == B_TRUE) { 13513859Sml29623 status = nxge_logical_mac_assign_rdc_table(nxgep, 13523859Sml29623 (uint8_t)mac_map->param_id); 13533859Sml29623 if (status != NXGE_OK) 13543859Sml29623 return (EINVAL); 13553859Sml29623 } 13563859Sml29623 13573859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_mac_rdcgrp")); 13583859Sml29623 return (0); 13593859Sml29623 } 13603859Sml29623 13613859Sml29623 /* ARGSUSED */ 13623859Sml29623 static int 13633859Sml29623 nxge_param_set_vlan_rdcgrp(p_nxge_t nxgep, queue_t *q, 13643859Sml29623 mblk_t *mp, char *value, caddr_t cp) 13653859Sml29623 { 13663859Sml29623 char *end; 13673859Sml29623 uint32_t status = 0, cfg_value; 13683859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 13693859Sml29623 uint32_t cfg_it = B_FALSE; 13703859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 13713859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 13723859Sml29623 uint32_t *val_ptr, *old_val_ptr; 13733859Sml29623 nxge_param_map_t *vmap, *old_map; 13743859Sml29623 p_nxge_class_pt_cfg_t p_class_cfgp; 13753859Sml29623 uint64_t cfgd_vlans; 13763859Sml29623 int i, inc = 0, cfg_position; 13773859Sml29623 nxge_mv_cfg_t *vlan_tbl; 13783859Sml29623 13793859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_vlan_rdcgrp ")); 13803859Sml29623 13813859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 13823859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 13833859Sml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config; 13843859Sml29623 vlan_tbl = (nxge_mv_cfg_t *)&p_class_cfgp->vlan_tbl[0]; 13853859Sml29623 13863859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 13873859Sml29623 13883859Sml29623 /* now do decoding */ 13893859Sml29623 cfgd_vlans = ((pa->type & NXGE_PARAM_ARRAY_CNT_MASK) >> 13903859Sml29623 NXGE_PARAM_ARRAY_CNT_SHIFT); 13913859Sml29623 13923859Sml29623 if (cfgd_vlans == NXGE_PARAM_ARRAY_INIT_SIZE) { 13933859Sml29623 /* 13943859Sml29623 * for now, we process only upto max 13953859Sml29623 * NXGE_PARAM_ARRAY_INIT_SIZE parameters 13963859Sml29623 * In the future, we may want to expand 13973859Sml29623 * the storage array and continue 13983859Sml29623 */ 13993859Sml29623 return (EINVAL); 14003859Sml29623 } 14013859Sml29623 14023859Sml29623 vmap = (nxge_param_map_t *)&cfg_value; 14033859Sml29623 if ((vmap->param_id) && 14043859Sml29623 (vmap->param_id < NXGE_MAX_VLANS) && 14053859Sml29623 (vmap->map_to < p_cfgp->max_rdc_grpids)) { 14063859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 14073859Sml29623 "nxge_param_set_vlan_rdcgrp mapping" 14083859Sml29623 " id %d grp %d", 14093859Sml29623 vmap->param_id, vmap->map_to)); 1410*5125Sjoycey #if defined(__i386) 1411*5125Sjoycey val_ptr = (uint32_t *)(uint32_t)pa->value; 1412*5125Sjoycey #else 14133859Sml29623 val_ptr = (uint32_t *)pa->value; 1414*5125Sjoycey #endif 1415*5125Sjoycey #if defined(__i386) 1416*5125Sjoycey old_val_ptr = (uint32_t *)(uint32_t)pa->old_value; 1417*5125Sjoycey #else 14183859Sml29623 old_val_ptr = (uint32_t *)pa->old_value; 1419*5125Sjoycey #endif 14203859Sml29623 14213859Sml29623 /* search to see if this vlan id is already configured */ 14223859Sml29623 for (i = 0; i < cfgd_vlans; i++) { 14233859Sml29623 old_map = (nxge_param_map_t *)&val_ptr[i]; 14243859Sml29623 if ((old_map->param_id == 0) || 14253859Sml29623 (vmap->param_id == old_map->param_id) || 14263859Sml29623 (vlan_tbl[vmap->param_id].flag)) { 14273859Sml29623 cfg_position = i; 14283859Sml29623 break; 14293859Sml29623 } 14303859Sml29623 } 14313859Sml29623 14323859Sml29623 if (cfgd_vlans == 0) { 14333859Sml29623 cfg_position = 0; 14343859Sml29623 inc++; 14353859Sml29623 } 14363859Sml29623 14373859Sml29623 if (i == cfgd_vlans) { 14383859Sml29623 cfg_position = i; 14393859Sml29623 inc++; 14403859Sml29623 } 14413859Sml29623 14423859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL, 14433859Sml29623 "set_vlan_rdcgrp mapping" 14443859Sml29623 " i %d cfgd_vlans %llx position %d ", 14453859Sml29623 i, cfgd_vlans, cfg_position)); 14463859Sml29623 if (val_ptr[cfg_position] != cfg_value) { 14473859Sml29623 old_val_ptr[cfg_position] = val_ptr[cfg_position]; 14483859Sml29623 val_ptr[cfg_position] = cfg_value; 14493859Sml29623 vlan_tbl[vmap->param_id].mpr_npr = vmap->pref; 14503859Sml29623 vlan_tbl[vmap->param_id].flag = 1; 14513859Sml29623 vlan_tbl[vmap->param_id].rdctbl = 14523859Sml29623 vmap->map_to + p_cfgp->start_rdc_grpid; 14533859Sml29623 cfg_it = B_TRUE; 14543859Sml29623 if (inc) { 14553859Sml29623 cfgd_vlans++; 14563859Sml29623 pa->type &= ~NXGE_PARAM_ARRAY_CNT_MASK; 14573859Sml29623 pa->type |= (cfgd_vlans << 14583859Sml29623 NXGE_PARAM_ARRAY_CNT_SHIFT); 14593859Sml29623 14603859Sml29623 } 14613859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD2_CTL, 14623859Sml29623 "after: param_set_vlan_rdcgrp " 14633859Sml29623 " cfg_vlans %llx position %d \n", 14643859Sml29623 cfgd_vlans, cfg_position)); 14653859Sml29623 } 14663859Sml29623 } else { 14673859Sml29623 return (EINVAL); 14683859Sml29623 } 14693859Sml29623 14703859Sml29623 if (cfg_it == B_TRUE) { 14713859Sml29623 status = nxge_fflp_config_vlan_table(nxgep, 14723859Sml29623 (uint16_t)vmap->param_id); 14733859Sml29623 if (status != NXGE_OK) 14743859Sml29623 return (EINVAL); 14753859Sml29623 } 14763859Sml29623 14773859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_vlan_rdcgrp")); 14783859Sml29623 return (0); 14793859Sml29623 } 14803859Sml29623 14813859Sml29623 /* ARGSUSED */ 14823859Sml29623 static int 14833859Sml29623 nxge_param_get_vlan_rdcgrp(p_nxge_t nxgep, queue_t *q, 14843859Sml29623 mblk_t *mp, caddr_t cp) 14853859Sml29623 { 14863859Sml29623 14873859Sml29623 uint_t print_len, buf_len; 14883859Sml29623 p_mblk_t np; 14893859Sml29623 int i; 14903859Sml29623 uint32_t *val_ptr; 14913859Sml29623 nxge_param_map_t *vmap; 14923859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 14933859Sml29623 p_nxge_class_pt_cfg_t p_class_cfgp; 14943859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 14953859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 14963859Sml29623 uint64_t cfgd_vlans = 0; 14973859Sml29623 nxge_mv_cfg_t *vlan_tbl; 14983859Sml29623 int buff_alloc_size = 14993859Sml29623 NXGE_NDD_INFODUMP_BUFF_SIZE * 32; 15003859Sml29623 15013859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_vlan_rdcgrp ")); 15023859Sml29623 (void) mi_mpprintf(mp, "VLAN RDC Mapping Information for Port\t %d \n", 15033859Sml29623 nxgep->function_num); 15043859Sml29623 15053859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 15063859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 15073859Sml29623 return (0); 15083859Sml29623 } 15093859Sml29623 15103859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 15113859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 15123859Sml29623 15133859Sml29623 buf_len = buff_alloc_size; 15143859Sml29623 mp->b_cont = np; 15153859Sml29623 cfgd_vlans = (pa->type & NXGE_PARAM_ARRAY_CNT_MASK) >> 15163859Sml29623 NXGE_PARAM_ARRAY_CNT_SHIFT; 15173859Sml29623 15183859Sml29623 i = (int)cfgd_vlans; 15193859Sml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config; 15203859Sml29623 vlan_tbl = (nxge_mv_cfg_t *)&p_class_cfgp->vlan_tbl[0]; 15213859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 15223859Sml29623 "Configured VLANs %d\n" 15233859Sml29623 "VLAN ID\t RDC GRP (Actual/Port)\t" 15243859Sml29623 " Prefernce\n", i); 15253859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 15263859Sml29623 buf_len -= print_len; 1527*5125Sjoycey #if defined(__i386) 1528*5125Sjoycey val_ptr = (uint32_t *)(uint32_t)pa->value; 1529*5125Sjoycey #else 15303859Sml29623 val_ptr = (uint32_t *)pa->value; 1531*5125Sjoycey #endif 15323859Sml29623 15333859Sml29623 for (i = 0; i < cfgd_vlans; i++) { 15343859Sml29623 vmap = (nxge_param_map_t *)&val_ptr[i]; 15353859Sml29623 if (p_class_cfgp->vlan_tbl[vmap->param_id].flag) { 15363859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 15373859Sml29623 buf_len, 15383859Sml29623 " %d\t\t %d/%d\t\t %d\n", 15393859Sml29623 vmap->param_id, 15403859Sml29623 vlan_tbl[vmap->param_id].rdctbl, 15413859Sml29623 vlan_tbl[vmap->param_id].rdctbl - 15423859Sml29623 p_cfgp->start_rdc_grpid, 15433859Sml29623 vlan_tbl[vmap->param_id].mpr_npr); 15443859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 15453859Sml29623 buf_len -= print_len; 15463859Sml29623 } 15473859Sml29623 } 15483859Sml29623 15493859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_vlan_rdcgrp")); 15503859Sml29623 return (0); 15513859Sml29623 } 15523859Sml29623 15533859Sml29623 /* ARGSUSED */ 15543859Sml29623 static int 15553859Sml29623 nxge_param_get_mac_rdcgrp(p_nxge_t nxgep, queue_t *q, 15563859Sml29623 mblk_t *mp, caddr_t cp) 15573859Sml29623 { 15583859Sml29623 uint_t print_len, buf_len; 15593859Sml29623 p_mblk_t np; 15603859Sml29623 int i; 15613859Sml29623 p_nxge_class_pt_cfg_t p_class_cfgp; 15623859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 15633859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 15643859Sml29623 nxge_mv_cfg_t *mac_host_info; 15653859Sml29623 15663859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_SIZE * 32; 15673859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_mac_rdcgrp ")); 15683859Sml29623 (void) mi_mpprintf(mp, 15693859Sml29623 "MAC ADDR RDC Mapping Information for Port\t %d\n", 15703859Sml29623 nxgep->function_num); 15713859Sml29623 15723859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 15733859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 15743859Sml29623 return (0); 15753859Sml29623 } 15763859Sml29623 15773859Sml29623 buf_len = buff_alloc_size; 15783859Sml29623 mp->b_cont = np; 15793859Sml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config; 15803859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 15813859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 15823859Sml29623 mac_host_info = (nxge_mv_cfg_t *)&p_class_cfgp->mac_host_info[0]; 15833859Sml29623 print_len = snprintf((char *)np->b_wptr, buf_len, 15843859Sml29623 "MAC ID\t RDC GRP (Actual/Port)\t" 15853859Sml29623 " Prefernce\n"); 15863859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 15873859Sml29623 buf_len -= print_len; 15883859Sml29623 for (i = 0; i < p_cfgp->max_macs; i++) { 15893859Sml29623 if (mac_host_info[i].flag) { 15903859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, 15913859Sml29623 buf_len, 15923859Sml29623 " %d\t %d/%d\t\t %d\n", 15933859Sml29623 i, mac_host_info[i].rdctbl, 15943859Sml29623 mac_host_info[i].rdctbl - 15953859Sml29623 p_cfgp->start_rdc_grpid, 15963859Sml29623 mac_host_info[i].mpr_npr); 15973859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 15983859Sml29623 buf_len -= print_len; 15993859Sml29623 } 16003859Sml29623 } 16013859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 16023859Sml29623 "Done Info Dumping \n"); 16033859Sml29623 ((mblk_t *)np)->b_wptr += print_len; 16043859Sml29623 buf_len -= print_len; 16053859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_macrdcgrp")); 16063859Sml29623 return (0); 16073859Sml29623 } 16083859Sml29623 16093859Sml29623 /* ARGSUSED */ 16103859Sml29623 static int 16113859Sml29623 nxge_param_tcam_enable(p_nxge_t nxgep, queue_t *q, 16123859Sml29623 mblk_t *mp, char *value, caddr_t cp) 16133859Sml29623 { 16143859Sml29623 uint32_t status = 0, cfg_value; 16153859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 16163859Sml29623 uint32_t cfg_it = B_FALSE; 16173859Sml29623 char *end; 16183859Sml29623 16193859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_tcam_enable")); 16203859Sml29623 16213859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_BINARY); 16223859Sml29623 if (pa->value != cfg_value) { 16233859Sml29623 pa->old_value = pa->value; 16243859Sml29623 pa->value = cfg_value; 16253859Sml29623 cfg_it = B_TRUE; 16263859Sml29623 } 16273859Sml29623 16283859Sml29623 if (cfg_it == B_TRUE) { 16293859Sml29623 if (pa->value) 16303859Sml29623 status = nxge_fflp_config_tcam_enable(nxgep); 16313859Sml29623 else 16323859Sml29623 status = nxge_fflp_config_tcam_disable(nxgep); 16333859Sml29623 if (status != NXGE_OK) 16343859Sml29623 return (EINVAL); 16353859Sml29623 } 16363859Sml29623 16373859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_tcam_enable")); 16383859Sml29623 return (0); 16393859Sml29623 } 16403859Sml29623 16413859Sml29623 /* ARGSUSED */ 16423859Sml29623 static int 16433859Sml29623 nxge_param_hash_lookup_enable(p_nxge_t nxgep, queue_t *q, 16443859Sml29623 mblk_t *mp, char *value, caddr_t cp) 16453859Sml29623 { 16463859Sml29623 uint32_t status = 0, cfg_value; 16473859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 16483859Sml29623 uint32_t cfg_it = B_FALSE; 16493859Sml29623 char *end; 16503859Sml29623 16513859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_hash_lookup_enable")); 16523859Sml29623 16533859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_BINARY); 16543859Sml29623 if (pa->value != cfg_value) { 16553859Sml29623 pa->old_value = pa->value; 16563859Sml29623 pa->value = cfg_value; 16573859Sml29623 cfg_it = B_TRUE; 16583859Sml29623 } 16593859Sml29623 16603859Sml29623 if (cfg_it == B_TRUE) { 16613859Sml29623 if (pa->value) 16623859Sml29623 status = nxge_fflp_config_hash_lookup_enable(nxgep); 16633859Sml29623 else 16643859Sml29623 status = nxge_fflp_config_hash_lookup_disable(nxgep); 16653859Sml29623 if (status != NXGE_OK) 16663859Sml29623 return (EINVAL); 16673859Sml29623 } 16683859Sml29623 16693859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_hash_lookup_enable")); 16703859Sml29623 return (0); 16713859Sml29623 } 16723859Sml29623 16733859Sml29623 /* ARGSUSED */ 16743859Sml29623 static int 16753859Sml29623 nxge_param_llc_snap_enable(p_nxge_t nxgep, queue_t *q, 16763859Sml29623 mblk_t *mp, char *value, caddr_t cp) 16773859Sml29623 { 16783859Sml29623 char *end; 16793859Sml29623 uint32_t status = 0, cfg_value; 16803859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 16813859Sml29623 uint32_t cfg_it = B_FALSE; 16823859Sml29623 16833859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_llc_snap_enable")); 16843859Sml29623 16853859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_BINARY); 16863859Sml29623 if (pa->value != cfg_value) { 16873859Sml29623 pa->old_value = pa->value; 16883859Sml29623 pa->value = cfg_value; 16893859Sml29623 cfg_it = B_TRUE; 16903859Sml29623 } 16913859Sml29623 16923859Sml29623 if (cfg_it == B_TRUE) { 16933859Sml29623 if (pa->value) 16943859Sml29623 status = nxge_fflp_config_tcam_enable(nxgep); 16953859Sml29623 else 16963859Sml29623 status = nxge_fflp_config_tcam_disable(nxgep); 16973859Sml29623 if (status != NXGE_OK) 16983859Sml29623 return (EINVAL); 16993859Sml29623 } 17003859Sml29623 17013859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_llc_snap_enable")); 17023859Sml29623 return (0); 17033859Sml29623 } 17043859Sml29623 17053859Sml29623 /* ARGSUSED */ 17063859Sml29623 static int 17073859Sml29623 nxge_param_set_ether_usr(p_nxge_t nxgep, queue_t *q, 17083859Sml29623 mblk_t *mp, char *value, caddr_t cp) 17093859Sml29623 { 17103859Sml29623 char *end; 17113859Sml29623 uint8_t ether_class; 17123859Sml29623 uint32_t status = 0, cfg_value; 17133859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 17143859Sml29623 uint8_t cfg_it = B_FALSE; 17153859Sml29623 17163859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_ether_usr")); 17173859Sml29623 17183859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 17193859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 17203859Sml29623 return (EINVAL); 17213859Sml29623 } 17223859Sml29623 17233859Sml29623 if (pa->value != cfg_value) { 17243859Sml29623 pa->old_value = pa->value; 17253859Sml29623 pa->value = cfg_value; 17263859Sml29623 cfg_it = B_TRUE; 17273859Sml29623 } 17283859Sml29623 17293859Sml29623 /* do the actual hw setup */ 17303859Sml29623 if (cfg_it == B_TRUE) { 17313859Sml29623 ether_class = mi_strtol(pa->name, &end, 10); 17323859Sml29623 #ifdef lint 17333859Sml29623 ether_class = ether_class; 17343859Sml29623 #endif 17353859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " nxge_param_set_ether_usr")); 17363859Sml29623 } 17373859Sml29623 17383859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_ether_usr")); 17393859Sml29623 return (status); 17403859Sml29623 } 17413859Sml29623 17423859Sml29623 /* ARGSUSED */ 17433859Sml29623 static int 17443859Sml29623 nxge_param_set_ip_usr(p_nxge_t nxgep, queue_t *q, 17453859Sml29623 mblk_t *mp, char *value, caddr_t cp) 17463859Sml29623 { 17473859Sml29623 char *end; 17483859Sml29623 tcam_class_t class; 17493859Sml29623 uint32_t status, cfg_value; 17503859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 17513859Sml29623 uint32_t cfg_it = B_FALSE; 17523859Sml29623 17533859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_ip_usr")); 17543859Sml29623 17553859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 17563859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 17573859Sml29623 return (EINVAL); 17583859Sml29623 } 17593859Sml29623 17603859Sml29623 if (pa->value != cfg_value) { 17613859Sml29623 pa->old_value = pa->value; 17623859Sml29623 pa->value = cfg_value; 17633859Sml29623 cfg_it = B_TRUE; 17643859Sml29623 } 17653859Sml29623 17663859Sml29623 /* do the actual hw setup with cfg_value. */ 17673859Sml29623 if (cfg_it == B_TRUE) { 17683859Sml29623 class = mi_strtol(pa->name, &end, 10); 17693859Sml29623 status = nxge_fflp_ip_usr_class_config(nxgep, class, pa->value); 17703859Sml29623 } 17713859Sml29623 17723859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_ip_usr")); 17733859Sml29623 return (status); 17743859Sml29623 } 17753859Sml29623 17763859Sml29623 /* ARGSUSED */ 17773859Sml29623 static int 17783859Sml29623 nxge_class_name_2value(p_nxge_t nxgep, char *name) 17793859Sml29623 { 17803859Sml29623 int i; 17813859Sml29623 int class_instance = param_class_opt_ip_usr4; 17823859Sml29623 p_nxge_param_t param_arr; 17833859Sml29623 17843859Sml29623 param_arr = nxgep->param_arr; 17853859Sml29623 for (i = TCAM_CLASS_IP_USER_4; i <= TCAM_CLASS_SCTP_IPV6; i++) { 17863859Sml29623 if (strcmp(param_arr[class_instance].name, name) == 0) 17873859Sml29623 return (i); 17883859Sml29623 class_instance++; 17893859Sml29623 } 17903859Sml29623 return (-1); 17913859Sml29623 } 17923859Sml29623 17933859Sml29623 /* ARGSUSED */ 17943859Sml29623 static int 17953859Sml29623 nxge_param_set_ip_opt(p_nxge_t nxgep, queue_t *q, 17963859Sml29623 mblk_t *mp, char *value, caddr_t cp) 17973859Sml29623 { 17983859Sml29623 char *end; 17993859Sml29623 uint32_t status, cfg_value; 18003859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 18013859Sml29623 tcam_class_t class; 18023859Sml29623 uint32_t cfg_it = B_FALSE; 18033859Sml29623 18043859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_ip_opt")); 18053859Sml29623 18063859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 18073859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 18083859Sml29623 return (EINVAL); 18093859Sml29623 } 18103859Sml29623 18113859Sml29623 if (pa->value != cfg_value) { 18123859Sml29623 pa->old_value = pa->value; 18133859Sml29623 pa->value = cfg_value; 18143859Sml29623 cfg_it = B_TRUE; 18153859Sml29623 } 18163859Sml29623 18173859Sml29623 if (cfg_it == B_TRUE) { 18183859Sml29623 /* do the actual hw setup */ 18193859Sml29623 class = nxge_class_name_2value(nxgep, pa->name); 18203859Sml29623 if (class == -1) 18213859Sml29623 return (EINVAL); 18223859Sml29623 18233859Sml29623 status = nxge_fflp_ip_class_config(nxgep, class, pa->value); 18243859Sml29623 if (status != NXGE_OK) 18253859Sml29623 return (EINVAL); 18263859Sml29623 } 18273859Sml29623 18283859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_ip_opt")); 18293859Sml29623 return (0); 18303859Sml29623 } 18313859Sml29623 18323859Sml29623 /* ARGSUSED */ 18333859Sml29623 static int 18343859Sml29623 nxge_param_get_ip_opt(p_nxge_t nxgep, queue_t *q, 18353859Sml29623 mblk_t *mp, caddr_t cp) 18363859Sml29623 { 18373859Sml29623 uint32_t status, cfg_value; 18383859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 18393859Sml29623 tcam_class_t class; 18403859Sml29623 18413859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_ip_opt")); 18423859Sml29623 18433859Sml29623 /* do the actual hw setup */ 18443859Sml29623 class = nxge_class_name_2value(nxgep, pa->name); 18453859Sml29623 if (class == -1) 18463859Sml29623 return (EINVAL); 18473859Sml29623 18483859Sml29623 cfg_value = 0; 18493859Sml29623 status = nxge_fflp_ip_class_config_get(nxgep, class, &cfg_value); 18503859Sml29623 if (status != NXGE_OK) 18513859Sml29623 return (EINVAL); 18523859Sml29623 18533859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 18543859Sml29623 "nxge_param_get_ip_opt_get %x ", cfg_value)); 18553859Sml29623 18563859Sml29623 pa->value = cfg_value; 18573859Sml29623 (void) mi_mpprintf(mp, "%x", cfg_value); 18583859Sml29623 18593859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_ip_opt status ")); 18603859Sml29623 return (0); 18613859Sml29623 } 18623859Sml29623 18633859Sml29623 /* ARGSUSED */ 18643859Sml29623 static int 18653859Sml29623 nxge_param_fflp_hash_init(p_nxge_t nxgep, queue_t *q, 18663859Sml29623 mblk_t *mp, char *value, caddr_t cp) 18673859Sml29623 { 18683859Sml29623 char *end; 18693859Sml29623 uint32_t status, cfg_value; 18703859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 18713859Sml29623 tcam_class_t class; 18723859Sml29623 uint32_t cfg_it = B_FALSE; 18733859Sml29623 18743859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_fflp_hash_init")); 18753859Sml29623 18763859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_HEX); 18773859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 18783859Sml29623 return (EINVAL); 18793859Sml29623 } 18803859Sml29623 18813859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 18823859Sml29623 "nxge_param_fflp_hash_init value %x", cfg_value)); 18833859Sml29623 18843859Sml29623 if (pa->value != cfg_value) { 18853859Sml29623 pa->old_value = pa->value; 18863859Sml29623 pa->value = cfg_value; 18873859Sml29623 cfg_it = B_TRUE; 18883859Sml29623 } 18893859Sml29623 18903859Sml29623 if (cfg_it == B_TRUE) { 18913859Sml29623 char *h_name; 18923859Sml29623 18933859Sml29623 /* do the actual hw setup */ 18943859Sml29623 h_name = pa->name; 18953859Sml29623 h_name++; 18963859Sml29623 class = mi_strtol(h_name, &end, 10); 18973859Sml29623 switch (class) { 18983859Sml29623 case 1: 18993859Sml29623 status = nxge_fflp_set_hash1(nxgep, 19003859Sml29623 (uint32_t)pa->value); 19013859Sml29623 break; 19023859Sml29623 case 2: 19033859Sml29623 status = nxge_fflp_set_hash2(nxgep, 19043859Sml29623 (uint16_t)pa->value); 19053859Sml29623 break; 19063859Sml29623 19073859Sml29623 default: 19083859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 19093859Sml29623 " nxge_param_fflp_hash_init" 19103859Sml29623 " %s Wrong hash var %d", 19113859Sml29623 pa->name, class)); 19123859Sml29623 return (EINVAL); 19133859Sml29623 } 19143859Sml29623 if (status != NXGE_OK) 19153859Sml29623 return (EINVAL); 19163859Sml29623 } 19173859Sml29623 19183859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " <== nxge_param_fflp_hash_init")); 19193859Sml29623 return (0); 19203859Sml29623 } 19213859Sml29623 19223859Sml29623 /* ARGSUSED */ 19233859Sml29623 static int 19243859Sml29623 nxge_param_set_grp_rdc(p_nxge_t nxgep, queue_t *q, 19253859Sml29623 mblk_t *mp, char *value, caddr_t cp) 19263859Sml29623 { 19273859Sml29623 char *end; 19283859Sml29623 uint32_t status = 0, cfg_value; 19293859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 19303859Sml29623 uint32_t cfg_it = B_FALSE; 19313859Sml29623 int rdc_grp; 19323859Sml29623 uint8_t real_rdc; 19333859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 19343859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 19353859Sml29623 p_nxge_rdc_grp_t rdc_grp_p; 19363859Sml29623 19373859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 19383859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 19393859Sml29623 19403859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_grp_rdc")); 19413859Sml29623 19423859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY); 19433859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 19443859Sml29623 return (EINVAL); 19453859Sml29623 } 19463859Sml29623 19473859Sml29623 if (cfg_value >= p_cfgp->max_rdcs) { 19483859Sml29623 return (EINVAL); 19493859Sml29623 } 19503859Sml29623 19513859Sml29623 if (pa->value != cfg_value) { 19523859Sml29623 pa->old_value = pa->value; 19533859Sml29623 pa->value = cfg_value; 19543859Sml29623 cfg_it = B_TRUE; 19553859Sml29623 } 19563859Sml29623 19573859Sml29623 if (cfg_it == B_TRUE) { 19583859Sml29623 char *grp_name; 19593859Sml29623 grp_name = pa->name; 19603859Sml29623 grp_name += strlen("default-grp"); 19613859Sml29623 rdc_grp = mi_strtol(grp_name, &end, 10); 19623859Sml29623 rdc_grp_p = &p_dma_cfgp->rdc_grps[rdc_grp]; 19633859Sml29623 real_rdc = rdc_grp_p->start_rdc + cfg_value; 19643859Sml29623 if (nxge_check_rxdma_rdcgrp_member(nxgep, rdc_grp, 19653859Sml29623 cfg_value) == B_FALSE) { 19663859Sml29623 pa->value = pa->old_value; 19673859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 19683859Sml29623 " nxge_param_set_grp_rdc" 19693859Sml29623 " %d read %d actual %d outof range", 19703859Sml29623 rdc_grp, cfg_value, real_rdc)); 19713859Sml29623 return (EINVAL); 19723859Sml29623 } 19733859Sml29623 status = nxge_rxdma_cfg_rdcgrp_default_rdc(nxgep, rdc_grp, 19743859Sml29623 real_rdc); 19753859Sml29623 if (status != NXGE_OK) 19763859Sml29623 return (EINVAL); 19773859Sml29623 } 19783859Sml29623 19793859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_grp_rdc")); 19803859Sml29623 return (0); 19813859Sml29623 } 19823859Sml29623 19833859Sml29623 /* ARGSUSED */ 19843859Sml29623 static int 19853859Sml29623 nxge_param_set_port_rdc(p_nxge_t nxgep, queue_t *q, 19863859Sml29623 mblk_t *mp, char *value, caddr_t cp) 19873859Sml29623 { 19883859Sml29623 char *end; 19893859Sml29623 uint32_t status = B_TRUE, cfg_value; 19903859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 19913859Sml29623 uint32_t cfg_it = B_FALSE; 19923859Sml29623 19933859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 19943859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 19953859Sml29623 19963859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_port_rdc")); 19973859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 19983859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 19993859Sml29623 20003859Sml29623 cfg_value = (uint32_t)mi_strtol(value, &end, BASE_ANY); 20013859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 20023859Sml29623 return (EINVAL); 20033859Sml29623 } 20043859Sml29623 20053859Sml29623 if (pa->value != cfg_value) { 20063859Sml29623 if (cfg_value >= p_cfgp->max_rdcs) 20073859Sml29623 return (EINVAL); 20083859Sml29623 pa->old_value = pa->value; 20093859Sml29623 pa->value = cfg_value; 20103859Sml29623 cfg_it = B_TRUE; 20113859Sml29623 } 20123859Sml29623 20133859Sml29623 if (cfg_it == B_TRUE) { 20143859Sml29623 status = nxge_rxdma_cfg_port_default_rdc(nxgep, 20153859Sml29623 nxgep->function_num, 20163859Sml29623 nxgep->rdc[cfg_value]); 20173859Sml29623 if (status != NXGE_OK) 20183859Sml29623 return (EINVAL); 20193859Sml29623 } 20203859Sml29623 20213859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_port_rdc")); 20223859Sml29623 return (0); 20233859Sml29623 } 20243859Sml29623 20253859Sml29623 /* ARGSUSED */ 20263859Sml29623 static int 20273859Sml29623 nxge_param_set_nxge_debug_flag(p_nxge_t nxgep, queue_t *q, 20283859Sml29623 mblk_t *mp, char *value, caddr_t cp) 20293859Sml29623 { 20303859Sml29623 char *end; 20313859Sml29623 uint32_t status = 0; 20323859Sml29623 uint64_t cfg_value = 0; 20333859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 20343859Sml29623 uint32_t cfg_it = B_FALSE; 20353859Sml29623 20363859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_nxge_debug_flag")); 20373859Sml29623 cfg_value = mi_strtol(value, &end, BASE_HEX); 20383859Sml29623 20393859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 20403859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, 20413859Sml29623 " nxge_param_set_nxge_debug_flag" 20423859Sml29623 " outof range %llx", cfg_value)); 20433859Sml29623 return (EINVAL); 20443859Sml29623 } 20453859Sml29623 if (pa->value != cfg_value) { 20463859Sml29623 pa->old_value = pa->value; 20473859Sml29623 pa->value = cfg_value; 20483859Sml29623 cfg_it = B_TRUE; 20493859Sml29623 } 20503859Sml29623 20513859Sml29623 if (cfg_it == B_TRUE) { 20523859Sml29623 nxgep->nxge_debug_level = pa->value; 20533859Sml29623 } 20543859Sml29623 20553859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_nxge_debug_flag")); 20563859Sml29623 return (status); 20573859Sml29623 } 20583859Sml29623 20593859Sml29623 /* ARGSUSED */ 20603859Sml29623 static int 20613859Sml29623 nxge_param_get_debug_flag(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 20623859Sml29623 { 20633859Sml29623 int status = 0; 20643859Sml29623 p_nxge_param_t pa = (p_nxge_param_t)cp; 20653859Sml29623 20663859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_get_debug_flag")); 20673859Sml29623 20683859Sml29623 if (pa->value > 0xffffffff) 20693859Sml29623 (void) mi_mpprintf(mp, "%x%x", (int)(pa->value >> 32), 20703859Sml29623 (int)(pa->value & 0xffffffff)); 20713859Sml29623 else 20723859Sml29623 (void) mi_mpprintf(mp, "%x", (int)pa->value); 20733859Sml29623 20743859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_get_debug_flag")); 20753859Sml29623 return (status); 20763859Sml29623 } 20773859Sml29623 20783859Sml29623 /* ARGSUSED */ 20793859Sml29623 static int 20803859Sml29623 nxge_param_set_npi_debug_flag(p_nxge_t nxgep, queue_t *q, 20813859Sml29623 mblk_t *mp, char *value, caddr_t cp) 20823859Sml29623 { 20833859Sml29623 char *end; 20843859Sml29623 uint32_t status = 0; 20853859Sml29623 uint64_t cfg_value = 0; 20863859Sml29623 p_nxge_param_t pa; 20873859Sml29623 uint32_t cfg_it = B_FALSE; 20883859Sml29623 20893859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_set_npi_debug_flag")); 20903859Sml29623 cfg_value = mi_strtol(value, &end, BASE_HEX); 20913859Sml29623 pa = (p_nxge_param_t)cp; 20923859Sml29623 if (PARAM_OUTOF_RANGE(value, end, cfg_value, pa)) { 20933859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, " nxge_param_set_npi_debug_flag" 20943859Sml29623 " outof range %llx", cfg_value)); 20953859Sml29623 return (EINVAL); 20963859Sml29623 } 20973859Sml29623 if (pa->value != cfg_value) { 20983859Sml29623 pa->old_value = pa->value; 20993859Sml29623 pa->value = cfg_value; 21003859Sml29623 cfg_it = B_TRUE; 21013859Sml29623 } 21023859Sml29623 21033859Sml29623 if (cfg_it == B_TRUE) { 21043859Sml29623 npi_debug_level = pa->value; 21053859Sml29623 } 21063859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_set_debug_flag")); 21073859Sml29623 return (status); 21083859Sml29623 } 21093859Sml29623 21103859Sml29623 /* ARGSUSED */ 21113859Sml29623 static int 21123859Sml29623 nxge_param_dump_rdc(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21133859Sml29623 { 21143859Sml29623 uint_t rdc; 21153859Sml29623 21163859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_rdc")); 21173859Sml29623 21183859Sml29623 (void) npi_rxdma_dump_fzc_regs(NXGE_DEV_NPI_HANDLE(nxgep)); 21193859Sml29623 for (rdc = 0; rdc < nxgep->nrdc; rdc++) 21203859Sml29623 (void) nxge_dump_rxdma_channel(nxgep, nxgep->rdc[rdc]); 21213859Sml29623 21223859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_rdc")); 21233859Sml29623 return (0); 21243859Sml29623 } 21253859Sml29623 21263859Sml29623 /* ARGSUSED */ 21273859Sml29623 static int 21283859Sml29623 nxge_param_dump_tdc(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21293859Sml29623 { 21303859Sml29623 uint_t tdc; 21313859Sml29623 21323859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_tdc")); 21333859Sml29623 21343859Sml29623 for (tdc = 0; tdc < nxgep->ntdc; tdc++) 21353859Sml29623 (void) nxge_txdma_regs_dump(nxgep, nxgep->tdc[tdc]); 21363859Sml29623 21373859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_tdc")); 21383859Sml29623 return (0); 21393859Sml29623 } 21403859Sml29623 21413859Sml29623 /* ARGSUSED */ 21423859Sml29623 static int 21433859Sml29623 nxge_param_dump_fflp_regs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21443859Sml29623 { 21453859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_fflp_regs")); 21463859Sml29623 21473859Sml29623 (void) npi_fflp_dump_regs(NXGE_DEV_NPI_HANDLE(nxgep)); 21483859Sml29623 21493859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_fflp_regs")); 21503859Sml29623 return (0); 21513859Sml29623 } 21523859Sml29623 21533859Sml29623 /* ARGSUSED */ 21543859Sml29623 static int 21553859Sml29623 nxge_param_dump_mac_regs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21563859Sml29623 { 21573859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_mac_regs")); 21583859Sml29623 21593859Sml29623 (void) npi_mac_dump_regs(NXGE_DEV_NPI_HANDLE(nxgep), 21603859Sml29623 nxgep->function_num); 21613859Sml29623 21623859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_mac_regs")); 21633859Sml29623 return (0); 21643859Sml29623 } 21653859Sml29623 21663859Sml29623 /* ARGSUSED */ 21673859Sml29623 static int 21683859Sml29623 nxge_param_dump_ipp_regs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21693859Sml29623 { 21703859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_dump_ipp_regs")); 21713859Sml29623 21723859Sml29623 (void) npi_ipp_dump_regs(NXGE_DEV_NPI_HANDLE(nxgep), 21733859Sml29623 nxgep->function_num); 21743859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_ipp_regs")); 21753859Sml29623 return (0); 21763859Sml29623 } 21773859Sml29623 21783859Sml29623 /* ARGSUSED */ 21793859Sml29623 static int 21803859Sml29623 nxge_param_dump_vlan_table(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21813859Sml29623 { 21823859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_dump_vlan_table")); 21833859Sml29623 21843859Sml29623 (void) npi_fflp_vlan_tbl_dump(NXGE_DEV_NPI_HANDLE(nxgep)); 21853859Sml29623 21863859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_dump_vlan_table")); 21873859Sml29623 return (0); 21883859Sml29623 } 21893859Sml29623 21903859Sml29623 /* ARGSUSED */ 21913859Sml29623 static int 21923859Sml29623 nxge_param_dump_rdc_table(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 21933859Sml29623 { 21943859Sml29623 uint8_t table; 21953859Sml29623 21963859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "==> nxge_param_dump_rdc_table")); 21973859Sml29623 for (table = 0; table < NXGE_MAX_RDC_GROUPS; table++) { 21983859Sml29623 (void) npi_rxdma_dump_rdc_table(NXGE_DEV_NPI_HANDLE(nxgep), 21993859Sml29623 table); 22003859Sml29623 } 22013859Sml29623 22023859Sml29623 NXGE_DEBUG_MSG((nxgep, NDD_CTL, "<== nxge_param_dump_rdc_table")); 22033859Sml29623 return (0); 22043859Sml29623 } 22053859Sml29623 22063859Sml29623 typedef struct block_info { 22073859Sml29623 char *name; 22083859Sml29623 uint32_t offset; 22093859Sml29623 } block_info_t; 22103859Sml29623 22113859Sml29623 block_info_t reg_block[] = { 22123859Sml29623 {"PIO", PIO}, 22133859Sml29623 {"FZC_PIO", FZC_PIO}, 22143859Sml29623 {"FZC_XMAC", FZC_MAC}, 22153859Sml29623 {"FZC_IPP", FZC_IPP}, 22163859Sml29623 {"FFLP", FFLP}, 22173859Sml29623 {"FZC_FFLP", FZC_FFLP}, 22183859Sml29623 {"PIO_VADDR", PIO_VADDR}, 22193859Sml29623 {"ZCP", ZCP}, 22203859Sml29623 {"FZC_ZCP", FZC_ZCP}, 22213859Sml29623 {"DMC", DMC}, 22223859Sml29623 {"FZC_DMC", FZC_DMC}, 22233859Sml29623 {"TXC", TXC}, 22243859Sml29623 {"FZC_TXC", FZC_TXC}, 22253859Sml29623 {"PIO_LDSV", PIO_LDSV}, 22263859Sml29623 {"PIO_LDGIM", PIO_LDGIM}, 22273859Sml29623 {"PIO_IMASK0", PIO_IMASK0}, 22283859Sml29623 {"PIO_IMASK1", PIO_IMASK1}, 22293859Sml29623 {"FZC_PROM", FZC_PROM}, 22303859Sml29623 {"END", ALL_FF_32}, 22313859Sml29623 }; 22323859Sml29623 22333859Sml29623 /* ARGSUSED */ 22343859Sml29623 static int 22353859Sml29623 nxge_param_dump_ptrs(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t cp) 22363859Sml29623 { 22373859Sml29623 uint_t print_len, buf_len; 22383859Sml29623 p_mblk_t np; 22393859Sml29623 int rdc, tdc, block; 22403859Sml29623 uint64_t base; 22413859Sml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp; 22423859Sml29623 p_nxge_hw_pt_cfg_t p_cfgp; 22433859Sml29623 int buff_alloc_size = NXGE_NDD_INFODUMP_BUFF_8K; 22443859Sml29623 p_tx_ring_t *tx_rings; 22453859Sml29623 p_rx_rcr_rings_t rx_rcr_rings; 22463859Sml29623 p_rx_rcr_ring_t *rcr_rings; 22473859Sml29623 p_rx_rbr_rings_t rx_rbr_rings; 22483859Sml29623 p_rx_rbr_ring_t *rbr_rings; 22493859Sml29623 22503859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, 22513859Sml29623 "==> nxge_param_dump_ptrs")); 22523859Sml29623 22533859Sml29623 (void) mi_mpprintf(mp, "ptr information for Port\t %d \n", 22543859Sml29623 nxgep->function_num); 22553859Sml29623 22563859Sml29623 if ((np = allocb(buff_alloc_size, BPRI_HI)) == NULL) { 22573859Sml29623 /* The following may work even if we cannot get a large buf. */ 22583859Sml29623 (void) mi_mpprintf(mp, "%s\n", "out of buffer"); 22593859Sml29623 return (0); 22603859Sml29623 } 22613859Sml29623 22623859Sml29623 buf_len = buff_alloc_size; 22633859Sml29623 mp->b_cont = np; 22643859Sml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config; 22653859Sml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config; 22663859Sml29623 22673859Sml29623 rx_rcr_rings = nxgep->rx_rcr_rings; 22683859Sml29623 rcr_rings = rx_rcr_rings->rcr_rings; 22693859Sml29623 rx_rbr_rings = nxgep->rx_rbr_rings; 22703859Sml29623 rbr_rings = rx_rbr_rings->rbr_rings; 22713859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 22723859Sml29623 "nxgep (nxge_t) $%p\n" 22733859Sml29623 "dev_regs (dev_regs_t) $%p\n", 22743859Sml29623 nxgep, nxgep->dev_regs); 22753859Sml29623 22763859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 22773859Sml29623 22783859Sml29623 /* do register pointers */ 22793859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 22803859Sml29623 "reg base (npi_reg_ptr_t) $%p\t " 22813859Sml29623 "pci reg (npi_reg_ptr_t) $%p\n", 22823859Sml29623 nxgep->dev_regs->nxge_regp, 22833859Sml29623 nxgep->dev_regs->nxge_pciregp); 22843859Sml29623 22853859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 22863859Sml29623 22873859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 22883859Sml29623 "\nBlock \t Offset \n"); 22893859Sml29623 22903859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 22913859Sml29623 block = 0; 2292*5125Sjoycey #if defined(__i386) 2293*5125Sjoycey base = (uint64_t)(uint32_t)nxgep->dev_regs->nxge_regp; 2294*5125Sjoycey #else 22953859Sml29623 base = (uint64_t)nxgep->dev_regs->nxge_regp; 2296*5125Sjoycey #endif 22973859Sml29623 while (reg_block[block].offset != ALL_FF_32) { 22983859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 22993859Sml29623 "%9s\t 0x%llx\n", 23003859Sml29623 reg_block[block].name, 23013859Sml29623 (unsigned long long)(reg_block[block].offset + base)); 23023859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23033859Sml29623 block++; 23043859Sml29623 } 23053859Sml29623 23063859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23073859Sml29623 "\nRDC\t rcrp (rx_rcr_ring_t)\t " 23083859Sml29623 "rbrp (rx_rbr_ring_t)\n"); 23093859Sml29623 23103859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23113859Sml29623 23123859Sml29623 for (rdc = 0; rdc < p_cfgp->max_rdcs; rdc++) { 23133859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23143859Sml29623 " %d\t $%p\t\t $%p\n", 23153859Sml29623 rdc, rcr_rings[rdc], 23163859Sml29623 rbr_rings[rdc]); 23173859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23183859Sml29623 } 23193859Sml29623 23203859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23213859Sml29623 "\nTDC\t tdcp (tx_ring_t)\n"); 23223859Sml29623 23233859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23243859Sml29623 tx_rings = nxgep->tx_rings->rings; 23253859Sml29623 for (tdc = 0; tdc < p_cfgp->max_tdcs; tdc++) { 23263859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, 23273859Sml29623 " %d\t $%p\n", tdc, tx_rings[tdc]); 23283859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23293859Sml29623 } 23303859Sml29623 23313859Sml29623 print_len = snprintf((char *)((mblk_t *)np)->b_wptr, buf_len, "\n\n"); 23323859Sml29623 23333859Sml29623 ADVANCE_PRINT_BUFFER(np, print_len, buf_len); 23343859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_dump_ptrs")); 23353859Sml29623 return (0); 23363859Sml29623 } 23373859Sml29623 23383859Sml29623 /* 23393859Sml29623 * Load 'name' into the named dispatch table pointed to by 'ndp'. 23403859Sml29623 * 'ndp' should be the address of a char pointer cell. If the table 23413859Sml29623 * does not exist (*ndp == 0), a new table is allocated and 'ndp' 23423859Sml29623 * is stuffed. If there is not enough space in the table for a new 23433859Sml29623 * entry, more space is allocated. 23443859Sml29623 */ 23453859Sml29623 /* ARGSUSED */ 23463859Sml29623 boolean_t 23473859Sml29623 nxge_nd_load(caddr_t *pparam, char *name, 23483859Sml29623 pfi_t get_pfi, pfi_t set_pfi, caddr_t data) 23493859Sml29623 { 23503859Sml29623 ND *nd; 23513859Sml29623 NDE *nde; 23523859Sml29623 23533859Sml29623 NXGE_DEBUG_MSG((NULL, NDD2_CTL, " ==> nxge_nd_load")); 23543859Sml29623 if (!pparam) 23553859Sml29623 return (B_FALSE); 23563859Sml29623 23573859Sml29623 if ((nd = (ND *)*pparam) == NULL) { 23583859Sml29623 if ((nd = (ND *)KMEM_ZALLOC(sizeof (ND), KM_NOSLEEP)) == NULL) 23593859Sml29623 return (B_FALSE); 23603859Sml29623 *pparam = (caddr_t)nd; 23613859Sml29623 } 23623859Sml29623 23633859Sml29623 if (nd->nd_tbl) { 23643859Sml29623 for (nde = nd->nd_tbl; nde->nde_name; nde++) { 23653859Sml29623 if (strcmp(name, nde->nde_name) == 0) 23663859Sml29623 goto fill_it; 23673859Sml29623 } 23683859Sml29623 } 23693859Sml29623 23703859Sml29623 if (nd->nd_free_count <= 1) { 23713859Sml29623 if ((nde = (NDE *)KMEM_ZALLOC(nd->nd_size + 23723859Sml29623 NDE_ALLOC_SIZE, KM_NOSLEEP)) == NULL) 23733859Sml29623 return (B_FALSE); 23743859Sml29623 nd->nd_free_count += NDE_ALLOC_COUNT; 23753859Sml29623 if (nd->nd_tbl) { 23763859Sml29623 bcopy((char *)nd->nd_tbl, (char *)nde, nd->nd_size); 23773859Sml29623 KMEM_FREE((char *)nd->nd_tbl, nd->nd_size); 23783859Sml29623 } else { 23793859Sml29623 nd->nd_free_count--; 23803859Sml29623 nde->nde_name = "?"; 23813859Sml29623 nde->nde_get_pfi = nxge_nd_get_names; 23823859Sml29623 nde->nde_set_pfi = nxge_set_default; 23833859Sml29623 } 23843859Sml29623 nde->nde_data = (caddr_t)nd; 23853859Sml29623 nd->nd_tbl = nde; 23863859Sml29623 nd->nd_size += NDE_ALLOC_SIZE; 23873859Sml29623 } 23883859Sml29623 for (nde = nd->nd_tbl; nde->nde_name; nde++) 23893859Sml29623 noop; 23903859Sml29623 nd->nd_free_count--; 23913859Sml29623 fill_it: 23923859Sml29623 nde->nde_name = name; 23933859Sml29623 nde->nde_get_pfi = get_pfi; 23943859Sml29623 nde->nde_set_pfi = set_pfi; 23953859Sml29623 nde->nde_data = data; 23963859Sml29623 NXGE_DEBUG_MSG((NULL, NDD2_CTL, " <== nxge_nd_load")); 23973859Sml29623 23983859Sml29623 return (B_TRUE); 23993859Sml29623 } 24003859Sml29623 24013859Sml29623 /* 24023859Sml29623 * Free the table pointed to by 'pparam' 24033859Sml29623 */ 24043859Sml29623 void 24053859Sml29623 nxge_nd_free(caddr_t *pparam) 24063859Sml29623 { 24073859Sml29623 ND *nd; 24083859Sml29623 24093859Sml29623 if ((nd = (ND *)*pparam) != NULL) { 24103859Sml29623 if (nd->nd_tbl) 24113859Sml29623 KMEM_FREE((char *)nd->nd_tbl, nd->nd_size); 24123859Sml29623 KMEM_FREE((char *)nd, sizeof (ND)); 24133859Sml29623 *pparam = nil(caddr_t); 24143859Sml29623 } 24153859Sml29623 } 24163859Sml29623 24173859Sml29623 int 24183859Sml29623 nxge_nd_getset(p_nxge_t nxgep, queue_t *q, caddr_t param, p_mblk_t mp) 24193859Sml29623 { 24203859Sml29623 int err; 24213859Sml29623 IOCP iocp; 24223859Sml29623 p_mblk_t mp1, mp2; 24233859Sml29623 ND *nd; 24243859Sml29623 NDE *nde; 24253859Sml29623 char *valp; 24263859Sml29623 size_t avail; 24273859Sml29623 24283859Sml29623 if (!param) { 24293859Sml29623 return (B_FALSE); 24303859Sml29623 } 24313859Sml29623 24323859Sml29623 nd = (ND *)param; 24333859Sml29623 iocp = (IOCP)mp->b_rptr; 24343859Sml29623 if ((iocp->ioc_count == 0) || !(mp1 = mp->b_cont)) { 24353859Sml29623 mp->b_datap->db_type = M_IOCACK; 24363859Sml29623 iocp->ioc_count = 0; 24373859Sml29623 iocp->ioc_error = EINVAL; 24383859Sml29623 return (B_FALSE); 24393859Sml29623 } 24403859Sml29623 24413859Sml29623 /* 24423859Sml29623 * NOTE - logic throughout nd_xxx assumes single data block for ioctl. 24433859Sml29623 * However, existing code sends in some big buffers. 24443859Sml29623 */ 24453859Sml29623 avail = iocp->ioc_count; 24463859Sml29623 if (mp1->b_cont) { 24473859Sml29623 freemsg(mp1->b_cont); 24483859Sml29623 mp1->b_cont = NULL; 24493859Sml29623 } 24503859Sml29623 24513859Sml29623 mp1->b_datap->db_lim[-1] = '\0'; /* Force null termination */ 24523859Sml29623 for (valp = (char *)mp1->b_rptr; *valp != '\0'; valp++) { 24533859Sml29623 if (*valp == '-') 24543859Sml29623 *valp = '_'; 24553859Sml29623 } 24563859Sml29623 24573859Sml29623 valp = (char *)mp1->b_rptr; 24583859Sml29623 24593859Sml29623 for (nde = nd->nd_tbl; /* */; nde++) { 24603859Sml29623 if (!nde->nde_name) 24613859Sml29623 return (B_FALSE); 24623859Sml29623 if (strcmp(nde->nde_name, valp) == 0) 24633859Sml29623 break; 24643859Sml29623 } 24653859Sml29623 err = EINVAL; 24663859Sml29623 while (*valp++) 24673859Sml29623 noop; 24683859Sml29623 if (!*valp || valp >= (char *)mp1->b_wptr) 24693859Sml29623 valp = nilp(char); 24703859Sml29623 switch (iocp->ioc_cmd) { 24713859Sml29623 case ND_GET: 24723859Sml29623 /* 24733859Sml29623 * (temporary) hack: "*valp" is size of user buffer for 24743859Sml29623 * copyout. If result of action routine is too big, free 24753859Sml29623 * excess and return ioc_rval as buffer size needed. 24763859Sml29623 * Return as many mblocks as will fit, free the rest. For 24773859Sml29623 * backward compatibility, assume size of original ioctl 24783859Sml29623 * buffer if "*valp" bad or not given. 24793859Sml29623 */ 24803859Sml29623 if (valp) 24813859Sml29623 avail = mi_strtol(valp, (char **)0, 10); 24823859Sml29623 /* 24833859Sml29623 * We overwrite the name/value with the reply data 24843859Sml29623 */ 24853859Sml29623 mp2 = mp1; 24863859Sml29623 while (mp2) { 24873859Sml29623 mp2->b_wptr = mp2->b_rptr; 24883859Sml29623 mp2 = mp2->b_cont; 24893859Sml29623 } 24903859Sml29623 24914439Sml29623 if (nde->nde_get_pfi) { 24924439Sml29623 err = (*nde->nde_get_pfi)(nxgep, q, mp1, nde->nde_data); 24934439Sml29623 } 24943859Sml29623 24953859Sml29623 if (!err) { 24963859Sml29623 size_t size_out = 0; 24974874Sml29623 ssize_t excess; 24983859Sml29623 24993859Sml29623 iocp->ioc_rval = 0; 25003859Sml29623 25013859Sml29623 /* Tack on the null */ 25023859Sml29623 err = nxge_mk_mblk_tail_space(mp1, &mp2, 1); 25033859Sml29623 if (!err) { 25043859Sml29623 *mp2->b_wptr++ = '\0'; 25053859Sml29623 size_out = msgdsize(mp1); 25063859Sml29623 excess = size_out - avail; 25073859Sml29623 if (excess > 0) { 25083859Sml29623 iocp->ioc_rval = (int)size_out; 25093859Sml29623 size_out -= excess; 25103859Sml29623 (void) adjmsg(mp1, -(excess + 1)); 25113859Sml29623 err = nxge_mk_mblk_tail_space( 25123859Sml29623 mp1, &mp2, 1); 25133859Sml29623 if (!err) 25143859Sml29623 *mp2->b_wptr++ = '\0'; 25153859Sml29623 else 25163859Sml29623 size_out = 0; 25173859Sml29623 } 25183859Sml29623 } else 25193859Sml29623 size_out = 0; 25203859Sml29623 iocp->ioc_count = size_out; 25213859Sml29623 } 25223859Sml29623 break; 25233859Sml29623 25243859Sml29623 case ND_SET: 25253859Sml29623 if (valp) { 25263859Sml29623 if (nde->nde_set_pfi) { 25273859Sml29623 err = (*nde->nde_set_pfi)(nxgep, q, mp1, valp, 25283859Sml29623 nde->nde_data); 25293859Sml29623 iocp->ioc_count = 0; 25303859Sml29623 freemsg(mp1); 25313859Sml29623 mp->b_cont = NULL; 25323859Sml29623 } 25333859Sml29623 } 25343859Sml29623 break; 25353859Sml29623 25363859Sml29623 default: 25373859Sml29623 break; 25383859Sml29623 } 25393859Sml29623 iocp->ioc_error = err; 25403859Sml29623 mp->b_datap->db_type = M_IOCACK; 25413859Sml29623 return (B_TRUE); 25423859Sml29623 } 25433859Sml29623 25443859Sml29623 /* ARGSUSED */ 25453859Sml29623 int 25463859Sml29623 nxge_nd_get_names(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t param) 25473859Sml29623 { 25483859Sml29623 ND *nd; 25493859Sml29623 NDE *nde; 25503859Sml29623 char *rwtag; 25513859Sml29623 boolean_t get_ok, set_ok; 25523859Sml29623 size_t param_len; 25533859Sml29623 int status = 0; 25543859Sml29623 25553859Sml29623 nd = (ND *)param; 25563859Sml29623 if (!nd) 25573859Sml29623 return (ENOENT); 25583859Sml29623 25593859Sml29623 for (nde = nd->nd_tbl; nde->nde_name; nde++) { 25603859Sml29623 get_ok = (nde->nde_get_pfi != nxge_get_default) && 25613859Sml29623 (nde->nde_get_pfi != NULL); 25623859Sml29623 set_ok = (nde->nde_set_pfi != nxge_set_default) && 25633859Sml29623 (nde->nde_set_pfi != NULL); 25643859Sml29623 if (get_ok) { 25653859Sml29623 if (set_ok) 25663859Sml29623 rwtag = "read and write"; 25673859Sml29623 else 25683859Sml29623 rwtag = "read only"; 25693859Sml29623 } else if (set_ok) 25703859Sml29623 rwtag = "write only"; 25713859Sml29623 else { 25723859Sml29623 continue; 25733859Sml29623 } 25743859Sml29623 param_len = strlen(rwtag); 25753859Sml29623 param_len += strlen(nde->nde_name); 25763859Sml29623 param_len += 4; 25773859Sml29623 25783859Sml29623 (void) mi_mpprintf(mp, "%s (%s)", nde->nde_name, rwtag); 25793859Sml29623 } 25803859Sml29623 return (status); 25813859Sml29623 } 25823859Sml29623 25833859Sml29623 /* ARGSUSED */ 25843859Sml29623 int 25853859Sml29623 nxge_get_default(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, caddr_t data) 25863859Sml29623 { 25873859Sml29623 return (EACCES); 25883859Sml29623 } 25893859Sml29623 25903859Sml29623 /* ARGSUSED */ 25913859Sml29623 int 25923859Sml29623 nxge_set_default(p_nxge_t nxgep, queue_t *q, p_mblk_t mp, char *value, 25933859Sml29623 caddr_t data) 25943859Sml29623 { 25953859Sml29623 return (EACCES); 25963859Sml29623 } 25973859Sml29623 25983859Sml29623 void 25993859Sml29623 nxge_param_ioctl(p_nxge_t nxgep, queue_t *wq, mblk_t *mp, struct iocblk *iocp) 26003859Sml29623 { 26013859Sml29623 int cmd; 26023859Sml29623 int status = B_FALSE; 26033859Sml29623 26043859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_ioctl")); 26053859Sml29623 cmd = iocp->ioc_cmd; 26063859Sml29623 26073859Sml29623 switch (cmd) { 26083859Sml29623 default: 26093859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, 26103859Sml29623 "nxge_param_ioctl: bad cmd 0x%0x", cmd)); 26113859Sml29623 break; 26123859Sml29623 26133859Sml29623 case ND_GET: 26143859Sml29623 case ND_SET: 26153859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, 26163859Sml29623 "nxge_param_ioctl: cmd 0x%0x", cmd)); 26173859Sml29623 if (!nxge_nd_getset(nxgep, wq, nxgep->param_list, mp)) { 26183859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, 26193859Sml29623 "false ret from nxge_nd_getset")); 26203859Sml29623 break; 26213859Sml29623 } 26223859Sml29623 status = B_TRUE; 26233859Sml29623 break; 26243859Sml29623 } 26253859Sml29623 26263859Sml29623 if (status) { 26273859Sml29623 qreply(wq, mp); 26283859Sml29623 } else { 26293859Sml29623 miocnak(wq, mp, 0, EINVAL); 26303859Sml29623 } 26313859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "<== nxge_param_ioctl")); 26323859Sml29623 } 26333859Sml29623 26343859Sml29623 /* ARGSUSED */ 26353859Sml29623 static boolean_t 26363859Sml29623 nxge_param_link_update(p_nxge_t nxgep) 26373859Sml29623 { 26383859Sml29623 p_nxge_param_t param_arr; 26393859Sml29623 nxge_param_index_t i; 26403859Sml29623 boolean_t update_xcvr; 26413859Sml29623 boolean_t update_dev; 26423859Sml29623 int instance; 26433859Sml29623 boolean_t status = B_TRUE; 26443859Sml29623 26453859Sml29623 NXGE_DEBUG_MSG((nxgep, IOC_CTL, "==> nxge_param_link_update")); 26463859Sml29623 26473859Sml29623 param_arr = nxgep->param_arr; 26483859Sml29623 instance = nxgep->instance; 26493859Sml29623 update_xcvr = B_FALSE; 26503859Sml29623 for (i = param_anar_1000fdx; i < param_anar_asmpause; i++) { 26513859Sml29623 update_xcvr |= param_arr[i].value; 26523859Sml29623 } 26533859Sml29623 26543859Sml29623 if (update_xcvr) { 26553859Sml29623 update_xcvr = B_FALSE; 26563859Sml29623 for (i = param_autoneg; i < param_enable_ipg0; i++) { 26573859Sml29623 update_xcvr |= 26583859Sml29623 (param_arr[i].value != param_arr[i].old_value); 26593859Sml29623 param_arr[i].old_value = param_arr[i].value; 26603859Sml29623 } 26613859Sml29623 if (update_xcvr) { 26623859Sml29623 RW_ENTER_WRITER(&nxgep->filter_lock); 26633859Sml29623 (void) nxge_link_monitor(nxgep, LINK_MONITOR_STOP); 26643859Sml29623 (void) nxge_link_init(nxgep); 26653859Sml29623 (void) nxge_mac_init(nxgep); 26663859Sml29623 (void) nxge_link_monitor(nxgep, LINK_MONITOR_START); 26673859Sml29623 RW_EXIT(&nxgep->filter_lock); 26683859Sml29623 } 26693859Sml29623 } else { 26703859Sml29623 cmn_err(CE_WARN, " Last setting will leave nxge%d with " 26713859Sml29623 " no link capabilities.", instance); 26723859Sml29623 cmn_err(CE_WARN, " Restoring previous setting."); 26733859Sml29623 for (i = param_anar_1000fdx; i < param_anar_asmpause; i++) 26743859Sml29623 param_arr[i].value = param_arr[i].old_value; 26753859Sml29623 } 26763859Sml29623 26773859Sml29623 update_dev = B_FALSE; 26783859Sml29623 26793859Sml29623 if (update_dev) { 26803859Sml29623 RW_ENTER_WRITER(&nxgep->filter_lock); 26813859Sml29623 (void) nxge_rx_mac_disable(nxgep); 26823859Sml29623 (void) nxge_tx_mac_disable(nxgep); 26833859Sml29623 (void) nxge_tx_mac_enable(nxgep); 26843859Sml29623 (void) nxge_rx_mac_enable(nxgep); 26853859Sml29623 RW_EXIT(&nxgep->filter_lock); 26863859Sml29623 } 26873859Sml29623 26883859Sml29623 nxge_param_hw_update_exit: 26893859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, 26903859Sml29623 "<== nxge_param_link_update status = 0x%08x", status)); 26913859Sml29623 return (status); 26923859Sml29623 } 2693