16349Sqs148142 /* 26349Sqs148142 * CDDL HEADER START 36349Sqs148142 * 46349Sqs148142 * The contents of this file are subject to the terms of the 56349Sqs148142 * Common Development and Distribution License (the "License"). 66349Sqs148142 * You may not use this file except in compliance with the License. 76349Sqs148142 * 86349Sqs148142 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 96349Sqs148142 * or http://www.opensolaris.org/os/licensing. 106349Sqs148142 * See the License for the specific language governing permissions 116349Sqs148142 * and limitations under the License. 126349Sqs148142 * 136349Sqs148142 * When distributing Covered Code, include this CDDL HEADER in each 146349Sqs148142 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 156349Sqs148142 * If applicable, add the following below this CDDL HEADER, with the 166349Sqs148142 * fields enclosed by brackets "[]" replaced with your own identifying 176349Sqs148142 * information: Portions Copyright [yyyy] [name of copyright owner] 186349Sqs148142 * 196349Sqs148142 * CDDL HEADER END 206349Sqs148142 */ 21*10091SMichael.Speer@Sun.COM 226349Sqs148142 /* 238718SMichael.Speer@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 246349Sqs148142 * Use is subject to license terms. 256349Sqs148142 */ 266349Sqs148142 276349Sqs148142 #ifndef _SYS_HXGE_HXGE_H 286349Sqs148142 #define _SYS_HXGE_HXGE_H 296349Sqs148142 306349Sqs148142 #ifdef __cplusplus 316349Sqs148142 extern "C" { 326349Sqs148142 #endif 336349Sqs148142 346349Sqs148142 #include <hxge_vmac.h> 356349Sqs148142 #include <hxge_pfc.h> 366349Sqs148142 #include <hxge_classify.h> 376349Sqs148142 386349Sqs148142 /* 396349Sqs148142 * HXGE diagnostics IOCTLS. 406349Sqs148142 */ 416349Sqs148142 #define HXGE_IOC ((((('N' << 8) + 'X') << 8) + 'G') << 8) 426349Sqs148142 438718SMichael.Speer@Sun.COM #define HXGE_GET_TX_RING_SZ (HXGE_IOC|1) 448718SMichael.Speer@Sun.COM #define HXGE_GET_TX_DESC (HXGE_IOC|2) 458718SMichael.Speer@Sun.COM #define HXGE_GLOBAL_RESET (HXGE_IOC|3) 468718SMichael.Speer@Sun.COM #define HXGE_TX_SIDE_RESET (HXGE_IOC|4) 478718SMichael.Speer@Sun.COM #define HXGE_RX_SIDE_RESET (HXGE_IOC|5) 488718SMichael.Speer@Sun.COM #define HXGE_RESET_MAC (HXGE_IOC|6) 498718SMichael.Speer@Sun.COM #define HXGE_RTRACE (HXGE_IOC|7) 508718SMichael.Speer@Sun.COM #define HXGE_GET_TCAM (HXGE_IOC|8) 518718SMichael.Speer@Sun.COM #define HXGE_PUT_TCAM (HXGE_IOC|9) 526349Sqs148142 536349Sqs148142 #define HXGE_OK 0 546349Sqs148142 #define HXGE_ERROR 0x40000000 556349Sqs148142 #define HXGE_DDI_FAILED 0x20000000 566349Sqs148142 576349Sqs148142 /* 586349Sqs148142 * Definitions for module_info. 596349Sqs148142 */ 606349Sqs148142 #define HXGE_DRIVER_NAME "hxge" /* module name */ 616349Sqs148142 #define HXGE_CHECK_TIMER (5000) 626349Sqs148142 636349Sqs148142 typedef enum { 646349Sqs148142 param_instance, 656349Sqs148142 666349Sqs148142 param_accept_jumbo, 676349Sqs148142 param_rxdma_rbr_size, 686349Sqs148142 param_rxdma_rcr_size, 696349Sqs148142 param_rxdma_intr_time, 706349Sqs148142 param_rxdma_intr_pkts, 716349Sqs148142 param_vlan_ids, 726349Sqs148142 param_implicit_vlan_id, 736349Sqs148142 param_tcam_enable, 746349Sqs148142 756349Sqs148142 param_hash_init_value, 766349Sqs148142 param_class_cfg_ether_usr1, 776349Sqs148142 param_class_cfg_ether_usr2, 786349Sqs148142 param_class_opt_ipv4_tcp, 796349Sqs148142 param_class_opt_ipv4_udp, 806349Sqs148142 param_class_opt_ipv4_ah, 816349Sqs148142 param_class_opt_ipv4_sctp, 826349Sqs148142 param_class_opt_ipv6_tcp, 836349Sqs148142 param_class_opt_ipv6_udp, 846349Sqs148142 param_class_opt_ipv6_ah, 856349Sqs148142 param_class_opt_ipv6_sctp, 866349Sqs148142 param_hxge_debug_flag, 876349Sqs148142 param_hpi_debug_flag, 886349Sqs148142 param_dump_ptrs, 896349Sqs148142 param_end 906349Sqs148142 } hxge_param_index_t; 916349Sqs148142 926349Sqs148142 936349Sqs148142 #define HXGE_PARAM_READ 0x00000001ULL 946349Sqs148142 #define HXGE_PARAM_WRITE 0x00000002ULL 956349Sqs148142 #define HXGE_PARAM_SHARED 0x00000004ULL 966349Sqs148142 #define HXGE_PARAM_PRIV 0x00000008ULL 976349Sqs148142 #define HXGE_PARAM_RW HXGE_PARAM_READ | HXGE_PARAM_WRITE 986349Sqs148142 #define HXGE_PARAM_RWS HXGE_PARAM_RW | HXGE_PARAM_SHARED 996349Sqs148142 #define HXGE_PARAM_RWP HXGE_PARAM_RW | HXGE_PARAM_PRIV 1006349Sqs148142 1016349Sqs148142 #define HXGE_PARAM_RXDMA 0x00000010ULL 1026349Sqs148142 #define HXGE_PARAM_TXDMA 0x00000020ULL 1036349Sqs148142 #define HXGE_PARAM_MAC 0x00000040ULL 1046349Sqs148142 1056349Sqs148142 #define HXGE_PARAM_CMPLX 0x00010000ULL 1066349Sqs148142 #define HXGE_PARAM_NDD_WR_OK 0x00020000ULL 1076349Sqs148142 #define HXGE_PARAM_INIT_ONLY 0x00040000ULL 1086349Sqs148142 #define HXGE_PARAM_INIT_CONFIG 0x00080000ULL 1096349Sqs148142 1106349Sqs148142 #define HXGE_PARAM_READ_PROP 0x00100000ULL 1116349Sqs148142 #define HXGE_PARAM_PROP_ARR32 0x00200000ULL 1126349Sqs148142 #define HXGE_PARAM_PROP_ARR64 0x00400000ULL 1136349Sqs148142 #define HXGE_PARAM_PROP_STR 0x00800000ULL 1146349Sqs148142 1156349Sqs148142 #define HXGE_PARAM_DONT_SHOW 0x80000000ULL 1166349Sqs148142 1176349Sqs148142 #define HXGE_PARAM_ARRAY_CNT_MASK 0x0000ffff00000000ULL 1186349Sqs148142 #define HXGE_PARAM_ARRAY_CNT_SHIFT 32ULL 1196349Sqs148142 #define HXGE_PARAM_ARRAY_ALLOC_MASK 0xffff000000000000ULL 1206349Sqs148142 #define HXGE_PARAM_ARRAY_ALLOC_SHIFT 48ULL 1216349Sqs148142 1226349Sqs148142 typedef struct _hxge_param_t { 1236349Sqs148142 int (*getf)(); 1246349Sqs148142 int (*setf)(); /* null for read only */ 1256349Sqs148142 uint64_t type; /* R/W/ Common/Port/ .... */ 1266349Sqs148142 uint64_t minimum; 1276349Sqs148142 uint64_t maximum; 1286349Sqs148142 uint64_t value; /* for array params, pointer to value array */ 1296349Sqs148142 uint64_t old_value; /* for array params, pointer to old_value array */ 1306349Sqs148142 char *fcode_name; 1316349Sqs148142 char *name; 1326349Sqs148142 } hxge_param_t, *p_hxge_param_t; 1336349Sqs148142 1346349Sqs148142 1356349Sqs148142 typedef enum { 1366349Sqs148142 hxge_lb_normal, 1376349Sqs148142 hxge_lb_mac10g 1386349Sqs148142 } hxge_lb_t; 1396349Sqs148142 1406349Sqs148142 enum hxge_mac_state { 1416349Sqs148142 HXGE_MAC_STOPPED = 0, 1426349Sqs148142 HXGE_MAC_STARTED 1436349Sqs148142 }; 1446349Sqs148142 1456349Sqs148142 typedef struct _filter_t { 1466349Sqs148142 uint32_t all_phys_cnt; 1476349Sqs148142 uint32_t all_multicast_cnt; 1486349Sqs148142 uint32_t all_sap_cnt; 1496349Sqs148142 } filter_t, *p_filter_t; 1506349Sqs148142 1516349Sqs148142 typedef struct _hxge_port_stats_t { 1526349Sqs148142 hxge_lb_t lb_mode; 1536349Sqs148142 uint32_t poll_mode; 1546349Sqs148142 } hxge_port_stats_t, *p_hxge_port_stats_t; 1556349Sqs148142 1566349Sqs148142 1576349Sqs148142 typedef struct _hxge_peu_sys_stats { 1586349Sqs148142 uint32_t spc_acc_err; 1596349Sqs148142 uint32_t tdc_pioacc_err; 1606349Sqs148142 uint32_t rdc_pioacc_err; 1616349Sqs148142 uint32_t pfc_pioacc_err; 1626349Sqs148142 uint32_t vmac_pioacc_err; 1636349Sqs148142 uint32_t cpl_hdrq_parerr; 1646349Sqs148142 uint32_t cpl_dataq_parerr; 1656349Sqs148142 uint32_t retryram_xdlh_parerr; 1666349Sqs148142 uint32_t retrysotram_xdlh_parerr; 1676349Sqs148142 uint32_t p_hdrq_parerr; 1686349Sqs148142 uint32_t p_dataq_parerr; 1696349Sqs148142 uint32_t np_hdrq_parerr; 1706349Sqs148142 uint32_t np_dataq_parerr; 1716349Sqs148142 uint32_t eic_msix_parerr; 1726349Sqs148142 uint32_t hcr_parerr; 1736349Sqs148142 } hxge_peu_sys_stats_t, *p_hxge_peu_sys_stats_t; 1746349Sqs148142 1756349Sqs148142 1766349Sqs148142 typedef struct _hxge_stats_t { 1776349Sqs148142 /* 1786349Sqs148142 * Overall structure size 1796349Sqs148142 */ 1806349Sqs148142 size_t stats_size; 1816349Sqs148142 1826349Sqs148142 kstat_t *ksp; 1836349Sqs148142 kstat_t *rdc_ksp[HXGE_MAX_RDCS]; 1846349Sqs148142 kstat_t *tdc_ksp[HXGE_MAX_TDCS]; 1856349Sqs148142 kstat_t *rdc_sys_ksp; 1866349Sqs148142 kstat_t *tdc_sys_ksp; 1876349Sqs148142 kstat_t *pfc_ksp; 1886349Sqs148142 kstat_t *vmac_ksp; 1896349Sqs148142 kstat_t *port_ksp; 1906349Sqs148142 kstat_t *mmac_ksp; 1916349Sqs148142 kstat_t *peu_sys_ksp; 1926349Sqs148142 1936349Sqs148142 hxge_mac_stats_t mac_stats; 1946349Sqs148142 hxge_vmac_stats_t vmac_stats; /* VMAC Statistics */ 1956349Sqs148142 1966349Sqs148142 hxge_rx_ring_stats_t rdc_stats[HXGE_MAX_RDCS]; /* per rdc stats */ 1976349Sqs148142 hxge_rdc_sys_stats_t rdc_sys_stats; /* RDC system stats */ 1986349Sqs148142 1996349Sqs148142 hxge_tx_ring_stats_t tdc_stats[HXGE_MAX_TDCS]; /* per tdc stats */ 2006349Sqs148142 hxge_tdc_sys_stats_t tdc_sys_stats; /* TDC system stats */ 2016349Sqs148142 2026349Sqs148142 hxge_pfc_stats_t pfc_stats; /* pfc stats */ 2036349Sqs148142 hxge_port_stats_t port_stats; /* port stats */ 2046349Sqs148142 2056349Sqs148142 hxge_peu_sys_stats_t peu_sys_stats; /* PEU system stats */ 2066349Sqs148142 } hxge_stats_t, *p_hxge_stats_t; 2076349Sqs148142 2086349Sqs148142 typedef struct _hxge_intr_t { 2096349Sqs148142 boolean_t intr_registered; /* interrupts are registered */ 2106349Sqs148142 boolean_t intr_enabled; /* interrupts are enabled */ 2116349Sqs148142 boolean_t niu_msi_enable; /* debug or configurable? */ 2126349Sqs148142 uint8_t nldevs; /* # of logical devices */ 2136349Sqs148142 int intr_types; /* interrupt types supported */ 2146349Sqs148142 int intr_type; /* interrupt type to add */ 2156349Sqs148142 int msi_intx_cnt; /* # msi/intx ints returned */ 2166349Sqs148142 int intr_added; /* # ints actually needed */ 2176349Sqs148142 int intr_cap; /* interrupt capabilities */ 2186349Sqs148142 size_t intr_size; /* size of array to allocate */ 2196349Sqs148142 ddi_intr_handle_t *htable; /* For array of interrupts */ 2206349Sqs148142 /* Add interrupt number for each interrupt vector */ 2216349Sqs148142 int pri; 2226349Sqs148142 } hxge_intr_t, *p_hxge_intr_t; 2236349Sqs148142 2246349Sqs148142 typedef struct _hxge_ldgv_t { 2256349Sqs148142 uint8_t ndma_ldvs; 2266349Sqs148142 uint8_t nldvs; 2276349Sqs148142 uint8_t start_ldg; 2286349Sqs148142 uint8_t maxldgs; 2296349Sqs148142 uint8_t maxldvs; 2306349Sqs148142 uint8_t ldg_intrs; 2316349Sqs148142 uint32_t tmres; 2326349Sqs148142 p_hxge_ldg_t ldgp; 2336349Sqs148142 p_hxge_ldv_t ldvp; 2346349Sqs148142 p_hxge_ldv_t ldvp_syserr; 2356349Sqs148142 } hxge_ldgv_t, *p_hxge_ldgv_t; 2366349Sqs148142 2377584SQiyan.Sun@Sun.COM typedef struct _hxge_timeout { 2387584SQiyan.Sun@Sun.COM timeout_id_t id; 2397584SQiyan.Sun@Sun.COM clock_t ticks; 2407584SQiyan.Sun@Sun.COM kmutex_t lock; 2417584SQiyan.Sun@Sun.COM uint32_t link_status; 2427949SQiyan.Sun@Sun.COM boolean_t report_link_status; 2437584SQiyan.Sun@Sun.COM } hxge_timeout; 2447584SQiyan.Sun@Sun.COM 2458718SMichael.Speer@Sun.COM typedef struct _hxge_addr { 2468718SMichael.Speer@Sun.COM boolean_t set; 2478718SMichael.Speer@Sun.COM boolean_t primary; 2488718SMichael.Speer@Sun.COM uint8_t addr[ETHERADDRL]; 2498718SMichael.Speer@Sun.COM } hxge_addr_t; 2508718SMichael.Speer@Sun.COM 2518718SMichael.Speer@Sun.COM #define HXGE_MAX_MAC_ADDRS 16 2528718SMichael.Speer@Sun.COM 2538718SMichael.Speer@Sun.COM typedef struct _hxge_mmac { 2548718SMichael.Speer@Sun.COM uint8_t total; 2558718SMichael.Speer@Sun.COM uint8_t available; 2568718SMichael.Speer@Sun.COM hxge_addr_t addrs[HXGE_MAX_MAC_ADDRS]; 2578718SMichael.Speer@Sun.COM } hxge_mmac_t; 2588718SMichael.Speer@Sun.COM 2598718SMichael.Speer@Sun.COM /* 2608718SMichael.Speer@Sun.COM * Ring Group Strucuture. 2618718SMichael.Speer@Sun.COM */ 2628718SMichael.Speer@Sun.COM #define HXGE_MAX_RX_GROUPS 1 2638718SMichael.Speer@Sun.COM 2648718SMichael.Speer@Sun.COM typedef struct _hxge_rx_ring_group_t { 2658718SMichael.Speer@Sun.COM mac_ring_type_t type; 2668718SMichael.Speer@Sun.COM mac_group_handle_t ghandle; 2678718SMichael.Speer@Sun.COM struct _hxge_t *hxgep; 2688718SMichael.Speer@Sun.COM int index; 2698718SMichael.Speer@Sun.COM boolean_t started; 2708718SMichael.Speer@Sun.COM } hxge_ring_group_t; 2718718SMichael.Speer@Sun.COM 2728718SMichael.Speer@Sun.COM /* 2738718SMichael.Speer@Sun.COM * Ring Handle 2748718SMichael.Speer@Sun.COM */ 2758718SMichael.Speer@Sun.COM typedef struct _hxge_ring_handle_t { 2768718SMichael.Speer@Sun.COM struct _hxge_t *hxgep; 2778718SMichael.Speer@Sun.COM int index; /* port-wise */ 2788718SMichael.Speer@Sun.COM mac_ring_handle_t ring_handle; 2798718SMichael.Speer@Sun.COM boolean_t started; 2808718SMichael.Speer@Sun.COM } hxge_ring_handle_t; 2818718SMichael.Speer@Sun.COM 2828718SMichael.Speer@Sun.COM typedef hxge_ring_handle_t *p_hxge_ring_handle_t; 2838718SMichael.Speer@Sun.COM 2846349Sqs148142 /* 2856349Sqs148142 * Hydra Device instance state information. 2866349Sqs148142 * Each instance is dynamically allocated on first attach. 2876349Sqs148142 */ 2886349Sqs148142 struct _hxge_t { 2896349Sqs148142 dev_info_t *dip; /* device instance */ 2906349Sqs148142 dev_info_t *p_dip; /* Parent's device instance */ 2916349Sqs148142 int instance; /* instance number */ 2926349Sqs148142 uint32_t drv_state; /* driver state bit flags */ 2936349Sqs148142 uint64_t hxge_debug_level; /* driver state bit flags */ 2946349Sqs148142 kmutex_t genlock[1]; 2956349Sqs148142 enum hxge_mac_state hxge_mac_state; 2966349Sqs148142 2976349Sqs148142 p_dev_regs_t dev_regs; 2986349Sqs148142 hpi_handle_t hpi_handle; 2996349Sqs148142 hpi_handle_t hpi_pci_handle; 3006349Sqs148142 hpi_handle_t hpi_reg_handle; 3016349Sqs148142 hpi_handle_t hpi_msi_handle; 3026349Sqs148142 3036349Sqs148142 hxge_vmac_t vmac; 3046349Sqs148142 hxge_classify_t classifier; 3056349Sqs148142 3066349Sqs148142 mac_handle_t mach; /* mac module handle */ 3076349Sqs148142 3086349Sqs148142 p_hxge_stats_t statsp; 3096349Sqs148142 uint32_t param_count; 3106349Sqs148142 p_hxge_param_t param_arr; 3116349Sqs148142 hxge_hw_list_t *hxge_hw_p; /* pointer to per Hydra */ 3126349Sqs148142 uint8_t nrdc; 3136349Sqs148142 uint8_t rdc[HXGE_MAX_RDCS]; 3148422SMichael.Speer@Sun.COM boolean_t rdc_first_intr[HXGE_MAX_RDCS]; 3156349Sqs148142 uint8_t ntdc; 3166349Sqs148142 uint8_t tdc[HXGE_MAX_TDCS]; 3176349Sqs148142 3188718SMichael.Speer@Sun.COM hxge_ring_handle_t tx_ring_handles[HXGE_MAX_TDCS]; 3198718SMichael.Speer@Sun.COM hxge_ring_handle_t rx_ring_handles[HXGE_MAX_RDCS]; 3208718SMichael.Speer@Sun.COM hxge_ring_group_t rx_groups[HXGE_MAX_RX_GROUPS]; 3218718SMichael.Speer@Sun.COM 3226349Sqs148142 hxge_intr_t hxge_intr_type; 3236349Sqs148142 hxge_dma_pt_cfg_t pt_config; 3246349Sqs148142 hxge_class_pt_cfg_t class_config; 3256349Sqs148142 3266349Sqs148142 /* Logical device and group data structures. */ 3276349Sqs148142 p_hxge_ldgv_t ldgvp; 3286349Sqs148142 3296349Sqs148142 caddr_t param_list; /* Parameter list */ 3306349Sqs148142 3316349Sqs148142 ether_addr_st factaddr; /* factory mac address */ 3326349Sqs148142 ether_addr_st ouraddr; /* individual address */ 3336349Sqs148142 kmutex_t ouraddr_lock; /* lock to protect to uradd */ 3348718SMichael.Speer@Sun.COM hxge_mmac_t mmac; 3356349Sqs148142 3366349Sqs148142 ddi_iblock_cookie_t interrupt_cookie; 3376349Sqs148142 3386349Sqs148142 /* 3396349Sqs148142 * Blocks of memory may be pre-allocated by the 3406349Sqs148142 * partition manager or the driver. They may include 3416349Sqs148142 * blocks for configuration and buffers. The idea is 3426349Sqs148142 * to preallocate big blocks of contiguous areas in 3436349Sqs148142 * system memory (i.e. with IOMMU). These blocks then 3446349Sqs148142 * will be broken up to a fixed number of blocks with 3456349Sqs148142 * each block having the same block size (4K, 8K, 16K or 3466349Sqs148142 * 32K) in the case of buffer blocks. For systems that 3476349Sqs148142 * do not support DVMA, more than one big block will be 3486349Sqs148142 * allocated. 3496349Sqs148142 */ 3506349Sqs148142 uint32_t rx_default_block_size; 3516349Sqs148142 hxge_rx_block_size_t rx_bksize_code; 3526349Sqs148142 3536349Sqs148142 p_hxge_dma_pool_t rx_buf_pool_p; 3547618SMichael.Speer@Sun.COM p_hxge_dma_pool_t rx_rbr_cntl_pool_p; 3557618SMichael.Speer@Sun.COM p_hxge_dma_pool_t rx_rcr_cntl_pool_p; 3567618SMichael.Speer@Sun.COM p_hxge_dma_pool_t rx_mbox_cntl_pool_p; 3576349Sqs148142 3586349Sqs148142 p_hxge_dma_pool_t tx_buf_pool_p; 3596349Sqs148142 p_hxge_dma_pool_t tx_cntl_pool_p; 3606349Sqs148142 3616349Sqs148142 /* Receive buffer block ring and completion ring. */ 3626349Sqs148142 p_rx_rbr_rings_t rx_rbr_rings; 3636349Sqs148142 p_rx_rcr_rings_t rx_rcr_rings; 3646349Sqs148142 p_rx_mbox_areas_t rx_mbox_areas_p; 3656349Sqs148142 3666349Sqs148142 uint32_t start_rdc; 3676349Sqs148142 uint32_t max_rdcs; 3686349Sqs148142 3696349Sqs148142 /* Transmit descriptors rings */ 3706349Sqs148142 p_tx_rings_t tx_rings; 3716349Sqs148142 p_tx_mbox_areas_t tx_mbox_areas_p; 3726349Sqs148142 3736349Sqs148142 uint32_t start_tdc; 3746349Sqs148142 uint32_t max_tdcs; 3756349Sqs148142 uint32_t tdc_mask; 3766349Sqs148142 3776349Sqs148142 ddi_dma_handle_t dmasparehandle; 3786349Sqs148142 3796349Sqs148142 ulong_t sys_page_sz; 3806349Sqs148142 ulong_t sys_page_mask; 3816349Sqs148142 int suspended; 3826349Sqs148142 3836349Sqs148142 filter_t filter; /* Current instance filter */ 3846349Sqs148142 p_hash_filter_t hash_filter; /* Multicast hash filter. */ 3856349Sqs148142 krwlock_t filter_lock; /* Lock to protect filters. */ 3866349Sqs148142 3876349Sqs148142 ulong_t sys_burst_sz; 3886349Sqs148142 timeout_id_t hxge_timerid; 3896349Sqs148142 uint8_t msg_min; 3906349Sqs148142 3916349Sqs148142 uint16_t intr_timeout; 3926349Sqs148142 uint16_t intr_threshold; 3936349Sqs148142 3946349Sqs148142 rtrace_t rtrace; 3956349Sqs148142 int fm_capabilities; /* FMA capabilities */ 3966349Sqs148142 3976349Sqs148142 uint32_t hxge_port_rbr_size; 3986349Sqs148142 uint32_t hxge_port_rcr_size; 3996349Sqs148142 uint32_t hxge_port_tx_ring_size; 4006864Sqs148142 401*10091SMichael.Speer@Sun.COM kmutex_t vmac_lock; 4026864Sqs148142 kmutex_t pio_lock; 4037584SQiyan.Sun@Sun.COM hxge_timeout timeout; 4046349Sqs148142 }; 4056349Sqs148142 4066349Sqs148142 /* 4076349Sqs148142 * Driver state flags. 4086349Sqs148142 */ 4096349Sqs148142 #define STATE_REGS_MAPPED 0x000000001 /* device registers mapped */ 4106349Sqs148142 #define STATE_KSTATS_SETUP 0x000000002 /* kstats allocated */ 4116349Sqs148142 #define STATE_NODE_CREATED 0x000000004 /* device node created */ 4126349Sqs148142 #define STATE_HW_CONFIG_CREATED 0x000000008 /* hardware properties */ 4136349Sqs148142 #define STATE_HW_INITIALIZED 0x000000010 /* hardware initialized */ 4146349Sqs148142 4156349Sqs148142 typedef struct _hxge_port_kstat_t { 4166349Sqs148142 /* 4176349Sqs148142 * Transciever state informations. 4186349Sqs148142 */ 4196349Sqs148142 kstat_named_t cap_autoneg; 4206349Sqs148142 kstat_named_t cap_10gfdx; 4216349Sqs148142 4226349Sqs148142 /* 4236349Sqs148142 * Link partner capabilities. 4246349Sqs148142 */ 4256349Sqs148142 kstat_named_t lp_cap_autoneg; 4266349Sqs148142 kstat_named_t lp_cap_10gfdx; 4276349Sqs148142 4286349Sqs148142 /* 4296349Sqs148142 * Shared link setup. 4306349Sqs148142 */ 4316349Sqs148142 kstat_named_t link_speed; 4326349Sqs148142 kstat_named_t link_duplex; 4336349Sqs148142 kstat_named_t link_up; 4346349Sqs148142 4356349Sqs148142 /* 4366349Sqs148142 * Lets the user know the MTU currently in use by 4376349Sqs148142 * the physical MAC port. 4386349Sqs148142 */ 4396349Sqs148142 kstat_named_t lb_mode; 4406349Sqs148142 4416349Sqs148142 kstat_named_t tx_max_pend; 4426349Sqs148142 kstat_named_t rx_jumbo_pkts; 4436349Sqs148142 4446349Sqs148142 /* 4456349Sqs148142 * Misc MAC statistics. 4466349Sqs148142 */ 4476349Sqs148142 kstat_named_t ifspeed; 4486349Sqs148142 kstat_named_t promisc; 4496349Sqs148142 } hxge_port_kstat_t, *p_hxge_port_kstat_t; 4506349Sqs148142 4516349Sqs148142 typedef struct _hxge_rdc_kstat { 4526349Sqs148142 /* 4536349Sqs148142 * Receive DMA channel statistics. 4546349Sqs148142 * This structure needs to be consistent with hxge_rdc_stat_index_t 4556349Sqs148142 * in hxge_kstat.c 4566349Sqs148142 */ 4576349Sqs148142 kstat_named_t ipackets; 4586349Sqs148142 kstat_named_t rbytes; 4596349Sqs148142 kstat_named_t errors; 4606349Sqs148142 kstat_named_t jumbo_pkts; 4616349Sqs148142 4626349Sqs148142 kstat_named_t rcr_unknown_err; 4636349Sqs148142 kstat_named_t rcr_sha_par_err; 4646349Sqs148142 kstat_named_t rbr_pre_par_err; 4656349Sqs148142 kstat_named_t rbr_pre_emty; 4666349Sqs148142 4676349Sqs148142 kstat_named_t rcr_shadow_full; 4686349Sqs148142 kstat_named_t rbr_tmout; 4696349Sqs148142 kstat_named_t peu_resp_err; 4706349Sqs148142 4716349Sqs148142 kstat_named_t ctrl_fifo_ecc_err; 4726349Sqs148142 kstat_named_t data_fifo_ecc_err; 4736349Sqs148142 4746349Sqs148142 kstat_named_t rcrfull; 4756349Sqs148142 kstat_named_t rbr_empty; 4768141SMichael.Speer@Sun.COM kstat_named_t rbr_empty_fail; 4778236SQiyan.Sun@Sun.COM kstat_named_t rbr_empty_restore; 4786349Sqs148142 kstat_named_t rbrfull; 4797618SMichael.Speer@Sun.COM kstat_named_t rcr_invalids; /* Account for invalid RCR entries. */ 4806349Sqs148142 4816349Sqs148142 kstat_named_t rcr_to; 4826349Sqs148142 kstat_named_t rcr_thresh; 4838103SQiyan.Sun@Sun.COM kstat_named_t pkt_drop; 4846349Sqs148142 } hxge_rdc_kstat_t, *p_hxge_rdc_kstat_t; 4856349Sqs148142 4866349Sqs148142 typedef struct _hxge_rdc_sys_kstat { 4876349Sqs148142 /* 4886349Sqs148142 * Receive DMA system statistics. 4896349Sqs148142 * This structure needs to be consistent with hxge_rdc_sys_stat_idx_t 4906349Sqs148142 * in hxge_kstat.c 4916349Sqs148142 */ 4926349Sqs148142 kstat_named_t ctrl_fifo_sec; 4936349Sqs148142 kstat_named_t ctrl_fifo_ded; 4946349Sqs148142 kstat_named_t data_fifo_sec; 4956349Sqs148142 kstat_named_t data_fifo_ded; 4966349Sqs148142 } hxge_rdc_sys_kstat_t, *p_hxge_rdc_sys_kstat_t; 4976349Sqs148142 4986349Sqs148142 typedef struct _hxge_tdc_kstat { 4996349Sqs148142 /* 5006349Sqs148142 * Transmit DMA channel statistics. 5016349Sqs148142 * This structure needs to be consistent with hxge_tdc_stats_index_t 5026349Sqs148142 * in hxge_kstat.c 5036349Sqs148142 */ 5046349Sqs148142 kstat_named_t opackets; 5056349Sqs148142 kstat_named_t obytes; 5066349Sqs148142 kstat_named_t obytes_with_pad; 5076349Sqs148142 kstat_named_t oerrors; 5086349Sqs148142 kstat_named_t tx_inits; 5096349Sqs148142 kstat_named_t tx_no_buf; 5106349Sqs148142 5116349Sqs148142 kstat_named_t peu_resp_err; 5126349Sqs148142 kstat_named_t pkt_size_err; 5136349Sqs148142 kstat_named_t tx_rng_oflow; 5146349Sqs148142 kstat_named_t pkt_size_hdr_err; 5156349Sqs148142 kstat_named_t runt_pkt_drop_err; 5166349Sqs148142 kstat_named_t pref_par_err; 5176349Sqs148142 kstat_named_t tdr_pref_cpl_to; 5186349Sqs148142 kstat_named_t pkt_cpl_to; 5196349Sqs148142 kstat_named_t invalid_sop; 5206349Sqs148142 kstat_named_t unexpected_sop; 5216349Sqs148142 5226349Sqs148142 kstat_named_t count_hdr_size_err; 5236349Sqs148142 kstat_named_t count_runt; 5246349Sqs148142 kstat_named_t count_abort; 5256349Sqs148142 5266349Sqs148142 kstat_named_t tx_starts; 5276349Sqs148142 kstat_named_t tx_no_desc; 5286349Sqs148142 kstat_named_t tx_dma_bind_fail; 5296349Sqs148142 kstat_named_t tx_hdr_pkts; 5306349Sqs148142 kstat_named_t tx_ddi_pkts; 5316349Sqs148142 kstat_named_t tx_jumbo_pkts; 5326349Sqs148142 kstat_named_t tx_max_pend; 5336349Sqs148142 kstat_named_t tx_marks; 5346349Sqs148142 } hxge_tdc_kstat_t, *p_hxge_tdc_kstat_t; 5356349Sqs148142 5366349Sqs148142 typedef struct _hxge_tdc_sys_kstat { 5376349Sqs148142 /* 5386349Sqs148142 * Transmit DMA system statistics. 5396349Sqs148142 * This structure needs to be consistent with hxge_tdc_sys_stat_idx_t 5406349Sqs148142 * in hxge_kstat.c 5416349Sqs148142 */ 5426349Sqs148142 kstat_named_t reord_tbl_par_err; 5436349Sqs148142 kstat_named_t reord_buf_ded_err; 5446349Sqs148142 kstat_named_t reord_buf_sec_err; 5456349Sqs148142 } hxge_tdc_sys_kstat_t, *p_hxge_tdc_sys_kstat_t; 5466349Sqs148142 5476349Sqs148142 typedef struct _hxge_vmac_kstat { 5486349Sqs148142 /* 5496349Sqs148142 * VMAC statistics. 5506349Sqs148142 * This structure needs to be consistent with hxge_vmac_stat_index_t 5516349Sqs148142 * in hxge_kstat.c 5526349Sqs148142 */ 5536349Sqs148142 kstat_named_t tx_frame_cnt; 5546349Sqs148142 kstat_named_t tx_byte_cnt; 5556349Sqs148142 5566349Sqs148142 kstat_named_t rx_frame_cnt; 5576349Sqs148142 kstat_named_t rx_byte_cnt; 5586349Sqs148142 kstat_named_t rx_drop_frame_cnt; 5596349Sqs148142 kstat_named_t rx_drop_byte_cnt; 5606349Sqs148142 kstat_named_t rx_crc_cnt; 5616349Sqs148142 kstat_named_t rx_pause_cnt; 5626349Sqs148142 kstat_named_t rx_bcast_fr_cnt; 5636349Sqs148142 kstat_named_t rx_mcast_fr_cnt; 5646349Sqs148142 } hxge_vmac_kstat_t, *p_hxge_vmac_kstat_t; 5656349Sqs148142 5666349Sqs148142 typedef struct _hxge_pfc_kstat { 5676349Sqs148142 /* 5686349Sqs148142 * This structure needs to be consistent with hxge_pfc_stat_index_t 5696349Sqs148142 * in hxge_kstat.c 5706349Sqs148142 */ 5716349Sqs148142 kstat_named_t pfc_pkt_drop; 5726349Sqs148142 kstat_named_t pfc_tcam_parity_err; 5736349Sqs148142 kstat_named_t pfc_vlan_parity_err; 5746349Sqs148142 kstat_named_t pfc_bad_cs_count; 5756349Sqs148142 kstat_named_t pfc_drop_count; 5766349Sqs148142 kstat_named_t pfc_tcp_ctrl_drop; 5776349Sqs148142 kstat_named_t pfc_l2_addr_drop; 5786349Sqs148142 kstat_named_t pfc_class_code_drop; 5796349Sqs148142 kstat_named_t pfc_tcam_drop; 5806349Sqs148142 kstat_named_t pfc_vlan_drop; 5816349Sqs148142 } hxge_pfc_kstat_t, *p_hxge_pfc_kstat_t; 5826349Sqs148142 5836349Sqs148142 typedef struct _hxge_mmac_kstat { 5846349Sqs148142 /* 5856349Sqs148142 * This structure needs to be consistent with hxge_mmac_stat_index_t 5866349Sqs148142 * in hxge_kstat.c 5876349Sqs148142 */ 5886349Sqs148142 kstat_named_t mmac_max_addr_cnt; 5896349Sqs148142 kstat_named_t mmac_avail_addr_cnt; 5906349Sqs148142 kstat_named_t mmac_addr1; 5916349Sqs148142 kstat_named_t mmac_addr2; 5926349Sqs148142 kstat_named_t mmac_addr3; 5936349Sqs148142 kstat_named_t mmac_addr4; 5946349Sqs148142 kstat_named_t mmac_addr5; 5956349Sqs148142 kstat_named_t mmac_addr6; 5966349Sqs148142 kstat_named_t mmac_addr7; 5976349Sqs148142 kstat_named_t mmac_addr8; 5986349Sqs148142 kstat_named_t mmac_addr9; 5996349Sqs148142 kstat_named_t mmac_addr10; 6006349Sqs148142 kstat_named_t mmac_addr11; 6016349Sqs148142 kstat_named_t mmac_addr12; 6026349Sqs148142 kstat_named_t mmac_addr13; 6036349Sqs148142 kstat_named_t mmac_addr14; 6046349Sqs148142 kstat_named_t mmac_addr15; 6056349Sqs148142 kstat_named_t mmac_addr16; 6066349Sqs148142 } hxge_mmac_kstat_t, *p_hxge_mmac_kstat_t; 6076349Sqs148142 6086349Sqs148142 typedef struct _hxge_peu_sys_kstat { 6096349Sqs148142 /* 6106349Sqs148142 * This structure needs to be consistent with hxge_peu_sys_stat_idx_t 6116349Sqs148142 * in hxge_kstat.c 6126349Sqs148142 */ 6136349Sqs148142 kstat_named_t spc_acc_err; 6146349Sqs148142 kstat_named_t tdc_pioacc_err; 6156349Sqs148142 kstat_named_t rdc_pioacc_err; 6166349Sqs148142 kstat_named_t pfc_pioacc_err; 6176349Sqs148142 kstat_named_t vmac_pioacc_err; 6186349Sqs148142 kstat_named_t cpl_hdrq_parerr; 6196349Sqs148142 kstat_named_t cpl_dataq_parerr; 6206349Sqs148142 kstat_named_t retryram_xdlh_parerr; 6216349Sqs148142 kstat_named_t retrysotram_xdlh_parerr; 6226349Sqs148142 kstat_named_t p_hdrq_parerr; 6236349Sqs148142 kstat_named_t p_dataq_parerr; 6246349Sqs148142 kstat_named_t np_hdrq_parerr; 6256349Sqs148142 kstat_named_t np_dataq_parerr; 6266349Sqs148142 kstat_named_t eic_msix_parerr; 6276349Sqs148142 kstat_named_t hcr_parerr; 6286349Sqs148142 } hxge_peu_sys_kstat_t, *p_hxge_peu_sys_kstat_t; 6296349Sqs148142 6306349Sqs148142 /* 6316349Sqs148142 * Prototype definitions. 6326349Sqs148142 */ 6336349Sqs148142 hxge_status_t hxge_init(p_hxge_t); 6346349Sqs148142 void hxge_uninit(p_hxge_t); 6356349Sqs148142 6366349Sqs148142 typedef void (*fptrv_t)(); 6376349Sqs148142 timeout_id_t hxge_start_timer(p_hxge_t hxgep, fptrv_t func, int msec); 6386349Sqs148142 void hxge_stop_timer(p_hxge_t hxgep, timeout_id_t timerid); 6396349Sqs148142 6406349Sqs148142 #ifdef __cplusplus 6416349Sqs148142 } 6426349Sqs148142 #endif 6436349Sqs148142 6446349Sqs148142 #endif /* _SYS_HXGE_HXGE_H */ 645