Print this page
usr/src/common/zfs/zprop_common.c
   1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */

  21 /*
  22  * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
  23  */

  24 /*
  25  * Copyright 2011 cyril.galibern@opensvc.com
  26  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
  27  */
  28 
  29 #ifndef _SYS_SCSI_TARGETS_SDDEF_H
  30 #define _SYS_SCSI_TARGETS_SDDEF_H
  31 
  32 #include <sys/dktp/fdisk.h>
  33 #include <sys/note.h>
  34 #include <sys/mhd.h>
  35 #include <sys/cmlb.h>
  36 
  37 #ifdef  __cplusplus
  38 extern "C" {
  39 #endif
  40 
  41 
  42 #if defined(_KERNEL) || defined(_KMEMUSER)
  43 
  44 
  45 #define SD_SUCCESS              0
  46 #define SD_FAILURE              (-1)
  47 
  48 #if defined(TRUE)
  49 #undef TRUE
  50 #endif
  51 
  52 #if defined(FALSE)
  53 #undef FALSE
  54 #endif
  55 
  56 #define TRUE                    1
  57 #define FALSE                   0
  58 
  59 #if defined(VERBOSE)
  60 #undef VERBOSE
  61 #endif
  62 
  63 #if defined(SILENT)
  64 #undef SILENT
  65 #endif
  66 
  67 
  68 /*
  69  *  Fault Injection Flag for Inclusion of Code
  70  *
  71  *  This should only be defined when SDDEBUG is defined
  72  * #if DEBUG || lint
  73  * #define      SD_FAULT_INJECTION
  74  * #endif
  75  */
  76 
  77 #if DEBUG || lint
  78 #define SD_FAULT_INJECTION
  79 #endif
  80 #define VERBOSE                 1
  81 #define SILENT                  0
  82 
  83 /*
  84  * Structures for recording whether a device is fully open or closed.
  85  * Assumptions:
  86  *
  87  *      + There are only 8 (sparc) or 16 (x86) disk slices possible.
  88  *      + BLK, MNT, CHR, SWP don't change in some future release!
  89  */
  90 
  91 #if defined(_SUNOS_VTOC_8)
  92 
  93 #define SDUNIT_SHIFT    3
  94 #define SDPART_MASK     7
  95 #define NSDMAP          NDKMAP
  96 
  97 #elif defined(_SUNOS_VTOC_16)
  98 
  99 /*
 100  * XXX - NSDMAP has multiple definitions, one more in cmlb_impl.h
 101  * If they are coalesced into one, this definition will follow suit.
 102  * FDISK partitions - 4 primary and MAX_EXT_PARTS number of Extended
 103  * Partitions.
 104  */
 105 #define FDISK_PARTS             (FD_NUMPART + MAX_EXT_PARTS)
 106 
 107 #define SDUNIT_SHIFT    6
 108 #define SDPART_MASK     63
 109 #define NSDMAP          (NDKMAP + FDISK_PARTS + 1)
 110 
 111 #else
 112 #error "No VTOC format defined."
 113 #endif
 114 





 115 
 116 #define SDUNIT(dev)     (getminor((dev)) >> SDUNIT_SHIFT)
 117 #define SDPART(dev)     (getminor((dev)) &  SDPART_MASK)
 118 
 119 /*
 120  * maximum number of partitions the driver keeps track of; with
 121  * EFI this can be larger than the number of partitions accessible
 122  * through the minor nodes.  It won't be used for keeping track
 123  * of open counts, partition kstats, etc.
 124  */
 125 #define MAXPART         (NSDMAP + 1)
 126 
 127 /*
 128  * Macro to retrieve the DDI instance number from the given buf struct.
 129  * The instance number is encoded in the minor device number.
 130  */
 131 #define SD_GET_INSTANCE_FROM_BUF(bp)                            \
 132         (getminor((bp)->b_edev) >> SDUNIT_SHIFT)
 133 
 134 
 135 
 136 struct ocinfo {
 137         /*
 138          * Types BLK, MNT, CHR, SWP,
 139          * assumed to be types 0-3.
 140          */
 141         uint64_t  lyr_open[NSDMAP];
 142         uint64_t  reg_open[OTYPCNT - 1];
 143 };
 144 
 145 #define OCSIZE  sizeof (struct ocinfo)
 146 
 147 union ocmap {
 148         uchar_t chkd[OCSIZE];
 149         struct ocinfo rinfo;
 150 };
 151 
 152 #define lyropen rinfo.lyr_open
 153 #define regopen rinfo.reg_open
 154 
 155 
 156 #define SD_CDB_GROUP0           0
 157 #define SD_CDB_GROUP1           1
 158 #define SD_CDB_GROUP5           2
 159 #define SD_CDB_GROUP4           3
 160 
 161 struct sd_cdbinfo {
 162         uchar_t  sc_grpcode;    /* CDB group code */
 163         uchar_t  sc_grpmask;    /* CDB group code mask (for cmd opcode) */
 164         uint64_t sc_maxlba;     /* Maximum logical block addr. supported */
 165         uint32_t sc_maxlen;     /* Maximum transfer length supported */
 166 };
 167 
 168 
 169 
 170 /*
 171  * The following declaration are for Non-512 byte block support for the
 172  * removable devices. (ex - DVD RAM, MO).
 173  * wm_state: This is an enumeration for the different states for
 174  * manipalating write range list during the read-modify-write-operation.
 175  */
 176 typedef enum {
 177         SD_WM_CHK_LIST,         /* Check list for overlapping writes */
 178         SD_WM_WAIT_MAP,         /* Wait for an overlapping I/O to complete */
 179         SD_WM_LOCK_RANGE,       /* Lock the range of lba to be written */
 180         SD_WM_DONE              /* I/O complete */
 181 } wm_state;
 182 
 183 /*
 184  * sd_w_map: Every write I/O will get one w_map allocated for it which will tell
 185  * the range on the media which is being written for that request.
 186  */
 187 struct sd_w_map {
 188         uint_t          wm_start;       /* Write start location */
 189         uint_t          wm_end;         /* Write end location */
 190         ushort_t        wm_flags;       /* State of the wmap */
 191         ushort_t        wm_wanted_count; /* # of threads waiting for region */
 192         void            *wm_private;    /* Used to store bp->b_private */
 193         struct buf      *wm_bufp;       /* to store buf pointer */
 194         struct sd_w_map *wm_next;       /* Forward pointed to sd_w_map */
 195         struct sd_w_map *wm_prev;       /* Back pointer to sd_w_map */
 196         kcondvar_t      wm_avail;       /* Sleep on this, while not available */
 197 };
 198 
 199 _NOTE(MUTEX_PROTECTS_DATA(scsi_device::sd_mutex, sd_w_map::wm_flags))
 200 
 201 
 202 /*
 203  * This is the struct for the layer-private data area for the
 204  * mapblocksize layer.
 205  */
 206 
 207 struct sd_mapblocksize_info {
 208         void            *mbs_oprivate;  /* saved value of xb_private */
 209         struct buf      *mbs_orig_bp;   /* ptr to original bp */
 210         struct sd_w_map *mbs_wmp;       /* ptr to write-map struct for RMW */
 211         ssize_t         mbs_copy_offset;
 212         int             mbs_layer_index;        /* chain index for RMW */
 213 };
 214 
 215 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sd_mapblocksize_info))








 216 



 217 












 218 /*























 219  * sd_lun: The main data structure for a scsi logical unit.
 220  * Stored as the softstate structure for each device.
 221  */
 222 
 223 struct sd_lun {
 224 
 225         /* Back ptr to the SCSA scsi_device struct for this LUN */
 226         struct scsi_device      *un_sd;
 227 
 228         /*
 229          * Support for Auto-Request sense capability
 230          */
 231         struct buf      *un_rqs_bp;     /* ptr to request sense bp */
 232         struct scsi_pkt *un_rqs_pktp;   /* ptr to request sense scsi_pkt */
 233         int     un_sense_isbusy;        /* Busy flag for RQS buf */
 234 
 235         /*
 236          * These specify the layering chains to use with this instance. These
 237          * are initialized according to the values in the sd_chain_index_map[]
 238          * array. See the description of sd_chain_index_map[] for details.


 267         /*
 268          * The number of logical blocks on the target. This is adjusted
 269          * to be in terms of the block size specified by un_sys_blocksize
 270          * (ie, the system block size).
 271          */
 272         uint64_t        un_blockcount;
 273 
 274         /*
 275          * Various configuration data
 276          */
 277         uchar_t un_ctype;               /* Controller type */
 278         char    *un_node_type;          /* minor node type */
 279         uchar_t un_interconnect_type;   /* Interconnect for underlying HBA */
 280 
 281         uint_t  un_notready_retry_count; /* Per disk notready retry count */
 282         uint_t  un_busy_retry_count;    /* Per disk BUSY retry count */
 283 
 284         uint_t  un_retry_count;         /* Per disk retry count */
 285         uint_t  un_victim_retry_count;  /* Per disk victim retry count */
 286 
 287         /* (4356701, 4367306) */
 288         uint_t  un_reset_retry_count; /* max io retries before issuing reset */
 289         ushort_t un_reserve_release_time; /* reservation release timeout */
 290 
 291         uchar_t un_reservation_type;    /* SCSI-3 or SCSI-2 */
 292         uint_t  un_max_xfer_size;       /* Maximum DMA transfer size */
 293         int     un_partial_dma_supported;
 294         int     un_buf_breakup_supported;
 295 
 296         int     un_mincdb;              /* Smallest CDB to use */
 297         int     un_maxcdb;              /* Largest CDB to use */
 298         int     un_max_hba_cdb;         /* Largest CDB supported by HBA */
 299         int     un_status_len;
 300         int     un_pkt_flags;
 301 
 302         /*
 303          * Note: un_uscsi_timeout is a "mirror" of un_cmd_timeout, adjusted
 304          * for ISCD().  Any updates to un_cmd_timeout MUST be reflected
 305          * in un_uscsi_timeout as well!
 306          */
 307         ushort_t un_cmd_timeout;        /* Timeout for completion */


 339         opaque_t        un_mhd_token;           /* scsi watch request */
 340         timeout_id_t    un_resvd_timeid;        /* for resvd recover */
 341 
 342         /* Event callback resources (photon) */
 343         ddi_eventcookie_t un_insert_event;      /* insert event */
 344         ddi_callback_id_t un_insert_cb_id;      /* insert callback */
 345         ddi_eventcookie_t un_remove_event;      /* remove event */
 346         ddi_callback_id_t un_remove_cb_id;      /* remove callback */
 347 
 348         uint_t          un_start_stop_cycle_page;       /* Saves start/stop */
 349                                                         /* cycle page */
 350         timeout_id_t    un_dcvb_timeid;         /* dlyd cv broadcast */
 351 
 352         /*
 353          * Data structures for open counts, partition info, VTOC,
 354          * stats, and other such bookkeeping info.
 355          */
 356         union   ocmap   un_ocmap;               /* open partition map */
 357         struct  kstat   *un_pstats[NSDMAP];     /* partition statistics */
 358         struct  kstat   *un_stats;              /* disk statistics */


 359         kstat_t         *un_errstats;           /* for error statistics */


 360         uint64_t        un_exclopen;            /* exclusive open bitmask */
 361         ddi_devid_t     un_devid;               /* device id */
 362         uint_t          un_vpd_page_mask;       /* Supported VPD pages */
 363 
 364         /*
 365          * Bit fields for various configuration/state/status info.
 366          * Comments indicate the condition if the value of the
 367          * variable is TRUE (nonzero).
 368          */
 369         uint32_t
 370             un_f_arq_enabled            :1,     /* Auto request sense is */
 371                                                 /* currently enabled */
 372             un_f_blockcount_is_valid    :1,     /* The un_blockcount */
 373                                                 /* value is currently valid */
 374             un_f_tgt_blocksize_is_valid :1,     /* The un_tgt_blocksize */
 375                                                 /* value is currently valid */
 376             un_f_allow_bus_device_reset :1,     /* Driver may issue a BDR as */
 377                                                 /* a part of error recovery. */
 378             un_f_is_fibre               :1,     /* The device supports fibre */
 379                                                 /* channel */


 385                                                 /* Host Adapter */
 386             un_f_opt_fab_devid          :1,     /* Disk has no valid/unique */
 387                                                 /* serial number.  */
 388             un_f_opt_disable_cache      :1,     /* Read/Write disk cache is */
 389                                                 /* disabled.  */
 390             un_f_cfg_is_atapi           :1,     /* This is an ATAPI device.  */
 391             un_f_write_cache_enabled    :1,     /* device return success on */
 392                                                 /* writes before transfer to */
 393                                                 /* physical media complete */
 394             un_f_cfg_playmsf_bcd        :1,     /* Play Audio, BCD params. */
 395             un_f_cfg_readsub_bcd        :1,     /* READ SUBCHANNEL BCD resp. */
 396             un_f_cfg_read_toc_trk_bcd   :1,     /* track # is BCD */
 397             un_f_cfg_read_toc_addr_bcd  :1,     /* address is BCD */
 398             un_f_cfg_no_read_header     :1,     /* READ HEADER not supported */
 399             un_f_cfg_read_cd_xd4        :1,     /* READ CD opcode is 0xd4 */
 400             un_f_mmc_cap                :1,     /* Device is MMC compliant */
 401             un_f_mmc_writable_media     :1,     /* writable media in device */
 402             un_f_dvdram_writable_device :1,     /* DVDRAM device is writable */
 403             un_f_cfg_cdda               :1,     /* READ CDDA supported */
 404             un_f_cfg_tur_check          :1,     /* verify un_ncmds before tur */
 405 
 406             un_f_use_adaptive_throttle  :1,     /* enable/disable adaptive */
 407                                                 /* throttling */
 408             un_f_pm_is_enabled          :1,     /* PM is enabled on this */
 409                                                 /* instance */
 410             un_f_watcht_stopped         :1,     /* media watch thread flag */
 411             un_f_pkstats_enabled        :1,     /* Flag to determine if */
 412                                                 /* partition kstats are */
 413                                                 /* enabled. */
 414             un_f_disksort_disabled      :1,     /* Flag to disable disksort */
 415             un_f_lun_reset_enabled      :1,     /* Set if target supports */
 416                                                 /* SCSI Logical Unit Reset */
 417             un_f_doorlock_supported     :1,     /* Device supports Doorlock */
 418             un_f_start_stop_supported   :1,     /* device has motor */
 419             un_f_reserved1              :1;
 420 
 421         uint32_t
 422             un_f_mboot_supported        :1,     /* mboot supported */
 423             un_f_is_hotpluggable        :1,     /* hotpluggable */
 424             un_f_has_removable_media    :1,     /* has removable media */
 425             un_f_non_devbsize_supported :1,     /* non-512 blocksize */
 426             un_f_devid_supported        :1,     /* device ID supported */
 427             un_f_eject_media_supported  :1,     /* media can be ejected */
 428             un_f_chk_wp_open            :1,     /* check if write-protected */
 429                                                 /* when being opened */
 430             un_f_descr_format_supported :1,     /* support descriptor format */
 431                                                 /* for sense data */
 432             un_f_check_start_stop       :1,     /* needs to check if */
 433                                                 /* START-STOP command is */
 434                                                 /* supported by hardware */
 435                                                 /* before issuing it */
 436             un_f_monitor_media_state    :1,     /* need a watch thread to */
 437                                                 /* monitor device state */
 438             un_f_attach_spinup          :1,     /* spin up once the */
 439                                                 /* device is attached */


 449             un_f_sync_nv_supported      :1,     /* SYNC_NV */
 450                                                 /* bit is supported */
 451             un_f_sync_cache_required    :1,     /* flag to check if */
 452                                                 /* SYNC CACHE needs to be */
 453                                                 /* sent in sdclose */
 454             un_f_devid_transport_defined :1,    /* devid defined by transport */
 455             un_f_rmw_type                :2,    /* RMW type */
 456             un_f_power_condition_disabled :1,   /* power condition disabled */
 457                                                 /* through sd configuration */
 458             un_f_power_condition_supported :1,  /* support power condition */
 459                                                 /* field by hardware */
 460             un_f_pm_log_sense_smart     :1,     /* log sense support SMART */
 461                                                 /* feature attribute */
 462             un_f_is_solid_state         :1,     /* has solid state media */
 463             un_f_is_rotational          :1,     /* spinning rust */
 464             un_f_mmc_gesn_polling       :1,     /* use GET EVENT STATUS */
 465                                                 /* NOTIFICATION for polling */
 466             un_f_enable_rmw             :1,     /* Force RMW in sd driver */
 467             un_f_expnevent              :1,
 468             un_f_cache_mode_changeable  :1,     /* can change cache mode */
 469             un_f_reserved               :1;
 470 
 471         /* Ptr to table of strings for ASC/ASCQ error message printing */
 472         struct scsi_asq_key_strings     *un_additional_codes;
 473 

 474         /*
 475          * Power Management support.
 476          *
 477          * un_pm_mutex protects, un_pm_count, un_pm_timeid, un_pm_busy,
 478          * un_pm_busy_cv, and un_pm_idle_timeid.
 479          * It's not required that SD_MUTEX be acquired before acquiring
 480          * un_pm_mutex, however if they must both be held
 481          * then acquire SD_MUTEX first.
 482          *
 483          * un_pm_count is used to indicate PM state as follows:
 484          *      less than 0 the device is powered down,
 485          *      transition from 0 ==> 1, mark the device as busy via DDI
 486          *      transition from 1 ==> 0, mark the device as idle via DDI
 487          */
 488         kmutex_t        un_pm_mutex;
 489         int             un_pm_count;            /* indicates pm state */
 490         timeout_id_t    un_pm_timeid;           /* timeout id for pm */
 491         uint_t          un_pm_busy;
 492         kcondvar_t      un_pm_busy_cv;
 493         short           un_power_level;         /* Power Level */
 494         uchar_t         un_save_state;
 495         kcondvar_t      un_suspend_cv;          /* power management */
 496         kcondvar_t      un_disk_busy_cv;        /* wait for IO completion */
 497 
 498         /* Resources used for media change callback support */
 499         kcondvar_t      un_state_cv;            /* Cond Var on mediastate */
 500         enum dkio_state un_mediastate;          /* current media state */
 501         enum dkio_state un_specified_mediastate; /* expected state */
 502         opaque_t        un_swr_token;           /* scsi_watch request token */
 503 
 504         /* Non-512 byte block support */
 505         struct kmem_cache *un_wm_cache; /* fast alloc in non-512 write case */
 506         uint_t          un_rmw_count;   /* count of read-modify-writes */
 507         struct sd_w_map *un_wm;         /* head of sd_w_map chain */
 508         uint64_t        un_rmw_incre_count;     /* count I/O */
 509         timeout_id_t    un_rmw_msg_timeid;      /* for RMW message control */
 510 






 511         /* For timeout callback to issue a START STOP UNIT command */
 512         timeout_id_t    un_startstop_timeid;
 513 
 514         /* Timeout callback handle for SD_PATH_DIRECT_PRIORITY cmd restarts */
 515         timeout_id_t    un_direct_priority_timeid;
 516 
 517         /* TRAN_FATAL_ERROR count. Cleared by TRAN_ACCEPT from scsi_transport */
 518         ulong_t         un_tran_fatal_count;
 519 
 520         timeout_id_t    un_retry_timeid;
 521 
 522         hrtime_t        un_pm_idle_time;
 523         timeout_id_t    un_pm_idle_timeid;
 524 
 525         /*
 526          * Count to determine if a Sonoma controller is in the process of
 527          * failing over, and how many I/O's are failed with the 05/94/01
 528          * sense code.
 529          */
 530         uint_t          un_sonoma_failure_count;
 531 



 532         /*
 533          * Support for failfast operation.
 534          */
 535         struct buf      *un_failfast_bp;
 536         struct buf      *un_failfast_headp;
 537         struct buf      *un_failfast_tailp;
 538         uint32_t        un_failfast_state;
 539         /* Callback routine active counter */
 540         short           un_in_callback;
 541 
 542         kcondvar_t      un_wcc_cv;      /* synchronize changes to */
 543                                         /* un_f_write_cache_enabled */
 544 
 545 #ifdef SD_FAULT_INJECTION
 546         /* SD Fault Injection */
 547 #define SD_FI_MAX_BUF 65536
 548 #define SD_FI_MAX_ERROR 1024
 549         kmutex_t                        un_fi_mutex;
 550         uint_t                          sd_fi_buf_len;
 551         char                            sd_fi_log[SD_FI_MAX_BUF];
 552         struct sd_fi_pkt        *sd_fi_fifo_pkt[SD_FI_MAX_ERROR];
 553         struct sd_fi_xb         *sd_fi_fifo_xb[SD_FI_MAX_ERROR];
 554         struct sd_fi_un         *sd_fi_fifo_un[SD_FI_MAX_ERROR];
 555         struct sd_fi_arq        *sd_fi_fifo_arq[SD_FI_MAX_ERROR];

 556         uint_t                          sd_fi_fifo_start;
 557         uint_t                          sd_fi_fifo_end;
 558         uint_t                          sd_injection_mask;
 559 
 560 #endif
 561 
 562         cmlb_handle_t   un_cmlbhandle;
 563 
 564         /*
 565          * Pointer to internal struct sd_fm_internal in which
 566          * will pass necessary information for FMA ereport posting.
 567          */
 568         void            *un_fm_private;
 569 };
 570 
 571 #define SD_IS_VALID_LABEL(un)  (cmlb_is_valid(un->un_cmlbhandle))
 572 
 573 /*
 574  * Macros for conversions between "target" and "system" block sizes, and
 575  * for conversion between block counts and byte counts.  As used here,
 576  * "system" block size refers to the block size used by the kernel/
 577  * filesystem (this includes the disk label). The "target" block size
 578  * is the block size returned by the SCSI READ CAPACITY command.
 579  *


 615 #define SD_TGTBYTEOFFSET(un, sysblk, tgtblk)                            \
 616         (SD_SYSBLOCKS2BYTES(sysblk) - SD_TGTBLOCKS2BYTES(un, tgtblk))
 617 
 618 /*
 619  * Calculate the target block location from the system block location
 620  */
 621 #define SD_SYS2TGTBLOCK(un, blockcnt)                                   \
 622         (blockcnt / ((un)->un_tgt_blocksize / DEV_BSIZE))
 623 
 624 /*
 625  * Calculate the target block location from the system block location
 626  */
 627 #define SD_TGT2SYSBLOCK(un, blockcnt)                                   \
 628         (blockcnt * ((un)->un_tgt_blocksize / DEV_BSIZE))
 629 
 630 /*
 631  * SD_DEFAULT_MAX_XFER_SIZE is the default value to bound the max xfer
 632  * for physio, for devices without tagged queuing enabled.
 633  * The default for devices with tagged queuing enabled is SD_MAX_XFER_SIZE
 634  */
 635 #if defined(__i386) || defined(__amd64)
 636 #define SD_DEFAULT_MAX_XFER_SIZE        (256 * 1024)
 637 #endif
 638 #define SD_MAX_XFER_SIZE                (1024 * 1024)
 639 
 640 /*
 641  * Warlock annotations
 642  */
 643 _NOTE(MUTEX_PROTECTS_DATA(scsi_device::sd_mutex, sd_lun))
 644 _NOTE(READ_ONLY_DATA(sd_lun::un_sd))
 645 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_reservation_type))
 646 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_mincdb))
 647 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_maxcdb))
 648 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_max_hba_cdb))
 649 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_status_len))
 650 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_f_arq_enabled))
 651 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_ctype))
 652 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_cmlbhandle))
 653 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_fm_private))
 654 
 655 
 656 _NOTE(SCHEME_PROTECTS_DATA("safe sharing",
 657         sd_lun::un_mhd_token
 658         sd_lun::un_state
 659         sd_lun::un_tagflags
 660         sd_lun::un_f_format_in_progress
 661         sd_lun::un_resvd_timeid
 662         sd_lun::un_reset_throttle_timeid
 663         sd_lun::un_startstop_timeid
 664         sd_lun::un_dcvb_timeid
 665         sd_lun::un_f_allow_bus_device_reset
 666         sd_lun::un_sys_blocksize
 667         sd_lun::un_tgt_blocksize
 668         sd_lun::un_phy_blocksize
 669         sd_lun::un_additional_codes))
 670 
 671 _NOTE(SCHEME_PROTECTS_DATA("stable data",
 672         sd_lun::un_reserve_release_time
 673         sd_lun::un_max_xfer_size
 674         sd_lun::un_partial_dma_supported
 675         sd_lun::un_buf_breakup_supported
 676         sd_lun::un_f_is_fibre
 677         sd_lun::un_node_type
 678         sd_lun::un_buf_chain_type
 679         sd_lun::un_uscsi_chain_type
 680         sd_lun::un_direct_chain_type
 681         sd_lun::un_priority_chain_type
 682         sd_lun::un_xbuf_attr
 683         sd_lun::un_cmd_timeout
 684         sd_lun::un_pkt_flags))
 685 
 686 _NOTE(SCHEME_PROTECTS_DATA("Unshared data",
 687         block_descriptor
 688         buf
 689         cdrom_subchnl
 690         cdrom_tocentry
 691         cdrom_tochdr
 692         cdrom_read
 693         dk_cinfo
 694         dk_devid
 695         dk_label
 696         dk_map
 697         dk_temperature
 698         mhioc_inkeys
 699         mhioc_inresvs
 700         mode_caching
 701         mode_header
 702         mode_speed
 703         scsi_cdb
 704         scsi_arq_status
 705         scsi_extended_sense
 706         scsi_inquiry
 707         scsi_pkt
 708         uio
 709         uscsi_cmd))
 710 
 711 
 712 _NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_device dk_cinfo))
 713 _NOTE(SCHEME_PROTECTS_DATA("unique per pkt", scsi_status scsi_cdb))
 714 
 715 _NOTE(MUTEX_PROTECTS_DATA(sd_lun::un_pm_mutex, sd_lun::un_pm_count
 716         sd_lun::un_pm_timeid sd_lun::un_pm_busy sd_lun::un_pm_busy_cv
 717         sd_lun::un_pm_idle_timeid))
 718 
 719 #ifdef SD_FAULT_INJECTION
 720 _NOTE(MUTEX_PROTECTS_DATA(sd_lun::un_fi_mutex,
 721         sd_lun::sd_fi_buf_len sd_lun::sd_fi_log))
 722 #endif
 723 
 724 /* _NOTE(LOCK_ORDER(sd_lun::un_sd.sd_mutex sd_lun::un_pm_mutex)) */
 725 
 726 
 727 
 728 /*
 729  * Referenced for frequently-accessed members of the unit structure
 730  */
 731 #define SD_SCSI_DEVP(un)        ((un)->un_sd)
 732 #define SD_DEVINFO(un)          ((un)->un_sd->sd_dev)
 733 #define SD_INQUIRY(un)          ((un)->un_sd->sd_inq)
 734 #define SD_MUTEX(un)            (&((un)->un_sd->sd_mutex))
 735 #define SD_ADDRESS(un)          (&((un)->un_sd->sd_address))
 736 #define SD_GET_DEV(un)          (sd_make_device(SD_DEVINFO(un)))
 737 #define SD_FM_LOG(un)           (((struct sd_fm_internal *)\
 738                                 ((un)->un_fm_private))->fm_log_level)
 739 
 740 
 741 /*
 742  * Values for un_ctype
 743  */
 744 #define CTYPE_CDROM             0
 745 #define CTYPE_MD21              1       /* Obsolete! */
 746 #define CTYPE_CCS               2
 747 #define CTYPE_ROD               3
 748 #define CTYPE_PXRE              4       /* Obsolete! */
 749 
 750 #define ISCD(un)                ((un)->un_ctype == CTYPE_CDROM)
 751 #define ISROD(un)               ((un)->un_ctype == CTYPE_ROD)
 752 #define ISPXRE(un)              ((un)->un_ctype == CTYPE_PXRE)
 753 
 754 /*
 755  * This macro checks the vendor of the device to see if it is LSI. Because
 756  * LSI has some devices out there that return 'Symbios' or 'SYMBIOS', we
 757  * need to check for those also.
 758  *
 759  * This is used in some vendor specific checks.
 760  */


 941 /*
 942  * Resource type definitions for multi host control operations. Specifically,
 943  * queue and request definitions for reservation request handling between the
 944  * scsi facility callback function (sd_mhd_watch_cb) and the reservation
 945  * reclaim thread (sd_resv_reclaim_thread)
 946  */
 947 struct sd_thr_request {
 948         dev_t   dev;
 949         struct  sd_thr_request  *sd_thr_req_next;
 950 };
 951 
 952 struct sd_resv_reclaim_request {
 953         kthread_t               *srq_resv_reclaim_thread;
 954         struct  sd_thr_request  *srq_thr_req_head;
 955         struct  sd_thr_request  *srq_thr_cur_req;
 956         kcondvar_t              srq_inprocess_cv;
 957         kmutex_t                srq_resv_reclaim_mutex;
 958         kcondvar_t              srq_resv_reclaim_cv;
 959 };
 960 
 961 _NOTE(MUTEX_PROTECTS_DATA(sd_resv_reclaim_request::srq_resv_reclaim_mutex,
 962     sd_resv_reclaim_request))
 963 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sd_thr_request))
 964 _NOTE(SCHEME_PROTECTS_DATA("Unshared data", sd_prout))
 965 
 966 
 967 
 968 /*
 969  * Driver Logging Components
 970  *
 971  * These components cover the functional entry points and areas of the
 972  * driver.  A component value is used for the entry point and utility
 973  * functions used by the entry point. The common component value is used
 974  * in those routines that are called from many areas of the driver.
 975  *
 976  * This can be done by adding the following two lines to /etc/system:
 977  * set sd:sd_component_mask=0x00080000
 978  * set sd:sd_level_mask=0x00000008
 979  */
 980 #define SD_LOG_PROBE                    0x00000001
 981 #define SD_LOG_ATTACH_DETACH            0x00000002
 982 #define SD_LOG_OPEN_CLOSE               0x00000004
 983 #define SD_LOG_READ_WRITE               0x00000008
 984 #define SD_LOG_POWER                    0x00000010
 985 #define SD_LOG_IOCTL                    0x00000020
 986 #define SD_LOG_IOCTL_MHD                0x00000040
 987 #define SD_LOG_IOCTL_RMMEDIA            0x00000080


