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  * Copyright (c) 2011 Bayard G. Bell.  All rights reserved.
  27  * Copyright (c) 2012 by Delphix. All rights reserved.
  28  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
  29  * Copyright 2012 DEY Storage Systems, Inc.  All rights reserved.
  30  */
  31 /*
  32  * Copyright 2011 cyril.galibern@opensvc.com
  33  */
  34 
  35 /*
  36  * SCSI disk target driver.
  37  */
  38 #include <sys/scsi/scsi.h>
  39 #include <sys/dkbad.h>
  40 #include <sys/dklabel.h>
  41 #include <sys/dkio.h>
  42 #include <sys/fdio.h>
  43 #include <sys/cdio.h>
  44 #include <sys/mhd.h>
  45 #include <sys/vtoc.h>
  46 #include <sys/dktp/fdisk.h>
  47 #include <sys/kstat.h>
  48 #include <sys/vtrace.h>
  49 #include <sys/note.h>
  50 #include <sys/thread.h>
  51 #include <sys/proc.h>
  52 #include <sys/efi_partition.h>
  53 #include <sys/var.h>
  54 #include <sys/aio_req.h>
  55 
  56 #ifdef __lock_lint
  57 #define _LP64
  58 #define __amd64
  59 #endif
  60 
  61 #if (defined(__fibre))
  62 /* Note: is there a leadville version of the following? */
  63 #include <sys/fc4/fcal_linkapp.h>
  64 #endif
  65 #include <sys/taskq.h>
  66 #include <sys/uuid.h>
  67 #include <sys/byteorder.h>
  68 #include <sys/sdt.h>
  69 
  70 #include "sd_xbuf.h"
  71 
  72 #include <sys/scsi/targets/sddef.h>
  73 #include <sys/cmlb.h>
  74 #include <sys/sysevent/eventdefs.h>
  75 #include <sys/sysevent/dev.h>
  76 
  77 #include <sys/fm/protocol.h>
  78 
  79 /*
  80  * Loadable module info.
  81  */
  82 #if (defined(__fibre))
  83 #define SD_MODULE_NAME  "SCSI SSA/FCAL Disk Driver"
  84 #else /* !__fibre */
  85 #define SD_MODULE_NAME  "SCSI Disk Driver"
  86 #endif /* !__fibre */
  87 
  88 /*
  89  * Define the interconnect type, to allow the driver to distinguish
  90  * between parallel SCSI (sd) and fibre channel (ssd) behaviors.
  91  *
  92  * This is really for backward compatibility. In the future, the driver
  93  * should actually check the "interconnect-type" property as reported by
  94  * the HBA; however at present this property is not defined by all HBAs,
  95  * so we will use this #define (1) to permit the driver to run in
  96  * backward-compatibility mode; and (2) to print a notification message
  97  * if an FC HBA does not support the "interconnect-type" property.  The
  98  * behavior of the driver will be to assume parallel SCSI behaviors unless
  99  * the "interconnect-type" property is defined by the HBA **AND** has a
 100  * value of either INTERCONNECT_FIBRE, INTERCONNECT_SSA, or
 101  * INTERCONNECT_FABRIC, in which case the driver will assume Fibre
 102  * Channel behaviors (as per the old ssd).  (Note that the
 103  * INTERCONNECT_1394 and INTERCONNECT_USB types are not supported and
 104  * will result in the driver assuming parallel SCSI behaviors.)
 105  *
 106  * (see common/sys/scsi/impl/services.h)
 107  *
 108  * Note: For ssd semantics, don't use INTERCONNECT_FABRIC as the default
 109  * since some FC HBAs may already support that, and there is some code in
 110  * the driver that already looks for it.  Using INTERCONNECT_FABRIC as the
 111  * default would confuse that code, and besides things should work fine
 112  * anyways if the FC HBA already reports INTERCONNECT_FABRIC for the
 113  * "interconnect_type" property.
 114  *
 115  */
 116 #if (defined(__fibre))
 117 #define SD_DEFAULT_INTERCONNECT_TYPE    SD_INTERCONNECT_FIBRE
 118 #else
 119 #define SD_DEFAULT_INTERCONNECT_TYPE    SD_INTERCONNECT_PARALLEL
 120 #endif
 121 
 122 /*
 123  * The name of the driver, established from the module name in _init.
 124  */
 125 static  char *sd_label                  = NULL;
 126 
 127 /*
 128  * Driver name is unfortunately prefixed on some driver.conf properties.
 129  */
 130 #if (defined(__fibre))
 131 #define sd_max_xfer_size                ssd_max_xfer_size
 132 #define sd_config_list                  ssd_config_list
 133 static  char *sd_max_xfer_size          = "ssd_max_xfer_size";
 134 static  char *sd_config_list            = "ssd-config-list";
 135 #else
 136 static  char *sd_max_xfer_size          = "sd_max_xfer_size";
 137 static  char *sd_config_list            = "sd-config-list";
 138 #endif
 139 
 140 /*
 141  * Driver global variables
 142  */
 143 
 144 #if (defined(__fibre))
 145 /*
 146  * These #defines are to avoid namespace collisions that occur because this
 147  * code is currently used to compile two separate driver modules: sd and ssd.
 148  * All global variables need to be treated this way (even if declared static)
 149  * in order to allow the debugger to resolve the names properly.
 150  * It is anticipated that in the near future the ssd module will be obsoleted,
 151  * at which time this namespace issue should go away.
 152  */
 153 #define sd_state                        ssd_state
 154 #define sd_io_time                      ssd_io_time
 155 #define sd_failfast_enable              ssd_failfast_enable
 156 #define sd_ua_retry_count               ssd_ua_retry_count
 157 #define sd_report_pfa                   ssd_report_pfa
 158 #define sd_max_throttle                 ssd_max_throttle
 159 #define sd_min_throttle                 ssd_min_throttle
 160 #define sd_rot_delay                    ssd_rot_delay
 161 
 162 #define sd_retry_on_reservation_conflict        \
 163                                         ssd_retry_on_reservation_conflict
 164 #define sd_reinstate_resv_delay         ssd_reinstate_resv_delay
 165 #define sd_resv_conflict_name           ssd_resv_conflict_name
 166 
 167 #define sd_component_mask               ssd_component_mask
 168 #define sd_level_mask                   ssd_level_mask
 169 #define sd_debug_un                     ssd_debug_un
 170 #define sd_error_level                  ssd_error_level
 171 
 172 #define sd_xbuf_active_limit            ssd_xbuf_active_limit
 173 #define sd_xbuf_reserve_limit           ssd_xbuf_reserve_limit
 174 
 175 #define sd_tr                           ssd_tr
 176 #define sd_reset_throttle_timeout       ssd_reset_throttle_timeout
 177 #define sd_qfull_throttle_timeout       ssd_qfull_throttle_timeout
 178 #define sd_qfull_throttle_enable        ssd_qfull_throttle_enable
 179 #define sd_check_media_time             ssd_check_media_time
 180 #define sd_wait_cmds_complete           ssd_wait_cmds_complete
 181 #define sd_label_mutex                  ssd_label_mutex
 182 #define sd_detach_mutex                 ssd_detach_mutex
 183 #define sd_log_buf                      ssd_log_buf
 184 #define sd_log_mutex                    ssd_log_mutex
 185 
 186 #define sd_disk_table                   ssd_disk_table
 187 #define sd_disk_table_size              ssd_disk_table_size
 188 #define sd_sense_mutex                  ssd_sense_mutex
 189 #define sd_cdbtab                       ssd_cdbtab
 190 
 191 #define sd_cb_ops                       ssd_cb_ops
 192 #define sd_ops                          ssd_ops
 193 #define sd_additional_codes             ssd_additional_codes
 194 #define sd_tgops                        ssd_tgops
 195 
 196 #define sd_minor_data                   ssd_minor_data
 197 #define sd_minor_data_efi               ssd_minor_data_efi
 198 
 199 #define sd_tq                           ssd_tq
 200 #define sd_wmr_tq                       ssd_wmr_tq
 201 #define sd_taskq_name                   ssd_taskq_name
 202 #define sd_wmr_taskq_name               ssd_wmr_taskq_name
 203 #define sd_taskq_minalloc               ssd_taskq_minalloc
 204 #define sd_taskq_maxalloc               ssd_taskq_maxalloc
 205 
 206 #define sd_dump_format_string           ssd_dump_format_string
 207 
 208 #define sd_iostart_chain                ssd_iostart_chain
 209 #define sd_iodone_chain                 ssd_iodone_chain
 210 
 211 #define sd_pm_idletime                  ssd_pm_idletime
 212 
 213 #define sd_force_pm_supported           ssd_force_pm_supported
 214 
 215 #define sd_dtype_optical_bind           ssd_dtype_optical_bind
 216 
 217 #define sd_ssc_init                     ssd_ssc_init
 218 #define sd_ssc_send                     ssd_ssc_send
 219 #define sd_ssc_fini                     ssd_ssc_fini
 220 #define sd_ssc_assessment               ssd_ssc_assessment
 221 #define sd_ssc_post                     ssd_ssc_post
 222 #define sd_ssc_print                    ssd_ssc_print
 223 #define sd_ssc_ereport_post             ssd_ssc_ereport_post
 224 #define sd_ssc_set_info                 ssd_ssc_set_info
 225 #define sd_ssc_extract_info             ssd_ssc_extract_info
 226 
 227 #endif
 228 
 229 #ifdef  SDDEBUG
 230 int     sd_force_pm_supported           = 0;
 231 #endif  /* SDDEBUG */
 232 
 233 void *sd_state                          = NULL;
 234 int sd_io_time                          = SD_IO_TIME;
 235 int sd_failfast_enable                  = 1;
 236 int sd_ua_retry_count                   = SD_UA_RETRY_COUNT;
 237 int sd_report_pfa                       = 1;
 238 int sd_max_throttle                     = SD_MAX_THROTTLE;
 239 int sd_min_throttle                     = SD_MIN_THROTTLE;
 240 int sd_rot_delay                        = 4; /* Default 4ms Rotation delay */
 241 int sd_qfull_throttle_enable            = TRUE;
 242 
 243 int sd_retry_on_reservation_conflict    = 1;
 244 int sd_reinstate_resv_delay             = SD_REINSTATE_RESV_DELAY;
 245 _NOTE(SCHEME_PROTECTS_DATA("safe sharing", sd_reinstate_resv_delay))
 246 
 247 static int sd_dtype_optical_bind        = -1;
 248 
 249 /* Note: the following is not a bug, it really is "sd_" and not "ssd_" */
 250 static  char *sd_resv_conflict_name     = "sd_retry_on_reservation_conflict";
 251 
 252 /*
 253  * Global data for debug logging. To enable debug printing, sd_component_mask
 254  * and sd_level_mask should be set to the desired bit patterns as outlined in
 255  * sddef.h.
 256  */
 257 uint_t  sd_component_mask               = 0x0;
 258 uint_t  sd_level_mask                   = 0x0;
 259 struct  sd_lun *sd_debug_un             = NULL;
 260 uint_t  sd_error_level                  = SCSI_ERR_RETRYABLE;
 261 
 262 /* Note: these may go away in the future... */
 263 static uint32_t sd_xbuf_active_limit    = 512;
 264 static uint32_t sd_xbuf_reserve_limit   = 16;
 265 
 266 static struct sd_resv_reclaim_request   sd_tr = { NULL, NULL, NULL, {0} };
 267 
 268 /*
 269  * Timer value used to reset the throttle after it has been reduced
 270  * (typically in response to TRAN_BUSY or STATUS_QFULL)
 271  */
 272 static int sd_reset_throttle_timeout    = SD_RESET_THROTTLE_TIMEOUT;
 273 static int sd_qfull_throttle_timeout    = SD_QFULL_THROTTLE_TIMEOUT;
 274 
 275 /*
 276  * Interval value associated with the media change scsi watch.
 277  */
 278 static int sd_check_media_time          = 3000000;
 279 
 280 /*
 281  * Wait value used for in progress operations during a DDI_SUSPEND
 282  */
 283 static int sd_wait_cmds_complete        = SD_WAIT_CMDS_COMPLETE;
 284 
 285 /*
 286  * sd_label_mutex protects a static buffer used in the disk label
 287  * component of the driver
 288  */
 289 static kmutex_t sd_label_mutex;
 290 
 291 /*
 292  * sd_detach_mutex protects un_layer_count, un_detach_count, and
 293  * un_opens_in_progress in the sd_lun structure.
 294  */
 295 static kmutex_t sd_detach_mutex;
 296 
 297 _NOTE(MUTEX_PROTECTS_DATA(sd_detach_mutex,
 298         sd_lun::{un_layer_count un_detach_count un_opens_in_progress}))
 299 
 300 /*
 301  * Global buffer and mutex for debug logging
 302  */
 303 static char     sd_log_buf[1024];
 304 static kmutex_t sd_log_mutex;
 305 
 306 /*
 307  * Structs and globals for recording attached lun information.
 308  * This maintains a chain. Each node in the chain represents a SCSI controller.
 309  * The structure records the number of luns attached to each target connected
 310  * with the controller.
 311  * For parallel scsi device only.
 312  */
 313 struct sd_scsi_hba_tgt_lun {
 314         struct sd_scsi_hba_tgt_lun      *next;
 315         dev_info_t                      *pdip;
 316         int                             nlun[NTARGETS_WIDE];
 317 };
 318 
 319 /*
 320  * Flag to indicate the lun is attached or detached
 321  */
 322 #define SD_SCSI_LUN_ATTACH      0
 323 #define SD_SCSI_LUN_DETACH      1
 324 
 325 static kmutex_t sd_scsi_target_lun_mutex;
 326 static struct sd_scsi_hba_tgt_lun       *sd_scsi_target_lun_head = NULL;
 327 
 328 _NOTE(MUTEX_PROTECTS_DATA(sd_scsi_target_lun_mutex,
 329     sd_scsi_hba_tgt_lun::next sd_scsi_hba_tgt_lun::pdip))
 330 
 331 _NOTE(MUTEX_PROTECTS_DATA(sd_scsi_target_lun_mutex,
 332     sd_scsi_target_lun_head))
 333 
 334 /*
 335  * "Smart" Probe Caching structs, globals, #defines, etc.
 336  * For parallel scsi and non-self-identify device only.
 337  */
 338 
 339 /*
 340  * The following resources and routines are implemented to support
 341  * "smart" probing, which caches the scsi_probe() results in an array,
 342  * in order to help avoid long probe times.
 343  */
 344 struct sd_scsi_probe_cache {
 345         struct  sd_scsi_probe_cache     *next;
 346         dev_info_t      *pdip;
 347         int             cache[NTARGETS_WIDE];
 348 };
 349 
 350 static kmutex_t sd_scsi_probe_cache_mutex;
 351 static struct   sd_scsi_probe_cache *sd_scsi_probe_cache_head = NULL;
 352 
 353 /*
 354  * Really we only need protection on the head of the linked list, but
 355  * better safe than sorry.
 356  */
 357 _NOTE(MUTEX_PROTECTS_DATA(sd_scsi_probe_cache_mutex,
 358     sd_scsi_probe_cache::next sd_scsi_probe_cache::pdip))
 359 
 360 _NOTE(MUTEX_PROTECTS_DATA(sd_scsi_probe_cache_mutex,
 361     sd_scsi_probe_cache_head))
 362 
 363 /*
 364  * Power attribute table
 365  */
 366 static sd_power_attr_ss sd_pwr_ss = {
 367         { "NAME=spindle-motor", "0=off", "1=on", NULL },
 368         {0, 100},
 369         {30, 0},
 370         {20000, 0}
 371 };
 372 
 373 static sd_power_attr_pc sd_pwr_pc = {
 374         { "NAME=spindle-motor", "0=stopped", "1=standby", "2=idle",
 375                 "3=active", NULL },
 376         {0, 0, 0, 100},
 377         {90, 90, 20, 0},
 378         {15000, 15000, 1000, 0}
 379 };
 380 
 381 /*
 382  * Power level to power condition
 383  */
 384 static int sd_pl2pc[] = {
 385         SD_TARGET_START_VALID,
 386         SD_TARGET_STANDBY,
 387         SD_TARGET_IDLE,
 388         SD_TARGET_ACTIVE
 389 };
 390 
 391 /*
 392  * Vendor specific data name property declarations
 393  */
 394 
 395 #if defined(__fibre) || defined(__i386) ||defined(__amd64)
 396 
 397 static sd_tunables seagate_properties = {
 398         SEAGATE_THROTTLE_VALUE,
 399         0,
 400         0,
 401         0,
 402         0,
 403         0,
 404         0,
 405         0,
 406         0
 407 };
 408 
 409 
 410 static sd_tunables fujitsu_properties = {
 411         FUJITSU_THROTTLE_VALUE,
 412         0,
 413         0,
 414         0,
 415         0,
 416         0,
 417         0,
 418         0,
 419         0
 420 };
 421 
 422 static sd_tunables ibm_properties = {
 423         IBM_THROTTLE_VALUE,
 424         0,
 425         0,
 426         0,
 427         0,
 428         0,
 429         0,
 430         0,
 431         0
 432 };
 433 
 434 static sd_tunables purple_properties = {
 435         PURPLE_THROTTLE_VALUE,
 436         0,
 437         0,
 438         PURPLE_BUSY_RETRIES,
 439         PURPLE_RESET_RETRY_COUNT,
 440         PURPLE_RESERVE_RELEASE_TIME,
 441         0,
 442         0,
 443         0
 444 };
 445 
 446 static sd_tunables sve_properties = {
 447         SVE_THROTTLE_VALUE,
 448         0,
 449         0,
 450         SVE_BUSY_RETRIES,
 451         SVE_RESET_RETRY_COUNT,
 452         SVE_RESERVE_RELEASE_TIME,
 453         SVE_MIN_THROTTLE_VALUE,
 454         SVE_DISKSORT_DISABLED_FLAG,
 455         0
 456 };
 457 
 458 static sd_tunables maserati_properties = {
 459         0,
 460         0,
 461         0,
 462         0,
 463         0,
 464         0,
 465         0,
 466         MASERATI_DISKSORT_DISABLED_FLAG,
 467         MASERATI_LUN_RESET_ENABLED_FLAG
 468 };
 469 
 470 static sd_tunables pirus_properties = {
 471         PIRUS_THROTTLE_VALUE,
 472         0,
 473         PIRUS_NRR_COUNT,
 474         PIRUS_BUSY_RETRIES,
 475         PIRUS_RESET_RETRY_COUNT,
 476         0,
 477         PIRUS_MIN_THROTTLE_VALUE,
 478         PIRUS_DISKSORT_DISABLED_FLAG,
 479         PIRUS_LUN_RESET_ENABLED_FLAG
 480 };
 481 
 482 #endif
 483 
 484 #if (defined(__sparc) && !defined(__fibre)) || \
 485         (defined(__i386) || defined(__amd64))
 486 
 487 
 488 static sd_tunables elite_properties = {
 489         ELITE_THROTTLE_VALUE,
 490         0,
 491         0,
 492         0,
 493         0,
 494         0,
 495         0,
 496         0,
 497         0
 498 };
 499 
 500 static sd_tunables st31200n_properties = {
 501         ST31200N_THROTTLE_VALUE,
 502         0,
 503         0,
 504         0,
 505         0,
 506         0,
 507         0,
 508         0,
 509         0
 510 };
 511 
 512 #endif /* Fibre or not */
 513 
 514 static sd_tunables lsi_properties_scsi = {
 515         LSI_THROTTLE_VALUE,
 516         0,
 517         LSI_NOTREADY_RETRIES,
 518         0,
 519         0,
 520         0,
 521         0,
 522         0,
 523         0
 524 };
 525 
 526 static sd_tunables symbios_properties = {
 527         SYMBIOS_THROTTLE_VALUE,
 528         0,
 529         SYMBIOS_NOTREADY_RETRIES,
 530         0,
 531         0,
 532         0,
 533         0,
 534         0,
 535         0
 536 };
 537 
 538 static sd_tunables lsi_properties = {
 539         0,
 540         0,
 541         LSI_NOTREADY_RETRIES,
 542         0,
 543         0,
 544         0,
 545         0,
 546         0,
 547         0
 548 };
 549 
 550 static sd_tunables lsi_oem_properties = {
 551         0,
 552         0,
 553         LSI_OEM_NOTREADY_RETRIES,
 554         0,
 555         0,
 556         0,
 557         0,
 558         0,
 559         0,
 560         1
 561 };
 562 
 563 
 564 
 565 #if (defined(SD_PROP_TST))
 566 
 567 #define SD_TST_CTYPE_VAL        CTYPE_CDROM
 568 #define SD_TST_THROTTLE_VAL     16
 569 #define SD_TST_NOTREADY_VAL     12
 570 #define SD_TST_BUSY_VAL         60
 571 #define SD_TST_RST_RETRY_VAL    36
 572 #define SD_TST_RSV_REL_TIME     60
 573 
 574 static sd_tunables tst_properties = {
 575         SD_TST_THROTTLE_VAL,
 576         SD_TST_CTYPE_VAL,
 577         SD_TST_NOTREADY_VAL,
 578         SD_TST_BUSY_VAL,
 579         SD_TST_RST_RETRY_VAL,
 580         SD_TST_RSV_REL_TIME,
 581         0,
 582         0,
 583         0
 584 };
 585 #endif
 586 
 587 /* This is similar to the ANSI toupper implementation */
 588 #define SD_TOUPPER(C)   (((C) >= 'a' && (C) <= 'z') ? (C) - 'a' + 'A' : (C))
 589 
 590 /*
 591  * Static Driver Configuration Table
 592  *
 593  * This is the table of disks which need throttle adjustment (or, perhaps
 594  * something else as defined by the flags at a future time.)  device_id
 595  * is a string consisting of concatenated vid (vendor), pid (product/model)
 596  * and revision strings as defined in the scsi_inquiry structure.  Offsets of
 597  * the parts of the string are as defined by the sizes in the scsi_inquiry
 598  * structure.  Device type is searched as far as the device_id string is
 599  * defined.  Flags defines which values are to be set in the driver from the
 600  * properties list.
 601  *
 602  * Entries below which begin and end with a "*" are a special case.
 603  * These do not have a specific vendor, and the string which follows
 604  * can appear anywhere in the 16 byte PID portion of the inquiry data.
 605  *
 606  * Entries below which begin and end with a " " (blank) are a special
 607  * case. The comparison function will treat multiple consecutive blanks
 608  * as equivalent to a single blank. For example, this causes a
 609  * sd_disk_table entry of " NEC CDROM " to match a device's id string
 610  * of  "NEC       CDROM".
 611  *
 612  * Note: The MD21 controller type has been obsoleted.
 613  *       ST318202F is a Legacy device
 614  *       MAM3182FC, MAM3364FC, MAM3738FC do not appear to have ever been
 615  *       made with an FC connection. The entries here are a legacy.
 616  */
 617 static sd_disk_config_t sd_disk_table[] = {
 618 #if defined(__fibre) || defined(__i386) || defined(__amd64)
 619         { "SEAGATE ST34371FC", SD_CONF_BSET_THROTTLE, &seagate_properties },
 620         { "SEAGATE ST19171FC", SD_CONF_BSET_THROTTLE, &seagate_properties },
 621         { "SEAGATE ST39102FC", SD_CONF_BSET_THROTTLE, &seagate_properties },
 622         { "SEAGATE ST39103FC", SD_CONF_BSET_THROTTLE, &seagate_properties },
 623         { "SEAGATE ST118273F", SD_CONF_BSET_THROTTLE, &seagate_properties },
 624         { "SEAGATE ST318202F", SD_CONF_BSET_THROTTLE, &seagate_properties },
 625         { "SEAGATE ST318203F", SD_CONF_BSET_THROTTLE, &seagate_properties },
 626         { "SEAGATE ST136403F", SD_CONF_BSET_THROTTLE, &seagate_properties },
 627         { "SEAGATE ST318304F", SD_CONF_BSET_THROTTLE, &seagate_properties },
 628         { "SEAGATE ST336704F", SD_CONF_BSET_THROTTLE, &seagate_properties },
 629         { "SEAGATE ST373405F", SD_CONF_BSET_THROTTLE, &seagate_properties },
 630         { "SEAGATE ST336605F", SD_CONF_BSET_THROTTLE, &seagate_properties },
 631         { "SEAGATE ST336752F", SD_CONF_BSET_THROTTLE, &seagate_properties },
 632         { "SEAGATE ST318452F", SD_CONF_BSET_THROTTLE, &seagate_properties },
 633         { "FUJITSU MAG3091F",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
 634         { "FUJITSU MAG3182F",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
 635         { "FUJITSU MAA3182F",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
 636         { "FUJITSU MAF3364F",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
 637         { "FUJITSU MAL3364F",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
 638         { "FUJITSU MAL3738F",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
 639         { "FUJITSU MAM3182FC",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
 640         { "FUJITSU MAM3364FC",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
 641         { "FUJITSU MAM3738FC",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
 642         { "IBM     DDYFT1835",  SD_CONF_BSET_THROTTLE, &ibm_properties },
 643         { "IBM     DDYFT3695",  SD_CONF_BSET_THROTTLE, &ibm_properties },
 644         { "IBM     IC35LF2D2",  SD_CONF_BSET_THROTTLE, &ibm_properties },
 645         { "IBM     IC35LF2PR",  SD_CONF_BSET_THROTTLE, &ibm_properties },
 646         { "IBM     1724-100",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 647         { "IBM     1726-2xx",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 648         { "IBM     1726-22x",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 649         { "IBM     1726-4xx",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 650         { "IBM     1726-42x",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 651         { "IBM     1726-3xx",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 652         { "IBM     3526",       SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 653         { "IBM     3542",       SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 654         { "IBM     3552",       SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 655         { "IBM     1722",       SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 656         { "IBM     1742",       SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 657         { "IBM     1815",       SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 658         { "IBM     FAStT",      SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 659         { "IBM     1814",       SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 660         { "IBM     1814-200",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 661         { "IBM     1818",       SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 662         { "DELL    MD3000",     SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 663         { "DELL    MD3000i",    SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 664         { "LSI     INF",        SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 665         { "ENGENIO INF",        SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 666         { "SGI     TP",         SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 667         { "SGI     IS",         SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 668         { "*CSM100_*",          SD_CONF_BSET_NRR_COUNT |
 669                         SD_CONF_BSET_CACHE_IS_NV, &lsi_oem_properties },
 670         { "*CSM200_*",          SD_CONF_BSET_NRR_COUNT |
 671                         SD_CONF_BSET_CACHE_IS_NV, &lsi_oem_properties },
 672         { "Fujitsu SX300",      SD_CONF_BSET_THROTTLE,  &lsi_oem_properties },
 673         { "LSI",                SD_CONF_BSET_NRR_COUNT, &lsi_properties },
 674         { "SUN     T3", SD_CONF_BSET_THROTTLE |
 675                         SD_CONF_BSET_BSY_RETRY_COUNT|
 676                         SD_CONF_BSET_RST_RETRIES|
 677                         SD_CONF_BSET_RSV_REL_TIME,
 678                 &purple_properties },
 679         { "SUN     SESS01", SD_CONF_BSET_THROTTLE |
 680                 SD_CONF_BSET_BSY_RETRY_COUNT|
 681                 SD_CONF_BSET_RST_RETRIES|
 682                 SD_CONF_BSET_RSV_REL_TIME|
 683                 SD_CONF_BSET_MIN_THROTTLE|
 684                 SD_CONF_BSET_DISKSORT_DISABLED,
 685                 &sve_properties },
 686         { "SUN     T4", SD_CONF_BSET_THROTTLE |
 687                         SD_CONF_BSET_BSY_RETRY_COUNT|
 688                         SD_CONF_BSET_RST_RETRIES|
 689                         SD_CONF_BSET_RSV_REL_TIME,
 690                 &purple_properties },
 691         { "SUN     SVE01", SD_CONF_BSET_DISKSORT_DISABLED |
 692                 SD_CONF_BSET_LUN_RESET_ENABLED,
 693                 &maserati_properties },
 694         { "SUN     SE6920", SD_CONF_BSET_THROTTLE |
 695                 SD_CONF_BSET_NRR_COUNT|
 696                 SD_CONF_BSET_BSY_RETRY_COUNT|
 697                 SD_CONF_BSET_RST_RETRIES|
 698                 SD_CONF_BSET_MIN_THROTTLE|
 699                 SD_CONF_BSET_DISKSORT_DISABLED|
 700                 SD_CONF_BSET_LUN_RESET_ENABLED,
 701                 &pirus_properties },
 702         { "SUN     SE6940", SD_CONF_BSET_THROTTLE |
 703                 SD_CONF_BSET_NRR_COUNT|
 704                 SD_CONF_BSET_BSY_RETRY_COUNT|
 705                 SD_CONF_BSET_RST_RETRIES|
 706                 SD_CONF_BSET_MIN_THROTTLE|
 707                 SD_CONF_BSET_DISKSORT_DISABLED|
 708                 SD_CONF_BSET_LUN_RESET_ENABLED,
 709                 &pirus_properties },
 710         { "SUN     StorageTek 6920", SD_CONF_BSET_THROTTLE |
 711                 SD_CONF_BSET_NRR_COUNT|
 712                 SD_CONF_BSET_BSY_RETRY_COUNT|
 713                 SD_CONF_BSET_RST_RETRIES|
 714                 SD_CONF_BSET_MIN_THROTTLE|
 715                 SD_CONF_BSET_DISKSORT_DISABLED|
 716                 SD_CONF_BSET_LUN_RESET_ENABLED,
 717                 &pirus_properties },
 718         { "SUN     StorageTek 6940", SD_CONF_BSET_THROTTLE |
 719                 SD_CONF_BSET_NRR_COUNT|
 720                 SD_CONF_BSET_BSY_RETRY_COUNT|
 721                 SD_CONF_BSET_RST_RETRIES|
 722                 SD_CONF_BSET_MIN_THROTTLE|
 723                 SD_CONF_BSET_DISKSORT_DISABLED|
 724                 SD_CONF_BSET_LUN_RESET_ENABLED,
 725                 &pirus_properties },
 726         { "SUN     PSX1000", SD_CONF_BSET_THROTTLE |
 727                 SD_CONF_BSET_NRR_COUNT|
 728                 SD_CONF_BSET_BSY_RETRY_COUNT|
 729                 SD_CONF_BSET_RST_RETRIES|
 730                 SD_CONF_BSET_MIN_THROTTLE|
 731                 SD_CONF_BSET_DISKSORT_DISABLED|
 732                 SD_CONF_BSET_LUN_RESET_ENABLED,
 733                 &pirus_properties },
 734         { "SUN     SE6330", SD_CONF_BSET_THROTTLE |
 735                 SD_CONF_BSET_NRR_COUNT|
 736                 SD_CONF_BSET_BSY_RETRY_COUNT|
 737                 SD_CONF_BSET_RST_RETRIES|
 738                 SD_CONF_BSET_MIN_THROTTLE|
 739                 SD_CONF_BSET_DISKSORT_DISABLED|
 740                 SD_CONF_BSET_LUN_RESET_ENABLED,
 741                 &pirus_properties },
 742         { "SUN     STK6580_6780", SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 743         { "SUN     SUN_6180", SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 744         { "STK     OPENstorage", SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 745         { "STK     OpenStorage", SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 746         { "STK     BladeCtlr",  SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 747         { "STK     FLEXLINE",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
 748         { "SYMBIOS", SD_CONF_BSET_NRR_COUNT, &symbios_properties },
 749 #endif /* fibre or NON-sparc platforms */
 750 #if ((defined(__sparc) && !defined(__fibre)) ||\
 751         (defined(__i386) || defined(__amd64)))
 752         { "SEAGATE ST42400N", SD_CONF_BSET_THROTTLE, &elite_properties },
 753         { "SEAGATE ST31200N", SD_CONF_BSET_THROTTLE, &st31200n_properties },
 754         { "SEAGATE ST41600N", SD_CONF_BSET_TUR_CHECK, NULL },
 755         { "CONNER  CP30540",  SD_CONF_BSET_NOCACHE,  NULL },
 756         { "*SUN0104*", SD_CONF_BSET_FAB_DEVID, NULL },
 757         { "*SUN0207*", SD_CONF_BSET_FAB_DEVID, NULL },
 758         { "*SUN0327*", SD_CONF_BSET_FAB_DEVID, NULL },
 759         { "*SUN0340*", SD_CONF_BSET_FAB_DEVID, NULL },
 760         { "*SUN0424*", SD_CONF_BSET_FAB_DEVID, NULL },
 761         { "*SUN0669*", SD_CONF_BSET_FAB_DEVID, NULL },
 762         { "*SUN1.0G*", SD_CONF_BSET_FAB_DEVID, NULL },
 763         { "SYMBIOS INF-01-00       ", SD_CONF_BSET_FAB_DEVID, NULL },
 764         { "SYMBIOS", SD_CONF_BSET_THROTTLE|SD_CONF_BSET_NRR_COUNT,
 765             &symbios_properties },
 766         { "LSI", SD_CONF_BSET_THROTTLE | SD_CONF_BSET_NRR_COUNT,
 767             &lsi_properties_scsi },
 768 #if defined(__i386) || defined(__amd64)
 769         { " NEC CD-ROM DRIVE:260 ", (SD_CONF_BSET_PLAYMSF_BCD
 770                                     | SD_CONF_BSET_READSUB_BCD
 771                                     | SD_CONF_BSET_READ_TOC_ADDR_BCD
 772                                     | SD_CONF_BSET_NO_READ_HEADER
 773                                     | SD_CONF_BSET_READ_CD_XD4), NULL },
 774 
 775         { " NEC CD-ROM DRIVE:270 ", (SD_CONF_BSET_PLAYMSF_BCD
 776                                     | SD_CONF_BSET_READSUB_BCD
 777                                     | SD_CONF_BSET_READ_TOC_ADDR_BCD
 778                                     | SD_CONF_BSET_NO_READ_HEADER
 779                                     | SD_CONF_BSET_READ_CD_XD4), NULL },
 780 #endif /* __i386 || __amd64 */
 781 #endif /* sparc NON-fibre or NON-sparc platforms */
 782 
 783 #if (defined(SD_PROP_TST))
 784         { "VENDOR  PRODUCT ", (SD_CONF_BSET_THROTTLE
 785                                 | SD_CONF_BSET_CTYPE
 786                                 | SD_CONF_BSET_NRR_COUNT
 787                                 | SD_CONF_BSET_FAB_DEVID
 788                                 | SD_CONF_BSET_NOCACHE
 789                                 | SD_CONF_BSET_BSY_RETRY_COUNT
 790                                 | SD_CONF_BSET_PLAYMSF_BCD
 791                                 | SD_CONF_BSET_READSUB_BCD
 792                                 | SD_CONF_BSET_READ_TOC_TRK_BCD
 793                                 | SD_CONF_BSET_READ_TOC_ADDR_BCD
 794                                 | SD_CONF_BSET_NO_READ_HEADER
 795                                 | SD_CONF_BSET_READ_CD_XD4
 796                                 | SD_CONF_BSET_RST_RETRIES
 797                                 | SD_CONF_BSET_RSV_REL_TIME
 798                                 | SD_CONF_BSET_TUR_CHECK), &tst_properties},
 799 #endif
 800 };
 801 
 802 static const int sd_disk_table_size =
 803         sizeof (sd_disk_table)/ sizeof (sd_disk_config_t);
 804 
 805 /*
 806  * Emulation mode disk drive VID/PID table
 807  */
 808 static char sd_flash_dev_table[][25] = {
 809         "ATA     MARVELL SD88SA02",
 810         "MARVELL SD88SA02",
 811         "TOSHIBA THNSNV05",
 812 };
 813 
 814 static const int sd_flash_dev_table_size =
 815         sizeof (sd_flash_dev_table) / sizeof (sd_flash_dev_table[0]);
 816 
 817 #define SD_INTERCONNECT_PARALLEL        0
 818 #define SD_INTERCONNECT_FABRIC          1
 819 #define SD_INTERCONNECT_FIBRE           2
 820 #define SD_INTERCONNECT_SSA             3
 821 #define SD_INTERCONNECT_SATA            4
 822 #define SD_INTERCONNECT_SAS             5
 823 
 824 #define SD_IS_PARALLEL_SCSI(un)         \
 825         ((un)->un_interconnect_type == SD_INTERCONNECT_PARALLEL)
 826 #define SD_IS_SERIAL(un)                \
 827         (((un)->un_interconnect_type == SD_INTERCONNECT_SATA) ||\
 828         ((un)->un_interconnect_type == SD_INTERCONNECT_SAS))
 829 
 830 /*
 831  * Definitions used by device id registration routines
 832  */
 833 #define VPD_HEAD_OFFSET         3       /* size of head for vpd page */
 834 #define VPD_PAGE_LENGTH         3       /* offset for pge length data */
 835 #define VPD_MODE_PAGE           1       /* offset into vpd pg for "page code" */
 836 
 837 static kmutex_t sd_sense_mutex = {{NULL}};
 838 
 839 /*
 840  * Macros for updates of the driver state
 841  */
 842 #define New_state(un, s)        \
 843         (un)->un_last_state = (un)->un_state, (un)->un_state = (s)
 844 #define Restore_state(un)       \
 845         { uchar_t tmp = (un)->un_last_state; New_state((un), tmp); }
 846 
 847 static struct sd_cdbinfo sd_cdbtab[] = {
 848         { CDB_GROUP0, 0x00,        0x1FFFFF,   0xFF,        },
 849         { CDB_GROUP1, SCMD_GROUP1, 0xFFFFFFFF, 0xFFFF,      },
 850         { CDB_GROUP5, SCMD_GROUP5, 0xFFFFFFFF, 0xFFFFFFFF,  },
 851         { CDB_GROUP4, SCMD_GROUP4, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF, },
 852 };
 853 
 854 /*
 855  * Specifies the number of seconds that must have elapsed since the last
 856  * cmd. has completed for a device to be declared idle to the PM framework.
 857  */
 858 static int sd_pm_idletime = 1;
 859 
 860 /*
 861  * Internal function prototypes
 862  */
 863 
 864 #if (defined(__fibre))
 865 /*
 866  * These #defines are to avoid namespace collisions that occur because this
 867  * code is currently used to compile two separate driver modules: sd and ssd.
 868  * All function names need to be treated this way (even if declared static)
 869  * in order to allow the debugger to resolve the names properly.
 870  * It is anticipated that in the near future the ssd module will be obsoleted,
 871  * at which time this ugliness should go away.
 872  */
 873 #define sd_log_trace                    ssd_log_trace
 874 #define sd_log_info                     ssd_log_info
 875 #define sd_log_err                      ssd_log_err
 876 #define sdprobe                         ssdprobe
 877 #define sdinfo                          ssdinfo
 878 #define sd_prop_op                      ssd_prop_op
 879 #define sd_scsi_probe_cache_init        ssd_scsi_probe_cache_init
 880 #define sd_scsi_probe_cache_fini        ssd_scsi_probe_cache_fini
 881 #define sd_scsi_clear_probe_cache       ssd_scsi_clear_probe_cache
 882 #define sd_scsi_probe_with_cache        ssd_scsi_probe_with_cache
 883 #define sd_scsi_target_lun_init         ssd_scsi_target_lun_init
 884 #define sd_scsi_target_lun_fini         ssd_scsi_target_lun_fini
 885 #define sd_scsi_get_target_lun_count    ssd_scsi_get_target_lun_count
 886 #define sd_scsi_update_lun_on_target    ssd_scsi_update_lun_on_target
 887 #define sd_spin_up_unit                 ssd_spin_up_unit
 888 #define sd_enable_descr_sense           ssd_enable_descr_sense
 889 #define sd_reenable_dsense_task         ssd_reenable_dsense_task
 890 #define sd_set_mmc_caps                 ssd_set_mmc_caps
 891 #define sd_read_unit_properties         ssd_read_unit_properties
 892 #define sd_process_sdconf_file          ssd_process_sdconf_file
 893 #define sd_process_sdconf_table         ssd_process_sdconf_table
 894 #define sd_sdconf_id_match              ssd_sdconf_id_match
 895 #define sd_blank_cmp                    ssd_blank_cmp
 896 #define sd_chk_vers1_data               ssd_chk_vers1_data
 897 #define sd_set_vers1_properties         ssd_set_vers1_properties
 898 #define sd_check_solid_state            ssd_check_solid_state
 899 #define sd_check_emulation_mode         ssd_check_emulation_mode
 900 
 901 #define sd_get_physical_geometry        ssd_get_physical_geometry
 902 #define sd_get_virtual_geometry         ssd_get_virtual_geometry
 903 #define sd_update_block_info            ssd_update_block_info
 904 #define sd_register_devid               ssd_register_devid
 905 #define sd_get_devid                    ssd_get_devid
 906 #define sd_create_devid                 ssd_create_devid
 907 #define sd_write_deviceid               ssd_write_deviceid
 908 #define sd_check_vpd_page_support       ssd_check_vpd_page_support
 909 #define sd_setup_pm                     ssd_setup_pm
 910 #define sd_create_pm_components         ssd_create_pm_components
 911 #define sd_ddi_suspend                  ssd_ddi_suspend
 912 #define sd_ddi_resume                   ssd_ddi_resume
 913 #define sd_pm_state_change              ssd_pm_state_change
 914 #define sdpower                         ssdpower
 915 #define sdattach                        ssdattach
 916 #define sddetach                        ssddetach
 917 #define sd_unit_attach                  ssd_unit_attach
 918 #define sd_unit_detach                  ssd_unit_detach
 919 #define sd_set_unit_attributes          ssd_set_unit_attributes
 920 #define sd_create_errstats              ssd_create_errstats
 921 #define sd_set_errstats                 ssd_set_errstats
 922 #define sd_set_pstats                   ssd_set_pstats
 923 #define sddump                          ssddump
 924 #define sd_scsi_poll                    ssd_scsi_poll
 925 #define sd_send_polled_RQS              ssd_send_polled_RQS
 926 #define sd_ddi_scsi_poll                ssd_ddi_scsi_poll
 927 #define sd_init_event_callbacks         ssd_init_event_callbacks
 928 #define sd_event_callback               ssd_event_callback
 929 #define sd_cache_control                ssd_cache_control
 930 #define sd_get_write_cache_enabled      ssd_get_write_cache_enabled
 931 #define sd_get_nv_sup                   ssd_get_nv_sup
 932 #define sd_make_device                  ssd_make_device
 933 #define sdopen                          ssdopen
 934 #define sdclose                         ssdclose
 935 #define sd_ready_and_valid              ssd_ready_and_valid
 936 #define sdmin                           ssdmin
 937 #define sdread                          ssdread
 938 #define sdwrite                         ssdwrite
 939 #define sdaread                         ssdaread
 940 #define sdawrite                        ssdawrite
 941 #define sdstrategy                      ssdstrategy
 942 #define sdioctl                         ssdioctl
 943 #define sd_mapblockaddr_iostart         ssd_mapblockaddr_iostart
 944 #define sd_mapblocksize_iostart         ssd_mapblocksize_iostart
 945 #define sd_checksum_iostart             ssd_checksum_iostart
 946 #define sd_checksum_uscsi_iostart       ssd_checksum_uscsi_iostart
 947 #define sd_pm_iostart                   ssd_pm_iostart
 948 #define sd_core_iostart                 ssd_core_iostart
 949 #define sd_mapblockaddr_iodone          ssd_mapblockaddr_iodone
 950 #define sd_mapblocksize_iodone          ssd_mapblocksize_iodone
 951 #define sd_checksum_iodone              ssd_checksum_iodone
 952 #define sd_checksum_uscsi_iodone        ssd_checksum_uscsi_iodone
 953 #define sd_pm_iodone                    ssd_pm_iodone
 954 #define sd_initpkt_for_buf              ssd_initpkt_for_buf
 955 #define sd_destroypkt_for_buf           ssd_destroypkt_for_buf
 956 #define sd_setup_rw_pkt                 ssd_setup_rw_pkt
 957 #define sd_setup_next_rw_pkt            ssd_setup_next_rw_pkt
 958 #define sd_buf_iodone                   ssd_buf_iodone
 959 #define sd_uscsi_strategy               ssd_uscsi_strategy
 960 #define sd_initpkt_for_uscsi            ssd_initpkt_for_uscsi
 961 #define sd_destroypkt_for_uscsi         ssd_destroypkt_for_uscsi
 962 #define sd_uscsi_iodone                 ssd_uscsi_iodone
 963 #define sd_xbuf_strategy                ssd_xbuf_strategy
 964 #define sd_xbuf_init                    ssd_xbuf_init
 965 #define sd_pm_entry                     ssd_pm_entry
 966 #define sd_pm_exit                      ssd_pm_exit
 967 
 968 #define sd_pm_idletimeout_handler       ssd_pm_idletimeout_handler
 969 #define sd_pm_timeout_handler           ssd_pm_timeout_handler
 970 
 971 #define sd_add_buf_to_waitq             ssd_add_buf_to_waitq
 972 #define sdintr                          ssdintr
 973 #define sd_start_cmds                   ssd_start_cmds
 974 #define sd_send_scsi_cmd                ssd_send_scsi_cmd
 975 #define sd_bioclone_alloc               ssd_bioclone_alloc
 976 #define sd_bioclone_free                ssd_bioclone_free
 977 #define sd_shadow_buf_alloc             ssd_shadow_buf_alloc
 978 #define sd_shadow_buf_free              ssd_shadow_buf_free
 979 #define sd_print_transport_rejected_message     \
 980                                         ssd_print_transport_rejected_message
 981 #define sd_retry_command                ssd_retry_command
 982 #define sd_set_retry_bp                 ssd_set_retry_bp
 983 #define sd_send_request_sense_command   ssd_send_request_sense_command
 984 #define sd_start_retry_command          ssd_start_retry_command
 985 #define sd_start_direct_priority_command        \
 986                                         ssd_start_direct_priority_command
 987 #define sd_return_failed_command        ssd_return_failed_command
 988 #define sd_return_failed_command_no_restart     \
 989                                         ssd_return_failed_command_no_restart
 990 #define sd_return_command               ssd_return_command
 991 #define sd_sync_with_callback           ssd_sync_with_callback
 992 #define sdrunout                        ssdrunout
 993 #define sd_mark_rqs_busy                ssd_mark_rqs_busy
 994 #define sd_mark_rqs_idle                ssd_mark_rqs_idle
 995 #define sd_reduce_throttle              ssd_reduce_throttle
 996 #define sd_restore_throttle             ssd_restore_throttle
 997 #define sd_print_incomplete_msg         ssd_print_incomplete_msg
 998 #define sd_init_cdb_limits              ssd_init_cdb_limits
 999 #define sd_pkt_status_good              ssd_pkt_status_good
1000 #define sd_pkt_status_check_condition   ssd_pkt_status_check_condition
1001 #define sd_pkt_status_busy              ssd_pkt_status_busy
1002 #define sd_pkt_status_reservation_conflict      \
1003                                         ssd_pkt_status_reservation_conflict
1004 #define sd_pkt_status_qfull             ssd_pkt_status_qfull
1005 #define sd_handle_request_sense         ssd_handle_request_sense
1006 #define sd_handle_auto_request_sense    ssd_handle_auto_request_sense
1007 #define sd_print_sense_failed_msg       ssd_print_sense_failed_msg
1008 #define sd_validate_sense_data          ssd_validate_sense_data
1009 #define sd_decode_sense                 ssd_decode_sense
1010 #define sd_print_sense_msg              ssd_print_sense_msg
1011 #define sd_sense_key_no_sense           ssd_sense_key_no_sense
1012 #define sd_sense_key_recoverable_error  ssd_sense_key_recoverable_error
1013 #define sd_sense_key_not_ready          ssd_sense_key_not_ready
1014 #define sd_sense_key_medium_or_hardware_error   \
1015                                         ssd_sense_key_medium_or_hardware_error
1016 #define sd_sense_key_illegal_request    ssd_sense_key_illegal_request
1017 #define sd_sense_key_unit_attention     ssd_sense_key_unit_attention
1018 #define sd_sense_key_fail_command       ssd_sense_key_fail_command
1019 #define sd_sense_key_blank_check        ssd_sense_key_blank_check
1020 #define sd_sense_key_aborted_command    ssd_sense_key_aborted_command
1021 #define sd_sense_key_default            ssd_sense_key_default
1022 #define sd_print_retry_msg              ssd_print_retry_msg
1023 #define sd_print_cmd_incomplete_msg     ssd_print_cmd_incomplete_msg
1024 #define sd_pkt_reason_cmd_incomplete    ssd_pkt_reason_cmd_incomplete
1025 #define sd_pkt_reason_cmd_tran_err      ssd_pkt_reason_cmd_tran_err
1026 #define sd_pkt_reason_cmd_reset         ssd_pkt_reason_cmd_reset
1027 #define sd_pkt_reason_cmd_aborted       ssd_pkt_reason_cmd_aborted
1028 #define sd_pkt_reason_cmd_timeout       ssd_pkt_reason_cmd_timeout
1029 #define sd_pkt_reason_cmd_unx_bus_free  ssd_pkt_reason_cmd_unx_bus_free
1030 #define sd_pkt_reason_cmd_tag_reject    ssd_pkt_reason_cmd_tag_reject
1031 #define sd_pkt_reason_default           ssd_pkt_reason_default
1032 #define sd_reset_target                 ssd_reset_target
1033 #define sd_start_stop_unit_callback     ssd_start_stop_unit_callback
1034 #define sd_start_stop_unit_task         ssd_start_stop_unit_task
1035 #define sd_taskq_create                 ssd_taskq_create
1036 #define sd_taskq_delete                 ssd_taskq_delete
1037 #define sd_target_change_task           ssd_target_change_task
1038 #define sd_log_dev_status_event         ssd_log_dev_status_event
1039 #define sd_log_lun_expansion_event      ssd_log_lun_expansion_event
1040 #define sd_log_eject_request_event      ssd_log_eject_request_event
1041 #define sd_media_change_task            ssd_media_change_task
1042 #define sd_handle_mchange               ssd_handle_mchange
1043 #define sd_send_scsi_DOORLOCK           ssd_send_scsi_DOORLOCK
1044 #define sd_send_scsi_READ_CAPACITY      ssd_send_scsi_READ_CAPACITY
1045 #define sd_send_scsi_READ_CAPACITY_16   ssd_send_scsi_READ_CAPACITY_16
1046 #define sd_send_scsi_GET_CONFIGURATION  ssd_send_scsi_GET_CONFIGURATION
1047 #define sd_send_scsi_feature_GET_CONFIGURATION  \
1048                                         sd_send_scsi_feature_GET_CONFIGURATION
1049 #define sd_send_scsi_START_STOP_UNIT    ssd_send_scsi_START_STOP_UNIT
1050 #define sd_send_scsi_INQUIRY            ssd_send_scsi_INQUIRY
1051 #define sd_send_scsi_TEST_UNIT_READY    ssd_send_scsi_TEST_UNIT_READY
1052 #define sd_send_scsi_PERSISTENT_RESERVE_IN      \
1053                                         ssd_send_scsi_PERSISTENT_RESERVE_IN
1054 #define sd_send_scsi_PERSISTENT_RESERVE_OUT     \
1055                                         ssd_send_scsi_PERSISTENT_RESERVE_OUT
1056 #define sd_send_scsi_SYNCHRONIZE_CACHE  ssd_send_scsi_SYNCHRONIZE_CACHE
1057 #define sd_send_scsi_SYNCHRONIZE_CACHE_biodone  \
1058                                         ssd_send_scsi_SYNCHRONIZE_CACHE_biodone
1059 #define sd_send_scsi_MODE_SENSE         ssd_send_scsi_MODE_SENSE
1060 #define sd_send_scsi_MODE_SELECT        ssd_send_scsi_MODE_SELECT
1061 #define sd_send_scsi_RDWR               ssd_send_scsi_RDWR
1062 #define sd_send_scsi_LOG_SENSE          ssd_send_scsi_LOG_SENSE
1063 #define sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION      \
1064                                 ssd_send_scsi_GET_EVENT_STATUS_NOTIFICATION
1065 #define sd_gesn_media_data_valid        ssd_gesn_media_data_valid
1066 #define sd_alloc_rqs                    ssd_alloc_rqs
1067 #define sd_free_rqs                     ssd_free_rqs
1068 #define sd_dump_memory                  ssd_dump_memory
1069 #define sd_get_media_info_com           ssd_get_media_info_com
1070 #define sd_get_media_info               ssd_get_media_info
1071 #define sd_get_media_info_ext           ssd_get_media_info_ext
1072 #define sd_dkio_ctrl_info               ssd_dkio_ctrl_info
1073 #define sd_nvpair_str_decode            ssd_nvpair_str_decode
1074 #define sd_strtok_r                     ssd_strtok_r
1075 #define sd_set_properties               ssd_set_properties
1076 #define sd_get_tunables_from_conf       ssd_get_tunables_from_conf
1077 #define sd_setup_next_xfer              ssd_setup_next_xfer
1078 #define sd_dkio_get_temp                ssd_dkio_get_temp
1079 #define sd_check_mhd                    ssd_check_mhd
1080 #define sd_mhd_watch_cb                 ssd_mhd_watch_cb
1081 #define sd_mhd_watch_incomplete         ssd_mhd_watch_incomplete
1082 #define sd_sname                        ssd_sname
1083 #define sd_mhd_resvd_recover            ssd_mhd_resvd_recover
1084 #define sd_resv_reclaim_thread          ssd_resv_reclaim_thread
1085 #define sd_take_ownership               ssd_take_ownership
1086 #define sd_reserve_release              ssd_reserve_release
1087 #define sd_rmv_resv_reclaim_req         ssd_rmv_resv_reclaim_req
1088 #define sd_mhd_reset_notify_cb          ssd_mhd_reset_notify_cb
1089 #define sd_persistent_reservation_in_read_keys  \
1090                                         ssd_persistent_reservation_in_read_keys
1091 #define sd_persistent_reservation_in_read_resv  \
1092                                         ssd_persistent_reservation_in_read_resv
1093 #define sd_mhdioc_takeown               ssd_mhdioc_takeown
1094 #define sd_mhdioc_failfast              ssd_mhdioc_failfast
1095 #define sd_mhdioc_release               ssd_mhdioc_release
1096 #define sd_mhdioc_register_devid        ssd_mhdioc_register_devid
1097 #define sd_mhdioc_inkeys                ssd_mhdioc_inkeys
1098 #define sd_mhdioc_inresv                ssd_mhdioc_inresv
1099 #define sr_change_blkmode               ssr_change_blkmode
1100 #define sr_change_speed                 ssr_change_speed
1101 #define sr_atapi_change_speed           ssr_atapi_change_speed
1102 #define sr_pause_resume                 ssr_pause_resume
1103 #define sr_play_msf                     ssr_play_msf
1104 #define sr_play_trkind                  ssr_play_trkind
1105 #define sr_read_all_subcodes            ssr_read_all_subcodes
1106 #define sr_read_subchannel              ssr_read_subchannel
1107 #define sr_read_tocentry                ssr_read_tocentry
1108 #define sr_read_tochdr                  ssr_read_tochdr
1109 #define sr_read_cdda                    ssr_read_cdda
1110 #define sr_read_cdxa                    ssr_read_cdxa
1111 #define sr_read_mode1                   ssr_read_mode1
1112 #define sr_read_mode2                   ssr_read_mode2
1113 #define sr_read_cd_mode2                ssr_read_cd_mode2
1114 #define sr_sector_mode                  ssr_sector_mode
1115 #define sr_eject                        ssr_eject
1116 #define sr_ejected                      ssr_ejected
1117 #define sr_check_wp                     ssr_check_wp
1118 #define sd_watch_request_submit         ssd_watch_request_submit
1119 #define sd_check_media                  ssd_check_media
1120 #define sd_media_watch_cb               ssd_media_watch_cb
1121 #define sd_delayed_cv_broadcast         ssd_delayed_cv_broadcast
1122 #define sr_volume_ctrl                  ssr_volume_ctrl
1123 #define sr_read_sony_session_offset     ssr_read_sony_session_offset
1124 #define sd_log_page_supported           ssd_log_page_supported
1125 #define sd_check_for_writable_cd        ssd_check_for_writable_cd
1126 #define sd_wm_cache_constructor         ssd_wm_cache_constructor
1127 #define sd_wm_cache_destructor          ssd_wm_cache_destructor
1128 #define sd_range_lock                   ssd_range_lock
1129 #define sd_get_range                    ssd_get_range
1130 #define sd_free_inlist_wmap             ssd_free_inlist_wmap
1131 #define sd_range_unlock                 ssd_range_unlock
1132 #define sd_read_modify_write_task       ssd_read_modify_write_task
1133 #define sddump_do_read_of_rmw           ssddump_do_read_of_rmw
1134 
1135 #define sd_iostart_chain                ssd_iostart_chain
1136 #define sd_iodone_chain                 ssd_iodone_chain
1137 #define sd_initpkt_map                  ssd_initpkt_map
1138 #define sd_destroypkt_map               ssd_destroypkt_map
1139 #define sd_chain_type_map               ssd_chain_type_map
1140 #define sd_chain_index_map              ssd_chain_index_map
1141 
1142 #define sd_failfast_flushctl            ssd_failfast_flushctl
1143 #define sd_failfast_flushq              ssd_failfast_flushq
1144 #define sd_failfast_flushq_callback     ssd_failfast_flushq_callback
1145 
1146 #define sd_is_lsi                       ssd_is_lsi
1147 #define sd_tg_rdwr                      ssd_tg_rdwr
1148 #define sd_tg_getinfo                   ssd_tg_getinfo
1149 #define sd_rmw_msg_print_handler        ssd_rmw_msg_print_handler
1150 
1151 #endif  /* #if (defined(__fibre)) */
1152 
1153 
1154 int _init(void);
1155 int _fini(void);
1156 int _info(struct modinfo *modinfop);
1157 
1158 /*PRINTFLIKE3*/
1159 static void sd_log_trace(uint_t comp, struct sd_lun *un, const char *fmt, ...);
1160 /*PRINTFLIKE3*/
1161 static void sd_log_info(uint_t comp, struct sd_lun *un, const char *fmt, ...);
1162 /*PRINTFLIKE3*/
1163 static void sd_log_err(uint_t comp, struct sd_lun *un, const char *fmt, ...);
1164 
1165 static int sdprobe(dev_info_t *devi);
1166 static int sdinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg,
1167     void **result);
1168 static int sd_prop_op(dev_t dev, dev_info_t *dip, ddi_prop_op_t prop_op,
1169     int mod_flags, char *name, caddr_t valuep, int *lengthp);
1170 
1171 /*
1172  * Smart probe for parallel scsi
1173  */
1174 static void sd_scsi_probe_cache_init(void);
1175 static void sd_scsi_probe_cache_fini(void);
1176 static void sd_scsi_clear_probe_cache(void);
1177 static int  sd_scsi_probe_with_cache(struct scsi_device *devp, int (*fn)());
1178 
1179 /*
1180  * Attached luns on target for parallel scsi
1181  */
1182 static void sd_scsi_target_lun_init(void);
1183 static void sd_scsi_target_lun_fini(void);
1184 static int  sd_scsi_get_target_lun_count(dev_info_t *dip, int target);
1185 static void sd_scsi_update_lun_on_target(dev_info_t *dip, int target, int flag);
1186 
1187 static int      sd_spin_up_unit(sd_ssc_t *ssc);
1188 
1189 /*
1190  * Using sd_ssc_init to establish sd_ssc_t struct
1191  * Using sd_ssc_send to send uscsi internal command
1192  * Using sd_ssc_fini to free sd_ssc_t struct
1193  */
1194 static sd_ssc_t *sd_ssc_init(struct sd_lun *un);
1195 static int sd_ssc_send(sd_ssc_t *ssc, struct uscsi_cmd *incmd,
1196     int flag, enum uio_seg dataspace, int path_flag);
1197 static void sd_ssc_fini(sd_ssc_t *ssc);
1198 
1199 /*
1200  * Using sd_ssc_assessment to set correct type-of-assessment
1201  * Using sd_ssc_post to post ereport & system log
1202  *       sd_ssc_post will call sd_ssc_print to print system log
1203  *       sd_ssc_post will call sd_ssd_ereport_post to post ereport
1204  */
1205 static void sd_ssc_assessment(sd_ssc_t *ssc,
1206     enum sd_type_assessment tp_assess);
1207 
1208 static void sd_ssc_post(sd_ssc_t *ssc, enum sd_driver_assessment sd_assess);
1209 static void sd_ssc_print(sd_ssc_t *ssc, int sd_severity);
1210 static void sd_ssc_ereport_post(sd_ssc_t *ssc,
1211     enum sd_driver_assessment drv_assess);
1212 
1213 /*
1214  * Using sd_ssc_set_info to mark an un-decodable-data error.
1215  * Using sd_ssc_extract_info to transfer information from internal
1216  *       data structures to sd_ssc_t.
1217  */
1218 static void sd_ssc_set_info(sd_ssc_t *ssc, int ssc_flags, uint_t comp,
1219     const char *fmt, ...);
1220 static void sd_ssc_extract_info(sd_ssc_t *ssc, struct sd_lun *un,
1221     struct scsi_pkt *pktp, struct buf *bp, struct sd_xbuf *xp);
1222 
1223 static int sd_send_scsi_cmd(dev_t dev, struct uscsi_cmd *incmd, int flag,
1224     enum uio_seg dataspace, int path_flag);
1225 
1226 #ifdef _LP64
1227 static void     sd_enable_descr_sense(sd_ssc_t *ssc);
1228 static void     sd_reenable_dsense_task(void *arg);
1229 #endif /* _LP64 */
1230 
1231 static void     sd_set_mmc_caps(sd_ssc_t *ssc);
1232 
1233 static void sd_read_unit_properties(struct sd_lun *un);
1234 static int  sd_process_sdconf_file(struct sd_lun *un);
1235 static void sd_nvpair_str_decode(struct sd_lun *un, char *nvpair_str);
1236 static char *sd_strtok_r(char *string, const char *sepset, char **lasts);
1237 static void sd_set_properties(struct sd_lun *un, char *name, char *value);
1238 static void sd_get_tunables_from_conf(struct sd_lun *un, int flags,
1239     int *data_list, sd_tunables *values);
1240 static void sd_process_sdconf_table(struct sd_lun *un);
1241 static int  sd_sdconf_id_match(struct sd_lun *un, char *id, int idlen);
1242 static int  sd_blank_cmp(struct sd_lun *un, char *id, int idlen);
1243 static int  sd_chk_vers1_data(struct sd_lun *un, int flags, int *prop_list,
1244         int list_len, char *dataname_ptr);
1245 static void sd_set_vers1_properties(struct sd_lun *un, int flags,
1246     sd_tunables *prop_list);
1247 
1248 static void sd_register_devid(sd_ssc_t *ssc, dev_info_t *devi,
1249     int reservation_flag);
1250 static int  sd_get_devid(sd_ssc_t *ssc);
1251 static ddi_devid_t sd_create_devid(sd_ssc_t *ssc);
1252 static int  sd_write_deviceid(sd_ssc_t *ssc);
1253 static int  sd_get_devid_page(struct sd_lun *un, uchar_t *wwn, int *len);
1254 static int  sd_check_vpd_page_support(sd_ssc_t *ssc);
1255 
1256 static void sd_setup_pm(sd_ssc_t *ssc, dev_info_t *devi);
1257 static void sd_create_pm_components(dev_info_t *devi, struct sd_lun *un);
1258 
1259 static int  sd_ddi_suspend(dev_info_t *devi);
1260 static int  sd_ddi_resume(dev_info_t *devi);
1261 static int  sd_pm_state_change(struct sd_lun *un, int level, int flag);
1262 static int  sdpower(dev_info_t *devi, int component, int level);
1263 
1264 static int  sdattach(dev_info_t *devi, ddi_attach_cmd_t cmd);
1265 static int  sddetach(dev_info_t *devi, ddi_detach_cmd_t cmd);
1266 static int  sd_unit_attach(dev_info_t *devi);
1267 static int  sd_unit_detach(dev_info_t *devi);
1268 
1269 static void sd_set_unit_attributes(struct sd_lun *un, dev_info_t *devi);
1270 static void sd_create_errstats(struct sd_lun *un, int instance);
1271 static void sd_set_errstats(struct sd_lun *un);
1272 static void sd_set_pstats(struct sd_lun *un);
1273 
1274 static int  sddump(dev_t dev, caddr_t addr, daddr_t blkno, int nblk);
1275 static int  sd_scsi_poll(struct sd_lun *un, struct scsi_pkt *pkt);
1276 static int  sd_send_polled_RQS(struct sd_lun *un);
1277 static int  sd_ddi_scsi_poll(struct scsi_pkt *pkt);
1278 
1279 #if (defined(__fibre))
1280 /*
1281  * Event callbacks (photon)
1282  */
1283 static void sd_init_event_callbacks(struct sd_lun *un);
1284 static void  sd_event_callback(dev_info_t *, ddi_eventcookie_t, void *, void *);
1285 #endif
1286 
1287 /*
1288  * Defines for sd_cache_control
1289  */
1290 
1291 #define SD_CACHE_ENABLE         1
1292 #define SD_CACHE_DISABLE        0
1293 #define SD_CACHE_NOCHANGE       -1
1294 
1295 static int   sd_cache_control(sd_ssc_t *ssc, int rcd_flag, int wce_flag);
1296 static int   sd_get_write_cache_enabled(sd_ssc_t *ssc, int *is_enabled);
1297 static void  sd_get_nv_sup(sd_ssc_t *ssc);
1298 static dev_t sd_make_device(dev_info_t *devi);
1299 static void  sd_check_solid_state(sd_ssc_t *ssc);
1300 static void  sd_check_emulation_mode(sd_ssc_t *ssc);
1301 static void  sd_update_block_info(struct sd_lun *un, uint32_t lbasize,
1302         uint64_t capacity);
1303 
1304 /*
1305  * Driver entry point functions.
1306  */
1307 static int  sdopen(dev_t *dev_p, int flag, int otyp, cred_t *cred_p);
1308 static int  sdclose(dev_t dev, int flag, int otyp, cred_t *cred_p);
1309 static int  sd_ready_and_valid(sd_ssc_t *ssc, int part);
1310 
1311 static void sdmin(struct buf *bp);
1312 static int sdread(dev_t dev, struct uio *uio, cred_t *cred_p);
1313 static int sdwrite(dev_t dev, struct uio *uio, cred_t *cred_p);
1314 static int sdaread(dev_t dev, struct aio_req *aio, cred_t *cred_p);
1315 static int sdawrite(dev_t dev, struct aio_req *aio, cred_t *cred_p);
1316 
1317 static int sdstrategy(struct buf *bp);
1318 static int sdioctl(dev_t, int, intptr_t, int, cred_t *, int *);
1319 
1320 /*
1321  * Function prototypes for layering functions in the iostart chain.
1322  */
1323 static void sd_mapblockaddr_iostart(int index, struct sd_lun *un,
1324         struct buf *bp);
1325 static void sd_mapblocksize_iostart(int index, struct sd_lun *un,
1326         struct buf *bp);
1327 static void sd_checksum_iostart(int index, struct sd_lun *un, struct buf *bp);
1328 static void sd_checksum_uscsi_iostart(int index, struct sd_lun *un,
1329         struct buf *bp);
1330 static void sd_pm_iostart(int index, struct sd_lun *un, struct buf *bp);
1331 static void sd_core_iostart(int index, struct sd_lun *un, struct buf *bp);
1332 
1333 /*
1334  * Function prototypes for layering functions in the iodone chain.
1335  */
1336 static void sd_buf_iodone(int index, struct sd_lun *un, struct buf *bp);
1337 static void sd_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp);
1338 static void sd_mapblockaddr_iodone(int index, struct sd_lun *un,
1339         struct buf *bp);
1340 static void sd_mapblocksize_iodone(int index, struct sd_lun *un,
1341         struct buf *bp);
1342 static void sd_checksum_iodone(int index, struct sd_lun *un, struct buf *bp);
1343 static void sd_checksum_uscsi_iodone(int index, struct sd_lun *un,
1344         struct buf *bp);
1345 static void sd_pm_iodone(int index, struct sd_lun *un, struct buf *bp);
1346 
1347 /*
1348  * Prototypes for functions to support buf(9S) based IO.
1349  */
1350 static void sd_xbuf_strategy(struct buf *bp, ddi_xbuf_t xp, void *arg);
1351 static int sd_initpkt_for_buf(struct buf *, struct scsi_pkt **);
1352 static void sd_destroypkt_for_buf(struct buf *);
1353 static int sd_setup_rw_pkt(struct sd_lun *un, struct scsi_pkt **pktpp,
1354         struct buf *bp, int flags,
1355         int (*callback)(caddr_t), caddr_t callback_arg,
1356         diskaddr_t lba, uint32_t blockcount);
1357 static int sd_setup_next_rw_pkt(struct sd_lun *un, struct scsi_pkt *pktp,
1358         struct buf *bp, diskaddr_t lba, uint32_t blockcount);
1359 
1360 /*
1361  * Prototypes for functions to support USCSI IO.
1362  */
1363 static int sd_uscsi_strategy(struct buf *bp);
1364 static int sd_initpkt_for_uscsi(struct buf *, struct scsi_pkt **);
1365 static void sd_destroypkt_for_uscsi(struct buf *);
1366 
1367 static void sd_xbuf_init(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
1368         uchar_t chain_type, void *pktinfop);
1369 
1370 static int  sd_pm_entry(struct sd_lun *un);
1371 static void sd_pm_exit(struct sd_lun *un);
1372 
1373 static void sd_pm_idletimeout_handler(void *arg);
1374 
1375 /*
1376  * sd_core internal functions (used at the sd_core_io layer).
1377  */
1378 static void sd_add_buf_to_waitq(struct sd_lun *un, struct buf *bp);
1379 static void sdintr(struct scsi_pkt *pktp);
1380 static void sd_start_cmds(struct sd_lun *un, struct buf *immed_bp);
1381 
1382 static int sd_send_scsi_cmd(dev_t dev, struct uscsi_cmd *incmd, int flag,
1383         enum uio_seg dataspace, int path_flag);
1384 
1385 static struct buf *sd_bioclone_alloc(struct buf *bp, size_t datalen,
1386         daddr_t blkno, int (*func)(struct buf *));
1387 static struct buf *sd_shadow_buf_alloc(struct buf *bp, size_t datalen,
1388         uint_t bflags, daddr_t blkno, int (*func)(struct buf *));
1389 static void sd_bioclone_free(struct buf *bp);
1390 static void sd_shadow_buf_free(struct buf *bp);
1391 
1392 static void sd_print_transport_rejected_message(struct sd_lun *un,
1393         struct sd_xbuf *xp, int code);
1394 static void sd_print_incomplete_msg(struct sd_lun *un, struct buf *bp,
1395     void *arg, int code);
1396 static void sd_print_sense_failed_msg(struct sd_lun *un, struct buf *bp,
1397     void *arg, int code);
1398 static void sd_print_cmd_incomplete_msg(struct sd_lun *un, struct buf *bp,
1399     void *arg, int code);
1400 
1401 static void sd_retry_command(struct sd_lun *un, struct buf *bp,
1402         int retry_check_flag,
1403         void (*user_funcp)(struct sd_lun *un, struct buf *bp, void *argp,
1404                 int c),
1405         void *user_arg, int failure_code,  clock_t retry_delay,
1406         void (*statp)(kstat_io_t *));
1407 
1408 static void sd_set_retry_bp(struct sd_lun *un, struct buf *bp,
1409         clock_t retry_delay, void (*statp)(kstat_io_t *));
1410 
1411 static void sd_send_request_sense_command(struct sd_lun *un, struct buf *bp,
1412         struct scsi_pkt *pktp);
1413 static void sd_start_retry_command(void *arg);
1414 static void sd_start_direct_priority_command(void *arg);
1415 static void sd_return_failed_command(struct sd_lun *un, struct buf *bp,
1416         int errcode);
1417 static void sd_return_failed_command_no_restart(struct sd_lun *un,
1418         struct buf *bp, int errcode);
1419 static void sd_return_command(struct sd_lun *un, struct buf *bp);
1420 static void sd_sync_with_callback(struct sd_lun *un);
1421 static int sdrunout(caddr_t arg);
1422 
1423 static void sd_mark_rqs_busy(struct sd_lun *un, struct buf *bp);
1424 static struct buf *sd_mark_rqs_idle(struct sd_lun *un, struct sd_xbuf *xp);
1425 
1426 static void sd_reduce_throttle(struct sd_lun *un, int throttle_type);
1427 static void sd_restore_throttle(void *arg);
1428 
1429 static void sd_init_cdb_limits(struct sd_lun *un);
1430 
1431 static void sd_pkt_status_good(struct sd_lun *un, struct buf *bp,
1432         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1433 
1434 /*
1435  * Error handling functions
1436  */
1437 static void sd_pkt_status_check_condition(struct sd_lun *un, struct buf *bp,
1438         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1439 static void sd_pkt_status_busy(struct sd_lun *un, struct buf *bp,
1440         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1441 static void sd_pkt_status_reservation_conflict(struct sd_lun *un,
1442         struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp);
1443 static void sd_pkt_status_qfull(struct sd_lun *un, struct buf *bp,
1444         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1445 
1446 static void sd_handle_request_sense(struct sd_lun *un, struct buf *bp,
1447         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1448 static void sd_handle_auto_request_sense(struct sd_lun *un, struct buf *bp,
1449         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1450 static int sd_validate_sense_data(struct sd_lun *un, struct buf *bp,
1451         struct sd_xbuf *xp, size_t actual_len);
1452 static void sd_decode_sense(struct sd_lun *un, struct buf *bp,
1453         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1454 
1455 static void sd_print_sense_msg(struct sd_lun *un, struct buf *bp,
1456         void *arg, int code);
1457 
1458 static void sd_sense_key_no_sense(struct sd_lun *un, struct buf *bp,
1459         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1460 static void sd_sense_key_recoverable_error(struct sd_lun *un,
1461         uint8_t *sense_datap,
1462         struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp);
1463 static void sd_sense_key_not_ready(struct sd_lun *un,
1464         uint8_t *sense_datap,
1465         struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp);
1466 static void sd_sense_key_medium_or_hardware_error(struct sd_lun *un,
1467         uint8_t *sense_datap,
1468         struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp);
1469 static void sd_sense_key_illegal_request(struct sd_lun *un, struct buf *bp,
1470         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1471 static void sd_sense_key_unit_attention(struct sd_lun *un,
1472         uint8_t *sense_datap,
1473         struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp);
1474 static void sd_sense_key_fail_command(struct sd_lun *un, struct buf *bp,
1475         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1476 static void sd_sense_key_blank_check(struct sd_lun *un, struct buf *bp,
1477         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1478 static void sd_sense_key_aborted_command(struct sd_lun *un, struct buf *bp,
1479         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1480 static void sd_sense_key_default(struct sd_lun *un,
1481         uint8_t *sense_datap,
1482         struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp);
1483 
1484 static void sd_print_retry_msg(struct sd_lun *un, struct buf *bp,
1485         void *arg, int flag);
1486 
1487 static void sd_pkt_reason_cmd_incomplete(struct sd_lun *un, struct buf *bp,
1488         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1489 static void sd_pkt_reason_cmd_tran_err(struct sd_lun *un, struct buf *bp,
1490         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1491 static void sd_pkt_reason_cmd_reset(struct sd_lun *un, struct buf *bp,
1492         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1493 static void sd_pkt_reason_cmd_aborted(struct sd_lun *un, struct buf *bp,
1494         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1495 static void sd_pkt_reason_cmd_timeout(struct sd_lun *un, struct buf *bp,
1496         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1497 static void sd_pkt_reason_cmd_unx_bus_free(struct sd_lun *un, struct buf *bp,
1498         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1499 static void sd_pkt_reason_cmd_tag_reject(struct sd_lun *un, struct buf *bp,
1500         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1501 static void sd_pkt_reason_default(struct sd_lun *un, struct buf *bp,
1502         struct sd_xbuf *xp, struct scsi_pkt *pktp);
1503 
1504 static void sd_reset_target(struct sd_lun *un, struct scsi_pkt *pktp);
1505 
1506 static void sd_start_stop_unit_callback(void *arg);
1507 static void sd_start_stop_unit_task(void *arg);
1508 
1509 static void sd_taskq_create(void);
1510 static void sd_taskq_delete(void);
1511 static void sd_target_change_task(void *arg);
1512 static void sd_log_dev_status_event(struct sd_lun *un, char *esc, int km_flag);
1513 static void sd_log_lun_expansion_event(struct sd_lun *un, int km_flag);
1514 static void sd_log_eject_request_event(struct sd_lun *un, int km_flag);
1515 static void sd_media_change_task(void *arg);
1516 
1517 static int sd_handle_mchange(struct sd_lun *un);
1518 static int sd_send_scsi_DOORLOCK(sd_ssc_t *ssc, int flag, int path_flag);
1519 static int sd_send_scsi_READ_CAPACITY(sd_ssc_t *ssc, uint64_t *capp,
1520         uint32_t *lbap, int path_flag);
1521 static int sd_send_scsi_READ_CAPACITY_16(sd_ssc_t *ssc, uint64_t *capp,
1522         uint32_t *lbap, uint32_t *psp, int path_flag);
1523 static int sd_send_scsi_START_STOP_UNIT(sd_ssc_t *ssc, int pc_flag,
1524         int flag, int path_flag);
1525 static int sd_send_scsi_INQUIRY(sd_ssc_t *ssc, uchar_t *bufaddr,
1526         size_t buflen, uchar_t evpd, uchar_t page_code, size_t *residp);
1527 static int sd_send_scsi_TEST_UNIT_READY(sd_ssc_t *ssc, int flag);
1528 static int sd_send_scsi_PERSISTENT_RESERVE_IN(sd_ssc_t *ssc,
1529         uchar_t usr_cmd, uint16_t data_len, uchar_t *data_bufp);
1530 static int sd_send_scsi_PERSISTENT_RESERVE_OUT(sd_ssc_t *ssc,
1531         uchar_t usr_cmd, uchar_t *usr_bufp);
1532 static int sd_send_scsi_SYNCHRONIZE_CACHE(struct sd_lun *un,
1533         struct dk_callback *dkc);
1534 static int sd_send_scsi_SYNCHRONIZE_CACHE_biodone(struct buf *bp);
1535 static int sd_send_scsi_GET_CONFIGURATION(sd_ssc_t *ssc,
1536         struct uscsi_cmd *ucmdbuf, uchar_t *rqbuf, uint_t rqbuflen,
1537         uchar_t *bufaddr, uint_t buflen, int path_flag);
1538 static int sd_send_scsi_feature_GET_CONFIGURATION(sd_ssc_t *ssc,
1539         struct uscsi_cmd *ucmdbuf, uchar_t *rqbuf, uint_t rqbuflen,
1540         uchar_t *bufaddr, uint_t buflen, char feature, int path_flag);
1541 static int sd_send_scsi_MODE_SENSE(sd_ssc_t *ssc, int cdbsize,
1542         uchar_t *bufaddr, size_t buflen, uchar_t page_code, int path_flag);
1543 static int sd_send_scsi_MODE_SELECT(sd_ssc_t *ssc, int cdbsize,
1544         uchar_t *bufaddr, size_t buflen, uchar_t save_page, int path_flag);
1545 static int sd_send_scsi_RDWR(sd_ssc_t *ssc, uchar_t cmd, void *bufaddr,
1546         size_t buflen, daddr_t start_block, int path_flag);
1547 #define sd_send_scsi_READ(ssc, bufaddr, buflen, start_block, path_flag) \
1548         sd_send_scsi_RDWR(ssc, SCMD_READ, bufaddr, buflen, start_block, \
1549         path_flag)
1550 #define sd_send_scsi_WRITE(ssc, bufaddr, buflen, start_block, path_flag)\
1551         sd_send_scsi_RDWR(ssc, SCMD_WRITE, bufaddr, buflen, start_block,\
1552         path_flag)
1553 
1554 static int sd_send_scsi_LOG_SENSE(sd_ssc_t *ssc, uchar_t *bufaddr,
1555         uint16_t buflen, uchar_t page_code, uchar_t page_control,
1556         uint16_t param_ptr, int path_flag);
1557 static int sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION(sd_ssc_t *ssc,
1558         uchar_t *bufaddr, size_t buflen, uchar_t class_req);
1559 static boolean_t sd_gesn_media_data_valid(uchar_t *data);
1560 
1561 static int  sd_alloc_rqs(struct scsi_device *devp, struct sd_lun *un);
1562 static void sd_free_rqs(struct sd_lun *un);
1563 
1564 static void sd_dump_memory(struct sd_lun *un, uint_t comp, char *title,
1565         uchar_t *data, int len, int fmt);
1566 static void sd_panic_for_res_conflict(struct sd_lun *un);
1567 
1568 /*
1569  * Disk Ioctl Function Prototypes
1570  */
1571 static int sd_get_media_info(dev_t dev, caddr_t arg, int flag);
1572 static int sd_get_media_info_ext(dev_t dev, caddr_t arg, int flag);
1573 static int sd_dkio_ctrl_info(dev_t dev, caddr_t arg, int flag);
1574 static int sd_dkio_get_temp(dev_t dev, caddr_t arg, int flag);
1575 
1576 /*
1577  * Multi-host Ioctl Prototypes
1578  */
1579 static int sd_check_mhd(dev_t dev, int interval);
1580 static int sd_mhd_watch_cb(caddr_t arg, struct scsi_watch_result *resultp);
1581 static void sd_mhd_watch_incomplete(struct sd_lun *un, struct scsi_pkt *pkt);
1582 static char *sd_sname(uchar_t status);
1583 static void sd_mhd_resvd_recover(void *arg);
1584 static void sd_resv_reclaim_thread();
1585 static int sd_take_ownership(dev_t dev, struct mhioctkown *p);
1586 static int sd_reserve_release(dev_t dev, int cmd);
1587 static void sd_rmv_resv_reclaim_req(dev_t dev);
1588 static void sd_mhd_reset_notify_cb(caddr_t arg);
1589 static int sd_persistent_reservation_in_read_keys(struct sd_lun *un,
1590         mhioc_inkeys_t *usrp, int flag);
1591 static int sd_persistent_reservation_in_read_resv(struct sd_lun *un,
1592         mhioc_inresvs_t *usrp, int flag);
1593 static int sd_mhdioc_takeown(dev_t dev, caddr_t arg, int flag);
1594 static int sd_mhdioc_failfast(dev_t dev, caddr_t arg, int flag);
1595 static int sd_mhdioc_release(dev_t dev);
1596 static int sd_mhdioc_register_devid(dev_t dev);
1597 static int sd_mhdioc_inkeys(dev_t dev, caddr_t arg, int flag);
1598 static int sd_mhdioc_inresv(dev_t dev, caddr_t arg, int flag);
1599 
1600 /*
1601  * SCSI removable prototypes
1602  */
1603 static int sr_change_blkmode(dev_t dev, int cmd, intptr_t data, int flag);
1604 static int sr_change_speed(dev_t dev, int cmd, intptr_t data, int flag);
1605 static int sr_atapi_change_speed(dev_t dev, int cmd, intptr_t data, int flag);
1606 static int sr_pause_resume(dev_t dev, int mode);
1607 static int sr_play_msf(dev_t dev, caddr_t data, int flag);
1608 static int sr_play_trkind(dev_t dev, caddr_t data, int flag);
1609 static int sr_read_all_subcodes(dev_t dev, caddr_t data, int flag);
1610 static int sr_read_subchannel(dev_t dev, caddr_t data, int flag);
1611 static int sr_read_tocentry(dev_t dev, caddr_t data, int flag);
1612 static int sr_read_tochdr(dev_t dev, caddr_t data, int flag);
1613 static int sr_read_cdda(dev_t dev, caddr_t data, int flag);
1614 static int sr_read_cdxa(dev_t dev, caddr_t data, int flag);
1615 static int sr_read_mode1(dev_t dev, caddr_t data, int flag);
1616 static int sr_read_mode2(dev_t dev, caddr_t data, int flag);
1617 static int sr_read_cd_mode2(dev_t dev, caddr_t data, int flag);
1618 static int sr_sector_mode(dev_t dev, uint32_t blksize);
1619 static int sr_eject(dev_t dev);
1620 static void sr_ejected(register struct sd_lun *un);
1621 static int sr_check_wp(dev_t dev);
1622 static opaque_t sd_watch_request_submit(struct sd_lun *un);
1623 static int sd_check_media(dev_t dev, enum dkio_state state);
1624 static int sd_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp);
1625 static void sd_delayed_cv_broadcast(void *arg);
1626 static int sr_volume_ctrl(dev_t dev, caddr_t data, int flag);
1627 static int sr_read_sony_session_offset(dev_t dev, caddr_t data, int flag);
1628 
1629 static int sd_log_page_supported(sd_ssc_t *ssc, int log_page);
1630 
1631 /*
1632  * Function Prototype for the non-512 support (DVDRAM, MO etc.) functions.
1633  */
1634 static void sd_check_for_writable_cd(sd_ssc_t *ssc, int path_flag);
1635 static int sd_wm_cache_constructor(void *wm, void *un, int flags);
1636 static void sd_wm_cache_destructor(void *wm, void *un);
1637 static struct sd_w_map *sd_range_lock(struct sd_lun *un, daddr_t startb,
1638         daddr_t endb, ushort_t typ);
1639 static struct sd_w_map *sd_get_range(struct sd_lun *un, daddr_t startb,
1640         daddr_t endb);
1641 static void sd_free_inlist_wmap(struct sd_lun *un, struct sd_w_map *wmp);
1642 static void sd_range_unlock(struct sd_lun *un, struct sd_w_map *wm);
1643 static void sd_read_modify_write_task(void * arg);
1644 static int
1645 sddump_do_read_of_rmw(struct sd_lun *un, uint64_t blkno, uint64_t nblk,
1646         struct buf **bpp);
1647 
1648 
1649 /*
1650  * Function prototypes for failfast support.
1651  */
1652 static void sd_failfast_flushq(struct sd_lun *un);
1653 static int sd_failfast_flushq_callback(struct buf *bp);
1654 
1655 /*
1656  * Function prototypes to check for lsi devices
1657  */
1658 static void sd_is_lsi(struct sd_lun *un);
1659 
1660 /*
1661  * Function prototypes for partial DMA support
1662  */
1663 static int sd_setup_next_xfer(struct sd_lun *un, struct buf *bp,
1664                 struct scsi_pkt *pkt, struct sd_xbuf *xp);
1665 
1666 
1667 /* Function prototypes for cmlb */
1668 static int sd_tg_rdwr(dev_info_t *devi, uchar_t cmd, void *bufaddr,
1669     diskaddr_t start_block, size_t reqlength, void *tg_cookie);
1670 
1671 static int sd_tg_getinfo(dev_info_t *devi, int cmd, void *arg, void *tg_cookie);
1672 
1673 /*
1674  * For printing RMW warning message timely
1675  */
1676 static void sd_rmw_msg_print_handler(void *arg);
1677 
1678 /*
1679  * Constants for failfast support:
1680  *
1681  * SD_FAILFAST_INACTIVE: Instance is currently in a normal state, with NO
1682  * failfast processing being performed.
1683  *
1684  * SD_FAILFAST_ACTIVE: Instance is in the failfast state and is performing
1685  * failfast processing on all bufs with B_FAILFAST set.
1686  */
1687 
1688 #define SD_FAILFAST_INACTIVE            0
1689 #define SD_FAILFAST_ACTIVE              1
1690 
1691 /*
1692  * Bitmask to control behavior of buf(9S) flushes when a transition to
1693  * the failfast state occurs. Optional bits include:
1694  *
1695  * SD_FAILFAST_FLUSH_ALL_BUFS: When set, flush ALL bufs including those that
1696  * do NOT have B_FAILFAST set. When clear, only bufs with B_FAILFAST will
1697  * be flushed.
1698  *
1699  * SD_FAILFAST_FLUSH_ALL_QUEUES: When set, flush any/all other queues in the
1700  * driver, in addition to the regular wait queue. This includes the xbuf
1701  * queues. When clear, only the driver's wait queue will be flushed.
1702  */
1703 #define SD_FAILFAST_FLUSH_ALL_BUFS      0x01
1704 #define SD_FAILFAST_FLUSH_ALL_QUEUES    0x02
1705 
1706 /*
1707  * The default behavior is to only flush bufs that have B_FAILFAST set, but
1708  * to flush all queues within the driver.
1709  */
1710 static int sd_failfast_flushctl = SD_FAILFAST_FLUSH_ALL_QUEUES;
1711 
1712 
1713 /*
1714  * SD Testing Fault Injection
1715  */
1716 #ifdef SD_FAULT_INJECTION
1717 static void sd_faultinjection_ioctl(int cmd, intptr_t arg, struct sd_lun *un);
1718 static void sd_faultinjection(struct scsi_pkt *pktp);
1719 static void sd_injection_log(char *buf, struct sd_lun *un);
1720 #endif
1721 
1722 /*
1723  * Device driver ops vector
1724  */
1725 static struct cb_ops sd_cb_ops = {
1726         sdopen,                 /* open */
1727         sdclose,                /* close */
1728         sdstrategy,             /* strategy */
1729         nodev,                  /* print */
1730         sddump,                 /* dump */
1731         sdread,                 /* read */
1732         sdwrite,                /* write */
1733         sdioctl,                /* ioctl */
1734         nodev,                  /* devmap */
1735         nodev,                  /* mmap */
1736         nodev,                  /* segmap */
1737         nochpoll,               /* poll */
1738         sd_prop_op,             /* cb_prop_op */
1739         0,                      /* streamtab  */
1740         D_64BIT | D_MP | D_NEW | D_HOTPLUG, /* Driver compatibility flags */
1741         CB_REV,                 /* cb_rev */
1742         sdaread,                /* async I/O read entry point */
1743         sdawrite                /* async I/O write entry point */
1744 };
1745 
1746 struct dev_ops sd_ops = {
1747         DEVO_REV,               /* devo_rev, */
1748         0,                      /* refcnt  */
1749         sdinfo,                 /* info */
1750         nulldev,                /* identify */
1751         sdprobe,                /* probe */
1752         sdattach,               /* attach */
1753         sddetach,               /* detach */
1754         nodev,                  /* reset */
1755         &sd_cb_ops,         /* driver operations */
1756         NULL,                   /* bus operations */
1757         sdpower,                /* power */
1758         ddi_quiesce_not_needed,         /* quiesce */
1759 };
1760 
1761 /*
1762  * This is the loadable module wrapper.
1763  */
1764 #include <sys/modctl.h>
1765 
1766 #ifndef XPV_HVM_DRIVER
1767 static struct modldrv modldrv = {
1768         &mod_driverops,             /* Type of module. This one is a driver */
1769         SD_MODULE_NAME,         /* Module name. */
1770         &sd_ops                     /* driver ops */
1771 };
1772 
1773 static struct modlinkage modlinkage = {
1774         MODREV_1, { &modldrv, NULL }
1775 };
1776 
1777 #else /* XPV_HVM_DRIVER */
1778 static struct modlmisc modlmisc = {
1779         &mod_miscops,               /* Type of module. This one is a misc */
1780         "HVM " SD_MODULE_NAME,          /* Module name. */
1781 };
1782 
1783 static struct modlinkage modlinkage = {
1784         MODREV_1, { &modlmisc, NULL }
1785 };
1786 
1787 #endif /* XPV_HVM_DRIVER */
1788 
1789 static cmlb_tg_ops_t sd_tgops = {
1790         TG_DK_OPS_VERSION_1,
1791         sd_tg_rdwr,
1792         sd_tg_getinfo
1793 };
1794 
1795 static struct scsi_asq_key_strings sd_additional_codes[] = {
1796         { 0x81, 0, "Logical Unit is Reserved" },
1797         { 0x85, 0, "Audio Address Not Valid" },
1798         { 0xb6, 0, "Media Load Mechanism Failed" },
1799         { 0xB9, 0, "Audio Play Operation Aborted" },
1800         { 0xbf, 0, "Buffer Overflow for Read All Subcodes Command" },
1801         { 0x53, 2, "Medium removal prevented" },
1802         { 0x6f, 0, "Authentication failed during key exchange" },
1803         { 0x6f, 1, "Key not present" },
1804         { 0x6f, 2, "Key not established" },
1805         { 0x6f, 3, "Read without proper authentication" },
1806         { 0x6f, 4, "Mismatched region to this logical unit" },
1807         { 0x6f, 5, "Region reset count error" },
1808         { 0xffff, 0x0, NULL }
1809 };
1810 
1811 
1812 /*
1813  * Struct for passing printing information for sense data messages
1814  */
1815 struct sd_sense_info {
1816         int     ssi_severity;
1817         int     ssi_pfa_flag;
1818 };
1819 
1820 /*
1821  * Table of function pointers for iostart-side routines. Separate "chains"
1822  * of layered function calls are formed by placing the function pointers
1823  * sequentially in the desired order. Functions are called according to an
1824  * incrementing table index ordering. The last function in each chain must
1825  * be sd_core_iostart(). The corresponding iodone-side routines are expected
1826  * in the sd_iodone_chain[] array.
1827  *
1828  * Note: It may seem more natural to organize both the iostart and iodone
1829  * functions together, into an array of structures (or some similar
1830  * organization) with a common index, rather than two separate arrays which
1831  * must be maintained in synchronization. The purpose of this division is
1832  * to achieve improved performance: individual arrays allows for more
1833  * effective cache line utilization on certain platforms.
1834  */
1835 
1836 typedef void (*sd_chain_t)(int index, struct sd_lun *un, struct buf *bp);
1837 
1838 
1839 static sd_chain_t sd_iostart_chain[] = {
1840 
1841         /* Chain for buf IO for disk drive targets (PM enabled) */
1842         sd_mapblockaddr_iostart,        /* Index: 0 */
1843         sd_pm_iostart,                  /* Index: 1 */
1844         sd_core_iostart,                /* Index: 2 */
1845 
1846         /* Chain for buf IO for disk drive targets (PM disabled) */
1847         sd_mapblockaddr_iostart,        /* Index: 3 */
1848         sd_core_iostart,                /* Index: 4 */
1849 
1850         /*
1851          * Chain for buf IO for removable-media or large sector size
1852          * disk drive targets with RMW needed (PM enabled)
1853          */
1854         sd_mapblockaddr_iostart,        /* Index: 5 */
1855         sd_mapblocksize_iostart,        /* Index: 6 */
1856         sd_pm_iostart,                  /* Index: 7 */
1857         sd_core_iostart,                /* Index: 8 */
1858 
1859         /*
1860          * Chain for buf IO for removable-media or large sector size
1861          * disk drive targets with RMW needed (PM disabled)
1862          */
1863         sd_mapblockaddr_iostart,        /* Index: 9 */
1864         sd_mapblocksize_iostart,        /* Index: 10 */
1865         sd_core_iostart,                /* Index: 11 */
1866 
1867         /* Chain for buf IO for disk drives with checksumming (PM enabled) */
1868         sd_mapblockaddr_iostart,        /* Index: 12 */
1869         sd_checksum_iostart,            /* Index: 13 */
1870         sd_pm_iostart,                  /* Index: 14 */
1871         sd_core_iostart,                /* Index: 15 */
1872 
1873         /* Chain for buf IO for disk drives with checksumming (PM disabled) */
1874         sd_mapblockaddr_iostart,        /* Index: 16 */
1875         sd_checksum_iostart,            /* Index: 17 */
1876         sd_core_iostart,                /* Index: 18 */
1877 
1878         /* Chain for USCSI commands (all targets) */
1879         sd_pm_iostart,                  /* Index: 19 */
1880         sd_core_iostart,                /* Index: 20 */
1881 
1882         /* Chain for checksumming USCSI commands (all targets) */
1883         sd_checksum_uscsi_iostart,      /* Index: 21 */
1884         sd_pm_iostart,                  /* Index: 22 */
1885         sd_core_iostart,                /* Index: 23 */
1886 
1887         /* Chain for "direct" USCSI commands (all targets) */
1888         sd_core_iostart,                /* Index: 24 */
1889 
1890         /* Chain for "direct priority" USCSI commands (all targets) */
1891         sd_core_iostart,                /* Index: 25 */
1892 
1893         /*
1894          * Chain for buf IO for large sector size disk drive targets
1895          * with RMW needed with checksumming (PM enabled)
1896          */
1897         sd_mapblockaddr_iostart,        /* Index: 26 */
1898         sd_mapblocksize_iostart,        /* Index: 27 */
1899         sd_checksum_iostart,            /* Index: 28 */
1900         sd_pm_iostart,                  /* Index: 29 */
1901         sd_core_iostart,                /* Index: 30 */
1902 
1903         /*
1904          * Chain for buf IO for large sector size disk drive targets
1905          * with RMW needed with checksumming (PM disabled)
1906          */
1907         sd_mapblockaddr_iostart,        /* Index: 31 */
1908         sd_mapblocksize_iostart,        /* Index: 32 */
1909         sd_checksum_iostart,            /* Index: 33 */
1910         sd_core_iostart,                /* Index: 34 */
1911 
1912 };
1913 
1914 /*
1915  * Macros to locate the first function of each iostart chain in the
1916  * sd_iostart_chain[] array. These are located by the index in the array.
1917  */
1918 #define SD_CHAIN_DISK_IOSTART                   0
1919 #define SD_CHAIN_DISK_IOSTART_NO_PM             3
1920 #define SD_CHAIN_MSS_DISK_IOSTART               5
1921 #define SD_CHAIN_RMMEDIA_IOSTART                5
1922 #define SD_CHAIN_MSS_DISK_IOSTART_NO_PM         9
1923 #define SD_CHAIN_RMMEDIA_IOSTART_NO_PM          9
1924 #define SD_CHAIN_CHKSUM_IOSTART                 12
1925 #define SD_CHAIN_CHKSUM_IOSTART_NO_PM           16
1926 #define SD_CHAIN_USCSI_CMD_IOSTART              19
1927 #define SD_CHAIN_USCSI_CHKSUM_IOSTART           21
1928 #define SD_CHAIN_DIRECT_CMD_IOSTART             24
1929 #define SD_CHAIN_PRIORITY_CMD_IOSTART           25
1930 #define SD_CHAIN_MSS_CHKSUM_IOSTART             26
1931 #define SD_CHAIN_MSS_CHKSUM_IOSTART_NO_PM       31
1932 
1933 
1934 /*
1935  * Table of function pointers for the iodone-side routines for the driver-
1936  * internal layering mechanism.  The calling sequence for iodone routines
1937  * uses a decrementing table index, so the last routine called in a chain
1938  * must be at the lowest array index location for that chain.  The last
1939  * routine for each chain must be either sd_buf_iodone() (for buf(9S) IOs)
1940  * or sd_uscsi_iodone() (for uscsi IOs).  Other than this, the ordering
1941  * of the functions in an iodone side chain must correspond to the ordering
1942  * of the iostart routines for that chain.  Note that there is no iodone
1943  * side routine that corresponds to sd_core_iostart(), so there is no
1944  * entry in the table for this.
1945  */
1946 
1947 static sd_chain_t sd_iodone_chain[] = {
1948 
1949         /* Chain for buf IO for disk drive targets (PM enabled) */
1950         sd_buf_iodone,                  /* Index: 0 */
1951         sd_mapblockaddr_iodone,         /* Index: 1 */
1952         sd_pm_iodone,                   /* Index: 2 */
1953 
1954         /* Chain for buf IO for disk drive targets (PM disabled) */
1955         sd_buf_iodone,                  /* Index: 3 */
1956         sd_mapblockaddr_iodone,         /* Index: 4 */
1957 
1958         /*
1959          * Chain for buf IO for removable-media or large sector size
1960          * disk drive targets with RMW needed (PM enabled)
1961          */
1962         sd_buf_iodone,                  /* Index: 5 */
1963         sd_mapblockaddr_iodone,         /* Index: 6 */
1964         sd_mapblocksize_iodone,         /* Index: 7 */
1965         sd_pm_iodone,                   /* Index: 8 */
1966 
1967         /*
1968          * Chain for buf IO for removable-media or large sector size
1969          * disk drive targets with RMW needed (PM disabled)
1970          */
1971         sd_buf_iodone,                  /* Index: 9 */
1972         sd_mapblockaddr_iodone,         /* Index: 10 */
1973         sd_mapblocksize_iodone,         /* Index: 11 */
1974 
1975         /* Chain for buf IO for disk drives with checksumming (PM enabled) */
1976         sd_buf_iodone,                  /* Index: 12 */
1977         sd_mapblockaddr_iodone,         /* Index: 13 */
1978         sd_checksum_iodone,             /* Index: 14 */
1979         sd_pm_iodone,                   /* Index: 15 */
1980 
1981         /* Chain for buf IO for disk drives with checksumming (PM disabled) */
1982         sd_buf_iodone,                  /* Index: 16 */
1983         sd_mapblockaddr_iodone,         /* Index: 17 */
1984         sd_checksum_iodone,             /* Index: 18 */
1985 
1986         /* Chain for USCSI commands (non-checksum targets) */
1987         sd_uscsi_iodone,                /* Index: 19 */
1988         sd_pm_iodone,                   /* Index: 20 */
1989 
1990         /* Chain for USCSI commands (checksum targets) */
1991         sd_uscsi_iodone,                /* Index: 21 */
1992         sd_checksum_uscsi_iodone,       /* Index: 22 */
1993         sd_pm_iodone,                   /* Index: 22 */
1994 
1995         /* Chain for "direct" USCSI commands (all targets) */
1996         sd_uscsi_iodone,                /* Index: 24 */
1997 
1998         /* Chain for "direct priority" USCSI commands (all targets) */
1999         sd_uscsi_iodone,                /* Index: 25 */
2000 
2001         /*
2002          * Chain for buf IO for large sector size disk drive targets
2003          * with checksumming (PM enabled)
2004          */
2005         sd_buf_iodone,                  /* Index: 26 */
2006         sd_mapblockaddr_iodone,         /* Index: 27 */
2007         sd_mapblocksize_iodone,         /* Index: 28 */
2008         sd_checksum_iodone,             /* Index: 29 */
2009         sd_pm_iodone,                   /* Index: 30 */
2010 
2011         /*
2012          * Chain for buf IO for large sector size disk drive targets
2013          * with checksumming (PM disabled)
2014          */
2015         sd_buf_iodone,                  /* Index: 31 */
2016         sd_mapblockaddr_iodone,         /* Index: 32 */
2017         sd_mapblocksize_iodone,         /* Index: 33 */
2018         sd_checksum_iodone,             /* Index: 34 */
2019 };
2020 
2021 
2022 /*
2023  * Macros to locate the "first" function in the sd_iodone_chain[] array for
2024  * each iodone-side chain. These are located by the array index, but as the
2025  * iodone side functions are called in a decrementing-index order, the
2026  * highest index number in each chain must be specified (as these correspond
2027  * to the first function in the iodone chain that will be called by the core
2028  * at IO completion time).
2029  */
2030 
2031 #define SD_CHAIN_DISK_IODONE                    2
2032 #define SD_CHAIN_DISK_IODONE_NO_PM              4
2033 #define SD_CHAIN_RMMEDIA_IODONE                 8
2034 #define SD_CHAIN_MSS_DISK_IODONE                8
2035 #define SD_CHAIN_RMMEDIA_IODONE_NO_PM           11
2036 #define SD_CHAIN_MSS_DISK_IODONE_NO_PM          11
2037 #define SD_CHAIN_CHKSUM_IODONE                  15
2038 #define SD_CHAIN_CHKSUM_IODONE_NO_PM            18
2039 #define SD_CHAIN_USCSI_CMD_IODONE               20
2040 #define SD_CHAIN_USCSI_CHKSUM_IODONE            22
2041 #define SD_CHAIN_DIRECT_CMD_IODONE              24
2042 #define SD_CHAIN_PRIORITY_CMD_IODONE            25
2043 #define SD_CHAIN_MSS_CHKSUM_IODONE              30
2044 #define SD_CHAIN_MSS_CHKSUM_IODONE_NO_PM        34
2045 
2046 
2047 
2048 /*
2049  * Array to map a layering chain index to the appropriate initpkt routine.
2050  * The redundant entries are present so that the index used for accessing
2051  * the above sd_iostart_chain and sd_iodone_chain tables can be used directly
2052  * with this table as well.
2053  */
2054 typedef int (*sd_initpkt_t)(struct buf *, struct scsi_pkt **);
2055 
2056 static sd_initpkt_t     sd_initpkt_map[] = {
2057 
2058         /* Chain for buf IO for disk drive targets (PM enabled) */
2059         sd_initpkt_for_buf,             /* Index: 0 */
2060         sd_initpkt_for_buf,             /* Index: 1 */
2061         sd_initpkt_for_buf,             /* Index: 2 */
2062 
2063         /* Chain for buf IO for disk drive targets (PM disabled) */
2064         sd_initpkt_for_buf,             /* Index: 3 */
2065         sd_initpkt_for_buf,             /* Index: 4 */
2066 
2067         /*
2068          * Chain for buf IO for removable-media or large sector size
2069          * disk drive targets (PM enabled)
2070          */
2071         sd_initpkt_for_buf,             /* Index: 5 */
2072         sd_initpkt_for_buf,             /* Index: 6 */
2073         sd_initpkt_for_buf,             /* Index: 7 */
2074         sd_initpkt_for_buf,             /* Index: 8 */
2075 
2076         /*
2077          * Chain for buf IO for removable-media or large sector size
2078          * disk drive targets (PM disabled)
2079          */
2080         sd_initpkt_for_buf,             /* Index: 9 */
2081         sd_initpkt_for_buf,             /* Index: 10 */
2082         sd_initpkt_for_buf,             /* Index: 11 */
2083 
2084         /* Chain for buf IO for disk drives with checksumming (PM enabled) */
2085         sd_initpkt_for_buf,             /* Index: 12 */
2086         sd_initpkt_for_buf,             /* Index: 13 */
2087         sd_initpkt_for_buf,             /* Index: 14 */
2088         sd_initpkt_for_buf,             /* Index: 15 */
2089 
2090         /* Chain for buf IO for disk drives with checksumming (PM disabled) */
2091         sd_initpkt_for_buf,             /* Index: 16 */
2092         sd_initpkt_for_buf,             /* Index: 17 */
2093         sd_initpkt_for_buf,             /* Index: 18 */
2094 
2095         /* Chain for USCSI commands (non-checksum targets) */
2096         sd_initpkt_for_uscsi,           /* Index: 19 */
2097         sd_initpkt_for_uscsi,           /* Index: 20 */
2098 
2099         /* Chain for USCSI commands (checksum targets) */
2100         sd_initpkt_for_uscsi,           /* Index: 21 */
2101         sd_initpkt_for_uscsi,           /* Index: 22 */
2102         sd_initpkt_for_uscsi,           /* Index: 22 */
2103 
2104         /* Chain for "direct" USCSI commands (all targets) */
2105         sd_initpkt_for_uscsi,           /* Index: 24 */
2106 
2107         /* Chain for "direct priority" USCSI commands (all targets) */
2108         sd_initpkt_for_uscsi,           /* Index: 25 */
2109 
2110         /*
2111          * Chain for buf IO for large sector size disk drive targets
2112          * with checksumming (PM enabled)
2113          */
2114         sd_initpkt_for_buf,             /* Index: 26 */
2115         sd_initpkt_for_buf,             /* Index: 27 */
2116         sd_initpkt_for_buf,             /* Index: 28 */
2117         sd_initpkt_for_buf,             /* Index: 29 */
2118         sd_initpkt_for_buf,             /* Index: 30 */
2119 
2120         /*
2121          * Chain for buf IO for large sector size disk drive targets
2122          * with checksumming (PM disabled)
2123          */
2124         sd_initpkt_for_buf,             /* Index: 31 */
2125         sd_initpkt_for_buf,             /* Index: 32 */
2126         sd_initpkt_for_buf,             /* Index: 33 */
2127         sd_initpkt_for_buf,             /* Index: 34 */
2128 };
2129 
2130 
2131 /*
2132  * Array to map a layering chain index to the appropriate destroypktpkt routine.
2133  * The redundant entries are present so that the index used for accessing
2134  * the above sd_iostart_chain and sd_iodone_chain tables can be used directly
2135  * with this table as well.
2136  */
2137 typedef void (*sd_destroypkt_t)(struct buf *);
2138 
2139 static sd_destroypkt_t  sd_destroypkt_map[] = {
2140 
2141         /* Chain for buf IO for disk drive targets (PM enabled) */
2142         sd_destroypkt_for_buf,          /* Index: 0 */
2143         sd_destroypkt_for_buf,          /* Index: 1 */
2144         sd_destroypkt_for_buf,          /* Index: 2 */
2145 
2146         /* Chain for buf IO for disk drive targets (PM disabled) */
2147         sd_destroypkt_for_buf,          /* Index: 3 */
2148         sd_destroypkt_for_buf,          /* Index: 4 */
2149 
2150         /*
2151          * Chain for buf IO for removable-media or large sector size
2152          * disk drive targets (PM enabled)
2153          */
2154         sd_destroypkt_for_buf,          /* Index: 5 */
2155         sd_destroypkt_for_buf,          /* Index: 6 */
2156         sd_destroypkt_for_buf,          /* Index: 7 */
2157         sd_destroypkt_for_buf,          /* Index: 8 */
2158 
2159         /*
2160          * Chain for buf IO for removable-media or large sector size
2161          * disk drive targets (PM disabled)
2162          */
2163         sd_destroypkt_for_buf,          /* Index: 9 */
2164         sd_destroypkt_for_buf,          /* Index: 10 */
2165         sd_destroypkt_for_buf,          /* Index: 11 */
2166 
2167         /* Chain for buf IO for disk drives with checksumming (PM enabled) */
2168         sd_destroypkt_for_buf,          /* Index: 12 */
2169         sd_destroypkt_for_buf,          /* Index: 13 */
2170         sd_destroypkt_for_buf,          /* Index: 14 */
2171         sd_destroypkt_for_buf,          /* Index: 15 */
2172 
2173         /* Chain for buf IO for disk drives with checksumming (PM disabled) */
2174         sd_destroypkt_for_buf,          /* Index: 16 */
2175         sd_destroypkt_for_buf,          /* Index: 17 */
2176         sd_destroypkt_for_buf,          /* Index: 18 */
2177 
2178         /* Chain for USCSI commands (non-checksum targets) */
2179         sd_destroypkt_for_uscsi,        /* Index: 19 */
2180         sd_destroypkt_for_uscsi,        /* Index: 20 */
2181 
2182         /* Chain for USCSI commands (checksum targets) */
2183         sd_destroypkt_for_uscsi,        /* Index: 21 */
2184         sd_destroypkt_for_uscsi,        /* Index: 22 */
2185         sd_destroypkt_for_uscsi,        /* Index: 22 */
2186 
2187         /* Chain for "direct" USCSI commands (all targets) */
2188         sd_destroypkt_for_uscsi,        /* Index: 24 */
2189 
2190         /* Chain for "direct priority" USCSI commands (all targets) */
2191         sd_destroypkt_for_uscsi,        /* Index: 25 */
2192 
2193         /*
2194          * Chain for buf IO for large sector size disk drive targets
2195          * with checksumming (PM disabled)
2196          */
2197         sd_destroypkt_for_buf,          /* Index: 26 */
2198         sd_destroypkt_for_buf,          /* Index: 27 */
2199         sd_destroypkt_for_buf,          /* Index: 28 */
2200         sd_destroypkt_for_buf,          /* Index: 29 */
2201         sd_destroypkt_for_buf,          /* Index: 30 */
2202 
2203         /*
2204          * Chain for buf IO for large sector size disk drive targets
2205          * with checksumming (PM enabled)
2206          */
2207         sd_destroypkt_for_buf,          /* Index: 31 */
2208         sd_destroypkt_for_buf,          /* Index: 32 */
2209         sd_destroypkt_for_buf,          /* Index: 33 */
2210         sd_destroypkt_for_buf,          /* Index: 34 */
2211 };
2212 
2213 
2214 
2215 /*
2216  * Array to map a layering chain index to the appropriate chain "type".
2217  * The chain type indicates a specific property/usage of the chain.
2218  * The redundant entries are present so that the index used for accessing
2219  * the above sd_iostart_chain and sd_iodone_chain tables can be used directly
2220  * with this table as well.
2221  */
2222 
2223 #define SD_CHAIN_NULL                   0       /* for the special RQS cmd */
2224 #define SD_CHAIN_BUFIO                  1       /* regular buf IO */
2225 #define SD_CHAIN_USCSI                  2       /* regular USCSI commands */
2226 #define SD_CHAIN_DIRECT                 3       /* uscsi, w/ bypass power mgt */
2227 #define SD_CHAIN_DIRECT_PRIORITY        4       /* uscsi, w/ bypass power mgt */
2228                                                 /* (for error recovery) */
2229 
2230 static int sd_chain_type_map[] = {
2231 
2232         /* Chain for buf IO for disk drive targets (PM enabled) */
2233         SD_CHAIN_BUFIO,                 /* Index: 0 */
2234         SD_CHAIN_BUFIO,                 /* Index: 1 */
2235         SD_CHAIN_BUFIO,                 /* Index: 2 */
2236 
2237         /* Chain for buf IO for disk drive targets (PM disabled) */
2238         SD_CHAIN_BUFIO,                 /* Index: 3 */
2239         SD_CHAIN_BUFIO,                 /* Index: 4 */
2240 
2241         /*
2242          * Chain for buf IO for removable-media or large sector size
2243          * disk drive targets (PM enabled)
2244          */
2245         SD_CHAIN_BUFIO,                 /* Index: 5 */
2246         SD_CHAIN_BUFIO,                 /* Index: 6 */
2247         SD_CHAIN_BUFIO,                 /* Index: 7 */
2248         SD_CHAIN_BUFIO,                 /* Index: 8 */
2249 
2250         /*
2251          * Chain for buf IO for removable-media or large sector size
2252          * disk drive targets (PM disabled)
2253          */
2254         SD_CHAIN_BUFIO,                 /* Index: 9 */
2255         SD_CHAIN_BUFIO,                 /* Index: 10 */
2256         SD_CHAIN_BUFIO,                 /* Index: 11 */
2257 
2258         /* Chain for buf IO for disk drives with checksumming (PM enabled) */
2259         SD_CHAIN_BUFIO,                 /* Index: 12 */
2260         SD_CHAIN_BUFIO,                 /* Index: 13 */
2261         SD_CHAIN_BUFIO,                 /* Index: 14 */
2262         SD_CHAIN_BUFIO,                 /* Index: 15 */
2263 
2264         /* Chain for buf IO for disk drives with checksumming (PM disabled) */
2265         SD_CHAIN_BUFIO,                 /* Index: 16 */
2266         SD_CHAIN_BUFIO,                 /* Index: 17 */
2267         SD_CHAIN_BUFIO,                 /* Index: 18 */
2268 
2269         /* Chain for USCSI commands (non-checksum targets) */
2270         SD_CHAIN_USCSI,                 /* Index: 19 */
2271         SD_CHAIN_USCSI,                 /* Index: 20 */
2272 
2273         /* Chain for USCSI commands (checksum targets) */
2274         SD_CHAIN_USCSI,                 /* Index: 21 */
2275         SD_CHAIN_USCSI,                 /* Index: 22 */
2276         SD_CHAIN_USCSI,                 /* Index: 23 */
2277 
2278         /* Chain for "direct" USCSI commands (all targets) */
2279         SD_CHAIN_DIRECT,                /* Index: 24 */
2280 
2281         /* Chain for "direct priority" USCSI commands (all targets) */
2282         SD_CHAIN_DIRECT_PRIORITY,       /* Index: 25 */
2283 
2284         /*
2285          * Chain for buf IO for large sector size disk drive targets
2286          * with checksumming (PM enabled)
2287          */
2288         SD_CHAIN_BUFIO,                 /* Index: 26 */
2289         SD_CHAIN_BUFIO,                 /* Index: 27 */
2290         SD_CHAIN_BUFIO,                 /* Index: 28 */
2291         SD_CHAIN_BUFIO,                 /* Index: 29 */
2292         SD_CHAIN_BUFIO,                 /* Index: 30 */
2293 
2294         /*
2295          * Chain for buf IO for large sector size disk drive targets
2296          * with checksumming (PM disabled)
2297          */
2298         SD_CHAIN_BUFIO,                 /* Index: 31 */
2299         SD_CHAIN_BUFIO,                 /* Index: 32 */
2300         SD_CHAIN_BUFIO,                 /* Index: 33 */
2301         SD_CHAIN_BUFIO,                 /* Index: 34 */
2302 };
2303 
2304 
2305 /* Macro to return TRUE if the IO has come from the sd_buf_iostart() chain. */
2306 #define SD_IS_BUFIO(xp)                 \
2307         (sd_chain_type_map[(xp)->xb_chain_iostart] == SD_CHAIN_BUFIO)
2308 
2309 /* Macro to return TRUE if the IO has come from the "direct priority" chain. */
2310 #define SD_IS_DIRECT_PRIORITY(xp)       \
2311         (sd_chain_type_map[(xp)->xb_chain_iostart] == SD_CHAIN_DIRECT_PRIORITY)
2312 
2313 
2314 
2315 /*
2316  * Struct, array, and macros to map a specific chain to the appropriate
2317  * layering indexes in the sd_iostart_chain[] and sd_iodone_chain[] arrays.
2318  *
2319  * The sd_chain_index_map[] array is used at attach time to set the various
2320  * un_xxx_chain type members of the sd_lun softstate to the specific layering
2321  * chain to be used with the instance. This allows different instances to use
2322  * different chain for buf IO, uscsi IO, etc.. Also, since the xb_chain_iostart
2323  * and xb_chain_iodone index values in the sd_xbuf are initialized to these
2324  * values at sd_xbuf init time, this allows (1) layering chains may be changed
2325  * dynamically & without the use of locking; and (2) a layer may update the
2326  * xb_chain_io[start|done] member in a given xbuf with its current index value,
2327  * to allow for deferred processing of an IO within the same chain from a
2328  * different execution context.
2329  */
2330 
2331 struct sd_chain_index {
2332         int     sci_iostart_index;
2333         int     sci_iodone_index;
2334 };
2335 
2336 static struct sd_chain_index    sd_chain_index_map[] = {
2337         { SD_CHAIN_DISK_IOSTART,                SD_CHAIN_DISK_IODONE },
2338         { SD_CHAIN_DISK_IOSTART_NO_PM,          SD_CHAIN_DISK_IODONE_NO_PM },
2339         { SD_CHAIN_RMMEDIA_IOSTART,             SD_CHAIN_RMMEDIA_IODONE },
2340         { SD_CHAIN_RMMEDIA_IOSTART_NO_PM,       SD_CHAIN_RMMEDIA_IODONE_NO_PM },
2341         { SD_CHAIN_CHKSUM_IOSTART,              SD_CHAIN_CHKSUM_IODONE },
2342         { SD_CHAIN_CHKSUM_IOSTART_NO_PM,        SD_CHAIN_CHKSUM_IODONE_NO_PM },
2343         { SD_CHAIN_USCSI_CMD_IOSTART,           SD_CHAIN_USCSI_CMD_IODONE },
2344         { SD_CHAIN_USCSI_CHKSUM_IOSTART,        SD_CHAIN_USCSI_CHKSUM_IODONE },
2345         { SD_CHAIN_DIRECT_CMD_IOSTART,          SD_CHAIN_DIRECT_CMD_IODONE },
2346         { SD_CHAIN_PRIORITY_CMD_IOSTART,        SD_CHAIN_PRIORITY_CMD_IODONE },
2347         { SD_CHAIN_MSS_CHKSUM_IOSTART,          SD_CHAIN_MSS_CHKSUM_IODONE },
2348         { SD_CHAIN_MSS_CHKSUM_IOSTART_NO_PM, SD_CHAIN_MSS_CHKSUM_IODONE_NO_PM },
2349 
2350 };
2351 
2352 
2353 /*
2354  * The following are indexes into the sd_chain_index_map[] array.
2355  */
2356 
2357 /* un->un_buf_chain_type must be set to one of these */
2358 #define SD_CHAIN_INFO_DISK              0
2359 #define SD_CHAIN_INFO_DISK_NO_PM        1
2360 #define SD_CHAIN_INFO_RMMEDIA           2
2361 #define SD_CHAIN_INFO_MSS_DISK          2
2362 #define SD_CHAIN_INFO_RMMEDIA_NO_PM     3
2363 #define SD_CHAIN_INFO_MSS_DSK_NO_PM     3
2364 #define SD_CHAIN_INFO_CHKSUM            4
2365 #define SD_CHAIN_INFO_CHKSUM_NO_PM      5
2366 #define SD_CHAIN_INFO_MSS_DISK_CHKSUM   10
2367 #define SD_CHAIN_INFO_MSS_DISK_CHKSUM_NO_PM     11
2368 
2369 /* un->un_uscsi_chain_type must be set to one of these */
2370 #define SD_CHAIN_INFO_USCSI_CMD         6
2371 /* USCSI with PM disabled is the same as DIRECT */
2372 #define SD_CHAIN_INFO_USCSI_CMD_NO_PM   8
2373 #define SD_CHAIN_INFO_USCSI_CHKSUM      7
2374 
2375 /* un->un_direct_chain_type must be set to one of these */
2376 #define SD_CHAIN_INFO_DIRECT_CMD        8
2377 
2378 /* un->un_priority_chain_type must be set to one of these */
2379 #define SD_CHAIN_INFO_PRIORITY_CMD      9
2380 
2381 /* size for devid inquiries */
2382 #define MAX_INQUIRY_SIZE                0xF0
2383 
2384 /*
2385  * Macros used by functions to pass a given buf(9S) struct along to the
2386  * next function in the layering chain for further processing.
2387  *
2388  * In the following macros, passing more than three arguments to the called
2389  * routines causes the optimizer for the SPARC compiler to stop doing tail
2390  * call elimination which results in significant performance degradation.
2391  */
2392 #define SD_BEGIN_IOSTART(index, un, bp) \
2393         ((*(sd_iostart_chain[index]))(index, un, bp))
2394 
2395 #define SD_BEGIN_IODONE(index, un, bp)  \
2396         ((*(sd_iodone_chain[index]))(index, un, bp))
2397 
2398 #define SD_NEXT_IOSTART(index, un, bp)                          \
2399         ((*(sd_iostart_chain[(index) + 1]))((index) + 1, un, bp))
2400 
2401 #define SD_NEXT_IODONE(index, un, bp)                           \
2402         ((*(sd_iodone_chain[(index) - 1]))((index) - 1, un, bp))
2403 
2404 /*
2405  *    Function: _init
2406  *
2407  * Description: This is the driver _init(9E) entry point.
2408  *
2409  * Return Code: Returns the value from mod_install(9F) or
2410  *              ddi_soft_state_init(9F) as appropriate.
2411  *
2412  *     Context: Called when driver module loaded.
2413  */
2414 
2415 int
2416 _init(void)
2417 {
2418         int     err;
2419 
2420         /* establish driver name from module name */
2421         sd_label = (char *)mod_modname(&modlinkage);
2422 
2423 #ifndef XPV_HVM_DRIVER
2424         err = ddi_soft_state_init(&sd_state, sizeof (struct sd_lun),
2425             SD_MAXUNIT);
2426         if (err != 0) {
2427                 return (err);
2428         }
2429 
2430 #else /* XPV_HVM_DRIVER */
2431         /* Remove the leading "hvm_" from the module name */
2432         ASSERT(strncmp(sd_label, "hvm_", strlen("hvm_")) == 0);
2433         sd_label += strlen("hvm_");
2434 
2435 #endif /* XPV_HVM_DRIVER */
2436 
2437         mutex_init(&sd_detach_mutex, NULL, MUTEX_DRIVER, NULL);
2438         mutex_init(&sd_log_mutex,    NULL, MUTEX_DRIVER, NULL);
2439         mutex_init(&sd_label_mutex,  NULL, MUTEX_DRIVER, NULL);
2440 
2441         mutex_init(&sd_tr.srq_resv_reclaim_mutex, NULL, MUTEX_DRIVER, NULL);
2442         cv_init(&sd_tr.srq_resv_reclaim_cv, NULL, CV_DRIVER, NULL);
2443         cv_init(&sd_tr.srq_inprocess_cv, NULL, CV_DRIVER, NULL);
2444 
2445         /*
2446          * it's ok to init here even for fibre device
2447          */
2448         sd_scsi_probe_cache_init();
2449 
2450         sd_scsi_target_lun_init();
2451 
2452         /*
2453          * Creating taskq before mod_install ensures that all callers (threads)
2454          * that enter the module after a successful mod_install encounter
2455          * a valid taskq.
2456          */
2457         sd_taskq_create();
2458 
2459         err = mod_install(&modlinkage);
2460         if (err != 0) {
2461                 /* delete taskq if install fails */
2462                 sd_taskq_delete();
2463 
2464                 mutex_destroy(&sd_detach_mutex);
2465                 mutex_destroy(&sd_log_mutex);
2466                 mutex_destroy(&sd_label_mutex);
2467 
2468                 mutex_destroy(&sd_tr.srq_resv_reclaim_mutex);
2469                 cv_destroy(&sd_tr.srq_resv_reclaim_cv);
2470                 cv_destroy(&sd_tr.srq_inprocess_cv);
2471 
2472                 sd_scsi_probe_cache_fini();
2473 
2474                 sd_scsi_target_lun_fini();
2475 
2476 #ifndef XPV_HVM_DRIVER
2477                 ddi_soft_state_fini(&sd_state);
2478 #endif /* !XPV_HVM_DRIVER */
2479                 return (err);
2480         }
2481 
2482         return (err);
2483 }
2484 
2485 
2486 /*
2487  *    Function: _fini
2488  *
2489  * Description: This is the driver _fini(9E) entry point.
2490  *
2491  * Return Code: Returns the value from mod_remove(9F)
2492  *
2493  *     Context: Called when driver module is unloaded.
2494  */
2495 
2496 int
2497 _fini(void)
2498 {
2499         int err;
2500 
2501         if ((err = mod_remove(&modlinkage)) != 0) {
2502                 return (err);
2503         }
2504 
2505         sd_taskq_delete();
2506 
2507         mutex_destroy(&sd_detach_mutex);
2508         mutex_destroy(&sd_log_mutex);
2509         mutex_destroy(&sd_label_mutex);
2510         mutex_destroy(&sd_tr.srq_resv_reclaim_mutex);
2511 
2512         sd_scsi_probe_cache_fini();
2513 
2514         sd_scsi_target_lun_fini();
2515 
2516         cv_destroy(&sd_tr.srq_resv_reclaim_cv);
2517         cv_destroy(&sd_tr.srq_inprocess_cv);
2518 
2519 #ifndef XPV_HVM_DRIVER
2520         ddi_soft_state_fini(&sd_state);
2521 #endif /* !XPV_HVM_DRIVER */
2522 
2523         return (err);
2524 }
2525 
2526 
2527 /*
2528  *    Function: _info
2529  *
2530  * Description: This is the driver _info(9E) entry point.
2531  *
2532  *   Arguments: modinfop - pointer to the driver modinfo structure
2533  *
2534  * Return Code: Returns the value from mod_info(9F).
2535  *
2536  *     Context: Kernel thread context
2537  */
2538 
2539 int
2540 _info(struct modinfo *modinfop)
2541 {
2542         return (mod_info(&modlinkage, modinfop));
2543 }
2544 
2545 
2546 /*
2547  * The following routines implement the driver message logging facility.
2548  * They provide component- and level- based debug output filtering.
2549  * Output may also be restricted to messages for a single instance by
2550  * specifying a soft state pointer in sd_debug_un. If sd_debug_un is set
2551  * to NULL, then messages for all instances are printed.
2552  *
2553  * These routines have been cloned from each other due to the language
2554  * constraints of macros and variable argument list processing.
2555  */
2556 
2557 
2558 /*
2559  *    Function: sd_log_err
2560  *
2561  * Description: This routine is called by the SD_ERROR macro for debug
2562  *              logging of error conditions.
2563  *
2564  *   Arguments: comp - driver component being logged
2565  *              dev  - pointer to driver info structure
2566  *              fmt  - error string and format to be logged
2567  */
2568 
2569 static void
2570 sd_log_err(uint_t comp, struct sd_lun *un, const char *fmt, ...)
2571 {
2572         va_list         ap;
2573         dev_info_t      *dev;
2574 
2575         ASSERT(un != NULL);
2576         dev = SD_DEVINFO(un);
2577         ASSERT(dev != NULL);
2578 
2579         /*
2580          * Filter messages based on the global component and level masks.
2581          * Also print if un matches the value of sd_debug_un, or if
2582          * sd_debug_un is set to NULL.
2583          */
2584         if ((sd_component_mask & comp) && (sd_level_mask & SD_LOGMASK_ERROR) &&
2585             ((sd_debug_un == NULL) || (sd_debug_un == un))) {
2586                 mutex_enter(&sd_log_mutex);
2587                 va_start(ap, fmt);
2588                 (void) vsprintf(sd_log_buf, fmt, ap);
2589                 va_end(ap);
2590                 scsi_log(dev, sd_label, CE_CONT, "%s", sd_log_buf);
2591                 mutex_exit(&sd_log_mutex);
2592         }
2593 #ifdef SD_FAULT_INJECTION
2594         _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::sd_injection_mask));
2595         if (un->sd_injection_mask & comp) {
2596                 mutex_enter(&sd_log_mutex);
2597                 va_start(ap, fmt);
2598                 (void) vsprintf(sd_log_buf, fmt, ap);
2599                 va_end(ap);
2600                 sd_injection_log(sd_log_buf, un);
2601                 mutex_exit(&sd_log_mutex);
2602         }
2603 #endif
2604 }
2605 
2606 
2607 /*
2608  *    Function: sd_log_info
2609  *
2610  * Description: This routine is called by the SD_INFO macro for debug
2611  *              logging of general purpose informational conditions.
2612  *
2613  *   Arguments: comp - driver component being logged
2614  *              dev  - pointer to driver info structure
2615  *              fmt  - info string and format to be logged
2616  */
2617 
2618 static void
2619 sd_log_info(uint_t component, struct sd_lun *un, const char *fmt, ...)
2620 {
2621         va_list         ap;
2622         dev_info_t      *dev;
2623 
2624         ASSERT(un != NULL);
2625         dev = SD_DEVINFO(un);
2626         ASSERT(dev != NULL);
2627 
2628         /*
2629          * Filter messages based on the global component and level masks.
2630          * Also print if un matches the value of sd_debug_un, or if
2631          * sd_debug_un is set to NULL.
2632          */
2633         if ((sd_component_mask & component) &&
2634             (sd_level_mask & SD_LOGMASK_INFO) &&
2635             ((sd_debug_un == NULL) || (sd_debug_un == un))) {
2636                 mutex_enter(&sd_log_mutex);
2637                 va_start(ap, fmt);
2638                 (void) vsprintf(sd_log_buf, fmt, ap);
2639                 va_end(ap);
2640                 scsi_log(dev, sd_label, CE_CONT, "%s", sd_log_buf);
2641                 mutex_exit(&sd_log_mutex);
2642         }
2643 #ifdef SD_FAULT_INJECTION
2644         _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::sd_injection_mask));
2645         if (un->sd_injection_mask & component) {
2646                 mutex_enter(&sd_log_mutex);
2647                 va_start(ap, fmt);
2648                 (void) vsprintf(sd_log_buf, fmt, ap);
2649                 va_end(ap);
2650                 sd_injection_log(sd_log_buf, un);
2651                 mutex_exit(&sd_log_mutex);
2652         }
2653 #endif
2654 }
2655 
2656 
2657 /*
2658  *    Function: sd_log_trace
2659  *
2660  * Description: This routine is called by the SD_TRACE macro for debug
2661  *              logging of trace conditions (i.e. function entry/exit).
2662  *
2663  *   Arguments: comp - driver component being logged
2664  *              dev  - pointer to driver info structure
2665  *              fmt  - trace string and format to be logged
2666  */
2667 
2668 static void
2669 sd_log_trace(uint_t component, struct sd_lun *un, const char *fmt, ...)
2670 {
2671         va_list         ap;
2672         dev_info_t      *dev;
2673 
2674         ASSERT(un != NULL);
2675         dev = SD_DEVINFO(un);
2676         ASSERT(dev != NULL);
2677 
2678         /*
2679          * Filter messages based on the global component and level masks.
2680          * Also print if un matches the value of sd_debug_un, or if
2681          * sd_debug_un is set to NULL.
2682          */
2683         if ((sd_component_mask & component) &&
2684             (sd_level_mask & SD_LOGMASK_TRACE) &&
2685             ((sd_debug_un == NULL) || (sd_debug_un == un))) {
2686                 mutex_enter(&sd_log_mutex);
2687                 va_start(ap, fmt);
2688                 (void) vsprintf(sd_log_buf, fmt, ap);
2689                 va_end(ap);
2690                 scsi_log(dev, sd_label, CE_CONT, "%s", sd_log_buf);
2691                 mutex_exit(&sd_log_mutex);
2692         }
2693 #ifdef SD_FAULT_INJECTION
2694         _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::sd_injection_mask));
2695         if (un->sd_injection_mask & component) {
2696                 mutex_enter(&sd_log_mutex);
2697                 va_start(ap, fmt);
2698                 (void) vsprintf(sd_log_buf, fmt, ap);
2699                 va_end(ap);
2700                 sd_injection_log(sd_log_buf, un);
2701                 mutex_exit(&sd_log_mutex);
2702         }
2703 #endif
2704 }
2705 
2706 
2707 /*
2708  *    Function: sdprobe
2709  *
2710  * Description: This is the driver probe(9e) entry point function.
2711  *
2712  *   Arguments: devi - opaque device info handle
2713  *
2714  * Return Code: DDI_PROBE_SUCCESS: If the probe was successful.
2715  *              DDI_PROBE_FAILURE: If the probe failed.
2716  *              DDI_PROBE_PARTIAL: If the instance is not present now,
2717  *                                 but may be present in the future.
2718  */
2719 
2720 static int
2721 sdprobe(dev_info_t *devi)
2722 {
2723         struct scsi_device      *devp;
2724         int                     rval;
2725 #ifndef XPV_HVM_DRIVER
2726         int                     instance = ddi_get_instance(devi);
2727 #endif /* !XPV_HVM_DRIVER */
2728 
2729         /*
2730          * if it wasn't for pln, sdprobe could actually be nulldev
2731          * in the "__fibre" case.
2732          */
2733         if (ddi_dev_is_sid(devi) == DDI_SUCCESS) {
2734                 return (DDI_PROBE_DONTCARE);
2735         }
2736 
2737         devp = ddi_get_driver_private(devi);
2738 
2739         if (devp == NULL) {
2740                 /* Ooops... nexus driver is mis-configured... */
2741                 return (DDI_PROBE_FAILURE);
2742         }
2743 
2744 #ifndef XPV_HVM_DRIVER
2745         if (ddi_get_soft_state(sd_state, instance) != NULL) {
2746                 return (DDI_PROBE_PARTIAL);
2747         }
2748 #endif /* !XPV_HVM_DRIVER */
2749 
2750         /*
2751          * Call the SCSA utility probe routine to see if we actually
2752          * have a target at this SCSI nexus.
2753          */
2754         switch (sd_scsi_probe_with_cache(devp, NULL_FUNC)) {
2755         case SCSIPROBE_EXISTS:
2756                 switch (devp->sd_inq->inq_dtype) {
2757                 case DTYPE_DIRECT:
2758                         rval = DDI_PROBE_SUCCESS;
2759                         break;
2760                 case DTYPE_RODIRECT:
2761                         /* CDs etc. Can be removable media */
2762                         rval = DDI_PROBE_SUCCESS;
2763                         break;
2764                 case DTYPE_OPTICAL:
2765                         /*
2766                          * Rewritable optical driver HP115AA
2767                          * Can also be removable media
2768                          */
2769 
2770                         /*
2771                          * Do not attempt to bind to  DTYPE_OPTICAL if
2772                          * pre solaris 9 sparc sd behavior is required
2773                          *
2774                          * If first time through and sd_dtype_optical_bind
2775                          * has not been set in /etc/system check properties
2776                          */
2777 
2778                         if (sd_dtype_optical_bind  < 0) {
2779                                 sd_dtype_optical_bind = ddi_prop_get_int
2780                                     (DDI_DEV_T_ANY, devi, 0,
2781                                     "optical-device-bind", 1);
2782                         }
2783 
2784                         if (sd_dtype_optical_bind == 0) {
2785                                 rval = DDI_PROBE_FAILURE;
2786                         } else {
2787                                 rval = DDI_PROBE_SUCCESS;
2788                         }
2789                         break;
2790 
2791                 case DTYPE_NOTPRESENT:
2792                 default:
2793                         rval = DDI_PROBE_FAILURE;
2794                         break;
2795                 }
2796                 break;
2797         default:
2798                 rval = DDI_PROBE_PARTIAL;
2799                 break;
2800         }
2801 
2802         /*
2803          * This routine checks for resource allocation prior to freeing,
2804          * so it will take care of the "smart probing" case where a
2805          * scsi_probe() may or may not have been issued and will *not*
2806          * free previously-freed resources.
2807          */
2808         scsi_unprobe(devp);
2809         return (rval);
2810 }
2811 
2812 
2813 /*
2814  *    Function: sdinfo
2815  *
2816  * Description: This is the driver getinfo(9e) entry point function.
2817  *              Given the device number, return the devinfo pointer from
2818  *              the scsi_device structure or the instance number
2819  *              associated with the dev_t.
2820  *
2821  *   Arguments: dip     - pointer to device info structure
2822  *              infocmd - command argument (DDI_INFO_DEVT2DEVINFO,
2823  *                        DDI_INFO_DEVT2INSTANCE)
2824  *              arg     - driver dev_t
2825  *              resultp - user buffer for request response
2826  *
2827  * Return Code: DDI_SUCCESS
2828  *              DDI_FAILURE
2829  */
2830 /* ARGSUSED */
2831 static int
2832 sdinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
2833 {
2834         struct sd_lun   *un;
2835         dev_t           dev;
2836         int             instance;
2837         int             error;
2838 
2839         switch (infocmd) {
2840         case DDI_INFO_DEVT2DEVINFO:
2841                 dev = (dev_t)arg;
2842                 instance = SDUNIT(dev);
2843                 if ((un = ddi_get_soft_state(sd_state, instance)) == NULL) {
2844                         return (DDI_FAILURE);
2845                 }
2846                 *result = (void *) SD_DEVINFO(un);
2847                 error = DDI_SUCCESS;
2848                 break;
2849         case DDI_INFO_DEVT2INSTANCE:
2850                 dev = (dev_t)arg;
2851                 instance = SDUNIT(dev);
2852                 *result = (void *)(uintptr_t)instance;
2853                 error = DDI_SUCCESS;
2854                 break;
2855         default:
2856                 error = DDI_FAILURE;
2857         }
2858         return (error);
2859 }
2860 
2861 /*
2862  *    Function: sd_prop_op
2863  *
2864  * Description: This is the driver prop_op(9e) entry point function.
2865  *              Return the number of blocks for the partition in question
2866  *              or forward the request to the property facilities.
2867  *
2868  *   Arguments: dev       - device number
2869  *              dip       - pointer to device info structure
2870  *              prop_op   - property operator
2871  *              mod_flags - DDI_PROP_DONTPASS, don't pass to parent
2872  *              name      - pointer to property name
2873  *              valuep    - pointer or address of the user buffer
2874  *              lengthp   - property length
2875  *
2876  * Return Code: DDI_PROP_SUCCESS
2877  *              DDI_PROP_NOT_FOUND
2878  *              DDI_PROP_UNDEFINED
2879  *              DDI_PROP_NO_MEMORY
2880  *              DDI_PROP_BUF_TOO_SMALL
2881  */
2882 
2883 static int
2884 sd_prop_op(dev_t dev, dev_info_t *dip, ddi_prop_op_t prop_op, int mod_flags,
2885         char *name, caddr_t valuep, int *lengthp)
2886 {
2887         struct sd_lun   *un;
2888 
2889         if ((un = ddi_get_soft_state(sd_state, ddi_get_instance(dip))) == NULL)
2890                 return (ddi_prop_op(dev, dip, prop_op, mod_flags,
2891                     name, valuep, lengthp));
2892 
2893         return (cmlb_prop_op(un->un_cmlbhandle,
2894             dev, dip, prop_op, mod_flags, name, valuep, lengthp,
2895             SDPART(dev), (void *)SD_PATH_DIRECT));
2896 }
2897 
2898 /*
2899  * The following functions are for smart probing:
2900  * sd_scsi_probe_cache_init()
2901  * sd_scsi_probe_cache_fini()
2902  * sd_scsi_clear_probe_cache()
2903  * sd_scsi_probe_with_cache()
2904  */
2905 
2906 /*
2907  *    Function: sd_scsi_probe_cache_init
2908  *
2909  * Description: Initializes the probe response cache mutex and head pointer.
2910  *
2911  *     Context: Kernel thread context
2912  */
2913 
2914 static void
2915 sd_scsi_probe_cache_init(void)
2916 {
2917         mutex_init(&sd_scsi_probe_cache_mutex, NULL, MUTEX_DRIVER, NULL);
2918         sd_scsi_probe_cache_head = NULL;
2919 }
2920 
2921 
2922 /*
2923  *    Function: sd_scsi_probe_cache_fini
2924  *
2925  * Description: Frees all resources associated with the probe response cache.
2926  *
2927  *     Context: Kernel thread context
2928  */
2929 
2930 static void
2931 sd_scsi_probe_cache_fini(void)
2932 {
2933         struct sd_scsi_probe_cache *cp;
2934         struct sd_scsi_probe_cache *ncp;
2935 
2936         /* Clean up our smart probing linked list */
2937         for (cp = sd_scsi_probe_cache_head; cp != NULL; cp = ncp) {
2938                 ncp = cp->next;
2939                 kmem_free(cp, sizeof (struct sd_scsi_probe_cache));
2940         }
2941         sd_scsi_probe_cache_head = NULL;
2942         mutex_destroy(&sd_scsi_probe_cache_mutex);
2943 }
2944 
2945 
2946 /*
2947  *    Function: sd_scsi_clear_probe_cache
2948  *
2949  * Description: This routine clears the probe response cache. This is
2950  *              done when open() returns ENXIO so that when deferred
2951  *              attach is attempted (possibly after a device has been
2952  *              turned on) we will retry the probe. Since we don't know
2953  *              which target we failed to open, we just clear the
2954  *              entire cache.
2955  *
2956  *     Context: Kernel thread context
2957  */
2958 
2959 static void
2960 sd_scsi_clear_probe_cache(void)
2961 {
2962         struct sd_scsi_probe_cache      *cp;
2963         int                             i;
2964 
2965         mutex_enter(&sd_scsi_probe_cache_mutex);
2966         for (cp = sd_scsi_probe_cache_head; cp != NULL; cp = cp->next) {
2967                 /*
2968                  * Reset all entries to SCSIPROBE_EXISTS.  This will
2969                  * force probing to be performed the next time
2970                  * sd_scsi_probe_with_cache is called.
2971                  */
2972                 for (i = 0; i < NTARGETS_WIDE; i++) {
2973                         cp->cache[i] = SCSIPROBE_EXISTS;
2974                 }
2975         }
2976         mutex_exit(&sd_scsi_probe_cache_mutex);
2977 }
2978 
2979 
2980 /*
2981  *    Function: sd_scsi_probe_with_cache
2982  *
2983  * Description: This routine implements support for a scsi device probe
2984  *              with cache. The driver maintains a cache of the target
2985  *              responses to scsi probes. If we get no response from a
2986  *              target during a probe inquiry, we remember that, and we
2987  *              avoid additional calls to scsi_probe on non-zero LUNs
2988  *              on the same target until the cache is cleared. By doing
2989  *              so we avoid the 1/4 sec selection timeout for nonzero
2990  *              LUNs. lun0 of a target is always probed.
2991  *
2992  *   Arguments: devp     - Pointer to a scsi_device(9S) structure
2993  *              waitfunc - indicates what the allocator routines should
2994  *                         do when resources are not available. This value
2995  *                         is passed on to scsi_probe() when that routine
2996  *                         is called.
2997  *
2998  * Return Code: SCSIPROBE_NORESP if a NORESP in probe response cache;
2999  *              otherwise the value returned by scsi_probe(9F).
3000  *
3001  *     Context: Kernel thread context
3002  */
3003 
3004 static int
3005 sd_scsi_probe_with_cache(struct scsi_device *devp, int (*waitfn)())
3006 {
3007         struct sd_scsi_probe_cache      *cp;
3008         dev_info_t      *pdip = ddi_get_parent(devp->sd_dev);
3009         int             lun, tgt;
3010 
3011         lun = ddi_prop_get_int(DDI_DEV_T_ANY, devp->sd_dev, DDI_PROP_DONTPASS,
3012             SCSI_ADDR_PROP_LUN, 0);
3013         tgt = ddi_prop_get_int(DDI_DEV_T_ANY, devp->sd_dev, DDI_PROP_DONTPASS,
3014             SCSI_ADDR_PROP_TARGET, -1);
3015 
3016         /* Make sure caching enabled and target in range */
3017         if ((tgt < 0) || (tgt >= NTARGETS_WIDE)) {
3018                 /* do it the old way (no cache) */
3019                 return (scsi_probe(devp, waitfn));
3020         }
3021 
3022         mutex_enter(&sd_scsi_probe_cache_mutex);
3023 
3024         /* Find the cache for this scsi bus instance */
3025         for (cp = sd_scsi_probe_cache_head; cp != NULL; cp = cp->next) {
3026                 if (cp->pdip == pdip) {
3027                         break;
3028                 }
3029         }
3030 
3031         /* If we can't find a cache for this pdip, create one */
3032         if (cp == NULL) {
3033                 int i;
3034 
3035                 cp = kmem_zalloc(sizeof (struct sd_scsi_probe_cache),
3036                     KM_SLEEP);
3037                 cp->pdip = pdip;
3038                 cp->next = sd_scsi_probe_cache_head;
3039                 sd_scsi_probe_cache_head = cp;
3040                 for (i = 0; i < NTARGETS_WIDE; i++) {
3041                         cp->cache[i] = SCSIPROBE_EXISTS;
3042                 }
3043         }
3044 
3045         mutex_exit(&sd_scsi_probe_cache_mutex);
3046 
3047         /* Recompute the cache for this target if LUN zero */
3048         if (lun == 0) {
3049                 cp->cache[tgt] = SCSIPROBE_EXISTS;
3050         }
3051 
3052         /* Don't probe if cache remembers a NORESP from a previous LUN. */
3053         if (cp->cache[tgt] != SCSIPROBE_EXISTS) {
3054                 return (SCSIPROBE_NORESP);
3055         }
3056 
3057         /* Do the actual probe; save & return the result */
3058         return (cp->cache[tgt] = scsi_probe(devp, waitfn));
3059 }
3060 
3061 
3062 /*
3063  *    Function: sd_scsi_target_lun_init
3064  *
3065  * Description: Initializes the attached lun chain mutex and head pointer.
3066  *
3067  *     Context: Kernel thread context
3068  */
3069 
3070 static void
3071 sd_scsi_target_lun_init(void)
3072 {
3073         mutex_init(&sd_scsi_target_lun_mutex, NULL, MUTEX_DRIVER, NULL);
3074         sd_scsi_target_lun_head = NULL;
3075 }
3076 
3077 
3078 /*
3079  *    Function: sd_scsi_target_lun_fini
3080  *
3081  * Description: Frees all resources associated with the attached lun
3082  *              chain
3083  *
3084  *     Context: Kernel thread context
3085  */
3086 
3087 static void
3088 sd_scsi_target_lun_fini(void)
3089 {
3090         struct sd_scsi_hba_tgt_lun      *cp;
3091         struct sd_scsi_hba_tgt_lun      *ncp;
3092 
3093         for (cp = sd_scsi_target_lun_head; cp != NULL; cp = ncp) {
3094                 ncp = cp->next;
3095                 kmem_free(cp, sizeof (struct sd_scsi_hba_tgt_lun));
3096         }
3097         sd_scsi_target_lun_head = NULL;
3098         mutex_destroy(&sd_scsi_target_lun_mutex);
3099 }
3100 
3101 
3102 /*
3103  *    Function: sd_scsi_get_target_lun_count
3104  *
3105  * Description: This routine will check in the attached lun chain to see
3106  *              how many luns are attached on the required SCSI controller
3107  *              and target. Currently, some capabilities like tagged queue
3108  *              are supported per target based by HBA. So all luns in a
3109  *              target have the same capabilities. Based on this assumption,
3110  *              sd should only set these capabilities once per target. This
3111  *              function is called when sd needs to decide how many luns
3112  *              already attached on a target.
3113  *
3114  *   Arguments: dip     - Pointer to the system's dev_info_t for the SCSI
3115  *                        controller device.
3116  *              target  - The target ID on the controller's SCSI bus.
3117  *
3118  * Return Code: The number of luns attached on the required target and
3119  *              controller.
3120  *              -1 if target ID is not in parallel SCSI scope or the given
3121  *              dip is not in the chain.
3122  *
3123  *     Context: Kernel thread context
3124  */
3125 
3126 static int
3127 sd_scsi_get_target_lun_count(dev_info_t *dip, int target)
3128 {
3129         struct sd_scsi_hba_tgt_lun      *cp;
3130 
3131         if ((target < 0) || (target >= NTARGETS_WIDE)) {
3132                 return (-1);
3133         }
3134 
3135         mutex_enter(&sd_scsi_target_lun_mutex);
3136 
3137         for (cp = sd_scsi_target_lun_head; cp != NULL; cp = cp->next) {
3138                 if (cp->pdip == dip) {
3139                         break;
3140                 }
3141         }
3142 
3143         mutex_exit(&sd_scsi_target_lun_mutex);
3144 
3145         if (cp == NULL) {
3146                 return (-1);
3147         }
3148 
3149         return (cp->nlun[target]);
3150 }
3151 
3152 
3153 /*
3154  *    Function: sd_scsi_update_lun_on_target
3155  *
3156  * Description: This routine is used to update the attached lun chain when a
3157  *              lun is attached or detached on a target.
3158  *
3159  *   Arguments: dip     - Pointer to the system's dev_info_t for the SCSI
3160  *                        controller device.
3161  *              target  - The target ID on the controller's SCSI bus.
3162  *              flag    - Indicate the lun is attached or detached.
3163  *
3164  *     Context: Kernel thread context
3165  */
3166 
3167 static void
3168 sd_scsi_update_lun_on_target(dev_info_t *dip, int target, int flag)
3169 {
3170         struct sd_scsi_hba_tgt_lun      *cp;
3171 
3172         mutex_enter(&sd_scsi_target_lun_mutex);
3173 
3174         for (cp = sd_scsi_target_lun_head; cp != NULL; cp = cp->next) {
3175                 if (cp->pdip == dip) {
3176                         break;
3177                 }
3178         }
3179 
3180         if ((cp == NULL) && (flag == SD_SCSI_LUN_ATTACH)) {
3181                 cp = kmem_zalloc(sizeof (struct sd_scsi_hba_tgt_lun),
3182                     KM_SLEEP);
3183                 cp->pdip = dip;
3184                 cp->next = sd_scsi_target_lun_head;
3185                 sd_scsi_target_lun_head = cp;
3186         }
3187 
3188         mutex_exit(&sd_scsi_target_lun_mutex);
3189 
3190         if (cp != NULL) {
3191                 if (flag == SD_SCSI_LUN_ATTACH) {
3192                         cp->nlun[target] ++;
3193                 } else {
3194                         cp->nlun[target] --;
3195                 }
3196         }
3197 }
3198 
3199 
3200 /*
3201  *    Function: sd_spin_up_unit
3202  *
3203  * Description: Issues the following commands to spin-up the device:
3204  *              START STOP UNIT, and INQUIRY.
3205  *
3206  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
3207  *                      structure for this target.
3208  *
3209  * Return Code: 0 - success
3210  *              EIO - failure
3211  *              EACCES - reservation conflict
3212  *
3213  *     Context: Kernel thread context
3214  */
3215 
3216 static int
3217 sd_spin_up_unit(sd_ssc_t *ssc)
3218 {
3219         size_t  resid           = 0;
3220         int     has_conflict    = FALSE;
3221         uchar_t *bufaddr;
3222         int     status;
3223         struct sd_lun   *un;
3224 
3225         ASSERT(ssc != NULL);
3226         un = ssc->ssc_un;
3227         ASSERT(un != NULL);
3228 
3229         /*
3230          * Send a throwaway START UNIT command.
3231          *
3232          * If we fail on this, we don't care presently what precisely
3233          * is wrong.  EMC's arrays will also fail this with a check
3234          * condition (0x2/0x4/0x3) if the device is "inactive," but
3235          * we don't want to fail the attach because it may become
3236          * "active" later.
3237          * We don't know if power condition is supported or not at
3238          * this stage, use START STOP bit.
3239          */
3240         status = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
3241             SD_TARGET_START, SD_PATH_DIRECT);
3242 
3243         if (status != 0) {
3244                 if (status == EACCES)
3245                         has_conflict = TRUE;
3246                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3247         }
3248 
3249         /*
3250          * Send another INQUIRY command to the target. This is necessary for
3251          * non-removable media direct access devices because their INQUIRY data
3252          * may not be fully qualified until they are spun up (perhaps via the
3253          * START command above).  Note: This seems to be needed for some
3254          * legacy devices only.) The INQUIRY command should succeed even if a
3255          * Reservation Conflict is present.
3256          */
3257         bufaddr = kmem_zalloc(SUN_INQSIZE, KM_SLEEP);
3258 
3259         if (sd_send_scsi_INQUIRY(ssc, bufaddr, SUN_INQSIZE, 0, 0, &resid)
3260             != 0) {
3261                 kmem_free(bufaddr, SUN_INQSIZE);
3262                 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
3263                 return (EIO);
3264         }
3265 
3266         /*
3267          * If we got enough INQUIRY data, copy it over the old INQUIRY data.
3268          * Note that this routine does not return a failure here even if the
3269          * INQUIRY command did not return any data.  This is a legacy behavior.
3270          */
3271         if ((SUN_INQSIZE - resid) >= SUN_MIN_INQLEN) {
3272                 bcopy(bufaddr, SD_INQUIRY(un), SUN_INQSIZE);
3273         }
3274 
3275         kmem_free(bufaddr, SUN_INQSIZE);
3276 
3277         /* If we hit a reservation conflict above, tell the caller. */
3278         if (has_conflict == TRUE) {
3279                 return (EACCES);
3280         }
3281 
3282         return (0);
3283 }
3284 
3285 #ifdef _LP64
3286 /*
3287  *    Function: sd_enable_descr_sense
3288  *
3289  * Description: This routine attempts to select descriptor sense format
3290  *              using the Control mode page.  Devices that support 64 bit
3291  *              LBAs (for >2TB luns) should also implement descriptor
3292  *              sense data so we will call this function whenever we see
3293  *              a lun larger than 2TB.  If for some reason the device
3294  *              supports 64 bit LBAs but doesn't support descriptor sense
3295  *              presumably the mode select will fail.  Everything will
3296  *              continue to work normally except that we will not get
3297  *              complete sense data for commands that fail with an LBA
3298  *              larger than 32 bits.
3299  *
3300  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
3301  *                      structure for this target.
3302  *
3303  *     Context: Kernel thread context only
3304  */
3305 
3306 static void
3307 sd_enable_descr_sense(sd_ssc_t *ssc)
3308 {
3309         uchar_t                 *header;
3310         struct mode_control_scsi3 *ctrl_bufp;
3311         size_t                  buflen;
3312         size_t                  bd_len;
3313         int                     status;
3314         struct sd_lun           *un;
3315 
3316         ASSERT(ssc != NULL);
3317         un = ssc->ssc_un;
3318         ASSERT(un != NULL);
3319 
3320         /*
3321          * Read MODE SENSE page 0xA, Control Mode Page
3322          */
3323         buflen = MODE_HEADER_LENGTH + MODE_BLK_DESC_LENGTH +
3324             sizeof (struct mode_control_scsi3);
3325         header = kmem_zalloc(buflen, KM_SLEEP);
3326 
3327         status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, header, buflen,
3328             MODEPAGE_CTRL_MODE, SD_PATH_DIRECT);
3329 
3330         if (status != 0) {
3331                 SD_ERROR(SD_LOG_COMMON, un,
3332                     "sd_enable_descr_sense: mode sense ctrl page failed\n");
3333                 goto eds_exit;
3334         }
3335 
3336         /*
3337          * Determine size of Block Descriptors in order to locate
3338          * the mode page data. ATAPI devices return 0, SCSI devices
3339          * should return MODE_BLK_DESC_LENGTH.
3340          */
3341         bd_len  = ((struct mode_header *)header)->bdesc_length;
3342 
3343         /* Clear the mode data length field for MODE SELECT */
3344         ((struct mode_header *)header)->length = 0;
3345 
3346         ctrl_bufp = (struct mode_control_scsi3 *)
3347             (header + MODE_HEADER_LENGTH + bd_len);
3348 
3349         /*
3350          * If the page length is smaller than the expected value,
3351          * the target device doesn't support D_SENSE. Bail out here.
3352          */
3353         if (ctrl_bufp->mode_page.length <
3354             sizeof (struct mode_control_scsi3) - 2) {
3355                 SD_ERROR(SD_LOG_COMMON, un,
3356                     "sd_enable_descr_sense: enable D_SENSE failed\n");
3357                 goto eds_exit;
3358         }
3359 
3360         /*
3361          * Clear PS bit for MODE SELECT
3362          */
3363         ctrl_bufp->mode_page.ps = 0;
3364 
3365         /*
3366          * Set D_SENSE to enable descriptor sense format.
3367          */
3368         ctrl_bufp->d_sense = 1;
3369 
3370         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3371 
3372         /*
3373          * Use MODE SELECT to commit the change to the D_SENSE bit
3374          */
3375         status = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, header,
3376             buflen, SD_DONTSAVE_PAGE, SD_PATH_DIRECT);
3377 
3378         if (status != 0) {
3379                 SD_INFO(SD_LOG_COMMON, un,
3380                     "sd_enable_descr_sense: mode select ctrl page failed\n");
3381         } else {
3382                 kmem_free(header, buflen);
3383                 return;
3384         }
3385 
3386 eds_exit:
3387         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3388         kmem_free(header, buflen);
3389 }
3390 
3391 /*
3392  *    Function: sd_reenable_dsense_task
3393  *
3394  * Description: Re-enable descriptor sense after device or bus reset
3395  *
3396  *     Context: Executes in a taskq() thread context
3397  */
3398 static void
3399 sd_reenable_dsense_task(void *arg)
3400 {
3401         struct  sd_lun  *un = arg;
3402         sd_ssc_t        *ssc;
3403 
3404         ASSERT(un != NULL);
3405 
3406         ssc = sd_ssc_init(un);
3407         sd_enable_descr_sense(ssc);
3408         sd_ssc_fini(ssc);
3409 }
3410 #endif /* _LP64 */
3411 
3412 /*
3413  *    Function: sd_set_mmc_caps
3414  *
3415  * Description: This routine determines if the device is MMC compliant and if
3416  *              the device supports CDDA via a mode sense of the CDVD
3417  *              capabilities mode page. Also checks if the device is a
3418  *              dvdram writable device.
3419  *
3420  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
3421  *                      structure for this target.
3422  *
3423  *     Context: Kernel thread context only
3424  */
3425 
3426 static void
3427 sd_set_mmc_caps(sd_ssc_t *ssc)
3428 {
3429         struct mode_header_grp2         *sense_mhp;
3430         uchar_t                         *sense_page;
3431         caddr_t                         buf;
3432         int                             bd_len;
3433         int                             status;
3434         struct uscsi_cmd                com;
3435         int                             rtn;
3436         uchar_t                         *out_data_rw, *out_data_hd;
3437         uchar_t                         *rqbuf_rw, *rqbuf_hd;
3438         uchar_t                         *out_data_gesn;
3439         int                             gesn_len;
3440         struct sd_lun                   *un;
3441 
3442         ASSERT(ssc != NULL);
3443         un = ssc->ssc_un;
3444         ASSERT(un != NULL);
3445 
3446         /*
3447          * The flags which will be set in this function are - mmc compliant,
3448          * dvdram writable device, cdda support. Initialize them to FALSE
3449          * and if a capability is detected - it will be set to TRUE.
3450          */
3451         un->un_f_mmc_cap = FALSE;
3452         un->un_f_dvdram_writable_device = FALSE;
3453         un->un_f_cfg_cdda = FALSE;
3454 
3455         buf = kmem_zalloc(BUFLEN_MODE_CDROM_CAP, KM_SLEEP);
3456         status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, (uchar_t *)buf,
3457             BUFLEN_MODE_CDROM_CAP, MODEPAGE_CDROM_CAP, SD_PATH_DIRECT);
3458 
3459         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3460 
3461         if (status != 0) {
3462                 /* command failed; just return */
3463                 kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3464                 return;
3465         }
3466         /*
3467          * If the mode sense request for the CDROM CAPABILITIES
3468          * page (0x2A) succeeds the device is assumed to be MMC.
3469          */
3470         un->un_f_mmc_cap = TRUE;
3471 
3472         /* See if GET STATUS EVENT NOTIFICATION is supported */
3473         if (un->un_f_mmc_gesn_polling) {
3474                 gesn_len = SD_GESN_HEADER_LEN + SD_GESN_MEDIA_DATA_LEN;
3475                 out_data_gesn = kmem_zalloc(gesn_len, KM_SLEEP);
3476 
3477                 rtn = sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION(ssc,
3478                     out_data_gesn, gesn_len, 1 << SD_GESN_MEDIA_CLASS);
3479 
3480                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3481 
3482                 if ((rtn != 0) || !sd_gesn_media_data_valid(out_data_gesn)) {
3483                         un->un_f_mmc_gesn_polling = FALSE;
3484                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
3485                             "sd_set_mmc_caps: gesn not supported "
3486                             "%d %x %x %x %x\n", rtn,
3487                             out_data_gesn[0], out_data_gesn[1],
3488                             out_data_gesn[2], out_data_gesn[3]);
3489                 }
3490 
3491                 kmem_free(out_data_gesn, gesn_len);
3492         }
3493 
3494         /* Get to the page data */
3495         sense_mhp = (struct mode_header_grp2 *)buf;
3496         bd_len = (sense_mhp->bdesc_length_hi << 8) |
3497             sense_mhp->bdesc_length_lo;
3498         if (bd_len > MODE_BLK_DESC_LENGTH) {
3499                 /*
3500                  * We did not get back the expected block descriptor
3501                  * length so we cannot determine if the device supports
3502                  * CDDA. However, we still indicate the device is MMC
3503                  * according to the successful response to the page
3504                  * 0x2A mode sense request.
3505                  */
3506                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
3507                     "sd_set_mmc_caps: Mode Sense returned "
3508                     "invalid block descriptor length\n");
3509                 kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3510                 return;
3511         }
3512 
3513         /* See if read CDDA is supported */
3514         sense_page = (uchar_t *)(buf + MODE_HEADER_LENGTH_GRP2 +
3515             bd_len);
3516         un->un_f_cfg_cdda = (sense_page[5] & 0x01) ? TRUE : FALSE;
3517 
3518         /* See if writing DVD RAM is supported. */
3519         un->un_f_dvdram_writable_device = (sense_page[3] & 0x20) ? TRUE : FALSE;
3520         if (un->un_f_dvdram_writable_device == TRUE) {
3521                 kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3522                 return;
3523         }
3524 
3525         /*
3526          * If the device presents DVD or CD capabilities in the mode
3527          * page, we can return here since a RRD will not have
3528          * these capabilities.
3529          */
3530         if ((sense_page[2] & 0x3f) || (sense_page[3] & 0x3f)) {
3531                 kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3532                 return;
3533         }
3534         kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3535 
3536         /*
3537          * If un->un_f_dvdram_writable_device is still FALSE,
3538          * check for a Removable Rigid Disk (RRD).  A RRD
3539          * device is identified by the features RANDOM_WRITABLE and
3540          * HARDWARE_DEFECT_MANAGEMENT.
3541          */
3542         out_data_rw = kmem_zalloc(SD_CURRENT_FEATURE_LEN, KM_SLEEP);
3543         rqbuf_rw = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
3544 
3545         rtn = sd_send_scsi_feature_GET_CONFIGURATION(ssc, &com, rqbuf_rw,
3546             SENSE_LENGTH, out_data_rw, SD_CURRENT_FEATURE_LEN,
3547             RANDOM_WRITABLE, SD_PATH_STANDARD);
3548 
3549         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3550 
3551         if (rtn != 0) {
3552                 kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN);
3553                 kmem_free(rqbuf_rw, SENSE_LENGTH);
3554                 return;
3555         }
3556 
3557         out_data_hd = kmem_zalloc(SD_CURRENT_FEATURE_LEN, KM_SLEEP);
3558         rqbuf_hd = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
3559 
3560         rtn = sd_send_scsi_feature_GET_CONFIGURATION(ssc, &com, rqbuf_hd,
3561             SENSE_LENGTH, out_data_hd, SD_CURRENT_FEATURE_LEN,
3562             HARDWARE_DEFECT_MANAGEMENT, SD_PATH_STANDARD);
3563 
3564         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3565 
3566         if (rtn == 0) {
3567                 /*
3568                  * We have good information, check for random writable
3569                  * and hardware defect features.
3570                  */
3571                 if ((out_data_rw[9] & RANDOM_WRITABLE) &&
3572                     (out_data_hd[9] & HARDWARE_DEFECT_MANAGEMENT)) {
3573                         un->un_f_dvdram_writable_device = TRUE;
3574                 }
3575         }
3576 
3577         kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN);
3578         kmem_free(rqbuf_rw, SENSE_LENGTH);
3579         kmem_free(out_data_hd, SD_CURRENT_FEATURE_LEN);
3580         kmem_free(rqbuf_hd, SENSE_LENGTH);
3581 }
3582 
3583 /*
3584  *    Function: sd_check_for_writable_cd
3585  *
3586  * Description: This routine determines if the media in the device is
3587  *              writable or not. It uses the get configuration command (0x46)
3588  *              to determine if the media is writable
3589  *
3590  *   Arguments: un - driver soft state (unit) structure
3591  *              path_flag - SD_PATH_DIRECT to use the USCSI "direct"
3592  *                           chain and the normal command waitq, or
3593  *                           SD_PATH_DIRECT_PRIORITY to use the USCSI
3594  *                           "direct" chain and bypass the normal command
3595  *                           waitq.
3596  *
3597  *     Context: Never called at interrupt context.
3598  */
3599 
3600 static void
3601 sd_check_for_writable_cd(sd_ssc_t *ssc, int path_flag)
3602 {
3603         struct uscsi_cmd                com;
3604         uchar_t                         *out_data;
3605         uchar_t                         *rqbuf;
3606         int                             rtn;
3607         uchar_t                         *out_data_rw, *out_data_hd;
3608         uchar_t                         *rqbuf_rw, *rqbuf_hd;
3609         struct mode_header_grp2         *sense_mhp;
3610         uchar_t                         *sense_page;
3611         caddr_t                         buf;
3612         int                             bd_len;
3613         int                             status;
3614         struct sd_lun                   *un;
3615 
3616         ASSERT(ssc != NULL);
3617         un = ssc->ssc_un;
3618         ASSERT(un != NULL);
3619         ASSERT(mutex_owned(SD_MUTEX(un)));
3620 
3621         /*
3622          * Initialize the writable media to false, if configuration info.
3623          * tells us otherwise then only we will set it.
3624          */
3625         un->un_f_mmc_writable_media = FALSE;
3626         mutex_exit(SD_MUTEX(un));
3627 
3628         out_data = kmem_zalloc(SD_PROFILE_HEADER_LEN, KM_SLEEP);
3629         rqbuf = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
3630 
3631         rtn = sd_send_scsi_GET_CONFIGURATION(ssc, &com, rqbuf, SENSE_LENGTH,
3632             out_data, SD_PROFILE_HEADER_LEN, path_flag);
3633 
3634         if (rtn != 0)
3635                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3636 
3637         mutex_enter(SD_MUTEX(un));
3638         if (rtn == 0) {
3639                 /*
3640                  * We have good information, check for writable DVD.
3641                  */
3642                 if ((out_data[6] == 0) && (out_data[7] == 0x12)) {
3643                         un->un_f_mmc_writable_media = TRUE;
3644                         kmem_free(out_data, SD_PROFILE_HEADER_LEN);
3645                         kmem_free(rqbuf, SENSE_LENGTH);
3646                         return;
3647                 }
3648         }
3649 
3650         kmem_free(out_data, SD_PROFILE_HEADER_LEN);
3651         kmem_free(rqbuf, SENSE_LENGTH);
3652 
3653         /*
3654          * Determine if this is a RRD type device.
3655          */
3656         mutex_exit(SD_MUTEX(un));
3657         buf = kmem_zalloc(BUFLEN_MODE_CDROM_CAP, KM_SLEEP);
3658         status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, (uchar_t *)buf,
3659             BUFLEN_MODE_CDROM_CAP, MODEPAGE_CDROM_CAP, path_flag);
3660 
3661         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3662 
3663         mutex_enter(SD_MUTEX(un));
3664         if (status != 0) {
3665                 /* command failed; just return */
3666                 kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3667                 return;
3668         }
3669 
3670         /* Get to the page data */
3671         sense_mhp = (struct mode_header_grp2 *)buf;
3672         bd_len = (sense_mhp->bdesc_length_hi << 8) | sense_mhp->bdesc_length_lo;
3673         if (bd_len > MODE_BLK_DESC_LENGTH) {
3674                 /*
3675                  * We did not get back the expected block descriptor length so
3676                  * we cannot check the mode page.
3677                  */
3678                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
3679                     "sd_check_for_writable_cd: Mode Sense returned "
3680                     "invalid block descriptor length\n");
3681                 kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3682                 return;
3683         }
3684 
3685         /*
3686          * If the device presents DVD or CD capabilities in the mode
3687          * page, we can return here since a RRD device will not have
3688          * these capabilities.
3689          */
3690         sense_page = (uchar_t *)(buf + MODE_HEADER_LENGTH_GRP2 + bd_len);
3691         if ((sense_page[2] & 0x3f) || (sense_page[3] & 0x3f)) {
3692                 kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3693                 return;
3694         }
3695         kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3696 
3697         /*
3698          * If un->un_f_mmc_writable_media is still FALSE,
3699          * check for RRD type media.  A RRD device is identified
3700          * by the features RANDOM_WRITABLE and HARDWARE_DEFECT_MANAGEMENT.
3701          */
3702         mutex_exit(SD_MUTEX(un));
3703         out_data_rw = kmem_zalloc(SD_CURRENT_FEATURE_LEN, KM_SLEEP);
3704         rqbuf_rw = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
3705 
3706         rtn = sd_send_scsi_feature_GET_CONFIGURATION(ssc, &com, rqbuf_rw,
3707             SENSE_LENGTH, out_data_rw, SD_CURRENT_FEATURE_LEN,
3708             RANDOM_WRITABLE, path_flag);
3709 
3710         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3711         if (rtn != 0) {
3712                 kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN);
3713                 kmem_free(rqbuf_rw, SENSE_LENGTH);
3714                 mutex_enter(SD_MUTEX(un));
3715                 return;
3716         }
3717 
3718         out_data_hd = kmem_zalloc(SD_CURRENT_FEATURE_LEN, KM_SLEEP);
3719         rqbuf_hd = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
3720 
3721         rtn = sd_send_scsi_feature_GET_CONFIGURATION(ssc, &com, rqbuf_hd,
3722             SENSE_LENGTH, out_data_hd, SD_CURRENT_FEATURE_LEN,
3723             HARDWARE_DEFECT_MANAGEMENT, path_flag);
3724 
3725         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3726         mutex_enter(SD_MUTEX(un));
3727         if (rtn == 0) {
3728                 /*
3729                  * We have good information, check for random writable
3730                  * and hardware defect features as current.
3731                  */
3732                 if ((out_data_rw[9] & RANDOM_WRITABLE) &&
3733                     (out_data_rw[10] & 0x1) &&
3734                     (out_data_hd[9] & HARDWARE_DEFECT_MANAGEMENT) &&
3735                     (out_data_hd[10] & 0x1)) {
3736                         un->un_f_mmc_writable_media = TRUE;
3737                 }
3738         }
3739 
3740         kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN);
3741         kmem_free(rqbuf_rw, SENSE_LENGTH);
3742         kmem_free(out_data_hd, SD_CURRENT_FEATURE_LEN);
3743         kmem_free(rqbuf_hd, SENSE_LENGTH);
3744 }
3745 
3746 /*
3747  *    Function: sd_read_unit_properties
3748  *
3749  * Description: The following implements a property lookup mechanism.
3750  *              Properties for particular disks (keyed on vendor, model
3751  *              and rev numbers) are sought in the sd.conf file via
3752  *              sd_process_sdconf_file(), and if not found there, are
3753  *              looked for in a list hardcoded in this driver via
3754  *              sd_process_sdconf_table() Once located the properties
3755  *              are used to update the driver unit structure.
3756  *
3757  *   Arguments: un - driver soft state (unit) structure
3758  */
3759 
3760 static void
3761 sd_read_unit_properties(struct sd_lun *un)
3762 {
3763         /*
3764          * sd_process_sdconf_file returns SD_FAILURE if it cannot find
3765          * the "sd-config-list" property (from the sd.conf file) or if
3766          * there was not a match for the inquiry vid/pid. If this event
3767          * occurs the static driver configuration table is searched for
3768          * a match.
3769          */
3770         ASSERT(un != NULL);
3771         if (sd_process_sdconf_file(un) == SD_FAILURE) {
3772                 sd_process_sdconf_table(un);
3773         }
3774 
3775         /* check for LSI device */
3776         sd_is_lsi(un);
3777 
3778 
3779 }
3780 
3781 
3782 /*
3783  *    Function: sd_process_sdconf_file
3784  *
3785  * Description: Use ddi_prop_lookup(9F) to obtain the properties from the
3786  *              driver's config file (ie, sd.conf) and update the driver
3787  *              soft state structure accordingly.
3788  *
3789  *   Arguments: un - driver soft state (unit) structure
3790  *
3791  * Return Code: SD_SUCCESS - The properties were successfully set according
3792  *                           to the driver configuration file.
3793  *              SD_FAILURE - The driver config list was not obtained or
3794  *                           there was no vid/pid match. This indicates that
3795  *                           the static config table should be used.
3796  *
3797  * The config file has a property, "sd-config-list". Currently we support
3798  * two kinds of formats. For both formats, the value of this property
3799  * is a list of duplets:
3800  *
3801  *  sd-config-list=
3802  *      <duplet>,
3803  *      [,<duplet>]*;
3804  *
3805  * For the improved format, where
3806  *
3807  *     <duplet>:= "<vid+pid>","<tunable-list>"
3808  *
3809  * and
3810  *
3811  *     <tunable-list>:=   <tunable> [, <tunable> ]*;
3812  *     <tunable> =        <name> : <value>
3813  *
3814  * The <vid+pid> is the string that is returned by the target device on a
3815  * SCSI inquiry command, the <tunable-list> contains one or more tunables
3816  * to apply to all target devices with the specified <vid+pid>.
3817  *
3818  * Each <tunable> is a "<name> : <value>" pair.
3819  *
3820  * For the old format, the structure of each duplet is as follows:
3821  *
3822  *  <duplet>:= "<vid+pid>","<data-property-name_list>"
3823  *
3824  * The first entry of the duplet is the device ID string (the concatenated
3825  * vid & pid; not to be confused with a device_id).  This is defined in
3826  * the same way as in the sd_disk_table.
3827  *
3828  * The second part of the duplet is a string that identifies a
3829  * data-property-name-list. The data-property-name-list is defined as
3830  * follows:
3831  *
3832  *  <data-property-name-list>:=<data-property-name> [<data-property-name>]
3833  *
3834  * The syntax of <data-property-name> depends on the <version> field.
3835  *
3836  * If version = SD_CONF_VERSION_1 we have the following syntax:
3837  *
3838  *      <data-property-name>:=<version>,<flags>,<prop0>,<prop1>,.....<propN>
3839  *
3840  * where the prop0 value will be used to set prop0 if bit0 set in the
3841  * flags, prop1 if bit1 set, etc. and N = SD_CONF_MAX_ITEMS -1
3842  *
3843  */
3844 
3845 static int
3846 sd_process_sdconf_file(struct sd_lun *un)
3847 {
3848         char    **config_list = NULL;
3849         uint_t  nelements;
3850         char    *vidptr;
3851         int     vidlen;
3852         char    *dnlist_ptr;
3853         char    *dataname_ptr;
3854         char    *dataname_lasts;
3855         int     *data_list = NULL;
3856         uint_t  data_list_len;
3857         int     rval = SD_FAILURE;
3858         int     i;
3859 
3860         ASSERT(un != NULL);
3861 
3862         /* Obtain the configuration list associated with the .conf file */
3863         if (ddi_prop_lookup_string_array(DDI_DEV_T_ANY, SD_DEVINFO(un),
3864             DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, sd_config_list,
3865             &config_list, &nelements) != DDI_PROP_SUCCESS) {
3866                 return (SD_FAILURE);
3867         }
3868 
3869         /*
3870          * Compare vids in each duplet to the inquiry vid - if a match is
3871          * made, get the data value and update the soft state structure
3872          * accordingly.
3873          *
3874          * Each duplet should show as a pair of strings, return SD_FAILURE
3875          * otherwise.
3876          */
3877         if (nelements & 1) {
3878                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
3879                     "sd-config-list should show as pairs of strings.\n");
3880                 if (config_list)
3881                         ddi_prop_free(config_list);
3882                 return (SD_FAILURE);
3883         }
3884 
3885         for (i = 0; i < nelements; i += 2) {
3886                 /*
3887                  * Note: The assumption here is that each vid entry is on
3888                  * a unique line from its associated duplet.
3889                  */
3890                 vidptr = config_list[i];
3891                 vidlen = (int)strlen(vidptr);
3892                 if (sd_sdconf_id_match(un, vidptr, vidlen) != SD_SUCCESS) {
3893                         continue;
3894                 }
3895 
3896                 /*
3897                  * dnlist contains 1 or more blank separated
3898                  * data-property-name entries
3899                  */
3900                 dnlist_ptr = config_list[i + 1];
3901 
3902                 if (strchr(dnlist_ptr, ':') != NULL) {
3903                         /*
3904                          * Decode the improved format sd-config-list.
3905                          */
3906                         sd_nvpair_str_decode(un, dnlist_ptr);
3907                 } else {
3908                         /*
3909                          * The old format sd-config-list, loop through all
3910                          * data-property-name entries in the
3911                          * data-property-name-list
3912                          * setting the properties for each.
3913                          */
3914                         for (dataname_ptr = sd_strtok_r(dnlist_ptr, " \t",
3915                             &dataname_lasts); dataname_ptr != NULL;
3916                             dataname_ptr = sd_strtok_r(NULL, " \t",
3917                             &dataname_lasts)) {
3918                                 int version;
3919 
3920                                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
3921                                     "sd_process_sdconf_file: disk:%s, "
3922                                     "data:%s\n", vidptr, dataname_ptr);
3923 
3924                                 /* Get the data list */
3925                                 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY,
3926                                     SD_DEVINFO(un), 0, dataname_ptr, &data_list,
3927                                     &data_list_len) != DDI_PROP_SUCCESS) {
3928                                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
3929                                             "sd_process_sdconf_file: data "
3930                                             "property (%s) has no value\n",
3931                                             dataname_ptr);
3932                                         continue;
3933                                 }
3934 
3935                                 version = data_list[0];
3936 
3937                                 if (version == SD_CONF_VERSION_1) {
3938                                         sd_tunables values;
3939 
3940                                         /* Set the properties */
3941                                         if (sd_chk_vers1_data(un, data_list[1],
3942                                             &data_list[2], data_list_len,
3943                                             dataname_ptr) == SD_SUCCESS) {
3944                                                 sd_get_tunables_from_conf(un,
3945                                                     data_list[1], &data_list[2],
3946                                                     &values);
3947                                                 sd_set_vers1_properties(un,
3948                                                     data_list[1], &values);
3949                                                 rval = SD_SUCCESS;
3950                                         } else {
3951                                                 rval = SD_FAILURE;
3952                                         }
3953                                 } else {
3954                                         scsi_log(SD_DEVINFO(un), sd_label,
3955                                             CE_WARN, "data property %s version "
3956                                             "0x%x is invalid.",
3957                                             dataname_ptr, version);
3958                                         rval = SD_FAILURE;
3959                                 }
3960                                 if (data_list)
3961                                         ddi_prop_free(data_list);
3962                         }
3963                 }
3964         }
3965 
3966         /* free up the memory allocated by ddi_prop_lookup_string_array(). */
3967         if (config_list) {
3968                 ddi_prop_free(config_list);
3969         }
3970 
3971         return (rval);
3972 }
3973 
3974 /*
3975  *    Function: sd_nvpair_str_decode()
3976  *
3977  * Description: Parse the improved format sd-config-list to get
3978  *    each entry of tunable, which includes a name-value pair.
3979  *    Then call sd_set_properties() to set the property.
3980  *
3981  *   Arguments: un - driver soft state (unit) structure
3982  *    nvpair_str - the tunable list
3983  */
3984 static void
3985 sd_nvpair_str_decode(struct sd_lun *un, char *nvpair_str)
3986 {
3987         char    *nv, *name, *value, *token;
3988         char    *nv_lasts, *v_lasts, *x_lasts;
3989 
3990         for (nv = sd_strtok_r(nvpair_str, ",", &nv_lasts); nv != NULL;
3991             nv = sd_strtok_r(NULL, ",", &nv_lasts)) {
3992                 token = sd_strtok_r(nv, ":", &v_lasts);
3993                 name  = sd_strtok_r(token, " \t", &x_lasts);
3994                 token = sd_strtok_r(NULL, ":", &v_lasts);
3995                 value = sd_strtok_r(token, " \t", &x_lasts);
3996                 if (name == NULL || value == NULL) {
3997                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
3998                             "sd_nvpair_str_decode: "
3999                             "name or value is not valid!\n");
4000                 } else {
4001                         sd_set_properties(un, name, value);
4002                 }
4003         }
4004 }
4005 
4006 /*
4007  *    Function: sd_strtok_r()
4008  *
4009  * Description: This function uses strpbrk and strspn to break
4010  *    string into tokens on sequentially subsequent calls. Return
4011  *    NULL when no non-separator characters remain. The first
4012  *    argument is NULL for subsequent calls.
4013  */
4014 static char *
4015 sd_strtok_r(char *string, const char *sepset, char **lasts)
4016 {
4017         char    *q, *r;
4018 
4019         /* First or subsequent call */
4020         if (string == NULL)
4021                 string = *lasts;
4022 
4023         if (string == NULL)
4024                 return (NULL);
4025 
4026         /* Skip leading separators */
4027         q = string + strspn(string, sepset);
4028 
4029         if (*q == '\0')
4030                 return (NULL);
4031 
4032         if ((r = strpbrk(q, sepset)) == NULL)
4033                 *lasts = NULL;
4034         else {
4035                 *r = '\0';
4036                 *lasts = r + 1;
4037         }
4038         return (q);
4039 }
4040 
4041 /*
4042  *    Function: sd_set_properties()
4043  *
4044  * Description: Set device properties based on the improved
4045  *    format sd-config-list.
4046  *
4047  *   Arguments: un - driver soft state (unit) structure
4048  *    name  - supported tunable name
4049  *    value - tunable value
4050  */
4051 static void
4052 sd_set_properties(struct sd_lun *un, char *name, char *value)
4053 {
4054         char    *endptr = NULL;
4055         long    val = 0;
4056 
4057         if (strcasecmp(name, "cache-nonvolatile") == 0) {
4058                 if (strcasecmp(value, "true") == 0) {
4059                         un->un_f_suppress_cache_flush = TRUE;
4060                 } else if (strcasecmp(value, "false") == 0) {
4061                         un->un_f_suppress_cache_flush = FALSE;
4062                 } else {
4063                         goto value_invalid;
4064                 }
4065                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4066                     "suppress_cache_flush flag set to %d\n",
4067                     un->un_f_suppress_cache_flush);
4068                 return;
4069         }
4070 
4071         if (strcasecmp(name, "controller-type") == 0) {
4072                 if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4073                         un->un_ctype = val;
4074                 } else {
4075                         goto value_invalid;
4076                 }
4077                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4078                     "ctype set to %d\n", un->un_ctype);
4079                 return;
4080         }
4081 
4082         if (strcasecmp(name, "delay-busy") == 0) {
4083                 if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4084                         un->un_busy_timeout = drv_usectohz(val / 1000);
4085                 } else {
4086                         goto value_invalid;
4087                 }
4088                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4089                     "busy_timeout set to %d\n", un->un_busy_timeout);
4090                 return;
4091         }
4092 
4093         if (strcasecmp(name, "disksort") == 0) {
4094                 if (strcasecmp(value, "true") == 0) {
4095                         un->un_f_disksort_disabled = FALSE;
4096                 } else if (strcasecmp(value, "false") == 0) {
4097                         un->un_f_disksort_disabled = TRUE;
4098                 } else {
4099                         goto value_invalid;
4100                 }
4101                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4102                     "disksort disabled flag set to %d\n",
4103                     un->un_f_disksort_disabled);
4104                 return;
4105         }
4106 
4107         if (strcasecmp(name, "power-condition") == 0) {
4108                 if (strcasecmp(value, "true") == 0) {
4109                         un->un_f_power_condition_disabled = FALSE;
4110                 } else if (strcasecmp(value, "false") == 0) {
4111                         un->un_f_power_condition_disabled = TRUE;
4112                 } else {
4113                         goto value_invalid;
4114                 }
4115                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4116                     "power condition disabled flag set to %d\n",
4117                     un->un_f_power_condition_disabled);
4118                 return;
4119         }
4120 
4121         if (strcasecmp(name, "timeout-releasereservation") == 0) {
4122                 if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4123                         un->un_reserve_release_time = val;
4124                 } else {
4125                         goto value_invalid;
4126                 }
4127                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4128                     "reservation release timeout set to %d\n",
4129                     un->un_reserve_release_time);
4130                 return;
4131         }
4132 
4133         if (strcasecmp(name, "reset-lun") == 0) {
4134                 if (strcasecmp(value, "true") == 0) {
4135                         un->un_f_lun_reset_enabled = TRUE;
4136                 } else if (strcasecmp(value, "false") == 0) {
4137                         un->un_f_lun_reset_enabled = FALSE;
4138                 } else {
4139                         goto value_invalid;
4140                 }
4141                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4142                     "lun reset enabled flag set to %d\n",
4143                     un->un_f_lun_reset_enabled);
4144                 return;
4145         }
4146 
4147         if (strcasecmp(name, "retries-busy") == 0) {
4148                 if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4149                         un->un_busy_retry_count = val;
4150                 } else {
4151                         goto value_invalid;
4152                 }
4153                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4154                     "busy retry count set to %d\n", un->un_busy_retry_count);
4155                 return;
4156         }
4157 
4158         if (strcasecmp(name, "retries-timeout") == 0) {
4159                 if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4160                         un->un_retry_count = val;
4161                 } else {
4162                         goto value_invalid;
4163                 }
4164                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4165                     "timeout retry count set to %d\n", un->un_retry_count);
4166                 return;
4167         }
4168 
4169         if (strcasecmp(name, "retries-notready") == 0) {
4170                 if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4171                         un->un_notready_retry_count = val;
4172                 } else {
4173                         goto value_invalid;
4174                 }
4175                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4176                     "notready retry count set to %d\n",
4177                     un->un_notready_retry_count);
4178                 return;
4179         }
4180 
4181         if (strcasecmp(name, "retries-reset") == 0) {
4182                 if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4183                         un->un_reset_retry_count = val;
4184                 } else {
4185                         goto value_invalid;
4186                 }
4187                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4188                     "reset retry count set to %d\n",
4189                     un->un_reset_retry_count);
4190                 return;
4191         }
4192 
4193         if (strcasecmp(name, "throttle-max") == 0) {
4194                 if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4195                         un->un_saved_throttle = un->un_throttle = val;
4196                 } else {
4197                         goto value_invalid;
4198                 }
4199                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4200                     "throttle set to %d\n", un->un_throttle);
4201         }
4202 
4203         if (strcasecmp(name, "throttle-min") == 0) {
4204                 if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4205                         un->un_min_throttle = val;
4206                 } else {
4207                         goto value_invalid;
4208                 }
4209                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4210                     "min throttle set to %d\n", un->un_min_throttle);
4211         }
4212 
4213         if (strcasecmp(name, "rmw-type") == 0) {
4214                 if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4215                         un->un_f_rmw_type = val;
4216                 } else {
4217                         goto value_invalid;
4218                 }
4219                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4220                     "RMW type set to %d\n", un->un_f_rmw_type);
4221         }
4222 
4223         if (strcasecmp(name, "physical-block-size") == 0) {
4224                 if (ddi_strtol(value, &endptr, 0, &val) == 0 &&
4225                     ISP2(val) && val >= un->un_tgt_blocksize &&
4226                     val >= un->un_sys_blocksize) {
4227                         un->un_phy_blocksize = val;
4228                 } else {
4229                         goto value_invalid;
4230                 }
4231                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4232                     "physical block size set to %d\n", un->un_phy_blocksize);
4233         }
4234 
4235         if (strcasecmp(name, "retries-victim") == 0) {
4236                 if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4237                         un->un_victim_retry_count = val;
4238                 } else {
4239                         goto value_invalid;
4240                 }
4241                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4242                     "victim retry count set to %d\n",
4243                     un->un_victim_retry_count);
4244                 return;
4245         }
4246 
4247         /*
4248          * Validate the throttle values.
4249          * If any of the numbers are invalid, set everything to defaults.
4250          */
4251         if ((un->un_throttle < SD_LOWEST_VALID_THROTTLE) ||
4252             (un->un_min_throttle < SD_LOWEST_VALID_THROTTLE) ||
4253             (un->un_min_throttle > un->un_throttle)) {
4254                 un->un_saved_throttle = un->un_throttle = sd_max_throttle;
4255                 un->un_min_throttle = sd_min_throttle;
4256         }
4257 
4258         if (strcasecmp(name, "mmc-gesn-polling") == 0) {
4259                 if (strcasecmp(value, "true") == 0) {
4260                         un->un_f_mmc_gesn_polling = TRUE;
4261                 } else if (strcasecmp(value, "false") == 0) {
4262                         un->un_f_mmc_gesn_polling = FALSE;
4263                 } else {
4264                         goto value_invalid;
4265                 }
4266                 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4267                     "mmc-gesn-polling set to %d\n",
4268                     un->un_f_mmc_gesn_polling);
4269         }
4270 
4271         return;
4272 
4273 value_invalid:
4274         SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4275             "value of prop %s is invalid\n", name);
4276 }
4277 
4278 /*
4279  *    Function: sd_get_tunables_from_conf()
4280  *
4281  *
4282  *    This function reads the data list from the sd.conf file and pulls
4283  *    the values that can have numeric values as arguments and places
4284  *    the values in the appropriate sd_tunables member.
4285  *    Since the order of the data list members varies across platforms
4286  *    This function reads them from the data list in a platform specific
4287  *    order and places them into the correct sd_tunable member that is
4288  *    consistent across all platforms.
4289  */
4290 static void
4291 sd_get_tunables_from_conf(struct sd_lun *un, int flags, int *data_list,
4292     sd_tunables *values)
4293 {
4294         int i;
4295         int mask;
4296 
4297         bzero(values, sizeof (sd_tunables));
4298 
4299         for (i = 0; i < SD_CONF_MAX_ITEMS; i++) {
4300 
4301                 mask = 1 << i;
4302                 if (mask > flags) {
4303                         break;
4304                 }
4305 
4306                 switch (mask & flags) {
4307                 case 0: /* This mask bit not set in flags */
4308                         continue;
4309                 case SD_CONF_BSET_THROTTLE:
4310                         values->sdt_throttle = data_list[i];
4311                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4312                             "sd_get_tunables_from_conf: throttle = %d\n",
4313                             values->sdt_throttle);
4314                         break;
4315                 case SD_CONF_BSET_CTYPE:
4316                         values->sdt_ctype = data_list[i];
4317                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4318                             "sd_get_tunables_from_conf: ctype = %d\n",
4319                             values->sdt_ctype);
4320                         break;
4321                 case SD_CONF_BSET_NRR_COUNT:
4322                         values->sdt_not_rdy_retries = data_list[i];
4323                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4324                             "sd_get_tunables_from_conf: not_rdy_retries = %d\n",
4325                             values->sdt_not_rdy_retries);
4326                         break;
4327                 case SD_CONF_BSET_BSY_RETRY_COUNT:
4328                         values->sdt_busy_retries = data_list[i];
4329                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4330                             "sd_get_tunables_from_conf: busy_retries = %d\n",
4331                             values->sdt_busy_retries);
4332                         break;
4333                 case SD_CONF_BSET_RST_RETRIES:
4334                         values->sdt_reset_retries = data_list[i];
4335                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4336                             "sd_get_tunables_from_conf: reset_retries = %d\n",
4337                             values->sdt_reset_retries);
4338                         break;
4339                 case SD_CONF_BSET_RSV_REL_TIME:
4340                         values->sdt_reserv_rel_time = data_list[i];
4341                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4342                             "sd_get_tunables_from_conf: reserv_rel_time = %d\n",
4343                             values->sdt_reserv_rel_time);
4344                         break;
4345                 case SD_CONF_BSET_MIN_THROTTLE:
4346                         values->sdt_min_throttle = data_list[i];
4347                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4348                             "sd_get_tunables_from_conf: min_throttle = %d\n",
4349                             values->sdt_min_throttle);
4350                         break;
4351                 case SD_CONF_BSET_DISKSORT_DISABLED:
4352                         values->sdt_disk_sort_dis = data_list[i];
4353                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4354                             "sd_get_tunables_from_conf: disk_sort_dis = %d\n",
4355                             values->sdt_disk_sort_dis);
4356                         break;
4357                 case SD_CONF_BSET_LUN_RESET_ENABLED:
4358                         values->sdt_lun_reset_enable = data_list[i];
4359                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4360                             "sd_get_tunables_from_conf: lun_reset_enable = %d"
4361                             "\n", values->sdt_lun_reset_enable);
4362                         break;
4363                 case SD_CONF_BSET_CACHE_IS_NV:
4364                         values->sdt_suppress_cache_flush = data_list[i];
4365                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4366                             "sd_get_tunables_from_conf: \
4367                             suppress_cache_flush = %d"
4368                             "\n", values->sdt_suppress_cache_flush);
4369                         break;
4370                 case SD_CONF_BSET_PC_DISABLED:
4371                         values->sdt_disk_sort_dis = data_list[i];
4372                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4373                             "sd_get_tunables_from_conf: power_condition_dis = "
4374                             "%d\n", values->sdt_power_condition_dis);
4375                         break;
4376                 }
4377         }
4378 }
4379 
4380 /*
4381  *    Function: sd_process_sdconf_table
4382  *
4383  * Description: Search the static configuration table for a match on the
4384  *              inquiry vid/pid and update the driver soft state structure
4385  *              according to the table property values for the device.
4386  *
4387  *              The form of a configuration table entry is:
4388  *                <vid+pid>,<flags>,<property-data>
4389  *                "SEAGATE ST42400N",1,0x40000,
4390  *                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1;
4391  *
4392  *   Arguments: un - driver soft state (unit) structure
4393  */
4394 
4395 static void
4396 sd_process_sdconf_table(struct sd_lun *un)
4397 {
4398         char    *id = NULL;
4399         int     table_index;
4400         int     idlen;
4401 
4402         ASSERT(un != NULL);
4403         for (table_index = 0; table_index < sd_disk_table_size;
4404             table_index++) {
4405                 id = sd_disk_table[table_index].device_id;
4406                 idlen = strlen(id);
4407 
4408                 /*
4409                  * The static configuration table currently does not
4410                  * implement version 10 properties. Additionally,
4411                  * multiple data-property-name entries are not
4412                  * implemented in the static configuration table.
4413                  */
4414                 if (sd_sdconf_id_match(un, id, idlen) == SD_SUCCESS) {
4415                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4416                             "sd_process_sdconf_table: disk %s\n", id);
4417                         sd_set_vers1_properties(un,
4418                             sd_disk_table[table_index].flags,
4419                             sd_disk_table[table_index].properties);
4420                         break;
4421                 }
4422         }
4423 }
4424 
4425 
4426 /*
4427  *    Function: sd_sdconf_id_match
4428  *
4429  * Description: This local function implements a case sensitive vid/pid
4430  *              comparison as well as the boundary cases of wild card and
4431  *              multiple blanks.
4432  *
4433  *              Note: An implicit assumption made here is that the scsi
4434  *              inquiry structure will always keep the vid, pid and
4435  *              revision strings in consecutive sequence, so they can be
4436  *              read as a single string. If this assumption is not the
4437  *              case, a separate string, to be used for the check, needs
4438  *              to be built with these strings concatenated.
4439  *
4440  *   Arguments: un - driver soft state (unit) structure
4441  *              id - table or config file vid/pid
4442  *              idlen  - length of the vid/pid (bytes)
4443  *
4444  * Return Code: SD_SUCCESS - Indicates a match with the inquiry vid/pid
4445  *              SD_FAILURE - Indicates no match with the inquiry vid/pid
4446  */
4447 
4448 static int
4449 sd_sdconf_id_match(struct sd_lun *un, char *id, int idlen)
4450 {
4451         struct scsi_inquiry     *sd_inq;
4452         int                     rval = SD_SUCCESS;
4453 
4454         ASSERT(un != NULL);
4455         sd_inq = un->un_sd->sd_inq;
4456         ASSERT(id != NULL);
4457 
4458         /*
4459          * We use the inq_vid as a pointer to a buffer containing the
4460          * vid and pid and use the entire vid/pid length of the table
4461          * entry for the comparison. This works because the inq_pid
4462          * data member follows inq_vid in the scsi_inquiry structure.
4463          */
4464         if (strncasecmp(sd_inq->inq_vid, id, idlen) != 0) {
4465                 /*
4466                  * The user id string is compared to the inquiry vid/pid
4467                  * using a case insensitive comparison and ignoring
4468                  * multiple spaces.
4469                  */
4470                 rval = sd_blank_cmp(un, id, idlen);
4471                 if (rval != SD_SUCCESS) {
4472                         /*
4473                          * User id strings that start and end with a "*"
4474                          * are a special case. These do not have a
4475                          * specific vendor, and the product string can
4476                          * appear anywhere in the 16 byte PID portion of
4477                          * the inquiry data. This is a simple strstr()
4478                          * type search for the user id in the inquiry data.
4479                          */
4480                         if ((id[0] == '*') && (id[idlen - 1] == '*')) {
4481                                 char    *pidptr = &id[1];
4482                                 int     i;
4483                                 int     j;
4484                                 int     pidstrlen = idlen - 2;
4485                                 j = sizeof (SD_INQUIRY(un)->inq_pid) -
4486                                     pidstrlen;
4487 
4488                                 if (j < 0) {
4489                                         return (SD_FAILURE);
4490                                 }
4491                                 for (i = 0; i < j; i++) {
4492                                         if (bcmp(&SD_INQUIRY(un)->inq_pid[i],
4493                                             pidptr, pidstrlen) == 0) {
4494                                                 rval = SD_SUCCESS;
4495                                                 break;
4496                                         }
4497                                 }
4498                         }
4499                 }
4500         }
4501         return (rval);
4502 }
4503 
4504 
4505 /*
4506  *    Function: sd_blank_cmp
4507  *
4508  * Description: If the id string starts and ends with a space, treat
4509  *              multiple consecutive spaces as equivalent to a single
4510  *              space. For example, this causes a sd_disk_table entry
4511  *              of " NEC CDROM " to match a device's id string of
4512  *              "NEC       CDROM".
4513  *
4514  *              Note: The success exit condition for this routine is if
4515  *              the pointer to the table entry is '\0' and the cnt of
4516  *              the inquiry length is zero. This will happen if the inquiry
4517  *              string returned by the device is padded with spaces to be
4518  *              exactly 24 bytes in length (8 byte vid + 16 byte pid). The
4519  *              SCSI spec states that the inquiry string is to be padded with
4520  *              spaces.
4521  *
4522  *   Arguments: un - driver soft state (unit) structure
4523  *              id - table or config file vid/pid
4524  *              idlen  - length of the vid/pid (bytes)
4525  *
4526  * Return Code: SD_SUCCESS - Indicates a match with the inquiry vid/pid
4527  *              SD_FAILURE - Indicates no match with the inquiry vid/pid
4528  */
4529 
4530 static int
4531 sd_blank_cmp(struct sd_lun *un, char *id, int idlen)
4532 {
4533         char            *p1;
4534         char            *p2;
4535         int             cnt;
4536         cnt = sizeof (SD_INQUIRY(un)->inq_vid) +
4537             sizeof (SD_INQUIRY(un)->inq_pid);
4538 
4539         ASSERT(un != NULL);
4540         p2 = un->un_sd->sd_inq->inq_vid;
4541         ASSERT(id != NULL);
4542         p1 = id;
4543 
4544         if ((id[0] == ' ') && (id[idlen - 1] == ' ')) {
4545                 /*
4546                  * Note: string p1 is terminated by a NUL but string p2
4547                  * isn't.  The end of p2 is determined by cnt.
4548                  */
4549                 for (;;) {
4550                         /* skip over any extra blanks in both strings */
4551                         while ((*p1 != '\0') && (*p1 == ' ')) {
4552                                 p1++;
4553                         }
4554                         while ((cnt != 0) && (*p2 == ' ')) {
4555                                 p2++;
4556                                 cnt--;
4557                         }
4558 
4559                         /* compare the two strings */
4560                         if ((cnt == 0) ||
4561                             (SD_TOUPPER(*p1) != SD_TOUPPER(*p2))) {
4562                                 break;
4563                         }
4564                         while ((cnt > 0) &&
4565                             (SD_TOUPPER(*p1) == SD_TOUPPER(*p2))) {
4566                                 p1++;
4567                                 p2++;
4568                                 cnt--;
4569                         }
4570                 }
4571         }
4572 
4573         /* return SD_SUCCESS if both strings match */
4574         return (((*p1 == '\0') && (cnt == 0)) ? SD_SUCCESS : SD_FAILURE);
4575 }
4576 
4577 
4578 /*
4579  *    Function: sd_chk_vers1_data
4580  *
4581  * Description: Verify the version 1 device properties provided by the
4582  *              user via the configuration file
4583  *
4584  *   Arguments: un           - driver soft state (unit) structure
4585  *              flags        - integer mask indicating properties to be set
4586  *              prop_list    - integer list of property values
4587  *              list_len     - number of the elements
4588  *
4589  * Return Code: SD_SUCCESS - Indicates the user provided data is valid
4590  *              SD_FAILURE - Indicates the user provided data is invalid
4591  */
4592 
4593 static int
4594 sd_chk_vers1_data(struct sd_lun *un, int flags, int *prop_list,
4595     int list_len, char *dataname_ptr)
4596 {
4597         int i;
4598         int mask = 1;
4599         int index = 0;
4600 
4601         ASSERT(un != NULL);
4602 
4603         /* Check for a NULL property name and list */
4604         if (dataname_ptr == NULL) {
4605                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
4606                     "sd_chk_vers1_data: NULL data property name.");
4607                 return (SD_FAILURE);
4608         }
4609         if (prop_list == NULL) {
4610                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
4611                     "sd_chk_vers1_data: %s NULL data property list.",
4612                     dataname_ptr);
4613                 return (SD_FAILURE);
4614         }
4615 
4616         /* Display a warning if undefined bits are set in the flags */
4617         if (flags & ~SD_CONF_BIT_MASK) {
4618                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
4619                     "sd_chk_vers1_data: invalid bits 0x%x in data list %s. "
4620                     "Properties not set.",
4621                     (flags & ~SD_CONF_BIT_MASK), dataname_ptr);
4622                 return (SD_FAILURE);
4623         }
4624 
4625         /*
4626          * Verify the length of the list by identifying the highest bit set
4627          * in the flags and validating that the property list has a length
4628          * up to the index of this bit.
4629          */
4630         for (i = 0; i < SD_CONF_MAX_ITEMS; i++) {
4631                 if (flags & mask) {
4632                         index++;
4633                 }
4634                 mask = 1 << i;
4635         }
4636         if (list_len < (index + 2)) {
4637                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
4638                     "sd_chk_vers1_data: "
4639                     "Data property list %s size is incorrect. "
4640                     "Properties not set.", dataname_ptr);
4641                 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, "Size expected: "
4642                     "version + 1 flagword + %d properties", SD_CONF_MAX_ITEMS);
4643                 return (SD_FAILURE);
4644         }
4645         return (SD_SUCCESS);
4646 }
4647 
4648 
4649 /*
4650  *    Function: sd_set_vers1_properties
4651  *
4652  * Description: Set version 1 device properties based on a property list
4653  *              retrieved from the driver configuration file or static
4654  *              configuration table. Version 1 properties have the format:
4655  *
4656  *      <data-property-name>:=<version>,<flags>,<prop0>,<prop1>,.....<propN>
4657  *
4658  *              where the prop0 value will be used to set prop0 if bit0
4659  *              is set in the flags
4660  *
4661  *   Arguments: un           - driver soft state (unit) structure
4662  *              flags        - integer mask indicating properties to be set
4663  *              prop_list    - integer list of property values
4664  */
4665 
4666 static void
4667 sd_set_vers1_properties(struct sd_lun *un, int flags, sd_tunables *prop_list)
4668 {
4669         ASSERT(un != NULL);
4670 
4671         /*
4672          * Set the flag to indicate cache is to be disabled. An attempt
4673          * to disable the cache via sd_cache_control() will be made
4674          * later during attach once the basic initialization is complete.
4675          */
4676         if (flags & SD_CONF_BSET_NOCACHE) {
4677                 un->un_f_opt_disable_cache = TRUE;
4678                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4679                     "sd_set_vers1_properties: caching disabled flag set\n");
4680         }
4681 
4682         /* CD-specific configuration parameters */
4683         if (flags & SD_CONF_BSET_PLAYMSF_BCD) {
4684                 un->un_f_cfg_playmsf_bcd = TRUE;
4685                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4686                     "sd_set_vers1_properties: playmsf_bcd set\n");
4687         }
4688         if (flags & SD_CONF_BSET_READSUB_BCD) {
4689                 un->un_f_cfg_readsub_bcd = TRUE;
4690                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4691                     "sd_set_vers1_properties: readsub_bcd set\n");
4692         }
4693         if (flags & SD_CONF_BSET_READ_TOC_TRK_BCD) {
4694                 un->un_f_cfg_read_toc_trk_bcd = TRUE;
4695                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4696                     "sd_set_vers1_properties: read_toc_trk_bcd set\n");
4697         }
4698         if (flags & SD_CONF_BSET_READ_TOC_ADDR_BCD) {
4699                 un->un_f_cfg_read_toc_addr_bcd = TRUE;
4700                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4701                     "sd_set_vers1_properties: read_toc_addr_bcd set\n");
4702         }
4703         if (flags & SD_CONF_BSET_NO_READ_HEADER) {
4704                 un->un_f_cfg_no_read_header = TRUE;
4705                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4706                     "sd_set_vers1_properties: no_read_header set\n");
4707         }
4708         if (flags & SD_CONF_BSET_READ_CD_XD4) {
4709                 un->un_f_cfg_read_cd_xd4 = TRUE;
4710                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4711                     "sd_set_vers1_properties: read_cd_xd4 set\n");
4712         }
4713 
4714         /* Support for devices which do not have valid/unique serial numbers */
4715         if (flags & SD_CONF_BSET_FAB_DEVID) {
4716                 un->un_f_opt_fab_devid = TRUE;
4717                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4718                     "sd_set_vers1_properties: fab_devid bit set\n");
4719         }
4720 
4721         /* Support for user throttle configuration */
4722         if (flags & SD_CONF_BSET_THROTTLE) {
4723                 ASSERT(prop_list != NULL);
4724                 un->un_saved_throttle = un->un_throttle =
4725                     prop_list->sdt_throttle;
4726                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4727                     "sd_set_vers1_properties: throttle set to %d\n",
4728                     prop_list->sdt_throttle);
4729         }
4730 
4731         /* Set the per disk retry count according to the conf file or table. */
4732         if (flags & SD_CONF_BSET_NRR_COUNT) {
4733                 ASSERT(prop_list != NULL);
4734                 if (prop_list->sdt_not_rdy_retries) {
4735                         un->un_notready_retry_count =
4736                             prop_list->sdt_not_rdy_retries;
4737                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4738                             "sd_set_vers1_properties: not ready retry count"
4739                             " set to %d\n", un->un_notready_retry_count);
4740                 }
4741         }
4742 
4743         /* The controller type is reported for generic disk driver ioctls */
4744         if (flags & SD_CONF_BSET_CTYPE) {
4745                 ASSERT(prop_list != NULL);
4746                 switch (prop_list->sdt_ctype) {
4747                 case CTYPE_CDROM:
4748                         un->un_ctype = prop_list->sdt_ctype;
4749                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4750                             "sd_set_vers1_properties: ctype set to "
4751                             "CTYPE_CDROM\n");
4752                         break;
4753                 case CTYPE_CCS:
4754                         un->un_ctype = prop_list->sdt_ctype;
4755                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4756                             "sd_set_vers1_properties: ctype set to "
4757                             "CTYPE_CCS\n");
4758                         break;
4759                 case CTYPE_ROD:         /* RW optical */
4760                         un->un_ctype = prop_list->sdt_ctype;
4761                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
4762                             "sd_set_vers1_properties: ctype set to "
4763                             "CTYPE_ROD\n");
4764                         break;
4765                 default:
4766                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
4767                             "sd_set_vers1_properties: Could not set "
4768                             "invalid ctype value (%d)",
4769                             prop_list->sdt_ctype);
4770                 }
4771         }
4772 
4773         /* Purple failover timeout */
4774         if (flags & SD_CONF_BSET_BSY_RETRY_COUNT) {
4775                 ASSERT(prop_list != NULL);
4776                 un->un_busy_retry_count =
4777                     prop_list->sdt_busy_retries;
4778                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4779                     "sd_set_vers1_properties: "
4780                     "busy retry count set to %d\n",
4781                     un->un_busy_retry_count);
4782         }
4783 
4784         /* Purple reset retry count */
4785         if (flags & SD_CONF_BSET_RST_RETRIES) {
4786                 ASSERT(prop_list != NULL);
4787                 un->un_reset_retry_count =
4788                     prop_list->sdt_reset_retries;
4789                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4790                     "sd_set_vers1_properties: "
4791                     "reset retry count set to %d\n",
4792                     un->un_reset_retry_count);
4793         }
4794 
4795         /* Purple reservation release timeout */
4796         if (flags & SD_CONF_BSET_RSV_REL_TIME) {
4797                 ASSERT(prop_list != NULL);
4798                 un->un_reserve_release_time =
4799                     prop_list->sdt_reserv_rel_time;
4800                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4801                     "sd_set_vers1_properties: "
4802                     "reservation release timeout set to %d\n",
4803                     un->un_reserve_release_time);
4804         }
4805 
4806         /*
4807          * Driver flag telling the driver to verify that no commands are pending
4808          * for a device before issuing a Test Unit Ready. This is a workaround
4809          * for a firmware bug in some Seagate eliteI drives.
4810          */
4811         if (flags & SD_CONF_BSET_TUR_CHECK) {
4812                 un->un_f_cfg_tur_check = TRUE;
4813                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4814                     "sd_set_vers1_properties: tur queue check set\n");
4815         }
4816 
4817         if (flags & SD_CONF_BSET_MIN_THROTTLE) {
4818                 un->un_min_throttle = prop_list->sdt_min_throttle;
4819                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4820                     "sd_set_vers1_properties: min throttle set to %d\n",
4821                     un->un_min_throttle);
4822         }
4823 
4824         if (flags & SD_CONF_BSET_DISKSORT_DISABLED) {
4825                 un->un_f_disksort_disabled =
4826                     (prop_list->sdt_disk_sort_dis != 0) ?
4827                     TRUE : FALSE;
4828                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4829                     "sd_set_vers1_properties: disksort disabled "
4830                     "flag set to %d\n",
4831                     prop_list->sdt_disk_sort_dis);
4832         }
4833 
4834         if (flags & SD_CONF_BSET_LUN_RESET_ENABLED) {
4835                 un->un_f_lun_reset_enabled =
4836                     (prop_list->sdt_lun_reset_enable != 0) ?
4837                     TRUE : FALSE;
4838                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4839                     "sd_set_vers1_properties: lun reset enabled "
4840                     "flag set to %d\n",
4841                     prop_list->sdt_lun_reset_enable);
4842         }
4843 
4844         if (flags & SD_CONF_BSET_CACHE_IS_NV) {
4845                 un->un_f_suppress_cache_flush =
4846                     (prop_list->sdt_suppress_cache_flush != 0) ?
4847                     TRUE : FALSE;
4848                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4849                     "sd_set_vers1_properties: suppress_cache_flush "
4850                     "flag set to %d\n",
4851                     prop_list->sdt_suppress_cache_flush);
4852         }
4853 
4854         if (flags & SD_CONF_BSET_PC_DISABLED) {
4855                 un->un_f_power_condition_disabled =
4856                     (prop_list->sdt_power_condition_dis != 0) ?
4857                     TRUE : FALSE;
4858                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
4859                     "sd_set_vers1_properties: power_condition_disabled "
4860                     "flag set to %d\n",
4861                     prop_list->sdt_power_condition_dis);
4862         }
4863 
4864         /*
4865          * Validate the throttle values.
4866          * If any of the numbers are invalid, set everything to defaults.
4867          */
4868         if ((un->un_throttle < SD_LOWEST_VALID_THROTTLE) ||
4869             (un->un_min_throttle < SD_LOWEST_VALID_THROTTLE) ||
4870             (un->un_min_throttle > un->un_throttle)) {
4871                 un->un_saved_throttle = un->un_throttle = sd_max_throttle;
4872                 un->un_min_throttle = sd_min_throttle;
4873         }
4874 }
4875 
4876 /*
4877  *   Function: sd_is_lsi()
4878  *
4879  *   Description: Check for lsi devices, step through the static device
4880  *      table to match vid/pid.
4881  *
4882  *   Args: un - ptr to sd_lun
4883  *
4884  *   Notes:  When creating new LSI property, need to add the new LSI property
4885  *              to this function.
4886  */
4887 static void
4888 sd_is_lsi(struct sd_lun *un)
4889 {
4890         char    *id = NULL;
4891         int     table_index;
4892         int     idlen;
4893         void    *prop;
4894 
4895         ASSERT(un != NULL);
4896         for (table_index = 0; table_index < sd_disk_table_size;
4897             table_index++) {
4898                 id = sd_disk_table[table_index].device_id;
4899                 idlen = strlen(id);
4900                 if (idlen == 0) {
4901                         continue;
4902                 }
4903 
4904                 if (sd_sdconf_id_match(un, id, idlen) == SD_SUCCESS) {
4905                         prop = sd_disk_table[table_index].properties;
4906                         if (prop == &lsi_properties ||
4907                             prop == &lsi_oem_properties ||
4908                             prop == &lsi_properties_scsi ||
4909                             prop == &symbios_properties) {
4910                                 un->un_f_cfg_is_lsi = TRUE;
4911                         }
4912                         break;
4913                 }
4914         }
4915 }
4916 
4917 /*
4918  *    Function: sd_get_physical_geometry
4919  *
4920  * Description: Retrieve the MODE SENSE page 3 (Format Device Page) and
4921  *              MODE SENSE page 4 (Rigid Disk Drive Geometry Page) from the
4922  *              target, and use this information to initialize the physical
4923  *              geometry cache specified by pgeom_p.
4924  *
4925  *              MODE SENSE is an optional command, so failure in this case
4926  *              does not necessarily denote an error. We want to use the
4927  *              MODE SENSE commands to derive the physical geometry of the
4928  *              device, but if either command fails, the logical geometry is
4929  *              used as the fallback for disk label geometry in cmlb.
4930  *
4931  *              This requires that un->un_blockcount and un->un_tgt_blocksize
4932  *              have already been initialized for the current target and
4933  *              that the current values be passed as args so that we don't
4934  *              end up ever trying to use -1 as a valid value. This could
4935  *              happen if either value is reset while we're not holding
4936  *              the mutex.
4937  *
4938  *   Arguments: un - driver soft state (unit) structure
4939  *              path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
4940  *                      the normal command waitq, or SD_PATH_DIRECT_PRIORITY
4941  *                      to use the USCSI "direct" chain and bypass the normal
4942  *                      command waitq.
4943  *
4944  *     Context: Kernel thread only (can sleep).
4945  */
4946 
4947 static int
4948 sd_get_physical_geometry(struct sd_lun *un, cmlb_geom_t *pgeom_p,
4949         diskaddr_t capacity, int lbasize, int path_flag)
4950 {
4951         struct  mode_format     *page3p;
4952         struct  mode_geometry   *page4p;
4953         struct  mode_header     *headerp;
4954         int     sector_size;
4955         int     nsect;
4956         int     nhead;
4957         int     ncyl;
4958         int     intrlv;
4959         int     spc;
4960         diskaddr_t      modesense_capacity;
4961         int     rpm;
4962         int     bd_len;
4963         int     mode_header_length;
4964         uchar_t *p3bufp;
4965         uchar_t *p4bufp;
4966         int     cdbsize;
4967         int     ret = EIO;
4968         sd_ssc_t *ssc;
4969         int     status;
4970 
4971         ASSERT(un != NULL);
4972 
4973         if (lbasize == 0) {
4974                 if (ISCD(un)) {
4975                         lbasize = 2048;
4976                 } else {
4977                         lbasize = un->un_sys_blocksize;
4978                 }
4979         }
4980         pgeom_p->g_secsize = (unsigned short)lbasize;
4981 
4982         /*
4983          * If the unit is a cd/dvd drive MODE SENSE page three
4984          * and MODE SENSE page four are reserved (see SBC spec
4985          * and MMC spec). To prevent soft errors just return
4986          * using the default LBA size.
4987          */
4988         if (ISCD(un))
4989                 return (ret);
4990 
4991         cdbsize = (un->un_f_cfg_is_atapi == TRUE) ? CDB_GROUP2 : CDB_GROUP0;
4992 
4993         /*
4994          * Retrieve MODE SENSE page 3 - Format Device Page
4995          */
4996         p3bufp = kmem_zalloc(SD_MODE_SENSE_PAGE3_LENGTH, KM_SLEEP);
4997         ssc = sd_ssc_init(un);
4998         status = sd_send_scsi_MODE_SENSE(ssc, cdbsize, p3bufp,
4999             SD_MODE_SENSE_PAGE3_LENGTH, SD_MODE_SENSE_PAGE3_CODE, path_flag);
5000         if (status != 0) {
5001                 SD_ERROR(SD_LOG_COMMON, un,
5002                     "sd_get_physical_geometry: mode sense page 3 failed\n");
5003                 goto page3_exit;
5004         }
5005 
5006         /*
5007          * Determine size of Block Descriptors in order to locate the mode
5008          * page data.  ATAPI devices return 0, SCSI devices should return
5009          * MODE_BLK_DESC_LENGTH.
5010          */
5011         headerp = (struct mode_header *)p3bufp;
5012         if (un->un_f_cfg_is_atapi == TRUE) {
5013                 struct mode_header_grp2 *mhp =
5014                     (struct mode_header_grp2 *)headerp;
5015                 mode_header_length = MODE_HEADER_LENGTH_GRP2;
5016                 bd_len = (mhp->bdesc_length_hi << 8) | mhp->bdesc_length_lo;
5017         } else {
5018                 mode_header_length = MODE_HEADER_LENGTH;
5019                 bd_len = ((struct mode_header *)headerp)->bdesc_length;
5020         }
5021 
5022         if (bd_len > MODE_BLK_DESC_LENGTH) {
5023                 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON,
5024                     "sd_get_physical_geometry: received unexpected bd_len "
5025                     "of %d, page3\n", bd_len);
5026                 status = EIO;
5027                 goto page3_exit;
5028         }
5029 
5030         page3p = (struct mode_format *)
5031             ((caddr_t)headerp + mode_header_length + bd_len);
5032 
5033         if (page3p->mode_page.code != SD_MODE_SENSE_PAGE3_CODE) {
5034                 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON,
5035                     "sd_get_physical_geometry: mode sense pg3 code mismatch "
5036                     "%d\n", page3p->mode_page.code);
5037                 status = EIO;
5038                 goto page3_exit;
5039         }
5040 
5041         /*
5042          * Use this physical geometry data only if BOTH MODE SENSE commands
5043          * complete successfully; otherwise, revert to the logical geometry.
5044          * So, we need to save everything in temporary variables.
5045          */
5046         sector_size = BE_16(page3p->data_bytes_sect);
5047 
5048         /*
5049          * 1243403: The NEC D38x7 drives do not support MODE SENSE sector size
5050          */
5051         if (sector_size == 0) {
5052                 sector_size = un->un_sys_blocksize;
5053         } else {
5054                 sector_size &= ~(un->un_sys_blocksize - 1);
5055         }
5056 
5057         nsect  = BE_16(page3p->sect_track);
5058         intrlv = BE_16(page3p->interleave);
5059 
5060         SD_INFO(SD_LOG_COMMON, un,
5061             "sd_get_physical_geometry: Format Parameters (page 3)\n");
5062         SD_INFO(SD_LOG_COMMON, un,
5063             "   mode page: %d; nsect: %d; sector size: %d;\n",
5064             page3p->mode_page.code, nsect, sector_size);
5065         SD_INFO(SD_LOG_COMMON, un,
5066             "   interleave: %d; track skew: %d; cylinder skew: %d;\n", intrlv,
5067             BE_16(page3p->track_skew),
5068             BE_16(page3p->cylinder_skew));
5069 
5070         sd_ssc_assessment(ssc, SD_FMT_STANDARD);
5071 
5072         /*
5073          * Retrieve MODE SENSE page 4 - Rigid Disk Drive Geometry Page
5074          */
5075         p4bufp = kmem_zalloc(SD_MODE_SENSE_PAGE4_LENGTH, KM_SLEEP);
5076         status = sd_send_scsi_MODE_SENSE(ssc, cdbsize, p4bufp,
5077             SD_MODE_SENSE_PAGE4_LENGTH, SD_MODE_SENSE_PAGE4_CODE, path_flag);
5078         if (status != 0) {
5079                 SD_ERROR(SD_LOG_COMMON, un,
5080                     "sd_get_physical_geometry: mode sense page 4 failed\n");
5081                 goto page4_exit;
5082         }
5083 
5084         /*
5085          * Determine size of Block Descriptors in order to locate the mode
5086          * page data.  ATAPI devices return 0, SCSI devices should return
5087          * MODE_BLK_DESC_LENGTH.
5088          */
5089         headerp = (struct mode_header *)p4bufp;
5090         if (un->un_f_cfg_is_atapi == TRUE) {
5091                 struct mode_header_grp2 *mhp =
5092                     (struct mode_header_grp2 *)headerp;
5093                 bd_len = (mhp->bdesc_length_hi << 8) | mhp->bdesc_length_lo;
5094         } else {
5095                 bd_len = ((struct mode_header *)headerp)->bdesc_length;
5096         }
5097 
5098         if (bd_len > MODE_BLK_DESC_LENGTH) {
5099                 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON,
5100                     "sd_get_physical_geometry: received unexpected bd_len of "
5101                     "%d, page4\n", bd_len);
5102                 status = EIO;
5103                 goto page4_exit;
5104         }
5105 
5106         page4p = (struct mode_geometry *)
5107             ((caddr_t)headerp + mode_header_length + bd_len);
5108 
5109         if (page4p->mode_page.code != SD_MODE_SENSE_PAGE4_CODE) {
5110                 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON,
5111                     "sd_get_physical_geometry: mode sense pg4 code mismatch "
5112                     "%d\n", page4p->mode_page.code);
5113                 status = EIO;
5114                 goto page4_exit;
5115         }
5116 
5117         /*
5118          * Stash the data now, after we know that both commands completed.
5119          */
5120 
5121 
5122         nhead = (int)page4p->heads;  /* uchar, so no conversion needed */
5123         spc   = nhead * nsect;
5124         ncyl  = (page4p->cyl_ub << 16) + (page4p->cyl_mb << 8) + page4p->cyl_lb;
5125         rpm   = BE_16(page4p->rpm);
5126 
5127         modesense_capacity = spc * ncyl;
5128 
5129         SD_INFO(SD_LOG_COMMON, un,
5130             "sd_get_physical_geometry: Geometry Parameters (page 4)\n");
5131         SD_INFO(SD_LOG_COMMON, un,
5132             "   cylinders: %d; heads: %d; rpm: %d;\n", ncyl, nhead, rpm);
5133         SD_INFO(SD_LOG_COMMON, un,
5134             "   computed capacity(h*s*c): %d;\n", modesense_capacity);
5135         SD_INFO(SD_LOG_COMMON, un, "   pgeom_p: %p; read cap: %d\n",
5136             (void *)pgeom_p, capacity);
5137 
5138         /*
5139          * Compensate if the drive's geometry is not rectangular, i.e.,
5140          * the product of C * H * S returned by MODE SENSE >= that returned
5141          * by read capacity. This is an idiosyncrasy of the original x86
5142          * disk subsystem.
5143          */
5144         if (modesense_capacity >= capacity) {
5145                 SD_INFO(SD_LOG_COMMON, un,
5146                     "sd_get_physical_geometry: adjusting acyl; "
5147                     "old: %d; new: %d\n", pgeom_p->g_acyl,
5148                     (modesense_capacity - capacity + spc - 1) / spc);
5149                 if (sector_size != 0) {
5150                         /* 1243403: NEC D38x7 drives don't support sec size */
5151                         pgeom_p->g_secsize = (unsigned short)sector_size;
5152                 }
5153                 pgeom_p->g_nsect    = (unsigned short)nsect;
5154                 pgeom_p->g_nhead    = (unsigned short)nhead;
5155                 pgeom_p->g_capacity = capacity;
5156                 pgeom_p->g_acyl          =
5157                     (modesense_capacity - pgeom_p->g_capacity + spc - 1) / spc;
5158                 pgeom_p->g_ncyl          = ncyl - pgeom_p->g_acyl;
5159         }
5160 
5161         pgeom_p->g_rpm    = (unsigned short)rpm;
5162         pgeom_p->g_intrlv = (unsigned short)intrlv;
5163         ret = 0;
5164 
5165         SD_INFO(SD_LOG_COMMON, un,
5166             "sd_get_physical_geometry: mode sense geometry:\n");
5167         SD_INFO(SD_LOG_COMMON, un,
5168             "   nsect: %d; sector size: %d; interlv: %d\n",
5169             nsect, sector_size, intrlv);
5170         SD_INFO(SD_LOG_COMMON, un,
5171             "   nhead: %d; ncyl: %d; rpm: %d; capacity(ms): %d\n",
5172             nhead, ncyl, rpm, modesense_capacity);
5173         SD_INFO(SD_LOG_COMMON, un,
5174             "sd_get_physical_geometry: (cached)\n");
5175         SD_INFO(SD_LOG_COMMON, un,
5176             "   ncyl: %ld; acyl: %d; nhead: %d; nsect: %d\n",
5177             pgeom_p->g_ncyl,  pgeom_p->g_acyl,
5178             pgeom_p->g_nhead, pgeom_p->g_nsect);
5179         SD_INFO(SD_LOG_COMMON, un,
5180             "   lbasize: %d; capacity: %ld; intrlv: %d; rpm: %d\n",
5181             pgeom_p->g_secsize, pgeom_p->g_capacity,
5182             pgeom_p->g_intrlv, pgeom_p->g_rpm);
5183         sd_ssc_assessment(ssc, SD_FMT_STANDARD);
5184 
5185 page4_exit:
5186         kmem_free(p4bufp, SD_MODE_SENSE_PAGE4_LENGTH);
5187 
5188 page3_exit:
5189         kmem_free(p3bufp, SD_MODE_SENSE_PAGE3_LENGTH);
5190 
5191         if (status != 0) {
5192                 if (status == EIO) {
5193                         /*
5194                          * Some disks do not support mode sense(6), we
5195                          * should ignore this kind of error(sense key is
5196                          * 0x5 - illegal request).
5197                          */
5198                         uint8_t *sensep;
5199                         int senlen;
5200 
5201                         sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf;
5202                         senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen -
5203                             ssc->ssc_uscsi_cmd->uscsi_rqresid);
5204 
5205                         if (senlen > 0 &&
5206                             scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) {
5207                                 sd_ssc_assessment(ssc,
5208                                     SD_FMT_IGNORE_COMPROMISE);
5209                         } else {
5210                                 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
5211                         }
5212                 } else {
5213                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5214                 }
5215         }
5216         sd_ssc_fini(ssc);
5217         return (ret);
5218 }
5219 
5220 /*
5221  *    Function: sd_get_virtual_geometry
5222  *
5223  * Description: Ask the controller to tell us about the target device.
5224  *
5225  *   Arguments: un - pointer to softstate
5226  *              capacity - disk capacity in #blocks
5227  *              lbasize - disk block size in bytes
5228  *
5229  *     Context: Kernel thread only
5230  */
5231 
5232 static int
5233 sd_get_virtual_geometry(struct sd_lun *un, cmlb_geom_t *lgeom_p,
5234     diskaddr_t capacity, int lbasize)
5235 {
5236         uint_t  geombuf;
5237         int     spc;
5238 
5239         ASSERT(un != NULL);
5240 
5241         /* Set sector size, and total number of sectors */
5242         (void) scsi_ifsetcap(SD_ADDRESS(un), "sector-size",   lbasize,  1);
5243         (void) scsi_ifsetcap(SD_ADDRESS(un), "total-sectors", capacity, 1);
5244 
5245         /* Let the HBA tell us its geometry */
5246         geombuf = (uint_t)scsi_ifgetcap(SD_ADDRESS(un), "geometry", 1);
5247 
5248         /* A value of -1 indicates an undefined "geometry" property */
5249         if (geombuf == (-1)) {
5250                 return (EINVAL);
5251         }
5252 
5253         /* Initialize the logical geometry cache. */
5254         lgeom_p->g_nhead   = (geombuf >> 16) & 0xffff;
5255         lgeom_p->g_nsect   = geombuf & 0xffff;
5256         lgeom_p->g_secsize = un->un_sys_blocksize;
5257 
5258         spc = lgeom_p->g_nhead * lgeom_p->g_nsect;
5259 
5260         /*
5261          * Note: The driver originally converted the capacity value from
5262          * target blocks to system blocks. However, the capacity value passed
5263          * to this routine is already in terms of system blocks (this scaling
5264          * is done when the READ CAPACITY command is issued and processed).
5265          * This 'error' may have gone undetected because the usage of g_ncyl
5266          * (which is based upon g_capacity) is very limited within the driver
5267          */
5268         lgeom_p->g_capacity = capacity;
5269 
5270         /*
5271          * Set ncyl to zero if the hba returned a zero nhead or nsect value. The
5272          * hba may return zero values if the device has been removed.
5273          */
5274         if (spc == 0) {
5275                 lgeom_p->g_ncyl = 0;
5276         } else {
5277                 lgeom_p->g_ncyl = lgeom_p->g_capacity / spc;
5278         }
5279         lgeom_p->g_acyl = 0;
5280 
5281         SD_INFO(SD_LOG_COMMON, un, "sd_get_virtual_geometry: (cached)\n");
5282         return (0);
5283 
5284 }
5285 /*
5286  *    Function: sd_update_block_info
5287  *
5288  * Description: Calculate a byte count to sector count bitshift value
5289  *              from sector size.
5290  *
5291  *   Arguments: un: unit struct.
5292  *              lbasize: new target sector size
5293  *              capacity: new target capacity, ie. block count
5294  *
5295  *     Context: Kernel thread context
5296  */
5297 
5298 static void
5299 sd_update_block_info(struct sd_lun *un, uint32_t lbasize, uint64_t capacity)
5300 {
5301         if (lbasize != 0) {
5302                 un->un_tgt_blocksize = lbasize;
5303                 un->un_f_tgt_blocksize_is_valid = TRUE;
5304                 if (!un->un_f_has_removable_media) {
5305                         un->un_sys_blocksize = lbasize;
5306                 }
5307         }
5308 
5309         if (capacity != 0) {
5310                 un->un_blockcount            = capacity;
5311                 un->un_f_blockcount_is_valid = TRUE;
5312 
5313                 /*
5314                  * The capacity has changed so update the errstats.
5315                  */
5316                 if (un->un_errstats != NULL) {
5317                         struct sd_errstats *stp;
5318 
5319                         capacity *= un->un_sys_blocksize;
5320                         stp = (struct sd_errstats *)un->un_errstats->ks_data;
5321                         if (stp->sd_capacity.value.ui64 < capacity)
5322                                 stp->sd_capacity.value.ui64 = capacity;
5323                 }
5324         }
5325 }
5326 
5327 
5328 /*
5329  *    Function: sd_register_devid
5330  *
5331  * Description: This routine will obtain the device id information from the
5332  *              target, obtain the serial number, and register the device
5333  *              id with the ddi framework.
5334  *
5335  *   Arguments: devi - the system's dev_info_t for the device.
5336  *              un - driver soft state (unit) structure
5337  *              reservation_flag - indicates if a reservation conflict
5338  *              occurred during attach
5339  *
5340  *     Context: Kernel Thread
5341  */
5342 static void
5343 sd_register_devid(sd_ssc_t *ssc, dev_info_t *devi, int reservation_flag)
5344 {
5345         int             rval            = 0;
5346         uchar_t         *inq80          = NULL;
5347         size_t          inq80_len       = MAX_INQUIRY_SIZE;
5348         size_t          inq80_resid     = 0;
5349         uchar_t         *inq83          = NULL;
5350         size_t          inq83_len       = MAX_INQUIRY_SIZE;
5351         size_t          inq83_resid     = 0;
5352         int             dlen, len;
5353         char            *sn;
5354         struct sd_lun   *un;
5355 
5356         ASSERT(ssc != NULL);
5357         un = ssc->ssc_un;
5358         ASSERT(un != NULL);
5359         ASSERT(mutex_owned(SD_MUTEX(un)));
5360         ASSERT((SD_DEVINFO(un)) == devi);
5361 
5362 
5363         /*
5364          * We check the availability of the World Wide Name (0x83) and Unit
5365          * Serial Number (0x80) pages in sd_check_vpd_page_support(), and using
5366          * un_vpd_page_mask from them, we decide which way to get the WWN.  If
5367          * 0x83 is available, that is the best choice.  Our next choice is
5368          * 0x80.  If neither are available, we munge the devid from the device
5369          * vid/pid/serial # for Sun qualified disks, or use the ddi framework
5370          * to fabricate a devid for non-Sun qualified disks.
5371          */
5372         if (sd_check_vpd_page_support(ssc) == 0) {
5373                 /* collect page 80 data if available */
5374                 if (un->un_vpd_page_mask & SD_VPD_UNIT_SERIAL_PG) {
5375 
5376                         mutex_exit(SD_MUTEX(un));
5377                         inq80 = kmem_zalloc(inq80_len, KM_SLEEP);
5378 
5379                         rval = sd_send_scsi_INQUIRY(ssc, inq80, inq80_len,
5380                             0x01, 0x80, &inq80_resid);
5381 
5382                         if (rval != 0) {
5383                                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5384                                 kmem_free(inq80, inq80_len);
5385                                 inq80 = NULL;
5386                                 inq80_len = 0;
5387                         } else if (ddi_prop_exists(
5388                             DDI_DEV_T_NONE, SD_DEVINFO(un),
5389                             DDI_PROP_NOTPROM | DDI_PROP_DONTPASS,
5390                             INQUIRY_SERIAL_NO) == 0) {
5391                                 /*
5392                                  * If we don't already have a serial number
5393                                  * property, do quick verify of data returned
5394                                  * and define property.
5395                                  */
5396                                 dlen = inq80_len - inq80_resid;
5397                                 len = (size_t)inq80[3];
5398                                 if ((dlen >= 4) && ((len + 4) <= dlen)) {
5399                                         /*
5400                                          * Ensure sn termination, skip leading
5401                                          * blanks, and create property
5402                                          * 'inquiry-serial-no'.
5403                                          */
5404                                         sn = (char *)&inq80[4];
5405                                         sn[len] = 0;
5406                                         while (*sn && (*sn == ' '))
5407                                                 sn++;
5408                                         if (*sn) {
5409                                                 (void) ddi_prop_update_string(
5410                                                     DDI_DEV_T_NONE,
5411                                                     SD_DEVINFO(un),
5412                                                     INQUIRY_SERIAL_NO, sn);
5413                                         }
5414                                 }
5415                         }
5416                         mutex_enter(SD_MUTEX(un));
5417                 }
5418 
5419                 /* collect page 83 data if available */
5420                 if (un->un_vpd_page_mask & SD_VPD_DEVID_WWN_PG) {
5421                         mutex_exit(SD_MUTEX(un));
5422                         inq83 = kmem_zalloc(inq83_len, KM_SLEEP);
5423 
5424                         rval = sd_send_scsi_INQUIRY(ssc, inq83, inq83_len,
5425                             0x01, 0x83, &inq83_resid);
5426 
5427                         if (rval != 0) {
5428                                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5429                                 kmem_free(inq83, inq83_len);
5430                                 inq83 = NULL;
5431                                 inq83_len = 0;
5432                         }
5433                         mutex_enter(SD_MUTEX(un));
5434                 }
5435         }
5436 
5437         /*
5438          * If transport has already registered a devid for this target
5439          * then that takes precedence over the driver's determination
5440          * of the devid.
5441          *
5442          * NOTE: The reason this check is done here instead of at the beginning
5443          * of the function is to allow the code above to create the
5444          * 'inquiry-serial-no' property.
5445          */
5446         if (ddi_devid_get(SD_DEVINFO(un), &un->un_devid) == DDI_SUCCESS) {
5447                 ASSERT(un->un_devid);
5448                 un->un_f_devid_transport_defined = TRUE;
5449                 goto cleanup; /* use devid registered by the transport */
5450         }
5451 
5452         /*
5453          * This is the case of antiquated Sun disk drives that have the
5454          * FAB_DEVID property set in the disk_table.  These drives
5455          * manage the devid's by storing them in last 2 available sectors
5456          * on the drive and have them fabricated by the ddi layer by calling
5457          * ddi_devid_init and passing the DEVID_FAB flag.
5458          */
5459         if (un->un_f_opt_fab_devid == TRUE) {
5460                 /*
5461                  * Depending on EINVAL isn't reliable, since a reserved disk
5462                  * may result in invalid geometry, so check to make sure a
5463                  * reservation conflict did not occur during attach.
5464                  */
5465                 if ((sd_get_devid(ssc) == EINVAL) &&
5466                     (reservation_flag != SD_TARGET_IS_RESERVED)) {
5467                         /*
5468                          * The devid is invalid AND there is no reservation
5469                          * conflict.  Fabricate a new devid.
5470                          */
5471                         (void) sd_create_devid(ssc);
5472                 }
5473 
5474                 /* Register the devid if it exists */
5475                 if (un->un_devid != NULL) {
5476                         (void) ddi_devid_register(SD_DEVINFO(un),
5477                             un->un_devid);
5478                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
5479                             "sd_register_devid: Devid Fabricated\n");
5480                 }
5481                 goto cleanup;
5482         }
5483 
5484         /* encode best devid possible based on data available */
5485         if (ddi_devid_scsi_encode(DEVID_SCSI_ENCODE_VERSION_LATEST,
5486             (char *)ddi_driver_name(SD_DEVINFO(un)),
5487             (uchar_t *)SD_INQUIRY(un), sizeof (*SD_INQUIRY(un)),
5488             inq80, inq80_len - inq80_resid, inq83, inq83_len -
5489             inq83_resid, &un->un_devid) == DDI_SUCCESS) {
5490 
5491                 /* devid successfully encoded, register devid */
5492                 (void) ddi_devid_register(SD_DEVINFO(un), un->un_devid);
5493 
5494         } else {
5495                 /*
5496                  * Unable to encode a devid based on data available.
5497                  * This is not a Sun qualified disk.  Older Sun disk
5498                  * drives that have the SD_FAB_DEVID property
5499                  * set in the disk_table and non Sun qualified
5500                  * disks are treated in the same manner.  These
5501                  * drives manage the devid's by storing them in
5502                  * last 2 available sectors on the drive and
5503                  * have them fabricated by the ddi layer by
5504                  * calling ddi_devid_init and passing the
5505                  * DEVID_FAB flag.
5506                  * Create a fabricate devid only if there's no
5507                  * fabricate devid existed.
5508                  */
5509                 if (sd_get_devid(ssc) == EINVAL) {
5510                         (void) sd_create_devid(ssc);
5511                 }
5512                 un->un_f_opt_fab_devid = TRUE;
5513 
5514                 /* Register the devid if it exists */
5515                 if (un->un_devid != NULL) {
5516                         (void) ddi_devid_register(SD_DEVINFO(un),
5517                             un->un_devid);
5518                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
5519                             "sd_register_devid: devid fabricated using "
5520                             "ddi framework\n");
5521                 }
5522         }
5523 
5524 cleanup:
5525         /* clean up resources */
5526         if (inq80 != NULL) {
5527                 kmem_free(inq80, inq80_len);
5528         }
5529         if (inq83 != NULL) {
5530                 kmem_free(inq83, inq83_len);
5531         }
5532 }
5533 
5534 
5535 
5536 /*
5537  *    Function: sd_get_devid
5538  *
5539  * Description: This routine will return 0 if a valid device id has been
5540  *              obtained from the target and stored in the soft state. If a
5541  *              valid device id has not been previously read and stored, a
5542  *              read attempt will be made.
5543  *
5544  *   Arguments: un - driver soft state (unit) structure
5545  *
5546  * Return Code: 0 if we successfully get the device id
5547  *
5548  *     Context: Kernel Thread
5549  */
5550 
5551 static int
5552 sd_get_devid(sd_ssc_t *ssc)
5553 {
5554         struct dk_devid         *dkdevid;
5555         ddi_devid_t             tmpid;
5556         uint_t                  *ip;
5557         size_t                  sz;
5558         diskaddr_t              blk;
5559         int                     status;
5560         int                     chksum;
5561         int                     i;
5562         size_t                  buffer_size;
5563         struct sd_lun           *un;
5564 
5565         ASSERT(ssc != NULL);
5566         un = ssc->ssc_un;
5567         ASSERT(un != NULL);
5568         ASSERT(mutex_owned(SD_MUTEX(un)));
5569 
5570         SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_get_devid: entry: un: 0x%p\n",
5571             un);
5572 
5573         if (un->un_devid != NULL) {
5574                 return (0);
5575         }
5576 
5577         mutex_exit(SD_MUTEX(un));
5578         if (cmlb_get_devid_block(un->un_cmlbhandle, &blk,
5579             (void *)SD_PATH_DIRECT) != 0) {
5580                 mutex_enter(SD_MUTEX(un));
5581                 return (EINVAL);
5582         }
5583 
5584         /*
5585          * Read and verify device id, stored in the reserved cylinders at the
5586          * end of the disk. Backup label is on the odd sectors of the last
5587          * track of the last cylinder. Device id will be on track of the next
5588          * to last cylinder.
5589          */
5590         mutex_enter(SD_MUTEX(un));
5591         buffer_size = SD_REQBYTES2TGTBYTES(un, sizeof (struct dk_devid));
5592         mutex_exit(SD_MUTEX(un));
5593         dkdevid = kmem_alloc(buffer_size, KM_SLEEP);
5594         status = sd_send_scsi_READ(ssc, dkdevid, buffer_size, blk,
5595             SD_PATH_DIRECT);
5596 
5597         if (status != 0) {
5598                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5599                 goto error;
5600         }
5601 
5602         /* Validate the revision */
5603         if ((dkdevid->dkd_rev_hi != DK_DEVID_REV_MSB) ||
5604             (dkdevid->dkd_rev_lo != DK_DEVID_REV_LSB)) {
5605                 status = EINVAL;
5606                 goto error;
5607         }
5608 
5609         /* Calculate the checksum */
5610         chksum = 0;
5611         ip = (uint_t *)dkdevid;
5612         for (i = 0; i < ((DEV_BSIZE - sizeof (int)) / sizeof (int));
5613             i++) {
5614                 chksum ^= ip[i];
5615         }
5616 
5617         /* Compare the checksums */
5618         if (DKD_GETCHKSUM(dkdevid) != chksum) {
5619                 status = EINVAL;
5620                 goto error;
5621         }
5622 
5623         /* Validate the device id */
5624         if (ddi_devid_valid((ddi_devid_t)&dkdevid->dkd_devid) != DDI_SUCCESS) {
5625                 status = EINVAL;
5626                 goto error;
5627         }
5628 
5629         /*
5630          * Store the device id in the driver soft state
5631          */
5632         sz = ddi_devid_sizeof((ddi_devid_t)&dkdevid->dkd_devid);
5633         tmpid = kmem_alloc(sz, KM_SLEEP);
5634 
5635         mutex_enter(SD_MUTEX(un));
5636 
5637         un->un_devid = tmpid;
5638         bcopy(&dkdevid->dkd_devid, un->un_devid, sz);
5639 
5640         kmem_free(dkdevid, buffer_size);
5641 
5642         SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_get_devid: exit: un:0x%p\n", un);
5643 
5644         return (status);
5645 error:
5646         mutex_enter(SD_MUTEX(un));
5647         kmem_free(dkdevid, buffer_size);
5648         return (status);
5649 }
5650 
5651 
5652 /*
5653  *    Function: sd_create_devid
5654  *
5655  * Description: This routine will fabricate the device id and write it
5656  *              to the disk.
5657  *
5658  *   Arguments: un - driver soft state (unit) structure
5659  *
5660  * Return Code: value of the fabricated device id
5661  *
5662  *     Context: Kernel Thread
5663  */
5664 
5665 static ddi_devid_t
5666 sd_create_devid(sd_ssc_t *ssc)
5667 {
5668         struct sd_lun   *un;
5669 
5670         ASSERT(ssc != NULL);
5671         un = ssc->ssc_un;
5672         ASSERT(un != NULL);
5673 
5674         /* Fabricate the devid */
5675         if (ddi_devid_init(SD_DEVINFO(un), DEVID_FAB, 0, NULL, &un->un_devid)
5676             == DDI_FAILURE) {
5677                 return (NULL);
5678         }
5679 
5680         /* Write the devid to disk */
5681         if (sd_write_deviceid(ssc) != 0) {
5682                 ddi_devid_free(un->un_devid);
5683                 un->un_devid = NULL;
5684         }
5685 
5686         return (un->un_devid);
5687 }
5688 
5689 
5690 /*
5691  *    Function: sd_write_deviceid
5692  *
5693  * Description: This routine will write the device id to the disk
5694  *              reserved sector.
5695  *
5696  *   Arguments: un - driver soft state (unit) structure
5697  *
5698  * Return Code: EINVAL
5699  *              value returned by sd_send_scsi_cmd
5700  *
5701  *     Context: Kernel Thread
5702  */
5703 
5704 static int
5705 sd_write_deviceid(sd_ssc_t *ssc)
5706 {
5707         struct dk_devid         *dkdevid;
5708         uchar_t                 *buf;
5709         diskaddr_t              blk;
5710         uint_t                  *ip, chksum;
5711         int                     status;
5712         int                     i;
5713         struct sd_lun           *un;
5714 
5715         ASSERT(ssc != NULL);
5716         un = ssc->ssc_un;
5717         ASSERT(un != NULL);
5718         ASSERT(mutex_owned(SD_MUTEX(un)));
5719 
5720         mutex_exit(SD_MUTEX(un));
5721         if (cmlb_get_devid_block(un->un_cmlbhandle, &blk,
5722             (void *)SD_PATH_DIRECT) != 0) {
5723                 mutex_enter(SD_MUTEX(un));
5724                 return (-1);
5725         }
5726 
5727 
5728         /* Allocate the buffer */
5729         buf = kmem_zalloc(un->un_sys_blocksize, KM_SLEEP);
5730         dkdevid = (struct dk_devid *)buf;
5731 
5732         /* Fill in the revision */
5733         dkdevid->dkd_rev_hi = DK_DEVID_REV_MSB;
5734         dkdevid->dkd_rev_lo = DK_DEVID_REV_LSB;
5735 
5736         /* Copy in the device id */
5737         mutex_enter(SD_MUTEX(un));
5738         bcopy(un->un_devid, &dkdevid->dkd_devid,
5739             ddi_devid_sizeof(un->un_devid));
5740         mutex_exit(SD_MUTEX(un));
5741 
5742         /* Calculate the checksum */
5743         chksum = 0;
5744         ip = (uint_t *)dkdevid;
5745         for (i = 0; i < ((DEV_BSIZE - sizeof (int)) / sizeof (int));
5746             i++) {
5747                 chksum ^= ip[i];
5748         }
5749 
5750         /* Fill-in checksum */
5751         DKD_FORMCHKSUM(chksum, dkdevid);
5752 
5753         /* Write the reserved sector */
5754         status = sd_send_scsi_WRITE(ssc, buf, un->un_sys_blocksize, blk,
5755             SD_PATH_DIRECT);
5756         if (status != 0)
5757                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5758 
5759         kmem_free(buf, un->un_sys_blocksize);
5760 
5761         mutex_enter(SD_MUTEX(un));
5762         return (status);
5763 }
5764 
5765 
5766 /*
5767  *    Function: sd_check_vpd_page_support
5768  *
5769  * Description: This routine sends an inquiry command with the EVPD bit set and
5770  *              a page code of 0x00 to the device. It is used to determine which
5771  *              vital product pages are available to find the devid. We are
5772  *              looking for pages 0x83 0x80 or 0xB1.  If we return a negative 1,
5773  *              the device does not support that command.
5774  *
5775  *   Arguments: un  - driver soft state (unit) structure
5776  *
5777  * Return Code: 0 - success
5778  *              1 - check condition
5779  *
5780  *     Context: This routine can sleep.
5781  */
5782 
5783 static int
5784 sd_check_vpd_page_support(sd_ssc_t *ssc)
5785 {
5786         uchar_t *page_list      = NULL;
5787         uchar_t page_length     = 0xff; /* Use max possible length */
5788         uchar_t evpd            = 0x01; /* Set the EVPD bit */
5789         uchar_t page_code       = 0x00; /* Supported VPD Pages */
5790         int     rval            = 0;
5791         int     counter;
5792         struct sd_lun           *un;
5793 
5794         ASSERT(ssc != NULL);
5795         un = ssc->ssc_un;
5796         ASSERT(un != NULL);
5797         ASSERT(mutex_owned(SD_MUTEX(un)));
5798 
5799         mutex_exit(SD_MUTEX(un));
5800 
5801         /*
5802          * We'll set the page length to the maximum to save figuring it out
5803          * with an additional call.
5804          */
5805         page_list =  kmem_zalloc(page_length, KM_SLEEP);
5806 
5807         rval = sd_send_scsi_INQUIRY(ssc, page_list, page_length, evpd,
5808             page_code, NULL);
5809 
5810         if (rval != 0)
5811                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5812 
5813         mutex_enter(SD_MUTEX(un));
5814 
5815         /*
5816          * Now we must validate that the device accepted the command, as some
5817          * drives do not support it.  If the drive does support it, we will
5818          * return 0, and the supported pages will be in un_vpd_page_mask.  If
5819          * not, we return -1.
5820          */
5821         if ((rval == 0) && (page_list[VPD_MODE_PAGE] == 0x00)) {
5822                 /* Loop to find one of the 2 pages we need */
5823                 counter = 4;  /* Supported pages start at byte 4, with 0x00 */
5824 
5825                 /*
5826                  * Pages are returned in ascending order, and 0x83 is what we
5827                  * are hoping for.
5828                  */
5829                 while ((page_list[counter] <= 0xB1) &&
5830                     (counter <= (page_list[VPD_PAGE_LENGTH] +
5831                     VPD_HEAD_OFFSET))) {
5832                         /*
5833                          * Add 3 because page_list[3] is the number of
5834                          * pages minus 3
5835                          */
5836 
5837                         switch (page_list[counter]) {
5838                         case 0x00:
5839                                 un->un_vpd_page_mask |= SD_VPD_SUPPORTED_PG;
5840                                 break;
5841                         case 0x80:
5842                                 un->un_vpd_page_mask |= SD_VPD_UNIT_SERIAL_PG;
5843                                 break;
5844                         case 0x81:
5845                                 un->un_vpd_page_mask |= SD_VPD_OPERATING_PG;
5846                                 break;
5847                         case 0x82:
5848                                 un->un_vpd_page_mask |= SD_VPD_ASCII_OP_PG;
5849                                 break;
5850                         case 0x83:
5851                                 un->un_vpd_page_mask |= SD_VPD_DEVID_WWN_PG;
5852                                 break;
5853                         case 0x86:
5854                                 un->un_vpd_page_mask |= SD_VPD_EXTENDED_DATA_PG;
5855                                 break;
5856                         case 0xB1:
5857                                 un->un_vpd_page_mask |= SD_VPD_DEV_CHARACTER_PG;
5858                                 break;
5859                         }
5860                         counter++;
5861                 }
5862 
5863         } else {
5864                 rval = -1;
5865 
5866                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
5867                     "sd_check_vpd_page_support: This drive does not implement "
5868                     "VPD pages.\n");
5869         }
5870 
5871         kmem_free(page_list, page_length);
5872 
5873         return (rval);
5874 }
5875 
5876 
5877 /*
5878  *    Function: sd_setup_pm
5879  *
5880  * Description: Initialize Power Management on the device
5881  *
5882  *     Context: Kernel Thread
5883  */
5884 
5885 static void
5886 sd_setup_pm(sd_ssc_t *ssc, dev_info_t *devi)
5887 {
5888         uint_t          log_page_size;
5889         uchar_t         *log_page_data;
5890         int             rval = 0;
5891         struct sd_lun   *un;
5892 
5893         ASSERT(ssc != NULL);
5894         un = ssc->ssc_un;
5895         ASSERT(un != NULL);
5896 
5897         /*
5898          * Since we are called from attach, holding a mutex for
5899          * un is unnecessary. Because some of the routines called
5900          * from here require SD_MUTEX to not be held, assert this
5901          * right up front.
5902          */
5903         ASSERT(!mutex_owned(SD_MUTEX(un)));
5904         /*
5905          * Since the sd device does not have the 'reg' property,
5906          * cpr will not call its DDI_SUSPEND/DDI_RESUME entries.
5907          * The following code is to tell cpr that this device
5908          * DOES need to be suspended and resumed.
5909          */
5910         (void) ddi_prop_update_string(DDI_DEV_T_NONE, devi,
5911             "pm-hardware-state", "needs-suspend-resume");
5912 
5913         /*
5914          * This complies with the new power management framework
5915          * for certain desktop machines. Create the pm_components
5916          * property as a string array property.
5917          * If un_f_pm_supported is TRUE, that means the disk
5918          * attached HBA has set the "pm-capable" property and
5919          * the value of this property is bigger than 0.
5920          */
5921         if (un->un_f_pm_supported) {
5922                 /*
5923                  * not all devices have a motor, try it first.
5924                  * some devices may return ILLEGAL REQUEST, some
5925                  * will hang
5926                  * The following START_STOP_UNIT is used to check if target
5927                  * device has a motor.
5928                  */
5929                 un->un_f_start_stop_supported = TRUE;
5930 
5931                 if (un->un_f_power_condition_supported) {
5932                         rval = sd_send_scsi_START_STOP_UNIT(ssc,
5933                             SD_POWER_CONDITION, SD_TARGET_ACTIVE,
5934                             SD_PATH_DIRECT);
5935                         if (rval != 0) {
5936                                 un->un_f_power_condition_supported = FALSE;
5937                         }
5938                 }
5939                 if (!un->un_f_power_condition_supported) {
5940                         rval = sd_send_scsi_START_STOP_UNIT(ssc,
5941                             SD_START_STOP, SD_TARGET_START, SD_PATH_DIRECT);
5942                 }
5943                 if (rval != 0) {
5944                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5945                         un->un_f_start_stop_supported = FALSE;
5946                 }
5947 
5948                 /*
5949                  * create pm properties anyways otherwise the parent can't
5950                  * go to sleep
5951                  */
5952                 un->un_f_pm_is_enabled = TRUE;
5953                 (void) sd_create_pm_components(devi, un);
5954 
5955                 /*
5956                  * If it claims that log sense is supported, check it out.
5957                  */
5958                 if (un->un_f_log_sense_supported) {
5959                         rval = sd_log_page_supported(ssc,
5960                             START_STOP_CYCLE_PAGE);
5961                         if (rval == 1) {
5962                                 /* Page found, use it. */
5963                                 un->un_start_stop_cycle_page =
5964                                     START_STOP_CYCLE_PAGE;
5965                         } else {
5966                                 /*
5967                                  * Page not found or log sense is not
5968                                  * supported.
5969                                  * Notice we do not check the old style
5970                                  * START_STOP_CYCLE_VU_PAGE because this
5971                                  * code path does not apply to old disks.
5972                                  */
5973                                 un->un_f_log_sense_supported = FALSE;
5974                                 un->un_f_pm_log_sense_smart = FALSE;
5975                         }
5976                 }
5977 
5978                 return;
5979         }
5980 
5981         /*
5982          * For the disk whose attached HBA has not set the "pm-capable"
5983          * property, check if it supports the power management.
5984          */
5985         if (!un->un_f_log_sense_supported) {
5986                 un->un_power_level = SD_SPINDLE_ON;
5987                 un->un_f_pm_is_enabled = FALSE;
5988                 return;
5989         }
5990 
5991         rval = sd_log_page_supported(ssc, START_STOP_CYCLE_PAGE);
5992 
5993 #ifdef  SDDEBUG
5994         if (sd_force_pm_supported) {
5995                 /* Force a successful result */
5996                 rval = 1;
5997         }
5998 #endif
5999 
6000         /*
6001          * If the start-stop cycle counter log page is not supported
6002          * or if the pm-capable property is set to be false (0),
6003          * then we should not create the pm_components property.
6004          */
6005         if (rval == -1) {
6006                 /*
6007                  * Error.
6008                  * Reading log sense failed, most likely this is
6009                  * an older drive that does not support log sense.
6010                  * If this fails auto-pm is not supported.
6011                  */
6012                 un->un_power_level = SD_SPINDLE_ON;
6013                 un->un_f_pm_is_enabled = FALSE;
6014 
6015         } else if (rval == 0) {
6016                 /*
6017                  * Page not found.
6018                  * The start stop cycle counter is implemented as page
6019                  * START_STOP_CYCLE_PAGE_VU_PAGE (0x31) in older disks. For
6020                  * newer disks it is implemented as START_STOP_CYCLE_PAGE (0xE).
6021                  */
6022                 if (sd_log_page_supported(ssc, START_STOP_CYCLE_VU_PAGE) == 1) {
6023                         /*
6024                          * Page found, use this one.
6025                          */
6026                         un->un_start_stop_cycle_page = START_STOP_CYCLE_VU_PAGE;
6027                         un->un_f_pm_is_enabled = TRUE;
6028                 } else {
6029                         /*
6030                          * Error or page not found.
6031                          * auto-pm is not supported for this device.
6032                          */
6033                         un->un_power_level = SD_SPINDLE_ON;
6034                         un->un_f_pm_is_enabled = FALSE;
6035                 }
6036         } else {
6037                 /*
6038                  * Page found, use it.
6039                  */
6040                 un->un_start_stop_cycle_page = START_STOP_CYCLE_PAGE;
6041                 un->un_f_pm_is_enabled = TRUE;
6042         }
6043 
6044 
6045         if (un->un_f_pm_is_enabled == TRUE) {
6046                 log_page_size = START_STOP_CYCLE_COUNTER_PAGE_SIZE;
6047                 log_page_data = kmem_zalloc(log_page_size, KM_SLEEP);
6048 
6049                 rval = sd_send_scsi_LOG_SENSE(ssc, log_page_data,
6050                     log_page_size, un->un_start_stop_cycle_page,
6051                     0x01, 0, SD_PATH_DIRECT);
6052 
6053                 if (rval != 0) {
6054                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
6055                 }
6056 
6057 #ifdef  SDDEBUG
6058                 if (sd_force_pm_supported) {
6059                         /* Force a successful result */
6060                         rval = 0;
6061                 }
6062 #endif
6063 
6064                 /*
6065                  * If the Log sense for Page( Start/stop cycle counter page)
6066                  * succeeds, then power management is supported and we can
6067                  * enable auto-pm.
6068                  */
6069                 if (rval == 0)  {
6070                         (void) sd_create_pm_components(devi, un);
6071                 } else {
6072                         un->un_power_level = SD_SPINDLE_ON;
6073                         un->un_f_pm_is_enabled = FALSE;
6074                 }
6075 
6076                 kmem_free(log_page_data, log_page_size);
6077         }
6078 }
6079 
6080 
6081 /*
6082  *    Function: sd_create_pm_components
6083  *
6084  * Description: Initialize PM property.
6085  *
6086  *     Context: Kernel thread context
6087  */
6088 
6089 static void
6090 sd_create_pm_components(dev_info_t *devi, struct sd_lun *un)
6091 {
6092         ASSERT(!mutex_owned(SD_MUTEX(un)));
6093 
6094         if (un->un_f_power_condition_supported) {
6095                 if (ddi_prop_update_string_array(DDI_DEV_T_NONE, devi,
6096                     "pm-components", sd_pwr_pc.pm_comp, 5)
6097                     != DDI_PROP_SUCCESS) {
6098                         un->un_power_level = SD_SPINDLE_ACTIVE;
6099                         un->un_f_pm_is_enabled = FALSE;
6100                         return;
6101                 }
6102         } else {
6103                 if (ddi_prop_update_string_array(DDI_DEV_T_NONE, devi,
6104                     "pm-components", sd_pwr_ss.pm_comp, 3)
6105                     != DDI_PROP_SUCCESS) {
6106                         un->un_power_level = SD_SPINDLE_ON;
6107                         un->un_f_pm_is_enabled = FALSE;
6108                         return;
6109                 }
6110         }
6111         /*
6112          * When components are initially created they are idle,
6113          * power up any non-removables.
6114          * Note: the return value of pm_raise_power can't be used
6115          * for determining if PM should be enabled for this device.
6116          * Even if you check the return values and remove this
6117          * property created above, the PM framework will not honor the
6118          * change after the first call to pm_raise_power. Hence,
6119          * removal of that property does not help if pm_raise_power
6120          * fails. In the case of removable media, the start/stop
6121          * will fail if the media is not present.
6122          */
6123         if (un->un_f_attach_spinup && (pm_raise_power(SD_DEVINFO(un), 0,
6124             SD_PM_STATE_ACTIVE(un)) == DDI_SUCCESS)) {
6125                 mutex_enter(SD_MUTEX(un));
6126                 un->un_power_level = SD_PM_STATE_ACTIVE(un);
6127                 mutex_enter(&un->un_pm_mutex);
6128                 /* Set to on and not busy. */
6129                 un->un_pm_count = 0;
6130         } else {
6131                 mutex_enter(SD_MUTEX(un));
6132                 un->un_power_level = SD_PM_STATE_STOPPED(un);
6133                 mutex_enter(&un->un_pm_mutex);
6134                 /* Set to off. */
6135                 un->un_pm_count = -1;
6136         }
6137         mutex_exit(&un->un_pm_mutex);
6138         mutex_exit(SD_MUTEX(un));
6139 }
6140 
6141 
6142 /*
6143  *    Function: sd_ddi_suspend
6144  *
6145  * Description: Performs system power-down operations. This includes
6146  *              setting the drive state to indicate its suspended so
6147  *              that no new commands will be accepted. Also, wait for
6148  *              all commands that are in transport or queued to a timer
6149  *              for retry to complete. All timeout threads are cancelled.
6150  *
6151  * Return Code: DDI_FAILURE or DDI_SUCCESS
6152  *
6153  *     Context: Kernel thread context
6154  */
6155 
6156 static int
6157 sd_ddi_suspend(dev_info_t *devi)
6158 {
6159         struct  sd_lun  *un;
6160         clock_t         wait_cmds_complete;
6161 
6162         un = ddi_get_soft_state(sd_state, ddi_get_instance(devi));
6163         if (un == NULL) {
6164                 return (DDI_FAILURE);
6165         }
6166 
6167         SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: entry\n");
6168 
6169         mutex_enter(SD_MUTEX(un));
6170 
6171         /* Return success if the device is already suspended. */
6172         if (un->un_state == SD_STATE_SUSPENDED) {
6173                 mutex_exit(SD_MUTEX(un));
6174                 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: "
6175                     "device already suspended, exiting\n");
6176                 return (DDI_SUCCESS);
6177         }
6178 
6179         /* Return failure if the device is being used by HA */
6180         if (un->un_resvd_status &
6181             (SD_RESERVE | SD_WANT_RESERVE | SD_LOST_RESERVE)) {
6182                 mutex_exit(SD_MUTEX(un));
6183                 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: "
6184                     "device in use by HA, exiting\n");
6185                 return (DDI_FAILURE);
6186         }
6187 
6188         /*
6189          * Return failure if the device is in a resource wait
6190          * or power changing state.
6191          */
6192         if ((un->un_state == SD_STATE_RWAIT) ||
6193             (un->un_state == SD_STATE_PM_CHANGING)) {
6194                 mutex_exit(SD_MUTEX(un));
6195                 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: "
6196                     "device in resource wait state, exiting\n");
6197                 return (DDI_FAILURE);
6198         }
6199 
6200 
6201         un->un_save_state = un->un_last_state;
6202         New_state(un, SD_STATE_SUSPENDED);
6203 
6204         /*
6205          * Wait for all commands that are in transport or queued to a timer
6206          * for retry to complete.
6207          *
6208          * While waiting, no new commands will be accepted or sent because of
6209          * the new state we set above.
6210          *
6211          * Wait till current operation has completed. If we are in the resource
6212          * wait state (with an intr outstanding) then we need to wait till the
6213          * intr completes and starts the next cmd. We want to wait for
6214          * SD_WAIT_CMDS_COMPLETE seconds before failing the DDI_SUSPEND.
6215          */
6216         wait_cmds_complete = ddi_get_lbolt() +
6217             (sd_wait_cmds_complete * drv_usectohz(1000000));
6218 
6219         while (un->un_ncmds_in_transport != 0) {
6220                 /*
6221                  * Fail if commands do not finish in the specified time.
6222                  */
6223                 if (cv_timedwait(&un->un_disk_busy_cv, SD_MUTEX(un),
6224                     wait_cmds_complete) == -1) {
6225                         /*
6226                          * Undo the state changes made above. Everything
6227                          * must go back to it's original value.
6228                          */
6229                         Restore_state(un);
6230                         un->un_last_state = un->un_save_state;
6231                         /* Wake up any threads that might be waiting. */
6232                         cv_broadcast(&un->un_suspend_cv);
6233                         mutex_exit(SD_MUTEX(un));
6234                         SD_ERROR(SD_LOG_IO_PM, un,
6235                             "sd_ddi_suspend: failed due to outstanding cmds\n");
6236                         SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: exiting\n");
6237                         return (DDI_FAILURE);
6238                 }
6239         }
6240 
6241         /*
6242          * Cancel SCSI watch thread and timeouts, if any are active
6243          */
6244 
6245         if (SD_OK_TO_SUSPEND_SCSI_WATCHER(un)) {
6246                 opaque_t temp_token = un->un_swr_token;
6247                 mutex_exit(SD_MUTEX(un));
6248                 scsi_watch_suspend(temp_token);
6249                 mutex_enter(SD_MUTEX(un));
6250         }
6251 
6252         if (un->un_reset_throttle_timeid != NULL) {
6253                 timeout_id_t temp_id = un->un_reset_throttle_timeid;
6254                 un->un_reset_throttle_timeid = NULL;
6255                 mutex_exit(SD_MUTEX(un));
6256                 (void) untimeout(temp_id);
6257                 mutex_enter(SD_MUTEX(un));
6258         }
6259 
6260         if (un->un_dcvb_timeid != NULL) {
6261                 timeout_id_t temp_id = un->un_dcvb_timeid;
6262                 un->un_dcvb_timeid = NULL;
6263                 mutex_exit(SD_MUTEX(un));
6264                 (void) untimeout(temp_id);
6265                 mutex_enter(SD_MUTEX(un));
6266         }
6267 
6268         mutex_enter(&un->un_pm_mutex);
6269         if (un->un_pm_timeid != NULL) {
6270                 timeout_id_t temp_id = un->un_pm_timeid;
6271                 un->un_pm_timeid = NULL;
6272                 mutex_exit(&un->un_pm_mutex);
6273                 mutex_exit(SD_MUTEX(un));
6274                 (void) untimeout(temp_id);
6275                 mutex_enter(SD_MUTEX(un));
6276         } else {
6277                 mutex_exit(&un->un_pm_mutex);
6278         }
6279 
6280         if (un->un_rmw_msg_timeid != NULL) {
6281                 timeout_id_t temp_id = un->un_rmw_msg_timeid;
6282                 un->un_rmw_msg_timeid = NULL;
6283                 mutex_exit(SD_MUTEX(un));
6284                 (void) untimeout(temp_id);
6285                 mutex_enter(SD_MUTEX(un));
6286         }
6287 
6288         if (un->un_retry_timeid != NULL) {
6289                 timeout_id_t temp_id = un->un_retry_timeid;
6290                 un->un_retry_timeid = NULL;
6291                 mutex_exit(SD_MUTEX(un));
6292                 (void) untimeout(temp_id);
6293                 mutex_enter(SD_MUTEX(un));
6294 
6295                 if (un->un_retry_bp != NULL) {
6296                         un->un_retry_bp->av_forw = un->un_waitq_headp;
6297                         un->un_waitq_headp = un->un_retry_bp;
6298                         if (un->un_waitq_tailp == NULL) {
6299                                 un->un_waitq_tailp = un->un_retry_bp;
6300                         }
6301                         un->un_retry_bp = NULL;
6302                         un->un_retry_statp = NULL;
6303                 }
6304         }
6305 
6306         if (un->un_direct_priority_timeid != NULL) {
6307                 timeout_id_t temp_id = un->un_direct_priority_timeid;
6308                 un->un_direct_priority_timeid = NULL;
6309                 mutex_exit(SD_MUTEX(un));
6310                 (void) untimeout(temp_id);
6311                 mutex_enter(SD_MUTEX(un));
6312         }
6313 
6314         if (un->un_f_is_fibre == TRUE) {
6315                 /*
6316                  * Remove callbacks for insert and remove events
6317                  */
6318                 if (un->un_insert_event != NULL) {
6319                         mutex_exit(SD_MUTEX(un));
6320                         (void) ddi_remove_event_handler(un->un_insert_cb_id);
6321                         mutex_enter(SD_MUTEX(un));
6322                         un->un_insert_event = NULL;
6323                 }
6324 
6325                 if (un->un_remove_event != NULL) {
6326                         mutex_exit(SD_MUTEX(un));
6327                         (void) ddi_remove_event_handler(un->un_remove_cb_id);
6328                         mutex_enter(SD_MUTEX(un));
6329                         un->un_remove_event = NULL;
6330                 }
6331         }
6332 
6333         mutex_exit(SD_MUTEX(un));
6334 
6335         SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: exit\n");
6336 
6337         return (DDI_SUCCESS);
6338 }
6339 
6340 
6341 /*
6342  *    Function: sd_ddi_resume
6343  *
6344  * Description: Performs system power-up operations..
6345  *
6346  * Return Code: DDI_SUCCESS
6347  *              DDI_FAILURE
6348  *
6349  *     Context: Kernel thread context
6350  */
6351 
6352 static int
6353 sd_ddi_resume(dev_info_t *devi)
6354 {
6355         struct  sd_lun  *un;
6356 
6357         un = ddi_get_soft_state(sd_state, ddi_get_instance(devi));
6358         if (un == NULL) {
6359                 return (DDI_FAILURE);
6360         }
6361 
6362         SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_resume: entry\n");
6363 
6364         mutex_enter(SD_MUTEX(un));
6365         Restore_state(un);
6366 
6367         /*
6368          * Restore the state which was saved to give the
6369          * the right state in un_last_state
6370          */
6371         un->un_last_state = un->un_save_state;
6372         /*
6373          * Note: throttle comes back at full.
6374          * Also note: this MUST be done before calling pm_raise_power
6375          * otherwise the system can get hung in biowait. The scenario where
6376          * this'll happen is under cpr suspend. Writing of the system
6377          * state goes through sddump, which writes 0 to un_throttle. If
6378          * writing the system state then fails, example if the partition is
6379          * too small, then cpr attempts a resume. If throttle isn't restored
6380          * from the saved value until after calling pm_raise_power then
6381          * cmds sent in sdpower are not transported and sd_send_scsi_cmd hangs
6382          * in biowait.
6383          */
6384         un->un_throttle = un->un_saved_throttle;
6385 
6386         /*
6387          * The chance of failure is very rare as the only command done in power
6388          * entry point is START command when you transition from 0->1 or
6389          * unknown->1. Put it to SPINDLE ON state irrespective of the state at
6390          * which suspend was done. Ignore the return value as the resume should
6391          * not be failed. In the case of removable media the media need not be
6392          * inserted and hence there is a chance that raise power will fail with
6393          * media not present.
6394          */
6395         if (un->un_f_attach_spinup) {
6396                 mutex_exit(SD_MUTEX(un));
6397                 (void) pm_raise_power(SD_DEVINFO(un), 0,
6398                     SD_PM_STATE_ACTIVE(un));
6399                 mutex_enter(SD_MUTEX(un));
6400         }
6401 
6402         /*
6403          * Don't broadcast to the suspend cv and therefore possibly
6404          * start I/O until after power has been restored.
6405          */
6406         cv_broadcast(&un->un_suspend_cv);
6407         cv_broadcast(&un->un_state_cv);
6408 
6409         /* restart thread */
6410         if (SD_OK_TO_RESUME_SCSI_WATCHER(un)) {
6411                 scsi_watch_resume(un->un_swr_token);
6412         }
6413 
6414 #if (defined(__fibre))
6415         if (un->un_f_is_fibre == TRUE) {
6416                 /*
6417                  * Add callbacks for insert and remove events
6418                  */
6419                 if (strcmp(un->un_node_type, DDI_NT_BLOCK_CHAN)) {
6420                         sd_init_event_callbacks(un);
6421                 }
6422         }
6423 #endif
6424 
6425         /*
6426          * Transport any pending commands to the target.
6427          *
6428          * If this is a low-activity device commands in queue will have to wait
6429          * until new commands come in, which may take awhile. Also, we
6430          * specifically don't check un_ncmds_in_transport because we know that
6431          * there really are no commands in progress after the unit was
6432          * suspended and we could have reached the throttle level, been
6433          * suspended, and have no new commands coming in for awhile. Highly
6434          * unlikely, but so is the low-activity disk scenario.
6435          */
6436         ddi_xbuf_dispatch(un->un_xbuf_attr);
6437 
6438         sd_start_cmds(un, NULL);
6439         mutex_exit(SD_MUTEX(un));
6440 
6441         SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_resume: exit\n");
6442 
6443         return (DDI_SUCCESS);
6444 }
6445 
6446 
6447 /*
6448  *    Function: sd_pm_state_change
6449  *
6450  * Description: Change the driver power state.
6451  *              Someone else is required to actually change the driver
6452  *              power level.
6453  *
6454  *   Arguments: un - driver soft state (unit) structure
6455  *              level - the power level that is changed to
6456  *              flag - to decide how to change the power state
6457  *
6458  * Return Code: DDI_SUCCESS
6459  *
6460  *     Context: Kernel thread context
6461  */
6462 static int
6463 sd_pm_state_change(struct sd_lun *un, int level, int flag)
6464 {
6465         ASSERT(un != NULL);
6466         SD_TRACE(SD_LOG_POWER, un, "sd_pm_state_change: entry\n");
6467 
6468         ASSERT(!mutex_owned(SD_MUTEX(un)));
6469         mutex_enter(SD_MUTEX(un));
6470 
6471         if (flag == SD_PM_STATE_ROLLBACK || SD_PM_IS_IO_CAPABLE(un, level)) {
6472                 un->un_power_level = level;
6473                 ASSERT(!mutex_owned(&un->un_pm_mutex));
6474                 mutex_enter(&un->un_pm_mutex);
6475                 if (SD_DEVICE_IS_IN_LOW_POWER(un)) {
6476                         un->un_pm_count++;
6477                         ASSERT(un->un_pm_count == 0);
6478                 }
6479                 mutex_exit(&un->un_pm_mutex);
6480         } else {
6481                 /*
6482                  * Exit if power management is not enabled for this device,
6483                  * or if the device is being used by HA.
6484                  */
6485                 if ((un->un_f_pm_is_enabled == FALSE) || (un->un_resvd_status &
6486                     (SD_RESERVE | SD_WANT_RESERVE | SD_LOST_RESERVE))) {
6487                         mutex_exit(SD_MUTEX(un));
6488                         SD_TRACE(SD_LOG_POWER, un,
6489                             "sd_pm_state_change: exiting\n");
6490                         return (DDI_FAILURE);
6491                 }
6492 
6493                 SD_INFO(SD_LOG_POWER, un, "sd_pm_state_change: "
6494                     "un_ncmds_in_driver=%ld\n", un->un_ncmds_in_driver);
6495 
6496                 /*
6497                  * See if the device is not busy, ie.:
6498                  *    - we have no commands in the driver for this device
6499                  *    - not waiting for resources
6500                  */
6501                 if ((un->un_ncmds_in_driver == 0) &&
6502                     (un->un_state != SD_STATE_RWAIT)) {
6503                         /*
6504                          * The device is not busy, so it is OK to go to low
6505                          * power state. Indicate low power, but rely on someone
6506                          * else to actually change it.
6507                          */
6508                         mutex_enter(&un->un_pm_mutex);
6509                         un->un_pm_count = -1;
6510                         mutex_exit(&un->un_pm_mutex);
6511                         un->un_power_level = level;
6512                 }
6513         }
6514 
6515         mutex_exit(SD_MUTEX(un));
6516 
6517         SD_TRACE(SD_LOG_POWER, un, "sd_pm_state_change: exit\n");
6518 
6519         return (DDI_SUCCESS);
6520 }
6521 
6522 
6523 /*
6524  *    Function: sd_pm_idletimeout_handler
6525  *
6526  * Description: A timer routine that's active only while a device is busy.
6527  *              The purpose is to extend slightly the pm framework's busy
6528  *              view of the device to prevent busy/idle thrashing for
6529  *              back-to-back commands. Do this by comparing the current time
6530  *              to the time at which the last command completed and when the
6531  *              difference is greater than sd_pm_idletime, call
6532  *              pm_idle_component. In addition to indicating idle to the pm
6533  *              framework, update the chain type to again use the internal pm
6534  *              layers of the driver.
6535  *
6536  *   Arguments: arg - driver soft state (unit) structure
6537  *
6538  *     Context: Executes in a timeout(9F) thread context
6539  */
6540 
6541 static void
6542 sd_pm_idletimeout_handler(void *arg)
6543 {
6544         const hrtime_t idletime = sd_pm_idletime * NANOSEC;
6545         struct sd_lun *un = arg;
6546 
6547         mutex_enter(&sd_detach_mutex);
6548         if (un->un_detach_count != 0) {
6549                 /* Abort if the instance is detaching */
6550                 mutex_exit(&sd_detach_mutex);
6551                 return;
6552         }
6553         mutex_exit(&sd_detach_mutex);
6554 
6555         /*
6556          * Grab both mutexes, in the proper order, since we're accessing
6557          * both PM and softstate variables.
6558          */
6559         mutex_enter(SD_MUTEX(un));
6560         mutex_enter(&un->un_pm_mutex);
6561         if (((gethrtime() - un->un_pm_idle_time) > idletime) &&
6562             (un->un_ncmds_in_driver == 0) && (un->un_pm_count == 0)) {
6563                 /*
6564                  * Update the chain types.
6565                  * This takes affect on the next new command received.
6566                  */
6567                 if (un->un_f_non_devbsize_supported) {
6568                         un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA;
6569                 } else {
6570                         un->un_buf_chain_type = SD_CHAIN_INFO_DISK;
6571                 }
6572                 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD;
6573 
6574                 SD_TRACE(SD_LOG_IO_PM, un,
6575                     "sd_pm_idletimeout_handler: idling device\n");
6576                 (void) pm_idle_component(SD_DEVINFO(un), 0);
6577                 un->un_pm_idle_timeid = NULL;
6578         } else {
6579                 un->un_pm_idle_timeid =
6580                     timeout(sd_pm_idletimeout_handler, un,
6581                     (drv_usectohz((clock_t)300000))); /* 300 ms. */
6582         }
6583         mutex_exit(&un->un_pm_mutex);
6584         mutex_exit(SD_MUTEX(un));
6585 }
6586 
6587 
6588 /*
6589  *    Function: sd_pm_timeout_handler
6590  *
6591  * Description: Callback to tell framework we are idle.
6592  *
6593  *     Context: timeout(9f) thread context.
6594  */
6595 
6596 static void
6597 sd_pm_timeout_handler(void *arg)
6598 {
6599         struct sd_lun *un = arg;
6600 
6601         (void) pm_idle_component(SD_DEVINFO(un), 0);
6602         mutex_enter(&un->un_pm_mutex);
6603         un->un_pm_timeid = NULL;
6604         mutex_exit(&un->un_pm_mutex);
6605 }
6606 
6607 
6608 /*
6609  *    Function: sdpower
6610  *
6611  * Description: PM entry point.
6612  *
6613  * Return Code: DDI_SUCCESS
6614  *              DDI_FAILURE
6615  *
6616  *     Context: Kernel thread context
6617  */
6618 
6619 static int
6620 sdpower(dev_info_t *devi, int component, int level)
6621 {
6622         struct sd_lun   *un;
6623         int             instance;
6624         int             rval = DDI_SUCCESS;
6625         uint_t          i, log_page_size, maxcycles, ncycles;
6626         uchar_t         *log_page_data;
6627         int             log_sense_page;
6628         int             medium_present;
6629         time_t          intvlp;
6630         struct pm_trans_data    sd_pm_tran_data;
6631         uchar_t         save_state;
6632         int             sval;
6633         uchar_t         state_before_pm;
6634         int             got_semaphore_here;
6635         sd_ssc_t        *ssc;
6636         int     last_power_level;
6637 
6638         instance = ddi_get_instance(devi);
6639 
6640         if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) ||
6641             !SD_PM_IS_LEVEL_VALID(un, level) || component != 0) {
6642                 return (DDI_FAILURE);
6643         }
6644 
6645         ssc = sd_ssc_init(un);
6646 
6647         SD_TRACE(SD_LOG_IO_PM, un, "sdpower: entry, level = %d\n", level);
6648 
6649         /*
6650          * Must synchronize power down with close.
6651          * Attempt to decrement/acquire the open/close semaphore,
6652          * but do NOT wait on it. If it's not greater than zero,
6653          * ie. it can't be decremented without waiting, then
6654          * someone else, either open or close, already has it
6655          * and the try returns 0. Use that knowledge here to determine
6656          * if it's OK to change the device power level.
6657          * Also, only increment it on exit if it was decremented, ie. gotten,
6658          * here.
6659          */
6660         got_semaphore_here = sema_tryp(&un->un_semoclose);
6661 
6662         mutex_enter(SD_MUTEX(un));
6663 
6664         SD_INFO(SD_LOG_POWER, un, "sdpower: un_ncmds_in_driver = %ld\n",
6665             un->un_ncmds_in_driver);
6666 
6667         /*
6668          * If un_ncmds_in_driver is non-zero it indicates commands are
6669          * already being processed in the driver, or if the semaphore was
6670          * not gotten here it indicates an open or close is being processed.
6671          * At the same time somebody is requesting to go to a lower power
6672          * that can't perform I/O, which can't happen, therefore we need to
6673          * return failure.
6674          */
6675         if ((!SD_PM_IS_IO_CAPABLE(un, level)) &&
6676             ((un->un_ncmds_in_driver != 0) || (got_semaphore_here == 0))) {
6677                 mutex_exit(SD_MUTEX(un));
6678 
6679                 if (got_semaphore_here != 0) {
6680                         sema_v(&un->un_semoclose);
6681                 }
6682                 SD_TRACE(SD_LOG_IO_PM, un,
6683                     "sdpower: exit, device has queued cmds.\n");
6684 
6685                 goto sdpower_failed;
6686         }
6687 
6688         /*
6689          * if it is OFFLINE that means the disk is completely dead
6690          * in our case we have to put the disk in on or off by sending commands
6691          * Of course that will fail anyway so return back here.
6692          *
6693          * Power changes to a device that's OFFLINE or SUSPENDED
6694          * are not allowed.
6695          */
6696         if ((un->un_state == SD_STATE_OFFLINE) ||
6697             (un->un_state == SD_STATE_SUSPENDED)) {
6698                 mutex_exit(SD_MUTEX(un));
6699 
6700                 if (got_semaphore_here != 0) {
6701                         sema_v(&un->un_semoclose);
6702                 }
6703                 SD_TRACE(SD_LOG_IO_PM, un,
6704                     "sdpower: exit, device is off-line.\n");
6705 
6706                 goto sdpower_failed;
6707         }
6708 
6709         /*
6710          * Change the device's state to indicate it's power level
6711          * is being changed. Do this to prevent a power off in the
6712          * middle of commands, which is especially bad on devices
6713          * that are really powered off instead of just spun down.
6714          */
6715         state_before_pm = un->un_state;
6716         un->un_state = SD_STATE_PM_CHANGING;
6717 
6718         mutex_exit(SD_MUTEX(un));
6719 
6720         /*
6721          * If log sense command is not supported, bypass the
6722          * following checking, otherwise, check the log sense
6723          * information for this device.
6724          */
6725         if (SD_PM_STOP_MOTOR_NEEDED(un, level) &&
6726             un->un_f_log_sense_supported) {
6727                 /*
6728                  * Get the log sense information to understand whether the
6729                  * the powercycle counts have gone beyond the threshhold.
6730                  */
6731                 log_page_size = START_STOP_CYCLE_COUNTER_PAGE_SIZE;
6732                 log_page_data = kmem_zalloc(log_page_size, KM_SLEEP);
6733 
6734                 mutex_enter(SD_MUTEX(un));
6735                 log_sense_page = un->un_start_stop_cycle_page;
6736                 mutex_exit(SD_MUTEX(un));
6737 
6738                 rval = sd_send_scsi_LOG_SENSE(ssc, log_page_data,
6739                     log_page_size, log_sense_page, 0x01, 0, SD_PATH_DIRECT);
6740 
6741                 if (rval != 0) {
6742                         if (rval == EIO)
6743                                 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
6744                         else
6745                                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
6746                 }
6747 
6748 #ifdef  SDDEBUG
6749                 if (sd_force_pm_supported) {
6750                         /* Force a successful result */
6751                         rval = 0;
6752                 }
6753 #endif
6754                 if (rval != 0) {
6755                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
6756                             "Log Sense Failed\n");
6757 
6758                         kmem_free(log_page_data, log_page_size);
6759                         /* Cannot support power management on those drives */
6760 
6761                         if (got_semaphore_here != 0) {
6762                                 sema_v(&un->un_semoclose);
6763                         }
6764                         /*
6765                          * On exit put the state back to it's original value
6766                          * and broadcast to anyone waiting for the power
6767                          * change completion.
6768                          */
6769                         mutex_enter(SD_MUTEX(un));
6770                         un->un_state = state_before_pm;
6771                         cv_broadcast(&un->un_suspend_cv);
6772                         mutex_exit(SD_MUTEX(un));
6773                         SD_TRACE(SD_LOG_IO_PM, un,
6774                             "sdpower: exit, Log Sense Failed.\n");
6775 
6776                         goto sdpower_failed;
6777                 }
6778 
6779                 /*
6780                  * From the page data - Convert the essential information to
6781                  * pm_trans_data
6782                  */
6783                 maxcycles =
6784                     (log_page_data[0x1c] << 24) | (log_page_data[0x1d] << 16) |
6785                     (log_page_data[0x1E] << 8)  | log_page_data[0x1F];
6786 
6787                 ncycles =
6788                     (log_page_data[0x24] << 24) | (log_page_data[0x25] << 16) |
6789                     (log_page_data[0x26] << 8)  | log_page_data[0x27];
6790 
6791                 if (un->un_f_pm_log_sense_smart) {
6792                         sd_pm_tran_data.un.smart_count.allowed = maxcycles;
6793                         sd_pm_tran_data.un.smart_count.consumed = ncycles;
6794                         sd_pm_tran_data.un.smart_count.flag = 0;
6795                         sd_pm_tran_data.format = DC_SMART_FORMAT;
6796                 } else {
6797                         sd_pm_tran_data.un.scsi_cycles.lifemax = maxcycles;
6798                         sd_pm_tran_data.un.scsi_cycles.ncycles = ncycles;
6799                         for (i = 0; i < DC_SCSI_MFR_LEN; i++) {
6800                                 sd_pm_tran_data.un.scsi_cycles.svc_date[i] =
6801                                     log_page_data[8+i];
6802                         }
6803                         sd_pm_tran_data.un.scsi_cycles.flag = 0;
6804                         sd_pm_tran_data.format = DC_SCSI_FORMAT;
6805                 }
6806 
6807                 kmem_free(log_page_data, log_page_size);
6808 
6809                 /*
6810                  * Call pm_trans_check routine to get the Ok from
6811                  * the global policy
6812                  */
6813                 rval = pm_trans_check(&sd_pm_tran_data, &intvlp);
6814 #ifdef  SDDEBUG
6815                 if (sd_force_pm_supported) {
6816                         /* Force a successful result */
6817                         rval = 1;
6818                 }
6819 #endif
6820                 switch (rval) {
6821                 case 0:
6822                         /*
6823                          * Not Ok to Power cycle or error in parameters passed
6824                          * Would have given the advised time to consider power
6825                          * cycle. Based on the new intvlp parameter we are
6826                          * supposed to pretend we are busy so that pm framework
6827                          * will never call our power entry point. Because of
6828                          * that install a timeout handler and wait for the
6829                          * recommended time to elapse so that power management
6830                          * can be effective again.
6831                          *
6832                          * To effect this behavior, call pm_busy_component to
6833                          * indicate to the framework this device is busy.
6834                          * By not adjusting un_pm_count the rest of PM in
6835                          * the driver will function normally, and independent
6836                          * of this but because the framework is told the device
6837                          * is busy it won't attempt powering down until it gets
6838                          * a matching idle. The timeout handler sends this.
6839                          * Note: sd_pm_entry can't be called here to do this
6840                          * because sdpower may have been called as a result
6841                          * of a call to pm_raise_power from within sd_pm_entry.
6842                          *
6843                          * If a timeout handler is already active then
6844                          * don't install another.
6845                          */
6846                         mutex_enter(&un->un_pm_mutex);
6847                         if (un->un_pm_timeid == NULL) {
6848                                 un->un_pm_timeid =
6849                                     timeout(sd_pm_timeout_handler,
6850                                     un, intvlp * drv_usectohz(1000000));
6851                                 mutex_exit(&un->un_pm_mutex);
6852                                 (void) pm_busy_component(SD_DEVINFO(un), 0);
6853                         } else {
6854                                 mutex_exit(&un->un_pm_mutex);
6855                         }
6856                         if (got_semaphore_here != 0) {
6857                                 sema_v(&un->un_semoclose);
6858                         }
6859                         /*
6860                          * On exit put the state back to it's original value
6861                          * and broadcast to anyone waiting for the power
6862                          * change completion.
6863                          */
6864                         mutex_enter(SD_MUTEX(un));
6865                         un->un_state = state_before_pm;
6866                         cv_broadcast(&un->un_suspend_cv);
6867                         mutex_exit(SD_MUTEX(un));
6868 
6869                         SD_TRACE(SD_LOG_IO_PM, un, "sdpower: exit, "
6870                             "trans check Failed, not ok to power cycle.\n");
6871 
6872                         goto sdpower_failed;
6873                 case -1:
6874                         if (got_semaphore_here != 0) {
6875                                 sema_v(&un->un_semoclose);
6876                         }
6877                         /*
6878                          * On exit put the state back to it's original value
6879                          * and broadcast to anyone waiting for the power
6880                          * change completion.
6881                          */
6882                         mutex_enter(SD_MUTEX(un));
6883                         un->un_state = state_before_pm;
6884                         cv_broadcast(&un->un_suspend_cv);
6885                         mutex_exit(SD_MUTEX(un));
6886                         SD_TRACE(SD_LOG_IO_PM, un,
6887                             "sdpower: exit, trans check command Failed.\n");
6888 
6889                         goto sdpower_failed;
6890                 }
6891         }
6892 
6893         if (!SD_PM_IS_IO_CAPABLE(un, level)) {
6894                 /*
6895                  * Save the last state... if the STOP FAILS we need it
6896                  * for restoring
6897                  */
6898                 mutex_enter(SD_MUTEX(un));
6899                 save_state = un->un_last_state;
6900                 last_power_level = un->un_power_level;
6901                 /*
6902                  * There must not be any cmds. getting processed
6903                  * in the driver when we get here. Power to the
6904                  * device is potentially going off.
6905                  */
6906                 ASSERT(un->un_ncmds_in_driver == 0);
6907                 mutex_exit(SD_MUTEX(un));
6908 
6909                 /*
6910                  * For now PM suspend the device completely before spindle is
6911                  * turned off
6912                  */
6913                 if ((rval = sd_pm_state_change(un, level, SD_PM_STATE_CHANGE))
6914                     == DDI_FAILURE) {
6915                         if (got_semaphore_here != 0) {
6916                                 sema_v(&un->un_semoclose);
6917                         }
6918                         /*
6919                          * On exit put the state back to it's original value
6920                          * and broadcast to anyone waiting for the power
6921                          * change completion.
6922                          */
6923                         mutex_enter(SD_MUTEX(un));
6924                         un->un_state = state_before_pm;
6925                         un->un_power_level = last_power_level;
6926                         cv_broadcast(&un->un_suspend_cv);
6927                         mutex_exit(SD_MUTEX(un));
6928                         SD_TRACE(SD_LOG_IO_PM, un,
6929                             "sdpower: exit, PM suspend Failed.\n");
6930 
6931                         goto sdpower_failed;
6932                 }
6933         }
6934 
6935         /*
6936          * The transition from SPINDLE_OFF to SPINDLE_ON can happen in open,
6937          * close, or strategy. Dump no long uses this routine, it uses it's
6938          * own code so it can be done in polled mode.
6939          */
6940 
6941         medium_present = TRUE;
6942 
6943         /*
6944          * When powering up, issue a TUR in case the device is at unit
6945          * attention.  Don't do retries. Bypass the PM layer, otherwise
6946          * a deadlock on un_pm_busy_cv will occur.
6947          */
6948         if (SD_PM_IS_IO_CAPABLE(un, level)) {
6949                 sval = sd_send_scsi_TEST_UNIT_READY(ssc,
6950                     SD_DONT_RETRY_TUR | SD_BYPASS_PM);
6951                 if (sval != 0)
6952                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
6953         }
6954 
6955         if (un->un_f_power_condition_supported) {
6956                 char *pm_condition_name[] = {"STOPPED", "STANDBY",
6957                     "IDLE", "ACTIVE"};
6958                 SD_TRACE(SD_LOG_IO_PM, un,
6959                     "sdpower: sending \'%s\' power condition",
6960                     pm_condition_name[level]);
6961                 sval = sd_send_scsi_START_STOP_UNIT(ssc, SD_POWER_CONDITION,
6962                     sd_pl2pc[level], SD_PATH_DIRECT);
6963         } else {
6964                 SD_TRACE(SD_LOG_IO_PM, un, "sdpower: sending \'%s\' unit\n",
6965                     ((level == SD_SPINDLE_ON) ? "START" : "STOP"));
6966                 sval = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
6967                     ((level == SD_SPINDLE_ON) ? SD_TARGET_START :
6968                     SD_TARGET_STOP), SD_PATH_DIRECT);
6969         }
6970         if (sval != 0) {
6971                 if (sval == EIO)
6972                         sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
6973                 else
6974                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
6975         }
6976 
6977         /* Command failed, check for media present. */
6978         if ((sval == ENXIO) && un->un_f_has_removable_media) {
6979                 medium_present = FALSE;
6980         }
6981 
6982         /*
6983          * The conditions of interest here are:
6984          *   if a spindle off with media present fails,
6985          *      then restore the state and return an error.
6986          *   else if a spindle on fails,
6987          *      then return an error (there's no state to restore).
6988          * In all other cases we setup for the new state
6989          * and return success.
6990          */
6991         if (!SD_PM_IS_IO_CAPABLE(un, level)) {
6992                 if ((medium_present == TRUE) && (sval != 0)) {
6993                         /* The stop command from above failed */
6994                         rval = DDI_FAILURE;
6995                         /*
6996                          * The stop command failed, and we have media
6997                          * present. Put the level back by calling the
6998                          * sd_pm_resume() and set the state back to
6999                          * it's previous value.
7000                          */
7001                         (void) sd_pm_state_change(un, last_power_level,
7002                             SD_PM_STATE_ROLLBACK);
7003                         mutex_enter(SD_MUTEX(un));
7004                         un->un_last_state = save_state;
7005                         mutex_exit(SD_MUTEX(un));
7006                 } else if (un->un_f_monitor_media_state) {
7007                         /*
7008                          * The stop command from above succeeded.
7009                          * Terminate watch thread in case of removable media
7010                          * devices going into low power state. This is as per
7011                          * the requirements of pm framework, otherwise commands
7012                          * will be generated for the device (through watch
7013                          * thread), even when the device is in low power state.
7014                          */
7015                         mutex_enter(SD_MUTEX(un));
7016                         un->un_f_watcht_stopped = FALSE;
7017                         if (un->un_swr_token != NULL) {
7018                                 opaque_t temp_token = un->un_swr_token;
7019                                 un->un_f_watcht_stopped = TRUE;
7020                                 un->un_swr_token = NULL;
7021                                 mutex_exit(SD_MUTEX(un));
7022                                 (void) scsi_watch_request_terminate(temp_token,
7023                                     SCSI_WATCH_TERMINATE_ALL_WAIT);
7024                         } else {
7025                                 mutex_exit(SD_MUTEX(un));
7026                         }
7027                 }
7028         } else {
7029                 /*
7030                  * The level requested is I/O capable.
7031                  * Legacy behavior: return success on a failed spinup
7032                  * if there is no media in the drive.
7033                  * Do this by looking at medium_present here.
7034                  */
7035                 if ((sval != 0) && medium_present) {
7036                         /* The start command from above failed */
7037                         rval = DDI_FAILURE;
7038                 } else {
7039                         /*
7040                          * The start command from above succeeded
7041                          * PM resume the devices now that we have
7042                          * started the disks
7043                          */
7044                         (void) sd_pm_state_change(un, level,
7045                             SD_PM_STATE_CHANGE);
7046 
7047                         /*
7048                          * Resume the watch thread since it was suspended
7049                          * when the device went into low power mode.
7050                          */
7051                         if (un->un_f_monitor_media_state) {
7052                                 mutex_enter(SD_MUTEX(un));
7053                                 if (un->un_f_watcht_stopped == TRUE) {
7054                                         opaque_t temp_token;
7055 
7056                                         un->un_f_watcht_stopped = FALSE;
7057                                         mutex_exit(SD_MUTEX(un));
7058                                         temp_token =
7059                                             sd_watch_request_submit(un);
7060                                         mutex_enter(SD_MUTEX(un));
7061                                         un->un_swr_token = temp_token;
7062                                 }
7063                                 mutex_exit(SD_MUTEX(un));
7064                         }
7065                 }
7066         }
7067 
7068         if (got_semaphore_here != 0) {
7069                 sema_v(&un->un_semoclose);
7070         }
7071         /*
7072          * On exit put the state back to it's original value
7073          * and broadcast to anyone waiting for the power
7074          * change completion.
7075          */
7076         mutex_enter(SD_MUTEX(un));
7077         un->un_state = state_before_pm;
7078         cv_broadcast(&un->un_suspend_cv);
7079         mutex_exit(SD_MUTEX(un));
7080 
7081         SD_TRACE(SD_LOG_IO_PM, un, "sdpower: exit, status = 0x%x\n", rval);
7082 
7083         sd_ssc_fini(ssc);
7084         return (rval);
7085 
7086 sdpower_failed:
7087 
7088         sd_ssc_fini(ssc);
7089         return (DDI_FAILURE);
7090 }
7091 
7092 
7093 
7094 /*
7095  *    Function: sdattach
7096  *
7097  * Description: Driver's attach(9e) entry point function.
7098  *
7099  *   Arguments: devi - opaque device info handle
7100  *              cmd  - attach  type
7101  *
7102  * Return Code: DDI_SUCCESS
7103  *              DDI_FAILURE
7104  *
7105  *     Context: Kernel thread context
7106  */
7107 
7108 static int
7109 sdattach(dev_info_t *devi, ddi_attach_cmd_t cmd)
7110 {
7111         switch (cmd) {
7112         case DDI_ATTACH:
7113                 return (sd_unit_attach(devi));
7114         case DDI_RESUME:
7115                 return (sd_ddi_resume(devi));
7116         default:
7117                 break;
7118         }
7119         return (DDI_FAILURE);
7120 }
7121 
7122 
7123 /*
7124  *    Function: sddetach
7125  *
7126  * Description: Driver's detach(9E) entry point function.
7127  *
7128  *   Arguments: devi - opaque device info handle
7129  *              cmd  - detach  type
7130  *
7131  * Return Code: DDI_SUCCESS
7132  *              DDI_FAILURE
7133  *
7134  *     Context: Kernel thread context
7135  */
7136 
7137 static int
7138 sddetach(dev_info_t *devi, ddi_detach_cmd_t cmd)
7139 {
7140         switch (cmd) {
7141         case DDI_DETACH:
7142                 return (sd_unit_detach(devi));
7143         case DDI_SUSPEND:
7144                 return (sd_ddi_suspend(devi));
7145         default:
7146                 break;
7147         }
7148         return (DDI_FAILURE);
7149 }
7150 
7151 
7152 /*
7153  *     Function: sd_sync_with_callback
7154  *
7155  *  Description: Prevents sd_unit_attach or sd_unit_detach from freeing the soft
7156  *               state while the callback routine is active.
7157  *
7158  *    Arguments: un: softstate structure for the instance
7159  *
7160  *      Context: Kernel thread context
7161  */
7162 
7163 static void
7164 sd_sync_with_callback(struct sd_lun *un)
7165 {
7166         ASSERT(un != NULL);
7167 
7168         mutex_enter(SD_MUTEX(un));
7169 
7170         ASSERT(un->un_in_callback >= 0);
7171 
7172         while (un->un_in_callback > 0) {
7173                 mutex_exit(SD_MUTEX(un));
7174                 delay(2);
7175                 mutex_enter(SD_MUTEX(un));
7176         }
7177 
7178         mutex_exit(SD_MUTEX(un));
7179 }
7180 
7181 /*
7182  *    Function: sd_unit_attach
7183  *
7184  * Description: Performs DDI_ATTACH processing for sdattach(). Allocates
7185  *              the soft state structure for the device and performs
7186  *              all necessary structure and device initializations.
7187  *
7188  *   Arguments: devi: the system's dev_info_t for the device.
7189  *
7190  * Return Code: DDI_SUCCESS if attach is successful.
7191  *              DDI_FAILURE if any part of the attach fails.
7192  *
7193  *     Context: Called at attach(9e) time for the DDI_ATTACH flag.
7194  *              Kernel thread context only.  Can sleep.
7195  */
7196 
7197 static int
7198 sd_unit_attach(dev_info_t *devi)
7199 {
7200         struct  scsi_device     *devp;
7201         struct  sd_lun          *un;
7202         char                    *variantp;
7203         char                    name_str[48];
7204         int     reservation_flag = SD_TARGET_IS_UNRESERVED;
7205         int     instance;
7206         int     rval;
7207         int     wc_enabled;
7208         int     tgt;
7209         uint64_t        capacity;
7210         uint_t          lbasize = 0;
7211         dev_info_t      *pdip = ddi_get_parent(devi);
7212         int             offbyone = 0;
7213         int             geom_label_valid = 0;
7214         sd_ssc_t        *ssc;
7215         int             status;
7216         struct sd_fm_internal   *sfip = NULL;
7217         int             max_xfer_size;
7218 
7219         /*
7220          * Retrieve the target driver's private data area. This was set
7221          * up by the HBA.
7222          */
7223         devp = ddi_get_driver_private(devi);
7224 
7225         /*
7226          * Retrieve the target ID of the device.
7227          */
7228         tgt = ddi_prop_get_int(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS,
7229             SCSI_ADDR_PROP_TARGET, -1);
7230 
7231         /*
7232          * Since we have no idea what state things were left in by the last
7233          * user of the device, set up some 'default' settings, ie. turn 'em
7234          * off. The scsi_ifsetcap calls force re-negotiations with the drive.
7235          * Do this before the scsi_probe, which sends an inquiry.
7236          * This is a fix for bug (4430280).
7237          * Of special importance is wide-xfer. The drive could have been left
7238          * in wide transfer mode by the last driver to communicate with it,
7239          * this includes us. If that's the case, and if the following is not
7240          * setup properly or we don't re-negotiate with the drive prior to
7241          * transferring data to/from the drive, it causes bus parity errors,
7242          * data overruns, and unexpected interrupts. This first occurred when
7243          * the fix for bug (4378686) was made.
7244          */
7245         (void) scsi_ifsetcap(&devp->sd_address, "lun-reset", 0, 1);
7246         (void) scsi_ifsetcap(&devp->sd_address, "wide-xfer", 0, 1);
7247         (void) scsi_ifsetcap(&devp->sd_address, "auto-rqsense", 0, 1);
7248 
7249         /*
7250          * Currently, scsi_ifsetcap sets tagged-qing capability for all LUNs
7251          * on a target. Setting it per lun instance actually sets the
7252          * capability of this target, which affects those luns already
7253          * attached on the same target. So during attach, we can only disable
7254          * this capability only when no other lun has been attached on this
7255          * target. By doing this, we assume a target has the same tagged-qing
7256          * capability for every lun. The condition can be removed when HBA
7257          * is changed to support per lun based tagged-qing capability.
7258          */
7259         if (sd_scsi_get_target_lun_count(pdip, tgt) < 1) {
7260                 (void) scsi_ifsetcap(&devp->sd_address, "tagged-qing", 0, 1);
7261         }
7262 
7263         /*
7264          * Use scsi_probe() to issue an INQUIRY command to the device.
7265          * This call will allocate and fill in the scsi_inquiry structure
7266          * and point the sd_inq member of the scsi_device structure to it.
7267          * If the attach succeeds, then this memory will not be de-allocated
7268          * (via scsi_unprobe()) until the instance is detached.
7269          */
7270         if (scsi_probe(devp, SLEEP_FUNC) != SCSIPROBE_EXISTS) {
7271                 goto probe_failed;
7272         }
7273 
7274         /*
7275          * Check the device type as specified in the inquiry data and
7276          * claim it if it is of a type that we support.
7277          */
7278         switch (devp->sd_inq->inq_dtype) {
7279         case DTYPE_DIRECT:
7280                 break;
7281         case DTYPE_RODIRECT:
7282                 break;
7283         case DTYPE_OPTICAL:
7284                 break;
7285         case DTYPE_NOTPRESENT:
7286         default:
7287                 /* Unsupported device type; fail the attach. */
7288                 goto probe_failed;
7289         }
7290 
7291         /*
7292          * Allocate the soft state structure for this unit.
7293          *
7294          * We rely upon this memory being set to all zeroes by
7295          * ddi_soft_state_zalloc().  We assume that any member of the
7296          * soft state structure that is not explicitly initialized by
7297          * this routine will have a value of zero.
7298          */
7299         instance = ddi_get_instance(devp->sd_dev);
7300 #ifndef XPV_HVM_DRIVER
7301         if (ddi_soft_state_zalloc(sd_state, instance) != DDI_SUCCESS) {
7302                 goto probe_failed;
7303         }
7304 #endif /* !XPV_HVM_DRIVER */
7305 
7306         /*
7307          * Retrieve a pointer to the newly-allocated soft state.
7308          *
7309          * This should NEVER fail if the ddi_soft_state_zalloc() call above
7310          * was successful, unless something has gone horribly wrong and the
7311          * ddi's soft state internals are corrupt (in which case it is
7312          * probably better to halt here than just fail the attach....)
7313          */
7314         if ((un = ddi_get_soft_state(sd_state, instance)) == NULL) {
7315                 panic("sd_unit_attach: NULL soft state on instance:0x%x",
7316                     instance);
7317                 /*NOTREACHED*/
7318         }
7319 
7320         /*
7321          * Link the back ptr of the driver soft state to the scsi_device
7322          * struct for this lun.
7323          * Save a pointer to the softstate in the driver-private area of
7324          * the scsi_device struct.
7325          * Note: We cannot call SD_INFO, SD_TRACE, SD_ERROR, or SD_DIAG until
7326          * we first set un->un_sd below.
7327          */
7328         un->un_sd = devp;
7329         devp->sd_private = (opaque_t)un;
7330 
7331         /*
7332          * The following must be after devp is stored in the soft state struct.
7333          */
7334 #ifdef SDDEBUG
7335         SD_TRACE(SD_LOG_ATTACH_DETACH, un,
7336             "%s_unit_attach: un:0x%p instance:%d\n",
7337             ddi_driver_name(devi), un, instance);
7338 #endif
7339 
7340         /*
7341          * Set up the device type and node type (for the minor nodes).
7342          * By default we assume that the device can at least support the
7343          * Common Command Set. Call it a CD-ROM if it reports itself
7344          * as a RODIRECT device.
7345          */
7346         switch (devp->sd_inq->inq_dtype) {
7347         case DTYPE_RODIRECT:
7348                 un->un_node_type = DDI_NT_CD_CHAN;
7349                 un->un_ctype  = CTYPE_CDROM;
7350                 break;
7351         case DTYPE_OPTICAL:
7352                 un->un_node_type = DDI_NT_BLOCK_CHAN;
7353                 un->un_ctype  = CTYPE_ROD;
7354                 break;
7355         default:
7356                 un->un_node_type = DDI_NT_BLOCK_CHAN;
7357                 un->un_ctype  = CTYPE_CCS;
7358                 break;
7359         }
7360 
7361         /*
7362          * Try to read the interconnect type from the HBA.
7363          *
7364          * Note: This driver is currently compiled as two binaries, a parallel
7365          * scsi version (sd) and a fibre channel version (ssd). All functional
7366          * differences are determined at compile time. In the future a single
7367          * binary will be provided and the interconnect type will be used to
7368          * differentiate between fibre and parallel scsi behaviors. At that time
7369          * it will be necessary for all fibre channel HBAs to support this
7370          * property.
7371          *
7372          * set un_f_is_fiber to TRUE ( default fiber )
7373          */
7374         un->un_f_is_fibre = TRUE;
7375         switch (scsi_ifgetcap(SD_ADDRESS(un), "interconnect-type", -1)) {
7376         case INTERCONNECT_SSA:
7377                 un->un_interconnect_type = SD_INTERCONNECT_SSA;
7378                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
7379                     "sd_unit_attach: un:0x%p SD_INTERCONNECT_SSA\n", un);
7380                 break;
7381         case INTERCONNECT_PARALLEL:
7382                 un->un_f_is_fibre = FALSE;
7383                 un->un_interconnect_type = SD_INTERCONNECT_PARALLEL;
7384                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
7385                     "sd_unit_attach: un:0x%p SD_INTERCONNECT_PARALLEL\n", un);
7386                 break;
7387         case INTERCONNECT_SAS:
7388                 un->un_f_is_fibre = FALSE;
7389                 un->un_interconnect_type = SD_INTERCONNECT_SAS;
7390                 un->un_node_type = DDI_NT_BLOCK_SAS;
7391                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
7392                     "sd_unit_attach: un:0x%p SD_INTERCONNECT_SAS\n", un);
7393                 break;
7394         case INTERCONNECT_SATA:
7395                 un->un_f_is_fibre = FALSE;
7396                 un->un_interconnect_type = SD_INTERCONNECT_SATA;
7397                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
7398                     "sd_unit_attach: un:0x%p SD_INTERCONNECT_SATA\n", un);
7399                 break;
7400         case INTERCONNECT_FIBRE:
7401                 un->un_interconnect_type = SD_INTERCONNECT_FIBRE;
7402                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
7403                     "sd_unit_attach: un:0x%p SD_INTERCONNECT_FIBRE\n", un);
7404                 break;
7405         case INTERCONNECT_FABRIC:
7406                 un->un_interconnect_type = SD_INTERCONNECT_FABRIC;
7407                 un->un_node_type = DDI_NT_BLOCK_FABRIC;
7408                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
7409                     "sd_unit_attach: un:0x%p SD_INTERCONNECT_FABRIC\n", un);
7410                 break;
7411         default:
7412 #ifdef SD_DEFAULT_INTERCONNECT_TYPE
7413                 /*
7414                  * The HBA does not support the "interconnect-type" property
7415                  * (or did not provide a recognized type).
7416                  *
7417                  * Note: This will be obsoleted when a single fibre channel
7418                  * and parallel scsi driver is delivered. In the meantime the
7419                  * interconnect type will be set to the platform default.If that
7420                  * type is not parallel SCSI, it means that we should be
7421                  * assuming "ssd" semantics. However, here this also means that
7422                  * the FC HBA is not supporting the "interconnect-type" property
7423                  * like we expect it to, so log this occurrence.
7424                  */
7425                 un->un_interconnect_type = SD_DEFAULT_INTERCONNECT_TYPE;
7426                 if (!SD_IS_PARALLEL_SCSI(un)) {
7427                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
7428                             "sd_unit_attach: un:0x%p Assuming "
7429                             "INTERCONNECT_FIBRE\n", un);
7430                 } else {
7431                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
7432                             "sd_unit_attach: un:0x%p Assuming "
7433                             "INTERCONNECT_PARALLEL\n", un);
7434                         un->un_f_is_fibre = FALSE;
7435                 }
7436 #else
7437                 /*
7438                  * Note: This source will be implemented when a single fibre
7439                  * channel and parallel scsi driver is delivered. The default
7440                  * will be to assume that if a device does not support the
7441                  * "interconnect-type" property it is a parallel SCSI HBA and
7442                  * we will set the interconnect type for parallel scsi.
7443                  */
7444                 un->un_interconnect_type = SD_INTERCONNECT_PARALLEL;
7445                 un->un_f_is_fibre = FALSE;
7446 #endif
7447                 break;
7448         }
7449 
7450         if (un->un_f_is_fibre == TRUE) {
7451                 if (scsi_ifgetcap(SD_ADDRESS(un), "scsi-version", 1) ==
7452                     SCSI_VERSION_3) {
7453                         switch (un->un_interconnect_type) {
7454                         case SD_INTERCONNECT_FIBRE:
7455                         case SD_INTERCONNECT_SSA:
7456                                 un->un_node_type = DDI_NT_BLOCK_WWN;
7457                                 break;
7458                         default:
7459                                 break;
7460                         }
7461                 }
7462         }
7463 
7464         /*
7465          * Initialize the Request Sense command for the target
7466          */
7467         if (sd_alloc_rqs(devp, un) != DDI_SUCCESS) {
7468                 goto alloc_rqs_failed;
7469         }
7470 
7471         /*
7472          * Set un_retry_count with SD_RETRY_COUNT, this is ok for Sparc
7473          * with separate binary for sd and ssd.
7474          *
7475          * x86 has 1 binary, un_retry_count is set base on connection type.
7476          * The hardcoded values will go away when Sparc uses 1 binary
7477          * for sd and ssd.  This hardcoded values need to match
7478          * SD_RETRY_COUNT in sddef.h
7479          * The value used is base on interconnect type.
7480          * fibre = 3, parallel = 5
7481          */
7482 #if defined(__i386) || defined(__amd64)
7483         un->un_retry_count = un->un_f_is_fibre ? 3 : 5;
7484 #else
7485         un->un_retry_count = SD_RETRY_COUNT;
7486 #endif
7487 
7488         /*
7489          * Set the per disk retry count to the default number of retries
7490          * for disks and CDROMs. This value can be overridden by the
7491          * disk property list or an entry in sd.conf.
7492          */
7493         un->un_notready_retry_count =
7494             ISCD(un) ? CD_NOT_READY_RETRY_COUNT(un)
7495             : DISK_NOT_READY_RETRY_COUNT(un);
7496 
7497         /*
7498          * Set the busy retry count to the default value of un_retry_count.
7499          * This can be overridden by entries in sd.conf or the device
7500          * config table.
7501          */
7502         un->un_busy_retry_count = un->un_retry_count;
7503 
7504         /*
7505          * Init the reset threshold for retries.  This number determines
7506          * how many retries must be performed before a reset can be issued
7507          * (for certain error conditions). This can be overridden by entries
7508          * in sd.conf or the device config table.
7509          */
7510         un->un_reset_retry_count = (un->un_retry_count / 2);
7511 
7512         /*
7513          * Set the victim_retry_count to the default un_retry_count
7514          */
7515         un->un_victim_retry_count = (2 * un->un_retry_count);
7516 
7517         /*
7518          * Set the reservation release timeout to the default value of
7519          * 5 seconds. This can be overridden by entries in ssd.conf or the
7520          * device config table.
7521          */
7522         un->un_reserve_release_time = 5;
7523 
7524         /*
7525          * Set up the default maximum transfer size. Note that this may
7526          * get updated later in the attach, when setting up default wide
7527          * operations for disks.
7528          */
7529 #if defined(__i386) || defined(__amd64)
7530         un->un_max_xfer_size = (uint_t)SD_DEFAULT_MAX_XFER_SIZE;
7531         un->un_partial_dma_supported = 1;
7532 #else
7533         un->un_max_xfer_size = (uint_t)maxphys;
7534 #endif
7535 
7536         /*
7537          * Get "allow bus device reset" property (defaults to "enabled" if
7538          * the property was not defined). This is to disable bus resets for
7539          * certain kinds of error recovery. Note: In the future when a run-time
7540          * fibre check is available the soft state flag should default to
7541          * enabled.
7542          */
7543         if (un->un_f_is_fibre == TRUE) {
7544                 un->un_f_allow_bus_device_reset = TRUE;
7545         } else {
7546                 if (ddi_getprop(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS,
7547                     "allow-bus-device-reset", 1) != 0) {
7548                         un->un_f_allow_bus_device_reset = TRUE;
7549                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
7550                             "sd_unit_attach: un:0x%p Bus device reset "
7551                             "enabled\n", un);
7552                 } else {
7553                         un->un_f_allow_bus_device_reset = FALSE;
7554                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
7555                             "sd_unit_attach: un:0x%p Bus device reset "
7556                             "disabled\n", un);
7557                 }
7558         }
7559 
7560         /*
7561          * Check if this is an ATAPI device. ATAPI devices use Group 1
7562          * Read/Write commands and Group 2 Mode Sense/Select commands.
7563          *
7564          * Note: The "obsolete" way of doing this is to check for the "atapi"
7565          * property. The new "variant" property with a value of "atapi" has been
7566          * introduced so that future 'variants' of standard SCSI behavior (like
7567          * atapi) could be specified by the underlying HBA drivers by supplying
7568          * a new value for the "variant" property, instead of having to define a
7569          * new property.
7570          */
7571         if (ddi_prop_get_int(DDI_DEV_T_ANY, devi, 0, "atapi", -1) != -1) {
7572                 un->un_f_cfg_is_atapi = TRUE;
7573                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
7574                     "sd_unit_attach: un:0x%p Atapi device\n", un);
7575         }
7576         if (ddi_prop_lookup_string(DDI_DEV_T_ANY, devi, 0, "variant",
7577             &variantp) == DDI_PROP_SUCCESS) {
7578                 if (strcmp(variantp, "atapi") == 0) {
7579                         un->un_f_cfg_is_atapi = TRUE;
7580                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
7581                             "sd_unit_attach: un:0x%p Atapi device\n", un);
7582                 }
7583                 ddi_prop_free(variantp);
7584         }
7585 
7586         un->un_cmd_timeout   = SD_IO_TIME;
7587 
7588         un->un_busy_timeout  = SD_BSY_TIMEOUT;
7589 
7590         /* Info on current states, statuses, etc. (Updated frequently) */
7591         un->un_state         = SD_STATE_NORMAL;
7592         un->un_last_state    = SD_STATE_NORMAL;
7593 
7594         /* Control & status info for command throttling */
7595         un->un_throttle              = sd_max_throttle;
7596         un->un_saved_throttle        = sd_max_throttle;
7597         un->un_min_throttle  = sd_min_throttle;
7598 
7599         if (un->un_f_is_fibre == TRUE) {
7600                 un->un_f_use_adaptive_throttle = TRUE;
7601         } else {
7602                 un->un_f_use_adaptive_throttle = FALSE;
7603         }
7604 
7605         /* Removable media support. */
7606         cv_init(&un->un_state_cv, NULL, CV_DRIVER, NULL);
7607         un->un_mediastate            = DKIO_NONE;
7608         un->un_specified_mediastate  = DKIO_NONE;
7609 
7610         /* CVs for suspend/resume (PM or DR) */
7611         cv_init(&un->un_suspend_cv,   NULL, CV_DRIVER, NULL);
7612         cv_init(&un->un_disk_busy_cv, NULL, CV_DRIVER, NULL);
7613 
7614         /* Power management support. */
7615         un->un_power_level = SD_SPINDLE_UNINIT;
7616 
7617         cv_init(&un->un_wcc_cv,   NULL, CV_DRIVER, NULL);
7618         un->un_f_wcc_inprog = 0;
7619 
7620         /*
7621          * The open/close semaphore is used to serialize threads executing
7622          * in the driver's open & close entry point routines for a given
7623          * instance.
7624          */
7625         (void) sema_init(&un->un_semoclose, 1, NULL, SEMA_DRIVER, NULL);
7626 
7627         /*
7628          * The conf file entry and softstate variable is a forceful override,
7629          * meaning a non-zero value must be entered to change the default.
7630          */
7631         un->un_f_disksort_disabled = FALSE;
7632         un->un_f_rmw_type = SD_RMW_TYPE_DEFAULT;
7633         un->un_f_enable_rmw = FALSE;
7634 
7635         /*
7636          * GET EVENT STATUS NOTIFICATION media polling enabled by default, but
7637          * can be overridden via [s]sd-config-list "mmc-gesn-polling" property.
7638          */
7639         un->un_f_mmc_gesn_polling = TRUE;
7640 
7641         /*
7642          * physical sector size defaults to DEV_BSIZE currently. We can
7643          * override this value via the driver configuration file so we must
7644          * set it before calling sd_read_unit_properties().
7645          */
7646         un->un_phy_blocksize = DEV_BSIZE;
7647 
7648         /*
7649          * Retrieve the properties from the static driver table or the driver
7650          * configuration file (.conf) for this unit and update the soft state
7651          * for the device as needed for the indicated properties.
7652          * Note: the property configuration needs to occur here as some of the
7653          * following routines may have dependencies on soft state flags set
7654          * as part of the driver property configuration.
7655          */
7656         sd_read_unit_properties(un);
7657         SD_TRACE(SD_LOG_ATTACH_DETACH, un,
7658             "sd_unit_attach: un:0x%p property configuration complete.\n", un);
7659 
7660         /*
7661          * Only if a device has "hotpluggable" property, it is
7662          * treated as hotpluggable device. Otherwise, it is
7663          * regarded as non-hotpluggable one.
7664          */
7665         if (ddi_prop_get_int(DDI_DEV_T_ANY, devi, 0, "hotpluggable",
7666             -1) != -1) {
7667                 un->un_f_is_hotpluggable = TRUE;
7668         }
7669 
7670         /*
7671          * set unit's attributes(flags) according to "hotpluggable" and
7672          * RMB bit in INQUIRY data.
7673          */
7674         sd_set_unit_attributes(un, devi);
7675 
7676         /*
7677          * By default, we mark the capacity, lbasize, and geometry
7678          * as invalid. Only if we successfully read a valid capacity
7679          * will we update the un_blockcount and un_tgt_blocksize with the
7680          * valid values (the geometry will be validated later).
7681          */
7682         un->un_f_blockcount_is_valid = FALSE;
7683         un->un_f_tgt_blocksize_is_valid      = FALSE;
7684 
7685         /*
7686          * Use DEV_BSIZE and DEV_BSHIFT as defaults, until we can determine
7687          * otherwise.
7688          */
7689         un->un_tgt_blocksize  = un->un_sys_blocksize  = DEV_BSIZE;
7690         un->un_blockcount = 0;
7691 
7692         /*
7693          * Set up the per-instance info needed to determine the correct
7694          * CDBs and other info for issuing commands to the target.
7695          */
7696         sd_init_cdb_limits(un);
7697 
7698         /*
7699          * Set up the IO chains to use, based upon the target type.
7700          */
7701         if (un->un_f_non_devbsize_supported) {
7702                 un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA;
7703         } else {
7704                 un->un_buf_chain_type = SD_CHAIN_INFO_DISK;
7705         }
7706         un->un_uscsi_chain_type  = SD_CHAIN_INFO_USCSI_CMD;
7707         un->un_direct_chain_type = SD_CHAIN_INFO_DIRECT_CMD;
7708         un->un_priority_chain_type = SD_CHAIN_INFO_PRIORITY_CMD;
7709 
7710         un->un_xbuf_attr = ddi_xbuf_attr_create(sizeof (struct sd_xbuf),
7711             sd_xbuf_strategy, un, sd_xbuf_active_limit,  sd_xbuf_reserve_limit,
7712             ddi_driver_major(devi), DDI_XBUF_QTHREAD_DRIVER);
7713         ddi_xbuf_attr_register_devinfo(un->un_xbuf_attr, devi);
7714 
7715 
7716         if (ISCD(un)) {
7717                 un->un_additional_codes = sd_additional_codes;
7718         } else {
7719                 un->un_additional_codes = NULL;
7720         }
7721 
7722         /*
7723          * Create the kstats here so they can be available for attach-time
7724          * routines that send commands to the unit (either polled or via
7725          * sd_send_scsi_cmd).
7726          *
7727          * Note: This is a critical sequence that needs to be maintained:
7728          *      1) Instantiate the kstats here, before any routines using the
7729          *         iopath (i.e. sd_send_scsi_cmd).
7730          *      2) Instantiate and initialize the partition stats
7731          *         (sd_set_pstats).
7732          *      3) Initialize the error stats (sd_set_errstats), following
7733          *         sd_validate_geometry(),sd_register_devid(),
7734          *         and sd_cache_control().
7735          */
7736 
7737         un->un_stats = kstat_create(sd_label, instance,
7738             NULL, "disk", KSTAT_TYPE_IO, 1, KSTAT_FLAG_PERSISTENT);
7739         if (un->un_stats != NULL) {
7740                 un->un_stats->ks_lock = SD_MUTEX(un);
7741                 kstat_install(un->un_stats);
7742         }
7743         SD_TRACE(SD_LOG_ATTACH_DETACH, un,
7744             "sd_unit_attach: un:0x%p un_stats created\n", un);
7745 
7746         sd_create_errstats(un, instance);
7747         if (un->un_errstats == NULL) {
7748                 goto create_errstats_failed;
7749         }
7750         SD_TRACE(SD_LOG_ATTACH_DETACH, un,
7751             "sd_unit_attach: un:0x%p errstats created\n", un);
7752 
7753         /*
7754          * The following if/else code was relocated here from below as part
7755          * of the fix for bug (4430280). However with the default setup added
7756          * on entry to this routine, it's no longer absolutely necessary for
7757          * this to be before the call to sd_spin_up_unit.
7758          */
7759         if (SD_IS_PARALLEL_SCSI(un) || SD_IS_SERIAL(un)) {
7760                 int tq_trigger_flag = (((devp->sd_inq->inq_ansi == 4) ||
7761                     (devp->sd_inq->inq_ansi == 5)) &&
7762                     devp->sd_inq->inq_bque) || devp->sd_inq->inq_cmdque;
7763 
7764                 /*
7765                  * If tagged queueing is supported by the target
7766                  * and by the host adapter then we will enable it
7767                  */
7768                 un->un_tagflags = 0;
7769                 if ((devp->sd_inq->inq_rdf == RDF_SCSI2) && tq_trigger_flag &&
7770                     (un->un_f_arq_enabled == TRUE)) {
7771                         if (scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing",
7772                             1, 1) == 1) {
7773                                 un->un_tagflags = FLAG_STAG;
7774                                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
7775                                     "sd_unit_attach: un:0x%p tag queueing "
7776                                     "enabled\n", un);
7777                         } else if (scsi_ifgetcap(SD_ADDRESS(un),
7778                             "untagged-qing", 0) == 1) {
7779                                 un->un_f_opt_queueing = TRUE;
7780                                 un->un_saved_throttle = un->un_throttle =
7781                                     min(un->un_throttle, 3);
7782                         } else {
7783                                 un->un_f_opt_queueing = FALSE;
7784                                 un->un_saved_throttle = un->un_throttle = 1;
7785                         }
7786                 } else if ((scsi_ifgetcap(SD_ADDRESS(un), "untagged-qing", 0)
7787                     == 1) && (un->un_f_arq_enabled == TRUE)) {
7788                         /* The Host Adapter supports internal queueing. */
7789                         un->un_f_opt_queueing = TRUE;
7790                         un->un_saved_throttle = un->un_throttle =
7791                             min(un->un_throttle, 3);
7792                 } else {
7793                         un->un_f_opt_queueing = FALSE;
7794                         un->un_saved_throttle = un->un_throttle = 1;
7795                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
7796                             "sd_unit_attach: un:0x%p no tag queueing\n", un);
7797                 }
7798 
7799                 /*
7800                  * Enable large transfers for SATA/SAS drives
7801                  */
7802                 if (SD_IS_SERIAL(un)) {
7803                         un->un_max_xfer_size =
7804                             ddi_getprop(DDI_DEV_T_ANY, devi, 0,
7805                             sd_max_xfer_size, SD_MAX_XFER_SIZE);
7806                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
7807                             "sd_unit_attach: un:0x%p max transfer "
7808                             "size=0x%x\n", un, un->un_max_xfer_size);
7809 
7810                 }
7811 
7812                 /* Setup or tear down default wide operations for disks */
7813 
7814                 /*
7815                  * Note: Legacy: it may be possible for both "sd_max_xfer_size"
7816                  * and "ssd_max_xfer_size" to exist simultaneously on the same
7817                  * system and be set to different values. In the future this
7818                  * code may need to be updated when the ssd module is
7819                  * obsoleted and removed from the system. (4299588)
7820                  */
7821                 if (SD_IS_PARALLEL_SCSI(un) &&
7822                     (devp->sd_inq->inq_rdf == RDF_SCSI2) &&
7823                     (devp->sd_inq->inq_wbus16 || devp->sd_inq->inq_wbus32)) {
7824                         if (scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer",
7825                             1, 1) == 1) {
7826                                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
7827                                     "sd_unit_attach: un:0x%p Wide Transfer "
7828                                     "enabled\n", un);
7829                         }
7830 
7831                         /*
7832                          * If tagged queuing has also been enabled, then
7833                          * enable large xfers
7834                          */
7835                         if (un->un_saved_throttle == sd_max_throttle) {
7836                                 un->un_max_xfer_size =
7837                                     ddi_getprop(DDI_DEV_T_ANY, devi, 0,
7838                                     sd_max_xfer_size, SD_MAX_XFER_SIZE);
7839                                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
7840                                     "sd_unit_attach: un:0x%p max transfer "
7841                                     "size=0x%x\n", un, un->un_max_xfer_size);
7842                         }
7843                 } else {
7844                         if (scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer",
7845                             0, 1) == 1) {
7846                                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
7847                                     "sd_unit_attach: un:0x%p "
7848                                     "Wide Transfer disabled\n", un);
7849                         }
7850                 }
7851         } else {
7852                 un->un_tagflags = FLAG_STAG;
7853                 un->un_max_xfer_size = ddi_getprop(DDI_DEV_T_ANY,
7854                     devi, 0, sd_max_xfer_size, SD_MAX_XFER_SIZE);
7855         }
7856 
7857         /*
7858          * If this target supports LUN reset, try to enable it.
7859          */
7860         if (un->un_f_lun_reset_enabled) {
7861                 if (scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 1, 1) == 1) {
7862                         SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: "
7863                             "un:0x%p lun_reset capability set\n", un);
7864                 } else {
7865                         SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: "
7866                             "un:0x%p lun-reset capability not set\n", un);
7867                 }
7868         }
7869 
7870         /*
7871          * Adjust the maximum transfer size. This is to fix
7872          * the problem of partial DMA support on SPARC. Some
7873          * HBA driver, like aac, has very small dma_attr_maxxfer
7874          * size, which requires partial DMA support on SPARC.
7875          * In the future the SPARC pci nexus driver may solve
7876          * the problem instead of this fix.
7877          */
7878         max_xfer_size = scsi_ifgetcap(SD_ADDRESS(un), "dma-max", 1);
7879         if ((max_xfer_size > 0) && (max_xfer_size < un->un_max_xfer_size)) {
7880                 /* We need DMA partial even on sparc to ensure sddump() works */
7881                 un->un_max_xfer_size = max_xfer_size;
7882                 if (un->un_partial_dma_supported == 0)
7883                         un->un_partial_dma_supported = 1;
7884         }
7885         if (ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
7886             DDI_PROP_DONTPASS, "buf_break", 0) == 1) {
7887                 if (ddi_xbuf_attr_setup_brk(un->un_xbuf_attr,
7888                     un->un_max_xfer_size) == 1) {
7889                         un->un_buf_breakup_supported = 1;
7890                         SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: "
7891                             "un:0x%p Buf breakup enabled\n", un);
7892                 }
7893         }
7894 
7895         /*
7896          * Set PKT_DMA_PARTIAL flag.
7897          */
7898         if (un->un_partial_dma_supported == 1) {
7899                 un->un_pkt_flags = PKT_DMA_PARTIAL;
7900         } else {
7901                 un->un_pkt_flags = 0;
7902         }
7903 
7904         /* Initialize sd_ssc_t for internal uscsi commands */
7905         ssc = sd_ssc_init(un);
7906         scsi_fm_init(devp);
7907 
7908         /*
7909          * Allocate memory for SCSI FMA stuffs.
7910          */
7911         un->un_fm_private =
7912             kmem_zalloc(sizeof (struct sd_fm_internal), KM_SLEEP);
7913         sfip = (struct sd_fm_internal *)un->un_fm_private;
7914         sfip->fm_ssc.ssc_uscsi_cmd = &sfip->fm_ucmd;
7915         sfip->fm_ssc.ssc_uscsi_info = &sfip->fm_uinfo;
7916         sfip->fm_ssc.ssc_un = un;
7917 
7918         if (ISCD(un) ||
7919             un->un_f_has_removable_media ||
7920             devp->sd_fm_capable == DDI_FM_NOT_CAPABLE) {
7921                 /*
7922                  * We don't touch CDROM or the DDI_FM_NOT_CAPABLE device.
7923                  * Their log are unchanged.
7924                  */
7925                 sfip->fm_log_level = SD_FM_LOG_NSUP;
7926         } else {
7927                 /*
7928                  * If enter here, it should be non-CDROM and FM-capable
7929                  * device, and it will not keep the old scsi_log as before
7930                  * in /var/adm/messages. However, the property
7931                  * "fm-scsi-log" will control whether the FM telemetry will
7932                  * be logged in /var/adm/messages.
7933                  */
7934                 int fm_scsi_log;
7935                 fm_scsi_log = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
7936                     DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, "fm-scsi-log", 0);
7937 
7938                 if (fm_scsi_log)
7939                         sfip->fm_log_level = SD_FM_LOG_EREPORT;
7940                 else
7941                         sfip->fm_log_level = SD_FM_LOG_SILENT;
7942         }
7943 
7944         /*
7945          * At this point in the attach, we have enough info in the
7946          * soft state to be able to issue commands to the target.
7947          *
7948          * All command paths used below MUST issue their commands as
7949          * SD_PATH_DIRECT. This is important as intermediate layers
7950          * are not all initialized yet (such as PM).
7951          */
7952 
7953         /*
7954          * Send a TEST UNIT READY command to the device. This should clear
7955          * any outstanding UNIT ATTENTION that may be present.
7956          *
7957          * Note: Don't check for success, just track if there is a reservation,
7958          * this is a throw away command to clear any unit attentions.
7959          *
7960          * Note: This MUST be the first command issued to the target during
7961          * attach to ensure power on UNIT ATTENTIONS are cleared.
7962          * Pass in flag SD_DONT_RETRY_TUR to prevent the long delays associated
7963          * with attempts at spinning up a device with no media.
7964          */
7965         status = sd_send_scsi_TEST_UNIT_READY(ssc, SD_DONT_RETRY_TUR);
7966         if (status != 0) {
7967                 if (status == EACCES)
7968                         reservation_flag = SD_TARGET_IS_RESERVED;
7969                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
7970         }
7971 
7972         /*
7973          * If the device is NOT a removable media device, attempt to spin
7974          * it up (using the START_STOP_UNIT command) and read its capacity
7975          * (using the READ CAPACITY command).  Note, however, that either
7976          * of these could fail and in some cases we would continue with
7977          * the attach despite the failure (see below).
7978          */
7979         if (un->un_f_descr_format_supported) {
7980 
7981                 switch (sd_spin_up_unit(ssc)) {
7982                 case 0:
7983                         /*
7984                          * Spin-up was successful; now try to read the
7985                          * capacity.  If successful then save the results
7986                          * and mark the capacity & lbasize as valid.
7987                          */
7988                         SD_TRACE(SD_LOG_ATTACH_DETACH, un,
7989                             "sd_unit_attach: un:0x%p spin-up successful\n", un);
7990 
7991                         status = sd_send_scsi_READ_CAPACITY(ssc, &capacity,
7992                             &lbasize, SD_PATH_DIRECT);
7993 
7994                         switch (status) {
7995                         case 0: {
7996                                 if (capacity > DK_MAX_BLOCKS) {
7997 #ifdef _LP64
7998                                         if ((capacity + 1) >
7999                                             SD_GROUP1_MAX_ADDRESS) {
8000                                                 /*
8001                                                  * Enable descriptor format
8002                                                  * sense data so that we can
8003                                                  * get 64 bit sense data
8004                                                  * fields.
8005                                                  */
8006                                                 sd_enable_descr_sense(ssc);
8007                                         }
8008 #else
8009                                         /* 32-bit kernels can't handle this */
8010                                         scsi_log(SD_DEVINFO(un),
8011                                             sd_label, CE_WARN,
8012                                             "disk has %llu blocks, which "
8013                                             "is too large for a 32-bit "
8014                                             "kernel", capacity);
8015 
8016 #if defined(__i386) || defined(__amd64)
8017                                         /*
8018                                          * 1TB disk was treated as (1T - 512)B
8019                                          * in the past, so that it might have
8020                                          * valid VTOC and solaris partitions,
8021                                          * we have to allow it to continue to
8022                                          * work.
8023                                          */
8024                                         if (capacity -1 > DK_MAX_BLOCKS)
8025 #endif
8026                                         goto spinup_failed;
8027 #endif
8028                                 }
8029 
8030                                 /*
8031                                  * Here it's not necessary to check the case:
8032                                  * the capacity of the device is bigger than
8033                                  * what the max hba cdb can support. Because
8034                                  * sd_send_scsi_READ_CAPACITY will retrieve
8035                                  * the capacity by sending USCSI command, which
8036                                  * is constrained by the max hba cdb. Actually,
8037                                  * sd_send_scsi_READ_CAPACITY will return
8038                                  * EINVAL when using bigger cdb than required
8039                                  * cdb length. Will handle this case in
8040                                  * "case EINVAL".
8041                                  */
8042 
8043                                 /*
8044                                  * The following relies on
8045                                  * sd_send_scsi_READ_CAPACITY never
8046                                  * returning 0 for capacity and/or lbasize.
8047                                  */
8048                                 sd_update_block_info(un, lbasize, capacity);
8049 
8050                                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
8051                                     "sd_unit_attach: un:0x%p capacity = %ld "
8052                                     "blocks; lbasize= %ld.\n", un,
8053                                     un->un_blockcount, un->un_tgt_blocksize);
8054 
8055                                 break;
8056                         }
8057                         case EINVAL:
8058                                 /*
8059                                  * In the case where the max-cdb-length property
8060                                  * is smaller than the required CDB length for
8061                                  * a SCSI device, a target driver can fail to
8062                                  * attach to that device.
8063                                  */
8064                                 scsi_log(SD_DEVINFO(un),
8065                                     sd_label, CE_WARN,
8066                                     "disk capacity is too large "
8067                                     "for current cdb length");
8068                                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
8069 
8070                                 goto spinup_failed;
8071                         case EACCES:
8072                                 /*
8073                                  * Should never get here if the spin-up
8074                                  * succeeded, but code it in anyway.
8075                                  * From here, just continue with the attach...
8076                                  */
8077                                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
8078                                     "sd_unit_attach: un:0x%p "
8079                                     "sd_send_scsi_READ_CAPACITY "
8080                                     "returned reservation conflict\n", un);
8081                                 reservation_flag = SD_TARGET_IS_RESERVED;
8082                                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
8083                                 break;
8084                         default:
8085                                 /*
8086                                  * Likewise, should never get here if the
8087                                  * spin-up succeeded. Just continue with
8088                                  * the attach...
8089                                  */
8090                                 if (status == EIO)
8091                                         sd_ssc_assessment(ssc,
8092                                             SD_FMT_STATUS_CHECK);
8093                                 else
8094                                         sd_ssc_assessment(ssc,
8095                                             SD_FMT_IGNORE);
8096                                 break;
8097                         }
8098                         break;
8099                 case EACCES:
8100                         /*
8101                          * Device is reserved by another host.  In this case
8102                          * we could not spin it up or read the capacity, but
8103                          * we continue with the attach anyway.
8104                          */
8105                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
8106                             "sd_unit_attach: un:0x%p spin-up reservation "
8107                             "conflict.\n", un);
8108                         reservation_flag = SD_TARGET_IS_RESERVED;
8109                         break;
8110                 default:
8111                         /* Fail the attach if the spin-up failed. */
8112                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
8113                             "sd_unit_attach: un:0x%p spin-up failed.", un);
8114                         goto spinup_failed;
8115                 }
8116 
8117         }
8118 
8119         /*
8120          * Check to see if this is a MMC drive
8121          */
8122         if (ISCD(un)) {
8123                 sd_set_mmc_caps(ssc);
8124         }
8125 
8126         /*
8127          * Add a zero-length attribute to tell the world we support
8128          * kernel ioctls (for layered drivers)
8129          */
8130         (void) ddi_prop_create(DDI_DEV_T_NONE, devi, DDI_PROP_CANSLEEP,
8131             DDI_KERNEL_IOCTL, NULL, 0);
8132 
8133         /*
8134          * Add a boolean property to tell the world we support
8135          * the B_FAILFAST flag (for layered drivers)
8136          */
8137         (void) ddi_prop_create(DDI_DEV_T_NONE, devi, DDI_PROP_CANSLEEP,
8138             "ddi-failfast-supported", NULL, 0);
8139 
8140         /*
8141          * Initialize power management
8142          */
8143         mutex_init(&un->un_pm_mutex, NULL, MUTEX_DRIVER, NULL);
8144         cv_init(&un->un_pm_busy_cv, NULL, CV_DRIVER, NULL);
8145         sd_setup_pm(ssc, devi);
8146         if (un->un_f_pm_is_enabled == FALSE) {
8147                 /*
8148                  * For performance, point to a jump table that does
8149                  * not include pm.
8150                  * The direct and priority chains don't change with PM.
8151                  *
8152                  * Note: this is currently done based on individual device
8153                  * capabilities. When an interface for determining system
8154                  * power enabled state becomes available, or when additional
8155                  * layers are added to the command chain, these values will
8156                  * have to be re-evaluated for correctness.
8157                  */
8158                 if (un->un_f_non_devbsize_supported) {
8159                         un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA_NO_PM;
8160                 } else {
8161                         un->un_buf_chain_type = SD_CHAIN_INFO_DISK_NO_PM;
8162                 }
8163                 un->un_uscsi_chain_type  = SD_CHAIN_INFO_USCSI_CMD_NO_PM;
8164         }
8165 
8166         /*
8167          * This property is set to 0 by HA software to avoid retries
8168          * on a reserved disk. (The preferred property name is
8169          * "retry-on-reservation-conflict") (1189689)
8170          *
8171          * Note: The use of a global here can have unintended consequences. A
8172          * per instance variable is preferable to match the capabilities of
8173          * different underlying hba's (4402600)
8174          */
8175         sd_retry_on_reservation_conflict = ddi_getprop(DDI_DEV_T_ANY, devi,
8176             DDI_PROP_DONTPASS, "retry-on-reservation-conflict",
8177             sd_retry_on_reservation_conflict);
8178         if (sd_retry_on_reservation_conflict != 0) {
8179                 sd_retry_on_reservation_conflict = ddi_getprop(DDI_DEV_T_ANY,
8180                     devi, DDI_PROP_DONTPASS, sd_resv_conflict_name,
8181                     sd_retry_on_reservation_conflict);
8182         }
8183 
8184         /* Set up options for QFULL handling. */
8185         if ((rval = ddi_getprop(DDI_DEV_T_ANY, devi, 0,
8186             "qfull-retries", -1)) != -1) {
8187                 (void) scsi_ifsetcap(SD_ADDRESS(un), "qfull-retries",
8188                     rval, 1);
8189         }
8190         if ((rval = ddi_getprop(DDI_DEV_T_ANY, devi, 0,
8191             "qfull-retry-interval", -1)) != -1) {
8192                 (void) scsi_ifsetcap(SD_ADDRESS(un), "qfull-retry-interval",
8193                     rval, 1);
8194         }
8195 
8196         /*
8197          * This just prints a message that announces the existence of the
8198          * device. The message is always printed in the system logfile, but
8199          * only appears on the console if the system is booted with the
8200          * -v (verbose) argument.
8201          */
8202         ddi_report_dev(devi);
8203 
8204         un->un_mediastate = DKIO_NONE;
8205 
8206         /*
8207          * Check if this is a SSD(Solid State Drive).
8208          */
8209         sd_check_solid_state(ssc);
8210 
8211         /*
8212          * Check whether the drive is in emulation mode.
8213          */
8214         sd_check_emulation_mode(ssc);
8215 
8216         cmlb_alloc_handle(&un->un_cmlbhandle);
8217 
8218 #if defined(__i386) || defined(__amd64)
8219         /*
8220          * On x86, compensate for off-by-1 legacy error
8221          */
8222         if (!un->un_f_has_removable_media && !un->un_f_is_hotpluggable &&
8223             (lbasize == un->un_sys_blocksize))
8224                 offbyone = CMLB_OFF_BY_ONE;
8225 #endif
8226 
8227         if (cmlb_attach(devi, &sd_tgops, (int)devp->sd_inq->inq_dtype,
8228             VOID2BOOLEAN(un->un_f_has_removable_media != 0),
8229             VOID2BOOLEAN(un->un_f_is_hotpluggable != 0),
8230             un->un_node_type, offbyone, un->un_cmlbhandle,
8231             (void *)SD_PATH_DIRECT) != 0) {
8232                 goto cmlb_attach_failed;
8233         }
8234 
8235 
8236         /*
8237          * Read and validate the device's geometry (ie, disk label)
8238          * A new unformatted drive will not have a valid geometry, but
8239          * the driver needs to successfully attach to this device so
8240          * the drive can be formatted via ioctls.
8241          */
8242         geom_label_valid = (cmlb_validate(un->un_cmlbhandle, 0,
8243             (void *)SD_PATH_DIRECT) == 0) ? 1: 0;
8244 
8245         mutex_enter(SD_MUTEX(un));
8246 
8247         /*
8248          * Read and initialize the devid for the unit.
8249          */
8250         if (un->un_f_devid_supported) {
8251                 sd_register_devid(ssc, devi, reservation_flag);
8252         }
8253         mutex_exit(SD_MUTEX(un));
8254 
8255 #if (defined(__fibre))
8256         /*
8257          * Register callbacks for fibre only.  You can't do this solely
8258          * on the basis of the devid_type because this is hba specific.
8259          * We need to query our hba capabilities to find out whether to
8260          * register or not.
8261          */
8262         if (un->un_f_is_fibre) {
8263                 if (strcmp(un->un_node_type, DDI_NT_BLOCK_CHAN)) {
8264                         sd_init_event_callbacks(un);
8265                         SD_TRACE(SD_LOG_ATTACH_DETACH, un,
8266                             "sd_unit_attach: un:0x%p event callbacks inserted",
8267                             un);
8268                 }
8269         }
8270 #endif
8271 
8272         if (un->un_f_opt_disable_cache == TRUE) {
8273                 /*
8274                  * Disable both read cache and write cache.  This is
8275                  * the historic behavior of the keywords in the config file.
8276                  */
8277                 if (sd_cache_control(ssc, SD_CACHE_DISABLE, SD_CACHE_DISABLE) !=
8278                     0) {
8279                         SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8280                             "sd_unit_attach: un:0x%p Could not disable "
8281                             "caching", un);
8282                         goto devid_failed;
8283                 }
8284         }
8285 
8286         /*
8287          * Check the value of the WCE bit now and
8288          * set un_f_write_cache_enabled accordingly.
8289          */
8290         (void) sd_get_write_cache_enabled(ssc, &wc_enabled);
8291         mutex_enter(SD_MUTEX(un));
8292         un->un_f_write_cache_enabled = (wc_enabled != 0);
8293         mutex_exit(SD_MUTEX(un));
8294 
8295         if ((un->un_f_rmw_type != SD_RMW_TYPE_RETURN_ERROR &&
8296             un->un_tgt_blocksize != DEV_BSIZE) ||
8297             un->un_f_enable_rmw) {
8298                 if (!(un->un_wm_cache)) {
8299                         (void) snprintf(name_str, sizeof (name_str),
8300                             "%s%d_cache",
8301                             ddi_driver_name(SD_DEVINFO(un)),
8302                             ddi_get_instance(SD_DEVINFO(un)));
8303                         un->un_wm_cache = kmem_cache_create(
8304                             name_str, sizeof (struct sd_w_map),
8305                             8, sd_wm_cache_constructor,
8306                             sd_wm_cache_destructor, NULL,
8307                             (void *)un, NULL, 0);
8308                         if (!(un->un_wm_cache)) {
8309                                 goto wm_cache_failed;
8310                         }
8311                 }
8312         }
8313 
8314         /*
8315          * Check the value of the NV_SUP bit and set
8316          * un_f_suppress_cache_flush accordingly.
8317          */
8318         sd_get_nv_sup(ssc);
8319 
8320         /*
8321          * Find out what type of reservation this disk supports.
8322          */
8323         status = sd_send_scsi_PERSISTENT_RESERVE_IN(ssc, SD_READ_KEYS, 0, NULL);
8324 
8325         switch (status) {
8326         case 0:
8327                 /*
8328                  * SCSI-3 reservations are supported.
8329                  */
8330                 un->un_reservation_type = SD_SCSI3_RESERVATION;
8331                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
8332                     "sd_unit_attach: un:0x%p SCSI-3 reservations\n", un);
8333                 break;
8334         case ENOTSUP:
8335                 /*
8336                  * The PERSISTENT RESERVE IN command would not be recognized by
8337                  * a SCSI-2 device, so assume the reservation type is SCSI-2.
8338                  */
8339                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
8340                     "sd_unit_attach: un:0x%p SCSI-2 reservations\n", un);
8341                 un->un_reservation_type = SD_SCSI2_RESERVATION;
8342 
8343                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
8344                 break;
8345         default:
8346                 /*
8347                  * default to SCSI-3 reservations
8348                  */
8349                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
8350                     "sd_unit_attach: un:0x%p default SCSI3 reservations\n", un);
8351                 un->un_reservation_type = SD_SCSI3_RESERVATION;
8352 
8353                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
8354                 break;
8355         }
8356 
8357         /*
8358          * Set the pstat and error stat values here, so data obtained during the
8359          * previous attach-time routines is available.
8360          *
8361          * Note: This is a critical sequence that needs to be maintained:
8362          *      1) Instantiate the kstats before any routines using the iopath
8363          *         (i.e. sd_send_scsi_cmd).
8364          *      2) Initialize the error stats (sd_set_errstats) and partition
8365          *         stats (sd_set_pstats)here, following
8366          *         cmlb_validate_geometry(), sd_register_devid(), and
8367          *         sd_cache_control().
8368          */
8369 
8370         if (un->un_f_pkstats_enabled && geom_label_valid) {
8371                 sd_set_pstats(un);
8372                 SD_TRACE(SD_LOG_IO_PARTITION, un,
8373                     "sd_unit_attach: un:0x%p pstats created and set\n", un);
8374         }
8375 
8376         sd_set_errstats(un);
8377         SD_TRACE(SD_LOG_ATTACH_DETACH, un,
8378             "sd_unit_attach: un:0x%p errstats set\n", un);
8379 
8380 
8381         /*
8382          * After successfully attaching an instance, we record the information
8383          * of how many luns have been attached on the relative target and
8384          * controller for parallel SCSI. This information is used when sd tries
8385          * to set the tagged queuing capability in HBA.
8386          */
8387         if (SD_IS_PARALLEL_SCSI(un) && (tgt >= 0) && (tgt < NTARGETS_WIDE)) {
8388                 sd_scsi_update_lun_on_target(pdip, tgt, SD_SCSI_LUN_ATTACH);
8389         }
8390 
8391         SD_TRACE(SD_LOG_ATTACH_DETACH, un,
8392             "sd_unit_attach: un:0x%p exit success\n", un);
8393 
8394         /* Uninitialize sd_ssc_t pointer */
8395         sd_ssc_fini(ssc);
8396 
8397         return (DDI_SUCCESS);
8398 
8399         /*
8400          * An error occurred during the attach; clean up & return failure.
8401          */
8402 wm_cache_failed:
8403 devid_failed:
8404 
8405 setup_pm_failed:
8406         ddi_remove_minor_node(devi, NULL);
8407 
8408 cmlb_attach_failed:
8409         /*
8410          * Cleanup from the scsi_ifsetcap() calls (437868)
8411          */
8412         (void) scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 0, 1);
8413         (void) scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", 0, 1);
8414 
8415         /*
8416          * Refer to the comments of setting tagged-qing in the beginning of
8417          * sd_unit_attach. We can only disable tagged queuing when there is
8418          * no lun attached on the target.
8419          */
8420         if (sd_scsi_get_target_lun_count(pdip, tgt) < 1) {
8421                 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1);
8422         }
8423 
8424         if (un->un_f_is_fibre == FALSE) {
8425                 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 0, 1);
8426         }
8427 
8428 spinup_failed:
8429 
8430         /* Uninitialize sd_ssc_t pointer */
8431         sd_ssc_fini(ssc);
8432 
8433         mutex_enter(SD_MUTEX(un));
8434 
8435         /* Deallocate SCSI FMA memory spaces */
8436         kmem_free(un->un_fm_private, sizeof (struct sd_fm_internal));
8437 
8438         /* Cancel callback for SD_PATH_DIRECT_PRIORITY cmd. restart */
8439         if (un->un_direct_priority_timeid != NULL) {
8440                 timeout_id_t temp_id = un->un_direct_priority_timeid;
8441                 un->un_direct_priority_timeid = NULL;
8442                 mutex_exit(SD_MUTEX(un));
8443                 (void) untimeout(temp_id);
8444                 mutex_enter(SD_MUTEX(un));
8445         }
8446 
8447         /* Cancel any pending start/stop timeouts */
8448         if (un->un_startstop_timeid != NULL) {
8449                 timeout_id_t temp_id = un->un_startstop_timeid;
8450                 un->un_startstop_timeid = NULL;
8451                 mutex_exit(SD_MUTEX(un));
8452                 (void) untimeout(temp_id);
8453                 mutex_enter(SD_MUTEX(un));
8454         }
8455 
8456         /* Cancel any pending reset-throttle timeouts */
8457         if (un->un_reset_throttle_timeid != NULL) {
8458                 timeout_id_t temp_id = un->un_reset_throttle_timeid;
8459                 un->un_reset_throttle_timeid = NULL;
8460                 mutex_exit(SD_MUTEX(un));
8461                 (void) untimeout(temp_id);
8462                 mutex_enter(SD_MUTEX(un));
8463         }
8464 
8465         /* Cancel rmw warning message timeouts */
8466         if (un->un_rmw_msg_timeid != NULL) {
8467                 timeout_id_t temp_id = un->un_rmw_msg_timeid;
8468                 un->un_rmw_msg_timeid = NULL;
8469                 mutex_exit(SD_MUTEX(un));
8470                 (void) untimeout(temp_id);
8471                 mutex_enter(SD_MUTEX(un));
8472         }
8473 
8474         /* Cancel any pending retry timeouts */
8475         if (un->un_retry_timeid != NULL) {
8476                 timeout_id_t temp_id = un->un_retry_timeid;
8477                 un->un_retry_timeid = NULL;
8478                 mutex_exit(SD_MUTEX(un));
8479                 (void) untimeout(temp_id);
8480                 mutex_enter(SD_MUTEX(un));
8481         }
8482 
8483         /* Cancel any pending delayed cv broadcast timeouts */
8484         if (un->un_dcvb_timeid != NULL) {
8485                 timeout_id_t temp_id = un->un_dcvb_timeid;
8486                 un->un_dcvb_timeid = NULL;
8487                 mutex_exit(SD_MUTEX(un));
8488                 (void) untimeout(temp_id);
8489                 mutex_enter(SD_MUTEX(un));
8490         }
8491 
8492         mutex_exit(SD_MUTEX(un));
8493 
8494         /* There should not be any in-progress I/O so ASSERT this check */
8495         ASSERT(un->un_ncmds_in_transport == 0);
8496         ASSERT(un->un_ncmds_in_driver == 0);
8497 
8498         /* Do not free the softstate if the callback routine is active */
8499         sd_sync_with_callback(un);
8500 
8501         /*
8502          * Partition stats apparently are not used with removables. These would
8503          * not have been created during attach, so no need to clean them up...
8504          */
8505         if (un->un_errstats != NULL) {
8506                 kstat_delete(un->un_errstats);
8507                 un->un_errstats = NULL;
8508         }
8509 
8510 create_errstats_failed:
8511 
8512         if (un->un_stats != NULL) {
8513                 kstat_delete(un->un_stats);
8514                 un->un_stats = NULL;
8515         }
8516 
8517         ddi_xbuf_attr_unregister_devinfo(un->un_xbuf_attr, devi);
8518         ddi_xbuf_attr_destroy(un->un_xbuf_attr);
8519 
8520         ddi_prop_remove_all(devi);
8521         sema_destroy(&un->un_semoclose);
8522         cv_destroy(&un->un_state_cv);
8523 
8524 getrbuf_failed:
8525 
8526         sd_free_rqs(un);
8527 
8528 alloc_rqs_failed:
8529 
8530         devp->sd_private = NULL;
8531         bzero(un, sizeof (struct sd_lun));      /* Clear any stale data! */
8532 
8533 get_softstate_failed:
8534         /*
8535          * Note: the man pages are unclear as to whether or not doing a
8536          * ddi_soft_state_free(sd_state, instance) is the right way to
8537          * clean up after the ddi_soft_state_zalloc() if the subsequent
8538          * ddi_get_soft_state() fails.  The implication seems to be
8539          * that the get_soft_state cannot fail if the zalloc succeeds.
8540          */
8541 #ifndef XPV_HVM_DRIVER
8542         ddi_soft_state_free(sd_state, instance);
8543 #endif /* !XPV_HVM_DRIVER */
8544 
8545 probe_failed:
8546         scsi_unprobe(devp);
8547 
8548         return (DDI_FAILURE);
8549 }
8550 
8551 
8552 /*
8553  *    Function: sd_unit_detach
8554  *
8555  * Description: Performs DDI_DETACH processing for sddetach().
8556  *
8557  * Return Code: DDI_SUCCESS
8558  *              DDI_FAILURE
8559  *
8560  *     Context: Kernel thread context
8561  */
8562 
8563 static int
8564 sd_unit_detach(dev_info_t *devi)
8565 {
8566         struct scsi_device      *devp;
8567         struct sd_lun           *un;
8568         int                     i;
8569         int                     tgt;
8570         dev_t                   dev;
8571         dev_info_t              *pdip = ddi_get_parent(devi);
8572 #ifndef XPV_HVM_DRIVER
8573         int                     instance = ddi_get_instance(devi);
8574 #endif /* !XPV_HVM_DRIVER */
8575 
8576         mutex_enter(&sd_detach_mutex);
8577 
8578         /*
8579          * Fail the detach for any of the following:
8580          *  - Unable to get the sd_lun struct for the instance
8581          *  - A layered driver has an outstanding open on the instance
8582          *  - Another thread is already detaching this instance
8583          *  - Another thread is currently performing an open
8584          */
8585         devp = ddi_get_driver_private(devi);
8586         if ((devp == NULL) ||
8587             ((un = (struct sd_lun *)devp->sd_private) == NULL) ||
8588             (un->un_ncmds_in_driver != 0) || (un->un_layer_count != 0) ||
8589             (un->un_detach_count != 0) || (un->un_opens_in_progress != 0)) {
8590                 mutex_exit(&sd_detach_mutex);
8591                 return (DDI_FAILURE);
8592         }
8593 
8594         SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_unit_detach: entry 0x%p\n", un);
8595 
8596         /*
8597          * Mark this instance as currently in a detach, to inhibit any
8598          * opens from a layered driver.
8599          */
8600         un->un_detach_count++;
8601         mutex_exit(&sd_detach_mutex);
8602 
8603         tgt = ddi_prop_get_int(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS,
8604             SCSI_ADDR_PROP_TARGET, -1);
8605 
8606         dev = sd_make_device(SD_DEVINFO(un));
8607 
8608 #ifndef lint
8609         _NOTE(COMPETING_THREADS_NOW);
8610 #endif
8611 
8612         mutex_enter(SD_MUTEX(un));
8613 
8614         /*
8615          * Fail the detach if there are any outstanding layered
8616          * opens on this device.
8617          */
8618         for (i = 0; i < NDKMAP; i++) {
8619                 if (un->un_ocmap.lyropen[i] != 0) {
8620                         goto err_notclosed;
8621                 }
8622         }
8623 
8624         /*
8625          * Verify there are NO outstanding commands issued to this device.
8626          * ie, un_ncmds_in_transport == 0.
8627          * It's possible to have outstanding commands through the physio
8628          * code path, even though everything's closed.
8629          */
8630         if ((un->un_ncmds_in_transport != 0) || (un->un_retry_timeid != NULL) ||
8631             (un->un_direct_priority_timeid != NULL) ||
8632             (un->un_state == SD_STATE_RWAIT)) {
8633                 mutex_exit(SD_MUTEX(un));
8634                 SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8635                     "sd_dr_detach: Detach failure due to outstanding cmds\n");
8636                 goto err_stillbusy;
8637         }
8638 
8639         /*
8640          * If we have the device reserved, release the reservation.
8641          */
8642         if ((un->un_resvd_status & SD_RESERVE) &&
8643             !(un->un_resvd_status & SD_LOST_RESERVE)) {
8644                 mutex_exit(SD_MUTEX(un));
8645                 /*
8646                  * Note: sd_reserve_release sends a command to the device
8647                  * via the sd_ioctlcmd() path, and can sleep.
8648                  */
8649                 if (sd_reserve_release(dev, SD_RELEASE) != 0) {
8650                         SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8651                             "sd_dr_detach: Cannot release reservation \n");
8652                 }
8653         } else {
8654                 mutex_exit(SD_MUTEX(un));
8655         }
8656 
8657         /*
8658          * Untimeout any reserve recover, throttle reset, restart unit
8659          * and delayed broadcast timeout threads. Protect the timeout pointer
8660          * from getting nulled by their callback functions.
8661          */
8662         mutex_enter(SD_MUTEX(un));
8663         if (un->un_resvd_timeid != NULL) {
8664                 timeout_id_t temp_id = un->un_resvd_timeid;
8665                 un->un_resvd_timeid = NULL;
8666                 mutex_exit(SD_MUTEX(un));
8667                 (void) untimeout(temp_id);
8668                 mutex_enter(SD_MUTEX(un));
8669         }
8670 
8671         if (un->un_reset_throttle_timeid != NULL) {
8672                 timeout_id_t temp_id = un->un_reset_throttle_timeid;
8673                 un->un_reset_throttle_timeid = NULL;
8674                 mutex_exit(SD_MUTEX(un));
8675                 (void) untimeout(temp_id);
8676                 mutex_enter(SD_MUTEX(un));
8677         }
8678 
8679         if (un->un_startstop_timeid != NULL) {
8680                 timeout_id_t temp_id = un->un_startstop_timeid;
8681                 un->un_startstop_timeid = NULL;
8682                 mutex_exit(SD_MUTEX(un));
8683                 (void) untimeout(temp_id);
8684                 mutex_enter(SD_MUTEX(un));
8685         }
8686 
8687         if (un->un_rmw_msg_timeid != NULL) {
8688                 timeout_id_t temp_id = un->un_rmw_msg_timeid;
8689                 un->un_rmw_msg_timeid = NULL;
8690                 mutex_exit(SD_MUTEX(un));
8691                 (void) untimeout(temp_id);
8692                 mutex_enter(SD_MUTEX(un));
8693         }
8694 
8695         if (un->un_dcvb_timeid != NULL) {
8696                 timeout_id_t temp_id = un->un_dcvb_timeid;
8697                 un->un_dcvb_timeid = NULL;
8698                 mutex_exit(SD_MUTEX(un));
8699                 (void) untimeout(temp_id);
8700         } else {
8701                 mutex_exit(SD_MUTEX(un));
8702         }
8703 
8704         /* Remove any pending reservation reclaim requests for this device */
8705         sd_rmv_resv_reclaim_req(dev);
8706 
8707         mutex_enter(SD_MUTEX(un));
8708 
8709         /* Cancel any pending callbacks for SD_PATH_DIRECT_PRIORITY cmd. */
8710         if (un->un_direct_priority_timeid != NULL) {
8711                 timeout_id_t temp_id = un->un_direct_priority_timeid;
8712                 un->un_direct_priority_timeid = NULL;
8713                 mutex_exit(SD_MUTEX(un));
8714                 (void) untimeout(temp_id);
8715                 mutex_enter(SD_MUTEX(un));
8716         }
8717 
8718         /* Cancel any active multi-host disk watch thread requests */
8719         if (un->un_mhd_token != NULL) {
8720                 mutex_exit(SD_MUTEX(un));
8721                  _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_mhd_token));
8722                 if (scsi_watch_request_terminate(un->un_mhd_token,
8723                     SCSI_WATCH_TERMINATE_NOWAIT)) {
8724                         SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8725                             "sd_dr_detach: Cannot cancel mhd watch request\n");
8726                         /*
8727                          * Note: We are returning here after having removed
8728                          * some driver timeouts above. This is consistent with
8729                          * the legacy implementation but perhaps the watch
8730                          * terminate call should be made with the wait flag set.
8731                          */
8732                         goto err_stillbusy;
8733                 }
8734                 mutex_enter(SD_MUTEX(un));
8735                 un->un_mhd_token = NULL;
8736         }
8737 
8738         if (un->un_swr_token != NULL) {
8739                 mutex_exit(SD_MUTEX(un));
8740                 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_swr_token));
8741                 if (scsi_watch_request_terminate(un->un_swr_token,
8742                     SCSI_WATCH_TERMINATE_NOWAIT)) {
8743                         SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8744                             "sd_dr_detach: Cannot cancel swr watch request\n");
8745                         /*
8746                          * Note: We are returning here after having removed
8747                          * some driver timeouts above. This is consistent with
8748                          * the legacy implementation but perhaps the watch
8749                          * terminate call should be made with the wait flag set.
8750                          */
8751                         goto err_stillbusy;
8752                 }
8753                 mutex_enter(SD_MUTEX(un));
8754                 un->un_swr_token = NULL;
8755         }
8756 
8757         mutex_exit(SD_MUTEX(un));
8758 
8759         /*
8760          * Clear any scsi_reset_notifies. We clear the reset notifies
8761          * if we have not registered one.
8762          * Note: The sd_mhd_reset_notify_cb() fn tries to acquire SD_MUTEX!
8763          */
8764         (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_CANCEL,
8765             sd_mhd_reset_notify_cb, (caddr_t)un);
8766 
8767         /*
8768          * protect the timeout pointers from getting nulled by
8769          * their callback functions during the cancellation process.
8770          * In such a scenario untimeout can be invoked with a null value.
8771          */
8772         _NOTE(NO_COMPETING_THREADS_NOW);
8773 
8774         mutex_enter(&un->un_pm_mutex);
8775         if (un->un_pm_idle_timeid != NULL) {
8776                 timeout_id_t temp_id = un->un_pm_idle_timeid;
8777                 un->un_pm_idle_timeid = NULL;
8778                 mutex_exit(&un->un_pm_mutex);
8779 
8780                 /*
8781                  * Timeout is active; cancel it.
8782                  * Note that it'll never be active on a device
8783                  * that does not support PM therefore we don't
8784                  * have to check before calling pm_idle_component.
8785                  */
8786                 (void) untimeout(temp_id);
8787                 (void) pm_idle_component(SD_DEVINFO(un), 0);
8788                 mutex_enter(&un->un_pm_mutex);
8789         }
8790 
8791         /*
8792          * Check whether there is already a timeout scheduled for power
8793          * management. If yes then don't lower the power here, that's.
8794          * the timeout handler's job.
8795          */
8796         if (un->un_pm_timeid != NULL) {
8797                 timeout_id_t temp_id = un->un_pm_timeid;
8798                 un->un_pm_timeid = NULL;
8799                 mutex_exit(&un->un_pm_mutex);
8800                 /*
8801                  * Timeout is active; cancel it.
8802                  * Note that it'll never be active on a device
8803                  * that does not support PM therefore we don't
8804                  * have to check before calling pm_idle_component.
8805                  */
8806                 (void) untimeout(temp_id);
8807                 (void) pm_idle_component(SD_DEVINFO(un), 0);
8808 
8809         } else {
8810                 mutex_exit(&un->un_pm_mutex);
8811                 if ((un->un_f_pm_is_enabled == TRUE) &&
8812                     (pm_lower_power(SD_DEVINFO(un), 0, SD_PM_STATE_STOPPED(un))
8813                     != DDI_SUCCESS)) {
8814                         SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8815                     "sd_dr_detach: Lower power request failed, ignoring.\n");
8816                         /*
8817                          * Fix for bug: 4297749, item # 13
8818                          * The above test now includes a check to see if PM is
8819                          * supported by this device before call
8820                          * pm_lower_power().
8821                          * Note, the following is not dead code. The call to
8822                          * pm_lower_power above will generate a call back into
8823                          * our sdpower routine which might result in a timeout
8824                          * handler getting activated. Therefore the following
8825                          * code is valid and necessary.
8826                          */
8827                         mutex_enter(&un->un_pm_mutex);
8828                         if (un->un_pm_timeid != NULL) {
8829                                 timeout_id_t temp_id = un->un_pm_timeid;
8830                                 un->un_pm_timeid = NULL;
8831                                 mutex_exit(&un->un_pm_mutex);
8832                                 (void) untimeout(temp_id);
8833                                 (void) pm_idle_component(SD_DEVINFO(un), 0);
8834                         } else {
8835                                 mutex_exit(&un->un_pm_mutex);
8836                         }
8837                 }
8838         }
8839 
8840         /*
8841          * Cleanup from the scsi_ifsetcap() calls (437868)
8842          * Relocated here from above to be after the call to
8843          * pm_lower_power, which was getting errors.
8844          */
8845         (void) scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 0, 1);
8846         (void) scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", 0, 1);
8847 
8848         /*
8849          * Currently, tagged queuing is supported per target based by HBA.
8850          * Setting this per lun instance actually sets the capability of this
8851          * target in HBA, which affects those luns already attached on the
8852          * same target. So during detach, we can only disable this capability
8853          * only when this is the only lun left on this target. By doing
8854          * this, we assume a target has the same tagged queuing capability
8855          * for every lun. The condition can be removed when HBA is changed to
8856          * support per lun based tagged queuing capability.
8857          */
8858         if (sd_scsi_get_target_lun_count(pdip, tgt) <= 1) {
8859                 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1);
8860         }
8861 
8862         if (un->un_f_is_fibre == FALSE) {
8863                 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 0, 1);
8864         }
8865 
8866         /*
8867          * Remove any event callbacks, fibre only
8868          */
8869         if (un->un_f_is_fibre == TRUE) {
8870                 if ((un->un_insert_event != NULL) &&
8871                     (ddi_remove_event_handler(un->un_insert_cb_id) !=
8872                     DDI_SUCCESS)) {
8873                         /*
8874                          * Note: We are returning here after having done
8875                          * substantial cleanup above. This is consistent
8876                          * with the legacy implementation but this may not
8877                          * be the right thing to do.
8878                          */
8879                         SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8880                             "sd_dr_detach: Cannot cancel insert event\n");
8881                         goto err_remove_event;
8882                 }
8883                 un->un_insert_event = NULL;
8884 
8885                 if ((un->un_remove_event != NULL) &&
8886                     (ddi_remove_event_handler(un->un_remove_cb_id) !=
8887                     DDI_SUCCESS)) {
8888                         /*
8889                          * Note: We are returning here after having done
8890                          * substantial cleanup above. This is consistent
8891                          * with the legacy implementation but this may not
8892                          * be the right thing to do.
8893                          */
8894                         SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8895                             "sd_dr_detach: Cannot cancel remove event\n");
8896                         goto err_remove_event;
8897                 }
8898                 un->un_remove_event = NULL;
8899         }
8900 
8901         /* Do not free the softstate if the callback routine is active */
8902         sd_sync_with_callback(un);
8903 
8904         cmlb_detach(un->un_cmlbhandle, (void *)SD_PATH_DIRECT);
8905         cmlb_free_handle(&un->un_cmlbhandle);
8906 
8907         /*
8908          * Hold the detach mutex here, to make sure that no other threads ever
8909          * can access a (partially) freed soft state structure.
8910          */
8911         mutex_enter(&sd_detach_mutex);
8912 
8913         /*
8914          * Clean up the soft state struct.
8915          * Cleanup is done in reverse order of allocs/inits.
8916          * At this point there should be no competing threads anymore.
8917          */
8918 
8919         scsi_fm_fini(devp);
8920 
8921         /*
8922          * Deallocate memory for SCSI FMA.
8923          */
8924         kmem_free(un->un_fm_private, sizeof (struct sd_fm_internal));
8925 
8926         /*
8927          * Unregister and free device id if it was not registered
8928          * by the transport.
8929          */
8930         if (un->un_f_devid_transport_defined == FALSE)
8931                 ddi_devid_unregister(devi);
8932 
8933         /*
8934          * free the devid structure if allocated before (by ddi_devid_init()
8935          * or ddi_devid_get()).
8936          */
8937         if (un->un_devid) {
8938                 ddi_devid_free(un->un_devid);
8939                 un->un_devid = NULL;
8940         }
8941 
8942         /*
8943          * Destroy wmap cache if it exists.
8944          */
8945         if (un->un_wm_cache != NULL) {
8946                 kmem_cache_destroy(un->un_wm_cache);
8947                 un->un_wm_cache = NULL;
8948         }
8949 
8950         /*
8951          * kstat cleanup is done in detach for all device types (4363169).
8952          * We do not want to fail detach if the device kstats are not deleted
8953          * since there is a confusion about the devo_refcnt for the device.
8954          * We just delete the kstats and let detach complete successfully.
8955          */
8956         if (un->un_stats != NULL) {
8957                 kstat_delete(un->un_stats);
8958                 un->un_stats = NULL;
8959         }
8960         if (un->un_errstats != NULL) {
8961                 kstat_delete(un->un_errstats);
8962                 un->un_errstats = NULL;
8963         }
8964 
8965         /* Remove partition stats */
8966         if (un->un_f_pkstats_enabled) {
8967                 for (i = 0; i < NSDMAP; i++) {
8968                         if (un->un_pstats[i] != NULL) {
8969                                 kstat_delete(un->un_pstats[i]);
8970                                 un->un_pstats[i] = NULL;
8971                         }
8972                 }
8973         }
8974 
8975         /* Remove xbuf registration */
8976         ddi_xbuf_attr_unregister_devinfo(un->un_xbuf_attr, devi);
8977         ddi_xbuf_attr_destroy(un->un_xbuf_attr);
8978 
8979         /* Remove driver properties */
8980         ddi_prop_remove_all(devi);
8981 
8982         mutex_destroy(&un->un_pm_mutex);
8983         cv_destroy(&un->un_pm_busy_cv);
8984 
8985         cv_destroy(&un->un_wcc_cv);
8986 
8987         /* Open/close semaphore */
8988         sema_destroy(&un->un_semoclose);
8989 
8990         /* Removable media condvar. */
8991         cv_destroy(&un->un_state_cv);
8992 
8993         /* Suspend/resume condvar. */
8994         cv_destroy(&un->un_suspend_cv);
8995         cv_destroy(&un->un_disk_busy_cv);
8996 
8997         sd_free_rqs(un);
8998 
8999         /* Free up soft state */
9000         devp->sd_private = NULL;
9001 
9002         bzero(un, sizeof (struct sd_lun));
9003 #ifndef XPV_HVM_DRIVER
9004         ddi_soft_state_free(sd_state, instance);
9005 #endif /* !XPV_HVM_DRIVER */
9006 
9007         mutex_exit(&sd_detach_mutex);
9008 
9009         /* This frees up the INQUIRY data associated with the device. */
9010         scsi_unprobe(devp);
9011 
9012         /*
9013          * After successfully detaching an instance, we update the information
9014          * of how many luns have been attached in the relative target and
9015          * controller for parallel SCSI. This information is used when sd tries
9016          * to set the tagged queuing capability in HBA.
9017          * Since un has been released, we can't use SD_IS_PARALLEL_SCSI(un) to
9018          * check if the device is parallel SCSI. However, we don't need to
9019          * check here because we've already checked during attach. No device
9020          * that is not parallel SCSI is in the chain.
9021          */
9022         if ((tgt >= 0) && (tgt < NTARGETS_WIDE)) {
9023                 sd_scsi_update_lun_on_target(pdip, tgt, SD_SCSI_LUN_DETACH);
9024         }
9025 
9026         return (DDI_SUCCESS);
9027 
9028 err_notclosed:
9029         mutex_exit(SD_MUTEX(un));
9030 
9031 err_stillbusy:
9032         _NOTE(NO_COMPETING_THREADS_NOW);
9033 
9034 err_remove_event:
9035         mutex_enter(&sd_detach_mutex);
9036         un->un_detach_count--;
9037         mutex_exit(&sd_detach_mutex);
9038 
9039         SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_unit_detach: exit failure\n");
9040         return (DDI_FAILURE);
9041 }
9042 
9043 
9044 /*
9045  *    Function: sd_create_errstats
9046  *
9047  * Description: This routine instantiates the device error stats.
9048  *
9049  *              Note: During attach the stats are instantiated first so they are
9050  *              available for attach-time routines that utilize the driver
9051  *              iopath to send commands to the device. The stats are initialized
9052  *              separately so data obtained during some attach-time routines is
9053  *              available. (4362483)
9054  *
9055  *   Arguments: un - driver soft state (unit) structure
9056  *              instance - driver instance
9057  *
9058  *     Context: Kernel thread context
9059  */
9060 
9061 static void
9062 sd_create_errstats(struct sd_lun *un, int instance)
9063 {
9064         struct  sd_errstats     *stp;
9065         char    kstatmodule_err[KSTAT_STRLEN];
9066         char    kstatname[KSTAT_STRLEN];
9067         int     ndata = (sizeof (struct sd_errstats) / sizeof (kstat_named_t));
9068 
9069         ASSERT(un != NULL);
9070 
9071         if (un->un_errstats != NULL) {
9072                 return;
9073         }
9074 
9075         (void) snprintf(kstatmodule_err, sizeof (kstatmodule_err),
9076             "%serr", sd_label);
9077         (void) snprintf(kstatname, sizeof (kstatname),
9078             "%s%d,err", sd_label, instance);
9079 
9080         un->un_errstats = kstat_create(kstatmodule_err, instance, kstatname,
9081             "device_error", KSTAT_TYPE_NAMED, ndata, KSTAT_FLAG_PERSISTENT);
9082 
9083         if (un->un_errstats == NULL) {
9084                 SD_ERROR(SD_LOG_ATTACH_DETACH, un,
9085                     "sd_create_errstats: Failed kstat_create\n");
9086                 return;
9087         }
9088 
9089         stp = (struct sd_errstats *)un->un_errstats->ks_data;
9090         kstat_named_init(&stp->sd_softerrs,      "Soft Errors",
9091             KSTAT_DATA_UINT32);
9092         kstat_named_init(&stp->sd_harderrs,      "Hard Errors",
9093             KSTAT_DATA_UINT32);
9094         kstat_named_init(&stp->sd_transerrs,     "Transport Errors",
9095             KSTAT_DATA_UINT32);
9096         kstat_named_init(&stp->sd_vid,           "Vendor",
9097             KSTAT_DATA_CHAR);
9098         kstat_named_init(&stp->sd_pid,           "Product",
9099             KSTAT_DATA_CHAR);
9100         kstat_named_init(&stp->sd_revision,      "Revision",
9101             KSTAT_DATA_CHAR);
9102         kstat_named_init(&stp->sd_serial,        "Serial No",
9103             KSTAT_DATA_CHAR);
9104         kstat_named_init(&stp->sd_capacity,      "Size",
9105             KSTAT_DATA_ULONGLONG);
9106         kstat_named_init(&stp->sd_rq_media_err,  "Media Error",
9107             KSTAT_DATA_UINT32);
9108         kstat_named_init(&stp->sd_rq_ntrdy_err,  "Device Not Ready",
9109             KSTAT_DATA_UINT32);
9110         kstat_named_init(&stp->sd_rq_nodev_err,  "No Device",
9111             KSTAT_DATA_UINT32);
9112         kstat_named_init(&stp->sd_rq_recov_err,  "Recoverable",
9113             KSTAT_DATA_UINT32);
9114         kstat_named_init(&stp->sd_rq_illrq_err,  "Illegal Request",
9115             KSTAT_DATA_UINT32);
9116         kstat_named_init(&stp->sd_rq_pfa_err,    "Predictive Failure Analysis",
9117             KSTAT_DATA_UINT32);
9118 
9119         un->un_errstats->ks_private = un;
9120         un->un_errstats->ks_update  = nulldev;
9121 
9122         kstat_install(un->un_errstats);
9123 }
9124 
9125 
9126 /*
9127  *    Function: sd_set_errstats
9128  *
9129  * Description: This routine sets the value of the vendor id, product id,
9130  *              revision, serial number, and capacity device error stats.
9131  *
9132  *              Note: During attach the stats are instantiated first so they are
9133  *              available for attach-time routines that utilize the driver
9134  *              iopath to send commands to the device. The stats are initialized
9135  *              separately so data obtained during some attach-time routines is
9136  *              available. (4362483)
9137  *
9138  *   Arguments: un - driver soft state (unit) structure
9139  *
9140  *     Context: Kernel thread context
9141  */
9142 
9143 static void
9144 sd_set_errstats(struct sd_lun *un)
9145 {
9146         struct  sd_errstats     *stp;
9147         char                    *sn;
9148 
9149         ASSERT(un != NULL);
9150         ASSERT(un->un_errstats != NULL);
9151         stp = (struct sd_errstats *)un->un_errstats->ks_data;
9152         ASSERT(stp != NULL);
9153         (void) strncpy(stp->sd_vid.value.c, un->un_sd->sd_inq->inq_vid, 8);
9154         (void) strncpy(stp->sd_pid.value.c, un->un_sd->sd_inq->inq_pid, 16);
9155         (void) strncpy(stp->sd_revision.value.c,
9156             un->un_sd->sd_inq->inq_revision, 4);
9157 
9158         /*
9159          * All the errstats are persistent across detach/attach,
9160          * so reset all the errstats here in case of the hot
9161          * replacement of disk drives, except for not changed
9162          * Sun qualified drives.
9163          */
9164         if ((bcmp(&SD_INQUIRY(un)->inq_pid[9], "SUN", 3) != 0) ||
9165             (bcmp(&SD_INQUIRY(un)->inq_serial, stp->sd_serial.value.c,
9166             sizeof (SD_INQUIRY(un)->inq_serial)) != 0)) {
9167                 stp->sd_softerrs.value.ui32 = 0;
9168                 stp->sd_harderrs.value.ui32 = 0;
9169                 stp->sd_transerrs.value.ui32 = 0;
9170                 stp->sd_rq_media_err.value.ui32 = 0;
9171                 stp->sd_rq_ntrdy_err.value.ui32 = 0;
9172                 stp->sd_rq_nodev_err.value.ui32 = 0;
9173                 stp->sd_rq_recov_err.value.ui32 = 0;
9174                 stp->sd_rq_illrq_err.value.ui32 = 0;
9175                 stp->sd_rq_pfa_err.value.ui32 = 0;
9176         }
9177 
9178         /*
9179          * Set the "Serial No" kstat for Sun qualified drives (indicated by
9180          * "SUN" in bytes 25-27 of the inquiry data (bytes 9-11 of the pid)
9181          * (4376302))
9182          */
9183         if (bcmp(&SD_INQUIRY(un)->inq_pid[9], "SUN", 3) == 0) {
9184                 bcopy(&SD_INQUIRY(un)->inq_serial, stp->sd_serial.value.c,
9185                     sizeof (SD_INQUIRY(un)->inq_serial));
9186         } else {
9187                 /*
9188                  * Set the "Serial No" kstat for non-Sun qualified drives
9189                  */
9190                 if (ddi_prop_lookup_string(DDI_DEV_T_ANY, SD_DEVINFO(un),
9191                     DDI_PROP_NOTPROM | DDI_PROP_DONTPASS,
9192                     INQUIRY_SERIAL_NO, &sn) == DDI_SUCCESS) {
9193                         (void) strlcpy(stp->sd_serial.value.c, sn,
9194                             sizeof (stp->sd_serial.value.c));
9195                         ddi_prop_free(sn);
9196                 }
9197         }
9198 
9199         if (un->un_f_blockcount_is_valid != TRUE) {
9200                 /*
9201                  * Set capacity error stat to 0 for no media. This ensures
9202                  * a valid capacity is displayed in response to 'iostat -E'
9203                  * when no media is present in the device.
9204                  */
9205                 stp->sd_capacity.value.ui64 = 0;
9206         } else {
9207                 /*
9208                  * Multiply un_blockcount by un->un_sys_blocksize to get
9209                  * capacity.
9210                  *
9211                  * Note: for non-512 blocksize devices "un_blockcount" has been
9212                  * "scaled" in sd_send_scsi_READ_CAPACITY by multiplying by
9213                  * (un_tgt_blocksize / un->un_sys_blocksize).
9214                  */
9215                 stp->sd_capacity.value.ui64 = (uint64_t)
9216                     ((uint64_t)un->un_blockcount * un->un_sys_blocksize);
9217         }
9218 }
9219 
9220 
9221 /*
9222  *    Function: sd_set_pstats
9223  *
9224  * Description: This routine instantiates and initializes the partition
9225  *              stats for each partition with more than zero blocks.
9226  *              (4363169)
9227  *
9228  *   Arguments: un - driver soft state (unit) structure
9229  *
9230  *     Context: Kernel thread context
9231  */
9232 
9233 static void
9234 sd_set_pstats(struct sd_lun *un)
9235 {
9236         char    kstatname[KSTAT_STRLEN];
9237         int     instance;
9238         int     i;
9239         diskaddr_t      nblks = 0;
9240         char    *partname = NULL;
9241 
9242         ASSERT(un != NULL);
9243 
9244         instance = ddi_get_instance(SD_DEVINFO(un));
9245 
9246         /* Note:x86: is this a VTOC8/VTOC16 difference? */
9247         for (i = 0; i < NSDMAP; i++) {
9248 
9249                 if (cmlb_partinfo(un->un_cmlbhandle, i,
9250                     &nblks, NULL, &partname, NULL, (void *)SD_PATH_DIRECT) != 0)
9251                         continue;
9252                 mutex_enter(SD_MUTEX(un));
9253 
9254                 if ((un->un_pstats[i] == NULL) &&
9255                     (nblks != 0)) {
9256 
9257                         (void) snprintf(kstatname, sizeof (kstatname),
9258                             "%s%d,%s", sd_label, instance,
9259                             partname);
9260 
9261                         un->un_pstats[i] = kstat_create(sd_label,
9262                             instance, kstatname, "partition", KSTAT_TYPE_IO,
9263                             1, KSTAT_FLAG_PERSISTENT);
9264                         if (un->un_pstats[i] != NULL) {
9265                                 un->un_pstats[i]->ks_lock = SD_MUTEX(un);
9266                                 kstat_install(un->un_pstats[i]);
9267                         }
9268                 }
9269                 mutex_exit(SD_MUTEX(un));
9270         }
9271 }
9272 
9273 
9274 #if (defined(__fibre))
9275 /*
9276  *    Function: sd_init_event_callbacks
9277  *
9278  * Description: This routine initializes the insertion and removal event
9279  *              callbacks. (fibre only)
9280  *
9281  *   Arguments: un - driver soft state (unit) structure
9282  *
9283  *     Context: Kernel thread context
9284  */
9285 
9286 static void
9287 sd_init_event_callbacks(struct sd_lun *un)
9288 {
9289         ASSERT(un != NULL);
9290 
9291         if ((un->un_insert_event == NULL) &&
9292             (ddi_get_eventcookie(SD_DEVINFO(un), FCAL_INSERT_EVENT,
9293             &un->un_insert_event) == DDI_SUCCESS)) {
9294                 /*
9295                  * Add the callback for an insertion event
9296                  */
9297                 (void) ddi_add_event_handler(SD_DEVINFO(un),
9298                     un->un_insert_event, sd_event_callback, (void *)un,
9299                     &(un->un_insert_cb_id));
9300         }
9301 
9302         if ((un->un_remove_event == NULL) &&
9303             (ddi_get_eventcookie(SD_DEVINFO(un), FCAL_REMOVE_EVENT,
9304             &un->un_remove_event) == DDI_SUCCESS)) {
9305                 /*
9306                  * Add the callback for a removal event
9307                  */
9308                 (void) ddi_add_event_handler(SD_DEVINFO(un),
9309                     un->un_remove_event, sd_event_callback, (void *)un,
9310                     &(un->un_remove_cb_id));
9311         }
9312 }
9313 
9314 
9315 /*
9316  *    Function: sd_event_callback
9317  *
9318  * Description: This routine handles insert/remove events (photon). The
9319  *              state is changed to OFFLINE which can be used to supress
9320  *              error msgs. (fibre only)
9321  *
9322  *   Arguments: un - driver soft state (unit) structure
9323  *
9324  *     Context: Callout thread context
9325  */
9326 /* ARGSUSED */
9327 static void
9328 sd_event_callback(dev_info_t *dip, ddi_eventcookie_t event, void *arg,
9329     void *bus_impldata)
9330 {
9331         struct sd_lun *un = (struct sd_lun *)arg;
9332 
9333         _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_insert_event));
9334         if (event == un->un_insert_event) {
9335                 SD_TRACE(SD_LOG_COMMON, un, "sd_event_callback: insert event");
9336                 mutex_enter(SD_MUTEX(un));
9337                 if (un->un_state == SD_STATE_OFFLINE) {
9338                         if (un->un_last_state != SD_STATE_SUSPENDED) {
9339                                 un->un_state = un->un_last_state;
9340                         } else {
9341                                 /*
9342                                  * We have gone through SUSPEND/RESUME while
9343                                  * we were offline. Restore the last state
9344                                  */
9345                                 un->un_state = un->un_save_state;
9346                         }
9347                 }
9348                 mutex_exit(SD_MUTEX(un));
9349 
9350         _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_remove_event));
9351         } else if (event == un->un_remove_event) {
9352                 SD_TRACE(SD_LOG_COMMON, un, "sd_event_callback: remove event");
9353                 mutex_enter(SD_MUTEX(un));
9354                 /*
9355                  * We need to handle an event callback that occurs during
9356                  * the suspend operation, since we don't prevent it.
9357                  */
9358                 if (un->un_state != SD_STATE_OFFLINE) {
9359                         if (un->un_state != SD_STATE_SUSPENDED) {
9360                                 New_state(un, SD_STATE_OFFLINE);
9361                         } else {
9362                                 un->un_last_state = SD_STATE_OFFLINE;
9363                         }
9364                 }
9365                 mutex_exit(SD_MUTEX(un));
9366         } else {
9367                 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE,
9368                     "!Unknown event\n");
9369         }
9370 
9371 }
9372 #endif
9373 
9374 /*
9375  *    Function: sd_cache_control()
9376  *
9377  * Description: This routine is the driver entry point for setting
9378  *              read and write caching by modifying the WCE (write cache
9379  *              enable) and RCD (read cache disable) bits of mode
9380  *              page 8 (MODEPAGE_CACHING).
9381  *
9382  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
9383  *                      structure for this target.
9384  *              rcd_flag - flag for controlling the read cache
9385  *              wce_flag - flag for controlling the write cache
9386  *
9387  * Return Code: EIO
9388  *              code returned by sd_send_scsi_MODE_SENSE and
9389  *              sd_send_scsi_MODE_SELECT
9390  *
9391  *     Context: Kernel Thread
9392  */
9393 
9394 static int
9395 sd_cache_control(sd_ssc_t *ssc, int rcd_flag, int wce_flag)
9396 {
9397         struct mode_caching     *mode_caching_page;
9398         uchar_t                 *header;
9399         size_t                  buflen;
9400         int                     hdrlen;
9401         int                     bd_len;
9402         int                     rval = 0;
9403         struct mode_header_grp2 *mhp;
9404         struct sd_lun           *un;
9405         int                     status;
9406 
9407         ASSERT(ssc != NULL);
9408         un = ssc->ssc_un;
9409         ASSERT(un != NULL);
9410 
9411         /*
9412          * Do a test unit ready, otherwise a mode sense may not work if this
9413          * is the first command sent to the device after boot.
9414          */
9415         status = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
9416         if (status != 0)
9417                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9418 
9419         if (un->un_f_cfg_is_atapi == TRUE) {
9420                 hdrlen = MODE_HEADER_LENGTH_GRP2;
9421         } else {
9422                 hdrlen = MODE_HEADER_LENGTH;
9423         }
9424 
9425         /*
9426          * Allocate memory for the retrieved mode page and its headers.  Set
9427          * a pointer to the page itself.  Use mode_cache_scsi3 to insure
9428          * we get all of the mode sense data otherwise, the mode select
9429          * will fail.  mode_cache_scsi3 is a superset of mode_caching.
9430          */
9431         buflen = hdrlen + MODE_BLK_DESC_LENGTH +
9432             sizeof (struct mode_cache_scsi3);
9433 
9434         header = kmem_zalloc(buflen, KM_SLEEP);
9435 
9436         /* Get the information from the device. */
9437         if (un->un_f_cfg_is_atapi == TRUE) {
9438                 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, header, buflen,
9439                     MODEPAGE_CACHING, SD_PATH_DIRECT);
9440         } else {
9441                 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, header, buflen,
9442                     MODEPAGE_CACHING, SD_PATH_DIRECT);
9443         }
9444 
9445         if (rval != 0) {
9446                 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
9447                     "sd_cache_control: Mode Sense Failed\n");
9448                 goto mode_sense_failed;
9449         }
9450 
9451         /*
9452          * Determine size of Block Descriptors in order to locate
9453          * the mode page data. ATAPI devices return 0, SCSI devices
9454          * should return MODE_BLK_DESC_LENGTH.
9455          */
9456         if (un->un_f_cfg_is_atapi == TRUE) {
9457                 mhp     = (struct mode_header_grp2 *)header;
9458                 bd_len  = (mhp->bdesc_length_hi << 8) | mhp->bdesc_length_lo;
9459         } else {
9460                 bd_len  = ((struct mode_header *)header)->bdesc_length;
9461         }
9462 
9463         if (bd_len > MODE_BLK_DESC_LENGTH) {
9464                 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, 0,
9465                     "sd_cache_control: Mode Sense returned invalid block "
9466                     "descriptor length\n");
9467                 rval = EIO;
9468                 goto mode_sense_failed;
9469         }
9470 
9471         mode_caching_page = (struct mode_caching *)(header + hdrlen + bd_len);
9472         if (mode_caching_page->mode_page.code != MODEPAGE_CACHING) {
9473                 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON,
9474                     "sd_cache_control: Mode Sense caching page code mismatch "
9475                     "%d\n", mode_caching_page->mode_page.code);
9476                 rval = EIO;
9477                 goto mode_sense_failed;
9478         }
9479 
9480         /* Check the relevant bits on successful mode sense. */
9481         if ((mode_caching_page->rcd && rcd_flag == SD_CACHE_ENABLE) ||
9482             (!mode_caching_page->rcd && rcd_flag == SD_CACHE_DISABLE) ||
9483             (mode_caching_page->wce && wce_flag == SD_CACHE_DISABLE) ||
9484             (!mode_caching_page->wce && wce_flag == SD_CACHE_ENABLE)) {
9485 
9486                 size_t sbuflen;
9487                 uchar_t save_pg;
9488 
9489                 /*
9490                  * Construct select buffer length based on the
9491                  * length of the sense data returned.
9492                  */
9493                 sbuflen =  hdrlen + bd_len +
9494                     sizeof (struct mode_page) +
9495                     (int)mode_caching_page->mode_page.length;
9496 
9497                 /*
9498                  * Set the caching bits as requested.
9499                  */
9500                 if (rcd_flag == SD_CACHE_ENABLE)
9501                         mode_caching_page->rcd = 0;
9502                 else if (rcd_flag == SD_CACHE_DISABLE)
9503                         mode_caching_page->rcd = 1;
9504 
9505                 if (wce_flag == SD_CACHE_ENABLE)
9506                         mode_caching_page->wce = 1;
9507                 else if (wce_flag == SD_CACHE_DISABLE)
9508                         mode_caching_page->wce = 0;
9509 
9510                 /*
9511                  * Save the page if the mode sense says the
9512                  * drive supports it.
9513                  */
9514                 save_pg = mode_caching_page->mode_page.ps ?
9515                     SD_SAVE_PAGE : SD_DONTSAVE_PAGE;
9516 
9517                 /* Clear reserved bits before mode select. */
9518                 mode_caching_page->mode_page.ps = 0;
9519 
9520                 /*
9521                  * Clear out mode header for mode select.
9522                  * The rest of the retrieved page will be reused.
9523                  */
9524                 bzero(header, hdrlen);
9525 
9526                 if (un->un_f_cfg_is_atapi == TRUE) {
9527                         mhp = (struct mode_header_grp2 *)header;
9528                         mhp->bdesc_length_hi = bd_len >> 8;
9529                         mhp->bdesc_length_lo = (uchar_t)bd_len & 0xff;
9530                 } else {
9531                         ((struct mode_header *)header)->bdesc_length = bd_len;
9532                 }
9533 
9534                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9535 
9536                 /* Issue mode select to change the cache settings */
9537                 if (un->un_f_cfg_is_atapi == TRUE) {
9538                         rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP1, header,
9539                             sbuflen, save_pg, SD_PATH_DIRECT);
9540                 } else {
9541                         rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, header,
9542                             sbuflen, save_pg, SD_PATH_DIRECT);
9543                 }
9544 
9545         }
9546 
9547 
9548 mode_sense_failed:
9549 
9550         kmem_free(header, buflen);
9551 
9552         if (rval != 0) {
9553                 if (rval == EIO)
9554                         sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
9555                 else
9556                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9557         }
9558         return (rval);
9559 }
9560 
9561 
9562 /*
9563  *    Function: sd_get_write_cache_enabled()
9564  *
9565  * Description: This routine is the driver entry point for determining if
9566  *              write caching is enabled.  It examines the WCE (write cache
9567  *              enable) bits of mode page 8 (MODEPAGE_CACHING).
9568  *
9569  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
9570  *                      structure for this target.
9571  *              is_enabled - pointer to int where write cache enabled state
9572  *              is returned (non-zero -> write cache enabled)
9573  *
9574  *
9575  * Return Code: EIO
9576  *              code returned by sd_send_scsi_MODE_SENSE
9577  *
9578  *     Context: Kernel Thread
9579  *
9580  * NOTE: If ioctl is added to disable write cache, this sequence should
9581  * be followed so that no locking is required for accesses to
9582  * un->un_f_write_cache_enabled:
9583  *      do mode select to clear wce
9584  *      do synchronize cache to flush cache
9585  *      set un->un_f_write_cache_enabled = FALSE
9586  *
9587  * Conversely, an ioctl to enable the write cache should be done
9588  * in this order:
9589  *      set un->un_f_write_cache_enabled = TRUE
9590  *      do mode select to set wce
9591  */
9592 
9593 static int
9594 sd_get_write_cache_enabled(sd_ssc_t *ssc, int *is_enabled)
9595 {
9596         struct mode_caching     *mode_caching_page;
9597         uchar_t                 *header;
9598         size_t                  buflen;
9599         int                     hdrlen;
9600         int                     bd_len;
9601         int                     rval = 0;
9602         struct sd_lun           *un;
9603         int                     status;
9604 
9605         ASSERT(ssc != NULL);
9606         un = ssc->ssc_un;
9607         ASSERT(un != NULL);
9608         ASSERT(is_enabled != NULL);
9609 
9610         /* in case of error, flag as enabled */
9611         *is_enabled = TRUE;
9612 
9613         /*
9614          * Do a test unit ready, otherwise a mode sense may not work if this
9615          * is the first command sent to the device after boot.
9616          */
9617         status = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
9618 
9619         if (status != 0)
9620                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9621 
9622         if (un->un_f_cfg_is_atapi == TRUE) {
9623                 hdrlen = MODE_HEADER_LENGTH_GRP2;
9624         } else {
9625                 hdrlen = MODE_HEADER_LENGTH;
9626         }
9627 
9628         /*
9629          * Allocate memory for the retrieved mode page and its headers.  Set
9630          * a pointer to the page itself.
9631          */
9632         buflen = hdrlen + MODE_BLK_DESC_LENGTH + sizeof (struct mode_caching);
9633         header = kmem_zalloc(buflen, KM_SLEEP);
9634 
9635         /* Get the information from the device. */
9636         if (un->un_f_cfg_is_atapi == TRUE) {
9637                 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, header, buflen,
9638                     MODEPAGE_CACHING, SD_PATH_DIRECT);
9639         } else {
9640                 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, header, buflen,
9641                     MODEPAGE_CACHING, SD_PATH_DIRECT);
9642         }
9643 
9644         if (rval != 0) {
9645                 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
9646                     "sd_get_write_cache_enabled: Mode Sense Failed\n");
9647                 goto mode_sense_failed;
9648         }
9649 
9650         /*
9651          * Determine size of Block Descriptors in order to locate
9652          * the mode page data. ATAPI devices return 0, SCSI devices
9653          * should return MODE_BLK_DESC_LENGTH.
9654          */
9655         if (un->un_f_cfg_is_atapi == TRUE) {
9656                 struct mode_header_grp2 *mhp;
9657                 mhp     = (struct mode_header_grp2 *)header;
9658                 bd_len  = (mhp->bdesc_length_hi << 8) | mhp->bdesc_length_lo;
9659         } else {
9660                 bd_len  = ((struct mode_header *)header)->bdesc_length;
9661         }
9662 
9663         if (bd_len > MODE_BLK_DESC_LENGTH) {
9664                 /* FMA should make upset complain here */
9665                 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, 0,
9666                     "sd_get_write_cache_enabled: Mode Sense returned invalid "
9667                     "block descriptor length\n");
9668                 rval = EIO;
9669                 goto mode_sense_failed;
9670         }
9671 
9672         mode_caching_page = (struct mode_caching *)(header + hdrlen + bd_len);
9673         if (mode_caching_page->mode_page.code != MODEPAGE_CACHING) {
9674                 /* FMA could make upset complain here */
9675                 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON,
9676                     "sd_get_write_cache_enabled: Mode Sense caching page "
9677                     "code mismatch %d\n", mode_caching_page->mode_page.code);
9678                 rval = EIO;
9679                 goto mode_sense_failed;
9680         }
9681         *is_enabled = mode_caching_page->wce;
9682 
9683 mode_sense_failed:
9684         if (rval == 0) {
9685                 sd_ssc_assessment(ssc, SD_FMT_STANDARD);
9686         } else if (rval == EIO) {
9687                 /*
9688                  * Some disks do not support mode sense(6), we
9689                  * should ignore this kind of error(sense key is
9690                  * 0x5 - illegal request).
9691                  */
9692                 uint8_t *sensep;
9693                 int senlen;
9694 
9695                 sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf;
9696                 senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen -
9697                     ssc->ssc_uscsi_cmd->uscsi_rqresid);
9698 
9699                 if (senlen > 0 &&
9700                     scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) {
9701                         sd_ssc_assessment(ssc, SD_FMT_IGNORE_COMPROMISE);
9702                 } else {
9703                         sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
9704                 }
9705         } else {
9706                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9707         }
9708         kmem_free(header, buflen);
9709         return (rval);
9710 }
9711 
9712 /*
9713  *    Function: sd_get_nv_sup()
9714  *
9715  * Description: This routine is the driver entry point for
9716  * determining whether non-volatile cache is supported. This
9717  * determination process works as follows:
9718  *
9719  * 1. sd first queries sd.conf on whether
9720  * suppress_cache_flush bit is set for this device.
9721  *
9722  * 2. if not there, then queries the internal disk table.
9723  *
9724  * 3. if either sd.conf or internal disk table specifies
9725  * cache flush be suppressed, we don't bother checking
9726  * NV_SUP bit.
9727  *
9728  * If SUPPRESS_CACHE_FLUSH bit is not set to 1, sd queries
9729  * the optional INQUIRY VPD page 0x86. If the device
9730  * supports VPD page 0x86, sd examines the NV_SUP
9731  * (non-volatile cache support) bit in the INQUIRY VPD page
9732  * 0x86:
9733  *   o If NV_SUP bit is set, sd assumes the device has a
9734  *   non-volatile cache and set the
9735  *   un_f_sync_nv_supported to TRUE.
9736  *   o Otherwise cache is not non-volatile,
9737  *   un_f_sync_nv_supported is set to FALSE.
9738  *
9739  * Arguments: un - driver soft state (unit) structure
9740  *
9741  * Return Code:
9742  *
9743  *     Context: Kernel Thread
9744  */
9745 
9746 static void
9747 sd_get_nv_sup(sd_ssc_t *ssc)
9748 {
9749         int             rval            = 0;
9750         uchar_t         *inq86          = NULL;
9751         size_t          inq86_len       = MAX_INQUIRY_SIZE;
9752         size_t          inq86_resid     = 0;
9753         struct          dk_callback *dkc;
9754         struct sd_lun   *un;
9755 
9756         ASSERT(ssc != NULL);
9757         un = ssc->ssc_un;
9758         ASSERT(un != NULL);
9759 
9760         mutex_enter(SD_MUTEX(un));
9761 
9762         /*
9763          * Be conservative on the device's support of
9764          * SYNC_NV bit: un_f_sync_nv_supported is
9765          * initialized to be false.
9766          */
9767         un->un_f_sync_nv_supported = FALSE;
9768 
9769         /*
9770          * If either sd.conf or internal disk table
9771          * specifies cache flush be suppressed, then
9772          * we don't bother checking NV_SUP bit.
9773          */
9774         if (un->un_f_suppress_cache_flush == TRUE) {
9775                 mutex_exit(SD_MUTEX(un));
9776                 return;
9777         }
9778 
9779         if (sd_check_vpd_page_support(ssc) == 0 &&
9780             un->un_vpd_page_mask & SD_VPD_EXTENDED_DATA_PG) {
9781                 mutex_exit(SD_MUTEX(un));
9782                 /* collect page 86 data if available */
9783                 inq86 = kmem_zalloc(inq86_len, KM_SLEEP);
9784 
9785                 rval = sd_send_scsi_INQUIRY(ssc, inq86, inq86_len,
9786                     0x01, 0x86, &inq86_resid);
9787 
9788                 if (rval == 0 && (inq86_len - inq86_resid > 6)) {
9789                         SD_TRACE(SD_LOG_COMMON, un,
9790                             "sd_get_nv_sup: \
9791                             successfully get VPD page: %x \
9792                             PAGE LENGTH: %x BYTE 6: %x\n",
9793                             inq86[1], inq86[3], inq86[6]);
9794 
9795                         mutex_enter(SD_MUTEX(un));
9796                         /*
9797                          * check the value of NV_SUP bit: only if the device
9798                          * reports NV_SUP bit to be 1, the
9799                          * un_f_sync_nv_supported bit will be set to true.
9800                          */
9801                         if (inq86[6] & SD_VPD_NV_SUP) {
9802                                 un->un_f_sync_nv_supported = TRUE;
9803                         }
9804                         mutex_exit(SD_MUTEX(un));
9805                 } else if (rval != 0) {
9806                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9807                 }
9808 
9809                 kmem_free(inq86, inq86_len);
9810         } else {
9811                 mutex_exit(SD_MUTEX(un));
9812         }
9813 
9814         /*
9815          * Send a SYNC CACHE command to check whether
9816          * SYNC_NV bit is supported. This command should have
9817          * un_f_sync_nv_supported set to correct value.
9818          */
9819         mutex_enter(SD_MUTEX(un));
9820         if (un->un_f_sync_nv_supported) {
9821                 mutex_exit(SD_MUTEX(un));
9822                 dkc = kmem_zalloc(sizeof (struct dk_callback), KM_SLEEP);
9823                 dkc->dkc_flag = FLUSH_VOLATILE;
9824                 (void) sd_send_scsi_SYNCHRONIZE_CACHE(un, dkc);
9825 
9826                 /*
9827                  * Send a TEST UNIT READY command to the device. This should
9828                  * clear any outstanding UNIT ATTENTION that may be present.
9829                  */
9830                 rval = sd_send_scsi_TEST_UNIT_READY(ssc, SD_DONT_RETRY_TUR);
9831                 if (rval != 0)
9832                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9833 
9834                 kmem_free(dkc, sizeof (struct dk_callback));
9835         } else {
9836                 mutex_exit(SD_MUTEX(un));
9837         }
9838 
9839         SD_TRACE(SD_LOG_COMMON, un, "sd_get_nv_sup: \
9840             un_f_suppress_cache_flush is set to %d\n",
9841             un->un_f_suppress_cache_flush);
9842 }
9843 
9844 /*
9845  *    Function: sd_make_device
9846  *
9847  * Description: Utility routine to return the Solaris device number from
9848  *              the data in the device's dev_info structure.
9849  *
9850  * Return Code: The Solaris device number
9851  *
9852  *     Context: Any
9853  */
9854 
9855 static dev_t
9856 sd_make_device(dev_info_t *devi)
9857 {
9858         return (makedevice(ddi_driver_major(devi),
9859             ddi_get_instance(devi) << SDUNIT_SHIFT));
9860 }
9861 
9862 
9863 /*
9864  *    Function: sd_pm_entry
9865  *
9866  * Description: Called at the start of a new command to manage power
9867  *              and busy status of a device. This includes determining whether
9868  *              the current power state of the device is sufficient for
9869  *              performing the command or whether it must be changed.
9870  *              The PM framework is notified appropriately.
9871  *              Only with a return status of DDI_SUCCESS will the
9872  *              component be busy to the framework.
9873  *
9874  *              All callers of sd_pm_entry must check the return status
9875  *              and only call sd_pm_exit it it was DDI_SUCCESS. A status
9876  *              of DDI_FAILURE indicates the device failed to power up.
9877  *              In this case un_pm_count has been adjusted so the result
9878  *              on exit is still powered down, ie. count is less than 0.
9879  *              Calling sd_pm_exit with this count value hits an ASSERT.
9880  *
9881  * Return Code: DDI_SUCCESS or DDI_FAILURE
9882  *
9883  *     Context: Kernel thread context.
9884  */
9885 
9886 static int
9887 sd_pm_entry(struct sd_lun *un)
9888 {
9889         int return_status = DDI_SUCCESS;
9890 
9891         ASSERT(!mutex_owned(SD_MUTEX(un)));
9892         ASSERT(!mutex_owned(&un->un_pm_mutex));
9893 
9894         SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_entry: entry\n");
9895 
9896         if (un->un_f_pm_is_enabled == FALSE) {
9897                 SD_TRACE(SD_LOG_IO_PM, un,
9898                     "sd_pm_entry: exiting, PM not enabled\n");
9899                 return (return_status);
9900         }
9901 
9902         /*
9903          * Just increment a counter if PM is enabled. On the transition from
9904          * 0 ==> 1, mark the device as busy.  The iodone side will decrement
9905          * the count with each IO and mark the device as idle when the count
9906          * hits 0.
9907          *
9908          * If the count is less than 0 the device is powered down. If a powered
9909          * down device is successfully powered up then the count must be
9910          * incremented to reflect the power up. Note that it'll get incremented
9911          * a second time to become busy.
9912          *
9913          * Because the following has the potential to change the device state
9914          * and must release the un_pm_mutex to do so, only one thread can be
9915          * allowed through at a time.
9916          */
9917 
9918         mutex_enter(&un->un_pm_mutex);
9919         while (un->un_pm_busy == TRUE) {
9920                 cv_wait(&un->un_pm_busy_cv, &un->un_pm_mutex);
9921         }
9922         un->un_pm_busy = TRUE;
9923 
9924         if (un->un_pm_count < 1) {
9925 
9926                 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_entry: busy component\n");
9927 
9928                 /*
9929                  * Indicate we are now busy so the framework won't attempt to
9930                  * power down the device. This call will only fail if either
9931                  * we passed a bad component number or the device has no
9932                  * components. Neither of these should ever happen.
9933                  */
9934                 mutex_exit(&un->un_pm_mutex);
9935                 return_status = pm_busy_component(SD_DEVINFO(un), 0);
9936                 ASSERT(return_status == DDI_SUCCESS);
9937 
9938                 mutex_enter(&un->un_pm_mutex);
9939 
9940                 if (un->un_pm_count < 0) {
9941                         mutex_exit(&un->un_pm_mutex);
9942 
9943                         SD_TRACE(SD_LOG_IO_PM, un,
9944                             "sd_pm_entry: power up component\n");
9945 
9946                         /*
9947                          * pm_raise_power will cause sdpower to be called
9948                          * which brings the device power level to the
9949                          * desired state, If successful, un_pm_count and
9950                          * un_power_level will be updated appropriately.
9951                          */
9952                         return_status = pm_raise_power(SD_DEVINFO(un), 0,
9953                             SD_PM_STATE_ACTIVE(un));
9954 
9955                         mutex_enter(&un->un_pm_mutex);
9956 
9957                         if (return_status != DDI_SUCCESS) {
9958                                 /*
9959                                  * Power up failed.
9960                                  * Idle the device and adjust the count
9961                                  * so the result on exit is that we're
9962                                  * still powered down, ie. count is less than 0.
9963                                  */
9964                                 SD_TRACE(SD_LOG_IO_PM, un,
9965                                     "sd_pm_entry: power up failed,"
9966                                     " idle the component\n");
9967 
9968                                 (void) pm_idle_component(SD_DEVINFO(un), 0);
9969                                 un->un_pm_count--;
9970                         } else {
9971                                 /*
9972                                  * Device is powered up, verify the
9973                                  * count is non-negative.
9974                                  * This is debug only.
9975                                  */
9976                                 ASSERT(un->un_pm_count == 0);
9977                         }
9978                 }
9979 
9980                 if (return_status == DDI_SUCCESS) {
9981                         /*
9982                          * For performance, now that the device has been tagged
9983                          * as busy, and it's known to be powered up, update the
9984                          * chain types to use jump tables that do not include
9985                          * pm. This significantly lowers the overhead and
9986                          * therefore improves performance.
9987                          */
9988 
9989                         mutex_exit(&un->un_pm_mutex);
9990                         mutex_enter(SD_MUTEX(un));
9991                         SD_TRACE(SD_LOG_IO_PM, un,
9992                             "sd_pm_entry: changing uscsi_chain_type from %d\n",
9993                             un->un_uscsi_chain_type);
9994 
9995                         if (un->un_f_non_devbsize_supported) {
9996                                 un->un_buf_chain_type =
9997                                     SD_CHAIN_INFO_RMMEDIA_NO_PM;
9998                         } else {
9999                                 un->un_buf_chain_type =
10000                                     SD_CHAIN_INFO_DISK_NO_PM;
10001                         }
10002                         un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD_NO_PM;
10003 
10004                         SD_TRACE(SD_LOG_IO_PM, un,
10005                             "             changed  uscsi_chain_type to   %d\n",
10006                             un->un_uscsi_chain_type);
10007                         mutex_exit(SD_MUTEX(un));
10008                         mutex_enter(&un->un_pm_mutex);
10009 
10010                         if (un->un_pm_idle_timeid == NULL) {
10011                                 /* 300 ms. */
10012                                 un->un_pm_idle_timeid =
10013                                     timeout(sd_pm_idletimeout_handler, un,
10014                                     (drv_usectohz((clock_t)300000)));
10015                                 /*
10016                                  * Include an extra call to busy which keeps the
10017                                  * device busy with-respect-to the PM layer
10018                                  * until the timer fires, at which time it'll
10019                                  * get the extra idle call.
10020                                  */
10021                                 (void) pm_busy_component(SD_DEVINFO(un), 0);
10022                         }
10023                 }
10024         }
10025         un->un_pm_busy = FALSE;
10026         /* Next... */
10027         cv_signal(&un->un_pm_busy_cv);
10028 
10029         un->un_pm_count++;
10030 
10031         SD_TRACE(SD_LOG_IO_PM, un,
10032             "sd_pm_entry: exiting, un_pm_count = %d\n", un->un_pm_count);
10033 
10034         mutex_exit(&un->un_pm_mutex);
10035 
10036         return (return_status);
10037 }
10038 
10039 
10040 /*
10041  *    Function: sd_pm_exit
10042  *
10043  * Description: Called at the completion of a command to manage busy
10044  *              status for the device. If the device becomes idle the
10045  *              PM framework is notified.
10046  *
10047  *     Context: Kernel thread context
10048  */
10049 
10050 static void
10051 sd_pm_exit(struct sd_lun *un)
10052 {
10053         ASSERT(!mutex_owned(SD_MUTEX(un)));
10054         ASSERT(!mutex_owned(&un->un_pm_mutex));
10055 
10056         SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_exit: entry\n");
10057 
10058         /*
10059          * After attach the following flag is only read, so don't
10060          * take the penalty of acquiring a mutex for it.
10061          */
10062         if (un->un_f_pm_is_enabled == TRUE) {
10063 
10064                 mutex_enter(&un->un_pm_mutex);
10065                 un->un_pm_count--;
10066 
10067                 SD_TRACE(SD_LOG_IO_PM, un,
10068                     "sd_pm_exit: un_pm_count = %d\n", un->un_pm_count);
10069 
10070                 ASSERT(un->un_pm_count >= 0);
10071                 if (un->un_pm_count == 0) {
10072                         mutex_exit(&un->un_pm_mutex);
10073 
10074                         SD_TRACE(SD_LOG_IO_PM, un,
10075                             "sd_pm_exit: idle component\n");
10076 
10077                         (void) pm_idle_component(SD_DEVINFO(un), 0);
10078 
10079                 } else {
10080                         mutex_exit(&un->un_pm_mutex);
10081                 }
10082         }
10083 
10084         SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_exit: exiting\n");
10085 }
10086 
10087 
10088 /*
10089  *    Function: sdopen
10090  *
10091  * Description: Driver's open(9e) entry point function.
10092  *
10093  *   Arguments: dev_i   - pointer to device number
10094  *              flag    - how to open file (FEXCL, FNDELAY, FREAD, FWRITE)
10095  *              otyp    - open type (OTYP_BLK, OTYP_CHR, OTYP_LYR)
10096  *              cred_p  - user credential pointer
10097  *
10098  * Return Code: EINVAL
10099  *              ENXIO
10100  *              EIO
10101  *              EROFS
10102  *              EBUSY
10103  *
10104  *     Context: Kernel thread context
10105  */
10106 /* ARGSUSED */
10107 static int
10108 sdopen(dev_t *dev_p, int flag, int otyp, cred_t *cred_p)
10109 {
10110         struct sd_lun   *un;
10111         int             nodelay;
10112         int             part;
10113         uint64_t        partmask;
10114         int             instance;
10115         dev_t           dev;
10116         int             rval = EIO;
10117         diskaddr_t      nblks = 0;
10118         diskaddr_t      label_cap;
10119 
10120         /* Validate the open type */
10121         if (otyp >= OTYPCNT) {
10122                 return (EINVAL);
10123         }
10124 
10125         dev = *dev_p;
10126         instance = SDUNIT(dev);
10127         mutex_enter(&sd_detach_mutex);
10128 
10129         /*
10130          * Fail the open if there is no softstate for the instance, or
10131          * if another thread somewhere is trying to detach the instance.
10132          */
10133         if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) ||
10134             (un->un_detach_count != 0)) {
10135                 mutex_exit(&sd_detach_mutex);
10136                 /*
10137                  * The probe cache only needs to be cleared when open (9e) fails
10138                  * with ENXIO (4238046).
10139                  */
10140                 /*
10141                  * un-conditionally clearing probe cache is ok with
10142                  * separate sd/ssd binaries
10143                  * x86 platform can be an issue with both parallel
10144                  * and fibre in 1 binary
10145                  */
10146                 sd_scsi_clear_probe_cache();
10147                 return (ENXIO);
10148         }
10149 
10150         /*
10151          * The un_layer_count is to prevent another thread in specfs from
10152          * trying to detach the instance, which can happen when we are
10153          * called from a higher-layer driver instead of thru specfs.
10154          * This will not be needed when DDI provides a layered driver
10155          * interface that allows specfs to know that an instance is in
10156          * use by a layered driver & should not be detached.
10157          *
10158          * Note: the semantics for layered driver opens are exactly one
10159          * close for every open.
10160          */
10161         if (otyp == OTYP_LYR) {
10162                 un->un_layer_count++;
10163         }
10164 
10165         /*
10166          * Keep a count of the current # of opens in progress. This is because
10167          * some layered drivers try to call us as a regular open. This can
10168          * cause problems that we cannot prevent, however by keeping this count
10169          * we can at least keep our open and detach routines from racing against
10170          * each other under such conditions.
10171          */
10172         un->un_opens_in_progress++;
10173         mutex_exit(&sd_detach_mutex);
10174 
10175         nodelay  = (flag & (FNDELAY | FNONBLOCK));
10176         part     = SDPART(dev);
10177         partmask = 1 << part;
10178 
10179         /*
10180          * We use a semaphore here in order to serialize
10181          * open and close requests on the device.
10182          */
10183         sema_p(&un->un_semoclose);
10184 
10185         mutex_enter(SD_MUTEX(un));
10186 
10187         /*
10188          * All device accesses go thru sdstrategy() where we check
10189          * on suspend status but there could be a scsi_poll command,
10190          * which bypasses sdstrategy(), so we need to check pm
10191          * status.
10192          */
10193 
10194         if (!nodelay) {
10195                 while ((un->un_state == SD_STATE_SUSPENDED) ||
10196                     (un->un_state == SD_STATE_PM_CHANGING)) {
10197                         cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
10198                 }
10199 
10200                 mutex_exit(SD_MUTEX(un));
10201                 if (sd_pm_entry(un) != DDI_SUCCESS) {
10202                         rval = EIO;
10203                         SD_ERROR(SD_LOG_OPEN_CLOSE, un,
10204                             "sdopen: sd_pm_entry failed\n");
10205                         goto open_failed_with_pm;
10206                 }
10207                 mutex_enter(SD_MUTEX(un));
10208         }
10209 
10210         /* check for previous exclusive open */
10211         SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: un=%p\n", (void *)un);
10212         SD_TRACE(SD_LOG_OPEN_CLOSE, un,
10213             "sdopen: exclopen=%x, flag=%x, regopen=%x\n",
10214             un->un_exclopen, flag, un->un_ocmap.regopen[otyp]);
10215 
10216         if (un->un_exclopen & (partmask)) {
10217                 goto excl_open_fail;
10218         }
10219 
10220         if (flag & FEXCL) {
10221                 int i;
10222                 if (un->un_ocmap.lyropen[part]) {
10223                         goto excl_open_fail;
10224                 }
10225                 for (i = 0; i < (OTYPCNT - 1); i++) {
10226                         if (un->un_ocmap.regopen[i] & (partmask)) {
10227                                 goto excl_open_fail;
10228                         }
10229                 }
10230         }
10231 
10232         /*
10233          * Check the write permission if this is a removable media device,
10234          * NDELAY has not been set, and writable permission is requested.
10235          *
10236          * Note: If NDELAY was set and this is write-protected media the WRITE
10237          * attempt will fail with EIO as part of the I/O processing. This is a
10238          * more permissive implementation that allows the open to succeed and
10239          * WRITE attempts to fail when appropriate.
10240          */
10241         if (un->un_f_chk_wp_open) {
10242                 if ((flag & FWRITE) && (!nodelay)) {
10243                         mutex_exit(SD_MUTEX(un));
10244                         /*
10245                          * Defer the check for write permission on writable
10246                          * DVD drive till sdstrategy and will not fail open even
10247                          * if FWRITE is set as the device can be writable
10248                          * depending upon the media and the media can change
10249                          * after the call to open().
10250                          */
10251                         if (un->un_f_dvdram_writable_device == FALSE) {
10252                                 if (ISCD(un) || sr_check_wp(dev)) {
10253                                 rval = EROFS;
10254                                 mutex_enter(SD_MUTEX(un));
10255                                 SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: "
10256                                     "write to cd or write protected media\n");
10257                                 goto open_fail;
10258                                 }
10259                         }
10260                         mutex_enter(SD_MUTEX(un));
10261                 }
10262         }
10263 
10264         /*
10265          * If opening in NDELAY/NONBLOCK mode, just return.
10266          * Check if disk is ready and has a valid geometry later.
10267          */
10268         if (!nodelay) {
10269                 sd_ssc_t        *ssc;
10270 
10271                 mutex_exit(SD_MUTEX(un));
10272                 ssc = sd_ssc_init(un);
10273                 rval = sd_ready_and_valid(ssc, part);
10274                 sd_ssc_fini(ssc);
10275                 mutex_enter(SD_MUTEX(un));
10276                 /*
10277                  * Fail if device is not ready or if the number of disk
10278                  * blocks is zero or negative for non CD devices.
10279                  */
10280 
10281                 nblks = 0;
10282 
10283                 if (rval == SD_READY_VALID && (!ISCD(un))) {
10284                         /* if cmlb_partinfo fails, nblks remains 0 */
10285                         mutex_exit(SD_MUTEX(un));
10286                         (void) cmlb_partinfo(un->un_cmlbhandle, part, &nblks,
10287                             NULL, NULL, NULL, (void *)SD_PATH_DIRECT);
10288                         mutex_enter(SD_MUTEX(un));
10289                 }
10290 
10291                 if ((rval != SD_READY_VALID) ||
10292                     (!ISCD(un) && nblks <= 0)) {
10293                         rval = un->un_f_has_removable_media ? ENXIO : EIO;
10294                         SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: "
10295                             "device not ready or invalid disk block value\n");
10296                         goto open_fail;
10297                 }
10298 #if defined(__i386) || defined(__amd64)
10299         } else {
10300                 uchar_t *cp;
10301                 /*
10302                  * x86 requires special nodelay handling, so that p0 is
10303                  * always defined and accessible.
10304                  * Invalidate geometry only if device is not already open.
10305                  */
10306                 cp = &un->un_ocmap.chkd[0];
10307                 while (cp < &un->un_ocmap.chkd[OCSIZE]) {
10308                         if (*cp != (uchar_t)0) {
10309                                 break;
10310                         }
10311                         cp++;
10312                 }
10313                 if (cp == &un->un_ocmap.chkd[OCSIZE]) {
10314                         mutex_exit(SD_MUTEX(un));
10315                         cmlb_invalidate(un->un_cmlbhandle,
10316                             (void *)SD_PATH_DIRECT);
10317                         mutex_enter(SD_MUTEX(un));
10318                 }
10319 
10320 #endif
10321         }
10322 
10323         if (otyp == OTYP_LYR) {
10324                 un->un_ocmap.lyropen[part]++;
10325         } else {
10326                 un->un_ocmap.regopen[otyp] |= partmask;
10327         }
10328 
10329         /* Set up open and exclusive open flags */
10330         if (flag & FEXCL) {
10331                 un->un_exclopen |= (partmask);
10332         }
10333 
10334         /*
10335          * If the lun is EFI labeled and lun capacity is greater than the
10336          * capacity contained in the label, log a sys-event to notify the
10337          * interested module.
10338          * To avoid an infinite loop of logging sys-event, we only log the
10339          * event when the lun is not opened in NDELAY mode. The event handler
10340          * should open the lun in NDELAY mode.
10341          */
10342         if (!nodelay) {
10343                 mutex_exit(SD_MUTEX(un));
10344                 if (cmlb_efi_label_capacity(un->un_cmlbhandle, &label_cap,
10345                     (void*)SD_PATH_DIRECT) == 0) {
10346                         mutex_enter(SD_MUTEX(un));
10347                         if (un->un_f_blockcount_is_valid &&
10348                             un->un_blockcount > label_cap &&
10349                             un->un_f_expnevent == B_FALSE) {
10350                                 un->un_f_expnevent = B_TRUE;
10351                                 mutex_exit(SD_MUTEX(un));
10352                                 sd_log_lun_expansion_event(un,
10353                                     (nodelay ? KM_NOSLEEP : KM_SLEEP));
10354                                 mutex_enter(SD_MUTEX(un));
10355                         }
10356                 } else {
10357                         mutex_enter(SD_MUTEX(un));
10358                 }
10359         }
10360 
10361         SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: "
10362             "open of part %d type %d\n", part, otyp);
10363 
10364         mutex_exit(SD_MUTEX(un));
10365         if (!nodelay) {
10366                 sd_pm_exit(un);
10367         }
10368 
10369         sema_v(&un->un_semoclose);
10370 
10371         mutex_enter(&sd_detach_mutex);
10372         un->un_opens_in_progress--;
10373         mutex_exit(&sd_detach_mutex);
10374 
10375         SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: exit success\n");
10376         return (DDI_SUCCESS);
10377 
10378 excl_open_fail:
10379         SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: fail exclusive open\n");
10380         rval = EBUSY;
10381 
10382 open_fail:
10383         mutex_exit(SD_MUTEX(un));
10384 
10385         /*
10386          * On a failed open we must exit the pm management.
10387          */
10388         if (!nodelay) {
10389                 sd_pm_exit(un);
10390         }
10391 open_failed_with_pm:
10392         sema_v(&un->un_semoclose);
10393 
10394         mutex_enter(&sd_detach_mutex);
10395         un->un_opens_in_progress--;
10396         if (otyp == OTYP_LYR) {
10397                 un->un_layer_count--;
10398         }
10399         mutex_exit(&sd_detach_mutex);
10400 
10401         return (rval);
10402 }
10403 
10404 
10405 /*
10406  *    Function: sdclose
10407  *
10408  * Description: Driver's close(9e) entry point function.
10409  *
10410  *   Arguments: dev    - device number
10411  *              flag   - file status flag, informational only
10412  *              otyp   - close type (OTYP_BLK, OTYP_CHR, OTYP_LYR)
10413  *              cred_p - user credential pointer
10414  *
10415  * Return Code: ENXIO
10416  *
10417  *     Context: Kernel thread context
10418  */
10419 /* ARGSUSED */
10420 static int
10421 sdclose(dev_t dev, int flag, int otyp, cred_t *cred_p)
10422 {
10423         struct sd_lun   *un;
10424         uchar_t         *cp;
10425         int             part;
10426         int             nodelay;
10427         int             rval = 0;
10428 
10429         /* Validate the open type */
10430         if (otyp >= OTYPCNT) {
10431                 return (ENXIO);
10432         }
10433 
10434         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
10435                 return (ENXIO);
10436         }
10437 
10438         part = SDPART(dev);
10439         nodelay = flag & (FNDELAY | FNONBLOCK);
10440 
10441         SD_TRACE(SD_LOG_OPEN_CLOSE, un,
10442             "sdclose: close of part %d type %d\n", part, otyp);
10443 
10444         /*
10445          * We use a semaphore here in order to serialize
10446          * open and close requests on the device.
10447          */
10448         sema_p(&un->un_semoclose);
10449 
10450         mutex_enter(SD_MUTEX(un));
10451 
10452         /* Don't proceed if power is being changed. */
10453         while (un->un_state == SD_STATE_PM_CHANGING) {
10454                 cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
10455         }
10456 
10457         if (un->un_exclopen & (1 << part)) {
10458                 un->un_exclopen &= ~(1 << part);
10459         }
10460 
10461         /* Update the open partition map */
10462         if (otyp == OTYP_LYR) {
10463                 un->un_ocmap.lyropen[part] -= 1;
10464         } else {
10465                 un->un_ocmap.regopen[otyp] &= ~(1 << part);
10466         }
10467 
10468         cp = &un->un_ocmap.chkd[0];
10469         while (cp < &un->un_ocmap.chkd[OCSIZE]) {
10470                 if (*cp != NULL) {
10471                         break;
10472                 }
10473                 cp++;
10474         }
10475 
10476         if (cp == &un->un_ocmap.chkd[OCSIZE]) {
10477                 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdclose: last close\n");
10478 
10479                 /*
10480                  * We avoid persistance upon the last close, and set
10481                  * the throttle back to the maximum.
10482                  */
10483                 un->un_throttle = un->un_saved_throttle;
10484 
10485                 if (un->un_state == SD_STATE_OFFLINE) {
10486                         if (un->un_f_is_fibre == FALSE) {
10487                                 scsi_log(SD_DEVINFO(un), sd_label,
10488                                     CE_WARN, "offline\n");
10489                         }
10490                         mutex_exit(SD_MUTEX(un));
10491                         cmlb_invalidate(un->un_cmlbhandle,
10492                             (void *)SD_PATH_DIRECT);
10493                         mutex_enter(SD_MUTEX(un));
10494 
10495                 } else {
10496                         /*
10497                          * Flush any outstanding writes in NVRAM cache.
10498                          * Note: SYNCHRONIZE CACHE is an optional SCSI-2
10499                          * cmd, it may not work for non-Pluto devices.
10500                          * SYNCHRONIZE CACHE is not required for removables,
10501                          * except DVD-RAM drives.
10502                          *
10503                          * Also note: because SYNCHRONIZE CACHE is currently
10504                          * the only command issued here that requires the
10505                          * drive be powered up, only do the power up before
10506                          * sending the Sync Cache command. If additional
10507                          * commands are added which require a powered up
10508                          * drive, the following sequence may have to change.
10509                          *
10510                          * And finally, note that parallel SCSI on SPARC
10511                          * only issues a Sync Cache to DVD-RAM, a newly
10512                          * supported device.
10513                          */
10514 #if defined(__i386) || defined(__amd64)
10515                         if ((un->un_f_sync_cache_supported &&
10516                             un->un_f_sync_cache_required) ||
10517                             un->un_f_dvdram_writable_device == TRUE) {
10518 #else
10519                         if (un->un_f_dvdram_writable_device == TRUE) {
10520 #endif
10521                                 mutex_exit(SD_MUTEX(un));
10522                                 if (sd_pm_entry(un) == DDI_SUCCESS) {
10523                                         rval =
10524                                             sd_send_scsi_SYNCHRONIZE_CACHE(un,
10525                                             NULL);
10526                                         /* ignore error if not supported */
10527                                         if (rval == ENOTSUP) {
10528                                                 rval = 0;
10529                                         } else if (rval != 0) {
10530                                                 rval = EIO;
10531                                         }
10532                                         sd_pm_exit(un);
10533                                 } else {
10534                                         rval = EIO;
10535                                 }
10536                                 mutex_enter(SD_MUTEX(un));
10537                         }
10538 
10539                         /*
10540                          * For devices which supports DOOR_LOCK, send an ALLOW
10541                          * MEDIA REMOVAL command, but don't get upset if it
10542                          * fails. We need to raise the power of the drive before
10543                          * we can call sd_send_scsi_DOORLOCK()
10544                          */
10545                         if (un->un_f_doorlock_supported) {
10546                                 mutex_exit(SD_MUTEX(un));
10547                                 if (sd_pm_entry(un) == DDI_SUCCESS) {
10548                                         sd_ssc_t        *ssc;
10549 
10550                                         ssc = sd_ssc_init(un);
10551                                         rval = sd_send_scsi_DOORLOCK(ssc,
10552                                             SD_REMOVAL_ALLOW, SD_PATH_DIRECT);
10553                                         if (rval != 0)
10554                                                 sd_ssc_assessment(ssc,
10555                                                     SD_FMT_IGNORE);
10556                                         sd_ssc_fini(ssc);
10557 
10558                                         sd_pm_exit(un);
10559                                         if (ISCD(un) && (rval != 0) &&
10560                                             (nodelay != 0)) {
10561                                                 rval = ENXIO;
10562                                         }
10563                                 } else {
10564                                         rval = EIO;
10565                                 }
10566                                 mutex_enter(SD_MUTEX(un));
10567                         }
10568 
10569                         /*
10570                          * If a device has removable media, invalidate all
10571                          * parameters related to media, such as geometry,
10572                          * blocksize, and blockcount.
10573                          */
10574                         if (un->un_f_has_removable_media) {
10575                                 sr_ejected(un);
10576                         }
10577 
10578                         /*
10579                          * Destroy the cache (if it exists) which was
10580                          * allocated for the write maps since this is
10581                          * the last close for this media.
10582                          */
10583                         if (un->un_wm_cache) {
10584                                 /*
10585                                  * Check if there are pending commands.
10586                                  * and if there are give a warning and
10587                                  * do not destroy the cache.
10588                                  */
10589                                 if (un->un_ncmds_in_driver > 0) {
10590                                         scsi_log(SD_DEVINFO(un),
10591                                             sd_label, CE_WARN,
10592                                             "Unable to clean up memory "
10593                                             "because of pending I/O\n");
10594                                 } else {
10595                                         kmem_cache_destroy(
10596                                             un->un_wm_cache);
10597                                         un->un_wm_cache = NULL;
10598                                 }
10599                         }
10600                 }
10601         }
10602 
10603         mutex_exit(SD_MUTEX(un));
10604         sema_v(&un->un_semoclose);
10605 
10606         if (otyp == OTYP_LYR) {
10607                 mutex_enter(&sd_detach_mutex);
10608                 /*
10609                  * The detach routine may run when the layer count
10610                  * drops to zero.
10611                  */
10612                 un->un_layer_count--;
10613                 mutex_exit(&sd_detach_mutex);
10614         }
10615 
10616         return (rval);
10617 }
10618 
10619 
10620 /*
10621  *    Function: sd_ready_and_valid
10622  *
10623  * Description: Test if device is ready and has a valid geometry.
10624  *
10625  *   Arguments: ssc - sd_ssc_t will contain un
10626  *              un  - driver soft state (unit) structure
10627  *
10628  * Return Code: SD_READY_VALID          ready and valid label
10629  *              SD_NOT_READY_VALID      not ready, no label
10630  *              SD_RESERVED_BY_OTHERS   reservation conflict
10631  *
10632  *     Context: Never called at interrupt context.
10633  */
10634 
10635 static int
10636 sd_ready_and_valid(sd_ssc_t *ssc, int part)
10637 {
10638         struct sd_errstats      *stp;
10639         uint64_t                capacity;
10640         uint_t                  lbasize;
10641         int                     rval = SD_READY_VALID;
10642         char                    name_str[48];
10643         boolean_t               is_valid;
10644         struct sd_lun           *un;
10645         int                     status;
10646 
10647         ASSERT(ssc != NULL);
10648         un = ssc->ssc_un;
10649         ASSERT(un != NULL);
10650         ASSERT(!mutex_owned(SD_MUTEX(un)));
10651 
10652         mutex_enter(SD_MUTEX(un));
10653         /*
10654          * If a device has removable media, we must check if media is
10655          * ready when checking if this device is ready and valid.
10656          */
10657         if (un->un_f_has_removable_media) {
10658                 mutex_exit(SD_MUTEX(un));
10659                 status = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
10660 
10661                 if (status != 0) {
10662                         rval = SD_NOT_READY_VALID;
10663                         mutex_enter(SD_MUTEX(un));
10664 
10665                         /* Ignore all failed status for removalbe media */
10666                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
10667 
10668                         goto done;
10669                 }
10670 
10671                 is_valid = SD_IS_VALID_LABEL(un);
10672                 mutex_enter(SD_MUTEX(un));
10673                 if (!is_valid ||
10674                     (un->un_f_blockcount_is_valid == FALSE) ||
10675                     (un->un_f_tgt_blocksize_is_valid == FALSE)) {
10676 
10677                         /* capacity has to be read every open. */
10678                         mutex_exit(SD_MUTEX(un));
10679                         status = sd_send_scsi_READ_CAPACITY(ssc, &capacity,
10680                             &lbasize, SD_PATH_DIRECT);
10681 
10682                         if (status != 0) {
10683                                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
10684 
10685                                 cmlb_invalidate(un->un_cmlbhandle,
10686                                     (void *)SD_PATH_DIRECT);
10687                                 mutex_enter(SD_MUTEX(un));
10688                                 rval = SD_NOT_READY_VALID;
10689 
10690                                 goto done;
10691                         } else {
10692                                 mutex_enter(SD_MUTEX(un));
10693                                 sd_update_block_info(un, lbasize, capacity);
10694                         }
10695                 }
10696 
10697                 /*
10698                  * Check if the media in the device is writable or not.
10699                  */
10700                 if (!is_valid && ISCD(un)) {
10701                         sd_check_for_writable_cd(ssc, SD_PATH_DIRECT);
10702                 }
10703 
10704         } else {
10705                 /*
10706                  * Do a test unit ready to clear any unit attention from non-cd
10707                  * devices.
10708                  */
10709                 mutex_exit(SD_MUTEX(un));
10710 
10711                 status = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
10712                 if (status != 0) {
10713                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
10714                 }
10715 
10716                 mutex_enter(SD_MUTEX(un));
10717         }
10718 
10719 
10720         /*
10721          * If this is a non 512 block device, allocate space for
10722          * the wmap cache. This is being done here since every time
10723          * a media is changed this routine will be called and the
10724          * block size is a function of media rather than device.
10725          */
10726         if (((un->un_f_rmw_type != SD_RMW_TYPE_RETURN_ERROR ||
10727             un->un_f_non_devbsize_supported) &&
10728             un->un_tgt_blocksize != DEV_BSIZE) ||
10729             un->un_f_enable_rmw) {
10730                 if (!(un->un_wm_cache)) {
10731                         (void) snprintf(name_str, sizeof (name_str),
10732                             "%s%d_cache",
10733                             ddi_driver_name(SD_DEVINFO(un)),
10734                             ddi_get_instance(SD_DEVINFO(un)));
10735                         un->un_wm_cache = kmem_cache_create(
10736                             name_str, sizeof (struct sd_w_map),
10737                             8, sd_wm_cache_constructor,
10738                             sd_wm_cache_destructor, NULL,
10739                             (void *)un, NULL, 0);
10740                         if (!(un->un_wm_cache)) {
10741                                 rval = ENOMEM;
10742                                 goto done;
10743                         }
10744                 }
10745         }
10746 
10747         if (un->un_state == SD_STATE_NORMAL) {
10748                 /*
10749                  * If the target is not yet ready here (defined by a TUR
10750                  * failure), invalidate the geometry and print an 'offline'
10751                  * message. This is a legacy message, as the state of the
10752                  * target is not actually changed to SD_STATE_OFFLINE.
10753                  *
10754                  * If the TUR fails for EACCES (Reservation Conflict),
10755                  * SD_RESERVED_BY_OTHERS will be returned to indicate
10756                  * reservation conflict. If the TUR fails for other
10757                  * reasons, SD_NOT_READY_VALID will be returned.
10758                  */
10759                 int err;
10760 
10761                 mutex_exit(SD_MUTEX(un));
10762                 err = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
10763                 mutex_enter(SD_MUTEX(un));
10764 
10765                 if (err != 0) {
10766                         mutex_exit(SD_MUTEX(un));
10767                         cmlb_invalidate(un->un_cmlbhandle,
10768                             (void *)SD_PATH_DIRECT);
10769                         mutex_enter(SD_MUTEX(un));
10770                         if (err == EACCES) {
10771                                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
10772                                     "reservation conflict\n");
10773                                 rval = SD_RESERVED_BY_OTHERS;
10774                                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
10775                         } else {
10776                                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
10777                                     "drive offline\n");
10778                                 rval = SD_NOT_READY_VALID;
10779                                 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
10780                         }
10781                         goto done;
10782                 }
10783         }
10784 
10785         if (un->un_f_format_in_progress == FALSE) {
10786                 mutex_exit(SD_MUTEX(un));
10787 
10788                 (void) cmlb_validate(un->un_cmlbhandle, 0,
10789                     (void *)SD_PATH_DIRECT);
10790                 if (cmlb_partinfo(un->un_cmlbhandle, part, NULL, NULL, NULL,
10791                     NULL, (void *) SD_PATH_DIRECT) != 0) {
10792                         rval = SD_NOT_READY_VALID;
10793                         mutex_enter(SD_MUTEX(un));
10794 
10795                         goto done;
10796                 }
10797                 if (un->un_f_pkstats_enabled) {
10798                         sd_set_pstats(un);
10799                         SD_TRACE(SD_LOG_IO_PARTITION, un,
10800                             "sd_ready_and_valid: un:0x%p pstats created and "
10801                             "set\n", un);
10802                 }
10803                 mutex_enter(SD_MUTEX(un));
10804         }
10805 
10806         /*
10807          * If this device supports DOOR_LOCK command, try and send
10808          * this command to PREVENT MEDIA REMOVAL, but don't get upset
10809          * if it fails. For a CD, however, it is an error
10810          */
10811         if (un->un_f_doorlock_supported) {
10812                 mutex_exit(SD_MUTEX(un));
10813                 status = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT,
10814                     SD_PATH_DIRECT);
10815 
10816                 if ((status != 0) && ISCD(un)) {
10817                         rval = SD_NOT_READY_VALID;
10818                         mutex_enter(SD_MUTEX(un));
10819 
10820                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
10821 
10822                         goto done;
10823                 } else if (status != 0)
10824                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
10825                 mutex_enter(SD_MUTEX(un));
10826         }
10827 
10828         /* The state has changed, inform the media watch routines */
10829         un->un_mediastate = DKIO_INSERTED;
10830         cv_broadcast(&un->un_state_cv);
10831         rval = SD_READY_VALID;
10832 
10833 done:
10834 
10835         /*
10836          * Initialize the capacity kstat value, if no media previously
10837          * (capacity kstat is 0) and a media has been inserted
10838          * (un_blockcount > 0).
10839          */
10840         if (un->un_errstats != NULL) {
10841                 stp = (struct sd_errstats *)un->un_errstats->ks_data;
10842                 if ((stp->sd_capacity.value.ui64 == 0) &&
10843                     (un->un_f_blockcount_is_valid == TRUE)) {
10844                         stp->sd_capacity.value.ui64 =
10845                             (uint64_t)((uint64_t)un->un_blockcount *
10846                             un->un_sys_blocksize);
10847                 }
10848         }
10849 
10850         mutex_exit(SD_MUTEX(un));
10851         return (rval);
10852 }
10853 
10854 
10855 /*
10856  *    Function: sdmin
10857  *
10858  * Description: Routine to limit the size of a data transfer. Used in
10859  *              conjunction with physio(9F).
10860  *
10861  *   Arguments: bp - pointer to the indicated buf(9S) struct.
10862  *
10863  *     Context: Kernel thread context.
10864  */
10865 
10866 static void
10867 sdmin(struct buf *bp)
10868 {
10869         struct sd_lun   *un;
10870         int             instance;
10871 
10872         instance = SDUNIT(bp->b_edev);
10873 
10874         un = ddi_get_soft_state(sd_state, instance);
10875         ASSERT(un != NULL);
10876 
10877         /*
10878          * We depend on buf breakup to restrict
10879          * IO size if it is enabled.
10880          */
10881         if (un->un_buf_breakup_supported) {
10882                 return;
10883         }
10884 
10885         if (bp->b_bcount > un->un_max_xfer_size) {
10886                 bp->b_bcount = un->un_max_xfer_size;
10887         }
10888 }
10889 
10890 
10891 /*
10892  *    Function: sdread
10893  *
10894  * Description: Driver's read(9e) entry point function.
10895  *
10896  *   Arguments: dev   - device number
10897  *              uio   - structure pointer describing where data is to be stored
10898  *                      in user's space
10899  *              cred_p  - user credential pointer
10900  *
10901  * Return Code: ENXIO
10902  *              EIO
10903  *              EINVAL
10904  *              value returned by physio
10905  *
10906  *     Context: Kernel thread context.
10907  */
10908 /* ARGSUSED */
10909 static int
10910 sdread(dev_t dev, struct uio *uio, cred_t *cred_p)
10911 {
10912         struct sd_lun   *un = NULL;
10913         int             secmask;
10914         int             err = 0;
10915         sd_ssc_t        *ssc;
10916 
10917         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
10918                 return (ENXIO);
10919         }
10920 
10921         ASSERT(!mutex_owned(SD_MUTEX(un)));
10922 
10923 
10924         if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) {
10925                 mutex_enter(SD_MUTEX(un));
10926                 /*
10927                  * Because the call to sd_ready_and_valid will issue I/O we
10928                  * must wait here if either the device is suspended or
10929                  * if it's power level is changing.
10930                  */
10931                 while ((un->un_state == SD_STATE_SUSPENDED) ||
10932                     (un->un_state == SD_STATE_PM_CHANGING)) {
10933                         cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
10934                 }
10935                 un->un_ncmds_in_driver++;
10936                 mutex_exit(SD_MUTEX(un));
10937 
10938                 /* Initialize sd_ssc_t for internal uscsi commands */
10939                 ssc = sd_ssc_init(un);
10940                 if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) {
10941                         err = EIO;
10942                 } else {
10943                         err = 0;
10944                 }
10945                 sd_ssc_fini(ssc);
10946 
10947                 mutex_enter(SD_MUTEX(un));
10948                 un->un_ncmds_in_driver--;
10949                 ASSERT(un->un_ncmds_in_driver >= 0);
10950                 mutex_exit(SD_MUTEX(un));
10951                 if (err != 0)
10952                         return (err);
10953         }
10954 
10955         /*
10956          * Read requests are restricted to multiples of the system block size.
10957          */
10958         if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR &&
10959             !un->un_f_enable_rmw)
10960                 secmask = un->un_tgt_blocksize - 1;
10961         else
10962                 secmask = DEV_BSIZE - 1;
10963 
10964         if (uio->uio_loffset & ((offset_t)(secmask))) {
10965                 SD_ERROR(SD_LOG_READ_WRITE, un,
10966                     "sdread: file offset not modulo %d\n",
10967                     secmask + 1);
10968                 err = EINVAL;
10969         } else if (uio->uio_iov->iov_len & (secmask)) {
10970                 SD_ERROR(SD_LOG_READ_WRITE, un,
10971                     "sdread: transfer length not modulo %d\n",
10972                     secmask + 1);
10973                 err = EINVAL;
10974         } else {
10975                 err = physio(sdstrategy, NULL, dev, B_READ, sdmin, uio);
10976         }
10977 
10978         return (err);
10979 }
10980 
10981 
10982 /*
10983  *    Function: sdwrite
10984  *
10985  * Description: Driver's write(9e) entry point function.
10986  *
10987  *   Arguments: dev   - device number
10988  *              uio   - structure pointer describing where data is stored in
10989  *                      user's space
10990  *              cred_p  - user credential pointer
10991  *
10992  * Return Code: ENXIO
10993  *              EIO
10994  *              EINVAL
10995  *              value returned by physio
10996  *
10997  *     Context: Kernel thread context.
10998  */
10999 /* ARGSUSED */
11000 static int
11001 sdwrite(dev_t dev, struct uio *uio, cred_t *cred_p)
11002 {
11003         struct sd_lun   *un = NULL;
11004         int             secmask;
11005         int             err = 0;
11006         sd_ssc_t        *ssc;
11007 
11008         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
11009                 return (ENXIO);
11010         }
11011 
11012         ASSERT(!mutex_owned(SD_MUTEX(un)));
11013 
11014         if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) {
11015                 mutex_enter(SD_MUTEX(un));
11016                 /*
11017                  * Because the call to sd_ready_and_valid will issue I/O we
11018                  * must wait here if either the device is suspended or
11019                  * if it's power level is changing.
11020                  */
11021                 while ((un->un_state == SD_STATE_SUSPENDED) ||
11022                     (un->un_state == SD_STATE_PM_CHANGING)) {
11023                         cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
11024                 }
11025                 un->un_ncmds_in_driver++;
11026                 mutex_exit(SD_MUTEX(un));
11027 
11028                 /* Initialize sd_ssc_t for internal uscsi commands */
11029                 ssc = sd_ssc_init(un);
11030                 if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) {
11031                         err = EIO;
11032                 } else {
11033                         err = 0;
11034                 }
11035                 sd_ssc_fini(ssc);
11036 
11037                 mutex_enter(SD_MUTEX(un));
11038                 un->un_ncmds_in_driver--;
11039                 ASSERT(un->un_ncmds_in_driver >= 0);
11040                 mutex_exit(SD_MUTEX(un));
11041                 if (err != 0)
11042                         return (err);
11043         }
11044 
11045         /*
11046          * Write requests are restricted to multiples of the system block size.
11047          */
11048         if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR &&
11049             !un->un_f_enable_rmw)
11050                 secmask = un->un_tgt_blocksize - 1;
11051         else
11052                 secmask = DEV_BSIZE - 1;
11053 
11054         if (uio->uio_loffset & ((offset_t)(secmask))) {
11055                 SD_ERROR(SD_LOG_READ_WRITE, un,
11056                     "sdwrite: file offset not modulo %d\n",
11057                     secmask + 1);
11058                 err = EINVAL;
11059         } else if (uio->uio_iov->iov_len & (secmask)) {
11060                 SD_ERROR(SD_LOG_READ_WRITE, un,
11061                     "sdwrite: transfer length not modulo %d\n",
11062                     secmask + 1);
11063                 err = EINVAL;
11064         } else {
11065                 err = physio(sdstrategy, NULL, dev, B_WRITE, sdmin, uio);
11066         }
11067 
11068         return (err);
11069 }
11070 
11071 
11072 /*
11073  *    Function: sdaread
11074  *
11075  * Description: Driver's aread(9e) entry point function.
11076  *
11077  *   Arguments: dev   - device number
11078  *              aio   - structure pointer describing where data is to be stored
11079  *              cred_p  - user credential pointer
11080  *
11081  * Return Code: ENXIO
11082  *              EIO
11083  *              EINVAL
11084  *              value returned by aphysio
11085  *
11086  *     Context: Kernel thread context.
11087  */
11088 /* ARGSUSED */
11089 static int
11090 sdaread(dev_t dev, struct aio_req *aio, cred_t *cred_p)
11091 {
11092         struct sd_lun   *un = NULL;
11093         struct uio      *uio = aio->aio_uio;
11094         int             secmask;
11095         int             err = 0;
11096         sd_ssc_t        *ssc;
11097 
11098         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
11099                 return (ENXIO);
11100         }
11101 
11102         ASSERT(!mutex_owned(SD_MUTEX(un)));
11103 
11104         if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) {
11105                 mutex_enter(SD_MUTEX(un));
11106                 /*
11107                  * Because the call to sd_ready_and_valid will issue I/O we
11108                  * must wait here if either the device is suspended or
11109                  * if it's power level is changing.
11110                  */
11111                 while ((un->un_state == SD_STATE_SUSPENDED) ||
11112                     (un->un_state == SD_STATE_PM_CHANGING)) {
11113                         cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
11114                 }
11115                 un->un_ncmds_in_driver++;
11116                 mutex_exit(SD_MUTEX(un));
11117 
11118                 /* Initialize sd_ssc_t for internal uscsi commands */
11119                 ssc = sd_ssc_init(un);
11120                 if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) {
11121                         err = EIO;
11122                 } else {
11123                         err = 0;
11124                 }
11125                 sd_ssc_fini(ssc);
11126 
11127                 mutex_enter(SD_MUTEX(un));
11128                 un->un_ncmds_in_driver--;
11129                 ASSERT(un->un_ncmds_in_driver >= 0);
11130                 mutex_exit(SD_MUTEX(un));
11131                 if (err != 0)
11132                         return (err);
11133         }
11134 
11135         /*
11136          * Read requests are restricted to multiples of the system block size.
11137          */
11138         if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR &&
11139             !un->un_f_enable_rmw)
11140                 secmask = un->un_tgt_blocksize - 1;
11141         else
11142                 secmask = DEV_BSIZE - 1;
11143 
11144         if (uio->uio_loffset & ((offset_t)(secmask))) {
11145                 SD_ERROR(SD_LOG_READ_WRITE, un,
11146                     "sdaread: file offset not modulo %d\n",
11147                     secmask + 1);
11148                 err = EINVAL;
11149         } else if (uio->uio_iov->iov_len & (secmask)) {
11150                 SD_ERROR(SD_LOG_READ_WRITE, un,
11151                     "sdaread: transfer length not modulo %d\n",
11152                     secmask + 1);
11153                 err = EINVAL;
11154         } else {
11155                 err = aphysio(sdstrategy, anocancel, dev, B_READ, sdmin, aio);
11156         }
11157 
11158         return (err);
11159 }
11160 
11161 
11162 /*
11163  *    Function: sdawrite
11164  *
11165  * Description: Driver's awrite(9e) entry point function.
11166  *
11167  *   Arguments: dev   - device number
11168  *              aio   - structure pointer describing where data is stored
11169  *              cred_p  - user credential pointer
11170  *
11171  * Return Code: ENXIO
11172  *              EIO
11173  *              EINVAL
11174  *              value returned by aphysio
11175  *
11176  *     Context: Kernel thread context.
11177  */
11178 /* ARGSUSED */
11179 static int
11180 sdawrite(dev_t dev, struct aio_req *aio, cred_t *cred_p)
11181 {
11182         struct sd_lun   *un = NULL;
11183         struct uio      *uio = aio->aio_uio;
11184         int             secmask;
11185         int             err = 0;
11186         sd_ssc_t        *ssc;
11187 
11188         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
11189                 return (ENXIO);
11190         }
11191 
11192         ASSERT(!mutex_owned(SD_MUTEX(un)));
11193 
11194         if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) {
11195                 mutex_enter(SD_MUTEX(un));
11196                 /*
11197                  * Because the call to sd_ready_and_valid will issue I/O we
11198                  * must wait here if either the device is suspended or
11199                  * if it's power level is changing.
11200                  */
11201                 while ((un->un_state == SD_STATE_SUSPENDED) ||
11202                     (un->un_state == SD_STATE_PM_CHANGING)) {
11203                         cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
11204                 }
11205                 un->un_ncmds_in_driver++;
11206                 mutex_exit(SD_MUTEX(un));
11207 
11208                 /* Initialize sd_ssc_t for internal uscsi commands */
11209                 ssc = sd_ssc_init(un);
11210                 if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) {
11211                         err = EIO;
11212                 } else {
11213                         err = 0;
11214                 }
11215                 sd_ssc_fini(ssc);
11216 
11217                 mutex_enter(SD_MUTEX(un));
11218                 un->un_ncmds_in_driver--;
11219                 ASSERT(un->un_ncmds_in_driver >= 0);
11220                 mutex_exit(SD_MUTEX(un));
11221                 if (err != 0)
11222                         return (err);
11223         }
11224 
11225         /*
11226          * Write requests are restricted to multiples of the system block size.
11227          */
11228         if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR &&
11229             !un->un_f_enable_rmw)
11230                 secmask = un->un_tgt_blocksize - 1;
11231         else
11232                 secmask = DEV_BSIZE - 1;
11233 
11234         if (uio->uio_loffset & ((offset_t)(secmask))) {
11235                 SD_ERROR(SD_LOG_READ_WRITE, un,
11236                     "sdawrite: file offset not modulo %d\n",
11237                     secmask + 1);
11238                 err = EINVAL;
11239         } else if (uio->uio_iov->iov_len & (secmask)) {
11240                 SD_ERROR(SD_LOG_READ_WRITE, un,
11241                     "sdawrite: transfer length not modulo %d\n",
11242                     secmask + 1);
11243                 err = EINVAL;
11244         } else {
11245                 err = aphysio(sdstrategy, anocancel, dev, B_WRITE, sdmin, aio);
11246         }
11247 
11248         return (err);
11249 }
11250 
11251 
11252 
11253 
11254 
11255 /*
11256  * Driver IO processing follows the following sequence:
11257  *
11258  *     sdioctl(9E)     sdstrategy(9E)         biodone(9F)
11259  *         |                |                     ^
11260  *         v                v                     |
11261  * sd_send_scsi_cmd()  ddi_xbuf_qstrategy()       +-------------------+
11262  *         |                |                     |                   |
11263  *         v                |                     |                   |
11264  * sd_uscsi_strategy() sd_xbuf_strategy()   sd_buf_iodone()   sd_uscsi_iodone()
11265  *         |                |                     ^                   ^
11266  *         v                v                     |                   |
11267  * SD_BEGIN_IOSTART()  SD_BEGIN_IOSTART()         |                   |
11268  *         |                |                     |                   |
11269  *     +---+                |                     +------------+      +-------+
11270  *     |                    |                                  |              |
11271  *     |   SD_NEXT_IOSTART()|                  SD_NEXT_IODONE()|              |
11272  *     |                    v                                  |              |
11273  *     |         sd_mapblockaddr_iostart()           sd_mapblockaddr_iodone() |
11274  *     |                    |                                  ^              |
11275  *     |   SD_NEXT_IOSTART()|                  SD_NEXT_IODONE()|              |
11276  *     |                    v                                  |              |
11277  *     |         sd_mapblocksize_iostart()           sd_mapblocksize_iodone() |
11278  *     |                    |                                  ^              |
11279  *     |   SD_NEXT_IOSTART()|                  SD_NEXT_IODONE()|              |
11280  *     |                    v                                  |              |
11281  *     |           sd_checksum_iostart()               sd_checksum_iodone()   |
11282  *     |                    |                                  ^              |
11283  *     +-> SD_NEXT_IOSTART()|                  SD_NEXT_IODONE()+------------->+
11284  *     |                    v                                  |              |
11285  *     |              sd_pm_iostart()                     sd_pm_iodone()      |
11286  *     |                    |                                  ^              |
11287  *     |                    |                                  |              |
11288  *     +-> SD_NEXT_IOSTART()|               SD_BEGIN_IODONE()--+--------------+
11289  *                          |                           ^
11290  *                          v                           |
11291  *                   sd_core_iostart()                  |
11292  *                          |                           |
11293  *                          |                           +------>(*destroypkt)()
11294  *                          +-> sd_start_cmds() <-+     |           |
11295  *                          |                     |     |           v
11296  *                          |                     |     |  scsi_destroy_pkt(9F)
11297  *                          |                     |     |
11298  *                          +->(*initpkt)()       +- sdintr()
11299  *                          |  |                        |  |
11300  *                          |  +-> scsi_init_pkt(9F)    |  +-> sd_handle_xxx()
11301  *                          |  +-> scsi_setup_cdb(9F)   |
11302  *                          |                           |
11303  *                          +--> scsi_transport(9F)     |
11304  *                                     |                |
11305  *                                     +----> SCSA ---->+
11306  *
11307  *
11308  * This code is based upon the following presumptions:
11309  *
11310  *   - iostart and iodone functions operate on buf(9S) structures. These
11311  *     functions perform the necessary operations on the buf(9S) and pass
11312  *     them along to the next function in the chain by using the macros
11313  *     SD_NEXT_IOSTART() (for iostart side functions) and SD_NEXT_IODONE()
11314  *     (for iodone side functions).
11315  *
11316  *   - The iostart side functions may sleep. The iodone side functions
11317  *     are called under interrupt context and may NOT sleep. Therefore
11318  *     iodone side functions also may not call iostart side functions.
11319  *     (NOTE: iostart side functions should NOT sleep for memory, as
11320  *     this could result in deadlock.)
11321  *
11322  *   - An iostart side function may call its corresponding iodone side
11323  *     function directly (if necessary).
11324  *
11325  *   - In the event of an error, an iostart side function can return a buf(9S)
11326  *     to its caller by calling SD_BEGIN_IODONE() (after setting B_ERROR and
11327  *     b_error in the usual way of course).
11328  *
11329  *   - The taskq mechanism may be used by the iodone side functions to dispatch
11330  *     requests to the iostart side functions.  The iostart side functions in
11331  *     this case would be called under the context of a taskq thread, so it's
11332  *     OK for them to block/sleep/spin in this case.
11333  *
11334  *   - iostart side functions may allocate "shadow" buf(9S) structs and
11335  *     pass them along to the next function in the chain.  The corresponding
11336  *     iodone side functions must coalesce the "shadow" bufs and return
11337  *     the "original" buf to the next higher layer.
11338  *
11339  *   - The b_private field of the buf(9S) struct holds a pointer to
11340  *     an sd_xbuf struct, which contains information needed to
11341  *     construct the scsi_pkt for the command.
11342  *
11343  *   - The SD_MUTEX(un) is NOT held across calls to the next layer. Each
11344  *     layer must acquire & release the SD_MUTEX(un) as needed.
11345  */
11346 
11347 
11348 /*
11349  * Create taskq for all targets in the system. This is created at
11350  * _init(9E) and destroyed at _fini(9E).
11351  *
11352  * Note: here we set the minalloc to a reasonably high number to ensure that
11353  * we will have an adequate supply of task entries available at interrupt time.
11354  * This is used in conjunction with the TASKQ_PREPOPULATE flag in
11355  * sd_create_taskq().  Since we do not want to sleep for allocations at
11356  * interrupt time, set maxalloc equal to minalloc. That way we will just fail
11357  * the command if we ever try to dispatch more than SD_TASKQ_MAXALLOC taskq
11358  * requests any one instant in time.
11359  */
11360 #define SD_TASKQ_NUMTHREADS     8
11361 #define SD_TASKQ_MINALLOC       256
11362 #define SD_TASKQ_MAXALLOC       256
11363 
11364 static taskq_t  *sd_tq = NULL;
11365 _NOTE(SCHEME_PROTECTS_DATA("stable data", sd_tq))
11366 
11367 static int      sd_taskq_minalloc = SD_TASKQ_MINALLOC;
11368 static int      sd_taskq_maxalloc = SD_TASKQ_MAXALLOC;
11369 
11370 /*
11371  * The following task queue is being created for the write part of
11372  * read-modify-write of non-512 block size devices.
11373  * Limit the number of threads to 1 for now. This number has been chosen
11374  * considering the fact that it applies only to dvd ram drives/MO drives
11375  * currently. Performance for which is not main criteria at this stage.
11376  * Note: It needs to be explored if we can use a single taskq in future
11377  */
11378 #define SD_WMR_TASKQ_NUMTHREADS 1
11379 static taskq_t  *sd_wmr_tq = NULL;
11380 _NOTE(SCHEME_PROTECTS_DATA("stable data", sd_wmr_tq))
11381 
11382 /*
11383  *    Function: sd_taskq_create
11384  *
11385  * Description: Create taskq thread(s) and preallocate task entries
11386  *
11387  * Return Code: Returns a pointer to the allocated taskq_t.
11388  *
11389  *     Context: Can sleep. Requires blockable context.
11390  *
11391  *       Notes: - The taskq() facility currently is NOT part of the DDI.
11392  *                (definitely NOT recommeded for 3rd-party drivers!) :-)
11393  *              - taskq_create() will block for memory, also it will panic
11394  *                if it cannot create the requested number of threads.
11395  *              - Currently taskq_create() creates threads that cannot be
11396  *                swapped.
11397  *              - We use TASKQ_PREPOPULATE to ensure we have an adequate
11398  *                supply of taskq entries at interrupt time (ie, so that we
11399  *                do not have to sleep for memory)
11400  */
11401 
11402 static void
11403 sd_taskq_create(void)
11404 {
11405         char    taskq_name[TASKQ_NAMELEN];
11406 
11407         ASSERT(sd_tq == NULL);
11408         ASSERT(sd_wmr_tq == NULL);
11409 
11410         (void) snprintf(taskq_name, sizeof (taskq_name),
11411             "%s_drv_taskq", sd_label);
11412         sd_tq = (taskq_create(taskq_name, SD_TASKQ_NUMTHREADS,
11413             (v.v_maxsyspri - 2), sd_taskq_minalloc, sd_taskq_maxalloc,
11414             TASKQ_PREPOPULATE));
11415 
11416         (void) snprintf(taskq_name, sizeof (taskq_name),
11417             "%s_rmw_taskq", sd_label);
11418         sd_wmr_tq = (taskq_create(taskq_name, SD_WMR_TASKQ_NUMTHREADS,
11419             (v.v_maxsyspri - 2), sd_taskq_minalloc, sd_taskq_maxalloc,
11420             TASKQ_PREPOPULATE));
11421 }
11422 
11423 
11424 /*
11425  *    Function: sd_taskq_delete
11426  *
11427  * Description: Complementary cleanup routine for sd_taskq_create().
11428  *
11429  *     Context: Kernel thread context.
11430  */
11431 
11432 static void
11433 sd_taskq_delete(void)
11434 {
11435         ASSERT(sd_tq != NULL);
11436         ASSERT(sd_wmr_tq != NULL);
11437         taskq_destroy(sd_tq);
11438         taskq_destroy(sd_wmr_tq);
11439         sd_tq = NULL;
11440         sd_wmr_tq = NULL;
11441 }
11442 
11443 
11444 /*
11445  *    Function: sdstrategy
11446  *
11447  * Description: Driver's strategy (9E) entry point function.
11448  *
11449  *   Arguments: bp - pointer to buf(9S)
11450  *
11451  * Return Code: Always returns zero
11452  *
11453  *     Context: Kernel thread context.
11454  */
11455 
11456 static int
11457 sdstrategy(struct buf *bp)
11458 {
11459         struct sd_lun *un;
11460 
11461         un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp));
11462         if (un == NULL) {
11463                 bioerror(bp, EIO);
11464                 bp->b_resid = bp->b_bcount;
11465                 biodone(bp);
11466                 return (0);
11467         }
11468 
11469         /* As was done in the past, fail new cmds. if state is dumping. */
11470         if (un->un_state == SD_STATE_DUMPING) {
11471                 bioerror(bp, ENXIO);
11472                 bp->b_resid = bp->b_bcount;
11473                 biodone(bp);
11474                 return (0);
11475         }
11476 
11477         ASSERT(!mutex_owned(SD_MUTEX(un)));
11478 
11479         /*
11480          * Commands may sneak in while we released the mutex in
11481          * DDI_SUSPEND, we should block new commands. However, old
11482          * commands that are still in the driver at this point should
11483          * still be allowed to drain.
11484          */
11485         mutex_enter(SD_MUTEX(un));
11486         /*
11487          * Must wait here if either the device is suspended or
11488          * if it's power level is changing.
11489          */
11490         while ((un->un_state == SD_STATE_SUSPENDED) ||
11491             (un->un_state == SD_STATE_PM_CHANGING)) {
11492                 cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
11493         }
11494 
11495         un->un_ncmds_in_driver++;
11496 
11497         /*
11498          * atapi: Since we are running the CD for now in PIO mode we need to
11499          * call bp_mapin here to avoid bp_mapin called interrupt context under
11500          * the HBA's init_pkt routine.
11501          */
11502         if (un->un_f_cfg_is_atapi == TRUE) {
11503                 mutex_exit(SD_MUTEX(un));
11504                 bp_mapin(bp);
11505                 mutex_enter(SD_MUTEX(un));
11506         }
11507         SD_INFO(SD_LOG_IO, un, "sdstrategy: un_ncmds_in_driver = %ld\n",
11508             un->un_ncmds_in_driver);
11509 
11510         if (bp->b_flags & B_WRITE)
11511                 un->un_f_sync_cache_required = TRUE;
11512 
11513         mutex_exit(SD_MUTEX(un));
11514 
11515         /*
11516          * This will (eventually) allocate the sd_xbuf area and
11517          * call sd_xbuf_strategy().  We just want to return the
11518          * result of ddi_xbuf_qstrategy so that we have an opt-
11519          * imized tail call which saves us a stack frame.
11520          */
11521         return (ddi_xbuf_qstrategy(bp, un->un_xbuf_attr));
11522 }
11523 
11524 
11525 /*
11526  *    Function: sd_xbuf_strategy
11527  *
11528  * Description: Function for initiating IO operations via the
11529  *              ddi_xbuf_qstrategy() mechanism.
11530  *
11531  *     Context: Kernel thread context.
11532  */
11533 
11534 static void
11535 sd_xbuf_strategy(struct buf *bp, ddi_xbuf_t xp, void *arg)
11536 {
11537         struct sd_lun *un = arg;
11538 
11539         ASSERT(bp != NULL);
11540         ASSERT(xp != NULL);
11541         ASSERT(un != NULL);
11542         ASSERT(!mutex_owned(SD_MUTEX(un)));
11543 
11544         /*
11545          * Initialize the fields in the xbuf and save a pointer to the
11546          * xbuf in bp->b_private.
11547          */
11548         sd_xbuf_init(un, bp, xp, SD_CHAIN_BUFIO, NULL);
11549 
11550         /* Send the buf down the iostart chain */
11551         SD_BEGIN_IOSTART(((struct sd_xbuf *)xp)->xb_chain_iostart, un, bp);
11552 }
11553 
11554 
11555 /*
11556  *    Function: sd_xbuf_init
11557  *
11558  * Description: Prepare the given sd_xbuf struct for use.
11559  *
11560  *   Arguments: un - ptr to softstate
11561  *              bp - ptr to associated buf(9S)
11562  *              xp - ptr to associated sd_xbuf
11563  *              chain_type - IO chain type to use:
11564  *                      SD_CHAIN_NULL
11565  *                      SD_CHAIN_BUFIO
11566  *                      SD_CHAIN_USCSI
11567  *                      SD_CHAIN_DIRECT
11568  *                      SD_CHAIN_DIRECT_PRIORITY
11569  *              pktinfop - ptr to private data struct for scsi_pkt(9S)
11570  *                      initialization; may be NULL if none.
11571  *
11572  *     Context: Kernel thread context
11573  */
11574 
11575 static void
11576 sd_xbuf_init(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
11577         uchar_t chain_type, void *pktinfop)
11578 {
11579         int index;
11580 
11581         ASSERT(un != NULL);
11582         ASSERT(bp != NULL);
11583         ASSERT(xp != NULL);
11584 
11585         SD_INFO(SD_LOG_IO, un, "sd_xbuf_init: buf:0x%p chain type:0x%x\n",
11586             bp, chain_type);
11587 
11588         xp->xb_un    = un;
11589         xp->xb_pktp  = NULL;
11590         xp->xb_pktinfo       = pktinfop;
11591         xp->xb_private       = bp->b_private;
11592         xp->xb_blkno = (daddr_t)bp->b_blkno;
11593 
11594         /*
11595          * Set up the iostart and iodone chain indexes in the xbuf, based
11596          * upon the specified chain type to use.
11597          */
11598         switch (chain_type) {
11599         case SD_CHAIN_NULL:
11600                 /*
11601                  * Fall thru to just use the values for the buf type, even
11602                  * tho for the NULL chain these values will never be used.
11603                  */
11604                 /* FALLTHRU */
11605         case SD_CHAIN_BUFIO:
11606                 index = un->un_buf_chain_type;
11607                 if ((!un->un_f_has_removable_media) &&
11608                     (un->un_tgt_blocksize != 0) &&
11609                     (un->un_tgt_blocksize != DEV_BSIZE ||
11610                     un->un_f_enable_rmw)) {
11611                         int secmask = 0, blknomask = 0;
11612                         if (un->un_f_enable_rmw) {
11613                                 blknomask =
11614                                     (un->un_phy_blocksize / DEV_BSIZE) - 1;
11615                                 secmask = un->un_phy_blocksize - 1;
11616                         } else {
11617                                 blknomask =
11618                                     (un->un_tgt_blocksize / DEV_BSIZE) - 1;
11619                                 secmask = un->un_tgt_blocksize - 1;
11620                         }
11621 
11622                         if ((bp->b_lblkno & (blknomask)) ||
11623                             (bp->b_bcount & (secmask))) {
11624                                 if ((un->un_f_rmw_type !=
11625                                     SD_RMW_TYPE_RETURN_ERROR) ||
11626                                     un->un_f_enable_rmw) {
11627                                         if (un->un_f_pm_is_enabled == FALSE)
11628                                                 index =
11629                                                     SD_CHAIN_INFO_MSS_DSK_NO_PM;
11630                                         else
11631                                                 index =
11632                                                     SD_CHAIN_INFO_MSS_DISK;
11633                                 }
11634                         }
11635                 }
11636                 break;
11637         case SD_CHAIN_USCSI:
11638                 index = un->un_uscsi_chain_type;
11639                 break;
11640         case SD_CHAIN_DIRECT:
11641                 index = un->un_direct_chain_type;
11642                 break;
11643         case SD_CHAIN_DIRECT_PRIORITY:
11644                 index = un->un_priority_chain_type;
11645                 break;
11646         default:
11647                 /* We're really broken if we ever get here... */
11648                 panic("sd_xbuf_init: illegal chain type!");
11649                 /*NOTREACHED*/
11650         }
11651 
11652         xp->xb_chain_iostart = sd_chain_index_map[index].sci_iostart_index;
11653         xp->xb_chain_iodone = sd_chain_index_map[index].sci_iodone_index;
11654 
11655         /*
11656          * It might be a bit easier to simply bzero the entire xbuf above,
11657          * but it turns out that since we init a fair number of members anyway,
11658          * we save a fair number cycles by doing explicit assignment of zero.
11659          */
11660         xp->xb_pkt_flags     = 0;
11661         xp->xb_dma_resid     = 0;
11662         xp->xb_retry_count   = 0;
11663         xp->xb_victim_retry_count = 0;
11664         xp->xb_ua_retry_count        = 0;
11665         xp->xb_nr_retry_count        = 0;
11666         xp->xb_sense_bp              = NULL;
11667         xp->xb_sense_status  = 0;
11668         xp->xb_sense_state   = 0;
11669         xp->xb_sense_resid   = 0;
11670         xp->xb_ena           = 0;
11671 
11672         bp->b_private        = xp;
11673         bp->b_flags  &= ~(B_DONE | B_ERROR);
11674         bp->b_resid  = 0;
11675         bp->av_forw  = NULL;
11676         bp->av_back  = NULL;
11677         bioerror(bp, 0);
11678 
11679         SD_INFO(SD_LOG_IO, un, "sd_xbuf_init: done.\n");
11680 }
11681 
11682 
11683 /*
11684  *    Function: sd_uscsi_strategy
11685  *
11686  * Description: Wrapper for calling into the USCSI chain via physio(9F)
11687  *
11688  *   Arguments: bp - buf struct ptr
11689  *
11690  * Return Code: Always returns 0
11691  *
11692  *     Context: Kernel thread context
11693  */
11694 
11695 static int
11696 sd_uscsi_strategy(struct buf *bp)
11697 {
11698         struct sd_lun           *un;
11699         struct sd_uscsi_info    *uip;
11700         struct sd_xbuf          *xp;
11701         uchar_t                 chain_type;
11702         uchar_t                 cmd;
11703 
11704         ASSERT(bp != NULL);
11705 
11706         un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp));
11707         if (un == NULL) {
11708                 bioerror(bp, EIO);
11709                 bp->b_resid = bp->b_bcount;
11710                 biodone(bp);
11711                 return (0);
11712         }
11713 
11714         ASSERT(!mutex_owned(SD_MUTEX(un)));
11715 
11716         SD_TRACE(SD_LOG_IO, un, "sd_uscsi_strategy: entry: buf:0x%p\n", bp);
11717 
11718         /*
11719          * A pointer to a struct sd_uscsi_info is expected in bp->b_private
11720          */
11721         ASSERT(bp->b_private != NULL);
11722         uip = (struct sd_uscsi_info *)bp->b_private;
11723         cmd = ((struct uscsi_cmd *)(uip->ui_cmdp))->uscsi_cdb[0];
11724 
11725         mutex_enter(SD_MUTEX(un));
11726         /*
11727          * atapi: Since we are running the CD for now in PIO mode we need to
11728          * call bp_mapin here to avoid bp_mapin called interrupt context under
11729          * the HBA's init_pkt routine.
11730          */
11731         if (un->un_f_cfg_is_atapi == TRUE) {
11732                 mutex_exit(SD_MUTEX(un));
11733                 bp_mapin(bp);
11734                 mutex_enter(SD_MUTEX(un));
11735         }
11736         un->un_ncmds_in_driver++;
11737         SD_INFO(SD_LOG_IO, un, "sd_uscsi_strategy: un_ncmds_in_driver = %ld\n",
11738             un->un_ncmds_in_driver);
11739 
11740         if ((bp->b_flags & B_WRITE) && (bp->b_bcount != 0) &&
11741             (cmd != SCMD_MODE_SELECT) && (cmd != SCMD_MODE_SELECT_G1))
11742                 un->un_f_sync_cache_required = TRUE;
11743 
11744         mutex_exit(SD_MUTEX(un));
11745 
11746         switch (uip->ui_flags) {
11747         case SD_PATH_DIRECT:
11748                 chain_type = SD_CHAIN_DIRECT;
11749                 break;
11750         case SD_PATH_DIRECT_PRIORITY:
11751                 chain_type = SD_CHAIN_DIRECT_PRIORITY;
11752                 break;
11753         default:
11754                 chain_type = SD_CHAIN_USCSI;
11755                 break;
11756         }
11757 
11758         /*
11759          * We may allocate extra buf for external USCSI commands. If the
11760          * application asks for bigger than 20-byte sense data via USCSI,
11761          * SCSA layer will allocate 252 bytes sense buf for that command.
11762          */
11763         if (((struct uscsi_cmd *)(uip->ui_cmdp))->uscsi_rqlen >
11764             SENSE_LENGTH) {
11765                 xp = kmem_zalloc(sizeof (struct sd_xbuf) - SENSE_LENGTH +
11766                     MAX_SENSE_LENGTH, KM_SLEEP);
11767         } else {
11768                 xp = kmem_zalloc(sizeof (struct sd_xbuf), KM_SLEEP);
11769         }
11770 
11771         sd_xbuf_init(un, bp, xp, chain_type, uip->ui_cmdp);
11772 
11773         /* Use the index obtained within xbuf_init */
11774         SD_BEGIN_IOSTART(xp->xb_chain_iostart, un, bp);
11775 
11776         SD_TRACE(SD_LOG_IO, un, "sd_uscsi_strategy: exit: buf:0x%p\n", bp);
11777 
11778         return (0);
11779 }
11780 
11781 /*
11782  *    Function: sd_send_scsi_cmd
11783  *
11784  * Description: Runs a USCSI command for user (when called thru sdioctl),
11785  *              or for the driver
11786  *
11787  *   Arguments: dev - the dev_t for the device
11788  *              incmd - ptr to a valid uscsi_cmd struct
11789  *              flag - bit flag, indicating open settings, 32/64 bit type
11790  *              dataspace - UIO_USERSPACE or UIO_SYSSPACE
11791  *              path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
11792  *                      the normal command waitq, or SD_PATH_DIRECT_PRIORITY
11793  *                      to use the USCSI "direct" chain and bypass the normal
11794  *                      command waitq.
11795  *
11796  * Return Code: 0 -  successful completion of the given command
11797  *              EIO - scsi_uscsi_handle_command() failed
11798  *              ENXIO  - soft state not found for specified dev
11799  *              EINVAL
11800  *              EFAULT - copyin/copyout error
11801  *              return code of scsi_uscsi_handle_command():
11802  *                      EIO
11803  *                      ENXIO
11804  *                      EACCES
11805  *
11806  *     Context: Waits for command to complete. Can sleep.
11807  */
11808 
11809 static int
11810 sd_send_scsi_cmd(dev_t dev, struct uscsi_cmd *incmd, int flag,
11811         enum uio_seg dataspace, int path_flag)
11812 {
11813         struct sd_lun   *un;
11814         sd_ssc_t        *ssc;
11815         int             rval;
11816 
11817         un = ddi_get_soft_state(sd_state, SDUNIT(dev));
11818         if (un == NULL) {
11819                 return (ENXIO);
11820         }
11821 
11822         /*
11823          * Using sd_ssc_send to handle uscsi cmd
11824          */
11825         ssc = sd_ssc_init(un);
11826         rval = sd_ssc_send(ssc, incmd, flag, dataspace, path_flag);
11827         sd_ssc_fini(ssc);
11828 
11829         return (rval);
11830 }
11831 
11832 /*
11833  *    Function: sd_ssc_init
11834  *
11835  * Description: Uscsi end-user call this function to initialize necessary
11836  *              fields, such as uscsi_cmd and sd_uscsi_info struct.
11837  *
11838  *              The return value of sd_send_scsi_cmd will be treated as a
11839  *              fault in various conditions. Even it is not Zero, some
11840  *              callers may ignore the return value. That is to say, we can
11841  *              not make an accurate assessment in sdintr, since if a
11842  *              command is failed in sdintr it does not mean the caller of
11843  *              sd_send_scsi_cmd will treat it as a real failure.
11844  *
11845  *              To avoid printing too many error logs for a failed uscsi
11846  *              packet that the caller may not treat it as a failure, the
11847  *              sd will keep silent for handling all uscsi commands.
11848  *
11849  *              During detach->attach and attach-open, for some types of
11850  *              problems, the driver should be providing information about
11851  *              the problem encountered. Device use USCSI_SILENT, which
11852  *              suppresses all driver information. The result is that no
11853  *              information about the problem is available. Being
11854  *              completely silent during this time is inappropriate. The
11855  *              driver needs a more selective filter than USCSI_SILENT, so
11856  *              that information related to faults is provided.
11857  *
11858  *              To make the accurate accessment, the caller  of
11859  *              sd_send_scsi_USCSI_CMD should take the ownership and
11860  *              get necessary information to print error messages.
11861  *
11862  *              If we want to print necessary info of uscsi command, we need to
11863  *              keep the uscsi_cmd and sd_uscsi_info till we can make the
11864  *              assessment. We use sd_ssc_init to alloc necessary
11865  *              structs for sending an uscsi command and we are also
11866  *              responsible for free the memory by calling
11867  *              sd_ssc_fini.
11868  *
11869  *              The calling secquences will look like:
11870  *              sd_ssc_init->
11871  *
11872  *                  ...
11873  *
11874  *                  sd_send_scsi_USCSI_CMD->
11875  *                      sd_ssc_send-> - - - sdintr
11876  *                  ...
11877  *
11878  *                  if we think the return value should be treated as a
11879  *                  failure, we make the accessment here and print out
11880  *                  necessary by retrieving uscsi_cmd and sd_uscsi_info'
11881  *
11882  *                  ...
11883  *
11884  *              sd_ssc_fini
11885  *
11886  *
11887  *   Arguments: un - pointer to driver soft state (unit) structure for this
11888  *                   target.
11889  *
11890  * Return code: sd_ssc_t - pointer to allocated sd_ssc_t struct, it contains
11891  *                         uscsi_cmd and sd_uscsi_info.
11892  *                  NULL - if can not alloc memory for sd_ssc_t struct
11893  *
11894  *     Context: Kernel Thread.
11895  */
11896 static sd_ssc_t *
11897 sd_ssc_init(struct sd_lun *un)
11898 {
11899         sd_ssc_t                *ssc;
11900         struct uscsi_cmd        *ucmdp;
11901         struct sd_uscsi_info    *uip;
11902 
11903         ASSERT(un != NULL);
11904         ASSERT(!mutex_owned(SD_MUTEX(un)));
11905 
11906         /*
11907          * Allocate sd_ssc_t structure
11908          */
11909         ssc = kmem_zalloc(sizeof (sd_ssc_t), KM_SLEEP);
11910 
11911         /*
11912          * Allocate uscsi_cmd by calling scsi_uscsi_alloc common routine
11913          */
11914         ucmdp = scsi_uscsi_alloc();
11915 
11916         /*
11917          * Allocate sd_uscsi_info structure
11918          */
11919         uip = kmem_zalloc(sizeof (struct sd_uscsi_info), KM_SLEEP);
11920 
11921         ssc->ssc_uscsi_cmd = ucmdp;
11922         ssc->ssc_uscsi_info = uip;
11923         ssc->ssc_un = un;
11924 
11925         return (ssc);
11926 }
11927 
11928 /*
11929  * Function: sd_ssc_fini
11930  *
11931  * Description: To free sd_ssc_t and it's hanging off
11932  *
11933  * Arguments: ssc - struct pointer of sd_ssc_t.
11934  */
11935 static void
11936 sd_ssc_fini(sd_ssc_t *ssc)
11937 {
11938         scsi_uscsi_free(ssc->ssc_uscsi_cmd);
11939 
11940         if (ssc->ssc_uscsi_info != NULL) {
11941                 kmem_free(ssc->ssc_uscsi_info, sizeof (struct sd_uscsi_info));
11942                 ssc->ssc_uscsi_info = NULL;
11943         }
11944 
11945         kmem_free(ssc, sizeof (sd_ssc_t));
11946         ssc = NULL;
11947 }
11948 
11949 /*
11950  * Function: sd_ssc_send
11951  *
11952  * Description: Runs a USCSI command for user when called through sdioctl,
11953  *              or for the driver.
11954  *
11955  *   Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and
11956  *                    sd_uscsi_info in.
11957  *              incmd - ptr to a valid uscsi_cmd struct
11958  *              flag - bit flag, indicating open settings, 32/64 bit type
11959  *              dataspace - UIO_USERSPACE or UIO_SYSSPACE
11960  *              path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
11961  *                      the normal command waitq, or SD_PATH_DIRECT_PRIORITY
11962  *                      to use the USCSI "direct" chain and bypass the normal
11963  *                      command waitq.
11964  *
11965  * Return Code: 0 -  successful completion of the given command
11966  *              EIO - scsi_uscsi_handle_command() failed
11967  *              ENXIO  - soft state not found for specified dev
11968  *              ECANCELED - command cancelled due to low power
11969  *              EINVAL
11970  *              EFAULT - copyin/copyout error
11971  *              return code of scsi_uscsi_handle_command():
11972  *                      EIO
11973  *                      ENXIO
11974  *                      EACCES
11975  *
11976  *     Context: Kernel Thread;
11977  *              Waits for command to complete. Can sleep.
11978  */
11979 static int
11980 sd_ssc_send(sd_ssc_t *ssc, struct uscsi_cmd *incmd, int flag,
11981         enum uio_seg dataspace, int path_flag)
11982 {
11983         struct sd_uscsi_info    *uip;
11984         struct uscsi_cmd        *uscmd;
11985         struct sd_lun           *un;
11986         dev_t                   dev;
11987 
11988         int     format = 0;
11989         int     rval;
11990 
11991         ASSERT(ssc != NULL);
11992         un = ssc->ssc_un;
11993         ASSERT(un != NULL);
11994         uscmd = ssc->ssc_uscsi_cmd;
11995         ASSERT(uscmd != NULL);
11996         ASSERT(!mutex_owned(SD_MUTEX(un)));
11997         if (ssc->ssc_flags & SSC_FLAGS_NEED_ASSESSMENT) {
11998                 /*
11999                  * If enter here, it indicates that the previous uscsi
12000                  * command has not been processed by sd_ssc_assessment.
12001                  * This is violating our rules of FMA telemetry processing.
12002                  * We should print out this message and the last undisposed
12003                  * uscsi command.
12004                  */
12005                 if (uscmd->uscsi_cdb != NULL) {
12006                         SD_INFO(SD_LOG_SDTEST, un,
12007                             "sd_ssc_send is missing the alternative "
12008                             "sd_ssc_assessment when running command 0x%x.\n",
12009                             uscmd->uscsi_cdb[0]);
12010                 }
12011                 /*
12012                  * Set the ssc_flags to SSC_FLAGS_UNKNOWN, which should be
12013                  * the initial status.
12014                  */
12015                 ssc->ssc_flags = SSC_FLAGS_UNKNOWN;
12016         }
12017 
12018         /*
12019          * We need to make sure sd_ssc_send will have sd_ssc_assessment
12020          * followed to avoid missing FMA telemetries.
12021          */
12022         ssc->ssc_flags |= SSC_FLAGS_NEED_ASSESSMENT;
12023 
12024         /*
12025          * if USCSI_PMFAILFAST is set and un is in low power, fail the
12026          * command immediately.
12027          */
12028         mutex_enter(SD_MUTEX(un));
12029         mutex_enter(&un->un_pm_mutex);
12030         if ((uscmd->uscsi_flags & USCSI_PMFAILFAST) &&
12031             SD_DEVICE_IS_IN_LOW_POWER(un)) {
12032                 SD_TRACE(SD_LOG_IO, un, "sd_ssc_send:"
12033                     "un:0x%p is in low power\n", un);
12034                 mutex_exit(&un->un_pm_mutex);
12035                 mutex_exit(SD_MUTEX(un));
12036                 return (ECANCELED);
12037         }
12038         mutex_exit(&un->un_pm_mutex);
12039         mutex_exit(SD_MUTEX(un));
12040 
12041 #ifdef SDDEBUG
12042         switch (dataspace) {
12043         case UIO_USERSPACE:
12044                 SD_TRACE(SD_LOG_IO, un,
12045                     "sd_ssc_send: entry: un:0x%p UIO_USERSPACE\n", un);
12046                 break;
12047         case UIO_SYSSPACE:
12048                 SD_TRACE(SD_LOG_IO, un,
12049                     "sd_ssc_send: entry: un:0x%p UIO_SYSSPACE\n", un);
12050                 break;
12051         default:
12052                 SD_TRACE(SD_LOG_IO, un,
12053                     "sd_ssc_send: entry: un:0x%p UNEXPECTED SPACE\n", un);
12054                 break;
12055         }
12056 #endif
12057 
12058         rval = scsi_uscsi_copyin((intptr_t)incmd, flag,
12059             SD_ADDRESS(un), &uscmd);
12060         if (rval != 0) {
12061                 SD_TRACE(SD_LOG_IO, un, "sd_sense_scsi_cmd: "
12062                     "scsi_uscsi_alloc_and_copyin failed\n", un);
12063                 return (rval);
12064         }
12065 
12066         if ((uscmd->uscsi_cdb != NULL) &&
12067             (uscmd->uscsi_cdb[0] == SCMD_FORMAT)) {
12068                 mutex_enter(SD_MUTEX(un));
12069                 un->un_f_format_in_progress = TRUE;
12070                 mutex_exit(SD_MUTEX(un));
12071                 format = 1;
12072         }
12073 
12074         /*
12075          * Allocate an sd_uscsi_info struct and fill it with the info
12076          * needed by sd_initpkt_for_uscsi().  Then put the pointer into
12077          * b_private in the buf for sd_initpkt_for_uscsi().  Note that
12078          * since we allocate the buf here in this function, we do not
12079          * need to preserve the prior contents of b_private.
12080          * The sd_uscsi_info struct is also used by sd_uscsi_strategy()
12081          */
12082         uip = ssc->ssc_uscsi_info;
12083         uip->ui_flags = path_flag;
12084         uip->ui_cmdp = uscmd;
12085 
12086         /*
12087          * Commands sent with priority are intended for error recovery
12088          * situations, and do not have retries performed.
12089          */
12090         if (path_flag == SD_PATH_DIRECT_PRIORITY) {
12091                 uscmd->uscsi_flags |= USCSI_DIAGNOSE;
12092         }
12093         uscmd->uscsi_flags &= ~USCSI_NOINTR;
12094 
12095         dev = SD_GET_DEV(un);
12096         rval = scsi_uscsi_handle_cmd(dev, dataspace, uscmd,
12097             sd_uscsi_strategy, NULL, uip);
12098 
12099         /*
12100          * mark ssc_flags right after handle_cmd to make sure
12101          * the uscsi has been sent
12102          */
12103         ssc->ssc_flags |= SSC_FLAGS_CMD_ISSUED;
12104 
12105 #ifdef SDDEBUG
12106         SD_INFO(SD_LOG_IO, un, "sd_ssc_send: "
12107             "uscsi_status: 0x%02x  uscsi_resid:0x%x\n",
12108             uscmd->uscsi_status, uscmd->uscsi_resid);
12109         if (uscmd->uscsi_bufaddr != NULL) {
12110                 SD_INFO(SD_LOG_IO, un, "sd_ssc_send: "
12111                     "uscmd->uscsi_bufaddr: 0x%p  uscmd->uscsi_buflen:%d\n",
12112                     uscmd->uscsi_bufaddr, uscmd->uscsi_buflen);
12113                 if (dataspace == UIO_SYSSPACE) {
12114                         SD_DUMP_MEMORY(un, SD_LOG_IO,
12115                             "data", (uchar_t *)uscmd->uscsi_bufaddr,
12116                             uscmd->uscsi_buflen, SD_LOG_HEX);
12117                 }
12118         }
12119 #endif
12120 
12121         if (format == 1) {
12122                 mutex_enter(SD_MUTEX(un));
12123                 un->un_f_format_in_progress = FALSE;
12124                 mutex_exit(SD_MUTEX(un));
12125         }
12126 
12127         (void) scsi_uscsi_copyout((intptr_t)incmd, uscmd);
12128 
12129         return (rval);
12130 }
12131 
12132 /*
12133  *     Function: sd_ssc_print
12134  *
12135  * Description: Print information available to the console.
12136  *
12137  * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and
12138  *                    sd_uscsi_info in.
12139  *            sd_severity - log level.
12140  *     Context: Kernel thread or interrupt context.
12141  */
12142 static void
12143 sd_ssc_print(sd_ssc_t *ssc, int sd_severity)
12144 {
12145         struct uscsi_cmd        *ucmdp;
12146         struct scsi_device      *devp;
12147         dev_info_t              *devinfo;
12148         uchar_t                 *sensep;
12149         int                     senlen;
12150         union scsi_cdb          *cdbp;
12151         uchar_t                 com;
12152         extern struct scsi_key_strings scsi_cmds[];
12153 
12154         ASSERT(ssc != NULL);
12155         ASSERT(ssc->ssc_un != NULL);
12156 
12157         if (SD_FM_LOG(ssc->ssc_un) != SD_FM_LOG_EREPORT)
12158                 return;
12159         ucmdp = ssc->ssc_uscsi_cmd;
12160         devp = SD_SCSI_DEVP(ssc->ssc_un);
12161         devinfo = SD_DEVINFO(ssc->ssc_un);
12162         ASSERT(ucmdp != NULL);
12163         ASSERT(devp != NULL);
12164         ASSERT(devinfo != NULL);
12165         sensep = (uint8_t *)ucmdp->uscsi_rqbuf;
12166         senlen = ucmdp->uscsi_rqlen - ucmdp->uscsi_rqresid;
12167         cdbp = (union scsi_cdb *)ucmdp->uscsi_cdb;
12168 
12169         /* In certain case (like DOORLOCK), the cdb could be NULL. */
12170         if (cdbp == NULL)
12171                 return;
12172         /* We don't print log if no sense data available. */
12173         if (senlen == 0)
12174                 sensep = NULL;
12175         com = cdbp->scc_cmd;
12176         scsi_generic_errmsg(devp, sd_label, sd_severity, 0, 0, com,
12177             scsi_cmds, sensep, ssc->ssc_un->un_additional_codes, NULL);
12178 }
12179 
12180 /*
12181  *     Function: sd_ssc_assessment
12182  *
12183  * Description: We use this function to make an assessment at the point
12184  *              where SD driver may encounter a potential error.
12185  *
12186  * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and
12187  *                  sd_uscsi_info in.
12188  *            tp_assess - a hint of strategy for ereport posting.
12189  *            Possible values of tp_assess include:
12190  *                SD_FMT_IGNORE - we don't post any ereport because we're
12191  *                sure that it is ok to ignore the underlying problems.
12192  *                SD_FMT_IGNORE_COMPROMISE - we don't post any ereport for now
12193  *                but it might be not correct to ignore the underlying hardware
12194  *                error.
12195  *                SD_FMT_STATUS_CHECK - we will post an ereport with the
12196  *                payload driver-assessment of value "fail" or
12197  *                "fatal"(depending on what information we have here). This
12198  *                assessment value is usually set when SD driver think there
12199  *                is a potential error occurred(Typically, when return value
12200  *                of the SCSI command is EIO).
12201  *                SD_FMT_STANDARD - we will post an ereport with the payload
12202  *                driver-assessment of value "info". This assessment value is
12203  *                set when the SCSI command returned successfully and with
12204  *                sense data sent back.
12205  *
12206  *     Context: Kernel thread.
12207  */
12208 static void
12209 sd_ssc_assessment(sd_ssc_t *ssc, enum sd_type_assessment tp_assess)
12210 {
12211         int senlen = 0;
12212         struct uscsi_cmd *ucmdp = NULL;
12213         struct sd_lun *un;
12214 
12215         ASSERT(ssc != NULL);
12216         un = ssc->ssc_un;
12217         ASSERT(un != NULL);
12218         ucmdp = ssc->ssc_uscsi_cmd;
12219         ASSERT(ucmdp != NULL);
12220 
12221         if (ssc->ssc_flags & SSC_FLAGS_NEED_ASSESSMENT) {
12222                 ssc->ssc_flags &= ~SSC_FLAGS_NEED_ASSESSMENT;
12223         } else {
12224                 /*
12225                  * If enter here, it indicates that we have a wrong
12226                  * calling sequence of sd_ssc_send and sd_ssc_assessment,
12227                  * both of which should be called in a pair in case of
12228                  * loss of FMA telemetries.
12229                  */
12230                 if (ucmdp->uscsi_cdb != NULL) {
12231                         SD_INFO(SD_LOG_SDTEST, un,
12232                             "sd_ssc_assessment is missing the "
12233                             "alternative sd_ssc_send when running 0x%x, "
12234                             "or there are superfluous sd_ssc_assessment for "
12235                             "the same sd_ssc_send.\n",
12236                             ucmdp->uscsi_cdb[0]);
12237                 }
12238                 /*
12239                  * Set the ssc_flags to the initial value to avoid passing
12240                  * down dirty flags to the following sd_ssc_send function.
12241                  */
12242                 ssc->ssc_flags = SSC_FLAGS_UNKNOWN;
12243                 return;
12244         }
12245 
12246         /*
12247          * Only handle an issued command which is waiting for assessment.
12248          * A command which is not issued will not have
12249          * SSC_FLAGS_INVALID_DATA set, so it'ok we just return here.
12250          */
12251         if (!(ssc->ssc_flags & SSC_FLAGS_CMD_ISSUED)) {
12252                 sd_ssc_print(ssc, SCSI_ERR_INFO);
12253                 return;
12254         } else {
12255                 /*
12256                  * For an issued command, we should clear this flag in
12257                  * order to make the sd_ssc_t structure be used off
12258                  * multiple uscsi commands.
12259                  */
12260                 ssc->ssc_flags &= ~SSC_FLAGS_CMD_ISSUED;
12261         }
12262 
12263         /*
12264          * We will not deal with non-retryable(flag USCSI_DIAGNOSE set)
12265          * commands here. And we should clear the ssc_flags before return.
12266          */
12267         if (ucmdp->uscsi_flags & USCSI_DIAGNOSE) {
12268                 ssc->ssc_flags = SSC_FLAGS_UNKNOWN;
12269                 return;
12270         }
12271 
12272         switch (tp_assess) {
12273         case SD_FMT_IGNORE:
12274         case SD_FMT_IGNORE_COMPROMISE:
12275                 break;
12276         case SD_FMT_STATUS_CHECK:
12277                 /*
12278                  * For a failed command(including the succeeded command
12279                  * with invalid data sent back).
12280                  */
12281                 sd_ssc_post(ssc, SD_FM_DRV_FATAL);
12282                 break;
12283         case SD_FMT_STANDARD:
12284                 /*
12285                  * Always for the succeeded commands probably with sense
12286                  * data sent back.
12287                  * Limitation:
12288                  *      We can only handle a succeeded command with sense
12289                  *      data sent back when auto-request-sense is enabled.
12290                  */
12291                 senlen = ssc->ssc_uscsi_cmd->uscsi_rqlen -
12292                     ssc->ssc_uscsi_cmd->uscsi_rqresid;
12293                 if ((ssc->ssc_uscsi_info->ui_pkt_state & STATE_ARQ_DONE) &&
12294                     (un->un_f_arq_enabled == TRUE) &&
12295                     senlen > 0 &&
12296                     ssc->ssc_uscsi_cmd->uscsi_rqbuf != NULL) {
12297                         sd_ssc_post(ssc, SD_FM_DRV_NOTICE);
12298                 }
12299                 break;
12300         default:
12301                 /*
12302                  * Should not have other type of assessment.
12303                  */
12304                 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
12305                     "sd_ssc_assessment got wrong "
12306                     "sd_type_assessment %d.\n", tp_assess);
12307                 break;
12308         }
12309         /*
12310          * Clear up the ssc_flags before return.
12311          */
12312         ssc->ssc_flags = SSC_FLAGS_UNKNOWN;
12313 }
12314 
12315 /*
12316  *    Function: sd_ssc_post
12317  *
12318  * Description: 1. read the driver property to get fm-scsi-log flag.
12319  *              2. print log if fm_log_capable is non-zero.
12320  *              3. call sd_ssc_ereport_post to post ereport if possible.
12321  *
12322  *    Context: May be called from kernel thread or interrupt context.
12323  */
12324 static void
12325 sd_ssc_post(sd_ssc_t *ssc, enum sd_driver_assessment sd_assess)
12326 {
12327         struct sd_lun   *un;
12328         int             sd_severity;
12329 
12330         ASSERT(ssc != NULL);
12331         un = ssc->ssc_un;
12332         ASSERT(un != NULL);
12333 
12334         /*
12335          * We may enter here from sd_ssc_assessment(for USCSI command) or
12336          * by directly called from sdintr context.
12337          * We don't handle a non-disk drive(CD-ROM, removable media).
12338          * Clear the ssc_flags before return in case we've set
12339          * SSC_FLAGS_INVALID_XXX which should be skipped for a non-disk
12340          * driver.
12341          */
12342         if (ISCD(un) || un->un_f_has_removable_media) {
12343                 ssc->ssc_flags = SSC_FLAGS_UNKNOWN;
12344                 return;
12345         }
12346 
12347         switch (sd_assess) {
12348                 case SD_FM_DRV_FATAL:
12349                         sd_severity = SCSI_ERR_FATAL;
12350                         break;
12351                 case SD_FM_DRV_RECOVERY:
12352                         sd_severity = SCSI_ERR_RECOVERED;
12353                         break;
12354                 case SD_FM_DRV_RETRY:
12355                         sd_severity = SCSI_ERR_RETRYABLE;
12356                         break;
12357                 case SD_FM_DRV_NOTICE:
12358                         sd_severity = SCSI_ERR_INFO;
12359                         break;
12360                 default:
12361                         sd_severity = SCSI_ERR_UNKNOWN;
12362         }
12363         /* print log */
12364         sd_ssc_print(ssc, sd_severity);
12365 
12366         /* always post ereport */
12367         sd_ssc_ereport_post(ssc, sd_assess);
12368 }
12369 
12370 /*
12371  *    Function: sd_ssc_set_info
12372  *
12373  * Description: Mark ssc_flags and set ssc_info which would be the
12374  *              payload of uderr ereport. This function will cause
12375  *              sd_ssc_ereport_post to post uderr ereport only.
12376  *              Besides, when ssc_flags == SSC_FLAGS_INVALID_DATA(USCSI),
12377  *              the function will also call SD_ERROR or scsi_log for a
12378  *              CDROM/removable-media/DDI_FM_NOT_CAPABLE device.
12379  *
12380  * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and
12381  *                  sd_uscsi_info in.
12382  *            ssc_flags - indicate the sub-category of a uderr.
12383  *            comp - this argument is meaningful only when
12384  *                   ssc_flags == SSC_FLAGS_INVALID_DATA, and its possible
12385  *                   values include:
12386  *                   > 0, SD_ERROR is used with comp as the driver logging
12387  *                   component;
12388  *                   = 0, scsi-log is used to log error telemetries;
12389  *                   < 0, no log available for this telemetry.
12390  *
12391  *    Context: Kernel thread or interrupt context
12392  */
12393 static void
12394 sd_ssc_set_info(sd_ssc_t *ssc, int ssc_flags, uint_t comp, const char *fmt, ...)
12395 {
12396         va_list ap;
12397 
12398         ASSERT(ssc != NULL);
12399         ASSERT(ssc->ssc_un != NULL);
12400 
12401         ssc->ssc_flags |= ssc_flags;
12402         va_start(ap, fmt);
12403         (void) vsnprintf(ssc->ssc_info, sizeof (ssc->ssc_info), fmt, ap);
12404         va_end(ap);
12405 
12406         /*
12407          * If SSC_FLAGS_INVALID_DATA is set, it should be a uscsi command
12408          * with invalid data sent back. For non-uscsi command, the
12409          * following code will be bypassed.
12410          */
12411         if (ssc_flags & SSC_FLAGS_INVALID_DATA) {
12412                 if (SD_FM_LOG(ssc->ssc_un) == SD_FM_LOG_NSUP) {
12413                         /*
12414                          * If the error belong to certain component and we
12415                          * do not want it to show up on the console, we
12416                          * will use SD_ERROR, otherwise scsi_log is
12417                          * preferred.
12418                          */
12419                         if (comp > 0) {
12420                                 SD_ERROR(comp, ssc->ssc_un, ssc->ssc_info);
12421                         } else if (comp == 0) {
12422                                 scsi_log(SD_DEVINFO(ssc->ssc_un), sd_label,
12423                                     CE_WARN, ssc->ssc_info);
12424                         }
12425                 }
12426         }
12427 }
12428 
12429 /*
12430  *    Function: sd_buf_iodone
12431  *
12432  * Description: Frees the sd_xbuf & returns the buf to its originator.
12433  *
12434  *     Context: May be called from interrupt context.
12435  */
12436 /* ARGSUSED */
12437 static void
12438 sd_buf_iodone(int index, struct sd_lun *un, struct buf *bp)
12439 {
12440         struct sd_xbuf *xp;
12441 
12442         ASSERT(un != NULL);
12443         ASSERT(bp != NULL);
12444         ASSERT(!mutex_owned(SD_MUTEX(un)));
12445 
12446         SD_TRACE(SD_LOG_IO_CORE, un, "sd_buf_iodone: entry.\n");
12447 
12448         xp = SD_GET_XBUF(bp);
12449         ASSERT(xp != NULL);
12450 
12451         /* xbuf is gone after this */
12452         if (ddi_xbuf_done(bp, un->un_xbuf_attr)) {
12453                 mutex_enter(SD_MUTEX(un));
12454 
12455                 /*
12456                  * Grab time when the cmd completed.
12457                  * This is used for determining if the system has been
12458                  * idle long enough to make it idle to the PM framework.
12459                  * This is for lowering the overhead, and therefore improving
12460                  * performance per I/O operation.
12461                  */
12462                 un->un_pm_idle_time = gethrtime();
12463 
12464                 un->un_ncmds_in_driver--;
12465                 ASSERT(un->un_ncmds_in_driver >= 0);
12466                 SD_INFO(SD_LOG_IO, un,
12467                     "sd_buf_iodone: un_ncmds_in_driver = %ld\n",
12468                     un->un_ncmds_in_driver);
12469 
12470                 mutex_exit(SD_MUTEX(un));
12471         }
12472 
12473         biodone(bp);                            /* bp is gone after this */
12474 
12475         SD_TRACE(SD_LOG_IO_CORE, un, "sd_buf_iodone: exit.\n");
12476 }
12477 
12478 
12479 /*
12480  *    Function: sd_uscsi_iodone
12481  *
12482  * Description: Frees the sd_xbuf & returns the buf to its originator.
12483  *
12484  *     Context: May be called from interrupt context.
12485  */
12486 /* ARGSUSED */
12487 static void
12488 sd_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp)
12489 {
12490         struct sd_xbuf *xp;
12491 
12492         ASSERT(un != NULL);
12493         ASSERT(bp != NULL);
12494 
12495         xp = SD_GET_XBUF(bp);
12496         ASSERT(xp != NULL);
12497         ASSERT(!mutex_owned(SD_MUTEX(un)));
12498 
12499         SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: entry.\n");
12500 
12501         bp->b_private = xp->xb_private;
12502 
12503         mutex_enter(SD_MUTEX(un));
12504 
12505         /*
12506          * Grab time when the cmd completed.
12507          * This is used for determining if the system has been
12508          * idle long enough to make it idle to the PM framework.
12509          * This is for lowering the overhead, and therefore improving
12510          * performance per I/O operation.
12511          */
12512         un->un_pm_idle_time = gethrtime();
12513 
12514         un->un_ncmds_in_driver--;
12515         ASSERT(un->un_ncmds_in_driver >= 0);
12516         SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: un_ncmds_in_driver = %ld\n",
12517             un->un_ncmds_in_driver);
12518 
12519         mutex_exit(SD_MUTEX(un));
12520 
12521         if (((struct uscsi_cmd *)(xp->xb_pktinfo))->uscsi_rqlen >
12522             SENSE_LENGTH) {
12523                 kmem_free(xp, sizeof (struct sd_xbuf) - SENSE_LENGTH +
12524                     MAX_SENSE_LENGTH);
12525         } else {
12526                 kmem_free(xp, sizeof (struct sd_xbuf));
12527         }
12528 
12529         biodone(bp);
12530 
12531         SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: exit.\n");
12532 }
12533 
12534 
12535 /*
12536  *    Function: sd_mapblockaddr_iostart
12537  *
12538  * Description: Verify request lies within the partition limits for
12539  *              the indicated minor device.  Issue "overrun" buf if
12540  *              request would exceed partition range.  Converts
12541  *              partition-relative block address to absolute.
12542  *
12543  *              Upon exit of this function:
12544  *              1.I/O is aligned
12545  *                 xp->xb_blkno represents the absolute sector address
12546  *              2.I/O is misaligned
12547  *                 xp->xb_blkno represents the absolute logical block address
12548  *                 based on DEV_BSIZE. The logical block address will be
12549  *                 converted to physical sector address in sd_mapblocksize_\
12550  *                 iostart.
12551  *              3.I/O is misaligned but is aligned in "overrun" buf
12552  *                 xp->xb_blkno represents the absolute logical block address
12553  *                 based on DEV_BSIZE. The logical block address will be
12554  *                 converted to physical sector address in sd_mapblocksize_\
12555  *                 iostart. But no RMW will be issued in this case.
12556  *
12557  *     Context: Can sleep
12558  *
12559  *      Issues: This follows what the old code did, in terms of accessing
12560  *              some of the partition info in the unit struct without holding
12561  *              the mutext.  This is a general issue, if the partition info
12562  *              can be altered while IO is in progress... as soon as we send
12563  *              a buf, its partitioning can be invalid before it gets to the
12564  *              device.  Probably the right fix is to move partitioning out
12565  *              of the driver entirely.
12566  */
12567 
12568 static void
12569 sd_mapblockaddr_iostart(int index, struct sd_lun *un, struct buf *bp)
12570 {
12571         diskaddr_t      nblocks;        /* #blocks in the given partition */
12572         daddr_t blocknum;       /* Block number specified by the buf */
12573         size_t  requested_nblocks;
12574         size_t  available_nblocks;
12575         int     partition;
12576         diskaddr_t      partition_offset;
12577         struct sd_xbuf *xp;
12578         int secmask = 0, blknomask = 0;
12579         ushort_t is_aligned = TRUE;
12580 
12581         ASSERT(un != NULL);
12582         ASSERT(bp != NULL);
12583         ASSERT(!mutex_owned(SD_MUTEX(un)));
12584 
12585         SD_TRACE(SD_LOG_IO_PARTITION, un,
12586             "sd_mapblockaddr_iostart: entry: buf:0x%p\n", bp);
12587 
12588         xp = SD_GET_XBUF(bp);
12589         ASSERT(xp != NULL);
12590 
12591         /*
12592          * If the geometry is not indicated as valid, attempt to access
12593          * the unit & verify the geometry/label. This can be the case for
12594          * removable-media devices, of if the device was opened in
12595          * NDELAY/NONBLOCK mode.
12596          */
12597         partition = SDPART(bp->b_edev);
12598 
12599         if (!SD_IS_VALID_LABEL(un)) {
12600                 sd_ssc_t *ssc;
12601                 /*
12602                  * Initialize sd_ssc_t for internal uscsi commands
12603                  * In case of potential porformance issue, we need
12604                  * to alloc memory only if there is invalid label
12605                  */
12606                 ssc = sd_ssc_init(un);
12607 
12608                 if (sd_ready_and_valid(ssc, partition) != SD_READY_VALID) {
12609                         /*
12610                          * For removable devices it is possible to start an
12611                          * I/O without a media by opening the device in nodelay
12612                          * mode. Also for writable CDs there can be many
12613                          * scenarios where there is no geometry yet but volume
12614                          * manager is trying to issue a read() just because
12615                          * it can see TOC on the CD. So do not print a message
12616                          * for removables.
12617                          */
12618                         if (!un->un_f_has_removable_media) {
12619                                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
12620                                     "i/o to invalid geometry\n");
12621                         }
12622                         bioerror(bp, EIO);
12623                         bp->b_resid = bp->b_bcount;
12624                         SD_BEGIN_IODONE(index, un, bp);
12625 
12626                         sd_ssc_fini(ssc);
12627                         return;
12628                 }
12629                 sd_ssc_fini(ssc);
12630         }
12631 
12632         nblocks = 0;
12633         (void) cmlb_partinfo(un->un_cmlbhandle, partition,
12634             &nblocks, &partition_offset, NULL, NULL, (void *)SD_PATH_DIRECT);
12635 
12636         if (un->un_f_enable_rmw) {
12637                 blknomask = (un->un_phy_blocksize / DEV_BSIZE) - 1;
12638                 secmask = un->un_phy_blocksize - 1;
12639         } else {
12640                 blknomask = (un->un_tgt_blocksize / DEV_BSIZE) - 1;
12641                 secmask = un->un_tgt_blocksize - 1;
12642         }
12643 
12644         if ((bp->b_lblkno & (blknomask)) || (bp->b_bcount & (secmask))) {
12645                 is_aligned = FALSE;
12646         }
12647 
12648         if (!(NOT_DEVBSIZE(un)) || un->un_f_enable_rmw) {
12649                 /*
12650                  * If I/O is aligned, no need to involve RMW(Read Modify Write)
12651                  * Convert the logical block number to target's physical sector
12652                  * number.
12653                  */
12654                 if (is_aligned) {
12655                         xp->xb_blkno = SD_SYS2TGTBLOCK(un, xp->xb_blkno);
12656                 } else {
12657                         /*
12658                          * There is no RMW if we're just reading, so don't
12659                          * warn or error out because of it.
12660                          */
12661                         if (bp->b_flags & B_READ) {
12662                                 /*EMPTY*/
12663                         } else if (!un->un_f_enable_rmw &&
12664                             un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR) {
12665                                 bp->b_flags |= B_ERROR;
12666                                 goto error_exit;
12667                         } else if (un->un_f_rmw_type == SD_RMW_TYPE_DEFAULT) {
12668                                 mutex_enter(SD_MUTEX(un));
12669                                 if (!un->un_f_enable_rmw &&
12670                                     un->un_rmw_msg_timeid == NULL) {
12671                                         scsi_log(SD_DEVINFO(un), sd_label,
12672                                             CE_WARN, "I/O request is not "
12673                                             "aligned with %d disk sector size. "
12674                                             "It is handled through Read Modify "
12675                                             "Write but the performance is "
12676                                             "very low.\n",
12677                                             un->un_tgt_blocksize);
12678                                         un->un_rmw_msg_timeid =
12679                                             timeout(sd_rmw_msg_print_handler,
12680                                             un, SD_RMW_MSG_PRINT_TIMEOUT);
12681                                 } else {
12682                                         un->un_rmw_incre_count ++;
12683                                 }
12684                                 mutex_exit(SD_MUTEX(un));
12685                         }
12686 
12687                         nblocks = SD_TGT2SYSBLOCK(un, nblocks);
12688                         partition_offset = SD_TGT2SYSBLOCK(un,
12689                             partition_offset);
12690                 }
12691         }
12692 
12693         /*
12694          * blocknum is the starting block number of the request. At this
12695          * point it is still relative to the start of the minor device.
12696          */
12697         blocknum = xp->xb_blkno;
12698 
12699         /*
12700          * Legacy: If the starting block number is one past the last block
12701          * in the partition, do not set B_ERROR in the buf.
12702          */
12703         if (blocknum == nblocks)  {
12704                 goto error_exit;
12705         }
12706 
12707         /*
12708          * Confirm that the first block of the request lies within the
12709          * partition limits. Also the requested number of bytes must be
12710          * a multiple of the system block size.
12711          */
12712         if ((blocknum < 0) || (blocknum >= nblocks) ||
12713             ((bp->b_bcount & (DEV_BSIZE - 1)) != 0)) {
12714                 bp->b_flags |= B_ERROR;
12715                 goto error_exit;
12716         }
12717 
12718         /*
12719          * If the requsted # blocks exceeds the available # blocks, that
12720          * is an overrun of the partition.
12721          */
12722         if ((!NOT_DEVBSIZE(un)) && is_aligned) {
12723                 requested_nblocks = SD_BYTES2TGTBLOCKS(un, bp->b_bcount);
12724         } else {
12725                 requested_nblocks = SD_BYTES2SYSBLOCKS(bp->b_bcount);
12726         }
12727 
12728         available_nblocks = (size_t)(nblocks - blocknum);
12729         ASSERT(nblocks >= blocknum);
12730 
12731         if (requested_nblocks > available_nblocks) {
12732                 size_t resid;
12733 
12734                 /*
12735                  * Allocate an "overrun" buf to allow the request to proceed
12736                  * for the amount of space available in the partition. The
12737                  * amount not transferred will be added into the b_resid
12738                  * when the operation is complete. The overrun buf
12739                  * replaces the original buf here, and the original buf
12740                  * is saved inside the overrun buf, for later use.
12741                  */
12742                 if ((!NOT_DEVBSIZE(un)) && is_aligned) {
12743                         resid = SD_TGTBLOCKS2BYTES(un,
12744                             (offset_t)(requested_nblocks - available_nblocks));
12745                 } else {
12746                         resid = SD_SYSBLOCKS2BYTES(
12747                             (offset_t)(requested_nblocks - available_nblocks));
12748                 }
12749 
12750                 size_t count = bp->b_bcount - resid;
12751                 /*
12752                  * Note: count is an unsigned entity thus it'll NEVER
12753                  * be less than 0 so ASSERT the original values are
12754                  * correct.
12755                  */
12756                 ASSERT(bp->b_bcount >= resid);
12757 
12758                 bp = sd_bioclone_alloc(bp, count, blocknum,
12759                     (int (*)(struct buf *)) sd_mapblockaddr_iodone);
12760                 xp = SD_GET_XBUF(bp); /* Update for 'new' bp! */
12761                 ASSERT(xp != NULL);
12762         }
12763 
12764         /* At this point there should be no residual for this buf. */
12765         ASSERT(bp->b_resid == 0);
12766 
12767         /* Convert the block number to an absolute address. */
12768         xp->xb_blkno += partition_offset;
12769 
12770         SD_NEXT_IOSTART(index, un, bp);
12771 
12772         SD_TRACE(SD_LOG_IO_PARTITION, un,
12773             "sd_mapblockaddr_iostart: exit 0: buf:0x%p\n", bp);
12774 
12775         return;
12776 
12777 error_exit:
12778         bp->b_resid = bp->b_bcount;
12779         SD_BEGIN_IODONE(index, un, bp);
12780         SD_TRACE(SD_LOG_IO_PARTITION, un,
12781             "sd_mapblockaddr_iostart: exit 1: buf:0x%p\n", bp);
12782 }
12783 
12784 
12785 /*
12786  *    Function: sd_mapblockaddr_iodone
12787  *
12788  * Description: Completion-side processing for partition management.
12789  *
12790  *     Context: May be called under interrupt context
12791  */
12792 
12793 static void
12794 sd_mapblockaddr_iodone(int index, struct sd_lun *un, struct buf *bp)
12795 {
12796         /* int  partition; */   /* Not used, see below. */
12797         ASSERT(un != NULL);
12798         ASSERT(bp != NULL);
12799         ASSERT(!mutex_owned(SD_MUTEX(un)));
12800 
12801         SD_TRACE(SD_LOG_IO_PARTITION, un,
12802             "sd_mapblockaddr_iodone: entry: buf:0x%p\n", bp);
12803 
12804         if (bp->b_iodone == (int (*)(struct buf *)) sd_mapblockaddr_iodone) {
12805                 /*
12806                  * We have an "overrun" buf to deal with...
12807                  */
12808                 struct sd_xbuf  *xp;
12809                 struct buf      *obp;   /* ptr to the original buf */
12810 
12811                 xp = SD_GET_XBUF(bp);
12812                 ASSERT(xp != NULL);
12813 
12814                 /* Retrieve the pointer to the original buf */
12815                 obp = (struct buf *)xp->xb_private;
12816                 ASSERT(obp != NULL);
12817 
12818                 obp->b_resid = obp->b_bcount - (bp->b_bcount - bp->b_resid);
12819                 bioerror(obp, bp->b_error);
12820 
12821                 sd_bioclone_free(bp);
12822 
12823                 /*
12824                  * Get back the original buf.
12825                  * Note that since the restoration of xb_blkno below
12826                  * was removed, the sd_xbuf is not needed.
12827                  */
12828                 bp = obp;
12829                 /*
12830                  * xp = SD_GET_XBUF(bp);
12831                  * ASSERT(xp != NULL);
12832                  */
12833         }
12834 
12835         /*
12836          * Convert sd->xb_blkno back to a minor-device relative value.
12837          * Note: this has been commented out, as it is not needed in the
12838          * current implementation of the driver (ie, since this function
12839          * is at the top of the layering chains, so the info will be
12840          * discarded) and it is in the "hot" IO path.
12841          *
12842          * partition = getminor(bp->b_edev) & SDPART_MASK;
12843          * xp->xb_blkno -= un->un_offset[partition];
12844          */
12845 
12846         SD_NEXT_IODONE(index, un, bp);
12847 
12848         SD_TRACE(SD_LOG_IO_PARTITION, un,
12849             "sd_mapblockaddr_iodone: exit: buf:0x%p\n", bp);
12850 }
12851 
12852 
12853 /*
12854  *    Function: sd_mapblocksize_iostart
12855  *
12856  * Description: Convert between system block size (un->un_sys_blocksize)
12857  *              and target block size (un->un_tgt_blocksize).
12858  *
12859  *     Context: Can sleep to allocate resources.
12860  *
12861  * Assumptions: A higher layer has already performed any partition validation,
12862  *              and converted the xp->xb_blkno to an absolute value relative
12863  *              to the start of the device.
12864  *
12865  *              It is also assumed that the higher layer has implemented
12866  *              an "overrun" mechanism for the case where the request would
12867  *              read/write beyond the end of a partition.  In this case we
12868  *              assume (and ASSERT) that bp->b_resid == 0.
12869  *
12870  *              Note: The implementation for this routine assumes the target
12871  *              block size remains constant between allocation and transport.
12872  */
12873 
12874 static void
12875 sd_mapblocksize_iostart(int index, struct sd_lun *un, struct buf *bp)
12876 {
12877         struct sd_mapblocksize_info     *bsp;
12878         struct sd_xbuf                  *xp;
12879         offset_t first_byte;
12880         daddr_t start_block, end_block;
12881         daddr_t request_bytes;
12882         ushort_t is_aligned = FALSE;
12883 
12884         ASSERT(un != NULL);
12885         ASSERT(bp != NULL);
12886         ASSERT(!mutex_owned(SD_MUTEX(un)));
12887         ASSERT(bp->b_resid == 0);
12888 
12889         SD_TRACE(SD_LOG_IO_RMMEDIA, un,
12890             "sd_mapblocksize_iostart: entry: buf:0x%p\n", bp);
12891 
12892         /*
12893          * For a non-writable CD, a write request is an error
12894          */
12895         if (ISCD(un) && ((bp->b_flags & B_READ) == 0) &&
12896             (un->un_f_mmc_writable_media == FALSE)) {
12897                 bioerror(bp, EIO);
12898                 bp->b_resid = bp->b_bcount;
12899                 SD_BEGIN_IODONE(index, un, bp);
12900                 return;
12901         }
12902 
12903         /*
12904          * We do not need a shadow buf if the device is using
12905          * un->un_sys_blocksize as its block size or if bcount == 0.
12906          * In this case there is no layer-private data block allocated.
12907          */
12908         if ((un->un_tgt_blocksize == DEV_BSIZE && !un->un_f_enable_rmw) ||
12909             (bp->b_bcount == 0)) {
12910                 goto done;
12911         }
12912 
12913 #if defined(__i386) || defined(__amd64)
12914         /* We do not support non-block-aligned transfers for ROD devices */
12915         ASSERT(!ISROD(un));
12916 #endif
12917 
12918         xp = SD_GET_XBUF(bp);
12919         ASSERT(xp != NULL);
12920 
12921         SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: "
12922             "tgt_blocksize:0x%x sys_blocksize: 0x%x\n",
12923             un->un_tgt_blocksize, DEV_BSIZE);
12924         SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: "
12925             "request start block:0x%x\n", xp->xb_blkno);
12926         SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: "
12927             "request len:0x%x\n", bp->b_bcount);
12928 
12929         /*
12930          * Allocate the layer-private data area for the mapblocksize layer.
12931          * Layers are allowed to use the xp_private member of the sd_xbuf
12932          * struct to store the pointer to their layer-private data block, but
12933          * each layer also has the responsibility of restoring the prior
12934          * contents of xb_private before returning the buf/xbuf to the
12935          * higher layer that sent it.
12936          *
12937          * Here we save the prior contents of xp->xb_private into the
12938          * bsp->mbs_oprivate field of our layer-private data area. This value
12939          * is restored by sd_mapblocksize_iodone() just prior to freeing up
12940          * the layer-private area and returning the buf/xbuf to the layer
12941          * that sent it.
12942          *
12943          * Note that here we use kmem_zalloc for the allocation as there are
12944          * parts of the mapblocksize code that expect certain fields to be
12945          * zero unless explicitly set to a required value.
12946          */
12947         bsp = kmem_zalloc(sizeof (struct sd_mapblocksize_info), KM_SLEEP);
12948         bsp->mbs_oprivate = xp->xb_private;
12949         xp->xb_private = bsp;
12950 
12951         /*
12952          * This treats the data on the disk (target) as an array of bytes.
12953          * first_byte is the byte offset, from the beginning of the device,
12954          * to the location of the request. This is converted from a
12955          * un->un_sys_blocksize block address to a byte offset, and then back
12956          * to a block address based upon a un->un_tgt_blocksize block size.
12957          *
12958          * xp->xb_blkno should be absolute upon entry into this function,
12959          * but, but it is based upon partitions that use the "system"
12960          * block size. It must be adjusted to reflect the block size of
12961          * the target.
12962          *
12963          * Note that end_block is actually the block that follows the last
12964          * block of the request, but that's what is needed for the computation.
12965          */
12966         first_byte  = SD_SYSBLOCKS2BYTES((offset_t)xp->xb_blkno);
12967         if (un->un_f_enable_rmw) {
12968                 start_block = xp->xb_blkno =
12969                     (first_byte / un->un_phy_blocksize) *
12970                     (un->un_phy_blocksize / DEV_BSIZE);
12971                 end_block   = ((first_byte + bp->b_bcount +
12972                     un->un_phy_blocksize - 1) / un->un_phy_blocksize) *
12973                     (un->un_phy_blocksize / DEV_BSIZE);
12974         } else {
12975                 start_block = xp->xb_blkno = first_byte / un->un_tgt_blocksize;
12976                 end_block   = (first_byte + bp->b_bcount +
12977                     un->un_tgt_blocksize - 1) / un->un_tgt_blocksize;
12978         }
12979 
12980         /* request_bytes is rounded up to a multiple of the target block size */
12981         request_bytes = (end_block - start_block) * un->un_tgt_blocksize;
12982 
12983         /*
12984          * See if the starting address of the request and the request
12985          * length are aligned on a un->un_tgt_blocksize boundary. If aligned
12986          * then we do not need to allocate a shadow buf to handle the request.
12987          */
12988         if (un->un_f_enable_rmw) {
12989                 if (((first_byte % un->un_phy_blocksize) == 0) &&
12990                     ((bp->b_bcount % un->un_phy_blocksize) == 0)) {
12991                         is_aligned = TRUE;
12992                 }
12993         } else {
12994                 if (((first_byte % un->un_tgt_blocksize) == 0) &&
12995                     ((bp->b_bcount % un->un_tgt_blocksize) == 0)) {
12996                         is_aligned = TRUE;
12997                 }
12998         }
12999 
13000         if ((bp->b_flags & B_READ) == 0) {
13001                 /*
13002                  * Lock the range for a write operation. An aligned request is
13003                  * considered a simple write; otherwise the request must be a
13004                  * read-modify-write.
13005                  */
13006                 bsp->mbs_wmp = sd_range_lock(un, start_block, end_block - 1,
13007                     (is_aligned == TRUE) ? SD_WTYPE_SIMPLE : SD_WTYPE_RMW);
13008         }
13009 
13010         /*
13011          * Alloc a shadow buf if the request is not aligned. Also, this is
13012          * where the READ command is generated for a read-modify-write. (The
13013          * write phase is deferred until after the read completes.)
13014          */
13015         if (is_aligned == FALSE) {
13016 
13017                 struct sd_mapblocksize_info     *shadow_bsp;
13018                 struct sd_xbuf  *shadow_xp;
13019                 struct buf      *shadow_bp;
13020 
13021                 /*
13022                  * Allocate the shadow buf and it associated xbuf. Note that
13023                  * after this call the xb_blkno value in both the original
13024                  * buf's sd_xbuf _and_ the shadow buf's sd_xbuf will be the
13025                  * same: absolute relative to the start of the device, and
13026                  * adjusted for the target block size. The b_blkno in the
13027                  * shadow buf will also be set to this value. We should never
13028                  * change b_blkno in the original bp however.
13029                  *
13030                  * Note also that the shadow buf will always need to be a
13031                  * READ command, regardless of whether the incoming command
13032                  * is a READ or a WRITE.
13033                  */
13034                 shadow_bp = sd_shadow_buf_alloc(bp, request_bytes, B_READ,
13035                     xp->xb_blkno,
13036                     (int (*)(struct buf *)) sd_mapblocksize_iodone);
13037 
13038                 shadow_xp = SD_GET_XBUF(shadow_bp);
13039 
13040                 /*
13041                  * Allocate the layer-private data for the shadow buf.
13042                  * (No need to preserve xb_private in the shadow xbuf.)
13043                  */
13044                 shadow_xp->xb_private = shadow_bsp =
13045                     kmem_zalloc(sizeof (struct sd_mapblocksize_info), KM_SLEEP);
13046 
13047                 /*
13048                  * bsp->mbs_copy_offset is used later by sd_mapblocksize_iodone
13049                  * to figure out where the start of the user data is (based upon
13050                  * the system block size) in the data returned by the READ
13051                  * command (which will be based upon the target blocksize). Note
13052                  * that this is only really used if the request is unaligned.
13053                  */
13054                 if (un->un_f_enable_rmw) {
13055                         bsp->mbs_copy_offset = (ssize_t)(first_byte -
13056                             ((offset_t)xp->xb_blkno * un->un_sys_blocksize));
13057                         ASSERT((bsp->mbs_copy_offset >= 0) &&
13058                             (bsp->mbs_copy_offset < un->un_phy_blocksize));
13059                 } else {
13060                         bsp->mbs_copy_offset = (ssize_t)(first_byte -
13061                             ((offset_t)xp->xb_blkno * un->un_tgt_blocksize));
13062                         ASSERT((bsp->mbs_copy_offset >= 0) &&
13063                             (bsp->mbs_copy_offset < un->un_tgt_blocksize));
13064                 }
13065 
13066                 shadow_bsp->mbs_copy_offset = bsp->mbs_copy_offset;
13067 
13068                 shadow_bsp->mbs_layer_index = bsp->mbs_layer_index = index;
13069 
13070                 /* Transfer the wmap (if any) to the shadow buf */
13071                 shadow_bsp->mbs_wmp = bsp->mbs_wmp;
13072                 bsp->mbs_wmp = NULL;
13073 
13074                 /*
13075                  * The shadow buf goes on from here in place of the
13076                  * original buf.
13077                  */
13078                 shadow_bsp->mbs_orig_bp = bp;
13079                 bp = shadow_bp;
13080         }
13081 
13082         SD_INFO(SD_LOG_IO_RMMEDIA, un,
13083             "sd_mapblocksize_iostart: tgt start block:0x%x\n", xp->xb_blkno);
13084         SD_INFO(SD_LOG_IO_RMMEDIA, un,
13085             "sd_mapblocksize_iostart: tgt request len:0x%x\n",
13086             request_bytes);
13087         SD_INFO(SD_LOG_IO_RMMEDIA, un,
13088             "sd_mapblocksize_iostart: shadow buf:0x%x\n", bp);
13089 
13090 done:
13091         SD_NEXT_IOSTART(index, un, bp);
13092 
13093         SD_TRACE(SD_LOG_IO_RMMEDIA, un,
13094             "sd_mapblocksize_iostart: exit: buf:0x%p\n", bp);
13095 }
13096 
13097 
13098 /*
13099  *    Function: sd_mapblocksize_iodone
13100  *
13101  * Description: Completion side processing for block-size mapping.
13102  *
13103  *     Context: May be called under interrupt context
13104  */
13105 
13106 static void
13107 sd_mapblocksize_iodone(int index, struct sd_lun *un, struct buf *bp)
13108 {
13109         struct sd_mapblocksize_info     *bsp;
13110         struct sd_xbuf  *xp;
13111         struct sd_xbuf  *orig_xp;       /* sd_xbuf for the original buf */
13112         struct buf      *orig_bp;       /* ptr to the original buf */
13113         offset_t        shadow_end;
13114         offset_t        request_end;
13115         offset_t        shadow_start;
13116         ssize_t         copy_offset;
13117         size_t          copy_length;
13118         size_t          shortfall;
13119         uint_t          is_write;       /* TRUE if this bp is a WRITE */
13120         uint_t          has_wmap;       /* TRUE is this bp has a wmap */
13121 
13122         ASSERT(un != NULL);
13123         ASSERT(bp != NULL);
13124 
13125         SD_TRACE(SD_LOG_IO_RMMEDIA, un,
13126             "sd_mapblocksize_iodone: entry: buf:0x%p\n", bp);
13127 
13128         /*
13129          * There is no shadow buf or layer-private data if the target is
13130          * using un->un_sys_blocksize as its block size or if bcount == 0.
13131          */
13132         if ((un->un_tgt_blocksize == DEV_BSIZE && !un->un_f_enable_rmw) ||
13133             (bp->b_bcount == 0)) {
13134                 goto exit;
13135         }
13136 
13137         xp = SD_GET_XBUF(bp);
13138         ASSERT(xp != NULL);
13139 
13140         /* Retrieve the pointer to the layer-private data area from the xbuf. */
13141         bsp = xp->xb_private;
13142 
13143         is_write = ((bp->b_flags & B_READ) == 0) ? TRUE : FALSE;
13144         has_wmap = (bsp->mbs_wmp != NULL) ? TRUE : FALSE;
13145 
13146         if (is_write) {
13147                 /*
13148                  * For a WRITE request we must free up the block range that
13149                  * we have locked up.  This holds regardless of whether this is
13150                  * an aligned write request or a read-modify-write request.
13151                  */
13152                 sd_range_unlock(un, bsp->mbs_wmp);
13153                 bsp->mbs_wmp = NULL;
13154         }
13155 
13156         if ((bp->b_iodone != (int(*)(struct buf *))sd_mapblocksize_iodone)) {
13157                 /*
13158                  * An aligned read or write command will have no shadow buf;
13159                  * there is not much else to do with it.
13160                  */
13161                 goto done;
13162         }
13163 
13164         orig_bp = bsp->mbs_orig_bp;
13165         ASSERT(orig_bp != NULL);
13166         orig_xp = SD_GET_XBUF(orig_bp);
13167         ASSERT(orig_xp != NULL);
13168         ASSERT(!mutex_owned(SD_MUTEX(un)));
13169 
13170         if (!is_write && has_wmap) {
13171                 /*
13172                  * A READ with a wmap means this is the READ phase of a
13173                  * read-modify-write. If an error occurred on the READ then
13174                  * we do not proceed with the WRITE phase or copy any data.
13175                  * Just release the write maps and return with an error.
13176                  */
13177                 if ((bp->b_resid != 0) || (bp->b_error != 0)) {
13178                         orig_bp->b_resid = orig_bp->b_bcount;
13179                         bioerror(orig_bp, bp->b_error);
13180                         sd_range_unlock(un, bsp->mbs_wmp);
13181                         goto freebuf_done;
13182                 }
13183         }
13184 
13185         /*
13186          * Here is where we set up to copy the data from the shadow buf
13187          * into the space associated with the original buf.
13188          *
13189          * To deal with the conversion between block sizes, these
13190          * computations treat the data as an array of bytes, with the
13191          * first byte (byte 0) corresponding to the first byte in the
13192          * first block on the disk.
13193          */
13194 
13195         /*
13196          * shadow_start and shadow_len indicate the location and size of
13197          * the data returned with the shadow IO request.
13198          */
13199         if (un->un_f_enable_rmw) {
13200                 shadow_start  = SD_SYSBLOCKS2BYTES((offset_t)xp->xb_blkno);
13201         } else {
13202                 shadow_start  = SD_TGTBLOCKS2BYTES(un, (offset_t)xp->xb_blkno);
13203         }
13204         shadow_end    = shadow_start + bp->b_bcount - bp->b_resid;
13205 
13206         /*
13207          * copy_offset gives the offset (in bytes) from the start of the first
13208          * block of the READ request to the beginning of the data.  We retrieve
13209          * this value from xb_pktp in the ORIGINAL xbuf, as it has been saved
13210          * there by sd_mapblockize_iostart(). copy_length gives the amount of
13211          * data to be copied (in bytes).
13212          */
13213         copy_offset  = bsp->mbs_copy_offset;
13214         if (un->un_f_enable_rmw) {
13215                 ASSERT((copy_offset >= 0) &&
13216                     (copy_offset < un->un_phy_blocksize));
13217         } else {
13218                 ASSERT((copy_offset >= 0) &&
13219                     (copy_offset < un->un_tgt_blocksize));
13220         }
13221 
13222         copy_length  = orig_bp->b_bcount;
13223         request_end  = shadow_start + copy_offset + orig_bp->b_bcount;
13224 
13225         /*
13226          * Set up the resid and error fields of orig_bp as appropriate.
13227          */
13228         if (shadow_end >= request_end) {
13229                 /* We got all the requested data; set resid to zero */
13230                 orig_bp->b_resid = 0;
13231         } else {
13232                 /*
13233                  * We failed to get enough data to fully satisfy the original
13234                  * request. Just copy back whatever data we got and set
13235                  * up the residual and error code as required.
13236                  *
13237                  * 'shortfall' is the amount by which the data received with the
13238                  * shadow buf has "fallen short" of the requested amount.
13239                  */
13240                 shortfall = (size_t)(request_end - shadow_end);
13241 
13242                 if (shortfall > orig_bp->b_bcount) {
13243                         /*
13244                          * We did not get enough data to even partially
13245                          * fulfill the original request.  The residual is
13246                          * equal to the amount requested.
13247                          */
13248                         orig_bp->b_resid = orig_bp->b_bcount;
13249                 } else {
13250                         /*
13251                          * We did not get all the data that we requested
13252                          * from the device, but we will try to return what
13253                          * portion we did get.
13254                          */
13255                         orig_bp->b_resid = shortfall;
13256                 }
13257                 ASSERT(copy_length >= orig_bp->b_resid);
13258                 copy_length  -= orig_bp->b_resid;
13259         }
13260 
13261         /* Propagate the error code from the shadow buf to the original buf */
13262         bioerror(orig_bp, bp->b_error);
13263 
13264         if (is_write) {
13265                 goto freebuf_done;      /* No data copying for a WRITE */
13266         }
13267 
13268         if (has_wmap) {
13269                 /*
13270                  * This is a READ command from the READ phase of a
13271                  * read-modify-write request. We have to copy the data given
13272                  * by the user OVER the data returned by the READ command,
13273                  * then convert the command from a READ to a WRITE and send
13274                  * it back to the target.
13275                  */
13276                 bcopy(orig_bp->b_un.b_addr, bp->b_un.b_addr + copy_offset,
13277                     copy_length);
13278 
13279                 bp->b_flags &= ~((int)B_READ);   /* Convert to a WRITE */
13280 
13281                 /*
13282                  * Dispatch the WRITE command to the taskq thread, which
13283                  * will in turn send the command to the target. When the
13284                  * WRITE command completes, we (sd_mapblocksize_iodone())
13285                  * will get called again as part of the iodone chain
13286                  * processing for it. Note that we will still be dealing
13287                  * with the shadow buf at that point.
13288                  */
13289                 if (taskq_dispatch(sd_wmr_tq, sd_read_modify_write_task, bp,
13290                     KM_NOSLEEP) != 0) {
13291                         /*
13292                          * Dispatch was successful so we are done. Return
13293                          * without going any higher up the iodone chain. Do
13294                          * not free up any layer-private data until after the
13295                          * WRITE completes.
13296                          */
13297                         return;
13298                 }
13299 
13300                 /*
13301                  * Dispatch of the WRITE command failed; set up the error
13302                  * condition and send this IO back up the iodone chain.
13303                  */
13304                 bioerror(orig_bp, EIO);
13305                 orig_bp->b_resid = orig_bp->b_bcount;
13306 
13307         } else {
13308                 /*
13309                  * This is a regular READ request (ie, not a RMW). Copy the
13310                  * data from the shadow buf into the original buf. The
13311                  * copy_offset compensates for any "misalignment" between the
13312                  * shadow buf (with its un->un_tgt_blocksize blocks) and the
13313                  * original buf (with its un->un_sys_blocksize blocks).
13314                  */
13315                 bcopy(bp->b_un.b_addr + copy_offset, orig_bp->b_un.b_addr,
13316                     copy_length);
13317         }
13318 
13319 freebuf_done:
13320 
13321         /*
13322          * At this point we still have both the shadow buf AND the original
13323          * buf to deal with, as well as the layer-private data area in each.
13324          * Local variables are as follows:
13325          *
13326          * bp -- points to shadow buf
13327          * xp -- points to xbuf of shadow buf
13328          * bsp -- points to layer-private data area of shadow buf
13329          * orig_bp -- points to original buf
13330          *
13331          * First free the shadow buf and its associated xbuf, then free the
13332          * layer-private data area from the shadow buf. There is no need to
13333          * restore xb_private in the shadow xbuf.
13334          */
13335         sd_shadow_buf_free(bp);
13336         kmem_free(bsp, sizeof (struct sd_mapblocksize_info));
13337 
13338         /*
13339          * Now update the local variables to point to the original buf, xbuf,
13340          * and layer-private area.
13341          */
13342         bp = orig_bp;
13343         xp = SD_GET_XBUF(bp);
13344         ASSERT(xp != NULL);
13345         ASSERT(xp == orig_xp);
13346         bsp = xp->xb_private;
13347         ASSERT(bsp != NULL);
13348 
13349 done:
13350         /*
13351          * Restore xb_private to whatever it was set to by the next higher
13352          * layer in the chain, then free the layer-private data area.
13353          */
13354         xp->xb_private = bsp->mbs_oprivate;
13355         kmem_free(bsp, sizeof (struct sd_mapblocksize_info));
13356 
13357 exit:
13358         SD_TRACE(SD_LOG_IO_RMMEDIA, SD_GET_UN(bp),
13359             "sd_mapblocksize_iodone: calling SD_NEXT_IODONE: buf:0x%p\n", bp);
13360 
13361         SD_NEXT_IODONE(index, un, bp);
13362 }
13363 
13364 
13365 /*
13366  *    Function: sd_checksum_iostart
13367  *
13368  * Description: A stub function for a layer that's currently not used.
13369  *              For now just a placeholder.
13370  *
13371  *     Context: Kernel thread context
13372  */
13373 
13374 static void
13375 sd_checksum_iostart(int index, struct sd_lun *un, struct buf *bp)
13376 {
13377         ASSERT(un != NULL);
13378         ASSERT(bp != NULL);
13379         ASSERT(!mutex_owned(SD_MUTEX(un)));
13380         SD_NEXT_IOSTART(index, un, bp);
13381 }
13382 
13383 
13384 /*
13385  *    Function: sd_checksum_iodone
13386  *
13387  * Description: A stub function for a layer that's currently not used.
13388  *              For now just a placeholder.
13389  *
13390  *     Context: May be called under interrupt context
13391  */
13392 
13393 static void
13394 sd_checksum_iodone(int index, struct sd_lun *un, struct buf *bp)
13395 {
13396         ASSERT(un != NULL);
13397         ASSERT(bp != NULL);
13398         ASSERT(!mutex_owned(SD_MUTEX(un)));
13399         SD_NEXT_IODONE(index, un, bp);
13400 }
13401 
13402 
13403 /*
13404  *    Function: sd_checksum_uscsi_iostart
13405  *
13406  * Description: A stub function for a layer that's currently not used.
13407  *              For now just a placeholder.
13408  *
13409  *     Context: Kernel thread context
13410  */
13411 
13412 static void
13413 sd_checksum_uscsi_iostart(int index, struct sd_lun *un, struct buf *bp)
13414 {
13415         ASSERT(un != NULL);
13416         ASSERT(bp != NULL);
13417         ASSERT(!mutex_owned(SD_MUTEX(un)));
13418         SD_NEXT_IOSTART(index, un, bp);
13419 }
13420 
13421 
13422 /*
13423  *    Function: sd_checksum_uscsi_iodone
13424  *
13425  * Description: A stub function for a layer that's currently not used.
13426  *              For now just a placeholder.
13427  *
13428  *     Context: May be called under interrupt context
13429  */
13430 
13431 static void
13432 sd_checksum_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp)
13433 {
13434         ASSERT(un != NULL);
13435         ASSERT(bp != NULL);
13436         ASSERT(!mutex_owned(SD_MUTEX(un)));
13437         SD_NEXT_IODONE(index, un, bp);
13438 }
13439 
13440 
13441 /*
13442  *    Function: sd_pm_iostart
13443  *
13444  * Description: iostart-side routine for Power mangement.
13445  *
13446  *     Context: Kernel thread context
13447  */
13448 
13449 static void
13450 sd_pm_iostart(int index, struct sd_lun *un, struct buf *bp)
13451 {
13452         ASSERT(un != NULL);
13453         ASSERT(bp != NULL);
13454         ASSERT(!mutex_owned(SD_MUTEX(un)));
13455         ASSERT(!mutex_owned(&un->un_pm_mutex));
13456 
13457         SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: entry\n");
13458 
13459         if (sd_pm_entry(un) != DDI_SUCCESS) {
13460                 /*
13461                  * Set up to return the failed buf back up the 'iodone'
13462                  * side of the calling chain.
13463                  */
13464                 bioerror(bp, EIO);
13465                 bp->b_resid = bp->b_bcount;
13466 
13467                 SD_BEGIN_IODONE(index, un, bp);
13468 
13469                 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: exit\n");
13470                 return;
13471         }
13472 
13473         SD_NEXT_IOSTART(index, un, bp);
13474 
13475         SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: exit\n");
13476 }
13477 
13478 
13479 /*
13480  *    Function: sd_pm_iodone
13481  *
13482  * Description: iodone-side routine for power mangement.
13483  *
13484  *     Context: may be called from interrupt context
13485  */
13486 
13487 static void
13488 sd_pm_iodone(int index, struct sd_lun *un, struct buf *bp)
13489 {
13490         ASSERT(un != NULL);
13491         ASSERT(bp != NULL);
13492         ASSERT(!mutex_owned(&un->un_pm_mutex));
13493 
13494         SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iodone: entry\n");
13495 
13496         /*
13497          * After attach the following flag is only read, so don't
13498          * take the penalty of acquiring a mutex for it.
13499          */
13500         if (un->un_f_pm_is_enabled == TRUE) {
13501                 sd_pm_exit(un);
13502         }
13503 
13504         SD_NEXT_IODONE(index, un, bp);
13505 
13506         SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iodone: exit\n");
13507 }
13508 
13509 
13510 /*
13511  *    Function: sd_core_iostart
13512  *
13513  * Description: Primary driver function for enqueuing buf(9S) structs from
13514  *              the system and initiating IO to the target device
13515  *
13516  *     Context: Kernel thread context. Can sleep.
13517  *
13518  * Assumptions:  - The given xp->xb_blkno is absolute
13519  *                 (ie, relative to the start of the device).
13520  *               - The IO is to be done using the native blocksize of
13521  *                 the device, as specified in un->un_tgt_blocksize.
13522  */
13523 /* ARGSUSED */
13524 static void
13525 sd_core_iostart(int index, struct sd_lun *un, struct buf *bp)
13526 {
13527         struct sd_xbuf *xp;
13528 
13529         ASSERT(un != NULL);
13530         ASSERT(bp != NULL);
13531         ASSERT(!mutex_owned(SD_MUTEX(un)));
13532         ASSERT(bp->b_resid == 0);
13533 
13534         SD_TRACE(SD_LOG_IO_CORE, un, "sd_core_iostart: entry: bp:0x%p\n", bp);
13535 
13536         xp = SD_GET_XBUF(bp);
13537         ASSERT(xp != NULL);
13538 
13539         mutex_enter(SD_MUTEX(un));
13540 
13541         /*
13542          * If we are currently in the failfast state, fail any new IO
13543          * that has B_FAILFAST set, then return.
13544          */
13545         if ((bp->b_flags & B_FAILFAST) &&
13546             (un->un_failfast_state == SD_FAILFAST_ACTIVE)) {
13547                 mutex_exit(SD_MUTEX(un));
13548                 bioerror(bp, EIO);
13549                 bp->b_resid = bp->b_bcount;
13550                 SD_BEGIN_IODONE(index, un, bp);
13551                 return;
13552         }
13553 
13554         if (SD_IS_DIRECT_PRIORITY(xp)) {
13555                 /*
13556                  * Priority command -- transport it immediately.
13557                  *
13558                  * Note: We may want to assert that USCSI_DIAGNOSE is set,
13559                  * because all direct priority commands should be associated
13560                  * with error recovery actions which we don't want to retry.
13561                  */
13562                 sd_start_cmds(un, bp);
13563         } else {
13564                 /*
13565                  * Normal command -- add it to the wait queue, then start
13566                  * transporting commands from the wait queue.
13567                  */
13568                 sd_add_buf_to_waitq(un, bp);
13569                 SD_UPDATE_KSTATS(un, kstat_waitq_enter, bp);
13570                 sd_start_cmds(un, NULL);
13571         }
13572 
13573         mutex_exit(SD_MUTEX(un));
13574 
13575         SD_TRACE(SD_LOG_IO_CORE, un, "sd_core_iostart: exit: bp:0x%p\n", bp);
13576 }
13577 
13578 
13579 /*
13580  *    Function: sd_init_cdb_limits
13581  *
13582  * Description: This is to handle scsi_pkt initialization differences
13583  *              between the driver platforms.
13584  *
13585  *              Legacy behaviors:
13586  *
13587  *              If the block number or the sector count exceeds the
13588  *              capabilities of a Group 0 command, shift over to a
13589  *              Group 1 command. We don't blindly use Group 1
13590  *              commands because a) some drives (CDC Wren IVs) get a
13591  *              bit confused, and b) there is probably a fair amount
13592  *              of speed difference for a target to receive and decode
13593  *              a 10 byte command instead of a 6 byte command.
13594  *
13595  *              The xfer time difference of 6 vs 10 byte CDBs is
13596  *              still significant so this code is still worthwhile.
13597  *              10 byte CDBs are very inefficient with the fas HBA driver
13598  *              and older disks. Each CDB byte took 1 usec with some
13599  *              popular disks.
13600  *
13601  *     Context: Must be called at attach time
13602  */
13603 
13604 static void
13605 sd_init_cdb_limits(struct sd_lun *un)
13606 {
13607         int hba_cdb_limit;
13608 
13609         /*
13610          * Use CDB_GROUP1 commands for most devices except for
13611          * parallel SCSI fixed drives in which case we get better
13612          * performance using CDB_GROUP0 commands (where applicable).
13613          */
13614         un->un_mincdb = SD_CDB_GROUP1;
13615 #if !defined(__fibre)
13616         if (!un->un_f_is_fibre && !un->un_f_cfg_is_atapi && !ISROD(un) &&
13617             !un->un_f_has_removable_media) {
13618                 un->un_mincdb = SD_CDB_GROUP0;
13619         }
13620 #endif
13621 
13622         /*
13623          * Try to read the max-cdb-length supported by HBA.
13624          */
13625         un->un_max_hba_cdb = scsi_ifgetcap(SD_ADDRESS(un), "max-cdb-length", 1);
13626         if (0 >= un->un_max_hba_cdb) {
13627                 un->un_max_hba_cdb = CDB_GROUP4;
13628                 hba_cdb_limit = SD_CDB_GROUP4;
13629         } else if (0 < un->un_max_hba_cdb &&
13630             un->un_max_hba_cdb < CDB_GROUP1) {
13631                 hba_cdb_limit = SD_CDB_GROUP0;
13632         } else if (CDB_GROUP1 <= un->un_max_hba_cdb &&
13633             un->un_max_hba_cdb < CDB_GROUP5) {
13634                 hba_cdb_limit = SD_CDB_GROUP1;
13635         } else if (CDB_GROUP5 <= un->un_max_hba_cdb &&
13636             un->un_max_hba_cdb < CDB_GROUP4) {
13637                 hba_cdb_limit = SD_CDB_GROUP5;
13638         } else {
13639                 hba_cdb_limit = SD_CDB_GROUP4;
13640         }
13641 
13642         /*
13643          * Use CDB_GROUP5 commands for removable devices.  Use CDB_GROUP4
13644          * commands for fixed disks unless we are building for a 32 bit
13645          * kernel.
13646          */
13647 #ifdef _LP64
13648         un->un_maxcdb = (un->un_f_has_removable_media) ? SD_CDB_GROUP5 :
13649             min(hba_cdb_limit, SD_CDB_GROUP4);
13650 #else
13651         un->un_maxcdb = (un->un_f_has_removable_media) ? SD_CDB_GROUP5 :
13652             min(hba_cdb_limit, SD_CDB_GROUP1);
13653 #endif
13654 
13655         un->un_status_len = (int)((un->un_f_arq_enabled == TRUE)
13656             ? sizeof (struct scsi_arq_status) : 1);
13657         if (!ISCD(un))
13658                 un->un_cmd_timeout = (ushort_t)sd_io_time;
13659         un->un_uscsi_timeout = ((ISCD(un)) ? 2 : 1) * un->un_cmd_timeout;
13660 }
13661 
13662 
13663 /*
13664  *    Function: sd_initpkt_for_buf
13665  *
13666  * Description: Allocate and initialize for transport a scsi_pkt struct,
13667  *              based upon the info specified in the given buf struct.
13668  *
13669  *              Assumes the xb_blkno in the request is absolute (ie,
13670  *              relative to the start of the device (NOT partition!).
13671  *              Also assumes that the request is using the native block
13672  *              size of the device (as returned by the READ CAPACITY
13673  *              command).
13674  *
13675  * Return Code: SD_PKT_ALLOC_SUCCESS
13676  *              SD_PKT_ALLOC_FAILURE
13677  *              SD_PKT_ALLOC_FAILURE_NO_DMA
13678  *              SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL
13679  *
13680  *     Context: Kernel thread and may be called from software interrupt context
13681  *              as part of a sdrunout callback. This function may not block or
13682  *              call routines that block
13683  */
13684 
13685 static int
13686 sd_initpkt_for_buf(struct buf *bp, struct scsi_pkt **pktpp)
13687 {
13688         struct sd_xbuf  *xp;
13689         struct scsi_pkt *pktp = NULL;
13690         struct sd_lun   *un;
13691         size_t          blockcount;
13692         daddr_t         startblock;
13693         int             rval;
13694         int             cmd_flags;
13695 
13696         ASSERT(bp != NULL);
13697         ASSERT(pktpp != NULL);
13698         xp = SD_GET_XBUF(bp);
13699         ASSERT(xp != NULL);
13700         un = SD_GET_UN(bp);
13701         ASSERT(un != NULL);
13702         ASSERT(mutex_owned(SD_MUTEX(un)));
13703         ASSERT(bp->b_resid == 0);
13704 
13705         SD_TRACE(SD_LOG_IO_CORE, un,
13706             "sd_initpkt_for_buf: entry: buf:0x%p\n", bp);
13707 
13708         mutex_exit(SD_MUTEX(un));
13709 
13710 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */
13711         if (xp->xb_pkt_flags & SD_XB_DMA_FREED) {
13712                 /*
13713                  * Already have a scsi_pkt -- just need DMA resources.
13714                  * We must recompute the CDB in case the mapping returns
13715                  * a nonzero pkt_resid.
13716                  * Note: if this is a portion of a PKT_DMA_PARTIAL transfer
13717                  * that is being retried, the unmap/remap of the DMA resouces
13718                  * will result in the entire transfer starting over again
13719                  * from the very first block.
13720                  */
13721                 ASSERT(xp->xb_pktp != NULL);
13722                 pktp = xp->xb_pktp;
13723         } else {
13724                 pktp = NULL;
13725         }
13726 #endif /* __i386 || __amd64 */
13727 
13728         startblock = xp->xb_blkno;   /* Absolute block num. */
13729         blockcount = SD_BYTES2TGTBLOCKS(un, bp->b_bcount);
13730 
13731         cmd_flags = un->un_pkt_flags | (xp->xb_pkt_flags & SD_XB_INITPKT_MASK);
13732 
13733         /*
13734          * sd_setup_rw_pkt will determine the appropriate CDB group to use,
13735          * call scsi_init_pkt, and build the CDB.
13736          */
13737         rval = sd_setup_rw_pkt(un, &pktp, bp,
13738             cmd_flags, sdrunout, (caddr_t)un,
13739             startblock, blockcount);
13740 
13741         if (rval == 0) {
13742                 /*
13743                  * Success.
13744                  *
13745                  * If partial DMA is being used and required for this transfer.
13746                  * set it up here.
13747                  */
13748                 if ((un->un_pkt_flags & PKT_DMA_PARTIAL) != 0 &&
13749                     (pktp->pkt_resid != 0)) {
13750 
13751                         /*
13752                          * Save the CDB length and pkt_resid for the
13753                          * next xfer
13754                          */
13755                         xp->xb_dma_resid = pktp->pkt_resid;
13756 
13757                         /* rezero resid */
13758                         pktp->pkt_resid = 0;
13759 
13760                 } else {
13761                         xp->xb_dma_resid = 0;
13762                 }
13763 
13764                 pktp->pkt_flags = un->un_tagflags;
13765                 pktp->pkt_time  = un->un_cmd_timeout;
13766                 pktp->pkt_comp  = sdintr;
13767 
13768                 pktp->pkt_private = bp;
13769                 *pktpp = pktp;
13770 
13771                 SD_TRACE(SD_LOG_IO_CORE, un,
13772                     "sd_initpkt_for_buf: exit: buf:0x%p\n", bp);
13773 
13774 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */
13775                 xp->xb_pkt_flags &= ~SD_XB_DMA_FREED;
13776 #endif
13777 
13778                 mutex_enter(SD_MUTEX(un));
13779                 return (SD_PKT_ALLOC_SUCCESS);
13780 
13781         }
13782 
13783         /*
13784          * SD_PKT_ALLOC_FAILURE is the only expected failure code
13785          * from sd_setup_rw_pkt.
13786          */
13787         ASSERT(rval == SD_PKT_ALLOC_FAILURE);
13788 
13789         if (rval == SD_PKT_ALLOC_FAILURE) {
13790                 *pktpp = NULL;
13791                 /*
13792                  * Set the driver state to RWAIT to indicate the driver
13793                  * is waiting on resource allocations. The driver will not
13794                  * suspend, pm_suspend, or detatch while the state is RWAIT.
13795                  */
13796                 mutex_enter(SD_MUTEX(un));
13797                 New_state(un, SD_STATE_RWAIT);
13798 
13799                 SD_ERROR(SD_LOG_IO_CORE, un,
13800                     "sd_initpkt_for_buf: No pktp. exit bp:0x%p\n", bp);
13801 
13802                 if ((bp->b_flags & B_ERROR) != 0) {
13803                         return (SD_PKT_ALLOC_FAILURE_NO_DMA);
13804                 }
13805                 return (SD_PKT_ALLOC_FAILURE);
13806         } else {
13807                 /*
13808                  * PKT_ALLOC_FAILURE_CDB_TOO_SMALL
13809                  *
13810                  * This should never happen.  Maybe someone messed with the
13811                  * kernel's minphys?
13812                  */
13813                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
13814                     "Request rejected: too large for CDB: "
13815                     "lba:0x%08lx  len:0x%08lx\n", startblock, blockcount);
13816                 SD_ERROR(SD_LOG_IO_CORE, un,
13817                     "sd_initpkt_for_buf: No cp. exit bp:0x%p\n", bp);
13818                 mutex_enter(SD_MUTEX(un));
13819                 return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL);
13820 
13821         }
13822 }
13823 
13824 
13825 /*
13826  *    Function: sd_destroypkt_for_buf
13827  *
13828  * Description: Free the scsi_pkt(9S) for the given bp (buf IO processing).
13829  *
13830  *     Context: Kernel thread or interrupt context
13831  */
13832 
13833 static void
13834 sd_destroypkt_for_buf(struct buf *bp)
13835 {
13836         ASSERT(bp != NULL);
13837         ASSERT(SD_GET_UN(bp) != NULL);
13838 
13839         SD_TRACE(SD_LOG_IO_CORE, SD_GET_UN(bp),
13840             "sd_destroypkt_for_buf: entry: buf:0x%p\n", bp);
13841 
13842         ASSERT(SD_GET_PKTP(bp) != NULL);
13843         scsi_destroy_pkt(SD_GET_PKTP(bp));
13844 
13845         SD_TRACE(SD_LOG_IO_CORE, SD_GET_UN(bp),
13846             "sd_destroypkt_for_buf: exit: buf:0x%p\n", bp);
13847 }
13848 
13849 /*
13850  *    Function: sd_setup_rw_pkt
13851  *
13852  * Description: Determines appropriate CDB group for the requested LBA
13853  *              and transfer length, calls scsi_init_pkt, and builds
13854  *              the CDB.  Do not use for partial DMA transfers except
13855  *              for the initial transfer since the CDB size must
13856  *              remain constant.
13857  *
13858  *     Context: Kernel thread and may be called from software interrupt
13859  *              context as part of a sdrunout callback. This function may not
13860  *              block or call routines that block
13861  */
13862 
13863 
13864 int
13865 sd_setup_rw_pkt(struct sd_lun *un,
13866     struct scsi_pkt **pktpp, struct buf *bp, int flags,
13867     int (*callback)(caddr_t), caddr_t callback_arg,
13868     diskaddr_t lba, uint32_t blockcount)
13869 {
13870         struct scsi_pkt *return_pktp;
13871         union scsi_cdb *cdbp;
13872         struct sd_cdbinfo *cp = NULL;
13873         int i;
13874 
13875         /*
13876          * See which size CDB to use, based upon the request.
13877          */
13878         for (i = un->un_mincdb; i <= un->un_maxcdb; i++) {
13879 
13880                 /*
13881                  * Check lba and block count against sd_cdbtab limits.
13882                  * In the partial DMA case, we have to use the same size
13883                  * CDB for all the transfers.  Check lba + blockcount
13884                  * against the max LBA so we know that segment of the
13885                  * transfer can use the CDB we select.
13886                  */
13887                 if ((lba + blockcount - 1 <= sd_cdbtab[i].sc_maxlba) &&
13888                     (blockcount <= sd_cdbtab[i].sc_maxlen)) {
13889 
13890                         /*
13891                          * The command will fit into the CDB type
13892                          * specified by sd_cdbtab[i].
13893                          */
13894                         cp = sd_cdbtab + i;
13895 
13896                         /*
13897                          * Call scsi_init_pkt so we can fill in the
13898                          * CDB.
13899                          */
13900                         return_pktp = scsi_init_pkt(SD_ADDRESS(un), *pktpp,
13901                             bp, cp->sc_grpcode, un->un_status_len, 0,
13902                             flags, callback, callback_arg);
13903 
13904                         if (return_pktp != NULL) {
13905 
13906                                 /*
13907                                  * Return new value of pkt
13908                                  */
13909                                 *pktpp = return_pktp;
13910 
13911                                 /*
13912                                  * To be safe, zero the CDB insuring there is
13913                                  * no leftover data from a previous command.
13914                                  */
13915                                 bzero(return_pktp->pkt_cdbp, cp->sc_grpcode);
13916 
13917                                 /*
13918                                  * Handle partial DMA mapping
13919                                  */
13920                                 if (return_pktp->pkt_resid != 0) {
13921 
13922                                         /*
13923                                          * Not going to xfer as many blocks as
13924                                          * originally expected
13925                                          */
13926                                         blockcount -=
13927                                             SD_BYTES2TGTBLOCKS(un,
13928                                             return_pktp->pkt_resid);
13929                                 }
13930 
13931                                 cdbp = (union scsi_cdb *)return_pktp->pkt_cdbp;
13932 
13933                                 /*
13934                                  * Set command byte based on the CDB
13935                                  * type we matched.
13936                                  */
13937                                 cdbp->scc_cmd = cp->sc_grpmask |
13938                                     ((bp->b_flags & B_READ) ?
13939                                     SCMD_READ : SCMD_WRITE);
13940 
13941                                 SD_FILL_SCSI1_LUN(un, return_pktp);
13942 
13943                                 /*
13944                                  * Fill in LBA and length
13945                                  */
13946                                 ASSERT((cp->sc_grpcode == CDB_GROUP1) ||
13947                                     (cp->sc_grpcode == CDB_GROUP4) ||
13948                                     (cp->sc_grpcode == CDB_GROUP0) ||
13949                                     (cp->sc_grpcode == CDB_GROUP5));
13950 
13951                                 if (cp->sc_grpcode == CDB_GROUP1) {
13952                                         FORMG1ADDR(cdbp, lba);
13953                                         FORMG1COUNT(cdbp, blockcount);
13954                                         return (0);
13955                                 } else if (cp->sc_grpcode == CDB_GROUP4) {
13956                                         FORMG4LONGADDR(cdbp, lba);
13957                                         FORMG4COUNT(cdbp, blockcount);
13958                                         return (0);
13959                                 } else if (cp->sc_grpcode == CDB_GROUP0) {
13960                                         FORMG0ADDR(cdbp, lba);
13961                                         FORMG0COUNT(cdbp, blockcount);
13962                                         return (0);
13963                                 } else if (cp->sc_grpcode == CDB_GROUP5) {
13964                                         FORMG5ADDR(cdbp, lba);
13965                                         FORMG5COUNT(cdbp, blockcount);
13966                                         return (0);
13967                                 }
13968 
13969                                 /*
13970                                  * It should be impossible to not match one
13971                                  * of the CDB types above, so we should never
13972                                  * reach this point.  Set the CDB command byte
13973                                  * to test-unit-ready to avoid writing
13974                                  * to somewhere we don't intend.
13975                                  */
13976                                 cdbp->scc_cmd = SCMD_TEST_UNIT_READY;
13977                                 return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL);
13978                         } else {
13979                                 /*
13980                                  * Couldn't get scsi_pkt
13981                                  */
13982                                 return (SD_PKT_ALLOC_FAILURE);
13983                         }
13984                 }
13985         }
13986 
13987         /*
13988          * None of the available CDB types were suitable.  This really
13989          * should never happen:  on a 64 bit system we support
13990          * READ16/WRITE16 which will hold an entire 64 bit disk address
13991          * and on a 32 bit system we will refuse to bind to a device
13992          * larger than 2TB so addresses will never be larger than 32 bits.
13993          */
13994         return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL);
13995 }
13996 
13997 /*
13998  *    Function: sd_setup_next_rw_pkt
13999  *
14000  * Description: Setup packet for partial DMA transfers, except for the
14001  *              initial transfer.  sd_setup_rw_pkt should be used for
14002  *              the initial transfer.
14003  *
14004  *     Context: Kernel thread and may be called from interrupt context.
14005  */
14006 
14007 int
14008 sd_setup_next_rw_pkt(struct sd_lun *un,
14009     struct scsi_pkt *pktp, struct buf *bp,
14010     diskaddr_t lba, uint32_t blockcount)
14011 {
14012         uchar_t com;
14013         union scsi_cdb *cdbp;
14014         uchar_t cdb_group_id;
14015 
14016         ASSERT(pktp != NULL);
14017         ASSERT(pktp->pkt_cdbp != NULL);
14018 
14019         cdbp = (union scsi_cdb *)pktp->pkt_cdbp;
14020         com = cdbp->scc_cmd;
14021         cdb_group_id = CDB_GROUPID(com);
14022 
14023         ASSERT((cdb_group_id == CDB_GROUPID_0) ||
14024             (cdb_group_id == CDB_GROUPID_1) ||
14025             (cdb_group_id == CDB_GROUPID_4) ||
14026             (cdb_group_id == CDB_GROUPID_5));
14027 
14028         /*
14029          * Move pkt to the next portion of the xfer.
14030          * func is NULL_FUNC so we do not have to release
14031          * the disk mutex here.
14032          */
14033         if (scsi_init_pkt(SD_ADDRESS(un), pktp, bp, 0, 0, 0, 0,
14034             NULL_FUNC, NULL) == pktp) {
14035                 /* Success.  Handle partial DMA */
14036                 if (pktp->pkt_resid != 0) {
14037                         blockcount -=
14038                             SD_BYTES2TGTBLOCKS(un, pktp->pkt_resid);
14039                 }
14040 
14041                 cdbp->scc_cmd = com;
14042                 SD_FILL_SCSI1_LUN(un, pktp);
14043                 if (cdb_group_id == CDB_GROUPID_1) {
14044                         FORMG1ADDR(cdbp, lba);
14045                         FORMG1COUNT(cdbp, blockcount);
14046                         return (0);
14047                 } else if (cdb_group_id == CDB_GROUPID_4) {
14048                         FORMG4LONGADDR(cdbp, lba);
14049                         FORMG4COUNT(cdbp, blockcount);
14050                         return (0);
14051                 } else if (cdb_group_id == CDB_GROUPID_0) {
14052                         FORMG0ADDR(cdbp, lba);
14053                         FORMG0COUNT(cdbp, blockcount);
14054                         return (0);
14055                 } else if (cdb_group_id == CDB_GROUPID_5) {
14056                         FORMG5ADDR(cdbp, lba);
14057                         FORMG5COUNT(cdbp, blockcount);
14058                         return (0);
14059                 }
14060 
14061                 /* Unreachable */
14062                 return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL);
14063         }
14064 
14065         /*
14066          * Error setting up next portion of cmd transfer.
14067          * Something is definitely very wrong and this
14068          * should not happen.
14069          */
14070         return (SD_PKT_ALLOC_FAILURE);
14071 }
14072 
14073 /*
14074  *    Function: sd_initpkt_for_uscsi
14075  *
14076  * Description: Allocate and initialize for transport a scsi_pkt struct,
14077  *              based upon the info specified in the given uscsi_cmd struct.
14078  *
14079  * Return Code: SD_PKT_ALLOC_SUCCESS
14080  *              SD_PKT_ALLOC_FAILURE
14081  *              SD_PKT_ALLOC_FAILURE_NO_DMA
14082  *              SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL
14083  *
14084  *     Context: Kernel thread and may be called from software interrupt context
14085  *              as part of a sdrunout callback. This function may not block or
14086  *              call routines that block
14087  */
14088 
14089 static int
14090 sd_initpkt_for_uscsi(struct buf *bp, struct scsi_pkt **pktpp)
14091 {
14092         struct uscsi_cmd *uscmd;
14093         struct sd_xbuf  *xp;
14094         struct scsi_pkt *pktp;
14095         struct sd_lun   *un;
14096         uint32_t        flags = 0;
14097 
14098         ASSERT(bp != NULL);
14099         ASSERT(pktpp != NULL);
14100         xp = SD_GET_XBUF(bp);
14101         ASSERT(xp != NULL);
14102         un = SD_GET_UN(bp);
14103         ASSERT(un != NULL);
14104         ASSERT(mutex_owned(SD_MUTEX(un)));
14105 
14106         /* The pointer to the uscsi_cmd struct is expected in xb_pktinfo */
14107         uscmd = (struct uscsi_cmd *)xp->xb_pktinfo;
14108         ASSERT(uscmd != NULL);
14109 
14110         SD_TRACE(SD_LOG_IO_CORE, un,
14111             "sd_initpkt_for_uscsi: entry: buf:0x%p\n", bp);
14112 
14113         /*
14114          * Allocate the scsi_pkt for the command.
14115          * Note: If PKT_DMA_PARTIAL flag is set, scsi_vhci binds a path
14116          *       during scsi_init_pkt time and will continue to use the
14117          *       same path as long as the same scsi_pkt is used without
14118          *       intervening scsi_dma_free(). Since uscsi command does
14119          *       not call scsi_dmafree() before retry failed command, it
14120          *       is necessary to make sure PKT_DMA_PARTIAL flag is NOT
14121          *       set such that scsi_vhci can use other available path for
14122          *       retry. Besides, ucsci command does not allow DMA breakup,
14123          *       so there is no need to set PKT_DMA_PARTIAL flag.
14124          */
14125         if (uscmd->uscsi_rqlen > SENSE_LENGTH) {
14126                 pktp = scsi_init_pkt(SD_ADDRESS(un), NULL,
14127                     ((bp->b_bcount != 0) ? bp : NULL), uscmd->uscsi_cdblen,
14128                     ((int)(uscmd->uscsi_rqlen) + sizeof (struct scsi_arq_status)
14129                     - sizeof (struct scsi_extended_sense)), 0,
14130                     (un->un_pkt_flags & ~PKT_DMA_PARTIAL) | PKT_XARQ,
14131                     sdrunout, (caddr_t)un);
14132         } else {
14133                 pktp = scsi_init_pkt(SD_ADDRESS(un), NULL,
14134                     ((bp->b_bcount != 0) ? bp : NULL), uscmd->uscsi_cdblen,
14135                     sizeof (struct scsi_arq_status), 0,
14136                     (un->un_pkt_flags & ~PKT_DMA_PARTIAL),
14137                     sdrunout, (caddr_t)un);
14138         }
14139 
14140         if (pktp == NULL) {
14141                 *pktpp = NULL;
14142                 /*
14143                  * Set the driver state to RWAIT to indicate the driver
14144                  * is waiting on resource allocations. The driver will not
14145                  * suspend, pm_suspend, or detatch while the state is RWAIT.
14146                  */
14147                 New_state(un, SD_STATE_RWAIT);
14148 
14149                 SD_ERROR(SD_LOG_IO_CORE, un,
14150                     "sd_initpkt_for_uscsi: No pktp. exit bp:0x%p\n", bp);
14151 
14152                 if ((bp->b_flags & B_ERROR) != 0) {
14153                         return (SD_PKT_ALLOC_FAILURE_NO_DMA);
14154                 }
14155                 return (SD_PKT_ALLOC_FAILURE);
14156         }
14157 
14158         /*
14159          * We do not do DMA breakup for USCSI commands, so return failure
14160          * here if all the needed DMA resources were not allocated.
14161          */
14162         if ((un->un_pkt_flags & PKT_DMA_PARTIAL) &&
14163             (bp->b_bcount != 0) && (pktp->pkt_resid != 0)) {
14164                 scsi_destroy_pkt(pktp);
14165                 SD_ERROR(SD_LOG_IO_CORE, un, "sd_initpkt_for_uscsi: "
14166                     "No partial DMA for USCSI. exit: buf:0x%p\n", bp);
14167                 return (SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL);
14168         }
14169 
14170         /* Init the cdb from the given uscsi struct */
14171         (void) scsi_setup_cdb((union scsi_cdb *)pktp->pkt_cdbp,
14172             uscmd->uscsi_cdb[0], 0, 0, 0);
14173 
14174         SD_FILL_SCSI1_LUN(un, pktp);
14175 
14176         /*
14177          * Set up the optional USCSI flags. See the uscsi (7I) man page
14178          * for listing of the supported flags.
14179          */
14180 
14181         if (uscmd->uscsi_flags & USCSI_SILENT) {
14182                 flags |= FLAG_SILENT;
14183         }
14184 
14185         if (uscmd->uscsi_flags & USCSI_DIAGNOSE) {
14186                 flags |= FLAG_DIAGNOSE;
14187         }
14188 
14189         if (uscmd->uscsi_flags & USCSI_ISOLATE) {
14190                 flags |= FLAG_ISOLATE;
14191         }
14192 
14193         if (un->un_f_is_fibre == FALSE) {
14194                 if (uscmd->uscsi_flags & USCSI_RENEGOT) {
14195                         flags |= FLAG_RENEGOTIATE_WIDE_SYNC;
14196                 }
14197         }
14198 
14199         /*
14200          * Set the pkt flags here so we save time later.
14201          * Note: These flags are NOT in the uscsi man page!!!
14202          */
14203         if (uscmd->uscsi_flags & USCSI_HEAD) {
14204                 flags |= FLAG_HEAD;
14205         }
14206 
14207         if (uscmd->uscsi_flags & USCSI_NOINTR) {
14208                 flags |= FLAG_NOINTR;
14209         }
14210 
14211         /*
14212          * For tagged queueing, things get a bit complicated.
14213          * Check first for head of queue and last for ordered queue.
14214          * If neither head nor order, use the default driver tag flags.
14215          */
14216         if ((uscmd->uscsi_flags & USCSI_NOTAG) == 0) {
14217                 if (uscmd->uscsi_flags & USCSI_HTAG) {
14218                         flags |= FLAG_HTAG;
14219                 } else if (uscmd->uscsi_flags & USCSI_OTAG) {
14220                         flags |= FLAG_OTAG;
14221                 } else {
14222                         flags |= un->un_tagflags & FLAG_TAGMASK;
14223                 }
14224         }
14225 
14226         if (uscmd->uscsi_flags & USCSI_NODISCON) {
14227                 flags = (flags & ~FLAG_TAGMASK) | FLAG_NODISCON;
14228         }
14229 
14230         pktp->pkt_flags = flags;
14231 
14232         /* Transfer uscsi information to scsi_pkt */
14233         (void) scsi_uscsi_pktinit(uscmd, pktp);
14234 
14235         /* Copy the caller's CDB into the pkt... */
14236         bcopy(uscmd->uscsi_cdb, pktp->pkt_cdbp, uscmd->uscsi_cdblen);
14237 
14238         if (uscmd->uscsi_timeout == 0) {
14239                 pktp->pkt_time = un->un_uscsi_timeout;
14240         } else {
14241                 pktp->pkt_time = uscmd->uscsi_timeout;
14242         }
14243 
14244         /* need it later to identify USCSI request in sdintr */
14245         xp->xb_pkt_flags |= SD_XB_USCSICMD;
14246 
14247         xp->xb_sense_resid = uscmd->uscsi_rqresid;
14248 
14249         pktp->pkt_private = bp;
14250         pktp->pkt_comp = sdintr;
14251         *pktpp = pktp;
14252 
14253         SD_TRACE(SD_LOG_IO_CORE, un,
14254             "sd_initpkt_for_uscsi: exit: buf:0x%p\n", bp);
14255 
14256         return (SD_PKT_ALLOC_SUCCESS);
14257 }
14258 
14259 
14260 /*
14261  *    Function: sd_destroypkt_for_uscsi
14262  *
14263  * Description: Free the scsi_pkt(9S) struct for the given bp, for uscsi
14264  *              IOs.. Also saves relevant info into the associated uscsi_cmd
14265  *              struct.
14266  *
14267  *     Context: May be called under interrupt context
14268  */
14269 
14270 static void
14271 sd_destroypkt_for_uscsi(struct buf *bp)
14272 {
14273         struct uscsi_cmd *uscmd;
14274         struct sd_xbuf  *xp;
14275         struct scsi_pkt *pktp;
14276         struct sd_lun   *un;
14277         struct sd_uscsi_info *suip;
14278 
14279         ASSERT(bp != NULL);
14280         xp = SD_GET_XBUF(bp);
14281         ASSERT(xp != NULL);
14282         un = SD_GET_UN(bp);
14283         ASSERT(un != NULL);
14284         ASSERT(!mutex_owned(SD_MUTEX(un)));
14285         pktp = SD_GET_PKTP(bp);
14286         ASSERT(pktp != NULL);
14287 
14288         SD_TRACE(SD_LOG_IO_CORE, un,
14289             "sd_destroypkt_for_uscsi: entry: buf:0x%p\n", bp);
14290 
14291         /* The pointer to the uscsi_cmd struct is expected in xb_pktinfo */
14292         uscmd = (struct uscsi_cmd *)xp->xb_pktinfo;
14293         ASSERT(uscmd != NULL);
14294 
14295         /* Save the status and the residual into the uscsi_cmd struct */
14296         uscmd->uscsi_status = ((*(pktp)->pkt_scbp) & STATUS_MASK);
14297         uscmd->uscsi_resid  = bp->b_resid;
14298 
14299         /* Transfer scsi_pkt information to uscsi */
14300         (void) scsi_uscsi_pktfini(pktp, uscmd);
14301 
14302         /*
14303          * If enabled, copy any saved sense data into the area specified
14304          * by the uscsi command.
14305          */
14306         if (((uscmd->uscsi_flags & USCSI_RQENABLE) != 0) &&
14307             (uscmd->uscsi_rqlen != 0) && (uscmd->uscsi_rqbuf != NULL)) {
14308                 /*
14309                  * Note: uscmd->uscsi_rqbuf should always point to a buffer
14310                  * at least SENSE_LENGTH bytes in size (see sd_send_scsi_cmd())
14311                  */
14312                 uscmd->uscsi_rqstatus = xp->xb_sense_status;
14313                 uscmd->uscsi_rqresid  = xp->xb_sense_resid;
14314                 if (uscmd->uscsi_rqlen > SENSE_LENGTH) {
14315                         bcopy(xp->xb_sense_data, uscmd->uscsi_rqbuf,
14316                             MAX_SENSE_LENGTH);
14317                 } else {
14318                         bcopy(xp->xb_sense_data, uscmd->uscsi_rqbuf,
14319                             SENSE_LENGTH);
14320                 }
14321         }
14322         /*
14323          * The following assignments are for SCSI FMA.
14324          */
14325         ASSERT(xp->xb_private != NULL);
14326         suip = (struct sd_uscsi_info *)xp->xb_private;
14327         suip->ui_pkt_reason = pktp->pkt_reason;
14328         suip->ui_pkt_state = pktp->pkt_state;
14329         suip->ui_pkt_statistics = pktp->pkt_statistics;
14330         suip->ui_lba = (uint64_t)SD_GET_BLKNO(bp);
14331 
14332         /* We are done with the scsi_pkt; free it now */
14333         ASSERT(SD_GET_PKTP(bp) != NULL);
14334         scsi_destroy_pkt(SD_GET_PKTP(bp));
14335 
14336         SD_TRACE(SD_LOG_IO_CORE, un,
14337             "sd_destroypkt_for_uscsi: exit: buf:0x%p\n", bp);
14338 }
14339 
14340 
14341 /*
14342  *    Function: sd_bioclone_alloc
14343  *
14344  * Description: Allocate a buf(9S) and init it as per the given buf
14345  *              and the various arguments.  The associated sd_xbuf
14346  *              struct is (nearly) duplicated.  The struct buf *bp
14347  *              argument is saved in new_xp->xb_private.
14348  *
14349  *   Arguments: bp - ptr the the buf(9S) to be "shadowed"
14350  *              datalen - size of data area for the shadow bp
14351  *              blkno - starting LBA
14352  *              func - function pointer for b_iodone in the shadow buf. (May
14353  *                      be NULL if none.)
14354  *
14355  * Return Code: Pointer to allocates buf(9S) struct
14356  *
14357  *     Context: Can sleep.
14358  */
14359 
14360 static struct buf *
14361 sd_bioclone_alloc(struct buf *bp, size_t datalen,
14362         daddr_t blkno, int (*func)(struct buf *))
14363 {
14364         struct  sd_lun  *un;
14365         struct  sd_xbuf *xp;
14366         struct  sd_xbuf *new_xp;
14367         struct  buf     *new_bp;
14368 
14369         ASSERT(bp != NULL);
14370         xp = SD_GET_XBUF(bp);
14371         ASSERT(xp != NULL);
14372         un = SD_GET_UN(bp);
14373         ASSERT(un != NULL);
14374         ASSERT(!mutex_owned(SD_MUTEX(un)));
14375 
14376         new_bp = bioclone(bp, 0, datalen, SD_GET_DEV(un), blkno, func,
14377             NULL, KM_SLEEP);
14378 
14379         new_bp->b_lblkno     = blkno;
14380 
14381         /*
14382          * Allocate an xbuf for the shadow bp and copy the contents of the
14383          * original xbuf into it.
14384          */
14385         new_xp = kmem_alloc(sizeof (struct sd_xbuf), KM_SLEEP);
14386         bcopy(xp, new_xp, sizeof (struct sd_xbuf));
14387 
14388         /*
14389          * The given bp is automatically saved in the xb_private member
14390          * of the new xbuf.  Callers are allowed to depend on this.
14391          */
14392         new_xp->xb_private = bp;
14393 
14394         new_bp->b_private  = new_xp;
14395 
14396         return (new_bp);
14397 }
14398 
14399 /*
14400  *    Function: sd_shadow_buf_alloc
14401  *
14402  * Description: Allocate a buf(9S) and init it as per the given buf
14403  *              and the various arguments.  The associated sd_xbuf
14404  *              struct is (nearly) duplicated.  The struct buf *bp
14405  *              argument is saved in new_xp->xb_private.
14406  *
14407  *   Arguments: bp - ptr the the buf(9S) to be "shadowed"
14408  *              datalen - size of data area for the shadow bp
14409  *              bflags - B_READ or B_WRITE (pseudo flag)
14410  *              blkno - starting LBA
14411  *              func - function pointer for b_iodone in the shadow buf. (May
14412  *                      be NULL if none.)
14413  *
14414  * Return Code: Pointer to allocates buf(9S) struct
14415  *
14416  *     Context: Can sleep.
14417  */
14418 
14419 static struct buf *
14420 sd_shadow_buf_alloc(struct buf *bp, size_t datalen, uint_t bflags,
14421         daddr_t blkno, int (*func)(struct buf *))
14422 {
14423         struct  sd_lun  *un;
14424         struct  sd_xbuf *xp;
14425         struct  sd_xbuf *new_xp;
14426         struct  buf     *new_bp;
14427 
14428         ASSERT(bp != NULL);
14429         xp = SD_GET_XBUF(bp);
14430         ASSERT(xp != NULL);
14431         un = SD_GET_UN(bp);
14432         ASSERT(un != NULL);
14433         ASSERT(!mutex_owned(SD_MUTEX(un)));
14434 
14435         if (bp->b_flags & (B_PAGEIO | B_PHYS)) {
14436                 bp_mapin(bp);
14437         }
14438 
14439         bflags &= (B_READ | B_WRITE);
14440 #if defined(__i386) || defined(__amd64)
14441         new_bp = getrbuf(KM_SLEEP);
14442         new_bp->b_un.b_addr = kmem_zalloc(datalen, KM_SLEEP);
14443         new_bp->b_bcount = datalen;
14444         new_bp->b_flags = bflags |
14445             (bp->b_flags & ~(B_PAGEIO | B_PHYS | B_REMAPPED | B_SHADOW));
14446 #else
14447         new_bp = scsi_alloc_consistent_buf(SD_ADDRESS(un), NULL,
14448             datalen, bflags, SLEEP_FUNC, NULL);
14449 #endif
14450         new_bp->av_forw      = NULL;
14451         new_bp->av_back      = NULL;
14452         new_bp->b_dev        = bp->b_dev;
14453         new_bp->b_blkno      = blkno;
14454         new_bp->b_iodone = func;
14455         new_bp->b_edev       = bp->b_edev;
14456         new_bp->b_resid      = 0;
14457 
14458         /* We need to preserve the B_FAILFAST flag */
14459         if (bp->b_flags & B_FAILFAST) {
14460                 new_bp->b_flags |= B_FAILFAST;
14461         }
14462 
14463         /*
14464          * Allocate an xbuf for the shadow bp and copy the contents of the
14465          * original xbuf into it.
14466          */
14467         new_xp = kmem_alloc(sizeof (struct sd_xbuf), KM_SLEEP);
14468         bcopy(xp, new_xp, sizeof (struct sd_xbuf));
14469 
14470         /* Need later to copy data between the shadow buf & original buf! */
14471         new_xp->xb_pkt_flags |= PKT_CONSISTENT;
14472 
14473         /*
14474          * The given bp is automatically saved in the xb_private member
14475          * of the new xbuf.  Callers are allowed to depend on this.
14476          */
14477         new_xp->xb_private = bp;
14478 
14479         new_bp->b_private  = new_xp;
14480 
14481         return (new_bp);
14482 }
14483 
14484 /*
14485  *    Function: sd_bioclone_free
14486  *
14487  * Description: Deallocate a buf(9S) that was used for 'shadow' IO operations
14488  *              in the larger than partition operation.
14489  *
14490  *     Context: May be called under interrupt context
14491  */
14492 
14493 static void
14494 sd_bioclone_free(struct buf *bp)
14495 {
14496         struct sd_xbuf  *xp;
14497 
14498         ASSERT(bp != NULL);
14499         xp = SD_GET_XBUF(bp);
14500         ASSERT(xp != NULL);
14501 
14502         /*
14503          * Call bp_mapout() before freeing the buf,  in case a lower
14504          * layer or HBA  had done a bp_mapin().  we must do this here
14505          * as we are the "originator" of the shadow buf.
14506          */
14507         bp_mapout(bp);
14508 
14509         /*
14510          * Null out b_iodone before freeing the bp, to ensure that the driver
14511          * never gets confused by a stale value in this field. (Just a little
14512          * extra defensiveness here.)
14513          */
14514         bp->b_iodone = NULL;
14515 
14516         freerbuf(bp);
14517 
14518         kmem_free(xp, sizeof (struct sd_xbuf));
14519 }
14520 
14521 /*
14522  *    Function: sd_shadow_buf_free
14523  *
14524  * Description: Deallocate a buf(9S) that was used for 'shadow' IO operations.
14525  *
14526  *     Context: May be called under interrupt context
14527  */
14528 
14529 static void
14530 sd_shadow_buf_free(struct buf *bp)
14531 {
14532         struct sd_xbuf  *xp;
14533 
14534         ASSERT(bp != NULL);
14535         xp = SD_GET_XBUF(bp);
14536         ASSERT(xp != NULL);
14537 
14538 #if defined(__sparc)
14539         /*
14540          * Call bp_mapout() before freeing the buf,  in case a lower
14541          * layer or HBA  had done a bp_mapin().  we must do this here
14542          * as we are the "originator" of the shadow buf.
14543          */
14544         bp_mapout(bp);
14545 #endif
14546 
14547         /*
14548          * Null out b_iodone before freeing the bp, to ensure that the driver
14549          * never gets confused by a stale value in this field. (Just a little
14550          * extra defensiveness here.)
14551          */
14552         bp->b_iodone = NULL;
14553 
14554 #if defined(__i386) || defined(__amd64)
14555         kmem_free(bp->b_un.b_addr, bp->b_bcount);
14556         freerbuf(bp);
14557 #else
14558         scsi_free_consistent_buf(bp);
14559 #endif
14560 
14561         kmem_free(xp, sizeof (struct sd_xbuf));
14562 }
14563 
14564 
14565 /*
14566  *    Function: sd_print_transport_rejected_message
14567  *
14568  * Description: This implements the ludicrously complex rules for printing
14569  *              a "transport rejected" message.  This is to address the
14570  *              specific problem of having a flood of this error message
14571  *              produced when a failover occurs.
14572  *
14573  *     Context: Any.
14574  */
14575 
14576 static void
14577 sd_print_transport_rejected_message(struct sd_lun *un, struct sd_xbuf *xp,
14578         int code)
14579 {
14580         ASSERT(un != NULL);
14581         ASSERT(mutex_owned(SD_MUTEX(un)));
14582         ASSERT(xp != NULL);
14583 
14584         /*
14585          * Print the "transport rejected" message under the following
14586          * conditions:
14587          *
14588          * - Whenever the SD_LOGMASK_DIAG bit of sd_level_mask is set
14589          * - The error code from scsi_transport() is NOT a TRAN_FATAL_ERROR.
14590          * - If the error code IS a TRAN_FATAL_ERROR, then the message is
14591          *   printed the FIRST time a TRAN_FATAL_ERROR is returned from
14592          *   scsi_transport(9F) (which indicates that the target might have
14593          *   gone off-line).  This uses the un->un_tran_fatal_count
14594          *   count, which is incremented whenever a TRAN_FATAL_ERROR is
14595          *   received, and reset to zero whenver a TRAN_ACCEPT is returned
14596          *   from scsi_transport().
14597          *
14598          * The FLAG_SILENT in the scsi_pkt must be CLEARED in ALL of
14599          * the preceeding cases in order for the message to be printed.
14600          */
14601         if (((xp->xb_pktp->pkt_flags & FLAG_SILENT) == 0) &&
14602             (SD_FM_LOG(un) == SD_FM_LOG_NSUP)) {
14603                 if ((sd_level_mask & SD_LOGMASK_DIAG) ||
14604                     (code != TRAN_FATAL_ERROR) ||
14605                     (un->un_tran_fatal_count == 1)) {
14606                         switch (code) {
14607                         case TRAN_BADPKT:
14608                                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
14609                                     "transport rejected bad packet\n");
14610                                 break;
14611                         case TRAN_FATAL_ERROR:
14612                                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
14613                                     "transport rejected fatal error\n");
14614                                 break;
14615                         default:
14616                                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
14617                                     "transport rejected (%d)\n", code);
14618                                 break;
14619                         }
14620                 }
14621         }
14622 }
14623 
14624 
14625 /*
14626  *    Function: sd_add_buf_to_waitq
14627  *
14628  * Description: Add the given buf(9S) struct to the wait queue for the
14629  *              instance.  If sorting is enabled, then the buf is added
14630  *              to the queue via an elevator sort algorithm (a la
14631  *              disksort(9F)).  The SD_GET_BLKNO(bp) is used as the sort key.
14632  *              If sorting is not enabled, then the buf is just added
14633  *              to the end of the wait queue.
14634  *
14635  * Return Code: void
14636  *
14637  *     Context: Does not sleep/block, therefore technically can be called
14638  *              from any context.  However if sorting is enabled then the
14639  *              execution time is indeterminate, and may take long if
14640  *              the wait queue grows large.
14641  */
14642 
14643 static void
14644 sd_add_buf_to_waitq(struct sd_lun *un, struct buf *bp)
14645 {
14646         struct buf *ap;
14647 
14648         ASSERT(bp != NULL);
14649         ASSERT(un != NULL);
14650         ASSERT(mutex_owned(SD_MUTEX(un)));
14651 
14652         /* If the queue is empty, add the buf as the only entry & return. */
14653         if (un->un_waitq_headp == NULL) {
14654                 ASSERT(un->un_waitq_tailp == NULL);
14655                 un->un_waitq_headp = un->un_waitq_tailp = bp;
14656                 bp->av_forw = NULL;
14657                 return;
14658         }
14659 
14660         ASSERT(un->un_waitq_tailp != NULL);
14661 
14662         /*
14663          * If sorting is disabled, just add the buf to the tail end of
14664          * the wait queue and return.
14665          */
14666         if (un->un_f_disksort_disabled || un->un_f_enable_rmw) {
14667                 un->un_waitq_tailp->av_forw = bp;
14668                 un->un_waitq_tailp = bp;
14669                 bp->av_forw = NULL;
14670                 return;
14671         }
14672 
14673         /*
14674          * Sort thru the list of requests currently on the wait queue
14675          * and add the new buf request at the appropriate position.
14676          *
14677          * The un->un_waitq_headp is an activity chain pointer on which
14678          * we keep two queues, sorted in ascending SD_GET_BLKNO() order. The
14679          * first queue holds those requests which are positioned after
14680          * the current SD_GET_BLKNO() (in the first request); the second holds
14681          * requests which came in after their SD_GET_BLKNO() number was passed.
14682          * Thus we implement a one way scan, retracting after reaching
14683          * the end of the drive to the first request on the second
14684          * queue, at which time it becomes the first queue.
14685          * A one-way scan is natural because of the way UNIX read-ahead
14686          * blocks are allocated.
14687          *
14688          * If we lie after the first request, then we must locate the
14689          * second request list and add ourselves to it.
14690          */
14691         ap = un->un_waitq_headp;
14692         if (SD_GET_BLKNO(bp) < SD_GET_BLKNO(ap)) {
14693                 while (ap->av_forw != NULL) {
14694                         /*
14695                          * Look for an "inversion" in the (normally
14696                          * ascending) block numbers. This indicates
14697                          * the start of the second request list.
14698                          */
14699                         if (SD_GET_BLKNO(ap->av_forw) < SD_GET_BLKNO(ap)) {
14700                                 /*
14701                                  * Search the second request list for the
14702                                  * first request at a larger block number.
14703                                  * We go before that; however if there is
14704                                  * no such request, we go at the end.
14705                                  */
14706                                 do {
14707                                         if (SD_GET_BLKNO(bp) <
14708                                             SD_GET_BLKNO(ap->av_forw)) {
14709                                                 goto insert;
14710                                         }
14711                                         ap = ap->av_forw;
14712                                 } while (ap->av_forw != NULL);
14713                                 goto insert;            /* after last */
14714                         }
14715                         ap = ap->av_forw;
14716                 }
14717 
14718                 /*
14719                  * No inversions... we will go after the last, and
14720                  * be the first request in the second request list.
14721                  */
14722                 goto insert;
14723         }
14724 
14725         /*
14726          * Request is at/after the current request...
14727          * sort in the first request list.
14728          */
14729         while (ap->av_forw != NULL) {
14730                 /*
14731                  * We want to go after the current request (1) if
14732                  * there is an inversion after it (i.e. it is the end
14733                  * of the first request list), or (2) if the next
14734                  * request is a larger block no. than our request.
14735                  */
14736                 if ((SD_GET_BLKNO(ap->av_forw) < SD_GET_BLKNO(ap)) ||
14737                     (SD_GET_BLKNO(bp) < SD_GET_BLKNO(ap->av_forw))) {
14738                         goto insert;
14739                 }
14740                 ap = ap->av_forw;
14741         }
14742 
14743         /*
14744          * Neither a second list nor a larger request, therefore
14745          * we go at the end of the first list (which is the same
14746          * as the end of the whole schebang).
14747          */
14748 insert:
14749         bp->av_forw = ap->av_forw;
14750         ap->av_forw = bp;
14751 
14752         /*
14753          * If we inserted onto the tail end of the waitq, make sure the
14754          * tail pointer is updated.
14755          */
14756         if (ap == un->un_waitq_tailp) {
14757                 un->un_waitq_tailp = bp;
14758         }
14759 }
14760 
14761 
14762 /*
14763  *    Function: sd_start_cmds
14764  *
14765  * Description: Remove and transport cmds from the driver queues.
14766  *
14767  *   Arguments: un - pointer to the unit (soft state) struct for the target.
14768  *
14769  *              immed_bp - ptr to a buf to be transported immediately. Only
14770  *              the immed_bp is transported; bufs on the waitq are not
14771  *              processed and the un_retry_bp is not checked.  If immed_bp is
14772  *              NULL, then normal queue processing is performed.
14773  *
14774  *     Context: May be called from kernel thread context, interrupt context,
14775  *              or runout callback context. This function may not block or
14776  *              call routines that block.
14777  */
14778 
14779 static void
14780 sd_start_cmds(struct sd_lun *un, struct buf *immed_bp)
14781 {
14782         struct  sd_xbuf *xp;
14783         struct  buf     *bp;
14784         void    (*statp)(kstat_io_t *);
14785 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */
14786         void    (*saved_statp)(kstat_io_t *);
14787 #endif
14788         int     rval;
14789         struct sd_fm_internal *sfip = NULL;
14790 
14791         ASSERT(un != NULL);
14792         ASSERT(mutex_owned(SD_MUTEX(un)));
14793         ASSERT(un->un_ncmds_in_transport >= 0);
14794         ASSERT(un->un_throttle >= 0);
14795 
14796         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_start_cmds: entry\n");
14797 
14798         do {
14799 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */
14800                 saved_statp = NULL;
14801 #endif
14802 
14803                 /*
14804                  * If we are syncing or dumping, fail the command to
14805                  * avoid recursively calling back into scsi_transport().
14806                  * The dump I/O itself uses a separate code path so this
14807                  * only prevents non-dump I/O from being sent while dumping.
14808                  * File system sync takes place before dumping begins.
14809                  * During panic, filesystem I/O is allowed provided
14810                  * un_in_callback is <= 1.  This is to prevent recursion
14811                  * such as sd_start_cmds -> scsi_transport -> sdintr ->
14812                  * sd_start_cmds and so on.  See panic.c for more information
14813                  * about the states the system can be in during panic.
14814                  */
14815                 if ((un->un_state == SD_STATE_DUMPING) ||
14816                     (ddi_in_panic() && (un->un_in_callback > 1))) {
14817                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14818                             "sd_start_cmds: panicking\n");
14819                         goto exit;
14820                 }
14821 
14822                 if ((bp = immed_bp) != NULL) {
14823                         /*
14824                          * We have a bp that must be transported immediately.
14825                          * It's OK to transport the immed_bp here without doing
14826                          * the throttle limit check because the immed_bp is
14827                          * always used in a retry/recovery case. This means
14828                          * that we know we are not at the throttle limit by
14829                          * virtue of the fact that to get here we must have
14830                          * already gotten a command back via sdintr(). This also
14831                          * relies on (1) the command on un_retry_bp preventing
14832                          * further commands from the waitq from being issued;
14833                          * and (2) the code in sd_retry_command checking the
14834                          * throttle limit before issuing a delayed or immediate
14835                          * retry. This holds even if the throttle limit is
14836                          * currently ratcheted down from its maximum value.
14837                          */
14838                         statp = kstat_runq_enter;
14839                         if (bp == un->un_retry_bp) {
14840                                 ASSERT((un->un_retry_statp == NULL) ||
14841                                     (un->un_retry_statp == kstat_waitq_enter) ||
14842                                     (un->un_retry_statp ==
14843                                     kstat_runq_back_to_waitq));
14844                                 /*
14845                                  * If the waitq kstat was incremented when
14846                                  * sd_set_retry_bp() queued this bp for a retry,
14847                                  * then we must set up statp so that the waitq
14848                                  * count will get decremented correctly below.
14849                                  * Also we must clear un->un_retry_statp to
14850                                  * ensure that we do not act on a stale value
14851                                  * in this field.
14852                                  */
14853                                 if ((un->un_retry_statp == kstat_waitq_enter) ||
14854                                     (un->un_retry_statp ==
14855                                     kstat_runq_back_to_waitq)) {
14856                                         statp = kstat_waitq_to_runq;
14857                                 }
14858 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */
14859                                 saved_statp = un->un_retry_statp;
14860 #endif
14861                                 un->un_retry_statp = NULL;
14862 
14863                                 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
14864                                     "sd_start_cmds: un:0x%p: GOT retry_bp:0x%p "
14865                                     "un_throttle:%d un_ncmds_in_transport:%d\n",
14866                                     un, un->un_retry_bp, un->un_throttle,
14867                                     un->un_ncmds_in_transport);
14868                         } else {
14869                                 SD_TRACE(SD_LOG_IO_CORE, un, "sd_start_cmds: "
14870                                     "processing priority bp:0x%p\n", bp);
14871                         }
14872 
14873                 } else if ((bp = un->un_waitq_headp) != NULL) {
14874                         /*
14875                          * A command on the waitq is ready to go, but do not
14876                          * send it if:
14877                          *
14878                          * (1) the throttle limit has been reached, or
14879                          * (2) a retry is pending, or
14880                          * (3) a START_STOP_UNIT callback pending, or
14881                          * (4) a callback for a SD_PATH_DIRECT_PRIORITY
14882                          *      command is pending.
14883                          *
14884                          * For all of these conditions, IO processing will
14885                          * restart after the condition is cleared.
14886                          */
14887                         if (un->un_ncmds_in_transport >= un->un_throttle) {
14888                                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14889                                     "sd_start_cmds: exiting, "
14890                                     "throttle limit reached!\n");
14891                                 goto exit;
14892                         }
14893                         if (un->un_retry_bp != NULL) {
14894                                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14895                                     "sd_start_cmds: exiting, retry pending!\n");
14896                                 goto exit;
14897                         }
14898                         if (un->un_startstop_timeid != NULL) {
14899                                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14900                                     "sd_start_cmds: exiting, "
14901                                     "START_STOP pending!\n");
14902                                 goto exit;
14903                         }
14904                         if (un->un_direct_priority_timeid != NULL) {
14905                                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14906                                     "sd_start_cmds: exiting, "
14907                                     "SD_PATH_DIRECT_PRIORITY cmd. pending!\n");
14908                                 goto exit;
14909                         }
14910 
14911                         /* Dequeue the command */
14912                         un->un_waitq_headp = bp->av_forw;
14913                         if (un->un_waitq_headp == NULL) {
14914                                 un->un_waitq_tailp = NULL;
14915                         }
14916                         bp->av_forw = NULL;
14917                         statp = kstat_waitq_to_runq;
14918                         SD_TRACE(SD_LOG_IO_CORE, un,
14919                             "sd_start_cmds: processing waitq bp:0x%p\n", bp);
14920 
14921                 } else {
14922                         /* No work to do so bail out now */
14923                         SD_TRACE(SD_LOG_IO_CORE, un,
14924                             "sd_start_cmds: no more work, exiting!\n");
14925                         goto exit;
14926                 }
14927 
14928                 /*
14929                  * Reset the state to normal. This is the mechanism by which
14930                  * the state transitions from either SD_STATE_RWAIT or
14931                  * SD_STATE_OFFLINE to SD_STATE_NORMAL.
14932                  * If state is SD_STATE_PM_CHANGING then this command is
14933                  * part of the device power control and the state must
14934                  * not be put back to normal. Doing so would would
14935                  * allow new commands to proceed when they shouldn't,
14936                  * the device may be going off.
14937                  */
14938                 if ((un->un_state != SD_STATE_SUSPENDED) &&
14939                     (un->un_state != SD_STATE_PM_CHANGING)) {
14940                         New_state(un, SD_STATE_NORMAL);
14941                 }
14942 
14943                 xp = SD_GET_XBUF(bp);
14944                 ASSERT(xp != NULL);
14945 
14946 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */
14947                 /*
14948                  * Allocate the scsi_pkt if we need one, or attach DMA
14949                  * resources if we have a scsi_pkt that needs them. The
14950                  * latter should only occur for commands that are being
14951                  * retried.
14952                  */
14953                 if ((xp->xb_pktp == NULL) ||
14954                     ((xp->xb_pkt_flags & SD_XB_DMA_FREED) != 0)) {
14955 #else
14956                 if (xp->xb_pktp == NULL) {
14957 #endif
14958                         /*
14959                          * There is no scsi_pkt allocated for this buf. Call
14960                          * the initpkt function to allocate & init one.
14961                          *
14962                          * The scsi_init_pkt runout callback functionality is
14963                          * implemented as follows:
14964                          *
14965                          * 1) The initpkt function always calls
14966                          *    scsi_init_pkt(9F) with sdrunout specified as the
14967                          *    callback routine.
14968                          * 2) A successful packet allocation is initialized and
14969                          *    the I/O is transported.
14970                          * 3) The I/O associated with an allocation resource
14971                          *    failure is left on its queue to be retried via
14972                          *    runout or the next I/O.
14973                          * 4) The I/O associated with a DMA error is removed
14974                          *    from the queue and failed with EIO. Processing of
14975                          *    the transport queues is also halted to be
14976                          *    restarted via runout or the next I/O.
14977                          * 5) The I/O associated with a CDB size or packet
14978                          *    size error is removed from the queue and failed
14979                          *    with EIO. Processing of the transport queues is
14980                          *    continued.
14981                          *
14982                          * Note: there is no interface for canceling a runout
14983                          * callback. To prevent the driver from detaching or
14984                          * suspending while a runout is pending the driver
14985                          * state is set to SD_STATE_RWAIT
14986                          *
14987                          * Note: using the scsi_init_pkt callback facility can
14988                          * result in an I/O request persisting at the head of
14989                          * the list which cannot be satisfied even after
14990                          * multiple retries. In the future the driver may
14991                          * implement some kind of maximum runout count before
14992                          * failing an I/O.
14993                          *
14994                          * Note: the use of funcp below may seem superfluous,
14995                          * but it helps warlock figure out the correct
14996                          * initpkt function calls (see [s]sd.wlcmd).
14997                          */
14998                         struct scsi_pkt *pktp;
14999                         int (*funcp)(struct buf *bp, struct scsi_pkt **pktp);
15000 
15001                         ASSERT(bp != un->un_rqs_bp);
15002 
15003                         funcp = sd_initpkt_map[xp->xb_chain_iostart];
15004                         switch ((*funcp)(bp, &pktp)) {
15005                         case  SD_PKT_ALLOC_SUCCESS:
15006                                 xp->xb_pktp = pktp;
15007                                 SD_TRACE(SD_LOG_IO_CORE, un,
15008                                     "sd_start_cmd: SD_PKT_ALLOC_SUCCESS 0x%p\n",
15009                                     pktp);
15010                                 goto got_pkt;
15011 
15012                         case SD_PKT_ALLOC_FAILURE:
15013                                 /*
15014                                  * Temporary (hopefully) resource depletion.
15015                                  * Since retries and RQS commands always have a
15016                                  * scsi_pkt allocated, these cases should never
15017                                  * get here. So the only cases this needs to
15018                                  * handle is a bp from the waitq (which we put
15019                                  * back onto the waitq for sdrunout), or a bp
15020                                  * sent as an immed_bp (which we just fail).
15021                                  */
15022                                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15023                                     "sd_start_cmds: SD_PKT_ALLOC_FAILURE\n");
15024 
15025 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */
15026 
15027                                 if (bp == immed_bp) {
15028                                         /*
15029                                          * If SD_XB_DMA_FREED is clear, then
15030                                          * this is a failure to allocate a
15031                                          * scsi_pkt, and we must fail the
15032                                          * command.
15033                                          */
15034                                         if ((xp->xb_pkt_flags &
15035                                             SD_XB_DMA_FREED) == 0) {
15036                                                 break;
15037                                         }
15038 
15039                                         /*
15040                                          * If this immediate command is NOT our
15041                                          * un_retry_bp, then we must fail it.
15042                                          */
15043                                         if (bp != un->un_retry_bp) {
15044                                                 break;
15045                                         }
15046 
15047                                         /*
15048                                          * We get here if this cmd is our
15049                                          * un_retry_bp that was DMAFREED, but
15050                                          * scsi_init_pkt() failed to reallocate
15051                                          * DMA resources when we attempted to
15052                                          * retry it. This can happen when an
15053                                          * mpxio failover is in progress, but
15054                                          * we don't want to just fail the
15055                                          * command in this case.
15056                                          *
15057                                          * Use timeout(9F) to restart it after
15058                                          * a 100ms delay.  We don't want to
15059                                          * let sdrunout() restart it, because
15060                                          * sdrunout() is just supposed to start
15061                                          * commands that are sitting on the
15062                                          * wait queue.  The un_retry_bp stays
15063                                          * set until the command completes, but
15064                                          * sdrunout can be called many times
15065                                          * before that happens.  Since sdrunout
15066                                          * cannot tell if the un_retry_bp is
15067                                          * already in the transport, it could
15068                                          * end up calling scsi_transport() for
15069                                          * the un_retry_bp multiple times.
15070                                          *
15071                                          * Also: don't schedule the callback
15072                                          * if some other callback is already
15073                                          * pending.
15074                                          */
15075                                         if (un->un_retry_statp == NULL) {
15076                                                 /*
15077                                                  * restore the kstat pointer to
15078                                                  * keep kstat counts coherent
15079                                                  * when we do retry the command.
15080                                                  */
15081                                                 un->un_retry_statp =
15082                                                     saved_statp;
15083                                         }
15084 
15085                                         if ((un->un_startstop_timeid == NULL) &&
15086                                             (un->un_retry_timeid == NULL) &&
15087                                             (un->un_direct_priority_timeid ==
15088                                             NULL)) {
15089 
15090                                                 un->un_retry_timeid =
15091                                                     timeout(
15092                                                     sd_start_retry_command,
15093                                                     un, SD_RESTART_TIMEOUT);
15094                                         }
15095                                         goto exit;
15096                                 }
15097 
15098 #else
15099                                 if (bp == immed_bp) {
15100                                         break;  /* Just fail the command */
15101                                 }
15102 #endif
15103 
15104                                 /* Add the buf back to the head of the waitq */
15105                                 bp->av_forw = un->un_waitq_headp;
15106                                 un->un_waitq_headp = bp;
15107                                 if (un->un_waitq_tailp == NULL) {
15108                                         un->un_waitq_tailp = bp;
15109                                 }
15110                                 goto exit;
15111 
15112                         case SD_PKT_ALLOC_FAILURE_NO_DMA:
15113                                 /*
15114                                  * HBA DMA resource failure. Fail the command
15115                                  * and continue processing of the queues.
15116                                  */
15117                                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15118                                     "sd_start_cmds: "
15119                                     "SD_PKT_ALLOC_FAILURE_NO_DMA\n");
15120                                 break;
15121 
15122                         case SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL:
15123                                 /*
15124                                  * Note:x86: Partial DMA mapping not supported
15125                                  * for USCSI commands, and all the needed DMA
15126                                  * resources were not allocated.
15127                                  */
15128                                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15129                                     "sd_start_cmds: "
15130                                     "SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL\n");
15131                                 break;
15132 
15133                         case SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL:
15134                                 /*
15135                                  * Note:x86: Request cannot fit into CDB based
15136                                  * on lba and len.
15137                                  */
15138                                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15139                                     "sd_start_cmds: "
15140                                     "SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL\n");
15141                                 break;
15142 
15143                         default:
15144                                 /* Should NEVER get here! */
15145                                 panic("scsi_initpkt error");
15146                                 /*NOTREACHED*/
15147                         }
15148 
15149                         /*
15150                          * Fatal error in allocating a scsi_pkt for this buf.
15151                          * Update kstats & return the buf with an error code.
15152                          * We must use sd_return_failed_command_no_restart() to
15153                          * avoid a recursive call back into sd_start_cmds().
15154                          * However this also means that we must keep processing
15155                          * the waitq here in order to avoid stalling.
15156                          */
15157                         if (statp == kstat_waitq_to_runq) {
15158                                 SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp);
15159                         }
15160                         sd_return_failed_command_no_restart(un, bp, EIO);
15161                         if (bp == immed_bp) {
15162                                 /* immed_bp is gone by now, so clear this */
15163                                 immed_bp = NULL;
15164                         }
15165                         continue;
15166                 }
15167 got_pkt:
15168                 if (bp == immed_bp) {
15169                         /* goto the head of the class.... */
15170                         xp->xb_pktp->pkt_flags |= FLAG_HEAD;
15171                 }
15172 
15173                 un->un_ncmds_in_transport++;
15174                 SD_UPDATE_KSTATS(un, statp, bp);
15175 
15176                 /*
15177                  * Call scsi_transport() to send the command to the target.
15178                  * According to SCSA architecture, we must drop the mutex here
15179                  * before calling scsi_transport() in order to avoid deadlock.
15180                  * Note that the scsi_pkt's completion routine can be executed
15181                  * (from interrupt context) even before the call to
15182                  * scsi_transport() returns.
15183                  */
15184                 SD_TRACE(SD_LOG_IO_CORE, un,
15185                     "sd_start_cmds: calling scsi_transport()\n");
15186                 DTRACE_PROBE1(scsi__transport__dispatch, struct buf *, bp);
15187 
15188                 mutex_exit(SD_MUTEX(un));
15189                 rval = scsi_transport(xp->xb_pktp);
15190                 mutex_enter(SD_MUTEX(un));
15191 
15192                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15193                     "sd_start_cmds: scsi_transport() returned %d\n", rval);
15194 
15195                 switch (rval) {
15196                 case TRAN_ACCEPT:
15197                         /* Clear this with every pkt accepted by the HBA */
15198                         un->un_tran_fatal_count = 0;
15199                         break;  /* Success; try the next cmd (if any) */
15200 
15201                 case TRAN_BUSY:
15202                         un->un_ncmds_in_transport--;
15203                         ASSERT(un->un_ncmds_in_transport >= 0);
15204 
15205                         /*
15206                          * Don't retry request sense, the sense data
15207                          * is lost when another request is sent.
15208                          * Free up the rqs buf and retry
15209                          * the original failed cmd.  Update kstat.
15210                          */
15211                         if (bp == un->un_rqs_bp) {
15212                                 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
15213                                 bp = sd_mark_rqs_idle(un, xp);
15214                                 sd_retry_command(un, bp, SD_RETRIES_STANDARD,
15215                                     NULL, NULL, EIO, un->un_busy_timeout / 500,
15216                                     kstat_waitq_enter);
15217                                 goto exit;
15218                         }
15219 
15220 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */
15221                         /*
15222                          * Free the DMA resources for the  scsi_pkt. This will
15223                          * allow mpxio to select another path the next time
15224                          * we call scsi_transport() with this scsi_pkt.
15225                          * See sdintr() for the rationalization behind this.
15226                          */
15227                         if ((un->un_f_is_fibre == TRUE) &&
15228                             ((xp->xb_pkt_flags & SD_XB_USCSICMD) == 0) &&
15229                             ((xp->xb_pktp->pkt_flags & FLAG_SENSING) == 0)) {
15230                                 scsi_dmafree(xp->xb_pktp);
15231                                 xp->xb_pkt_flags |= SD_XB_DMA_FREED;
15232                         }
15233 #endif
15234 
15235                         if (SD_IS_DIRECT_PRIORITY(SD_GET_XBUF(bp))) {
15236                                 /*
15237                                  * Commands that are SD_PATH_DIRECT_PRIORITY
15238                                  * are for error recovery situations. These do
15239                                  * not use the normal command waitq, so if they
15240                                  * get a TRAN_BUSY we cannot put them back onto
15241                                  * the waitq for later retry. One possible
15242                                  * problem is that there could already be some
15243                                  * other command on un_retry_bp that is waiting
15244                                  * for this one to complete, so we would be
15245                                  * deadlocked if we put this command back onto
15246                                  * the waitq for later retry (since un_retry_bp
15247                                  * must complete before the driver gets back to
15248                                  * commands on the waitq).
15249                                  *
15250                                  * To avoid deadlock we must schedule a callback
15251                                  * that will restart this command after a set
15252                                  * interval.  This should keep retrying for as
15253                                  * long as the underlying transport keeps
15254                                  * returning TRAN_BUSY (just like for other
15255                                  * commands).  Use the same timeout interval as
15256                                  * for the ordinary TRAN_BUSY retry.
15257                                  */
15258                                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15259                                     "sd_start_cmds: scsi_transport() returned "
15260                                     "TRAN_BUSY for DIRECT_PRIORITY cmd!\n");
15261 
15262                                 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
15263                                 un->un_direct_priority_timeid =
15264                                     timeout(sd_start_direct_priority_command,
15265                                     bp, un->un_busy_timeout / 500);
15266 
15267                                 goto exit;
15268                         }
15269 
15270                         /*
15271                          * For TRAN_BUSY, we want to reduce the throttle value,
15272                          * unless we are retrying a command.
15273                          */
15274                         if (bp != un->un_retry_bp) {
15275                                 sd_reduce_throttle(un, SD_THROTTLE_TRAN_BUSY);
15276                         }
15277 
15278                         /*
15279                          * Set up the bp to be tried again 10 ms later.
15280                          * Note:x86: Is there a timeout value in the sd_lun
15281                          * for this condition?
15282                          */
15283                         sd_set_retry_bp(un, bp, un->un_busy_timeout / 500,
15284                             kstat_runq_back_to_waitq);
15285                         goto exit;
15286 
15287                 case TRAN_FATAL_ERROR:
15288                         un->un_tran_fatal_count++;
15289                         /* FALLTHRU */
15290 
15291                 case TRAN_BADPKT:
15292                 default:
15293                         un->un_ncmds_in_transport--;
15294                         ASSERT(un->un_ncmds_in_transport >= 0);
15295 
15296                         /*
15297                          * If this is our REQUEST SENSE command with a
15298                          * transport error, we must get back the pointers
15299                          * to the original buf, and mark the REQUEST
15300                          * SENSE command as "available".
15301                          */
15302                         if (bp == un->un_rqs_bp) {
15303                                 bp = sd_mark_rqs_idle(un, xp);
15304                                 xp = SD_GET_XBUF(bp);
15305                         } else {
15306                                 /*
15307                                  * Legacy behavior: do not update transport
15308                                  * error count for request sense commands.
15309                                  */
15310                                 SD_UPDATE_ERRSTATS(un, sd_transerrs);
15311                         }
15312 
15313                         SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
15314                         sd_print_transport_rejected_message(un, xp, rval);
15315 
15316                         /*
15317                          * This command will be terminated by SD driver due
15318                          * to a fatal transport error. We should post
15319                          * ereport.io.scsi.cmd.disk.tran with driver-assessment
15320                          * of "fail" for any command to indicate this
15321                          * situation.
15322                          */
15323                         if (xp->xb_ena > 0) {
15324                                 ASSERT(un->un_fm_private != NULL);
15325                                 sfip = un->un_fm_private;
15326                                 sfip->fm_ssc.ssc_flags |= SSC_FLAGS_TRAN_ABORT;
15327                                 sd_ssc_extract_info(&sfip->fm_ssc, un,
15328                                     xp->xb_pktp, bp, xp);
15329                                 sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_FATAL);
15330                         }
15331 
15332                         /*
15333                          * We must use sd_return_failed_command_no_restart() to
15334                          * avoid a recursive call back into sd_start_cmds().
15335                          * However this also means that we must keep processing
15336                          * the waitq here in order to avoid stalling.
15337                          */
15338                         sd_return_failed_command_no_restart(un, bp, EIO);
15339 
15340                         /*
15341                          * Notify any threads waiting in sd_ddi_suspend() that
15342                          * a command completion has occurred.
15343                          */
15344                         if (un->un_state == SD_STATE_SUSPENDED) {
15345                                 cv_broadcast(&un->un_disk_busy_cv);
15346                         }
15347 
15348                         if (bp == immed_bp) {
15349                                 /* immed_bp is gone by now, so clear this */
15350                                 immed_bp = NULL;
15351                         }
15352                         break;
15353                 }
15354 
15355         } while (immed_bp == NULL);
15356 
15357 exit:
15358         ASSERT(mutex_owned(SD_MUTEX(un)));
15359         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_start_cmds: exit\n");
15360 }
15361 
15362 
15363 /*
15364  *    Function: sd_return_command
15365  *
15366  * Description: Returns a command to its originator (with or without an
15367  *              error).  Also starts commands waiting to be transported
15368  *              to the target.
15369  *
15370  *     Context: May be called from interrupt, kernel, or timeout context
15371  */
15372 
15373 static void
15374 sd_return_command(struct sd_lun *un, struct buf *bp)
15375 {
15376         struct sd_xbuf *xp;
15377         struct scsi_pkt *pktp;
15378         struct sd_fm_internal *sfip;
15379 
15380         ASSERT(bp != NULL);
15381         ASSERT(un != NULL);
15382         ASSERT(mutex_owned(SD_MUTEX(un)));
15383         ASSERT(bp != un->un_rqs_bp);
15384         xp = SD_GET_XBUF(bp);
15385         ASSERT(xp != NULL);
15386 
15387         pktp = SD_GET_PKTP(bp);
15388         sfip = (struct sd_fm_internal *)un->un_fm_private;
15389         ASSERT(sfip != NULL);
15390 
15391         SD_TRACE(SD_LOG_IO_CORE, un, "sd_return_command: entry\n");
15392 
15393         /*
15394          * Note: check for the "sdrestart failed" case.
15395          */
15396         if ((un->un_partial_dma_supported == 1) &&
15397             ((xp->xb_pkt_flags & SD_XB_USCSICMD) != SD_XB_USCSICMD) &&
15398             (geterror(bp) == 0) && (xp->xb_dma_resid != 0) &&
15399             (xp->xb_pktp->pkt_resid == 0)) {
15400 
15401                 if (sd_setup_next_xfer(un, bp, pktp, xp) != 0) {
15402                         /*
15403                          * Successfully set up next portion of cmd
15404                          * transfer, try sending it
15405                          */
15406                         sd_retry_command(un, bp, SD_RETRIES_NOCHECK,
15407                             NULL, NULL, 0, (clock_t)0, NULL);
15408                         sd_start_cmds(un, NULL);
15409                         return; /* Note:x86: need a return here? */
15410                 }
15411         }
15412 
15413         /*
15414          * If this is the failfast bp, clear it from un_failfast_bp. This
15415          * can happen if upon being re-tried the failfast bp either
15416          * succeeded or encountered another error (possibly even a different
15417          * error than the one that precipitated the failfast state, but in
15418          * that case it would have had to exhaust retries as well). Regardless,
15419          * this should not occur whenever the instance is in the active
15420          * failfast state.
15421          */
15422         if (bp == un->un_failfast_bp) {
15423                 ASSERT(un->un_failfast_state == SD_FAILFAST_INACTIVE);
15424                 un->un_failfast_bp = NULL;
15425         }
15426 
15427         /*
15428          * Clear the failfast state upon successful completion of ANY cmd.
15429          */
15430         if (bp->b_error == 0) {
15431                 un->un_failfast_state = SD_FAILFAST_INACTIVE;
15432                 /*
15433                  * If this is a successful command, but used to be retried,
15434                  * we will take it as a recovered command and post an
15435                  * ereport with driver-assessment of "recovered".
15436                  */
15437                 if (xp->xb_ena > 0) {
15438                         sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp);
15439                         sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_RECOVERY);
15440                 }
15441         } else {
15442                 /*
15443                  * If this is a failed non-USCSI command we will post an
15444                  * ereport with driver-assessment set accordingly("fail" or
15445                  * "fatal").
15446                  */
15447                 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
15448                         sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp);
15449                         sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_FATAL);
15450                 }
15451         }
15452 
15453         /*
15454          * This is used if the command was retried one or more times. Show that
15455          * we are done with it, and allow processing of the waitq to resume.
15456          */
15457         if (bp == un->un_retry_bp) {
15458                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15459                     "sd_return_command: un:0x%p: "
15460                     "RETURNING retry_bp:0x%p\n", un, un->un_retry_bp);
15461                 un->un_retry_bp = NULL;
15462                 un->un_retry_statp = NULL;
15463         }
15464 
15465         SD_UPDATE_RDWR_STATS(un, bp);
15466         SD_UPDATE_PARTITION_STATS(un, bp);
15467 
15468         switch (un->un_state) {
15469         case SD_STATE_SUSPENDED:
15470                 /*
15471                  * Notify any threads waiting in sd_ddi_suspend() that
15472                  * a command completion has occurred.
15473                  */
15474                 cv_broadcast(&un->un_disk_busy_cv);
15475                 break;
15476         default:
15477                 sd_start_cmds(un, NULL);
15478                 break;
15479         }
15480 
15481         /* Return this command up the iodone chain to its originator. */
15482         mutex_exit(SD_MUTEX(un));
15483 
15484         (*(sd_destroypkt_map[xp->xb_chain_iodone]))(bp);
15485         xp->xb_pktp = NULL;
15486 
15487         SD_BEGIN_IODONE(xp->xb_chain_iodone, un, bp);
15488 
15489         ASSERT(!mutex_owned(SD_MUTEX(un)));
15490         mutex_enter(SD_MUTEX(un));
15491 
15492         SD_TRACE(SD_LOG_IO_CORE, un, "sd_return_command: exit\n");
15493 }
15494 
15495 
15496 /*
15497  *    Function: sd_return_failed_command
15498  *
15499  * Description: Command completion when an error occurred.
15500  *
15501  *     Context: May be called from interrupt context
15502  */
15503 
15504 static void
15505 sd_return_failed_command(struct sd_lun *un, struct buf *bp, int errcode)
15506 {
15507         ASSERT(bp != NULL);
15508         ASSERT(un != NULL);
15509         ASSERT(mutex_owned(SD_MUTEX(un)));
15510 
15511         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15512             "sd_return_failed_command: entry\n");
15513 
15514         /*
15515          * b_resid could already be nonzero due to a partial data
15516          * transfer, so do not change it here.
15517          */
15518         SD_BIOERROR(bp, errcode);
15519 
15520         sd_return_command(un, bp);
15521         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15522             "sd_return_failed_command: exit\n");
15523 }
15524 
15525 
15526 /*
15527  *    Function: sd_return_failed_command_no_restart
15528  *
15529  * Description: Same as sd_return_failed_command, but ensures that no
15530  *              call back into sd_start_cmds will be issued.
15531  *
15532  *     Context: May be called from interrupt context
15533  */
15534 
15535 static void
15536 sd_return_failed_command_no_restart(struct sd_lun *un, struct buf *bp,
15537         int errcode)
15538 {
15539         struct sd_xbuf *xp;
15540 
15541         ASSERT(bp != NULL);
15542         ASSERT(un != NULL);
15543         ASSERT(mutex_owned(SD_MUTEX(un)));
15544         xp = SD_GET_XBUF(bp);
15545         ASSERT(xp != NULL);
15546         ASSERT(errcode != 0);
15547 
15548         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15549             "sd_return_failed_command_no_restart: entry\n");
15550 
15551         /*
15552          * b_resid could already be nonzero due to a partial data
15553          * transfer, so do not change it here.
15554          */
15555         SD_BIOERROR(bp, errcode);
15556 
15557         /*
15558          * If this is the failfast bp, clear it. This can happen if the
15559          * failfast bp encounterd a fatal error when we attempted to
15560          * re-try it (such as a scsi_transport(9F) failure).  However
15561          * we should NOT be in an active failfast state if the failfast
15562          * bp is not NULL.
15563          */
15564         if (bp == un->un_failfast_bp) {
15565                 ASSERT(un->un_failfast_state == SD_FAILFAST_INACTIVE);
15566                 un->un_failfast_bp = NULL;
15567         }
15568 
15569         if (bp == un->un_retry_bp) {
15570                 /*
15571                  * This command was retried one or more times. Show that we are
15572                  * done with it, and allow processing of the waitq to resume.
15573                  */
15574                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15575                     "sd_return_failed_command_no_restart: "
15576                     " un:0x%p: RETURNING retry_bp:0x%p\n", un, un->un_retry_bp);
15577                 un->un_retry_bp = NULL;
15578                 un->un_retry_statp = NULL;
15579         }
15580 
15581         SD_UPDATE_RDWR_STATS(un, bp);
15582         SD_UPDATE_PARTITION_STATS(un, bp);
15583 
15584         mutex_exit(SD_MUTEX(un));
15585 
15586         if (xp->xb_pktp != NULL) {
15587                 (*(sd_destroypkt_map[xp->xb_chain_iodone]))(bp);
15588                 xp->xb_pktp = NULL;
15589         }
15590 
15591         SD_BEGIN_IODONE(xp->xb_chain_iodone, un, bp);
15592 
15593         mutex_enter(SD_MUTEX(un));
15594 
15595         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15596             "sd_return_failed_command_no_restart: exit\n");
15597 }
15598 
15599 
15600 /*
15601  *    Function: sd_retry_command
15602  *
15603  * Description: queue up a command for retry, or (optionally) fail it
15604  *              if retry counts are exhausted.
15605  *
15606  *   Arguments: un - Pointer to the sd_lun struct for the target.
15607  *
15608  *              bp - Pointer to the buf for the command to be retried.
15609  *
15610  *              retry_check_flag - Flag to see which (if any) of the retry
15611  *                 counts should be decremented/checked. If the indicated
15612  *                 retry count is exhausted, then the command will not be
15613  *                 retried; it will be failed instead. This should use a
15614  *                 value equal to one of the following:
15615  *
15616  *                      SD_RETRIES_NOCHECK
15617  *                      SD_RESD_RETRIES_STANDARD
15618  *                      SD_RETRIES_VICTIM
15619  *
15620  *                 Optionally may be bitwise-OR'ed with SD_RETRIES_ISOLATE
15621  *                 if the check should be made to see of FLAG_ISOLATE is set
15622  *                 in the pkt. If FLAG_ISOLATE is set, then the command is
15623  *                 not retried, it is simply failed.
15624  *
15625  *              user_funcp - Ptr to function to call before dispatching the
15626  *                 command. May be NULL if no action needs to be performed.
15627  *                 (Primarily intended for printing messages.)
15628  *
15629  *              user_arg - Optional argument to be passed along to
15630  *                 the user_funcp call.
15631  *
15632  *              failure_code - errno return code to set in the bp if the
15633  *                 command is going to be failed.
15634  *
15635  *              retry_delay - Retry delay interval in (clock_t) units. May
15636  *                 be zero which indicates that the retry should be retried
15637  *                 immediately (ie, without an intervening delay).
15638  *
15639  *              statp - Ptr to kstat function to be updated if the command
15640  *                 is queued for a delayed retry. May be NULL if no kstat
15641  *                 update is desired.
15642  *
15643  *     Context: May be called from interrupt context.
15644  */
15645 
15646 static void
15647 sd_retry_command(struct sd_lun *un, struct buf *bp, int retry_check_flag,
15648         void (*user_funcp)(struct sd_lun *un, struct buf *bp, void *argp, int
15649         code), void *user_arg, int failure_code,  clock_t retry_delay,
15650         void (*statp)(kstat_io_t *))
15651 {
15652         struct sd_xbuf  *xp;
15653         struct scsi_pkt *pktp;
15654         struct sd_fm_internal *sfip;
15655 
15656         ASSERT(un != NULL);
15657         ASSERT(mutex_owned(SD_MUTEX(un)));
15658         ASSERT(bp != NULL);
15659         xp = SD_GET_XBUF(bp);
15660         ASSERT(xp != NULL);
15661         pktp = SD_GET_PKTP(bp);
15662         ASSERT(pktp != NULL);
15663 
15664         sfip = (struct sd_fm_internal *)un->un_fm_private;
15665         ASSERT(sfip != NULL);
15666 
15667         SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
15668             "sd_retry_command: entry: bp:0x%p xp:0x%p\n", bp, xp);
15669 
15670         /*
15671          * If we are syncing or dumping, fail the command to avoid
15672          * recursively calling back into scsi_transport().
15673          */
15674         if (ddi_in_panic()) {
15675                 goto fail_command_no_log;
15676         }
15677 
15678         /*
15679          * We should never be be retrying a command with FLAG_DIAGNOSE set, so
15680          * log an error and fail the command.
15681          */
15682         if ((pktp->pkt_flags & FLAG_DIAGNOSE) != 0) {
15683                 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE,
15684                     "ERROR, retrying FLAG_DIAGNOSE command.\n");
15685                 sd_dump_memory(un, SD_LOG_IO, "CDB",
15686                     (uchar_t *)pktp->pkt_cdbp, CDB_SIZE, SD_LOG_HEX);
15687                 sd_dump_memory(un, SD_LOG_IO, "Sense Data",
15688                     (uchar_t *)xp->xb_sense_data, SENSE_LENGTH, SD_LOG_HEX);
15689                 goto fail_command;
15690         }
15691 
15692         /*
15693          * If we are suspended, then put the command onto head of the
15694          * wait queue since we don't want to start more commands, and
15695          * clear the un_retry_bp. Next time when we are resumed, will
15696          * handle the command in the wait queue.
15697          */
15698         switch (un->un_state) {
15699         case SD_STATE_SUSPENDED:
15700         case SD_STATE_DUMPING:
15701                 bp->av_forw = un->un_waitq_headp;
15702                 un->un_waitq_headp = bp;
15703                 if (un->un_waitq_tailp == NULL) {
15704                         un->un_waitq_tailp = bp;
15705                 }
15706                 if (bp == un->un_retry_bp) {
15707                         un->un_retry_bp = NULL;
15708                         un->un_retry_statp = NULL;
15709                 }
15710                 SD_UPDATE_KSTATS(un, kstat_waitq_enter, bp);
15711                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: "
15712                     "exiting; cmd bp:0x%p requeued for SUSPEND/DUMP\n", bp);
15713                 return;
15714         default:
15715                 break;
15716         }
15717 
15718         /*
15719          * If the caller wants us to check FLAG_ISOLATE, then see if that
15720          * is set; if it is then we do not want to retry the command.
15721          * Normally, FLAG_ISOLATE is only used with USCSI cmds.
15722          */
15723         if ((retry_check_flag & SD_RETRIES_ISOLATE) != 0) {
15724                 if ((pktp->pkt_flags & FLAG_ISOLATE) != 0) {
15725                         goto fail_command;
15726                 }
15727         }
15728 
15729 
15730         /*
15731          * If SD_RETRIES_FAILFAST is set, it indicates that either a
15732          * command timeout or a selection timeout has occurred. This means
15733          * that we were unable to establish an kind of communication with
15734          * the target, and subsequent retries and/or commands are likely
15735          * to encounter similar results and take a long time to complete.
15736          *
15737          * If this is a failfast error condition, we need to update the
15738          * failfast state, even if this bp does not have B_FAILFAST set.
15739          */
15740         if (retry_check_flag & SD_RETRIES_FAILFAST) {
15741                 if (un->un_failfast_state == SD_FAILFAST_ACTIVE) {
15742                         ASSERT(un->un_failfast_bp == NULL);
15743                         /*
15744                          * If we are already in the active failfast state, and
15745                          * another failfast error condition has been detected,
15746                          * then fail this command if it has B_FAILFAST set.
15747                          * If B_FAILFAST is clear, then maintain the legacy
15748                          * behavior of retrying heroically, even tho this will
15749                          * take a lot more time to fail the command.
15750                          */
15751                         if (bp->b_flags & B_FAILFAST) {
15752                                 goto fail_command;
15753                         }
15754                 } else {
15755                         /*
15756                          * We're not in the active failfast state, but we
15757                          * have a failfast error condition, so we must begin
15758                          * transition to the next state. We do this regardless
15759                          * of whether or not this bp has B_FAILFAST set.
15760                          */
15761                         if (un->un_failfast_bp == NULL) {
15762                                 /*
15763                                  * This is the first bp to meet a failfast
15764                                  * condition so save it on un_failfast_bp &
15765                                  * do normal retry processing. Do not enter
15766                                  * active failfast state yet. This marks
15767                                  * entry into the "failfast pending" state.
15768                                  */
15769                                 un->un_failfast_bp = bp;
15770 
15771                         } else if (un->un_failfast_bp == bp) {
15772                                 /*
15773                                  * This is the second time *this* bp has
15774                                  * encountered a failfast error condition,
15775                                  * so enter active failfast state & flush
15776                                  * queues as appropriate.
15777                                  */
15778                                 un->un_failfast_state = SD_FAILFAST_ACTIVE;
15779                                 un->un_failfast_bp = NULL;
15780                                 sd_failfast_flushq(un);
15781 
15782                                 /*
15783                                  * Fail this bp now if B_FAILFAST set;
15784                                  * otherwise continue with retries. (It would
15785                                  * be pretty ironic if this bp succeeded on a
15786                                  * subsequent retry after we just flushed all
15787                                  * the queues).
15788                                  */
15789                                 if (bp->b_flags & B_FAILFAST) {
15790                                         goto fail_command;
15791                                 }
15792 
15793 #if !defined(lint) && !defined(__lint)
15794                         } else {
15795                                 /*
15796                                  * If neither of the preceeding conditionals
15797                                  * was true, it means that there is some
15798                                  * *other* bp that has met an inital failfast
15799                                  * condition and is currently either being
15800                                  * retried or is waiting to be retried. In
15801                                  * that case we should perform normal retry
15802                                  * processing on *this* bp, since there is a
15803                                  * chance that the current failfast condition
15804                                  * is transient and recoverable. If that does
15805                                  * not turn out to be the case, then retries
15806                                  * will be cleared when the wait queue is
15807                                  * flushed anyway.
15808                                  */
15809 #endif
15810                         }
15811                 }
15812         } else {
15813                 /*
15814                  * SD_RETRIES_FAILFAST is clear, which indicates that we
15815                  * likely were able to at least establish some level of
15816                  * communication with the target and subsequent commands
15817                  * and/or retries are likely to get through to the target,
15818                  * In this case we want to be aggressive about clearing
15819                  * the failfast state. Note that this does not affect
15820                  * the "failfast pending" condition.
15821                  */
15822                 un->un_failfast_state = SD_FAILFAST_INACTIVE;
15823         }
15824 
15825 
15826         /*
15827          * Check the specified retry count to see if we can still do
15828          * any retries with this pkt before we should fail it.
15829          */
15830         switch (retry_check_flag & SD_RETRIES_MASK) {
15831         case SD_RETRIES_VICTIM:
15832                 /*
15833                  * Check the victim retry count. If exhausted, then fall
15834                  * thru & check against the standard retry count.
15835                  */
15836                 if (xp->xb_victim_retry_count < un->un_victim_retry_count) {
15837                         /* Increment count & proceed with the retry */
15838                         xp->xb_victim_retry_count++;
15839                         break;
15840                 }
15841                 /* Victim retries exhausted, fall back to std. retries... */
15842                 /* FALLTHRU */
15843 
15844         case SD_RETRIES_STANDARD:
15845                 if (xp->xb_retry_count >= un->un_retry_count) {
15846                         /* Retries exhausted, fail the command */
15847                         SD_TRACE(SD_LOG_IO_CORE, un,
15848                             "sd_retry_command: retries exhausted!\n");
15849                         /*
15850                          * update b_resid for failed SCMD_READ & SCMD_WRITE
15851                          * commands with nonzero pkt_resid.
15852                          */
15853                         if ((pktp->pkt_reason == CMD_CMPLT) &&
15854                             (SD_GET_PKT_STATUS(pktp) == STATUS_GOOD) &&
15855                             (pktp->pkt_resid != 0)) {
15856                                 uchar_t op = SD_GET_PKT_OPCODE(pktp) & 0x1F;
15857                                 if ((op == SCMD_READ) || (op == SCMD_WRITE)) {
15858                                         SD_UPDATE_B_RESID(bp, pktp);
15859                                 }
15860                         }
15861                         goto fail_command;
15862                 }
15863                 xp->xb_retry_count++;
15864                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15865                     "sd_retry_command: retry count:%d\n", xp->xb_retry_count);
15866                 break;
15867 
15868         case SD_RETRIES_UA:
15869                 if (xp->xb_ua_retry_count >= sd_ua_retry_count) {
15870                         /* Retries exhausted, fail the command */
15871                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
15872                             "Unit Attention retries exhausted. "
15873                             "Check the target.\n");
15874                         goto fail_command;
15875                 }
15876                 xp->xb_ua_retry_count++;
15877                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15878                     "sd_retry_command: retry count:%d\n",
15879                     xp->xb_ua_retry_count);
15880                 break;
15881 
15882         case SD_RETRIES_BUSY:
15883                 if (xp->xb_retry_count >= un->un_busy_retry_count) {
15884                         /* Retries exhausted, fail the command */
15885                         SD_TRACE(SD_LOG_IO_CORE, un,
15886                             "sd_retry_command: retries exhausted!\n");
15887                         goto fail_command;
15888                 }
15889                 xp->xb_retry_count++;
15890                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15891                     "sd_retry_command: retry count:%d\n", xp->xb_retry_count);
15892                 break;
15893 
15894         case SD_RETRIES_NOCHECK:
15895         default:
15896                 /* No retry count to check. Just proceed with the retry */
15897                 break;
15898         }
15899 
15900         xp->xb_pktp->pkt_flags |= FLAG_HEAD;
15901 
15902         /*
15903          * If this is a non-USCSI command being retried
15904          * during execution last time, we should post an ereport with
15905          * driver-assessment of the value "retry".
15906          * For partial DMA, request sense and STATUS_QFULL, there are no
15907          * hardware errors, we bypass ereport posting.
15908          */
15909         if (failure_code != 0) {
15910                 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
15911                         sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp);
15912                         sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_RETRY);
15913                 }
15914         }
15915 
15916         /*
15917          * If we were given a zero timeout, we must attempt to retry the
15918          * command immediately (ie, without a delay).
15919          */
15920         if (retry_delay == 0) {
15921                 /*
15922                  * Check some limiting conditions to see if we can actually
15923                  * do the immediate retry.  If we cannot, then we must
15924                  * fall back to queueing up a delayed retry.
15925                  */
15926                 if (un->un_ncmds_in_transport >= un->un_throttle) {
15927                         /*
15928                          * We are at the throttle limit for the target,
15929                          * fall back to delayed retry.
15930                          */
15931                         retry_delay = un->un_busy_timeout;
15932                         statp = kstat_waitq_enter;
15933                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15934                             "sd_retry_command: immed. retry hit "
15935                             "throttle!\n");
15936                 } else {
15937                         /*
15938                          * We're clear to proceed with the immediate retry.
15939                          * First call the user-provided function (if any)
15940                          */
15941                         if (user_funcp != NULL) {
15942                                 (*user_funcp)(un, bp, user_arg,
15943                                     SD_IMMEDIATE_RETRY_ISSUED);
15944 #ifdef __lock_lint
15945                                 sd_print_incomplete_msg(un, bp, user_arg,
15946                                     SD_IMMEDIATE_RETRY_ISSUED);
15947                                 sd_print_cmd_incomplete_msg(un, bp, user_arg,
15948                                     SD_IMMEDIATE_RETRY_ISSUED);
15949                                 sd_print_sense_failed_msg(un, bp, user_arg,
15950                                     SD_IMMEDIATE_RETRY_ISSUED);
15951 #endif
15952                         }
15953 
15954                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15955                             "sd_retry_command: issuing immediate retry\n");
15956 
15957                         /*
15958                          * Call sd_start_cmds() to transport the command to
15959                          * the target.
15960                          */
15961                         sd_start_cmds(un, bp);
15962 
15963                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15964                             "sd_retry_command exit\n");
15965                         return;
15966                 }
15967         }
15968 
15969         /*
15970          * Set up to retry the command after a delay.
15971          * First call the user-provided function (if any)
15972          */
15973         if (user_funcp != NULL) {
15974                 (*user_funcp)(un, bp, user_arg, SD_DELAYED_RETRY_ISSUED);
15975         }
15976 
15977         sd_set_retry_bp(un, bp, retry_delay, statp);
15978 
15979         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: exit\n");
15980         return;
15981 
15982 fail_command:
15983 
15984         if (user_funcp != NULL) {
15985                 (*user_funcp)(un, bp, user_arg, SD_NO_RETRY_ISSUED);
15986         }
15987 
15988 fail_command_no_log:
15989 
15990         SD_INFO(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15991             "sd_retry_command: returning failed command\n");
15992 
15993         sd_return_failed_command(un, bp, failure_code);
15994 
15995         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: exit\n");
15996 }
15997 
15998 
15999 /*
16000  *    Function: sd_set_retry_bp
16001  *
16002  * Description: Set up the given bp for retry.
16003  *
16004  *   Arguments: un - ptr to associated softstate
16005  *              bp - ptr to buf(9S) for the command
16006  *              retry_delay - time interval before issuing retry (may be 0)
16007  *              statp - optional pointer to kstat function
16008  *
16009  *     Context: May be called under interrupt context
16010  */
16011 
16012 static void
16013 sd_set_retry_bp(struct sd_lun *un, struct buf *bp, clock_t retry_delay,
16014         void (*statp)(kstat_io_t *))
16015 {
16016         ASSERT(un != NULL);
16017         ASSERT(mutex_owned(SD_MUTEX(un)));
16018         ASSERT(bp != NULL);
16019 
16020         SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
16021             "sd_set_retry_bp: entry: un:0x%p bp:0x%p\n", un, bp);
16022 
16023         /*
16024          * Indicate that the command is being retried. This will not allow any
16025          * other commands on the wait queue to be transported to the target
16026          * until this command has been completed (success or failure). The
16027          * "retry command" is not transported to the target until the given
16028          * time delay expires, unless the user specified a 0 retry_delay.
16029          *
16030          * Note: the timeout(9F) callback routine is what actually calls
16031          * sd_start_cmds() to transport the command, with the exception of a
16032          * zero retry_delay. The only current implementor of a zero retry delay
16033          * is the case where a START_STOP_UNIT is sent to spin-up a device.
16034          */
16035         if (un->un_retry_bp == NULL) {
16036                 ASSERT(un->un_retry_statp == NULL);
16037                 un->un_retry_bp = bp;
16038 
16039                 /*
16040                  * If the user has not specified a delay the command should
16041                  * be queued and no timeout should be scheduled.
16042                  */
16043                 if (retry_delay == 0) {
16044                         /*
16045                          * Save the kstat pointer that will be used in the
16046                          * call to SD_UPDATE_KSTATS() below, so that
16047                          * sd_start_cmds() can correctly decrement the waitq
16048                          * count when it is time to transport this command.
16049                          */
16050                         un->un_retry_statp = statp;
16051                         goto done;
16052                 }
16053         }
16054 
16055         if (un->un_retry_bp == bp) {
16056                 /*
16057                  * Save the kstat pointer that will be used in the call to
16058                  * SD_UPDATE_KSTATS() below, so that sd_start_cmds() can
16059                  * correctly decrement the waitq count when it is time to
16060                  * transport this command.
16061                  */
16062                 un->un_retry_statp = statp;
16063 
16064                 /*
16065                  * Schedule a timeout if:
16066                  *   1) The user has specified a delay.
16067                  *   2) There is not a START_STOP_UNIT callback pending.
16068                  *
16069                  * If no delay has been specified, then it is up to the caller
16070                  * to ensure that IO processing continues without stalling.
16071                  * Effectively, this means that the caller will issue the
16072                  * required call to sd_start_cmds(). The START_STOP_UNIT
16073                  * callback does this after the START STOP UNIT command has
16074                  * completed. In either of these cases we should not schedule
16075                  * a timeout callback here.  Also don't schedule the timeout if
16076                  * an SD_PATH_DIRECT_PRIORITY command is waiting to restart.
16077                  */
16078                 if ((retry_delay != 0) && (un->un_startstop_timeid == NULL) &&
16079                     (un->un_direct_priority_timeid == NULL)) {
16080                         un->un_retry_timeid =
16081                             timeout(sd_start_retry_command, un, retry_delay);
16082                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16083                             "sd_set_retry_bp: setting timeout: un: 0x%p"
16084                             " bp:0x%p un_retry_timeid:0x%p\n",
16085                             un, bp, un->un_retry_timeid);
16086                 }
16087         } else {
16088                 /*
16089                  * We only get in here if there is already another command
16090                  * waiting to be retried.  In this case, we just put the
16091                  * given command onto the wait queue, so it can be transported
16092                  * after the current retry command has completed.
16093                  *
16094                  * Also we have to make sure that if the command at the head
16095                  * of the wait queue is the un_failfast_bp, that we do not
16096                  * put ahead of it any other commands that are to be retried.
16097                  */
16098                 if ((un->un_failfast_bp != NULL) &&
16099                     (un->un_failfast_bp == un->un_waitq_headp)) {
16100                         /*
16101                          * Enqueue this command AFTER the first command on
16102                          * the wait queue (which is also un_failfast_bp).
16103                          */
16104                         bp->av_forw = un->un_waitq_headp->av_forw;
16105                         un->un_waitq_headp->av_forw = bp;
16106                         if (un->un_waitq_headp == un->un_waitq_tailp) {
16107                                 un->un_waitq_tailp = bp;
16108                         }
16109                 } else {
16110                         /* Enqueue this command at the head of the waitq. */
16111                         bp->av_forw = un->un_waitq_headp;
16112                         un->un_waitq_headp = bp;
16113                         if (un->un_waitq_tailp == NULL) {
16114                                 un->un_waitq_tailp = bp;
16115                         }
16116                 }
16117 
16118                 if (statp == NULL) {
16119                         statp = kstat_waitq_enter;
16120                 }
16121                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16122                     "sd_set_retry_bp: un:0x%p already delayed retry\n", un);
16123         }
16124 
16125 done:
16126         if (statp != NULL) {
16127                 SD_UPDATE_KSTATS(un, statp, bp);
16128         }
16129 
16130         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16131             "sd_set_retry_bp: exit un:0x%p\n", un);
16132 }
16133 
16134 
16135 /*
16136  *    Function: sd_start_retry_command
16137  *
16138  * Description: Start the command that has been waiting on the target's
16139  *              retry queue.  Called from timeout(9F) context after the
16140  *              retry delay interval has expired.
16141  *
16142  *   Arguments: arg - pointer to associated softstate for the device.
16143  *
16144  *     Context: timeout(9F) thread context.  May not sleep.
16145  */
16146 
16147 static void
16148 sd_start_retry_command(void *arg)
16149 {
16150         struct sd_lun *un = arg;
16151 
16152         ASSERT(un != NULL);
16153         ASSERT(!mutex_owned(SD_MUTEX(un)));
16154 
16155         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16156             "sd_start_retry_command: entry\n");
16157 
16158         mutex_enter(SD_MUTEX(un));
16159 
16160         un->un_retry_timeid = NULL;
16161 
16162         if (un->un_retry_bp != NULL) {
16163                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16164                     "sd_start_retry_command: un:0x%p STARTING bp:0x%p\n",
16165                     un, un->un_retry_bp);
16166                 sd_start_cmds(un, un->un_retry_bp);
16167         }
16168 
16169         mutex_exit(SD_MUTEX(un));
16170 
16171         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16172             "sd_start_retry_command: exit\n");
16173 }
16174 
16175 /*
16176  *    Function: sd_rmw_msg_print_handler
16177  *
16178  * Description: If RMW mode is enabled and warning message is triggered
16179  *              print I/O count during a fixed interval.
16180  *
16181  *   Arguments: arg - pointer to associated softstate for the device.
16182  *
16183  *     Context: timeout(9F) thread context. May not sleep.
16184  */
16185 static void
16186 sd_rmw_msg_print_handler(void *arg)
16187 {
16188         struct sd_lun *un = arg;
16189 
16190         ASSERT(un != NULL);
16191         ASSERT(!mutex_owned(SD_MUTEX(un)));
16192 
16193         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16194             "sd_rmw_msg_print_handler: entry\n");
16195 
16196         mutex_enter(SD_MUTEX(un));
16197 
16198         if (un->un_rmw_incre_count > 0) {
16199                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16200                     "%"PRIu64" I/O requests are not aligned with %d disk "
16201                     "sector size in %ld seconds. They are handled through "
16202                     "Read Modify Write but the performance is very low!\n",
16203                     un->un_rmw_incre_count, un->un_tgt_blocksize,
16204                     drv_hztousec(SD_RMW_MSG_PRINT_TIMEOUT) / 1000000);
16205                 un->un_rmw_incre_count = 0;
16206                 un->un_rmw_msg_timeid = timeout(sd_rmw_msg_print_handler,
16207                     un, SD_RMW_MSG_PRINT_TIMEOUT);
16208         } else {
16209                 un->un_rmw_msg_timeid = NULL;
16210         }
16211 
16212         mutex_exit(SD_MUTEX(un));
16213 
16214         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16215             "sd_rmw_msg_print_handler: exit\n");
16216 }
16217 
16218 /*
16219  *    Function: sd_start_direct_priority_command
16220  *
16221  * Description: Used to re-start an SD_PATH_DIRECT_PRIORITY command that had
16222  *              received TRAN_BUSY when we called scsi_transport() to send it
16223  *              to the underlying HBA. This function is called from timeout(9F)
16224  *              context after the delay interval has expired.
16225  *
16226  *   Arguments: arg - pointer to associated buf(9S) to be restarted.
16227  *
16228  *     Context: timeout(9F) thread context.  May not sleep.
16229  */
16230 
16231 static void
16232 sd_start_direct_priority_command(void *arg)
16233 {
16234         struct buf      *priority_bp = arg;
16235         struct sd_lun   *un;
16236 
16237         ASSERT(priority_bp != NULL);
16238         un = SD_GET_UN(priority_bp);
16239         ASSERT(un != NULL);
16240         ASSERT(!mutex_owned(SD_MUTEX(un)));
16241 
16242         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16243             "sd_start_direct_priority_command: entry\n");
16244 
16245         mutex_enter(SD_MUTEX(un));
16246         un->un_direct_priority_timeid = NULL;
16247         sd_start_cmds(un, priority_bp);
16248         mutex_exit(SD_MUTEX(un));
16249 
16250         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16251             "sd_start_direct_priority_command: exit\n");
16252 }
16253 
16254 
16255 /*
16256  *    Function: sd_send_request_sense_command
16257  *
16258  * Description: Sends a REQUEST SENSE command to the target
16259  *
16260  *     Context: May be called from interrupt context.
16261  */
16262 
16263 static void
16264 sd_send_request_sense_command(struct sd_lun *un, struct buf *bp,
16265         struct scsi_pkt *pktp)
16266 {
16267         ASSERT(bp != NULL);
16268         ASSERT(un != NULL);
16269         ASSERT(mutex_owned(SD_MUTEX(un)));
16270 
16271         SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_send_request_sense_command: "
16272             "entry: buf:0x%p\n", bp);
16273 
16274         /*
16275          * If we are syncing or dumping, then fail the command to avoid a
16276          * recursive callback into scsi_transport(). Also fail the command
16277          * if we are suspended (legacy behavior).
16278          */
16279         if (ddi_in_panic() || (un->un_state == SD_STATE_SUSPENDED) ||
16280             (un->un_state == SD_STATE_DUMPING)) {
16281                 sd_return_failed_command(un, bp, EIO);
16282                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16283                     "sd_send_request_sense_command: syncing/dumping, exit\n");
16284                 return;
16285         }
16286 
16287         /*
16288          * Retry the failed command and don't issue the request sense if:
16289          *    1) the sense buf is busy
16290          *    2) we have 1 or more outstanding commands on the target
16291          *    (the sense data will be cleared or invalidated any way)
16292          *
16293          * Note: There could be an issue with not checking a retry limit here,
16294          * the problem is determining which retry limit to check.
16295          */
16296         if ((un->un_sense_isbusy != 0) || (un->un_ncmds_in_transport > 0)) {
16297                 /* Don't retry if the command is flagged as non-retryable */
16298                 if ((pktp->pkt_flags & FLAG_DIAGNOSE) == 0) {
16299                         sd_retry_command(un, bp, SD_RETRIES_NOCHECK,
16300                             NULL, NULL, 0, un->un_busy_timeout,
16301                             kstat_waitq_enter);
16302                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16303                             "sd_send_request_sense_command: "
16304                             "at full throttle, retrying exit\n");
16305                 } else {
16306                         sd_return_failed_command(un, bp, EIO);
16307                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16308                             "sd_send_request_sense_command: "
16309                             "at full throttle, non-retryable exit\n");
16310                 }
16311                 return;
16312         }
16313 
16314         sd_mark_rqs_busy(un, bp);
16315         sd_start_cmds(un, un->un_rqs_bp);
16316 
16317         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16318             "sd_send_request_sense_command: exit\n");
16319 }
16320 
16321 
16322 /*
16323  *    Function: sd_mark_rqs_busy
16324  *
16325  * Description: Indicate that the request sense bp for this instance is
16326  *              in use.
16327  *
16328  *     Context: May be called under interrupt context
16329  */
16330 
16331 static void
16332 sd_mark_rqs_busy(struct sd_lun *un, struct buf *bp)
16333 {
16334         struct sd_xbuf  *sense_xp;
16335 
16336         ASSERT(un != NULL);
16337         ASSERT(bp != NULL);
16338         ASSERT(mutex_owned(SD_MUTEX(un)));
16339         ASSERT(un->un_sense_isbusy == 0);
16340 
16341         SD_TRACE(SD_LOG_IO_CORE, un, "sd_mark_rqs_busy: entry: "
16342             "buf:0x%p xp:0x%p un:0x%p\n", bp, SD_GET_XBUF(bp), un);
16343 
16344         sense_xp = SD_GET_XBUF(un->un_rqs_bp);
16345         ASSERT(sense_xp != NULL);
16346 
16347         SD_INFO(SD_LOG_IO, un,
16348             "sd_mark_rqs_busy: entry: sense_xp:0x%p\n", sense_xp);
16349 
16350         ASSERT(sense_xp->xb_pktp != NULL);
16351         ASSERT((sense_xp->xb_pktp->pkt_flags & (FLAG_SENSING | FLAG_HEAD))
16352             == (FLAG_SENSING | FLAG_HEAD));
16353 
16354         un->un_sense_isbusy = 1;
16355         un->un_rqs_bp->b_resid = 0;
16356         sense_xp->xb_pktp->pkt_resid  = 0;
16357         sense_xp->xb_pktp->pkt_reason = 0;
16358 
16359         /* So we can get back the bp at interrupt time! */
16360         sense_xp->xb_sense_bp = bp;
16361 
16362         bzero(un->un_rqs_bp->b_un.b_addr, SENSE_LENGTH);
16363 
16364         /*
16365          * Mark this buf as awaiting sense data. (This is already set in
16366          * the pkt_flags for the RQS packet.)
16367          */
16368         ((SD_GET_XBUF(bp))->xb_pktp)->pkt_flags |= FLAG_SENSING;
16369 
16370         /* Request sense down same path */
16371         if (scsi_pkt_allocated_correctly((SD_GET_XBUF(bp))->xb_pktp) &&
16372             ((SD_GET_XBUF(bp))->xb_pktp)->pkt_path_instance)
16373                 sense_xp->xb_pktp->pkt_path_instance =
16374                     ((SD_GET_XBUF(bp))->xb_pktp)->pkt_path_instance;
16375 
16376         sense_xp->xb_retry_count     = 0;
16377         sense_xp->xb_victim_retry_count = 0;
16378         sense_xp->xb_ua_retry_count  = 0;
16379         sense_xp->xb_nr_retry_count  = 0;
16380         sense_xp->xb_dma_resid  = 0;
16381 
16382         /* Clean up the fields for auto-request sense */
16383         sense_xp->xb_sense_status = 0;
16384         sense_xp->xb_sense_state  = 0;
16385         sense_xp->xb_sense_resid  = 0;
16386         bzero(sense_xp->xb_sense_data, sizeof (sense_xp->xb_sense_data));
16387 
16388         SD_TRACE(SD_LOG_IO_CORE, un, "sd_mark_rqs_busy: exit\n");
16389 }
16390 
16391 
16392 /*
16393  *    Function: sd_mark_rqs_idle
16394  *
16395  * Description: SD_MUTEX must be held continuously through this routine
16396  *              to prevent reuse of the rqs struct before the caller can
16397  *              complete it's processing.
16398  *
16399  * Return Code: Pointer to the RQS buf
16400  *
16401  *     Context: May be called under interrupt context
16402  */
16403 
16404 static struct buf *
16405 sd_mark_rqs_idle(struct sd_lun *un, struct sd_xbuf *sense_xp)
16406 {
16407         struct buf *bp;
16408         ASSERT(un != NULL);
16409         ASSERT(sense_xp != NULL);
16410         ASSERT(mutex_owned(SD_MUTEX(un)));
16411         ASSERT(un->un_sense_isbusy != 0);
16412 
16413         un->un_sense_isbusy = 0;
16414         bp = sense_xp->xb_sense_bp;
16415         sense_xp->xb_sense_bp = NULL;
16416 
16417         /* This pkt is no longer interested in getting sense data */
16418         ((SD_GET_XBUF(bp))->xb_pktp)->pkt_flags &= ~FLAG_SENSING;
16419 
16420         return (bp);
16421 }
16422 
16423 
16424 
16425 /*
16426  *    Function: sd_alloc_rqs
16427  *
16428  * Description: Set up the unit to receive auto request sense data
16429  *
16430  * Return Code: DDI_SUCCESS or DDI_FAILURE
16431  *
16432  *     Context: Called under attach(9E) context
16433  */
16434 
16435 static int
16436 sd_alloc_rqs(struct scsi_device *devp, struct sd_lun *un)
16437 {
16438         struct sd_xbuf *xp;
16439 
16440         ASSERT(un != NULL);
16441         ASSERT(!mutex_owned(SD_MUTEX(un)));
16442         ASSERT(un->un_rqs_bp == NULL);
16443         ASSERT(un->un_rqs_pktp == NULL);
16444 
16445         /*
16446          * First allocate the required buf and scsi_pkt structs, then set up
16447          * the CDB in the scsi_pkt for a REQUEST SENSE command.
16448          */
16449         un->un_rqs_bp = scsi_alloc_consistent_buf(&devp->sd_address, NULL,
16450             MAX_SENSE_LENGTH, B_READ, SLEEP_FUNC, NULL);
16451         if (un->un_rqs_bp == NULL) {
16452                 return (DDI_FAILURE);
16453         }
16454 
16455         un->un_rqs_pktp = scsi_init_pkt(&devp->sd_address, NULL, un->un_rqs_bp,
16456             CDB_GROUP0, 1, 0, PKT_CONSISTENT, SLEEP_FUNC, NULL);
16457 
16458         if (un->un_rqs_pktp == NULL) {
16459                 sd_free_rqs(un);
16460                 return (DDI_FAILURE);
16461         }
16462 
16463         /* Set up the CDB in the scsi_pkt for a REQUEST SENSE command. */
16464         (void) scsi_setup_cdb((union scsi_cdb *)un->un_rqs_pktp->pkt_cdbp,
16465             SCMD_REQUEST_SENSE, 0, MAX_SENSE_LENGTH, 0);
16466 
16467         SD_FILL_SCSI1_LUN(un, un->un_rqs_pktp);
16468 
16469         /* Set up the other needed members in the ARQ scsi_pkt. */
16470         un->un_rqs_pktp->pkt_comp   = sdintr;
16471         un->un_rqs_pktp->pkt_time   = sd_io_time;
16472         un->un_rqs_pktp->pkt_flags |=
16473             (FLAG_SENSING | FLAG_HEAD); /* (1222170) */
16474 
16475         /*
16476          * Allocate  & init the sd_xbuf struct for the RQS command. Do not
16477          * provide any intpkt, destroypkt routines as we take care of
16478          * scsi_pkt allocation/freeing here and in sd_free_rqs().
16479          */
16480         xp = kmem_alloc(sizeof (struct sd_xbuf), KM_SLEEP);
16481         sd_xbuf_init(un, un->un_rqs_bp, xp, SD_CHAIN_NULL, NULL);
16482         xp->xb_pktp = un->un_rqs_pktp;
16483         SD_INFO(SD_LOG_ATTACH_DETACH, un,
16484             "sd_alloc_rqs: un 0x%p, rqs  xp 0x%p,  pkt 0x%p,  buf 0x%p\n",
16485             un, xp, un->un_rqs_pktp, un->un_rqs_bp);
16486 
16487         /*
16488          * Save the pointer to the request sense private bp so it can
16489          * be retrieved in sdintr.
16490          */
16491         un->un_rqs_pktp->pkt_private = un->un_rqs_bp;
16492         ASSERT(un->un_rqs_bp->b_private == xp);
16493 
16494         /*
16495          * See if the HBA supports auto-request sense for the specified
16496          * target/lun. If it does, then try to enable it (if not already
16497          * enabled).
16498          *
16499          * Note: For some HBAs (ifp & sf), scsi_ifsetcap will always return
16500          * failure, while for other HBAs (pln) scsi_ifsetcap will always
16501          * return success.  However, in both of these cases ARQ is always
16502          * enabled and scsi_ifgetcap will always return true. The best approach
16503          * is to issue the scsi_ifgetcap() first, then try the scsi_ifsetcap().
16504          *
16505          * The 3rd case is the HBA (adp) always return enabled on
16506          * scsi_ifgetgetcap even when it's not enable, the best approach
16507          * is issue a scsi_ifsetcap then a scsi_ifgetcap
16508          * Note: this case is to circumvent the Adaptec bug. (x86 only)
16509          */
16510 
16511         if (un->un_f_is_fibre == TRUE) {
16512                 un->un_f_arq_enabled = TRUE;
16513         } else {
16514 #if defined(__i386) || defined(__amd64)
16515                 /*
16516                  * Circumvent the Adaptec bug, remove this code when
16517                  * the bug is fixed
16518                  */
16519                 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 1, 1);
16520 #endif
16521                 switch (scsi_ifgetcap(SD_ADDRESS(un), "auto-rqsense", 1)) {
16522                 case 0:
16523                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
16524                             "sd_alloc_rqs: HBA supports ARQ\n");
16525                         /*
16526                          * ARQ is supported by this HBA but currently is not
16527                          * enabled. Attempt to enable it and if successful then
16528                          * mark this instance as ARQ enabled.
16529                          */
16530                         if (scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 1, 1)
16531                             == 1) {
16532                                 /* Successfully enabled ARQ in the HBA */
16533                                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
16534                                     "sd_alloc_rqs: ARQ enabled\n");
16535                                 un->un_f_arq_enabled = TRUE;
16536                         } else {
16537                                 /* Could not enable ARQ in the HBA */
16538                                 SD_INFO(SD_LOG_ATTACH_DETACH, un,
16539                                     "sd_alloc_rqs: failed ARQ enable\n");
16540                                 un->un_f_arq_enabled = FALSE;
16541                         }
16542                         break;
16543                 case 1:
16544                         /*
16545                          * ARQ is supported by this HBA and is already enabled.
16546                          * Just mark ARQ as enabled for this instance.
16547                          */
16548                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
16549                             "sd_alloc_rqs: ARQ already enabled\n");
16550                         un->un_f_arq_enabled = TRUE;
16551                         break;
16552                 default:
16553                         /*
16554                          * ARQ is not supported by this HBA; disable it for this
16555                          * instance.
16556                          */
16557                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
16558                             "sd_alloc_rqs: HBA does not support ARQ\n");
16559                         un->un_f_arq_enabled = FALSE;
16560                         break;
16561                 }
16562         }
16563 
16564         return (DDI_SUCCESS);
16565 }
16566 
16567 
16568 /*
16569  *    Function: sd_free_rqs
16570  *
16571  * Description: Cleanup for the pre-instance RQS command.
16572  *
16573  *     Context: Kernel thread context
16574  */
16575 
16576 static void
16577 sd_free_rqs(struct sd_lun *un)
16578 {
16579         ASSERT(un != NULL);
16580 
16581         SD_TRACE(SD_LOG_IO_CORE, un, "sd_free_rqs: entry\n");
16582 
16583         /*
16584          * If consistent memory is bound to a scsi_pkt, the pkt
16585          * has to be destroyed *before* freeing the consistent memory.
16586          * Don't change the sequence of this operations.
16587          * scsi_destroy_pkt() might access memory, which isn't allowed,
16588          * after it was freed in scsi_free_consistent_buf().
16589          */
16590         if (un->un_rqs_pktp != NULL) {
16591                 scsi_destroy_pkt(un->un_rqs_pktp);
16592                 un->un_rqs_pktp = NULL;
16593         }
16594 
16595         if (un->un_rqs_bp != NULL) {
16596                 struct sd_xbuf *xp = SD_GET_XBUF(un->un_rqs_bp);
16597                 if (xp != NULL) {
16598                         kmem_free(xp, sizeof (struct sd_xbuf));
16599                 }
16600                 scsi_free_consistent_buf(un->un_rqs_bp);
16601                 un->un_rqs_bp = NULL;
16602         }
16603         SD_TRACE(SD_LOG_IO_CORE, un, "sd_free_rqs: exit\n");
16604 }
16605 
16606 
16607 
16608 /*
16609  *    Function: sd_reduce_throttle
16610  *
16611  * Description: Reduces the maximum # of outstanding commands on a
16612  *              target to the current number of outstanding commands.
16613  *              Queues a tiemout(9F) callback to restore the limit
16614  *              after a specified interval has elapsed.
16615  *              Typically used when we get a TRAN_BUSY return code
16616  *              back from scsi_transport().
16617  *
16618  *   Arguments: un - ptr to the sd_lun softstate struct
16619  *              throttle_type: SD_THROTTLE_TRAN_BUSY or SD_THROTTLE_QFULL
16620  *
16621  *     Context: May be called from interrupt context
16622  */
16623 
16624 static void
16625 sd_reduce_throttle(struct sd_lun *un, int throttle_type)
16626 {
16627         ASSERT(un != NULL);
16628         ASSERT(mutex_owned(SD_MUTEX(un)));
16629         ASSERT(un->un_ncmds_in_transport >= 0);
16630 
16631         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reduce_throttle: "
16632             "entry: un:0x%p un_throttle:%d un_ncmds_in_transport:%d\n",
16633             un, un->un_throttle, un->un_ncmds_in_transport);
16634 
16635         if (un->un_throttle > 1) {
16636                 if (un->un_f_use_adaptive_throttle == TRUE) {
16637                         switch (throttle_type) {
16638                         case SD_THROTTLE_TRAN_BUSY:
16639                                 if (un->un_busy_throttle == 0) {
16640                                         un->un_busy_throttle = un->un_throttle;
16641                                 }
16642                                 break;
16643                         case SD_THROTTLE_QFULL:
16644                                 un->un_busy_throttle = 0;
16645                                 break;
16646                         default:
16647                                 ASSERT(FALSE);
16648                         }
16649 
16650                         if (un->un_ncmds_in_transport > 0) {
16651                                 un->un_throttle = un->un_ncmds_in_transport;
16652                         }
16653 
16654                 } else {
16655                         if (un->un_ncmds_in_transport == 0) {
16656                                 un->un_throttle = 1;
16657                         } else {
16658                                 un->un_throttle = un->un_ncmds_in_transport;
16659                         }
16660                 }
16661         }
16662 
16663         /* Reschedule the timeout if none is currently active */
16664         if (un->un_reset_throttle_timeid == NULL) {
16665                 un->un_reset_throttle_timeid = timeout(sd_restore_throttle,
16666                     un, SD_THROTTLE_RESET_INTERVAL);
16667                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16668                     "sd_reduce_throttle: timeout scheduled!\n");
16669         }
16670 
16671         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reduce_throttle: "
16672             "exit: un:0x%p un_throttle:%d\n", un, un->un_throttle);
16673 }
16674 
16675 
16676 
16677 /*
16678  *    Function: sd_restore_throttle
16679  *
16680  * Description: Callback function for timeout(9F).  Resets the current
16681  *              value of un->un_throttle to its default.
16682  *
16683  *   Arguments: arg - pointer to associated softstate for the device.
16684  *
16685  *     Context: May be called from interrupt context
16686  */
16687 
16688 static void
16689 sd_restore_throttle(void *arg)
16690 {
16691         struct sd_lun   *un = arg;
16692 
16693         ASSERT(un != NULL);
16694         ASSERT(!mutex_owned(SD_MUTEX(un)));
16695 
16696         mutex_enter(SD_MUTEX(un));
16697 
16698         SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: "
16699             "entry: un:0x%p un_throttle:%d\n", un, un->un_throttle);
16700 
16701         un->un_reset_throttle_timeid = NULL;
16702 
16703         if (un->un_f_use_adaptive_throttle == TRUE) {
16704                 /*
16705                  * If un_busy_throttle is nonzero, then it contains the
16706                  * value that un_throttle was when we got a TRAN_BUSY back
16707                  * from scsi_transport(). We want to revert back to this
16708                  * value.
16709                  *
16710                  * In the QFULL case, the throttle limit will incrementally
16711                  * increase until it reaches max throttle.
16712                  */
16713                 if (un->un_busy_throttle > 0) {
16714                         un->un_throttle = un->un_busy_throttle;
16715                         un->un_busy_throttle = 0;
16716                 } else {
16717                         /*
16718                          * increase throttle by 10% open gate slowly, schedule
16719                          * another restore if saved throttle has not been
16720                          * reached
16721                          */
16722                         short throttle;
16723                         if (sd_qfull_throttle_enable) {
16724                                 throttle = un->un_throttle +
16725                                     max((un->un_throttle / 10), 1);
16726                                 un->un_throttle =
16727                                     (throttle < un->un_saved_throttle) ?
16728                                     throttle : un->un_saved_throttle;
16729                                 if (un->un_throttle < un->un_saved_throttle) {
16730                                         un->un_reset_throttle_timeid =
16731                                             timeout(sd_restore_throttle,
16732                                             un,
16733                                             SD_QFULL_THROTTLE_RESET_INTERVAL);
16734                                 }
16735                         }
16736                 }
16737 
16738                 /*
16739                  * If un_throttle has fallen below the low-water mark, we
16740                  * restore the maximum value here (and allow it to ratchet
16741                  * down again if necessary).
16742                  */
16743                 if (un->un_throttle < un->un_min_throttle) {
16744                         un->un_throttle = un->un_saved_throttle;
16745                 }
16746         } else {
16747                 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: "
16748                     "restoring limit from 0x%x to 0x%x\n",
16749                     un->un_throttle, un->un_saved_throttle);
16750                 un->un_throttle = un->un_saved_throttle;
16751         }
16752 
16753         SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
16754             "sd_restore_throttle: calling sd_start_cmds!\n");
16755 
16756         sd_start_cmds(un, NULL);
16757 
16758         SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
16759             "sd_restore_throttle: exit: un:0x%p un_throttle:%d\n",
16760             un, un->un_throttle);
16761 
16762         mutex_exit(SD_MUTEX(un));
16763 
16764         SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: exit\n");
16765 }
16766 
16767 /*
16768  *    Function: sdrunout
16769  *
16770  * Description: Callback routine for scsi_init_pkt when a resource allocation
16771  *              fails.
16772  *
16773  *   Arguments: arg - a pointer to the sd_lun unit struct for the particular
16774  *              soft state instance.
16775  *
16776  * Return Code: The scsi_init_pkt routine allows for the callback function to
16777  *              return a 0 indicating the callback should be rescheduled or a 1
16778  *              indicating not to reschedule. This routine always returns 1
16779  *              because the driver always provides a callback function to
16780  *              scsi_init_pkt. This results in a callback always being scheduled
16781  *              (via the scsi_init_pkt callback implementation) if a resource
16782  *              failure occurs.
16783  *
16784  *     Context: This callback function may not block or call routines that block
16785  *
16786  *        Note: Using the scsi_init_pkt callback facility can result in an I/O
16787  *              request persisting at the head of the list which cannot be
16788  *              satisfied even after multiple retries. In the future the driver
16789  *              may implement some time of maximum runout count before failing
16790  *              an I/O.
16791  */
16792 
16793 static int
16794 sdrunout(caddr_t arg)
16795 {
16796         struct sd_lun   *un = (struct sd_lun *)arg;
16797 
16798         ASSERT(un != NULL);
16799         ASSERT(!mutex_owned(SD_MUTEX(un)));
16800 
16801         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdrunout: entry\n");
16802 
16803         mutex_enter(SD_MUTEX(un));
16804         sd_start_cmds(un, NULL);
16805         mutex_exit(SD_MUTEX(un));
16806         /*
16807          * This callback routine always returns 1 (i.e. do not reschedule)
16808          * because we always specify sdrunout as the callback handler for
16809          * scsi_init_pkt inside the call to sd_start_cmds.
16810          */
16811         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdrunout: exit\n");
16812         return (1);
16813 }
16814 
16815 
16816 /*
16817  *    Function: sdintr
16818  *
16819  * Description: Completion callback routine for scsi_pkt(9S) structs
16820  *              sent to the HBA driver via scsi_transport(9F).
16821  *
16822  *     Context: Interrupt context
16823  */
16824 
16825 static void
16826 sdintr(struct scsi_pkt *pktp)
16827 {
16828         struct buf      *bp;
16829         struct sd_xbuf  *xp;
16830         struct sd_lun   *un;
16831         size_t          actual_len;
16832         sd_ssc_t        *sscp;
16833 
16834         ASSERT(pktp != NULL);
16835         bp = (struct buf *)pktp->pkt_private;
16836         ASSERT(bp != NULL);
16837         xp = SD_GET_XBUF(bp);
16838         ASSERT(xp != NULL);
16839         ASSERT(xp->xb_pktp != NULL);
16840         un = SD_GET_UN(bp);
16841         ASSERT(un != NULL);
16842         ASSERT(!mutex_owned(SD_MUTEX(un)));
16843 
16844 #ifdef SD_FAULT_INJECTION
16845 
16846         SD_INFO(SD_LOG_IOERR, un, "sdintr: sdintr calling Fault injection\n");
16847         /* SD FaultInjection */
16848         sd_faultinjection(pktp);
16849 
16850 #endif /* SD_FAULT_INJECTION */
16851 
16852         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdintr: entry: buf:0x%p,"
16853             " xp:0x%p, un:0x%p\n", bp, xp, un);
16854 
16855         mutex_enter(SD_MUTEX(un));
16856 
16857         ASSERT(un->un_fm_private != NULL);
16858         sscp = &((struct sd_fm_internal *)(un->un_fm_private))->fm_ssc;
16859         ASSERT(sscp != NULL);
16860 
16861         /* Reduce the count of the #commands currently in transport */
16862         un->un_ncmds_in_transport--;
16863         ASSERT(un->un_ncmds_in_transport >= 0);
16864 
16865         /* Increment counter to indicate that the callback routine is active */
16866         un->un_in_callback++;
16867 
16868         SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
16869 
16870 #ifdef  SDDEBUG
16871         if (bp == un->un_retry_bp) {
16872                 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sdintr: "
16873                     "un:0x%p: GOT retry_bp:0x%p un_ncmds_in_transport:%d\n",
16874                     un, un->un_retry_bp, un->un_ncmds_in_transport);
16875         }
16876 #endif
16877 
16878         /*
16879          * If pkt_reason is CMD_DEV_GONE, fail the command, and update the media
16880          * state if needed.
16881          */
16882         if (pktp->pkt_reason == CMD_DEV_GONE) {
16883                 /* Prevent multiple console messages for the same failure. */
16884                 if (un->un_last_pkt_reason != CMD_DEV_GONE) {
16885                         un->un_last_pkt_reason = CMD_DEV_GONE;
16886                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16887                             "Command failed to complete...Device is gone\n");
16888                 }
16889                 if (un->un_mediastate != DKIO_DEV_GONE) {
16890                         un->un_mediastate = DKIO_DEV_GONE;
16891                         cv_broadcast(&un->un_state_cv);
16892                 }
16893                 /*
16894                  * If the command happens to be the REQUEST SENSE command,
16895                  * free up the rqs buf and fail the original command.
16896                  */
16897                 if (bp == un->un_rqs_bp) {
16898                         bp = sd_mark_rqs_idle(un, xp);
16899                 }
16900                 sd_return_failed_command(un, bp, EIO);
16901                 goto exit;
16902         }
16903 
16904         if (pktp->pkt_state & STATE_XARQ_DONE) {
16905                 SD_TRACE(SD_LOG_COMMON, un,
16906                     "sdintr: extra sense data received. pkt=%p\n", pktp);
16907         }
16908 
16909         /*
16910          * First see if the pkt has auto-request sense data with it....
16911          * Look at the packet state first so we don't take a performance
16912          * hit looking at the arq enabled flag unless absolutely necessary.
16913          */
16914         if ((pktp->pkt_state & STATE_ARQ_DONE) &&
16915             (un->un_f_arq_enabled == TRUE)) {
16916                 /*
16917                  * The HBA did an auto request sense for this command so check
16918                  * for FLAG_DIAGNOSE. If set this indicates a uscsi or internal
16919                  * driver command that should not be retried.
16920                  */
16921                 if ((pktp->pkt_flags & FLAG_DIAGNOSE) != 0) {
16922                         /*
16923                          * Save the relevant sense info into the xp for the
16924                          * original cmd.
16925                          */
16926                         struct scsi_arq_status *asp;
16927                         asp = (struct scsi_arq_status *)(pktp->pkt_scbp);
16928                         xp->xb_sense_status =
16929                             *((uchar_t *)(&(asp->sts_rqpkt_status)));
16930                         xp->xb_sense_state  = asp->sts_rqpkt_state;
16931                         xp->xb_sense_resid  = asp->sts_rqpkt_resid;
16932                         if (pktp->pkt_state & STATE_XARQ_DONE) {
16933                                 actual_len = MAX_SENSE_LENGTH -
16934                                     xp->xb_sense_resid;
16935                                 bcopy(&asp->sts_sensedata, xp->xb_sense_data,
16936                                     MAX_SENSE_LENGTH);
16937                         } else {
16938                                 if (xp->xb_sense_resid > SENSE_LENGTH) {
16939                                         actual_len = MAX_SENSE_LENGTH -
16940                                             xp->xb_sense_resid;
16941                                 } else {
16942                                         actual_len = SENSE_LENGTH -
16943                                             xp->xb_sense_resid;
16944                                 }
16945                                 if (xp->xb_pkt_flags & SD_XB_USCSICMD) {
16946                                         if ((((struct uscsi_cmd *)
16947                                             (xp->xb_pktinfo))->uscsi_rqlen) >
16948                                             actual_len) {
16949                                                 xp->xb_sense_resid =
16950                                                     (((struct uscsi_cmd *)
16951                                                     (xp->xb_pktinfo))->
16952                                                     uscsi_rqlen) - actual_len;
16953                                         } else {
16954                                                 xp->xb_sense_resid = 0;
16955                                         }
16956                                 }
16957                                 bcopy(&asp->sts_sensedata, xp->xb_sense_data,
16958                                     SENSE_LENGTH);
16959                         }
16960 
16961                         /* fail the command */
16962                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16963                             "sdintr: arq done and FLAG_DIAGNOSE set\n");
16964                         sd_return_failed_command(un, bp, EIO);
16965                         goto exit;
16966                 }
16967 
16968 #if (defined(__i386) || defined(__amd64))       /* DMAFREE for x86 only */
16969                 /*
16970                  * We want to either retry or fail this command, so free
16971                  * the DMA resources here.  If we retry the command then
16972                  * the DMA resources will be reallocated in sd_start_cmds().
16973                  * Note that when PKT_DMA_PARTIAL is used, this reallocation
16974                  * causes the *entire* transfer to start over again from the
16975                  * beginning of the request, even for PARTIAL chunks that
16976                  * have already transferred successfully.
16977                  */
16978                 if ((un->un_f_is_fibre == TRUE) &&
16979                     ((xp->xb_pkt_flags & SD_XB_USCSICMD) == 0) &&
16980                     ((pktp->pkt_flags & FLAG_SENSING) == 0))  {
16981                         scsi_dmafree(pktp);
16982                         xp->xb_pkt_flags |= SD_XB_DMA_FREED;
16983                 }
16984 #endif
16985 
16986                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16987                     "sdintr: arq done, sd_handle_auto_request_sense\n");
16988 
16989                 sd_handle_auto_request_sense(un, bp, xp, pktp);
16990                 goto exit;
16991         }
16992 
16993         /* Next see if this is the REQUEST SENSE pkt for the instance */
16994         if (pktp->pkt_flags & FLAG_SENSING)  {
16995                 /* This pktp is from the unit's REQUEST_SENSE command */
16996                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16997                     "sdintr: sd_handle_request_sense\n");
16998                 sd_handle_request_sense(un, bp, xp, pktp);
16999                 goto exit;
17000         }
17001 
17002         /*
17003          * Check to see if the command successfully completed as requested;
17004          * this is the most common case (and also the hot performance path).
17005          *
17006          * Requirements for successful completion are:
17007          * pkt_reason is CMD_CMPLT and packet status is status good.
17008          * In addition:
17009          * - A residual of zero indicates successful completion no matter what
17010          *   the command is.
17011          * - If the residual is not zero and the command is not a read or
17012          *   write, then it's still defined as successful completion. In other
17013          *   words, if the command is a read or write the residual must be
17014          *   zero for successful completion.
17015          * - If the residual is not zero and the command is a read or
17016          *   write, and it's a USCSICMD, then it's still defined as
17017          *   successful completion.
17018          */
17019         if ((pktp->pkt_reason == CMD_CMPLT) &&
17020             (SD_GET_PKT_STATUS(pktp) == STATUS_GOOD)) {
17021 
17022                 /*
17023                  * Since this command is returned with a good status, we
17024                  * can reset the count for Sonoma failover.
17025                  */
17026                 un->un_sonoma_failure_count = 0;
17027 
17028                 /*
17029                  * Return all USCSI commands on good status
17030                  */
17031                 if (pktp->pkt_resid == 0) {
17032                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17033                             "sdintr: returning command for resid == 0\n");
17034                 } else if (((SD_GET_PKT_OPCODE(pktp) & 0x1F) != SCMD_READ) &&
17035                     ((SD_GET_PKT_OPCODE(pktp) & 0x1F) != SCMD_WRITE)) {
17036                         SD_UPDATE_B_RESID(bp, pktp);
17037                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17038                             "sdintr: returning command for resid != 0\n");
17039                 } else if (xp->xb_pkt_flags & SD_XB_USCSICMD) {
17040                         SD_UPDATE_B_RESID(bp, pktp);
17041                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17042                             "sdintr: returning uscsi command\n");
17043                 } else {
17044                         goto not_successful;
17045                 }
17046                 sd_return_command(un, bp);
17047 
17048                 /*
17049                  * Decrement counter to indicate that the callback routine
17050                  * is done.
17051                  */
17052                 un->un_in_callback--;
17053                 ASSERT(un->un_in_callback >= 0);
17054                 mutex_exit(SD_MUTEX(un));
17055 
17056                 return;
17057         }
17058 
17059 not_successful:
17060 
17061 #if (defined(__i386) || defined(__amd64))       /* DMAFREE for x86 only */
17062         /*
17063          * The following is based upon knowledge of the underlying transport
17064          * and its use of DMA resources.  This code should be removed when
17065          * PKT_DMA_PARTIAL support is taken out of the disk driver in favor
17066          * of the new PKT_CMD_BREAKUP protocol. See also sd_initpkt_for_buf()
17067          * and sd_start_cmds().
17068          *
17069          * Free any DMA resources associated with this command if there
17070          * is a chance it could be retried or enqueued for later retry.
17071          * If we keep the DMA binding then mpxio cannot reissue the
17072          * command on another path whenever a path failure occurs.
17073          *
17074          * Note that when PKT_DMA_PARTIAL is used, free/reallocation
17075          * causes the *entire* transfer to start over again from the
17076          * beginning of the request, even for PARTIAL chunks that
17077          * have already transferred successfully.
17078          *
17079          * This is only done for non-uscsi commands (and also skipped for the
17080          * driver's internal RQS command). Also just do this for Fibre Channel
17081          * devices as these are the only ones that support mpxio.
17082          */
17083         if ((un->un_f_is_fibre == TRUE) &&
17084             ((xp->xb_pkt_flags & SD_XB_USCSICMD) == 0) &&
17085             ((pktp->pkt_flags & FLAG_SENSING) == 0))  {
17086                 scsi_dmafree(pktp);
17087                 xp->xb_pkt_flags |= SD_XB_DMA_FREED;
17088         }
17089 #endif
17090 
17091         /*
17092          * The command did not successfully complete as requested so check
17093          * for FLAG_DIAGNOSE. If set this indicates a uscsi or internal
17094          * driver command that should not be retried so just return. If
17095          * FLAG_DIAGNOSE is not set the error will be processed below.
17096          */
17097         if ((pktp->pkt_flags & FLAG_DIAGNOSE) != 0) {
17098                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17099                     "sdintr: FLAG_DIAGNOSE: sd_return_failed_command\n");
17100                 /*
17101                  * Issue a request sense if a check condition caused the error
17102                  * (we handle the auto request sense case above), otherwise
17103                  * just fail the command.
17104                  */
17105                 if ((pktp->pkt_reason == CMD_CMPLT) &&
17106                     (SD_GET_PKT_STATUS(pktp) == STATUS_CHECK)) {
17107                         sd_send_request_sense_command(un, bp, pktp);
17108                 } else {
17109                         sd_return_failed_command(un, bp, EIO);
17110                 }
17111                 goto exit;
17112         }
17113 
17114         /*
17115          * The command did not successfully complete as requested so process
17116          * the error, retry, and/or attempt recovery.
17117          */
17118         switch (pktp->pkt_reason) {
17119         case CMD_CMPLT:
17120                 switch (SD_GET_PKT_STATUS(pktp)) {
17121                 case STATUS_GOOD:
17122                         /*
17123                          * The command completed successfully with a non-zero
17124                          * residual
17125                          */
17126                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17127                             "sdintr: STATUS_GOOD \n");
17128                         sd_pkt_status_good(un, bp, xp, pktp);
17129                         break;
17130 
17131                 case STATUS_CHECK:
17132                 case STATUS_TERMINATED:
17133                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17134                             "sdintr: STATUS_TERMINATED | STATUS_CHECK\n");
17135                         sd_pkt_status_check_condition(un, bp, xp, pktp);
17136                         break;
17137 
17138                 case STATUS_BUSY:
17139                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17140                             "sdintr: STATUS_BUSY\n");
17141                         sd_pkt_status_busy(un, bp, xp, pktp);
17142                         break;
17143 
17144                 case STATUS_RESERVATION_CONFLICT:
17145                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17146                             "sdintr: STATUS_RESERVATION_CONFLICT\n");
17147                         sd_pkt_status_reservation_conflict(un, bp, xp, pktp);
17148                         break;
17149 
17150                 case STATUS_QFULL:
17151                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17152                             "sdintr: STATUS_QFULL\n");
17153                         sd_pkt_status_qfull(un, bp, xp, pktp);
17154                         break;
17155 
17156                 case STATUS_MET:
17157                 case STATUS_INTERMEDIATE:
17158                 case STATUS_SCSI2:
17159                 case STATUS_INTERMEDIATE_MET:
17160                 case STATUS_ACA_ACTIVE:
17161                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17162                             "Unexpected SCSI status received: 0x%x\n",
17163                             SD_GET_PKT_STATUS(pktp));
17164                         /*
17165                          * Mark the ssc_flags when detected invalid status
17166                          * code for non-USCSI command.
17167                          */
17168                         if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
17169                                 sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_STATUS,
17170                                     0, "stat-code");
17171                         }
17172                         sd_return_failed_command(un, bp, EIO);
17173                         break;
17174 
17175                 default:
17176                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17177                             "Invalid SCSI status received: 0x%x\n",
17178                             SD_GET_PKT_STATUS(pktp));
17179                         if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
17180                                 sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_STATUS,
17181                                     0, "stat-code");
17182                         }
17183                         sd_return_failed_command(un, bp, EIO);
17184                         break;
17185 
17186                 }
17187                 break;
17188 
17189         case CMD_INCOMPLETE:
17190                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17191                     "sdintr:  CMD_INCOMPLETE\n");
17192                 sd_pkt_reason_cmd_incomplete(un, bp, xp, pktp);
17193                 break;
17194         case CMD_TRAN_ERR:
17195                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17196                     "sdintr: CMD_TRAN_ERR\n");
17197                 sd_pkt_reason_cmd_tran_err(un, bp, xp, pktp);
17198                 break;
17199         case CMD_RESET:
17200                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17201                     "sdintr: CMD_RESET \n");
17202                 sd_pkt_reason_cmd_reset(un, bp, xp, pktp);
17203                 break;
17204         case CMD_ABORTED:
17205                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17206                     "sdintr: CMD_ABORTED \n");
17207                 sd_pkt_reason_cmd_aborted(un, bp, xp, pktp);
17208                 break;
17209         case CMD_TIMEOUT:
17210                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17211                     "sdintr: CMD_TIMEOUT\n");
17212                 sd_pkt_reason_cmd_timeout(un, bp, xp, pktp);
17213                 break;
17214         case CMD_UNX_BUS_FREE:
17215                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17216                     "sdintr: CMD_UNX_BUS_FREE \n");
17217                 sd_pkt_reason_cmd_unx_bus_free(un, bp, xp, pktp);
17218                 break;
17219         case CMD_TAG_REJECT:
17220                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17221                     "sdintr: CMD_TAG_REJECT\n");
17222                 sd_pkt_reason_cmd_tag_reject(un, bp, xp, pktp);
17223                 break;
17224         default:
17225                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17226                     "sdintr: default\n");
17227                 /*
17228                  * Mark the ssc_flags for detecting invliad pkt_reason.
17229                  */
17230                 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
17231                         sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_PKT_REASON,
17232                             0, "pkt-reason");
17233                 }
17234                 sd_pkt_reason_default(un, bp, xp, pktp);
17235                 break;
17236         }
17237 
17238 exit:
17239         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdintr: exit\n");
17240 
17241         /* Decrement counter to indicate that the callback routine is done. */
17242         un->un_in_callback--;
17243         ASSERT(un->un_in_callback >= 0);
17244 
17245         /*
17246          * At this point, the pkt has been dispatched, ie, it is either
17247          * being re-tried or has been returned to its caller and should
17248          * not be referenced.
17249          */
17250 
17251         mutex_exit(SD_MUTEX(un));
17252 }
17253 
17254 
17255 /*
17256  *    Function: sd_print_incomplete_msg
17257  *
17258  * Description: Prints the error message for a CMD_INCOMPLETE error.
17259  *
17260  *   Arguments: un - ptr to associated softstate for the device.
17261  *              bp - ptr to the buf(9S) for the command.
17262  *              arg - message string ptr
17263  *              code - SD_DELAYED_RETRY_ISSUED, SD_IMMEDIATE_RETRY_ISSUED,
17264  *                      or SD_NO_RETRY_ISSUED.
17265  *
17266  *     Context: May be called under interrupt context
17267  */
17268 
17269 static void
17270 sd_print_incomplete_msg(struct sd_lun *un, struct buf *bp, void *arg, int code)
17271 {
17272         struct scsi_pkt *pktp;
17273         char    *msgp;
17274         char    *cmdp = arg;
17275 
17276         ASSERT(un != NULL);
17277         ASSERT(mutex_owned(SD_MUTEX(un)));
17278         ASSERT(bp != NULL);
17279         ASSERT(arg != NULL);
17280         pktp = SD_GET_PKTP(bp);
17281         ASSERT(pktp != NULL);
17282 
17283         switch (code) {
17284         case SD_DELAYED_RETRY_ISSUED:
17285         case SD_IMMEDIATE_RETRY_ISSUED:
17286                 msgp = "retrying";
17287                 break;
17288         case SD_NO_RETRY_ISSUED:
17289         default:
17290                 msgp = "giving up";
17291                 break;
17292         }
17293 
17294         if ((pktp->pkt_flags & FLAG_SILENT) == 0) {
17295                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17296                     "incomplete %s- %s\n", cmdp, msgp);
17297         }
17298 }
17299 
17300 
17301 
17302 /*
17303  *    Function: sd_pkt_status_good
17304  *
17305  * Description: Processing for a STATUS_GOOD code in pkt_status.
17306  *
17307  *     Context: May be called under interrupt context
17308  */
17309 
17310 static void
17311 sd_pkt_status_good(struct sd_lun *un, struct buf *bp,
17312         struct sd_xbuf *xp, struct scsi_pkt *pktp)
17313 {
17314         char    *cmdp;
17315 
17316         ASSERT(un != NULL);
17317         ASSERT(mutex_owned(SD_MUTEX(un)));
17318         ASSERT(bp != NULL);
17319         ASSERT(xp != NULL);
17320         ASSERT(pktp != NULL);
17321         ASSERT(pktp->pkt_reason == CMD_CMPLT);
17322         ASSERT(SD_GET_PKT_STATUS(pktp) == STATUS_GOOD);
17323         ASSERT(pktp->pkt_resid != 0);
17324 
17325         SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: entry\n");
17326 
17327         SD_UPDATE_ERRSTATS(un, sd_harderrs);
17328         switch (SD_GET_PKT_OPCODE(pktp) & 0x1F) {
17329         case SCMD_READ:
17330                 cmdp = "read";
17331                 break;
17332         case SCMD_WRITE:
17333                 cmdp = "write";
17334                 break;
17335         default:
17336                 SD_UPDATE_B_RESID(bp, pktp);
17337                 sd_return_command(un, bp);
17338                 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: exit\n");
17339                 return;
17340         }
17341 
17342         /*
17343          * See if we can retry the read/write, preferrably immediately.
17344          * If retries are exhaused, then sd_retry_command() will update
17345          * the b_resid count.
17346          */
17347         sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_incomplete_msg,
17348             cmdp, EIO, (clock_t)0, NULL);
17349 
17350         SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: exit\n");
17351 }
17352 
17353 
17354 
17355 
17356 
17357 /*
17358  *    Function: sd_handle_request_sense
17359  *
17360  * Description: Processing for non-auto Request Sense command.
17361  *
17362  *   Arguments: un - ptr to associated softstate
17363  *              sense_bp - ptr to buf(9S) for the RQS command
17364  *              sense_xp - ptr to the sd_xbuf for the RQS command
17365  *              sense_pktp - ptr to the scsi_pkt(9S) for the RQS command
17366  *
17367  *     Context: May be called under interrupt context
17368  */
17369 
17370 static void
17371 sd_handle_request_sense(struct sd_lun *un, struct buf *sense_bp,
17372         struct sd_xbuf *sense_xp, struct scsi_pkt *sense_pktp)
17373 {
17374         struct buf      *cmd_bp;        /* buf for the original command */
17375         struct sd_xbuf  *cmd_xp;        /* sd_xbuf for the original command */
17376         struct scsi_pkt *cmd_pktp;      /* pkt for the original command */
17377         size_t          actual_len;     /* actual sense data length */
17378 
17379         ASSERT(un != NULL);
17380         ASSERT(mutex_owned(SD_MUTEX(un)));
17381         ASSERT(sense_bp != NULL);
17382         ASSERT(sense_xp != NULL);
17383         ASSERT(sense_pktp != NULL);
17384 
17385         /*
17386          * Note the sense_bp, sense_xp, and sense_pktp here are for the
17387          * RQS command and not the original command.
17388          */
17389         ASSERT(sense_pktp == un->un_rqs_pktp);
17390         ASSERT(sense_bp   == un->un_rqs_bp);
17391         ASSERT((sense_pktp->pkt_flags & (FLAG_SENSING | FLAG_HEAD)) ==
17392             (FLAG_SENSING | FLAG_HEAD));
17393         ASSERT((((SD_GET_XBUF(sense_xp->xb_sense_bp))->xb_pktp->pkt_flags) &
17394             FLAG_SENSING) == FLAG_SENSING);
17395 
17396         /* These are the bp, xp, and pktp for the original command */
17397         cmd_bp = sense_xp->xb_sense_bp;
17398         cmd_xp = SD_GET_XBUF(cmd_bp);
17399         cmd_pktp = SD_GET_PKTP(cmd_bp);
17400 
17401         if (sense_pktp->pkt_reason != CMD_CMPLT) {
17402                 /*
17403                  * The REQUEST SENSE command failed.  Release the REQUEST
17404                  * SENSE command for re-use, get back the bp for the original
17405                  * command, and attempt to re-try the original command if
17406                  * FLAG_DIAGNOSE is not set in the original packet.
17407                  */
17408                 SD_UPDATE_ERRSTATS(un, sd_harderrs);
17409                 if ((cmd_pktp->pkt_flags & FLAG_DIAGNOSE) == 0) {
17410                         cmd_bp = sd_mark_rqs_idle(un, sense_xp);
17411                         sd_retry_command(un, cmd_bp, SD_RETRIES_STANDARD,
17412                             NULL, NULL, EIO, (clock_t)0, NULL);
17413                         return;
17414                 }
17415         }
17416 
17417         /*
17418          * Save the relevant sense info into the xp for the original cmd.
17419          *
17420          * Note: if the request sense failed the state info will be zero
17421          * as set in sd_mark_rqs_busy()
17422          */
17423         cmd_xp->xb_sense_status = *(sense_pktp->pkt_scbp);
17424         cmd_xp->xb_sense_state  = sense_pktp->pkt_state;
17425         actual_len = MAX_SENSE_LENGTH - sense_pktp->pkt_resid;
17426         if ((cmd_xp->xb_pkt_flags & SD_XB_USCSICMD) &&
17427             (((struct uscsi_cmd *)cmd_xp->xb_pktinfo)->uscsi_rqlen >
17428             SENSE_LENGTH)) {
17429                 bcopy(sense_bp->b_un.b_addr, cmd_xp->xb_sense_data,
17430                     MAX_SENSE_LENGTH);
17431                 cmd_xp->xb_sense_resid = sense_pktp->pkt_resid;
17432         } else {
17433                 bcopy(sense_bp->b_un.b_addr, cmd_xp->xb_sense_data,
17434                     SENSE_LENGTH);
17435                 if (actual_len < SENSE_LENGTH) {
17436                         cmd_xp->xb_sense_resid = SENSE_LENGTH - actual_len;
17437                 } else {
17438                         cmd_xp->xb_sense_resid = 0;
17439                 }
17440         }
17441 
17442         /*
17443          *  Free up the RQS command....
17444          *  NOTE:
17445          *      Must do this BEFORE calling sd_validate_sense_data!
17446          *      sd_validate_sense_data may return the original command in
17447          *      which case the pkt will be freed and the flags can no
17448          *      longer be touched.
17449          *      SD_MUTEX is held through this process until the command
17450          *      is dispatched based upon the sense data, so there are
17451          *      no race conditions.
17452          */
17453         (void) sd_mark_rqs_idle(un, sense_xp);
17454 
17455         /*
17456          * For a retryable command see if we have valid sense data, if so then
17457          * turn it over to sd_decode_sense() to figure out the right course of
17458          * action. Just fail a non-retryable command.
17459          */
17460         if ((cmd_pktp->pkt_flags & FLAG_DIAGNOSE) == 0) {
17461                 if (sd_validate_sense_data(un, cmd_bp, cmd_xp, actual_len) ==
17462                     SD_SENSE_DATA_IS_VALID) {
17463                         sd_decode_sense(un, cmd_bp, cmd_xp, cmd_pktp);
17464                 }
17465         } else {
17466                 SD_DUMP_MEMORY(un, SD_LOG_IO_CORE, "Failed CDB",
17467                     (uchar_t *)cmd_pktp->pkt_cdbp, CDB_SIZE, SD_LOG_HEX);
17468                 SD_DUMP_MEMORY(un, SD_LOG_IO_CORE, "Sense Data",
17469                     (uchar_t *)cmd_xp->xb_sense_data, SENSE_LENGTH, SD_LOG_HEX);
17470                 sd_return_failed_command(un, cmd_bp, EIO);
17471         }
17472 }
17473 
17474 
17475 
17476 
17477 /*
17478  *    Function: sd_handle_auto_request_sense
17479  *
17480  * Description: Processing for auto-request sense information.
17481  *
17482  *   Arguments: un - ptr to associated softstate
17483  *              bp - ptr to buf(9S) for the command
17484  *              xp - ptr to the sd_xbuf for the command
17485  *              pktp - ptr to the scsi_pkt(9S) for the command
17486  *
17487  *     Context: May be called under interrupt context
17488  */
17489 
17490 static void
17491 sd_handle_auto_request_sense(struct sd_lun *un, struct buf *bp,
17492         struct sd_xbuf *xp, struct scsi_pkt *pktp)
17493 {
17494         struct scsi_arq_status *asp;
17495         size_t actual_len;
17496 
17497         ASSERT(un != NULL);
17498         ASSERT(mutex_owned(SD_MUTEX(un)));
17499         ASSERT(bp != NULL);
17500         ASSERT(xp != NULL);
17501         ASSERT(pktp != NULL);
17502         ASSERT(pktp != un->un_rqs_pktp);
17503         ASSERT(bp   != un->un_rqs_bp);
17504 
17505         /*
17506          * For auto-request sense, we get a scsi_arq_status back from
17507          * the HBA, with the sense data in the sts_sensedata member.
17508          * The pkt_scbp of the packet points to this scsi_arq_status.
17509          */
17510         asp = (struct scsi_arq_status *)(pktp->pkt_scbp);
17511 
17512         if (asp->sts_rqpkt_reason != CMD_CMPLT) {
17513                 /*
17514                  * The auto REQUEST SENSE failed; see if we can re-try
17515                  * the original command.
17516                  */
17517                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17518                     "auto request sense failed (reason=%s)\n",
17519                     scsi_rname(asp->sts_rqpkt_reason));
17520 
17521                 sd_reset_target(un, pktp);
17522 
17523                 sd_retry_command(un, bp, SD_RETRIES_STANDARD,
17524                     NULL, NULL, EIO, (clock_t)0, NULL);
17525                 return;
17526         }
17527 
17528         /* Save the relevant sense info into the xp for the original cmd. */
17529         xp->xb_sense_status = *((uchar_t *)(&(asp->sts_rqpkt_status)));
17530         xp->xb_sense_state  = asp->sts_rqpkt_state;
17531         xp->xb_sense_resid  = asp->sts_rqpkt_resid;
17532         if (xp->xb_sense_state & STATE_XARQ_DONE) {
17533                 actual_len = MAX_SENSE_LENGTH - xp->xb_sense_resid;
17534                 bcopy(&asp->sts_sensedata, xp->xb_sense_data,
17535                     MAX_SENSE_LENGTH);
17536         } else {
17537                 if (xp->xb_sense_resid > SENSE_LENGTH) {
17538                         actual_len = MAX_SENSE_LENGTH - xp->xb_sense_resid;
17539                 } else {
17540                         actual_len = SENSE_LENGTH - xp->xb_sense_resid;
17541                 }
17542                 if (xp->xb_pkt_flags & SD_XB_USCSICMD) {
17543                         if ((((struct uscsi_cmd *)
17544                             (xp->xb_pktinfo))->uscsi_rqlen) > actual_len) {
17545                                 xp->xb_sense_resid = (((struct uscsi_cmd *)
17546                                     (xp->xb_pktinfo))->uscsi_rqlen) -
17547                                     actual_len;
17548                         } else {
17549                                 xp->xb_sense_resid = 0;
17550                         }
17551                 }
17552                 bcopy(&asp->sts_sensedata, xp->xb_sense_data, SENSE_LENGTH);
17553         }
17554 
17555         /*
17556          * See if we have valid sense data, if so then turn it over to
17557          * sd_decode_sense() to figure out the right course of action.
17558          */
17559         if (sd_validate_sense_data(un, bp, xp, actual_len) ==
17560             SD_SENSE_DATA_IS_VALID) {
17561                 sd_decode_sense(un, bp, xp, pktp);
17562         }
17563 }
17564 
17565 
17566 /*
17567  *    Function: sd_print_sense_failed_msg
17568  *
17569  * Description: Print log message when RQS has failed.
17570  *
17571  *   Arguments: un - ptr to associated softstate
17572  *              bp - ptr to buf(9S) for the command
17573  *              arg - generic message string ptr
17574  *              code - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED,
17575  *                      or SD_NO_RETRY_ISSUED
17576  *
17577  *     Context: May be called from interrupt context
17578  */
17579 
17580 static void
17581 sd_print_sense_failed_msg(struct sd_lun *un, struct buf *bp, void *arg,
17582         int code)
17583 {
17584         char    *msgp = arg;
17585 
17586         ASSERT(un != NULL);
17587         ASSERT(mutex_owned(SD_MUTEX(un)));
17588         ASSERT(bp != NULL);
17589 
17590         if ((code == SD_NO_RETRY_ISSUED) && (msgp != NULL)) {
17591                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, msgp);
17592         }
17593 }
17594 
17595 
17596 /*
17597  *    Function: sd_validate_sense_data
17598  *
17599  * Description: Check the given sense data for validity.
17600  *              If the sense data is not valid, the command will
17601  *              be either failed or retried!
17602  *
17603  * Return Code: SD_SENSE_DATA_IS_INVALID
17604  *              SD_SENSE_DATA_IS_VALID
17605  *
17606  *     Context: May be called from interrupt context
17607  */
17608 
17609 static int
17610 sd_validate_sense_data(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
17611         size_t actual_len)
17612 {
17613         struct scsi_extended_sense *esp;
17614         struct  scsi_pkt *pktp;
17615         char    *msgp = NULL;
17616         sd_ssc_t *sscp;
17617 
17618         ASSERT(un != NULL);
17619         ASSERT(mutex_owned(SD_MUTEX(un)));
17620         ASSERT(bp != NULL);
17621         ASSERT(bp != un->un_rqs_bp);
17622         ASSERT(xp != NULL);
17623         ASSERT(un->un_fm_private != NULL);
17624 
17625         pktp = SD_GET_PKTP(bp);
17626         ASSERT(pktp != NULL);
17627 
17628         sscp = &((struct sd_fm_internal *)(un->un_fm_private))->fm_ssc;
17629         ASSERT(sscp != NULL);
17630 
17631         /*
17632          * Check the status of the RQS command (auto or manual).
17633          */
17634         switch (xp->xb_sense_status & STATUS_MASK) {
17635         case STATUS_GOOD:
17636                 break;
17637 
17638         case STATUS_RESERVATION_CONFLICT:
17639                 sd_pkt_status_reservation_conflict(un, bp, xp, pktp);
17640                 return (SD_SENSE_DATA_IS_INVALID);
17641 
17642         case STATUS_BUSY:
17643                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17644                     "Busy Status on REQUEST SENSE\n");
17645                 sd_retry_command(un, bp, SD_RETRIES_BUSY, NULL,
17646                     NULL, EIO, un->un_busy_timeout / 500, kstat_waitq_enter);
17647                 return (SD_SENSE_DATA_IS_INVALID);
17648 
17649         case STATUS_QFULL:
17650                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17651                     "QFULL Status on REQUEST SENSE\n");
17652                 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL,
17653                     NULL, EIO, un->un_busy_timeout / 500, kstat_waitq_enter);
17654                 return (SD_SENSE_DATA_IS_INVALID);
17655 
17656         case STATUS_CHECK:
17657         case STATUS_TERMINATED:
17658                 msgp = "Check Condition on REQUEST SENSE\n";
17659                 goto sense_failed;
17660 
17661         default:
17662                 msgp = "Not STATUS_GOOD on REQUEST_SENSE\n";
17663                 goto sense_failed;
17664         }
17665 
17666         /*
17667          * See if we got the minimum required amount of sense data.
17668          * Note: We are assuming the returned sense data is SENSE_LENGTH bytes
17669          * or less.
17670          */
17671         if (((xp->xb_sense_state & STATE_XFERRED_DATA) == 0) ||
17672             (actual_len == 0)) {
17673                 msgp = "Request Sense couldn't get sense data\n";
17674                 goto sense_failed;
17675         }
17676 
17677         if (actual_len < SUN_MIN_SENSE_LENGTH) {
17678                 msgp = "Not enough sense information\n";
17679                 /* Mark the ssc_flags for detecting invalid sense data */
17680                 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
17681                         sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_SENSE, 0,
17682                             "sense-data");
17683                 }
17684                 goto sense_failed;
17685         }
17686 
17687         /*
17688          * We require the extended sense data
17689          */
17690         esp = (struct scsi_extended_sense *)xp->xb_sense_data;
17691         if (esp->es_class != CLASS_EXTENDED_SENSE) {
17692                 if ((pktp->pkt_flags & FLAG_SILENT) == 0) {
17693                         static char tmp[8];
17694                         static char buf[148];
17695                         char *p = (char *)(xp->xb_sense_data);
17696                         int i;
17697 
17698                         mutex_enter(&sd_sense_mutex);
17699                         (void) strcpy(buf, "undecodable sense information:");
17700                         for (i = 0; i < actual_len; i++) {
17701                                 (void) sprintf(tmp, " 0x%x", *(p++)&0xff);
17702                                 (void) strcpy(&buf[strlen(buf)], tmp);
17703                         }
17704                         i = strlen(buf);
17705                         (void) strcpy(&buf[i], "-(assumed fatal)\n");
17706 
17707                         if (SD_FM_LOG(un) == SD_FM_LOG_NSUP) {
17708                                 scsi_log(SD_DEVINFO(un), sd_label,
17709                                     CE_WARN, buf);
17710                         }
17711                         mutex_exit(&sd_sense_mutex);
17712                 }
17713 
17714                 /* Mark the ssc_flags for detecting invalid sense data */
17715                 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
17716                         sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_SENSE, 0,
17717                             "sense-data");
17718                 }
17719 
17720                 /* Note: Legacy behavior, fail the command with no retry */
17721                 sd_return_failed_command(un, bp, EIO);
17722                 return (SD_SENSE_DATA_IS_INVALID);
17723         }
17724 
17725         /*
17726          * Check that es_code is valid (es_class concatenated with es_code
17727          * make up the "response code" field.  es_class will always be 7, so
17728          * make sure es_code is 0, 1, 2, 3 or 0xf.  es_code will indicate the
17729          * format.
17730          */
17731         if ((esp->es_code != CODE_FMT_FIXED_CURRENT) &&
17732             (esp->es_code != CODE_FMT_FIXED_DEFERRED) &&
17733             (esp->es_code != CODE_FMT_DESCR_CURRENT) &&
17734             (esp->es_code != CODE_FMT_DESCR_DEFERRED) &&
17735             (esp->es_code != CODE_FMT_VENDOR_SPECIFIC)) {
17736                 /* Mark the ssc_flags for detecting invalid sense data */
17737                 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
17738                         sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_SENSE, 0,
17739                             "sense-data");
17740                 }
17741                 goto sense_failed;
17742         }
17743 
17744         return (SD_SENSE_DATA_IS_VALID);
17745 
17746 sense_failed:
17747         /*
17748          * If the request sense failed (for whatever reason), attempt
17749          * to retry the original command.
17750          */
17751 #if defined(__i386) || defined(__amd64)
17752         /*
17753          * SD_RETRY_DELAY is conditionally compile (#if fibre) in
17754          * sddef.h for Sparc platform, and x86 uses 1 binary
17755          * for both SCSI/FC.
17756          * The SD_RETRY_DELAY value need to be adjusted here
17757          * when SD_RETRY_DELAY change in sddef.h
17758          */
17759         sd_retry_command(un, bp, SD_RETRIES_STANDARD,
17760             sd_print_sense_failed_msg, msgp, EIO,
17761             un->un_f_is_fibre?drv_usectohz(100000):(clock_t)0, NULL);
17762 #else
17763         sd_retry_command(un, bp, SD_RETRIES_STANDARD,
17764             sd_print_sense_failed_msg, msgp, EIO, SD_RETRY_DELAY, NULL);
17765 #endif
17766 
17767         return (SD_SENSE_DATA_IS_INVALID);
17768 }
17769 
17770 /*
17771  *    Function: sd_decode_sense
17772  *
17773  * Description: Take recovery action(s) when SCSI Sense Data is received.
17774  *
17775  *     Context: Interrupt context.
17776  */
17777 
17778 static void
17779 sd_decode_sense(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
17780         struct scsi_pkt *pktp)
17781 {
17782         uint8_t sense_key;
17783 
17784         ASSERT(un != NULL);
17785         ASSERT(mutex_owned(SD_MUTEX(un)));
17786         ASSERT(bp != NULL);
17787         ASSERT(bp != un->un_rqs_bp);
17788         ASSERT(xp != NULL);
17789         ASSERT(pktp != NULL);
17790 
17791         sense_key = scsi_sense_key(xp->xb_sense_data);
17792 
17793         switch (sense_key) {
17794         case KEY_NO_SENSE:
17795                 sd_sense_key_no_sense(un, bp, xp, pktp);
17796                 break;
17797         case KEY_RECOVERABLE_ERROR:
17798                 sd_sense_key_recoverable_error(un, xp->xb_sense_data,
17799                     bp, xp, pktp);
17800                 break;
17801         case KEY_NOT_READY:
17802                 sd_sense_key_not_ready(un, xp->xb_sense_data,
17803                     bp, xp, pktp);
17804                 break;
17805         case KEY_MEDIUM_ERROR:
17806         case KEY_HARDWARE_ERROR:
17807                 sd_sense_key_medium_or_hardware_error(un,
17808                     xp->xb_sense_data, bp, xp, pktp);
17809                 break;
17810         case KEY_ILLEGAL_REQUEST:
17811                 sd_sense_key_illegal_request(un, bp, xp, pktp);
17812                 break;
17813         case KEY_UNIT_ATTENTION:
17814                 sd_sense_key_unit_attention(un, xp->xb_sense_data,
17815                     bp, xp, pktp);
17816                 break;
17817         case KEY_WRITE_PROTECT:
17818         case KEY_VOLUME_OVERFLOW:
17819         case KEY_MISCOMPARE:
17820                 sd_sense_key_fail_command(un, bp, xp, pktp);
17821                 break;
17822         case KEY_BLANK_CHECK:
17823                 sd_sense_key_blank_check(un, bp, xp, pktp);
17824                 break;
17825         case KEY_ABORTED_COMMAND:
17826                 sd_sense_key_aborted_command(un, bp, xp, pktp);
17827                 break;
17828         case KEY_VENDOR_UNIQUE:
17829         case KEY_COPY_ABORTED:
17830         case KEY_EQUAL:
17831         case KEY_RESERVED:
17832         default:
17833                 sd_sense_key_default(un, xp->xb_sense_data,
17834                     bp, xp, pktp);
17835                 break;
17836         }
17837 }
17838 
17839 
17840 /*
17841  *    Function: sd_dump_memory
17842  *
17843  * Description: Debug logging routine to print the contents of a user provided
17844  *              buffer. The output of the buffer is broken up into 256 byte
17845  *              segments due to a size constraint of the scsi_log.
17846  *              implementation.
17847  *
17848  *   Arguments: un - ptr to softstate
17849  *              comp - component mask
17850  *              title - "title" string to preceed data when printed
17851  *              data - ptr to data block to be printed
17852  *              len - size of data block to be printed
17853  *              fmt - SD_LOG_HEX (use 0x%02x format) or SD_LOG_CHAR (use %c)
17854  *
17855  *     Context: May be called from interrupt context
17856  */
17857 
17858 #define SD_DUMP_MEMORY_BUF_SIZE 256
17859 
17860 static char *sd_dump_format_string[] = {
17861                 " 0x%02x",
17862                 " %c"
17863 };
17864 
17865 static void
17866 sd_dump_memory(struct sd_lun *un, uint_t comp, char *title, uchar_t *data,
17867     int len, int fmt)
17868 {
17869         int     i, j;
17870         int     avail_count;
17871         int     start_offset;
17872         int     end_offset;
17873         size_t  entry_len;
17874         char    *bufp;
17875         char    *local_buf;
17876         char    *format_string;
17877 
17878         ASSERT((fmt == SD_LOG_HEX) || (fmt == SD_LOG_CHAR));
17879 
17880         /*
17881          * In the debug version of the driver, this function is called from a
17882          * number of places which are NOPs in the release driver.
17883          * The debug driver therefore has additional methods of filtering
17884          * debug output.
17885          */
17886 #ifdef SDDEBUG
17887         /*
17888          * In the debug version of the driver we can reduce the amount of debug
17889          * messages by setting sd_error_level to something other than
17890          * SCSI_ERR_ALL and clearing bits in sd_level_mask and
17891          * sd_component_mask.
17892          */
17893         if (((sd_level_mask & (SD_LOGMASK_DUMP_MEM | SD_LOGMASK_DIAG)) == 0) ||
17894             (sd_error_level != SCSI_ERR_ALL)) {
17895                 return;
17896         }
17897         if (((sd_component_mask & comp) == 0) ||
17898             (sd_error_level != SCSI_ERR_ALL)) {
17899                 return;
17900         }
17901 #else
17902         if (sd_error_level != SCSI_ERR_ALL) {
17903                 return;
17904         }
17905 #endif
17906 
17907         local_buf = kmem_zalloc(SD_DUMP_MEMORY_BUF_SIZE, KM_SLEEP);
17908         bufp = local_buf;
17909         /*
17910          * Available length is the length of local_buf[], minus the
17911          * length of the title string, minus one for the ":", minus
17912          * one for the newline, minus one for the NULL terminator.
17913          * This gives the #bytes available for holding the printed
17914          * values from the given data buffer.
17915          */
17916         if (fmt == SD_LOG_HEX) {
17917                 format_string = sd_dump_format_string[0];
17918         } else /* SD_LOG_CHAR */ {
17919                 format_string = sd_dump_format_string[1];
17920         }
17921         /*
17922          * Available count is the number of elements from the given
17923          * data buffer that we can fit into the available length.
17924          * This is based upon the size of the format string used.
17925          * Make one entry and find it's size.
17926          */
17927         (void) sprintf(bufp, format_string, data[0]);
17928         entry_len = strlen(bufp);
17929         avail_count = (SD_DUMP_MEMORY_BUF_SIZE - strlen(title) - 3) / entry_len;
17930 
17931         j = 0;
17932         while (j < len) {
17933                 bufp = local_buf;
17934                 bzero(bufp, SD_DUMP_MEMORY_BUF_SIZE);
17935                 start_offset = j;
17936 
17937                 end_offset = start_offset + avail_count;
17938 
17939                 (void) sprintf(bufp, "%s:", title);
17940                 bufp += strlen(bufp);
17941                 for (i = start_offset; ((i < end_offset) && (j < len));
17942                     i++, j++) {
17943                         (void) sprintf(bufp, format_string, data[i]);
17944                         bufp += entry_len;
17945                 }
17946                 (void) sprintf(bufp, "\n");
17947 
17948                 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE, "%s", local_buf);
17949         }
17950         kmem_free(local_buf, SD_DUMP_MEMORY_BUF_SIZE);
17951 }
17952 
17953 /*
17954  *    Function: sd_print_sense_msg
17955  *
17956  * Description: Log a message based upon the given sense data.
17957  *
17958  *   Arguments: un - ptr to associated softstate
17959  *              bp - ptr to buf(9S) for the command
17960  *              arg - ptr to associate sd_sense_info struct
17961  *              code - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED,
17962  *                      or SD_NO_RETRY_ISSUED
17963  *
17964  *     Context: May be called from interrupt context
17965  */
17966 
17967 static void
17968 sd_print_sense_msg(struct sd_lun *un, struct buf *bp, void *arg, int code)
17969 {
17970         struct sd_xbuf  *xp;
17971         struct scsi_pkt *pktp;
17972         uint8_t *sensep;
17973         daddr_t request_blkno;
17974         diskaddr_t err_blkno;
17975         int severity;
17976         int pfa_flag;
17977         extern struct scsi_key_strings scsi_cmds[];
17978 
17979         ASSERT(un != NULL);
17980         ASSERT(mutex_owned(SD_MUTEX(un)));
17981         ASSERT(bp != NULL);
17982         xp = SD_GET_XBUF(bp);
17983         ASSERT(xp != NULL);
17984         pktp = SD_GET_PKTP(bp);
17985         ASSERT(pktp != NULL);
17986         ASSERT(arg != NULL);
17987 
17988         severity = ((struct sd_sense_info *)(arg))->ssi_severity;
17989         pfa_flag = ((struct sd_sense_info *)(arg))->ssi_pfa_flag;
17990 
17991         if ((code == SD_DELAYED_RETRY_ISSUED) ||
17992             (code == SD_IMMEDIATE_RETRY_ISSUED)) {
17993                 severity = SCSI_ERR_RETRYABLE;
17994         }
17995 
17996         /* Use absolute block number for the request block number */
17997         request_blkno = xp->xb_blkno;
17998 
17999         /*
18000          * Now try to get the error block number from the sense data
18001          */
18002         sensep = xp->xb_sense_data;
18003 
18004         if (scsi_sense_info_uint64(sensep, SENSE_LENGTH,
18005             (uint64_t *)&err_blkno)) {
18006                 /*
18007                  * We retrieved the error block number from the information
18008                  * portion of the sense data.
18009                  *
18010                  * For USCSI commands we are better off using the error
18011                  * block no. as the requested block no. (This is the best
18012                  * we can estimate.)
18013                  */
18014                 if ((SD_IS_BUFIO(xp) == FALSE) &&
18015                     ((pktp->pkt_flags & FLAG_SILENT) == 0)) {
18016                         request_blkno = err_blkno;
18017                 }
18018         } else {
18019                 /*
18020                  * Without the es_valid bit set (for fixed format) or an
18021                  * information descriptor (for descriptor format) we cannot
18022                  * be certain of the error blkno, so just use the
18023                  * request_blkno.
18024                  */
18025                 err_blkno = (diskaddr_t)request_blkno;
18026         }
18027 
18028         /*
18029          * The following will log the buffer contents for the release driver
18030          * if the SD_LOGMASK_DIAG bit of sd_level_mask is set, or the error
18031          * level is set to verbose.
18032          */
18033         sd_dump_memory(un, SD_LOG_IO, "Failed CDB",
18034             (uchar_t *)pktp->pkt_cdbp, CDB_SIZE, SD_LOG_HEX);
18035         sd_dump_memory(un, SD_LOG_IO, "Sense Data",
18036             (uchar_t *)sensep, SENSE_LENGTH, SD_LOG_HEX);
18037 
18038         if (pfa_flag == FALSE) {
18039                 /* This is normally only set for USCSI */
18040                 if ((pktp->pkt_flags & FLAG_SILENT) != 0) {
18041                         return;
18042                 }
18043 
18044                 if ((SD_IS_BUFIO(xp) == TRUE) &&
18045                     (((sd_level_mask & SD_LOGMASK_DIAG) == 0) &&
18046                     (severity < sd_error_level))) {
18047                         return;
18048                 }
18049         }
18050         /*
18051          * Check for Sonoma Failover and keep a count of how many failed I/O's
18052          */
18053         if ((SD_IS_LSI(un)) &&
18054             (scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) &&
18055             (scsi_sense_asc(sensep) == 0x94) &&
18056             (scsi_sense_ascq(sensep) == 0x01)) {
18057                 un->un_sonoma_failure_count++;
18058                 if (un->un_sonoma_failure_count > 1) {
18059                         return;
18060                 }
18061         }
18062 
18063         if (SD_FM_LOG(un) == SD_FM_LOG_NSUP ||
18064             ((scsi_sense_key(sensep) == KEY_RECOVERABLE_ERROR) &&
18065             (pktp->pkt_resid == 0))) {
18066                 scsi_vu_errmsg(SD_SCSI_DEVP(un), pktp, sd_label, severity,
18067                     request_blkno, err_blkno, scsi_cmds,
18068                     (struct scsi_extended_sense *)sensep,
18069                     un->un_additional_codes, NULL);
18070         }
18071 }
18072 
18073 /*
18074  *    Function: sd_sense_key_no_sense
18075  *
18076  * Description: Recovery action when sense data was not received.
18077  *
18078  *     Context: May be called from interrupt context
18079  */
18080 
18081 static void
18082 sd_sense_key_no_sense(struct sd_lun *un, struct buf *bp,
18083         struct sd_xbuf *xp, struct scsi_pkt *pktp)
18084 {
18085         struct sd_sense_info    si;
18086 
18087         ASSERT(un != NULL);
18088         ASSERT(mutex_owned(SD_MUTEX(un)));
18089         ASSERT(bp != NULL);
18090         ASSERT(xp != NULL);
18091         ASSERT(pktp != NULL);
18092 
18093         si.ssi_severity = SCSI_ERR_FATAL;
18094         si.ssi_pfa_flag = FALSE;
18095 
18096         SD_UPDATE_ERRSTATS(un, sd_softerrs);
18097 
18098         sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
18099             &si, EIO, (clock_t)0, NULL);
18100 }
18101 
18102 
18103 /*
18104  *    Function: sd_sense_key_recoverable_error
18105  *
18106  * Description: Recovery actions for a SCSI "Recovered Error" sense key.
18107  *
18108  *     Context: May be called from interrupt context
18109  */
18110 
18111 static void
18112 sd_sense_key_recoverable_error(struct sd_lun *un,
18113         uint8_t *sense_datap,
18114         struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp)
18115 {
18116         struct sd_sense_info    si;
18117         uint8_t asc = scsi_sense_asc(sense_datap);
18118         uint8_t ascq = scsi_sense_ascq(sense_datap);
18119 
18120         ASSERT(un != NULL);
18121         ASSERT(mutex_owned(SD_MUTEX(un)));
18122         ASSERT(bp != NULL);
18123         ASSERT(xp != NULL);
18124         ASSERT(pktp != NULL);
18125 
18126         /*
18127          * 0x00, 0x1D: ATA PASSTHROUGH INFORMATION AVAILABLE
18128          */
18129         if (asc == 0x00 && ascq == 0x1D) {
18130                 sd_return_command(un, bp);
18131                 return;
18132         }
18133 
18134         /*
18135          * 0x5D: FAILURE PREDICTION THRESHOLD EXCEEDED
18136          */
18137         if ((asc == 0x5D) && (sd_report_pfa != 0)) {
18138                 SD_UPDATE_ERRSTATS(un, sd_rq_pfa_err);
18139                 si.ssi_severity = SCSI_ERR_INFO;
18140                 si.ssi_pfa_flag = TRUE;
18141         } else {
18142                 SD_UPDATE_ERRSTATS(un, sd_softerrs);
18143                 SD_UPDATE_ERRSTATS(un, sd_rq_recov_err);
18144                 si.ssi_severity = SCSI_ERR_RECOVERED;
18145                 si.ssi_pfa_flag = FALSE;
18146         }
18147 
18148         if (pktp->pkt_resid == 0) {
18149                 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18150                 sd_return_command(un, bp);
18151                 return;
18152         }
18153 
18154         sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
18155             &si, EIO, (clock_t)0, NULL);
18156 }
18157 
18158 
18159 
18160 
18161 /*
18162  *    Function: sd_sense_key_not_ready
18163  *
18164  * Description: Recovery actions for a SCSI "Not Ready" sense key.
18165  *
18166  *     Context: May be called from interrupt context
18167  */
18168 
18169 static void
18170 sd_sense_key_not_ready(struct sd_lun *un,
18171         uint8_t *sense_datap,
18172         struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp)
18173 {
18174         struct sd_sense_info    si;
18175         uint8_t asc = scsi_sense_asc(sense_datap);
18176         uint8_t ascq = scsi_sense_ascq(sense_datap);
18177 
18178         ASSERT(un != NULL);
18179         ASSERT(mutex_owned(SD_MUTEX(un)));
18180         ASSERT(bp != NULL);
18181         ASSERT(xp != NULL);
18182         ASSERT(pktp != NULL);
18183 
18184         si.ssi_severity = SCSI_ERR_FATAL;
18185         si.ssi_pfa_flag = FALSE;
18186 
18187         /*
18188          * Update error stats after first NOT READY error. Disks may have
18189          * been powered down and may need to be restarted.  For CDROMs,
18190          * report NOT READY errors only if media is present.
18191          */
18192         if ((ISCD(un) && (asc == 0x3A)) ||
18193             (xp->xb_nr_retry_count > 0)) {
18194                 SD_UPDATE_ERRSTATS(un, sd_harderrs);
18195                 SD_UPDATE_ERRSTATS(un, sd_rq_ntrdy_err);
18196         }
18197 
18198         /*
18199          * Just fail if the "not ready" retry limit has been reached.
18200          */
18201         if (xp->xb_nr_retry_count >= un->un_notready_retry_count) {
18202                 /* Special check for error message printing for removables. */
18203                 if (un->un_f_has_removable_media && (asc == 0x04) &&
18204                     (ascq >= 0x04)) {
18205                         si.ssi_severity = SCSI_ERR_ALL;
18206                 }
18207                 goto fail_command;
18208         }
18209 
18210         /*
18211          * Check the ASC and ASCQ in the sense data as needed, to determine
18212          * what to do.
18213          */
18214         switch (asc) {
18215         case 0x04:      /* LOGICAL UNIT NOT READY */
18216                 /*
18217                  * disk drives that don't spin up result in a very long delay
18218                  * in format without warning messages. We will log a message
18219                  * if the error level is set to verbose.
18220                  */
18221                 if (sd_error_level < SCSI_ERR_RETRYABLE) {
18222                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18223                             "logical unit not ready, resetting disk\n");
18224                 }
18225 
18226                 /*
18227                  * There are different requirements for CDROMs and disks for
18228                  * the number of retries.  If a CD-ROM is giving this, it is
18229                  * probably reading TOC and is in the process of getting
18230                  * ready, so we should keep on trying for a long time to make
18231                  * sure that all types of media are taken in account (for
18232                  * some media the drive takes a long time to read TOC).  For
18233                  * disks we do not want to retry this too many times as this
18234                  * can cause a long hang in format when the drive refuses to
18235                  * spin up (a very common failure).
18236                  */
18237                 switch (ascq) {
18238                 case 0x00:  /* LUN NOT READY, CAUSE NOT REPORTABLE */
18239                         /*
18240                          * Disk drives frequently refuse to spin up which
18241                          * results in a very long hang in format without
18242                          * warning messages.
18243                          *
18244                          * Note: This code preserves the legacy behavior of
18245                          * comparing xb_nr_retry_count against zero for fibre
18246                          * channel targets instead of comparing against the
18247                          * un_reset_retry_count value.  The reason for this
18248                          * discrepancy has been so utterly lost beneath the
18249                          * Sands of Time that even Indiana Jones could not
18250                          * find it.
18251                          */
18252                         if (un->un_f_is_fibre == TRUE) {
18253                                 if (((sd_level_mask & SD_LOGMASK_DIAG) ||
18254                                     (xp->xb_nr_retry_count > 0)) &&
18255                                     (un->un_startstop_timeid == NULL)) {
18256                                         scsi_log(SD_DEVINFO(un), sd_label,
18257                                             CE_WARN, "logical unit not ready, "
18258                                             "resetting disk\n");
18259                                         sd_reset_target(un, pktp);
18260                                 }
18261                         } else {
18262                                 if (((sd_level_mask & SD_LOGMASK_DIAG) ||
18263                                     (xp->xb_nr_retry_count >
18264                                     un->un_reset_retry_count)) &&
18265                                     (un->un_startstop_timeid == NULL)) {
18266                                         scsi_log(SD_DEVINFO(un), sd_label,
18267                                             CE_WARN, "logical unit not ready, "
18268                                             "resetting disk\n");
18269                                         sd_reset_target(un, pktp);
18270                                 }
18271                         }
18272                         break;
18273 
18274                 case 0x01:  /* LUN IS IN PROCESS OF BECOMING READY */
18275                         /*
18276                          * If the target is in the process of becoming
18277                          * ready, just proceed with the retry. This can
18278                          * happen with CD-ROMs that take a long time to
18279                          * read TOC after a power cycle or reset.
18280                          */
18281                         goto do_retry;
18282 
18283                 case 0x02:  /* LUN NOT READY, INITITIALIZING CMD REQUIRED */
18284                         break;
18285 
18286                 case 0x03:  /* LUN NOT READY, MANUAL INTERVENTION REQUIRED */
18287                         /*
18288                          * Retries cannot help here so just fail right away.
18289                          */
18290                         goto fail_command;
18291 
18292                 case 0x88:
18293                         /*
18294                          * Vendor-unique code for T3/T4: it indicates a
18295                          * path problem in a mutipathed config, but as far as
18296                          * the target driver is concerned it equates to a fatal
18297                          * error, so we should just fail the command right away
18298                          * (without printing anything to the console). If this
18299                          * is not a T3/T4, fall thru to the default recovery
18300                          * action.
18301                          * T3/T4 is FC only, don't need to check is_fibre
18302                          */
18303                         if (SD_IS_T3(un) || SD_IS_T4(un)) {
18304                                 sd_return_failed_command(un, bp, EIO);
18305                                 return;
18306                         }
18307                         /* FALLTHRU */
18308 
18309                 case 0x04:  /* LUN NOT READY, FORMAT IN PROGRESS */
18310                 case 0x05:  /* LUN NOT READY, REBUILD IN PROGRESS */
18311                 case 0x06:  /* LUN NOT READY, RECALCULATION IN PROGRESS */
18312                 case 0x07:  /* LUN NOT READY, OPERATION IN PROGRESS */
18313                 case 0x08:  /* LUN NOT READY, LONG WRITE IN PROGRESS */
18314                 default:    /* Possible future codes in SCSI spec? */
18315                         /*
18316                          * For removable-media devices, do not retry if
18317                          * ASCQ > 2 as these result mostly from USCSI commands
18318                          * on MMC devices issued to check status of an
18319                          * operation initiated in immediate mode.  Also for
18320                          * ASCQ >= 4 do not print console messages as these
18321                          * mainly represent a user-initiated operation
18322                          * instead of a system failure.
18323                          */
18324                         if (un->un_f_has_removable_media) {
18325                                 si.ssi_severity = SCSI_ERR_ALL;
18326                                 goto fail_command;
18327                         }
18328                         break;
18329                 }
18330 
18331                 /*
18332                  * As part of our recovery attempt for the NOT READY
18333                  * condition, we issue a START STOP UNIT command. However
18334                  * we want to wait for a short delay before attempting this
18335                  * as there may still be more commands coming back from the
18336                  * target with the check condition. To do this we use
18337                  * timeout(9F) to call sd_start_stop_unit_callback() after
18338                  * the delay interval expires. (sd_start_stop_unit_callback()
18339                  * dispatches sd_start_stop_unit_task(), which will issue
18340                  * the actual START STOP UNIT command. The delay interval
18341                  * is one-half of the delay that we will use to retry the
18342                  * command that generated the NOT READY condition.
18343                  *
18344                  * Note that we could just dispatch sd_start_stop_unit_task()
18345                  * from here and allow it to sleep for the delay interval,
18346                  * but then we would be tying up the taskq thread
18347                  * uncesessarily for the duration of the delay.
18348                  *
18349                  * Do not issue the START STOP UNIT if the current command
18350                  * is already a START STOP UNIT.
18351                  */
18352                 if (pktp->pkt_cdbp[0] == SCMD_START_STOP) {
18353                         break;
18354                 }
18355 
18356                 /*
18357                  * Do not schedule the timeout if one is already pending.
18358                  */
18359                 if (un->un_startstop_timeid != NULL) {
18360                         SD_INFO(SD_LOG_ERROR, un,
18361                             "sd_sense_key_not_ready: restart already issued to"
18362                             " %s%d\n", ddi_driver_name(SD_DEVINFO(un)),
18363                             ddi_get_instance(SD_DEVINFO(un)));
18364                         break;
18365                 }
18366 
18367                 /*
18368                  * Schedule the START STOP UNIT command, then queue the command
18369                  * for a retry.
18370                  *
18371                  * Note: A timeout is not scheduled for this retry because we
18372                  * want the retry to be serial with the START_STOP_UNIT. The
18373                  * retry will be started when the START_STOP_UNIT is completed
18374                  * in sd_start_stop_unit_task.
18375                  */
18376                 un->un_startstop_timeid = timeout(sd_start_stop_unit_callback,
18377                     un, un->un_busy_timeout / 2);
18378                 xp->xb_nr_retry_count++;
18379                 sd_set_retry_bp(un, bp, 0, kstat_waitq_enter);
18380                 return;
18381 
18382         case 0x05:      /* LOGICAL UNIT DOES NOT RESPOND TO SELECTION */
18383                 if (sd_error_level < SCSI_ERR_RETRYABLE) {
18384                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18385                             "unit does not respond to selection\n");
18386                 }
18387                 break;
18388 
18389         case 0x3A:      /* MEDIUM NOT PRESENT */
18390                 if (sd_error_level >= SCSI_ERR_FATAL) {
18391                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18392                             "Caddy not inserted in drive\n");
18393                 }
18394 
18395                 sr_ejected(un);
18396                 un->un_mediastate = DKIO_EJECTED;
18397                 /* The state has changed, inform the media watch routines */
18398                 cv_broadcast(&un->un_state_cv);
18399                 /* Just fail if no media is present in the drive. */
18400                 goto fail_command;
18401 
18402         default:
18403                 if (sd_error_level < SCSI_ERR_RETRYABLE) {
18404                         scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE,
18405                             "Unit not Ready. Additional sense code 0x%x\n",
18406                             asc);
18407                 }
18408                 break;
18409         }
18410 
18411 do_retry:
18412 
18413         /*
18414          * Retry the command, as some targets may report NOT READY for
18415          * several seconds after being reset.
18416          */
18417         xp->xb_nr_retry_count++;
18418         si.ssi_severity = SCSI_ERR_RETRYABLE;
18419         sd_retry_command(un, bp, SD_RETRIES_NOCHECK, sd_print_sense_msg,
18420             &si, EIO, un->un_busy_timeout, NULL);
18421 
18422         return;
18423 
18424 fail_command:
18425         sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18426         sd_return_failed_command(un, bp, EIO);
18427 }
18428 
18429 
18430 
18431 /*
18432  *    Function: sd_sense_key_medium_or_hardware_error
18433  *
18434  * Description: Recovery actions for a SCSI "Medium Error" or "Hardware Error"
18435  *              sense key.
18436  *
18437  *     Context: May be called from interrupt context
18438  */
18439 
18440 static void
18441 sd_sense_key_medium_or_hardware_error(struct sd_lun *un,
18442         uint8_t *sense_datap,
18443         struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp)
18444 {
18445         struct sd_sense_info    si;
18446         uint8_t sense_key = scsi_sense_key(sense_datap);
18447         uint8_t asc = scsi_sense_asc(sense_datap);
18448 
18449         ASSERT(un != NULL);
18450         ASSERT(mutex_owned(SD_MUTEX(un)));
18451         ASSERT(bp != NULL);
18452         ASSERT(xp != NULL);
18453         ASSERT(pktp != NULL);
18454 
18455         si.ssi_severity = SCSI_ERR_FATAL;
18456         si.ssi_pfa_flag = FALSE;
18457 
18458         if (sense_key == KEY_MEDIUM_ERROR) {
18459                 SD_UPDATE_ERRSTATS(un, sd_rq_media_err);
18460         }
18461 
18462         SD_UPDATE_ERRSTATS(un, sd_harderrs);
18463 
18464         if ((un->un_reset_retry_count != 0) &&
18465             (xp->xb_retry_count == un->un_reset_retry_count)) {
18466                 mutex_exit(SD_MUTEX(un));
18467                 /* Do NOT do a RESET_ALL here: too intrusive. (4112858) */
18468                 if (un->un_f_allow_bus_device_reset == TRUE) {
18469 
18470                         boolean_t try_resetting_target = B_TRUE;
18471 
18472                         /*
18473                          * We need to be able to handle specific ASC when we are
18474                          * handling a KEY_HARDWARE_ERROR. In particular
18475                          * taking the default action of resetting the target may
18476                          * not be the appropriate way to attempt recovery.
18477                          * Resetting a target because of a single LUN failure
18478                          * victimizes all LUNs on that target.
18479                          *
18480                          * This is true for the LSI arrays, if an LSI
18481                          * array controller returns an ASC of 0x84 (LUN Dead) we
18482                          * should trust it.
18483                          */
18484 
18485                         if (sense_key == KEY_HARDWARE_ERROR) {
18486                                 switch (asc) {
18487                                 case 0x84:
18488                                         if (SD_IS_LSI(un)) {
18489                                                 try_resetting_target = B_FALSE;
18490                                         }
18491                                         break;
18492                                 default:
18493                                         break;
18494                                 }
18495                         }
18496 
18497                         if (try_resetting_target == B_TRUE) {
18498                                 int reset_retval = 0;
18499                                 if (un->un_f_lun_reset_enabled == TRUE) {
18500                                         SD_TRACE(SD_LOG_IO_CORE, un,
18501                                             "sd_sense_key_medium_or_hardware_"
18502                                             "error: issuing RESET_LUN\n");
18503                                         reset_retval =
18504                                             scsi_reset(SD_ADDRESS(un),
18505                                             RESET_LUN);
18506                                 }
18507                                 if (reset_retval == 0) {
18508                                         SD_TRACE(SD_LOG_IO_CORE, un,
18509                                             "sd_sense_key_medium_or_hardware_"
18510                                             "error: issuing RESET_TARGET\n");
18511                                         (void) scsi_reset(SD_ADDRESS(un),
18512                                             RESET_TARGET);
18513                                 }
18514                         }
18515                 }
18516                 mutex_enter(SD_MUTEX(un));
18517         }
18518 
18519         /*
18520          * This really ought to be a fatal error, but we will retry anyway
18521          * as some drives report this as a spurious error.
18522          */
18523         sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
18524             &si, EIO, (clock_t)0, NULL);
18525 }
18526 
18527 
18528 
18529 /*
18530  *    Function: sd_sense_key_illegal_request
18531  *
18532  * Description: Recovery actions for a SCSI "Illegal Request" sense key.
18533  *
18534  *     Context: May be called from interrupt context
18535  */
18536 
18537 static void
18538 sd_sense_key_illegal_request(struct sd_lun *un, struct buf *bp,
18539         struct sd_xbuf *xp, struct scsi_pkt *pktp)
18540 {
18541         struct sd_sense_info    si;
18542 
18543         ASSERT(un != NULL);
18544         ASSERT(mutex_owned(SD_MUTEX(un)));
18545         ASSERT(bp != NULL);
18546         ASSERT(xp != NULL);
18547         ASSERT(pktp != NULL);
18548 
18549         SD_UPDATE_ERRSTATS(un, sd_rq_illrq_err);
18550 
18551         si.ssi_severity = SCSI_ERR_INFO;
18552         si.ssi_pfa_flag = FALSE;
18553 
18554         /* Pointless to retry if the target thinks it's an illegal request */
18555         sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18556         sd_return_failed_command(un, bp, EIO);
18557 }
18558 
18559 
18560 
18561 
18562 /*
18563  *    Function: sd_sense_key_unit_attention
18564  *
18565  * Description: Recovery actions for a SCSI "Unit Attention" sense key.
18566  *
18567  *     Context: May be called from interrupt context
18568  */
18569 
18570 static void
18571 sd_sense_key_unit_attention(struct sd_lun *un,
18572         uint8_t *sense_datap,
18573         struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp)
18574 {
18575         /*
18576          * For UNIT ATTENTION we allow retries for one minute. Devices
18577          * like Sonoma can return UNIT ATTENTION close to a minute
18578          * under certain conditions.
18579          */
18580         int     retry_check_flag = SD_RETRIES_UA;
18581         boolean_t       kstat_updated = B_FALSE;
18582         struct  sd_sense_info           si;
18583         uint8_t asc = scsi_sense_asc(sense_datap);
18584         uint8_t ascq = scsi_sense_ascq(sense_datap);
18585 
18586         ASSERT(un != NULL);
18587         ASSERT(mutex_owned(SD_MUTEX(un)));
18588         ASSERT(bp != NULL);
18589         ASSERT(xp != NULL);
18590         ASSERT(pktp != NULL);
18591 
18592         si.ssi_severity = SCSI_ERR_INFO;
18593         si.ssi_pfa_flag = FALSE;
18594 
18595 
18596         switch (asc) {
18597         case 0x5D:  /* FAILURE PREDICTION THRESHOLD EXCEEDED */
18598                 if (sd_report_pfa != 0) {
18599                         SD_UPDATE_ERRSTATS(un, sd_rq_pfa_err);
18600                         si.ssi_pfa_flag = TRUE;
18601                         retry_check_flag = SD_RETRIES_STANDARD;
18602                         goto do_retry;
18603                 }
18604 
18605                 break;
18606 
18607         case 0x29:  /* POWER ON, RESET, OR BUS DEVICE RESET OCCURRED */
18608                 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
18609                         un->un_resvd_status |=
18610                             (SD_LOST_RESERVE | SD_WANT_RESERVE);
18611                 }
18612 #ifdef _LP64
18613                 if (un->un_blockcount + 1 > SD_GROUP1_MAX_ADDRESS) {
18614                         if (taskq_dispatch(sd_tq, sd_reenable_dsense_task,
18615                             un, KM_NOSLEEP) == 0) {
18616                                 /*
18617                                  * If we can't dispatch the task we'll just
18618                                  * live without descriptor sense.  We can
18619                                  * try again on the next "unit attention"
18620                                  */
18621                                 SD_ERROR(SD_LOG_ERROR, un,
18622                                     "sd_sense_key_unit_attention: "
18623                                     "Could not dispatch "
18624                                     "sd_reenable_dsense_task\n");
18625                         }
18626                 }
18627 #endif /* _LP64 */
18628                 /* FALLTHRU */
18629 
18630         case 0x28: /* NOT READY TO READY CHANGE, MEDIUM MAY HAVE CHANGED */
18631                 if (!un->un_f_has_removable_media) {
18632                         break;
18633                 }
18634 
18635                 /*
18636                  * When we get a unit attention from a removable-media device,
18637                  * it may be in a state that will take a long time to recover
18638                  * (e.g., from a reset).  Since we are executing in interrupt
18639                  * context here, we cannot wait around for the device to come
18640                  * back. So hand this command off to sd_media_change_task()
18641                  * for deferred processing under taskq thread context. (Note
18642                  * that the command still may be failed if a problem is
18643                  * encountered at a later time.)
18644                  */
18645                 if (taskq_dispatch(sd_tq, sd_media_change_task, pktp,
18646                     KM_NOSLEEP) == 0) {
18647                         /*
18648                          * Cannot dispatch the request so fail the command.
18649                          */
18650                         SD_UPDATE_ERRSTATS(un, sd_harderrs);
18651                         SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err);
18652                         si.ssi_severity = SCSI_ERR_FATAL;
18653                         sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18654                         sd_return_failed_command(un, bp, EIO);
18655                 }
18656 
18657                 /*
18658                  * If failed to dispatch sd_media_change_task(), we already
18659                  * updated kstat. If succeed to dispatch sd_media_change_task(),
18660                  * we should update kstat later if it encounters an error. So,
18661                  * we update kstat_updated flag here.
18662                  */
18663                 kstat_updated = B_TRUE;
18664 
18665                 /*
18666                  * Either the command has been successfully dispatched to a
18667                  * task Q for retrying, or the dispatch failed. In either case
18668                  * do NOT retry again by calling sd_retry_command. This sets up
18669                  * two retries of the same command and when one completes and
18670                  * frees the resources the other will access freed memory,
18671                  * a bad thing.
18672                  */
18673                 return;
18674 
18675         default:
18676                 break;
18677         }
18678 
18679         /*
18680          * ASC  ASCQ
18681          *  2A   09     Capacity data has changed
18682          *  2A   01     Mode parameters changed
18683          *  3F   0E     Reported luns data has changed
18684          * Arrays that support logical unit expansion should report
18685          * capacity changes(2Ah/09). Mode parameters changed and
18686          * reported luns data has changed are the approximation.
18687          */
18688         if (((asc == 0x2a) && (ascq == 0x09)) ||
18689             ((asc == 0x2a) && (ascq == 0x01)) ||
18690             ((asc == 0x3f) && (ascq == 0x0e))) {
18691                 if (taskq_dispatch(sd_tq, sd_target_change_task, un,
18692                     KM_NOSLEEP) == 0) {
18693                         SD_ERROR(SD_LOG_ERROR, un,
18694                             "sd_sense_key_unit_attention: "
18695                             "Could not dispatch sd_target_change_task\n");
18696                 }
18697         }
18698 
18699         /*
18700          * Update kstat if we haven't done that.
18701          */
18702         if (!kstat_updated) {
18703                 SD_UPDATE_ERRSTATS(un, sd_harderrs);
18704                 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err);
18705         }
18706 
18707 do_retry:
18708         sd_retry_command(un, bp, retry_check_flag, sd_print_sense_msg, &si,
18709             EIO, SD_UA_RETRY_DELAY, NULL);
18710 }
18711 
18712 
18713 
18714 /*
18715  *    Function: sd_sense_key_fail_command
18716  *
18717  * Description: Use to fail a command when we don't like the sense key that
18718  *              was returned.
18719  *
18720  *     Context: May be called from interrupt context
18721  */
18722 
18723 static void
18724 sd_sense_key_fail_command(struct sd_lun *un, struct buf *bp,
18725         struct sd_xbuf *xp, struct scsi_pkt *pktp)
18726 {
18727         struct sd_sense_info    si;
18728 
18729         ASSERT(un != NULL);
18730         ASSERT(mutex_owned(SD_MUTEX(un)));
18731         ASSERT(bp != NULL);
18732         ASSERT(xp != NULL);
18733         ASSERT(pktp != NULL);
18734 
18735         si.ssi_severity = SCSI_ERR_FATAL;
18736         si.ssi_pfa_flag = FALSE;
18737 
18738         sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18739         sd_return_failed_command(un, bp, EIO);
18740 }
18741 
18742 
18743 
18744 /*
18745  *    Function: sd_sense_key_blank_check
18746  *
18747  * Description: Recovery actions for a SCSI "Blank Check" sense key.
18748  *              Has no monetary connotation.
18749  *
18750  *     Context: May be called from interrupt context
18751  */
18752 
18753 static void
18754 sd_sense_key_blank_check(struct sd_lun *un, struct buf *bp,
18755         struct sd_xbuf *xp, struct scsi_pkt *pktp)
18756 {
18757         struct sd_sense_info    si;
18758 
18759         ASSERT(un != NULL);
18760         ASSERT(mutex_owned(SD_MUTEX(un)));
18761         ASSERT(bp != NULL);
18762         ASSERT(xp != NULL);
18763         ASSERT(pktp != NULL);
18764 
18765         /*
18766          * Blank check is not fatal for removable devices, therefore
18767          * it does not require a console message.
18768          */
18769         si.ssi_severity = (un->un_f_has_removable_media) ? SCSI_ERR_ALL :
18770             SCSI_ERR_FATAL;
18771         si.ssi_pfa_flag = FALSE;
18772 
18773         sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18774         sd_return_failed_command(un, bp, EIO);
18775 }
18776 
18777 
18778 
18779 
18780 /*
18781  *    Function: sd_sense_key_aborted_command
18782  *
18783  * Description: Recovery actions for a SCSI "Aborted Command" sense key.
18784  *
18785  *     Context: May be called from interrupt context
18786  */
18787 
18788 static void
18789 sd_sense_key_aborted_command(struct sd_lun *un, struct buf *bp,
18790         struct sd_xbuf *xp, struct scsi_pkt *pktp)
18791 {
18792         struct sd_sense_info    si;
18793 
18794         ASSERT(un != NULL);
18795         ASSERT(mutex_owned(SD_MUTEX(un)));
18796         ASSERT(bp != NULL);
18797         ASSERT(xp != NULL);
18798         ASSERT(pktp != NULL);
18799 
18800         si.ssi_severity = SCSI_ERR_FATAL;
18801         si.ssi_pfa_flag = FALSE;
18802 
18803         SD_UPDATE_ERRSTATS(un, sd_harderrs);
18804 
18805         /*
18806          * This really ought to be a fatal error, but we will retry anyway
18807          * as some drives report this as a spurious error.
18808          */
18809         sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
18810             &si, EIO, drv_usectohz(100000), NULL);
18811 }
18812 
18813 
18814 
18815 /*
18816  *    Function: sd_sense_key_default
18817  *
18818  * Description: Default recovery action for several SCSI sense keys (basically
18819  *              attempts a retry).
18820  *
18821  *     Context: May be called from interrupt context
18822  */
18823 
18824 static void
18825 sd_sense_key_default(struct sd_lun *un,
18826         uint8_t *sense_datap,
18827         struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp)
18828 {
18829         struct sd_sense_info    si;
18830         uint8_t sense_key = scsi_sense_key(sense_datap);
18831 
18832         ASSERT(un != NULL);
18833         ASSERT(mutex_owned(SD_MUTEX(un)));
18834         ASSERT(bp != NULL);
18835         ASSERT(xp != NULL);
18836         ASSERT(pktp != NULL);
18837 
18838         SD_UPDATE_ERRSTATS(un, sd_harderrs);
18839 
18840         /*
18841          * Undecoded sense key. Attempt retries and hope that will fix
18842          * the problem.  Otherwise, we're dead.
18843          */
18844         if ((pktp->pkt_flags & FLAG_SILENT) == 0) {
18845                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18846                     "Unhandled Sense Key '%s'\n", sense_keys[sense_key]);
18847         }
18848 
18849         si.ssi_severity = SCSI_ERR_FATAL;
18850         si.ssi_pfa_flag = FALSE;
18851 
18852         sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
18853             &si, EIO, (clock_t)0, NULL);
18854 }
18855 
18856 
18857 
18858 /*
18859  *    Function: sd_print_retry_msg
18860  *
18861  * Description: Print a message indicating the retry action being taken.
18862  *
18863  *   Arguments: un - ptr to associated softstate
18864  *              bp - ptr to buf(9S) for the command
18865  *              arg - not used.
18866  *              flag - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED,
18867  *                      or SD_NO_RETRY_ISSUED
18868  *
18869  *     Context: May be called from interrupt context
18870  */
18871 /* ARGSUSED */
18872 static void
18873 sd_print_retry_msg(struct sd_lun *un, struct buf *bp, void *arg, int flag)
18874 {
18875         struct sd_xbuf  *xp;
18876         struct scsi_pkt *pktp;
18877         char *reasonp;
18878         char *msgp;
18879 
18880         ASSERT(un != NULL);
18881         ASSERT(mutex_owned(SD_MUTEX(un)));
18882         ASSERT(bp != NULL);
18883         pktp = SD_GET_PKTP(bp);
18884         ASSERT(pktp != NULL);
18885         xp = SD_GET_XBUF(bp);
18886         ASSERT(xp != NULL);
18887 
18888         ASSERT(!mutex_owned(&un->un_pm_mutex));
18889         mutex_enter(&un->un_pm_mutex);
18890         if ((un->un_state == SD_STATE_SUSPENDED) ||
18891             (SD_DEVICE_IS_IN_LOW_POWER(un)) ||
18892             (pktp->pkt_flags & FLAG_SILENT)) {
18893                 mutex_exit(&un->un_pm_mutex);
18894                 goto update_pkt_reason;
18895         }
18896         mutex_exit(&un->un_pm_mutex);
18897 
18898         /*
18899          * Suppress messages if they are all the same pkt_reason; with
18900          * TQ, many (up to 256) are returned with the same pkt_reason.
18901          * If we are in panic, then suppress the retry messages.
18902          */
18903         switch (flag) {
18904         case SD_NO_RETRY_ISSUED:
18905                 msgp = "giving up";
18906                 break;
18907         case SD_IMMEDIATE_RETRY_ISSUED:
18908         case SD_DELAYED_RETRY_ISSUED:
18909                 if (ddi_in_panic() || (un->un_state == SD_STATE_OFFLINE) ||
18910                     ((pktp->pkt_reason == un->un_last_pkt_reason) &&
18911                     (sd_error_level != SCSI_ERR_ALL))) {
18912                         return;
18913                 }
18914                 msgp = "retrying command";
18915                 break;
18916         default:
18917                 goto update_pkt_reason;
18918         }
18919 
18920         reasonp = (((pktp->pkt_statistics & STAT_PERR) != 0) ? "parity error" :
18921             scsi_rname(pktp->pkt_reason));
18922 
18923         if (SD_FM_LOG(un) == SD_FM_LOG_NSUP) {
18924                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18925                     "SCSI transport failed: reason '%s': %s\n", reasonp, msgp);
18926         }
18927 
18928 update_pkt_reason:
18929         /*
18930          * Update un->un_last_pkt_reason with the value in pktp->pkt_reason.
18931          * This is to prevent multiple console messages for the same failure
18932          * condition.  Note that un->un_last_pkt_reason is NOT restored if &
18933          * when the command is retried successfully because there still may be
18934          * more commands coming back with the same value of pktp->pkt_reason.
18935          */
18936         if ((pktp->pkt_reason != CMD_CMPLT) || (xp->xb_retry_count == 0)) {
18937                 un->un_last_pkt_reason = pktp->pkt_reason;
18938         }
18939 }
18940 
18941 
18942 /*
18943  *    Function: sd_print_cmd_incomplete_msg
18944  *
18945  * Description: Message logging fn. for a SCSA "CMD_INCOMPLETE" pkt_reason.
18946  *
18947  *   Arguments: un - ptr to associated softstate
18948  *              bp - ptr to buf(9S) for the command
18949  *              arg - passed to sd_print_retry_msg()
18950  *              code - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED,
18951  *                      or SD_NO_RETRY_ISSUED
18952  *
18953  *     Context: May be called from interrupt context
18954  */
18955 
18956 static void
18957 sd_print_cmd_incomplete_msg(struct sd_lun *un, struct buf *bp, void *arg,
18958         int code)
18959 {
18960         dev_info_t      *dip;
18961 
18962         ASSERT(un != NULL);
18963         ASSERT(mutex_owned(SD_MUTEX(un)));
18964         ASSERT(bp != NULL);
18965 
18966         switch (code) {
18967         case SD_NO_RETRY_ISSUED:
18968                 /* Command was failed. Someone turned off this target? */
18969                 if (un->un_state != SD_STATE_OFFLINE) {
18970                         /*
18971                          * Suppress message if we are detaching and
18972                          * device has been disconnected
18973                          * Note that DEVI_IS_DEVICE_REMOVED is a consolidation
18974                          * private interface and not part of the DDI
18975                          */
18976                         dip = un->un_sd->sd_dev;
18977                         if (!(DEVI_IS_DETACHING(dip) &&
18978                             DEVI_IS_DEVICE_REMOVED(dip))) {
18979                                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18980                                 "disk not responding to selection\n");
18981                         }
18982                         New_state(un, SD_STATE_OFFLINE);
18983                 }
18984                 break;
18985 
18986         case SD_DELAYED_RETRY_ISSUED:
18987         case SD_IMMEDIATE_RETRY_ISSUED:
18988         default:
18989                 /* Command was successfully queued for retry */
18990                 sd_print_retry_msg(un, bp, arg, code);
18991                 break;
18992         }
18993 }
18994 
18995 
18996 /*
18997  *    Function: sd_pkt_reason_cmd_incomplete
18998  *
18999  * Description: Recovery actions for a SCSA "CMD_INCOMPLETE" pkt_reason.
19000  *
19001  *     Context: May be called from interrupt context
19002  */
19003 
19004 static void
19005 sd_pkt_reason_cmd_incomplete(struct sd_lun *un, struct buf *bp,
19006         struct sd_xbuf *xp, struct scsi_pkt *pktp)
19007 {
19008         int flag = SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE;
19009 
19010         ASSERT(un != NULL);
19011         ASSERT(mutex_owned(SD_MUTEX(un)));
19012         ASSERT(bp != NULL);
19013         ASSERT(xp != NULL);
19014         ASSERT(pktp != NULL);
19015 
19016         /* Do not do a reset if selection did not complete */
19017         /* Note: Should this not just check the bit? */
19018         if (pktp->pkt_state != STATE_GOT_BUS) {
19019                 SD_UPDATE_ERRSTATS(un, sd_transerrs);
19020                 sd_reset_target(un, pktp);
19021         }
19022 
19023         /*
19024          * If the target was not successfully selected, then set
19025          * SD_RETRIES_FAILFAST to indicate that we lost communication
19026          * with the target, and further retries and/or commands are
19027          * likely to take a long time.
19028          */
19029         if ((pktp->pkt_state & STATE_GOT_TARGET) == 0) {
19030                 flag |= SD_RETRIES_FAILFAST;
19031         }
19032 
19033         SD_UPDATE_RESERVATION_STATUS(un, pktp);
19034 
19035         sd_retry_command(un, bp, flag,
19036             sd_print_cmd_incomplete_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19037 }
19038 
19039 
19040 
19041 /*
19042  *    Function: sd_pkt_reason_cmd_tran_err
19043  *
19044  * Description: Recovery actions for a SCSA "CMD_TRAN_ERR" pkt_reason.
19045  *
19046  *     Context: May be called from interrupt context
19047  */
19048 
19049 static void
19050 sd_pkt_reason_cmd_tran_err(struct sd_lun *un, struct buf *bp,
19051         struct sd_xbuf *xp, struct scsi_pkt *pktp)
19052 {
19053         ASSERT(un != NULL);
19054         ASSERT(mutex_owned(SD_MUTEX(un)));
19055         ASSERT(bp != NULL);
19056         ASSERT(xp != NULL);
19057         ASSERT(pktp != NULL);
19058 
19059         /*
19060          * Do not reset if we got a parity error, or if
19061          * selection did not complete.
19062          */
19063         SD_UPDATE_ERRSTATS(un, sd_harderrs);
19064         /* Note: Should this not just check the bit for pkt_state? */
19065         if (((pktp->pkt_statistics & STAT_PERR) == 0) &&
19066             (pktp->pkt_state != STATE_GOT_BUS)) {
19067                 SD_UPDATE_ERRSTATS(un, sd_transerrs);
19068                 sd_reset_target(un, pktp);
19069         }
19070 
19071         SD_UPDATE_RESERVATION_STATUS(un, pktp);
19072 
19073         sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE),
19074             sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19075 }
19076 
19077 
19078 
19079 /*
19080  *    Function: sd_pkt_reason_cmd_reset
19081  *
19082  * Description: Recovery actions for a SCSA "CMD_RESET" pkt_reason.
19083  *
19084  *     Context: May be called from interrupt context
19085  */
19086 
19087 static void
19088 sd_pkt_reason_cmd_reset(struct sd_lun *un, struct buf *bp,
19089         struct sd_xbuf *xp, struct scsi_pkt *pktp)
19090 {
19091         ASSERT(un != NULL);
19092         ASSERT(mutex_owned(SD_MUTEX(un)));
19093         ASSERT(bp != NULL);
19094         ASSERT(xp != NULL);
19095         ASSERT(pktp != NULL);
19096 
19097         /* The target may still be running the command, so try to reset. */
19098         SD_UPDATE_ERRSTATS(un, sd_transerrs);
19099         sd_reset_target(un, pktp);
19100 
19101         SD_UPDATE_RESERVATION_STATUS(un, pktp);
19102 
19103         /*
19104          * If pkt_reason is CMD_RESET chances are that this pkt got
19105          * reset because another target on this bus caused it. The target
19106          * that caused it should get CMD_TIMEOUT with pkt_statistics
19107          * of STAT_TIMEOUT/STAT_DEV_RESET.
19108          */
19109 
19110         sd_retry_command(un, bp, (SD_RETRIES_VICTIM | SD_RETRIES_ISOLATE),
19111             sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19112 }
19113 
19114 
19115 
19116 
19117 /*
19118  *    Function: sd_pkt_reason_cmd_aborted
19119  *
19120  * Description: Recovery actions for a SCSA "CMD_ABORTED" pkt_reason.
19121  *
19122  *     Context: May be called from interrupt context
19123  */
19124 
19125 static void
19126 sd_pkt_reason_cmd_aborted(struct sd_lun *un, struct buf *bp,
19127         struct sd_xbuf *xp, struct scsi_pkt *pktp)
19128 {
19129         ASSERT(un != NULL);
19130         ASSERT(mutex_owned(SD_MUTEX(un)));
19131         ASSERT(bp != NULL);
19132         ASSERT(xp != NULL);
19133         ASSERT(pktp != NULL);
19134 
19135         /* The target may still be running the command, so try to reset. */
19136         SD_UPDATE_ERRSTATS(un, sd_transerrs);
19137         sd_reset_target(un, pktp);
19138 
19139         SD_UPDATE_RESERVATION_STATUS(un, pktp);
19140 
19141         /*
19142          * If pkt_reason is CMD_ABORTED chances are that this pkt got
19143          * aborted because another target on this bus caused it. The target
19144          * that caused it should get CMD_TIMEOUT with pkt_statistics
19145          * of STAT_TIMEOUT/STAT_DEV_RESET.
19146          */
19147 
19148         sd_retry_command(un, bp, (SD_RETRIES_VICTIM | SD_RETRIES_ISOLATE),
19149             sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19150 }
19151 
19152 
19153 
19154 /*
19155  *    Function: sd_pkt_reason_cmd_timeout
19156  *
19157  * Description: Recovery actions for a SCSA "CMD_TIMEOUT" pkt_reason.
19158  *
19159  *     Context: May be called from interrupt context
19160  */
19161 
19162 static void
19163 sd_pkt_reason_cmd_timeout(struct sd_lun *un, struct buf *bp,
19164         struct sd_xbuf *xp, struct scsi_pkt *pktp)
19165 {
19166         ASSERT(un != NULL);
19167         ASSERT(mutex_owned(SD_MUTEX(un)));
19168         ASSERT(bp != NULL);
19169         ASSERT(xp != NULL);
19170         ASSERT(pktp != NULL);
19171 
19172 
19173         SD_UPDATE_ERRSTATS(un, sd_transerrs);
19174         sd_reset_target(un, pktp);
19175 
19176         SD_UPDATE_RESERVATION_STATUS(un, pktp);
19177 
19178         /*
19179          * A command timeout indicates that we could not establish
19180          * communication with the target, so set SD_RETRIES_FAILFAST
19181          * as further retries/commands are likely to take a long time.
19182          */
19183         sd_retry_command(un, bp,
19184             (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE | SD_RETRIES_FAILFAST),
19185             sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19186 }
19187 
19188 
19189 
19190 /*
19191  *    Function: sd_pkt_reason_cmd_unx_bus_free
19192  *
19193  * Description: Recovery actions for a SCSA "CMD_UNX_BUS_FREE" pkt_reason.
19194  *
19195  *     Context: May be called from interrupt context
19196  */
19197 
19198 static void
19199 sd_pkt_reason_cmd_unx_bus_free(struct sd_lun *un, struct buf *bp,
19200         struct sd_xbuf *xp, struct scsi_pkt *pktp)
19201 {
19202         void (*funcp)(struct sd_lun *un, struct buf *bp, void *arg, int code);
19203 
19204         ASSERT(un != NULL);
19205         ASSERT(mutex_owned(SD_MUTEX(un)));
19206         ASSERT(bp != NULL);
19207         ASSERT(xp != NULL);
19208         ASSERT(pktp != NULL);
19209 
19210         SD_UPDATE_ERRSTATS(un, sd_harderrs);
19211         SD_UPDATE_RESERVATION_STATUS(un, pktp);
19212 
19213         funcp = ((pktp->pkt_statistics & STAT_PERR) == 0) ?
19214             sd_print_retry_msg : NULL;
19215 
19216         sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE),
19217             funcp, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19218 }
19219 
19220 
19221 /*
19222  *    Function: sd_pkt_reason_cmd_tag_reject
19223  *
19224  * Description: Recovery actions for a SCSA "CMD_TAG_REJECT" pkt_reason.
19225  *
19226  *     Context: May be called from interrupt context
19227  */
19228 
19229 static void
19230 sd_pkt_reason_cmd_tag_reject(struct sd_lun *un, struct buf *bp,
19231         struct sd_xbuf *xp, struct scsi_pkt *pktp)
19232 {
19233         ASSERT(un != NULL);
19234         ASSERT(mutex_owned(SD_MUTEX(un)));
19235         ASSERT(bp != NULL);
19236         ASSERT(xp != NULL);
19237         ASSERT(pktp != NULL);
19238 
19239         SD_UPDATE_ERRSTATS(un, sd_harderrs);
19240         pktp->pkt_flags = 0;
19241         un->un_tagflags = 0;
19242         if (un->un_f_opt_queueing == TRUE) {
19243                 un->un_throttle = min(un->un_throttle, 3);
19244         } else {
19245                 un->un_throttle = 1;
19246         }
19247         mutex_exit(SD_MUTEX(un));
19248         (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1);
19249         mutex_enter(SD_MUTEX(un));
19250 
19251         SD_UPDATE_RESERVATION_STATUS(un, pktp);
19252 
19253         /* Legacy behavior not to check retry counts here. */
19254         sd_retry_command(un, bp, (SD_RETRIES_NOCHECK | SD_RETRIES_ISOLATE),
19255             sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19256 }
19257 
19258 
19259 /*
19260  *    Function: sd_pkt_reason_default
19261  *
19262  * Description: Default recovery actions for SCSA pkt_reason values that
19263  *              do not have more explicit recovery actions.
19264  *
19265  *     Context: May be called from interrupt context
19266  */
19267 
19268 static void
19269 sd_pkt_reason_default(struct sd_lun *un, struct buf *bp,
19270         struct sd_xbuf *xp, struct scsi_pkt *pktp)
19271 {
19272         ASSERT(un != NULL);
19273         ASSERT(mutex_owned(SD_MUTEX(un)));
19274         ASSERT(bp != NULL);
19275         ASSERT(xp != NULL);
19276         ASSERT(pktp != NULL);
19277 
19278         SD_UPDATE_ERRSTATS(un, sd_transerrs);
19279         sd_reset_target(un, pktp);
19280 
19281         SD_UPDATE_RESERVATION_STATUS(un, pktp);
19282 
19283         sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE),
19284             sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19285 }
19286 
19287 
19288 
19289 /*
19290  *    Function: sd_pkt_status_check_condition
19291  *
19292  * Description: Recovery actions for a "STATUS_CHECK" SCSI command status.
19293  *
19294  *     Context: May be called from interrupt context
19295  */
19296 
19297 static void
19298 sd_pkt_status_check_condition(struct sd_lun *un, struct buf *bp,
19299         struct sd_xbuf *xp, struct scsi_pkt *pktp)
19300 {
19301         ASSERT(un != NULL);
19302         ASSERT(mutex_owned(SD_MUTEX(un)));
19303         ASSERT(bp != NULL);
19304         ASSERT(xp != NULL);
19305         ASSERT(pktp != NULL);
19306 
19307         SD_TRACE(SD_LOG_IO, un, "sd_pkt_status_check_condition: "
19308             "entry: buf:0x%p xp:0x%p\n", bp, xp);
19309 
19310         /*
19311          * If ARQ is NOT enabled, then issue a REQUEST SENSE command (the
19312          * command will be retried after the request sense). Otherwise, retry
19313          * the command. Note: we are issuing the request sense even though the
19314          * retry limit may have been reached for the failed command.
19315          */
19316         if (un->un_f_arq_enabled == FALSE) {
19317                 SD_INFO(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: "
19318                     "no ARQ, sending request sense command\n");
19319                 sd_send_request_sense_command(un, bp, pktp);
19320         } else {
19321                 SD_INFO(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: "
19322                     "ARQ,retrying request sense command\n");
19323 #if defined(__i386) || defined(__amd64)
19324                 /*
19325                  * The SD_RETRY_DELAY value need to be adjusted here
19326                  * when SD_RETRY_DELAY change in sddef.h
19327                  */
19328                 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, EIO,
19329                     un->un_f_is_fibre?drv_usectohz(100000):(clock_t)0,
19330                     NULL);
19331 #else
19332                 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL,
19333                     EIO, SD_RETRY_DELAY, NULL);
19334 #endif
19335         }
19336 
19337         SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: exit\n");
19338 }
19339 
19340 
19341 /*
19342  *    Function: sd_pkt_status_busy
19343  *
19344  * Description: Recovery actions for a "STATUS_BUSY" SCSI command status.
19345  *
19346  *     Context: May be called from interrupt context
19347  */
19348 
19349 static void
19350 sd_pkt_status_busy(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
19351         struct scsi_pkt *pktp)
19352 {
19353         ASSERT(un != NULL);
19354         ASSERT(mutex_owned(SD_MUTEX(un)));
19355         ASSERT(bp != NULL);
19356         ASSERT(xp != NULL);
19357         ASSERT(pktp != NULL);
19358 
19359         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19360             "sd_pkt_status_busy: entry\n");
19361 
19362         /* If retries are exhausted, just fail the command. */
19363         if (xp->xb_retry_count >= un->un_busy_retry_count) {
19364                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
19365                     "device busy too long\n");
19366                 sd_return_failed_command(un, bp, EIO);
19367                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19368                     "sd_pkt_status_busy: exit\n");
19369                 return;
19370         }
19371         xp->xb_retry_count++;
19372 
19373         /*
19374          * Try to reset the target. However, we do not want to perform
19375          * more than one reset if the device continues to fail. The reset
19376          * will be performed when the retry count reaches the reset
19377          * threshold.  This threshold should be set such that at least
19378          * one retry is issued before the reset is performed.
19379          */
19380         if (xp->xb_retry_count ==
19381             ((un->un_reset_retry_count < 2) ? 2 : un->un_reset_retry_count)) {
19382                 int rval = 0;
19383                 mutex_exit(SD_MUTEX(un));
19384                 if (un->un_f_allow_bus_device_reset == TRUE) {
19385                         /*
19386                          * First try to reset the LUN; if we cannot then
19387                          * try to reset the target.
19388                          */
19389                         if (un->un_f_lun_reset_enabled == TRUE) {
19390                                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19391                                     "sd_pkt_status_busy: RESET_LUN\n");
19392                                 rval = scsi_reset(SD_ADDRESS(un), RESET_LUN);
19393                         }
19394                         if (rval == 0) {
19395                                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19396                                     "sd_pkt_status_busy: RESET_TARGET\n");
19397                                 rval = scsi_reset(SD_ADDRESS(un), RESET_TARGET);
19398                         }
19399                 }
19400                 if (rval == 0) {
19401                         /*
19402                          * If the RESET_LUN and/or RESET_TARGET failed,
19403                          * try RESET_ALL
19404                          */
19405                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19406                             "sd_pkt_status_busy: RESET_ALL\n");
19407                         rval = scsi_reset(SD_ADDRESS(un), RESET_ALL);
19408                 }
19409                 mutex_enter(SD_MUTEX(un));
19410                 if (rval == 0) {
19411                         /*
19412                          * The RESET_LUN, RESET_TARGET, and/or RESET_ALL failed.
19413                          * At this point we give up & fail the command.
19414                          */
19415                         sd_return_failed_command(un, bp, EIO);
19416                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19417                             "sd_pkt_status_busy: exit (failed cmd)\n");
19418                         return;
19419                 }
19420         }
19421 
19422         /*
19423          * Retry the command. Be sure to specify SD_RETRIES_NOCHECK as
19424          * we have already checked the retry counts above.
19425          */
19426         sd_retry_command(un, bp, SD_RETRIES_NOCHECK, NULL, NULL,
19427             EIO, un->un_busy_timeout, NULL);
19428 
19429         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19430             "sd_pkt_status_busy: exit\n");
19431 }
19432 
19433 
19434 /*
19435  *    Function: sd_pkt_status_reservation_conflict
19436  *
19437  * Description: Recovery actions for a "STATUS_RESERVATION_CONFLICT" SCSI
19438  *              command status.
19439  *
19440  *     Context: May be called from interrupt context
19441  */
19442 
19443 static void
19444 sd_pkt_status_reservation_conflict(struct sd_lun *un, struct buf *bp,
19445         struct sd_xbuf *xp, struct scsi_pkt *pktp)
19446 {
19447         ASSERT(un != NULL);
19448         ASSERT(mutex_owned(SD_MUTEX(un)));
19449         ASSERT(bp != NULL);
19450         ASSERT(xp != NULL);
19451         ASSERT(pktp != NULL);
19452 
19453         /*
19454          * If the command was PERSISTENT_RESERVATION_[IN|OUT] then reservation
19455          * conflict could be due to various reasons like incorrect keys, not
19456          * registered or not reserved etc. So, we return EACCES to the caller.
19457          */
19458         if (un->un_reservation_type == SD_SCSI3_RESERVATION) {
19459                 int cmd = SD_GET_PKT_OPCODE(pktp);
19460                 if ((cmd == SCMD_PERSISTENT_RESERVE_IN) ||
19461                     (cmd == SCMD_PERSISTENT_RESERVE_OUT)) {
19462                         sd_return_failed_command(un, bp, EACCES);
19463                         return;
19464                 }
19465         }
19466 
19467         un->un_resvd_status |= SD_RESERVATION_CONFLICT;
19468 
19469         if ((un->un_resvd_status & SD_FAILFAST) != 0) {
19470                 if (sd_failfast_enable != 0) {
19471                         /* By definition, we must panic here.... */
19472                         sd_panic_for_res_conflict(un);
19473                         /*NOTREACHED*/
19474                 }
19475                 SD_ERROR(SD_LOG_IO, un,
19476                     "sd_handle_resv_conflict: Disk Reserved\n");
19477                 sd_return_failed_command(un, bp, EACCES);
19478                 return;
19479         }
19480 
19481         /*
19482          * 1147670: retry only if sd_retry_on_reservation_conflict
19483          * property is set (default is 1). Retries will not succeed
19484          * on a disk reserved by another initiator. HA systems
19485          * may reset this via sd.conf to avoid these retries.
19486          *
19487          * Note: The legacy return code for this failure is EIO, however EACCES
19488          * seems more appropriate for a reservation conflict.
19489          */
19490         if (sd_retry_on_reservation_conflict == 0) {
19491                 SD_ERROR(SD_LOG_IO, un,
19492                     "sd_handle_resv_conflict: Device Reserved\n");
19493                 sd_return_failed_command(un, bp, EIO);
19494                 return;
19495         }
19496 
19497         /*
19498          * Retry the command if we can.
19499          *
19500          * Note: The legacy return code for this failure is EIO, however EACCES
19501          * seems more appropriate for a reservation conflict.
19502          */
19503         sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, EIO,
19504             (clock_t)2, NULL);
19505 }
19506 
19507 
19508 
19509 /*
19510  *    Function: sd_pkt_status_qfull
19511  *
19512  * Description: Handle a QUEUE FULL condition from the target.  This can
19513  *              occur if the HBA does not handle the queue full condition.
19514  *              (Basically this means third-party HBAs as Sun HBAs will
19515  *              handle the queue full condition.)  Note that if there are
19516  *              some commands already in the transport, then the queue full
19517  *              has occurred because the queue for this nexus is actually
19518  *              full. If there are no commands in the transport, then the
19519  *              queue full is resulting from some other initiator or lun
19520  *              consuming all the resources at the target.
19521  *
19522  *     Context: May be called from interrupt context
19523  */
19524 
19525 static void
19526 sd_pkt_status_qfull(struct sd_lun *un, struct buf *bp,
19527         struct sd_xbuf *xp, struct scsi_pkt *pktp)
19528 {
19529         ASSERT(un != NULL);
19530         ASSERT(mutex_owned(SD_MUTEX(un)));
19531         ASSERT(bp != NULL);
19532         ASSERT(xp != NULL);
19533         ASSERT(pktp != NULL);
19534 
19535         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19536             "sd_pkt_status_qfull: entry\n");
19537 
19538         /*
19539          * Just lower the QFULL throttle and retry the command.  Note that
19540          * we do not limit the number of retries here.
19541          */
19542         sd_reduce_throttle(un, SD_THROTTLE_QFULL);
19543         sd_retry_command(un, bp, SD_RETRIES_NOCHECK, NULL, NULL, 0,
19544             SD_RESTART_TIMEOUT, NULL);
19545 
19546         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19547             "sd_pkt_status_qfull: exit\n");
19548 }
19549 
19550 
19551 /*
19552  *    Function: sd_reset_target
19553  *
19554  * Description: Issue a scsi_reset(9F), with either RESET_LUN,
19555  *              RESET_TARGET, or RESET_ALL.
19556  *
19557  *     Context: May be called under interrupt context.
19558  */
19559 
19560 static void
19561 sd_reset_target(struct sd_lun *un, struct scsi_pkt *pktp)
19562 {
19563         int rval = 0;
19564 
19565         ASSERT(un != NULL);
19566         ASSERT(mutex_owned(SD_MUTEX(un)));
19567         ASSERT(pktp != NULL);
19568 
19569         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reset_target: entry\n");
19570 
19571         /*
19572          * No need to reset if the transport layer has already done so.
19573          */
19574         if ((pktp->pkt_statistics &
19575             (STAT_BUS_RESET | STAT_DEV_RESET | STAT_ABORTED)) != 0) {
19576                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19577                     "sd_reset_target: no reset\n");
19578                 return;
19579         }
19580 
19581         mutex_exit(SD_MUTEX(un));
19582 
19583         if (un->un_f_allow_bus_device_reset == TRUE) {
19584                 if (un->un_f_lun_reset_enabled == TRUE) {
19585                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19586                             "sd_reset_target: RESET_LUN\n");
19587                         rval = scsi_reset(SD_ADDRESS(un), RESET_LUN);
19588                 }
19589                 if (rval == 0) {
19590                         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19591                             "sd_reset_target: RESET_TARGET\n");
19592                         rval = scsi_reset(SD_ADDRESS(un), RESET_TARGET);
19593                 }
19594         }
19595 
19596         if (rval == 0) {
19597                 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19598                     "sd_reset_target: RESET_ALL\n");
19599                 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
19600         }
19601 
19602         mutex_enter(SD_MUTEX(un));
19603 
19604         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reset_target: exit\n");
19605 }
19606 
19607 /*
19608  *    Function: sd_target_change_task
19609  *
19610  * Description: Handle dynamic target change
19611  *
19612  *     Context: Executes in a taskq() thread context
19613  */
19614 static void
19615 sd_target_change_task(void *arg)
19616 {
19617         struct sd_lun           *un = arg;
19618         uint64_t                capacity;
19619         diskaddr_t              label_cap;
19620         uint_t                  lbasize;
19621         sd_ssc_t                *ssc;
19622 
19623         ASSERT(un != NULL);
19624         ASSERT(!mutex_owned(SD_MUTEX(un)));
19625 
19626         if ((un->un_f_blockcount_is_valid == FALSE) ||
19627             (un->un_f_tgt_blocksize_is_valid == FALSE)) {
19628                 return;
19629         }
19630 
19631         ssc = sd_ssc_init(un);
19632 
19633         if (sd_send_scsi_READ_CAPACITY(ssc, &capacity,
19634             &lbasize, SD_PATH_DIRECT) != 0) {
19635                 SD_ERROR(SD_LOG_ERROR, un,
19636                     "sd_target_change_task: fail to read capacity\n");
19637                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
19638                 goto task_exit;
19639         }
19640 
19641         mutex_enter(SD_MUTEX(un));
19642         if (capacity <= un->un_blockcount) {
19643                 mutex_exit(SD_MUTEX(un));
19644                 goto task_exit;
19645         }
19646 
19647         sd_update_block_info(un, lbasize, capacity);
19648         mutex_exit(SD_MUTEX(un));
19649 
19650         /*
19651          * If lun is EFI labeled and lun capacity is greater than the
19652          * capacity contained in the label, log a sys event.
19653          */
19654         if (cmlb_efi_label_capacity(un->un_cmlbhandle, &label_cap,
19655             (void*)SD_PATH_DIRECT) == 0) {
19656                 mutex_enter(SD_MUTEX(un));
19657                 if (un->un_f_blockcount_is_valid &&
19658                     un->un_blockcount > label_cap) {
19659                         mutex_exit(SD_MUTEX(un));
19660                         sd_log_lun_expansion_event(un, KM_SLEEP);
19661                 } else {
19662                         mutex_exit(SD_MUTEX(un));
19663                 }
19664         }
19665 
19666 task_exit:
19667         sd_ssc_fini(ssc);
19668 }
19669 
19670 
19671 /*
19672  *    Function: sd_log_dev_status_event
19673  *
19674  * Description: Log EC_dev_status sysevent
19675  *
19676  *     Context: Never called from interrupt context
19677  */
19678 static void
19679 sd_log_dev_status_event(struct sd_lun *un, char *esc, int km_flag)
19680 {
19681         int err;
19682         char                    *path;
19683         nvlist_t                *attr_list;
19684 
19685         /* Allocate and build sysevent attribute list */
19686         err = nvlist_alloc(&attr_list, NV_UNIQUE_NAME_TYPE, km_flag);
19687         if (err != 0) {
19688                 SD_ERROR(SD_LOG_ERROR, un,
19689                     "sd_log_dev_status_event: fail to allocate space\n");
19690                 return;
19691         }
19692 
19693         path = kmem_alloc(MAXPATHLEN, km_flag);
19694         if (path == NULL) {
19695                 nvlist_free(attr_list);
19696                 SD_ERROR(SD_LOG_ERROR, un,
19697                     "sd_log_dev_status_event: fail to allocate space\n");
19698                 return;
19699         }
19700         /*
19701          * Add path attribute to identify the lun.
19702          * We are using minor node 'a' as the sysevent attribute.
19703          */
19704         (void) snprintf(path, MAXPATHLEN, "/devices");
19705         (void) ddi_pathname(SD_DEVINFO(un), path + strlen(path));
19706         (void) snprintf(path + strlen(path), MAXPATHLEN - strlen(path),
19707             ":a");
19708 
19709         err = nvlist_add_string(attr_list, DEV_PHYS_PATH, path);
19710         if (err != 0) {
19711                 nvlist_free(attr_list);
19712                 kmem_free(path, MAXPATHLEN);
19713                 SD_ERROR(SD_LOG_ERROR, un,
19714                     "sd_log_dev_status_event: fail to add attribute\n");
19715                 return;
19716         }
19717 
19718         /* Log dynamic lun expansion sysevent */
19719         err = ddi_log_sysevent(SD_DEVINFO(un), SUNW_VENDOR, EC_DEV_STATUS,
19720             esc, attr_list, NULL, km_flag);
19721         if (err != DDI_SUCCESS) {
19722                 SD_ERROR(SD_LOG_ERROR, un,
19723                     "sd_log_dev_status_event: fail to log sysevent\n");
19724         }
19725 
19726         nvlist_free(attr_list);
19727         kmem_free(path, MAXPATHLEN);
19728 }
19729 
19730 
19731 /*
19732  *    Function: sd_log_lun_expansion_event
19733  *
19734  * Description: Log lun expansion sys event
19735  *
19736  *     Context: Never called from interrupt context
19737  */
19738 static void
19739 sd_log_lun_expansion_event(struct sd_lun *un, int km_flag)
19740 {
19741         sd_log_dev_status_event(un, ESC_DEV_DLE, km_flag);
19742 }
19743 
19744 
19745 /*
19746  *    Function: sd_log_eject_request_event
19747  *
19748  * Description: Log eject request sysevent
19749  *
19750  *     Context: Never called from interrupt context
19751  */
19752 static void
19753 sd_log_eject_request_event(struct sd_lun *un, int km_flag)
19754 {
19755         sd_log_dev_status_event(un, ESC_DEV_EJECT_REQUEST, km_flag);
19756 }
19757 
19758 
19759 /*
19760  *    Function: sd_media_change_task
19761  *
19762  * Description: Recovery action for CDROM to become available.
19763  *
19764  *     Context: Executes in a taskq() thread context
19765  */
19766 
19767 static void
19768 sd_media_change_task(void *arg)
19769 {
19770         struct  scsi_pkt        *pktp = arg;
19771         struct  sd_lun          *un;
19772         struct  buf             *bp;
19773         struct  sd_xbuf         *xp;
19774         int     err             = 0;
19775         int     retry_count     = 0;
19776         int     retry_limit     = SD_UNIT_ATTENTION_RETRY/10;
19777         struct  sd_sense_info   si;
19778 
19779         ASSERT(pktp != NULL);
19780         bp = (struct buf *)pktp->pkt_private;
19781         ASSERT(bp != NULL);
19782         xp = SD_GET_XBUF(bp);
19783         ASSERT(xp != NULL);
19784         un = SD_GET_UN(bp);
19785         ASSERT(un != NULL);
19786         ASSERT(!mutex_owned(SD_MUTEX(un)));
19787         ASSERT(un->un_f_monitor_media_state);
19788 
19789         si.ssi_severity = SCSI_ERR_INFO;
19790         si.ssi_pfa_flag = FALSE;
19791 
19792         /*
19793          * When a reset is issued on a CDROM, it takes a long time to
19794          * recover. First few attempts to read capacity and other things
19795          * related to handling unit attention fail (with a ASC 0x4 and
19796          * ASCQ 0x1). In that case we want to do enough retries and we want
19797          * to limit the retries in other cases of genuine failures like
19798          * no media in drive.
19799          */
19800         while (retry_count++ < retry_limit) {
19801                 if ((err = sd_handle_mchange(un)) == 0) {
19802                         break;
19803                 }
19804                 if (err == EAGAIN) {
19805                         retry_limit = SD_UNIT_ATTENTION_RETRY;
19806                 }
19807                 /* Sleep for 0.5 sec. & try again */
19808                 delay(drv_usectohz(500000));
19809         }
19810 
19811         /*
19812          * Dispatch (retry or fail) the original command here,
19813          * along with appropriate console messages....
19814          *
19815          * Must grab the mutex before calling sd_retry_command,
19816          * sd_print_sense_msg and sd_return_failed_command.
19817          */
19818         mutex_enter(SD_MUTEX(un));
19819         if (err != SD_CMD_SUCCESS) {
19820                 SD_UPDATE_ERRSTATS(un, sd_harderrs);
19821                 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err);
19822                 si.ssi_severity = SCSI_ERR_FATAL;
19823                 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
19824                 sd_return_failed_command(un, bp, EIO);
19825         } else {
19826                 sd_retry_command(un, bp, SD_RETRIES_UA, sd_print_sense_msg,
19827                     &si, EIO, (clock_t)0, NULL);
19828         }
19829         mutex_exit(SD_MUTEX(un));
19830 }
19831 
19832 
19833 
19834 /*
19835  *    Function: sd_handle_mchange
19836  *
19837  * Description: Perform geometry validation & other recovery when CDROM
19838  *              has been removed from drive.
19839  *
19840  * Return Code: 0 for success
19841  *              errno-type return code of either sd_send_scsi_DOORLOCK() or
19842  *              sd_send_scsi_READ_CAPACITY()
19843  *
19844  *     Context: Executes in a taskq() thread context
19845  */
19846 
19847 static int
19848 sd_handle_mchange(struct sd_lun *un)
19849 {
19850         uint64_t        capacity;
19851         uint32_t        lbasize;
19852         int             rval;
19853         sd_ssc_t        *ssc;
19854 
19855         ASSERT(!mutex_owned(SD_MUTEX(un)));
19856         ASSERT(un->un_f_monitor_media_state);
19857 
19858         ssc = sd_ssc_init(un);
19859         rval = sd_send_scsi_READ_CAPACITY(ssc, &capacity, &lbasize,
19860             SD_PATH_DIRECT_PRIORITY);
19861 
19862         if (rval != 0)
19863                 goto failed;
19864 
19865         mutex_enter(SD_MUTEX(un));
19866         sd_update_block_info(un, lbasize, capacity);
19867 
19868         if (un->un_errstats != NULL) {
19869                 struct  sd_errstats *stp =
19870                     (struct sd_errstats *)un->un_errstats->ks_data;
19871                 stp->sd_capacity.value.ui64 = (uint64_t)
19872                     ((uint64_t)un->un_blockcount *
19873                     (uint64_t)un->un_tgt_blocksize);
19874         }
19875 
19876         /*
19877          * Check if the media in the device is writable or not
19878          */
19879         if (ISCD(un)) {
19880                 sd_check_for_writable_cd(ssc, SD_PATH_DIRECT_PRIORITY);
19881         }
19882 
19883         /*
19884          * Note: Maybe let the strategy/partitioning chain worry about getting
19885          * valid geometry.
19886          */
19887         mutex_exit(SD_MUTEX(un));
19888         cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT_PRIORITY);
19889 
19890 
19891         if (cmlb_validate(un->un_cmlbhandle, 0,
19892             (void *)SD_PATH_DIRECT_PRIORITY) != 0) {
19893                 sd_ssc_fini(ssc);
19894                 return (EIO);
19895         } else {
19896                 if (un->un_f_pkstats_enabled) {
19897                         sd_set_pstats(un);
19898                         SD_TRACE(SD_LOG_IO_PARTITION, un,
19899                             "sd_handle_mchange: un:0x%p pstats created and "
19900                             "set\n", un);
19901                 }
19902         }
19903 
19904         /*
19905          * Try to lock the door
19906          */
19907         rval = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT,
19908             SD_PATH_DIRECT_PRIORITY);
19909 failed:
19910         if (rval != 0)
19911                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
19912         sd_ssc_fini(ssc);
19913         return (rval);
19914 }
19915 
19916 
19917 /*
19918  *    Function: sd_send_scsi_DOORLOCK
19919  *
19920  * Description: Issue the scsi DOOR LOCK command
19921  *
19922  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
19923  *                      structure for this target.
19924  *              flag  - SD_REMOVAL_ALLOW
19925  *                      SD_REMOVAL_PREVENT
19926  *              path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
19927  *                      the normal command waitq, or SD_PATH_DIRECT_PRIORITY
19928  *                      to use the USCSI "direct" chain and bypass the normal
19929  *                      command waitq. SD_PATH_DIRECT_PRIORITY is used when this
19930  *                      command is issued as part of an error recovery action.
19931  *
19932  * Return Code: 0   - Success
19933  *              errno return code from sd_ssc_send()
19934  *
19935  *     Context: Can sleep.
19936  */
19937 
19938 static int
19939 sd_send_scsi_DOORLOCK(sd_ssc_t *ssc, int flag, int path_flag)
19940 {
19941         struct scsi_extended_sense      sense_buf;
19942         union scsi_cdb          cdb;
19943         struct uscsi_cmd        ucmd_buf;
19944         int                     status;
19945         struct sd_lun           *un;
19946 
19947         ASSERT(ssc != NULL);
19948         un = ssc->ssc_un;
19949         ASSERT(un != NULL);
19950         ASSERT(!mutex_owned(SD_MUTEX(un)));
19951 
19952         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_DOORLOCK: entry: un:0x%p\n", un);
19953 
19954         /* already determined doorlock is not supported, fake success */
19955         if (un->un_f_doorlock_supported == FALSE) {
19956                 return (0);
19957         }
19958 
19959         /*
19960          * If we are ejecting and see an SD_REMOVAL_PREVENT
19961          * ignore the command so we can complete the eject
19962          * operation.
19963          */
19964         if (flag == SD_REMOVAL_PREVENT) {
19965                 mutex_enter(SD_MUTEX(un));
19966                 if (un->un_f_ejecting == TRUE) {
19967                         mutex_exit(SD_MUTEX(un));
19968                         return (EAGAIN);
19969                 }
19970                 mutex_exit(SD_MUTEX(un));
19971         }
19972 
19973         bzero(&cdb, sizeof (cdb));
19974         bzero(&ucmd_buf, sizeof (ucmd_buf));
19975 
19976         cdb.scc_cmd = SCMD_DOORLOCK;
19977         cdb.cdb_opaque[4] = (uchar_t)flag;
19978 
19979         ucmd_buf.uscsi_cdb      = (char *)&cdb;
19980         ucmd_buf.uscsi_cdblen   = CDB_GROUP0;
19981         ucmd_buf.uscsi_bufaddr  = NULL;
19982         ucmd_buf.uscsi_buflen   = 0;
19983         ucmd_buf.uscsi_rqbuf    = (caddr_t)&sense_buf;
19984         ucmd_buf.uscsi_rqlen    = sizeof (sense_buf);
19985         ucmd_buf.uscsi_flags    = USCSI_RQENABLE | USCSI_SILENT;
19986         ucmd_buf.uscsi_timeout  = 15;
19987 
19988         SD_TRACE(SD_LOG_IO, un,
19989             "sd_send_scsi_DOORLOCK: returning sd_ssc_send\n");
19990 
19991         status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
19992             UIO_SYSSPACE, path_flag);
19993 
19994         if (status == 0)
19995                 sd_ssc_assessment(ssc, SD_FMT_STANDARD);
19996 
19997         if ((status == EIO) && (ucmd_buf.uscsi_status == STATUS_CHECK) &&
19998             (ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
19999             (scsi_sense_key((uint8_t *)&sense_buf) == KEY_ILLEGAL_REQUEST)) {
20000                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
20001 
20002                 /* fake success and skip subsequent doorlock commands */
20003                 un->un_f_doorlock_supported = FALSE;
20004                 return (0);
20005         }
20006 
20007         return (status);
20008 }
20009 
20010 /*
20011  *    Function: sd_send_scsi_READ_CAPACITY
20012  *
20013  * Description: This routine uses the scsi READ CAPACITY command to determine
20014  *              the device capacity in number of blocks and the device native
20015  *              block size. If this function returns a failure, then the
20016  *              values in *capp and *lbap are undefined.  If the capacity
20017  *              returned is 0xffffffff then the lun is too large for a
20018  *              normal READ CAPACITY command and the results of a
20019  *              READ CAPACITY 16 will be used instead.
20020  *
20021  *   Arguments: ssc   - ssc contains ptr to soft state struct for the target
20022  *              capp - ptr to unsigned 64-bit variable to receive the
20023  *                      capacity value from the command.
20024  *              lbap - ptr to unsigned 32-bit varaible to receive the
20025  *                      block size value from the command
20026  *              path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
20027  *                      the normal command waitq, or SD_PATH_DIRECT_PRIORITY
20028  *                      to use the USCSI "direct" chain and bypass the normal
20029  *                      command waitq. SD_PATH_DIRECT_PRIORITY is used when this
20030  *                      command is issued as part of an error recovery action.
20031  *
20032  * Return Code: 0   - Success
20033  *              EIO - IO error
20034  *              EACCES - Reservation conflict detected
20035  *              EAGAIN - Device is becoming ready
20036  *              errno return code from sd_ssc_send()
20037  *
20038  *     Context: Can sleep.  Blocks until command completes.
20039  */
20040 
20041 #define SD_CAPACITY_SIZE        sizeof (struct scsi_capacity)
20042 
20043 static int
20044 sd_send_scsi_READ_CAPACITY(sd_ssc_t *ssc, uint64_t *capp, uint32_t *lbap,
20045         int path_flag)
20046 {
20047         struct  scsi_extended_sense     sense_buf;
20048         struct  uscsi_cmd       ucmd_buf;
20049         union   scsi_cdb        cdb;
20050         uint32_t                *capacity_buf;
20051         uint64_t                capacity;
20052         uint32_t                lbasize;
20053         uint32_t                pbsize;
20054         int                     status;
20055         struct sd_lun           *un;
20056 
20057         ASSERT(ssc != NULL);
20058 
20059         un = ssc->ssc_un;
20060         ASSERT(un != NULL);
20061         ASSERT(!mutex_owned(SD_MUTEX(un)));
20062         ASSERT(capp != NULL);
20063         ASSERT(lbap != NULL);
20064 
20065         SD_TRACE(SD_LOG_IO, un,
20066             "sd_send_scsi_READ_CAPACITY: entry: un:0x%p\n", un);
20067 
20068         /*
20069          * First send a READ_CAPACITY command to the target.
20070          * (This command is mandatory under SCSI-2.)
20071          *
20072          * Set up the CDB for the READ_CAPACITY command.  The Partial
20073          * Medium Indicator bit is cleared.  The address field must be
20074          * zero if the PMI bit is zero.
20075          */
20076         bzero(&cdb, sizeof (cdb));
20077         bzero(&ucmd_buf, sizeof (ucmd_buf));
20078 
20079         capacity_buf = kmem_zalloc(SD_CAPACITY_SIZE, KM_SLEEP);
20080 
20081         cdb.scc_cmd = SCMD_READ_CAPACITY;
20082 
20083         ucmd_buf.uscsi_cdb      = (char *)&cdb;
20084         ucmd_buf.uscsi_cdblen   = CDB_GROUP1;
20085         ucmd_buf.uscsi_bufaddr  = (caddr_t)capacity_buf;
20086         ucmd_buf.uscsi_buflen   = SD_CAPACITY_SIZE;
20087         ucmd_buf.uscsi_rqbuf    = (caddr_t)&sense_buf;
20088         ucmd_buf.uscsi_rqlen    = sizeof (sense_buf);
20089         ucmd_buf.uscsi_flags    = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT;
20090         ucmd_buf.uscsi_timeout  = 60;
20091 
20092         status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
20093             UIO_SYSSPACE, path_flag);
20094 
20095         switch (status) {
20096         case 0:
20097                 /* Return failure if we did not get valid capacity data. */
20098                 if (ucmd_buf.uscsi_resid != 0) {
20099                         sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1,
20100                             "sd_send_scsi_READ_CAPACITY received invalid "
20101                             "capacity data");
20102                         kmem_free(capacity_buf, SD_CAPACITY_SIZE);
20103                         return (EIO);
20104                 }
20105                 /*
20106                  * Read capacity and block size from the READ CAPACITY 10 data.
20107                  * This data may be adjusted later due to device specific
20108                  * issues.
20109                  *
20110                  * According to the SCSI spec, the READ CAPACITY 10
20111                  * command returns the following:
20112                  *
20113                  *  bytes 0-3: Maximum logical block address available.
20114                  *              (MSB in byte:0 & LSB in byte:3)
20115                  *
20116                  *  bytes 4-7: Block length in bytes
20117                  *              (MSB in byte:4 & LSB in byte:7)
20118                  *
20119                  */
20120                 capacity = BE_32(capacity_buf[0]);
20121                 lbasize = BE_32(capacity_buf[1]);
20122 
20123                 /*
20124                  * Done with capacity_buf
20125                  */
20126                 kmem_free(capacity_buf, SD_CAPACITY_SIZE);
20127 
20128                 /*
20129                  * if the reported capacity is set to all 0xf's, then
20130                  * this disk is too large and requires SBC-2 commands.
20131                  * Reissue the request using READ CAPACITY 16.
20132                  */
20133                 if (capacity == 0xffffffff) {
20134                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
20135                         status = sd_send_scsi_READ_CAPACITY_16(ssc, &capacity,
20136                             &lbasize, &pbsize, path_flag);
20137                         if (status != 0) {
20138                                 return (status);
20139                         } else {
20140                                 goto rc16_done;
20141                         }
20142                 }
20143                 break;  /* Success! */
20144         case EIO:
20145                 switch (ucmd_buf.uscsi_status) {
20146                 case STATUS_RESERVATION_CONFLICT:
20147                         status = EACCES;
20148                         break;
20149                 case STATUS_CHECK:
20150                         /*
20151                          * Check condition; look for ASC/ASCQ of 0x04/0x01
20152                          * (LOGICAL UNIT IS IN PROCESS OF BECOMING READY)
20153                          */
20154                         if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
20155                             (scsi_sense_asc((uint8_t *)&sense_buf) == 0x04) &&
20156                             (scsi_sense_ascq((uint8_t *)&sense_buf) == 0x01)) {
20157                                 kmem_free(capacity_buf, SD_CAPACITY_SIZE);
20158                                 return (EAGAIN);
20159                         }
20160                         break;
20161                 default:
20162                         break;
20163                 }
20164                 /* FALLTHRU */
20165         default:
20166                 kmem_free(capacity_buf, SD_CAPACITY_SIZE);
20167                 return (status);
20168         }
20169 
20170         /*
20171          * Some ATAPI CD-ROM drives report inaccurate LBA size values
20172          * (2352 and 0 are common) so for these devices always force the value
20173          * to 2048 as required by the ATAPI specs.
20174          */
20175         if ((un->un_f_cfg_is_atapi == TRUE) && (ISCD(un))) {
20176                 lbasize = 2048;
20177         }
20178 
20179         /*
20180          * Get the maximum LBA value from the READ CAPACITY data.
20181          * Here we assume that the Partial Medium Indicator (PMI) bit
20182          * was cleared when issuing the command. This means that the LBA
20183          * returned from the device is the LBA of the last logical block
20184          * on the logical unit.  The actual logical block count will be
20185          * this value plus one.
20186          */
20187         capacity += 1;
20188 
20189         /*
20190          * Currently, for removable media, the capacity is saved in terms
20191          * of un->un_sys_blocksize, so scale the capacity value to reflect this.
20192          */
20193         if (un->un_f_has_removable_media)
20194                 capacity *= (lbasize / un->un_sys_blocksize);
20195 
20196 rc16_done:
20197 
20198         /*
20199          * Copy the values from the READ CAPACITY command into the space
20200          * provided by the caller.
20201          */
20202         *capp = capacity;
20203         *lbap = lbasize;
20204 
20205         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_READ_CAPACITY: "
20206             "capacity:0x%llx  lbasize:0x%x\n", capacity, lbasize);
20207 
20208         /*
20209          * Both the lbasize and capacity from the device must be nonzero,
20210          * otherwise we assume that the values are not valid and return
20211          * failure to the caller. (4203735)
20212          */
20213         if ((capacity == 0) || (lbasize == 0)) {
20214                 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1,
20215                     "sd_send_scsi_READ_CAPACITY received invalid value "
20216                     "capacity %llu lbasize %d", capacity, lbasize);
20217                 return (EIO);
20218         }
20219         sd_ssc_assessment(ssc, SD_FMT_STANDARD);
20220         return (0);
20221 }
20222 
20223 /*
20224  *    Function: sd_send_scsi_READ_CAPACITY_16
20225  *
20226  * Description: This routine uses the scsi READ CAPACITY 16 command to
20227  *              determine the device capacity in number of blocks and the
20228  *              device native block size.  If this function returns a failure,
20229  *              then the values in *capp and *lbap are undefined.
20230  *              This routine should be called by sd_send_scsi_READ_CAPACITY
20231  *              which will apply any device specific adjustments to capacity
20232  *              and lbasize. One exception is it is also called by
20233  *              sd_get_media_info_ext. In that function, there is no need to
20234  *              adjust the capacity and lbasize.
20235  *
20236  *   Arguments: ssc   - ssc contains ptr to soft state struct for the target
20237  *              capp - ptr to unsigned 64-bit variable to receive the
20238  *                      capacity value from the command.
20239  *              lbap - ptr to unsigned 32-bit varaible to receive the
20240  *                      block size value from the command
20241  *              psp  - ptr to unsigned 32-bit variable to receive the
20242  *                      physical block size value from the command
20243  *              path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
20244  *                      the normal command waitq, or SD_PATH_DIRECT_PRIORITY
20245  *                      to use the USCSI "direct" chain and bypass the normal
20246  *                      command waitq. SD_PATH_DIRECT_PRIORITY is used when
20247  *                      this command is issued as part of an error recovery
20248  *                      action.
20249  *
20250  * Return Code: 0   - Success
20251  *              EIO - IO error
20252  *              EACCES - Reservation conflict detected
20253  *              EAGAIN - Device is becoming ready
20254  *              errno return code from sd_ssc_send()
20255  *
20256  *     Context: Can sleep.  Blocks until command completes.
20257  */
20258 
20259 #define SD_CAPACITY_16_SIZE     sizeof (struct scsi_capacity_16)
20260 
20261 static int
20262 sd_send_scsi_READ_CAPACITY_16(sd_ssc_t *ssc, uint64_t *capp,
20263         uint32_t *lbap, uint32_t *psp, int path_flag)
20264 {
20265         struct  scsi_extended_sense     sense_buf;
20266         struct  uscsi_cmd       ucmd_buf;
20267         union   scsi_cdb        cdb;
20268         uint64_t                *capacity16_buf;
20269         uint64_t                capacity;
20270         uint32_t                lbasize;
20271         uint32_t                pbsize;
20272         uint32_t                lbpb_exp;
20273         int                     status;
20274         struct sd_lun           *un;
20275 
20276         ASSERT(ssc != NULL);
20277 
20278         un = ssc->ssc_un;
20279         ASSERT(un != NULL);
20280         ASSERT(!mutex_owned(SD_MUTEX(un)));
20281         ASSERT(capp != NULL);
20282         ASSERT(lbap != NULL);
20283 
20284         SD_TRACE(SD_LOG_IO, un,
20285             "sd_send_scsi_READ_CAPACITY: entry: un:0x%p\n", un);
20286 
20287         /*
20288          * First send a READ_CAPACITY_16 command to the target.
20289          *
20290          * Set up the CDB for the READ_CAPACITY_16 command.  The Partial
20291          * Medium Indicator bit is cleared.  The address field must be
20292          * zero if the PMI bit is zero.
20293          */
20294         bzero(&cdb, sizeof (cdb));
20295         bzero(&ucmd_buf, sizeof (ucmd_buf));
20296 
20297         capacity16_buf = kmem_zalloc(SD_CAPACITY_16_SIZE, KM_SLEEP);
20298 
20299         ucmd_buf.uscsi_cdb      = (char *)&cdb;
20300         ucmd_buf.uscsi_cdblen   = CDB_GROUP4;
20301         ucmd_buf.uscsi_bufaddr  = (caddr_t)capacity16_buf;
20302         ucmd_buf.uscsi_buflen   = SD_CAPACITY_16_SIZE;
20303         ucmd_buf.uscsi_rqbuf    = (caddr_t)&sense_buf;
20304         ucmd_buf.uscsi_rqlen    = sizeof (sense_buf);
20305         ucmd_buf.uscsi_flags    = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT;
20306         ucmd_buf.uscsi_timeout  = 60;
20307 
20308         /*
20309          * Read Capacity (16) is a Service Action In command.  One
20310          * command byte (0x9E) is overloaded for multiple operations,
20311          * with the second CDB byte specifying the desired operation
20312          */
20313         cdb.scc_cmd = SCMD_SVC_ACTION_IN_G4;
20314         cdb.cdb_opaque[1] = SSVC_ACTION_READ_CAPACITY_G4;
20315 
20316         /*
20317          * Fill in allocation length field
20318          */
20319         FORMG4COUNT(&cdb, ucmd_buf.uscsi_buflen);
20320 
20321         status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
20322             UIO_SYSSPACE, path_flag);
20323 
20324         switch (status) {
20325         case 0:
20326                 /* Return failure if we did not get valid capacity data. */
20327                 if (ucmd_buf.uscsi_resid > 20) {
20328                         sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1,
20329                             "sd_send_scsi_READ_CAPACITY_16 received invalid "
20330                             "capacity data");
20331                         kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE);
20332                         return (EIO);
20333                 }
20334 
20335                 /*
20336                  * Read capacity and block size from the READ CAPACITY 16 data.
20337                  * This data may be adjusted later due to device specific
20338                  * issues.
20339                  *
20340                  * According to the SCSI spec, the READ CAPACITY 16
20341                  * command returns the following:
20342                  *
20343                  *  bytes 0-7: Maximum logical block address available.
20344                  *              (MSB in byte:0 & LSB in byte:7)
20345                  *
20346                  *  bytes 8-11: Block length in bytes
20347                  *              (MSB in byte:8 & LSB in byte:11)
20348                  *
20349                  *  byte 13: LOGICAL BLOCKS PER PHYSICAL BLOCK EXPONENT
20350                  */
20351                 capacity = BE_64(capacity16_buf[0]);
20352                 lbasize = BE_32(*(uint32_t *)&capacity16_buf[1]);
20353                 lbpb_exp = (BE_64(capacity16_buf[1]) >> 16) & 0x0f;
20354 
20355                 pbsize = lbasize << lbpb_exp;
20356 
20357                 /*
20358                  * Done with capacity16_buf
20359                  */
20360                 kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE);
20361 
20362                 /*
20363                  * if the reported capacity is set to all 0xf's, then
20364                  * this disk is too large.  This could only happen with
20365                  * a device that supports LBAs larger than 64 bits which
20366                  * are not defined by any current T10 standards.
20367                  */
20368                 if (capacity == 0xffffffffffffffff) {
20369                         sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1,
20370                             "disk is too large");
20371                         return (EIO);
20372                 }
20373                 break;  /* Success! */
20374         case EIO:
20375                 switch (ucmd_buf.uscsi_status) {
20376                 case STATUS_RESERVATION_CONFLICT:
20377                         status = EACCES;
20378                         break;
20379                 case STATUS_CHECK:
20380                         /*
20381                          * Check condition; look for ASC/ASCQ of 0x04/0x01
20382                          * (LOGICAL UNIT IS IN PROCESS OF BECOMING READY)
20383                          */
20384                         if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
20385                             (scsi_sense_asc((uint8_t *)&sense_buf) == 0x04) &&
20386                             (scsi_sense_ascq((uint8_t *)&sense_buf) == 0x01)) {
20387                                 kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE);
20388                                 return (EAGAIN);
20389                         }
20390                         break;
20391                 default:
20392                         break;
20393                 }
20394                 /* FALLTHRU */
20395         default:
20396                 kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE);
20397                 return (status);
20398         }
20399 
20400         /*
20401          * Some ATAPI CD-ROM drives report inaccurate LBA size values
20402          * (2352 and 0 are common) so for these devices always force the value
20403          * to 2048 as required by the ATAPI specs.
20404          */
20405         if ((un->un_f_cfg_is_atapi == TRUE) && (ISCD(un))) {
20406                 lbasize = 2048;
20407         }
20408 
20409         /*
20410          * Get the maximum LBA value from the READ CAPACITY 16 data.
20411          * Here we assume that the Partial Medium Indicator (PMI) bit
20412          * was cleared when issuing the command. This means that the LBA
20413          * returned from the device is the LBA of the last logical block
20414          * on the logical unit.  The actual logical block count will be
20415          * this value plus one.
20416          */
20417         capacity += 1;
20418 
20419         /*
20420          * Currently, for removable media, the capacity is saved in terms
20421          * of un->un_sys_blocksize, so scale the capacity value to reflect this.
20422          */
20423         if (un->un_f_has_removable_media)
20424                 capacity *= (lbasize / un->un_sys_blocksize);
20425 
20426         *capp = capacity;
20427         *lbap = lbasize;
20428         *psp = pbsize;
20429 
20430         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_READ_CAPACITY_16: "
20431             "capacity:0x%llx  lbasize:0x%x, pbsize: 0x%x\n",
20432             capacity, lbasize, pbsize);
20433 
20434         if ((capacity == 0) || (lbasize == 0) || (pbsize == 0)) {
20435                 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1,
20436                     "sd_send_scsi_READ_CAPACITY_16 received invalid value "
20437                     "capacity %llu lbasize %d pbsize %d", capacity, lbasize);
20438                 return (EIO);
20439         }
20440 
20441         sd_ssc_assessment(ssc, SD_FMT_STANDARD);
20442         return (0);
20443 }
20444 
20445 
20446 /*
20447  *    Function: sd_send_scsi_START_STOP_UNIT
20448  *
20449  * Description: Issue a scsi START STOP UNIT command to the target.
20450  *
20451  *   Arguments: ssc    - ssc contatins pointer to driver soft state (unit)
20452  *                       structure for this target.
20453  *      pc_flag - SD_POWER_CONDITION
20454  *                SD_START_STOP
20455  *              flag  - SD_TARGET_START
20456  *                      SD_TARGET_STOP
20457  *                      SD_TARGET_EJECT
20458  *                      SD_TARGET_CLOSE
20459  *              path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
20460  *                      the normal command waitq, or SD_PATH_DIRECT_PRIORITY
20461  *                      to use the USCSI "direct" chain and bypass the normal
20462  *                      command waitq. SD_PATH_DIRECT_PRIORITY is used when this
20463  *                      command is issued as part of an error recovery action.
20464  *
20465  * Return Code: 0   - Success
20466  *              EIO - IO error
20467  *              EACCES - Reservation conflict detected
20468  *              ENXIO  - Not Ready, medium not present
20469  *              errno return code from sd_ssc_send()
20470  *
20471  *     Context: Can sleep.
20472  */
20473 
20474 static int
20475 sd_send_scsi_START_STOP_UNIT(sd_ssc_t *ssc, int pc_flag, int flag,
20476     int path_flag)
20477 {
20478         struct  scsi_extended_sense     sense_buf;
20479         union scsi_cdb          cdb;
20480         struct uscsi_cmd        ucmd_buf;
20481         int                     status;
20482         struct sd_lun           *un;
20483 
20484         ASSERT(ssc != NULL);
20485         un = ssc->ssc_un;
20486         ASSERT(un != NULL);
20487         ASSERT(!mutex_owned(SD_MUTEX(un)));
20488 
20489         SD_TRACE(SD_LOG_IO, un,
20490             "sd_send_scsi_START_STOP_UNIT: entry: un:0x%p\n", un);
20491 
20492         if (un->un_f_check_start_stop &&
20493             (pc_flag == SD_START_STOP) &&
20494             ((flag == SD_TARGET_START) || (flag == SD_TARGET_STOP)) &&
20495             (un->un_f_start_stop_supported != TRUE)) {
20496                 return (0);
20497         }
20498 
20499         /*
20500          * If we are performing an eject operation and
20501          * we receive any command other than SD_TARGET_EJECT
20502          * we should immediately return.
20503          */
20504         if (flag != SD_TARGET_EJECT) {
20505                 mutex_enter(SD_MUTEX(un));
20506                 if (un->un_f_ejecting == TRUE) {
20507                         mutex_exit(SD_MUTEX(un));
20508                         return (EAGAIN);
20509                 }
20510                 mutex_exit(SD_MUTEX(un));
20511         }
20512 
20513         bzero(&cdb, sizeof (cdb));
20514         bzero(&ucmd_buf, sizeof (ucmd_buf));
20515         bzero(&sense_buf, sizeof (struct scsi_extended_sense));
20516 
20517         cdb.scc_cmd = SCMD_START_STOP;
20518         cdb.cdb_opaque[4] = (pc_flag == SD_POWER_CONDITION) ?
20519             (uchar_t)(flag << 4) : (uchar_t)flag;
20520 
20521         ucmd_buf.uscsi_cdb      = (char *)&cdb;
20522         ucmd_buf.uscsi_cdblen   = CDB_GROUP0;
20523         ucmd_buf.uscsi_bufaddr  = NULL;
20524         ucmd_buf.uscsi_buflen   = 0;
20525         ucmd_buf.uscsi_rqbuf    = (caddr_t)&sense_buf;
20526         ucmd_buf.uscsi_rqlen    = sizeof (struct scsi_extended_sense);
20527         ucmd_buf.uscsi_flags    = USCSI_RQENABLE | USCSI_SILENT;
20528         ucmd_buf.uscsi_timeout  = 200;
20529 
20530         status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
20531             UIO_SYSSPACE, path_flag);
20532 
20533         switch (status) {
20534         case 0:
20535                 sd_ssc_assessment(ssc, SD_FMT_STANDARD);
20536                 break;  /* Success! */
20537         case EIO:
20538                 switch (ucmd_buf.uscsi_status) {
20539                 case STATUS_RESERVATION_CONFLICT:
20540                         status = EACCES;
20541                         break;
20542                 case STATUS_CHECK:
20543                         if (ucmd_buf.uscsi_rqstatus == STATUS_GOOD) {
20544                                 switch (scsi_sense_key(
20545                                     (uint8_t *)&sense_buf)) {
20546                                 case KEY_ILLEGAL_REQUEST:
20547                                         status = ENOTSUP;
20548                                         break;
20549                                 case KEY_NOT_READY:
20550                                         if (scsi_sense_asc(
20551                                             (uint8_t *)&sense_buf)
20552                                             == 0x3A) {
20553                                                 status = ENXIO;
20554                                         }
20555                                         break;
20556                                 default:
20557                                         break;
20558                                 }
20559                         }
20560                         break;
20561                 default:
20562                         break;
20563                 }
20564                 break;
20565         default:
20566                 break;
20567         }
20568 
20569         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_START_STOP_UNIT: exit\n");
20570 
20571         return (status);
20572 }
20573 
20574 
20575 /*
20576  *    Function: sd_start_stop_unit_callback
20577  *
20578  * Description: timeout(9F) callback to begin recovery process for a
20579  *              device that has spun down.
20580  *
20581  *   Arguments: arg - pointer to associated softstate struct.
20582  *
20583  *     Context: Executes in a timeout(9F) thread context
20584  */
20585 
20586 static void
20587 sd_start_stop_unit_callback(void *arg)
20588 {
20589         struct sd_lun   *un = arg;
20590         ASSERT(un != NULL);
20591         ASSERT(!mutex_owned(SD_MUTEX(un)));
20592 
20593         SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_callback: entry\n");
20594 
20595         (void) taskq_dispatch(sd_tq, sd_start_stop_unit_task, un, KM_NOSLEEP);
20596 }
20597 
20598 
20599 /*
20600  *    Function: sd_start_stop_unit_task
20601  *
20602  * Description: Recovery procedure when a drive is spun down.
20603  *
20604  *   Arguments: arg - pointer to associated softstate struct.
20605  *
20606  *     Context: Executes in a taskq() thread context
20607  */
20608 
20609 static void
20610 sd_start_stop_unit_task(void *arg)
20611 {
20612         struct sd_lun   *un = arg;
20613         sd_ssc_t        *ssc;
20614         int             power_level;
20615         int             rval;
20616 
20617         ASSERT(un != NULL);
20618         ASSERT(!mutex_owned(SD_MUTEX(un)));
20619 
20620         SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_task: entry\n");
20621 
20622         /*
20623          * Some unformatted drives report not ready error, no need to
20624          * restart if format has been initiated.
20625          */
20626         mutex_enter(SD_MUTEX(un));
20627         if (un->un_f_format_in_progress == TRUE) {
20628                 mutex_exit(SD_MUTEX(un));
20629                 return;
20630         }
20631         mutex_exit(SD_MUTEX(un));
20632 
20633         ssc = sd_ssc_init(un);
20634         /*
20635          * When a START STOP command is issued from here, it is part of a
20636          * failure recovery operation and must be issued before any other
20637          * commands, including any pending retries. Thus it must be sent
20638          * using SD_PATH_DIRECT_PRIORITY. It doesn't matter if the spin up
20639          * succeeds or not, we will start I/O after the attempt.
20640          * If power condition is supported and the current power level
20641          * is capable of performing I/O, we should set the power condition
20642          * to that level. Otherwise, set the power condition to ACTIVE.
20643          */
20644         if (un->un_f_power_condition_supported) {
20645                 mutex_enter(SD_MUTEX(un));
20646                 ASSERT(SD_PM_IS_LEVEL_VALID(un, un->un_power_level));
20647                 power_level = sd_pwr_pc.ran_perf[un->un_power_level]
20648                     > 0 ? un->un_power_level : SD_SPINDLE_ACTIVE;
20649                 mutex_exit(SD_MUTEX(un));
20650                 rval = sd_send_scsi_START_STOP_UNIT(ssc, SD_POWER_CONDITION,
20651                     sd_pl2pc[power_level], SD_PATH_DIRECT_PRIORITY);
20652         } else {
20653                 rval = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
20654                     SD_TARGET_START, SD_PATH_DIRECT_PRIORITY);
20655         }
20656 
20657         if (rval != 0)
20658                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
20659         sd_ssc_fini(ssc);
20660         /*
20661          * The above call blocks until the START_STOP_UNIT command completes.
20662          * Now that it has completed, we must re-try the original IO that
20663          * received the NOT READY condition in the first place. There are
20664          * three possible conditions here:
20665          *
20666          *  (1) The original IO is on un_retry_bp.
20667          *  (2) The original IO is on the regular wait queue, and un_retry_bp
20668          *      is NULL.
20669          *  (3) The original IO is on the regular wait queue, and un_retry_bp
20670          *      points to some other, unrelated bp.
20671          *
20672          * For each case, we must call sd_start_cmds() with un_retry_bp
20673          * as the argument. If un_retry_bp is NULL, this will initiate
20674          * processing of the regular wait queue.  If un_retry_bp is not NULL,
20675          * then this will process the bp on un_retry_bp. That may or may not
20676          * be the original IO, but that does not matter: the important thing
20677          * is to keep the IO processing going at this point.
20678          *
20679          * Note: This is a very specific error recovery sequence associated
20680          * with a drive that is not spun up. We attempt a START_STOP_UNIT and
20681          * serialize the I/O with completion of the spin-up.
20682          */
20683         mutex_enter(SD_MUTEX(un));
20684         SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
20685             "sd_start_stop_unit_task: un:0x%p starting bp:0x%p\n",
20686             un, un->un_retry_bp);
20687         un->un_startstop_timeid = NULL;      /* Timeout is no longer pending */
20688         sd_start_cmds(un, un->un_retry_bp);
20689         mutex_exit(SD_MUTEX(un));
20690 
20691         SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_task: exit\n");
20692 }
20693 
20694 
20695 /*
20696  *    Function: sd_send_scsi_INQUIRY
20697  *
20698  * Description: Issue the scsi INQUIRY command.
20699  *
20700  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
20701  *                      structure for this target.
20702  *              bufaddr
20703  *              buflen
20704  *              evpd
20705  *              page_code
20706  *              page_length
20707  *
20708  * Return Code: 0   - Success
20709  *              errno return code from sd_ssc_send()
20710  *
20711  *     Context: Can sleep. Does not return until command is completed.
20712  */
20713 
20714 static int
20715 sd_send_scsi_INQUIRY(sd_ssc_t *ssc, uchar_t *bufaddr, size_t buflen,
20716         uchar_t evpd, uchar_t page_code, size_t *residp)
20717 {
20718         union scsi_cdb          cdb;
20719         struct uscsi_cmd        ucmd_buf;
20720         int                     status;
20721         struct sd_lun           *un;
20722 
20723         ASSERT(ssc != NULL);
20724         un = ssc->ssc_un;
20725         ASSERT(un != NULL);
20726         ASSERT(!mutex_owned(SD_MUTEX(un)));
20727         ASSERT(bufaddr != NULL);
20728 
20729         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_INQUIRY: entry: un:0x%p\n", un);
20730 
20731         bzero(&cdb, sizeof (cdb));
20732         bzero(&ucmd_buf, sizeof (ucmd_buf));
20733         bzero(bufaddr, buflen);
20734 
20735         cdb.scc_cmd = SCMD_INQUIRY;
20736         cdb.cdb_opaque[1] = evpd;
20737         cdb.cdb_opaque[2] = page_code;
20738         FORMG0COUNT(&cdb, buflen);
20739 
20740         ucmd_buf.uscsi_cdb      = (char *)&cdb;
20741         ucmd_buf.uscsi_cdblen   = CDB_GROUP0;
20742         ucmd_buf.uscsi_bufaddr  = (caddr_t)bufaddr;
20743         ucmd_buf.uscsi_buflen   = buflen;
20744         ucmd_buf.uscsi_rqbuf    = NULL;
20745         ucmd_buf.uscsi_rqlen    = 0;
20746         ucmd_buf.uscsi_flags    = USCSI_READ | USCSI_SILENT;
20747         ucmd_buf.uscsi_timeout  = 200;  /* Excessive legacy value */
20748 
20749         status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
20750             UIO_SYSSPACE, SD_PATH_DIRECT);
20751 
20752         /*
20753          * Only handle status == 0, the upper-level caller
20754          * will put different assessment based on the context.
20755          */
20756         if (status == 0)
20757                 sd_ssc_assessment(ssc, SD_FMT_STANDARD);
20758 
20759         if ((status == 0) && (residp != NULL)) {
20760                 *residp = ucmd_buf.uscsi_resid;
20761         }
20762 
20763         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_INQUIRY: exit\n");
20764 
20765         return (status);
20766 }
20767 
20768 
20769 /*
20770  *    Function: sd_send_scsi_TEST_UNIT_READY
20771  *
20772  * Description: Issue the scsi TEST UNIT READY command.
20773  *              This routine can be told to set the flag USCSI_DIAGNOSE to
20774  *              prevent retrying failed commands. Use this when the intent
20775  *              is either to check for device readiness, to clear a Unit
20776  *              Attention, or to clear any outstanding sense data.
20777  *              However under specific conditions the expected behavior
20778  *              is for retries to bring a device ready, so use the flag
20779  *              with caution.
20780  *
20781  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
20782  *                      structure for this target.
20783  *              flag:   SD_CHECK_FOR_MEDIA: return ENXIO if no media present
20784  *                      SD_DONT_RETRY_TUR: include uscsi flag USCSI_DIAGNOSE.
20785  *                      0: dont check for media present, do retries on cmd.
20786  *
20787  * Return Code: 0   - Success
20788  *              EIO - IO error
20789  *              EACCES - Reservation conflict detected
20790  *              ENXIO  - Not Ready, medium not present
20791  *              errno return code from sd_ssc_send()
20792  *
20793  *     Context: Can sleep. Does not return until command is completed.
20794  */
20795 
20796 static int
20797 sd_send_scsi_TEST_UNIT_READY(sd_ssc_t *ssc, int flag)
20798 {
20799         struct  scsi_extended_sense     sense_buf;
20800         union scsi_cdb          cdb;
20801         struct uscsi_cmd        ucmd_buf;
20802         int                     status;
20803         struct sd_lun           *un;
20804 
20805         ASSERT(ssc != NULL);
20806         un = ssc->ssc_un;
20807         ASSERT(un != NULL);
20808         ASSERT(!mutex_owned(SD_MUTEX(un)));
20809 
20810         SD_TRACE(SD_LOG_IO, un,
20811             "sd_send_scsi_TEST_UNIT_READY: entry: un:0x%p\n", un);
20812 
20813         /*
20814          * Some Seagate elite1 TQ devices get hung with disconnect/reconnect
20815          * timeouts when they receive a TUR and the queue is not empty. Check
20816          * the configuration flag set during attach (indicating the drive has
20817          * this firmware bug) and un_ncmds_in_transport before issuing the
20818          * TUR. If there are
20819          * pending commands return success, this is a bit arbitrary but is ok
20820          * for non-removables (i.e. the eliteI disks) and non-clustering
20821          * configurations.
20822          */
20823         if (un->un_f_cfg_tur_check == TRUE) {
20824                 mutex_enter(SD_MUTEX(un));
20825                 if (un->un_ncmds_in_transport != 0) {
20826                         mutex_exit(SD_MUTEX(un));
20827                         return (0);
20828                 }
20829                 mutex_exit(SD_MUTEX(un));
20830         }
20831 
20832         bzero(&cdb, sizeof (cdb));
20833         bzero(&ucmd_buf, sizeof (ucmd_buf));
20834         bzero(&sense_buf, sizeof (struct scsi_extended_sense));
20835 
20836         cdb.scc_cmd = SCMD_TEST_UNIT_READY;
20837 
20838         ucmd_buf.uscsi_cdb      = (char *)&cdb;
20839         ucmd_buf.uscsi_cdblen   = CDB_GROUP0;
20840         ucmd_buf.uscsi_bufaddr  = NULL;
20841         ucmd_buf.uscsi_buflen   = 0;
20842         ucmd_buf.uscsi_rqbuf    = (caddr_t)&sense_buf;
20843         ucmd_buf.uscsi_rqlen    = sizeof (struct scsi_extended_sense);
20844         ucmd_buf.uscsi_flags    = USCSI_RQENABLE | USCSI_SILENT;
20845 
20846         /* Use flag USCSI_DIAGNOSE to prevent retries if it fails. */
20847         if ((flag & SD_DONT_RETRY_TUR) != 0) {
20848                 ucmd_buf.uscsi_flags |= USCSI_DIAGNOSE;
20849         }
20850         ucmd_buf.uscsi_timeout  = 60;
20851 
20852         status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
20853             UIO_SYSSPACE, ((flag & SD_BYPASS_PM) ? SD_PATH_DIRECT :
20854             SD_PATH_STANDARD));
20855 
20856         switch (status) {
20857         case 0:
20858                 sd_ssc_assessment(ssc, SD_FMT_STANDARD);
20859                 break;  /* Success! */
20860         case EIO:
20861                 switch (ucmd_buf.uscsi_status) {
20862                 case STATUS_RESERVATION_CONFLICT:
20863                         status = EACCES;
20864                         break;
20865                 case STATUS_CHECK:
20866                         if ((flag & SD_CHECK_FOR_MEDIA) == 0) {
20867                                 break;
20868                         }
20869                         if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
20870                             (scsi_sense_key((uint8_t *)&sense_buf) ==
20871                             KEY_NOT_READY) &&
20872                             (scsi_sense_asc((uint8_t *)&sense_buf) == 0x3A)) {
20873                                 status = ENXIO;
20874                         }
20875                         break;
20876                 default:
20877                         break;
20878                 }
20879                 break;
20880         default:
20881                 break;
20882         }
20883 
20884         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_TEST_UNIT_READY: exit\n");
20885 
20886         return (status);
20887 }
20888 
20889 /*
20890  *    Function: sd_send_scsi_PERSISTENT_RESERVE_IN
20891  *
20892  * Description: Issue the scsi PERSISTENT RESERVE IN command.
20893  *
20894  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
20895  *                      structure for this target.
20896  *
20897  * Return Code: 0   - Success
20898  *              EACCES
20899  *              ENOTSUP
20900  *              errno return code from sd_ssc_send()
20901  *
20902  *     Context: Can sleep. Does not return until command is completed.
20903  */
20904 
20905 static int
20906 sd_send_scsi_PERSISTENT_RESERVE_IN(sd_ssc_t *ssc, uchar_t  usr_cmd,
20907         uint16_t data_len, uchar_t *data_bufp)
20908 {
20909         struct scsi_extended_sense      sense_buf;
20910         union scsi_cdb          cdb;
20911         struct uscsi_cmd        ucmd_buf;
20912         int                     status;
20913         int                     no_caller_buf = FALSE;
20914         struct sd_lun           *un;
20915 
20916         ASSERT(ssc != NULL);
20917         un = ssc->ssc_un;
20918         ASSERT(un != NULL);
20919         ASSERT(!mutex_owned(SD_MUTEX(un)));
20920         ASSERT((usr_cmd == SD_READ_KEYS) || (usr_cmd == SD_READ_RESV));
20921 
20922         SD_TRACE(SD_LOG_IO, un,
20923             "sd_send_scsi_PERSISTENT_RESERVE_IN: entry: un:0x%p\n", un);
20924 
20925         bzero(&cdb, sizeof (cdb));
20926         bzero(&ucmd_buf, sizeof (ucmd_buf));
20927         bzero(&sense_buf, sizeof (struct scsi_extended_sense));
20928         if (data_bufp == NULL) {
20929                 /* Allocate a default buf if the caller did not give one */
20930                 ASSERT(data_len == 0);
20931                 data_len  = MHIOC_RESV_KEY_SIZE;
20932                 data_bufp = kmem_zalloc(MHIOC_RESV_KEY_SIZE, KM_SLEEP);
20933                 no_caller_buf = TRUE;
20934         }
20935 
20936         cdb.scc_cmd = SCMD_PERSISTENT_RESERVE_IN;
20937         cdb.cdb_opaque[1] = usr_cmd;
20938         FORMG1COUNT(&cdb, data_len);
20939 
20940         ucmd_buf.uscsi_cdb      = (char *)&cdb;
20941         ucmd_buf.uscsi_cdblen   = CDB_GROUP1;
20942         ucmd_buf.uscsi_bufaddr  = (caddr_t)data_bufp;
20943         ucmd_buf.uscsi_buflen   = data_len;
20944         ucmd_buf.uscsi_rqbuf    = (caddr_t)&sense_buf;
20945         ucmd_buf.uscsi_rqlen    = sizeof (struct scsi_extended_sense);
20946         ucmd_buf.uscsi_flags    = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT;
20947         ucmd_buf.uscsi_timeout  = 60;
20948 
20949         status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
20950             UIO_SYSSPACE, SD_PATH_STANDARD);
20951 
20952         switch (status) {
20953         case 0:
20954                 sd_ssc_assessment(ssc, SD_FMT_STANDARD);
20955 
20956                 break;  /* Success! */
20957         case EIO:
20958                 switch (ucmd_buf.uscsi_status) {
20959                 case STATUS_RESERVATION_CONFLICT:
20960                         status = EACCES;
20961                         break;
20962                 case STATUS_CHECK:
20963                         if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
20964                             (scsi_sense_key((uint8_t *)&sense_buf) ==
20965                             KEY_ILLEGAL_REQUEST)) {
20966                                 status = ENOTSUP;
20967                         }
20968                         break;
20969                 default:
20970                         break;
20971                 }
20972                 break;
20973         default:
20974                 break;
20975         }
20976 
20977         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_PERSISTENT_RESERVE_IN: exit\n");
20978 
20979         if (no_caller_buf == TRUE) {
20980                 kmem_free(data_bufp, data_len);
20981         }
20982 
20983         return (status);
20984 }
20985 
20986 
20987 /*
20988  *    Function: sd_send_scsi_PERSISTENT_RESERVE_OUT
20989  *
20990  * Description: This routine is the driver entry point for handling CD-ROM
20991  *              multi-host persistent reservation requests (MHIOCGRP_INKEYS,
20992  *              MHIOCGRP_INRESV) by sending the SCSI-3 PROUT commands to the
20993  *              device.
20994  *
20995  *   Arguments: ssc  -  ssc contains un - pointer to soft state struct
20996  *                      for the target.
20997  *              usr_cmd SCSI-3 reservation facility command (one of
20998  *                      SD_SCSI3_REGISTER, SD_SCSI3_RESERVE, SD_SCSI3_RELEASE,
20999  *                      SD_SCSI3_PREEMPTANDABORT, SD_SCSI3_CLEAR)
21000  *              usr_bufp - user provided pointer register, reserve descriptor or
21001  *                      preempt and abort structure (mhioc_register_t,
21002  *                      mhioc_resv_desc_t, mhioc_preemptandabort_t)
21003  *
21004  * Return Code: 0   - Success
21005  *              EACCES
21006  *              ENOTSUP
21007  *              errno return code from sd_ssc_send()
21008  *
21009  *     Context: Can sleep. Does not return until command is completed.
21010  */
21011 
21012 static int
21013 sd_send_scsi_PERSISTENT_RESERVE_OUT(sd_ssc_t *ssc, uchar_t usr_cmd,
21014         uchar_t *usr_bufp)
21015 {
21016         struct scsi_extended_sense      sense_buf;
21017         union scsi_cdb          cdb;
21018         struct uscsi_cmd        ucmd_buf;
21019         int                     status;
21020         uchar_t                 data_len = sizeof (sd_prout_t);
21021         sd_prout_t              *prp;
21022         struct sd_lun           *un;
21023 
21024         ASSERT(ssc != NULL);
21025         un = ssc->ssc_un;
21026         ASSERT(un != NULL);
21027         ASSERT(!mutex_owned(SD_MUTEX(un)));
21028         ASSERT(data_len == 24); /* required by scsi spec */
21029 
21030         SD_TRACE(SD_LOG_IO, un,
21031             "sd_send_scsi_PERSISTENT_RESERVE_OUT: entry: un:0x%p\n", un);
21032 
21033         if (usr_bufp == NULL) {
21034                 return (EINVAL);
21035         }
21036 
21037         bzero(&cdb, sizeof (cdb));
21038         bzero(&ucmd_buf, sizeof (ucmd_buf));
21039         bzero(&sense_buf, sizeof (struct scsi_extended_sense));
21040         prp = kmem_zalloc(data_len, KM_SLEEP);
21041 
21042         cdb.scc_cmd = SCMD_PERSISTENT_RESERVE_OUT;
21043         cdb.cdb_opaque[1] = usr_cmd;
21044         FORMG1COUNT(&cdb, data_len);
21045 
21046         ucmd_buf.uscsi_cdb      = (char *)&cdb;
21047         ucmd_buf.uscsi_cdblen   = CDB_GROUP1;
21048         ucmd_buf.uscsi_bufaddr  = (caddr_t)prp;
21049         ucmd_buf.uscsi_buflen   = data_len;
21050         ucmd_buf.uscsi_rqbuf    = (caddr_t)&sense_buf;
21051         ucmd_buf.uscsi_rqlen    = sizeof (struct scsi_extended_sense);
21052         ucmd_buf.uscsi_flags    = USCSI_RQENABLE | USCSI_WRITE | USCSI_SILENT;
21053         ucmd_buf.uscsi_timeout  = 60;
21054 
21055         switch (usr_cmd) {
21056         case SD_SCSI3_REGISTER: {
21057                 mhioc_register_t *ptr = (mhioc_register_t *)usr_bufp;
21058 
21059                 bcopy(ptr->oldkey.key, prp->res_key, MHIOC_RESV_KEY_SIZE);
21060                 bcopy(ptr->newkey.key, prp->service_key,
21061                     MHIOC_RESV_KEY_SIZE);
21062                 prp->aptpl = ptr->aptpl;
21063                 break;
21064         }
21065         case SD_SCSI3_CLEAR: {
21066                 mhioc_resv_desc_t *ptr = (mhioc_resv_desc_t *)usr_bufp;
21067 
21068                 bcopy(ptr->key.key, prp->res_key, MHIOC_RESV_KEY_SIZE);
21069                 break;
21070         }
21071         case SD_SCSI3_RESERVE:
21072         case SD_SCSI3_RELEASE: {
21073                 mhioc_resv_desc_t *ptr = (mhioc_resv_desc_t *)usr_bufp;
21074 
21075                 bcopy(ptr->key.key, prp->res_key, MHIOC_RESV_KEY_SIZE);
21076                 prp->scope_address = BE_32(ptr->scope_specific_addr);
21077                 cdb.cdb_opaque[2] = ptr->type;
21078                 break;
21079         }
21080         case SD_SCSI3_PREEMPTANDABORT: {
21081                 mhioc_preemptandabort_t *ptr =
21082                     (mhioc_preemptandabort_t *)usr_bufp;
21083 
21084                 bcopy(ptr->resvdesc.key.key, prp->res_key, MHIOC_RESV_KEY_SIZE);
21085                 bcopy(ptr->victim_key.key, prp->service_key,
21086                     MHIOC_RESV_KEY_SIZE);
21087                 prp->scope_address = BE_32(ptr->resvdesc.scope_specific_addr);
21088                 cdb.cdb_opaque[2] = ptr->resvdesc.type;
21089                 ucmd_buf.uscsi_flags |= USCSI_HEAD;
21090                 break;
21091         }
21092         case SD_SCSI3_REGISTERANDIGNOREKEY:
21093         {
21094                 mhioc_registerandignorekey_t *ptr;
21095                 ptr = (mhioc_registerandignorekey_t *)usr_bufp;
21096                 bcopy(ptr->newkey.key,
21097                     prp->service_key, MHIOC_RESV_KEY_SIZE);
21098                 prp->aptpl = ptr->aptpl;
21099                 break;
21100         }
21101         default:
21102                 ASSERT(FALSE);
21103                 break;
21104         }
21105 
21106         status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
21107             UIO_SYSSPACE, SD_PATH_STANDARD);
21108 
21109         switch (status) {
21110         case 0:
21111                 sd_ssc_assessment(ssc, SD_FMT_STANDARD);
21112                 break;  /* Success! */
21113         case EIO:
21114                 switch (ucmd_buf.uscsi_status) {
21115                 case STATUS_RESERVATION_CONFLICT:
21116                         status = EACCES;
21117                         break;
21118                 case STATUS_CHECK:
21119                         if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
21120                             (scsi_sense_key((uint8_t *)&sense_buf) ==
21121                             KEY_ILLEGAL_REQUEST)) {
21122                                 status = ENOTSUP;
21123                         }
21124                         break;
21125                 default:
21126                         break;
21127                 }
21128                 break;
21129         default:
21130                 break;
21131         }
21132 
21133         kmem_free(prp, data_len);
21134         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_PERSISTENT_RESERVE_OUT: exit\n");
21135         return (status);
21136 }
21137 
21138 
21139 /*
21140  *    Function: sd_send_scsi_SYNCHRONIZE_CACHE
21141  *
21142  * Description: Issues a scsi SYNCHRONIZE CACHE command to the target
21143  *
21144  *   Arguments: un - pointer to the target's soft state struct
21145  *              dkc - pointer to the callback structure
21146  *
21147  * Return Code: 0 - success
21148  *              errno-type error code
21149  *
21150  *     Context: kernel thread context only.
21151  *
21152  *  _______________________________________________________________
21153  * | dkc_flag &   | dkc_callback | DKIOCFLUSHWRITECACHE            |
21154  * |FLUSH_VOLATILE|              | operation                       |
21155  * |______________|______________|_________________________________|
21156  * | 0            | NULL         | Synchronous flush on both       |
21157  * |              |              | volatile and non-volatile cache |
21158  * |______________|______________|_________________________________|
21159  * | 1            | NULL         | Synchronous flush on volatile   |
21160  * |              |              | cache; disk drivers may suppress|
21161  * |              |              | flush if disk table indicates   |
21162  * |              |              | non-volatile cache              |
21163  * |______________|______________|_________________________________|
21164  * | 0            | !NULL        | Asynchronous flush on both      |
21165  * |              |              | volatile and non-volatile cache;|
21166  * |______________|______________|_________________________________|
21167  * | 1            | !NULL        | Asynchronous flush on volatile  |
21168  * |              |              | cache; disk drivers may suppress|
21169  * |              |              | flush if disk table indicates   |
21170  * |              |              | non-volatile cache              |
21171  * |______________|______________|_________________________________|
21172  *
21173  */
21174 
21175 static int
21176 sd_send_scsi_SYNCHRONIZE_CACHE(struct sd_lun *un, struct dk_callback *dkc)
21177 {
21178         struct sd_uscsi_info    *uip;
21179         struct uscsi_cmd        *uscmd;
21180         union scsi_cdb          *cdb;
21181         struct buf              *bp;
21182         int                     rval = 0;
21183         int                     is_async;
21184 
21185         SD_TRACE(SD_LOG_IO, un,
21186             "sd_send_scsi_SYNCHRONIZE_CACHE: entry: un:0x%p\n", un);
21187 
21188         ASSERT(un != NULL);
21189         ASSERT(!mutex_owned(SD_MUTEX(un)));
21190 
21191         if (dkc == NULL || dkc->dkc_callback == NULL) {
21192                 is_async = FALSE;
21193         } else {
21194                 is_async = TRUE;
21195         }
21196 
21197         mutex_enter(SD_MUTEX(un));
21198         /* check whether cache flush should be suppressed */
21199         if (un->un_f_suppress_cache_flush == TRUE) {
21200                 mutex_exit(SD_MUTEX(un));
21201                 /*
21202                  * suppress the cache flush if the device is told to do
21203                  * so by sd.conf or disk table
21204                  */
21205                 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_SYNCHRONIZE_CACHE: \
21206                     skip the cache flush since suppress_cache_flush is %d!\n",
21207                     un->un_f_suppress_cache_flush);
21208 
21209                 if (is_async == TRUE) {
21210                         /* invoke callback for asynchronous flush */
21211                         (*dkc->dkc_callback)(dkc->dkc_cookie, 0);
21212                 }
21213                 return (rval);
21214         }
21215         mutex_exit(SD_MUTEX(un));
21216 
21217         /*
21218          * check dkc_flag & FLUSH_VOLATILE so SYNC_NV bit can be
21219          * set properly
21220          */
21221         cdb = kmem_zalloc(CDB_GROUP1, KM_SLEEP);
21222         cdb->scc_cmd = SCMD_SYNCHRONIZE_CACHE;
21223 
21224         mutex_enter(SD_MUTEX(un));
21225         if (dkc != NULL && un->un_f_sync_nv_supported &&
21226             (dkc->dkc_flag & FLUSH_VOLATILE)) {
21227                 /*
21228                  * if the device supports SYNC_NV bit, turn on
21229                  * the SYNC_NV bit to only flush volatile cache
21230                  */
21231                 cdb->cdb_un.tag |= SD_SYNC_NV_BIT;
21232         }
21233         mutex_exit(SD_MUTEX(un));
21234 
21235         /*
21236          * First get some memory for the uscsi_cmd struct and cdb
21237          * and initialize for SYNCHRONIZE_CACHE cmd.
21238          */
21239         uscmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
21240         uscmd->uscsi_cdblen = CDB_GROUP1;
21241         uscmd->uscsi_cdb = (caddr_t)cdb;
21242         uscmd->uscsi_bufaddr = NULL;
21243         uscmd->uscsi_buflen = 0;
21244         uscmd->uscsi_rqbuf = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
21245         uscmd->uscsi_rqlen = SENSE_LENGTH;
21246         uscmd->uscsi_rqresid = SENSE_LENGTH;
21247         uscmd->uscsi_flags = USCSI_RQENABLE | USCSI_SILENT;
21248         uscmd->uscsi_timeout = sd_io_time;
21249 
21250         /*
21251          * Allocate an sd_uscsi_info struct and fill it with the info
21252          * needed by sd_initpkt_for_uscsi().  Then put the pointer into
21253          * b_private in the buf for sd_initpkt_for_uscsi().  Note that
21254          * since we allocate the buf here in this function, we do not
21255          * need to preserve the prior contents of b_private.
21256          * The sd_uscsi_info struct is also used by sd_uscsi_strategy()
21257          */
21258         uip = kmem_zalloc(sizeof (struct sd_uscsi_info), KM_SLEEP);
21259         uip->ui_flags = SD_PATH_DIRECT;
21260         uip->ui_cmdp  = uscmd;
21261 
21262         bp = getrbuf(KM_SLEEP);
21263         bp->b_private = uip;
21264 
21265         /*
21266          * Setup buffer to carry uscsi request.
21267          */
21268         bp->b_flags  = B_BUSY;
21269         bp->b_bcount = 0;
21270         bp->b_blkno  = 0;
21271 
21272         if (is_async == TRUE) {
21273                 bp->b_iodone = sd_send_scsi_SYNCHRONIZE_CACHE_biodone;
21274                 uip->ui_dkc = *dkc;
21275         }
21276 
21277         bp->b_edev = SD_GET_DEV(un);
21278         bp->b_dev = cmpdev(bp->b_edev);   /* maybe unnecessary? */
21279 
21280         /*
21281          * Unset un_f_sync_cache_required flag
21282          */
21283         mutex_enter(SD_MUTEX(un));
21284         un->un_f_sync_cache_required = FALSE;
21285         mutex_exit(SD_MUTEX(un));
21286 
21287         (void) sd_uscsi_strategy(bp);
21288 
21289         /*
21290          * If synchronous request, wait for completion
21291          * If async just return and let b_iodone callback
21292          * cleanup.
21293          * NOTE: On return, u_ncmds_in_driver will be decremented,
21294          * but it was also incremented in sd_uscsi_strategy(), so
21295          * we should be ok.
21296          */
21297         if (is_async == FALSE) {
21298                 (void) biowait(bp);
21299                 rval = sd_send_scsi_SYNCHRONIZE_CACHE_biodone(bp);
21300         }
21301 
21302         return (rval);
21303 }
21304 
21305 
21306 static int
21307 sd_send_scsi_SYNCHRONIZE_CACHE_biodone(struct buf *bp)
21308 {
21309         struct sd_uscsi_info *uip;
21310         struct uscsi_cmd *uscmd;
21311         uint8_t *sense_buf;
21312         struct sd_lun *un;
21313         int status;
21314         union scsi_cdb *cdb;
21315 
21316         uip = (struct sd_uscsi_info *)(bp->b_private);
21317         ASSERT(uip != NULL);
21318 
21319         uscmd = uip->ui_cmdp;
21320         ASSERT(uscmd != NULL);
21321 
21322         sense_buf = (uint8_t *)uscmd->uscsi_rqbuf;
21323         ASSERT(sense_buf != NULL);
21324 
21325         un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp));
21326         ASSERT(un != NULL);
21327 
21328         cdb = (union scsi_cdb *)uscmd->uscsi_cdb;
21329 
21330         status = geterror(bp);
21331         switch (status) {
21332         case 0:
21333                 break;  /* Success! */
21334         case EIO:
21335                 switch (uscmd->uscsi_status) {
21336                 case STATUS_RESERVATION_CONFLICT:
21337                         /* Ignore reservation conflict */
21338                         status = 0;
21339                         goto done;
21340 
21341                 case STATUS_CHECK:
21342                         if ((uscmd->uscsi_rqstatus == STATUS_GOOD) &&
21343                             (scsi_sense_key(sense_buf) ==
21344                             KEY_ILLEGAL_REQUEST)) {
21345                                 /* Ignore Illegal Request error */
21346                                 if (cdb->cdb_un.tag&SD_SYNC_NV_BIT) {
21347                                         mutex_enter(SD_MUTEX(un));
21348                                         un->un_f_sync_nv_supported = FALSE;
21349                                         mutex_exit(SD_MUTEX(un));
21350                                         status = 0;
21351                                         SD_TRACE(SD_LOG_IO, un,
21352                                             "un_f_sync_nv_supported \
21353                                             is set to false.\n");
21354                                         goto done;
21355                                 }
21356 
21357                                 mutex_enter(SD_MUTEX(un));
21358                                 un->un_f_sync_cache_supported = FALSE;
21359                                 mutex_exit(SD_MUTEX(un));
21360                                 SD_TRACE(SD_LOG_IO, un,
21361                                     "sd_send_scsi_SYNCHRONIZE_CACHE_biodone: \
21362                                     un_f_sync_cache_supported set to false \
21363                                     with asc = %x, ascq = %x\n",
21364                                     scsi_sense_asc(sense_buf),
21365                                     scsi_sense_ascq(sense_buf));
21366                                 status = ENOTSUP;
21367                                 goto done;
21368                         }
21369                         break;
21370                 default:
21371                         break;
21372                 }
21373                 /* FALLTHRU */
21374         default:
21375                 /*
21376                  * Turn on the un_f_sync_cache_required flag
21377                  * since the SYNC CACHE command failed
21378                  */
21379                 mutex_enter(SD_MUTEX(un));
21380                 un->un_f_sync_cache_required = TRUE;
21381                 mutex_exit(SD_MUTEX(un));
21382 
21383                 /*
21384                  * Don't log an error message if this device
21385                  * has removable media.
21386                  */
21387                 if (!un->un_f_has_removable_media) {
21388                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
21389                             "SYNCHRONIZE CACHE command failed (%d)\n", status);
21390                 }
21391                 break;
21392         }
21393 
21394 done:
21395         if (uip->ui_dkc.dkc_callback != NULL) {
21396                 (*uip->ui_dkc.dkc_callback)(uip->ui_dkc.dkc_cookie, status);
21397         }
21398 
21399         ASSERT((bp->b_flags & B_REMAPPED) == 0);
21400         freerbuf(bp);
21401         kmem_free(uip, sizeof (struct sd_uscsi_info));
21402         kmem_free(uscmd->uscsi_rqbuf, SENSE_LENGTH);
21403         kmem_free(uscmd->uscsi_cdb, (size_t)uscmd->uscsi_cdblen);
21404         kmem_free(uscmd, sizeof (struct uscsi_cmd));
21405 
21406         return (status);
21407 }
21408 
21409 
21410 /*
21411  *    Function: sd_send_scsi_GET_CONFIGURATION
21412  *
21413  * Description: Issues the get configuration command to the device.
21414  *              Called from sd_check_for_writable_cd & sd_get_media_info
21415  *              caller needs to ensure that buflen = SD_PROFILE_HEADER_LEN
21416  *   Arguments: ssc
21417  *              ucmdbuf
21418  *              rqbuf
21419  *              rqbuflen
21420  *              bufaddr
21421  *              buflen
21422  *              path_flag
21423  *
21424  * Return Code: 0   - Success
21425  *              errno return code from sd_ssc_send()
21426  *
21427  *     Context: Can sleep. Does not return until command is completed.
21428  *
21429  */
21430 
21431 static int
21432 sd_send_scsi_GET_CONFIGURATION(sd_ssc_t *ssc, struct uscsi_cmd *ucmdbuf,
21433         uchar_t *rqbuf, uint_t rqbuflen, uchar_t *bufaddr, uint_t buflen,
21434         int path_flag)
21435 {
21436         char    cdb[CDB_GROUP1];
21437         int     status;
21438         struct sd_lun   *un;
21439 
21440         ASSERT(ssc != NULL);
21441         un = ssc->ssc_un;
21442         ASSERT(un != NULL);
21443         ASSERT(!mutex_owned(SD_MUTEX(un)));
21444         ASSERT(bufaddr != NULL);
21445         ASSERT(ucmdbuf != NULL);
21446         ASSERT(rqbuf != NULL);
21447 
21448         SD_TRACE(SD_LOG_IO, un,
21449             "sd_send_scsi_GET_CONFIGURATION: entry: un:0x%p\n", un);
21450 
21451         bzero(cdb, sizeof (cdb));
21452         bzero(ucmdbuf, sizeof (struct uscsi_cmd));
21453         bzero(rqbuf, rqbuflen);
21454         bzero(bufaddr, buflen);
21455 
21456         /*
21457          * Set up cdb field for the get configuration command.
21458          */
21459         cdb[0] = SCMD_GET_CONFIGURATION;
21460         cdb[1] = 0x02;  /* Requested Type */
21461         cdb[8] = SD_PROFILE_HEADER_LEN;
21462         ucmdbuf->uscsi_cdb = cdb;
21463         ucmdbuf->uscsi_cdblen = CDB_GROUP1;
21464         ucmdbuf->uscsi_bufaddr = (caddr_t)bufaddr;
21465         ucmdbuf->uscsi_buflen = buflen;
21466         ucmdbuf->uscsi_timeout = sd_io_time;
21467         ucmdbuf->uscsi_rqbuf = (caddr_t)rqbuf;
21468         ucmdbuf->uscsi_rqlen = rqbuflen;
21469         ucmdbuf->uscsi_flags = USCSI_RQENABLE|USCSI_SILENT|USCSI_READ;
21470 
21471         status = sd_ssc_send(ssc, ucmdbuf, FKIOCTL,
21472             UIO_SYSSPACE, path_flag);
21473 
21474         switch (status) {
21475         case 0:
21476                 sd_ssc_assessment(ssc, SD_FMT_STANDARD);
21477                 break;  /* Success! */
21478         case EIO:
21479                 switch (ucmdbuf->uscsi_status) {
21480                 case STATUS_RESERVATION_CONFLICT:
21481                         status = EACCES;
21482                         break;
21483                 default:
21484                         break;
21485                 }
21486                 break;
21487         default:
21488                 break;
21489         }
21490 
21491         if (status == 0) {
21492                 SD_DUMP_MEMORY(un, SD_LOG_IO,
21493                     "sd_send_scsi_GET_CONFIGURATION: data",
21494                     (uchar_t *)bufaddr, SD_PROFILE_HEADER_LEN, SD_LOG_HEX);
21495         }
21496 
21497         SD_TRACE(SD_LOG_IO, un,
21498             "sd_send_scsi_GET_CONFIGURATION: exit\n");
21499 
21500         return (status);
21501 }
21502 
21503 /*
21504  *    Function: sd_send_scsi_feature_GET_CONFIGURATION
21505  *
21506  * Description: Issues the get configuration command to the device to
21507  *              retrieve a specific feature. Called from
21508  *              sd_check_for_writable_cd & sd_set_mmc_caps.
21509  *   Arguments: ssc
21510  *              ucmdbuf
21511  *              rqbuf
21512  *              rqbuflen
21513  *              bufaddr
21514  *              buflen
21515  *              feature
21516  *
21517  * Return Code: 0   - Success
21518  *              errno return code from sd_ssc_send()
21519  *
21520  *     Context: Can sleep. Does not return until command is completed.
21521  *
21522  */
21523 static int
21524 sd_send_scsi_feature_GET_CONFIGURATION(sd_ssc_t *ssc,
21525         struct uscsi_cmd *ucmdbuf, uchar_t *rqbuf, uint_t rqbuflen,
21526         uchar_t *bufaddr, uint_t buflen, char feature, int path_flag)
21527 {
21528         char    cdb[CDB_GROUP1];
21529         int     status;
21530         struct sd_lun   *un;
21531 
21532         ASSERT(ssc != NULL);
21533         un = ssc->ssc_un;
21534         ASSERT(un != NULL);
21535         ASSERT(!mutex_owned(SD_MUTEX(un)));
21536         ASSERT(bufaddr != NULL);
21537         ASSERT(ucmdbuf != NULL);
21538         ASSERT(rqbuf != NULL);
21539 
21540         SD_TRACE(SD_LOG_IO, un,
21541             "sd_send_scsi_feature_GET_CONFIGURATION: entry: un:0x%p\n", un);
21542 
21543         bzero(cdb, sizeof (cdb));
21544         bzero(ucmdbuf, sizeof (struct uscsi_cmd));
21545         bzero(rqbuf, rqbuflen);
21546         bzero(bufaddr, buflen);
21547 
21548         /*
21549          * Set up cdb field for the get configuration command.
21550          */
21551         cdb[0] = SCMD_GET_CONFIGURATION;
21552         cdb[1] = 0x02;  /* Requested Type */
21553         cdb[3] = feature;
21554         cdb[8] = buflen;
21555         ucmdbuf->uscsi_cdb = cdb;
21556         ucmdbuf->uscsi_cdblen = CDB_GROUP1;
21557         ucmdbuf->uscsi_bufaddr = (caddr_t)bufaddr;
21558         ucmdbuf->uscsi_buflen = buflen;
21559         ucmdbuf->uscsi_timeout = sd_io_time;
21560         ucmdbuf->uscsi_rqbuf = (caddr_t)rqbuf;
21561         ucmdbuf->uscsi_rqlen = rqbuflen;
21562         ucmdbuf->uscsi_flags = USCSI_RQENABLE|USCSI_SILENT|USCSI_READ;
21563 
21564         status = sd_ssc_send(ssc, ucmdbuf, FKIOCTL,
21565             UIO_SYSSPACE, path_flag);
21566 
21567         switch (status) {
21568         case 0:
21569 
21570                 break;  /* Success! */
21571         case EIO:
21572                 switch (ucmdbuf->uscsi_status) {
21573                 case STATUS_RESERVATION_CONFLICT:
21574                         status = EACCES;
21575                         break;
21576                 default:
21577                         break;
21578                 }
21579                 break;
21580         default:
21581                 break;
21582         }
21583 
21584         if (status == 0) {
21585                 SD_DUMP_MEMORY(un, SD_LOG_IO,
21586                     "sd_send_scsi_feature_GET_CONFIGURATION: data",
21587                     (uchar_t *)bufaddr, SD_PROFILE_HEADER_LEN, SD_LOG_HEX);
21588         }
21589 
21590         SD_TRACE(SD_LOG_IO, un,
21591             "sd_send_scsi_feature_GET_CONFIGURATION: exit\n");
21592 
21593         return (status);
21594 }
21595 
21596 
21597 /*
21598  *    Function: sd_send_scsi_MODE_SENSE
21599  *
21600  * Description: Utility function for issuing a scsi MODE SENSE command.
21601  *              Note: This routine uses a consistent implementation for Group0,
21602  *              Group1, and Group2 commands across all platforms. ATAPI devices
21603  *              use Group 1 Read/Write commands and Group 2 Mode Sense/Select
21604  *
21605  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
21606  *                      structure for this target.
21607  *              cdbsize - size CDB to be used (CDB_GROUP0 (6 byte), or
21608  *                        CDB_GROUP[1|2] (10 byte).
21609  *              bufaddr - buffer for page data retrieved from the target.
21610  *              buflen - size of page to be retrieved.
21611  *              page_code - page code of data to be retrieved from the target.
21612  *              path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
21613  *                      the normal command waitq, or SD_PATH_DIRECT_PRIORITY
21614  *                      to use the USCSI "direct" chain and bypass the normal
21615  *                      command waitq.
21616  *
21617  * Return Code: 0   - Success
21618  *              errno return code from sd_ssc_send()
21619  *
21620  *     Context: Can sleep. Does not return until command is completed.
21621  */
21622 
21623 static int
21624 sd_send_scsi_MODE_SENSE(sd_ssc_t *ssc, int cdbsize, uchar_t *bufaddr,
21625         size_t buflen,  uchar_t page_code, int path_flag)
21626 {
21627         struct  scsi_extended_sense     sense_buf;
21628         union scsi_cdb          cdb;
21629         struct uscsi_cmd        ucmd_buf;
21630         int                     status;
21631         int                     headlen;
21632         struct sd_lun           *un;
21633 
21634         ASSERT(ssc != NULL);
21635         un = ssc->ssc_un;
21636         ASSERT(un != NULL);
21637         ASSERT(!mutex_owned(SD_MUTEX(un)));
21638         ASSERT(bufaddr != NULL);
21639         ASSERT((cdbsize == CDB_GROUP0) || (cdbsize == CDB_GROUP1) ||
21640             (cdbsize == CDB_GROUP2));
21641 
21642         SD_TRACE(SD_LOG_IO, un,
21643             "sd_send_scsi_MODE_SENSE: entry: un:0x%p\n", un);
21644 
21645         bzero(&cdb, sizeof (cdb));
21646         bzero(&ucmd_buf, sizeof (ucmd_buf));
21647         bzero(&sense_buf, sizeof (struct scsi_extended_sense));
21648         bzero(bufaddr, buflen);
21649 
21650         if (cdbsize == CDB_GROUP0) {
21651                 cdb.scc_cmd = SCMD_MODE_SENSE;
21652                 cdb.cdb_opaque[2] = page_code;
21653                 FORMG0COUNT(&cdb, buflen);
21654                 headlen = MODE_HEADER_LENGTH;
21655         } else {
21656                 cdb.scc_cmd = SCMD_MODE_SENSE_G1;
21657                 cdb.cdb_opaque[2] = page_code;
21658                 FORMG1COUNT(&cdb, buflen);
21659                 headlen = MODE_HEADER_LENGTH_GRP2;
21660         }
21661 
21662         ASSERT(headlen <= buflen);
21663         SD_FILL_SCSI1_LUN_CDB(un, &cdb);
21664 
21665         ucmd_buf.uscsi_cdb      = (char *)&cdb;
21666         ucmd_buf.uscsi_cdblen   = (uchar_t)cdbsize;
21667         ucmd_buf.uscsi_bufaddr  = (caddr_t)bufaddr;
21668         ucmd_buf.uscsi_buflen   = buflen;
21669         ucmd_buf.uscsi_rqbuf    = (caddr_t)&sense_buf;
21670         ucmd_buf.uscsi_rqlen    = sizeof (struct scsi_extended_sense);
21671         ucmd_buf.uscsi_flags    = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT;
21672         ucmd_buf.uscsi_timeout  = 60;
21673 
21674         status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
21675             UIO_SYSSPACE, path_flag);
21676 
21677         switch (status) {
21678         case 0:
21679                 /*
21680                  * sr_check_wp() uses 0x3f page code and check the header of
21681                  * mode page to determine if target device is write-protected.
21682                  * But some USB devices return 0 bytes for 0x3f page code. For
21683                  * this case, make sure that mode page header is returned at
21684                  * least.
21685                  */
21686                 if (buflen - ucmd_buf.uscsi_resid <  headlen) {
21687                         status = EIO;
21688                         sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1,
21689                             "mode page header is not returned");
21690                 }
21691                 break;  /* Success! */
21692         case EIO:
21693                 switch (ucmd_buf.uscsi_status) {
21694                 case STATUS_RESERVATION_CONFLICT:
21695                         status = EACCES;
21696                         break;
21697                 default:
21698                         break;
21699                 }
21700                 break;
21701         default:
21702                 break;
21703         }
21704 
21705         if (status == 0) {
21706                 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_MODE_SENSE: data",
21707                     (uchar_t *)bufaddr, buflen, SD_LOG_HEX);
21708         }
21709         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_MODE_SENSE: exit\n");
21710 
21711         return (status);
21712 }
21713 
21714 
21715 /*
21716  *    Function: sd_send_scsi_MODE_SELECT
21717  *
21718  * Description: Utility function for issuing a scsi MODE SELECT command.
21719  *              Note: This routine uses a consistent implementation for Group0,
21720  *              Group1, and Group2 commands across all platforms. ATAPI devices
21721  *              use Group 1 Read/Write commands and Group 2 Mode Sense/Select
21722  *
21723  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
21724  *                      structure for this target.
21725  *              cdbsize - size CDB to be used (CDB_GROUP0 (6 byte), or
21726  *                        CDB_GROUP[1|2] (10 byte).
21727  *              bufaddr - buffer for page data retrieved from the target.
21728  *              buflen - size of page to be retrieved.
21729  *              save_page - boolean to determin if SP bit should be set.
21730  *              path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
21731  *                      the normal command waitq, or SD_PATH_DIRECT_PRIORITY
21732  *                      to use the USCSI "direct" chain and bypass the normal
21733  *                      command waitq.
21734  *
21735  * Return Code: 0   - Success
21736  *              errno return code from sd_ssc_send()
21737  *
21738  *     Context: Can sleep. Does not return until command is completed.
21739  */
21740 
21741 static int
21742 sd_send_scsi_MODE_SELECT(sd_ssc_t *ssc, int cdbsize, uchar_t *bufaddr,
21743         size_t buflen,  uchar_t save_page, int path_flag)
21744 {
21745         struct  scsi_extended_sense     sense_buf;
21746         union scsi_cdb          cdb;
21747         struct uscsi_cmd        ucmd_buf;
21748         int                     status;
21749         struct sd_lun           *un;
21750 
21751         ASSERT(ssc != NULL);
21752         un = ssc->ssc_un;
21753         ASSERT(un != NULL);
21754         ASSERT(!mutex_owned(SD_MUTEX(un)));
21755         ASSERT(bufaddr != NULL);
21756         ASSERT((cdbsize == CDB_GROUP0) || (cdbsize == CDB_GROUP1) ||
21757             (cdbsize == CDB_GROUP2));
21758 
21759         SD_TRACE(SD_LOG_IO, un,
21760             "sd_send_scsi_MODE_SELECT: entry: un:0x%p\n", un);
21761 
21762         bzero(&cdb, sizeof (cdb));
21763         bzero(&ucmd_buf, sizeof (ucmd_buf));
21764         bzero(&sense_buf, sizeof (struct scsi_extended_sense));
21765 
21766         /* Set the PF bit for many third party drives */
21767         cdb.cdb_opaque[1] = 0x10;
21768 
21769         /* Set the savepage(SP) bit if given */
21770         if (save_page == SD_SAVE_PAGE) {
21771                 cdb.cdb_opaque[1] |= 0x01;
21772         }
21773 
21774         if (cdbsize == CDB_GROUP0) {
21775                 cdb.scc_cmd = SCMD_MODE_SELECT;
21776                 FORMG0COUNT(&cdb, buflen);
21777         } else {
21778                 cdb.scc_cmd = SCMD_MODE_SELECT_G1;
21779                 FORMG1COUNT(&cdb, buflen);
21780         }
21781 
21782         SD_FILL_SCSI1_LUN_CDB(un, &cdb);
21783 
21784         ucmd_buf.uscsi_cdb      = (char *)&cdb;
21785         ucmd_buf.uscsi_cdblen   = (uchar_t)cdbsize;
21786         ucmd_buf.uscsi_bufaddr  = (caddr_t)bufaddr;
21787         ucmd_buf.uscsi_buflen   = buflen;
21788         ucmd_buf.uscsi_rqbuf    = (caddr_t)&sense_buf;
21789         ucmd_buf.uscsi_rqlen    = sizeof (struct scsi_extended_sense);
21790         ucmd_buf.uscsi_flags    = USCSI_RQENABLE | USCSI_WRITE | USCSI_SILENT;
21791         ucmd_buf.uscsi_timeout  = 60;
21792 
21793         status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
21794             UIO_SYSSPACE, path_flag);
21795 
21796         switch (status) {
21797         case 0:
21798                 sd_ssc_assessment(ssc, SD_FMT_STANDARD);
21799                 break;  /* Success! */
21800         case EIO:
21801                 switch (ucmd_buf.uscsi_status) {
21802                 case STATUS_RESERVATION_CONFLICT:
21803                         status = EACCES;
21804                         break;
21805                 default:
21806                         break;
21807                 }
21808                 break;
21809         default:
21810                 break;
21811         }
21812 
21813         if (status == 0) {
21814                 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_MODE_SELECT: data",
21815                     (uchar_t *)bufaddr, buflen, SD_LOG_HEX);
21816         }
21817         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_MODE_SELECT: exit\n");
21818 
21819         return (status);
21820 }
21821 
21822 
21823 /*
21824  *    Function: sd_send_scsi_RDWR
21825  *
21826  * Description: Issue a scsi READ or WRITE command with the given parameters.
21827  *
21828  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
21829  *                      structure for this target.
21830  *              cmd:     SCMD_READ or SCMD_WRITE
21831  *              bufaddr: Address of caller's buffer to receive the RDWR data
21832  *              buflen:  Length of caller's buffer receive the RDWR data.
21833  *              start_block: Block number for the start of the RDWR operation.
21834  *                       (Assumes target-native block size.)
21835  *              residp:  Pointer to variable to receive the redisual of the
21836  *                       RDWR operation (may be NULL of no residual requested).
21837  *              path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
21838  *                      the normal command waitq, or SD_PATH_DIRECT_PRIORITY
21839  *                      to use the USCSI "direct" chain and bypass the normal
21840  *                      command waitq.
21841  *
21842  * Return Code: 0   - Success
21843  *              errno return code from sd_ssc_send()
21844  *
21845  *     Context: Can sleep. Does not return until command is completed.
21846  */
21847 
21848 static int
21849 sd_send_scsi_RDWR(sd_ssc_t *ssc, uchar_t cmd, void *bufaddr,
21850         size_t buflen, daddr_t start_block, int path_flag)
21851 {
21852         struct  scsi_extended_sense     sense_buf;
21853         union scsi_cdb          cdb;
21854         struct uscsi_cmd        ucmd_buf;
21855         uint32_t                block_count;
21856         int                     status;
21857         int                     cdbsize;
21858         uchar_t                 flag;
21859         struct sd_lun           *un;
21860 
21861         ASSERT(ssc != NULL);
21862         un = ssc->ssc_un;
21863         ASSERT(un != NULL);
21864         ASSERT(!mutex_owned(SD_MUTEX(un)));
21865         ASSERT(bufaddr != NULL);
21866         ASSERT((cmd == SCMD_READ) || (cmd == SCMD_WRITE));
21867 
21868         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_RDWR: entry: un:0x%p\n", un);
21869 
21870         if (un->un_f_tgt_blocksize_is_valid != TRUE) {
21871                 return (EINVAL);
21872         }
21873 
21874         mutex_enter(SD_MUTEX(un));
21875         block_count = SD_BYTES2TGTBLOCKS(un, buflen);
21876         mutex_exit(SD_MUTEX(un));
21877 
21878         flag = (cmd == SCMD_READ) ? USCSI_READ : USCSI_WRITE;
21879 
21880         SD_INFO(SD_LOG_IO, un, "sd_send_scsi_RDWR: "
21881             "bufaddr:0x%p buflen:0x%x start_block:0x%p block_count:0x%x\n",
21882             bufaddr, buflen, start_block, block_count);
21883 
21884         bzero(&cdb, sizeof (cdb));
21885         bzero(&ucmd_buf, sizeof (ucmd_buf));
21886         bzero(&sense_buf, sizeof (struct scsi_extended_sense));
21887 
21888         /* Compute CDB size to use */
21889         if (start_block > 0xffffffff)
21890                 cdbsize = CDB_GROUP4;
21891         else if ((start_block & 0xFFE00000) ||
21892             (un->un_f_cfg_is_atapi == TRUE))
21893                 cdbsize = CDB_GROUP1;
21894         else
21895                 cdbsize = CDB_GROUP0;
21896 
21897         switch (cdbsize) {
21898         case CDB_GROUP0:        /* 6-byte CDBs */
21899                 cdb.scc_cmd = cmd;
21900                 FORMG0ADDR(&cdb, start_block);
21901                 FORMG0COUNT(&cdb, block_count);
21902                 break;
21903         case CDB_GROUP1:        /* 10-byte CDBs */
21904                 cdb.scc_cmd = cmd | SCMD_GROUP1;
21905                 FORMG1ADDR(&cdb, start_block);
21906                 FORMG1COUNT(&cdb, block_count);
21907                 break;
21908         case CDB_GROUP4:        /* 16-byte CDBs */
21909                 cdb.scc_cmd = cmd | SCMD_GROUP4;
21910                 FORMG4LONGADDR(&cdb, (uint64_t)start_block);
21911                 FORMG4COUNT(&cdb, block_count);
21912                 break;
21913         case CDB_GROUP5:        /* 12-byte CDBs (currently unsupported) */
21914         default:
21915                 /* All others reserved */
21916                 return (EINVAL);
21917         }
21918 
21919         /* Set LUN bit(s) in CDB if this is a SCSI-1 device */
21920         SD_FILL_SCSI1_LUN_CDB(un, &cdb);
21921 
21922         ucmd_buf.uscsi_cdb      = (char *)&cdb;
21923         ucmd_buf.uscsi_cdblen   = (uchar_t)cdbsize;
21924         ucmd_buf.uscsi_bufaddr  = bufaddr;
21925         ucmd_buf.uscsi_buflen   = buflen;
21926         ucmd_buf.uscsi_rqbuf    = (caddr_t)&sense_buf;
21927         ucmd_buf.uscsi_rqlen    = sizeof (struct scsi_extended_sense);
21928         ucmd_buf.uscsi_flags    = flag | USCSI_RQENABLE | USCSI_SILENT;
21929         ucmd_buf.uscsi_timeout  = 60;
21930         status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
21931             UIO_SYSSPACE, path_flag);
21932 
21933         switch (status) {
21934         case 0:
21935                 sd_ssc_assessment(ssc, SD_FMT_STANDARD);
21936                 break;  /* Success! */
21937         case EIO:
21938                 switch (ucmd_buf.uscsi_status) {
21939                 case STATUS_RESERVATION_CONFLICT:
21940                         status = EACCES;
21941                         break;
21942                 default:
21943                         break;
21944                 }
21945                 break;
21946         default:
21947                 break;
21948         }
21949 
21950         if (status == 0) {
21951                 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_RDWR: data",
21952                     (uchar_t *)bufaddr, buflen, SD_LOG_HEX);
21953         }
21954 
21955         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_RDWR: exit\n");
21956 
21957         return (status);
21958 }
21959 
21960 
21961 /*
21962  *    Function: sd_send_scsi_LOG_SENSE
21963  *
21964  * Description: Issue a scsi LOG_SENSE command with the given parameters.
21965  *
21966  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
21967  *                      structure for this target.
21968  *
21969  * Return Code: 0   - Success
21970  *              errno return code from sd_ssc_send()
21971  *
21972  *     Context: Can sleep. Does not return until command is completed.
21973  */
21974 
21975 static int
21976 sd_send_scsi_LOG_SENSE(sd_ssc_t *ssc, uchar_t *bufaddr, uint16_t buflen,
21977         uchar_t page_code, uchar_t page_control, uint16_t param_ptr,
21978         int path_flag)
21979 
21980 {
21981         struct scsi_extended_sense      sense_buf;
21982         union scsi_cdb          cdb;
21983         struct uscsi_cmd        ucmd_buf;
21984         int                     status;
21985         struct sd_lun           *un;
21986 
21987         ASSERT(ssc != NULL);
21988         un = ssc->ssc_un;
21989         ASSERT(un != NULL);
21990         ASSERT(!mutex_owned(SD_MUTEX(un)));
21991 
21992         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_LOG_SENSE: entry: un:0x%p\n", un);
21993 
21994         bzero(&cdb, sizeof (cdb));
21995         bzero(&ucmd_buf, sizeof (ucmd_buf));
21996         bzero(&sense_buf, sizeof (struct scsi_extended_sense));
21997 
21998         cdb.scc_cmd = SCMD_LOG_SENSE_G1;
21999         cdb.cdb_opaque[2] = (page_control << 6) | page_code;
22000         cdb.cdb_opaque[5] = (uchar_t)((param_ptr & 0xFF00) >> 8);
22001         cdb.cdb_opaque[6] = (uchar_t)(param_ptr  & 0x00FF);
22002         FORMG1COUNT(&cdb, buflen);
22003 
22004         ucmd_buf.uscsi_cdb      = (char *)&cdb;
22005         ucmd_buf.uscsi_cdblen   = CDB_GROUP1;
22006         ucmd_buf.uscsi_bufaddr  = (caddr_t)bufaddr;
22007         ucmd_buf.uscsi_buflen   = buflen;
22008         ucmd_buf.uscsi_rqbuf    = (caddr_t)&sense_buf;
22009         ucmd_buf.uscsi_rqlen    = sizeof (struct scsi_extended_sense);
22010         ucmd_buf.uscsi_flags    = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT;
22011         ucmd_buf.uscsi_timeout  = 60;
22012 
22013         status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
22014             UIO_SYSSPACE, path_flag);
22015 
22016         switch (status) {
22017         case 0:
22018                 break;
22019         case EIO:
22020                 switch (ucmd_buf.uscsi_status) {
22021                 case STATUS_RESERVATION_CONFLICT:
22022                         status = EACCES;
22023                         break;
22024                 case STATUS_CHECK:
22025                         if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
22026                             (scsi_sense_key((uint8_t *)&sense_buf) ==
22027                                 KEY_ILLEGAL_REQUEST) &&
22028                             (scsi_sense_asc((uint8_t *)&sense_buf) == 0x24)) {
22029                                 /*
22030                                  * ASC 0x24: INVALID FIELD IN CDB
22031                                  */
22032                                 switch (page_code) {
22033                                 case START_STOP_CYCLE_PAGE:
22034                                         /*
22035                                          * The start stop cycle counter is
22036                                          * implemented as page 0x31 in earlier
22037                                          * generation disks. In new generation
22038                                          * disks the start stop cycle counter is
22039                                          * implemented as page 0xE. To properly
22040                                          * handle this case if an attempt for
22041                                          * log page 0xE is made and fails we
22042                                          * will try again using page 0x31.
22043                                          *
22044                                          * Network storage BU committed to
22045                                          * maintain the page 0x31 for this
22046                                          * purpose and will not have any other
22047                                          * page implemented with page code 0x31
22048                                          * until all disks transition to the
22049                                          * standard page.
22050                                          */
22051                                         mutex_enter(SD_MUTEX(un));
22052                                         un->un_start_stop_cycle_page =
22053                                             START_STOP_CYCLE_VU_PAGE;
22054                                         cdb.cdb_opaque[2] =
22055                                             (char)(page_control << 6) |
22056                                             un->un_start_stop_cycle_page;
22057                                         mutex_exit(SD_MUTEX(un));
22058                                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
22059                                         status = sd_ssc_send(
22060                                             ssc, &ucmd_buf, FKIOCTL,
22061                                             UIO_SYSSPACE, path_flag);
22062 
22063                                         break;
22064                                 case TEMPERATURE_PAGE:
22065                                         status = ENOTTY;
22066                                         break;
22067                                 default:
22068                                         break;
22069                                 }
22070                         }
22071                         break;
22072                 default:
22073                         break;
22074                 }
22075                 break;
22076         default:
22077                 break;
22078         }
22079 
22080         if (status == 0) {
22081                 sd_ssc_assessment(ssc, SD_FMT_STANDARD);
22082                 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_LOG_SENSE: data",
22083                     (uchar_t *)bufaddr, buflen, SD_LOG_HEX);
22084         }
22085 
22086         SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_LOG_SENSE: exit\n");
22087 
22088         return (status);
22089 }
22090 
22091 
22092 /*
22093  *    Function: sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION
22094  *
22095  * Description: Issue the scsi GET EVENT STATUS NOTIFICATION command.
22096  *
22097  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
22098  *                      structure for this target.
22099  *              bufaddr
22100  *              buflen
22101  *              class_req
22102  *
22103  * Return Code: 0   - Success
22104  *              errno return code from sd_ssc_send()
22105  *
22106  *     Context: Can sleep. Does not return until command is completed.
22107  */
22108 
22109 static int
22110 sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION(sd_ssc_t *ssc, uchar_t *bufaddr,
22111         size_t buflen, uchar_t class_req)
22112 {
22113         union scsi_cdb          cdb;
22114         struct uscsi_cmd        ucmd_buf;
22115         int                     status;
22116         struct sd_lun           *un;
22117 
22118         ASSERT(ssc != NULL);
22119         un = ssc->ssc_un;
22120         ASSERT(un != NULL);
22121         ASSERT(!mutex_owned(SD_MUTEX(un)));
22122         ASSERT(bufaddr != NULL);
22123 
22124         SD_TRACE(SD_LOG_IO, un,
22125             "sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION: entry: un:0x%p\n", un);
22126 
22127         bzero(&cdb, sizeof (cdb));
22128         bzero(&ucmd_buf, sizeof (ucmd_buf));
22129         bzero(bufaddr, buflen);
22130 
22131         cdb.scc_cmd = SCMD_GET_EVENT_STATUS_NOTIFICATION;
22132         cdb.cdb_opaque[1] = 1; /* polled */
22133         cdb.cdb_opaque[4] = class_req;
22134         FORMG1COUNT(&cdb, buflen);
22135 
22136         ucmd_buf.uscsi_cdb      = (char *)&cdb;
22137         ucmd_buf.uscsi_cdblen   = CDB_GROUP1;
22138         ucmd_buf.uscsi_bufaddr  = (caddr_t)bufaddr;
22139         ucmd_buf.uscsi_buflen   = buflen;
22140         ucmd_buf.uscsi_rqbuf    = NULL;
22141         ucmd_buf.uscsi_rqlen    = 0;
22142         ucmd_buf.uscsi_flags    = USCSI_READ | USCSI_SILENT;
22143         ucmd_buf.uscsi_timeout  = 60;
22144 
22145         status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
22146             UIO_SYSSPACE, SD_PATH_DIRECT);
22147 
22148         /*
22149          * Only handle status == 0, the upper-level caller
22150          * will put different assessment based on the context.
22151          */
22152         if (status == 0) {
22153                 sd_ssc_assessment(ssc, SD_FMT_STANDARD);
22154 
22155                 if (ucmd_buf.uscsi_resid != 0) {
22156                         status = EIO;
22157                 }
22158         }
22159 
22160         SD_TRACE(SD_LOG_IO, un,
22161             "sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION: exit\n");
22162 
22163         return (status);
22164 }
22165 
22166 
22167 static boolean_t
22168 sd_gesn_media_data_valid(uchar_t *data)
22169 {
22170         uint16_t                        len;
22171 
22172         len = (data[1] << 8) | data[0];
22173         return ((len >= 6) &&
22174             ((data[2] & SD_GESN_HEADER_NEA) == 0) &&
22175             ((data[2] & SD_GESN_HEADER_CLASS) == SD_GESN_MEDIA_CLASS) &&
22176             ((data[3] & (1 << SD_GESN_MEDIA_CLASS)) != 0));
22177 }
22178 
22179 
22180 /*
22181  *    Function: sdioctl
22182  *
22183  * Description: Driver's ioctl(9e) entry point function.
22184  *
22185  *   Arguments: dev     - device number
22186  *              cmd     - ioctl operation to be performed
22187  *              arg     - user argument, contains data to be set or reference
22188  *                        parameter for get
22189  *              flag    - bit flag, indicating open settings, 32/64 bit type
22190  *              cred_p  - user credential pointer
22191  *              rval_p  - calling process return value (OPT)
22192  *
22193  * Return Code: EINVAL
22194  *              ENOTTY
22195  *              ENXIO
22196  *              EIO
22197  *              EFAULT
22198  *              ENOTSUP
22199  *              EPERM
22200  *
22201  *     Context: Called from the device switch at normal priority.
22202  */
22203 
22204 static int
22205 sdioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cred_p, int *rval_p)
22206 {
22207         struct sd_lun   *un = NULL;
22208         int             err = 0;
22209         int             i = 0;
22210         cred_t          *cr;
22211         int             tmprval = EINVAL;
22212         boolean_t       is_valid;
22213         sd_ssc_t        *ssc;
22214 
22215         /*
22216          * All device accesses go thru sdstrategy where we check on suspend
22217          * status
22218          */
22219         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
22220                 return (ENXIO);
22221         }
22222 
22223         ASSERT(!mutex_owned(SD_MUTEX(un)));
22224 
22225         /* Initialize sd_ssc_t for internal uscsi commands */
22226         ssc = sd_ssc_init(un);
22227 
22228         is_valid = SD_IS_VALID_LABEL(un);
22229 
22230         /*
22231          * Moved this wait from sd_uscsi_strategy to here for
22232          * reasons of deadlock prevention. Internal driver commands,
22233          * specifically those to change a devices power level, result
22234          * in a call to sd_uscsi_strategy.
22235          */
22236         mutex_enter(SD_MUTEX(un));
22237         while ((un->un_state == SD_STATE_SUSPENDED) ||
22238             (un->un_state == SD_STATE_PM_CHANGING)) {
22239                 cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
22240         }
22241         /*
22242          * Twiddling the counter here protects commands from now
22243          * through to the top of sd_uscsi_strategy. Without the
22244          * counter inc. a power down, for example, could get in
22245          * after the above check for state is made and before
22246          * execution gets to the top of sd_uscsi_strategy.
22247          * That would cause problems.
22248          */
22249         un->un_ncmds_in_driver++;
22250 
22251         if (!is_valid &&
22252             (flag & (FNDELAY | FNONBLOCK))) {
22253                 switch (cmd) {
22254                 case DKIOCGGEOM:        /* SD_PATH_DIRECT */
22255                 case DKIOCGVTOC:
22256                 case DKIOCGEXTVTOC:
22257                 case DKIOCGAPART:
22258                 case DKIOCPARTINFO:
22259                 case DKIOCEXTPARTINFO:
22260                 case DKIOCSGEOM:
22261                 case DKIOCSAPART:
22262                 case DKIOCGETEFI:
22263                 case DKIOCPARTITION:
22264                 case DKIOCSVTOC:
22265                 case DKIOCSEXTVTOC:
22266                 case DKIOCSETEFI:
22267                 case DKIOCGMBOOT:
22268                 case DKIOCSMBOOT:
22269                 case DKIOCG_PHYGEOM:
22270                 case DKIOCG_VIRTGEOM:
22271 #if defined(__i386) || defined(__amd64)
22272                 case DKIOCSETEXTPART:
22273 #endif
22274                         /* let cmlb handle it */
22275                         goto skip_ready_valid;
22276 
22277                 case CDROMPAUSE:
22278                 case CDROMRESUME:
22279                 case CDROMPLAYMSF:
22280                 case CDROMPLAYTRKIND:
22281                 case CDROMREADTOCHDR:
22282                 case CDROMREADTOCENTRY:
22283                 case CDROMSTOP:
22284                 case CDROMSTART:
22285                 case CDROMVOLCTRL:
22286                 case CDROMSUBCHNL:
22287                 case CDROMREADMODE2:
22288                 case CDROMREADMODE1:
22289                 case CDROMREADOFFSET:
22290                 case CDROMSBLKMODE:
22291                 case CDROMGBLKMODE:
22292                 case CDROMGDRVSPEED:
22293                 case CDROMSDRVSPEED:
22294                 case CDROMCDDA:
22295                 case CDROMCDXA:
22296                 case CDROMSUBCODE:
22297                         if (!ISCD(un)) {
22298                                 un->un_ncmds_in_driver--;
22299                                 ASSERT(un->un_ncmds_in_driver >= 0);
22300                                 mutex_exit(SD_MUTEX(un));
22301                                 err = ENOTTY;
22302                                 goto done_without_assess;
22303                         }
22304                         break;
22305                 case FDEJECT:
22306                 case DKIOCEJECT:
22307                 case CDROMEJECT:
22308                         if (!un->un_f_eject_media_supported) {
22309                                 un->un_ncmds_in_driver--;
22310                                 ASSERT(un->un_ncmds_in_driver >= 0);
22311                                 mutex_exit(SD_MUTEX(un));
22312                                 err = ENOTTY;
22313                                 goto done_without_assess;
22314                         }
22315                         break;
22316                 case DKIOCFLUSHWRITECACHE:
22317                         mutex_exit(SD_MUTEX(un));
22318                         err = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
22319                         if (err != 0) {
22320                                 mutex_enter(SD_MUTEX(un));
22321                                 un->un_ncmds_in_driver--;
22322                                 ASSERT(un->un_ncmds_in_driver >= 0);
22323                                 mutex_exit(SD_MUTEX(un));
22324                                 err = EIO;
22325                                 goto done_quick_assess;
22326                         }
22327                         mutex_enter(SD_MUTEX(un));
22328                         /* FALLTHROUGH */
22329                 case DKIOCREMOVABLE:
22330                 case DKIOCHOTPLUGGABLE:
22331                 case DKIOCINFO:
22332                 case DKIOCGMEDIAINFO:
22333                 case DKIOCGMEDIAINFOEXT:
22334                 case DKIOCSOLIDSTATE:
22335                 case MHIOCENFAILFAST:
22336                 case MHIOCSTATUS:
22337                 case MHIOCTKOWN:
22338                 case MHIOCRELEASE:
22339                 case MHIOCGRP_INKEYS:
22340                 case MHIOCGRP_INRESV:
22341                 case MHIOCGRP_REGISTER:
22342                 case MHIOCGRP_CLEAR:
22343                 case MHIOCGRP_RESERVE:
22344                 case MHIOCGRP_PREEMPTANDABORT:
22345                 case MHIOCGRP_REGISTERANDIGNOREKEY:
22346                 case CDROMCLOSETRAY:
22347                 case USCSICMD:
22348                         goto skip_ready_valid;
22349                 default:
22350                         break;
22351                 }
22352 
22353                 mutex_exit(SD_MUTEX(un));
22354                 err = sd_ready_and_valid(ssc, SDPART(dev));
22355                 mutex_enter(SD_MUTEX(un));
22356 
22357                 if (err != SD_READY_VALID) {
22358                         switch (cmd) {
22359                         case DKIOCSTATE:
22360                         case CDROMGDRVSPEED:
22361                         case CDROMSDRVSPEED:
22362                         case FDEJECT:   /* for eject command */
22363                         case DKIOCEJECT:
22364                         case CDROMEJECT:
22365                         case DKIOCREMOVABLE:
22366                         case DKIOCHOTPLUGGABLE:
22367                                 break;
22368                         default:
22369                                 if (un->un_f_has_removable_media) {
22370                                         err = ENXIO;
22371                                 } else {
22372                                 /* Do not map SD_RESERVED_BY_OTHERS to EIO */
22373                                         if (err == SD_RESERVED_BY_OTHERS) {
22374                                                 err = EACCES;
22375                                         } else {
22376                                                 err = EIO;
22377                                         }
22378                                 }
22379                                 un->un_ncmds_in_driver--;
22380                                 ASSERT(un->un_ncmds_in_driver >= 0);
22381                                 mutex_exit(SD_MUTEX(un));
22382 
22383                                 goto done_without_assess;
22384                         }
22385                 }
22386         }
22387 
22388 skip_ready_valid:
22389         mutex_exit(SD_MUTEX(un));
22390 
22391         switch (cmd) {
22392         case DKIOCINFO:
22393                 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCINFO\n");
22394                 err = sd_dkio_ctrl_info(dev, (caddr_t)arg, flag);
22395                 break;
22396 
22397         case DKIOCGMEDIAINFO:
22398                 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGMEDIAINFO\n");
22399                 err = sd_get_media_info(dev, (caddr_t)arg, flag);
22400                 break;
22401 
22402         case DKIOCGMEDIAINFOEXT:
22403                 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGMEDIAINFOEXT\n");
22404                 err = sd_get_media_info_ext(dev, (caddr_t)arg, flag);
22405                 break;
22406 
22407         case DKIOCGGEOM:
22408         case DKIOCGVTOC:
22409         case DKIOCGEXTVTOC:
22410         case DKIOCGAPART:
22411         case DKIOCPARTINFO:
22412         case DKIOCEXTPARTINFO:
22413         case DKIOCSGEOM:
22414         case DKIOCSAPART:
22415         case DKIOCGETEFI:
22416         case DKIOCPARTITION:
22417         case DKIOCSVTOC:
22418         case DKIOCSEXTVTOC:
22419         case DKIOCSETEFI:
22420         case DKIOCGMBOOT:
22421         case DKIOCSMBOOT:
22422         case DKIOCG_PHYGEOM:
22423         case DKIOCG_VIRTGEOM:
22424 #if defined(__i386) || defined(__amd64)
22425         case DKIOCSETEXTPART:
22426 #endif
22427                 SD_TRACE(SD_LOG_IOCTL, un, "DKIOC %d\n", cmd);
22428 
22429                 /* TUR should spin up */
22430 
22431                 if (un->un_f_has_removable_media)
22432                         err = sd_send_scsi_TEST_UNIT_READY(ssc,
22433                             SD_CHECK_FOR_MEDIA);
22434 
22435                 else
22436                         err = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
22437 
22438                 if (err != 0)
22439                         goto done_with_assess;
22440 
22441                 err = cmlb_ioctl(un->un_cmlbhandle, dev,
22442                     cmd, arg, flag, cred_p, rval_p, (void *)SD_PATH_DIRECT);
22443 
22444                 if ((err == 0) &&
22445                     ((cmd == DKIOCSETEFI) ||
22446                     (un->un_f_pkstats_enabled) &&
22447                     (cmd == DKIOCSAPART || cmd == DKIOCSVTOC ||
22448                     cmd == DKIOCSEXTVTOC))) {
22449 
22450                         tmprval = cmlb_validate(un->un_cmlbhandle, CMLB_SILENT,
22451                             (void *)SD_PATH_DIRECT);
22452                         if ((tmprval == 0) && un->un_f_pkstats_enabled) {
22453                                 sd_set_pstats(un);
22454                                 SD_TRACE(SD_LOG_IO_PARTITION, un,
22455                                     "sd_ioctl: un:0x%p pstats created and "
22456                                     "set\n", un);
22457                         }
22458                 }
22459 
22460                 if ((cmd == DKIOCSVTOC || cmd == DKIOCSEXTVTOC) ||
22461                     ((cmd == DKIOCSETEFI) && (tmprval == 0))) {
22462 
22463                         mutex_enter(SD_MUTEX(un));
22464                         if (un->un_f_devid_supported &&
22465                             (un->un_f_opt_fab_devid == TRUE)) {
22466                                 if (un->un_devid == NULL) {
22467                                         sd_register_devid(ssc, SD_DEVINFO(un),
22468                                             SD_TARGET_IS_UNRESERVED);
22469                                 } else {
22470                                         /*
22471                                          * The device id for this disk
22472                                          * has been fabricated. The
22473                                          * device id must be preserved
22474                                          * by writing it back out to
22475                                          * disk.
22476                                          */
22477                                         if (sd_write_deviceid(ssc) != 0) {
22478                                                 ddi_devid_free(un->un_devid);
22479                                                 un->un_devid = NULL;
22480                                         }
22481                                 }
22482                         }
22483                         mutex_exit(SD_MUTEX(un));
22484                 }
22485 
22486                 break;
22487 
22488         case DKIOCLOCK:
22489                 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCLOCK\n");
22490                 err = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT,
22491                     SD_PATH_STANDARD);
22492                 goto done_with_assess;
22493 
22494         case DKIOCUNLOCK:
22495                 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCUNLOCK\n");
22496                 err = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_ALLOW,
22497                     SD_PATH_STANDARD);
22498                 goto done_with_assess;
22499 
22500         case DKIOCSTATE: {
22501                 enum dkio_state         state;
22502                 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCSTATE\n");
22503 
22504                 if (ddi_copyin((void *)arg, &state, sizeof (int), flag) != 0) {
22505                         err = EFAULT;
22506                 } else {
22507                         err = sd_check_media(dev, state);
22508                         if (err == 0) {
22509                                 if (ddi_copyout(&un->un_mediastate, (void *)arg,
22510                                     sizeof (int), flag) != 0)
22511                                         err = EFAULT;
22512                         }
22513                 }
22514                 break;
22515         }
22516 
22517         case DKIOCREMOVABLE:
22518                 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCREMOVABLE\n");
22519                 i = un->un_f_has_removable_media ? 1 : 0;
22520                 if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) {
22521                         err = EFAULT;
22522                 } else {
22523                         err = 0;
22524                 }
22525                 break;
22526 
22527         case DKIOCSOLIDSTATE:
22528                 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCSOLIDSTATE\n");
22529                 i = un->un_f_is_solid_state ? 1 : 0;
22530                 if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) {
22531                         err = EFAULT;
22532                 } else {
22533                         err = 0;
22534                 }
22535                 break;
22536 
22537         case DKIOCHOTPLUGGABLE:
22538                 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCHOTPLUGGABLE\n");
22539                 i = un->un_f_is_hotpluggable ? 1 : 0;
22540                 if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) {
22541                         err = EFAULT;
22542                 } else {
22543                         err = 0;
22544                 }
22545                 break;
22546 
22547         case DKIOCREADONLY:
22548                 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCREADONLY\n");
22549                 i = 0;
22550                 if ((ISCD(un) && !un->un_f_mmc_writable_media) ||
22551                     (sr_check_wp(dev) != 0)) {
22552                         i = 1;
22553                 }
22554                 if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) {
22555                         err = EFAULT;
22556                 } else {
22557                         err = 0;
22558                 }
22559                 break;
22560 
22561         case DKIOCGTEMPERATURE:
22562                 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGTEMPERATURE\n");
22563                 err = sd_dkio_get_temp(dev, (caddr_t)arg, flag);
22564                 break;
22565 
22566         case MHIOCENFAILFAST:
22567                 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCENFAILFAST\n");
22568                 if ((err = drv_priv(cred_p)) == 0) {
22569                         err = sd_mhdioc_failfast(dev, (caddr_t)arg, flag);
22570                 }
22571                 break;
22572 
22573         case MHIOCTKOWN:
22574                 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCTKOWN\n");
22575                 if ((err = drv_priv(cred_p)) == 0) {
22576                         err = sd_mhdioc_takeown(dev, (caddr_t)arg, flag);
22577                 }
22578                 break;
22579 
22580         case MHIOCRELEASE:
22581                 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCRELEASE\n");
22582                 if ((err = drv_priv(cred_p)) == 0) {
22583                         err = sd_mhdioc_release(dev);
22584                 }
22585                 break;
22586 
22587         case MHIOCSTATUS:
22588                 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCSTATUS\n");
22589                 if ((err = drv_priv(cred_p)) == 0) {
22590                         switch (sd_send_scsi_TEST_UNIT_READY(ssc, 0)) {
22591                         case 0:
22592                                 err = 0;
22593                                 break;
22594                         case EACCES:
22595                                 *rval_p = 1;
22596                                 err = 0;
22597                                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
22598                                 break;
22599                         default:
22600                                 err = EIO;
22601                                 goto done_with_assess;
22602                         }
22603                 }
22604                 break;
22605 
22606         case MHIOCQRESERVE:
22607                 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCQRESERVE\n");
22608                 if ((err = drv_priv(cred_p)) == 0) {
22609                         err = sd_reserve_release(dev, SD_RESERVE);
22610                 }
22611                 break;
22612 
22613         case MHIOCREREGISTERDEVID:
22614                 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCREREGISTERDEVID\n");
22615                 if (drv_priv(cred_p) == EPERM) {
22616                         err = EPERM;
22617                 } else if (!un->un_f_devid_supported) {
22618                         err = ENOTTY;
22619                 } else {
22620                         err = sd_mhdioc_register_devid(dev);
22621                 }
22622                 break;
22623 
22624         case MHIOCGRP_INKEYS:
22625                 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_INKEYS\n");
22626                 if (((err = drv_priv(cred_p)) != EPERM) && arg != NULL) {
22627                         if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22628                                 err = ENOTSUP;
22629                         } else {
22630                                 err = sd_mhdioc_inkeys(dev, (caddr_t)arg,
22631                                     flag);
22632                         }
22633                 }
22634                 break;
22635 
22636         case MHIOCGRP_INRESV:
22637                 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_INRESV\n");
22638                 if (((err = drv_priv(cred_p)) != EPERM) && arg != NULL) {
22639                         if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22640                                 err = ENOTSUP;
22641                         } else {
22642                                 err = sd_mhdioc_inresv(dev, (caddr_t)arg, flag);
22643                         }
22644                 }
22645                 break;
22646 
22647         case MHIOCGRP_REGISTER:
22648                 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_REGISTER\n");
22649                 if ((err = drv_priv(cred_p)) != EPERM) {
22650                         if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22651                                 err = ENOTSUP;
22652                         } else if (arg != NULL) {
22653                                 mhioc_register_t reg;
22654                                 if (ddi_copyin((void *)arg, &reg,
22655                                     sizeof (mhioc_register_t), flag) != 0) {
22656                                         err = EFAULT;
22657                                 } else {
22658                                         err =
22659                                             sd_send_scsi_PERSISTENT_RESERVE_OUT(
22660                                             ssc, SD_SCSI3_REGISTER,
22661                                             (uchar_t *)&reg);
22662                                         if (err != 0)
22663                                                 goto done_with_assess;
22664                                 }
22665                         }
22666                 }
22667                 break;
22668 
22669         case MHIOCGRP_CLEAR:
22670                 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_CLEAR\n");
22671                 if ((err = drv_priv(cred_p)) != EPERM) {
22672                         if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22673                                 err = ENOTSUP;
22674                         } else if (arg != NULL) {
22675                                 mhioc_register_t reg;
22676                                 if (ddi_copyin((void *)arg, &reg,
22677                                     sizeof (mhioc_register_t), flag) != 0) {
22678                                         err = EFAULT;
22679                                 } else {
22680                                         err =
22681                                             sd_send_scsi_PERSISTENT_RESERVE_OUT(
22682                                             ssc, SD_SCSI3_CLEAR,
22683                                             (uchar_t *)&reg);
22684                                         if (err != 0)
22685                                                 goto done_with_assess;
22686                                 }
22687                         }
22688                 }
22689                 break;
22690 
22691         case MHIOCGRP_RESERVE:
22692                 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_RESERVE\n");
22693                 if ((err = drv_priv(cred_p)) != EPERM) {
22694                         if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22695                                 err = ENOTSUP;
22696                         } else if (arg != NULL) {
22697                                 mhioc_resv_desc_t resv_desc;
22698                                 if (ddi_copyin((void *)arg, &resv_desc,
22699                                     sizeof (mhioc_resv_desc_t), flag) != 0) {
22700                                         err = EFAULT;
22701                                 } else {
22702                                         err =
22703                                             sd_send_scsi_PERSISTENT_RESERVE_OUT(
22704                                             ssc, SD_SCSI3_RESERVE,
22705                                             (uchar_t *)&resv_desc);
22706                                         if (err != 0)
22707                                                 goto done_with_assess;
22708                                 }
22709                         }
22710                 }
22711                 break;
22712 
22713         case MHIOCGRP_PREEMPTANDABORT:
22714                 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_PREEMPTANDABORT\n");
22715                 if ((err = drv_priv(cred_p)) != EPERM) {
22716                         if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22717                                 err = ENOTSUP;
22718                         } else if (arg != NULL) {
22719                                 mhioc_preemptandabort_t preempt_abort;
22720                                 if (ddi_copyin((void *)arg, &preempt_abort,
22721                                     sizeof (mhioc_preemptandabort_t),
22722                                     flag) != 0) {
22723                                         err = EFAULT;
22724                                 } else {
22725                                         err =
22726                                             sd_send_scsi_PERSISTENT_RESERVE_OUT(
22727                                             ssc, SD_SCSI3_PREEMPTANDABORT,
22728                                             (uchar_t *)&preempt_abort);
22729                                         if (err != 0)
22730                                                 goto done_with_assess;
22731                                 }
22732                         }
22733                 }
22734                 break;
22735 
22736         case MHIOCGRP_REGISTERANDIGNOREKEY:
22737                 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_REGISTERANDIGNOREKEY\n");
22738                 if ((err = drv_priv(cred_p)) != EPERM) {
22739                         if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22740                                 err = ENOTSUP;
22741                         } else if (arg != NULL) {
22742                                 mhioc_registerandignorekey_t r_and_i;
22743                                 if (ddi_copyin((void *)arg, (void *)&r_and_i,
22744                                     sizeof (mhioc_registerandignorekey_t),
22745                                     flag) != 0) {
22746                                         err = EFAULT;
22747                                 } else {
22748                                         err =
22749                                             sd_send_scsi_PERSISTENT_RESERVE_OUT(
22750                                             ssc, SD_SCSI3_REGISTERANDIGNOREKEY,
22751                                             (uchar_t *)&r_and_i);
22752                                         if (err != 0)
22753                                                 goto done_with_assess;
22754                                 }
22755                         }
22756                 }
22757                 break;
22758 
22759         case USCSICMD:
22760                 SD_TRACE(SD_LOG_IOCTL, un, "USCSICMD\n");
22761                 cr = ddi_get_cred();
22762                 if ((drv_priv(cred_p) != 0) && (drv_priv(cr) != 0)) {
22763                         err = EPERM;
22764                 } else {
22765                         enum uio_seg    uioseg;
22766 
22767                         uioseg = (flag & FKIOCTL) ? UIO_SYSSPACE :
22768                             UIO_USERSPACE;
22769                         if (un->un_f_format_in_progress == TRUE) {
22770                                 err = EAGAIN;
22771                                 break;
22772                         }
22773 
22774                         err = sd_ssc_send(ssc,
22775                             (struct uscsi_cmd *)arg,
22776                             flag, uioseg, SD_PATH_STANDARD);
22777                         if (err != 0)
22778                                 goto done_with_assess;
22779                         else
22780                                 sd_ssc_assessment(ssc, SD_FMT_STANDARD);
22781                 }
22782                 break;
22783 
22784         case CDROMPAUSE:
22785         case CDROMRESUME:
22786                 SD_TRACE(SD_LOG_IOCTL, un, "PAUSE-RESUME\n");
22787                 if (!ISCD(un)) {
22788                         err = ENOTTY;
22789                 } else {
22790                         err = sr_pause_resume(dev, cmd);
22791                 }
22792                 break;
22793 
22794         case CDROMPLAYMSF:
22795                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMPLAYMSF\n");
22796                 if (!ISCD(un)) {
22797                         err = ENOTTY;
22798                 } else {
22799                         err = sr_play_msf(dev, (caddr_t)arg, flag);
22800                 }
22801                 break;
22802 
22803         case CDROMPLAYTRKIND:
22804                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMPLAYTRKIND\n");
22805 #if defined(__i386) || defined(__amd64)
22806                 /*
22807                  * not supported on ATAPI CD drives, use CDROMPLAYMSF instead
22808                  */
22809                 if (!ISCD(un) || (un->un_f_cfg_is_atapi == TRUE)) {
22810 #else
22811                 if (!ISCD(un)) {
22812 #endif
22813                         err = ENOTTY;
22814                 } else {
22815                         err = sr_play_trkind(dev, (caddr_t)arg, flag);
22816                 }
22817                 break;
22818 
22819         case CDROMREADTOCHDR:
22820                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADTOCHDR\n");
22821                 if (!ISCD(un)) {
22822                         err = ENOTTY;
22823                 } else {
22824                         err = sr_read_tochdr(dev, (caddr_t)arg, flag);
22825                 }
22826                 break;
22827 
22828         case CDROMREADTOCENTRY:
22829                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADTOCENTRY\n");
22830                 if (!ISCD(un)) {
22831                         err = ENOTTY;
22832                 } else {
22833                         err = sr_read_tocentry(dev, (caddr_t)arg, flag);
22834                 }
22835                 break;
22836 
22837         case CDROMSTOP:
22838                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSTOP\n");
22839                 if (!ISCD(un)) {
22840                         err = ENOTTY;
22841                 } else {
22842                         err = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
22843                             SD_TARGET_STOP, SD_PATH_STANDARD);
22844                         goto done_with_assess;
22845                 }
22846                 break;
22847 
22848         case CDROMSTART:
22849                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSTART\n");
22850                 if (!ISCD(un)) {
22851                         err = ENOTTY;
22852                 } else {
22853                         err = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
22854                             SD_TARGET_START, SD_PATH_STANDARD);
22855                         goto done_with_assess;
22856                 }
22857                 break;
22858 
22859         case CDROMCLOSETRAY:
22860                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCLOSETRAY\n");
22861                 if (!ISCD(un)) {
22862                         err = ENOTTY;
22863                 } else {
22864                         err = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
22865                             SD_TARGET_CLOSE, SD_PATH_STANDARD);
22866                         goto done_with_assess;
22867                 }
22868                 break;
22869 
22870         case FDEJECT:   /* for eject command */
22871         case DKIOCEJECT:
22872         case CDROMEJECT:
22873                 SD_TRACE(SD_LOG_IOCTL, un, "EJECT\n");
22874                 if (!un->un_f_eject_media_supported) {
22875                         err = ENOTTY;
22876                 } else {
22877                         err = sr_eject(dev);
22878                 }
22879                 break;
22880 
22881         case CDROMVOLCTRL:
22882                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMVOLCTRL\n");
22883                 if (!ISCD(un)) {
22884                         err = ENOTTY;
22885                 } else {
22886                         err = sr_volume_ctrl(dev, (caddr_t)arg, flag);
22887                 }
22888                 break;
22889 
22890         case CDROMSUBCHNL:
22891                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSUBCHNL\n");
22892                 if (!ISCD(un)) {
22893                         err = ENOTTY;
22894                 } else {
22895                         err = sr_read_subchannel(dev, (caddr_t)arg, flag);
22896                 }
22897                 break;
22898 
22899         case CDROMREADMODE2:
22900                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADMODE2\n");
22901                 if (!ISCD(un)) {
22902                         err = ENOTTY;
22903                 } else if (un->un_f_cfg_is_atapi == TRUE) {
22904                         /*
22905                          * If the drive supports READ CD, use that instead of
22906                          * switching the LBA size via a MODE SELECT
22907                          * Block Descriptor
22908                          */
22909                         err = sr_read_cd_mode2(dev, (caddr_t)arg, flag);
22910                 } else {
22911                         err = sr_read_mode2(dev, (caddr_t)arg, flag);
22912                 }
22913                 break;
22914 
22915         case CDROMREADMODE1:
22916                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADMODE1\n");
22917                 if (!ISCD(un)) {
22918                         err = ENOTTY;
22919                 } else {
22920                         err = sr_read_mode1(dev, (caddr_t)arg, flag);
22921                 }
22922                 break;
22923 
22924         case CDROMREADOFFSET:
22925                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADOFFSET\n");
22926                 if (!ISCD(un)) {
22927                         err = ENOTTY;
22928                 } else {
22929                         err = sr_read_sony_session_offset(dev, (caddr_t)arg,
22930                             flag);
22931                 }
22932                 break;
22933 
22934         case CDROMSBLKMODE:
22935                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSBLKMODE\n");
22936                 /*
22937                  * There is no means of changing block size in case of atapi
22938                  * drives, thus return ENOTTY if drive type is atapi
22939                  */
22940                 if (!ISCD(un) || (un->un_f_cfg_is_atapi == TRUE)) {
22941                         err = ENOTTY;
22942                 } else if (un->un_f_mmc_cap == TRUE) {
22943 
22944                         /*
22945                          * MMC Devices do not support changing the
22946                          * logical block size
22947                          *
22948                          * Note: EINVAL is being returned instead of ENOTTY to
22949                          * maintain consistancy with the original mmc
22950                          * driver update.
22951                          */
22952                         err = EINVAL;
22953                 } else {
22954                         mutex_enter(SD_MUTEX(un));
22955                         if ((!(un->un_exclopen & (1<<SDPART(dev)))) ||
22956                             (un->un_ncmds_in_transport > 0)) {
22957                                 mutex_exit(SD_MUTEX(un));
22958                                 err = EINVAL;
22959                         } else {
22960                                 mutex_exit(SD_MUTEX(un));
22961                                 err = sr_change_blkmode(dev, cmd, arg, flag);
22962                         }
22963                 }
22964                 break;
22965 
22966         case CDROMGBLKMODE:
22967                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMGBLKMODE\n");
22968                 if (!ISCD(un)) {
22969                         err = ENOTTY;
22970                 } else if ((un->un_f_cfg_is_atapi != FALSE) &&
22971                     (un->un_f_blockcount_is_valid != FALSE)) {
22972                         /*
22973                          * Drive is an ATAPI drive so return target block
22974                          * size for ATAPI drives since we cannot change the
22975                          * blocksize on ATAPI drives. Used primarily to detect
22976                          * if an ATAPI cdrom is present.
22977                          */
22978                         if (ddi_copyout(&un->un_tgt_blocksize, (void *)arg,
22979                             sizeof (int), flag) != 0) {
22980                                 err = EFAULT;
22981                         } else {
22982                                 err = 0;
22983                         }
22984 
22985                 } else {
22986                         /*
22987                          * Drive supports changing block sizes via a Mode
22988                          * Select.
22989                          */
22990                         err = sr_change_blkmode(dev, cmd, arg, flag);
22991                 }
22992                 break;
22993 
22994         case CDROMGDRVSPEED:
22995         case CDROMSDRVSPEED:
22996                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMXDRVSPEED\n");
22997                 if (!ISCD(un)) {
22998                         err = ENOTTY;
22999                 } else if (un->un_f_mmc_cap == TRUE) {
23000                         /*
23001                          * Note: In the future the driver implementation
23002                          * for getting and
23003                          * setting cd speed should entail:
23004                          * 1) If non-mmc try the Toshiba mode page
23005                          *    (sr_change_speed)
23006                          * 2) If mmc but no support for Real Time Streaming try
23007                          *    the SET CD SPEED (0xBB) command
23008                          *   (sr_atapi_change_speed)
23009                          * 3) If mmc and support for Real Time Streaming
23010                          *    try the GET PERFORMANCE and SET STREAMING
23011                          *    commands (not yet implemented, 4380808)
23012                          */
23013                         /*
23014                          * As per recent MMC spec, CD-ROM speed is variable
23015                          * and changes with LBA. Since there is no such
23016                          * things as drive speed now, fail this ioctl.
23017                          *
23018                          * Note: EINVAL is returned for consistancy of original
23019                          * implementation which included support for getting
23020                          * the drive speed of mmc devices but not setting
23021                          * the drive speed. Thus EINVAL would be returned
23022                          * if a set request was made for an mmc device.
23023                          * We no longer support get or set speed for
23024                          * mmc but need to remain consistent with regard
23025                          * to the error code returned.
23026                          */
23027                         err = EINVAL;
23028                 } else if (un->un_f_cfg_is_atapi == TRUE) {
23029                         err = sr_atapi_change_speed(dev, cmd, arg, flag);
23030                 } else {
23031                         err = sr_change_speed(dev, cmd, arg, flag);
23032                 }
23033                 break;
23034 
23035         case CDROMCDDA:
23036                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCDDA\n");
23037                 if (!ISCD(un)) {
23038                         err = ENOTTY;
23039                 } else {
23040                         err = sr_read_cdda(dev, (void *)arg, flag);
23041                 }
23042                 break;
23043 
23044         case CDROMCDXA:
23045                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCDXA\n");
23046                 if (!ISCD(un)) {
23047                         err = ENOTTY;
23048                 } else {
23049                         err = sr_read_cdxa(dev, (caddr_t)arg, flag);
23050                 }
23051                 break;
23052 
23053         case CDROMSUBCODE:
23054                 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSUBCODE\n");
23055                 if (!ISCD(un)) {
23056                         err = ENOTTY;
23057                 } else {
23058                         err = sr_read_all_subcodes(dev, (caddr_t)arg, flag);
23059                 }
23060                 break;
23061 
23062 
23063 #ifdef SDDEBUG
23064 /* RESET/ABORTS testing ioctls */
23065         case DKIOCRESET: {
23066                 int     reset_level;
23067 
23068                 if (ddi_copyin((void *)arg, &reset_level, sizeof (int), flag)) {
23069                         err = EFAULT;
23070                 } else {
23071                         SD_INFO(SD_LOG_IOCTL, un, "sdioctl: DKIOCRESET: "
23072                             "reset_level = 0x%lx\n", reset_level);
23073                         if (scsi_reset(SD_ADDRESS(un), reset_level)) {
23074                                 err = 0;
23075                         } else {
23076                                 err = EIO;
23077                         }
23078                 }
23079                 break;
23080         }
23081 
23082         case DKIOCABORT:
23083                 SD_INFO(SD_LOG_IOCTL, un, "sdioctl: DKIOCABORT:\n");
23084                 if (scsi_abort(SD_ADDRESS(un), NULL)) {
23085                         err = 0;
23086                 } else {
23087                         err = EIO;
23088                 }
23089                 break;
23090 #endif
23091 
23092 #ifdef SD_FAULT_INJECTION
23093 /* SDIOC FaultInjection testing ioctls */
23094         case SDIOCSTART:
23095         case SDIOCSTOP:
23096         case SDIOCINSERTPKT:
23097         case SDIOCINSERTXB:
23098         case SDIOCINSERTUN:
23099         case SDIOCINSERTARQ:
23100         case SDIOCPUSH:
23101         case SDIOCRETRIEVE:
23102         case SDIOCRUN:
23103                 SD_INFO(SD_LOG_SDTEST, un, "sdioctl:"
23104                     "SDIOC detected cmd:0x%X:\n", cmd);
23105                 /* call error generator */
23106                 sd_faultinjection_ioctl(cmd, arg, un);
23107                 err = 0;
23108                 break;
23109 
23110 #endif /* SD_FAULT_INJECTION */
23111 
23112         case DKIOCFLUSHWRITECACHE:
23113                 {
23114                         struct dk_callback *dkc = (struct dk_callback *)arg;
23115 
23116                         mutex_enter(SD_MUTEX(un));
23117                         if (!un->un_f_sync_cache_supported ||
23118                             !un->un_f_write_cache_enabled) {
23119                                 err = un->un_f_sync_cache_supported ?
23120                                     0 : ENOTSUP;
23121                                 mutex_exit(SD_MUTEX(un));
23122                                 if ((flag & FKIOCTL) && dkc != NULL &&
23123                                     dkc->dkc_callback != NULL) {
23124                                         (*dkc->dkc_callback)(dkc->dkc_cookie,
23125                                             err);
23126                                         /*
23127                                          * Did callback and reported error.
23128                                          * Since we did a callback, ioctl
23129                                          * should return 0.
23130                                          */
23131                                         err = 0;
23132                                 }
23133                                 break;
23134                         }
23135                         mutex_exit(SD_MUTEX(un));
23136 
23137                         if ((flag & FKIOCTL) && dkc != NULL &&
23138                             dkc->dkc_callback != NULL) {
23139                                 /* async SYNC CACHE request */
23140                                 err = sd_send_scsi_SYNCHRONIZE_CACHE(un, dkc);
23141                         } else {
23142                                 /* synchronous SYNC CACHE request */
23143                                 err = sd_send_scsi_SYNCHRONIZE_CACHE(un, NULL);
23144                         }
23145                 }
23146                 break;
23147 
23148         case DKIOCGETWCE: {
23149 
23150                 int wce;
23151 
23152                 if ((err = sd_get_write_cache_enabled(ssc, &wce)) != 0) {
23153                         break;
23154                 }
23155 
23156                 if (ddi_copyout(&wce, (void *)arg, sizeof (wce), flag)) {
23157                         err = EFAULT;
23158                 }
23159                 break;
23160         }
23161 
23162         case DKIOCSETWCE: {
23163 
23164                 int wce, sync_supported;
23165                 int cur_wce = 0;
23166 
23167                 if (ddi_copyin((void *)arg, &wce, sizeof (wce), flag)) {
23168                         err = EFAULT;
23169                         break;
23170                 }
23171 
23172                 /*
23173                  * Synchronize multiple threads trying to enable
23174                  * or disable the cache via the un_f_wcc_cv
23175                  * condition variable.
23176                  */
23177                 mutex_enter(SD_MUTEX(un));
23178 
23179                 /*
23180                  * Don't allow the cache to be enabled if the
23181                  * config file has it disabled.
23182                  */
23183                 if (un->un_f_opt_disable_cache && wce) {
23184                         mutex_exit(SD_MUTEX(un));
23185                         err = EINVAL;
23186                         break;
23187                 }
23188 
23189                 /*
23190                  * Wait for write cache change in progress
23191                  * bit to be clear before proceeding.
23192                  */
23193                 while (un->un_f_wcc_inprog)
23194                         cv_wait(&un->un_wcc_cv, SD_MUTEX(un));
23195 
23196                 un->un_f_wcc_inprog = 1;
23197 
23198                 mutex_exit(SD_MUTEX(un));
23199 
23200                 /*
23201                  * Get the current write cache state
23202                  */
23203                 if ((err = sd_get_write_cache_enabled(ssc, &cur_wce)) != 0) {
23204                         mutex_enter(SD_MUTEX(un));
23205                         un->un_f_wcc_inprog = 0;
23206                         cv_broadcast(&un->un_wcc_cv);
23207                         mutex_exit(SD_MUTEX(un));
23208                         break;
23209                 }
23210 
23211                 mutex_enter(SD_MUTEX(un));
23212                 un->un_f_write_cache_enabled = (cur_wce != 0);
23213 
23214                 if (un->un_f_write_cache_enabled && wce == 0) {
23215                         /*
23216                          * Disable the write cache.  Don't clear
23217                          * un_f_write_cache_enabled until after
23218                          * the mode select and flush are complete.
23219                          */
23220                         sync_supported = un->un_f_sync_cache_supported;
23221 
23222                         /*
23223                          * If cache flush is suppressed, we assume that the
23224                          * controller firmware will take care of managing the
23225                          * write cache for us: no need to explicitly
23226                          * disable it.
23227                          */
23228                         if (!un->un_f_suppress_cache_flush) {
23229                                 mutex_exit(SD_MUTEX(un));
23230                                 if ((err = sd_cache_control(ssc,
23231                                     SD_CACHE_NOCHANGE,
23232                                     SD_CACHE_DISABLE)) == 0 &&
23233                                     sync_supported) {
23234                                         err = sd_send_scsi_SYNCHRONIZE_CACHE(un,
23235                                             NULL);
23236                                 }
23237                         } else {
23238                                 mutex_exit(SD_MUTEX(un));
23239                         }
23240 
23241                         mutex_enter(SD_MUTEX(un));
23242                         if (err == 0) {
23243                                 un->un_f_write_cache_enabled = 0;
23244                         }
23245 
23246                 } else if (!un->un_f_write_cache_enabled && wce != 0) {
23247                         /*
23248                          * Set un_f_write_cache_enabled first, so there is
23249                          * no window where the cache is enabled, but the
23250                          * bit says it isn't.
23251                          */
23252                         un->un_f_write_cache_enabled = 1;
23253 
23254                         /*
23255                          * If cache flush is suppressed, we assume that the
23256                          * controller firmware will take care of managing the
23257                          * write cache for us: no need to explicitly
23258                          * enable it.
23259                          */
23260                         if (!un->un_f_suppress_cache_flush) {
23261                                 mutex_exit(SD_MUTEX(un));
23262                                 err = sd_cache_control(ssc, SD_CACHE_NOCHANGE,
23263                                     SD_CACHE_ENABLE);
23264                         } else {
23265                                 mutex_exit(SD_MUTEX(un));
23266                         }
23267 
23268                         mutex_enter(SD_MUTEX(un));
23269 
23270                         if (err) {
23271                                 un->un_f_write_cache_enabled = 0;
23272                         }
23273                 }
23274 
23275                 un->un_f_wcc_inprog = 0;
23276                 cv_broadcast(&un->un_wcc_cv);
23277                 mutex_exit(SD_MUTEX(un));
23278                 break;
23279         }
23280 
23281         default:
23282                 err = ENOTTY;
23283                 break;
23284         }
23285         mutex_enter(SD_MUTEX(un));
23286         un->un_ncmds_in_driver--;
23287         ASSERT(un->un_ncmds_in_driver >= 0);
23288         mutex_exit(SD_MUTEX(un));
23289 
23290 
23291 done_without_assess:
23292         sd_ssc_fini(ssc);
23293 
23294         SD_TRACE(SD_LOG_IOCTL, un, "sdioctl: exit: %d\n", err);
23295         return (err);
23296 
23297 done_with_assess:
23298         mutex_enter(SD_MUTEX(un));
23299         un->un_ncmds_in_driver--;
23300         ASSERT(un->un_ncmds_in_driver >= 0);
23301         mutex_exit(SD_MUTEX(un));
23302 
23303 done_quick_assess:
23304         if (err != 0)
23305                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
23306         /* Uninitialize sd_ssc_t pointer */
23307         sd_ssc_fini(ssc);
23308 
23309         SD_TRACE(SD_LOG_IOCTL, un, "sdioctl: exit: %d\n", err);
23310         return (err);
23311 }
23312 
23313 
23314 /*
23315  *    Function: sd_dkio_ctrl_info
23316  *
23317  * Description: This routine is the driver entry point for handling controller
23318  *              information ioctl requests (DKIOCINFO).
23319  *
23320  *   Arguments: dev  - the device number
23321  *              arg  - pointer to user provided dk_cinfo structure
23322  *                     specifying the controller type and attributes.
23323  *              flag - this argument is a pass through to ddi_copyxxx()
23324  *                     directly from the mode argument of ioctl().
23325  *
23326  * Return Code: 0
23327  *              EFAULT
23328  *              ENXIO
23329  */
23330 
23331 static int
23332 sd_dkio_ctrl_info(dev_t dev, caddr_t arg, int flag)
23333 {
23334         struct sd_lun   *un = NULL;
23335         struct dk_cinfo *info;
23336         dev_info_t      *pdip;
23337         int             lun, tgt;
23338 
23339         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23340                 return (ENXIO);
23341         }
23342 
23343         info = (struct dk_cinfo *)
23344             kmem_zalloc(sizeof (struct dk_cinfo), KM_SLEEP);
23345 
23346         switch (un->un_ctype) {
23347         case CTYPE_CDROM:
23348                 info->dki_ctype = DKC_CDROM;
23349                 break;
23350         default:
23351                 info->dki_ctype = DKC_SCSI_CCS;
23352                 break;
23353         }
23354         pdip = ddi_get_parent(SD_DEVINFO(un));
23355         info->dki_cnum = ddi_get_instance(pdip);
23356         if (strlen(ddi_get_name(pdip)) < DK_DEVLEN) {
23357                 (void) strcpy(info->dki_cname, ddi_get_name(pdip));
23358         } else {
23359                 (void) strncpy(info->dki_cname, ddi_node_name(pdip),
23360                     DK_DEVLEN - 1);
23361         }
23362 
23363         lun = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
23364             DDI_PROP_DONTPASS, SCSI_ADDR_PROP_LUN, 0);
23365         tgt = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
23366             DDI_PROP_DONTPASS, SCSI_ADDR_PROP_TARGET, 0);
23367 
23368         /* Unit Information */
23369         info->dki_unit = ddi_get_instance(SD_DEVINFO(un));
23370         info->dki_slave = ((tgt << 3) | lun);
23371         (void) strncpy(info->dki_dname, ddi_driver_name(SD_DEVINFO(un)),
23372             DK_DEVLEN - 1);
23373         info->dki_flags = DKI_FMTVOL;
23374         info->dki_partition = SDPART(dev);
23375 
23376         /* Max Transfer size of this device in blocks */
23377         info->dki_maxtransfer = un->un_max_xfer_size / un->un_sys_blocksize;
23378         info->dki_addr = 0;
23379         info->dki_space = 0;
23380         info->dki_prio = 0;
23381         info->dki_vec = 0;
23382 
23383         if (ddi_copyout(info, arg, sizeof (struct dk_cinfo), flag) != 0) {
23384                 kmem_free(info, sizeof (struct dk_cinfo));
23385                 return (EFAULT);
23386         } else {
23387                 kmem_free(info, sizeof (struct dk_cinfo));
23388                 return (0);
23389         }
23390 }
23391 
23392 /*
23393  *    Function: sd_get_media_info_com
23394  *
23395  * Description: This routine returns the information required to populate
23396  *              the fields for the dk_minfo/dk_minfo_ext structures.
23397  *
23398  *   Arguments: dev             - the device number
23399  *              dki_media_type  - media_type
23400  *              dki_lbsize      - logical block size
23401  *              dki_capacity    - capacity in blocks
23402  *              dki_pbsize      - physical block size (if requested)
23403  *
23404  * Return Code: 0
23405  *              EACCESS
23406  *              EFAULT
23407  *              ENXIO
23408  *              EIO
23409  */
23410 static int
23411 sd_get_media_info_com(dev_t dev, uint_t *dki_media_type, uint_t *dki_lbsize,
23412         diskaddr_t *dki_capacity, uint_t *dki_pbsize)
23413 {
23414         struct sd_lun           *un = NULL;
23415         struct uscsi_cmd        com;
23416         struct scsi_inquiry     *sinq;
23417         u_longlong_t            media_capacity;
23418         uint64_t                capacity;
23419         uint_t                  lbasize;
23420         uint_t                  pbsize;
23421         uchar_t                 *out_data;
23422         uchar_t                 *rqbuf;
23423         int                     rval = 0;
23424         int                     rtn;
23425         sd_ssc_t                *ssc;
23426 
23427         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
23428             (un->un_state == SD_STATE_OFFLINE)) {
23429                 return (ENXIO);
23430         }
23431 
23432         SD_TRACE(SD_LOG_IOCTL_DKIO, un, "sd_get_media_info_com: entry\n");
23433 
23434         out_data = kmem_zalloc(SD_PROFILE_HEADER_LEN, KM_SLEEP);
23435         rqbuf = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
23436         ssc = sd_ssc_init(un);
23437 
23438         /* Issue a TUR to determine if the drive is ready with media present */
23439         rval = sd_send_scsi_TEST_UNIT_READY(ssc, SD_CHECK_FOR_MEDIA);
23440         if (rval == ENXIO) {
23441                 goto done;
23442         } else if (rval != 0) {
23443                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
23444         }
23445 
23446         /* Now get configuration data */
23447         if (ISCD(un)) {
23448                 *dki_media_type = DK_CDROM;
23449 
23450                 /* Allow SCMD_GET_CONFIGURATION to MMC devices only */
23451                 if (un->un_f_mmc_cap == TRUE) {
23452                         rtn = sd_send_scsi_GET_CONFIGURATION(ssc, &com, rqbuf,
23453                             SENSE_LENGTH, out_data, SD_PROFILE_HEADER_LEN,
23454                             SD_PATH_STANDARD);
23455 
23456                         if (rtn) {
23457                                 /*
23458                                  * We ignore all failures for CD and need to
23459                                  * put the assessment before processing code
23460                                  * to avoid missing assessment for FMA.
23461                                  */
23462                                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
23463                                 /*
23464                                  * Failed for other than an illegal request
23465                                  * or command not supported
23466                                  */
23467                                 if ((com.uscsi_status == STATUS_CHECK) &&
23468                                     (com.uscsi_rqstatus == STATUS_GOOD)) {
23469                                         if ((rqbuf[2] != KEY_ILLEGAL_REQUEST) ||
23470                                             (rqbuf[12] != 0x20)) {
23471                                                 rval = EIO;
23472                                                 goto no_assessment;
23473                                         }
23474                                 }
23475                         } else {
23476                                 /*
23477                                  * The GET CONFIGURATION command succeeded
23478                                  * so set the media type according to the
23479                                  * returned data
23480                                  */
23481                                 *dki_media_type = out_data[6];
23482                                 *dki_media_type <<= 8;
23483                                 *dki_media_type |= out_data[7];
23484                         }
23485                 }
23486         } else {
23487                 /*
23488                  * The profile list is not available, so we attempt to identify
23489                  * the media type based on the inquiry data
23490                  */
23491                 sinq = un->un_sd->sd_inq;
23492                 if ((sinq->inq_dtype == DTYPE_DIRECT) ||
23493                     (sinq->inq_dtype == DTYPE_OPTICAL)) {
23494                         /* This is a direct access device  or optical disk */
23495                         *dki_media_type = DK_FIXED_DISK;
23496 
23497                         if ((bcmp(sinq->inq_vid, "IOMEGA", 6) == 0) ||
23498                             (bcmp(sinq->inq_vid, "iomega", 6) == 0)) {
23499                                 if ((bcmp(sinq->inq_pid, "ZIP", 3) == 0)) {
23500                                         *dki_media_type = DK_ZIP;
23501                                 } else if (
23502                                     (bcmp(sinq->inq_pid, "jaz", 3) == 0)) {
23503                                         *dki_media_type = DK_JAZ;
23504                                 }
23505                         }
23506                 } else {
23507                         /*
23508                          * Not a CD, direct access or optical disk so return
23509                          * unknown media
23510                          */
23511                         *dki_media_type = DK_UNKNOWN;
23512                 }
23513         }
23514 
23515         /*
23516          * Now read the capacity so we can provide the lbasize,
23517          * pbsize and capacity.
23518          */
23519         if (dki_pbsize && un->un_f_descr_format_supported) {
23520                 rval = sd_send_scsi_READ_CAPACITY_16(ssc, &capacity, &lbasize,
23521                     &pbsize, SD_PATH_DIRECT);
23522 
23523                 /*
23524                  * Override the physical blocksize if the instance already
23525                  * has a larger value.
23526                  */
23527                 pbsize = MAX(pbsize, un->un_phy_blocksize);
23528         }
23529 
23530         if (dki_pbsize == NULL || rval != 0 ||
23531             !un->un_f_descr_format_supported) {
23532                 rval = sd_send_scsi_READ_CAPACITY(ssc, &capacity, &lbasize,
23533                     SD_PATH_DIRECT);
23534 
23535                 switch (rval) {
23536                 case 0:
23537                         if (un->un_f_enable_rmw &&
23538                             un->un_phy_blocksize != 0) {
23539                                 pbsize = un->un_phy_blocksize;
23540                         } else {
23541                                 pbsize = lbasize;
23542                         }
23543                         media_capacity = capacity;
23544 
23545                         /*
23546                          * sd_send_scsi_READ_CAPACITY() reports capacity in
23547                          * un->un_sys_blocksize chunks. So we need to convert
23548                          * it into cap.lbsize chunks.
23549                          */
23550                         if (un->un_f_has_removable_media) {
23551                                 media_capacity *= un->un_sys_blocksize;
23552                                 media_capacity /= lbasize;
23553                         }
23554                         break;
23555                 case EACCES:
23556                         rval = EACCES;
23557                         goto done;
23558                 default:
23559                         rval = EIO;
23560                         goto done;
23561                 }
23562         } else {
23563                 if (un->un_f_enable_rmw &&
23564                     !ISP2(pbsize % DEV_BSIZE)) {
23565                         pbsize = SSD_SECSIZE;
23566                 } else if (!ISP2(lbasize % DEV_BSIZE) ||
23567                     !ISP2(pbsize % DEV_BSIZE)) {
23568                         pbsize = lbasize = DEV_BSIZE;
23569                 }
23570                 media_capacity = capacity;
23571         }
23572 
23573         /*
23574          * If lun is expanded dynamically, update the un structure.
23575          */
23576         mutex_enter(SD_MUTEX(un));
23577         if ((un->un_f_blockcount_is_valid == TRUE) &&
23578             (un->un_f_tgt_blocksize_is_valid == TRUE) &&
23579             (capacity > un->un_blockcount)) {
23580                 un->un_f_expnevent = B_FALSE;
23581                 sd_update_block_info(un, lbasize, capacity);
23582         }
23583         mutex_exit(SD_MUTEX(un));
23584 
23585         *dki_lbsize = lbasize;
23586         *dki_capacity = media_capacity;
23587         if (dki_pbsize)
23588                 *dki_pbsize = pbsize;
23589 
23590 done:
23591         if (rval != 0) {
23592                 if (rval == EIO)
23593                         sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
23594                 else
23595                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
23596         }
23597 no_assessment:
23598         sd_ssc_fini(ssc);
23599         kmem_free(out_data, SD_PROFILE_HEADER_LEN);
23600         kmem_free(rqbuf, SENSE_LENGTH);
23601         return (rval);
23602 }
23603 
23604 /*
23605  *    Function: sd_get_media_info
23606  *
23607  * Description: This routine is the driver entry point for handling ioctl
23608  *              requests for the media type or command set profile used by the
23609  *              drive to operate on the media (DKIOCGMEDIAINFO).
23610  *
23611  *   Arguments: dev     - the device number
23612  *              arg     - pointer to user provided dk_minfo structure
23613  *                        specifying the media type, logical block size and
23614  *                        drive capacity.
23615  *              flag    - this argument is a pass through to ddi_copyxxx()
23616  *                        directly from the mode argument of ioctl().
23617  *
23618  * Return Code: returns the value from sd_get_media_info_com
23619  */
23620 static int
23621 sd_get_media_info(dev_t dev, caddr_t arg, int flag)
23622 {
23623         struct dk_minfo         mi;
23624         int                     rval;
23625 
23626         rval = sd_get_media_info_com(dev, &mi.dki_media_type,
23627             &mi.dki_lbsize, &mi.dki_capacity, NULL);
23628 
23629         if (rval)
23630                 return (rval);
23631         if (ddi_copyout(&mi, arg, sizeof (struct dk_minfo), flag))
23632                 rval = EFAULT;
23633         return (rval);
23634 }
23635 
23636 /*
23637  *    Function: sd_get_media_info_ext
23638  *
23639  * Description: This routine is the driver entry point for handling ioctl
23640  *              requests for the media type or command set profile used by the
23641  *              drive to operate on the media (DKIOCGMEDIAINFOEXT). The
23642  *              difference this ioctl and DKIOCGMEDIAINFO is the return value
23643  *              of this ioctl contains both logical block size and physical
23644  *              block size.
23645  *
23646  *
23647  *   Arguments: dev     - the device number
23648  *              arg     - pointer to user provided dk_minfo_ext structure
23649  *                        specifying the media type, logical block size,
23650  *                        physical block size and disk capacity.
23651  *              flag    - this argument is a pass through to ddi_copyxxx()
23652  *                        directly from the mode argument of ioctl().
23653  *
23654  * Return Code: returns the value from sd_get_media_info_com
23655  */
23656 static int
23657 sd_get_media_info_ext(dev_t dev, caddr_t arg, int flag)
23658 {
23659         struct dk_minfo_ext     mie;
23660         int                     rval = 0;
23661 
23662         rval = sd_get_media_info_com(dev, &mie.dki_media_type,
23663             &mie.dki_lbsize, &mie.dki_capacity, &mie.dki_pbsize);
23664 
23665         if (rval)
23666                 return (rval);
23667         if (ddi_copyout(&mie, arg, sizeof (struct dk_minfo_ext), flag))
23668                 rval = EFAULT;
23669         return (rval);
23670 
23671 }
23672 
23673 /*
23674  *    Function: sd_watch_request_submit
23675  *
23676  * Description: Call scsi_watch_request_submit or scsi_mmc_watch_request_submit
23677  *              depending on which is supported by device.
23678  */
23679 static opaque_t
23680 sd_watch_request_submit(struct sd_lun *un)
23681 {
23682         dev_t                   dev;
23683 
23684         /* All submissions are unified to use same device number */
23685         dev = sd_make_device(SD_DEVINFO(un));
23686 
23687         if (un->un_f_mmc_cap && un->un_f_mmc_gesn_polling) {
23688                 return (scsi_mmc_watch_request_submit(SD_SCSI_DEVP(un),
23689                     sd_check_media_time, SENSE_LENGTH, sd_media_watch_cb,
23690                     (caddr_t)dev));
23691         } else {
23692                 return (scsi_watch_request_submit(SD_SCSI_DEVP(un),
23693                     sd_check_media_time, SENSE_LENGTH, sd_media_watch_cb,
23694                     (caddr_t)dev));
23695         }
23696 }
23697 
23698 
23699 /*
23700  *    Function: sd_check_media
23701  *
23702  * Description: This utility routine implements the functionality for the
23703  *              DKIOCSTATE ioctl. This ioctl blocks the user thread until the
23704  *              driver state changes from that specified by the user
23705  *              (inserted or ejected). For example, if the user specifies
23706  *              DKIO_EJECTED and the current media state is inserted this
23707  *              routine will immediately return DKIO_INSERTED. However, if the
23708  *              current media state is not inserted the user thread will be
23709  *              blocked until the drive state changes. If DKIO_NONE is specified
23710  *              the user thread will block until a drive state change occurs.
23711  *
23712  *   Arguments: dev  - the device number
23713  *              state  - user pointer to a dkio_state, updated with the current
23714  *                      drive state at return.
23715  *
23716  * Return Code: ENXIO
23717  *              EIO
23718  *              EAGAIN
23719  *              EINTR
23720  */
23721 
23722 static int
23723 sd_check_media(dev_t dev, enum dkio_state state)
23724 {
23725         struct sd_lun           *un = NULL;
23726         enum dkio_state         prev_state;
23727         opaque_t                token = NULL;
23728         int                     rval = 0;
23729         sd_ssc_t                *ssc;
23730 
23731         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23732                 return (ENXIO);
23733         }
23734 
23735         SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: entry\n");
23736 
23737         ssc = sd_ssc_init(un);
23738 
23739         mutex_enter(SD_MUTEX(un));
23740 
23741         SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: "
23742             "state=%x, mediastate=%x\n", state, un->un_mediastate);
23743 
23744         prev_state = un->un_mediastate;
23745 
23746         /* is there anything to do? */
23747         if (state == un->un_mediastate || un->un_mediastate == DKIO_NONE) {
23748                 /*
23749                  * submit the request to the scsi_watch service;
23750                  * scsi_media_watch_cb() does the real work
23751                  */
23752                 mutex_exit(SD_MUTEX(un));
23753 
23754                 /*
23755                  * This change handles the case where a scsi watch request is
23756                  * added to a device that is powered down. To accomplish this
23757                  * we power up the device before adding the scsi watch request,
23758                  * since the scsi watch sends a TUR directly to the device
23759                  * which the device cannot handle if it is powered down.
23760                  */
23761                 if (sd_pm_entry(un) != DDI_SUCCESS) {
23762                         mutex_enter(SD_MUTEX(un));
23763                         goto done;
23764                 }
23765 
23766                 token = sd_watch_request_submit(un);
23767 
23768                 sd_pm_exit(un);
23769 
23770                 mutex_enter(SD_MUTEX(un));
23771                 if (token == NULL) {
23772                         rval = EAGAIN;
23773                         goto done;
23774                 }
23775 
23776                 /*
23777                  * This is a special case IOCTL that doesn't return
23778                  * until the media state changes. Routine sdpower
23779                  * knows about and handles this so don't count it
23780                  * as an active cmd in the driver, which would
23781                  * keep the device busy to the pm framework.
23782                  * If the count isn't decremented the device can't
23783                  * be powered down.
23784                  */
23785                 un->un_ncmds_in_driver--;
23786                 ASSERT(un->un_ncmds_in_driver >= 0);
23787 
23788                 /*
23789                  * if a prior request had been made, this will be the same
23790                  * token, as scsi_watch was designed that way.
23791                  */
23792                 un->un_swr_token = token;
23793                 un->un_specified_mediastate = state;
23794 
23795                 /*
23796                  * now wait for media change
23797                  * we will not be signalled unless mediastate == state but it is
23798                  * still better to test for this condition, since there is a
23799                  * 2 sec cv_broadcast delay when mediastate == DKIO_INSERTED
23800                  */
23801                 SD_TRACE(SD_LOG_COMMON, un,
23802                     "sd_check_media: waiting for media state change\n");
23803                 while (un->un_mediastate == state) {
23804                         if (cv_wait_sig(&un->un_state_cv, SD_MUTEX(un)) == 0) {
23805                                 SD_TRACE(SD_LOG_COMMON, un,
23806                                     "sd_check_media: waiting for media state "
23807                                     "was interrupted\n");
23808                                 un->un_ncmds_in_driver++;
23809                                 rval = EINTR;
23810                                 goto done;
23811                         }
23812                         SD_TRACE(SD_LOG_COMMON, un,
23813                             "sd_check_media: received signal, state=%x\n",
23814                             un->un_mediastate);
23815                 }
23816                 /*
23817                  * Inc the counter to indicate the device once again
23818                  * has an active outstanding cmd.
23819                  */
23820                 un->un_ncmds_in_driver++;
23821         }
23822 
23823         /* invalidate geometry */
23824         if (prev_state == DKIO_INSERTED && un->un_mediastate == DKIO_EJECTED) {
23825                 sr_ejected(un);
23826         }
23827 
23828         if (un->un_mediastate == DKIO_INSERTED && prev_state != DKIO_INSERTED) {
23829                 uint64_t        capacity;
23830                 uint_t          lbasize;
23831 
23832                 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: media inserted\n");
23833                 mutex_exit(SD_MUTEX(un));
23834                 /*
23835                  * Since the following routines use SD_PATH_DIRECT, we must
23836                  * call PM directly before the upcoming disk accesses. This
23837                  * may cause the disk to be power/spin up.
23838                  */
23839 
23840                 if (sd_pm_entry(un) == DDI_SUCCESS) {
23841                         rval = sd_send_scsi_READ_CAPACITY(ssc,
23842                             &capacity, &lbasize, SD_PATH_DIRECT);
23843                         if (rval != 0) {
23844                                 sd_pm_exit(un);
23845                                 if (rval == EIO)
23846                                         sd_ssc_assessment(ssc,
23847                                             SD_FMT_STATUS_CHECK);
23848                                 else
23849                                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
23850                                 mutex_enter(SD_MUTEX(un));
23851                                 goto done;
23852                         }
23853                 } else {
23854                         rval = EIO;
23855                         mutex_enter(SD_MUTEX(un));
23856                         goto done;
23857                 }
23858                 mutex_enter(SD_MUTEX(un));
23859 
23860                 sd_update_block_info(un, lbasize, capacity);
23861 
23862                 /*
23863                  *  Check if the media in the device is writable or not
23864                  */
23865                 if (ISCD(un)) {
23866                         sd_check_for_writable_cd(ssc, SD_PATH_DIRECT);
23867                 }
23868 
23869                 mutex_exit(SD_MUTEX(un));
23870                 cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT);
23871                 if ((cmlb_validate(un->un_cmlbhandle, 0,
23872                     (void *)SD_PATH_DIRECT) == 0) && un->un_f_pkstats_enabled) {
23873                         sd_set_pstats(un);
23874                         SD_TRACE(SD_LOG_IO_PARTITION, un,
23875                             "sd_check_media: un:0x%p pstats created and "
23876                             "set\n", un);
23877                 }
23878 
23879                 rval = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT,
23880                     SD_PATH_DIRECT);
23881 
23882                 sd_pm_exit(un);
23883 
23884                 if (rval != 0) {
23885                         if (rval == EIO)
23886                                 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
23887                         else
23888                                 sd_ssc_assessment(ssc, SD_FMT_IGNORE);
23889                 }
23890 
23891                 mutex_enter(SD_MUTEX(un));
23892         }
23893 done:
23894         sd_ssc_fini(ssc);
23895         un->un_f_watcht_stopped = FALSE;
23896         if (token != NULL && un->un_swr_token != NULL) {
23897                 /*
23898                  * Use of this local token and the mutex ensures that we avoid
23899                  * some race conditions associated with terminating the
23900                  * scsi watch.
23901                  */
23902                 token = un->un_swr_token;
23903                 mutex_exit(SD_MUTEX(un));
23904                 (void) scsi_watch_request_terminate(token,
23905                     SCSI_WATCH_TERMINATE_WAIT);
23906                 if (scsi_watch_get_ref_count(token) == 0) {
23907                         mutex_enter(SD_MUTEX(un));
23908                         un->un_swr_token = (opaque_t)NULL;
23909                 } else {
23910                         mutex_enter(SD_MUTEX(un));
23911                 }
23912         }
23913 
23914         /*
23915          * Update the capacity kstat value, if no media previously
23916          * (capacity kstat is 0) and a media has been inserted
23917          * (un_f_blockcount_is_valid == TRUE)
23918          */
23919         if (un->un_errstats) {
23920                 struct sd_errstats      *stp = NULL;
23921 
23922                 stp = (struct sd_errstats *)un->un_errstats->ks_data;
23923                 if ((stp->sd_capacity.value.ui64 == 0) &&
23924                     (un->un_f_blockcount_is_valid == TRUE)) {
23925                         stp->sd_capacity.value.ui64 =
23926                             (uint64_t)((uint64_t)un->un_blockcount *
23927                             un->un_sys_blocksize);
23928                 }
23929         }
23930         mutex_exit(SD_MUTEX(un));
23931         SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: done\n");
23932         return (rval);
23933 }
23934 
23935 
23936 /*
23937  *    Function: sd_delayed_cv_broadcast
23938  *
23939  * Description: Delayed cv_broadcast to allow for target to recover from media
23940  *              insertion.
23941  *
23942  *   Arguments: arg - driver soft state (unit) structure
23943  */
23944 
23945 static void
23946 sd_delayed_cv_broadcast(void *arg)
23947 {
23948         struct sd_lun *un = arg;
23949 
23950         SD_TRACE(SD_LOG_COMMON, un, "sd_delayed_cv_broadcast\n");
23951 
23952         mutex_enter(SD_MUTEX(un));
23953         un->un_dcvb_timeid = NULL;
23954         cv_broadcast(&un->un_state_cv);
23955         mutex_exit(SD_MUTEX(un));
23956 }
23957 
23958 
23959 /*
23960  *    Function: sd_media_watch_cb
23961  *
23962  * Description: Callback routine used for support of the DKIOCSTATE ioctl. This
23963  *              routine processes the TUR sense data and updates the driver
23964  *              state if a transition has occurred. The user thread
23965  *              (sd_check_media) is then signalled.
23966  *
23967  *   Arguments: arg -   the device 'dev_t' is used for context to discriminate
23968  *                      among multiple watches that share this callback function
23969  *              resultp - scsi watch facility result packet containing scsi
23970  *                        packet, status byte and sense data
23971  *
23972  * Return Code: 0 for success, -1 for failure
23973  */
23974 
23975 static int
23976 sd_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp)
23977 {
23978         struct sd_lun                   *un;
23979         struct scsi_status              *statusp = resultp->statusp;
23980         uint8_t                         *sensep = (uint8_t *)resultp->sensep;
23981         enum dkio_state                 state = DKIO_NONE;
23982         dev_t                           dev = (dev_t)arg;
23983         uchar_t                         actual_sense_length;
23984         uint8_t                         skey, asc, ascq;
23985 
23986         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23987                 return (-1);
23988         }
23989         actual_sense_length = resultp->actual_sense_length;
23990 
23991         mutex_enter(SD_MUTEX(un));
23992         SD_TRACE(SD_LOG_COMMON, un,
23993             "sd_media_watch_cb: status=%x, sensep=%p, len=%x\n",
23994             *((char *)statusp), (void *)sensep, actual_sense_length);
23995 
23996         if (resultp->pkt->pkt_reason == CMD_DEV_GONE) {
23997                 un->un_mediastate = DKIO_DEV_GONE;
23998                 cv_broadcast(&un->un_state_cv);
23999                 mutex_exit(SD_MUTEX(un));
24000 
24001                 return (0);
24002         }
24003 
24004         if (un->un_f_mmc_cap && un->un_f_mmc_gesn_polling) {
24005                 if (sd_gesn_media_data_valid(resultp->mmc_data)) {
24006                         if ((resultp->mmc_data[5] &
24007                             SD_GESN_MEDIA_EVENT_STATUS_PRESENT) != 0) {
24008                                 state = DKIO_INSERTED;
24009                         } else {
24010                                 state = DKIO_EJECTED;
24011                         }
24012                         if ((resultp->mmc_data[4] & SD_GESN_MEDIA_EVENT_CODE) ==
24013                             SD_GESN_MEDIA_EVENT_EJECTREQUEST) {
24014                                 sd_log_eject_request_event(un, KM_NOSLEEP);
24015                         }
24016                 }
24017         } else if (sensep != NULL) {
24018                 /*
24019                  * If there was a check condition then sensep points to valid
24020                  * sense data. If status was not a check condition but a
24021                  * reservation or busy status then the new state is DKIO_NONE.
24022                  */
24023                 skey = scsi_sense_key(sensep);
24024                 asc = scsi_sense_asc(sensep);
24025                 ascq = scsi_sense_ascq(sensep);
24026 
24027                 SD_INFO(SD_LOG_COMMON, un,
24028                     "sd_media_watch_cb: sense KEY=%x, ASC=%x, ASCQ=%x\n",
24029                     skey, asc, ascq);
24030                 /* This routine only uses up to 13 bytes of sense data. */
24031                 if (actual_sense_length >= 13) {
24032                         if (skey == KEY_UNIT_ATTENTION) {
24033                                 if (asc == 0x28) {
24034                                         state = DKIO_INSERTED;
24035                                 }
24036                         } else if (skey == KEY_NOT_READY) {
24037                                 /*
24038                                  * Sense data of 02/06/00 means that the
24039                                  * drive could not read the media (No
24040                                  * reference position found). In this case
24041                                  * to prevent a hang on the DKIOCSTATE IOCTL
24042                                  * we set the media state to DKIO_INSERTED.
24043                                  */
24044                                 if (asc == 0x06 && ascq == 0x00)
24045                                         state = DKIO_INSERTED;
24046 
24047                                 /*
24048                                  * if 02/04/02  means that the host
24049                                  * should send start command. Explicitly
24050                                  * leave the media state as is
24051                                  * (inserted) as the media is inserted
24052                                  * and host has stopped device for PM
24053                                  * reasons. Upon next true read/write
24054                                  * to this media will bring the
24055                                  * device to the right state good for
24056                                  * media access.
24057                                  */
24058                                 if (asc == 0x3a) {
24059                                         state = DKIO_EJECTED;
24060                                 } else {
24061                                         /*
24062                                          * If the drive is busy with an
24063                                          * operation or long write, keep the
24064                                          * media in an inserted state.
24065                                          */
24066 
24067                                         if ((asc == 0x04) &&
24068                                             ((ascq == 0x02) ||
24069                                             (ascq == 0x07) ||
24070                                             (ascq == 0x08))) {
24071                                                 state = DKIO_INSERTED;
24072                                         }
24073                                 }
24074                         } else if (skey == KEY_NO_SENSE) {
24075                                 if ((asc == 0x00) && (ascq == 0x00)) {
24076                                         /*
24077                                          * Sense Data 00/00/00 does not provide
24078                                          * any information about the state of
24079                                          * the media. Ignore it.
24080                                          */
24081                                         mutex_exit(SD_MUTEX(un));
24082                                         return (0);
24083                                 }
24084                         }
24085                 }
24086         } else if ((*((char *)statusp) == STATUS_GOOD) &&
24087             (resultp->pkt->pkt_reason == CMD_CMPLT)) {
24088                 state = DKIO_INSERTED;
24089         }
24090 
24091         SD_TRACE(SD_LOG_COMMON, un,
24092             "sd_media_watch_cb: state=%x, specified=%x\n",
24093             state, un->un_specified_mediastate);
24094 
24095         /*
24096          * now signal the waiting thread if this is *not* the specified state;
24097          * delay the signal if the state is DKIO_INSERTED to allow the target
24098          * to recover
24099          */
24100         if (state != un->un_specified_mediastate) {
24101                 un->un_mediastate = state;
24102                 if (state == DKIO_INSERTED) {
24103                         /*
24104                          * delay the signal to give the drive a chance
24105                          * to do what it apparently needs to do
24106                          */
24107                         SD_TRACE(SD_LOG_COMMON, un,
24108                             "sd_media_watch_cb: delayed cv_broadcast\n");
24109                         if (un->un_dcvb_timeid == NULL) {
24110                                 un->un_dcvb_timeid =
24111                                     timeout(sd_delayed_cv_broadcast, un,
24112                                     drv_usectohz((clock_t)MEDIA_ACCESS_DELAY));
24113                         }
24114                 } else {
24115                         SD_TRACE(SD_LOG_COMMON, un,
24116                             "sd_media_watch_cb: immediate cv_broadcast\n");
24117                         cv_broadcast(&un->un_state_cv);
24118                 }
24119         }
24120         mutex_exit(SD_MUTEX(un));
24121         return (0);
24122 }
24123 
24124 
24125 /*
24126  *    Function: sd_dkio_get_temp
24127  *
24128  * Description: This routine is the driver entry point for handling ioctl
24129  *              requests to get the disk temperature.
24130  *
24131  *   Arguments: dev  - the device number
24132  *              arg  - pointer to user provided dk_temperature structure.
24133  *              flag - this argument is a pass through to ddi_copyxxx()
24134  *                     directly from the mode argument of ioctl().
24135  *
24136  * Return Code: 0
24137  *              EFAULT
24138  *              ENXIO
24139  *              EAGAIN
24140  */
24141 
24142 static int
24143 sd_dkio_get_temp(dev_t dev, caddr_t arg, int flag)
24144 {
24145         struct sd_lun           *un = NULL;
24146         struct dk_temperature   *dktemp = NULL;
24147         uchar_t                 *temperature_page;
24148         int                     rval = 0;
24149         int                     path_flag = SD_PATH_STANDARD;
24150         sd_ssc_t                *ssc;
24151 
24152         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24153                 return (ENXIO);
24154         }
24155 
24156         ssc = sd_ssc_init(un);
24157         dktemp = kmem_zalloc(sizeof (struct dk_temperature), KM_SLEEP);
24158 
24159         /* copyin the disk temp argument to get the user flags */
24160         if (ddi_copyin((void *)arg, dktemp,
24161             sizeof (struct dk_temperature), flag) != 0) {
24162                 rval = EFAULT;
24163                 goto done;
24164         }
24165 
24166         /* Initialize the temperature to invalid. */
24167         dktemp->dkt_cur_temp = (short)DKT_INVALID_TEMP;
24168         dktemp->dkt_ref_temp = (short)DKT_INVALID_TEMP;
24169 
24170         /*
24171          * Note: Investigate removing the "bypass pm" semantic.
24172          * Can we just bypass PM always?
24173          */
24174         if (dktemp->dkt_flags & DKT_BYPASS_PM) {
24175                 path_flag = SD_PATH_DIRECT;
24176                 ASSERT(!mutex_owned(&un->un_pm_mutex));
24177                 mutex_enter(&un->un_pm_mutex);
24178                 if (SD_DEVICE_IS_IN_LOW_POWER(un)) {
24179                         /*
24180                          * If DKT_BYPASS_PM is set, and the drive happens to be
24181                          * in low power mode, we can not wake it up, Need to
24182                          * return EAGAIN.
24183                          */
24184                         mutex_exit(&un->un_pm_mutex);
24185                         rval = EAGAIN;
24186                         goto done;
24187                 } else {
24188                         /*
24189                          * Indicate to PM the device is busy. This is required
24190                          * to avoid a race - i.e. the ioctl is issuing a
24191                          * command and the pm framework brings down the device
24192                          * to low power mode (possible power cut-off on some
24193                          * platforms).
24194                          */
24195                         mutex_exit(&un->un_pm_mutex);
24196                         if (sd_pm_entry(un) != DDI_SUCCESS) {
24197                                 rval = EAGAIN;
24198                                 goto done;
24199                         }
24200                 }
24201         }
24202 
24203         temperature_page = kmem_zalloc(TEMPERATURE_PAGE_SIZE, KM_SLEEP);
24204 
24205         rval = sd_send_scsi_LOG_SENSE(ssc, temperature_page,
24206             TEMPERATURE_PAGE_SIZE, TEMPERATURE_PAGE, 1, 0, path_flag);
24207         if (rval != 0)
24208                 goto done2;
24209 
24210         /*
24211          * For the current temperature verify that the parameter length is 0x02
24212          * and the parameter code is 0x00
24213          */
24214         if ((temperature_page[7] == 0x02) && (temperature_page[4] == 0x00) &&
24215             (temperature_page[5] == 0x00)) {
24216                 if (temperature_page[9] == 0xFF) {
24217                         dktemp->dkt_cur_temp = (short)DKT_INVALID_TEMP;
24218                 } else {
24219                         dktemp->dkt_cur_temp = (short)(temperature_page[9]);
24220                 }
24221         }
24222 
24223         /*
24224          * For the reference temperature verify that the parameter
24225          * length is 0x02 and the parameter code is 0x01
24226          */
24227         if ((temperature_page[13] == 0x02) && (temperature_page[10] == 0x00) &&
24228             (temperature_page[11] == 0x01)) {
24229                 if (temperature_page[15] == 0xFF) {
24230                         dktemp->dkt_ref_temp = (short)DKT_INVALID_TEMP;
24231                 } else {
24232                         dktemp->dkt_ref_temp = (short)(temperature_page[15]);
24233                 }
24234         }
24235 
24236         /* Do the copyout regardless of the temperature commands status. */
24237         if (ddi_copyout(dktemp, (void *)arg, sizeof (struct dk_temperature),
24238             flag) != 0) {
24239                 rval = EFAULT;
24240                 goto done1;
24241         }
24242 
24243 done2:
24244         if (rval != 0) {
24245                 if (rval == EIO)
24246                         sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
24247                 else
24248                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
24249         }
24250 done1:
24251         if (path_flag == SD_PATH_DIRECT) {
24252                 sd_pm_exit(un);
24253         }
24254 
24255         kmem_free(temperature_page, TEMPERATURE_PAGE_SIZE);
24256 done:
24257         sd_ssc_fini(ssc);
24258         if (dktemp != NULL) {
24259                 kmem_free(dktemp, sizeof (struct dk_temperature));
24260         }
24261 
24262         return (rval);
24263 }
24264 
24265 
24266 /*
24267  *    Function: sd_log_page_supported
24268  *
24269  * Description: This routine uses sd_send_scsi_LOG_SENSE to find the list of
24270  *              supported log pages.
24271  *
24272  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
24273  *                      structure for this target.
24274  *              log_page -
24275  *
24276  * Return Code: -1 - on error (log sense is optional and may not be supported).
24277  *              0  - log page not found.
24278  *              1  - log page found.
24279  */
24280 
24281 static int
24282 sd_log_page_supported(sd_ssc_t *ssc, int log_page)
24283 {
24284         uchar_t *log_page_data;
24285         int     i;
24286         int     match = 0;
24287         int     log_size;
24288         int     status = 0;
24289         struct sd_lun   *un;
24290 
24291         ASSERT(ssc != NULL);
24292         un = ssc->ssc_un;
24293         ASSERT(un != NULL);
24294 
24295         log_page_data = kmem_zalloc(0xFF, KM_SLEEP);
24296 
24297         status = sd_send_scsi_LOG_SENSE(ssc, log_page_data, 0xFF, 0, 0x01, 0,
24298             SD_PATH_DIRECT);
24299 
24300         if (status != 0) {
24301                 if (status == EIO) {
24302                         /*
24303                          * Some disks do not support log sense, we
24304                          * should ignore this kind of error(sense key is
24305                          * 0x5 - illegal request).
24306                          */
24307                         uint8_t *sensep;
24308                         int senlen;
24309 
24310                         sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf;
24311                         senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen -
24312                             ssc->ssc_uscsi_cmd->uscsi_rqresid);
24313 
24314                         if (senlen > 0 &&
24315                             scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) {
24316                                 sd_ssc_assessment(ssc,
24317                                     SD_FMT_IGNORE_COMPROMISE);
24318                         } else {
24319                                 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
24320                         }
24321                 } else {
24322                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
24323                 }
24324 
24325                 SD_ERROR(SD_LOG_COMMON, un,
24326                     "sd_log_page_supported: failed log page retrieval\n");
24327                 kmem_free(log_page_data, 0xFF);
24328                 return (-1);
24329         }
24330 
24331         log_size = log_page_data[3];
24332 
24333         /*
24334          * The list of supported log pages start from the fourth byte. Check
24335          * until we run out of log pages or a match is found.
24336          */
24337         for (i = 4; (i < (log_size + 4)) && !match; i++) {
24338                 if (log_page_data[i] == log_page) {
24339                         match++;
24340                 }
24341         }
24342         kmem_free(log_page_data, 0xFF);
24343         return (match);
24344 }
24345 
24346 
24347 /*
24348  *    Function: sd_mhdioc_failfast
24349  *
24350  * Description: This routine is the driver entry point for handling ioctl
24351  *              requests to enable/disable the multihost failfast option.
24352  *              (MHIOCENFAILFAST)
24353  *
24354  *   Arguments: dev     - the device number
24355  *              arg     - user specified probing interval.
24356  *              flag    - this argument is a pass through to ddi_copyxxx()
24357  *                        directly from the mode argument of ioctl().
24358  *
24359  * Return Code: 0
24360  *              EFAULT
24361  *              ENXIO
24362  */
24363 
24364 static int
24365 sd_mhdioc_failfast(dev_t dev, caddr_t arg, int flag)
24366 {
24367         struct sd_lun   *un = NULL;
24368         int             mh_time;
24369         int             rval = 0;
24370 
24371         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24372                 return (ENXIO);
24373         }
24374 
24375         if (ddi_copyin((void *)arg, &mh_time, sizeof (int), flag))
24376                 return (EFAULT);
24377 
24378         if (mh_time) {
24379                 mutex_enter(SD_MUTEX(un));
24380                 un->un_resvd_status |= SD_FAILFAST;
24381                 mutex_exit(SD_MUTEX(un));
24382                 /*
24383                  * If mh_time is INT_MAX, then this ioctl is being used for
24384                  * SCSI-3 PGR purposes, and we don't need to spawn watch thread.
24385                  */
24386                 if (mh_time != INT_MAX) {
24387                         rval = sd_check_mhd(dev, mh_time);
24388                 }
24389         } else {
24390                 (void) sd_check_mhd(dev, 0);
24391                 mutex_enter(SD_MUTEX(un));
24392                 un->un_resvd_status &= ~SD_FAILFAST;
24393                 mutex_exit(SD_MUTEX(un));
24394         }
24395         return (rval);
24396 }
24397 
24398 
24399 /*
24400  *    Function: sd_mhdioc_takeown
24401  *
24402  * Description: This routine is the driver entry point for handling ioctl
24403  *              requests to forcefully acquire exclusive access rights to the
24404  *              multihost disk (MHIOCTKOWN).
24405  *
24406  *   Arguments: dev     - the device number
24407  *              arg     - user provided structure specifying the delay
24408  *                        parameters in milliseconds
24409  *              flag    - this argument is a pass through to ddi_copyxxx()
24410  *                        directly from the mode argument of ioctl().
24411  *
24412  * Return Code: 0
24413  *              EFAULT
24414  *              ENXIO
24415  */
24416 
24417 static int
24418 sd_mhdioc_takeown(dev_t dev, caddr_t arg, int flag)
24419 {
24420         struct sd_lun           *un = NULL;
24421         struct mhioctkown       *tkown = NULL;
24422         int                     rval = 0;
24423 
24424         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24425                 return (ENXIO);
24426         }
24427 
24428         if (arg != NULL) {
24429                 tkown = (struct mhioctkown *)
24430                     kmem_zalloc(sizeof (struct mhioctkown), KM_SLEEP);
24431                 rval = ddi_copyin(arg, tkown, sizeof (struct mhioctkown), flag);
24432                 if (rval != 0) {
24433                         rval = EFAULT;
24434                         goto error;
24435                 }
24436         }
24437 
24438         rval = sd_take_ownership(dev, tkown);
24439         mutex_enter(SD_MUTEX(un));
24440         if (rval == 0) {
24441                 un->un_resvd_status |= SD_RESERVE;
24442                 if (tkown != NULL && tkown->reinstate_resv_delay != 0) {
24443                         sd_reinstate_resv_delay =
24444                             tkown->reinstate_resv_delay * 1000;
24445                 } else {
24446                         sd_reinstate_resv_delay = SD_REINSTATE_RESV_DELAY;
24447                 }
24448                 /*
24449                  * Give the scsi_watch routine interval set by
24450                  * the MHIOCENFAILFAST ioctl precedence here.
24451                  */
24452                 if ((un->un_resvd_status & SD_FAILFAST) == 0) {
24453                         mutex_exit(SD_MUTEX(un));
24454                         (void) sd_check_mhd(dev, sd_reinstate_resv_delay/1000);
24455                         SD_TRACE(SD_LOG_IOCTL_MHD, un,
24456                             "sd_mhdioc_takeown : %d\n",
24457                             sd_reinstate_resv_delay);
24458                 } else {
24459                         mutex_exit(SD_MUTEX(un));
24460                 }
24461                 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_NOTIFY,
24462                     sd_mhd_reset_notify_cb, (caddr_t)un);
24463         } else {
24464                 un->un_resvd_status &= ~SD_RESERVE;
24465                 mutex_exit(SD_MUTEX(un));
24466         }
24467 
24468 error:
24469         if (tkown != NULL) {
24470                 kmem_free(tkown, sizeof (struct mhioctkown));
24471         }
24472         return (rval);
24473 }
24474 
24475 
24476 /*
24477  *    Function: sd_mhdioc_release
24478  *
24479  * Description: This routine is the driver entry point for handling ioctl
24480  *              requests to release exclusive access rights to the multihost
24481  *              disk (MHIOCRELEASE).
24482  *
24483  *   Arguments: dev     - the device number
24484  *
24485  * Return Code: 0
24486  *              ENXIO
24487  */
24488 
24489 static int
24490 sd_mhdioc_release(dev_t dev)
24491 {
24492         struct sd_lun           *un = NULL;
24493         timeout_id_t            resvd_timeid_save;
24494         int                     resvd_status_save;
24495         int                     rval = 0;
24496 
24497         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24498                 return (ENXIO);
24499         }
24500 
24501         mutex_enter(SD_MUTEX(un));
24502         resvd_status_save = un->un_resvd_status;
24503         un->un_resvd_status &=
24504             ~(SD_RESERVE | SD_LOST_RESERVE | SD_WANT_RESERVE);
24505         if (un->un_resvd_timeid) {
24506                 resvd_timeid_save = un->un_resvd_timeid;
24507                 un->un_resvd_timeid = NULL;
24508                 mutex_exit(SD_MUTEX(un));
24509                 (void) untimeout(resvd_timeid_save);
24510         } else {
24511                 mutex_exit(SD_MUTEX(un));
24512         }
24513 
24514         /*
24515          * destroy any pending timeout thread that may be attempting to
24516          * reinstate reservation on this device.
24517          */
24518         sd_rmv_resv_reclaim_req(dev);
24519 
24520         if ((rval = sd_reserve_release(dev, SD_RELEASE)) == 0) {
24521                 mutex_enter(SD_MUTEX(un));
24522                 if ((un->un_mhd_token) &&
24523                     ((un->un_resvd_status & SD_FAILFAST) == 0)) {
24524                         mutex_exit(SD_MUTEX(un));
24525                         (void) sd_check_mhd(dev, 0);
24526                 } else {
24527                         mutex_exit(SD_MUTEX(un));
24528                 }
24529                 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_CANCEL,
24530                     sd_mhd_reset_notify_cb, (caddr_t)un);
24531         } else {
24532                 /*
24533                  * sd_mhd_watch_cb will restart the resvd recover timeout thread
24534                  */
24535                 mutex_enter(SD_MUTEX(un));
24536                 un->un_resvd_status = resvd_status_save;
24537                 mutex_exit(SD_MUTEX(un));
24538         }
24539         return (rval);
24540 }
24541 
24542 
24543 /*
24544  *    Function: sd_mhdioc_register_devid
24545  *
24546  * Description: This routine is the driver entry point for handling ioctl
24547  *              requests to register the device id (MHIOCREREGISTERDEVID).
24548  *
24549  *              Note: The implementation for this ioctl has been updated to
24550  *              be consistent with the original PSARC case (1999/357)
24551  *              (4375899, 4241671, 4220005)
24552  *
24553  *   Arguments: dev     - the device number
24554  *
24555  * Return Code: 0
24556  *              ENXIO
24557  */
24558 
24559 static int
24560 sd_mhdioc_register_devid(dev_t dev)
24561 {
24562         struct sd_lun   *un = NULL;
24563         int             rval = 0;
24564         sd_ssc_t        *ssc;
24565 
24566         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24567                 return (ENXIO);
24568         }
24569 
24570         ASSERT(!mutex_owned(SD_MUTEX(un)));
24571 
24572         mutex_enter(SD_MUTEX(un));
24573 
24574         /* If a devid already exists, de-register it */
24575         if (un->un_devid != NULL) {
24576                 ddi_devid_unregister(SD_DEVINFO(un));
24577                 /*
24578                  * After unregister devid, needs to free devid memory
24579                  */
24580                 ddi_devid_free(un->un_devid);
24581                 un->un_devid = NULL;
24582         }
24583 
24584         /* Check for reservation conflict */
24585         mutex_exit(SD_MUTEX(un));
24586         ssc = sd_ssc_init(un);
24587         rval = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
24588         mutex_enter(SD_MUTEX(un));
24589 
24590         switch (rval) {
24591         case 0:
24592                 sd_register_devid(ssc, SD_DEVINFO(un), SD_TARGET_IS_UNRESERVED);
24593                 break;
24594         case EACCES:
24595                 break;
24596         default:
24597                 rval = EIO;
24598         }
24599 
24600         mutex_exit(SD_MUTEX(un));
24601         if (rval != 0) {
24602                 if (rval == EIO)
24603                         sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
24604                 else
24605                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
24606         }
24607         sd_ssc_fini(ssc);
24608         return (rval);
24609 }
24610 
24611 
24612 /*
24613  *    Function: sd_mhdioc_inkeys
24614  *
24615  * Description: This routine is the driver entry point for handling ioctl
24616  *              requests to issue the SCSI-3 Persistent In Read Keys command
24617  *              to the device (MHIOCGRP_INKEYS).
24618  *
24619  *   Arguments: dev     - the device number
24620  *              arg     - user provided in_keys structure
24621  *              flag    - this argument is a pass through to ddi_copyxxx()
24622  *                        directly from the mode argument of ioctl().
24623  *
24624  * Return Code: code returned by sd_persistent_reservation_in_read_keys()
24625  *              ENXIO
24626  *              EFAULT
24627  */
24628 
24629 static int
24630 sd_mhdioc_inkeys(dev_t dev, caddr_t arg, int flag)
24631 {
24632         struct sd_lun           *un;
24633         mhioc_inkeys_t          inkeys;
24634         int                     rval = 0;
24635 
24636         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24637                 return (ENXIO);
24638         }
24639 
24640 #ifdef _MULTI_DATAMODEL
24641         switch (ddi_model_convert_from(flag & FMODELS)) {
24642         case DDI_MODEL_ILP32: {
24643                 struct mhioc_inkeys32   inkeys32;
24644 
24645                 if (ddi_copyin(arg, &inkeys32,
24646                     sizeof (struct mhioc_inkeys32), flag) != 0) {
24647                         return (EFAULT);
24648                 }
24649                 inkeys.li = (mhioc_key_list_t *)(uintptr_t)inkeys32.li;
24650                 if ((rval = sd_persistent_reservation_in_read_keys(un,
24651                     &inkeys, flag)) != 0) {
24652                         return (rval);
24653                 }
24654                 inkeys32.generation = inkeys.generation;
24655                 if (ddi_copyout(&inkeys32, arg, sizeof (struct mhioc_inkeys32),
24656                     flag) != 0) {
24657                         return (EFAULT);
24658                 }
24659                 break;
24660         }
24661         case DDI_MODEL_NONE:
24662                 if (ddi_copyin(arg, &inkeys, sizeof (mhioc_inkeys_t),
24663                     flag) != 0) {
24664                         return (EFAULT);
24665                 }
24666                 if ((rval = sd_persistent_reservation_in_read_keys(un,
24667                     &inkeys, flag)) != 0) {
24668                         return (rval);
24669                 }
24670                 if (ddi_copyout(&inkeys, arg, sizeof (mhioc_inkeys_t),
24671                     flag) != 0) {
24672                         return (EFAULT);
24673                 }
24674                 break;
24675         }
24676 
24677 #else /* ! _MULTI_DATAMODEL */
24678 
24679         if (ddi_copyin(arg, &inkeys, sizeof (mhioc_inkeys_t), flag) != 0) {
24680                 return (EFAULT);
24681         }
24682         rval = sd_persistent_reservation_in_read_keys(un, &inkeys, flag);
24683         if (rval != 0) {
24684                 return (rval);
24685         }
24686         if (ddi_copyout(&inkeys, arg, sizeof (mhioc_inkeys_t), flag) != 0) {
24687                 return (EFAULT);
24688         }
24689 
24690 #endif /* _MULTI_DATAMODEL */
24691 
24692         return (rval);
24693 }
24694 
24695 
24696 /*
24697  *    Function: sd_mhdioc_inresv
24698  *
24699  * Description: This routine is the driver entry point for handling ioctl
24700  *              requests to issue the SCSI-3 Persistent In Read Reservations
24701  *              command to the device (MHIOCGRP_INKEYS).
24702  *
24703  *   Arguments: dev     - the device number
24704  *              arg     - user provided in_resv structure
24705  *              flag    - this argument is a pass through to ddi_copyxxx()
24706  *                        directly from the mode argument of ioctl().
24707  *
24708  * Return Code: code returned by sd_persistent_reservation_in_read_resv()
24709  *              ENXIO
24710  *              EFAULT
24711  */
24712 
24713 static int
24714 sd_mhdioc_inresv(dev_t dev, caddr_t arg, int flag)
24715 {
24716         struct sd_lun           *un;
24717         mhioc_inresvs_t         inresvs;
24718         int                     rval = 0;
24719 
24720         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24721                 return (ENXIO);
24722         }
24723 
24724 #ifdef _MULTI_DATAMODEL
24725 
24726         switch (ddi_model_convert_from(flag & FMODELS)) {
24727         case DDI_MODEL_ILP32: {
24728                 struct mhioc_inresvs32  inresvs32;
24729 
24730                 if (ddi_copyin(arg, &inresvs32,
24731                     sizeof (struct mhioc_inresvs32), flag) != 0) {
24732                         return (EFAULT);
24733                 }
24734                 inresvs.li = (mhioc_resv_desc_list_t *)(uintptr_t)inresvs32.li;
24735                 if ((rval = sd_persistent_reservation_in_read_resv(un,
24736                     &inresvs, flag)) != 0) {
24737                         return (rval);
24738                 }
24739                 inresvs32.generation = inresvs.generation;
24740                 if (ddi_copyout(&inresvs32, arg,
24741                     sizeof (struct mhioc_inresvs32), flag) != 0) {
24742                         return (EFAULT);
24743                 }
24744                 break;
24745         }
24746         case DDI_MODEL_NONE:
24747                 if (ddi_copyin(arg, &inresvs,
24748                     sizeof (mhioc_inresvs_t), flag) != 0) {
24749                         return (EFAULT);
24750                 }
24751                 if ((rval = sd_persistent_reservation_in_read_resv(un,
24752                     &inresvs, flag)) != 0) {
24753                         return (rval);
24754                 }
24755                 if (ddi_copyout(&inresvs, arg,
24756                     sizeof (mhioc_inresvs_t), flag) != 0) {
24757                         return (EFAULT);
24758                 }
24759                 break;
24760         }
24761 
24762 #else /* ! _MULTI_DATAMODEL */
24763 
24764         if (ddi_copyin(arg, &inresvs, sizeof (mhioc_inresvs_t), flag) != 0) {
24765                 return (EFAULT);
24766         }
24767         rval = sd_persistent_reservation_in_read_resv(un, &inresvs, flag);
24768         if (rval != 0) {
24769                 return (rval);
24770         }
24771         if (ddi_copyout(&inresvs, arg, sizeof (mhioc_inresvs_t), flag)) {
24772                 return (EFAULT);
24773         }
24774 
24775 #endif /* ! _MULTI_DATAMODEL */
24776 
24777         return (rval);
24778 }
24779 
24780 
24781 /*
24782  * The following routines support the clustering functionality described below
24783  * and implement lost reservation reclaim functionality.
24784  *
24785  * Clustering
24786  * ----------
24787  * The clustering code uses two different, independent forms of SCSI
24788  * reservation. Traditional SCSI-2 Reserve/Release and the newer SCSI-3
24789  * Persistent Group Reservations. For any particular disk, it will use either
24790  * SCSI-2 or SCSI-3 PGR but never both at the same time for the same disk.
24791  *
24792  * SCSI-2
24793  * The cluster software takes ownership of a multi-hosted disk by issuing the
24794  * MHIOCTKOWN ioctl to the disk driver. It releases ownership by issuing the
24795  * MHIOCRELEASE ioctl.  Closely related is the MHIOCENFAILFAST ioctl -- a
24796  * cluster, just after taking ownership of the disk with the MHIOCTKOWN ioctl
24797  * then issues the MHIOCENFAILFAST ioctl.  This ioctl "enables failfast" in the
24798  * driver. The meaning of failfast is that if the driver (on this host) ever
24799  * encounters the scsi error return code RESERVATION_CONFLICT from the device,
24800  * it should immediately panic the host. The motivation for this ioctl is that
24801  * if this host does encounter reservation conflict, the underlying cause is
24802  * that some other host of the cluster has decided that this host is no longer
24803  * in the cluster and has seized control of the disks for itself. Since this
24804  * host is no longer in the cluster, it ought to panic itself. The
24805  * MHIOCENFAILFAST ioctl does two things:
24806  *      (a) it sets a flag that will cause any returned RESERVATION_CONFLICT
24807  *      error to panic the host
24808  *      (b) it sets up a periodic timer to test whether this host still has
24809  *      "access" (in that no other host has reserved the device):  if the
24810  *      periodic timer gets RESERVATION_CONFLICT, the host is panicked. The
24811  *      purpose of that periodic timer is to handle scenarios where the host is
24812  *      otherwise temporarily quiescent, temporarily doing no real i/o.
24813  * The MHIOCTKOWN ioctl will "break" a reservation that is held by another host,
24814  * by issuing a SCSI Bus Device Reset.  It will then issue a SCSI Reserve for
24815  * the device itself.
24816  *
24817  * SCSI-3 PGR
24818  * A direct semantic implementation of the SCSI-3 Persistent Reservation
24819  * facility is supported through the shared multihost disk ioctls
24820  * (MHIOCGRP_INKEYS, MHIOCGRP_INRESV, MHIOCGRP_REGISTER, MHIOCGRP_RESERVE,
24821  * MHIOCGRP_PREEMPTANDABORT, MHIOCGRP_CLEAR)
24822  *
24823  * Reservation Reclaim:
24824  * --------------------
24825  * To support the lost reservation reclaim operations this driver creates a
24826  * single thread to handle reinstating reservations on all devices that have
24827  * lost reservations sd_resv_reclaim_requests are logged for all devices that
24828  * have LOST RESERVATIONS when the scsi watch facility callsback sd_mhd_watch_cb
24829  * and the reservation reclaim thread loops through the requests to regain the
24830  * lost reservations.
24831  */
24832 
24833 /*
24834  *    Function: sd_check_mhd()
24835  *
24836  * Description: This function sets up and submits a scsi watch request or
24837  *              terminates an existing watch request. This routine is used in
24838  *              support of reservation reclaim.
24839  *
24840  *   Arguments: dev    - the device 'dev_t' is used for context to discriminate
24841  *                       among multiple watches that share the callback function
24842  *              interval - the number of microseconds specifying the watch
24843  *                         interval for issuing TEST UNIT READY commands. If
24844  *                         set to 0 the watch should be terminated. If the
24845  *                         interval is set to 0 and if the device is required
24846  *                         to hold reservation while disabling failfast, the
24847  *                         watch is restarted with an interval of
24848  *                         reinstate_resv_delay.
24849  *
24850  * Return Code: 0          - Successful submit/terminate of scsi watch request
24851  *              ENXIO      - Indicates an invalid device was specified
24852  *              EAGAIN     - Unable to submit the scsi watch request
24853  */
24854 
24855 static int
24856 sd_check_mhd(dev_t dev, int interval)
24857 {
24858         struct sd_lun   *un;
24859         opaque_t        token;
24860 
24861         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24862                 return (ENXIO);
24863         }
24864 
24865         /* is this a watch termination request? */
24866         if (interval == 0) {
24867                 mutex_enter(SD_MUTEX(un));
24868                 /* if there is an existing watch task then terminate it */
24869                 if (un->un_mhd_token) {
24870                         token = un->un_mhd_token;
24871                         un->un_mhd_token = NULL;
24872                         mutex_exit(SD_MUTEX(un));
24873                         (void) scsi_watch_request_terminate(token,
24874                             SCSI_WATCH_TERMINATE_ALL_WAIT);
24875                         mutex_enter(SD_MUTEX(un));
24876                 } else {
24877                         mutex_exit(SD_MUTEX(un));
24878                         /*
24879                          * Note: If we return here we don't check for the
24880                          * failfast case. This is the original legacy
24881                          * implementation but perhaps we should be checking
24882                          * the failfast case.
24883                          */
24884                         return (0);
24885                 }
24886                 /*
24887                  * If the device is required to hold reservation while
24888                  * disabling failfast, we need to restart the scsi_watch
24889                  * routine with an interval of reinstate_resv_delay.
24890                  */
24891                 if (un->un_resvd_status & SD_RESERVE) {
24892                         interval = sd_reinstate_resv_delay/1000;
24893                 } else {
24894                         /* no failfast so bail */
24895                         mutex_exit(SD_MUTEX(un));
24896                         return (0);
24897                 }
24898                 mutex_exit(SD_MUTEX(un));
24899         }
24900 
24901         /*
24902          * adjust minimum time interval to 1 second,
24903          * and convert from msecs to usecs
24904          */
24905         if (interval > 0 && interval < 1000) {
24906                 interval = 1000;
24907         }
24908         interval *= 1000;
24909 
24910         /*
24911          * submit the request to the scsi_watch service
24912          */
24913         token = scsi_watch_request_submit(SD_SCSI_DEVP(un), interval,
24914             SENSE_LENGTH, sd_mhd_watch_cb, (caddr_t)dev);
24915         if (token == NULL) {
24916                 return (EAGAIN);
24917         }
24918 
24919         /*
24920          * save token for termination later on
24921          */
24922         mutex_enter(SD_MUTEX(un));
24923         un->un_mhd_token = token;
24924         mutex_exit(SD_MUTEX(un));
24925         return (0);
24926 }
24927 
24928 
24929 /*
24930  *    Function: sd_mhd_watch_cb()
24931  *
24932  * Description: This function is the call back function used by the scsi watch
24933  *              facility. The scsi watch facility sends the "Test Unit Ready"
24934  *              and processes the status. If applicable (i.e. a "Unit Attention"
24935  *              status and automatic "Request Sense" not used) the scsi watch
24936  *              facility will send a "Request Sense" and retrieve the sense data
24937  *              to be passed to this callback function. In either case the
24938  *              automatic "Request Sense" or the facility submitting one, this
24939  *              callback is passed the status and sense data.
24940  *
24941  *   Arguments: arg -   the device 'dev_t' is used for context to discriminate
24942  *                      among multiple watches that share this callback function
24943  *              resultp - scsi watch facility result packet containing scsi
24944  *                        packet, status byte and sense data
24945  *
24946  * Return Code: 0 - continue the watch task
24947  *              non-zero - terminate the watch task
24948  */
24949 
24950 static int
24951 sd_mhd_watch_cb(caddr_t arg, struct scsi_watch_result *resultp)
24952 {
24953         struct sd_lun                   *un;
24954         struct scsi_status              *statusp;
24955         uint8_t                         *sensep;
24956         struct scsi_pkt                 *pkt;
24957         uchar_t                         actual_sense_length;
24958         dev_t                           dev = (dev_t)arg;
24959 
24960         ASSERT(resultp != NULL);
24961         statusp                 = resultp->statusp;
24962         sensep                  = (uint8_t *)resultp->sensep;
24963         pkt                     = resultp->pkt;
24964         actual_sense_length     = resultp->actual_sense_length;
24965 
24966         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24967                 return (ENXIO);
24968         }
24969 
24970         SD_TRACE(SD_LOG_IOCTL_MHD, un,
24971             "sd_mhd_watch_cb: reason '%s', status '%s'\n",
24972             scsi_rname(pkt->pkt_reason), sd_sname(*((unsigned char *)statusp)));
24973 
24974         /* Begin processing of the status and/or sense data */
24975         if (pkt->pkt_reason != CMD_CMPLT) {
24976                 /* Handle the incomplete packet */
24977                 sd_mhd_watch_incomplete(un, pkt);
24978                 return (0);
24979         } else if (*((unsigned char *)statusp) != STATUS_GOOD) {
24980                 if (*((unsigned char *)statusp)
24981                     == STATUS_RESERVATION_CONFLICT) {
24982                         /*
24983                          * Handle a reservation conflict by panicking if
24984                          * configured for failfast or by logging the conflict
24985                          * and updating the reservation status
24986                          */
24987                         mutex_enter(SD_MUTEX(un));
24988                         if ((un->un_resvd_status & SD_FAILFAST) &&
24989                             (sd_failfast_enable)) {
24990                                 sd_panic_for_res_conflict(un);
24991                                 /*NOTREACHED*/
24992                         }
24993                         SD_INFO(SD_LOG_IOCTL_MHD, un,
24994                             "sd_mhd_watch_cb: Reservation Conflict\n");
24995                         un->un_resvd_status |= SD_RESERVATION_CONFLICT;
24996                         mutex_exit(SD_MUTEX(un));
24997                 }
24998         }
24999 
25000         if (sensep != NULL) {
25001                 if (actual_sense_length >= (SENSE_LENGTH - 2)) {
25002                         mutex_enter(SD_MUTEX(un));
25003                         if ((scsi_sense_asc(sensep) ==
25004                             SD_SCSI_RESET_SENSE_CODE) &&
25005                             (un->un_resvd_status & SD_RESERVE)) {
25006                                 /*
25007                                  * The additional sense code indicates a power
25008                                  * on or bus device reset has occurred; update
25009                                  * the reservation status.
25010                                  */
25011                                 un->un_resvd_status |=
25012                                     (SD_LOST_RESERVE | SD_WANT_RESERVE);
25013                                 SD_INFO(SD_LOG_IOCTL_MHD, un,
25014                                     "sd_mhd_watch_cb: Lost Reservation\n");
25015                         }
25016                 } else {
25017                         return (0);
25018                 }
25019         } else {
25020                 mutex_enter(SD_MUTEX(un));
25021         }
25022 
25023         if ((un->un_resvd_status & SD_RESERVE) &&
25024             (un->un_resvd_status & SD_LOST_RESERVE)) {
25025                 if (un->un_resvd_status & SD_WANT_RESERVE) {
25026                         /*
25027                          * A reset occurred in between the last probe and this
25028                          * one so if a timeout is pending cancel it.
25029                          */
25030                         if (un->un_resvd_timeid) {
25031                                 timeout_id_t temp_id = un->un_resvd_timeid;
25032                                 un->un_resvd_timeid = NULL;
25033                                 mutex_exit(SD_MUTEX(un));
25034                                 (void) untimeout(temp_id);
25035                                 mutex_enter(SD_MUTEX(un));
25036                         }
25037                         un->un_resvd_status &= ~SD_WANT_RESERVE;
25038                 }
25039                 if (un->un_resvd_timeid == 0) {
25040                         /* Schedule a timeout to handle the lost reservation */
25041                         un->un_resvd_timeid = timeout(sd_mhd_resvd_recover,
25042                             (void *)dev,
25043                             drv_usectohz(sd_reinstate_resv_delay));
25044                 }
25045         }
25046         mutex_exit(SD_MUTEX(un));
25047         return (0);
25048 }
25049 
25050 
25051 /*
25052  *    Function: sd_mhd_watch_incomplete()
25053  *
25054  * Description: This function is used to find out why a scsi pkt sent by the
25055  *              scsi watch facility was not completed. Under some scenarios this
25056  *              routine will return. Otherwise it will send a bus reset to see
25057  *              if the drive is still online.
25058  *
25059  *   Arguments: un  - driver soft state (unit) structure
25060  *              pkt - incomplete scsi pkt
25061  */
25062 
25063 static void
25064 sd_mhd_watch_incomplete(struct sd_lun *un, struct scsi_pkt *pkt)
25065 {
25066         int     be_chatty;
25067         int     perr;
25068 
25069         ASSERT(pkt != NULL);
25070         ASSERT(un != NULL);
25071         be_chatty       = (!(pkt->pkt_flags & FLAG_SILENT));
25072         perr            = (pkt->pkt_statistics & STAT_PERR);
25073 
25074         mutex_enter(SD_MUTEX(un));
25075         if (un->un_state == SD_STATE_DUMPING) {
25076                 mutex_exit(SD_MUTEX(un));
25077                 return;
25078         }
25079 
25080         switch (pkt->pkt_reason) {
25081         case CMD_UNX_BUS_FREE:
25082                 /*
25083                  * If we had a parity error that caused the target to drop BSY*,
25084                  * don't be chatty about it.
25085                  */
25086                 if (perr && be_chatty) {
25087                         be_chatty = 0;
25088                 }
25089                 break;
25090         case CMD_TAG_REJECT:
25091                 /*
25092                  * The SCSI-2 spec states that a tag reject will be sent by the
25093                  * target if tagged queuing is not supported. A tag reject may
25094                  * also be sent during certain initialization periods or to
25095                  * control internal resources. For the latter case the target
25096                  * may also return Queue Full.
25097                  *
25098                  * If this driver receives a tag reject from a target that is
25099                  * going through an init period or controlling internal
25100                  * resources tagged queuing will be disabled. This is a less
25101                  * than optimal behavior but the driver is unable to determine
25102                  * the target state and assumes tagged queueing is not supported
25103                  */
25104                 pkt->pkt_flags = 0;
25105                 un->un_tagflags = 0;
25106 
25107                 if (un->un_f_opt_queueing == TRUE) {
25108                         un->un_throttle = min(un->un_throttle, 3);
25109                 } else {
25110                         un->un_throttle = 1;
25111                 }
25112                 mutex_exit(SD_MUTEX(un));
25113                 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1);
25114                 mutex_enter(SD_MUTEX(un));
25115                 break;
25116         case CMD_INCOMPLETE:
25117                 /*
25118                  * The transport stopped with an abnormal state, fallthrough and
25119                  * reset the target and/or bus unless selection did not complete
25120                  * (indicated by STATE_GOT_BUS) in which case we don't want to
25121                  * go through a target/bus reset
25122                  */
25123                 if (pkt->pkt_state == STATE_GOT_BUS) {
25124                         break;
25125                 }
25126                 /*FALLTHROUGH*/
25127 
25128         case CMD_TIMEOUT:
25129         default:
25130                 /*
25131                  * The lun may still be running the command, so a lun reset
25132                  * should be attempted. If the lun reset fails or cannot be
25133                  * issued, than try a target reset. Lastly try a bus reset.
25134                  */
25135                 if ((pkt->pkt_statistics &
25136                     (STAT_BUS_RESET|STAT_DEV_RESET|STAT_ABORTED)) == 0) {
25137                         int reset_retval = 0;
25138                         mutex_exit(SD_MUTEX(un));
25139                         if (un->un_f_allow_bus_device_reset == TRUE) {
25140                                 if (un->un_f_lun_reset_enabled == TRUE) {
25141                                         reset_retval =
25142                                             scsi_reset(SD_ADDRESS(un),
25143                                             RESET_LUN);
25144                                 }
25145                                 if (reset_retval == 0) {
25146                                         reset_retval =
25147                                             scsi_reset(SD_ADDRESS(un),
25148                                             RESET_TARGET);
25149                                 }
25150                         }
25151                         if (reset_retval == 0) {
25152                                 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
25153                         }
25154                         mutex_enter(SD_MUTEX(un));
25155                 }
25156                 break;
25157         }
25158 
25159         /* A device/bus reset has occurred; update the reservation status. */
25160         if ((pkt->pkt_reason == CMD_RESET) || (pkt->pkt_statistics &
25161             (STAT_BUS_RESET | STAT_DEV_RESET))) {
25162                 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
25163                         un->un_resvd_status |=
25164                             (SD_LOST_RESERVE | SD_WANT_RESERVE);
25165                         SD_INFO(SD_LOG_IOCTL_MHD, un,
25166                             "sd_mhd_watch_incomplete: Lost Reservation\n");
25167                 }
25168         }
25169 
25170         /*
25171          * The disk has been turned off; Update the device state.
25172          *
25173          * Note: Should we be offlining the disk here?
25174          */
25175         if (pkt->pkt_state == STATE_GOT_BUS) {
25176                 SD_INFO(SD_LOG_IOCTL_MHD, un, "sd_mhd_watch_incomplete: "
25177                     "Disk not responding to selection\n");
25178                 if (un->un_state != SD_STATE_OFFLINE) {
25179                         New_state(un, SD_STATE_OFFLINE);
25180                 }
25181         } else if (be_chatty) {
25182                 /*
25183                  * suppress messages if they are all the same pkt reason;
25184                  * with TQ, many (up to 256) are returned with the same
25185                  * pkt_reason
25186                  */
25187                 if (pkt->pkt_reason != un->un_last_pkt_reason) {
25188                         SD_ERROR(SD_LOG_IOCTL_MHD, un,
25189                             "sd_mhd_watch_incomplete: "
25190                             "SCSI transport failed: reason '%s'\n",
25191                             scsi_rname(pkt->pkt_reason));
25192                 }
25193         }
25194         un->un_last_pkt_reason = pkt->pkt_reason;
25195         mutex_exit(SD_MUTEX(un));
25196 }
25197 
25198 
25199 /*
25200  *    Function: sd_sname()
25201  *
25202  * Description: This is a simple little routine to return a string containing
25203  *              a printable description of command status byte for use in
25204  *              logging.
25205  *
25206  *   Arguments: status - pointer to a status byte
25207  *
25208  * Return Code: char * - string containing status description.
25209  */
25210 
25211 static char *
25212 sd_sname(uchar_t status)
25213 {
25214         switch (status & STATUS_MASK) {
25215         case STATUS_GOOD:
25216                 return ("good status");
25217         case STATUS_CHECK:
25218                 return ("check condition");
25219         case STATUS_MET:
25220                 return ("condition met");
25221         case STATUS_BUSY:
25222                 return ("busy");
25223         case STATUS_INTERMEDIATE:
25224                 return ("intermediate");
25225         case STATUS_INTERMEDIATE_MET:
25226                 return ("intermediate - condition met");
25227         case STATUS_RESERVATION_CONFLICT:
25228                 return ("reservation_conflict");
25229         case STATUS_TERMINATED:
25230                 return ("command terminated");
25231         case STATUS_QFULL:
25232                 return ("queue full");
25233         default:
25234                 return ("<unknown status>");
25235         }
25236 }
25237 
25238 
25239 /*
25240  *    Function: sd_mhd_resvd_recover()
25241  *
25242  * Description: This function adds a reservation entry to the
25243  *              sd_resv_reclaim_request list and signals the reservation
25244  *              reclaim thread that there is work pending. If the reservation
25245  *              reclaim thread has not been previously created this function
25246  *              will kick it off.
25247  *
25248  *   Arguments: arg -   the device 'dev_t' is used for context to discriminate
25249  *                      among multiple watches that share this callback function
25250  *
25251  *     Context: This routine is called by timeout() and is run in interrupt
25252  *              context. It must not sleep or call other functions which may
25253  *              sleep.
25254  */
25255 
25256 static void
25257 sd_mhd_resvd_recover(void *arg)
25258 {
25259         dev_t                   dev = (dev_t)arg;
25260         struct sd_lun           *un;
25261         struct sd_thr_request   *sd_treq = NULL;
25262         struct sd_thr_request   *sd_cur = NULL;
25263         struct sd_thr_request   *sd_prev = NULL;
25264         int                     already_there = 0;
25265 
25266         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
25267                 return;
25268         }
25269 
25270         mutex_enter(SD_MUTEX(un));
25271         un->un_resvd_timeid = NULL;
25272         if (un->un_resvd_status & SD_WANT_RESERVE) {
25273                 /*
25274                  * There was a reset so don't issue the reserve, allow the
25275                  * sd_mhd_watch_cb callback function to notice this and
25276                  * reschedule the timeout for reservation.
25277                  */
25278                 mutex_exit(SD_MUTEX(un));
25279                 return;
25280         }
25281         mutex_exit(SD_MUTEX(un));
25282 
25283         /*
25284          * Add this device to the sd_resv_reclaim_request list and the
25285          * sd_resv_reclaim_thread should take care of the rest.
25286          *
25287          * Note: We can't sleep in this context so if the memory allocation
25288          * fails allow the sd_mhd_watch_cb callback function to notice this and
25289          * reschedule the timeout for reservation.  (4378460)
25290          */
25291         sd_treq = (struct sd_thr_request *)
25292             kmem_zalloc(sizeof (struct sd_thr_request), KM_NOSLEEP);
25293         if (sd_treq == NULL) {
25294                 return;
25295         }
25296 
25297         sd_treq->sd_thr_req_next = NULL;
25298         sd_treq->dev = dev;
25299         mutex_enter(&sd_tr.srq_resv_reclaim_mutex);
25300         if (sd_tr.srq_thr_req_head == NULL) {
25301                 sd_tr.srq_thr_req_head = sd_treq;
25302         } else {
25303                 sd_cur = sd_prev = sd_tr.srq_thr_req_head;
25304                 for (; sd_cur != NULL; sd_cur = sd_cur->sd_thr_req_next) {
25305                         if (sd_cur->dev == dev) {
25306                                 /*
25307                                  * already in Queue so don't log
25308                                  * another request for the device
25309                                  */
25310                                 already_there = 1;
25311                                 break;
25312                         }
25313                         sd_prev = sd_cur;
25314                 }
25315                 if (!already_there) {
25316                         SD_INFO(SD_LOG_IOCTL_MHD, un, "sd_mhd_resvd_recover: "
25317                             "logging request for %lx\n", dev);
25318                         sd_prev->sd_thr_req_next = sd_treq;
25319                 } else {
25320                         kmem_free(sd_treq, sizeof (struct sd_thr_request));
25321                 }
25322         }
25323 
25324         /*
25325          * Create a kernel thread to do the reservation reclaim and free up this
25326          * thread. We cannot block this thread while we go away to do the
25327          * reservation reclaim
25328          */
25329         if (sd_tr.srq_resv_reclaim_thread == NULL)
25330                 sd_tr.srq_resv_reclaim_thread = thread_create(NULL, 0,
25331                     sd_resv_reclaim_thread, NULL,
25332                     0, &p0, TS_RUN, v.v_maxsyspri - 2);
25333 
25334         /* Tell the reservation reclaim thread that it has work to do */
25335         cv_signal(&sd_tr.srq_resv_reclaim_cv);
25336         mutex_exit(&sd_tr.srq_resv_reclaim_mutex);
25337 }
25338 
25339 /*
25340  *    Function: sd_resv_reclaim_thread()
25341  *
25342  * Description: This function implements the reservation reclaim operations
25343  *
25344  *   Arguments: arg - the device 'dev_t' is used for context to discriminate
25345  *                    among multiple watches that share this callback function
25346  */
25347 
25348 static void
25349 sd_resv_reclaim_thread()
25350 {
25351         struct sd_lun           *un;
25352         struct sd_thr_request   *sd_mhreq;
25353 
25354         /* Wait for work */
25355         mutex_enter(&sd_tr.srq_resv_reclaim_mutex);
25356         if (sd_tr.srq_thr_req_head == NULL) {
25357                 cv_wait(&sd_tr.srq_resv_reclaim_cv,
25358                     &sd_tr.srq_resv_reclaim_mutex);
25359         }
25360 
25361         /* Loop while we have work */
25362         while ((sd_tr.srq_thr_cur_req = sd_tr.srq_thr_req_head) != NULL) {
25363                 un = ddi_get_soft_state(sd_state,
25364                     SDUNIT(sd_tr.srq_thr_cur_req->dev));
25365                 if (un == NULL) {
25366                         /*
25367                          * softstate structure is NULL so just
25368                          * dequeue the request and continue
25369                          */
25370                         sd_tr.srq_thr_req_head =
25371                             sd_tr.srq_thr_cur_req->sd_thr_req_next;
25372                         kmem_free(sd_tr.srq_thr_cur_req,
25373                             sizeof (struct sd_thr_request));
25374                         continue;
25375                 }
25376 
25377                 /* dequeue the request */
25378                 sd_mhreq = sd_tr.srq_thr_cur_req;
25379                 sd_tr.srq_thr_req_head =
25380                     sd_tr.srq_thr_cur_req->sd_thr_req_next;
25381                 mutex_exit(&sd_tr.srq_resv_reclaim_mutex);
25382 
25383                 /*
25384                  * Reclaim reservation only if SD_RESERVE is still set. There
25385                  * may have been a call to MHIOCRELEASE before we got here.
25386                  */
25387                 mutex_enter(SD_MUTEX(un));
25388                 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
25389                         /*
25390                          * Note: The SD_LOST_RESERVE flag is cleared before
25391                          * reclaiming the reservation. If this is done after the
25392                          * call to sd_reserve_release a reservation loss in the
25393                          * window between pkt completion of reserve cmd and
25394                          * mutex_enter below may not be recognized
25395                          */
25396                         un->un_resvd_status &= ~SD_LOST_RESERVE;
25397                         mutex_exit(SD_MUTEX(un));
25398 
25399                         if (sd_reserve_release(sd_mhreq->dev,
25400                             SD_RESERVE) == 0) {
25401                                 mutex_enter(SD_MUTEX(un));
25402                                 un->un_resvd_status |= SD_RESERVE;
25403                                 mutex_exit(SD_MUTEX(un));
25404                                 SD_INFO(SD_LOG_IOCTL_MHD, un,
25405                                     "sd_resv_reclaim_thread: "
25406                                     "Reservation Recovered\n");
25407                         } else {
25408                                 mutex_enter(SD_MUTEX(un));
25409                                 un->un_resvd_status |= SD_LOST_RESERVE;
25410                                 mutex_exit(SD_MUTEX(un));
25411                                 SD_INFO(SD_LOG_IOCTL_MHD, un,
25412                                     "sd_resv_reclaim_thread: Failed "
25413                                     "Reservation Recovery\n");
25414                         }
25415                 } else {
25416                         mutex_exit(SD_MUTEX(un));
25417                 }
25418                 mutex_enter(&sd_tr.srq_resv_reclaim_mutex);
25419                 ASSERT(sd_mhreq == sd_tr.srq_thr_cur_req);
25420                 kmem_free(sd_mhreq, sizeof (struct sd_thr_request));
25421                 sd_mhreq = sd_tr.srq_thr_cur_req = NULL;
25422                 /*
25423                  * wakeup the destroy thread if anyone is waiting on
25424                  * us to complete.
25425                  */
25426                 cv_signal(&sd_tr.srq_inprocess_cv);
25427                 SD_TRACE(SD_LOG_IOCTL_MHD, un,
25428                     "sd_resv_reclaim_thread: cv_signalling current request \n");
25429         }
25430 
25431         /*
25432          * cleanup the sd_tr structure now that this thread will not exist
25433          */
25434         ASSERT(sd_tr.srq_thr_req_head == NULL);
25435         ASSERT(sd_tr.srq_thr_cur_req == NULL);
25436         sd_tr.srq_resv_reclaim_thread = NULL;
25437         mutex_exit(&sd_tr.srq_resv_reclaim_mutex);
25438         thread_exit();
25439 }
25440 
25441 
25442 /*
25443  *    Function: sd_rmv_resv_reclaim_req()
25444  *
25445  * Description: This function removes any pending reservation reclaim requests
25446  *              for the specified device.
25447  *
25448  *   Arguments: dev - the device 'dev_t'
25449  */
25450 
25451 static void
25452 sd_rmv_resv_reclaim_req(dev_t dev)
25453 {
25454         struct sd_thr_request *sd_mhreq;
25455         struct sd_thr_request *sd_prev;
25456 
25457         /* Remove a reservation reclaim request from the list */
25458         mutex_enter(&sd_tr.srq_resv_reclaim_mutex);
25459         if (sd_tr.srq_thr_cur_req && sd_tr.srq_thr_cur_req->dev == dev) {
25460                 /*
25461                  * We are attempting to reinstate reservation for
25462                  * this device. We wait for sd_reserve_release()
25463                  * to return before we return.
25464                  */
25465                 cv_wait(&sd_tr.srq_inprocess_cv,
25466                     &sd_tr.srq_resv_reclaim_mutex);
25467         } else {
25468                 sd_prev = sd_mhreq = sd_tr.srq_thr_req_head;
25469                 if (sd_mhreq && sd_mhreq->dev == dev) {
25470                         sd_tr.srq_thr_req_head = sd_mhreq->sd_thr_req_next;
25471                         kmem_free(sd_mhreq, sizeof (struct sd_thr_request));
25472                         mutex_exit(&sd_tr.srq_resv_reclaim_mutex);
25473                         return;
25474                 }
25475                 for (; sd_mhreq != NULL; sd_mhreq = sd_mhreq->sd_thr_req_next) {
25476                         if (sd_mhreq && sd_mhreq->dev == dev) {
25477                                 break;
25478                         }
25479                         sd_prev = sd_mhreq;
25480                 }
25481                 if (sd_mhreq != NULL) {
25482                         sd_prev->sd_thr_req_next = sd_mhreq->sd_thr_req_next;
25483                         kmem_free(sd_mhreq, sizeof (struct sd_thr_request));
25484                 }
25485         }
25486         mutex_exit(&sd_tr.srq_resv_reclaim_mutex);
25487 }
25488 
25489 
25490 /*
25491  *    Function: sd_mhd_reset_notify_cb()
25492  *
25493  * Description: This is a call back function for scsi_reset_notify. This
25494  *              function updates the softstate reserved status and logs the
25495  *              reset. The driver scsi watch facility callback function
25496  *              (sd_mhd_watch_cb) and reservation reclaim thread functionality
25497  *              will reclaim the reservation.
25498  *
25499  *   Arguments: arg  - driver soft state (unit) structure
25500  */
25501 
25502 static void
25503 sd_mhd_reset_notify_cb(caddr_t arg)
25504 {
25505         struct sd_lun *un = (struct sd_lun *)arg;
25506 
25507         mutex_enter(SD_MUTEX(un));
25508         if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
25509                 un->un_resvd_status |= (SD_LOST_RESERVE | SD_WANT_RESERVE);
25510                 SD_INFO(SD_LOG_IOCTL_MHD, un,
25511                     "sd_mhd_reset_notify_cb: Lost Reservation\n");
25512         }
25513         mutex_exit(SD_MUTEX(un));
25514 }
25515 
25516 
25517 /*
25518  *    Function: sd_take_ownership()
25519  *
25520  * Description: This routine implements an algorithm to achieve a stable
25521  *              reservation on disks which don't implement priority reserve,
25522  *              and makes sure that other host lose re-reservation attempts.
25523  *              This algorithm contains of a loop that keeps issuing the RESERVE
25524  *              for some period of time (min_ownership_delay, default 6 seconds)
25525  *              During that loop, it looks to see if there has been a bus device
25526  *              reset or bus reset (both of which cause an existing reservation
25527  *              to be lost). If the reservation is lost issue RESERVE until a
25528  *              period of min_ownership_delay with no resets has gone by, or
25529  *              until max_ownership_delay has expired. This loop ensures that
25530  *              the host really did manage to reserve the device, in spite of
25531  *              resets. The looping for min_ownership_delay (default six
25532  *              seconds) is important to early generation clustering products,
25533  *              Solstice HA 1.x and Sun Cluster 2.x. Those products use an
25534  *              MHIOCENFAILFAST periodic timer of two seconds. By having
25535  *              MHIOCTKOWN issue Reserves in a loop for six seconds, and having
25536  *              MHIOCENFAILFAST poll every two seconds, the idea is that by the
25537  *              time the MHIOCTKOWN ioctl returns, the other host (if any) will
25538  *              have already noticed, via the MHIOCENFAILFAST polling, that it
25539  *              no longer "owns" the disk and will have panicked itself.  Thus,
25540  *              the host issuing the MHIOCTKOWN is assured (with timing
25541  *              dependencies) that by the time it actually starts to use the
25542  *              disk for real work, the old owner is no longer accessing it.
25543  *
25544  *              min_ownership_delay is the minimum amount of time for which the
25545  *              disk must be reserved continuously devoid of resets before the
25546  *              MHIOCTKOWN ioctl will return success.
25547  *
25548  *              max_ownership_delay indicates the amount of time by which the
25549  *              take ownership should succeed or timeout with an error.
25550  *
25551  *   Arguments: dev - the device 'dev_t'
25552  *              *p  - struct containing timing info.
25553  *
25554  * Return Code: 0 for success or error code
25555  */
25556 
25557 static int
25558 sd_take_ownership(dev_t dev, struct mhioctkown *p)
25559 {
25560         struct sd_lun   *un;
25561         int             rval;
25562         int             err;
25563         int             reservation_count   = 0;
25564         int             min_ownership_delay =  6000000; /* in usec */
25565         int             max_ownership_delay = 30000000; /* in usec */
25566         clock_t         start_time;     /* starting time of this algorithm */
25567         clock_t         end_time;       /* time limit for giving up */
25568         clock_t         ownership_time; /* time limit for stable ownership */
25569         clock_t         current_time;
25570         clock_t         previous_current_time;
25571 
25572         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
25573                 return (ENXIO);
25574         }
25575 
25576         /*
25577          * Attempt a device reservation. A priority reservation is requested.
25578          */
25579         if ((rval = sd_reserve_release(dev, SD_PRIORITY_RESERVE))
25580             != SD_SUCCESS) {
25581                 SD_ERROR(SD_LOG_IOCTL_MHD, un,
25582                     "sd_take_ownership: return(1)=%d\n", rval);
25583                 return (rval);
25584         }
25585 
25586         /* Update the softstate reserved status to indicate the reservation */
25587         mutex_enter(SD_MUTEX(un));
25588         un->un_resvd_status |= SD_RESERVE;
25589         un->un_resvd_status &=
25590             ~(SD_LOST_RESERVE | SD_WANT_RESERVE | SD_RESERVATION_CONFLICT);
25591         mutex_exit(SD_MUTEX(un));
25592 
25593         if (p != NULL) {
25594                 if (p->min_ownership_delay != 0) {
25595                         min_ownership_delay = p->min_ownership_delay * 1000;
25596                 }
25597                 if (p->max_ownership_delay != 0) {
25598                         max_ownership_delay = p->max_ownership_delay * 1000;
25599                 }
25600         }
25601         SD_INFO(SD_LOG_IOCTL_MHD, un,
25602             "sd_take_ownership: min, max delays: %d, %d\n",
25603             min_ownership_delay, max_ownership_delay);
25604 
25605         start_time = ddi_get_lbolt();
25606         current_time    = start_time;
25607         ownership_time  = current_time + drv_usectohz(min_ownership_delay);
25608         end_time        = start_time + drv_usectohz(max_ownership_delay);
25609 
25610         while (current_time - end_time < 0) {
25611                 delay(drv_usectohz(500000));
25612 
25613                 if ((err = sd_reserve_release(dev, SD_RESERVE)) != 0) {
25614                         if ((sd_reserve_release(dev, SD_RESERVE)) != 0) {
25615                                 mutex_enter(SD_MUTEX(un));
25616                                 rval = (un->un_resvd_status &
25617                                     SD_RESERVATION_CONFLICT) ? EACCES : EIO;
25618                                 mutex_exit(SD_MUTEX(un));
25619                                 break;
25620                         }
25621                 }
25622                 previous_current_time = current_time;
25623                 current_time = ddi_get_lbolt();
25624                 mutex_enter(SD_MUTEX(un));
25625                 if (err || (un->un_resvd_status & SD_LOST_RESERVE)) {
25626                         ownership_time = ddi_get_lbolt() +
25627                             drv_usectohz(min_ownership_delay);
25628                         reservation_count = 0;
25629                 } else {
25630                         reservation_count++;
25631                 }
25632                 un->un_resvd_status |= SD_RESERVE;
25633                 un->un_resvd_status &= ~(SD_LOST_RESERVE | SD_WANT_RESERVE);
25634                 mutex_exit(SD_MUTEX(un));
25635 
25636                 SD_INFO(SD_LOG_IOCTL_MHD, un,
25637                     "sd_take_ownership: ticks for loop iteration=%ld, "
25638                     "reservation=%s\n", (current_time - previous_current_time),
25639                     reservation_count ? "ok" : "reclaimed");
25640 
25641                 if (current_time - ownership_time >= 0 &&
25642                     reservation_count >= 4) {
25643                         rval = 0; /* Achieved a stable ownership */
25644                         break;
25645                 }
25646                 if (current_time - end_time >= 0) {
25647                         rval = EACCES; /* No ownership in max possible time */
25648                         break;
25649                 }
25650         }
25651         SD_TRACE(SD_LOG_IOCTL_MHD, un,
25652             "sd_take_ownership: return(2)=%d\n", rval);
25653         return (rval);
25654 }
25655 
25656 
25657 /*
25658  *    Function: sd_reserve_release()
25659  *
25660  * Description: This function builds and sends scsi RESERVE, RELEASE, and
25661  *              PRIORITY RESERVE commands based on a user specified command type
25662  *
25663  *   Arguments: dev - the device 'dev_t'
25664  *              cmd - user specified command type; one of SD_PRIORITY_RESERVE,
25665  *                    SD_RESERVE, SD_RELEASE
25666  *
25667  * Return Code: 0 or Error Code
25668  */
25669 
25670 static int
25671 sd_reserve_release(dev_t dev, int cmd)
25672 {
25673         struct uscsi_cmd        *com = NULL;
25674         struct sd_lun           *un = NULL;
25675         char                    cdb[CDB_GROUP0];
25676         int                     rval;
25677 
25678         ASSERT((cmd == SD_RELEASE) || (cmd == SD_RESERVE) ||
25679             (cmd == SD_PRIORITY_RESERVE));
25680 
25681         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
25682                 return (ENXIO);
25683         }
25684 
25685         /* instantiate and initialize the command and cdb */
25686         com = kmem_zalloc(sizeof (*com), KM_SLEEP);
25687         bzero(cdb, CDB_GROUP0);
25688         com->uscsi_flags   = USCSI_SILENT;
25689         com->uscsi_timeout = un->un_reserve_release_time;
25690         com->uscsi_cdblen  = CDB_GROUP0;
25691         com->uscsi_cdb          = cdb;
25692         if (cmd == SD_RELEASE) {
25693                 cdb[0] = SCMD_RELEASE;
25694         } else {
25695                 cdb[0] = SCMD_RESERVE;
25696         }
25697 
25698         /* Send the command. */
25699         rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
25700             SD_PATH_STANDARD);
25701 
25702         /*
25703          * "break" a reservation that is held by another host, by issuing a
25704          * reset if priority reserve is desired, and we could not get the
25705          * device.
25706          */
25707         if ((cmd == SD_PRIORITY_RESERVE) &&
25708             (rval != 0) && (com->uscsi_status == STATUS_RESERVATION_CONFLICT)) {
25709                 /*
25710                  * First try to reset the LUN. If we cannot, then try a target
25711                  * reset, followed by a bus reset if the target reset fails.
25712                  */
25713                 int reset_retval = 0;
25714                 if (un->un_f_lun_reset_enabled == TRUE) {
25715                         reset_retval = scsi_reset(SD_ADDRESS(un), RESET_LUN);
25716                 }
25717                 if (reset_retval == 0) {
25718                         /* The LUN reset either failed or was not issued */
25719                         reset_retval = scsi_reset(SD_ADDRESS(un), RESET_TARGET);
25720                 }
25721                 if ((reset_retval == 0) &&
25722                     (scsi_reset(SD_ADDRESS(un), RESET_ALL) == 0)) {
25723                         rval = EIO;
25724                         kmem_free(com, sizeof (*com));
25725                         return (rval);
25726                 }
25727 
25728                 bzero(com, sizeof (struct uscsi_cmd));
25729                 com->uscsi_flags   = USCSI_SILENT;
25730                 com->uscsi_cdb          = cdb;
25731                 com->uscsi_cdblen  = CDB_GROUP0;
25732                 com->uscsi_timeout = 5;
25733 
25734                 /*
25735                  * Reissue the last reserve command, this time without request
25736                  * sense.  Assume that it is just a regular reserve command.
25737                  */
25738                 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
25739                     SD_PATH_STANDARD);
25740         }
25741 
25742         /* Return an error if still getting a reservation conflict. */
25743         if ((rval != 0) && (com->uscsi_status == STATUS_RESERVATION_CONFLICT)) {
25744                 rval = EACCES;
25745         }
25746 
25747         kmem_free(com, sizeof (*com));
25748         return (rval);
25749 }
25750 
25751 
25752 #define SD_NDUMP_RETRIES        12
25753 /*
25754  *      System Crash Dump routine
25755  */
25756 
25757 static int
25758 sddump(dev_t dev, caddr_t addr, daddr_t blkno, int nblk)
25759 {
25760         int             instance;
25761         int             partition;
25762         int             i;
25763         int             err;
25764         struct sd_lun   *un;
25765         struct scsi_pkt *wr_pktp;
25766         struct buf      *wr_bp;
25767         struct buf      wr_buf;
25768         daddr_t         tgt_byte_offset; /* rmw - byte offset for target */
25769         daddr_t         tgt_blkno;      /* rmw - blkno for target */
25770         size_t          tgt_byte_count; /* rmw -  # of bytes to xfer */
25771         size_t          tgt_nblk; /* rmw -  # of tgt blks to xfer */
25772         size_t          io_start_offset;
25773         int             doing_rmw = FALSE;
25774         int             rval;
25775         ssize_t         dma_resid;
25776         daddr_t         oblkno;
25777         diskaddr_t      nblks = 0;
25778         diskaddr_t      start_block;
25779 
25780         instance = SDUNIT(dev);
25781         if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) ||
25782             !SD_IS_VALID_LABEL(un) || ISCD(un)) {
25783                 return (ENXIO);
25784         }
25785 
25786         _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*un))
25787 
25788         SD_TRACE(SD_LOG_DUMP, un, "sddump: entry\n");
25789 
25790         partition = SDPART(dev);
25791         SD_INFO(SD_LOG_DUMP, un, "sddump: partition = %d\n", partition);
25792 
25793         if (!(NOT_DEVBSIZE(un))) {
25794                 int secmask = 0;
25795                 int blknomask = 0;
25796 
25797                 blknomask = (un->un_tgt_blocksize / DEV_BSIZE) - 1;
25798                 secmask = un->un_tgt_blocksize - 1;
25799 
25800                 if (blkno & blknomask) {
25801                         SD_TRACE(SD_LOG_DUMP, un,
25802                             "sddump: dump start block not modulo %d\n",
25803                             un->un_tgt_blocksize);
25804                         return (EINVAL);
25805                 }
25806 
25807                 if ((nblk * DEV_BSIZE) & secmask) {
25808                         SD_TRACE(SD_LOG_DUMP, un,
25809                             "sddump: dump length not modulo %d\n",
25810                             un->un_tgt_blocksize);
25811                         return (EINVAL);
25812                 }
25813 
25814         }
25815 
25816         /* Validate blocks to dump at against partition size. */
25817 
25818         (void) cmlb_partinfo(un->un_cmlbhandle, partition,
25819             &nblks, &start_block, NULL, NULL, (void *)SD_PATH_DIRECT);
25820 
25821         if (NOT_DEVBSIZE(un)) {
25822                 if ((blkno + nblk) > nblks) {
25823                         SD_TRACE(SD_LOG_DUMP, un,
25824                             "sddump: dump range larger than partition: "
25825                             "blkno = 0x%x, nblk = 0x%x, dkl_nblk = 0x%x\n",
25826                             blkno, nblk, nblks);
25827                         return (EINVAL);
25828                 }
25829         } else {
25830                 if (((blkno / (un->un_tgt_blocksize / DEV_BSIZE)) +
25831                     (nblk / (un->un_tgt_blocksize / DEV_BSIZE))) > nblks) {
25832                         SD_TRACE(SD_LOG_DUMP, un,
25833                             "sddump: dump range larger than partition: "
25834                             "blkno = 0x%x, nblk = 0x%x, dkl_nblk = 0x%x\n",
25835                             blkno, nblk, nblks);
25836                         return (EINVAL);
25837                 }
25838         }
25839 
25840         mutex_enter(&un->un_pm_mutex);
25841         if (SD_DEVICE_IS_IN_LOW_POWER(un)) {
25842                 struct scsi_pkt *start_pktp;
25843 
25844                 mutex_exit(&un->un_pm_mutex);
25845 
25846                 /*
25847                  * use pm framework to power on HBA 1st
25848                  */
25849                 (void) pm_raise_power(SD_DEVINFO(un), 0,
25850                     SD_PM_STATE_ACTIVE(un));
25851 
25852                 /*
25853                  * Dump no long uses sdpower to power on a device, it's
25854                  * in-line here so it can be done in polled mode.
25855                  */
25856 
25857                 SD_INFO(SD_LOG_DUMP, un, "sddump: starting device\n");
25858 
25859                 start_pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, NULL,
25860                     CDB_GROUP0, un->un_status_len, 0, 0, NULL_FUNC, NULL);
25861 
25862                 if (start_pktp == NULL) {
25863                         /* We were not given a SCSI packet, fail. */
25864                         return (EIO);
25865                 }
25866                 bzero(start_pktp->pkt_cdbp, CDB_GROUP0);
25867                 start_pktp->pkt_cdbp[0] = SCMD_START_STOP;
25868                 start_pktp->pkt_cdbp[4] = SD_TARGET_START;
25869                 start_pktp->pkt_flags = FLAG_NOINTR;
25870 
25871                 mutex_enter(SD_MUTEX(un));
25872                 SD_FILL_SCSI1_LUN(un, start_pktp);
25873                 mutex_exit(SD_MUTEX(un));
25874                 /*
25875                  * Scsi_poll returns 0 (success) if the command completes and
25876                  * the status block is STATUS_GOOD.
25877                  */
25878                 if (sd_scsi_poll(un, start_pktp) != 0) {
25879                         scsi_destroy_pkt(start_pktp);
25880                         return (EIO);
25881                 }
25882                 scsi_destroy_pkt(start_pktp);
25883                 (void) sd_pm_state_change(un, SD_PM_STATE_ACTIVE(un),
25884                     SD_PM_STATE_CHANGE);
25885         } else {
25886                 mutex_exit(&un->un_pm_mutex);
25887         }
25888 
25889         mutex_enter(SD_MUTEX(un));
25890         un->un_throttle = 0;
25891 
25892         /*
25893          * The first time through, reset the specific target device.
25894          * However, when cpr calls sddump we know that sd is in a
25895          * a good state so no bus reset is required.
25896          * Clear sense data via Request Sense cmd.
25897          * In sddump we don't care about allow_bus_device_reset anymore
25898          */
25899 
25900         if ((un->un_state != SD_STATE_SUSPENDED) &&
25901             (un->un_state != SD_STATE_DUMPING)) {
25902 
25903                 New_state(un, SD_STATE_DUMPING);
25904 
25905                 if (un->un_f_is_fibre == FALSE) {
25906                         mutex_exit(SD_MUTEX(un));
25907                         /*
25908                          * Attempt a bus reset for parallel scsi.
25909                          *
25910                          * Note: A bus reset is required because on some host
25911                          * systems (i.e. E420R) a bus device reset is
25912                          * insufficient to reset the state of the target.
25913                          *
25914                          * Note: Don't issue the reset for fibre-channel,
25915                          * because this tends to hang the bus (loop) for
25916                          * too long while everyone is logging out and in
25917                          * and the deadman timer for dumping will fire
25918                          * before the dump is complete.
25919                          */
25920                         if (scsi_reset(SD_ADDRESS(un), RESET_ALL) == 0) {
25921                                 mutex_enter(SD_MUTEX(un));
25922                                 Restore_state(un);
25923                                 mutex_exit(SD_MUTEX(un));
25924                                 return (EIO);
25925                         }
25926 
25927                         /* Delay to give the device some recovery time. */
25928                         drv_usecwait(10000);
25929 
25930                         if (sd_send_polled_RQS(un) == SD_FAILURE) {
25931                                 SD_INFO(SD_LOG_DUMP, un,
25932                                     "sddump: sd_send_polled_RQS failed\n");
25933                         }
25934                         mutex_enter(SD_MUTEX(un));
25935                 }
25936         }
25937 
25938         /*
25939          * Convert the partition-relative block number to a
25940          * disk physical block number.
25941          */
25942         if (NOT_DEVBSIZE(un)) {
25943                 blkno += start_block;
25944         } else {
25945                 blkno = blkno / (un->un_tgt_blocksize / DEV_BSIZE);
25946                 blkno += start_block;
25947         }
25948 
25949         SD_INFO(SD_LOG_DUMP, un, "sddump: disk blkno = 0x%x\n", blkno);
25950 
25951 
25952         /*
25953          * Check if the device has a non-512 block size.
25954          */
25955         wr_bp = NULL;
25956         if (NOT_DEVBSIZE(un)) {
25957                 tgt_byte_offset = blkno * un->un_sys_blocksize;
25958                 tgt_byte_count = nblk * un->un_sys_blocksize;
25959                 if ((tgt_byte_offset % un->un_tgt_blocksize) ||
25960                     (tgt_byte_count % un->un_tgt_blocksize)) {
25961                         doing_rmw = TRUE;
25962                         /*
25963                          * Calculate the block number and number of block
25964                          * in terms of the media block size.
25965                          */
25966                         tgt_blkno = tgt_byte_offset / un->un_tgt_blocksize;
25967                         tgt_nblk =
25968                             ((tgt_byte_offset + tgt_byte_count +
25969                             (un->un_tgt_blocksize - 1)) /
25970                             un->un_tgt_blocksize) - tgt_blkno;
25971 
25972                         /*
25973                          * Invoke the routine which is going to do read part
25974                          * of read-modify-write.
25975                          * Note that this routine returns a pointer to
25976                          * a valid bp in wr_bp.
25977                          */
25978                         err = sddump_do_read_of_rmw(un, tgt_blkno, tgt_nblk,
25979                             &wr_bp);
25980                         if (err) {
25981                                 mutex_exit(SD_MUTEX(un));
25982                                 return (err);
25983                         }
25984                         /*
25985                          * Offset is being calculated as -
25986                          * (original block # * system block size) -
25987                          * (new block # * target block size)
25988                          */
25989                         io_start_offset =
25990                             ((uint64_t)(blkno * un->un_sys_blocksize)) -
25991                             ((uint64_t)(tgt_blkno * un->un_tgt_blocksize));
25992 
25993                         ASSERT((io_start_offset >= 0) &&
25994                             (io_start_offset < un->un_tgt_blocksize));
25995                         /*
25996                          * Do the modify portion of read modify write.
25997                          */
25998                         bcopy(addr, &wr_bp->b_un.b_addr[io_start_offset],
25999                             (size_t)nblk * un->un_sys_blocksize);
26000                 } else {
26001                         doing_rmw = FALSE;
26002                         tgt_blkno = tgt_byte_offset / un->un_tgt_blocksize;
26003                         tgt_nblk = tgt_byte_count / un->un_tgt_blocksize;
26004                 }
26005 
26006                 /* Convert blkno and nblk to target blocks */
26007                 blkno = tgt_blkno;
26008                 nblk = tgt_nblk;
26009         } else {
26010                 wr_bp = &wr_buf;
26011                 bzero(wr_bp, sizeof (struct buf));
26012                 wr_bp->b_flags               = B_BUSY;
26013                 wr_bp->b_un.b_addr   = addr;
26014                 wr_bp->b_bcount              = nblk << DEV_BSHIFT;
26015                 wr_bp->b_resid               = 0;
26016         }
26017 
26018         mutex_exit(SD_MUTEX(un));
26019 
26020         /*
26021          * Obtain a SCSI packet for the write command.
26022          * It should be safe to call the allocator here without
26023          * worrying about being locked for DVMA mapping because
26024          * the address we're passed is already a DVMA mapping
26025          *
26026          * We are also not going to worry about semaphore ownership
26027          * in the dump buffer. Dumping is single threaded at present.
26028          */
26029 
26030         wr_pktp = NULL;
26031 
26032         dma_resid = wr_bp->b_bcount;
26033         oblkno = blkno;
26034 
26035         if (!(NOT_DEVBSIZE(un))) {
26036                 nblk = nblk / (un->un_tgt_blocksize / DEV_BSIZE);
26037         }
26038 
26039         while (dma_resid != 0) {
26040 
26041         for (i = 0; i < SD_NDUMP_RETRIES; i++) {
26042                 wr_bp->b_flags &= ~B_ERROR;
26043 
26044                 if (un->un_partial_dma_supported == 1) {
26045                         blkno = oblkno +
26046                             ((wr_bp->b_bcount - dma_resid) /
26047                             un->un_tgt_blocksize);
26048                         nblk = dma_resid / un->un_tgt_blocksize;
26049 
26050                         if (wr_pktp) {
26051                                 /*
26052                                  * Partial DMA transfers after initial transfer
26053                                  */
26054                                 rval = sd_setup_next_rw_pkt(un, wr_pktp, wr_bp,
26055                                     blkno, nblk);
26056                         } else {
26057                                 /* Initial transfer */
26058                                 rval = sd_setup_rw_pkt(un, &wr_pktp, wr_bp,
26059                                     un->un_pkt_flags, NULL_FUNC, NULL,
26060                                     blkno, nblk);
26061                         }
26062                 } else {
26063                         rval = sd_setup_rw_pkt(un, &wr_pktp, wr_bp,
26064                             0, NULL_FUNC, NULL, blkno, nblk);
26065                 }
26066 
26067                 if (rval == 0) {
26068                         /* We were given a SCSI packet, continue. */
26069                         break;
26070                 }
26071 
26072                 if (i == 0) {
26073                         if (wr_bp->b_flags & B_ERROR) {
26074                                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26075                                     "no resources for dumping; "
26076                                     "error code: 0x%x, retrying",
26077                                     geterror(wr_bp));
26078                         } else {
26079                                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26080                                     "no resources for dumping; retrying");
26081                         }
26082                 } else if (i != (SD_NDUMP_RETRIES - 1)) {
26083                         if (wr_bp->b_flags & B_ERROR) {
26084                                 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
26085                                     "no resources for dumping; error code: "
26086                                     "0x%x, retrying\n", geterror(wr_bp));
26087                         }
26088                 } else {
26089                         if (wr_bp->b_flags & B_ERROR) {
26090                                 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
26091                                     "no resources for dumping; "
26092                                     "error code: 0x%x, retries failed, "
26093                                     "giving up.\n", geterror(wr_bp));
26094                         } else {
26095                                 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
26096                                     "no resources for dumping; "
26097                                     "retries failed, giving up.\n");
26098                         }
26099                         mutex_enter(SD_MUTEX(un));
26100                         Restore_state(un);
26101                         if (NOT_DEVBSIZE(un) && (doing_rmw == TRUE)) {
26102                                 mutex_exit(SD_MUTEX(un));
26103                                 scsi_free_consistent_buf(wr_bp);
26104                         } else {
26105                                 mutex_exit(SD_MUTEX(un));
26106                         }
26107                         return (EIO);
26108                 }
26109                 drv_usecwait(10000);
26110         }
26111 
26112         if (un->un_partial_dma_supported == 1) {
26113                 /*
26114                  * save the resid from PARTIAL_DMA
26115                  */
26116                 dma_resid = wr_pktp->pkt_resid;
26117                 if (dma_resid != 0)
26118                         nblk -= SD_BYTES2TGTBLOCKS(un, dma_resid);
26119                 wr_pktp->pkt_resid = 0;
26120         } else {
26121                 dma_resid = 0;
26122         }
26123 
26124         /* SunBug 1222170 */
26125         wr_pktp->pkt_flags = FLAG_NOINTR;
26126 
26127         err = EIO;
26128         for (i = 0; i < SD_NDUMP_RETRIES; i++) {
26129 
26130                 /*
26131                  * Scsi_poll returns 0 (success) if the command completes and
26132                  * the status block is STATUS_GOOD.  We should only check
26133                  * errors if this condition is not true.  Even then we should
26134                  * send our own request sense packet only if we have a check
26135                  * condition and auto request sense has not been performed by
26136                  * the hba.
26137                  */
26138                 SD_TRACE(SD_LOG_DUMP, un, "sddump: sending write\n");
26139 
26140                 if ((sd_scsi_poll(un, wr_pktp) == 0) &&
26141                     (wr_pktp->pkt_resid == 0)) {
26142                         err = SD_SUCCESS;
26143                         break;
26144                 }
26145 
26146                 /*
26147                  * Check CMD_DEV_GONE 1st, give up if device is gone.
26148                  */
26149                 if (wr_pktp->pkt_reason == CMD_DEV_GONE) {
26150                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26151                             "Error while dumping state...Device is gone\n");
26152                         break;
26153                 }
26154 
26155                 if (SD_GET_PKT_STATUS(wr_pktp) == STATUS_CHECK) {
26156                         SD_INFO(SD_LOG_DUMP, un,
26157                             "sddump: write failed with CHECK, try # %d\n", i);
26158                         if (((wr_pktp->pkt_state & STATE_ARQ_DONE) == 0)) {
26159                                 (void) sd_send_polled_RQS(un);
26160                         }
26161 
26162                         continue;
26163                 }
26164 
26165                 if (SD_GET_PKT_STATUS(wr_pktp) == STATUS_BUSY) {
26166                         int reset_retval = 0;
26167 
26168                         SD_INFO(SD_LOG_DUMP, un,
26169                             "sddump: write failed with BUSY, try # %d\n", i);
26170 
26171                         if (un->un_f_lun_reset_enabled == TRUE) {
26172                                 reset_retval = scsi_reset(SD_ADDRESS(un),
26173                                     RESET_LUN);
26174                         }
26175                         if (reset_retval == 0) {
26176                                 (void) scsi_reset(SD_ADDRESS(un), RESET_TARGET);
26177                         }
26178                         (void) sd_send_polled_RQS(un);
26179 
26180                 } else {
26181                         SD_INFO(SD_LOG_DUMP, un,
26182                             "sddump: write failed with 0x%x, try # %d\n",
26183                             SD_GET_PKT_STATUS(wr_pktp), i);
26184                         mutex_enter(SD_MUTEX(un));
26185                         sd_reset_target(un, wr_pktp);
26186                         mutex_exit(SD_MUTEX(un));
26187                 }
26188 
26189                 /*
26190                  * If we are not getting anywhere with lun/target resets,
26191                  * let's reset the bus.
26192                  */
26193                 if (i == SD_NDUMP_RETRIES/2) {
26194                         (void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
26195                         (void) sd_send_polled_RQS(un);
26196                 }
26197         }
26198         }
26199 
26200         scsi_destroy_pkt(wr_pktp);
26201         mutex_enter(SD_MUTEX(un));
26202         if ((NOT_DEVBSIZE(un)) && (doing_rmw == TRUE)) {
26203                 mutex_exit(SD_MUTEX(un));
26204                 scsi_free_consistent_buf(wr_bp);
26205         } else {
26206                 mutex_exit(SD_MUTEX(un));
26207         }
26208         SD_TRACE(SD_LOG_DUMP, un, "sddump: exit: err = %d\n", err);
26209         return (err);
26210 }
26211 
26212 /*
26213  *    Function: sd_scsi_poll()
26214  *
26215  * Description: This is a wrapper for the scsi_poll call.
26216  *
26217  *   Arguments: sd_lun - The unit structure
26218  *              scsi_pkt - The scsi packet being sent to the device.
26219  *
26220  * Return Code: 0 - Command completed successfully with good status
26221  *             -1 - Command failed.  This could indicate a check condition
26222  *                  or other status value requiring recovery action.
26223  *
26224  * NOTE: This code is only called off sddump().
26225  */
26226 
26227 static int
26228 sd_scsi_poll(struct sd_lun *un, struct scsi_pkt *pktp)
26229 {
26230         int status;
26231 
26232         ASSERT(un != NULL);
26233         ASSERT(!mutex_owned(SD_MUTEX(un)));
26234         ASSERT(pktp != NULL);
26235 
26236         status = SD_SUCCESS;
26237 
26238         if (scsi_ifgetcap(&pktp->pkt_address, "tagged-qing", 1) == 1) {
26239                 pktp->pkt_flags |= un->un_tagflags;
26240                 pktp->pkt_flags &= ~FLAG_NODISCON;
26241         }
26242 
26243         status = sd_ddi_scsi_poll(pktp);
26244         /*
26245          * Scsi_poll returns 0 (success) if the command completes and the
26246          * status block is STATUS_GOOD.  We should only check errors if this
26247          * condition is not true.  Even then we should send our own request
26248          * sense packet only if we have a check condition and auto
26249          * request sense has not been performed by the hba.
26250          * Don't get RQS data if pkt_reason is CMD_DEV_GONE.
26251          */
26252         if ((status != SD_SUCCESS) &&
26253             (SD_GET_PKT_STATUS(pktp) == STATUS_CHECK) &&
26254             (pktp->pkt_state & STATE_ARQ_DONE) == 0 &&
26255             (pktp->pkt_reason != CMD_DEV_GONE))
26256                 (void) sd_send_polled_RQS(un);
26257 
26258         return (status);
26259 }
26260 
26261 /*
26262  *    Function: sd_send_polled_RQS()
26263  *
26264  * Description: This sends the request sense command to a device.
26265  *
26266  *   Arguments: sd_lun - The unit structure
26267  *
26268  * Return Code: 0 - Command completed successfully with good status
26269  *             -1 - Command failed.
26270  *
26271  */
26272 
26273 static int
26274 sd_send_polled_RQS(struct sd_lun *un)
26275 {
26276         int     ret_val;
26277         struct  scsi_pkt        *rqs_pktp;
26278         struct  buf             *rqs_bp;
26279 
26280         ASSERT(un != NULL);
26281         ASSERT(!mutex_owned(SD_MUTEX(un)));
26282 
26283         ret_val = SD_SUCCESS;
26284 
26285         rqs_pktp = un->un_rqs_pktp;
26286         rqs_bp   = un->un_rqs_bp;
26287 
26288         mutex_enter(SD_MUTEX(un));
26289 
26290         if (un->un_sense_isbusy) {
26291                 ret_val = SD_FAILURE;
26292                 mutex_exit(SD_MUTEX(un));
26293                 return (ret_val);
26294         }
26295 
26296         /*
26297          * If the request sense buffer (and packet) is not in use,
26298          * let's set the un_sense_isbusy and send our packet
26299          */
26300         un->un_sense_isbusy  = 1;
26301         rqs_pktp->pkt_resid          = 0;
26302         rqs_pktp->pkt_reason         = 0;
26303         rqs_pktp->pkt_flags |= FLAG_NOINTR;
26304         bzero(rqs_bp->b_un.b_addr, SENSE_LENGTH);
26305 
26306         mutex_exit(SD_MUTEX(un));
26307 
26308         SD_INFO(SD_LOG_COMMON, un, "sd_send_polled_RQS: req sense buf at"
26309             " 0x%p\n", rqs_bp->b_un.b_addr);
26310 
26311         /*
26312          * Can't send this to sd_scsi_poll, we wrap ourselves around the
26313          * axle - it has a call into us!
26314          */
26315         if ((ret_val = sd_ddi_scsi_poll(rqs_pktp)) != 0) {
26316                 SD_INFO(SD_LOG_COMMON, un,
26317                     "sd_send_polled_RQS: RQS failed\n");
26318         }
26319 
26320         SD_DUMP_MEMORY(un, SD_LOG_COMMON, "sd_send_polled_RQS:",
26321             (uchar_t *)rqs_bp->b_un.b_addr, SENSE_LENGTH, SD_LOG_HEX);
26322 
26323         mutex_enter(SD_MUTEX(un));
26324         un->un_sense_isbusy = 0;
26325         mutex_exit(SD_MUTEX(un));
26326 
26327         return (ret_val);
26328 }
26329 
26330 /*
26331  * Defines needed for localized version of the scsi_poll routine.
26332  */
26333 #define CSEC            10000                   /* usecs */
26334 #define SEC_TO_CSEC     (1000000/CSEC)
26335 
26336 /*
26337  *    Function: sd_ddi_scsi_poll()
26338  *
26339  * Description: Localized version of the scsi_poll routine.  The purpose is to
26340  *              send a scsi_pkt to a device as a polled command.  This version
26341  *              is to ensure more robust handling of transport errors.
26342  *              Specifically this routine cures not ready, coming ready
26343  *              transition for power up and reset of sonoma's.  This can take
26344  *              up to 45 seconds for power-on and 20 seconds for reset of a
26345  *              sonoma lun.
26346  *
26347  *   Arguments: scsi_pkt - The scsi_pkt being sent to a device
26348  *
26349  * Return Code: 0 - Command completed successfully with good status
26350  *             -1 - Command failed.
26351  *
26352  * NOTE: This code is almost identical to scsi_poll, however before 6668774 can
26353  * be fixed (removing this code), we need to determine how to handle the
26354  * KEY_UNIT_ATTENTION condition below in conditions not as limited as sddump().
26355  *
26356  * NOTE: This code is only called off sddump().
26357  */
26358 static int
26359 sd_ddi_scsi_poll(struct scsi_pkt *pkt)
26360 {
26361         int                     rval = -1;
26362         int                     savef;
26363         long                    savet;
26364         void                    (*savec)();
26365         int                     timeout;
26366         int                     busy_count;
26367         int                     poll_delay;
26368         int                     rc;
26369         uint8_t                 *sensep;
26370         struct scsi_arq_status  *arqstat;
26371         extern int              do_polled_io;
26372 
26373         ASSERT(pkt->pkt_scbp);
26374 
26375         /*
26376          * save old flags..
26377          */
26378         savef = pkt->pkt_flags;
26379         savec = pkt->pkt_comp;
26380         savet = pkt->pkt_time;
26381 
26382         pkt->pkt_flags |= FLAG_NOINTR;
26383 
26384         /*
26385          * XXX there is nothing in the SCSA spec that states that we should not
26386          * do a callback for polled cmds; however, removing this will break sd
26387          * and probably other target drivers
26388          */
26389         pkt->pkt_comp = NULL;
26390 
26391         /*
26392          * we don't like a polled command without timeout.
26393          * 60 seconds seems long enough.
26394          */
26395         if (pkt->pkt_time == 0)
26396                 pkt->pkt_time = SCSI_POLL_TIMEOUT;
26397 
26398         /*
26399          * Send polled cmd.
26400          *
26401          * We do some error recovery for various errors.  Tran_busy,
26402          * queue full, and non-dispatched commands are retried every 10 msec.
26403          * as they are typically transient failures.  Busy status and Not
26404          * Ready are retried every second as this status takes a while to
26405          * change.
26406          */
26407         timeout = pkt->pkt_time * SEC_TO_CSEC;
26408 
26409         for (busy_count = 0; busy_count < timeout; busy_count++) {
26410                 /*
26411                  * Initialize pkt status variables.
26412                  */
26413                 *pkt->pkt_scbp = pkt->pkt_reason = pkt->pkt_state = 0;
26414 
26415                 if ((rc = scsi_transport(pkt)) != TRAN_ACCEPT) {
26416                         if (rc != TRAN_BUSY) {
26417                                 /* Transport failed - give up. */
26418                                 break;
26419                         } else {
26420                                 /* Transport busy - try again. */
26421                                 poll_delay = 1 * CSEC;          /* 10 msec. */
26422                         }
26423                 } else {
26424                         /*
26425                          * Transport accepted - check pkt status.
26426                          */
26427                         rc = (*pkt->pkt_scbp) & STATUS_MASK;
26428                         if ((pkt->pkt_reason == CMD_CMPLT) &&
26429                             (rc == STATUS_CHECK) &&
26430                             (pkt->pkt_state & STATE_ARQ_DONE)) {
26431                                 arqstat =
26432                                     (struct scsi_arq_status *)(pkt->pkt_scbp);
26433                                 sensep = (uint8_t *)&arqstat->sts_sensedata;
26434                         } else {
26435                                 sensep = NULL;
26436                         }
26437 
26438                         if ((pkt->pkt_reason == CMD_CMPLT) &&
26439                             (rc == STATUS_GOOD)) {
26440                                 /* No error - we're done */
26441                                 rval = 0;
26442                                 break;
26443 
26444                         } else if (pkt->pkt_reason == CMD_DEV_GONE) {
26445                                 /* Lost connection - give up */
26446                                 break;
26447 
26448                         } else if ((pkt->pkt_reason == CMD_INCOMPLETE) &&
26449                             (pkt->pkt_state == 0)) {
26450                                 /* Pkt not dispatched - try again. */
26451                                 poll_delay = 1 * CSEC;          /* 10 msec. */
26452 
26453                         } else if ((pkt->pkt_reason == CMD_CMPLT) &&
26454                             (rc == STATUS_QFULL)) {
26455                                 /* Queue full - try again. */
26456                                 poll_delay = 1 * CSEC;          /* 10 msec. */
26457 
26458                         } else if ((pkt->pkt_reason == CMD_CMPLT) &&
26459                             (rc == STATUS_BUSY)) {
26460                                 /* Busy - try again. */
26461                                 poll_delay = 100 * CSEC;        /* 1 sec. */
26462                                 busy_count += (SEC_TO_CSEC - 1);
26463 
26464                         } else if ((sensep != NULL) &&
26465                             (scsi_sense_key(sensep) == KEY_UNIT_ATTENTION)) {
26466                                 /*
26467                                  * Unit Attention - try again.
26468                                  * Pretend it took 1 sec.
26469                                  * NOTE: 'continue' avoids poll_delay
26470                                  */
26471                                 busy_count += (SEC_TO_CSEC - 1);
26472                                 continue;
26473 
26474                         } else if ((sensep != NULL) &&
26475                             (scsi_sense_key(sensep) == KEY_NOT_READY) &&
26476                             (scsi_sense_asc(sensep) == 0x04) &&
26477                             (scsi_sense_ascq(sensep) == 0x01)) {
26478                                 /*
26479                                  * Not ready -> ready - try again.
26480                                  * 04h/01h: LUN IS IN PROCESS OF BECOMING READY
26481                                  * ...same as STATUS_BUSY
26482                                  */
26483                                 poll_delay = 100 * CSEC;        /* 1 sec. */
26484                                 busy_count += (SEC_TO_CSEC - 1);
26485 
26486                         } else {
26487                                 /* BAD status - give up. */
26488                                 break;
26489                         }
26490                 }
26491 
26492                 if (((curthread->t_flag & T_INTR_THREAD) == 0) &&
26493                     !do_polled_io) {
26494                         delay(drv_usectohz(poll_delay));
26495                 } else {
26496                         /* we busy wait during cpr_dump or interrupt threads */
26497                         drv_usecwait(poll_delay);
26498                 }
26499         }
26500 
26501         pkt->pkt_flags = savef;
26502         pkt->pkt_comp = savec;
26503         pkt->pkt_time = savet;
26504 
26505         /* return on error */
26506         if (rval)
26507                 return (rval);
26508 
26509         /*
26510          * This is not a performance critical code path.
26511          *
26512          * As an accommodation for scsi_poll callers, to avoid ddi_dma_sync()
26513          * issues associated with looking at DMA memory prior to
26514          * scsi_pkt_destroy(), we scsi_sync_pkt() prior to return.
26515          */
26516         scsi_sync_pkt(pkt);
26517         return (0);
26518 }
26519 
26520 
26521 
26522 /*
26523  *    Function: sd_persistent_reservation_in_read_keys
26524  *
26525  * Description: This routine is the driver entry point for handling CD-ROM
26526  *              multi-host persistent reservation requests (MHIOCGRP_INKEYS)
26527  *              by sending the SCSI-3 PRIN commands to the device.
26528  *              Processes the read keys command response by copying the
26529  *              reservation key information into the user provided buffer.
26530  *              Support for the 32/64 bit _MULTI_DATAMODEL is implemented.
26531  *
26532  *   Arguments: un   -  Pointer to soft state struct for the target.
26533  *              usrp -  user provided pointer to multihost Persistent In Read
26534  *                      Keys structure (mhioc_inkeys_t)
26535  *              flag -  this argument is a pass through to ddi_copyxxx()
26536  *                      directly from the mode argument of ioctl().
26537  *
26538  * Return Code: 0   - Success
26539  *              EACCES
26540  *              ENOTSUP
26541  *              errno return code from sd_send_scsi_cmd()
26542  *
26543  *     Context: Can sleep. Does not return until command is completed.
26544  */
26545 
26546 static int
26547 sd_persistent_reservation_in_read_keys(struct sd_lun *un,
26548     mhioc_inkeys_t *usrp, int flag)
26549 {
26550 #ifdef _MULTI_DATAMODEL
26551         struct mhioc_key_list32 li32;
26552 #endif
26553         sd_prin_readkeys_t      *in;
26554         mhioc_inkeys_t          *ptr;
26555         mhioc_key_list_t        li;
26556         uchar_t                 *data_bufp;
26557         int                     data_len;
26558         int                     rval = 0;
26559         size_t                  copysz;
26560         sd_ssc_t                *ssc;
26561 
26562         if ((ptr = (mhioc_inkeys_t *)usrp) == NULL) {
26563                 return (EINVAL);
26564         }
26565         bzero(&li, sizeof (mhioc_key_list_t));
26566 
26567         ssc = sd_ssc_init(un);
26568 
26569         /*
26570          * Get the listsize from user
26571          */
26572 #ifdef _MULTI_DATAMODEL
26573 
26574         switch (ddi_model_convert_from(flag & FMODELS)) {
26575         case DDI_MODEL_ILP32:
26576                 copysz = sizeof (struct mhioc_key_list32);
26577                 if (ddi_copyin(ptr->li, &li32, copysz, flag)) {
26578                         SD_ERROR(SD_LOG_IOCTL_MHD, un,
26579                             "sd_persistent_reservation_in_read_keys: "
26580                             "failed ddi_copyin: mhioc_key_list32_t\n");
26581                         rval = EFAULT;
26582                         goto done;
26583                 }
26584                 li.listsize = li32.listsize;
26585                 li.list = (mhioc_resv_key_t *)(uintptr_t)li32.list;
26586                 break;
26587 
26588         case DDI_MODEL_NONE:
26589                 copysz = sizeof (mhioc_key_list_t);
26590                 if (ddi_copyin(ptr->li, &li, copysz, flag)) {
26591                         SD_ERROR(SD_LOG_IOCTL_MHD, un,
26592                             "sd_persistent_reservation_in_read_keys: "
26593                             "failed ddi_copyin: mhioc_key_list_t\n");
26594                         rval = EFAULT;
26595                         goto done;
26596                 }
26597                 break;
26598         }
26599 
26600 #else /* ! _MULTI_DATAMODEL */
26601         copysz = sizeof (mhioc_key_list_t);
26602         if (ddi_copyin(ptr->li, &li, copysz, flag)) {
26603                 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26604                     "sd_persistent_reservation_in_read_keys: "
26605                     "failed ddi_copyin: mhioc_key_list_t\n");
26606                 rval = EFAULT;
26607                 goto done;
26608         }
26609 #endif
26610 
26611         data_len  = li.listsize * MHIOC_RESV_KEY_SIZE;
26612         data_len += (sizeof (sd_prin_readkeys_t) - sizeof (caddr_t));
26613         data_bufp = kmem_zalloc(data_len, KM_SLEEP);
26614 
26615         rval = sd_send_scsi_PERSISTENT_RESERVE_IN(ssc, SD_READ_KEYS,
26616             data_len, data_bufp);
26617         if (rval != 0) {
26618                 if (rval == EIO)
26619                         sd_ssc_assessment(ssc, SD_FMT_IGNORE_COMPROMISE);
26620                 else
26621                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
26622                 goto done;
26623         }
26624         in = (sd_prin_readkeys_t *)data_bufp;
26625         ptr->generation = BE_32(in->generation);
26626         li.listlen = BE_32(in->len) / MHIOC_RESV_KEY_SIZE;
26627 
26628         /*
26629          * Return the min(listsize, listlen) keys
26630          */
26631 #ifdef _MULTI_DATAMODEL
26632 
26633         switch (ddi_model_convert_from(flag & FMODELS)) {
26634         case DDI_MODEL_ILP32:
26635                 li32.listlen = li.listlen;
26636                 if (ddi_copyout(&li32, ptr->li, copysz, flag)) {
26637                         SD_ERROR(SD_LOG_IOCTL_MHD, un,
26638                             "sd_persistent_reservation_in_read_keys: "
26639                             "failed ddi_copyout: mhioc_key_list32_t\n");
26640                         rval = EFAULT;
26641                         goto done;
26642                 }
26643                 break;
26644 
26645         case DDI_MODEL_NONE:
26646                 if (ddi_copyout(&li, ptr->li, copysz, flag)) {
26647                         SD_ERROR(SD_LOG_IOCTL_MHD, un,
26648                             "sd_persistent_reservation_in_read_keys: "
26649                             "failed ddi_copyout: mhioc_key_list_t\n");
26650                         rval = EFAULT;
26651                         goto done;
26652                 }
26653                 break;
26654         }
26655 
26656 #else /* ! _MULTI_DATAMODEL */
26657 
26658         if (ddi_copyout(&li, ptr->li, copysz, flag)) {
26659                 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26660                     "sd_persistent_reservation_in_read_keys: "
26661                     "failed ddi_copyout: mhioc_key_list_t\n");
26662                 rval = EFAULT;
26663                 goto done;
26664         }
26665 
26666 #endif /* _MULTI_DATAMODEL */
26667 
26668         copysz = min(li.listlen * MHIOC_RESV_KEY_SIZE,
26669             li.listsize * MHIOC_RESV_KEY_SIZE);
26670         if (ddi_copyout(&in->keylist, li.list, copysz, flag)) {
26671                 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26672                     "sd_persistent_reservation_in_read_keys: "
26673                     "failed ddi_copyout: keylist\n");
26674                 rval = EFAULT;
26675         }
26676 done:
26677         sd_ssc_fini(ssc);
26678         kmem_free(data_bufp, data_len);
26679         return (rval);
26680 }
26681 
26682 
26683 /*
26684  *    Function: sd_persistent_reservation_in_read_resv
26685  *
26686  * Description: This routine is the driver entry point for handling CD-ROM
26687  *              multi-host persistent reservation requests (MHIOCGRP_INRESV)
26688  *              by sending the SCSI-3 PRIN commands to the device.
26689  *              Process the read persistent reservations command response by
26690  *              copying the reservation information into the user provided
26691  *              buffer. Support for the 32/64 _MULTI_DATAMODEL is implemented.
26692  *
26693  *   Arguments: un   -  Pointer to soft state struct for the target.
26694  *              usrp -  user provided pointer to multihost Persistent In Read
26695  *                      Keys structure (mhioc_inkeys_t)
26696  *              flag -  this argument is a pass through to ddi_copyxxx()
26697  *                      directly from the mode argument of ioctl().
26698  *
26699  * Return Code: 0   - Success
26700  *              EACCES
26701  *              ENOTSUP
26702  *              errno return code from sd_send_scsi_cmd()
26703  *
26704  *     Context: Can sleep. Does not return until command is completed.
26705  */
26706 
26707 static int
26708 sd_persistent_reservation_in_read_resv(struct sd_lun *un,
26709     mhioc_inresvs_t *usrp, int flag)
26710 {
26711 #ifdef _MULTI_DATAMODEL
26712         struct mhioc_resv_desc_list32 resvlist32;
26713 #endif
26714         sd_prin_readresv_t      *in;
26715         mhioc_inresvs_t         *ptr;
26716         sd_readresv_desc_t      *readresv_ptr;
26717         mhioc_resv_desc_list_t  resvlist;
26718         mhioc_resv_desc_t       resvdesc;
26719         uchar_t                 *data_bufp = NULL;
26720         int                     data_len;
26721         int                     rval = 0;
26722         int                     i;
26723         size_t                  copysz;
26724         mhioc_resv_desc_t       *bufp;
26725         sd_ssc_t                *ssc;
26726 
26727         if ((ptr = usrp) == NULL) {
26728                 return (EINVAL);
26729         }
26730 
26731         ssc = sd_ssc_init(un);
26732 
26733         /*
26734          * Get the listsize from user
26735          */
26736 #ifdef _MULTI_DATAMODEL
26737         switch (ddi_model_convert_from(flag & FMODELS)) {
26738         case DDI_MODEL_ILP32:
26739                 copysz = sizeof (struct mhioc_resv_desc_list32);
26740                 if (ddi_copyin(ptr->li, &resvlist32, copysz, flag)) {
26741                         SD_ERROR(SD_LOG_IOCTL_MHD, un,
26742                             "sd_persistent_reservation_in_read_resv: "
26743                             "failed ddi_copyin: mhioc_resv_desc_list_t\n");
26744                         rval = EFAULT;
26745                         goto done;
26746                 }
26747                 resvlist.listsize = resvlist32.listsize;
26748                 resvlist.list = (mhioc_resv_desc_t *)(uintptr_t)resvlist32.list;
26749                 break;
26750 
26751         case DDI_MODEL_NONE:
26752                 copysz = sizeof (mhioc_resv_desc_list_t);
26753                 if (ddi_copyin(ptr->li, &resvlist, copysz, flag)) {
26754                         SD_ERROR(SD_LOG_IOCTL_MHD, un,
26755                             "sd_persistent_reservation_in_read_resv: "
26756                             "failed ddi_copyin: mhioc_resv_desc_list_t\n");
26757                         rval = EFAULT;
26758                         goto done;
26759                 }
26760                 break;
26761         }
26762 #else /* ! _MULTI_DATAMODEL */
26763         copysz = sizeof (mhioc_resv_desc_list_t);
26764         if (ddi_copyin(ptr->li, &resvlist, copysz, flag)) {
26765                 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26766                     "sd_persistent_reservation_in_read_resv: "
26767                     "failed ddi_copyin: mhioc_resv_desc_list_t\n");
26768                 rval = EFAULT;
26769                 goto done;
26770         }
26771 #endif /* ! _MULTI_DATAMODEL */
26772 
26773         data_len  = resvlist.listsize * SCSI3_RESV_DESC_LEN;
26774         data_len += (sizeof (sd_prin_readresv_t) - sizeof (caddr_t));
26775         data_bufp = kmem_zalloc(data_len, KM_SLEEP);
26776 
26777         rval = sd_send_scsi_PERSISTENT_RESERVE_IN(ssc, SD_READ_RESV,
26778             data_len, data_bufp);
26779         if (rval != 0) {
26780                 if (rval == EIO)
26781                         sd_ssc_assessment(ssc, SD_FMT_IGNORE_COMPROMISE);
26782                 else
26783                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
26784                 goto done;
26785         }
26786         in = (sd_prin_readresv_t *)data_bufp;
26787         ptr->generation = BE_32(in->generation);
26788         resvlist.listlen = BE_32(in->len) / SCSI3_RESV_DESC_LEN;
26789 
26790         /*
26791          * Return the min(listsize, listlen( keys
26792          */
26793 #ifdef _MULTI_DATAMODEL
26794 
26795         switch (ddi_model_convert_from(flag & FMODELS)) {
26796         case DDI_MODEL_ILP32:
26797                 resvlist32.listlen = resvlist.listlen;
26798                 if (ddi_copyout(&resvlist32, ptr->li, copysz, flag)) {
26799                         SD_ERROR(SD_LOG_IOCTL_MHD, un,
26800                             "sd_persistent_reservation_in_read_resv: "
26801                             "failed ddi_copyout: mhioc_resv_desc_list_t\n");
26802                         rval = EFAULT;
26803                         goto done;
26804                 }
26805                 break;
26806 
26807         case DDI_MODEL_NONE:
26808                 if (ddi_copyout(&resvlist, ptr->li, copysz, flag)) {
26809                         SD_ERROR(SD_LOG_IOCTL_MHD, un,
26810                             "sd_persistent_reservation_in_read_resv: "
26811                             "failed ddi_copyout: mhioc_resv_desc_list_t\n");
26812                         rval = EFAULT;
26813                         goto done;
26814                 }
26815                 break;
26816         }
26817 
26818 #else /* ! _MULTI_DATAMODEL */
26819 
26820         if (ddi_copyout(&resvlist, ptr->li, copysz, flag)) {
26821                 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26822                     "sd_persistent_reservation_in_read_resv: "
26823                     "failed ddi_copyout: mhioc_resv_desc_list_t\n");
26824                 rval = EFAULT;
26825                 goto done;
26826         }
26827 
26828 #endif /* ! _MULTI_DATAMODEL */
26829 
26830         readresv_ptr = (sd_readresv_desc_t *)&in->readresv_desc;
26831         bufp = resvlist.list;
26832         copysz = sizeof (mhioc_resv_desc_t);
26833         for (i = 0; i < min(resvlist.listlen, resvlist.listsize);
26834             i++, readresv_ptr++, bufp++) {
26835 
26836                 bcopy(&readresv_ptr->resvkey, &resvdesc.key,
26837                     MHIOC_RESV_KEY_SIZE);
26838                 resvdesc.type  = readresv_ptr->type;
26839                 resvdesc.scope = readresv_ptr->scope;
26840                 resvdesc.scope_specific_addr =
26841                     BE_32(readresv_ptr->scope_specific_addr);
26842 
26843                 if (ddi_copyout(&resvdesc, bufp, copysz, flag)) {
26844                         SD_ERROR(SD_LOG_IOCTL_MHD, un,
26845                             "sd_persistent_reservation_in_read_resv: "
26846                             "failed ddi_copyout: resvlist\n");
26847                         rval = EFAULT;
26848                         goto done;
26849                 }
26850         }
26851 done:
26852         sd_ssc_fini(ssc);
26853         /* only if data_bufp is allocated, we need to free it */
26854         if (data_bufp) {
26855                 kmem_free(data_bufp, data_len);
26856         }
26857         return (rval);
26858 }
26859 
26860 
26861 /*
26862  *    Function: sr_change_blkmode()
26863  *
26864  * Description: This routine is the driver entry point for handling CD-ROM
26865  *              block mode ioctl requests. Support for returning and changing
26866  *              the current block size in use by the device is implemented. The
26867  *              LBA size is changed via a MODE SELECT Block Descriptor.
26868  *
26869  *              This routine issues a mode sense with an allocation length of
26870  *              12 bytes for the mode page header and a single block descriptor.
26871  *
26872  *   Arguments: dev - the device 'dev_t'
26873  *              cmd - the request type; one of CDROMGBLKMODE (get) or
26874  *                    CDROMSBLKMODE (set)
26875  *              data - current block size or requested block size
26876  *              flag - this argument is a pass through to ddi_copyxxx() directly
26877  *                     from the mode argument of ioctl().
26878  *
26879  * Return Code: the code returned by sd_send_scsi_cmd()
26880  *              EINVAL if invalid arguments are provided
26881  *              EFAULT if ddi_copyxxx() fails
26882  *              ENXIO if fail ddi_get_soft_state
26883  *              EIO if invalid mode sense block descriptor length
26884  *
26885  */
26886 
26887 static int
26888 sr_change_blkmode(dev_t dev, int cmd, intptr_t data, int flag)
26889 {
26890         struct sd_lun                   *un = NULL;
26891         struct mode_header              *sense_mhp, *select_mhp;
26892         struct block_descriptor         *sense_desc, *select_desc;
26893         int                             current_bsize;
26894         int                             rval = EINVAL;
26895         uchar_t                         *sense = NULL;
26896         uchar_t                         *select = NULL;
26897         sd_ssc_t                        *ssc;
26898 
26899         ASSERT((cmd == CDROMGBLKMODE) || (cmd == CDROMSBLKMODE));
26900 
26901         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
26902                 return (ENXIO);
26903         }
26904 
26905         /*
26906          * The block length is changed via the Mode Select block descriptor, the
26907          * "Read/Write Error Recovery" mode page (0x1) contents are not actually
26908          * required as part of this routine. Therefore the mode sense allocation
26909          * length is specified to be the length of a mode page header and a
26910          * block descriptor.
26911          */
26912         sense = kmem_zalloc(BUFLEN_CHG_BLK_MODE, KM_SLEEP);
26913 
26914         ssc = sd_ssc_init(un);
26915         rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense,
26916             BUFLEN_CHG_BLK_MODE, MODEPAGE_ERR_RECOV, SD_PATH_STANDARD);
26917         sd_ssc_fini(ssc);
26918         if (rval != 0) {
26919                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26920                     "sr_change_blkmode: Mode Sense Failed\n");
26921                 kmem_free(sense, BUFLEN_CHG_BLK_MODE);
26922                 return (rval);
26923         }
26924 
26925         /* Check the block descriptor len to handle only 1 block descriptor */
26926         sense_mhp = (struct mode_header *)sense;
26927         if ((sense_mhp->bdesc_length == 0) ||
26928             (sense_mhp->bdesc_length > MODE_BLK_DESC_LENGTH)) {
26929                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26930                     "sr_change_blkmode: Mode Sense returned invalid block"
26931                     " descriptor length\n");
26932                 kmem_free(sense, BUFLEN_CHG_BLK_MODE);
26933                 return (EIO);
26934         }
26935         sense_desc = (struct block_descriptor *)(sense + MODE_HEADER_LENGTH);
26936         current_bsize = ((sense_desc->blksize_hi << 16) |
26937             (sense_desc->blksize_mid << 8) | sense_desc->blksize_lo);
26938 
26939         /* Process command */
26940         switch (cmd) {
26941         case CDROMGBLKMODE:
26942                 /* Return the block size obtained during the mode sense */
26943                 if (ddi_copyout(&current_bsize, (void *)data,
26944                     sizeof (int), flag) != 0)
26945                         rval = EFAULT;
26946                 break;
26947         case CDROMSBLKMODE:
26948                 /* Validate the requested block size */
26949                 switch (data) {
26950                 case CDROM_BLK_512:
26951                 case CDROM_BLK_1024:
26952                 case CDROM_BLK_2048:
26953                 case CDROM_BLK_2056:
26954                 case CDROM_BLK_2336:
26955                 case CDROM_BLK_2340:
26956                 case CDROM_BLK_2352:
26957                 case CDROM_BLK_2368:
26958                 case CDROM_BLK_2448:
26959                 case CDROM_BLK_2646:
26960                 case CDROM_BLK_2647:
26961                         break;
26962                 default:
26963                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26964                             "sr_change_blkmode: "
26965                             "Block Size '%ld' Not Supported\n", data);
26966                         kmem_free(sense, BUFLEN_CHG_BLK_MODE);
26967                         return (EINVAL);
26968                 }
26969 
26970                 /*
26971                  * The current block size matches the requested block size so
26972                  * there is no need to send the mode select to change the size
26973                  */
26974                 if (current_bsize == data) {
26975                         break;
26976                 }
26977 
26978                 /* Build the select data for the requested block size */
26979                 select = kmem_zalloc(BUFLEN_CHG_BLK_MODE, KM_SLEEP);
26980                 select_mhp = (struct mode_header *)select;
26981                 select_desc =
26982                     (struct block_descriptor *)(select + MODE_HEADER_LENGTH);
26983                 /*
26984                  * The LBA size is changed via the block descriptor, so the
26985                  * descriptor is built according to the user data
26986                  */
26987                 select_mhp->bdesc_length = MODE_BLK_DESC_LENGTH;
26988                 select_desc->blksize_hi  = (char)(((data) & 0x00ff0000) >> 16);
26989                 select_desc->blksize_mid = (char)(((data) & 0x0000ff00) >> 8);
26990                 select_desc->blksize_lo  = (char)((data) & 0x000000ff);
26991 
26992                 /* Send the mode select for the requested block size */
26993                 ssc = sd_ssc_init(un);
26994                 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0,
26995                     select, BUFLEN_CHG_BLK_MODE, SD_DONTSAVE_PAGE,
26996                     SD_PATH_STANDARD);
26997                 sd_ssc_fini(ssc);
26998                 if (rval != 0) {
26999                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27000                             "sr_change_blkmode: Mode Select Failed\n");
27001                         /*
27002                          * The mode select failed for the requested block size,
27003                          * so reset the data for the original block size and
27004                          * send it to the target. The error is indicated by the
27005                          * return value for the failed mode select.
27006                          */
27007                         select_desc->blksize_hi  = sense_desc->blksize_hi;
27008                         select_desc->blksize_mid = sense_desc->blksize_mid;
27009                         select_desc->blksize_lo  = sense_desc->blksize_lo;
27010                         ssc = sd_ssc_init(un);
27011                         (void) sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0,
27012                             select, BUFLEN_CHG_BLK_MODE, SD_DONTSAVE_PAGE,
27013                             SD_PATH_STANDARD);
27014                         sd_ssc_fini(ssc);
27015                 } else {
27016                         ASSERT(!mutex_owned(SD_MUTEX(un)));
27017                         mutex_enter(SD_MUTEX(un));
27018                         sd_update_block_info(un, (uint32_t)data, 0);
27019                         mutex_exit(SD_MUTEX(un));
27020                 }
27021                 break;
27022         default:
27023                 /* should not reach here, but check anyway */
27024                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27025                     "sr_change_blkmode: Command '%x' Not Supported\n", cmd);
27026                 rval = EINVAL;
27027                 break;
27028         }
27029 
27030         if (select) {
27031                 kmem_free(select, BUFLEN_CHG_BLK_MODE);
27032         }
27033         if (sense) {
27034                 kmem_free(sense, BUFLEN_CHG_BLK_MODE);
27035         }
27036         return (rval);
27037 }
27038 
27039 
27040 /*
27041  * Note: The following sr_change_speed() and sr_atapi_change_speed() routines
27042  * implement driver support for getting and setting the CD speed. The command
27043  * set used will be based on the device type. If the device has not been
27044  * identified as MMC the Toshiba vendor specific mode page will be used. If
27045  * the device is MMC but does not support the Real Time Streaming feature
27046  * the SET CD SPEED command will be used to set speed and mode page 0x2A will
27047  * be used to read the speed.
27048  */
27049 
27050 /*
27051  *    Function: sr_change_speed()
27052  *
27053  * Description: This routine is the driver entry point for handling CD-ROM
27054  *              drive speed ioctl requests for devices supporting the Toshiba
27055  *              vendor specific drive speed mode page. Support for returning
27056  *              and changing the current drive speed in use by the device is
27057  *              implemented.
27058  *
27059  *   Arguments: dev - the device 'dev_t'
27060  *              cmd - the request type; one of CDROMGDRVSPEED (get) or
27061  *                    CDROMSDRVSPEED (set)
27062  *              data - current drive speed or requested drive speed
27063  *              flag - this argument is a pass through to ddi_copyxxx() directly
27064  *                     from the mode argument of ioctl().
27065  *
27066  * Return Code: the code returned by sd_send_scsi_cmd()
27067  *              EINVAL if invalid arguments are provided
27068  *              EFAULT if ddi_copyxxx() fails
27069  *              ENXIO if fail ddi_get_soft_state
27070  *              EIO if invalid mode sense block descriptor length
27071  */
27072 
27073 static int
27074 sr_change_speed(dev_t dev, int cmd, intptr_t data, int flag)
27075 {
27076         struct sd_lun                   *un = NULL;
27077         struct mode_header              *sense_mhp, *select_mhp;
27078         struct mode_speed               *sense_page, *select_page;
27079         int                             current_speed;
27080         int                             rval = EINVAL;
27081         int                             bd_len;
27082         uchar_t                         *sense = NULL;
27083         uchar_t                         *select = NULL;
27084         sd_ssc_t                        *ssc;
27085 
27086         ASSERT((cmd == CDROMGDRVSPEED) || (cmd == CDROMSDRVSPEED));
27087         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27088                 return (ENXIO);
27089         }
27090 
27091         /*
27092          * Note: The drive speed is being modified here according to a Toshiba
27093          * vendor specific mode page (0x31).
27094          */
27095         sense = kmem_zalloc(BUFLEN_MODE_CDROM_SPEED, KM_SLEEP);
27096 
27097         ssc = sd_ssc_init(un);
27098         rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense,
27099             BUFLEN_MODE_CDROM_SPEED, CDROM_MODE_SPEED,
27100             SD_PATH_STANDARD);
27101         sd_ssc_fini(ssc);
27102         if (rval != 0) {
27103                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27104                     "sr_change_speed: Mode Sense Failed\n");
27105                 kmem_free(sense, BUFLEN_MODE_CDROM_SPEED);
27106                 return (rval);
27107         }
27108         sense_mhp  = (struct mode_header *)sense;
27109 
27110         /* Check the block descriptor len to handle only 1 block descriptor */
27111         bd_len = sense_mhp->bdesc_length;
27112         if (bd_len > MODE_BLK_DESC_LENGTH) {
27113                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27114                     "sr_change_speed: Mode Sense returned invalid block "
27115                     "descriptor length\n");
27116                 kmem_free(sense, BUFLEN_MODE_CDROM_SPEED);
27117                 return (EIO);
27118         }
27119 
27120         sense_page = (struct mode_speed *)
27121             (sense + MODE_HEADER_LENGTH + sense_mhp->bdesc_length);
27122         current_speed = sense_page->speed;
27123 
27124         /* Process command */
27125         switch (cmd) {
27126         case CDROMGDRVSPEED:
27127                 /* Return the drive speed obtained during the mode sense */
27128                 if (current_speed == 0x2) {
27129                         current_speed = CDROM_TWELVE_SPEED;
27130                 }
27131                 if (ddi_copyout(&current_speed, (void *)data,
27132                     sizeof (int), flag) != 0) {
27133                         rval = EFAULT;
27134                 }
27135                 break;
27136         case CDROMSDRVSPEED:
27137                 /* Validate the requested drive speed */
27138                 switch ((uchar_t)data) {
27139                 case CDROM_TWELVE_SPEED:
27140                         data = 0x2;
27141                         /*FALLTHROUGH*/
27142                 case CDROM_NORMAL_SPEED:
27143                 case CDROM_DOUBLE_SPEED:
27144                 case CDROM_QUAD_SPEED:
27145                 case CDROM_MAXIMUM_SPEED:
27146                         break;
27147                 default:
27148                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27149                             "sr_change_speed: "
27150                             "Drive Speed '%d' Not Supported\n", (uchar_t)data);
27151                         kmem_free(sense, BUFLEN_MODE_CDROM_SPEED);
27152                         return (EINVAL);
27153                 }
27154 
27155                 /*
27156                  * The current drive speed matches the requested drive speed so
27157                  * there is no need to send the mode select to change the speed
27158                  */
27159                 if (current_speed == data) {
27160                         break;
27161                 }
27162 
27163                 /* Build the select data for the requested drive speed */
27164                 select = kmem_zalloc(BUFLEN_MODE_CDROM_SPEED, KM_SLEEP);
27165                 select_mhp = (struct mode_header *)select;
27166                 select_mhp->bdesc_length = 0;
27167                 select_page =
27168                     (struct mode_speed *)(select + MODE_HEADER_LENGTH);
27169                 select_page =
27170                     (struct mode_speed *)(select + MODE_HEADER_LENGTH);
27171                 select_page->mode_page.code = CDROM_MODE_SPEED;
27172                 select_page->mode_page.length = 2;
27173                 select_page->speed = (uchar_t)data;
27174 
27175                 /* Send the mode select for the requested block size */
27176                 ssc = sd_ssc_init(un);
27177                 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select,
27178                     MODEPAGE_CDROM_SPEED_LEN + MODE_HEADER_LENGTH,
27179                     SD_DONTSAVE_PAGE, SD_PATH_STANDARD);
27180                 sd_ssc_fini(ssc);
27181                 if (rval != 0) {
27182                         /*
27183                          * The mode select failed for the requested drive speed,
27184                          * so reset the data for the original drive speed and
27185                          * send it to the target. The error is indicated by the
27186                          * return value for the failed mode select.
27187                          */
27188                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27189                             "sr_drive_speed: Mode Select Failed\n");
27190                         select_page->speed = sense_page->speed;
27191                         ssc = sd_ssc_init(un);
27192                         (void) sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select,
27193                             MODEPAGE_CDROM_SPEED_LEN + MODE_HEADER_LENGTH,
27194                             SD_DONTSAVE_PAGE, SD_PATH_STANDARD);
27195                         sd_ssc_fini(ssc);
27196                 }
27197                 break;
27198         default:
27199                 /* should not reach here, but check anyway */
27200                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27201                     "sr_change_speed: Command '%x' Not Supported\n", cmd);
27202                 rval = EINVAL;
27203                 break;
27204         }
27205 
27206         if (select) {
27207                 kmem_free(select, BUFLEN_MODE_CDROM_SPEED);
27208         }
27209         if (sense) {
27210                 kmem_free(sense, BUFLEN_MODE_CDROM_SPEED);
27211         }
27212 
27213         return (rval);
27214 }
27215 
27216 
27217 /*
27218  *    Function: sr_atapi_change_speed()
27219  *
27220  * Description: This routine is the driver entry point for handling CD-ROM
27221  *              drive speed ioctl requests for MMC devices that do not support
27222  *              the Real Time Streaming feature (0x107).
27223  *
27224  *              Note: This routine will use the SET SPEED command which may not
27225  *              be supported by all devices.
27226  *
27227  *   Arguments: dev- the device 'dev_t'
27228  *              cmd- the request type; one of CDROMGDRVSPEED (get) or
27229  *                   CDROMSDRVSPEED (set)
27230  *              data- current drive speed or requested drive speed
27231  *              flag- this argument is a pass through to ddi_copyxxx() directly
27232  *                    from the mode argument of ioctl().
27233  *
27234  * Return Code: the code returned by sd_send_scsi_cmd()
27235  *              EINVAL if invalid arguments are provided
27236  *              EFAULT if ddi_copyxxx() fails
27237  *              ENXIO if fail ddi_get_soft_state
27238  *              EIO if invalid mode sense block descriptor length
27239  */
27240 
27241 static int
27242 sr_atapi_change_speed(dev_t dev, int cmd, intptr_t data, int flag)
27243 {
27244         struct sd_lun                   *un;
27245         struct uscsi_cmd                *com = NULL;
27246         struct mode_header_grp2         *sense_mhp;
27247         uchar_t                         *sense_page;
27248         uchar_t                         *sense = NULL;
27249         char                            cdb[CDB_GROUP5];
27250         int                             bd_len;
27251         int                             current_speed = 0;
27252         int                             max_speed = 0;
27253         int                             rval;
27254         sd_ssc_t                        *ssc;
27255 
27256         ASSERT((cmd == CDROMGDRVSPEED) || (cmd == CDROMSDRVSPEED));
27257 
27258         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27259                 return (ENXIO);
27260         }
27261 
27262         sense = kmem_zalloc(BUFLEN_MODE_CDROM_CAP, KM_SLEEP);
27263 
27264         ssc = sd_ssc_init(un);
27265         rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, sense,
27266             BUFLEN_MODE_CDROM_CAP, MODEPAGE_CDROM_CAP,
27267             SD_PATH_STANDARD);
27268         sd_ssc_fini(ssc);
27269         if (rval != 0) {
27270                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27271                     "sr_atapi_change_speed: Mode Sense Failed\n");
27272                 kmem_free(sense, BUFLEN_MODE_CDROM_CAP);
27273                 return (rval);
27274         }
27275 
27276         /* Check the block descriptor len to handle only 1 block descriptor */
27277         sense_mhp = (struct mode_header_grp2 *)sense;
27278         bd_len = (sense_mhp->bdesc_length_hi << 8) | sense_mhp->bdesc_length_lo;
27279         if (bd_len > MODE_BLK_DESC_LENGTH) {
27280                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27281                     "sr_atapi_change_speed: Mode Sense returned invalid "
27282                     "block descriptor length\n");
27283                 kmem_free(sense, BUFLEN_MODE_CDROM_CAP);
27284                 return (EIO);
27285         }
27286 
27287         /* Calculate the current and maximum drive speeds */
27288         sense_page = (uchar_t *)(sense + MODE_HEADER_LENGTH_GRP2 + bd_len);
27289         current_speed = (sense_page[14] << 8) | sense_page[15];
27290         max_speed = (sense_page[8] << 8) | sense_page[9];
27291 
27292         /* Process the command */
27293         switch (cmd) {
27294         case CDROMGDRVSPEED:
27295                 current_speed /= SD_SPEED_1X;
27296                 if (ddi_copyout(&current_speed, (void *)data,
27297                     sizeof (int), flag) != 0)
27298                         rval = EFAULT;
27299                 break;
27300         case CDROMSDRVSPEED:
27301                 /* Convert the speed code to KB/sec */
27302                 switch ((uchar_t)data) {
27303                 case CDROM_NORMAL_SPEED:
27304                         current_speed = SD_SPEED_1X;
27305                         break;
27306                 case CDROM_DOUBLE_SPEED:
27307                         current_speed = 2 * SD_SPEED_1X;
27308                         break;
27309                 case CDROM_QUAD_SPEED:
27310                         current_speed = 4 * SD_SPEED_1X;
27311                         break;
27312                 case CDROM_TWELVE_SPEED:
27313                         current_speed = 12 * SD_SPEED_1X;
27314                         break;
27315                 case CDROM_MAXIMUM_SPEED:
27316                         current_speed = 0xffff;
27317                         break;
27318                 default:
27319                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27320                             "sr_atapi_change_speed: invalid drive speed %d\n",
27321                             (uchar_t)data);
27322                         kmem_free(sense, BUFLEN_MODE_CDROM_CAP);
27323                         return (EINVAL);
27324                 }
27325 
27326                 /* Check the request against the drive's max speed. */
27327                 if (current_speed != 0xffff) {
27328                         if (current_speed > max_speed) {
27329                                 kmem_free(sense, BUFLEN_MODE_CDROM_CAP);
27330                                 return (EINVAL);
27331                         }
27332                 }
27333 
27334                 /*
27335                  * Build and send the SET SPEED command
27336                  *
27337                  * Note: The SET SPEED (0xBB) command used in this routine is
27338                  * obsolete per the SCSI MMC spec but still supported in the
27339                  * MT FUJI vendor spec. Most equipment is adhereing to MT FUJI
27340                  * therefore the command is still implemented in this routine.
27341                  */
27342                 bzero(cdb, sizeof (cdb));
27343                 cdb[0] = (char)SCMD_SET_CDROM_SPEED;
27344                 cdb[2] = (uchar_t)(current_speed >> 8);
27345                 cdb[3] = (uchar_t)current_speed;
27346                 com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27347                 com->uscsi_cdb          = (caddr_t)cdb;
27348                 com->uscsi_cdblen  = CDB_GROUP5;
27349                 com->uscsi_bufaddr = NULL;
27350                 com->uscsi_buflen  = 0;
27351                 com->uscsi_flags   = USCSI_DIAGNOSE|USCSI_SILENT;
27352                 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, 0, SD_PATH_STANDARD);
27353                 break;
27354         default:
27355                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27356                     "sr_atapi_change_speed: Command '%x' Not Supported\n", cmd);
27357                 rval = EINVAL;
27358         }
27359 
27360         if (sense) {
27361                 kmem_free(sense, BUFLEN_MODE_CDROM_CAP);
27362         }
27363         if (com) {
27364                 kmem_free(com, sizeof (*com));
27365         }
27366         return (rval);
27367 }
27368 
27369 
27370 /*
27371  *    Function: sr_pause_resume()
27372  *
27373  * Description: This routine is the driver entry point for handling CD-ROM
27374  *              pause/resume ioctl requests. This only affects the audio play
27375  *              operation.
27376  *
27377  *   Arguments: dev - the device 'dev_t'
27378  *              cmd - the request type; one of CDROMPAUSE or CDROMRESUME, used
27379  *                    for setting the resume bit of the cdb.
27380  *
27381  * Return Code: the code returned by sd_send_scsi_cmd()
27382  *              EINVAL if invalid mode specified
27383  *
27384  */
27385 
27386 static int
27387 sr_pause_resume(dev_t dev, int cmd)
27388 {
27389         struct sd_lun           *un;
27390         struct uscsi_cmd        *com;
27391         char                    cdb[CDB_GROUP1];
27392         int                     rval;
27393 
27394         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27395                 return (ENXIO);
27396         }
27397 
27398         com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27399         bzero(cdb, CDB_GROUP1);
27400         cdb[0] = SCMD_PAUSE_RESUME;
27401         switch (cmd) {
27402         case CDROMRESUME:
27403                 cdb[8] = 1;
27404                 break;
27405         case CDROMPAUSE:
27406                 cdb[8] = 0;
27407                 break;
27408         default:
27409                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_pause_resume:"
27410                     " Command '%x' Not Supported\n", cmd);
27411                 rval = EINVAL;
27412                 goto done;
27413         }
27414 
27415         com->uscsi_cdb    = cdb;
27416         com->uscsi_cdblen = CDB_GROUP1;
27417         com->uscsi_flags  = USCSI_DIAGNOSE|USCSI_SILENT;
27418 
27419         rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27420             SD_PATH_STANDARD);
27421 
27422 done:
27423         kmem_free(com, sizeof (*com));
27424         return (rval);
27425 }
27426 
27427 
27428 /*
27429  *    Function: sr_play_msf()
27430  *
27431  * Description: This routine is the driver entry point for handling CD-ROM
27432  *              ioctl requests to output the audio signals at the specified
27433  *              starting address and continue the audio play until the specified
27434  *              ending address (CDROMPLAYMSF) The address is in Minute Second
27435  *              Frame (MSF) format.
27436  *
27437  *   Arguments: dev     - the device 'dev_t'
27438  *              data    - pointer to user provided audio msf structure,
27439  *                        specifying start/end addresses.
27440  *              flag    - this argument is a pass through to ddi_copyxxx()
27441  *                        directly from the mode argument of ioctl().
27442  *
27443  * Return Code: the code returned by sd_send_scsi_cmd()
27444  *              EFAULT if ddi_copyxxx() fails
27445  *              ENXIO if fail ddi_get_soft_state
27446  *              EINVAL if data pointer is NULL
27447  */
27448 
27449 static int
27450 sr_play_msf(dev_t dev, caddr_t data, int flag)
27451 {
27452         struct sd_lun           *un;
27453         struct uscsi_cmd        *com;
27454         struct cdrom_msf        msf_struct;
27455         struct cdrom_msf        *msf = &msf_struct;
27456         char                    cdb[CDB_GROUP1];
27457         int                     rval;
27458 
27459         if (data == NULL) {
27460                 return (EINVAL);
27461         }
27462 
27463         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27464                 return (ENXIO);
27465         }
27466 
27467         if (ddi_copyin(data, msf, sizeof (struct cdrom_msf), flag)) {
27468                 return (EFAULT);
27469         }
27470 
27471         com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27472         bzero(cdb, CDB_GROUP1);
27473         cdb[0] = SCMD_PLAYAUDIO_MSF;
27474         if (un->un_f_cfg_playmsf_bcd == TRUE) {
27475                 cdb[3] = BYTE_TO_BCD(msf->cdmsf_min0);
27476                 cdb[4] = BYTE_TO_BCD(msf->cdmsf_sec0);
27477                 cdb[5] = BYTE_TO_BCD(msf->cdmsf_frame0);
27478                 cdb[6] = BYTE_TO_BCD(msf->cdmsf_min1);
27479                 cdb[7] = BYTE_TO_BCD(msf->cdmsf_sec1);
27480                 cdb[8] = BYTE_TO_BCD(msf->cdmsf_frame1);
27481         } else {
27482                 cdb[3] = msf->cdmsf_min0;
27483                 cdb[4] = msf->cdmsf_sec0;
27484                 cdb[5] = msf->cdmsf_frame0;
27485                 cdb[6] = msf->cdmsf_min1;
27486                 cdb[7] = msf->cdmsf_sec1;
27487                 cdb[8] = msf->cdmsf_frame1;
27488         }
27489         com->uscsi_cdb    = cdb;
27490         com->uscsi_cdblen = CDB_GROUP1;
27491         com->uscsi_flags  = USCSI_DIAGNOSE|USCSI_SILENT;
27492         rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27493             SD_PATH_STANDARD);
27494         kmem_free(com, sizeof (*com));
27495         return (rval);
27496 }
27497 
27498 
27499 /*
27500  *    Function: sr_play_trkind()
27501  *
27502  * Description: This routine is the driver entry point for handling CD-ROM
27503  *              ioctl requests to output the audio signals at the specified
27504  *              starting address and continue the audio play until the specified
27505  *              ending address (CDROMPLAYTRKIND). The address is in Track Index
27506  *              format.
27507  *
27508  *   Arguments: dev     - the device 'dev_t'
27509  *              data    - pointer to user provided audio track/index structure,
27510  *                        specifying start/end addresses.
27511  *              flag    - this argument is a pass through to ddi_copyxxx()
27512  *                        directly from the mode argument of ioctl().
27513  *
27514  * Return Code: the code returned by sd_send_scsi_cmd()
27515  *              EFAULT if ddi_copyxxx() fails
27516  *              ENXIO if fail ddi_get_soft_state
27517  *              EINVAL if data pointer is NULL
27518  */
27519 
27520 static int
27521 sr_play_trkind(dev_t dev, caddr_t data, int flag)
27522 {
27523         struct cdrom_ti         ti_struct;
27524         struct cdrom_ti         *ti = &ti_struct;
27525         struct uscsi_cmd        *com = NULL;
27526         char                    cdb[CDB_GROUP1];
27527         int                     rval;
27528 
27529         if (data == NULL) {
27530                 return (EINVAL);
27531         }
27532 
27533         if (ddi_copyin(data, ti, sizeof (struct cdrom_ti), flag)) {
27534                 return (EFAULT);
27535         }
27536 
27537         com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27538         bzero(cdb, CDB_GROUP1);
27539         cdb[0] = SCMD_PLAYAUDIO_TI;
27540         cdb[4] = ti->cdti_trk0;
27541         cdb[5] = ti->cdti_ind0;
27542         cdb[7] = ti->cdti_trk1;
27543         cdb[8] = ti->cdti_ind1;
27544         com->uscsi_cdb    = cdb;
27545         com->uscsi_cdblen = CDB_GROUP1;
27546         com->uscsi_flags  = USCSI_DIAGNOSE|USCSI_SILENT;
27547         rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27548             SD_PATH_STANDARD);
27549         kmem_free(com, sizeof (*com));
27550         return (rval);
27551 }
27552 
27553 
27554 /*
27555  *    Function: sr_read_all_subcodes()
27556  *
27557  * Description: This routine is the driver entry point for handling CD-ROM
27558  *              ioctl requests to return raw subcode data while the target is
27559  *              playing audio (CDROMSUBCODE).
27560  *
27561  *   Arguments: dev     - the device 'dev_t'
27562  *              data    - pointer to user provided cdrom subcode structure,
27563  *                        specifying the transfer length and address.
27564  *              flag    - this argument is a pass through to ddi_copyxxx()
27565  *                        directly from the mode argument of ioctl().
27566  *
27567  * Return Code: the code returned by sd_send_scsi_cmd()
27568  *              EFAULT if ddi_copyxxx() fails
27569  *              ENXIO if fail ddi_get_soft_state
27570  *              EINVAL if data pointer is NULL
27571  */
27572 
27573 static int
27574 sr_read_all_subcodes(dev_t dev, caddr_t data, int flag)
27575 {
27576         struct sd_lun           *un = NULL;
27577         struct uscsi_cmd        *com = NULL;
27578         struct cdrom_subcode    *subcode = NULL;
27579         int                     rval;
27580         size_t                  buflen;
27581         char                    cdb[CDB_GROUP5];
27582 
27583 #ifdef _MULTI_DATAMODEL
27584         /* To support ILP32 applications in an LP64 world */
27585         struct cdrom_subcode32          cdrom_subcode32;
27586         struct cdrom_subcode32          *cdsc32 = &cdrom_subcode32;
27587 #endif
27588         if (data == NULL) {
27589                 return (EINVAL);
27590         }
27591 
27592         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27593                 return (ENXIO);
27594         }
27595 
27596         subcode = kmem_zalloc(sizeof (struct cdrom_subcode), KM_SLEEP);
27597 
27598 #ifdef _MULTI_DATAMODEL
27599         switch (ddi_model_convert_from(flag & FMODELS)) {
27600         case DDI_MODEL_ILP32:
27601                 if (ddi_copyin(data, cdsc32, sizeof (*cdsc32), flag)) {
27602                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27603                             "sr_read_all_subcodes: ddi_copyin Failed\n");
27604                         kmem_free(subcode, sizeof (struct cdrom_subcode));
27605                         return (EFAULT);
27606                 }
27607                 /* Convert the ILP32 uscsi data from the application to LP64 */
27608                 cdrom_subcode32tocdrom_subcode(cdsc32, subcode);
27609                 break;
27610         case DDI_MODEL_NONE:
27611                 if (ddi_copyin(data, subcode,
27612                     sizeof (struct cdrom_subcode), flag)) {
27613                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27614                             "sr_read_all_subcodes: ddi_copyin Failed\n");
27615                         kmem_free(subcode, sizeof (struct cdrom_subcode));
27616                         return (EFAULT);
27617                 }
27618                 break;
27619         }
27620 #else /* ! _MULTI_DATAMODEL */
27621         if (ddi_copyin(data, subcode, sizeof (struct cdrom_subcode), flag)) {
27622                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27623                     "sr_read_all_subcodes: ddi_copyin Failed\n");
27624                 kmem_free(subcode, sizeof (struct cdrom_subcode));
27625                 return (EFAULT);
27626         }
27627 #endif /* _MULTI_DATAMODEL */
27628 
27629         /*
27630          * Since MMC-2 expects max 3 bytes for length, check if the
27631          * length input is greater than 3 bytes
27632          */
27633         if ((subcode->cdsc_length & 0xFF000000) != 0) {
27634                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27635                     "sr_read_all_subcodes: "
27636                     "cdrom transfer length too large: %d (limit %d)\n",
27637                     subcode->cdsc_length, 0xFFFFFF);
27638                 kmem_free(subcode, sizeof (struct cdrom_subcode));
27639                 return (EINVAL);
27640         }
27641 
27642         buflen = CDROM_BLK_SUBCODE * subcode->cdsc_length;
27643         com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27644         bzero(cdb, CDB_GROUP5);
27645 
27646         if (un->un_f_mmc_cap == TRUE) {
27647                 cdb[0] = (char)SCMD_READ_CD;
27648                 cdb[2] = (char)0xff;
27649                 cdb[3] = (char)0xff;
27650                 cdb[4] = (char)0xff;
27651                 cdb[5] = (char)0xff;
27652                 cdb[6] = (((subcode->cdsc_length) & 0x00ff0000) >> 16);
27653                 cdb[7] = (((subcode->cdsc_length) & 0x0000ff00) >> 8);
27654                 cdb[8] = ((subcode->cdsc_length) & 0x000000ff);
27655                 cdb[10] = 1;
27656         } else {
27657                 /*
27658                  * Note: A vendor specific command (0xDF) is being used her to
27659                  * request a read of all subcodes.
27660                  */
27661                 cdb[0] = (char)SCMD_READ_ALL_SUBCODES;
27662                 cdb[6] = (((subcode->cdsc_length) & 0xff000000) >> 24);
27663                 cdb[7] = (((subcode->cdsc_length) & 0x00ff0000) >> 16);
27664                 cdb[8] = (((subcode->cdsc_length) & 0x0000ff00) >> 8);
27665                 cdb[9] = ((subcode->cdsc_length) & 0x000000ff);
27666         }
27667         com->uscsi_cdb          = cdb;
27668         com->uscsi_cdblen  = CDB_GROUP5;
27669         com->uscsi_bufaddr = (caddr_t)subcode->cdsc_addr;
27670         com->uscsi_buflen  = buflen;
27671         com->uscsi_flags   = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
27672         rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE,
27673             SD_PATH_STANDARD);
27674         kmem_free(subcode, sizeof (struct cdrom_subcode));
27675         kmem_free(com, sizeof (*com));
27676         return (rval);
27677 }
27678 
27679 
27680 /*
27681  *    Function: sr_read_subchannel()
27682  *
27683  * Description: This routine is the driver entry point for handling CD-ROM
27684  *              ioctl requests to return the Q sub-channel data of the CD
27685  *              current position block. (CDROMSUBCHNL) The data includes the
27686  *              track number, index number, absolute CD-ROM address (LBA or MSF
27687  *              format per the user) , track relative CD-ROM address (LBA or MSF
27688  *              format per the user), control data and audio status.
27689  *
27690  *   Arguments: dev     - the device 'dev_t'
27691  *              data    - pointer to user provided cdrom sub-channel structure
27692  *              flag    - this argument is a pass through to ddi_copyxxx()
27693  *                        directly from the mode argument of ioctl().
27694  *
27695  * Return Code: the code returned by sd_send_scsi_cmd()
27696  *              EFAULT if ddi_copyxxx() fails
27697  *              ENXIO if fail ddi_get_soft_state
27698  *              EINVAL if data pointer is NULL
27699  */
27700 
27701 static int
27702 sr_read_subchannel(dev_t dev, caddr_t data, int flag)
27703 {
27704         struct sd_lun           *un;
27705         struct uscsi_cmd        *com;
27706         struct cdrom_subchnl    subchanel;
27707         struct cdrom_subchnl    *subchnl = &subchanel;
27708         char                    cdb[CDB_GROUP1];
27709         caddr_t                 buffer;
27710         int                     rval;
27711 
27712         if (data == NULL) {
27713                 return (EINVAL);
27714         }
27715 
27716         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27717             (un->un_state == SD_STATE_OFFLINE)) {
27718                 return (ENXIO);
27719         }
27720 
27721         if (ddi_copyin(data, subchnl, sizeof (struct cdrom_subchnl), flag)) {
27722                 return (EFAULT);
27723         }
27724 
27725         buffer = kmem_zalloc((size_t)16, KM_SLEEP);
27726         bzero(cdb, CDB_GROUP1);
27727         cdb[0] = SCMD_READ_SUBCHANNEL;
27728         /* Set the MSF bit based on the user requested address format */
27729         cdb[1] = (subchnl->cdsc_format & CDROM_LBA) ? 0 : 0x02;
27730         /*
27731          * Set the Q bit in byte 2 to indicate that Q sub-channel data be
27732          * returned
27733          */
27734         cdb[2] = 0x40;
27735         /*
27736          * Set byte 3 to specify the return data format. A value of 0x01
27737          * indicates that the CD-ROM current position should be returned.
27738          */
27739         cdb[3] = 0x01;
27740         cdb[8] = 0x10;
27741         com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27742         com->uscsi_cdb          = cdb;
27743         com->uscsi_cdblen  = CDB_GROUP1;
27744         com->uscsi_bufaddr = buffer;
27745         com->uscsi_buflen  = 16;
27746         com->uscsi_flags   = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
27747         rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27748             SD_PATH_STANDARD);
27749         if (rval != 0) {
27750                 kmem_free(buffer, 16);
27751                 kmem_free(com, sizeof (*com));
27752                 return (rval);
27753         }
27754 
27755         /* Process the returned Q sub-channel data */
27756         subchnl->cdsc_audiostatus = buffer[1];
27757         subchnl->cdsc_adr    = (buffer[5] & 0xF0) >> 4;
27758         subchnl->cdsc_ctrl   = (buffer[5] & 0x0F);
27759         subchnl->cdsc_trk    = buffer[6];
27760         subchnl->cdsc_ind    = buffer[7];
27761         if (subchnl->cdsc_format & CDROM_LBA) {
27762                 subchnl->cdsc_absaddr.lba =
27763                     ((uchar_t)buffer[8] << 24) + ((uchar_t)buffer[9] << 16) +
27764                     ((uchar_t)buffer[10] << 8) + ((uchar_t)buffer[11]);
27765                 subchnl->cdsc_reladdr.lba =
27766                     ((uchar_t)buffer[12] << 24) + ((uchar_t)buffer[13] << 16) +
27767                     ((uchar_t)buffer[14] << 8) + ((uchar_t)buffer[15]);
27768         } else if (un->un_f_cfg_readsub_bcd == TRUE) {
27769                 subchnl->cdsc_absaddr.msf.minute = BCD_TO_BYTE(buffer[9]);
27770                 subchnl->cdsc_absaddr.msf.second = BCD_TO_BYTE(buffer[10]);
27771                 subchnl->cdsc_absaddr.msf.frame  = BCD_TO_BYTE(buffer[11]);
27772                 subchnl->cdsc_reladdr.msf.minute = BCD_TO_BYTE(buffer[13]);
27773                 subchnl->cdsc_reladdr.msf.second = BCD_TO_BYTE(buffer[14]);
27774                 subchnl->cdsc_reladdr.msf.frame  = BCD_TO_BYTE(buffer[15]);
27775         } else {
27776                 subchnl->cdsc_absaddr.msf.minute = buffer[9];
27777                 subchnl->cdsc_absaddr.msf.second = buffer[10];
27778                 subchnl->cdsc_absaddr.msf.frame  = buffer[11];
27779                 subchnl->cdsc_reladdr.msf.minute = buffer[13];
27780                 subchnl->cdsc_reladdr.msf.second = buffer[14];
27781                 subchnl->cdsc_reladdr.msf.frame  = buffer[15];
27782         }
27783         kmem_free(buffer, 16);
27784         kmem_free(com, sizeof (*com));
27785         if (ddi_copyout(subchnl, data, sizeof (struct cdrom_subchnl), flag)
27786             != 0) {
27787                 return (EFAULT);
27788         }
27789         return (rval);
27790 }
27791 
27792 
27793 /*
27794  *    Function: sr_read_tocentry()
27795  *
27796  * Description: This routine is the driver entry point for handling CD-ROM
27797  *              ioctl requests to read from the Table of Contents (TOC)
27798  *              (CDROMREADTOCENTRY). This routine provides the ADR and CTRL
27799  *              fields, the starting address (LBA or MSF format per the user)
27800  *              and the data mode if the user specified track is a data track.
27801  *
27802  *              Note: The READ HEADER (0x44) command used in this routine is
27803  *              obsolete per the SCSI MMC spec but still supported in the
27804  *              MT FUJI vendor spec. Most equipment is adhereing to MT FUJI
27805  *              therefore the command is still implemented in this routine.
27806  *
27807  *   Arguments: dev     - the device 'dev_t'
27808  *              data    - pointer to user provided toc entry structure,
27809  *                        specifying the track # and the address format
27810  *                        (LBA or MSF).
27811  *              flag    - this argument is a pass through to ddi_copyxxx()
27812  *                        directly from the mode argument of ioctl().
27813  *
27814  * Return Code: the code returned by sd_send_scsi_cmd()
27815  *              EFAULT if ddi_copyxxx() fails
27816  *              ENXIO if fail ddi_get_soft_state
27817  *              EINVAL if data pointer is NULL
27818  */
27819 
27820 static int
27821 sr_read_tocentry(dev_t dev, caddr_t data, int flag)
27822 {
27823         struct sd_lun           *un = NULL;
27824         struct uscsi_cmd        *com;
27825         struct cdrom_tocentry   toc_entry;
27826         struct cdrom_tocentry   *entry = &toc_entry;
27827         caddr_t                 buffer;
27828         int                     rval;
27829         char                    cdb[CDB_GROUP1];
27830 
27831         if (data == NULL) {
27832                 return (EINVAL);
27833         }
27834 
27835         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27836             (un->un_state == SD_STATE_OFFLINE)) {
27837                 return (ENXIO);
27838         }
27839 
27840         if (ddi_copyin(data, entry, sizeof (struct cdrom_tocentry), flag)) {
27841                 return (EFAULT);
27842         }
27843 
27844         /* Validate the requested track and address format */
27845         if (!(entry->cdte_format & (CDROM_LBA | CDROM_MSF))) {
27846                 return (EINVAL);
27847         }
27848 
27849         if (entry->cdte_track == 0) {
27850                 return (EINVAL);
27851         }
27852 
27853         buffer = kmem_zalloc((size_t)12, KM_SLEEP);
27854         com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27855         bzero(cdb, CDB_GROUP1);
27856 
27857         cdb[0] = SCMD_READ_TOC;
27858         /* Set the MSF bit based on the user requested address format  */
27859         cdb[1] = ((entry->cdte_format & CDROM_LBA) ? 0 : 2);
27860         if (un->un_f_cfg_read_toc_trk_bcd == TRUE) {
27861                 cdb[6] = BYTE_TO_BCD(entry->cdte_track);
27862         } else {
27863                 cdb[6] = entry->cdte_track;
27864         }
27865 
27866         /*
27867          * Bytes 7 & 8 are the 12 byte allocation length for a single entry.
27868          * (4 byte TOC response header + 8 byte track descriptor)
27869          */
27870         cdb[8] = 12;
27871         com->uscsi_cdb          = cdb;
27872         com->uscsi_cdblen  = CDB_GROUP1;
27873         com->uscsi_bufaddr = buffer;
27874         com->uscsi_buflen  = 0x0C;
27875         com->uscsi_flags   = (USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ);
27876         rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27877             SD_PATH_STANDARD);
27878         if (rval != 0) {
27879                 kmem_free(buffer, 12);
27880                 kmem_free(com, sizeof (*com));
27881                 return (rval);
27882         }
27883 
27884         /* Process the toc entry */
27885         entry->cdte_adr              = (buffer[5] & 0xF0) >> 4;
27886         entry->cdte_ctrl     = (buffer[5] & 0x0F);
27887         if (entry->cdte_format & CDROM_LBA) {
27888                 entry->cdte_addr.lba =
27889                     ((uchar_t)buffer[8] << 24) + ((uchar_t)buffer[9] << 16) +
27890                     ((uchar_t)buffer[10] << 8) + ((uchar_t)buffer[11]);
27891         } else if (un->un_f_cfg_read_toc_addr_bcd == TRUE) {
27892                 entry->cdte_addr.msf.minute  = BCD_TO_BYTE(buffer[9]);
27893                 entry->cdte_addr.msf.second  = BCD_TO_BYTE(buffer[10]);
27894                 entry->cdte_addr.msf.frame   = BCD_TO_BYTE(buffer[11]);
27895                 /*
27896                  * Send a READ TOC command using the LBA address format to get
27897                  * the LBA for the track requested so it can be used in the
27898                  * READ HEADER request
27899                  *
27900                  * Note: The MSF bit of the READ HEADER command specifies the
27901                  * output format. The block address specified in that command
27902                  * must be in LBA format.
27903                  */
27904                 cdb[1] = 0;
27905                 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27906                     SD_PATH_STANDARD);
27907                 if (rval != 0) {
27908                         kmem_free(buffer, 12);
27909                         kmem_free(com, sizeof (*com));
27910                         return (rval);
27911                 }
27912         } else {
27913                 entry->cdte_addr.msf.minute  = buffer[9];
27914                 entry->cdte_addr.msf.second  = buffer[10];
27915                 entry->cdte_addr.msf.frame   = buffer[11];
27916                 /*
27917                  * Send a READ TOC command using the LBA address format to get
27918                  * the LBA for the track requested so it can be used in the
27919                  * READ HEADER request
27920                  *
27921                  * Note: The MSF bit of the READ HEADER command specifies the
27922                  * output format. The block address specified in that command
27923                  * must be in LBA format.
27924                  */
27925                 cdb[1] = 0;
27926                 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27927                     SD_PATH_STANDARD);
27928                 if (rval != 0) {
27929                         kmem_free(buffer, 12);
27930                         kmem_free(com, sizeof (*com));
27931                         return (rval);
27932                 }
27933         }
27934 
27935         /*
27936          * Build and send the READ HEADER command to determine the data mode of
27937          * the user specified track.
27938          */
27939         if ((entry->cdte_ctrl & CDROM_DATA_TRACK) &&
27940             (entry->cdte_track != CDROM_LEADOUT)) {
27941                 bzero(cdb, CDB_GROUP1);
27942                 cdb[0] = SCMD_READ_HEADER;
27943                 cdb[2] = buffer[8];
27944                 cdb[3] = buffer[9];
27945                 cdb[4] = buffer[10];
27946                 cdb[5] = buffer[11];
27947                 cdb[8] = 0x08;
27948                 com->uscsi_buflen = 0x08;
27949                 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27950                     SD_PATH_STANDARD);
27951                 if (rval == 0) {
27952                         entry->cdte_datamode = buffer[0];
27953                 } else {
27954                         /*
27955                          * READ HEADER command failed, since this is
27956                          * obsoleted in one spec, its better to return
27957                          * -1 for an invlid track so that we can still
27958                          * receive the rest of the TOC data.
27959                          */
27960                         entry->cdte_datamode = (uchar_t)-1;
27961                 }
27962         } else {
27963                 entry->cdte_datamode = (uchar_t)-1;
27964         }
27965 
27966         kmem_free(buffer, 12);
27967         kmem_free(com, sizeof (*com));
27968         if (ddi_copyout(entry, data, sizeof (struct cdrom_tocentry), flag) != 0)
27969                 return (EFAULT);
27970 
27971         return (rval);
27972 }
27973 
27974 
27975 /*
27976  *    Function: sr_read_tochdr()
27977  *
27978  * Description: This routine is the driver entry point for handling CD-ROM
27979  *              ioctl requests to read the Table of Contents (TOC) header
27980  *              (CDROMREADTOHDR). The TOC header consists of the disk starting
27981  *              and ending track numbers
27982  *
27983  *   Arguments: dev     - the device 'dev_t'
27984  *              data    - pointer to user provided toc header structure,
27985  *                        specifying the starting and ending track numbers.
27986  *              flag    - this argument is a pass through to ddi_copyxxx()
27987  *                        directly from the mode argument of ioctl().
27988  *
27989  * Return Code: the code returned by sd_send_scsi_cmd()
27990  *              EFAULT if ddi_copyxxx() fails
27991  *              ENXIO if fail ddi_get_soft_state
27992  *              EINVAL if data pointer is NULL
27993  */
27994 
27995 static int
27996 sr_read_tochdr(dev_t dev, caddr_t data, int flag)
27997 {
27998         struct sd_lun           *un;
27999         struct uscsi_cmd        *com;
28000         struct cdrom_tochdr     toc_header;
28001         struct cdrom_tochdr     *hdr = &toc_header;
28002         char                    cdb[CDB_GROUP1];
28003         int                     rval;
28004         caddr_t                 buffer;
28005 
28006         if (data == NULL) {
28007                 return (EINVAL);
28008         }
28009 
28010         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28011             (un->un_state == SD_STATE_OFFLINE)) {
28012                 return (ENXIO);
28013         }
28014 
28015         buffer = kmem_zalloc(4, KM_SLEEP);
28016         bzero(cdb, CDB_GROUP1);
28017         cdb[0] = SCMD_READ_TOC;
28018         /*
28019          * Specifying a track number of 0x00 in the READ TOC command indicates
28020          * that the TOC header should be returned
28021          */
28022         cdb[6] = 0x00;
28023         /*
28024          * Bytes 7 & 8 are the 4 byte allocation length for TOC header.
28025          * (2 byte data len + 1 byte starting track # + 1 byte ending track #)
28026          */
28027         cdb[8] = 0x04;
28028         com = kmem_zalloc(sizeof (*com), KM_SLEEP);
28029         com->uscsi_cdb          = cdb;
28030         com->uscsi_cdblen  = CDB_GROUP1;
28031         com->uscsi_bufaddr = buffer;
28032         com->uscsi_buflen  = 0x04;
28033         com->uscsi_timeout = 300;
28034         com->uscsi_flags   = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
28035 
28036         rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
28037             SD_PATH_STANDARD);
28038         if (un->un_f_cfg_read_toc_trk_bcd == TRUE) {
28039                 hdr->cdth_trk0 = BCD_TO_BYTE(buffer[2]);
28040                 hdr->cdth_trk1 = BCD_TO_BYTE(buffer[3]);
28041         } else {
28042                 hdr->cdth_trk0 = buffer[2];
28043                 hdr->cdth_trk1 = buffer[3];
28044         }
28045         kmem_free(buffer, 4);
28046         kmem_free(com, sizeof (*com));
28047         if (ddi_copyout(hdr, data, sizeof (struct cdrom_tochdr), flag) != 0) {
28048                 return (EFAULT);
28049         }
28050         return (rval);
28051 }
28052 
28053 
28054 /*
28055  * Note: The following sr_read_mode1(), sr_read_cd_mode2(), sr_read_mode2(),
28056  * sr_read_cdda(), sr_read_cdxa(), routines implement driver support for
28057  * handling CDROMREAD ioctl requests for mode 1 user data, mode 2 user data,
28058  * digital audio and extended architecture digital audio. These modes are
28059  * defined in the IEC908 (Red Book), ISO10149 (Yellow Book), and the SCSI3
28060  * MMC specs.
28061  *
28062  * In addition to support for the various data formats these routines also
28063  * include support for devices that implement only the direct access READ
28064  * commands (0x08, 0x28), devices that implement the READ_CD commands
28065  * (0xBE, 0xD4), and devices that implement the vendor unique READ CDDA and
28066  * READ CDXA commands (0xD8, 0xDB)
28067  */
28068 
28069 /*
28070  *    Function: sr_read_mode1()
28071  *
28072  * Description: This routine is the driver entry point for handling CD-ROM
28073  *              ioctl read mode1 requests (CDROMREADMODE1).
28074  *
28075  *   Arguments: dev     - the device 'dev_t'
28076  *              data    - pointer to user provided cd read structure specifying
28077  *                        the lba buffer address and length.
28078  *              flag    - this argument is a pass through to ddi_copyxxx()
28079  *                        directly from the mode argument of ioctl().
28080  *
28081  * Return Code: the code returned by sd_send_scsi_cmd()
28082  *              EFAULT if ddi_copyxxx() fails
28083  *              ENXIO if fail ddi_get_soft_state
28084  *              EINVAL if data pointer is NULL
28085  */
28086 
28087 static int
28088 sr_read_mode1(dev_t dev, caddr_t data, int flag)
28089 {
28090         struct sd_lun           *un;
28091         struct cdrom_read       mode1_struct;
28092         struct cdrom_read       *mode1 = &mode1_struct;
28093         int                     rval;
28094         sd_ssc_t                *ssc;
28095 
28096 #ifdef _MULTI_DATAMODEL
28097         /* To support ILP32 applications in an LP64 world */
28098         struct cdrom_read32     cdrom_read32;
28099         struct cdrom_read32     *cdrd32 = &cdrom_read32;
28100 #endif /* _MULTI_DATAMODEL */
28101 
28102         if (data == NULL) {
28103                 return (EINVAL);
28104         }
28105 
28106         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28107             (un->un_state == SD_STATE_OFFLINE)) {
28108                 return (ENXIO);
28109         }
28110 
28111         SD_TRACE(SD_LOG_ATTACH_DETACH, un,
28112             "sd_read_mode1: entry: un:0x%p\n", un);
28113 
28114 #ifdef _MULTI_DATAMODEL
28115         switch (ddi_model_convert_from(flag & FMODELS)) {
28116         case DDI_MODEL_ILP32:
28117                 if (ddi_copyin(data, cdrd32, sizeof (*cdrd32), flag) != 0) {
28118                         return (EFAULT);
28119                 }
28120                 /* Convert the ILP32 uscsi data from the application to LP64 */
28121                 cdrom_read32tocdrom_read(cdrd32, mode1);
28122                 break;
28123         case DDI_MODEL_NONE:
28124                 if (ddi_copyin(data, mode1, sizeof (struct cdrom_read), flag)) {
28125                         return (EFAULT);
28126                 }
28127         }
28128 #else /* ! _MULTI_DATAMODEL */
28129         if (ddi_copyin(data, mode1, sizeof (struct cdrom_read), flag)) {
28130                 return (EFAULT);
28131         }
28132 #endif /* _MULTI_DATAMODEL */
28133 
28134         ssc = sd_ssc_init(un);
28135         rval = sd_send_scsi_READ(ssc, mode1->cdread_bufaddr,
28136             mode1->cdread_buflen, mode1->cdread_lba, SD_PATH_STANDARD);
28137         sd_ssc_fini(ssc);
28138 
28139         SD_TRACE(SD_LOG_ATTACH_DETACH, un,
28140             "sd_read_mode1: exit: un:0x%p\n", un);
28141 
28142         return (rval);
28143 }
28144 
28145 
28146 /*
28147  *    Function: sr_read_cd_mode2()
28148  *
28149  * Description: This routine is the driver entry point for handling CD-ROM
28150  *              ioctl read mode2 requests (CDROMREADMODE2) for devices that
28151  *              support the READ CD (0xBE) command or the 1st generation
28152  *              READ CD (0xD4) command.
28153  *
28154  *   Arguments: dev     - the device 'dev_t'
28155  *              data    - pointer to user provided cd read structure specifying
28156  *                        the lba buffer address and length.
28157  *              flag    - this argument is a pass through to ddi_copyxxx()
28158  *                        directly from the mode argument of ioctl().
28159  *
28160  * Return Code: the code returned by sd_send_scsi_cmd()
28161  *              EFAULT if ddi_copyxxx() fails
28162  *              ENXIO if fail ddi_get_soft_state
28163  *              EINVAL if data pointer is NULL
28164  */
28165 
28166 static int
28167 sr_read_cd_mode2(dev_t dev, caddr_t data, int flag)
28168 {
28169         struct sd_lun           *un;
28170         struct uscsi_cmd        *com;
28171         struct cdrom_read       mode2_struct;
28172         struct cdrom_read       *mode2 = &mode2_struct;
28173         uchar_t                 cdb[CDB_GROUP5];
28174         int                     nblocks;
28175         int                     rval;
28176 #ifdef _MULTI_DATAMODEL
28177         /*  To support ILP32 applications in an LP64 world */
28178         struct cdrom_read32     cdrom_read32;
28179         struct cdrom_read32     *cdrd32 = &cdrom_read32;
28180 #endif /* _MULTI_DATAMODEL */
28181 
28182         if (data == NULL) {
28183                 return (EINVAL);
28184         }
28185 
28186         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28187             (un->un_state == SD_STATE_OFFLINE)) {
28188                 return (ENXIO);
28189         }
28190 
28191 #ifdef _MULTI_DATAMODEL
28192         switch (ddi_model_convert_from(flag & FMODELS)) {
28193         case DDI_MODEL_ILP32:
28194                 if (ddi_copyin(data, cdrd32, sizeof (*cdrd32), flag) != 0) {
28195                         return (EFAULT);
28196                 }
28197                 /* Convert the ILP32 uscsi data from the application to LP64 */
28198                 cdrom_read32tocdrom_read(cdrd32, mode2);
28199                 break;
28200         case DDI_MODEL_NONE:
28201                 if (ddi_copyin(data, mode2, sizeof (*mode2), flag) != 0) {
28202                         return (EFAULT);
28203                 }
28204                 break;
28205         }
28206 
28207 #else /* ! _MULTI_DATAMODEL */
28208         if (ddi_copyin(data, mode2, sizeof (*mode2), flag) != 0) {
28209                 return (EFAULT);
28210         }
28211 #endif /* _MULTI_DATAMODEL */
28212 
28213         bzero(cdb, sizeof (cdb));
28214         if (un->un_f_cfg_read_cd_xd4 == TRUE) {
28215                 /* Read command supported by 1st generation atapi drives */
28216                 cdb[0] = SCMD_READ_CDD4;
28217         } else {
28218                 /* Universal CD Access Command */
28219                 cdb[0] = SCMD_READ_CD;
28220         }
28221 
28222         /*
28223          * Set expected sector type to: 2336s byte, Mode 2 Yellow Book
28224          */
28225         cdb[1] = CDROM_SECTOR_TYPE_MODE2;
28226 
28227         /* set the start address */
28228         cdb[2] = (uchar_t)((mode2->cdread_lba >> 24) & 0XFF);
28229         cdb[3] = (uchar_t)((mode2->cdread_lba >> 16) & 0XFF);
28230         cdb[4] = (uchar_t)((mode2->cdread_lba >> 8) & 0xFF);
28231         cdb[5] = (uchar_t)(mode2->cdread_lba & 0xFF);
28232 
28233         /* set the transfer length */
28234         nblocks = mode2->cdread_buflen / 2336;
28235         cdb[6] = (uchar_t)(nblocks >> 16);
28236         cdb[7] = (uchar_t)(nblocks >> 8);
28237         cdb[8] = (uchar_t)nblocks;
28238 
28239         /* set the filter bits */
28240         cdb[9] = CDROM_READ_CD_USERDATA;
28241 
28242         com = kmem_zalloc(sizeof (*com), KM_SLEEP);
28243         com->uscsi_cdb = (caddr_t)cdb;
28244         com->uscsi_cdblen = sizeof (cdb);
28245         com->uscsi_bufaddr = mode2->cdread_bufaddr;
28246         com->uscsi_buflen = mode2->cdread_buflen;
28247         com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
28248 
28249         rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE,
28250             SD_PATH_STANDARD);
28251         kmem_free(com, sizeof (*com));
28252         return (rval);
28253 }
28254 
28255 
28256 /*
28257  *    Function: sr_read_mode2()
28258  *
28259  * Description: This routine is the driver entry point for handling CD-ROM
28260  *              ioctl read mode2 requests (CDROMREADMODE2) for devices that
28261  *              do not support the READ CD (0xBE) command.
28262  *
28263  *   Arguments: dev     - the device 'dev_t'
28264  *              data    - pointer to user provided cd read structure specifying
28265  *                        the lba buffer address and length.
28266  *              flag    - this argument is a pass through to ddi_copyxxx()
28267  *                        directly from the mode argument of ioctl().
28268  *
28269  * Return Code: the code returned by sd_send_scsi_cmd()
28270  *              EFAULT if ddi_copyxxx() fails
28271  *              ENXIO if fail ddi_get_soft_state
28272  *              EINVAL if data pointer is NULL
28273  *              EIO if fail to reset block size
28274  *              EAGAIN if commands are in progress in the driver
28275  */
28276 
28277 static int
28278 sr_read_mode2(dev_t dev, caddr_t data, int flag)
28279 {
28280         struct sd_lun           *un;
28281         struct cdrom_read       mode2_struct;
28282         struct cdrom_read       *mode2 = &mode2_struct;
28283         int                     rval;
28284         uint32_t                restore_blksize;
28285         struct uscsi_cmd        *com;
28286         uchar_t                 cdb[CDB_GROUP0];
28287         int                     nblocks;
28288 
28289 #ifdef _MULTI_DATAMODEL
28290         /* To support ILP32 applications in an LP64 world */
28291         struct cdrom_read32     cdrom_read32;
28292         struct cdrom_read32     *cdrd32 = &cdrom_read32;
28293 #endif /* _MULTI_DATAMODEL */
28294 
28295         if (data == NULL) {
28296                 return (EINVAL);
28297         }
28298 
28299         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28300             (un->un_state == SD_STATE_OFFLINE)) {
28301                 return (ENXIO);
28302         }
28303 
28304         /*
28305          * Because this routine will update the device and driver block size
28306          * being used we want to make sure there are no commands in progress.
28307          * If commands are in progress the user will have to try again.
28308          *
28309          * We check for 1 instead of 0 because we increment un_ncmds_in_driver
28310          * in sdioctl to protect commands from sdioctl through to the top of
28311          * sd_uscsi_strategy. See sdioctl for details.
28312          */
28313         mutex_enter(SD_MUTEX(un));
28314         if (un->un_ncmds_in_driver != 1) {
28315                 mutex_exit(SD_MUTEX(un));
28316                 return (EAGAIN);
28317         }
28318         mutex_exit(SD_MUTEX(un));
28319 
28320         SD_TRACE(SD_LOG_ATTACH_DETACH, un,
28321             "sd_read_mode2: entry: un:0x%p\n", un);
28322 
28323 #ifdef _MULTI_DATAMODEL
28324         switch (ddi_model_convert_from(flag & FMODELS)) {
28325         case DDI_MODEL_ILP32:
28326                 if (ddi_copyin(data, cdrd32, sizeof (*cdrd32), flag) != 0) {
28327                         return (EFAULT);
28328                 }
28329                 /* Convert the ILP32 uscsi data from the application to LP64 */
28330                 cdrom_read32tocdrom_read(cdrd32, mode2);
28331                 break;
28332         case DDI_MODEL_NONE:
28333                 if (ddi_copyin(data, mode2, sizeof (*mode2), flag) != 0) {
28334                         return (EFAULT);
28335                 }
28336                 break;
28337         }
28338 #else /* ! _MULTI_DATAMODEL */
28339         if (ddi_copyin(data, mode2, sizeof (*mode2), flag)) {
28340                 return (EFAULT);
28341         }
28342 #endif /* _MULTI_DATAMODEL */
28343 
28344         /* Store the current target block size for restoration later */
28345         restore_blksize = un->un_tgt_blocksize;
28346 
28347         /* Change the device and soft state target block size to 2336 */
28348         if (sr_sector_mode(dev, SD_MODE2_BLKSIZE) != 0) {
28349                 rval = EIO;
28350                 goto done;
28351         }
28352 
28353 
28354         bzero(cdb, sizeof (cdb));
28355 
28356         /* set READ operation */
28357         cdb[0] = SCMD_READ;
28358 
28359         /* adjust lba for 2kbyte blocks from 512 byte blocks */
28360         mode2->cdread_lba >>= 2;
28361 
28362         /* set the start address */
28363         cdb[1] = (uchar_t)((mode2->cdread_lba >> 16) & 0X1F);
28364         cdb[2] = (uchar_t)((mode2->cdread_lba >> 8) & 0xFF);
28365         cdb[3] = (uchar_t)(mode2->cdread_lba & 0xFF);
28366 
28367         /* set the transfer length */
28368         nblocks = mode2->cdread_buflen / 2336;
28369         cdb[4] = (uchar_t)nblocks & 0xFF;
28370 
28371         /* build command */
28372         com = kmem_zalloc(sizeof (*com), KM_SLEEP);
28373         com->uscsi_cdb = (caddr_t)cdb;
28374         com->uscsi_cdblen = sizeof (cdb);
28375         com->uscsi_bufaddr = mode2->cdread_bufaddr;
28376         com->uscsi_buflen = mode2->cdread_buflen;
28377         com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
28378 
28379         /*
28380          * Issue SCSI command with user space address for read buffer.
28381          *
28382          * This sends the command through main channel in the driver.
28383          *
28384          * Since this is accessed via an IOCTL call, we go through the
28385          * standard path, so that if the device was powered down, then
28386          * it would be 'awakened' to handle the command.
28387          */
28388         rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE,
28389             SD_PATH_STANDARD);
28390 
28391         kmem_free(com, sizeof (*com));
28392 
28393         /* Restore the device and soft state target block size */
28394         if (sr_sector_mode(dev, restore_blksize) != 0) {
28395                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28396                     "can't do switch back to mode 1\n");
28397                 /*
28398                  * If sd_send_scsi_READ succeeded we still need to report
28399                  * an error because we failed to reset the block size
28400                  */
28401                 if (rval == 0) {
28402                         rval = EIO;
28403                 }
28404         }
28405 
28406 done:
28407         SD_TRACE(SD_LOG_ATTACH_DETACH, un,
28408             "sd_read_mode2: exit: un:0x%p\n", un);
28409 
28410         return (rval);
28411 }
28412 
28413 
28414 /*
28415  *    Function: sr_sector_mode()
28416  *
28417  * Description: This utility function is used by sr_read_mode2 to set the target
28418  *              block size based on the user specified size. This is a legacy
28419  *              implementation based upon a vendor specific mode page
28420  *
28421  *   Arguments: dev     - the device 'dev_t'
28422  *              data    - flag indicating if block size is being set to 2336 or
28423  *                        512.
28424  *
28425  * Return Code: the code returned by sd_send_scsi_cmd()
28426  *              EFAULT if ddi_copyxxx() fails
28427  *              ENXIO if fail ddi_get_soft_state
28428  *              EINVAL if data pointer is NULL
28429  */
28430 
28431 static int
28432 sr_sector_mode(dev_t dev, uint32_t blksize)
28433 {
28434         struct sd_lun   *un;
28435         uchar_t         *sense;
28436         uchar_t         *select;
28437         int             rval;
28438         sd_ssc_t        *ssc;
28439 
28440         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28441             (un->un_state == SD_STATE_OFFLINE)) {
28442                 return (ENXIO);
28443         }
28444 
28445         sense = kmem_zalloc(20, KM_SLEEP);
28446 
28447         /* Note: This is a vendor specific mode page (0x81) */
28448         ssc = sd_ssc_init(un);
28449         rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense, 20, 0x81,
28450             SD_PATH_STANDARD);
28451         sd_ssc_fini(ssc);
28452         if (rval != 0) {
28453                 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
28454                     "sr_sector_mode: Mode Sense failed\n");
28455                 kmem_free(sense, 20);
28456                 return (rval);
28457         }
28458         select = kmem_zalloc(20, KM_SLEEP);
28459         select[3] = 0x08;
28460         select[10] = ((blksize >> 8) & 0xff);
28461         select[11] = (blksize & 0xff);
28462         select[12] = 0x01;
28463         select[13] = 0x06;
28464         select[14] = sense[14];
28465         select[15] = sense[15];
28466         if (blksize == SD_MODE2_BLKSIZE) {
28467                 select[14] |= 0x01;
28468         }
28469 
28470         ssc = sd_ssc_init(un);
28471         rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select, 20,
28472             SD_DONTSAVE_PAGE, SD_PATH_STANDARD);
28473         sd_ssc_fini(ssc);
28474         if (rval != 0) {
28475                 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
28476                     "sr_sector_mode: Mode Select failed\n");
28477         } else {
28478                 /*
28479                  * Only update the softstate block size if we successfully
28480                  * changed the device block mode.
28481                  */
28482                 mutex_enter(SD_MUTEX(un));
28483                 sd_update_block_info(un, blksize, 0);
28484                 mutex_exit(SD_MUTEX(un));
28485         }
28486         kmem_free(sense, 20);
28487         kmem_free(select, 20);
28488         return (rval);
28489 }
28490 
28491 
28492 /*
28493  *    Function: sr_read_cdda()
28494  *
28495  * Description: This routine is the driver entry point for handling CD-ROM
28496  *              ioctl requests to return CD-DA or subcode data. (CDROMCDDA) If
28497  *              the target supports CDDA these requests are handled via a vendor
28498  *              specific command (0xD8) If the target does not support CDDA
28499  *              these requests are handled via the READ CD command (0xBE).
28500  *
28501  *   Arguments: dev     - the device 'dev_t'
28502  *              data    - pointer to user provided CD-DA structure specifying
28503  *                        the track starting address, transfer length, and
28504  *                        subcode options.
28505  *              flag    - this argument is a pass through to ddi_copyxxx()
28506  *                        directly from the mode argument of ioctl().
28507  *
28508  * Return Code: the code returned by sd_send_scsi_cmd()
28509  *              EFAULT if ddi_copyxxx() fails
28510  *              ENXIO if fail ddi_get_soft_state
28511  *              EINVAL if invalid arguments are provided
28512  *              ENOTTY
28513  */
28514 
28515 static int
28516 sr_read_cdda(dev_t dev, caddr_t data, int flag)
28517 {
28518         struct sd_lun                   *un;
28519         struct uscsi_cmd                *com;
28520         struct cdrom_cdda               *cdda;
28521         int                             rval;
28522         size_t                          buflen;
28523         char                            cdb[CDB_GROUP5];
28524 
28525 #ifdef _MULTI_DATAMODEL
28526         /* To support ILP32 applications in an LP64 world */
28527         struct cdrom_cdda32     cdrom_cdda32;
28528         struct cdrom_cdda32     *cdda32 = &cdrom_cdda32;
28529 #endif /* _MULTI_DATAMODEL */
28530 
28531         if (data == NULL) {
28532                 return (EINVAL);
28533         }
28534 
28535         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
28536                 return (ENXIO);
28537         }
28538 
28539         cdda = kmem_zalloc(sizeof (struct cdrom_cdda), KM_SLEEP);
28540 
28541 #ifdef _MULTI_DATAMODEL
28542         switch (ddi_model_convert_from(flag & FMODELS)) {
28543         case DDI_MODEL_ILP32:
28544                 if (ddi_copyin(data, cdda32, sizeof (*cdda32), flag)) {
28545                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28546                             "sr_read_cdda: ddi_copyin Failed\n");
28547                         kmem_free(cdda, sizeof (struct cdrom_cdda));
28548                         return (EFAULT);
28549                 }
28550                 /* Convert the ILP32 uscsi data from the application to LP64 */
28551                 cdrom_cdda32tocdrom_cdda(cdda32, cdda);
28552                 break;
28553         case DDI_MODEL_NONE:
28554                 if (ddi_copyin(data, cdda, sizeof (struct cdrom_cdda), flag)) {
28555                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28556                             "sr_read_cdda: ddi_copyin Failed\n");
28557                         kmem_free(cdda, sizeof (struct cdrom_cdda));
28558                         return (EFAULT);
28559                 }
28560                 break;
28561         }
28562 #else /* ! _MULTI_DATAMODEL */
28563         if (ddi_copyin(data, cdda, sizeof (struct cdrom_cdda), flag)) {
28564                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28565                     "sr_read_cdda: ddi_copyin Failed\n");
28566                 kmem_free(cdda, sizeof (struct cdrom_cdda));
28567                 return (EFAULT);
28568         }
28569 #endif /* _MULTI_DATAMODEL */
28570 
28571         /*
28572          * Since MMC-2 expects max 3 bytes for length, check if the
28573          * length input is greater than 3 bytes
28574          */
28575         if ((cdda->cdda_length & 0xFF000000) != 0) {
28576                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_read_cdda: "
28577                     "cdrom transfer length too large: %d (limit %d)\n",
28578                     cdda->cdda_length, 0xFFFFFF);
28579                 kmem_free(cdda, sizeof (struct cdrom_cdda));
28580                 return (EINVAL);
28581         }
28582 
28583         switch (cdda->cdda_subcode) {
28584         case CDROM_DA_NO_SUBCODE:
28585                 buflen = CDROM_BLK_2352 * cdda->cdda_length;
28586                 break;
28587         case CDROM_DA_SUBQ:
28588                 buflen = CDROM_BLK_2368 * cdda->cdda_length;
28589                 break;
28590         case CDROM_DA_ALL_SUBCODE:
28591                 buflen = CDROM_BLK_2448 * cdda->cdda_length;
28592                 break;
28593         case CDROM_DA_SUBCODE_ONLY:
28594                 buflen = CDROM_BLK_SUBCODE * cdda->cdda_length;
28595                 break;
28596         default:
28597                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28598                     "sr_read_cdda: Subcode '0x%x' Not Supported\n",
28599                     cdda->cdda_subcode);
28600                 kmem_free(cdda, sizeof (struct cdrom_cdda));
28601                 return (EINVAL);
28602         }
28603 
28604         /* Build and send the command */
28605         com = kmem_zalloc(sizeof (*com), KM_SLEEP);
28606         bzero(cdb, CDB_GROUP5);
28607 
28608         if (un->un_f_cfg_cdda == TRUE) {
28609                 cdb[0] = (char)SCMD_READ_CD;
28610                 cdb[1] = 0x04;
28611                 cdb[2] = (((cdda->cdda_addr) & 0xff000000) >> 24);
28612                 cdb[3] = (((cdda->cdda_addr) & 0x00ff0000) >> 16);
28613                 cdb[4] = (((cdda->cdda_addr) & 0x0000ff00) >> 8);
28614                 cdb[5] = ((cdda->cdda_addr) & 0x000000ff);
28615                 cdb[6] = (((cdda->cdda_length) & 0x00ff0000) >> 16);
28616                 cdb[7] = (((cdda->cdda_length) & 0x0000ff00) >> 8);
28617                 cdb[8] = ((cdda->cdda_length) & 0x000000ff);
28618                 cdb[9] = 0x10;
28619                 switch (cdda->cdda_subcode) {
28620                 case CDROM_DA_NO_SUBCODE :
28621                         cdb[10] = 0x0;
28622                         break;
28623                 case CDROM_DA_SUBQ :
28624                         cdb[10] = 0x2;
28625                         break;
28626                 case CDROM_DA_ALL_SUBCODE :
28627                         cdb[10] = 0x1;
28628                         break;
28629                 case CDROM_DA_SUBCODE_ONLY :
28630                         /* FALLTHROUGH */
28631                 default :
28632                         kmem_free(cdda, sizeof (struct cdrom_cdda));
28633                         kmem_free(com, sizeof (*com));
28634                         return (ENOTTY);
28635                 }
28636         } else {
28637                 cdb[0] = (char)SCMD_READ_CDDA;
28638                 cdb[2] = (((cdda->cdda_addr) & 0xff000000) >> 24);
28639                 cdb[3] = (((cdda->cdda_addr) & 0x00ff0000) >> 16);
28640                 cdb[4] = (((cdda->cdda_addr) & 0x0000ff00) >> 8);
28641                 cdb[5] = ((cdda->cdda_addr) & 0x000000ff);
28642                 cdb[6] = (((cdda->cdda_length) & 0xff000000) >> 24);
28643                 cdb[7] = (((cdda->cdda_length) & 0x00ff0000) >> 16);
28644                 cdb[8] = (((cdda->cdda_length) & 0x0000ff00) >> 8);
28645                 cdb[9] = ((cdda->cdda_length) & 0x000000ff);
28646                 cdb[10] = cdda->cdda_subcode;
28647         }
28648 
28649         com->uscsi_cdb = cdb;
28650         com->uscsi_cdblen = CDB_GROUP5;
28651         com->uscsi_bufaddr = (caddr_t)cdda->cdda_data;
28652         com->uscsi_buflen = buflen;
28653         com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
28654 
28655         rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE,
28656             SD_PATH_STANDARD);
28657 
28658         kmem_free(cdda, sizeof (struct cdrom_cdda));
28659         kmem_free(com, sizeof (*com));
28660         return (rval);
28661 }
28662 
28663 
28664 /*
28665  *    Function: sr_read_cdxa()
28666  *
28667  * Description: This routine is the driver entry point for handling CD-ROM
28668  *              ioctl requests to return CD-XA (Extended Architecture) data.
28669  *              (CDROMCDXA).
28670  *
28671  *   Arguments: dev     - the device 'dev_t'
28672  *              data    - pointer to user provided CD-XA structure specifying
28673  *                        the data starting address, transfer length, and format
28674  *              flag    - this argument is a pass through to ddi_copyxxx()
28675  *                        directly from the mode argument of ioctl().
28676  *
28677  * Return Code: the code returned by sd_send_scsi_cmd()
28678  *              EFAULT if ddi_copyxxx() fails
28679  *              ENXIO if fail ddi_get_soft_state
28680  *              EINVAL if data pointer is NULL
28681  */
28682 
28683 static int
28684 sr_read_cdxa(dev_t dev, caddr_t data, int flag)
28685 {
28686         struct sd_lun           *un;
28687         struct uscsi_cmd        *com;
28688         struct cdrom_cdxa       *cdxa;
28689         int                     rval;
28690         size_t                  buflen;
28691         char                    cdb[CDB_GROUP5];
28692         uchar_t                 read_flags;
28693 
28694 #ifdef _MULTI_DATAMODEL
28695         /* To support ILP32 applications in an LP64 world */
28696         struct cdrom_cdxa32             cdrom_cdxa32;
28697         struct cdrom_cdxa32             *cdxa32 = &cdrom_cdxa32;
28698 #endif /* _MULTI_DATAMODEL */
28699 
28700         if (data == NULL) {
28701                 return (EINVAL);
28702         }
28703 
28704         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
28705                 return (ENXIO);
28706         }
28707 
28708         cdxa = kmem_zalloc(sizeof (struct cdrom_cdxa), KM_SLEEP);
28709 
28710 #ifdef _MULTI_DATAMODEL
28711         switch (ddi_model_convert_from(flag & FMODELS)) {
28712         case DDI_MODEL_ILP32:
28713                 if (ddi_copyin(data, cdxa32, sizeof (*cdxa32), flag)) {
28714                         kmem_free(cdxa, sizeof (struct cdrom_cdxa));
28715                         return (EFAULT);
28716                 }
28717                 /*
28718                  * Convert the ILP32 uscsi data from the
28719                  * application to LP64 for internal use.
28720                  */
28721                 cdrom_cdxa32tocdrom_cdxa(cdxa32, cdxa);
28722                 break;
28723         case DDI_MODEL_NONE:
28724                 if (ddi_copyin(data, cdxa, sizeof (struct cdrom_cdxa), flag)) {
28725                         kmem_free(cdxa, sizeof (struct cdrom_cdxa));
28726                         return (EFAULT);
28727                 }
28728                 break;
28729         }
28730 #else /* ! _MULTI_DATAMODEL */
28731         if (ddi_copyin(data, cdxa, sizeof (struct cdrom_cdxa), flag)) {
28732                 kmem_free(cdxa, sizeof (struct cdrom_cdxa));
28733                 return (EFAULT);
28734         }
28735 #endif /* _MULTI_DATAMODEL */
28736 
28737         /*
28738          * Since MMC-2 expects max 3 bytes for length, check if the
28739          * length input is greater than 3 bytes
28740          */
28741         if ((cdxa->cdxa_length & 0xFF000000) != 0) {
28742                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_read_cdxa: "
28743                     "cdrom transfer length too large: %d (limit %d)\n",
28744                     cdxa->cdxa_length, 0xFFFFFF);
28745                 kmem_free(cdxa, sizeof (struct cdrom_cdxa));
28746                 return (EINVAL);
28747         }
28748 
28749         switch (cdxa->cdxa_format) {
28750         case CDROM_XA_DATA:
28751                 buflen = CDROM_BLK_2048 * cdxa->cdxa_length;
28752                 read_flags = 0x10;
28753                 break;
28754         case CDROM_XA_SECTOR_DATA:
28755                 buflen = CDROM_BLK_2352 * cdxa->cdxa_length;
28756                 read_flags = 0xf8;
28757                 break;
28758         case CDROM_XA_DATA_W_ERROR:
28759                 buflen = CDROM_BLK_2646 * cdxa->cdxa_length;
28760                 read_flags = 0xfc;
28761                 break;
28762         default:
28763                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28764                     "sr_read_cdxa: Format '0x%x' Not Supported\n",
28765                     cdxa->cdxa_format);
28766                 kmem_free(cdxa, sizeof (struct cdrom_cdxa));
28767                 return (EINVAL);
28768         }
28769 
28770         com = kmem_zalloc(sizeof (*com), KM_SLEEP);
28771         bzero(cdb, CDB_GROUP5);
28772         if (un->un_f_mmc_cap == TRUE) {
28773                 cdb[0] = (char)SCMD_READ_CD;
28774                 cdb[2] = (((cdxa->cdxa_addr) & 0xff000000) >> 24);
28775                 cdb[3] = (((cdxa->cdxa_addr) & 0x00ff0000) >> 16);
28776                 cdb[4] = (((cdxa->cdxa_addr) & 0x0000ff00) >> 8);
28777                 cdb[5] = ((cdxa->cdxa_addr) & 0x000000ff);
28778                 cdb[6] = (((cdxa->cdxa_length) & 0x00ff0000) >> 16);
28779                 cdb[7] = (((cdxa->cdxa_length) & 0x0000ff00) >> 8);
28780                 cdb[8] = ((cdxa->cdxa_length) & 0x000000ff);
28781                 cdb[9] = (char)read_flags;
28782         } else {
28783                 /*
28784                  * Note: A vendor specific command (0xDB) is being used her to
28785                  * request a read of all subcodes.
28786                  */
28787                 cdb[0] = (char)SCMD_READ_CDXA;
28788                 cdb[2] = (((cdxa->cdxa_addr) & 0xff000000) >> 24);
28789                 cdb[3] = (((cdxa->cdxa_addr) & 0x00ff0000) >> 16);
28790                 cdb[4] = (((cdxa->cdxa_addr) & 0x0000ff00) >> 8);
28791                 cdb[5] = ((cdxa->cdxa_addr) & 0x000000ff);
28792                 cdb[6] = (((cdxa->cdxa_length) & 0xff000000) >> 24);
28793                 cdb[7] = (((cdxa->cdxa_length) & 0x00ff0000) >> 16);
28794                 cdb[8] = (((cdxa->cdxa_length) & 0x0000ff00) >> 8);
28795                 cdb[9] = ((cdxa->cdxa_length) & 0x000000ff);
28796                 cdb[10] = cdxa->cdxa_format;
28797         }
28798         com->uscsi_cdb          = cdb;
28799         com->uscsi_cdblen  = CDB_GROUP5;
28800         com->uscsi_bufaddr = (caddr_t)cdxa->cdxa_data;
28801         com->uscsi_buflen  = buflen;
28802         com->uscsi_flags   = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
28803         rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE,
28804             SD_PATH_STANDARD);
28805         kmem_free(cdxa, sizeof (struct cdrom_cdxa));
28806         kmem_free(com, sizeof (*com));
28807         return (rval);
28808 }
28809 
28810 
28811 /*
28812  *    Function: sr_eject()
28813  *
28814  * Description: This routine is the driver entry point for handling CD-ROM
28815  *              eject ioctl requests (FDEJECT, DKIOCEJECT, CDROMEJECT)
28816  *
28817  *   Arguments: dev     - the device 'dev_t'
28818  *
28819  * Return Code: the code returned by sd_send_scsi_cmd()
28820  */
28821 
28822 static int
28823 sr_eject(dev_t dev)
28824 {
28825         struct sd_lun   *un;
28826         int             rval;
28827         sd_ssc_t        *ssc;
28828 
28829         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28830             (un->un_state == SD_STATE_OFFLINE)) {
28831                 return (ENXIO);
28832         }
28833 
28834         /*
28835          * To prevent race conditions with the eject
28836          * command, keep track of an eject command as
28837          * it progresses. If we are already handling
28838          * an eject command in the driver for the given
28839          * unit and another request to eject is received
28840          * immediately return EAGAIN so we don't lose
28841          * the command if the current eject command fails.
28842          */
28843         mutex_enter(SD_MUTEX(un));
28844         if (un->un_f_ejecting == TRUE) {
28845                 mutex_exit(SD_MUTEX(un));
28846                 return (EAGAIN);
28847         }
28848         un->un_f_ejecting = TRUE;
28849         mutex_exit(SD_MUTEX(un));
28850 
28851         ssc = sd_ssc_init(un);
28852         rval = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_ALLOW,
28853             SD_PATH_STANDARD);
28854         sd_ssc_fini(ssc);
28855 
28856         if (rval != 0) {
28857                 mutex_enter(SD_MUTEX(un));
28858                 un->un_f_ejecting = FALSE;
28859                 mutex_exit(SD_MUTEX(un));
28860                 return (rval);
28861         }
28862 
28863         ssc = sd_ssc_init(un);
28864         rval = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
28865             SD_TARGET_EJECT, SD_PATH_STANDARD);
28866         sd_ssc_fini(ssc);
28867 
28868         if (rval == 0) {
28869                 mutex_enter(SD_MUTEX(un));
28870                 sr_ejected(un);
28871                 un->un_mediastate = DKIO_EJECTED;
28872                 un->un_f_ejecting = FALSE;
28873                 cv_broadcast(&un->un_state_cv);
28874                 mutex_exit(SD_MUTEX(un));
28875         } else {
28876                 mutex_enter(SD_MUTEX(un));
28877                 un->un_f_ejecting = FALSE;
28878                 mutex_exit(SD_MUTEX(un));
28879         }
28880         return (rval);
28881 }
28882 
28883 
28884 /*
28885  *    Function: sr_ejected()
28886  *
28887  * Description: This routine updates the soft state structure to invalidate the
28888  *              geometry information after the media has been ejected or a
28889  *              media eject has been detected.
28890  *
28891  *   Arguments: un - driver soft state (unit) structure
28892  */
28893 
28894 static void
28895 sr_ejected(struct sd_lun *un)
28896 {
28897         struct sd_errstats *stp;
28898 
28899         ASSERT(un != NULL);
28900         ASSERT(mutex_owned(SD_MUTEX(un)));
28901 
28902         un->un_f_blockcount_is_valid = FALSE;
28903         un->un_f_tgt_blocksize_is_valid      = FALSE;
28904         mutex_exit(SD_MUTEX(un));
28905         cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT_PRIORITY);
28906         mutex_enter(SD_MUTEX(un));
28907 
28908         if (un->un_errstats != NULL) {
28909                 stp = (struct sd_errstats *)un->un_errstats->ks_data;
28910                 stp->sd_capacity.value.ui64 = 0;
28911         }
28912 }
28913 
28914 
28915 /*
28916  *    Function: sr_check_wp()
28917  *
28918  * Description: This routine checks the write protection of a removable
28919  *      media disk and hotpluggable devices via the write protect bit of
28920  *      the Mode Page Header device specific field. Some devices choke
28921  *      on unsupported mode page. In order to workaround this issue,
28922  *      this routine has been implemented to use 0x3f mode page(request
28923  *      for all pages) for all device types.
28924  *
28925  *   Arguments: dev             - the device 'dev_t'
28926  *
28927  * Return Code: int indicating if the device is write protected (1) or not (0)
28928  *
28929  *     Context: Kernel thread.
28930  *
28931  */
28932 
28933 static int
28934 sr_check_wp(dev_t dev)
28935 {
28936         struct sd_lun   *un;
28937         uchar_t         device_specific;
28938         uchar_t         *sense;
28939         int             hdrlen;
28940         int             rval = FALSE;
28941         int             status;
28942         sd_ssc_t        *ssc;
28943 
28944         /*
28945          * Note: The return codes for this routine should be reworked to
28946          * properly handle the case of a NULL softstate.
28947          */
28948         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
28949                 return (FALSE);
28950         }
28951 
28952         if (un->un_f_cfg_is_atapi == TRUE) {
28953                 /*
28954                  * The mode page contents are not required; set the allocation
28955                  * length for the mode page header only
28956                  */
28957                 hdrlen = MODE_HEADER_LENGTH_GRP2;
28958                 sense = kmem_zalloc(hdrlen, KM_SLEEP);
28959                 ssc = sd_ssc_init(un);
28960                 status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, sense, hdrlen,
28961                     MODEPAGE_ALLPAGES, SD_PATH_STANDARD);
28962                 sd_ssc_fini(ssc);
28963                 if (status != 0)
28964                         goto err_exit;
28965                 device_specific =
28966                     ((struct mode_header_grp2 *)sense)->device_specific;
28967         } else {
28968                 hdrlen = MODE_HEADER_LENGTH;
28969                 sense = kmem_zalloc(hdrlen, KM_SLEEP);
28970                 ssc = sd_ssc_init(un);
28971                 status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense, hdrlen,
28972                     MODEPAGE_ALLPAGES, SD_PATH_STANDARD);
28973                 sd_ssc_fini(ssc);
28974                 if (status != 0)
28975                         goto err_exit;
28976                 device_specific =
28977                     ((struct mode_header *)sense)->device_specific;
28978         }
28979 
28980 
28981         /*
28982          * Write protect mode sense failed; not all disks
28983          * understand this query. Return FALSE assuming that
28984          * these devices are not writable.
28985          */
28986         if (device_specific & WRITE_PROTECT) {
28987                 rval = TRUE;
28988         }
28989 
28990 err_exit:
28991         kmem_free(sense, hdrlen);
28992         return (rval);
28993 }
28994 
28995 /*
28996  *    Function: sr_volume_ctrl()
28997  *
28998  * Description: This routine is the driver entry point for handling CD-ROM
28999  *              audio output volume ioctl requests. (CDROMVOLCTRL)
29000  *
29001  *   Arguments: dev     - the device 'dev_t'
29002  *              data    - pointer to user audio volume control structure
29003  *              flag    - this argument is a pass through to ddi_copyxxx()
29004  *                        directly from the mode argument of ioctl().
29005  *
29006  * Return Code: the code returned by sd_send_scsi_cmd()
29007  *              EFAULT if ddi_copyxxx() fails
29008  *              ENXIO if fail ddi_get_soft_state
29009  *              EINVAL if data pointer is NULL
29010  *
29011  */
29012 
29013 static int
29014 sr_volume_ctrl(dev_t dev, caddr_t data, int flag)
29015 {
29016         struct sd_lun           *un;
29017         struct cdrom_volctrl    volume;
29018         struct cdrom_volctrl    *vol = &volume;
29019         uchar_t                 *sense_page;
29020         uchar_t                 *select_page;
29021         uchar_t                 *sense;
29022         uchar_t                 *select;
29023         int                     sense_buflen;
29024         int                     select_buflen;
29025         int                     rval;
29026         sd_ssc_t                *ssc;
29027 
29028         if (data == NULL) {
29029                 return (EINVAL);
29030         }
29031 
29032         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
29033             (un->un_state == SD_STATE_OFFLINE)) {
29034                 return (ENXIO);
29035         }
29036 
29037         if (ddi_copyin(data, vol, sizeof (struct cdrom_volctrl), flag)) {
29038                 return (EFAULT);
29039         }
29040 
29041         if ((un->un_f_cfg_is_atapi == TRUE) || (un->un_f_mmc_cap == TRUE)) {
29042                 struct mode_header_grp2         *sense_mhp;
29043                 struct mode_header_grp2         *select_mhp;
29044                 int                             bd_len;
29045 
29046                 sense_buflen = MODE_PARAM_LENGTH_GRP2 + MODEPAGE_AUDIO_CTRL_LEN;
29047                 select_buflen = MODE_HEADER_LENGTH_GRP2 +
29048                     MODEPAGE_AUDIO_CTRL_LEN;
29049                 sense  = kmem_zalloc(sense_buflen, KM_SLEEP);
29050                 select = kmem_zalloc(select_buflen, KM_SLEEP);
29051                 ssc = sd_ssc_init(un);
29052                 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, sense,
29053                     sense_buflen, MODEPAGE_AUDIO_CTRL,
29054                     SD_PATH_STANDARD);
29055                 sd_ssc_fini(ssc);
29056 
29057                 if (rval != 0) {
29058                         SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
29059                             "sr_volume_ctrl: Mode Sense Failed\n");
29060                         kmem_free(sense, sense_buflen);
29061                         kmem_free(select, select_buflen);
29062                         return (rval);
29063                 }
29064                 sense_mhp = (struct mode_header_grp2 *)sense;
29065                 select_mhp = (struct mode_header_grp2 *)select;
29066                 bd_len = (sense_mhp->bdesc_length_hi << 8) |
29067                     sense_mhp->bdesc_length_lo;
29068                 if (bd_len > MODE_BLK_DESC_LENGTH) {
29069                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29070                             "sr_volume_ctrl: Mode Sense returned invalid "
29071                             "block descriptor length\n");
29072                         kmem_free(sense, sense_buflen);
29073                         kmem_free(select, select_buflen);
29074                         return (EIO);
29075                 }
29076                 sense_page = (uchar_t *)
29077                     (sense + MODE_HEADER_LENGTH_GRP2 + bd_len);
29078                 select_page = (uchar_t *)(select + MODE_HEADER_LENGTH_GRP2);
29079                 select_mhp->length_msb = 0;
29080                 select_mhp->length_lsb = 0;
29081                 select_mhp->bdesc_length_hi = 0;
29082                 select_mhp->bdesc_length_lo = 0;
29083         } else {
29084                 struct mode_header              *sense_mhp, *select_mhp;
29085 
29086                 sense_buflen = MODE_PARAM_LENGTH + MODEPAGE_AUDIO_CTRL_LEN;
29087                 select_buflen = MODE_HEADER_LENGTH + MODEPAGE_AUDIO_CTRL_LEN;
29088                 sense  = kmem_zalloc(sense_buflen, KM_SLEEP);
29089                 select = kmem_zalloc(select_buflen, KM_SLEEP);
29090                 ssc = sd_ssc_init(un);
29091                 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense,
29092                     sense_buflen, MODEPAGE_AUDIO_CTRL,
29093                     SD_PATH_STANDARD);
29094                 sd_ssc_fini(ssc);
29095 
29096                 if (rval != 0) {
29097                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29098                             "sr_volume_ctrl: Mode Sense Failed\n");
29099                         kmem_free(sense, sense_buflen);
29100                         kmem_free(select, select_buflen);
29101                         return (rval);
29102                 }
29103                 sense_mhp  = (struct mode_header *)sense;
29104                 select_mhp = (struct mode_header *)select;
29105                 if (sense_mhp->bdesc_length > MODE_BLK_DESC_LENGTH) {
29106                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29107                             "sr_volume_ctrl: Mode Sense returned invalid "
29108                             "block descriptor length\n");
29109                         kmem_free(sense, sense_buflen);
29110                         kmem_free(select, select_buflen);
29111                         return (EIO);
29112                 }
29113                 sense_page = (uchar_t *)
29114                     (sense + MODE_HEADER_LENGTH + sense_mhp->bdesc_length);
29115                 select_page = (uchar_t *)(select + MODE_HEADER_LENGTH);
29116                 select_mhp->length = 0;
29117                 select_mhp->bdesc_length = 0;
29118         }
29119         /*
29120          * Note: An audio control data structure could be created and overlayed
29121          * on the following in place of the array indexing method implemented.
29122          */
29123 
29124         /* Build the select data for the user volume data */
29125         select_page[0] = MODEPAGE_AUDIO_CTRL;
29126         select_page[1] = 0xE;
29127         /* Set the immediate bit */
29128         select_page[2] = 0x04;
29129         /* Zero out reserved fields */
29130         select_page[3] = 0x00;
29131         select_page[4] = 0x00;
29132         /* Return sense data for fields not to be modified */
29133         select_page[5] = sense_page[5];
29134         select_page[6] = sense_page[6];
29135         select_page[7] = sense_page[7];
29136         /* Set the user specified volume levels for channel 0 and 1 */
29137         select_page[8] = 0x01;
29138         select_page[9] = vol->channel0;
29139         select_page[10] = 0x02;
29140         select_page[11] = vol->channel1;
29141         /* Channel 2 and 3 are currently unsupported so return the sense data */
29142         select_page[12] = sense_page[12];
29143         select_page[13] = sense_page[13];
29144         select_page[14] = sense_page[14];
29145         select_page[15] = sense_page[15];
29146 
29147         ssc = sd_ssc_init(un);
29148         if ((un->un_f_cfg_is_atapi == TRUE) || (un->un_f_mmc_cap == TRUE)) {
29149                 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP1, select,
29150                     select_buflen, SD_DONTSAVE_PAGE, SD_PATH_STANDARD);
29151         } else {
29152                 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select,
29153                     select_buflen, SD_DONTSAVE_PAGE, SD_PATH_STANDARD);
29154         }
29155         sd_ssc_fini(ssc);
29156 
29157         kmem_free(sense, sense_buflen);
29158         kmem_free(select, select_buflen);
29159         return (rval);
29160 }
29161 
29162 
29163 /*
29164  *    Function: sr_read_sony_session_offset()
29165  *
29166  * Description: This routine is the driver entry point for handling CD-ROM
29167  *              ioctl requests for session offset information. (CDROMREADOFFSET)
29168  *              The address of the first track in the last session of a
29169  *              multi-session CD-ROM is returned
29170  *
29171  *              Note: This routine uses a vendor specific key value in the
29172  *              command control field without implementing any vendor check here
29173  *              or in the ioctl routine.
29174  *
29175  *   Arguments: dev     - the device 'dev_t'
29176  *              data    - pointer to an int to hold the requested address
29177  *              flag    - this argument is a pass through to ddi_copyxxx()
29178  *                        directly from the mode argument of ioctl().
29179  *
29180  * Return Code: the code returned by sd_send_scsi_cmd()
29181  *              EFAULT if ddi_copyxxx() fails
29182  *              ENXIO if fail ddi_get_soft_state
29183  *              EINVAL if data pointer is NULL
29184  */
29185 
29186 static int
29187 sr_read_sony_session_offset(dev_t dev, caddr_t data, int flag)
29188 {
29189         struct sd_lun           *un;
29190         struct uscsi_cmd        *com;
29191         caddr_t                 buffer;
29192         char                    cdb[CDB_GROUP1];
29193         int                     session_offset = 0;
29194         int                     rval;
29195 
29196         if (data == NULL) {
29197                 return (EINVAL);
29198         }
29199 
29200         if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
29201             (un->un_state == SD_STATE_OFFLINE)) {
29202                 return (ENXIO);
29203         }
29204 
29205         buffer = kmem_zalloc((size_t)SONY_SESSION_OFFSET_LEN, KM_SLEEP);
29206         bzero(cdb, CDB_GROUP1);
29207         cdb[0] = SCMD_READ_TOC;
29208         /*
29209          * Bytes 7 & 8 are the 12 byte allocation length for a single entry.
29210          * (4 byte TOC response header + 8 byte response data)
29211          */
29212         cdb[8] = SONY_SESSION_OFFSET_LEN;
29213         /* Byte 9 is the control byte. A vendor specific value is used */
29214         cdb[9] = SONY_SESSION_OFFSET_KEY;
29215         com = kmem_zalloc(sizeof (*com), KM_SLEEP);
29216         com->uscsi_cdb = cdb;
29217         com->uscsi_cdblen = CDB_GROUP1;
29218         com->uscsi_bufaddr = buffer;
29219         com->uscsi_buflen = SONY_SESSION_OFFSET_LEN;
29220         com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
29221 
29222         rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
29223             SD_PATH_STANDARD);
29224         if (rval != 0) {
29225                 kmem_free(buffer, SONY_SESSION_OFFSET_LEN);
29226                 kmem_free(com, sizeof (*com));
29227                 return (rval);
29228         }
29229         if (buffer[1] == SONY_SESSION_OFFSET_VALID) {
29230                 session_offset =
29231                     ((uchar_t)buffer[8] << 24) + ((uchar_t)buffer[9] << 16) +
29232                     ((uchar_t)buffer[10] << 8) + ((uchar_t)buffer[11]);
29233                 /*
29234                  * Offset returned offset in current lbasize block's. Convert to
29235                  * 2k block's to return to the user
29236                  */
29237                 if (un->un_tgt_blocksize == CDROM_BLK_512) {
29238                         session_offset >>= 2;
29239                 } else if (un->un_tgt_blocksize == CDROM_BLK_1024) {
29240                         session_offset >>= 1;
29241                 }
29242         }
29243 
29244         if (ddi_copyout(&session_offset, data, sizeof (int), flag) != 0) {
29245                 rval = EFAULT;
29246         }
29247 
29248         kmem_free(buffer, SONY_SESSION_OFFSET_LEN);
29249         kmem_free(com, sizeof (*com));
29250         return (rval);
29251 }
29252 
29253 
29254 /*
29255  *    Function: sd_wm_cache_constructor()
29256  *
29257  * Description: Cache Constructor for the wmap cache for the read/modify/write
29258  *              devices.
29259  *
29260  *   Arguments: wm      - A pointer to the sd_w_map to be initialized.
29261  *              un      - sd_lun structure for the device.
29262  *              flag    - the km flags passed to constructor
29263  *
29264  * Return Code: 0 on success.
29265  *              -1 on failure.
29266  */
29267 
29268 /*ARGSUSED*/
29269 static int
29270 sd_wm_cache_constructor(void *wm, void *un, int flags)
29271 {
29272         bzero(wm, sizeof (struct sd_w_map));
29273         cv_init(&((struct sd_w_map *)wm)->wm_avail, NULL, CV_DRIVER, NULL);
29274         return (0);
29275 }
29276 
29277 
29278 /*
29279  *    Function: sd_wm_cache_destructor()
29280  *
29281  * Description: Cache destructor for the wmap cache for the read/modify/write
29282  *              devices.
29283  *
29284  *   Arguments: wm      - A pointer to the sd_w_map to be initialized.
29285  *              un      - sd_lun structure for the device.
29286  */
29287 /*ARGSUSED*/
29288 static void
29289 sd_wm_cache_destructor(void *wm, void *un)
29290 {
29291         cv_destroy(&((struct sd_w_map *)wm)->wm_avail);
29292 }
29293 
29294 
29295 /*
29296  *    Function: sd_range_lock()
29297  *
29298  * Description: Lock the range of blocks specified as parameter to ensure
29299  *              that read, modify write is atomic and no other i/o writes
29300  *              to the same location. The range is specified in terms
29301  *              of start and end blocks. Block numbers are the actual
29302  *              media block numbers and not system.
29303  *
29304  *   Arguments: un      - sd_lun structure for the device.
29305  *              startb - The starting block number
29306  *              endb - The end block number
29307  *              typ - type of i/o - simple/read_modify_write
29308  *
29309  * Return Code: wm  - pointer to the wmap structure.
29310  *
29311  *     Context: This routine can sleep.
29312  */
29313 
29314 static struct sd_w_map *
29315 sd_range_lock(struct sd_lun *un, daddr_t startb, daddr_t endb, ushort_t typ)
29316 {
29317         struct sd_w_map *wmp = NULL;
29318         struct sd_w_map *sl_wmp = NULL;
29319         struct sd_w_map *tmp_wmp;
29320         wm_state state = SD_WM_CHK_LIST;
29321 
29322 
29323         ASSERT(un != NULL);
29324         ASSERT(!mutex_owned(SD_MUTEX(un)));
29325 
29326         mutex_enter(SD_MUTEX(un));
29327 
29328         while (state != SD_WM_DONE) {
29329 
29330                 switch (state) {
29331                 case SD_WM_CHK_LIST:
29332                         /*
29333                          * This is the starting state. Check the wmap list
29334                          * to see if the range is currently available.
29335                          */
29336                         if (!(typ & SD_WTYPE_RMW) && !(un->un_rmw_count)) {
29337                                 /*
29338                                  * If this is a simple write and no rmw
29339                                  * i/o is pending then try to lock the
29340                                  * range as the range should be available.
29341                                  */
29342                                 state = SD_WM_LOCK_RANGE;
29343                         } else {
29344                                 tmp_wmp = sd_get_range(un, startb, endb);
29345                                 if (tmp_wmp != NULL) {
29346                                         if ((wmp != NULL) && ONLIST(un, wmp)) {
29347                                                 /*
29348                                                  * Should not keep onlist wmps
29349                                                  * while waiting this macro
29350                                                  * will also do wmp = NULL;
29351                                                  */
29352                                                 FREE_ONLIST_WMAP(un, wmp);
29353                                         }
29354                                         /*
29355                                          * sl_wmp is the wmap on which wait
29356                                          * is done, since the tmp_wmp points
29357                                          * to the inuse wmap, set sl_wmp to
29358                                          * tmp_wmp and change the state to sleep
29359                                          */
29360                                         sl_wmp = tmp_wmp;
29361                                         state = SD_WM_WAIT_MAP;
29362                                 } else {
29363                                         state = SD_WM_LOCK_RANGE;
29364                                 }
29365 
29366                         }
29367                         break;
29368 
29369                 case SD_WM_LOCK_RANGE:
29370                         ASSERT(un->un_wm_cache);
29371                         /*
29372                          * The range need to be locked, try to get a wmap.
29373                          * First attempt it with NO_SLEEP, want to avoid a sleep
29374                          * if possible as we will have to release the sd mutex
29375                          * if we have to sleep.
29376                          */
29377                         if (wmp == NULL)
29378                                 wmp = kmem_cache_alloc(un->un_wm_cache,
29379                                     KM_NOSLEEP);
29380                         if (wmp == NULL) {
29381                                 mutex_exit(SD_MUTEX(un));
29382                                 _NOTE(DATA_READABLE_WITHOUT_LOCK
29383                                     (sd_lun::un_wm_cache))
29384                                 wmp = kmem_cache_alloc(un->un_wm_cache,
29385                                     KM_SLEEP);
29386                                 mutex_enter(SD_MUTEX(un));
29387                                 /*
29388                                  * we released the mutex so recheck and go to
29389                                  * check list state.
29390                                  */
29391                                 state = SD_WM_CHK_LIST;
29392                         } else {
29393                                 /*
29394                                  * We exit out of state machine since we
29395                                  * have the wmap. Do the housekeeping first.
29396                                  * place the wmap on the wmap list if it is not
29397                                  * on it already and then set the state to done.
29398                                  */
29399                                 wmp->wm_start = startb;
29400                                 wmp->wm_end = endb;
29401                                 wmp->wm_flags = typ | SD_WM_BUSY;
29402                                 if (typ & SD_WTYPE_RMW) {
29403                                         un->un_rmw_count++;
29404                                 }
29405                                 /*
29406                                  * If not already on the list then link
29407                                  */
29408                                 if (!ONLIST(un, wmp)) {
29409                                         wmp->wm_next = un->un_wm;
29410                                         wmp->wm_prev = NULL;
29411                                         if (wmp->wm_next)
29412                                                 wmp->wm_next->wm_prev = wmp;
29413                                         un->un_wm = wmp;
29414                                 }
29415                                 state = SD_WM_DONE;
29416                         }
29417                         break;
29418 
29419                 case SD_WM_WAIT_MAP:
29420                         ASSERT(sl_wmp->wm_flags & SD_WM_BUSY);
29421                         /*
29422                          * Wait is done on sl_wmp, which is set in the
29423                          * check_list state.
29424                          */
29425                         sl_wmp->wm_wanted_count++;
29426                         cv_wait(&sl_wmp->wm_avail, SD_MUTEX(un));
29427                         sl_wmp->wm_wanted_count--;
29428                         /*
29429                          * We can reuse the memory from the completed sl_wmp
29430                          * lock range for our new lock, but only if noone is
29431                          * waiting for it.
29432                          */
29433                         ASSERT(!(sl_wmp->wm_flags & SD_WM_BUSY));
29434                         if (sl_wmp->wm_wanted_count == 0) {
29435                                 if (wmp != NULL)
29436                                         CHK_N_FREEWMP(un, wmp);
29437                                 wmp = sl_wmp;
29438                         }
29439                         sl_wmp = NULL;
29440                         /*
29441                          * After waking up, need to recheck for availability of
29442                          * range.
29443                          */
29444                         state = SD_WM_CHK_LIST;
29445                         break;
29446 
29447                 default:
29448                         panic("sd_range_lock: "
29449                             "Unknown state %d in sd_range_lock", state);
29450                         /*NOTREACHED*/
29451                 } /* switch(state) */
29452 
29453         } /* while(state != SD_WM_DONE) */
29454 
29455         mutex_exit(SD_MUTEX(un));
29456 
29457         ASSERT(wmp != NULL);
29458 
29459         return (wmp);
29460 }
29461 
29462 
29463 /*
29464  *    Function: sd_get_range()
29465  *
29466  * Description: Find if there any overlapping I/O to this one
29467  *              Returns the write-map of 1st such I/O, NULL otherwise.
29468  *
29469  *   Arguments: un      - sd_lun structure for the device.
29470  *              startb - The starting block number
29471  *              endb - The end block number
29472  *
29473  * Return Code: wm  - pointer to the wmap structure.
29474  */
29475 
29476 static struct sd_w_map *
29477 sd_get_range(struct sd_lun *un, daddr_t startb, daddr_t endb)
29478 {
29479         struct sd_w_map *wmp;
29480 
29481         ASSERT(un != NULL);
29482 
29483         for (wmp = un->un_wm; wmp != NULL; wmp = wmp->wm_next) {
29484                 if (!(wmp->wm_flags & SD_WM_BUSY)) {
29485                         continue;
29486                 }
29487                 if ((startb >= wmp->wm_start) && (startb <= wmp->wm_end)) {
29488                         break;
29489                 }
29490                 if ((endb >= wmp->wm_start) && (endb <= wmp->wm_end)) {
29491                         break;
29492                 }
29493         }
29494 
29495         return (wmp);
29496 }
29497 
29498 
29499 /*
29500  *    Function: sd_free_inlist_wmap()
29501  *
29502  * Description: Unlink and free a write map struct.
29503  *
29504  *   Arguments: un      - sd_lun structure for the device.
29505  *              wmp     - sd_w_map which needs to be unlinked.
29506  */
29507 
29508 static void
29509 sd_free_inlist_wmap(struct sd_lun *un, struct sd_w_map *wmp)
29510 {
29511         ASSERT(un != NULL);
29512 
29513         if (un->un_wm == wmp) {
29514                 un->un_wm = wmp->wm_next;
29515         } else {
29516                 wmp->wm_prev->wm_next = wmp->wm_next;
29517         }
29518 
29519         if (wmp->wm_next) {
29520                 wmp->wm_next->wm_prev = wmp->wm_prev;
29521         }
29522 
29523         wmp->wm_next = wmp->wm_prev = NULL;
29524 
29525         kmem_cache_free(un->un_wm_cache, wmp);
29526 }
29527 
29528 
29529 /*
29530  *    Function: sd_range_unlock()
29531  *
29532  * Description: Unlock the range locked by wm.
29533  *              Free write map if nobody else is waiting on it.
29534  *
29535  *   Arguments: un      - sd_lun structure for the device.
29536  *              wmp     - sd_w_map which needs to be unlinked.
29537  */
29538 
29539 static void
29540 sd_range_unlock(struct sd_lun *un, struct sd_w_map *wm)
29541 {
29542         ASSERT(un != NULL);
29543         ASSERT(wm != NULL);
29544         ASSERT(!mutex_owned(SD_MUTEX(un)));
29545 
29546         mutex_enter(SD_MUTEX(un));
29547 
29548         if (wm->wm_flags & SD_WTYPE_RMW) {
29549                 un->un_rmw_count--;
29550         }
29551 
29552         if (wm->wm_wanted_count) {
29553                 wm->wm_flags = 0;
29554                 /*
29555                  * Broadcast that the wmap is available now.
29556                  */
29557                 cv_broadcast(&wm->wm_avail);
29558         } else {
29559                 /*
29560                  * If no one is waiting on the map, it should be free'ed.
29561                  */
29562                 sd_free_inlist_wmap(un, wm);
29563         }
29564 
29565         mutex_exit(SD_MUTEX(un));
29566 }
29567 
29568 
29569 /*
29570  *    Function: sd_read_modify_write_task
29571  *
29572  * Description: Called from a taskq thread to initiate the write phase of
29573  *              a read-modify-write request.  This is used for targets where
29574  *              un->un_sys_blocksize != un->un_tgt_blocksize.
29575  *
29576  *   Arguments: arg - a pointer to the buf(9S) struct for the write command.
29577  *
29578  *     Context: Called under taskq thread context.
29579  */
29580 
29581 static void
29582 sd_read_modify_write_task(void *arg)
29583 {
29584         struct sd_mapblocksize_info     *bsp;
29585         struct buf      *bp;
29586         struct sd_xbuf  *xp;
29587         struct sd_lun   *un;
29588 
29589         bp = arg;       /* The bp is given in arg */
29590         ASSERT(bp != NULL);
29591 
29592         /* Get the pointer to the layer-private data struct */
29593         xp = SD_GET_XBUF(bp);
29594         ASSERT(xp != NULL);
29595         bsp = xp->xb_private;
29596         ASSERT(bsp != NULL);
29597 
29598         un = SD_GET_UN(bp);
29599         ASSERT(un != NULL);
29600         ASSERT(!mutex_owned(SD_MUTEX(un)));
29601 
29602         SD_TRACE(SD_LOG_IO_RMMEDIA, un,
29603             "sd_read_modify_write_task: entry: buf:0x%p\n", bp);
29604 
29605         /*
29606          * This is the write phase of a read-modify-write request, called
29607          * under the context of a taskq thread in response to the completion
29608          * of the read portion of the rmw request completing under interrupt
29609          * context. The write request must be sent from here down the iostart
29610          * chain as if it were being sent from sd_mapblocksize_iostart(), so
29611          * we use the layer index saved in the layer-private data area.
29612          */
29613         SD_NEXT_IOSTART(bsp->mbs_layer_index, un, bp);
29614 
29615         SD_TRACE(SD_LOG_IO_RMMEDIA, un,
29616             "sd_read_modify_write_task: exit: buf:0x%p\n", bp);
29617 }
29618 
29619 
29620 /*
29621  *    Function: sddump_do_read_of_rmw()
29622  *
29623  * Description: This routine will be called from sddump, If sddump is called
29624  *              with an I/O which not aligned on device blocksize boundary
29625  *              then the write has to be converted to read-modify-write.
29626  *              Do the read part here in order to keep sddump simple.
29627  *              Note - That the sd_mutex is held across the call to this
29628  *              routine.
29629  *
29630  *   Arguments: un      - sd_lun
29631  *              blkno   - block number in terms of media block size.
29632  *              nblk    - number of blocks.
29633  *              bpp     - pointer to pointer to the buf structure. On return
29634  *                      from this function, *bpp points to the valid buffer
29635  *                      to which the write has to be done.
29636  *
29637  * Return Code: 0 for success or errno-type return code
29638  */
29639 
29640 static int
29641 sddump_do_read_of_rmw(struct sd_lun *un, uint64_t blkno, uint64_t nblk,
29642         struct buf **bpp)
29643 {
29644         int err;
29645         int i;
29646         int rval;
29647         struct buf *bp;
29648         struct scsi_pkt *pkt = NULL;
29649         uint32_t target_blocksize;
29650 
29651         ASSERT(un != NULL);
29652         ASSERT(mutex_owned(SD_MUTEX(un)));
29653 
29654         target_blocksize = un->un_tgt_blocksize;
29655 
29656         mutex_exit(SD_MUTEX(un));
29657 
29658         bp = scsi_alloc_consistent_buf(SD_ADDRESS(un), (struct buf *)NULL,
29659             (size_t)(nblk * target_blocksize), B_READ, NULL_FUNC, NULL);
29660         if (bp == NULL) {
29661                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29662                     "no resources for dumping; giving up");
29663                 err = ENOMEM;
29664                 goto done;
29665         }
29666 
29667         rval = sd_setup_rw_pkt(un, &pkt, bp, 0, NULL_FUNC, NULL,
29668             blkno, nblk);
29669         if (rval != 0) {
29670                 scsi_free_consistent_buf(bp);
29671                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29672                     "no resources for dumping; giving up");
29673                 err = ENOMEM;
29674                 goto done;
29675         }
29676 
29677         pkt->pkt_flags |= FLAG_NOINTR;
29678 
29679         err = EIO;
29680         for (i = 0; i < SD_NDUMP_RETRIES; i++) {
29681 
29682                 /*
29683                  * Scsi_poll returns 0 (success) if the command completes and
29684                  * the status block is STATUS_GOOD.  We should only check
29685                  * errors if this condition is not true.  Even then we should
29686                  * send our own request sense packet only if we have a check
29687                  * condition and auto request sense has not been performed by
29688                  * the hba.
29689                  */
29690                 SD_TRACE(SD_LOG_DUMP, un, "sddump: sending read\n");
29691 
29692                 if ((sd_scsi_poll(un, pkt) == 0) && (pkt->pkt_resid == 0)) {
29693                         err = 0;
29694                         break;
29695                 }
29696 
29697                 /*
29698                  * Check CMD_DEV_GONE 1st, give up if device is gone,
29699                  * no need to read RQS data.
29700                  */
29701                 if (pkt->pkt_reason == CMD_DEV_GONE) {
29702                         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29703                             "Error while dumping state with rmw..."
29704                             "Device is gone\n");
29705                         break;
29706                 }
29707 
29708                 if (SD_GET_PKT_STATUS(pkt) == STATUS_CHECK) {
29709                         SD_INFO(SD_LOG_DUMP, un,
29710                             "sddump: read failed with CHECK, try # %d\n", i);
29711                         if (((pkt->pkt_state & STATE_ARQ_DONE) == 0)) {
29712                                 (void) sd_send_polled_RQS(un);
29713                         }
29714 
29715                         continue;
29716                 }
29717 
29718                 if (SD_GET_PKT_STATUS(pkt) == STATUS_BUSY) {
29719                         int reset_retval = 0;
29720 
29721                         SD_INFO(SD_LOG_DUMP, un,
29722                             "sddump: read failed with BUSY, try # %d\n", i);
29723 
29724                         if (un->un_f_lun_reset_enabled == TRUE) {
29725                                 reset_retval = scsi_reset(SD_ADDRESS(un),
29726                                     RESET_LUN);
29727                         }
29728                         if (reset_retval == 0) {
29729                                 (void) scsi_reset(SD_ADDRESS(un), RESET_TARGET);
29730                         }
29731                         (void) sd_send_polled_RQS(un);
29732 
29733                 } else {
29734                         SD_INFO(SD_LOG_DUMP, un,
29735                             "sddump: read failed with 0x%x, try # %d\n",
29736                             SD_GET_PKT_STATUS(pkt), i);
29737                         mutex_enter(SD_MUTEX(un));
29738                         sd_reset_target(un, pkt);
29739                         mutex_exit(SD_MUTEX(un));
29740                 }
29741 
29742                 /*
29743                  * If we are not getting anywhere with lun/target resets,
29744                  * let's reset the bus.
29745                  */
29746                 if (i > SD_NDUMP_RETRIES/2) {
29747                         (void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
29748                         (void) sd_send_polled_RQS(un);
29749                 }
29750 
29751         }
29752         scsi_destroy_pkt(pkt);
29753 
29754         if (err != 0) {
29755                 scsi_free_consistent_buf(bp);
29756                 *bpp = NULL;
29757         } else {
29758                 *bpp = bp;
29759         }
29760 
29761 done:
29762         mutex_enter(SD_MUTEX(un));
29763         return (err);
29764 }
29765 
29766 
29767 /*
29768  *    Function: sd_failfast_flushq
29769  *
29770  * Description: Take all bp's on the wait queue that have B_FAILFAST set
29771  *              in b_flags and move them onto the failfast queue, then kick
29772  *              off a thread to return all bp's on the failfast queue to
29773  *              their owners with an error set.
29774  *
29775  *   Arguments: un - pointer to the soft state struct for the instance.
29776  *
29777  *     Context: may execute in interrupt context.
29778  */
29779 
29780 static void
29781 sd_failfast_flushq(struct sd_lun *un)
29782 {
29783         struct buf *bp;
29784         struct buf *next_waitq_bp;
29785         struct buf *prev_waitq_bp = NULL;
29786 
29787         ASSERT(un != NULL);
29788         ASSERT(mutex_owned(SD_MUTEX(un)));
29789         ASSERT(un->un_failfast_state == SD_FAILFAST_ACTIVE);
29790         ASSERT(un->un_failfast_bp == NULL);
29791 
29792         SD_TRACE(SD_LOG_IO_FAILFAST, un,
29793             "sd_failfast_flushq: entry: un:0x%p\n", un);
29794 
29795         /*
29796          * Check if we should flush all bufs when entering failfast state, or
29797          * just those with B_FAILFAST set.
29798          */
29799         if (sd_failfast_flushctl & SD_FAILFAST_FLUSH_ALL_BUFS) {
29800                 /*
29801                  * Move *all* bp's on the wait queue to the failfast flush
29802                  * queue, including those that do NOT have B_FAILFAST set.
29803                  */
29804                 if (un->un_failfast_headp == NULL) {
29805                         ASSERT(un->un_failfast_tailp == NULL);
29806                         un->un_failfast_headp = un->un_waitq_headp;
29807                 } else {
29808                         ASSERT(un->un_failfast_tailp != NULL);
29809                         un->un_failfast_tailp->av_forw = un->un_waitq_headp;
29810                 }
29811 
29812                 un->un_failfast_tailp = un->un_waitq_tailp;
29813 
29814                 /* update kstat for each bp moved out of the waitq */
29815                 for (bp = un->un_waitq_headp; bp != NULL; bp = bp->av_forw) {
29816                         SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp);
29817                 }
29818 
29819                 /* empty the waitq */
29820                 un->un_waitq_headp = un->un_waitq_tailp = NULL;
29821 
29822         } else {
29823                 /*
29824                  * Go thru the wait queue, pick off all entries with
29825                  * B_FAILFAST set, and move these onto the failfast queue.
29826                  */
29827                 for (bp = un->un_waitq_headp; bp != NULL; bp = next_waitq_bp) {
29828                         /*
29829                          * Save the pointer to the next bp on the wait queue,
29830                          * so we get to it on the next iteration of this loop.
29831                          */
29832                         next_waitq_bp = bp->av_forw;
29833 
29834                         /*
29835                          * If this bp from the wait queue does NOT have
29836                          * B_FAILFAST set, just move on to the next element
29837                          * in the wait queue. Note, this is the only place
29838                          * where it is correct to set prev_waitq_bp.
29839                          */
29840                         if ((bp->b_flags & B_FAILFAST) == 0) {
29841                                 prev_waitq_bp = bp;
29842                                 continue;
29843                         }
29844 
29845                         /*
29846                          * Remove the bp from the wait queue.
29847                          */
29848                         if (bp == un->un_waitq_headp) {
29849                                 /* The bp is the first element of the waitq. */
29850                                 un->un_waitq_headp = next_waitq_bp;
29851                                 if (un->un_waitq_headp == NULL) {
29852                                         /* The wait queue is now empty */
29853                                         un->un_waitq_tailp = NULL;
29854                                 }
29855                         } else {
29856                                 /*
29857                                  * The bp is either somewhere in the middle
29858                                  * or at the end of the wait queue.
29859                                  */
29860                                 ASSERT(un->un_waitq_headp != NULL);
29861                                 ASSERT(prev_waitq_bp != NULL);
29862                                 ASSERT((prev_waitq_bp->b_flags & B_FAILFAST)
29863                                     == 0);
29864                                 if (bp == un->un_waitq_tailp) {
29865                                         /* bp is the last entry on the waitq. */
29866                                         ASSERT(next_waitq_bp == NULL);
29867                                         un->un_waitq_tailp = prev_waitq_bp;
29868                                 }
29869                                 prev_waitq_bp->av_forw = next_waitq_bp;
29870                         }
29871                         bp->av_forw = NULL;
29872 
29873                         /*
29874                          * update kstat since the bp is moved out of
29875                          * the waitq
29876                          */
29877                         SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp);
29878 
29879                         /*
29880                          * Now put the bp onto the failfast queue.
29881                          */
29882                         if (un->un_failfast_headp == NULL) {
29883                                 /* failfast queue is currently empty */
29884                                 ASSERT(un->un_failfast_tailp == NULL);
29885                                 un->un_failfast_headp =
29886                                     un->un_failfast_tailp = bp;
29887                         } else {
29888                                 /* Add the bp to the end of the failfast q */
29889                                 ASSERT(un->un_failfast_tailp != NULL);
29890                                 ASSERT(un->un_failfast_tailp->b_flags &
29891                                     B_FAILFAST);
29892                                 un->un_failfast_tailp->av_forw = bp;
29893                                 un->un_failfast_tailp = bp;
29894                         }
29895                 }
29896         }
29897 
29898         /*
29899          * Now return all bp's on the failfast queue to their owners.
29900          */
29901         while ((bp = un->un_failfast_headp) != NULL) {
29902 
29903                 un->un_failfast_headp = bp->av_forw;
29904                 if (un->un_failfast_headp == NULL) {
29905                         un->un_failfast_tailp = NULL;
29906                 }
29907 
29908                 /*
29909                  * We want to return the bp with a failure error code, but
29910                  * we do not want a call to sd_start_cmds() to occur here,
29911                  * so use sd_return_failed_command_no_restart() instead of
29912                  * sd_return_failed_command().
29913                  */
29914                 sd_return_failed_command_no_restart(un, bp, EIO);
29915         }
29916 
29917         /* Flush the xbuf queues if required. */
29918         if (sd_failfast_flushctl & SD_FAILFAST_FLUSH_ALL_QUEUES) {
29919                 ddi_xbuf_flushq(un->un_xbuf_attr, sd_failfast_flushq_callback);
29920         }
29921 
29922         SD_TRACE(SD_LOG_IO_FAILFAST, un,
29923             "sd_failfast_flushq: exit: un:0x%p\n", un);
29924 }
29925 
29926 
29927 /*
29928  *    Function: sd_failfast_flushq_callback
29929  *
29930  * Description: Return TRUE if the given bp meets the criteria for failfast
29931  *              flushing. Used with ddi_xbuf_flushq(9F).
29932  *
29933  *   Arguments: bp - ptr to buf struct to be examined.
29934  *
29935  *     Context: Any
29936  */
29937 
29938 static int
29939 sd_failfast_flushq_callback(struct buf *bp)
29940 {
29941         /*
29942          * Return TRUE if (1) we want to flush ALL bufs when the failfast
29943          * state is entered; OR (2) the given bp has B_FAILFAST set.
29944          */
29945         return (((sd_failfast_flushctl & SD_FAILFAST_FLUSH_ALL_BUFS) ||
29946             (bp->b_flags & B_FAILFAST)) ? TRUE : FALSE);
29947 }
29948 
29949 
29950 
29951 /*
29952  * Function: sd_setup_next_xfer
29953  *
29954  * Description: Prepare next I/O operation using DMA_PARTIAL
29955  *
29956  */
29957 
29958 static int
29959 sd_setup_next_xfer(struct sd_lun *un, struct buf *bp,
29960     struct scsi_pkt *pkt, struct sd_xbuf *xp)
29961 {
29962         ssize_t num_blks_not_xfered;
29963         daddr_t strt_blk_num;
29964         ssize_t bytes_not_xfered;
29965         int     rval;
29966 
29967         ASSERT(pkt->pkt_resid == 0);
29968 
29969         /*
29970          * Calculate next block number and amount to be transferred.
29971          *
29972          * How much data NOT transfered to the HBA yet.
29973          */
29974         bytes_not_xfered = xp->xb_dma_resid;
29975 
29976         /*
29977          * figure how many blocks NOT transfered to the HBA yet.
29978          */
29979         num_blks_not_xfered = SD_BYTES2TGTBLOCKS(un, bytes_not_xfered);
29980 
29981         /*
29982          * set starting block number to the end of what WAS transfered.
29983          */
29984         strt_blk_num = xp->xb_blkno +
29985             SD_BYTES2TGTBLOCKS(un, bp->b_bcount - bytes_not_xfered);
29986 
29987         /*
29988          * Move pkt to the next portion of the xfer.  sd_setup_next_rw_pkt
29989          * will call scsi_initpkt with NULL_FUNC so we do not have to release
29990          * the disk mutex here.
29991          */
29992         rval = sd_setup_next_rw_pkt(un, pkt, bp,
29993             strt_blk_num, num_blks_not_xfered);
29994 
29995         if (rval == 0) {
29996 
29997                 /*
29998                  * Success.
29999                  *
30000                  * Adjust things if there are still more blocks to be
30001                  * transfered.
30002                  */
30003                 xp->xb_dma_resid = pkt->pkt_resid;
30004                 pkt->pkt_resid = 0;
30005 
30006                 return (1);
30007         }
30008 
30009         /*
30010          * There's really only one possible return value from
30011          * sd_setup_next_rw_pkt which occurs when scsi_init_pkt
30012          * returns NULL.
30013          */
30014         ASSERT(rval == SD_PKT_ALLOC_FAILURE);
30015 
30016         bp->b_resid = bp->b_bcount;
30017         bp->b_flags |= B_ERROR;
30018 
30019         scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
30020             "Error setting up next portion of DMA transfer\n");
30021 
30022         return (0);
30023 }
30024 
30025 /*
30026  *    Function: sd_panic_for_res_conflict
30027  *
30028  * Description: Call panic with a string formatted with "Reservation Conflict"
30029  *              and a human readable identifier indicating the SD instance
30030  *              that experienced the reservation conflict.
30031  *
30032  *   Arguments: un - pointer to the soft state struct for the instance.
30033  *
30034  *     Context: may execute in interrupt context.
30035  */
30036 
30037 #define SD_RESV_CONFLICT_FMT_LEN 40
30038 void
30039 sd_panic_for_res_conflict(struct sd_lun *un)
30040 {
30041         char panic_str[SD_RESV_CONFLICT_FMT_LEN+MAXPATHLEN];
30042         char path_str[MAXPATHLEN];
30043 
30044         (void) snprintf(panic_str, sizeof (panic_str),
30045             "Reservation Conflict\nDisk: %s",
30046             ddi_pathname(SD_DEVINFO(un), path_str));
30047 
30048         panic(panic_str);
30049 }
30050 
30051 /*
30052  * Note: The following sd_faultinjection_ioctl( ) routines implement
30053  * driver support for handling fault injection for error analysis
30054  * causing faults in multiple layers of the driver.
30055  *
30056  */
30057 
30058 #ifdef SD_FAULT_INJECTION
30059 static uint_t   sd_fault_injection_on = 0;
30060 
30061 /*
30062  *    Function: sd_faultinjection_ioctl()
30063  *
30064  * Description: This routine is the driver entry point for handling
30065  *              faultinjection ioctls to inject errors into the
30066  *              layer model
30067  *
30068  *   Arguments: cmd     - the ioctl cmd received
30069  *              arg     - the arguments from user and returns
30070  */
30071 
30072 static void
30073 sd_faultinjection_ioctl(int cmd, intptr_t arg,  struct sd_lun *un) {
30074 
30075         uint_t i = 0;
30076         uint_t rval;
30077 
30078         SD_TRACE(SD_LOG_IOERR, un, "sd_faultinjection_ioctl: entry\n");
30079 
30080         mutex_enter(SD_MUTEX(un));
30081 
30082         switch (cmd) {
30083         case SDIOCRUN:
30084                 /* Allow pushed faults to be injected */
30085                 SD_INFO(SD_LOG_SDTEST, un,
30086                     "sd_faultinjection_ioctl: Injecting Fault Run\n");
30087 
30088                 sd_fault_injection_on = 1;
30089 
30090                 SD_INFO(SD_LOG_IOERR, un,
30091                     "sd_faultinjection_ioctl: run finished\n");
30092                 break;
30093 
30094         case SDIOCSTART:
30095                 /* Start Injection Session */
30096                 SD_INFO(SD_LOG_SDTEST, un,
30097                     "sd_faultinjection_ioctl: Injecting Fault Start\n");
30098 
30099                 sd_fault_injection_on = 0;
30100                 un->sd_injection_mask = 0xFFFFFFFF;
30101                 for (i = 0; i < SD_FI_MAX_ERROR; i++) {
30102                         un->sd_fi_fifo_pkt[i] = NULL;
30103                         un->sd_fi_fifo_xb[i] = NULL;
30104                         un->sd_fi_fifo_un[i] = NULL;
30105                         un->sd_fi_fifo_arq[i] = NULL;
30106                 }
30107                 un->sd_fi_fifo_start = 0;
30108                 un->sd_fi_fifo_end = 0;
30109 
30110                 mutex_enter(&(un->un_fi_mutex));
30111                 un->sd_fi_log[0] = '\0';
30112                 un->sd_fi_buf_len = 0;
30113                 mutex_exit(&(un->un_fi_mutex));
30114 
30115                 SD_INFO(SD_LOG_IOERR, un,
30116                     "sd_faultinjection_ioctl: start finished\n");
30117                 break;
30118 
30119         case SDIOCSTOP:
30120                 /* Stop Injection Session */
30121                 SD_INFO(SD_LOG_SDTEST, un,
30122                     "sd_faultinjection_ioctl: Injecting Fault Stop\n");
30123                 sd_fault_injection_on = 0;
30124                 un->sd_injection_mask = 0x0;
30125 
30126                 /* Empty stray or unuseds structs from fifo */
30127                 for (i = 0; i < SD_FI_MAX_ERROR; i++) {
30128                         if (un->sd_fi_fifo_pkt[i] != NULL) {
30129                                 kmem_free(un->sd_fi_fifo_pkt[i],
30130                                     sizeof (struct sd_fi_pkt));
30131                         }
30132                         if (un->sd_fi_fifo_xb[i] != NULL) {
30133                                 kmem_free(un->sd_fi_fifo_xb[i],
30134                                     sizeof (struct sd_fi_xb));
30135                         }
30136                         if (un->sd_fi_fifo_un[i] != NULL) {
30137                                 kmem_free(un->sd_fi_fifo_un[i],
30138                                     sizeof (struct sd_fi_un));
30139                         }
30140                         if (un->sd_fi_fifo_arq[i] != NULL) {
30141                                 kmem_free(un->sd_fi_fifo_arq[i],
30142                                     sizeof (struct sd_fi_arq));
30143                         }
30144                         un->sd_fi_fifo_pkt[i] = NULL;
30145                         un->sd_fi_fifo_un[i] = NULL;
30146                         un->sd_fi_fifo_xb[i] = NULL;
30147                         un->sd_fi_fifo_arq[i] = NULL;
30148                 }
30149                 un->sd_fi_fifo_start = 0;
30150                 un->sd_fi_fifo_end = 0;
30151 
30152                 SD_INFO(SD_LOG_IOERR, un,
30153                     "sd_faultinjection_ioctl: stop finished\n");
30154                 break;
30155 
30156         case SDIOCINSERTPKT:
30157                 /* Store a packet struct to be pushed onto fifo */
30158                 SD_INFO(SD_LOG_SDTEST, un,
30159                     "sd_faultinjection_ioctl: Injecting Fault Insert Pkt\n");
30160 
30161                 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
30162 
30163                 sd_fault_injection_on = 0;
30164 
30165                 /* No more that SD_FI_MAX_ERROR allowed in Queue */
30166                 if (un->sd_fi_fifo_pkt[i] != NULL) {
30167                         kmem_free(un->sd_fi_fifo_pkt[i],
30168                             sizeof (struct sd_fi_pkt));
30169                 }
30170                 if (arg != NULL) {
30171                         un->sd_fi_fifo_pkt[i] =
30172                             kmem_alloc(sizeof (struct sd_fi_pkt), KM_NOSLEEP);
30173                         if (un->sd_fi_fifo_pkt[i] == NULL) {
30174                                 /* Alloc failed don't store anything */
30175                                 break;
30176                         }
30177                         rval = ddi_copyin((void *)arg, un->sd_fi_fifo_pkt[i],
30178                             sizeof (struct sd_fi_pkt), 0);
30179                         if (rval == -1) {
30180                                 kmem_free(un->sd_fi_fifo_pkt[i],
30181                                     sizeof (struct sd_fi_pkt));
30182                                 un->sd_fi_fifo_pkt[i] = NULL;
30183                         }
30184                 } else {
30185                         SD_INFO(SD_LOG_IOERR, un,
30186                             "sd_faultinjection_ioctl: pkt null\n");
30187                 }
30188                 break;
30189 
30190         case SDIOCINSERTXB:
30191                 /* Store a xb struct to be pushed onto fifo */
30192                 SD_INFO(SD_LOG_SDTEST, un,
30193                     "sd_faultinjection_ioctl: Injecting Fault Insert XB\n");
30194 
30195                 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
30196 
30197                 sd_fault_injection_on = 0;
30198 
30199                 if (un->sd_fi_fifo_xb[i] != NULL) {
30200                         kmem_free(un->sd_fi_fifo_xb[i],
30201                             sizeof (struct sd_fi_xb));
30202                         un->sd_fi_fifo_xb[i] = NULL;
30203                 }
30204                 if (arg != NULL) {
30205                         un->sd_fi_fifo_xb[i] =
30206                             kmem_alloc(sizeof (struct sd_fi_xb), KM_NOSLEEP);
30207                         if (un->sd_fi_fifo_xb[i] == NULL) {
30208                                 /* Alloc failed don't store anything */
30209                                 break;
30210                         }
30211                         rval = ddi_copyin((void *)arg, un->sd_fi_fifo_xb[i],
30212                             sizeof (struct sd_fi_xb), 0);
30213 
30214                         if (rval == -1) {
30215                                 kmem_free(un->sd_fi_fifo_xb[i],
30216                                     sizeof (struct sd_fi_xb));
30217                                 un->sd_fi_fifo_xb[i] = NULL;
30218                         }
30219                 } else {
30220                         SD_INFO(SD_LOG_IOERR, un,
30221                             "sd_faultinjection_ioctl: xb null\n");
30222                 }
30223                 break;
30224 
30225         case SDIOCINSERTUN:
30226                 /* Store a un struct to be pushed onto fifo */
30227                 SD_INFO(SD_LOG_SDTEST, un,
30228                     "sd_faultinjection_ioctl: Injecting Fault Insert UN\n");
30229 
30230                 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
30231 
30232                 sd_fault_injection_on = 0;
30233 
30234                 if (un->sd_fi_fifo_un[i] != NULL) {
30235                         kmem_free(un->sd_fi_fifo_un[i],
30236                             sizeof (struct sd_fi_un));
30237                         un->sd_fi_fifo_un[i] = NULL;
30238                 }
30239                 if (arg != NULL) {
30240                         un->sd_fi_fifo_un[i] =
30241                             kmem_alloc(sizeof (struct sd_fi_un), KM_NOSLEEP);
30242                         if (un->sd_fi_fifo_un[i] == NULL) {
30243                                 /* Alloc failed don't store anything */
30244                                 break;
30245                         }
30246                         rval = ddi_copyin((void *)arg, un->sd_fi_fifo_un[i],
30247                             sizeof (struct sd_fi_un), 0);
30248                         if (rval == -1) {
30249                                 kmem_free(un->sd_fi_fifo_un[i],
30250                                     sizeof (struct sd_fi_un));
30251                                 un->sd_fi_fifo_un[i] = NULL;
30252                         }
30253 
30254                 } else {
30255                         SD_INFO(SD_LOG_IOERR, un,
30256                             "sd_faultinjection_ioctl: un null\n");
30257                 }
30258 
30259                 break;
30260 
30261         case SDIOCINSERTARQ:
30262                 /* Store a arq struct to be pushed onto fifo */
30263                 SD_INFO(SD_LOG_SDTEST, un,
30264                     "sd_faultinjection_ioctl: Injecting Fault Insert ARQ\n");
30265                 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
30266 
30267                 sd_fault_injection_on = 0;
30268 
30269                 if (un->sd_fi_fifo_arq[i] != NULL) {
30270                         kmem_free(un->sd_fi_fifo_arq[i],
30271                             sizeof (struct sd_fi_arq));
30272                         un->sd_fi_fifo_arq[i] = NULL;
30273                 }
30274                 if (arg != NULL) {
30275                         un->sd_fi_fifo_arq[i] =
30276                             kmem_alloc(sizeof (struct sd_fi_arq), KM_NOSLEEP);
30277                         if (un->sd_fi_fifo_arq[i] == NULL) {
30278                                 /* Alloc failed don't store anything */
30279                                 break;
30280                         }
30281                         rval = ddi_copyin((void *)arg, un->sd_fi_fifo_arq[i],
30282                             sizeof (struct sd_fi_arq), 0);
30283                         if (rval == -1) {
30284                                 kmem_free(un->sd_fi_fifo_arq[i],
30285                                     sizeof (struct sd_fi_arq));
30286                                 un->sd_fi_fifo_arq[i] = NULL;
30287                         }
30288 
30289                 } else {
30290                         SD_INFO(SD_LOG_IOERR, un,
30291                             "sd_faultinjection_ioctl: arq null\n");
30292                 }
30293 
30294                 break;
30295 
30296         case SDIOCPUSH:
30297                 /* Push stored xb, pkt, un, and arq onto fifo */
30298                 sd_fault_injection_on = 0;
30299 
30300                 if (arg != NULL) {
30301                         rval = ddi_copyin((void *)arg, &i, sizeof (uint_t), 0);
30302                         if (rval != -1 &&
30303                             un->sd_fi_fifo_end + i < SD_FI_MAX_ERROR) {
30304                                 un->sd_fi_fifo_end += i;
30305                         }
30306                 } else {
30307                         SD_INFO(SD_LOG_IOERR, un,
30308                             "sd_faultinjection_ioctl: push arg null\n");
30309                         if (un->sd_fi_fifo_end + i < SD_FI_MAX_ERROR) {
30310                                 un->sd_fi_fifo_end++;
30311                         }
30312                 }
30313                 SD_INFO(SD_LOG_IOERR, un,
30314                     "sd_faultinjection_ioctl: push to end=%d\n",
30315                     un->sd_fi_fifo_end);
30316                 break;
30317 
30318         case SDIOCRETRIEVE:
30319                 /* Return buffer of log from Injection session */
30320                 SD_INFO(SD_LOG_SDTEST, un,
30321                     "sd_faultinjection_ioctl: Injecting Fault Retreive");
30322 
30323                 sd_fault_injection_on = 0;
30324 
30325                 mutex_enter(&(un->un_fi_mutex));
30326                 rval = ddi_copyout(un->sd_fi_log, (void *)arg,
30327                     un->sd_fi_buf_len+1, 0);
30328                 mutex_exit(&(un->un_fi_mutex));
30329 
30330                 if (rval == -1) {
30331                         /*
30332                          * arg is possibly invalid setting
30333                          * it to NULL for return
30334                          */
30335                         arg = NULL;
30336                 }
30337                 break;
30338         }
30339 
30340         mutex_exit(SD_MUTEX(un));
30341         SD_TRACE(SD_LOG_IOERR, un, "sd_faultinjection_ioctl:"
30342                             " exit\n");
30343 }
30344 
30345 
30346 /*
30347  *    Function: sd_injection_log()
30348  *
30349  * Description: This routine adds buff to the already existing injection log
30350  *              for retrieval via faultinjection_ioctl for use in fault
30351  *              detection and recovery
30352  *
30353  *   Arguments: buf - the string to add to the log
30354  */
30355 
30356 static void
30357 sd_injection_log(char *buf, struct sd_lun *un)
30358 {
30359         uint_t len;
30360 
30361         ASSERT(un != NULL);
30362         ASSERT(buf != NULL);
30363 
30364         mutex_enter(&(un->un_fi_mutex));
30365 
30366         len = min(strlen(buf), 255);
30367         /* Add logged value to Injection log to be returned later */
30368         if (len + un->sd_fi_buf_len < SD_FI_MAX_BUF) {
30369                 uint_t  offset = strlen((char *)un->sd_fi_log);
30370                 char *destp = (char *)un->sd_fi_log + offset;
30371                 int i;
30372                 for (i = 0; i < len; i++) {
30373                         *destp++ = *buf++;
30374                 }
30375                 un->sd_fi_buf_len += len;
30376                 un->sd_fi_log[un->sd_fi_buf_len] = '\0';
30377         }
30378 
30379         mutex_exit(&(un->un_fi_mutex));
30380 }
30381 
30382 
30383 /*
30384  *    Function: sd_faultinjection()
30385  *
30386  * Description: This routine takes the pkt and changes its
30387  *              content based on error injection scenerio.
30388  *
30389  *   Arguments: pktp    - packet to be changed
30390  */
30391 
30392 static void
30393 sd_faultinjection(struct scsi_pkt *pktp)
30394 {
30395         uint_t i;
30396         struct sd_fi_pkt *fi_pkt;
30397         struct sd_fi_xb *fi_xb;
30398         struct sd_fi_un *fi_un;
30399         struct sd_fi_arq *fi_arq;
30400         struct buf *bp;
30401         struct sd_xbuf *xb;
30402         struct sd_lun *un;
30403 
30404         ASSERT(pktp != NULL);
30405 
30406         /* pull bp xb and un from pktp */
30407         bp = (struct buf *)pktp->pkt_private;
30408         xb = SD_GET_XBUF(bp);
30409         un = SD_GET_UN(bp);
30410 
30411         ASSERT(un != NULL);
30412 
30413         mutex_enter(SD_MUTEX(un));
30414 
30415         SD_TRACE(SD_LOG_SDTEST, un,
30416             "sd_faultinjection: entry Injection from sdintr\n");
30417 
30418         /* if injection is off return */
30419         if (sd_fault_injection_on == 0 ||
30420             un->sd_fi_fifo_start == un->sd_fi_fifo_end) {
30421                 mutex_exit(SD_MUTEX(un));
30422                 return;
30423         }
30424 
30425         SD_INFO(SD_LOG_SDTEST, un,
30426             "sd_faultinjection: is working for copying\n");
30427 
30428         /* take next set off fifo */
30429         i = un->sd_fi_fifo_start % SD_FI_MAX_ERROR;
30430 
30431         fi_pkt = un->sd_fi_fifo_pkt[i];
30432         fi_xb = un->sd_fi_fifo_xb[i];
30433         fi_un = un->sd_fi_fifo_un[i];
30434         fi_arq = un->sd_fi_fifo_arq[i];
30435 
30436 
30437         /* set variables accordingly */
30438         /* set pkt if it was on fifo */
30439         if (fi_pkt != NULL) {
30440                 SD_CONDSET(pktp, pkt, pkt_flags, "pkt_flags");
30441                 SD_CONDSET(*pktp, pkt, pkt_scbp, "pkt_scbp");
30442                 if (fi_pkt->pkt_cdbp != 0xff)
30443                         SD_CONDSET(*pktp, pkt, pkt_cdbp, "pkt_cdbp");
30444                 SD_CONDSET(pktp, pkt, pkt_state, "pkt_state");
30445                 SD_CONDSET(pktp, pkt, pkt_statistics, "pkt_statistics");
30446                 SD_CONDSET(pktp, pkt, pkt_reason, "pkt_reason");
30447 
30448         }
30449         /* set xb if it was on fifo */
30450         if (fi_xb != NULL) {
30451                 SD_CONDSET(xb, xb, xb_blkno, "xb_blkno");
30452                 SD_CONDSET(xb, xb, xb_dma_resid, "xb_dma_resid");
30453                 if (fi_xb->xb_retry_count != 0)
30454                         SD_CONDSET(xb, xb, xb_retry_count, "xb_retry_count");
30455                 SD_CONDSET(xb, xb, xb_victim_retry_count,
30456                     "xb_victim_retry_count");
30457                 SD_CONDSET(xb, xb, xb_sense_status, "xb_sense_status");
30458                 SD_CONDSET(xb, xb, xb_sense_state, "xb_sense_state");
30459                 SD_CONDSET(xb, xb, xb_sense_resid, "xb_sense_resid");
30460 
30461                 /* copy in block data from sense */
30462                 /*
30463                  * if (fi_xb->xb_sense_data[0] != -1) {
30464                  *      bcopy(fi_xb->xb_sense_data, xb->xb_sense_data,
30465                  *      SENSE_LENGTH);
30466                  * }
30467                  */
30468                 bcopy(fi_xb->xb_sense_data, xb->xb_sense_data, SENSE_LENGTH);
30469 
30470                 /* copy in extended sense codes */
30471                 SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data),
30472                     xb, es_code, "es_code");
30473                 SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data),
30474                     xb, es_key, "es_key");
30475                 SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data),
30476                     xb, es_add_code, "es_add_code");
30477                 SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data),
30478                     xb, es_qual_code, "es_qual_code");
30479                 struct scsi_extended_sense *esp;
30480                 esp = (struct scsi_extended_sense *)xb->xb_sense_data;
30481                 esp->es_class = CLASS_EXTENDED_SENSE;
30482         }
30483 
30484         /* set un if it was on fifo */
30485         if (fi_un != NULL) {
30486                 SD_CONDSET(un->un_sd->sd_inq, un, inq_rmb, "inq_rmb");
30487                 SD_CONDSET(un, un, un_ctype, "un_ctype");
30488                 SD_CONDSET(un, un, un_reset_retry_count,
30489                     "un_reset_retry_count");
30490                 SD_CONDSET(un, un, un_reservation_type, "un_reservation_type");
30491                 SD_CONDSET(un, un, un_resvd_status, "un_resvd_status");
30492                 SD_CONDSET(un, un, un_f_arq_enabled, "un_f_arq_enabled");
30493                 SD_CONDSET(un, un, un_f_allow_bus_device_reset,
30494                     "un_f_allow_bus_device_reset");
30495                 SD_CONDSET(un, un, un_f_opt_queueing, "un_f_opt_queueing");
30496 
30497         }
30498 
30499         /* copy in auto request sense if it was on fifo */
30500         if (fi_arq != NULL) {
30501                 bcopy(fi_arq, pktp->pkt_scbp, sizeof (struct sd_fi_arq));
30502         }
30503 
30504         /* free structs */
30505         if (un->sd_fi_fifo_pkt[i] != NULL) {
30506                 kmem_free(un->sd_fi_fifo_pkt[i], sizeof (struct sd_fi_pkt));
30507         }
30508         if (un->sd_fi_fifo_xb[i] != NULL) {
30509                 kmem_free(un->sd_fi_fifo_xb[i], sizeof (struct sd_fi_xb));
30510         }
30511         if (un->sd_fi_fifo_un[i] != NULL) {
30512                 kmem_free(un->sd_fi_fifo_un[i], sizeof (struct sd_fi_un));
30513         }
30514         if (un->sd_fi_fifo_arq[i] != NULL) {
30515                 kmem_free(un->sd_fi_fifo_arq[i], sizeof (struct sd_fi_arq));
30516         }
30517 
30518         /*
30519          * kmem_free does not gurantee to set to NULL
30520          * since we uses these to determine if we set
30521          * values or not lets confirm they are always
30522          * NULL after free
30523          */
30524         un->sd_fi_fifo_pkt[i] = NULL;
30525         un->sd_fi_fifo_un[i] = NULL;
30526         un->sd_fi_fifo_xb[i] = NULL;
30527         un->sd_fi_fifo_arq[i] = NULL;
30528 
30529         un->sd_fi_fifo_start++;
30530 
30531         mutex_exit(SD_MUTEX(un));
30532 
30533         SD_INFO(SD_LOG_SDTEST, un, "sd_faultinjection: exit\n");
30534 }
30535 
30536 #endif /* SD_FAULT_INJECTION */
30537 
30538 /*
30539  * This routine is invoked in sd_unit_attach(). Before calling it, the
30540  * properties in conf file should be processed already, and "hotpluggable"
30541  * property was processed also.
30542  *
30543  * The sd driver distinguishes 3 different type of devices: removable media,
30544  * non-removable media, and hotpluggable. Below the differences are defined:
30545  *
30546  * 1. Device ID
30547  *
30548  *     The device ID of a device is used to identify this device. Refer to
30549  *     ddi_devid_register(9F).
30550  *
30551  *     For a non-removable media disk device which can provide 0x80 or 0x83
30552  *     VPD page (refer to INQUIRY command of SCSI SPC specification), a unique
30553  *     device ID is created to identify this device. For other non-removable
30554  *     media devices, a default device ID is created only if this device has
30555  *     at least 2 alter cylinders. Otherwise, this device has no devid.
30556  *
30557  *     -------------------------------------------------------
30558  *     removable media   hotpluggable  | Can Have Device ID
30559  *     -------------------------------------------------------
30560  *         false             false     |     Yes
30561  *         false             true      |     Yes
30562  *         true                x       |     No
30563  *     ------------------------------------------------------
30564  *
30565  *
30566  * 2. SCSI group 4 commands
30567  *
30568  *     In SCSI specs, only some commands in group 4 command set can use
30569  *     8-byte addresses that can be used to access >2TB storage spaces.
30570  *     Other commands have no such capability. Without supporting group4,
30571  *     it is impossible to make full use of storage spaces of a disk with
30572  *     capacity larger than 2TB.
30573  *
30574  *     -----------------------------------------------
30575  *     removable media   hotpluggable   LP64  |  Group
30576  *     -----------------------------------------------
30577  *           false          false       false |   1
30578  *           false          false       true  |   4
30579  *           false          true        false |   1
30580  *           false          true        true  |   4
30581  *           true             x           x   |   5
30582  *     -----------------------------------------------
30583  *
30584  *
30585  * 3. Check for VTOC Label
30586  *
30587  *     If a direct-access disk has no EFI label, sd will check if it has a
30588  *     valid VTOC label. Now, sd also does that check for removable media
30589  *     and hotpluggable devices.
30590  *
30591  *     --------------------------------------------------------------
30592  *     Direct-Access   removable media    hotpluggable |  Check Label
30593  *     -------------------------------------------------------------
30594  *         false          false           false        |   No
30595  *         false          false           true         |   No
30596  *         false          true            false        |   Yes
30597  *         false          true            true         |   Yes
30598  *         true            x                x          |   Yes
30599  *     --------------------------------------------------------------
30600  *
30601  *
30602  * 4. Building default VTOC label
30603  *
30604  *     As section 3 says, sd checks if some kinds of devices have VTOC label.
30605  *     If those devices have no valid VTOC label, sd(7d) will attempt to
30606  *     create default VTOC for them. Currently sd creates default VTOC label
30607  *     for all devices on x86 platform (VTOC_16), but only for removable
30608  *     media devices on SPARC (VTOC_8).
30609  *
30610  *     -----------------------------------------------------------
30611  *       removable media hotpluggable platform   |   Default Label
30612  *     -----------------------------------------------------------
30613  *             false          false    sparc     |     No
30614  *             false          true      x86      |     Yes
30615  *             false          true     sparc     |     Yes
30616  *             true             x        x       |     Yes
30617  *     ----------------------------------------------------------
30618  *
30619  *
30620  * 5. Supported blocksizes of target devices
30621  *
30622  *     Sd supports non-512-byte blocksize for removable media devices only.
30623  *     For other devices, only 512-byte blocksize is supported. This may be
30624  *     changed in near future because some RAID devices require non-512-byte
30625  *     blocksize
30626  *
30627  *     -----------------------------------------------------------
30628  *     removable media    hotpluggable    | non-512-byte blocksize
30629  *     -----------------------------------------------------------
30630  *           false          false         |   No
30631  *           false          true          |   No
30632  *           true             x           |   Yes
30633  *     -----------------------------------------------------------
30634  *
30635  *
30636  * 6. Automatic mount & unmount
30637  *
30638  *     Sd(7d) driver provides DKIOCREMOVABLE ioctl. This ioctl is used to query
30639  *     if a device is removable media device. It return 1 for removable media
30640  *     devices, and 0 for others.
30641  *
30642  *     The automatic mounting subsystem should distinguish between the types
30643  *     of devices and apply automounting policies to each.
30644  *
30645  *
30646  * 7. fdisk partition management
30647  *
30648  *     Fdisk is traditional partition method on x86 platform. Sd(7d) driver
30649  *     just supports fdisk partitions on x86 platform. On sparc platform, sd
30650  *     doesn't support fdisk partitions at all. Note: pcfs(7fs) can recognize
30651  *     fdisk partitions on both x86 and SPARC platform.
30652  *
30653  *     -----------------------------------------------------------
30654  *       platform   removable media  USB/1394  |  fdisk supported
30655  *     -----------------------------------------------------------
30656  *        x86         X               X        |       true
30657  *     ------------------------------------------------------------
30658  *        sparc       X               X        |       false
30659  *     ------------------------------------------------------------
30660  *
30661  *
30662  * 8. MBOOT/MBR
30663  *
30664  *     Although sd(7d) doesn't support fdisk on SPARC platform, it does support
30665  *     read/write mboot for removable media devices on sparc platform.
30666  *
30667  *     -----------------------------------------------------------
30668  *       platform   removable media  USB/1394  |  mboot supported
30669  *     -----------------------------------------------------------
30670  *        x86         X               X        |       true
30671  *     ------------------------------------------------------------
30672  *        sparc      false           false     |       false
30673  *        sparc      false           true      |       true
30674  *        sparc      true            false     |       true
30675  *        sparc      true            true      |       true
30676  *     ------------------------------------------------------------
30677  *
30678  *
30679  * 9.  error handling during opening device
30680  *
30681  *     If failed to open a disk device, an errno is returned. For some kinds
30682  *     of errors, different errno is returned depending on if this device is
30683  *     a removable media device. This brings USB/1394 hard disks in line with
30684  *     expected hard disk behavior. It is not expected that this breaks any
30685  *     application.
30686  *
30687  *     ------------------------------------------------------
30688  *       removable media    hotpluggable   |  errno
30689  *     ------------------------------------------------------
30690  *             false          false        |   EIO
30691  *             false          true         |   EIO
30692  *             true             x          |   ENXIO
30693  *     ------------------------------------------------------
30694  *
30695  *
30696  * 11. ioctls: DKIOCEJECT, CDROMEJECT
30697  *
30698  *     These IOCTLs are applicable only to removable media devices.
30699  *
30700  *     -----------------------------------------------------------
30701  *       removable media    hotpluggable   |DKIOCEJECT, CDROMEJECT
30702  *     -----------------------------------------------------------
30703  *             false          false        |     No
30704  *             false          true         |     No
30705  *             true            x           |     Yes
30706  *     -----------------------------------------------------------
30707  *
30708  *
30709  * 12. Kstats for partitions
30710  *
30711  *     sd creates partition kstat for non-removable media devices. USB and
30712  *     Firewire hard disks now have partition kstats
30713  *
30714  *      ------------------------------------------------------
30715  *       removable media    hotpluggable   |   kstat
30716  *      ------------------------------------------------------
30717  *             false          false        |    Yes
30718  *             false          true         |    Yes
30719  *             true             x          |    No
30720  *       ------------------------------------------------------
30721  *
30722  *
30723  * 13. Removable media & hotpluggable properties
30724  *
30725  *     Sd driver creates a "removable-media" property for removable media
30726  *     devices. Parent nexus drivers create a "hotpluggable" property if
30727  *     it supports hotplugging.
30728  *
30729  *     ---------------------------------------------------------------------
30730  *     removable media   hotpluggable |  "removable-media"   " hotpluggable"
30731  *     ---------------------------------------------------------------------
30732  *       false            false       |    No                   No
30733  *       false            true        |    No                   Yes
30734  *       true             false       |    Yes                  No
30735  *       true             true        |    Yes                  Yes
30736  *     ---------------------------------------------------------------------
30737  *
30738  *
30739  * 14. Power Management
30740  *
30741  *     sd only power manages removable media devices or devices that support
30742  *     LOG_SENSE or have a "pm-capable" property  (PSARC/2002/250)
30743  *
30744  *     A parent nexus that supports hotplugging can also set "pm-capable"
30745  *     if the disk can be power managed.
30746  *
30747  *     ------------------------------------------------------------
30748  *       removable media hotpluggable pm-capable  |   power manage
30749  *     ------------------------------------------------------------
30750  *             false          false     false     |     No
30751  *             false          false     true      |     Yes
30752  *             false          true      false     |     No
30753  *             false          true      true      |     Yes
30754  *             true             x        x        |     Yes
30755  *     ------------------------------------------------------------
30756  *
30757  *      USB and firewire hard disks can now be power managed independently
30758  *      of the framebuffer
30759  *
30760  *
30761  * 15. Support for USB disks with capacity larger than 1TB
30762  *
30763  *     Currently, sd doesn't permit a fixed disk device with capacity
30764  *     larger than 1TB to be used in a 32-bit operating system environment.
30765  *     However, sd doesn't do that for removable media devices. Instead, it
30766  *     assumes that removable media devices cannot have a capacity larger
30767  *     than 1TB. Therefore, using those devices on 32-bit system is partially
30768  *     supported, which can cause some unexpected results.
30769  *
30770  *     ---------------------------------------------------------------------
30771  *       removable media    USB/1394 | Capacity > 1TB |   Used in 32-bit env
30772  *     ---------------------------------------------------------------------
30773  *             false          false  |   true         |     no
30774  *             false          true   |   true         |     no
30775  *             true           false  |   true         |     Yes
30776  *             true           true   |   true         |     Yes
30777  *     ---------------------------------------------------------------------
30778  *
30779  *
30780  * 16. Check write-protection at open time
30781  *
30782  *     When a removable media device is being opened for writing without NDELAY
30783  *     flag, sd will check if this device is writable. If attempting to open
30784  *     without NDELAY flag a write-protected device, this operation will abort.
30785  *
30786  *     ------------------------------------------------------------
30787  *       removable media    USB/1394   |   WP Check
30788  *     ------------------------------------------------------------
30789  *             false          false    |     No
30790  *             false          true     |     No
30791  *             true           false    |     Yes
30792  *             true           true     |     Yes
30793  *     ------------------------------------------------------------
30794  *
30795  *
30796  * 17. syslog when corrupted VTOC is encountered
30797  *
30798  *      Currently, if an invalid VTOC is encountered, sd only print syslog
30799  *      for fixed SCSI disks.
30800  *     ------------------------------------------------------------
30801  *       removable media    USB/1394   |   print syslog
30802  *     ------------------------------------------------------------
30803  *             false          false    |     Yes
30804  *             false          true     |     No
30805  *             true           false    |     No
30806  *             true           true     |     No
30807  *     ------------------------------------------------------------
30808  */
30809 static void
30810 sd_set_unit_attributes(struct sd_lun *un, dev_info_t *devi)
30811 {
30812         int     pm_cap;
30813 
30814         ASSERT(un->un_sd);
30815         ASSERT(un->un_sd->sd_inq);
30816 
30817         /*
30818          * Enable SYNC CACHE support for all devices.
30819          */
30820         un->un_f_sync_cache_supported = TRUE;
30821 
30822         /*
30823          * Set the sync cache required flag to false.
30824          * This would ensure that there is no SYNC CACHE
30825          * sent when there are no writes
30826          */
30827         un->un_f_sync_cache_required = FALSE;
30828 
30829         if (un->un_sd->sd_inq->inq_rmb) {
30830                 /*
30831                  * The media of this device is removable. And for this kind
30832                  * of devices, it is possible to change medium after opening
30833                  * devices. Thus we should support this operation.
30834                  */
30835                 un->un_f_has_removable_media = TRUE;
30836 
30837                 /*
30838                  * support non-512-byte blocksize of removable media devices
30839                  */
30840                 un->un_f_non_devbsize_supported = TRUE;
30841 
30842                 /*
30843                  * Assume that all removable media devices support DOOR_LOCK
30844                  */
30845                 un->un_f_doorlock_supported = TRUE;
30846 
30847                 /*
30848                  * For a removable media device, it is possible to be opened
30849                  * with NDELAY flag when there is no media in drive, in this
30850                  * case we don't care if device is writable. But if without
30851                  * NDELAY flag, we need to check if media is write-protected.
30852                  */
30853                 un->un_f_chk_wp_open = TRUE;
30854 
30855                 /*
30856                  * need to start a SCSI watch thread to monitor media state,
30857                  * when media is being inserted or ejected, notify syseventd.
30858                  */
30859                 un->un_f_monitor_media_state = TRUE;
30860 
30861                 /*
30862                  * Some devices don't support START_STOP_UNIT command.
30863                  * Therefore, we'd better check if a device supports it
30864                  * before sending it.
30865                  */
30866                 un->un_f_check_start_stop = TRUE;
30867 
30868                 /*
30869                  * support eject media ioctl:
30870                  *              FDEJECT, DKIOCEJECT, CDROMEJECT
30871                  */
30872                 un->un_f_eject_media_supported = TRUE;
30873 
30874                 /*
30875                  * Because many removable-media devices don't support
30876                  * LOG_SENSE, we couldn't use this command to check if
30877                  * a removable media device support power-management.
30878                  * We assume that they support power-management via
30879                  * START_STOP_UNIT command and can be spun up and down
30880                  * without limitations.
30881                  */
30882                 un->un_f_pm_supported = TRUE;
30883 
30884                 /*
30885                  * Need to create a zero length (Boolean) property
30886                  * removable-media for the removable media devices.
30887                  * Note that the return value of the property is not being
30888                  * checked, since if unable to create the property
30889                  * then do not want the attach to fail altogether. Consistent
30890                  * with other property creation in attach.
30891                  */
30892                 (void) ddi_prop_create(DDI_DEV_T_NONE, devi,
30893                     DDI_PROP_CANSLEEP, "removable-media", NULL, 0);
30894 
30895         } else {
30896                 /*
30897                  * create device ID for device
30898                  */
30899                 un->un_f_devid_supported = TRUE;
30900 
30901                 /*
30902                  * Spin up non-removable-media devices once it is attached
30903                  */
30904                 un->un_f_attach_spinup = TRUE;
30905 
30906                 /*
30907                  * According to SCSI specification, Sense data has two kinds of
30908                  * format: fixed format, and descriptor format. At present, we
30909                  * don't support descriptor format sense data for removable
30910                  * media.
30911                  */
30912                 if (SD_INQUIRY(un)->inq_dtype == DTYPE_DIRECT) {
30913                         un->un_f_descr_format_supported = TRUE;
30914                 }
30915 
30916                 /*
30917                  * kstats are created only for non-removable media devices.
30918                  *
30919                  * Set this in sd.conf to 0 in order to disable kstats.  The
30920                  * default is 1, so they are enabled by default.
30921                  */
30922                 un->un_f_pkstats_enabled = (ddi_prop_get_int(DDI_DEV_T_ANY,
30923                     SD_DEVINFO(un), DDI_PROP_DONTPASS,
30924                     "enable-partition-kstats", 1));
30925 
30926                 /*
30927                  * Check if HBA has set the "pm-capable" property.
30928                  * If "pm-capable" exists and is non-zero then we can
30929                  * power manage the device without checking the start/stop
30930                  * cycle count log sense page.
30931                  *
30932                  * If "pm-capable" exists and is set to be false (0),
30933                  * then we should not power manage the device.
30934                  *
30935                  * If "pm-capable" doesn't exist then pm_cap will
30936                  * be set to SD_PM_CAPABLE_UNDEFINED (-1).  In this case,
30937                  * sd will check the start/stop cycle count log sense page
30938                  * and power manage the device if the cycle count limit has
30939                  * not been exceeded.
30940                  */
30941                 pm_cap = ddi_prop_get_int(DDI_DEV_T_ANY, devi,
30942                     DDI_PROP_DONTPASS, "pm-capable", SD_PM_CAPABLE_UNDEFINED);
30943                 if (SD_PM_CAPABLE_IS_UNDEFINED(pm_cap)) {
30944                         un->un_f_log_sense_supported = TRUE;
30945                         if (!un->un_f_power_condition_disabled &&
30946                             SD_INQUIRY(un)->inq_ansi == 6) {
30947                                 un->un_f_power_condition_supported = TRUE;
30948                         }
30949                 } else {
30950                         /*
30951                          * pm-capable property exists.
30952                          *
30953                          * Convert "TRUE" values for pm_cap to
30954                          * SD_PM_CAPABLE_IS_TRUE to make it easier to check
30955                          * later. "TRUE" values are any values defined in
30956                          * inquiry.h.
30957                          */
30958                         if (SD_PM_CAPABLE_IS_FALSE(pm_cap)) {
30959                                 un->un_f_log_sense_supported = FALSE;
30960                         } else {
30961                                 /* SD_PM_CAPABLE_IS_TRUE case */
30962                                 un->un_f_pm_supported = TRUE;
30963                                 if (!un->un_f_power_condition_disabled &&
30964                                     SD_PM_CAPABLE_IS_SPC_4(pm_cap)) {
30965                                         un->un_f_power_condition_supported =
30966                                             TRUE;
30967                                 }
30968                                 if (SD_PM_CAP_LOG_SUPPORTED(pm_cap)) {
30969                                         un->un_f_log_sense_supported = TRUE;
30970                                         un->un_f_pm_log_sense_smart =
30971                                             SD_PM_CAP_SMART_LOG(pm_cap);
30972                                 }
30973                         }
30974 
30975                         SD_INFO(SD_LOG_ATTACH_DETACH, un,
30976                             "sd_unit_attach: un:0x%p pm-capable "
30977                             "property set to %d.\n", un, un->un_f_pm_supported);
30978                 }
30979         }
30980 
30981         if (un->un_f_is_hotpluggable) {
30982 
30983                 /*
30984                  * Have to watch hotpluggable devices as well, since
30985                  * that's the only way for userland applications to
30986                  * detect hot removal while device is busy/mounted.
30987                  */
30988                 un->un_f_monitor_media_state = TRUE;
30989 
30990                 un->un_f_check_start_stop = TRUE;
30991 
30992         }
30993 }
30994 
30995 /*
30996  * sd_tg_rdwr:
30997  * Provides rdwr access for cmlb via sd_tgops. The start_block is
30998  * in sys block size, req_length in bytes.
30999  *
31000  */
31001 static int
31002 sd_tg_rdwr(dev_info_t *devi, uchar_t cmd, void *bufaddr,
31003     diskaddr_t start_block, size_t reqlength, void *tg_cookie)
31004 {
31005         struct sd_lun *un;
31006         int path_flag = (int)(uintptr_t)tg_cookie;
31007         char *dkl = NULL;
31008         diskaddr_t real_addr = start_block;
31009         diskaddr_t first_byte, end_block;
31010 
31011         size_t  buffer_size = reqlength;
31012         int rval = 0;
31013         diskaddr_t      cap;
31014         uint32_t        lbasize;
31015         sd_ssc_t        *ssc;
31016 
31017         un = ddi_get_soft_state(sd_state, ddi_get_instance(devi));
31018         if (un == NULL)
31019                 return (ENXIO);
31020 
31021         if (cmd != TG_READ && cmd != TG_WRITE)
31022                 return (EINVAL);
31023 
31024         ssc = sd_ssc_init(un);
31025         mutex_enter(SD_MUTEX(un));
31026         if (un->un_f_tgt_blocksize_is_valid == FALSE) {
31027                 mutex_exit(SD_MUTEX(un));
31028                 rval = sd_send_scsi_READ_CAPACITY(ssc, (uint64_t *)&cap,
31029                     &lbasize, path_flag);
31030                 if (rval != 0)
31031                         goto done1;
31032                 mutex_enter(SD_MUTEX(un));
31033                 sd_update_block_info(un, lbasize, cap);
31034                 if ((un->un_f_tgt_blocksize_is_valid == FALSE)) {
31035                         mutex_exit(SD_MUTEX(un));
31036                         rval = EIO;
31037                         goto done;
31038                 }
31039         }
31040 
31041         if (NOT_DEVBSIZE(un)) {
31042                 /*
31043                  * sys_blocksize != tgt_blocksize, need to re-adjust
31044                  * blkno and save the index to beginning of dk_label
31045                  */
31046                 first_byte  = SD_SYSBLOCKS2BYTES(start_block);
31047                 real_addr = first_byte / un->un_tgt_blocksize;
31048 
31049                 end_block = (first_byte + reqlength +
31050                     un->un_tgt_blocksize - 1) / un->un_tgt_blocksize;
31051 
31052                 /* round up buffer size to multiple of target block size */
31053                 buffer_size = (end_block - real_addr) * un->un_tgt_blocksize;
31054 
31055                 SD_TRACE(SD_LOG_IO_PARTITION, un, "sd_tg_rdwr",
31056                     "label_addr: 0x%x allocation size: 0x%x\n",
31057                     real_addr, buffer_size);
31058 
31059                 if (((first_byte % un->un_tgt_blocksize) != 0) ||
31060                     (reqlength % un->un_tgt_blocksize) != 0)
31061                         /* the request is not aligned */
31062                         dkl = kmem_zalloc(buffer_size, KM_SLEEP);
31063         }
31064 
31065         /*
31066          * The MMC standard allows READ CAPACITY to be
31067          * inaccurate by a bounded amount (in the interest of
31068          * response latency).  As a result, failed READs are
31069          * commonplace (due to the reading of metadata and not
31070          * data). Depending on the per-Vendor/drive Sense data,
31071          * the failed READ can cause many (unnecessary) retries.
31072          */
31073 
31074         if (ISCD(un) && (cmd == TG_READ) &&
31075             (un->un_f_blockcount_is_valid == TRUE) &&
31076             ((start_block == (un->un_blockcount - 1))||
31077             (start_block == (un->un_blockcount - 2)))) {
31078                         path_flag = SD_PATH_DIRECT_PRIORITY;
31079         }
31080 
31081         mutex_exit(SD_MUTEX(un));
31082         if (cmd == TG_READ) {
31083                 rval = sd_send_scsi_READ(ssc, (dkl != NULL)? dkl: bufaddr,
31084                     buffer_size, real_addr, path_flag);
31085                 if (dkl != NULL)
31086                         bcopy(dkl + SD_TGTBYTEOFFSET(un, start_block,
31087                             real_addr), bufaddr, reqlength);
31088         } else {
31089                 if (dkl) {
31090                         rval = sd_send_scsi_READ(ssc, dkl, buffer_size,
31091                             real_addr, path_flag);
31092                         if (rval) {
31093                                 goto done1;
31094                         }
31095                         bcopy(bufaddr, dkl + SD_TGTBYTEOFFSET(un, start_block,
31096                             real_addr), reqlength);
31097                 }
31098                 rval = sd_send_scsi_WRITE(ssc, (dkl != NULL)? dkl: bufaddr,
31099                     buffer_size, real_addr, path_flag);
31100         }
31101 
31102 done1:
31103         if (dkl != NULL)
31104                 kmem_free(dkl, buffer_size);
31105 
31106         if (rval != 0) {
31107                 if (rval == EIO)
31108                         sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
31109                 else
31110                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
31111         }
31112 done:
31113         sd_ssc_fini(ssc);
31114         return (rval);
31115 }
31116 
31117 
31118 static int
31119 sd_tg_getinfo(dev_info_t *devi, int cmd, void *arg, void *tg_cookie)
31120 {
31121 
31122         struct sd_lun *un;
31123         diskaddr_t      cap;
31124         uint32_t        lbasize;
31125         int             path_flag = (int)(uintptr_t)tg_cookie;
31126         int             ret = 0;
31127 
31128         un = ddi_get_soft_state(sd_state, ddi_get_instance(devi));
31129         if (un == NULL)
31130                 return (ENXIO);
31131 
31132         switch (cmd) {
31133         case TG_GETPHYGEOM:
31134         case TG_GETVIRTGEOM:
31135         case TG_GETCAPACITY:
31136         case TG_GETBLOCKSIZE:
31137                 mutex_enter(SD_MUTEX(un));
31138 
31139                 if ((un->un_f_blockcount_is_valid == TRUE) &&
31140                     (un->un_f_tgt_blocksize_is_valid == TRUE)) {
31141                         cap = un->un_blockcount;
31142                         lbasize = un->un_tgt_blocksize;
31143                         mutex_exit(SD_MUTEX(un));
31144                 } else {
31145                         sd_ssc_t        *ssc;
31146                         mutex_exit(SD_MUTEX(un));
31147                         ssc = sd_ssc_init(un);
31148                         ret = sd_send_scsi_READ_CAPACITY(ssc, (uint64_t *)&cap,
31149                             &lbasize, path_flag);
31150                         if (ret != 0) {
31151                                 if (ret == EIO)
31152                                         sd_ssc_assessment(ssc,
31153                                             SD_FMT_STATUS_CHECK);
31154                                 else
31155                                         sd_ssc_assessment(ssc,
31156                                             SD_FMT_IGNORE);
31157                                 sd_ssc_fini(ssc);
31158                                 return (ret);
31159                         }
31160                         sd_ssc_fini(ssc);
31161                         mutex_enter(SD_MUTEX(un));
31162                         sd_update_block_info(un, lbasize, cap);
31163                         if ((un->un_f_blockcount_is_valid == FALSE) ||
31164                             (un->un_f_tgt_blocksize_is_valid == FALSE)) {
31165                                 mutex_exit(SD_MUTEX(un));
31166                                 return (EIO);
31167                         }
31168                         mutex_exit(SD_MUTEX(un));
31169                 }
31170 
31171                 if (cmd == TG_GETCAPACITY) {
31172                         *(diskaddr_t *)arg = cap;
31173                         return (0);
31174                 }
31175 
31176                 if (cmd == TG_GETBLOCKSIZE) {
31177                         *(uint32_t *)arg = lbasize;
31178                         return (0);
31179                 }
31180 
31181                 if (cmd == TG_GETPHYGEOM)
31182                         ret = sd_get_physical_geometry(un, (cmlb_geom_t *)arg,
31183                             cap, lbasize, path_flag);
31184                 else
31185                         /* TG_GETVIRTGEOM */
31186                         ret = sd_get_virtual_geometry(un,
31187                             (cmlb_geom_t *)arg, cap, lbasize);
31188 
31189                 return (ret);
31190 
31191         case TG_GETATTR:
31192                 mutex_enter(SD_MUTEX(un));
31193                 ((tg_attribute_t *)arg)->media_is_writable =
31194                     un->un_f_mmc_writable_media;
31195                 ((tg_attribute_t *)arg)->media_is_solid_state =
31196                     un->un_f_is_solid_state;
31197                 mutex_exit(SD_MUTEX(un));
31198                 return (0);
31199         default:
31200                 return (ENOTTY);
31201 
31202         }
31203 }
31204 
31205 /*
31206  *    Function: sd_ssc_ereport_post
31207  *
31208  * Description: Will be called when SD driver need to post an ereport.
31209  *
31210  *    Context: Kernel thread or interrupt context.
31211  */
31212 
31213 #define DEVID_IF_KNOWN(d) "devid", DATA_TYPE_STRING, (d) ? (d) : "unknown"
31214 
31215 static void
31216 sd_ssc_ereport_post(sd_ssc_t *ssc, enum sd_driver_assessment drv_assess)
31217 {
31218         int uscsi_path_instance = 0;
31219         uchar_t uscsi_pkt_reason;
31220         uint32_t uscsi_pkt_state;
31221         uint32_t uscsi_pkt_statistics;
31222         uint64_t uscsi_ena;
31223         uchar_t op_code;
31224         uint8_t *sensep;
31225         union scsi_cdb *cdbp;
31226         uint_t cdblen = 0;
31227         uint_t senlen = 0;
31228         struct sd_lun *un;
31229         dev_info_t *dip;
31230         char *devid;
31231         int ssc_invalid_flags = SSC_FLAGS_INVALID_PKT_REASON |
31232             SSC_FLAGS_INVALID_STATUS |
31233             SSC_FLAGS_INVALID_SENSE |
31234             SSC_FLAGS_INVALID_DATA;
31235         char assessment[16];
31236 
31237         ASSERT(ssc != NULL);
31238         ASSERT(ssc->ssc_uscsi_cmd != NULL);
31239         ASSERT(ssc->ssc_uscsi_info != NULL);
31240 
31241         un = ssc->ssc_un;
31242         ASSERT(un != NULL);
31243 
31244         dip = un->un_sd->sd_dev;
31245 
31246         /*
31247          * Get the devid:
31248          *      devid will only be passed to non-transport error reports.
31249          */
31250         devid = DEVI(dip)->devi_devid_str;
31251 
31252         /*
31253          * If we are syncing or dumping, the command will not be executed
31254          * so we bypass this situation.
31255          */
31256         if (ddi_in_panic() || (un->un_state == SD_STATE_SUSPENDED) ||
31257             (un->un_state == SD_STATE_DUMPING))
31258                 return;
31259 
31260         uscsi_pkt_reason = ssc->ssc_uscsi_info->ui_pkt_reason;
31261         uscsi_path_instance = ssc->ssc_uscsi_cmd->uscsi_path_instance;
31262         uscsi_pkt_state = ssc->ssc_uscsi_info->ui_pkt_state;
31263         uscsi_pkt_statistics = ssc->ssc_uscsi_info->ui_pkt_statistics;
31264         uscsi_ena = ssc->ssc_uscsi_info->ui_ena;
31265 
31266         sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf;
31267         cdbp = (union scsi_cdb *)ssc->ssc_uscsi_cmd->uscsi_cdb;
31268 
31269         /* In rare cases, EG:DOORLOCK, the cdb could be NULL */
31270         if (cdbp == NULL) {
31271                 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
31272                     "sd_ssc_ereport_post meet empty cdb\n");
31273                 return;
31274         }
31275 
31276         op_code = cdbp->scc_cmd;
31277 
31278         cdblen = (int)ssc->ssc_uscsi_cmd->uscsi_cdblen;
31279         senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen -
31280             ssc->ssc_uscsi_cmd->uscsi_rqresid);
31281 
31282         if (senlen > 0)
31283                 ASSERT(sensep != NULL);
31284 
31285         /*
31286          * Initialize drv_assess to corresponding values.
31287          * SD_FM_DRV_FATAL will be mapped to "fail" or "fatal" depending
31288          * on the sense-key returned back.
31289          */
31290         switch (drv_assess) {
31291                 case SD_FM_DRV_RECOVERY:
31292                         (void) sprintf(assessment, "%s", "recovered");
31293                         break;
31294                 case SD_FM_DRV_RETRY:
31295                         (void) sprintf(assessment, "%s", "retry");
31296                         break;
31297                 case SD_FM_DRV_NOTICE:
31298                         (void) sprintf(assessment, "%s", "info");
31299                         break;
31300                 case SD_FM_DRV_FATAL:
31301                 default:
31302                         (void) sprintf(assessment, "%s", "unknown");
31303         }
31304         /*
31305          * If drv_assess == SD_FM_DRV_RECOVERY, this should be a recovered
31306          * command, we will post ereport.io.scsi.cmd.disk.recovered.
31307          * driver-assessment will always be "recovered" here.
31308          */
31309         if (drv_assess == SD_FM_DRV_RECOVERY) {
31310                 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, NULL,
31311                     "cmd.disk.recovered", uscsi_ena, devid, NULL,
31312                     DDI_NOSLEEP, NULL,
31313                     FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
31314                     DEVID_IF_KNOWN(devid),
31315                     "driver-assessment", DATA_TYPE_STRING, assessment,
31316                     "op-code", DATA_TYPE_UINT8, op_code,
31317                     "cdb", DATA_TYPE_UINT8_ARRAY,
31318                     cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb,
31319                     "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason,
31320                     "pkt-state", DATA_TYPE_UINT32, uscsi_pkt_state,
31321                     "pkt-stats", DATA_TYPE_UINT32, uscsi_pkt_statistics,
31322                     NULL);
31323                 return;
31324         }
31325 
31326         /*
31327          * If there is un-expected/un-decodable data, we should post
31328          * ereport.io.scsi.cmd.disk.dev.uderr.
31329          * driver-assessment will be set based on parameter drv_assess.
31330          * SSC_FLAGS_INVALID_SENSE - invalid sense data sent back.
31331          * SSC_FLAGS_INVALID_PKT_REASON - invalid pkt-reason encountered.
31332          * SSC_FLAGS_INVALID_STATUS - invalid stat-code encountered.
31333          * SSC_FLAGS_INVALID_DATA - invalid data sent back.
31334          */
31335         if (ssc->ssc_flags & ssc_invalid_flags) {
31336                 if (ssc->ssc_flags & SSC_FLAGS_INVALID_SENSE) {
31337                         scsi_fm_ereport_post(un->un_sd, uscsi_path_instance,
31338                             NULL, "cmd.disk.dev.uderr", uscsi_ena, devid,
31339                             NULL, DDI_NOSLEEP, NULL,
31340                             FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
31341                             DEVID_IF_KNOWN(devid),
31342                             "driver-assessment", DATA_TYPE_STRING,
31343                             drv_assess == SD_FM_DRV_FATAL ?
31344                             "fail" : assessment,
31345                             "op-code", DATA_TYPE_UINT8, op_code,
31346                             "cdb", DATA_TYPE_UINT8_ARRAY,
31347                             cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb,
31348                             "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason,
31349                             "pkt-state", DATA_TYPE_UINT32, uscsi_pkt_state,
31350                             "pkt-stats", DATA_TYPE_UINT32,
31351                             uscsi_pkt_statistics,
31352                             "stat-code", DATA_TYPE_UINT8,
31353                             ssc->ssc_uscsi_cmd->uscsi_status,
31354                             "un-decode-info", DATA_TYPE_STRING,
31355                             ssc->ssc_info,
31356                             "un-decode-value", DATA_TYPE_UINT8_ARRAY,
31357                             senlen, sensep,
31358                             NULL);
31359                 } else {
31360                         /*
31361                          * For other type of invalid data, the
31362                          * un-decode-value field would be empty because the
31363                          * un-decodable content could be seen from upper
31364                          * level payload or inside un-decode-info.
31365                          */
31366                         scsi_fm_ereport_post(un->un_sd, uscsi_path_instance,
31367                             NULL,
31368                             "cmd.disk.dev.uderr", uscsi_ena, devid,
31369                             NULL, DDI_NOSLEEP, NULL,
31370                             FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
31371                             DEVID_IF_KNOWN(devid),
31372                             "driver-assessment", DATA_TYPE_STRING,
31373                             drv_assess == SD_FM_DRV_FATAL ?
31374                             "fail" : assessment,
31375                             "op-code", DATA_TYPE_UINT8, op_code,
31376                             "cdb", DATA_TYPE_UINT8_ARRAY,
31377                             cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb,
31378                             "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason,
31379                             "pkt-state", DATA_TYPE_UINT32, uscsi_pkt_state,
31380                             "pkt-stats", DATA_TYPE_UINT32,
31381                             uscsi_pkt_statistics,
31382                             "stat-code", DATA_TYPE_UINT8,
31383                             ssc->ssc_uscsi_cmd->uscsi_status,
31384                             "un-decode-info", DATA_TYPE_STRING,
31385                             ssc->ssc_info,
31386                             "un-decode-value", DATA_TYPE_UINT8_ARRAY,
31387                             0, NULL,
31388                             NULL);
31389                 }
31390                 ssc->ssc_flags &= ~ssc_invalid_flags;
31391                 return;
31392         }
31393 
31394         if (uscsi_pkt_reason != CMD_CMPLT ||
31395             (ssc->ssc_flags & SSC_FLAGS_TRAN_ABORT)) {
31396                 /*
31397                  * pkt-reason != CMD_CMPLT or SSC_FLAGS_TRAN_ABORT was
31398                  * set inside sd_start_cmds due to errors(bad packet or
31399                  * fatal transport error), we should take it as a
31400                  * transport error, so we post ereport.io.scsi.cmd.disk.tran.
31401                  * driver-assessment will be set based on drv_assess.
31402                  * We will set devid to NULL because it is a transport
31403                  * error.
31404                  */
31405                 if (ssc->ssc_flags & SSC_FLAGS_TRAN_ABORT)
31406                         ssc->ssc_flags &= ~SSC_FLAGS_TRAN_ABORT;
31407 
31408                 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, NULL,
31409                     "cmd.disk.tran", uscsi_ena, NULL, NULL, DDI_NOSLEEP, NULL,
31410                     FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
31411                     DEVID_IF_KNOWN(devid),
31412                     "driver-assessment", DATA_TYPE_STRING,
31413                     drv_assess == SD_FM_DRV_FATAL ? "fail" : assessment,
31414                     "op-code", DATA_TYPE_UINT8, op_code,
31415                     "cdb", DATA_TYPE_UINT8_ARRAY,
31416                     cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb,
31417                     "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason,
31418                     "pkt-state", DATA_TYPE_UINT8, uscsi_pkt_state,
31419                     "pkt-stats", DATA_TYPE_UINT32, uscsi_pkt_statistics,
31420                     NULL);
31421         } else {
31422                 /*
31423                  * If we got here, we have a completed command, and we need
31424                  * to further investigate the sense data to see what kind
31425                  * of ereport we should post.
31426                  * No ereport is needed if sense-key is KEY_RECOVERABLE_ERROR
31427                  * and asc/ascq is "ATA PASS-THROUGH INFORMATION AVAILABLE".
31428                  * Post ereport.io.scsi.cmd.disk.dev.rqs.merr if sense-key is
31429                  * KEY_MEDIUM_ERROR.
31430                  * Post ereport.io.scsi.cmd.disk.dev.rqs.derr otherwise.
31431                  * driver-assessment will be set based on the parameter
31432                  * drv_assess.
31433                  */
31434                 if (senlen > 0) {
31435                         /*
31436                          * Here we have sense data available.
31437                          */
31438                         uint8_t sense_key = scsi_sense_key(sensep);
31439                         uint8_t sense_asc = scsi_sense_asc(sensep);
31440                         uint8_t sense_ascq = scsi_sense_ascq(sensep);
31441 
31442                         if (sense_key == KEY_RECOVERABLE_ERROR &&
31443                             sense_asc == 0x00 && sense_ascq == 0x1d)
31444                                 return;
31445 
31446                         if (sense_key == KEY_MEDIUM_ERROR) {
31447                                 /*
31448                                  * driver-assessment should be "fatal" if
31449                                  * drv_assess is SD_FM_DRV_FATAL.
31450                                  */
31451                                 scsi_fm_ereport_post(un->un_sd,
31452                                     uscsi_path_instance, NULL,
31453                                     "cmd.disk.dev.rqs.merr",
31454                                     uscsi_ena, devid, NULL, DDI_NOSLEEP, NULL,
31455                                     FM_VERSION, DATA_TYPE_UINT8,
31456                                     FM_EREPORT_VERS0,
31457                                     DEVID_IF_KNOWN(devid),
31458                                     "driver-assessment",
31459                                     DATA_TYPE_STRING,
31460                                     drv_assess == SD_FM_DRV_FATAL ?
31461                                     "fatal" : assessment,
31462                                     "op-code",
31463                                     DATA_TYPE_UINT8, op_code,
31464                                     "cdb",
31465                                     DATA_TYPE_UINT8_ARRAY, cdblen,
31466                                     ssc->ssc_uscsi_cmd->uscsi_cdb,
31467                                     "pkt-reason",
31468                                     DATA_TYPE_UINT8, uscsi_pkt_reason,
31469                                     "pkt-state",
31470                                     DATA_TYPE_UINT8, uscsi_pkt_state,
31471                                     "pkt-stats",
31472                                     DATA_TYPE_UINT32,
31473                                     uscsi_pkt_statistics,
31474                                     "stat-code",
31475                                     DATA_TYPE_UINT8,
31476                                     ssc->ssc_uscsi_cmd->uscsi_status,
31477                                     "key",
31478                                     DATA_TYPE_UINT8,
31479                                     scsi_sense_key(sensep),
31480                                     "asc",
31481                                     DATA_TYPE_UINT8,
31482                                     scsi_sense_asc(sensep),
31483                                     "ascq",
31484                                     DATA_TYPE_UINT8,
31485                                     scsi_sense_ascq(sensep),
31486                                     "sense-data",
31487                                     DATA_TYPE_UINT8_ARRAY,
31488                                     senlen, sensep,
31489                                     "lba",
31490                                     DATA_TYPE_UINT64,
31491                                     ssc->ssc_uscsi_info->ui_lba,
31492                                     NULL);
31493                         } else {
31494                                 /*
31495                                  * if sense-key == 0x4(hardware
31496                                  * error), driver-assessment should
31497                                  * be "fatal" if drv_assess is
31498                                  * SD_FM_DRV_FATAL.
31499                                  */
31500                                 scsi_fm_ereport_post(un->un_sd,
31501                                     uscsi_path_instance, NULL,
31502                                     "cmd.disk.dev.rqs.derr",
31503                                     uscsi_ena, devid,
31504                                     NULL, DDI_NOSLEEP, NULL,
31505                                     FM_VERSION,
31506                                     DATA_TYPE_UINT8, FM_EREPORT_VERS0,
31507                                     DEVID_IF_KNOWN(devid),
31508                                     "driver-assessment",
31509                                     DATA_TYPE_STRING,
31510                                     drv_assess == SD_FM_DRV_FATAL ?
31511                                     (sense_key == 0x4 ?
31512                                     "fatal" : "fail") : assessment,
31513                                     "op-code",
31514                                     DATA_TYPE_UINT8, op_code,
31515                                     "cdb",
31516                                     DATA_TYPE_UINT8_ARRAY, cdblen,
31517                                     ssc->ssc_uscsi_cmd->uscsi_cdb,
31518                                     "pkt-reason",
31519                                     DATA_TYPE_UINT8, uscsi_pkt_reason,
31520                                     "pkt-state",
31521                                     DATA_TYPE_UINT8, uscsi_pkt_state,
31522                                     "pkt-stats",
31523                                     DATA_TYPE_UINT32,
31524                                     uscsi_pkt_statistics,
31525                                     "stat-code",
31526                                     DATA_TYPE_UINT8,
31527                                     ssc->ssc_uscsi_cmd->uscsi_status,
31528                                     "key",
31529                                     DATA_TYPE_UINT8,
31530                                     scsi_sense_key(sensep),
31531                                     "asc",
31532                                     DATA_TYPE_UINT8,
31533                                     scsi_sense_asc(sensep),
31534                                     "ascq",
31535                                     DATA_TYPE_UINT8,
31536                                     scsi_sense_ascq(sensep),
31537                                     "sense-data",
31538                                     DATA_TYPE_UINT8_ARRAY,
31539                                     senlen, sensep,
31540                                     NULL);
31541                         }
31542                 } else {
31543                         /*
31544                          * For stat_code == STATUS_GOOD, this is not a
31545                          * hardware error.
31546                          */
31547                         if (ssc->ssc_uscsi_cmd->uscsi_status == STATUS_GOOD)
31548                                 return;
31549 
31550                         /*
31551                          * Post ereport.io.scsi.cmd.disk.dev.serr if we got the
31552                          * stat-code but with sense data unavailable.
31553                          * driver-assessment will be set based on parameter
31554                          * drv_assess.
31555                          */
31556                         scsi_fm_ereport_post(un->un_sd, uscsi_path_instance,
31557                             NULL,
31558                             "cmd.disk.dev.serr", uscsi_ena,
31559                             devid, NULL, DDI_NOSLEEP, NULL,
31560                             FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
31561                             DEVID_IF_KNOWN(devid),
31562                             "driver-assessment", DATA_TYPE_STRING,
31563                             drv_assess == SD_FM_DRV_FATAL ? "fail" : assessment,
31564                             "op-code", DATA_TYPE_UINT8, op_code,
31565                             "cdb",
31566                             DATA_TYPE_UINT8_ARRAY,
31567                             cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb,
31568                             "pkt-reason",
31569                             DATA_TYPE_UINT8, uscsi_pkt_reason,
31570                             "pkt-state",
31571                             DATA_TYPE_UINT8, uscsi_pkt_state,
31572                             "pkt-stats",
31573                             DATA_TYPE_UINT32, uscsi_pkt_statistics,
31574                             "stat-code",
31575                             DATA_TYPE_UINT8,
31576                             ssc->ssc_uscsi_cmd->uscsi_status,
31577                             NULL);
31578                 }
31579         }
31580 }
31581 
31582 /*
31583  *     Function: sd_ssc_extract_info
31584  *
31585  * Description: Extract information available to help generate ereport.
31586  *
31587  *     Context: Kernel thread or interrupt context.
31588  */
31589 static void
31590 sd_ssc_extract_info(sd_ssc_t *ssc, struct sd_lun *un, struct scsi_pkt *pktp,
31591     struct buf *bp, struct sd_xbuf *xp)
31592 {
31593         size_t senlen = 0;
31594         union scsi_cdb *cdbp;
31595         int path_instance;
31596         /*
31597          * Need scsi_cdb_size array to determine the cdb length.
31598          */
31599         extern uchar_t  scsi_cdb_size[];
31600 
31601         ASSERT(un != NULL);
31602         ASSERT(pktp != NULL);
31603         ASSERT(bp != NULL);
31604         ASSERT(xp != NULL);
31605         ASSERT(ssc != NULL);
31606         ASSERT(mutex_owned(SD_MUTEX(un)));
31607 
31608         /*
31609          * Transfer the cdb buffer pointer here.
31610          */
31611         cdbp = (union scsi_cdb *)pktp->pkt_cdbp;
31612 
31613         ssc->ssc_uscsi_cmd->uscsi_cdblen = scsi_cdb_size[GETGROUP(cdbp)];
31614         ssc->ssc_uscsi_cmd->uscsi_cdb = (caddr_t)cdbp;
31615 
31616         /*
31617          * Transfer the sense data buffer pointer if sense data is available,
31618          * calculate the sense data length first.
31619          */
31620         if ((xp->xb_sense_state & STATE_XARQ_DONE) ||
31621             (xp->xb_sense_state & STATE_ARQ_DONE)) {
31622                 /*
31623                  * For arq case, we will enter here.
31624                  */
31625                 if (xp->xb_sense_state & STATE_XARQ_DONE) {
31626                         senlen = MAX_SENSE_LENGTH - xp->xb_sense_resid;
31627                 } else {
31628                         senlen = SENSE_LENGTH;
31629                 }
31630         } else {
31631                 /*
31632                  * For non-arq case, we will enter this branch.
31633                  */
31634                 if (SD_GET_PKT_STATUS(pktp) == STATUS_CHECK &&
31635                     (xp->xb_sense_state & STATE_XFERRED_DATA)) {
31636                         senlen = SENSE_LENGTH - xp->xb_sense_resid;
31637                 }
31638 
31639         }
31640 
31641         ssc->ssc_uscsi_cmd->uscsi_rqlen = (senlen & 0xff);
31642         ssc->ssc_uscsi_cmd->uscsi_rqresid = 0;
31643         ssc->ssc_uscsi_cmd->uscsi_rqbuf = (caddr_t)xp->xb_sense_data;
31644 
31645         ssc->ssc_uscsi_cmd->uscsi_status = ((*(pktp)->pkt_scbp) & STATUS_MASK);
31646 
31647         /*
31648          * Only transfer path_instance when scsi_pkt was properly allocated.
31649          */
31650         path_instance = pktp->pkt_path_instance;
31651         if (scsi_pkt_allocated_correctly(pktp) && path_instance)
31652                 ssc->ssc_uscsi_cmd->uscsi_path_instance = path_instance;
31653         else
31654                 ssc->ssc_uscsi_cmd->uscsi_path_instance = 0;
31655 
31656         /*
31657          * Copy in the other fields we may need when posting ereport.
31658          */
31659         ssc->ssc_uscsi_info->ui_pkt_reason = pktp->pkt_reason;
31660         ssc->ssc_uscsi_info->ui_pkt_state = pktp->pkt_state;
31661         ssc->ssc_uscsi_info->ui_pkt_statistics = pktp->pkt_statistics;
31662         ssc->ssc_uscsi_info->ui_lba = (uint64_t)SD_GET_BLKNO(bp);
31663 
31664         /*
31665          * For partially read/write command, we will not create ena
31666          * in case of a successful command be reconized as recovered.
31667          */
31668         if ((pktp->pkt_reason == CMD_CMPLT) &&
31669             (ssc->ssc_uscsi_cmd->uscsi_status == STATUS_GOOD) &&
31670             (senlen == 0)) {
31671                 return;
31672         }
31673 
31674         /*
31675          * To associate ereports of a single command execution flow, we
31676          * need a shared ena for a specific command.
31677          */
31678         if (xp->xb_ena == 0)
31679                 xp->xb_ena = fm_ena_generate(0, FM_ENA_FMT1);
31680         ssc->ssc_uscsi_info->ui_ena = xp->xb_ena;
31681 }
31682 
31683 
31684 /*
31685  *     Function: sd_check_solid_state
31686  *
31687  * Description: Query the optional INQUIRY VPD page 0xb1. If the device
31688  *              supports VPD page 0xb1, sd examines the MEDIUM ROTATION
31689  *              RATE. If the MEDIUM ROTATION RATE is 1, sd assumes the
31690  *              device is a solid state drive.
31691  *
31692  *     Context: Kernel thread or interrupt context.
31693  */
31694 
31695 static void
31696 sd_check_solid_state(sd_ssc_t *ssc)
31697 {
31698         int             rval            = 0;
31699         uchar_t         *inqb1          = NULL;
31700         size_t          inqb1_len       = MAX_INQUIRY_SIZE;
31701         size_t          inqb1_resid     = 0;
31702         struct sd_lun   *un;
31703 
31704         ASSERT(ssc != NULL);
31705         un = ssc->ssc_un;
31706         ASSERT(un != NULL);
31707         ASSERT(!mutex_owned(SD_MUTEX(un)));
31708 
31709         mutex_enter(SD_MUTEX(un));
31710         un->un_f_is_solid_state = FALSE;
31711 
31712         if (ISCD(un)) {
31713                 mutex_exit(SD_MUTEX(un));
31714                 return;
31715         }
31716 
31717         if (sd_check_vpd_page_support(ssc) == 0 &&
31718             un->un_vpd_page_mask & SD_VPD_DEV_CHARACTER_PG) {
31719                 mutex_exit(SD_MUTEX(un));
31720                 /* collect page b1 data */
31721                 inqb1 = kmem_zalloc(inqb1_len, KM_SLEEP);
31722 
31723                 rval = sd_send_scsi_INQUIRY(ssc, inqb1, inqb1_len,
31724                     0x01, 0xB1, &inqb1_resid);
31725 
31726                 if (rval == 0 && (inqb1_len - inqb1_resid > 5)) {
31727                         SD_TRACE(SD_LOG_COMMON, un,
31728                             "sd_check_solid_state: \
31729                             successfully get VPD page: %x \
31730                             PAGE LENGTH: %x BYTE 4: %x \
31731                             BYTE 5: %x", inqb1[1], inqb1[3], inqb1[4],
31732                             inqb1[5]);
31733 
31734                         mutex_enter(SD_MUTEX(un));
31735                         /*
31736                          * Check the MEDIUM ROTATION RATE. If it is set
31737                          * to 1, the device is a solid state drive.
31738                          */
31739                         if (inqb1[4] == 0 && inqb1[5] == 1) {
31740                                 un->un_f_is_solid_state = TRUE;
31741                                 /* solid state drives don't need disksort */
31742                                 un->un_f_disksort_disabled = TRUE;
31743                         }
31744                         mutex_exit(SD_MUTEX(un));
31745                 } else if (rval != 0) {
31746                         sd_ssc_assessment(ssc, SD_FMT_IGNORE);
31747                 }
31748 
31749                 kmem_free(inqb1, inqb1_len);
31750         } else {
31751                 mutex_exit(SD_MUTEX(un));
31752         }
31753 }
31754 
31755 /*
31756  *      Function: sd_check_emulation_mode
31757  *
31758  *   Description: Check whether the SSD is at emulation mode
31759  *                by issuing READ_CAPACITY_16 to see whether
31760  *                we can get physical block size of the drive.
31761  *
31762  *       Context: Kernel thread or interrupt context.
31763  */
31764 
31765 static void
31766 sd_check_emulation_mode(sd_ssc_t *ssc)
31767 {
31768         int             rval = 0;
31769         uint64_t        capacity;
31770         uint_t          lbasize;
31771         uint_t          pbsize;
31772         int             i;
31773         int             devid_len;
31774         struct sd_lun   *un;
31775 
31776         ASSERT(ssc != NULL);
31777         un = ssc->ssc_un;
31778         ASSERT(un != NULL);
31779         ASSERT(!mutex_owned(SD_MUTEX(un)));
31780 
31781         mutex_enter(SD_MUTEX(un));
31782         if (ISCD(un)) {
31783                 mutex_exit(SD_MUTEX(un));
31784                 return;
31785         }
31786 
31787         if (un->un_f_descr_format_supported) {
31788                 mutex_exit(SD_MUTEX(un));
31789                 rval = sd_send_scsi_READ_CAPACITY_16(ssc, &capacity, &lbasize,
31790                     &pbsize, SD_PATH_DIRECT);
31791                 mutex_enter(SD_MUTEX(un));
31792 
31793                 if (rval != 0) {
31794                         un->un_phy_blocksize = DEV_BSIZE;
31795                 } else {
31796                         if (!ISP2(pbsize % DEV_BSIZE) || pbsize == 0) {
31797                                 un->un_phy_blocksize = DEV_BSIZE;
31798                         } else if (pbsize > un->un_phy_blocksize) {
31799                                 /*
31800                                  * Don't reset the physical blocksize
31801                                  * unless we've detected a larger value.
31802                                  */
31803                                 un->un_phy_blocksize = pbsize;
31804                         }
31805                 }
31806         }
31807 
31808         for (i = 0; i < sd_flash_dev_table_size; i++) {
31809                 devid_len = (int)strlen(sd_flash_dev_table[i]);
31810                 if (sd_sdconf_id_match(un, sd_flash_dev_table[i], devid_len)
31811                     == SD_SUCCESS) {
31812                         un->un_phy_blocksize = SSD_SECSIZE;
31813                         if (un->un_f_is_solid_state &&
31814                             un->un_phy_blocksize != un->un_tgt_blocksize)
31815                                 un->un_f_enable_rmw = TRUE;
31816                 }
31817         }
31818 
31819         mutex_exit(SD_MUTEX(un));
31820 }