1*3d19cdaeSstevel /* 2*3d19cdaeSstevel * CDDL HEADER START 3*3d19cdaeSstevel * 4*3d19cdaeSstevel * The contents of this file are subject to the terms of the 5*3d19cdaeSstevel * Common Development and Distribution License, Version 1.0 only 6*3d19cdaeSstevel * (the "License"). You may not use this file except in compliance 7*3d19cdaeSstevel * with the License. 8*3d19cdaeSstevel * 9*3d19cdaeSstevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*3d19cdaeSstevel * or http://www.opensolaris.org/os/licensing. 11*3d19cdaeSstevel * See the License for the specific language governing permissions 12*3d19cdaeSstevel * and limitations under the License. 13*3d19cdaeSstevel * 14*3d19cdaeSstevel * When distributing Covered Code, include this CDDL HEADER in each 15*3d19cdaeSstevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*3d19cdaeSstevel * If applicable, add the following below this CDDL HEADER, with the 17*3d19cdaeSstevel * fields enclosed by brackets "[]" replaced with your own identifying 18*3d19cdaeSstevel * information: Portions Copyright [yyyy] [name of copyright owner] 19*3d19cdaeSstevel * 20*3d19cdaeSstevel * CDDL HEADER END 21*3d19cdaeSstevel */ 22*3d19cdaeSstevel /* 23*3d19cdaeSstevel * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24*3d19cdaeSstevel * Use is subject to license terms. 25*3d19cdaeSstevel */ 26*3d19cdaeSstevel 27*3d19cdaeSstevel #ifndef _SYS_SCSI_ADAPTERS_SFVAR_H 28*3d19cdaeSstevel #define _SYS_SCSI_ADAPTERS_SFVAR_H 29*3d19cdaeSstevel 30*3d19cdaeSstevel #pragma ident "%Z%%M% %I% %E% SMI" 31*3d19cdaeSstevel 32*3d19cdaeSstevel /* 33*3d19cdaeSstevel * FC-AL FCP driver definitions 34*3d19cdaeSstevel */ 35*3d19cdaeSstevel 36*3d19cdaeSstevel #ifdef __cplusplus 37*3d19cdaeSstevel extern "C" { 38*3d19cdaeSstevel #endif 39*3d19cdaeSstevel 40*3d19cdaeSstevel /* 41*3d19cdaeSstevel * this is to generate unique minor numbers for each minor 42*3d19cdaeSstevel * node type being created. because of the limitations by SCSA, 43*3d19cdaeSstevel * we have to use minor number values from 32 to 63 for the HBA 44*3d19cdaeSstevel * drivers use 45*3d19cdaeSstevel */ 46*3d19cdaeSstevel #define SF_BASE_MINOR 32 47*3d19cdaeSstevel #define SF_DEVCTL_MINOR (SF_BASE_MINOR + 1) 48*3d19cdaeSstevel #define SF_FC_MINOR (SF_BASE_MINOR + 2) 49*3d19cdaeSstevel #define SF_INST_SHIFT4MINOR 6 50*3d19cdaeSstevel #define SF_INST2DEVCTL_MINOR(x) (((x) << SF_INST_SHIFT4MINOR) | SF_DEVCTL_MINOR) 51*3d19cdaeSstevel #define SF_INST2FC_MINOR(x) (((x) << SF_INST_SHIFT4MINOR) | SF_FC_MINOR) 52*3d19cdaeSstevel #define SF_MINOR2INST(x) ((x) >> SF_INST_SHIFT4MINOR) 53*3d19cdaeSstevel 54*3d19cdaeSstevel #define SF_INIT_ITEMS 5 55*3d19cdaeSstevel #define SF_MAX_TARGETS 126 56*3d19cdaeSstevel #define SF_MAX_LILP_ENTRIES 126 57*3d19cdaeSstevel 58*3d19cdaeSstevel #define SF_NUM_HASH_QUEUES 32 59*3d19cdaeSstevel #define SF_HASH(x, y) ((x[0]+x[1]+x[2]+x[3]+x[4]+x[5]+x[6]+x[7]) &\ 60*3d19cdaeSstevel (SF_NUM_HASH_QUEUES-1)) 61*3d19cdaeSstevel 62*3d19cdaeSstevel 63*3d19cdaeSstevel /* 64*3d19cdaeSstevel * sf driver needs to be sanitized for exporting some of its 65*3d19cdaeSstevel * macros/variables to userland programs. 66*3d19cdaeSstevel */ 67*3d19cdaeSstevel #ifdef _KERNEL 68*3d19cdaeSstevel 69*3d19cdaeSstevel /* 70*3d19cdaeSstevel * sf instance structure 71*3d19cdaeSstevel */ 72*3d19cdaeSstevel 73*3d19cdaeSstevel struct sf { 74*3d19cdaeSstevel struct scsi_hba_tran *sf_tran; 75*3d19cdaeSstevel dev_info_t *sf_dip; 76*3d19cdaeSstevel struct sf *sf_next; 77*3d19cdaeSstevel struct sf *sf_sibling; 78*3d19cdaeSstevel kmutex_t sf_mutex; 79*3d19cdaeSstevel kmutex_t sf_cr_mutex; 80*3d19cdaeSstevel uint_t sf_state; 81*3d19cdaeSstevel int64_t sf_reset_time; /* reset/lip init time for bus_config */ 82*3d19cdaeSstevel struct sf_target *sf_targets[SF_MAX_TARGETS]; 83*3d19cdaeSstevel struct sf_target *sf_wwn_lists[SF_NUM_HASH_QUEUES]; 84*3d19cdaeSstevel void *sf_socp; /* pointer to socal state */ 85*3d19cdaeSstevel struct fcal_transport *sf_sochandle; 86*3d19cdaeSstevel kmutex_t sf_cmd_mutex; 87*3d19cdaeSstevel int sf_throttle; 88*3d19cdaeSstevel int sf_ncmds; 89*3d19cdaeSstevel int sf_ncmds_exp_avg; 90*3d19cdaeSstevel int sf_device_count; 91*3d19cdaeSstevel uint_t sf_use_lock; 92*3d19cdaeSstevel uint_t sf_timer; 93*3d19cdaeSstevel uint_t sf_online_timer; 94*3d19cdaeSstevel int sf_take_core; 95*3d19cdaeSstevel struct kmem_cache *sf_pkt_cache; 96*3d19cdaeSstevel struct sf_pkt *sf_pkt_head; /* packet queue */ 97*3d19cdaeSstevel struct sf_pkt *sf_pkt_tail; 98*3d19cdaeSstevel struct sf_els_hdr *sf_els_list; 99*3d19cdaeSstevel struct sf_reset_list *sf_reset_list; 100*3d19cdaeSstevel kcondvar_t sf_cr_cv; 101*3d19cdaeSstevel uint_t sf_cr_pool_cnt; 102*3d19cdaeSstevel struct sf_cr_pool *sf_cr_pool; /* list of command/response pools */ 103*3d19cdaeSstevel uchar_t sf_al_pa; 104*3d19cdaeSstevel uchar_t sf_busy; 105*3d19cdaeSstevel uchar_t sf_flag; 106*3d19cdaeSstevel uchar_t sf_cr_flag; /* synchronize creation of new cr pools */ 107*3d19cdaeSstevel uint_t sf_lip_cnt; 108*3d19cdaeSstevel struct scsi_reset_notify_entry *sf_reset_notify_listf; 109*3d19cdaeSstevel struct fcal_lilp_map *sf_lilp_map; 110*3d19cdaeSstevel ddi_dma_handle_t sf_lilp_dmahandle; 111*3d19cdaeSstevel ddi_acc_handle_t sf_lilp_acchandle; 112*3d19cdaeSstevel ddi_dma_cookie_t sf_lilp_dmacookie; 113*3d19cdaeSstevel kstat_t *sf_ksp; 114*3d19cdaeSstevel kmutex_t sf_hp_daemon_mutex; 115*3d19cdaeSstevel kcondvar_t sf_hp_daemon_cv; 116*3d19cdaeSstevel struct sf_hp_elem *sf_hp_elem_head; 117*3d19cdaeSstevel struct sf_hp_elem *sf_hp_elem_tail; 118*3d19cdaeSstevel /* 119*3d19cdaeSstevel * Event handling 120*3d19cdaeSstevel */ 121*3d19cdaeSstevel ndi_event_definition_t *sf_event_defs; 122*3d19cdaeSstevel ndi_event_hdl_t sf_event_hdl; 123*3d19cdaeSstevel ndi_event_set_t sf_events; 124*3d19cdaeSstevel struct sf_stats sf_stats; 125*3d19cdaeSstevel uchar_t sf_hp_exit; /* hotplugging thread exit flag */ 126*3d19cdaeSstevel uchar_t sf_check_n_close; 127*3d19cdaeSstevel /* check if unopened sf is being closed */ 128*3d19cdaeSstevel kt_did_t sf_hp_tid; /* hotplug thread id */ 129*3d19cdaeSstevel }; 130*3d19cdaeSstevel 131*3d19cdaeSstevel #define SF_STATE_INIT 0x01 132*3d19cdaeSstevel #define SF_STATE_OFFLINE 0x02 133*3d19cdaeSstevel #define SF_STATE_ONLINE 0x04 134*3d19cdaeSstevel #define SF_STATE_ONLINING 0x08 135*3d19cdaeSstevel #define SF_STATE_SUSPENDED 0x10 /* driver has been suspended */ 136*3d19cdaeSstevel 137*3d19cdaeSstevel #define SF_EVENT_TAG_INSERT 0 138*3d19cdaeSstevel #define SF_EVENT_TAG_REMOVE 1 139*3d19cdaeSstevel 140*3d19cdaeSstevel /* 141*3d19cdaeSstevel * pool of sf command response blocks 142*3d19cdaeSstevel */ 143*3d19cdaeSstevel 144*3d19cdaeSstevel struct sf_cr_pool { 145*3d19cdaeSstevel struct sf_cr_pool *next; 146*3d19cdaeSstevel struct sf_cr_free_elem *free; 147*3d19cdaeSstevel struct sf *sf; 148*3d19cdaeSstevel caddr_t cmd_base; /* start addr of this chunk */ 149*3d19cdaeSstevel ddi_dma_handle_t cmd_dma_handle; /* dma mapping for this chunk */ 150*3d19cdaeSstevel ddi_acc_handle_t cmd_acc_handle; 151*3d19cdaeSstevel caddr_t rsp_base; 152*3d19cdaeSstevel ddi_dma_handle_t rsp_dma_handle; 153*3d19cdaeSstevel ddi_acc_handle_t rsp_acc_handle; 154*3d19cdaeSstevel uint_t nfree; 155*3d19cdaeSstevel uint_t ntot; 156*3d19cdaeSstevel }; 157*3d19cdaeSstevel 158*3d19cdaeSstevel #define SF_CR_POOL_MAX 32 /* allows 4096 outstanding packets */ 159*3d19cdaeSstevel 160*3d19cdaeSstevel #define SF_ELEMS_IN_POOL 128 161*3d19cdaeSstevel #define SF_LOG2_ELEMS_IN_POOL 7 /* LOG2 SF_ELEMS_IN_POOL */ 162*3d19cdaeSstevel #define SF_FREE_CR_EPSILON 64 /* SF_ELEMS_IN_POOL /2 */ 163*3d19cdaeSstevel 164*3d19cdaeSstevel /* 165*3d19cdaeSstevel * sf command/response free structure which is overlaid on fcp_cmd 166*3d19cdaeSstevel */ 167*3d19cdaeSstevel 168*3d19cdaeSstevel struct sf_cr_free_elem { 169*3d19cdaeSstevel struct sf_cr_free_elem *next; 170*3d19cdaeSstevel caddr_t rsp; /* ptr to corresponding rsp */ 171*3d19cdaeSstevel uint_t cmd_dmac; /* dmac_address for cmd */ 172*3d19cdaeSstevel uint_t rsp_dmac; /* dmac_address for rsp */ 173*3d19cdaeSstevel }; 174*3d19cdaeSstevel 175*3d19cdaeSstevel /* 176*3d19cdaeSstevel * list of targets for reset delay handling 177*3d19cdaeSstevel */ 178*3d19cdaeSstevel 179*3d19cdaeSstevel struct sf_reset_list { 180*3d19cdaeSstevel struct sf_reset_list *next; 181*3d19cdaeSstevel struct sf_target *target; 182*3d19cdaeSstevel clock_t timeout; 183*3d19cdaeSstevel uint_t lip_cnt; 184*3d19cdaeSstevel }; 185*3d19cdaeSstevel 186*3d19cdaeSstevel /* 187*3d19cdaeSstevel * structure used to store hotplug event callback info 188*3d19cdaeSstevel */ 189*3d19cdaeSstevel 190*3d19cdaeSstevel struct sf_hp_event { 191*3d19cdaeSstevel int (*callback)(); 192*3d19cdaeSstevel void *arg; 193*3d19cdaeSstevel }; 194*3d19cdaeSstevel 195*3d19cdaeSstevel 196*3d19cdaeSstevel /* 197*3d19cdaeSstevel * sf per target structure 198*3d19cdaeSstevel */ 199*3d19cdaeSstevel 200*3d19cdaeSstevel struct sf_target { 201*3d19cdaeSstevel struct sf_pkt *sft_pkt_head; /* queue of active commands */ 202*3d19cdaeSstevel struct sf_pkt *sft_pkt_tail; 203*3d19cdaeSstevel kmutex_t sft_mutex; 204*3d19cdaeSstevel kcondvar_t sft_cv; 205*3d19cdaeSstevel kmutex_t sft_pkt_mutex; 206*3d19cdaeSstevel dev_info_t *sft_dip; 207*3d19cdaeSstevel uchar_t sft_node_wwn[FC_WWN_SIZE]; 208*3d19cdaeSstevel uchar_t sft_port_wwn[FC_WWN_SIZE]; 209*3d19cdaeSstevel union { 210*3d19cdaeSstevel /* It's easier to shove around an int64 than a byte array */ 211*3d19cdaeSstevel uchar_t b[FCP_LUN_SIZE]; 212*3d19cdaeSstevel int64_t l; 213*3d19cdaeSstevel } sft_lun; 214*3d19cdaeSstevel /* XXXX The RAID LUN field is used to implement FCP Annex C */ 215*3d19cdaeSstevel #ifdef RAID_LUNS 216*3d19cdaeSstevel uint_t sft_raid_lun; 217*3d19cdaeSstevel #define SCSA_LUN(t) (int64_t)(t)->sft_raid_lun 218*3d19cdaeSstevel #else 219*3d19cdaeSstevel #define SCSA_LUN(t) (t)->sft_lun.l 220*3d19cdaeSstevel #endif 221*3d19cdaeSstevel uchar_t sft_hard_address; 222*3d19cdaeSstevel uchar_t sft_al_pa; 223*3d19cdaeSstevel uchar_t sft_device_type; 224*3d19cdaeSstevel uchar_t sft_scan_count; 225*3d19cdaeSstevel uint_t sft_alive; 226*3d19cdaeSstevel uint_t sft_state; 227*3d19cdaeSstevel uint_t sft_lip_cnt; 228*3d19cdaeSstevel struct scsi_hba_tran *sft_tran; 229*3d19cdaeSstevel struct sf_target *sft_next; 230*3d19cdaeSstevel struct sf_target *sft_next_lun; 231*3d19cdaeSstevel struct sf_hp_event sft_insert_ev; 232*3d19cdaeSstevel struct sf_hp_event sft_remove_ev; 233*3d19cdaeSstevel struct scsi_inquiry sft_inq; 234*3d19cdaeSstevel }; 235*3d19cdaeSstevel 236*3d19cdaeSstevel #define SF_TARGET_INIT_DONE 0x1 237*3d19cdaeSstevel #define SF_TARGET_BUSY 0x2 238*3d19cdaeSstevel #define SF_TARGET_OFFLINE 0x4 239*3d19cdaeSstevel #define SF_TARGET_MARK 0x8 240*3d19cdaeSstevel 241*3d19cdaeSstevel /* 242*3d19cdaeSstevel * sf packet 243*3d19cdaeSstevel */ 244*3d19cdaeSstevel 245*3d19cdaeSstevel #define PKT2CMD(pkt) ((struct sf_pkt *)pkt->pkt_ha_private) 246*3d19cdaeSstevel #define CMD2PKT(cmd) ((cmd)->cmd_pkt) 247*3d19cdaeSstevel #ifdef _LP64 248*3d19cdaeSstevel #define PKT_PRIV_SIZE 2 249*3d19cdaeSstevel #define PKT_PRIV_LEN 16 250*3d19cdaeSstevel #else /* _ILP32 */ 251*3d19cdaeSstevel #define PKT_PRIV_SIZE 1 252*3d19cdaeSstevel #define PKT_PRIV_LEN 8 253*3d19cdaeSstevel #endif 254*3d19cdaeSstevel 255*3d19cdaeSstevel 256*3d19cdaeSstevel struct sf_pkt { 257*3d19cdaeSstevel struct sf_pkt *cmd_forw; 258*3d19cdaeSstevel struct sf_pkt *cmd_back; 259*3d19cdaeSstevel struct sf_pkt *cmd_next; 260*3d19cdaeSstevel struct scsi_pkt *cmd_pkt; 261*3d19cdaeSstevel fcal_packet_t *cmd_fp_pkt; 262*3d19cdaeSstevel uint_t cmd_state; 263*3d19cdaeSstevel uint_t cmd_timeout; 264*3d19cdaeSstevel char cmd_scsi_scb[sizeof (struct scsi_arq_status)]; 265*3d19cdaeSstevel uint32_t cmd_dmacount; 266*3d19cdaeSstevel ddi_dma_handle_t cmd_dmahandle; /* dma handle */ 267*3d19cdaeSstevel ddi_dma_cookie_t cmd_dmacookie; /* current dma cookie */ 268*3d19cdaeSstevel uint_t cmd_flags; /* private flags */ 269*3d19cdaeSstevel /* needs ZEROING */ 270*3d19cdaeSstevel uint_t cmd_cdblen; /* length of cdb */ 271*3d19cdaeSstevel /* needs to be INITialized */ 272*3d19cdaeSstevel uint_t cmd_scblen; /* length of scb */ 273*3d19cdaeSstevel /* needs to be INITialized */ 274*3d19cdaeSstevel uint_t cmd_privlen; /* length of tgt private */ 275*3d19cdaeSstevel /* needs to be INITialized */ 276*3d19cdaeSstevel struct sf_cr_pool *cmd_cr_pool; /* pool to which cmd/rsp belong */ 277*3d19cdaeSstevel struct fcp_cmd *cmd_block; 278*3d19cdaeSstevel struct fcp_rsp *cmd_rsp_block; 279*3d19cdaeSstevel kmutex_t cmd_abort_mutex; /* packet abort mutex */ 280*3d19cdaeSstevel uint_t cmd_dmac; 281*3d19cdaeSstevel uint_t cmd_rsp_dmac; 282*3d19cdaeSstevel uint64_t cmd_pkt_private[PKT_PRIV_LEN]; 283*3d19cdaeSstevel /* default target private area */ 284*3d19cdaeSstevel }; 285*3d19cdaeSstevel 286*3d19cdaeSstevel #define SF_STATE_IDLE 0x1 287*3d19cdaeSstevel #define SF_STATE_ISSUED 0x2 288*3d19cdaeSstevel #define SF_STATE_ABORTING 0x4 289*3d19cdaeSstevel 290*3d19cdaeSstevel /* 291*3d19cdaeSstevel * Define size of extended scsi cmd pkt (ie. includes ARQ) 292*3d19cdaeSstevel */ 293*3d19cdaeSstevel #define EXTCMDS_STATUS_SIZE (sizeof (struct scsi_arq_status)) 294*3d19cdaeSstevel 295*3d19cdaeSstevel /* 296*3d19cdaeSstevel * These are the defined flags for this structure. 297*3d19cdaeSstevel */ 298*3d19cdaeSstevel #define CFLAG_DMAVALID 0x0010 /* dma mapping valid */ 299*3d19cdaeSstevel #define CFLAG_DMASEND 0x0020 /* data is going 'out' */ 300*3d19cdaeSstevel #define CFLAG_CMDIOPB 0x0040 /* this is an 'iopb' packet */ 301*3d19cdaeSstevel #define CFLAG_CDBEXTERN 0x0100 /* cdb kmem_alloc'd */ 302*3d19cdaeSstevel #define CFLAG_SCBEXTERN 0x0200 /* scb kmem_alloc'd */ 303*3d19cdaeSstevel #define CFLAG_FREE 0x0400 /* packet is on free list */ 304*3d19cdaeSstevel #define CFLAG_PRIVEXTERN 0x1000 /* target private was */ 305*3d19cdaeSstevel /* kmem_alloc'd */ 306*3d19cdaeSstevel #define CFLAG_IN_QUEUE 0x2000 /* command in sf queue */ 307*3d19cdaeSstevel 308*3d19cdaeSstevel struct sf_els_hdr { 309*3d19cdaeSstevel struct sf *sf; 310*3d19cdaeSstevel caddr_t cmd; 311*3d19cdaeSstevel caddr_t rsp; 312*3d19cdaeSstevel uchar_t els_code; 313*3d19cdaeSstevel uchar_t delayed_retry; 314*3d19cdaeSstevel ddi_dma_handle_t cmd_dma_handle; 315*3d19cdaeSstevel ddi_dma_handle_t rsp_dma_handle; 316*3d19cdaeSstevel ddi_acc_handle_t cmd_acc_handle; 317*3d19cdaeSstevel ddi_acc_handle_t rsp_acc_handle; 318*3d19cdaeSstevel uint_t dest_nport_id; 319*3d19cdaeSstevel struct sf_els_hdr *next; 320*3d19cdaeSstevel struct sf_els_hdr *prev; 321*3d19cdaeSstevel uint_t size; 322*3d19cdaeSstevel uint_t timeout; 323*3d19cdaeSstevel uint_t retries; 324*3d19cdaeSstevel struct fcal_packet *fpkt; 325*3d19cdaeSstevel uint_t lip_cnt; 326*3d19cdaeSstevel uchar_t port_wwn[FC_WWN_SIZE]; 327*3d19cdaeSstevel uchar_t node_wwn[FC_WWN_SIZE]; 328*3d19cdaeSstevel struct sf_target *target; 329*3d19cdaeSstevel ddi_dma_handle_t data_dma_handle; 330*3d19cdaeSstevel ddi_acc_handle_t data_acc_handle; 331*3d19cdaeSstevel caddr_t data_buf; 332*3d19cdaeSstevel }; 333*3d19cdaeSstevel 334*3d19cdaeSstevel union sf_els_cmd { 335*3d19cdaeSstevel struct la_els_logi logi; 336*3d19cdaeSstevel struct la_els_logo logo; 337*3d19cdaeSstevel struct la_els_prli prli; 338*3d19cdaeSstevel struct la_els_adisc adisc; 339*3d19cdaeSstevel struct fcp_cmd cmd; 340*3d19cdaeSstevel }; 341*3d19cdaeSstevel 342*3d19cdaeSstevel union sf_els_rsp { 343*3d19cdaeSstevel struct la_els_logi logi; 344*3d19cdaeSstevel struct la_els_logo logo; 345*3d19cdaeSstevel struct la_els_prli prli; 346*3d19cdaeSstevel struct la_els_adisc adisc; 347*3d19cdaeSstevel uchar_t rsp[FCP_MAX_RSP_IU_SIZE]; 348*3d19cdaeSstevel }; 349*3d19cdaeSstevel 350*3d19cdaeSstevel struct sf_hp_elem { 351*3d19cdaeSstevel struct sf_hp_elem *next; 352*3d19cdaeSstevel dev_info_t *dip; 353*3d19cdaeSstevel int what; 354*3d19cdaeSstevel struct sf_target *target; 355*3d19cdaeSstevel struct sf *sf; 356*3d19cdaeSstevel }; 357*3d19cdaeSstevel #define SF_ONLINE 0 358*3d19cdaeSstevel #define SF_OFFLINE 1 359*3d19cdaeSstevel 360*3d19cdaeSstevel 361*3d19cdaeSstevel #define ADDR2SF(ap) (struct sf *)((ap)->a_hba_tran->tran_hba_private) 362*3d19cdaeSstevel #define ADDR2TARGET(ap) (struct sf_target *)((ap)->a_hba_tran->\ 363*3d19cdaeSstevel tran_tgt_private) 364*3d19cdaeSstevel #define SF_ONLINE_TIMEOUT 180 365*3d19cdaeSstevel #define SF_OFFLINE_TIMEOUT 45 366*3d19cdaeSstevel #define SF_RESET_TIMEOUT 10 367*3d19cdaeSstevel #define SF_ELS_TIMEOUT 5 368*3d19cdaeSstevel #define SF_INVALID_TIMEOUT 0x7fffffff 369*3d19cdaeSstevel #define SF_FCP_TIMEOUT 30 370*3d19cdaeSstevel #define SF_BSY_TIMEOUT 10 371*3d19cdaeSstevel #define SF_ABORT_TIMEOUT 10000000 /* in usec */ 372*3d19cdaeSstevel #define SF_POLL_TIMEOUT 60 373*3d19cdaeSstevel #define SF_TARGET_RESET_DELAY 250000 /* in usec */ 374*3d19cdaeSstevel 375*3d19cdaeSstevel #define SF_DECR_DELTA 5 376*3d19cdaeSstevel #define SF_INCR_DELTA 5 377*3d19cdaeSstevel 378*3d19cdaeSstevel #define SF_LO_CMD_DELTA 512 379*3d19cdaeSstevel #define SF_HI_CMD_DELTA 256 380*3d19cdaeSstevel 381*3d19cdaeSstevel #define SF_ELS_RETRIES 4 382*3d19cdaeSstevel #define SF_BSY_RETRIES 7 383*3d19cdaeSstevel 384*3d19cdaeSstevel #define SF_INIT_WAIT_TIMEOUT 60000000 385*3d19cdaeSstevel #define SF_CORE_CMD_TIMEOUT 0x01 386*3d19cdaeSstevel #define SF_CORE_BAD_ABORT 0x02 387*3d19cdaeSstevel #define SF_CORE_ABORT_TIMEOUT 0x04 388*3d19cdaeSstevel #define SF_CORE_ELS_TIMEOUT 0x08 389*3d19cdaeSstevel #define SF_CORE_ELS_FAILED 0x10 390*3d19cdaeSstevel #define SF_CORE_LILP_FAILED 0x20 391*3d19cdaeSstevel #define SF_CORE_OFFLINE_TIMEOUT 0x40 392*3d19cdaeSstevel #define SF_CORE_LIP_FAILED 0x80 393*3d19cdaeSstevel #define SF_CORE_OFFLINE_TARGET 0x100 394*3d19cdaeSstevel #define SF_CORE_INCOMPLETE_DMA 0x200 395*3d19cdaeSstevel #define SF_CORE_REPORTLUN_TIMEOUT 0x400 396*3d19cdaeSstevel #define SF_CORE_INQUIRY_TIMEOUT 0x800 397*3d19cdaeSstevel #define SF_CORE_BAD_DMA 0x1000 398*3d19cdaeSstevel 399*3d19cdaeSstevel #define SF_BAD_DMA_MAGIC 0xdeafbead 400*3d19cdaeSstevel 401*3d19cdaeSstevel #define TRUE 1 402*3d19cdaeSstevel #define FALSE 0 403*3d19cdaeSstevel #define UNDEFINED -1 404*3d19cdaeSstevel 405*3d19cdaeSstevel 406*3d19cdaeSstevel /* 407*3d19cdaeSstevel * The initiator must allocate a minimum of 16 bytes for the response 408*3d19cdaeSstevel * to the REPORT_LUNS command. Since there is 8 bytes of overhead and 409*3d19cdaeSstevel * each LUN is 4 bytes, this means that the minimum size is 2 LUNs. We 410*3d19cdaeSstevel * will define the structure that way to prevent any spurious check 411*3d19cdaeSstevel * conditions. 412*3d19cdaeSstevel * 413*3d19cdaeSstevel * There is no maximum size for the response. 414*3d19cdaeSstevel * 415*3d19cdaeSstevel * By default we support 256 LUNs for the moment, which means 256*8+16 416*3d19cdaeSstevel * or 2064 bytes total size. 417*3d19cdaeSstevel */ 418*3d19cdaeSstevel 419*3d19cdaeSstevel #define REPORT_LUNS_MIN_LUNS 2 420*3d19cdaeSstevel #define REPORT_LUNS_DEFAULT 256 421*3d19cdaeSstevel #define REPORT_LUNS_SIZE ((REPORT_LUNS_DEFAULT)*sizeof (uint32_t) \ 422*3d19cdaeSstevel +2*sizeof (uint32_t)) 423*3d19cdaeSstevel 424*3d19cdaeSstevel /* 425*3d19cdaeSstevel * SCSI Report_Luns Data 426*3d19cdaeSstevel * 427*3d19cdaeSstevel * Format of data returned as a result of an REPORT_LUNS command. 428*3d19cdaeSstevel * 429*3d19cdaeSstevel */ 430*3d19cdaeSstevel 431*3d19cdaeSstevel struct scsi_report_luns { 432*3d19cdaeSstevel /* Number of bytes of data the target has available to send. */ 433*3d19cdaeSstevel uint32_t lun_list_len; 434*3d19cdaeSstevel uint32_t reserved; 435*3d19cdaeSstevel uint64_t lun[REPORT_LUNS_MIN_LUNS]; 436*3d19cdaeSstevel }; 437*3d19cdaeSstevel 438*3d19cdaeSstevel #endif /* _KERNEL */ 439*3d19cdaeSstevel 440*3d19cdaeSstevel #ifdef __cplusplus 441*3d19cdaeSstevel } 442*3d19cdaeSstevel #endif 443*3d19cdaeSstevel 444*3d19cdaeSstevel #endif /* _SYS_SCSI_ADAPTERS_SFVAR_H */ 445