1032 #define SD_INFO         sd_log_info
1033 
1034 /* SD_DUMP_MEMORY is called to dump a data buffer to the log */
1035 #define SD_DUMP_MEMORY  sd_dump_memory
1036 
1037 /* RESET/ABORTS testing ioctls */
1038 #define DKIOCRESET      (DKIOC|14)
1039 #define DKIOCABORT      (DKIOC|15)
1040 
1041 #ifdef SD_FAULT_INJECTION
1042 /*
1043  * sd_fi_pkt replicates the variables that are exposed through pkt
1044  *
1045  * sd_fi_xb replicates the variables that are exposed through xb
1046  *
1047  * sd_fi_un replicates the variables that are exposed through un
1048  *
1049  * sd_fi_arq replicates the variables that are
1050  *           exposed for Auto-Reqeust-Sense
1051  *


1052  */
1053 struct sd_fi_pkt {
1054         uint_t  pkt_flags;                      /* flags */
1055         uchar_t pkt_scbp;                       /* pointer to status block */
1056         uchar_t pkt_cdbp;                       /* pointer to command block */
1057         uint_t  pkt_state;                      /* state of command */
1058         uint_t  pkt_statistics;         /* statistics */
1059         uchar_t pkt_reason;                     /* reason completion called */
1060 };
1061 
1062 struct sd_fi_xb {
1063         daddr_t xb_blkno;
1064         ssize_t xb_dma_resid;
1065         short   xb_retry_count;
1066         short   xb_victim_retry_count;
1067         uchar_t xb_sense_status;
1068         uint_t  xb_sense_state;
1069         ssize_t xb_sense_resid;
1070         uchar_t xb_sense_data[SENSE_LENGTH];
1071         uchar_t es_code;


1082         uchar_t un_reservation_type;
1083         ushort_t un_notrdy_delay;
1084         short   un_resvd_status;
1085         uint32_t
1086                 un_f_arq_enabled,
1087                 un_f_allow_bus_device_reset,
1088                 un_f_opt_queueing;
1089         timeout_id_t    un_restart_timeid;
1090 };
1091 
1092 struct sd_fi_arq {
1093         struct scsi_status      sts_status;
1094         struct scsi_status      sts_rqpkt_status;
1095         uchar_t                         sts_rqpkt_reason;
1096         uchar_t                         sts_rqpkt_resid;
1097         uint_t                          sts_rqpkt_state;
1098         uint_t                          sts_rqpkt_statistics;
1099         struct scsi_extended_sense      sts_sensedata;
1100 };
1101 









