/**/ /***************************************************************************/ /** **/ /** © Copyright 2010, Hewlett-Packard Development Company, L.P. **/ /** **/ /** Confidential computer software. Valid license from HP and/or **/ /** its subsidiaries required for possession, use, or copying. **/ /** **/ /** Consistent with FAR 12.211 and 12.212, Commercial Computer Software, **/ /** Computer Software Documentation, and Technical Data for Commercial **/ /** Items are licensed to the U.S. Government under vendor's standard **/ /** commercial license. **/ /** **/ /** Neither HP nor any of its subsidiaries shall be liable for technical **/ /** or editorial errors or omissions contained herein. The information **/ /** in this document is provided "as is" without warranty of any kind and **/ /** is subject to change without notice. The warranties for HP products **/ /** are set forth in the express limited warranty statements accompanying **/ /** such products. Nothing herein should be construed as constituting an **/ /** additional warranty. **/ /** **/ /***************************************************************************/ /********************************************************************************************************************************/ /* Created: 30-Mar-2010 17:25:47 by OpenVMS SDL EV3-3 */ /* Source: 28-APR-2008 15:22:53 $1$DGA7274:[LIB_H.SRC]SCDTDEF.SDL;1 */ /********************************************************************************************************************************/ /*** MODULE $SCDTDEF ***/ #ifndef __SCDTDEF_LOADED #define __SCDTDEF_LOADED 1 #pragma __nostandard /* This file uses non-ANSI-Standard features */ #pragma __member_alignment __save #pragma __nomember_alignment #ifdef __INITIAL_POINTER_SIZE /* Defined whenever ptr size pragmas supported */ #pragma __required_pointer_size __save /* Save the previously-defined required ptr size */ #pragma __required_pointer_size __short /* And set ptr size default to 32-bit pointers */ #endif #ifdef __cplusplus extern "C" { #define __unknown_params ... #define __optional_params ... #else #define __unknown_params #define __optional_params ... #endif #ifndef __struct #if !defined(__VAXC) #define __struct struct #else #define __struct variant_struct #endif #endif #ifndef __union #if !defined(__VAXC) #define __union union #else #define __union variant_union #endif #endif /*+ */ /* SCDT - SCSI Connection Descriptor Table */ /* */ /* One SCDT is used per SCSI connection. A connection is a logical link */ /* between a class driver UCB and a device on the SCSI bus. The SCDT */ /* contains the entire context of a connection between a class driver */ /* (SYSAP) and a device on the SCSI bus. */ /* */ /* SCDT's are created by port drivers when class drivers call port driver's */ /* connect entry point. The class driver has no access to this data structure. */ /* The SCDT is used exclusively by the port driver. */ /* */ /* ***NOTE1:**** New SCDT fields must be entered at the end of the data structure. */ /* */ /* ***NOTE2:**** If an INCOMPATIBLE CHANGE is made to this structure bump */ /* the version number of this structure. */ /*- */ #include /* */ /* Performance Matrix (PM) */ /* */ /* Description */ /* */ /* We want to define a 2-dimensional array in which to count commands */ /* which complete successfully having transferred certain amounts of data */ /* in certain amounts of time. Because the C compiler must know a matrix's */ /* X dimension in order to reference the correct [X][Y] cell, this is most */ /* easily done with a fixed-sized array; since at this point we don't see */ /* a need for the time or LBC ranges to be variable, there's no reason we */ /* can't establish these values now - so the reference will be like this: */ /* */ /* matrix [time-range-index] [lbc-range-index] */ /* */ /* Time Slice Ranges (columns) */ /* =========================== */ /* */ /* We're interested in the range of times from 0 to 8 seconds. Because the */ /* time increments are small but the time spread is large (due to the fine */ /* granulatity of our basic unit, which is 1us) we're mapping a big number */ /* of potential time values into a small number of time range slots. The */ /* algorithm chosen to do this is one which we think the compiler can */ /* optimize fairly well, and will yield the following time slices: */ /* */ /* [X] Time >= [X] Time >= */ /* === ======= === ======= */ /* [000] 1.000000 us [012] 4.000000 ms */ /* [001] 2.000000 us [013] 8.000000 ms */ /* [002] 4.000000 us [014] 16.000000 ms */ /* [003] 8.000000 us [015] 32.000000 ms */ /* [004] 16.000000 us [016] 64.000000 ms */ /* [005] 32.000000 us [017] 128.000000 ms */ /* [006] 64.000000 us [018] 256.000000 ms */ /* [007] 128.000000 us [019] 512.000000 ms */ /* [008] 256.000000 us [020] 1.000000 sec */ /* [009] 512.000000 us [021] 2.000000 sec */ /* [010] 1.000000 ms [022] 4.000000 sec */ /* [011] 2.000000 ms */ /* */ /* Each I/O which is counted in a given column took no *less* than that */ /* column's amount of time to complete; for instance, an I/O counted in */ /* column 3 took at least 8 us to complete: 8us <= t < 16us. If we ever */ /* need to see sub-us times we'll have to change this algorithm. Note */ /* that because these are minimums we don't have to have an element for */ /* the highest value - it's implied that I/O counted in the last column */ /* all took between 4 s and our maximum (8 seconds) */ /* */ /* Logical Block Count Ranges (rows) */ /* ================================= */ /* */ /* We're interested in LBCs from 1 to 256. There's an assumption that no */ /* request which completes successfully will have a zero transfer count, */ /* so no special checking will be performed to ensure that we don't count */ /* such a completion. We'll ignore any request which completes with a */ /* transfer count of more than 256d blocks. We're making this maximum */ /* transfer size a constant based on but independent of a port's */ /* maximum I/O size. What we know about an I/O counted in any given row */ /* is that it transferred no more than the number of blocks shown. For */ /* instance, an I/O counted in row 5 transferred up to 32d blocks, */ /* inclusive: 16 < LBC <= 32. The difference in logic between this and */ /* the time dimension is that we're mapping a fairly small number of */ /* blocks to a smaller number of cells for LBCs, so they can be done */ /* quickly with a table lookup. However, we could adjust the table so */ /* the same logic as the time dimension holds for LBCs */ /* */ /* [Y] LBC <= [Y] LBC <= */ /* === ====== === ====== */ /* [0] 001 [5] 032 */ /* [1] 002 [6] 064 */ /* [2] 004 [7] 128 */ /* [3] 008 [8] 256 */ /* [4] 016 */ /* */ #define PM$C_MAX_TIME_100NS 80000000 /* Maximum time logged, in unadjusted units */ #define PM$C_MAX_TIME_US 8000000 /* Maximum byte count logged, including pad bytes */ #define PM$C_MAX_BCNT 131072 /* Maximum block count logged - note assumed block size */ #define PM$C_MAX_LBC 256 /* Number of columns in the matrix */ #define PM$C_TIME_X 23 /* Number of rows in the matrix */ #define PM$C_LBC_Y 9 /* Define columns first ... */ #if !defined(__NOBASEALIGN_SUPPORT) && !defined(__cplusplus) /* If using pre DECC V4.0 or C++ */ #pragma __nomember_alignment __quadword #else #pragma __nomember_alignment #endif typedef struct _pm { /* 1s in EXE$GQ_SYSTIME (100ns) ticks */ /* Maximum time logged, in unadjusted units */ #pragma __nomember_alignment __struct { /* ... then define rows */ unsigned int pm$l_lbc [9]; } pm$r_time [23]; char pm$b_fill_0_ [4]; } PM; #if !defined(__VAXC) #define pm$l_lbc pm$l_lbc #endif /* #if !defined(__VAXC) */ /* */ /* We use a pointer to the performance data so that we don't have multiple copies */ /* for a multipath disk. We just want to gather the performance data on a per lun basis. */ /* */ #if !defined(__NOBASEALIGN_SUPPORT) && !defined(__cplusplus) /* If using pre DECC V4.0 or C++ */ #pragma __nomember_alignment __quadword #else #pragma __nomember_alignment #endif typedef struct _pm_data { unsigned __int64 pm_data$q_read_time_acc; /*F Read command execution time accumulator (us) */ unsigned __int64 pm_data$q_write_time_acc; /*F Write command execution time accumulator (us) */ #pragma __nomember_alignment unsigned int pm_data$l_reads; /*F Number of 6- or 10-byte Read commands */ unsigned int pm_data$l_writes; /*F Number of 6- or 10-byte Write commands */ unsigned int pm_data$l_blocks_read; /*F Number of blocks read */ unsigned int pm_data$l_blocks_written; /*F Number of blocks written */ unsigned int pm_data$l_use_rscc; /*F Boolean true if RSCC timer is used, otherwise use systime */ PM pm_data$r_rd_pm; /*F Performance Matrix for reads */ PM pm_data$r_wr_pm; /*F Performance Matrix for writes */ char pm_data$b_fill_1_ [4]; } PM_DATA; #define SCDT$C_VERSION 10 /* Compatible Version Number. */ #define SCDT$C_STATE_CLOSED 0 /*O Closed */ #define SCDT$C_STATE_OPEN 1 /*O Open */ #define SCDT$C_STATE_FAIL 2 /*O Connect Failed */ #define SCDT$M_CAP_SCSI_2 0x1 #define SCDT$M_CAP_SCSI_3 0x2 #define SCDT$M_CAP_CMDQ 0x4 #define SCDT$M_CAP_FREEZEQ 0x8 #define SCDT$M_CAP_FLUSHQ 0x10 #define SCDT$M_CAP_CLASS_DRIVER_ACA 0x20 #define SCDT$S_FBLOCK 48 /* Old FBLOCK size name */ /* */ #define SCDT$M_CFLG_ENA_DISCON 0x1 #define SCDT$M_CFLG_DIS_RETRY 0x2 #define SCDT$M_CFLG_TARGET_MODE 0x4 #define SCDT$M_ISTS_SDTR_SENT 0x1 #define SCDT$M_ISTS_DID_RESET_CALLBACK 0x2 #define SCDT$M_ISTS_PORT_GO_CREDITS 0x4 #define SCDT$M_ISTS_PORT_SPEC_3 0x8 #define SCDT$M_ISTS_PORT_SPEC_4 0x10 #define SCDT$M_ISTS_PORT_SPEC_5 0x20 #define SCDT$M_QF_QUEUED_ACA 0x1 #define SCDT$M_QF_QUEUE_TIMER_RUNNING 0x2 #define SCDT$M_QF_NO_DEV_IO_CREDITS 0x4 #define SCDT$M_QF_NOT_QUEUED 0x8 #define SCDT$M_DQF_ACA_ACTIVE 0x1 #define SCDT$M_DQF_FLUSHING_QUEUE 0x2 #define SCDT$M_DQF_QUEUE_FULL 0x4 #define SCDT$M_DQF_QUEUE_FULL_INIT 0x8 #define SCDT$M_DQF_QUEUE_WAIT 0x10 #define SCDT$M_DQF_CLASS_DRVR_FREEZE_Q 0x20 #define SCDT$M_DQF_QUEUE_FLUSH_ACTIVE 0x40 #define SCDT$K_MAX_QUEUE_DEPTH 160 /* Absolute maximum queue depth allowed. */ #define SCDT$K_MAX_TAG 256 /* Number of tags in bit map. */ #define SCDT$C_LENGTH 440 /* Length of SCDT */ #define SCDT$S_SCDTDEF 440 /* Old size name, synonym for SCDT$S_SCDT */ #ifdef __cplusplus /* Define structure prototypes */ struct _spdt; struct _stdt; struct _inquiry_data; struct _ucb; struct _tqe; #endif /* #ifdef __cplusplus */ #if !defined(__NOBASEALIGN_SUPPORT) && !defined(__cplusplus) /* If using pre DECC V4.0 or C++ */ #pragma __nomember_alignment __quadword #else #pragma __nomember_alignment #endif typedef struct _scdt { #pragma __nomember_alignment unsigned short int scdt$w_scdt_type; /*O Type of SCDT */ unsigned short int scdt$w_state; /*O Connection State */ __union { unsigned int scdt$is_capability; /* Connection Capability Mask */ __struct { unsigned scdt$v_cap_scsi_2 : 1; /* Device reports SCSI-2 compliance. */ unsigned scdt$v_cap_scsi_3 : 1; /* Device reports SCSI-3 compliance. */ unsigned scdt$v_cap_cmdq : 1; /* Device supports command queuing. */ unsigned scdt$v_cap_freezeq : 1; /* Class driver requests freeze_queue_on_error mode. */ unsigned scdt$v_cap_flushq : 1; /* Class driver requests flush_queue_on_error mode. */ unsigned scdt$v_cap_class_driver_aca : 1; /* Class driver requests control of ACA operations. */ unsigned scdt$v_fill_16_ : 2; } scdt$r_fill_3_; } scdt$r_fill_2_; unsigned short int scdt$w_size; /*I Structure size in bytes */ unsigned char scdt$b_type; /*I SCSI structure type */ unsigned char scdt$b_subtyp; /*I SCSI structure subtype for SCDT */ /* */ /* Define the fork block. */ /* */ char scdt$t_fkb_quad_align_fill [4]; __union { FKB scdt$r_fkb; /*O Embedded quadword aligned fork block */ char scdt$b_flck; /*O For backward compatability with old Bliss/Macro code */ } scdt$r_fkb_overlay; /* Define the structure references. */ /* */ struct _spdt *scdt$ps_spdt; /*I Address of associated PORT descriptor table */ struct _stdt *scdt$ps_stdt; /*I Pointer to the STDT. */ void *scdt$ps_hash_flink; /*F Forward link on SCDT hash list. */ void *scdt$ps_scdrp_map; /*I List of SCDRPs indexed by tag value for reselection. */ /* */ /* Define the class driver callbacks. */ /* */ int (*scdt$l_sel_callback)(); /*I Address of Class driver callback. */ unsigned int scdt$l_sel_context; /*I Context for Class driver callback. */ int (*scdt$ps_port_state_callback)(); /*I Class driver call back for PORT_STATE specified with SPI$CONNECT. */ unsigned int scdt$l_port_state_context; /*I Context for Port State callback. */ /* */ /* ITL specific information. */ /* */ __union { /*I */ unsigned int scdt$l_scsi_lun; /*I Create quadword overlay for - */ unsigned __int64 scdt$q_scsi_lun; /*I wide devices or high SCSI ID's */ } scdt$r_scsi_lun_overlay; /*I */ __int64 scdt$iq_in_nex; /*I ITL Nexus Descriptor Table Entry contents */ unsigned int scdt$l_dma_timeout; /*I Time in seconds for a DMA timeout. */ unsigned int scdt$l_discon_timeout; /*I Time in seconds for a disconnect to timeout. */ unsigned int scdt$is_busy_retry_cnt; /*I Number retries left, for bus busy. */ unsigned int scdt$is_arb_retry_cnt; /*I Number of retries left, for arbitration failures. */ unsigned int scdt$is_sel_retry_cnt; /*I Number of retries left, for selection failures. */ unsigned int scdt$is_cmd_retry_cnt; /*I Number of times the port will retry a command. */ /* */ /* Set Connection Characteristic Information */ /* */ __union { unsigned int scdt$is_con_flags; /*I Connection Specific Flags. */ __struct { unsigned scdt$v_cflg_ena_discon : 1; /*I Enable disconnect */ unsigned scdt$v_cflg_dis_retry : 1; /*I Disable retry on command fail. */ unsigned scdt$v_cflg_target_mode : 1; /*I Target mode supported */ unsigned scdt$v_fill_17_ : 5; } scdt$r_fill_5_; } scdt$r_fill_4_; __union { unsigned int scdt$is_impl_sts; /*F Implementation specific connection sts */ __struct { unsigned scdt$v_ists_sdtr_sent : 1; /*O If SDTR_SENT bit is set, it means for */ /* this target/LUN, we already sent SDTR */ /* message to negotiate sync. xfer mode */ unsigned scdt$v_ists_did_reset_callback : 1; /*F Used by SCSI2COMMON to remember that we */ /* have already told the class driver that a */ /* reset is in progress. */ unsigned scdt$v_ists_port_go_credits : 1; /*F Port restarting class driver for I/O credits */ unsigned scdt$v_ists_port_spec_3 : 1; /* Define some bits for port-specific use and name */ unsigned scdt$v_ists_port_spec_4 : 1; /* them so as to make this intention clear. The # */ unsigned scdt$v_ists_port_spec_5 : 1; /* of each bit happens to be it's bit offset */ unsigned scdt$v_fill_18_ : 2; } scdt$r_fill_7_; } scdt$r_fill_6_; /* */ /* Queuing specific data. */ /* */ __union { unsigned int scdt$is_queue_flags; /*F Bitmap of flags used to manage the port queue state. */ __struct { unsigned scdt$v_qf_queued_aca : 1; /*F ACA I/O on head of queue. */ unsigned scdt$v_qf_queue_timer_running : 1; /*F Queue full timer is running. */ unsigned scdt$v_qf_no_dev_io_credits : 1; /*F The port's device I/O queue has no remaining credits */ unsigned scdt$v_qf_not_queued : 1; /*F At least 1 Not-Queued request is pending or active */ unsigned scdt$v_fill_19_ : 4; } scdt$r_fill_9_; } scdt$r_fill_8_; __union { unsigned int scdt$is_dipl_queue_flags; /*S Bitmap of flags used to manage the port queue state. */ __struct { unsigned scdt$v_dqf_aca_active : 1; /*S Queued command terminated with a check condition. */ unsigned scdt$v_dqf_flushing_queue : 1; /*F The device and port queues are being flushed. */ unsigned scdt$v_dqf_queue_full : 1; /*S The device's queue is full. */ unsigned scdt$v_dqf_queue_full_init : 1; /*S Initialize queue full processing. */ unsigned scdt$v_dqf_queue_wait : 1; /*S Queue processing is waiting for device I/O completion. */ unsigned scdt$v_dqf_class_drvr_freeze_q : 1; /*S Class driver requested that the queue be frozen. */ unsigned scdt$v_dqf_queue_flush_active : 1; /*S Queue flush active is active */ unsigned scdt$v_fill_20_ : 1; } scdt$r_fill_11_; } scdt$r_fill_10_; unsigned int scdt$is_sequence; /*O Sequence ID assigned to a new I/O. */ unsigned int scdt$is_next_sequence; /*O Next sequence ID expected to be sent by the port driver. */ /* */ /* SCSI-2 Congestion Control information. Used for queue full message processing. */ /* */ unsigned int scdt$is_queued_io_count; /*F The number of SCSI commands queued following the command that */ /* received the queue full condition. */ unsigned int scdt$is_max_queue_depth; /*F Maximum queue depth for the port. */ unsigned int scdt$is_current_queue_depth; /*F Current queue depth for the port. */ /* Fast growth if CURRENT_QUEUE_DEPTH < QUEUE_DEPTH_THRESHOLD */ /* Slow growth if CURRENT_QUEUE_DEPTH > QUEUE_DEPTH_THRESHOLD */ unsigned int scdt$is_queue_depth_threshold; /*F Queue depth threshold. */ #if !defined(__NOBASEALIGN_SUPPORT) && !defined(__cplusplus) /* If using pre DECC V4.0 or C++ */ #pragma __nomember_alignment __quadword #else #pragma __nomember_alignment #endif __int64 scdt$q_cmd_complete_time; /*F Average time to complete a command. */ #pragma __nomember_alignment __int64 scdt$q_cmd_complete_deviation; /*F Deviation in the time to complete a command. */ __int64 scdt$q_cmd_complete_delay; /*F The delay required to ensure that an average command could complete. */ unsigned int scdt$is_cmd_success_count; /*F The number of commands that have successfully completed. */ /* if CMD_SUCCESS_COUNT >= CMD_SUCCESS_THRESHOLD */ /* Increment CURRENT_QUEUE_DEPTH; */ /* CMD_SUCCESS_COUNT = 0; */ unsigned int scdt$is_cmd_success_threshold; /*F Threshold to be crossed before incrementing CURRENT_QUEUE_DEPTH. */ /* */ /* Queue Manager information. */ /* */ void *scdt$ps_port_qfl; /*F Forward link of queue of I/O sent to the port. */ void *scdt$ps_port_qbl; /*F Backward link of queue of I/O sent to the port. */ void *scdt$ps_dev_qfl; /*F Forward link of queue of requests sent to the device. */ void *scdt$ps_dev_qbl; /*F Backward link of queue of requests sent to the device. */ unsigned int scdt$is_total_io_count; /*F Total outstanding I/O count (port & device). */ unsigned int scdt$is_port_io_count; /*F Count of I/Os outstanding on the port. */ unsigned int scdt$is_dev_io_count; /*F Count of I/Os outstanding on the device. */ unsigned int scdt$is_hash_index; /*F Index of this SCDT's root SCDT in the STDT hash table */ /* */ /* Port connection performance and error counters. */ /* */ unsigned int scdt$l_arb_fail_cnt; /*S Count of arbitration failures. */ unsigned int scdt$l_sel_fail_cnt; /*S Count of selection failures. */ unsigned int scdt$l_parerr_cnt; /*S Count of parity errors. */ unsigned int scdt$l_misphs_cnt; /*S Count of missing phases errors. */ unsigned int scdt$l_badphs_cnt; /*S Count of bad phase errors. */ unsigned int scdt$l_retry_cnt; /*S Count of retries, this on connection. */ unsigned int scdt$l_ctlerr_cnt; /*S Count of controller errors */ unsigned int scdt$l_buserr_cnt; /*S Count of bus errors */ unsigned int scdt$l_cmdsent; /*S Number of commands sent */ unsigned int scdt$l_msgsent; /*S Number of messages sent */ unsigned int scdt$l_bytsent; /*S Number of bytes sent during dataout */ /* */ /* Allocation bit map for tag values, and associated values. */ /* */ unsigned int scdt$is_wait_tag; /*F Tag value associated with a non-queued request. */ unsigned int scdt$is_max_tag_used; /*F Maximum tag value used, performance metric. */ /* Maximum tag value allowed: ( 0 - 255 ) */ /* Maximum longwords for the tag allocation bit map. */ unsigned int scdt$is_tag_map [8]; /*F Bitmap of allocated tag values. Bit set => value in use. */ unsigned int scdt$is_last_tag_index; /*F Last tag value allocated */ struct _inquiry_data *scdt$ps_inquiry_data; /* Pointer to Inquiry data */ struct _ucb *scdt$ps_class_ucb; /* Pointer to class driver UCB */ /* */ /* Save some space for future expansion. Reserved to Digital, ALPHA/VMS development. */ /* */ int scdt$l_rsvd_long [5]; /*F Port specific space that may be used for any purpose. */ char scdt$b_quad_fill [4]; /*F Quadword-align the FastPath fields /* FP */ void *scdt$ps_fp_dev_qfl; /*F FastPath device queue forward link /* FP */ void *scdt$ps_fp_dev_qbl; /*F FastPath device queue backward link /* FP */ __int64 scdt$iq_fp_dev_io_count; /*F Number of active FastPath requests /* FP */ /* */ /* Save some space for Port specific extensions. */ /* */ __union { int scdt$l_port_specific [5]; /*F Port specific space that may be used for any purpose. */ __int64 scdt$q_identity; /*F Identity quadword */ } scdt$r_port_specific_overlay; /* */ /* These fields are first used in Ruby (V7.3-1). Since we do not have the */ /* option of forcing 3rd-party class driver recompiles in a dash release, */ /* these fields are being added to the tail of the structure. It would be */ /* a good idea to move them to before the port-specific overlays in the */ /* next dot release */ /* */ struct _scdt *scdt$ps_scdt_link; /*F Link to next SCDT connected to same STDT */ unsigned int scdt$l_suspensions; /*F Number of outstanding pauses/suspensions */ struct _tqe *scdt$ps_busy_tqe; /*F Pointer to TQE used to implement a BUSY stall */ /*F X-27 */ struct _pm_data *scdt$ps_pm_data; /*F Pointer to common performance data for each LUN */ /* An HBA will sometimes require the LUN it uses to be formatted */ /* differently than is expected in the SCSI_LUN field by the OpenVMS */ /* Exec. For instance, the ISP23xx requires the LUN to be shifted */ /* down (right) 8 bits, while the ISP24xx requires the full quadword */ /* LUN but in big-endian order (LSB at high byte). To avoid having */ /* to reformat the LUN for every single SCSI command which is issued */ /* some drivers may choose to do the formatting once into this field */ /* when the device is initially configured */ /* X-28 */ char scdt$b_fill_21_ [4]; #if !defined(__NOBASEALIGN_SUPPORT) && !defined(__cplusplus) /* If using pre DECC V4.0 or C++ */ #pragma __nomember_alignment __quadword #else #pragma __nomember_alignment #endif __union { #pragma __nomember_alignment __int64 scdt$q_lun; /* LUN as quadword */ __struct { int scdt$l_lun; /* LUN as longword */ short int scdt$w_lun; /* LUN as word */ char scdt$b_lun; /* LUN as byte */ } scdt$r_fill_13_; } scdt$r_fill_12_; /* End union */ /* X-28 */ #if !defined(__NOBASEALIGN_SUPPORT) && !defined(__cplusplus) /* If using pre DECC V4.0 or C++ */ #pragma __nomember_alignment __quadword #else #pragma __nomember_alignment #endif __union { #pragma __nomember_alignment __int64 scdt$q_credit_io_count; /* Credit I/O count as quadword */ __struct { int scdt$is_credit_io_count; /* Number of I/Os waiting for credit */ } scdt$r_fill_15_; } scdt$r_fill_14_; /* End union */ /* X-28 */ #if !defined(__NOBASEALIGN_SUPPORT) && !defined(__cplusplus) /* If using pre DECC V4.0 or C++ */ #pragma __nomember_alignment __quadword #else #pragma __nomember_alignment #endif __struct { /* Credit wait queue */ #pragma __nomember_alignment void *scdt$ps_credit_wqfl; /* Credit wait queue forward link */ void *scdt$ps_credit_wqbl; /* Credit wait queue backward link */ } scdt$r_credit_wq; /* */ /* Define the length of this structure. */ /* */ } SCDT; #if !defined(__VAXC) #define scdt$is_capability scdt$r_fill_2_.scdt$is_capability #define scdt$v_cap_scsi_2 scdt$r_fill_2_.scdt$r_fill_3_.scdt$v_cap_scsi_2 #define scdt$v_cap_scsi_3 scdt$r_fill_2_.scdt$r_fill_3_.scdt$v_cap_scsi_3 #define scdt$v_cap_cmdq scdt$r_fill_2_.scdt$r_fill_3_.scdt$v_cap_cmdq #define scdt$v_cap_freezeq scdt$r_fill_2_.scdt$r_fill_3_.scdt$v_cap_freezeq #define scdt$v_cap_flushq scdt$r_fill_2_.scdt$r_fill_3_.scdt$v_cap_flushq #define scdt$v_cap_class_driver_aca scdt$r_fill_2_.scdt$r_fill_3_.scdt$v_cap_class_driver_aca #define scdt$r_fkb scdt$r_fkb_overlay.scdt$r_fkb #define scdt$b_flck scdt$r_fkb_overlay.scdt$b_flck #define scdt$l_scsi_lun scdt$r_scsi_lun_overlay.scdt$l_scsi_lun #define scdt$q_scsi_lun scdt$r_scsi_lun_overlay.scdt$q_scsi_lun #define scdt$is_con_flags scdt$r_fill_4_.scdt$is_con_flags #define scdt$v_cflg_ena_discon scdt$r_fill_4_.scdt$r_fill_5_.scdt$v_cflg_ena_discon #define scdt$v_cflg_dis_retry scdt$r_fill_4_.scdt$r_fill_5_.scdt$v_cflg_dis_retry #define scdt$v_cflg_target_mode scdt$r_fill_4_.scdt$r_fill_5_.scdt$v_cflg_target_mode #define scdt$is_impl_sts scdt$r_fill_6_.scdt$is_impl_sts #define scdt$v_ists_sdtr_sent scdt$r_fill_6_.scdt$r_fill_7_.scdt$v_ists_sdtr_sent #define scdt$v_ists_did_reset_callback scdt$r_fill_6_.scdt$r_fill_7_.scdt$v_ists_did_reset_callback #define scdt$v_ists_port_go_credits scdt$r_fill_6_.scdt$r_fill_7_.scdt$v_ists_port_go_credits #define scdt$v_ists_port_spec_3 scdt$r_fill_6_.scdt$r_fill_7_.scdt$v_ists_port_spec_3 #define scdt$v_ists_port_spec_4 scdt$r_fill_6_.scdt$r_fill_7_.scdt$v_ists_port_spec_4 #define scdt$v_ists_port_spec_5 scdt$r_fill_6_.scdt$r_fill_7_.scdt$v_ists_port_spec_5 #define scdt$is_queue_flags scdt$r_fill_8_.scdt$is_queue_flags #define scdt$v_qf_queued_aca scdt$r_fill_8_.scdt$r_fill_9_.scdt$v_qf_queued_aca #define scdt$v_qf_queue_timer_running scdt$r_fill_8_.scdt$r_fill_9_.scdt$v_qf_queue_timer_running #define scdt$v_qf_no_dev_io_credits scdt$r_fill_8_.scdt$r_fill_9_.scdt$v_qf_no_dev_io_credits #define scdt$v_qf_not_queued scdt$r_fill_8_.scdt$r_fill_9_.scdt$v_qf_not_queued #define scdt$is_dipl_queue_flags scdt$r_fill_10_.scdt$is_dipl_queue_flags #define scdt$v_dqf_aca_active scdt$r_fill_10_.scdt$r_fill_11_.scdt$v_dqf_aca_active #define scdt$v_dqf_flushing_queue scdt$r_fill_10_.scdt$r_fill_11_.scdt$v_dqf_flushing_queue #define scdt$v_dqf_queue_full scdt$r_fill_10_.scdt$r_fill_11_.scdt$v_dqf_queue_full #define scdt$v_dqf_queue_full_init scdt$r_fill_10_.scdt$r_fill_11_.scdt$v_dqf_queue_full_init #define scdt$v_dqf_queue_wait scdt$r_fill_10_.scdt$r_fill_11_.scdt$v_dqf_queue_wait #define scdt$v_dqf_class_drvr_freeze_q scdt$r_fill_10_.scdt$r_fill_11_.scdt$v_dqf_class_drvr_freeze_q #define scdt$v_dqf_queue_flush_active scdt$r_fill_10_.scdt$r_fill_11_.scdt$v_dqf_queue_flush_active #define scdt$l_port_specific scdt$r_port_specific_overlay.scdt$l_port_specific #define scdt$q_identity scdt$r_port_specific_overlay.scdt$q_identity #define scdt$q_lun scdt$r_fill_12_.scdt$q_lun #define scdt$l_lun scdt$r_fill_12_.scdt$r_fill_13_.scdt$l_lun #define scdt$w_lun scdt$r_fill_12_.scdt$r_fill_13_.scdt$w_lun #define scdt$b_lun scdt$r_fill_12_.scdt$r_fill_13_.scdt$b_lun #define scdt$q_credit_io_count scdt$r_fill_14_.scdt$q_credit_io_count #define scdt$is_credit_io_count scdt$r_fill_14_.scdt$r_fill_15_.scdt$is_credit_io_count #define scdt$ps_credit_wqfl scdt$r_credit_wq.scdt$ps_credit_wqfl #define scdt$ps_credit_wqbl scdt$r_credit_wq.scdt$ps_credit_wqbl #endif /* #if !defined(__VAXC) */ #pragma __member_alignment __restore #ifdef __INITIAL_POINTER_SIZE /* Defined whenever ptr size pragmas supported */ #pragma __required_pointer_size __restore /* Restore the previously-defined required ptr size */ #endif #ifdef __cplusplus } #endif #pragma __standard #endif /* __SCDTDEF_LOADED */