1*eef4f27bSRobert Mustacchi /* 2*eef4f27bSRobert Mustacchi * Copyright 2014-2017 Cavium, Inc. 3*eef4f27bSRobert Mustacchi * The contents of this file are subject to the terms of the Common Development 4*eef4f27bSRobert Mustacchi * and Distribution License, v.1, (the "License"). 5*eef4f27bSRobert Mustacchi * 6*eef4f27bSRobert Mustacchi * You may not use this file except in compliance with the License. 7*eef4f27bSRobert Mustacchi * 8*eef4f27bSRobert Mustacchi * You can obtain a copy of the License at available 9*eef4f27bSRobert Mustacchi * at http://opensource.org/licenses/CDDL-1.0 10*eef4f27bSRobert Mustacchi * 11*eef4f27bSRobert Mustacchi * See the License for the specific language governing permissions and 12*eef4f27bSRobert Mustacchi * limitations under the License. 13*eef4f27bSRobert Mustacchi */ 14*eef4f27bSRobert Mustacchi 15*eef4f27bSRobert Mustacchi /* 16*eef4f27bSRobert Mustacchi * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 17*eef4f27bSRobert Mustacchi * Copyright (c) 2019, Joyent, Inc. 18*eef4f27bSRobert Mustacchi */ 19*eef4f27bSRobert Mustacchi 20*eef4f27bSRobert Mustacchi #ifndef _BNX_H 21*eef4f27bSRobert Mustacchi #define _BNX_H 22*eef4f27bSRobert Mustacchi 23*eef4f27bSRobert Mustacchi #ifdef __cplusplus 24*eef4f27bSRobert Mustacchi extern "C" { 25*eef4f27bSRobert Mustacchi #endif 26*eef4f27bSRobert Mustacchi 27*eef4f27bSRobert Mustacchi #include <sys/types.h> 28*eef4f27bSRobert Mustacchi #include <sys/stream.h> 29*eef4f27bSRobert Mustacchi #include <sys/stropts.h> 30*eef4f27bSRobert Mustacchi #include <sys/errno.h> 31*eef4f27bSRobert Mustacchi #include <sys/cred.h> 32*eef4f27bSRobert Mustacchi #include <sys/poll.h> 33*eef4f27bSRobert Mustacchi #include <sys/modctl.h> 34*eef4f27bSRobert Mustacchi #ifdef __10u7 35*eef4f27bSRobert Mustacchi #include <sys/mac.h> 36*eef4f27bSRobert Mustacchi #else 37*eef4f27bSRobert Mustacchi #include <sys/mac_provider.h> 38*eef4f27bSRobert Mustacchi #endif 39*eef4f27bSRobert Mustacchi #include <sys/stat.h> 40*eef4f27bSRobert Mustacchi #include <sys/ddi.h> 41*eef4f27bSRobert Mustacchi #include <sys/sunddi.h> 42*eef4f27bSRobert Mustacchi #include <sys/pattr.h> 43*eef4f27bSRobert Mustacchi #include <sys/sysmacros.h> 44*eef4f27bSRobert Mustacchi #include <sys/ethernet.h> 45*eef4f27bSRobert Mustacchi #include <sys/strsun.h> 46*eef4f27bSRobert Mustacchi #include <netinet/in.h> 47*eef4f27bSRobert Mustacchi #include <netinet/ip.h> 48*eef4f27bSRobert Mustacchi #include <netinet/udp.h> 49*eef4f27bSRobert Mustacchi #include <inet/common.h> 50*eef4f27bSRobert Mustacchi #include <inet/ip.h> 51*eef4f27bSRobert Mustacchi #include <inet/ip_if.h> 52*eef4f27bSRobert Mustacchi #include <sys/strsubr.h> 53*eef4f27bSRobert Mustacchi #include <sys/pci.h> 54*eef4f27bSRobert Mustacchi #include <sys/kstat.h> 55*eef4f27bSRobert Mustacchi 56*eef4f27bSRobert Mustacchi 57*eef4f27bSRobert Mustacchi 58*eef4f27bSRobert Mustacchi #include "listq.h" 59*eef4f27bSRobert Mustacchi #include "lm5706.h" 60*eef4f27bSRobert Mustacchi #include "54xx_reg.h" 61*eef4f27bSRobert Mustacchi 62*eef4f27bSRobert Mustacchi #define BNX_MAGIC 0x0feedead 63*eef4f27bSRobert Mustacchi #define BNX_STR_SIZE 32 64*eef4f27bSRobert Mustacchi 65*eef4f27bSRobert Mustacchi #ifdef __sparc 66*eef4f27bSRobert Mustacchi #define BNX_DMA_ALIGNMENT 0x2000UL 67*eef4f27bSRobert Mustacchi #else 68*eef4f27bSRobert Mustacchi #define BNX_DMA_ALIGNMENT 0x1000UL 69*eef4f27bSRobert Mustacchi #endif 70*eef4f27bSRobert Mustacchi 71*eef4f27bSRobert Mustacchi #define BNX_MAX_SGL_ENTRIES 16 72*eef4f27bSRobert Mustacchi #define BNX_MIN_BYTES_PER_FRAGMENT 32 73*eef4f27bSRobert Mustacchi 74*eef4f27bSRobert Mustacchi #define FW_VER_WITH_UNLOAD_POWER_DOWN 0x01090003 75*eef4f27bSRobert Mustacchi 76*eef4f27bSRobert Mustacchi 77*eef4f27bSRobert Mustacchi extern ddi_device_acc_attr_t bnxAccessAttribBAR; 78*eef4f27bSRobert Mustacchi extern ddi_device_acc_attr_t bnxAccessAttribBUF; 79*eef4f27bSRobert Mustacchi extern ddi_dma_attr_t bnx_std_dma_attrib; 80*eef4f27bSRobert Mustacchi 81*eef4f27bSRobert Mustacchi 82*eef4f27bSRobert Mustacchi typedef struct _bnx_memreq_t { 83*eef4f27bSRobert Mustacchi void * addr; 84*eef4f27bSRobert Mustacchi size_t size; 85*eef4f27bSRobert Mustacchi } bnx_memreq_t; 86*eef4f27bSRobert Mustacchi 87*eef4f27bSRobert Mustacchi 88*eef4f27bSRobert Mustacchi 89*eef4f27bSRobert Mustacchi /* 90*eef4f27bSRobert Mustacchi * Transmit queue info structure holds information regarding transmit resources. 91*eef4f27bSRobert Mustacchi * This consists of two list, one is a free list of transmit packets and another 92*eef4f27bSRobert Mustacchi * a list of pending packets (packets posted to ASIC for transmit). Upon 93*eef4f27bSRobert Mustacchi * receiving transmit complete notification from the asic, the message blocks 94*eef4f27bSRobert Mustacchi * are freed and and packet structure is moved to the free list. 95*eef4f27bSRobert Mustacchi */ 96*eef4f27bSRobert Mustacchi 97*eef4f27bSRobert Mustacchi typedef struct _um_xmit_qinfo { 98*eef4f27bSRobert Mustacchi ddi_dma_handle_t dcpyhndl; 99*eef4f27bSRobert Mustacchi ddi_acc_handle_t dcpyahdl; 100*eef4f27bSRobert Mustacchi caddr_t dcpyvirt; 101*eef4f27bSRobert Mustacchi lm_u64_t dcpyphys; 102*eef4f27bSRobert Mustacchi size_t dcpyhard; 103*eef4f27bSRobert Mustacchi 104*eef4f27bSRobert Mustacchi /* Packet descriptor memory. */ 105*eef4f27bSRobert Mustacchi u32_t desc_cnt; 106*eef4f27bSRobert Mustacchi bnx_memreq_t desc_mem; 107*eef4f27bSRobert Mustacchi 108*eef4f27bSRobert Mustacchi /* Low resource water marks. */ 109*eef4f27bSRobert Mustacchi u32_t thresh_pdwm; 110*eef4f27bSRobert Mustacchi 111*eef4f27bSRobert Mustacchi /* Free queue mutex */ 112*eef4f27bSRobert Mustacchi kmutex_t free_mutex; 113*eef4f27bSRobert Mustacchi 114*eef4f27bSRobert Mustacchi /* Packet descriptors that are free for use. */ 115*eef4f27bSRobert Mustacchi s_list_t free_tx_desc; 116*eef4f27bSRobert Mustacchi 117*eef4f27bSRobert Mustacchi /* Packet descriptors that have been setup and are awaiting xmit. */ 118*eef4f27bSRobert Mustacchi s_list_t tx_resc_que; 119*eef4f27bSRobert Mustacchi } um_xmit_qinfo; 120*eef4f27bSRobert Mustacchi 121*eef4f27bSRobert Mustacchi 122*eef4f27bSRobert Mustacchi 123*eef4f27bSRobert Mustacchi /* 124*eef4f27bSRobert Mustacchi * Receive queue is mostly managed by the LM (lm_dev->rx_info.chain[]). 125*eef4f27bSRobert Mustacchi * During initialization, UM allocates receive buffers and prepares the 126*eef4f27bSRobert Mustacchi * rx descriptions to posts the receive buffers. 127*eef4f27bSRobert Mustacchi */ 128*eef4f27bSRobert Mustacchi typedef struct _um_recv_qinfo { 129*eef4f27bSRobert Mustacchi volatile boolean_t processing; 130*eef4f27bSRobert Mustacchi 131*eef4f27bSRobert Mustacchi /* For packet descriptors that do not have rx buffers assigned. */ 132*eef4f27bSRobert Mustacchi s_list_t buffq; 133*eef4f27bSRobert Mustacchi 134*eef4f27bSRobert Mustacchi /* For packet descriptors waiting to be sent up. */ 135*eef4f27bSRobert Mustacchi s_list_t waitq; 136*eef4f27bSRobert Mustacchi } um_recv_qinfo; 137*eef4f27bSRobert Mustacchi 138*eef4f27bSRobert Mustacchi 139*eef4f27bSRobert Mustacchi typedef struct _os_param { 140*eef4f27bSRobert Mustacchi u32_t active_resc_flag; 141*eef4f27bSRobert Mustacchi #define DRV_RESOURCE_PCICFG_MAPPED 0x0001 142*eef4f27bSRobert Mustacchi #define DRV_RESOURCE_MAP_REGS 0x0002 143*eef4f27bSRobert Mustacchi #define DRV_RESOURCE_INTR_1 0x0004 144*eef4f27bSRobert Mustacchi #define DRV_RESOURCE_MUTEX 0x0008 145*eef4f27bSRobert Mustacchi #define DRV_RESOURCE_HDWR_REGISTER 0x0020 146*eef4f27bSRobert Mustacchi #define DRV_RESOURCE_GLD_REGISTER 0x0040 147*eef4f27bSRobert Mustacchi #define DRV_RESOURCE_KSTAT 0x0080 148*eef4f27bSRobert Mustacchi #define DRV_RESOURCE_TIMER 0x0100 149*eef4f27bSRobert Mustacchi #define DRV_RESOURCE_MINOR_NODE 0x0200 150*eef4f27bSRobert Mustacchi #define DRV_LINK_TIMEOUT_CB 0x0400 151*eef4f27bSRobert Mustacchi 152*eef4f27bSRobert Mustacchi dev_info_t *dip; 153*eef4f27bSRobert Mustacchi 154*eef4f27bSRobert Mustacchi ddi_acc_handle_t pci_cfg_handle; 155*eef4f27bSRobert Mustacchi ddi_acc_handle_t reg_acc_handle; 156*eef4f27bSRobert Mustacchi 157*eef4f27bSRobert Mustacchi mac_handle_t macp; 158*eef4f27bSRobert Mustacchi mac_resource_handle_t rx_resc_handle[NUM_RX_CHAIN]; 159*eef4f27bSRobert Mustacchi caddr_t regs_addr; 160*eef4f27bSRobert Mustacchi 161*eef4f27bSRobert Mustacchi kmutex_t gld_mutex; 162*eef4f27bSRobert Mustacchi krwlock_t gld_snd_mutex; 163*eef4f27bSRobert Mustacchi kmutex_t xmit_mutex; 164*eef4f27bSRobert Mustacchi kmutex_t rcv_mutex; 165*eef4f27bSRobert Mustacchi kmutex_t phy_mutex; 166*eef4f27bSRobert Mustacchi kmutex_t ind_mutex; 167*eef4f27bSRobert Mustacchi 168*eef4f27bSRobert Mustacchi /* 169*eef4f27bSRobert Mustacchi * Following are generic DMA handles used for the following - 170*eef4f27bSRobert Mustacchi * 1. Status _ Statistic DMA memory 171*eef4f27bSRobert Mustacchi * 2. TXBD queue 172*eef4f27bSRobert Mustacchi * 3. RXBD queue 173*eef4f27bSRobert Mustacchi */ 174*eef4f27bSRobert Mustacchi #define BNX_MAX_PHYS_MEMREQS 32 175*eef4f27bSRobert Mustacchi u32_t dma_handles_used; 176*eef4f27bSRobert Mustacchi void *dma_virt[BNX_MAX_PHYS_MEMREQS]; 177*eef4f27bSRobert Mustacchi ddi_dma_handle_t dma_handle[BNX_MAX_PHYS_MEMREQS]; 178*eef4f27bSRobert Mustacchi ddi_acc_handle_t dma_acc_handle[BNX_MAX_PHYS_MEMREQS]; 179*eef4f27bSRobert Mustacchi 180*eef4f27bSRobert Mustacchi ddi_dma_handle_t *status_block_dma_hdl; 181*eef4f27bSRobert Mustacchi 182*eef4f27bSRobert Mustacchi } os_param_t; 183*eef4f27bSRobert Mustacchi 184*eef4f27bSRobert Mustacchi 185*eef4f27bSRobert Mustacchi 186*eef4f27bSRobert Mustacchi 187*eef4f27bSRobert Mustacchi /* 188*eef4f27bSRobert Mustacchi * Following structure hosts attributes related to the device, like media type, 189*eef4f27bSRobert Mustacchi * transmit/receive descriptor queue information, last status index 190*eef4f27bSRobert Mustacchi * processed/acknowledged, etc' 191*eef4f27bSRobert Mustacchi */ 192*eef4f27bSRobert Mustacchi 193*eef4f27bSRobert Mustacchi typedef struct _dev_param { 194*eef4f27bSRobert Mustacchi 195*eef4f27bSRobert Mustacchi u32_t mtu; 196*eef4f27bSRobert Mustacchi 197*eef4f27bSRobert Mustacchi lm_rx_mask_t rx_filter_mask; 198*eef4f27bSRobert Mustacchi lm_offload_t enabled_oflds; 199*eef4f27bSRobert Mustacchi 200*eef4f27bSRobert Mustacchi /* 201*eef4f27bSRobert Mustacchi * This is the last value of 'status_idx' processed and acknowledged 202*eef4f27bSRobert Mustacchi * by the driver. This value is compared with current value in the 203*eef4f27bSRobert Mustacchi * status block to determine if new status block was generated by 204*eef4f27bSRobert Mustacchi * host coalesce block. 205*eef4f27bSRobert Mustacchi */ 206*eef4f27bSRobert Mustacchi u32_t processed_status_idx; 207*eef4f27bSRobert Mustacchi 208*eef4f27bSRobert Mustacchi u32_t fw_ver; 209*eef4f27bSRobert Mustacchi 210*eef4f27bSRobert Mustacchi boolean_t isfiber; 211*eef4f27bSRobert Mustacchi 212*eef4f27bSRobert Mustacchi boolean_t disableMsix; 213*eef4f27bSRobert Mustacchi 214*eef4f27bSRobert Mustacchi lm_status_t indLink; 215*eef4f27bSRobert Mustacchi lm_medium_t indMedium; 216*eef4f27bSRobert Mustacchi } device_param_t; 217*eef4f27bSRobert Mustacchi 218*eef4f27bSRobert Mustacchi 219*eef4f27bSRobert Mustacchi typedef struct _bnx_ndd_lnk_tbl_t { 220*eef4f27bSRobert Mustacchi const char **label; 221*eef4f27bSRobert Mustacchi const boolean_t *value; 222*eef4f27bSRobert Mustacchi } bnx_ndd_lnk_tbl_t; 223*eef4f27bSRobert Mustacchi 224*eef4f27bSRobert Mustacchi 225*eef4f27bSRobert Mustacchi /* NDD parameters related structure members. */ 226*eef4f27bSRobert Mustacchi typedef struct _bnx_ndd_t { 227*eef4f27bSRobert Mustacchi caddr_t ndd_data; 228*eef4f27bSRobert Mustacchi 229*eef4f27bSRobert Mustacchi bnx_ndd_lnk_tbl_t lnktbl[3]; 230*eef4f27bSRobert Mustacchi 231*eef4f27bSRobert Mustacchi int link_speed; 232*eef4f27bSRobert Mustacchi boolean_t link_duplex; 233*eef4f27bSRobert Mustacchi boolean_t link_tx_pause; 234*eef4f27bSRobert Mustacchi boolean_t link_rx_pause; 235*eef4f27bSRobert Mustacchi } bnx_ndd_t; 236*eef4f27bSRobert Mustacchi 237*eef4f27bSRobert Mustacchi 238*eef4f27bSRobert Mustacchi typedef struct _bnx_lnk_cfg_t { 239*eef4f27bSRobert Mustacchi boolean_t link_autoneg; 240*eef4f27bSRobert Mustacchi boolean_t param_2500fdx; 241*eef4f27bSRobert Mustacchi boolean_t param_1000fdx; 242*eef4f27bSRobert Mustacchi boolean_t param_1000hdx; 243*eef4f27bSRobert Mustacchi boolean_t param_100fdx; 244*eef4f27bSRobert Mustacchi boolean_t param_100hdx; 245*eef4f27bSRobert Mustacchi boolean_t param_10fdx; 246*eef4f27bSRobert Mustacchi boolean_t param_10hdx; 247*eef4f27bSRobert Mustacchi boolean_t param_tx_pause; 248*eef4f27bSRobert Mustacchi boolean_t param_rx_pause; 249*eef4f27bSRobert Mustacchi } bnx_lnk_cfg_t; 250*eef4f27bSRobert Mustacchi 251*eef4f27bSRobert Mustacchi 252*eef4f27bSRobert Mustacchi 253*eef4f27bSRobert Mustacchi typedef struct _bnx_phy_cfg_t { 254*eef4f27bSRobert Mustacchi bnx_lnk_cfg_t lnkcfg; 255*eef4f27bSRobert Mustacchi 256*eef4f27bSRobert Mustacchi boolean_t flow_autoneg; 257*eef4f27bSRobert Mustacchi boolean_t wirespeed; 258*eef4f27bSRobert Mustacchi } bnx_phy_cfg_t; 259*eef4f27bSRobert Mustacchi 260*eef4f27bSRobert Mustacchi 261*eef4f27bSRobert Mustacchi 262*eef4f27bSRobert Mustacchi typedef struct _um_device { 263*eef4f27bSRobert Mustacchi /* Lower Module device structure should be the first element */ 264*eef4f27bSRobert Mustacchi struct _lm_device_t lm_dev; 265*eef4f27bSRobert Mustacchi 266*eef4f27bSRobert Mustacchi u32_t magic; 267*eef4f27bSRobert Mustacchi 268*eef4f27bSRobert Mustacchi ddi_intr_handle_t *pIntrBlock; 269*eef4f27bSRobert Mustacchi u32_t intrPriority; 270*eef4f27bSRobert Mustacchi int intrType; 271*eef4f27bSRobert Mustacchi 272*eef4f27bSRobert Mustacchi volatile boolean_t intr_enabled; 273*eef4f27bSRobert Mustacchi kmutex_t intr_mutex; 274*eef4f27bSRobert Mustacchi uint32_t intr_count; 275*eef4f27bSRobert Mustacchi uint32_t intr_no_change; 276*eef4f27bSRobert Mustacchi uint32_t intr_in_disabled; 277*eef4f27bSRobert Mustacchi 278*eef4f27bSRobert Mustacchi volatile boolean_t timer_enabled; 279*eef4f27bSRobert Mustacchi kmutex_t tmr_mutex; 280*eef4f27bSRobert Mustacchi timeout_id_t tmrtid; 281*eef4f27bSRobert Mustacchi unsigned int timer_link_check_interval; 282*eef4f27bSRobert Mustacchi unsigned int timer_link_check_counter; 283*eef4f27bSRobert Mustacchi unsigned int timer_link_check_interval2; 284*eef4f27bSRobert Mustacchi unsigned int timer_link_check_counter2; 285*eef4f27bSRobert Mustacchi 286*eef4f27bSRobert Mustacchi volatile boolean_t dev_start; 287*eef4f27bSRobert Mustacchi volatile boolean_t link_updates_ok; 288*eef4f27bSRobert Mustacchi 289*eef4f27bSRobert Mustacchi os_param_t os_param; 290*eef4f27bSRobert Mustacchi device_param_t dev_var; 291*eef4f27bSRobert Mustacchi 292*eef4f27bSRobert Mustacchi u32_t tx_copy_threshold; 293*eef4f27bSRobert Mustacchi 294*eef4f27bSRobert Mustacchi u32_t no_tx_credits; 295*eef4f27bSRobert Mustacchi #define BNX_TX_RESOURCES_NO_CREDIT 0x01 296*eef4f27bSRobert Mustacchi #define BNX_TX_RESOURCES_NO_DESC 0x02 297*eef4f27bSRobert Mustacchi /* Unable to allocate DMA resources. (e.g. bind error) */ 298*eef4f27bSRobert Mustacchi #define BNX_TX_RESOURCES_NO_OS_DMA_RES 0x08 299*eef4f27bSRobert Mustacchi #define BNX_TX_RESOURCES_TOO_MANY_FRAGS 0x10 300*eef4f27bSRobert Mustacchi 301*eef4f27bSRobert Mustacchi um_xmit_qinfo txq[NUM_TX_CHAIN]; 302*eef4f27bSRobert Mustacchi #define _TX_QINFO(pdev, chain) (pdev->txq[chain]) 303*eef4f27bSRobert Mustacchi #define _TXQ_FREE_DESC(pdev, chain) (pdev->txq[chain].free_tx_desc) 304*eef4f27bSRobert Mustacchi #define _TXQ_RESC_DESC(pdev, chain) (pdev->txq[chain].tx_resc_que) 305*eef4f27bSRobert Mustacchi 306*eef4f27bSRobert Mustacchi u32_t rx_copy_threshold; 307*eef4f27bSRobert Mustacchi uint32_t recv_discards; 308*eef4f27bSRobert Mustacchi 309*eef4f27bSRobert Mustacchi um_recv_qinfo rxq[NUM_RX_CHAIN]; 310*eef4f27bSRobert Mustacchi #define _RX_QINFO(pdev, chain) (pdev->rxq[chain]) 311*eef4f27bSRobert Mustacchi 312*eef4f27bSRobert Mustacchi bnx_ndd_t nddcfg; 313*eef4f27bSRobert Mustacchi 314*eef4f27bSRobert Mustacchi bnx_phy_cfg_t hwinit; 315*eef4f27bSRobert Mustacchi bnx_phy_cfg_t curcfg; 316*eef4f27bSRobert Mustacchi bnx_lnk_cfg_t remote; 317*eef4f27bSRobert Mustacchi 318*eef4f27bSRobert Mustacchi char dev_name[BNX_STR_SIZE]; 319*eef4f27bSRobert Mustacchi int instance; 320*eef4f27bSRobert Mustacchi char version[BNX_STR_SIZE]; 321*eef4f27bSRobert Mustacchi char versionFW[BNX_STR_SIZE]; 322*eef4f27bSRobert Mustacchi char chipName[BNX_STR_SIZE]; 323*eef4f27bSRobert Mustacchi char intrAlloc[BNX_STR_SIZE]; 324*eef4f27bSRobert Mustacchi u64_t intrFired; 325*eef4f27bSRobert Mustacchi 326*eef4f27bSRobert Mustacchi kstat_t *kstats; 327*eef4f27bSRobert Mustacchi kmutex_t kstatMutex; 328*eef4f27bSRobert Mustacchi 329*eef4f27bSRobert Mustacchi #define BNX_MAX_MEMREQS 2 330*eef4f27bSRobert Mustacchi unsigned int memcnt; 331*eef4f27bSRobert Mustacchi bnx_memreq_t memreq[BNX_MAX_MEMREQS]; 332*eef4f27bSRobert Mustacchi } um_device_t; 333*eef4f27bSRobert Mustacchi 334*eef4f27bSRobert Mustacchi 335*eef4f27bSRobert Mustacchi 336*eef4f27bSRobert Mustacchi /* 337*eef4f27bSRobert Mustacchi * Following structure defines the packet descriptor as seen by the UM module. 338*eef4f27bSRobert Mustacchi * This is used to map buffers to lm_packet on xmit path and receive path. 339*eef4f27bSRobert Mustacchi */ 340*eef4f27bSRobert Mustacchi 341*eef4f27bSRobert Mustacchi typedef struct _um_txpacket_t { 342*eef4f27bSRobert Mustacchi /* Must be the first entry in this structure. */ 343*eef4f27bSRobert Mustacchi struct _lm_packet_t lm_pkt; 344*eef4f27bSRobert Mustacchi 345*eef4f27bSRobert Mustacchi mblk_t *mp; 346*eef4f27bSRobert Mustacchi 347*eef4f27bSRobert Mustacchi ddi_dma_handle_t *cpyhdl; 348*eef4f27bSRobert Mustacchi caddr_t cpymem; 349*eef4f27bSRobert Mustacchi lm_u64_t cpyphy; 350*eef4f27bSRobert Mustacchi off_t cpyoff; 351*eef4f27bSRobert Mustacchi 352*eef4f27bSRobert Mustacchi u32_t num_handles; 353*eef4f27bSRobert Mustacchi ddi_dma_handle_t dma_handle[BNX_MAX_SGL_ENTRIES]; 354*eef4f27bSRobert Mustacchi 355*eef4f27bSRobert Mustacchi lm_frag_list_t frag_list; 356*eef4f27bSRobert Mustacchi lm_frag_t frag_list_buffer[BNX_MAX_SGL_ENTRIES]; 357*eef4f27bSRobert Mustacchi } um_txpacket_t; 358*eef4f27bSRobert Mustacchi 359*eef4f27bSRobert Mustacchi 360*eef4f27bSRobert Mustacchi 361*eef4f27bSRobert Mustacchi #define BNX_RECV_MAX_FRAGS 1 362*eef4f27bSRobert Mustacchi typedef struct _um_rxpacket_t { 363*eef4f27bSRobert Mustacchi /* Must be the first entry in this structure. */ 364*eef4f27bSRobert Mustacchi struct _lm_packet_t lmpacket; 365*eef4f27bSRobert Mustacchi 366*eef4f27bSRobert Mustacchi ddi_dma_handle_t dma_handle; 367*eef4f27bSRobert Mustacchi ddi_acc_handle_t dma_acc_handle; 368*eef4f27bSRobert Mustacchi } um_rxpacket_t; 369*eef4f27bSRobert Mustacchi 370*eef4f27bSRobert Mustacchi 371*eef4f27bSRobert Mustacchi #define VLAN_TPID 0x8100u 372*eef4f27bSRobert Mustacchi #define VLAN_TAGSZ 4 373*eef4f27bSRobert Mustacchi #define VLAN_TAG_SIZE 4 374*eef4f27bSRobert Mustacchi #define VLAN_VID_MAX 4094 /* 4095 is reserved */ 375*eef4f27bSRobert Mustacchi 376*eef4f27bSRobert Mustacchi 377*eef4f27bSRobert Mustacchi typedef struct ether_vlan_header vlan_hdr_t; 378*eef4f27bSRobert Mustacchi #define DRV_EXTRACT_VLAN_TPID(vhdrp) htons(vhdrp->ether_tpid) 379*eef4f27bSRobert Mustacchi #define DRV_EXTRACT_VLAN_TCI(vhdrp) htons(vhdrp->ether_tci) 380*eef4f27bSRobert Mustacchi #define DRV_SET_VLAN_TPID(vhdrp, tpid) vhdrp->ether_tpid = htons(tpid) 381*eef4f27bSRobert Mustacchi #define DRV_SET_VLAN_TCI(vhdrp, vtag) vhdrp->ether_tci = htons(vtag) 382*eef4f27bSRobert Mustacchi 383*eef4f27bSRobert Mustacchi 384*eef4f27bSRobert Mustacchi 385*eef4f27bSRobert Mustacchi 386*eef4f27bSRobert Mustacchi 387*eef4f27bSRobert Mustacchi /* 388*eef4f27bSRobert Mustacchi * 389*eef4f27bSRobert Mustacchi * 'ndd' Get/Set IOCTL Definition 390*eef4f27bSRobert Mustacchi * 391*eef4f27bSRobert Mustacchi */ 392*eef4f27bSRobert Mustacchi 393*eef4f27bSRobert Mustacchi 394*eef4f27bSRobert Mustacchi /* 395*eef4f27bSRobert Mustacchi * (Internal) return values from ioctl subroutines 396*eef4f27bSRobert Mustacchi */ 397*eef4f27bSRobert Mustacchi enum ioc_reply { 398*eef4f27bSRobert Mustacchi IOC_INVAL = -1, /* bad, NAK with EINVAL */ 399*eef4f27bSRobert Mustacchi IOC_DONE, /* OK, reply sent */ 400*eef4f27bSRobert Mustacchi IOC_ACK, /* OK, just send ACK */ 401*eef4f27bSRobert Mustacchi IOC_REPLY, /* OK, just send reply */ 402*eef4f27bSRobert Mustacchi IOC_RESTART_ACK, /* OK, restart & ACK */ 403*eef4f27bSRobert Mustacchi IOC_RESTART_REPLY /* OK, restart & reply */ 404*eef4f27bSRobert Mustacchi }; 405*eef4f27bSRobert Mustacchi 406*eef4f27bSRobert Mustacchi /* 407*eef4f27bSRobert Mustacchi * Function Prototypes 408*eef4f27bSRobert Mustacchi * 409*eef4f27bSRobert Mustacchi */ 410*eef4f27bSRobert Mustacchi 411*eef4f27bSRobert Mustacchi ddi_dma_handle_t *bnx_find_dma_hdl(um_device_t * const umdevice, 412*eef4f27bSRobert Mustacchi const void * const virtaddr); 413*eef4f27bSRobert Mustacchi 414*eef4f27bSRobert Mustacchi void um_send_driver_pulse(um_device_t *udevp); 415*eef4f27bSRobert Mustacchi 416*eef4f27bSRobert Mustacchi int bnx_find_mchash_collision(lm_mc_table_t *mc_table, 417*eef4f27bSRobert Mustacchi const u8_t *const mc_addr); 418*eef4f27bSRobert Mustacchi 419*eef4f27bSRobert Mustacchi void bnx_update_phy(um_device_t *pdev); 420*eef4f27bSRobert Mustacchi 421*eef4f27bSRobert Mustacchi 422*eef4f27bSRobert Mustacchi boolean_t bnx_kstat_init(um_device_t *pUM); 423*eef4f27bSRobert Mustacchi void bnx_kstat_fini(um_device_t *pUM); 424*eef4f27bSRobert Mustacchi 425*eef4f27bSRobert Mustacchi #ifdef __cplusplus 426*eef4f27bSRobert Mustacchi } 427*eef4f27bSRobert Mustacchi #endif 428*eef4f27bSRobert Mustacchi 429*eef4f27bSRobert Mustacchi #endif /* _BNX_H */ 430