1102 /*
1103  * Conditional set def
1104  */
1105 #define SD_CONDSET(a, b, c, d)                  \
1106         { \
1107         a->c = ((fi_ ## b)->c);                   \
1108         SD_INFO(SD_LOG_IOERR, un,               \
1109                         "sd_fault_injection:"   \
1110                         "setting %s to %d\n",   \
1111                         d, ((fi_ ## b)->c));         \
1112         }
1113 
1114 /* SD FaultInjection ioctls */
1115 #define SDIOC                   ('T'<<8)
1116 #define SDIOCSTART              (SDIOC|1)
1117 #define SDIOCSTOP               (SDIOC|2)
1118 #define SDIOCINSERTPKT  (SDIOC|3)
1119 #define SDIOCINSERTXB   (SDIOC|4)
1120 #define SDIOCINSERTUN   (SDIOC|5)
1121 #define SDIOCINSERTARQ  (SDIOC|6)
1122 #define SDIOCPUSH               (SDIOC|7)
1123 #define SDIOCRETRIEVE   (SDIOC|8)
1124 #define SDIOCRUN                (SDIOC|9)

1125 #endif
1126 
1127 #else
1128 
1129 #undef  SDDEBUG
1130 #define SD_ERROR        { if (0) sd_log_err; }
1131 #define SD_TRACE        { if (0) sd_log_trace; }
1132 #define SD_INFO         { if (0) sd_log_info; }
1133 #define SD_DUMP_MEMORY  { if (0) sd_dump_memory; }
1134 #endif
1135 
1136 
1137 /*
1138  * Miscellaneous macros
1139  */
1140 
1141 #define SD_USECTOHZ(x)                  (drv_usectohz((x)*1000000))
1142 #define SD_GET_PKT_STATUS(pktp)         ((*(pktp)->pkt_scbp) & STATUS_MASK)
1143 
1144 #define SD_BIOERROR(bp, errcode)                                        \


1157                     SD_DEVINFO((lunp)), DDI_PROP_DONTPASS,              \
1158                     SCSI_ADDR_PROP_LUN, 0);                             \
1159                 if (_lun > 0) {                                              \
1160                         (cdbp)->scc_lun = _lun;                              \
1161                 }                                                       \
1162         }
1163 
1164 #define SD_FILL_SCSI1_LUN(lunp, pktp)                                   \
1165         SD_FILL_SCSI1_LUN_CDB((lunp), (union scsi_cdb *)(pktp)->pkt_cdbp)
1166 
1167 /*
1168  * Disk driver states
1169  */
1170 
1171 #define SD_STATE_NORMAL         0
1172 #define SD_STATE_OFFLINE        1
1173 #define SD_STATE_RWAIT          2
1174 #define SD_STATE_DUMPING        3
1175 #define SD_STATE_SUSPENDED      4
1176 #define SD_STATE_PM_CHANGING    5


1177 
1178 /*
1179  * The table is to be interpreted as follows: The rows lists all the states
1180  * and each column is a state that a state in each row *can* reach. The entries
1181  * in the table list the event that cause that transition to take place.
1182  * For e.g.: To go from state RWAIT to SUSPENDED, event (d)-- which is the
1183  * invocation of DDI_SUSPEND-- has to take place. Note the same event could
1184  * cause the transition from one state to two different states. e.g., from
1185  * state SUSPENDED, when we get a DDI_RESUME, we just go back to the *last
1186  * state* whatever that might be. (NORMAL or OFFLINE).
1187  *
1188  *
1189  * State Transition Table:
1190  *
1191  *                    NORMAL  OFFLINE  RWAIT  DUMPING  SUSPENDED  PM_SUSPENDED
1192  *
1193  *   NORMAL              -      (a)      (b)     (c)      (d)       (h)
1194  *
1195  *   OFFLINE            (e)      -       (e)     (c)      (d)       NP
1196  *


1211  *   (f):       sdrunout() calls sdstart() which sets it NORMAL
1212  *   (g):       DDI_RESUME is called.
1213  *   (h):       Device threshold exceeded pm framework called power
1214  *              entry point or pm_lower_power called in detach.
1215  *   (i):       When new I/O come in.
1216  *    * :       When suspended, we dont change state during panic dump
1217  */
1218 
1219 
1220 #define SD_MAX_THROTTLE         256
1221 #define SD_MIN_THROTTLE         8
1222 /*
1223  * Lowest valid max. and min. throttle value.
1224  * This is set to 2 because if un_min_throttle were allowed to be 1 then
1225  * un_throttle would never get set to a value less than un_min_throttle
1226  * (0 is a special case) which means it would never get set back to
1227  * un_saved_throttle in routine sd_restore_throttle().
1228  */
1229 #define SD_LOWEST_VALID_THROTTLE        2
1230 
1231 
1232 
1233 /* Return codes for sd_send_polled_cmd() and sd_scsi_poll() */
1234 #define SD_CMD_SUCCESS                  0
1235 #define SD_CMD_FAILURE                  1
1236 #define SD_CMD_RESERVATION_CONFLICT     2
1237 #define SD_CMD_ILLEGAL_REQUEST          3
1238 #define SD_CMD_BECOMING_READY           4
1239 #define SD_CMD_CHECK_CONDITION          5
1240 
1241 /* Return codes for sd_ready_and_valid */
1242 #define SD_READY_VALID                  0
1243 #define SD_NOT_READY_VALID              1
1244 #define SD_RESERVED_BY_OTHERS           2
1245 
1246 #define SD_PATH_STANDARD                0
1247 #define SD_PATH_DIRECT                  1
1248 #define SD_PATH_DIRECT_PRIORITY         2
1249 
1250 #define SD_UNIT_ATTENTION_RETRY         40
1251 
1252 /*


1403         short   xb_victim_retry_count;
1404         short   xb_ua_retry_count;      /* unit_attention retry counter */
1405         short   xb_nr_retry_count;      /* not ready retry counter */
1406 
1407         /*
1408          * Various status and data used when a RQS command is run on
1409          * the behalf of this command.
1410          */
1411         struct buf      *xb_sense_bp;   /* back ptr to buf, for RQS */
1412         uint_t  xb_sense_state;         /* scsi_pkt state of RQS command */
1413         ssize_t xb_sense_resid;         /* residual of RQS command */
1414         uchar_t xb_sense_status;        /* scsi status byte of RQS command */
1415         uchar_t xb_sense_data[SENSE_LENGTH];    /* sense data from RQS cmd */
1416         /*
1417          * Extra sense larger than SENSE_LENGTH will be allocated
1418          * right after xb_sense_data[SENSE_LENGTH]. Please do not
1419          * add any new field after it.
1420          */
1421 };
1422 
1423 _NOTE(SCHEME_PROTECTS_DATA("unique per pkt", sd_xbuf))
1424 
1425 #define SD_PKT_ALLOC_SUCCESS                    0
1426 #define SD_PKT_ALLOC_FAILURE                    1
1427 #define SD_PKT_ALLOC_FAILURE_NO_DMA             2
1428 #define SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL      3
1429 #define SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL      4
1430 
1431 #define SD_GET_XBUF(bp)         ((struct sd_xbuf *)((bp)->b_private))
1432 #define SD_GET_UN(bp)           ((SD_GET_XBUF(bp))->xb_un)
1433 #define SD_GET_PKTP(bp)         ((SD_GET_XBUF(bp))->xb_pktp)
1434 #define SD_GET_BLKNO(bp)        ((SD_GET_XBUF(bp))->xb_blkno)
1435 
1436 /*
1437  * Special-purpose struct for sd_send_scsi_cmd() to pass command-specific
1438  * data through the layering chains to sd_initpkt_for_uscsi().
1439  */
1440 struct sd_uscsi_info {
1441         int                     ui_flags;
1442         struct uscsi_cmd        *ui_cmdp;
1443         /*
1444          * ui_dkc is used by sd_send_scsi_SYNCHRONIZE_CACHE() to allow
1445          * for async completion notification.
1446          */
1447         struct dk_callback      ui_dkc;
1448         /*
1449          * The following fields are to be used for FMA ereport generation.
1450          */
1451         uchar_t                 ui_pkt_reason;
1452         uint32_t                ui_pkt_state;
1453         uint32_t                ui_pkt_statistics;
1454         uint64_t                ui_lba;
1455         uint64_t                ui_ena;
1456 };
1457 
1458 _NOTE(SCHEME_PROTECTS_DATA("Unshared data", sd_uscsi_info))
1459 
1460 /*
1461  * This structure is used to issue 'internal' command sequences from the
1462  * driver's attach(9E)/open(9E)/etc entry points. It provides a common context
1463  * for issuing command sequences, with the ability to issue a command
1464  * and provide expected/unexpected assessment of results at any code
1465  * level within the sd_ssc_t scope and preserve the information needed
1466  * produce telemetry for the problem, when needed, from a single
1467  * outer-most-scope point.
1468  *
1469  * The sd_ssc_t abstraction should result in well-structured code where
1470  * the basic code structure is not jeprodized by future localized improvement.
1471  *
1472  *   o  Scope for a sequence of commands.
1473  *   o  Within a scoped sequence of commands, provides a single top-level
1474  *      location for initiating telementry generation from captured data.
1475  *   o  Provide a common place to capture command execution data and driver
1476  *      assessment information for delivery to telemetry generation point.
1477  *   o  Mechanism to get device-as-detector (dad) and transport telemetry
1478  *      information from interrupt context (sdintr) back to the internal
1479  *      command 'driver-assessment' code.
1480  *   o  Ability to record assessment, and return information back to
1481  *      top-level telemetry generation code when an unexpected condition
1482  *      occurs.
1483  *   o  For code paths were an command itself was successful but
1484  *      the data returned looks suspect, the ability to record
1485  *      'unexpected data' conditions.
1486  *   o  Record assessment of issuing the command and interpreting
1487  *      the returned data for consumption by top-level ereport telemetry
1488  *      generation code.
1489  *   o  All data required to produce telemetry available off single data
1490  *      structure.
1491  */
1492 typedef struct {
1493         struct sd_lun           *ssc_un;
1494         struct uscsi_cmd        *ssc_uscsi_cmd;
1495         struct sd_uscsi_info    *ssc_uscsi_info;
1496         int                     ssc_flags; /* Bits for flags */
1497         char                    ssc_info[1024]; /* Buffer holding for info */
1498 } sd_ssc_t;
1499 
1500 _NOTE(SCHEME_PROTECTS_DATA("Unshared data", sd_ssc_t))
1501 
1502 /*
1503  * This struct switch different 'type-of-assessment'
1504  * as an input argument for sd_ssc_assessment
1505  *
1506  *
1507  * in sd_send_scsi_XXX or upper-level
1508  *
1509  * - SD_FMT_IGNORE
1510  *   when send uscsi command failed, and
1511  *   the following code check sense data properly.
1512  *   we use 'ignore' to let sd_ssc_assessment
1513  *   trust current and do not do additional
1514  *   checking for the uscsi command.
1515  *
1516  * - SD_FMT_IGNORE_COMPROMISE
1517  *   when send uscsi command failed, and
1518  *   the code does not check sense data or we don't
1519  *   think the checking is 100% coverage. We mark it
1520  *   as 'compromise' to indicate that we need to
1521  *   enhance current code in the future.


1688 {                                                                       \
1689         struct kstat *pksp = (un)->un_pstats[SDPART((bp)->b_edev)];       \
1690         if (pksp != NULL) {                                             \
1691                 kstat_io_t *kip = KSTAT_IO_PTR(pksp);                   \
1692                 size_t n_done = (bp)->b_bcount - (bp)->b_resid;           \
1693                 if ((bp)->b_flags & B_READ) {                            \
1694                         kip->reads++;                                        \
1695                         kip->nread += n_done;                                \
1696                 } else {                                                \
1697                         kip->writes++;                                       \
1698                         kip->nwritten += n_done;                     \
1699                 }                                                       \
1700         }                                                               \
1701 }
1702 
1703 
1704 #endif  /* defined(_KERNEL) || defined(_KMEMUSER) */
1705 
1706 
1707 /*
1708  * 60 seconds is a *very* reasonable amount of time for most slow CD
1709  * operations.
1710  */
1711 #define SD_IO_TIME                      60
1712 
1713 /*
1714  * 2 hours is an excessively reasonable amount of time for format operations.
1715  */
1716 #define SD_FMT_TIME                     (120 * 60)
1717 
1718 /*
1719  * 5 seconds is what we'll wait if we get a Busy Status back
1720  */
1721 #define SD_BSY_TIMEOUT                  (drv_usectohz(5 * 1000000))
1722 
1723 /*
1724  * 100 msec. is what we'll wait if we get Unit Attention.
1725  */
1726 #define SD_UA_RETRY_DELAY               (drv_usectohz((clock_t)100000))
1727 
1728 /*
1729  * 100 msec. is what we'll wait for restarted commands.
1730  */
1731 #define SD_RESTART_TIMEOUT              (drv_usectohz((clock_t)100000))
1732 
1733 /*
1734  * 10s misaligned I/O warning message interval
1735  */
1736 #define SD_RMW_MSG_PRINT_TIMEOUT        (drv_usectohz((clock_t)10000000))
1737 
1738 /*
1739  * 100 msec. is what we'll wait for certain retries for fibre channel
1740  * targets, 0 msec for parallel SCSI.
1741  */
1742 #if defined(__fibre)
1743 #define SD_RETRY_DELAY                  (drv_usectohz(100000))
1744 #else
1745 #define SD_RETRY_DELAY                  ((clock_t)0)
1746 #endif
1747 
1748 /*
1749  * Number of times we'll retry a normal operation.
1750  *
1751  * This includes retries due to transport failure
1752  * (need to distinguish between Target and Transport failure)
1753  *
1754  */
1755 #if defined(__fibre)
1756 #define SD_RETRY_COUNT                  3
1757 #else
1758 #define SD_RETRY_COUNT                  5
1759 #endif
1760 
1761 /*
1762  * Number of times we will retry for unit attention.
1763  */
1764 #define SD_UA_RETRY_COUNT               600
1765 
1766 #define SD_VICTIM_RETRY_COUNT(un)       (un->un_victim_retry_count)
1767 #define CD_NOT_READY_RETRY_COUNT(un)    (un->un_retry_count * 2)
1768 #define DISK_NOT_READY_RETRY_COUNT(un)  (un->un_retry_count / 2)
1769 
1770 
1771 /*
1772  * Maximum number of units we can support
1773  * (controlled by room in minor device byte)
1774  *
1775  * Note: this value is out of date.
1776  */
1777 #define SD_MAXUNIT                      32
1778 
1779 /*
1780  * 30 seconds is what we will wait for the IO to finish
1781  * before we fail the DDI_SUSPEND
1782  */
1783 #define SD_WAIT_CMDS_COMPLETE           30
1784 


1852 #define PURPLE_RESET_RETRY_COUNT        36
1853 #define PURPLE_RESERVE_RELEASE_TIME     60
1854 #define SVE_BUSY_RETRIES                60
1855 #define SVE_RESET_RETRY_COUNT           36
1856 #define SVE_RESERVE_RELEASE_TIME        60
1857 #define SVE_THROTTLE_VALUE              10
1858 #define SVE_MIN_THROTTLE_VALUE          2
1859 #define SVE_DISKSORT_DISABLED_FLAG      1
1860 #define MASERATI_DISKSORT_DISABLED_FLAG 1
1861 #define MASERATI_LUN_RESET_ENABLED_FLAG 1
1862 #define PIRUS_THROTTLE_VALUE            64
1863 #define PIRUS_NRR_COUNT                 60
1864 #define PIRUS_BUSY_RETRIES              60
1865 #define PIRUS_RESET_RETRY_COUNT         36
1866 #define PIRUS_MIN_THROTTLE_VALUE        16
1867 #define PIRUS_DISKSORT_DISABLED_FLAG    0
1868 #define PIRUS_LUN_RESET_ENABLED_FLAG    1
1869 
1870 /*
1871  * Driver Property Bit Flag definitions
1872  *
1873  * Unfortunately, for historical reasons, the bit-flag definitions are
1874  * different on SPARC, INTEL, & FIBRE platforms.
1875  */
1876 
1877 /*
1878  * Bit flag telling driver to set throttle from sd.conf sd-config-list
1879  * and driver table.
1880  *
1881  * The max throttle (q-depth) property implementation is for support of
1882  * fibre channel devices that can drop an i/o request when a queue fills
1883  * up. The number of commands sent to the disk from this driver is
1884  * regulated such that queue overflows are avoided.
1885  */
1886 #define SD_CONF_SET_THROTTLE            0
1887 #define SD_CONF_BSET_THROTTLE           (1 << SD_CONF_SET_THROTTLE)
1888 
1889 /*
1890  * Bit flag telling driver to set the controller type from sd.conf
1891  * sd-config-list and driver table.
1892  */
1893 #if defined(__i386) || defined(__amd64)
1894 #define SD_CONF_SET_CTYPE               1
1895 #elif defined(__fibre)
1896 #define SD_CONF_SET_CTYPE               5
1897 #else
1898 #define SD_CONF_SET_CTYPE               1
1899 #endif
1900 #define SD_CONF_BSET_CTYPE              (1 << SD_CONF_SET_CTYPE)
1901 
1902 /*
1903  * Bit flag telling driver to set the not ready retry count for a device from
1904  * sd.conf sd-config-list and driver table.
1905  */
1906 #if defined(__i386) || defined(__amd64)
1907 #define SD_CONF_SET_NOTREADY_RETRIES    10
1908 #elif defined(__fibre)
1909 #define SD_CONF_SET_NOTREADY_RETRIES    1
1910 #else
1911 #define SD_CONF_SET_NOTREADY_RETRIES    2
1912 #endif
1913 #define SD_CONF_BSET_NRR_COUNT          (1 << SD_CONF_SET_NOTREADY_RETRIES)
1914 
1915 /*
1916  * Bit flag telling driver to set SCSI status BUSY Retries from sd.conf
1917  * sd-config-list and driver table.
1918  */
1919 #if defined(__i386) || defined(__amd64)
1920 #define SD_CONF_SET_BUSY_RETRIES        11
1921 #elif defined(__fibre)
1922 #define SD_CONF_SET_BUSY_RETRIES        2
1923 #else
1924 #define SD_CONF_SET_BUSY_RETRIES        5
1925 #endif
1926 #define SD_CONF_BSET_BSY_RETRY_COUNT    (1 << SD_CONF_SET_BUSY_RETRIES)
1927 
1928 /*
1929  * Bit flag telling driver that device does not have a valid/unique serial
1930  * number.
1931  */
1932 #if defined(__i386) || defined(__amd64)
1933 #define SD_CONF_SET_FAB_DEVID           2
1934 #else
1935 #define SD_CONF_SET_FAB_DEVID           3
1936 #endif
1937 #define SD_CONF_BSET_FAB_DEVID          (1 << SD_CONF_SET_FAB_DEVID)
1938 
1939 /*
1940  * Bit flag telling driver to disable all caching for disk device.
1941  */
1942 #if defined(__i386) || defined(__amd64)
1943 #define SD_CONF_SET_NOCACHE             3
1944 #else
1945 #define SD_CONF_SET_NOCACHE             4
1946 #endif
1947 #define SD_CONF_BSET_NOCACHE            (1 << SD_CONF_SET_NOCACHE)
1948 
1949 /*
1950  * Bit flag telling driver that the PLAY AUDIO command requires parms in BCD
1951  * format rather than binary.
1952  */
1953 #if defined(__i386) || defined(__amd64)
1954 #define SD_CONF_SET_PLAYMSF_BCD         4
1955 #else
1956 #define SD_CONF_SET_PLAYMSF_BCD         6
1957 #endif
1958 #define SD_CONF_BSET_PLAYMSF_BCD        (1 << SD_CONF_SET_PLAYMSF_BCD)
1959 
1960 /*
1961  * Bit flag telling driver that the response from the READ SUBCHANNEL command
1962  * has BCD fields rather than binary.
1963  */
1964 #if defined(__i386) || defined(__amd64)
1965 #define SD_CONF_SET_READSUB_BCD         5
1966 #else
1967 #define SD_CONF_SET_READSUB_BCD         7
1968 #endif
1969 #define SD_CONF_BSET_READSUB_BCD        (1 << SD_CONF_SET_READSUB_BCD)
1970 
1971 /*
1972  * Bit in flags telling driver that the track number fields in the READ TOC
1973  * request and respone are in BCD rather than binary.
1974  */
1975 #if defined(__i386) || defined(__amd64)
1976 #define SD_CONF_SET_READ_TOC_TRK_BCD    6
1977 #else
1978 #define SD_CONF_SET_READ_TOC_TRK_BCD    8
1979 #endif
1980 #define SD_CONF_BSET_READ_TOC_TRK_BCD   (1 << SD_CONF_SET_READ_TOC_TRK_BCD)
1981 
1982 /*
1983  * Bit flag telling driver that the address fields in the READ TOC request and
1984  * respone are in BCD rather than binary.
1985  */
1986 #if defined(__i386) || defined(__amd64)
1987 #define SD_CONF_SET_READ_TOC_ADDR_BCD   7
1988 #else
1989 #define SD_CONF_SET_READ_TOC_ADDR_BCD   9
1990 #endif
1991 #define SD_CONF_BSET_READ_TOC_ADDR_BCD  (1 << SD_CONF_SET_READ_TOC_ADDR_BCD)
1992 
1993 /*
1994  * Bit flag telling the driver that the device doesn't support the READ HEADER
1995  * command.
1996  */
1997 #if defined(__i386) || defined(__amd64)
1998 #define SD_CONF_SET_NO_READ_HEADER      8
1999 #else
2000 #define SD_CONF_SET_NO_READ_HEADER      10
2001 #endif
2002 #define SD_CONF_BSET_NO_READ_HEADER     (1 << SD_CONF_SET_NO_READ_HEADER)
2003 
2004 /*
2005  * Bit flag telling the driver that for the READ CD command the device uses
2006  * opcode 0xd4 rather than 0xbe.
2007  */
2008 #if defined(__i386) || defined(__amd64)
2009 #define SD_CONF_SET_READ_CD_XD4         9
2010 #else
2011 #define SD_CONF_SET_READ_CD_XD4         11
2012 #endif
2013 #define SD_CONF_BSET_READ_CD_XD4        (1 << SD_CONF_SET_READ_CD_XD4)
2014 
2015 /*
2016  * Bit flag telling the driver to set SCSI status Reset Retries
2017  * (un_reset_retry_count) from sd.conf sd-config-list and driver table (4356701)
2018  */
2019 #define SD_CONF_SET_RST_RETRIES         12
2020 #define SD_CONF_BSET_RST_RETRIES        (1 << SD_CONF_SET_RST_RETRIES)
2021 
2022 /*
2023  * Bit flag telling the driver to set the reservation release timeout value
2024  * from sd.conf sd-config-list and driver table. (4367306)
2025  */
2026 #define SD_CONF_SET_RSV_REL_TIME        13
2027 #define SD_CONF_BSET_RSV_REL_TIME       (1 << SD_CONF_SET_RSV_REL_TIME)
2028 
2029 /*
2030  * Bit flag telling the driver to verify that no commands are pending for a
2031  * device before issuing a Test Unit Ready. This is a fw workaround for Seagate
2032  * eliteI drives. (4392016)
2033  */
2034 #define SD_CONF_SET_TUR_CHECK           14
2035 #define SD_CONF_BSET_TUR_CHECK          (1 << SD_CONF_SET_TUR_CHECK)
2036 
2037 /*
2038  * Bit in flags telling driver to set min. throttle from ssd.conf
2039  * ssd-config-list and driver table.
2040  */
2041 #define SD_CONF_SET_MIN_THROTTLE        15
2042 #define SD_CONF_BSET_MIN_THROTTLE       (1 << SD_CONF_SET_MIN_THROTTLE)
2043 
2044 /*
2045  * Bit in flags telling driver to set disksort disable flag from ssd.conf
2046  * ssd-config-list and driver table.
2047  */
2048 #define SD_CONF_SET_DISKSORT_DISABLED   16
2049 #define SD_CONF_BSET_DISKSORT_DISABLED  (1 << SD_CONF_SET_DISKSORT_DISABLED)
2050 
2051 /*
2052  * Bit in flags telling driver to set LUN Reset enable flag from [s]sd.conf
2053  * [s]sd-config-list and driver table.
2054  */
2055 #define SD_CONF_SET_LUN_RESET_ENABLED   17
2056 #define SD_CONF_BSET_LUN_RESET_ENABLED  (1 << SD_CONF_SET_LUN_RESET_ENABLED)
2057 
2058 /*
2059  * Bit in flags telling driver that the write cache on the device is
2060  * non-volatile.
2061  */
2062 #define SD_CONF_SET_CACHE_IS_NV 18
2063 #define SD_CONF_BSET_CACHE_IS_NV        (1 << SD_CONF_SET_CACHE_IS_NV)
2064 
2065 /*
2066  * Bit in flags telling driver that the power condition flag from [s]sd.conf
2067  * [s]sd-config-list and driver table.
2068  */
2069 #define SD_CONF_SET_PC_DISABLED 19
2070 #define SD_CONF_BSET_PC_DISABLED        (1 << SD_CONF_SET_PC_DISABLED)
2071 
2072 /*
2073  * This is the number of items currently settable in the sd.conf
2074  * sd-config-list.  The mask value is defined for parameter checking. The
2075  * item count and mask should be updated when new properties are added.
2076  */
2077 #define SD_CONF_MAX_ITEMS               19
2078 #define SD_CONF_BIT_MASK                0x0007FFFF
2079 
2080 typedef struct {
2081         int sdt_throttle;
2082         int sdt_ctype;
2083         int sdt_not_rdy_retries;
2084         int sdt_busy_retries;
2085         int sdt_reset_retries;
2086         int sdt_reserv_rel_time;
2087         int sdt_min_throttle;


2153 
2154 /*
2155  * These belong in sys/scsi/generic/mode.h
2156  */
2157 
2158 /*
2159  * Mode Sense/Select Header response for Group 2 CDB.
2160  */
2161 
2162 struct mode_header_grp2 {
2163         uchar_t length_msb;             /* MSB - number of bytes following */
2164         uchar_t length_lsb;
2165         uchar_t medium_type;            /* device specific */
2166         uchar_t device_specific;        /* device specfic parameters */
2167         uchar_t resv[2];                /* reserved */
2168         uchar_t bdesc_length_hi;        /* length of block descriptor(s) */
2169                                         /* (if any) */
2170         uchar_t bdesc_length_lo;
2171 };
2172 
2173 _NOTE(SCHEME_PROTECTS_DATA("Unshared data", mode_header_grp2))
2174 
2175 /*
2176  * Length of the Mode Parameter Header for the Group 2 Mode Select command
2177  */
2178 #define MODE_HEADER_LENGTH_GRP2 (sizeof (struct mode_header_grp2))
2179 #define MODE_PARAM_LENGTH_GRP2 (MODE_HEADER_LENGTH_GRP2 + MODE_BLK_DESC_LENGTH)
2180 
2181 /*
2182  * Mode Page 1 - Error Recovery Page
2183  */
2184 #define MODEPAGE_ERR_RECOVER            1
2185 
2186 /*
2187  * The following buffer length define is 8 bytes for the Group 2 mode page
2188  * header, 8 bytes for the block descriptor and 26 bytes for the cdrom
2189  * capabilities page (per MMC-2)
2190  */
2191 #define MODEPAGE_CDROM_CAP              0x2A
2192 #define MODEPAGE_CDROM_CAP_LEN          26
2193 #define BUFLEN_MODE_CDROM_CAP           (MODEPAGE_CDROM_CAP_LEN + \
2194         MODE_HEADER_LENGTH_GRP2 + MODE_BLK_DESC_LENGTH)


2358 #define TEMPERATURE_PAGE                        0x0D
2359 #define TEMPERATURE_PAGE_SIZE                   16      /* bytes */
2360 
2361 /* delay time used for sd_media_watch_cb delayed cv broadcast */
2362 #define MEDIA_ACCESS_DELAY 2000000
2363 
2364 
2365 /* SCSI power on or bus device reset additional sense code */
2366 #define SD_SCSI_RESET_SENSE_CODE        0x29
2367 
2368 /*
2369  * These defines are for the Vital Product Data Pages in the inquiry command.
2370  * They are the bits in the un_vpd_page mask, telling the supported pages.
2371  */
2372 #define SD_VPD_SUPPORTED_PG     0x01    /* 0x00 - Supported VPD pages */
2373 #define SD_VPD_UNIT_SERIAL_PG   0x02    /* 0x80 - Unit Serial Number */
2374 #define SD_VPD_OPERATING_PG     0x04    /* 0x81 - Implemented Op Defs */
2375 #define SD_VPD_ASCII_OP_PG      0x08    /* 0x82 - ASCII Op Defs */
2376 #define SD_VPD_DEVID_WWN_PG     0x10    /* 0x83 - Device Identification */
2377 #define SD_VPD_EXTENDED_DATA_PG 0x80    /* 0x86 - Extended data about the lun */
2378 #define SD_VPD_DEV_CHARACTER_PG 0x400   /* 0xB1 - Device Characteristics */

2379 
2380 /*
2381  * Non-volatile cache support
2382  *
2383  * Bit 1 of the byte 6 in the Extended INQUIRY data VPD page
2384  * is NV_SUP bit: An NV_SUP bit set to one indicates that
2385  * the device server supports a non-volatile cache.  An
2386  * NV_SUP bit set to zero indicates that the device
2387  * server may or may not support a non-volatile cache.
2388  *
2389  * Bit 2 of the byte 1 in the SYNC CACHE command is SYNC_NV
2390  * bit: The SYNC_NV bit specifies whether the device server
2391  * is required to synchronize volatile and non-volatile
2392  * caches.
2393  */
2394 #define SD_VPD_NV_SUP   0x02
2395 #define SD_SYNC_NV_BIT 0x04
2396 
2397 /*
2398  * Addition from sddef.intel.h
2399  */
2400 #if defined(__i386) || defined(__amd64)
2401 
2402 #define P0_RAW_DISK     (NDKMAP)
2403 #define FDISK_P1        (NDKMAP+1)
2404 #define FDISK_P2        (NDKMAP+2)
2405 #define FDISK_P3        (NDKMAP+3)
2406 #define FDISK_P4        (NDKMAP+4)
2407 
2408 #endif  /* __i386 || __amd64 */
2409 
2410 #ifdef  __cplusplus
2411 }
2412 #endif
2413 
2414 
2415 #endif  /* _SYS_SCSI_TARGETS_SDDEF_H */
   1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
  24  */
  25 
  26 /*
  27  * Copyright 2011 cyril.galibern@opensvc.com
  28  * Copyright 2019 Nexenta Systems, Inc.
  29  */
  30 
  31 #ifndef _SYS_SCSI_TARGETS_SDDEF_H
  32 #define _SYS_SCSI_TARGETS_SDDEF_H
  33 
  34 #include <sys/dktp/fdisk.h>
  35 #include <sys/note.h>
  36 #include <sys/mhd.h>
  37 #include <sys/cmlb.h>
  38 
  39 #ifdef  __cplusplus
  40 extern "C" {
  41 #endif
  42 

  43 #if defined(_KERNEL) || defined(_KMEMUSER)
  44 

  45 #define SD_SUCCESS              0
  46 #define SD_FAILURE              (-1)
  47 
  48 #if defined(TRUE)
  49 #undef TRUE
  50 #endif
  51 
  52 #if defined(FALSE)
  53 #undef FALSE
  54 #endif
  55 
  56 #define TRUE                    1
  57 #define FALSE                   0
  58 









  59 /*
  60  * Fault Injection Flag for Inclusion of Code





  61  */

  62 #if DEBUG || lint
  63 #define SD_FAULT_INJECTION
  64 #endif


  65 
  66 /*
  67  * Structures for recording whether a device is fully open or closed.
  68  * Assumptions:
  69  *
  70  *      + There are only 16 disk slices possible.
  71  *      + BLK, MNT, CHR, SWP don't change in some future release!
  72  */
  73 
  74 #if defined(_SUNOS_VTOC_8)
  75 
  76 #define SDUNIT_SHIFT    3
  77 #define SDPART_MASK     7
  78 #define NSDMAP          NDKMAP
  79 
  80 #elif defined(_SUNOS_VTOC_16)
  81 
  82 /*
  83  * XXX - NSDMAP has multiple definitions, one more in cmlb_impl.h
  84  * If they are coalesced into one, this definition will follow suit.
  85  * FDISK partitions - 4 primary and MAX_EXT_PARTS number of Extended
  86  * Partitions.
  87  */
  88 #define FDISK_PARTS             (FD_NUMPART + MAX_EXT_PARTS)
  89 
  90 #define SDUNIT_SHIFT    6
  91 #define SDPART_MASK     63
  92 #define NSDMAP          (NDKMAP + FDISK_PARTS + 1)
  93 
  94 #else
  95 #error "No VTOC format defined."
  96 #endif
  97 
  98 #define P0_RAW_DISK     (NDKMAP)
  99 #define FDISK_P1        (NDKMAP+1)
 100 #define FDISK_P2        (NDKMAP+2)
 101 #define FDISK_P3        (NDKMAP+3)
 102 #define FDISK_P4        (NDKMAP+4)
 103 
 104 #define SDUNIT(dev)     (getminor((dev)) >> SDUNIT_SHIFT)
 105 #define SDPART(dev)     (getminor((dev)) &  SDPART_MASK)
 106 
 107 /*
 108  * maximum number of partitions the driver keeps track of; with
 109  * EFI this can be larger than the number of partitions accessible
 110  * through the minor nodes.  It won't be used for keeping track
 111  * of open counts, partition kstats, etc.
 112  */
 113 #define MAXPART         (NSDMAP + 1)
 114 
 115 /*
 116  * Macro to retrieve the DDI instance number from the given buf struct.
 117  * The instance number is encoded in the minor device number.
 118  */
 119 #define SD_GET_INSTANCE_FROM_BUF(bp)                            \
 120         (getminor((bp)->b_edev) >> SDUNIT_SHIFT)
 121 


 122 struct ocinfo {
 123         /*
 124          * Types BLK, MNT, CHR, SWP,
 125          * assumed to be types 0-3.
 126          */
 127         uint64_t  lyr_open[NSDMAP];
 128         uint64_t  reg_open[OTYPCNT - 1];
 129 };
 130 
 131 #define OCSIZE  sizeof (struct ocinfo)
 132 
 133 union ocmap {
 134         uchar_t chkd[OCSIZE];
 135         struct ocinfo rinfo;
 136 };
 137 
 138 #define lyropen rinfo.lyr_open
 139 #define regopen rinfo.reg_open
 140 

 141 #define SD_CDB_GROUP0           0
 142 #define SD_CDB_GROUP1           1
 143 #define SD_CDB_GROUP5           2
 144 #define SD_CDB_GROUP4           3
 145 
 146 struct sd_cdbinfo {
 147         uchar_t  sc_grpcode;    /* CDB group code */
 148         uchar_t  sc_grpmask;    /* CDB group code mask (for cmd opcode) */
 149         uint64_t sc_maxlba;     /* Maximum logical block addr. supported */
 150         uint32_t sc_maxlen;     /* Maximum transfer length supported */
 151 };
 152 


 153 /*
 154  * The following declaration are for Non-512 byte block support for the
 155  * removable devices. (ex - DVD RAM, MO).
 156  * wm_state: This is an enumeration for the different states for
 157  * manipalating write range list during the read-modify-write-operation.
 158  */
 159 typedef enum {
 160         SD_WM_CHK_LIST,         /* Check list for overlapping writes */
 161         SD_WM_WAIT_MAP,         /* Wait for an overlapping I/O to complete */
 162         SD_WM_LOCK_RANGE,       /* Lock the range of lba to be written */
 163         SD_WM_DONE              /* I/O complete */
 164 } wm_state;
 165 
 166 /*
 167  * sd_w_map: Every write I/O will get one w_map allocated for it which will tell
 168  * the range on the media which is being written for that request.
 169  */
 170 struct sd_w_map {
 171         uint_t          wm_start;       /* Write start location */
 172         uint_t          wm_end;         /* Write end location */
 173         ushort_t        wm_flags;       /* State of the wmap */
 174         ushort_t        wm_wanted_count; /* # of threads waiting for region */
 175         void            *wm_private;    /* Used to store bp->b_private */
 176         struct buf      *wm_bufp;       /* to store buf pointer */
 177         struct sd_w_map *wm_next;       /* Forward pointed to sd_w_map */
 178         struct sd_w_map *wm_prev;       /* Back pointer to sd_w_map */
 179         kcondvar_t      wm_avail;       /* Sleep on this, while not available */
 180 };
 181 



 182 /*
 183  * This is the struct for the layer-private data area for the
 184  * mapblocksize layer.
 185  */
 186 
 187 struct sd_mapblocksize_info {
 188         void            *mbs_oprivate;  /* saved value of xb_private */
 189         struct buf      *mbs_orig_bp;   /* ptr to original bp */
 190         struct sd_w_map *mbs_wmp;       /* ptr to write-map struct for RMW */
 191         ssize_t         mbs_copy_offset;
 192         int             mbs_layer_index;        /* chain index for RMW */
 193 };
 194 
 195 /*
 196  * Latency is tracked in usec and is quantized by power of two starting at
 197  * offset SD_LAT_MIN_USEC_SHIFT. Values below that offset will go in the first
 198  * (0th) bucket. Similar, values above SD_LAT_MAX_USEC_SHIFT go in the
 199  * (SD_LAT_MAX_USEC_SHIFT - 1) bucket.
 200  *
 201  * From observations, using SAS SSDs and rotational drives these values are
 202  * sufficient for now.
 203  */
 204 
 205 #define SD_LAT_MIN_USEC_SHIFT 4
 206 #define SD_LAT_MAX_USEC_SHIFT 24
 207 #define SD_LAT_BUCKET_MAX (SD_LAT_MAX_USEC_SHIFT - SD_LAT_MIN_USEC_SHIFT)
 208 
 209 typedef struct un_lat_stat {
 210         hrtime_t l_sum;                                 /* total latency  */
 211         uint64_t l_nrequest;                            /* number of requests */
 212         uint64_t l_histogram[SD_LAT_BUCKET_MAX];        /* latency histogram */
 213 } un_lat_stat_t;
 214 
 215 /* Thin-provisioning (UNMAP) flags for un_thin_flags. */
 216 enum {
 217         SD_THIN_PROV_ENABLED =          1 << 0,   /* UNMAP available */
 218         SD_THIN_PROV_READ_ZEROS =       1 << 1    /* unmapped blk = zeros */
 219 };
 220 
 221 /*
 222  * Device limits as read from the Block Limits VPD page (0xB0). If the page
 223  * is unavailable, will be filled with some defaults.
 224  */
 225 typedef struct sd_blk_limits_s {
 226         uint16_t        lim_opt_xfer_len_gran;
 227         uint32_t        lim_max_xfer_len;
 228         uint32_t        lim_opt_xfer_len;
 229         uint32_t        lim_max_pfetch_len;
 230         uint32_t        lim_max_unmap_lba_cnt;
 231         uint32_t        lim_max_unmap_descr_cnt;
 232         uint32_t        lim_opt_unmap_gran;
 233         uint32_t        lim_unmap_gran_align;
 234         uint64_t        lim_max_write_same_len;
 235 } sd_blk_limits_t;
 236 
 237 typedef struct sd_unmapstats {
 238         kstat_named_t   us_cmds;
 239         kstat_named_t   us_errs;
 240         kstat_named_t   us_extents;
 241         kstat_named_t   us_bytes;
 242 } sd_unmapstats_t;
 243 
 244 /*
 245  * sd_lun: The main data structure for a scsi logical unit.
 246  * Stored as the softstate structure for each device.
 247  */
 248 
 249 struct sd_lun {
 250 
 251         /* Back ptr to the SCSA scsi_device struct for this LUN */
 252         struct scsi_device      *un_sd;
 253 
 254         /*
 255          * Support for Auto-Request sense capability
 256          */
 257         struct buf      *un_rqs_bp;     /* ptr to request sense bp */
 258         struct scsi_pkt *un_rqs_pktp;   /* ptr to request sense scsi_pkt */
 259         int     un_sense_isbusy;        /* Busy flag for RQS buf */
 260 
 261         /*
 262          * These specify the layering chains to use with this instance. These
 263          * are initialized according to the values in the sd_chain_index_map[]
 264          * array. See the description of sd_chain_index_map[] for details.


 293         /*
 294          * The number of logical blocks on the target. This is adjusted
 295          * to be in terms of the block size specified by un_sys_blocksize
 296          * (ie, the system block size).
 297          */
 298         uint64_t        un_blockcount;
 299 
 300         /*
 301          * Various configuration data
 302          */
 303         uchar_t un_ctype;               /* Controller type */
 304         char    *un_node_type;          /* minor node type */
 305         uchar_t un_interconnect_type;   /* Interconnect for underlying HBA */
 306 
 307         uint_t  un_notready_retry_count; /* Per disk notready retry count */
 308         uint_t  un_busy_retry_count;    /* Per disk BUSY retry count */
 309 
 310         uint_t  un_retry_count;         /* Per disk retry count */
 311         uint_t  un_victim_retry_count;  /* Per disk victim retry count */
 312 

 313         uint_t  un_reset_retry_count; /* max io retries before issuing reset */
 314         ushort_t un_reserve_release_time; /* reservation release timeout */
 315 
 316         uchar_t un_reservation_type;    /* SCSI-3 or SCSI-2 */
 317         uint_t  un_max_xfer_size;       /* Maximum DMA transfer size */
 318         int     un_partial_dma_supported;
 319         int     un_buf_breakup_supported;
 320 
 321         int     un_mincdb;              /* Smallest CDB to use */
 322         int     un_maxcdb;              /* Largest CDB to use */
 323         int     un_max_hba_cdb;         /* Largest CDB supported by HBA */
 324         int     un_status_len;
 325         int     un_pkt_flags;
 326 
 327         /*
 328          * Note: un_uscsi_timeout is a "mirror" of un_cmd_timeout, adjusted
 329          * for ISCD().  Any updates to un_cmd_timeout MUST be reflected
 330          * in un_uscsi_timeout as well!
 331          */
 332         ushort_t un_cmd_timeout;        /* Timeout for completion */


 364         opaque_t        un_mhd_token;           /* scsi watch request */
 365         timeout_id_t    un_resvd_timeid;        /* for resvd recover */
 366 
 367         /* Event callback resources (photon) */
 368         ddi_eventcookie_t un_insert_event;      /* insert event */
 369         ddi_callback_id_t un_insert_cb_id;      /* insert callback */
 370         ddi_eventcookie_t un_remove_event;      /* remove event */
 371         ddi_callback_id_t un_remove_cb_id;      /* remove callback */
 372 
 373         uint_t          un_start_stop_cycle_page;       /* Saves start/stop */
 374                                                         /* cycle page */
 375         timeout_id_t    un_dcvb_timeid;         /* dlyd cv broadcast */
 376 
 377         /*
 378          * Data structures for open counts, partition info, VTOC,
 379          * stats, and other such bookkeeping info.
 380          */
 381         union   ocmap   un_ocmap;               /* open partition map */
 382         struct  kstat   *un_pstats[NSDMAP];     /* partition statistics */
 383         struct  kstat   *un_stats;              /* disk statistics */
 384         sd_unmapstats_t *un_unmapstats;         /* UNMAP stats structure */
 385         struct  kstat   *un_unmapstats_ks;      /* UNMAP kstat */
 386         kstat_t         *un_errstats;           /* for error statistics */
 387         kstat_t         *un_lat_ksp;            /* pointer to the raw kstat */
 388         un_lat_stat_t   *un_lat_stats;          /* data from the above kstat */
 389         uint64_t        un_exclopen;            /* exclusive open bitmask */
 390         ddi_devid_t     un_devid;               /* device id */
 391         uint_t          un_vpd_page_mask;       /* Supported VPD pages */
 392 
 393         /*
 394          * Bit fields for various configuration/state/status info.
 395          * Comments indicate the condition if the value of the
 396          * variable is TRUE (nonzero).
 397          */
 398         uint32_t
 399             un_f_arq_enabled            :1,     /* Auto request sense is */
 400                                                 /* currently enabled */
 401             un_f_blockcount_is_valid    :1,     /* The un_blockcount */
 402                                                 /* value is currently valid */
 403             un_f_tgt_blocksize_is_valid :1,     /* The un_tgt_blocksize */
 404                                                 /* value is currently valid */
 405             un_f_allow_bus_device_reset :1,     /* Driver may issue a BDR as */
 406                                                 /* a part of error recovery. */
 407             un_f_is_fibre               :1,     /* The device supports fibre */
 408                                                 /* channel */


 414                                                 /* Host Adapter */
 415             un_f_opt_fab_devid          :1,     /* Disk has no valid/unique */
 416                                                 /* serial number.  */
 417             un_f_opt_disable_cache      :1,     /* Read/Write disk cache is */
 418                                                 /* disabled.  */
 419             un_f_cfg_is_atapi           :1,     /* This is an ATAPI device.  */
 420             un_f_write_cache_enabled    :1,     /* device return success on */
 421                                                 /* writes before transfer to */
 422                                                 /* physical media complete */
 423             un_f_cfg_playmsf_bcd        :1,     /* Play Audio, BCD params. */
 424             un_f_cfg_readsub_bcd        :1,     /* READ SUBCHANNEL BCD resp. */
 425             un_f_cfg_read_toc_trk_bcd   :1,     /* track # is BCD */
 426             un_f_cfg_read_toc_addr_bcd  :1,     /* address is BCD */
 427             un_f_cfg_no_read_header     :1,     /* READ HEADER not supported */
 428             un_f_cfg_read_cd_xd4        :1,     /* READ CD opcode is 0xd4 */
 429             un_f_mmc_cap                :1,     /* Device is MMC compliant */
 430             un_f_mmc_writable_media     :1,     /* writable media in device */
 431             un_f_dvdram_writable_device :1,     /* DVDRAM device is writable */
 432             un_f_cfg_cdda               :1,     /* READ CDDA supported */
 433             un_f_cfg_tur_check          :1,     /* verify un_ncmds before tur */

 434             un_f_use_adaptive_throttle  :1,     /* enable/disable adaptive */
 435                                                 /* throttling */
 436             un_f_pm_is_enabled          :1,     /* PM is enabled on this */
 437                                                 /* instance */
 438             un_f_watcht_stopped         :1,     /* media watch thread flag */
 439             un_f_pkstats_enabled        :1,     /* Flag to determine if */
 440                                                 /* partition kstats are */
 441                                                 /* enabled. */
 442             un_f_disksort_disabled      :1,     /* Flag to disable disksort */
 443             un_f_lun_reset_enabled      :1,     /* Set if target supports */
 444                                                 /* SCSI Logical Unit Reset */
 445             un_f_doorlock_supported     :1,     /* Device supports Doorlock */
 446             un_f_start_stop_supported   :1,     /* device has motor */
 447             un_f_sdconf_phy_blocksize   :1;     /* take pbs from sd.conf */
 448 
 449         uint32_t
 450             un_f_mboot_supported        :1,     /* mboot supported */
 451             un_f_is_hotpluggable        :1,     /* hotpluggable */
 452             un_f_has_removable_media    :1,     /* has removable media */
 453             un_f_non_devbsize_supported :1,     /* non-512 blocksize */
 454             un_f_devid_supported        :1,     /* device ID supported */
 455             un_f_eject_media_supported  :1,     /* media can be ejected */
 456             un_f_chk_wp_open            :1,     /* check if write-protected */
 457                                                 /* when being opened */
 458             un_f_descr_format_supported :1,     /* support descriptor format */
 459                                                 /* for sense data */
 460             un_f_check_start_stop       :1,     /* needs to check if */
 461                                                 /* START-STOP command is */
 462                                                 /* supported by hardware */
 463                                                 /* before issuing it */
 464             un_f_monitor_media_state    :1,     /* need a watch thread to */
 465                                                 /* monitor device state */
 466             un_f_attach_spinup          :1,     /* spin up once the */
 467                                                 /* device is attached */


 477             un_f_sync_nv_supported      :1,     /* SYNC_NV */
 478                                                 /* bit is supported */
 479             un_f_sync_cache_required    :1,     /* flag to check if */
 480                                                 /* SYNC CACHE needs to be */
 481                                                 /* sent in sdclose */
 482             un_f_devid_transport_defined :1,    /* devid defined by transport */
 483             un_f_rmw_type                :2,    /* RMW type */
 484             un_f_power_condition_disabled :1,   /* power condition disabled */
 485                                                 /* through sd configuration */
 486             un_f_power_condition_supported :1,  /* support power condition */
 487                                                 /* field by hardware */
 488             un_f_pm_log_sense_smart     :1,     /* log sense support SMART */
 489                                                 /* feature attribute */
 490             un_f_is_solid_state         :1,     /* has solid state media */
 491             un_f_is_rotational          :1,     /* spinning rust */
 492             un_f_mmc_gesn_polling       :1,     /* use GET EVENT STATUS */
 493                                                 /* NOTIFICATION for polling */
 494             un_f_enable_rmw             :1,     /* Force RMW in sd driver */
 495             un_f_expnevent              :1,
 496             un_f_cache_mode_changeable  :1,     /* can change cache mode */
 497             un_f_detach_waiting         :1;
 498 
 499         /* Ptr to table of strings for ASC/ASCQ error message printing */
 500         struct scsi_asq_key_strings     *un_additional_codes;
 501 
 502         kcondvar_t      un_detach_cv;
 503         /*
 504          * Power Management support.
 505          *
 506          * un_pm_mutex protects, un_pm_count, un_pm_timeid, un_pm_busy,
 507          * un_pm_busy_cv, and un_pm_idle_timeid.
 508          * It's not required that SD_MUTEX be acquired before acquiring
 509          * un_pm_mutex, however if they must both be held
 510          * then acquire SD_MUTEX first.
 511          *
 512          * un_pm_count is used to indicate PM state as follows:
 513          *      less than 0 the device is powered down,
 514          *      transition from 0 ==> 1, mark the device as busy via DDI
 515          *      transition from 1 ==> 0, mark the device as idle via DDI
 516          */
 517         kmutex_t        un_pm_mutex;
 518         int             un_pm_count;            /* indicates pm state */
 519         timeout_id_t    un_pm_timeid;           /* timeout id for pm */
 520         uint_t          un_pm_busy;
 521         kcondvar_t      un_pm_busy_cv;
 522         short           un_power_level;         /* Power Level */
 523         uchar_t         un_save_state;
 524         kcondvar_t      un_suspend_cv;          /* power management */
 525         kcondvar_t      un_disk_busy_cv;        /* wait for IO completion */
 526 
 527         /* Resources used for media change callback support */
 528         kcondvar_t      un_state_cv;            /* Cond Var on mediastate */
 529         enum dkio_state un_mediastate;          /* current media state */
 530         enum dkio_state un_specified_mediastate; /* expected state */
 531         opaque_t        un_swr_token;           /* scsi_watch request token */
 532 
 533         /* Non-512 byte block support */
 534         struct kmem_cache *un_wm_cache; /* fast alloc in non-512 write case */
 535         uint_t          un_rmw_count;   /* count of read-modify-writes */
 536         struct sd_w_map *un_wm;         /* head of sd_w_map chain */
 537         uint64_t        un_rmw_incre_count;     /* count I/O */
 538         timeout_id_t    un_rmw_msg_timeid;      /* for RMW message control */
 539 
 540         /* Thin provisioning support (see SD_THIN_PROV_*) */
 541         uint64_t        un_thin_flags;
 542 
 543         /* Block limits (0xB0 VPD page) */
 544         sd_blk_limits_t un_blk_lim;
 545 
 546         /* For timeout callback to issue a START STOP UNIT command */
 547         timeout_id_t    un_startstop_timeid;
 548 
 549         /* Timeout callback handle for SD_PATH_DIRECT_PRIORITY cmd restarts */
 550         timeout_id_t    un_direct_priority_timeid;
 551 
 552         /* TRAN_FATAL_ERROR count. Cleared by TRAN_ACCEPT from scsi_transport */
 553         ulong_t         un_tran_fatal_count;
 554 
 555         timeout_id_t    un_retry_timeid;
 556 
 557         hrtime_t        un_pm_idle_time;
 558         timeout_id_t    un_pm_idle_timeid;
 559 
 560         /*
 561          * Count to determine if a Sonoma controller is in the process of
 562          * failing over, and how many I/O's are failed with the 05/94/01
 563          * sense code.
 564          */
 565         uint_t          un_sonoma_failure_count;
 566 
 567         int             un_io_time;
 568         hrtime_t        un_slow_io_threshold;
 569 
 570         /*
 571          * Support for failfast operation.
 572          */
 573         struct buf      *un_failfast_bp;
 574         struct buf      *un_failfast_headp;
 575         struct buf      *un_failfast_tailp;
 576         uint32_t        un_failfast_state;
 577         /* Callback routine active counter */
 578         short           un_in_callback;
 579 
 580         kcondvar_t      un_wcc_cv;      /* synchronize changes to */
 581                                         /* un_f_write_cache_enabled */
 582 
 583 #ifdef SD_FAULT_INJECTION

 584 #define SD_FI_MAX_BUF 65536
 585 #define SD_FI_MAX_ERROR 1024
 586         kmutex_t                        un_fi_mutex;
 587         uint_t                          sd_fi_buf_len;
 588         char                            sd_fi_log[SD_FI_MAX_BUF];
 589         struct sd_fi_pkt        *sd_fi_fifo_pkt[SD_FI_MAX_ERROR];
 590         struct sd_fi_xb         *sd_fi_fifo_xb[SD_FI_MAX_ERROR];
 591         struct sd_fi_un         *sd_fi_fifo_un[SD_FI_MAX_ERROR];
 592         struct sd_fi_arq        *sd_fi_fifo_arq[SD_FI_MAX_ERROR];
 593         struct sd_fi_tran       *sd_fi_fifo_tran[SD_FI_MAX_ERROR];
 594         uint_t                          sd_fi_fifo_start;
 595         uint_t                          sd_fi_fifo_end;
 596         uint_t                          sd_injection_mask;

 597 #endif
 598 
 599         cmlb_handle_t   un_cmlbhandle;
 600 
 601         /*
 602          * Pointer to internal struct sd_fm_internal in which
 603          * will pass necessary information for FMA ereport posting.
 604          */
 605         void            *un_fm_private;
 606 };
 607 
 608 #define SD_IS_VALID_LABEL(un)  (cmlb_is_valid(un->un_cmlbhandle))
 609 
 610 /*
 611  * Macros for conversions between "target" and "system" block sizes, and
 612  * for conversion between block counts and byte counts.  As used here,
 613  * "system" block size refers to the block size used by the kernel/
 614  * filesystem (this includes the disk label). The "target" block size
 615  * is the block size returned by the SCSI READ CAPACITY command.
 616  *


 652 #define SD_TGTBYTEOFFSET(un, sysblk, tgtblk)                            \
 653         (SD_SYSBLOCKS2BYTES(sysblk) - SD_TGTBLOCKS2BYTES(un, tgtblk))
 654 
 655 /*
 656  * Calculate the target block location from the system block location
 657  */
 658 #define SD_SYS2TGTBLOCK(un, blockcnt)                                   \
 659         (blockcnt / ((un)->un_tgt_blocksize / DEV_BSIZE))
 660 
 661 /*
 662  * Calculate the target block location from the system block location
 663  */
 664 #define SD_TGT2SYSBLOCK(un, blockcnt)                                   \
 665         (blockcnt * ((un)->un_tgt_blocksize / DEV_BSIZE))
 666 
 667 /*
 668  * SD_DEFAULT_MAX_XFER_SIZE is the default value to bound the max xfer
 669  * for physio, for devices without tagged queuing enabled.
 670  * The default for devices with tagged queuing enabled is SD_MAX_XFER_SIZE
 671  */

 672 #define SD_DEFAULT_MAX_XFER_SIZE        (256 * 1024)

 673 #define SD_MAX_XFER_SIZE                (1024 * 1024)
 674 
 675 /*
























































































 676  * Referenced for frequently-accessed members of the unit structure
 677  */
 678 #define SD_SCSI_DEVP(un)        ((un)->un_sd)
 679 #define SD_DEVINFO(un)          ((un)->un_sd->sd_dev)
 680 #define SD_INQUIRY(un)          ((un)->un_sd->sd_inq)
 681 #define SD_MUTEX(un)            (&((un)->un_sd->sd_mutex))
 682 #define SD_ADDRESS(un)          (&((un)->un_sd->sd_address))
 683 #define SD_GET_DEV(un)          (sd_make_device(SD_DEVINFO(un)))
 684 #define SD_FM_LOG(un)           (((struct sd_fm_internal *)\
 685                                 ((un)->un_fm_private))->fm_log_level)
 686 

 687 /*
 688  * Values for un_ctype
 689  */
 690 #define CTYPE_CDROM             0
 691 #define CTYPE_MD21              1       /* Obsolete! */
 692 #define CTYPE_CCS               2
 693 #define CTYPE_ROD               3
 694 #define CTYPE_PXRE              4       /* Obsolete! */
 695 
 696 #define ISCD(un)                ((un)->un_ctype == CTYPE_CDROM)
 697 #define ISROD(un)               ((un)->un_ctype == CTYPE_ROD)
 698 #define ISPXRE(un)              ((un)->un_ctype == CTYPE_PXRE)
 699 
 700 /*
 701  * This macro checks the vendor of the device to see if it is LSI. Because
 702  * LSI has some devices out there that return 'Symbios' or 'SYMBIOS', we
 703  * need to check for those also.
 704  *
 705  * This is used in some vendor specific checks.
 706  */


 887 /*
 888  * Resource type definitions for multi host control operations. Specifically,
 889  * queue and request definitions for reservation request handling between the
 890  * scsi facility callback function (sd_mhd_watch_cb) and the reservation
 891  * reclaim thread (sd_resv_reclaim_thread)
 892  */
 893 struct sd_thr_request {
 894         dev_t   dev;
 895         struct  sd_thr_request  *sd_thr_req_next;
 896 };
 897 
 898 struct sd_resv_reclaim_request {
 899         kthread_t               *srq_resv_reclaim_thread;
 900         struct  sd_thr_request  *srq_thr_req_head;
 901         struct  sd_thr_request  *srq_thr_cur_req;
 902         kcondvar_t              srq_inprocess_cv;
 903         kmutex_t                srq_resv_reclaim_mutex;
 904         kcondvar_t              srq_resv_reclaim_cv;
 905 };
 906 







 907 /*
 908  * Driver Logging Components
 909  *
 910  * These components cover the functional entry points and areas of the
 911  * driver.  A component value is used for the entry point and utility
 912  * functions used by the entry point. The common component value is used
 913  * in those routines that are called from many areas of the driver.
 914  *
 915  * This can be done by adding the following two lines to /etc/system:
 916  * set sd:sd_component_mask=0x00080000
 917  * set sd:sd_level_mask=0x00000008
 918  */
 919 #define SD_LOG_PROBE                    0x00000001
 920 #define SD_LOG_ATTACH_DETACH            0x00000002
 921 #define SD_LOG_OPEN_CLOSE               0x00000004
 922 #define SD_LOG_READ_WRITE               0x00000008
 923 #define SD_LOG_POWER                    0x00000010
 924 #define SD_LOG_IOCTL                    0x00000020
 925 #define SD_LOG_IOCTL_MHD                0x00000040
 926 #define SD_LOG_IOCTL_RMMEDIA            0x00000080


 971 #define SD_INFO         sd_log_info
 972 
 973 /* SD_DUMP_MEMORY is called to dump a data buffer to the log */
 974 #define SD_DUMP_MEMORY  sd_dump_memory
 975 
 976 /* RESET/ABORTS testing ioctls */
 977 #define DKIOCRESET      (DKIOC|14)
 978 #define DKIOCABORT      (DKIOC|15)
 979 
 980 #ifdef SD_FAULT_INJECTION
 981 /*
 982  * sd_fi_pkt replicates the variables that are exposed through pkt
 983  *
 984  * sd_fi_xb replicates the variables that are exposed through xb
 985  *
 986  * sd_fi_un replicates the variables that are exposed through un
 987  *
 988  * sd_fi_arq replicates the variables that are
 989  *           exposed for Auto-Reqeust-Sense
 990  *
 991  * sd_fi_tran HBA-level fault injection.
 992  *
 993  */
 994 struct sd_fi_pkt {
 995         uint_t  pkt_flags;                      /* flags */
 996         uchar_t pkt_scbp;                       /* pointer to status block */
 997         uchar_t pkt_cdbp;                       /* pointer to command block */
 998         uint_t  pkt_state;                      /* state of command */
 999         uint_t  pkt_statistics;         /* statistics */
1000         uchar_t pkt_reason;                     /* reason completion called */
1001 };
1002 
1003 struct sd_fi_xb {
1004         daddr_t xb_blkno;
1005         ssize_t xb_dma_resid;
1006         short   xb_retry_count;
1007         short   xb_victim_retry_count;
1008         uchar_t xb_sense_status;
1009         uint_t  xb_sense_state;
1010         ssize_t xb_sense_resid;
1011         uchar_t xb_sense_data[SENSE_LENGTH];
1012         uchar_t es_code;


1023         uchar_t un_reservation_type;
1024         ushort_t un_notrdy_delay;
1025         short   un_resvd_status;
1026         uint32_t
1027                 un_f_arq_enabled,
1028                 un_f_allow_bus_device_reset,
1029                 un_f_opt_queueing;
1030         timeout_id_t    un_restart_timeid;
1031 };
1032 
1033 struct sd_fi_arq {
1034         struct scsi_status      sts_status;
1035         struct scsi_status      sts_rqpkt_status;
1036         uchar_t                         sts_rqpkt_reason;
1037         uchar_t                         sts_rqpkt_resid;
1038         uint_t                          sts_rqpkt_state;
1039         uint_t                          sts_rqpkt_statistics;
1040         struct scsi_extended_sense      sts_sensedata;
1041 };
1042 
1043 enum sd_fi_tran_cmd {
1044         SD_FLTINJ_CMD_BUSY, /* Reject command instead of sending it to HW */
1045         SD_FLTINJ_CMD_TIMEOUT /* Time-out command. */
1046 };
1047 
1048 struct sd_fi_tran {
1049         enum sd_fi_tran_cmd tran_cmd;
1050 };
1051 
1052 /*
1053  * Conditional set def
1054  */
1055 #define SD_CONDSET(a, b, c, d)                  \
1056         { \
1057         a->c = ((fi_ ## b)->c);                   \
1058         SD_INFO(SD_LOG_IOERR, un,               \
1059                         "sd_fault_injection:"   \
1060                         "setting %s to %d\n",   \
1061                         d, ((fi_ ## b)->c));         \
1062         }
1063 
1064 /* SD FaultInjection ioctls */
1065 #define SDIOC           ('T'<<8)
1066 #define SDIOCSTART      (SDIOC|1)
1067 #define SDIOCSTOP       (SDIOC|2)
1068 #define SDIOCINSERTPKT  (SDIOC|3)
1069 #define SDIOCINSERTXB   (SDIOC|4)
1070 #define SDIOCINSERTUN   (SDIOC|5)
1071 #define SDIOCINSERTARQ  (SDIOC|6)
1072 #define SDIOCPUSH       (SDIOC|7)
1073 #define SDIOCRETRIEVE   (SDIOC|8)
1074 #define SDIOCRUN        (SDIOC|9)
1075 #define SDIOCINSERTTRAN (SDIOC|0xA)
1076 #endif
1077 
1078 #else
1079 
1080 #undef  SDDEBUG
1081 #define SD_ERROR        { if (0) sd_log_err; }
1082 #define SD_TRACE        { if (0) sd_log_trace; }
1083 #define SD_INFO         { if (0) sd_log_info; }
1084 #define SD_DUMP_MEMORY  { if (0) sd_dump_memory; }
1085 #endif
1086 
1087 
1088 /*
1089  * Miscellaneous macros
1090  */
1091 
1092 #define SD_USECTOHZ(x)                  (drv_usectohz((x)*1000000))
1093 #define SD_GET_PKT_STATUS(pktp)         ((*(pktp)->pkt_scbp) & STATUS_MASK)
1094 
1095 #define SD_BIOERROR(bp, errcode)                                        \


1108                     SD_DEVINFO((lunp)), DDI_PROP_DONTPASS,              \
1109                     SCSI_ADDR_PROP_LUN, 0);                             \
1110                 if (_lun > 0) {                                              \
1111                         (cdbp)->scc_lun = _lun;                              \
1112                 }                                                       \
1113         }
1114 
1115 #define SD_FILL_SCSI1_LUN(lunp, pktp)                                   \
1116         SD_FILL_SCSI1_LUN_CDB((lunp), (union scsi_cdb *)(pktp)->pkt_cdbp)
1117 
1118 /*
1119  * Disk driver states
1120  */
1121 
1122 #define SD_STATE_NORMAL         0
1123 #define SD_STATE_OFFLINE        1
1124 #define SD_STATE_RWAIT          2
1125 #define SD_STATE_DUMPING        3
1126 #define SD_STATE_SUSPENDED      4
1127 #define SD_STATE_PM_CHANGING    5
1128 #define SD_STATE_ATTACHING      6
1129 #define SD_STATE_ATTACH_FAILED  7
1130 
1131 /*
1132  * The table is to be interpreted as follows: The rows lists all the states
1133  * and each column is a state that a state in each row *can* reach. The entries
1134  * in the table list the event that cause that transition to take place.
1135  * For e.g.: To go from state RWAIT to SUSPENDED, event (d)-- which is the
1136  * invocation of DDI_SUSPEND-- has to take place. Note the same event could
1137  * cause the transition from one state to two different states. e.g., from
1138  * state SUSPENDED, when we get a DDI_RESUME, we just go back to the *last
1139  * state* whatever that might be. (NORMAL or OFFLINE).
1140  *
1141  *
1142  * State Transition Table:
1143  *
1144  *                    NORMAL  OFFLINE  RWAIT  DUMPING  SUSPENDED  PM_SUSPENDED
1145  *
1146  *   NORMAL              -      (a)      (b)     (c)      (d)       (h)
1147  *
1148  *   OFFLINE            (e)      -       (e)     (c)      (d)       NP
1149  *


1164  *   (f):       sdrunout() calls sdstart() which sets it NORMAL
1165  *   (g):       DDI_RESUME is called.
1166  *   (h):       Device threshold exceeded pm framework called power
1167  *              entry point or pm_lower_power called in detach.
1168  *   (i):       When new I/O come in.
1169  *    * :       When suspended, we dont change state during panic dump
1170  */
1171 
1172 
1173 #define SD_MAX_THROTTLE         256
1174 #define SD_MIN_THROTTLE         8
1175 /*
1176  * Lowest valid max. and min. throttle value.
1177  * This is set to 2 because if un_min_throttle were allowed to be 1 then
1178  * un_throttle would never get set to a value less than un_min_throttle
1179  * (0 is a special case) which means it would never get set back to
1180  * un_saved_throttle in routine sd_restore_throttle().
1181  */
1182 #define SD_LOWEST_VALID_THROTTLE        2
1183 


1184 /* Return codes for sd_send_polled_cmd() and sd_scsi_poll() */
1185 #define SD_CMD_SUCCESS                  0
1186 #define SD_CMD_FAILURE                  1
1187 #define SD_CMD_RESERVATION_CONFLICT     2
1188 #define SD_CMD_ILLEGAL_REQUEST          3
1189 #define SD_CMD_BECOMING_READY           4
1190 #define SD_CMD_CHECK_CONDITION          5
1191 
1192 /* Return codes for sd_ready_and_valid */
1193 #define SD_READY_VALID                  0
1194 #define SD_NOT_READY_VALID              1
1195 #define SD_RESERVED_BY_OTHERS           2
1196 
1197 #define SD_PATH_STANDARD                0
1198 #define SD_PATH_DIRECT                  1
1199 #define SD_PATH_DIRECT_PRIORITY         2
1200 
1201 #define SD_UNIT_ATTENTION_RETRY         40
1202 
1203 /*


1354         short   xb_victim_retry_count;
1355         short   xb_ua_retry_count;      /* unit_attention retry counter */
1356         short   xb_nr_retry_count;      /* not ready retry counter */
1357 
1358         /*
1359          * Various status and data used when a RQS command is run on
1360          * the behalf of this command.
1361          */
1362         struct buf      *xb_sense_bp;   /* back ptr to buf, for RQS */
1363         uint_t  xb_sense_state;         /* scsi_pkt state of RQS command */
1364         ssize_t xb_sense_resid;         /* residual of RQS command */
1365         uchar_t xb_sense_status;        /* scsi status byte of RQS command */
1366         uchar_t xb_sense_data[SENSE_LENGTH];    /* sense data from RQS cmd */
1367         /*
1368          * Extra sense larger than SENSE_LENGTH will be allocated
1369          * right after xb_sense_data[SENSE_LENGTH]. Please do not
1370          * add any new field after it.
1371          */
1372 };
1373 


1374 #define SD_PKT_ALLOC_SUCCESS                    0
1375 #define SD_PKT_ALLOC_FAILURE                    1
1376 #define SD_PKT_ALLOC_FAILURE_NO_DMA             2
1377 #define SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL      3
1378 #define SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL      4
1379 
1380 #define SD_GET_XBUF(bp)         ((struct sd_xbuf *)((bp)->b_private))
1381 #define SD_GET_UN(bp)           ((SD_GET_XBUF(bp))->xb_un)
1382 #define SD_GET_PKTP(bp)         ((SD_GET_XBUF(bp))->xb_pktp)
1383 #define SD_GET_BLKNO(bp)        ((SD_GET_XBUF(bp))->xb_blkno)
1384 
1385 /*
1386  * Special-purpose struct for sd_send_scsi_cmd() to pass command-specific
1387  * data through the layering chains to sd_initpkt_for_uscsi().
1388  */
1389 struct sd_uscsi_info {
1390         int                     ui_flags;
1391         struct uscsi_cmd        *ui_cmdp;
1392         /*
1393          * ui_dkc is used by sd_send_scsi_SYNCHRONIZE_CACHE() to allow
1394          * for async completion notification.
1395          */
1396         struct dk_callback      ui_dkc;
1397         /*
1398          * The following fields are to be used for FMA ereport generation.
1399          */
1400         uchar_t                 ui_pkt_reason;
1401         uint32_t                ui_pkt_state;
1402         uint32_t                ui_pkt_statistics;
1403         uint64_t                ui_lba;
1404         uint64_t                ui_ena;
1405 };
1406 


1407 /*
1408  * This structure is used to issue 'internal' command sequences from the
1409  * driver's attach(9E)/open(9E)/etc entry points. It provides a common context
1410  * for issuing command sequences, with the ability to issue a command
1411  * and provide expected/unexpected assessment of results at any code
1412  * level within the sd_ssc_t scope and preserve the information needed
1413  * produce telemetry for the problem, when needed, from a single
1414  * outer-most-scope point.
1415  *
1416  * The sd_ssc_t abstraction should result in well-structured code where
1417  * the basic code structure is not jeprodized by future localized improvement.
1418  *
1419  *   o  Scope for a sequence of commands.
1420  *   o  Within a scoped sequence of commands, provides a single top-level
1421  *      location for initiating telementry generation from captured data.
1422  *   o  Provide a common place to capture command execution data and driver
1423  *      assessment information for delivery to telemetry generation point.
1424  *   o  Mechanism to get device-as-detector (dad) and transport telemetry
1425  *      information from interrupt context (sdintr) back to the internal
1426  *      command 'driver-assessment' code.
1427  *   o  Ability to record assessment, and return information back to
1428  *      top-level telemetry generation code when an unexpected condition
1429  *      occurs.
1430  *   o  For code paths were an command itself was successful but
1431  *      the data returned looks suspect, the ability to record
1432  *      'unexpected data' conditions.
1433  *   o  Record assessment of issuing the command and interpreting
1434  *      the returned data for consumption by top-level ereport telemetry
1435  *      generation code.
1436  *   o  All data required to produce telemetry available off single data
1437  *      structure.
1438  */
1439 typedef struct {
1440         struct sd_lun           *ssc_un;
1441         struct uscsi_cmd        *ssc_uscsi_cmd;
1442         struct sd_uscsi_info    *ssc_uscsi_info;
1443         int                     ssc_flags; /* Bits for flags */
1444         char                    ssc_info[1024]; /* Buffer holding for info */
1445 } sd_ssc_t;
1446 


1447 /*
1448  * This struct switch different 'type-of-assessment'
1449  * as an input argument for sd_ssc_assessment
1450  *
1451  *
1452  * in sd_send_scsi_XXX or upper-level
1453  *
1454  * - SD_FMT_IGNORE
1455  *   when send uscsi command failed, and
1456  *   the following code check sense data properly.
1457  *   we use 'ignore' to let sd_ssc_assessment
1458  *   trust current and do not do additional
1459  *   checking for the uscsi command.
1460  *
1461  * - SD_FMT_IGNORE_COMPROMISE
1462  *   when send uscsi command failed, and
1463  *   the code does not check sense data or we don't
1464  *   think the checking is 100% coverage. We mark it
1465  *   as 'compromise' to indicate that we need to
1466  *   enhance current code in the future.


1633 {                                                                       \
1634         struct kstat *pksp = (un)->un_pstats[SDPART((bp)->b_edev)];       \
1635         if (pksp != NULL) {                                             \
1636                 kstat_io_t *kip = KSTAT_IO_PTR(pksp);                   \
1637                 size_t n_done = (bp)->b_bcount - (bp)->b_resid;           \
1638                 if ((bp)->b_flags & B_READ) {                            \
1639                         kip->reads++;                                        \
1640                         kip->nread += n_done;                                \
1641                 } else {                                                \
1642                         kip->writes++;                                       \
1643                         kip->nwritten += n_done;                     \
1644                 }                                                       \
1645         }                                                               \
1646 }
1647 
1648 
1649 #endif  /* defined(_KERNEL) || defined(_KMEMUSER) */
1650 
1651 
1652 /*
1653  * 15 seconds is a *very* reasonable amount of time for any device with retries.
1654  * Doubled for slow CD operations.
1655  */
1656 #define SD_IO_TIME                      15
1657 
1658 /*
1659  * 2 hours is an excessively reasonable amount of time for format operations.
1660  */
1661 #define SD_FMT_TIME                     (120 * 60)
1662 
1663 /*
1664  * 5 seconds is what we'll wait if we get a Busy Status back
1665  */
1666 #define SD_BSY_TIMEOUT                  (drv_usectohz(5 * 1000000))
1667 
1668 /*
1669  * 100 msec. is what we'll wait if we get Unit Attention.
1670  */
1671 #define SD_UA_RETRY_DELAY               (drv_usectohz((clock_t)100000))
1672 
1673 /*
1674  * 100 msec. is what we'll wait for restarted commands.
1675  */
1676 #define SD_RESTART_TIMEOUT              (drv_usectohz((clock_t)100000))
1677 
1678 /*
1679  * 10s misaligned I/O warning message interval
1680  */
1681 #define SD_RMW_MSG_PRINT_TIMEOUT        (drv_usectohz((clock_t)10000000))
1682 
1683 /*
1684  * 100 msec. is what we'll wait for certain retries for fibre channel
1685  * targets, 0 msec for parallel SCSI.
1686  */



1687 #define SD_RETRY_DELAY                  ((clock_t)0)

1688 
1689 /*
1690  * Number of times we'll retry a normal operation.
1691  *
1692  * This includes retries due to transport failure
1693  * (need to distinguish between Target and Transport failure)
1694  *
1695  */



1696 #define SD_RETRY_COUNT                  5

1697 
1698 /*
1699  * Number of times we will retry for unit attention.
1700  */
1701 #define SD_UA_RETRY_COUNT               25
1702 
1703 #define SD_VICTIM_RETRY_COUNT(un)       (un->un_victim_retry_count)
1704 #define CD_NOT_READY_RETRY_COUNT(un)    (un->un_retry_count * 2)
1705 #define DISK_NOT_READY_RETRY_COUNT(un)  (un->un_retry_count / 2)
1706 
1707 
1708 /*
1709  * Maximum number of units we can support
1710  * (controlled by room in minor device byte)
1711  *
1712  * Note: this value is out of date.
1713  */
1714 #define SD_MAXUNIT                      32
1715 
1716 /*
1717  * 30 seconds is what we will wait for the IO to finish
1718  * before we fail the DDI_SUSPEND
1719  */
1720 #define SD_WAIT_CMDS_COMPLETE           30
1721 


1789 #define PURPLE_RESET_RETRY_COUNT        36
1790 #define PURPLE_RESERVE_RELEASE_TIME     60
1791 #define SVE_BUSY_RETRIES                60
1792 #define SVE_RESET_RETRY_COUNT           36
1793 #define SVE_RESERVE_RELEASE_TIME        60
1794 #define SVE_THROTTLE_VALUE              10
1795 #define SVE_MIN_THROTTLE_VALUE          2
1796 #define SVE_DISKSORT_DISABLED_FLAG      1
1797 #define MASERATI_DISKSORT_DISABLED_FLAG 1
1798 #define MASERATI_LUN_RESET_ENABLED_FLAG 1
1799 #define PIRUS_THROTTLE_VALUE            64
1800 #define PIRUS_NRR_COUNT                 60
1801 #define PIRUS_BUSY_RETRIES              60
1802 #define PIRUS_RESET_RETRY_COUNT         36
1803 #define PIRUS_MIN_THROTTLE_VALUE        16
1804 #define PIRUS_DISKSORT_DISABLED_FLAG    0
1805 #define PIRUS_LUN_RESET_ENABLED_FLAG    1
1806 
1807 /*
1808  * Driver Property Bit Flag definitions



1809  */
1810 
1811 /*
1812  * Bit flag telling driver to set throttle from sd.conf sd-config-list
1813  * and driver table.
1814  *
1815  * The max throttle (q-depth) property implementation is for support of
1816  * fibre channel devices that can drop an i/o request when a queue fills
1817  * up. The number of commands sent to the disk from this driver is
1818  * regulated such that queue overflows are avoided.
1819  */
1820 #define SD_CONF_SET_THROTTLE            0
1821 #define SD_CONF_BSET_THROTTLE           (1 << SD_CONF_SET_THROTTLE)
1822 
1823 /*
1824  * Bit flag telling driver to set the controller type from sd.conf
1825  * sd-config-list and driver table.
1826  */

1827 #define SD_CONF_SET_CTYPE               1





1828 #define SD_CONF_BSET_CTYPE              (1 << SD_CONF_SET_CTYPE)
1829 
1830 /*
1831  * Bit flag telling driver to set the not ready retry count for a device from
1832  * sd.conf sd-config-list and driver table.
1833  */

1834 #define SD_CONF_SET_NOTREADY_RETRIES    10





1835 #define SD_CONF_BSET_NRR_COUNT          (1 << SD_CONF_SET_NOTREADY_RETRIES)
1836 
1837 /*
1838  * Bit flag telling driver to set SCSI status BUSY Retries from sd.conf
1839  * sd-config-list and driver table.
1840  */

1841 #define SD_CONF_SET_BUSY_RETRIES        11





1842 #define SD_CONF_BSET_BSY_RETRY_COUNT    (1 << SD_CONF_SET_BUSY_RETRIES)
1843 
1844 /*
1845  * Bit flag telling driver that device does not have a valid/unique serial
1846  * number.
1847  */

1848 #define SD_CONF_SET_FAB_DEVID           2



1849 #define SD_CONF_BSET_FAB_DEVID          (1 << SD_CONF_SET_FAB_DEVID)
1850 
1851 /*
1852  * Bit flag telling driver to disable all caching for disk device.
1853  */

1854 #define SD_CONF_SET_NOCACHE             3



1855 #define SD_CONF_BSET_NOCACHE            (1 << SD_CONF_SET_NOCACHE)
1856 
1857 /*
1858  * Bit flag telling driver that the PLAY AUDIO command requires parms in BCD
1859  * format rather than binary.
1860  */

1861 #define SD_CONF_SET_PLAYMSF_BCD         4



1862 #define SD_CONF_BSET_PLAYMSF_BCD        (1 << SD_CONF_SET_PLAYMSF_BCD)
1863 
1864 /*
1865  * Bit flag telling driver that the response from the READ SUBCHANNEL command
1866  * has BCD fields rather than binary.
1867  */

1868 #define SD_CONF_SET_READSUB_BCD         5



1869 #define SD_CONF_BSET_READSUB_BCD        (1 << SD_CONF_SET_READSUB_BCD)
1870 
1871 /*
1872  * Bit in flags telling driver that the track number fields in the READ TOC
1873  * request and respone are in BCD rather than binary.
1874  */

1875 #define SD_CONF_SET_READ_TOC_TRK_BCD    6



1876 #define SD_CONF_BSET_READ_TOC_TRK_BCD   (1 << SD_CONF_SET_READ_TOC_TRK_BCD)
1877 
1878 /*
1879  * Bit flag telling driver that the address fields in the READ TOC request and
1880  * respone are in BCD rather than binary.
1881  */

1882 #define SD_CONF_SET_READ_TOC_ADDR_BCD   7



1883 #define SD_CONF_BSET_READ_TOC_ADDR_BCD  (1 << SD_CONF_SET_READ_TOC_ADDR_BCD)
1884 
1885 /*
1886  * Bit flag telling the driver that the device doesn't support the READ HEADER
1887  * command.
1888  */

1889 #define SD_CONF_SET_NO_READ_HEADER      8



1890 #define SD_CONF_BSET_NO_READ_HEADER     (1 << SD_CONF_SET_NO_READ_HEADER)
1891 
1892 /*
1893  * Bit flag telling the driver that for the READ CD command the device uses
1894  * opcode 0xd4 rather than 0xbe.
1895  */

1896 #define SD_CONF_SET_READ_CD_XD4         9



1897 #define SD_CONF_BSET_READ_CD_XD4        (1 << SD_CONF_SET_READ_CD_XD4)
1898 
1899 /*
1900  * Bit flag telling the driver to set SCSI status Reset Retries
1901  * (un_reset_retry_count) from sd.conf sd-config-list and driver table (4356701)
1902  */
1903 #define SD_CONF_SET_RST_RETRIES         12
1904 #define SD_CONF_BSET_RST_RETRIES        (1 << SD_CONF_SET_RST_RETRIES)
1905 
1906 /*
1907  * Bit flag telling the driver to set the reservation release timeout value
1908  * from sd.conf sd-config-list and driver table. (4367306)
1909  */
1910 #define SD_CONF_SET_RSV_REL_TIME        13
1911 #define SD_CONF_BSET_RSV_REL_TIME       (1 << SD_CONF_SET_RSV_REL_TIME)
1912 
1913 /*
1914  * Bit flag telling the driver to verify that no commands are pending for a
1915  * device before issuing a Test Unit Ready. This is a fw workaround for Seagate
1916  * eliteI drives. (4392016)
1917  */
1918 #define SD_CONF_SET_TUR_CHECK           14
1919 #define SD_CONF_BSET_TUR_CHECK          (1 << SD_CONF_SET_TUR_CHECK)
1920 
1921 /*
1922  * Bit in flags telling driver to set min. throttle from sd.conf
1923  * sd-config-list and driver table.
1924  */
1925 #define SD_CONF_SET_MIN_THROTTLE        15
1926 #define SD_CONF_BSET_MIN_THROTTLE       (1 << SD_CONF_SET_MIN_THROTTLE)
1927 
1928 /*
1929  * Bit in flags telling driver to set disksort disable flag from sd.conf
1930  * sd-config-list and driver table.
1931  */
1932 #define SD_CONF_SET_DISKSORT_DISABLED   16
1933 #define SD_CONF_BSET_DISKSORT_DISABLED  (1 << SD_CONF_SET_DISKSORT_DISABLED)
1934 
1935 /*
1936  * Bit in flags telling driver to set LUN Reset enable flag from sd.conf
1937  * sd-config-list and driver table.
1938  */
1939 #define SD_CONF_SET_LUN_RESET_ENABLED   17
1940 #define SD_CONF_BSET_LUN_RESET_ENABLED  (1 << SD_CONF_SET_LUN_RESET_ENABLED)
1941 
1942 /*
1943  * Bit in flags telling driver that the write cache on the device is
1944  * non-volatile.
1945  */
1946 #define SD_CONF_SET_CACHE_IS_NV         18
1947 #define SD_CONF_BSET_CACHE_IS_NV        (1 << SD_CONF_SET_CACHE_IS_NV)
1948 
1949 /*
1950  * Bit in flags telling driver that the power condition flag from sd.conf
1951  * sd-config-list and driver table.
1952  */
1953 #define SD_CONF_SET_PC_DISABLED         19
1954 #define SD_CONF_BSET_PC_DISABLED        (1 << SD_CONF_SET_PC_DISABLED)
1955 
1956 /*
1957  * This is the number of items currently settable in the sd.conf
1958  * sd-config-list.  The mask value is defined for parameter checking. The
1959  * item count and mask should be updated when new properties are added.
1960  */
1961 #define SD_CONF_MAX_ITEMS               19
1962 #define SD_CONF_BIT_MASK                0x0007FFFF
1963 
1964 typedef struct {
1965         int sdt_throttle;
1966         int sdt_ctype;
1967         int sdt_not_rdy_retries;
1968         int sdt_busy_retries;
1969         int sdt_reset_retries;
1970         int sdt_reserv_rel_time;
1971         int sdt_min_throttle;


2037 
2038 /*
2039  * These belong in sys/scsi/generic/mode.h
2040  */
2041 
2042 /*
2043  * Mode Sense/Select Header response for Group 2 CDB.
2044  */
2045 
2046 struct mode_header_grp2 {
2047         uchar_t length_msb;             /* MSB - number of bytes following */
2048         uchar_t length_lsb;
2049         uchar_t medium_type;            /* device specific */
2050         uchar_t device_specific;        /* device specfic parameters */
2051         uchar_t resv[2];                /* reserved */
2052         uchar_t bdesc_length_hi;        /* length of block descriptor(s) */
2053                                         /* (if any) */
2054         uchar_t bdesc_length_lo;
2055 };
2056 


2057 /*
2058  * Length of the Mode Parameter Header for the Group 2 Mode Select command
2059  */
2060 #define MODE_HEADER_LENGTH_GRP2 (sizeof (struct mode_header_grp2))
2061 #define MODE_PARAM_LENGTH_GRP2 (MODE_HEADER_LENGTH_GRP2 + MODE_BLK_DESC_LENGTH)
2062 
2063 /*
2064  * Mode Page 1 - Error Recovery Page
2065  */
2066 #define MODEPAGE_ERR_RECOVER            1
2067 
2068 /*
2069  * The following buffer length define is 8 bytes for the Group 2 mode page
2070  * header, 8 bytes for the block descriptor and 26 bytes for the cdrom
2071  * capabilities page (per MMC-2)
2072  */
2073 #define MODEPAGE_CDROM_CAP              0x2A
2074 #define MODEPAGE_CDROM_CAP_LEN          26
2075 #define BUFLEN_MODE_CDROM_CAP           (MODEPAGE_CDROM_CAP_LEN + \
2076         MODE_HEADER_LENGTH_GRP2 + MODE_BLK_DESC_LENGTH)


2240 #define TEMPERATURE_PAGE                        0x0D
2241 #define TEMPERATURE_PAGE_SIZE                   16      /* bytes */
2242 
2243 /* delay time used for sd_media_watch_cb delayed cv broadcast */
2244 #define MEDIA_ACCESS_DELAY 2000000
2245 
2246 
2247 /* SCSI power on or bus device reset additional sense code */
2248 #define SD_SCSI_RESET_SENSE_CODE        0x29
2249 
2250 /*
2251  * These defines are for the Vital Product Data Pages in the inquiry command.
2252  * They are the bits in the un_vpd_page mask, telling the supported pages.
2253  */
2254 #define SD_VPD_SUPPORTED_PG     0x01    /* 0x00 - Supported VPD pages */
2255 #define SD_VPD_UNIT_SERIAL_PG   0x02    /* 0x80 - Unit Serial Number */
2256 #define SD_VPD_OPERATING_PG     0x04    /* 0x81 - Implemented Op Defs */
2257 #define SD_VPD_ASCII_OP_PG      0x08    /* 0x82 - ASCII Op Defs */
2258 #define SD_VPD_DEVID_WWN_PG     0x10    /* 0x83 - Device Identification */
2259 #define SD_VPD_EXTENDED_DATA_PG 0x80    /* 0x86 - Extended data about the lun */
2260 #define SD_VPD_BLK_LIMITS_PG    0x400   /* 0xB0 - Block Limits */
2261 #define SD_VPD_DEV_CHARACTER_PG 0x800   /* 0xB1 - Device Characteristics */
2262 
2263 /*
2264  * Non-volatile cache support
2265  *
2266  * Bit 1 of the byte 6 in the Extended INQUIRY data VPD page
2267  * is NV_SUP bit: An NV_SUP bit set to one indicates that
2268  * the device server supports a non-volatile cache.  An
2269  * NV_SUP bit set to zero indicates that the device
2270  * server may or may not support a non-volatile cache.
2271  *
2272  * Bit 2 of the byte 1 in the SYNC CACHE command is SYNC_NV
2273  * bit: The SYNC_NV bit specifies whether the device server
2274  * is required to synchronize volatile and non-volatile
2275  * caches.
2276  */
2277 #define SD_VPD_NV_SUP   0x02
2278 #define SD_SYNC_NV_BIT 0x04
2279 













2280 #ifdef  __cplusplus
2281 }
2282 #endif
2283 
2284 
2285 #endif  /* _SYS_SCSI_TARGETS_SDDEF_H */