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, 2016 by Delphix. All rights reserved. 28 * Copyright 2012 DEY Storage Systems, Inc. All rights reserved. 29 * Copyright 2017 Nexenta Systems, Inc. 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, 0, 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 = {0}; 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_bdc_vpd ssd_check_bdc_vpd 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_write_cache_changeable ssd_get_write_cache_changeable 932 #define sd_get_nv_sup ssd_get_nv_sup 933 #define sd_make_device ssd_make_device 934 #define sdopen ssdopen 935 #define sdclose ssdclose 936 #define sd_ready_and_valid ssd_ready_and_valid 937 #define sdmin ssdmin 938 #define sdread ssdread 939 #define sdwrite ssdwrite 940 #define sdaread ssdaread 941 #define sdawrite ssdawrite 942 #define sdstrategy ssdstrategy 943 #define sdioctl ssdioctl 944 #define sd_mapblockaddr_iostart ssd_mapblockaddr_iostart 945 #define sd_mapblocksize_iostart ssd_mapblocksize_iostart 946 #define sd_checksum_iostart ssd_checksum_iostart 947 #define sd_checksum_uscsi_iostart ssd_checksum_uscsi_iostart 948 #define sd_pm_iostart ssd_pm_iostart 949 #define sd_core_iostart ssd_core_iostart 950 #define sd_mapblockaddr_iodone ssd_mapblockaddr_iodone 951 #define sd_mapblocksize_iodone ssd_mapblocksize_iodone 952 #define sd_checksum_iodone ssd_checksum_iodone 953 #define sd_checksum_uscsi_iodone ssd_checksum_uscsi_iodone 954 #define sd_pm_iodone ssd_pm_iodone 955 #define sd_initpkt_for_buf ssd_initpkt_for_buf 956 #define sd_destroypkt_for_buf ssd_destroypkt_for_buf 957 #define sd_setup_rw_pkt ssd_setup_rw_pkt 958 #define sd_setup_next_rw_pkt ssd_setup_next_rw_pkt 959 #define sd_buf_iodone ssd_buf_iodone 960 #define sd_uscsi_strategy ssd_uscsi_strategy 961 #define sd_initpkt_for_uscsi ssd_initpkt_for_uscsi 962 #define sd_destroypkt_for_uscsi ssd_destroypkt_for_uscsi 963 #define sd_uscsi_iodone ssd_uscsi_iodone 964 #define sd_xbuf_strategy ssd_xbuf_strategy 965 #define sd_xbuf_init ssd_xbuf_init 966 #define sd_pm_entry ssd_pm_entry 967 #define sd_pm_exit ssd_pm_exit 968 969 #define sd_pm_idletimeout_handler ssd_pm_idletimeout_handler 970 #define sd_pm_timeout_handler ssd_pm_timeout_handler 971 972 #define sd_add_buf_to_waitq ssd_add_buf_to_waitq 973 #define sdintr ssdintr 974 #define sd_start_cmds ssd_start_cmds 975 #define sd_send_scsi_cmd ssd_send_scsi_cmd 976 #define sd_bioclone_alloc ssd_bioclone_alloc 977 #define sd_bioclone_free ssd_bioclone_free 978 #define sd_shadow_buf_alloc ssd_shadow_buf_alloc 979 #define sd_shadow_buf_free ssd_shadow_buf_free 980 #define sd_print_transport_rejected_message \ 981 ssd_print_transport_rejected_message 982 #define sd_retry_command ssd_retry_command 983 #define sd_set_retry_bp ssd_set_retry_bp 984 #define sd_send_request_sense_command ssd_send_request_sense_command 985 #define sd_start_retry_command ssd_start_retry_command 986 #define sd_start_direct_priority_command \ 987 ssd_start_direct_priority_command 988 #define sd_return_failed_command ssd_return_failed_command 989 #define sd_return_failed_command_no_restart \ 990 ssd_return_failed_command_no_restart 991 #define sd_return_command ssd_return_command 992 #define sd_sync_with_callback ssd_sync_with_callback 993 #define sdrunout ssdrunout 994 #define sd_mark_rqs_busy ssd_mark_rqs_busy 995 #define sd_mark_rqs_idle ssd_mark_rqs_idle 996 #define sd_reduce_throttle ssd_reduce_throttle 997 #define sd_restore_throttle ssd_restore_throttle 998 #define sd_print_incomplete_msg ssd_print_incomplete_msg 999 #define sd_init_cdb_limits ssd_init_cdb_limits 1000 #define sd_pkt_status_good ssd_pkt_status_good 1001 #define sd_pkt_status_check_condition ssd_pkt_status_check_condition 1002 #define sd_pkt_status_busy ssd_pkt_status_busy 1003 #define sd_pkt_status_reservation_conflict \ 1004 ssd_pkt_status_reservation_conflict 1005 #define sd_pkt_status_qfull ssd_pkt_status_qfull 1006 #define sd_handle_request_sense ssd_handle_request_sense 1007 #define sd_handle_auto_request_sense ssd_handle_auto_request_sense 1008 #define sd_print_sense_failed_msg ssd_print_sense_failed_msg 1009 #define sd_validate_sense_data ssd_validate_sense_data 1010 #define sd_decode_sense ssd_decode_sense 1011 #define sd_print_sense_msg ssd_print_sense_msg 1012 #define sd_sense_key_no_sense ssd_sense_key_no_sense 1013 #define sd_sense_key_recoverable_error ssd_sense_key_recoverable_error 1014 #define sd_sense_key_not_ready ssd_sense_key_not_ready 1015 #define sd_sense_key_medium_or_hardware_error \ 1016 ssd_sense_key_medium_or_hardware_error 1017 #define sd_sense_key_illegal_request ssd_sense_key_illegal_request 1018 #define sd_sense_key_unit_attention ssd_sense_key_unit_attention 1019 #define sd_sense_key_fail_command ssd_sense_key_fail_command 1020 #define sd_sense_key_blank_check ssd_sense_key_blank_check 1021 #define sd_sense_key_aborted_command ssd_sense_key_aborted_command 1022 #define sd_sense_key_default ssd_sense_key_default 1023 #define sd_print_retry_msg ssd_print_retry_msg 1024 #define sd_print_cmd_incomplete_msg ssd_print_cmd_incomplete_msg 1025 #define sd_pkt_reason_cmd_incomplete ssd_pkt_reason_cmd_incomplete 1026 #define sd_pkt_reason_cmd_tran_err ssd_pkt_reason_cmd_tran_err 1027 #define sd_pkt_reason_cmd_reset ssd_pkt_reason_cmd_reset 1028 #define sd_pkt_reason_cmd_aborted ssd_pkt_reason_cmd_aborted 1029 #define sd_pkt_reason_cmd_timeout ssd_pkt_reason_cmd_timeout 1030 #define sd_pkt_reason_cmd_unx_bus_free ssd_pkt_reason_cmd_unx_bus_free 1031 #define sd_pkt_reason_cmd_tag_reject ssd_pkt_reason_cmd_tag_reject 1032 #define sd_pkt_reason_default ssd_pkt_reason_default 1033 #define sd_reset_target ssd_reset_target 1034 #define sd_start_stop_unit_callback ssd_start_stop_unit_callback 1035 #define sd_start_stop_unit_task ssd_start_stop_unit_task 1036 #define sd_taskq_create ssd_taskq_create 1037 #define sd_taskq_delete ssd_taskq_delete 1038 #define sd_target_change_task ssd_target_change_task 1039 #define sd_log_dev_status_event ssd_log_dev_status_event 1040 #define sd_log_lun_expansion_event ssd_log_lun_expansion_event 1041 #define sd_log_eject_request_event ssd_log_eject_request_event 1042 #define sd_media_change_task ssd_media_change_task 1043 #define sd_handle_mchange ssd_handle_mchange 1044 #define sd_send_scsi_DOORLOCK ssd_send_scsi_DOORLOCK 1045 #define sd_send_scsi_READ_CAPACITY ssd_send_scsi_READ_CAPACITY 1046 #define sd_send_scsi_READ_CAPACITY_16 ssd_send_scsi_READ_CAPACITY_16 1047 #define sd_send_scsi_GET_CONFIGURATION ssd_send_scsi_GET_CONFIGURATION 1048 #define sd_send_scsi_feature_GET_CONFIGURATION \ 1049 sd_send_scsi_feature_GET_CONFIGURATION 1050 #define sd_send_scsi_START_STOP_UNIT ssd_send_scsi_START_STOP_UNIT 1051 #define sd_send_scsi_INQUIRY ssd_send_scsi_INQUIRY 1052 #define sd_send_scsi_TEST_UNIT_READY ssd_send_scsi_TEST_UNIT_READY 1053 #define sd_send_scsi_PERSISTENT_RESERVE_IN \ 1054 ssd_send_scsi_PERSISTENT_RESERVE_IN 1055 #define sd_send_scsi_PERSISTENT_RESERVE_OUT \ 1056 ssd_send_scsi_PERSISTENT_RESERVE_OUT 1057 #define sd_send_scsi_SYNCHRONIZE_CACHE ssd_send_scsi_SYNCHRONIZE_CACHE 1058 #define sd_send_scsi_SYNCHRONIZE_CACHE_biodone \ 1059 ssd_send_scsi_SYNCHRONIZE_CACHE_biodone 1060 #define sd_send_scsi_MODE_SENSE ssd_send_scsi_MODE_SENSE 1061 #define sd_send_scsi_MODE_SELECT ssd_send_scsi_MODE_SELECT 1062 #define sd_send_scsi_RDWR ssd_send_scsi_RDWR 1063 #define sd_send_scsi_LOG_SENSE ssd_send_scsi_LOG_SENSE 1064 #define sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION \ 1065 ssd_send_scsi_GET_EVENT_STATUS_NOTIFICATION 1066 #define sd_gesn_media_data_valid ssd_gesn_media_data_valid 1067 #define sd_alloc_rqs ssd_alloc_rqs 1068 #define sd_free_rqs ssd_free_rqs 1069 #define sd_dump_memory ssd_dump_memory 1070 #define sd_get_media_info_com ssd_get_media_info_com 1071 #define sd_get_media_info ssd_get_media_info 1072 #define sd_get_media_info_ext ssd_get_media_info_ext 1073 #define sd_dkio_ctrl_info ssd_dkio_ctrl_info 1074 #define sd_nvpair_str_decode ssd_nvpair_str_decode 1075 #define sd_strtok_r ssd_strtok_r 1076 #define sd_set_properties ssd_set_properties 1077 #define sd_get_tunables_from_conf ssd_get_tunables_from_conf 1078 #define sd_setup_next_xfer ssd_setup_next_xfer 1079 #define sd_dkio_get_temp ssd_dkio_get_temp 1080 #define sd_check_mhd ssd_check_mhd 1081 #define sd_mhd_watch_cb ssd_mhd_watch_cb 1082 #define sd_mhd_watch_incomplete ssd_mhd_watch_incomplete 1083 #define sd_sname ssd_sname 1084 #define sd_mhd_resvd_recover ssd_mhd_resvd_recover 1085 #define sd_resv_reclaim_thread ssd_resv_reclaim_thread 1086 #define sd_take_ownership ssd_take_ownership 1087 #define sd_reserve_release ssd_reserve_release 1088 #define sd_rmv_resv_reclaim_req ssd_rmv_resv_reclaim_req 1089 #define sd_mhd_reset_notify_cb ssd_mhd_reset_notify_cb 1090 #define sd_persistent_reservation_in_read_keys \ 1091 ssd_persistent_reservation_in_read_keys 1092 #define sd_persistent_reservation_in_read_resv \ 1093 ssd_persistent_reservation_in_read_resv 1094 #define sd_mhdioc_takeown ssd_mhdioc_takeown 1095 #define sd_mhdioc_failfast ssd_mhdioc_failfast 1096 #define sd_mhdioc_release ssd_mhdioc_release 1097 #define sd_mhdioc_register_devid ssd_mhdioc_register_devid 1098 #define sd_mhdioc_inkeys ssd_mhdioc_inkeys 1099 #define sd_mhdioc_inresv ssd_mhdioc_inresv 1100 #define sr_change_blkmode ssr_change_blkmode 1101 #define sr_change_speed ssr_change_speed 1102 #define sr_atapi_change_speed ssr_atapi_change_speed 1103 #define sr_pause_resume ssr_pause_resume 1104 #define sr_play_msf ssr_play_msf 1105 #define sr_play_trkind ssr_play_trkind 1106 #define sr_read_all_subcodes ssr_read_all_subcodes 1107 #define sr_read_subchannel ssr_read_subchannel 1108 #define sr_read_tocentry ssr_read_tocentry 1109 #define sr_read_tochdr ssr_read_tochdr 1110 #define sr_read_cdda ssr_read_cdda 1111 #define sr_read_cdxa ssr_read_cdxa 1112 #define sr_read_mode1 ssr_read_mode1 1113 #define sr_read_mode2 ssr_read_mode2 1114 #define sr_read_cd_mode2 ssr_read_cd_mode2 1115 #define sr_sector_mode ssr_sector_mode 1116 #define sr_eject ssr_eject 1117 #define sr_ejected ssr_ejected 1118 #define sr_check_wp ssr_check_wp 1119 #define sd_watch_request_submit ssd_watch_request_submit 1120 #define sd_check_media ssd_check_media 1121 #define sd_media_watch_cb ssd_media_watch_cb 1122 #define sd_delayed_cv_broadcast ssd_delayed_cv_broadcast 1123 #define sr_volume_ctrl ssr_volume_ctrl 1124 #define sr_read_sony_session_offset ssr_read_sony_session_offset 1125 #define sd_log_page_supported ssd_log_page_supported 1126 #define sd_check_for_writable_cd ssd_check_for_writable_cd 1127 #define sd_wm_cache_constructor ssd_wm_cache_constructor 1128 #define sd_wm_cache_destructor ssd_wm_cache_destructor 1129 #define sd_range_lock ssd_range_lock 1130 #define sd_get_range ssd_get_range 1131 #define sd_free_inlist_wmap ssd_free_inlist_wmap 1132 #define sd_range_unlock ssd_range_unlock 1133 #define sd_read_modify_write_task ssd_read_modify_write_task 1134 #define sddump_do_read_of_rmw ssddump_do_read_of_rmw 1135 1136 #define sd_iostart_chain ssd_iostart_chain 1137 #define sd_iodone_chain ssd_iodone_chain 1138 #define sd_initpkt_map ssd_initpkt_map 1139 #define sd_destroypkt_map ssd_destroypkt_map 1140 #define sd_chain_type_map ssd_chain_type_map 1141 #define sd_chain_index_map ssd_chain_index_map 1142 1143 #define sd_failfast_flushctl ssd_failfast_flushctl 1144 #define sd_failfast_flushq ssd_failfast_flushq 1145 #define sd_failfast_flushq_callback ssd_failfast_flushq_callback 1146 1147 #define sd_is_lsi ssd_is_lsi 1148 #define sd_tg_rdwr ssd_tg_rdwr 1149 #define sd_tg_getinfo ssd_tg_getinfo 1150 #define sd_rmw_msg_print_handler ssd_rmw_msg_print_handler 1151 1152 #endif /* #if (defined(__fibre)) */ 1153 1154 1155 int _init(void); 1156 int _fini(void); 1157 int _info(struct modinfo *modinfop); 1158 1159 /*PRINTFLIKE3*/ 1160 static void sd_log_trace(uint_t comp, struct sd_lun *un, const char *fmt, ...); 1161 /*PRINTFLIKE3*/ 1162 static void sd_log_info(uint_t comp, struct sd_lun *un, const char *fmt, ...); 1163 /*PRINTFLIKE3*/ 1164 static void sd_log_err(uint_t comp, struct sd_lun *un, const char *fmt, ...); 1165 1166 static int sdprobe(dev_info_t *devi); 1167 static int sdinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, 1168 void **result); 1169 static int sd_prop_op(dev_t dev, dev_info_t *dip, ddi_prop_op_t prop_op, 1170 int mod_flags, char *name, caddr_t valuep, int *lengthp); 1171 1172 /* 1173 * Smart probe for parallel scsi 1174 */ 1175 static void sd_scsi_probe_cache_init(void); 1176 static void sd_scsi_probe_cache_fini(void); 1177 static void sd_scsi_clear_probe_cache(void); 1178 static int sd_scsi_probe_with_cache(struct scsi_device *devp, int (*fn)()); 1179 1180 /* 1181 * Attached luns on target for parallel scsi 1182 */ 1183 static void sd_scsi_target_lun_init(void); 1184 static void sd_scsi_target_lun_fini(void); 1185 static int sd_scsi_get_target_lun_count(dev_info_t *dip, int target); 1186 static void sd_scsi_update_lun_on_target(dev_info_t *dip, int target, int flag); 1187 1188 static int sd_spin_up_unit(sd_ssc_t *ssc); 1189 1190 /* 1191 * Using sd_ssc_init to establish sd_ssc_t struct 1192 * Using sd_ssc_send to send uscsi internal command 1193 * Using sd_ssc_fini to free sd_ssc_t struct 1194 */ 1195 static sd_ssc_t *sd_ssc_init(struct sd_lun *un); 1196 static int sd_ssc_send(sd_ssc_t *ssc, struct uscsi_cmd *incmd, 1197 int flag, enum uio_seg dataspace, int path_flag); 1198 static void sd_ssc_fini(sd_ssc_t *ssc); 1199 1200 /* 1201 * Using sd_ssc_assessment to set correct type-of-assessment 1202 * Using sd_ssc_post to post ereport & system log 1203 * sd_ssc_post will call sd_ssc_print to print system log 1204 * sd_ssc_post will call sd_ssd_ereport_post to post ereport 1205 */ 1206 static void sd_ssc_assessment(sd_ssc_t *ssc, 1207 enum sd_type_assessment tp_assess); 1208 1209 static void sd_ssc_post(sd_ssc_t *ssc, enum sd_driver_assessment sd_assess); 1210 static void sd_ssc_print(sd_ssc_t *ssc, int sd_severity); 1211 static void sd_ssc_ereport_post(sd_ssc_t *ssc, 1212 enum sd_driver_assessment drv_assess); 1213 1214 /* 1215 * Using sd_ssc_set_info to mark an un-decodable-data error. 1216 * Using sd_ssc_extract_info to transfer information from internal 1217 * data structures to sd_ssc_t. 1218 */ 1219 static void sd_ssc_set_info(sd_ssc_t *ssc, int ssc_flags, uint_t comp, 1220 const char *fmt, ...); 1221 static void sd_ssc_extract_info(sd_ssc_t *ssc, struct sd_lun *un, 1222 struct scsi_pkt *pktp, struct buf *bp, struct sd_xbuf *xp); 1223 1224 static int sd_send_scsi_cmd(dev_t dev, struct uscsi_cmd *incmd, int flag, 1225 enum uio_seg dataspace, int path_flag); 1226 1227 #ifdef _LP64 1228 static void sd_enable_descr_sense(sd_ssc_t *ssc); 1229 static void sd_reenable_dsense_task(void *arg); 1230 #endif /* _LP64 */ 1231 1232 static void sd_set_mmc_caps(sd_ssc_t *ssc); 1233 1234 static void sd_read_unit_properties(struct sd_lun *un); 1235 static int sd_process_sdconf_file(struct sd_lun *un); 1236 static void sd_nvpair_str_decode(struct sd_lun *un, char *nvpair_str); 1237 static char *sd_strtok_r(char *string, const char *sepset, char **lasts); 1238 static void sd_set_properties(struct sd_lun *un, char *name, char *value); 1239 static void sd_get_tunables_from_conf(struct sd_lun *un, int flags, 1240 int *data_list, sd_tunables *values); 1241 static void sd_process_sdconf_table(struct sd_lun *un); 1242 static int sd_sdconf_id_match(struct sd_lun *un, char *id, int idlen); 1243 static int sd_blank_cmp(struct sd_lun *un, char *id, int idlen); 1244 static int sd_chk_vers1_data(struct sd_lun *un, int flags, int *prop_list, 1245 int list_len, char *dataname_ptr); 1246 static void sd_set_vers1_properties(struct sd_lun *un, int flags, 1247 sd_tunables *prop_list); 1248 1249 static void sd_register_devid(sd_ssc_t *ssc, dev_info_t *devi, 1250 int reservation_flag); 1251 static int sd_get_devid(sd_ssc_t *ssc); 1252 static ddi_devid_t sd_create_devid(sd_ssc_t *ssc); 1253 static int sd_write_deviceid(sd_ssc_t *ssc); 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_write_cache_changeable(sd_ssc_t *ssc, int *is_changeable); 1298 static void sd_get_nv_sup(sd_ssc_t *ssc); 1299 static dev_t sd_make_device(dev_info_t *devi); 1300 static void sd_check_bdc_vpd(sd_ssc_t *ssc); 1301 static void sd_check_emulation_mode(sd_ssc_t *ssc); 1302 static void sd_update_block_info(struct sd_lun *un, uint32_t lbasize, 1303 uint64_t capacity); 1304 1305 /* 1306 * Driver entry point functions. 1307 */ 1308 static int sdopen(dev_t *dev_p, int flag, int otyp, cred_t *cred_p); 1309 static int sdclose(dev_t dev, int flag, int otyp, cred_t *cred_p); 1310 static int sd_ready_and_valid(sd_ssc_t *ssc, int part); 1311 1312 static void sdmin(struct buf *bp); 1313 static int sdread(dev_t dev, struct uio *uio, cred_t *cred_p); 1314 static int sdwrite(dev_t dev, struct uio *uio, cred_t *cred_p); 1315 static int sdaread(dev_t dev, struct aio_req *aio, cred_t *cred_p); 1316 static int sdawrite(dev_t dev, struct aio_req *aio, cred_t *cred_p); 1317 1318 static int sdstrategy(struct buf *bp); 1319 static int sdioctl(dev_t, int, intptr_t, int, cred_t *, int *); 1320 1321 /* 1322 * Function prototypes for layering functions in the iostart chain. 1323 */ 1324 static void sd_mapblockaddr_iostart(int index, struct sd_lun *un, 1325 struct buf *bp); 1326 static void sd_mapblocksize_iostart(int index, struct sd_lun *un, 1327 struct buf *bp); 1328 static void sd_checksum_iostart(int index, struct sd_lun *un, struct buf *bp); 1329 static void sd_checksum_uscsi_iostart(int index, struct sd_lun *un, 1330 struct buf *bp); 1331 static void sd_pm_iostart(int index, struct sd_lun *un, struct buf *bp); 1332 static void sd_core_iostart(int index, struct sd_lun *un, struct buf *bp); 1333 1334 /* 1335 * Function prototypes for layering functions in the iodone chain. 1336 */ 1337 static void sd_buf_iodone(int index, struct sd_lun *un, struct buf *bp); 1338 static void sd_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp); 1339 static void sd_mapblockaddr_iodone(int index, struct sd_lun *un, 1340 struct buf *bp); 1341 static void sd_mapblocksize_iodone(int index, struct sd_lun *un, 1342 struct buf *bp); 1343 static void sd_checksum_iodone(int index, struct sd_lun *un, struct buf *bp); 1344 static void sd_checksum_uscsi_iodone(int index, struct sd_lun *un, 1345 struct buf *bp); 1346 static void sd_pm_iodone(int index, struct sd_lun *un, struct buf *bp); 1347 1348 /* 1349 * Prototypes for functions to support buf(9S) based IO. 1350 */ 1351 static void sd_xbuf_strategy(struct buf *bp, ddi_xbuf_t xp, void *arg); 1352 static int sd_initpkt_for_buf(struct buf *, struct scsi_pkt **); 1353 static void sd_destroypkt_for_buf(struct buf *); 1354 static int sd_setup_rw_pkt(struct sd_lun *un, struct scsi_pkt **pktpp, 1355 struct buf *bp, int flags, 1356 int (*callback)(caddr_t), caddr_t callback_arg, 1357 diskaddr_t lba, uint32_t blockcount); 1358 static int sd_setup_next_rw_pkt(struct sd_lun *un, struct scsi_pkt *pktp, 1359 struct buf *bp, diskaddr_t lba, uint32_t blockcount); 1360 1361 /* 1362 * Prototypes for functions to support USCSI IO. 1363 */ 1364 static int sd_uscsi_strategy(struct buf *bp); 1365 static int sd_initpkt_for_uscsi(struct buf *, struct scsi_pkt **); 1366 static void sd_destroypkt_for_uscsi(struct buf *); 1367 1368 static void sd_xbuf_init(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 1369 uchar_t chain_type, void *pktinfop); 1370 1371 static int sd_pm_entry(struct sd_lun *un); 1372 static void sd_pm_exit(struct sd_lun *un); 1373 1374 static void sd_pm_idletimeout_handler(void *arg); 1375 1376 /* 1377 * sd_core internal functions (used at the sd_core_io layer). 1378 */ 1379 static void sd_add_buf_to_waitq(struct sd_lun *un, struct buf *bp); 1380 static void sdintr(struct scsi_pkt *pktp); 1381 static void sd_start_cmds(struct sd_lun *un, struct buf *immed_bp); 1382 1383 static int sd_send_scsi_cmd(dev_t dev, struct uscsi_cmd *incmd, int flag, 1384 enum uio_seg dataspace, int path_flag); 1385 1386 static struct buf *sd_bioclone_alloc(struct buf *bp, size_t datalen, 1387 daddr_t blkno, int (*func)(struct buf *)); 1388 static struct buf *sd_shadow_buf_alloc(struct buf *bp, size_t datalen, 1389 uint_t bflags, daddr_t blkno, int (*func)(struct buf *)); 1390 static void sd_bioclone_free(struct buf *bp); 1391 static void sd_shadow_buf_free(struct buf *bp); 1392 1393 static void sd_print_transport_rejected_message(struct sd_lun *un, 1394 struct sd_xbuf *xp, int code); 1395 static void sd_print_incomplete_msg(struct sd_lun *un, struct buf *bp, 1396 void *arg, int code); 1397 static void sd_print_sense_failed_msg(struct sd_lun *un, struct buf *bp, 1398 void *arg, int code); 1399 static void sd_print_cmd_incomplete_msg(struct sd_lun *un, struct buf *bp, 1400 void *arg, int code); 1401 1402 static void sd_retry_command(struct sd_lun *un, struct buf *bp, 1403 int retry_check_flag, 1404 void (*user_funcp)(struct sd_lun *un, struct buf *bp, void *argp, 1405 int c), 1406 void *user_arg, int failure_code, clock_t retry_delay, 1407 void (*statp)(kstat_io_t *)); 1408 1409 static void sd_set_retry_bp(struct sd_lun *un, struct buf *bp, 1410 clock_t retry_delay, void (*statp)(kstat_io_t *)); 1411 1412 static void sd_send_request_sense_command(struct sd_lun *un, struct buf *bp, 1413 struct scsi_pkt *pktp); 1414 static void sd_start_retry_command(void *arg); 1415 static void sd_start_direct_priority_command(void *arg); 1416 static void sd_return_failed_command(struct sd_lun *un, struct buf *bp, 1417 int errcode); 1418 static void sd_return_failed_command_no_restart(struct sd_lun *un, 1419 struct buf *bp, int errcode); 1420 static void sd_return_command(struct sd_lun *un, struct buf *bp); 1421 static void sd_sync_with_callback(struct sd_lun *un); 1422 static int sdrunout(caddr_t arg); 1423 1424 static void sd_mark_rqs_busy(struct sd_lun *un, struct buf *bp); 1425 static struct buf *sd_mark_rqs_idle(struct sd_lun *un, struct sd_xbuf *xp); 1426 1427 static void sd_reduce_throttle(struct sd_lun *un, int throttle_type); 1428 static void sd_restore_throttle(void *arg); 1429 1430 static void sd_init_cdb_limits(struct sd_lun *un); 1431 1432 static void sd_pkt_status_good(struct sd_lun *un, struct buf *bp, 1433 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1434 1435 /* 1436 * Error handling functions 1437 */ 1438 static void sd_pkt_status_check_condition(struct sd_lun *un, struct buf *bp, 1439 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1440 static void sd_pkt_status_busy(struct sd_lun *un, struct buf *bp, 1441 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1442 static void sd_pkt_status_reservation_conflict(struct sd_lun *un, 1443 struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp); 1444 static void sd_pkt_status_qfull(struct sd_lun *un, struct buf *bp, 1445 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1446 1447 static void sd_handle_request_sense(struct sd_lun *un, struct buf *bp, 1448 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1449 static void sd_handle_auto_request_sense(struct sd_lun *un, struct buf *bp, 1450 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1451 static int sd_validate_sense_data(struct sd_lun *un, struct buf *bp, 1452 struct sd_xbuf *xp, size_t actual_len); 1453 static void sd_decode_sense(struct sd_lun *un, struct buf *bp, 1454 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1455 1456 static void sd_print_sense_msg(struct sd_lun *un, struct buf *bp, 1457 void *arg, int code); 1458 1459 static void sd_sense_key_no_sense(struct sd_lun *un, struct buf *bp, 1460 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1461 static void sd_sense_key_recoverable_error(struct sd_lun *un, 1462 uint8_t *sense_datap, 1463 struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp); 1464 static void sd_sense_key_not_ready(struct sd_lun *un, 1465 uint8_t *sense_datap, 1466 struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp); 1467 static void sd_sense_key_medium_or_hardware_error(struct sd_lun *un, 1468 uint8_t *sense_datap, 1469 struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp); 1470 static void sd_sense_key_illegal_request(struct sd_lun *un, struct buf *bp, 1471 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1472 static void sd_sense_key_unit_attention(struct sd_lun *un, 1473 uint8_t *sense_datap, 1474 struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp); 1475 static void sd_sense_key_fail_command(struct sd_lun *un, struct buf *bp, 1476 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1477 static void sd_sense_key_blank_check(struct sd_lun *un, struct buf *bp, 1478 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1479 static void sd_sense_key_aborted_command(struct sd_lun *un, struct buf *bp, 1480 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1481 static void sd_sense_key_default(struct sd_lun *un, 1482 uint8_t *sense_datap, 1483 struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp); 1484 1485 static void sd_print_retry_msg(struct sd_lun *un, struct buf *bp, 1486 void *arg, int flag); 1487 1488 static void sd_pkt_reason_cmd_incomplete(struct sd_lun *un, struct buf *bp, 1489 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1490 static void sd_pkt_reason_cmd_tran_err(struct sd_lun *un, struct buf *bp, 1491 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1492 static void sd_pkt_reason_cmd_reset(struct sd_lun *un, struct buf *bp, 1493 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1494 static void sd_pkt_reason_cmd_aborted(struct sd_lun *un, struct buf *bp, 1495 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1496 static void sd_pkt_reason_cmd_timeout(struct sd_lun *un, struct buf *bp, 1497 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1498 static void sd_pkt_reason_cmd_unx_bus_free(struct sd_lun *un, struct buf *bp, 1499 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1500 static void sd_pkt_reason_cmd_tag_reject(struct sd_lun *un, struct buf *bp, 1501 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1502 static void sd_pkt_reason_default(struct sd_lun *un, struct buf *bp, 1503 struct sd_xbuf *xp, struct scsi_pkt *pktp); 1504 1505 static void sd_reset_target(struct sd_lun *un, struct scsi_pkt *pktp); 1506 1507 static void sd_start_stop_unit_callback(void *arg); 1508 static void sd_start_stop_unit_task(void *arg); 1509 1510 static void sd_taskq_create(void); 1511 static void sd_taskq_delete(void); 1512 static void sd_target_change_task(void *arg); 1513 static void sd_log_dev_status_event(struct sd_lun *un, char *esc, int km_flag); 1514 static void sd_log_lun_expansion_event(struct sd_lun *un, int km_flag); 1515 static void sd_log_eject_request_event(struct sd_lun *un, int km_flag); 1516 static void sd_media_change_task(void *arg); 1517 1518 static int sd_handle_mchange(struct sd_lun *un); 1519 static int sd_send_scsi_DOORLOCK(sd_ssc_t *ssc, int flag, int path_flag); 1520 static int sd_send_scsi_READ_CAPACITY(sd_ssc_t *ssc, uint64_t *capp, 1521 uint32_t *lbap, int path_flag); 1522 static int sd_send_scsi_READ_CAPACITY_16(sd_ssc_t *ssc, uint64_t *capp, 1523 uint32_t *lbap, uint32_t *psp, int path_flag); 1524 static int sd_send_scsi_START_STOP_UNIT(sd_ssc_t *ssc, int pc_flag, 1525 int flag, int path_flag); 1526 static int sd_send_scsi_INQUIRY(sd_ssc_t *ssc, uchar_t *bufaddr, 1527 size_t buflen, uchar_t evpd, uchar_t page_code, size_t *residp); 1528 static int sd_send_scsi_TEST_UNIT_READY(sd_ssc_t *ssc, int flag); 1529 static int sd_send_scsi_PERSISTENT_RESERVE_IN(sd_ssc_t *ssc, 1530 uchar_t usr_cmd, uint16_t data_len, uchar_t *data_bufp); 1531 static int sd_send_scsi_PERSISTENT_RESERVE_OUT(sd_ssc_t *ssc, 1532 uchar_t usr_cmd, uchar_t *usr_bufp); 1533 static int sd_send_scsi_SYNCHRONIZE_CACHE(struct sd_lun *un, 1534 struct dk_callback *dkc); 1535 static int sd_send_scsi_SYNCHRONIZE_CACHE_biodone(struct buf *bp); 1536 static int sd_send_scsi_GET_CONFIGURATION(sd_ssc_t *ssc, 1537 struct uscsi_cmd *ucmdbuf, uchar_t *rqbuf, uint_t rqbuflen, 1538 uchar_t *bufaddr, uint_t buflen, int path_flag); 1539 static int sd_send_scsi_feature_GET_CONFIGURATION(sd_ssc_t *ssc, 1540 struct uscsi_cmd *ucmdbuf, uchar_t *rqbuf, uint_t rqbuflen, 1541 uchar_t *bufaddr, uint_t buflen, char feature, int path_flag); 1542 static int sd_send_scsi_MODE_SENSE(sd_ssc_t *ssc, int cdbsize, 1543 uchar_t *bufaddr, size_t buflen, uchar_t page_code, int path_flag); 1544 static int sd_send_scsi_MODE_SELECT(sd_ssc_t *ssc, int cdbsize, 1545 uchar_t *bufaddr, size_t buflen, uchar_t save_page, int path_flag); 1546 static int sd_send_scsi_RDWR(sd_ssc_t *ssc, uchar_t cmd, void *bufaddr, 1547 size_t buflen, daddr_t start_block, int path_flag); 1548 #define sd_send_scsi_READ(ssc, bufaddr, buflen, start_block, path_flag) \ 1549 sd_send_scsi_RDWR(ssc, SCMD_READ, bufaddr, buflen, start_block, \ 1550 path_flag) 1551 #define sd_send_scsi_WRITE(ssc, bufaddr, buflen, start_block, path_flag)\ 1552 sd_send_scsi_RDWR(ssc, SCMD_WRITE, bufaddr, buflen, start_block,\ 1553 path_flag) 1554 1555 static int sd_send_scsi_LOG_SENSE(sd_ssc_t *ssc, uchar_t *bufaddr, 1556 uint16_t buflen, uchar_t page_code, uchar_t page_control, 1557 uint16_t param_ptr, int path_flag); 1558 static int sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION(sd_ssc_t *ssc, 1559 uchar_t *bufaddr, size_t buflen, uchar_t class_req); 1560 static boolean_t sd_gesn_media_data_valid(uchar_t *data); 1561 1562 static int sd_alloc_rqs(struct scsi_device *devp, struct sd_lun *un); 1563 static void sd_free_rqs(struct sd_lun *un); 1564 1565 static void sd_dump_memory(struct sd_lun *un, uint_t comp, char *title, 1566 uchar_t *data, int len, int fmt); 1567 static void sd_panic_for_res_conflict(struct sd_lun *un); 1568 1569 /* 1570 * Disk Ioctl Function Prototypes 1571 */ 1572 static int sd_get_media_info(dev_t dev, caddr_t arg, int flag); 1573 static int sd_get_media_info_ext(dev_t dev, caddr_t arg, int flag); 1574 static int sd_dkio_ctrl_info(dev_t dev, caddr_t arg, int flag); 1575 static int sd_dkio_get_temp(dev_t dev, caddr_t arg, int flag); 1576 1577 /* 1578 * Multi-host Ioctl Prototypes 1579 */ 1580 static int sd_check_mhd(dev_t dev, int interval); 1581 static int sd_mhd_watch_cb(caddr_t arg, struct scsi_watch_result *resultp); 1582 static void sd_mhd_watch_incomplete(struct sd_lun *un, struct scsi_pkt *pkt); 1583 static char *sd_sname(uchar_t status); 1584 static void sd_mhd_resvd_recover(void *arg); 1585 static void sd_resv_reclaim_thread(); 1586 static int sd_take_ownership(dev_t dev, struct mhioctkown *p); 1587 static int sd_reserve_release(dev_t dev, int cmd); 1588 static void sd_rmv_resv_reclaim_req(dev_t dev); 1589 static void sd_mhd_reset_notify_cb(caddr_t arg); 1590 static int sd_persistent_reservation_in_read_keys(struct sd_lun *un, 1591 mhioc_inkeys_t *usrp, int flag); 1592 static int sd_persistent_reservation_in_read_resv(struct sd_lun *un, 1593 mhioc_inresvs_t *usrp, int flag); 1594 static int sd_mhdioc_takeown(dev_t dev, caddr_t arg, int flag); 1595 static int sd_mhdioc_failfast(dev_t dev, caddr_t arg, int flag); 1596 static int sd_mhdioc_release(dev_t dev); 1597 static int sd_mhdioc_register_devid(dev_t dev); 1598 static int sd_mhdioc_inkeys(dev_t dev, caddr_t arg, int flag); 1599 static int sd_mhdioc_inresv(dev_t dev, caddr_t arg, int flag); 1600 1601 /* 1602 * SCSI removable prototypes 1603 */ 1604 static int sr_change_blkmode(dev_t dev, int cmd, intptr_t data, int flag); 1605 static int sr_change_speed(dev_t dev, int cmd, intptr_t data, int flag); 1606 static int sr_atapi_change_speed(dev_t dev, int cmd, intptr_t data, int flag); 1607 static int sr_pause_resume(dev_t dev, int mode); 1608 static int sr_play_msf(dev_t dev, caddr_t data, int flag); 1609 static int sr_play_trkind(dev_t dev, caddr_t data, int flag); 1610 static int sr_read_all_subcodes(dev_t dev, caddr_t data, int flag); 1611 static int sr_read_subchannel(dev_t dev, caddr_t data, int flag); 1612 static int sr_read_tocentry(dev_t dev, caddr_t data, int flag); 1613 static int sr_read_tochdr(dev_t dev, caddr_t data, int flag); 1614 static int sr_read_cdda(dev_t dev, caddr_t data, int flag); 1615 static int sr_read_cdxa(dev_t dev, caddr_t data, int flag); 1616 static int sr_read_mode1(dev_t dev, caddr_t data, int flag); 1617 static int sr_read_mode2(dev_t dev, caddr_t data, int flag); 1618 static int sr_read_cd_mode2(dev_t dev, caddr_t data, int flag); 1619 static int sr_sector_mode(dev_t dev, uint32_t blksize); 1620 static int sr_eject(dev_t dev); 1621 static void sr_ejected(register struct sd_lun *un); 1622 static int sr_check_wp(dev_t dev); 1623 static opaque_t sd_watch_request_submit(struct sd_lun *un); 1624 static int sd_check_media(dev_t dev, enum dkio_state state); 1625 static int sd_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp); 1626 static void sd_delayed_cv_broadcast(void *arg); 1627 static int sr_volume_ctrl(dev_t dev, caddr_t data, int flag); 1628 static int sr_read_sony_session_offset(dev_t dev, caddr_t data, int flag); 1629 1630 static int sd_log_page_supported(sd_ssc_t *ssc, int log_page); 1631 1632 /* 1633 * Function Prototype for the non-512 support (DVDRAM, MO etc.) functions. 1634 */ 1635 static void sd_check_for_writable_cd(sd_ssc_t *ssc, int path_flag); 1636 static int sd_wm_cache_constructor(void *wm, void *un, int flags); 1637 static void sd_wm_cache_destructor(void *wm, void *un); 1638 static struct sd_w_map *sd_range_lock(struct sd_lun *un, daddr_t startb, 1639 daddr_t endb, ushort_t typ); 1640 static struct sd_w_map *sd_get_range(struct sd_lun *un, daddr_t startb, 1641 daddr_t endb); 1642 static void sd_free_inlist_wmap(struct sd_lun *un, struct sd_w_map *wmp); 1643 static void sd_range_unlock(struct sd_lun *un, struct sd_w_map *wm); 1644 static void sd_read_modify_write_task(void * arg); 1645 static int 1646 sddump_do_read_of_rmw(struct sd_lun *un, uint64_t blkno, uint64_t nblk, 1647 struct buf **bpp); 1648 1649 1650 /* 1651 * Function prototypes for failfast support. 1652 */ 1653 static void sd_failfast_flushq(struct sd_lun *un); 1654 static int sd_failfast_flushq_callback(struct buf *bp); 1655 1656 /* 1657 * Function prototypes to check for lsi devices 1658 */ 1659 static void sd_is_lsi(struct sd_lun *un); 1660 1661 /* 1662 * Function prototypes for partial DMA support 1663 */ 1664 static int sd_setup_next_xfer(struct sd_lun *un, struct buf *bp, 1665 struct scsi_pkt *pkt, struct sd_xbuf *xp); 1666 1667 1668 /* Function prototypes for cmlb */ 1669 static int sd_tg_rdwr(dev_info_t *devi, uchar_t cmd, void *bufaddr, 1670 diskaddr_t start_block, size_t reqlength, void *tg_cookie); 1671 1672 static int sd_tg_getinfo(dev_info_t *devi, int cmd, void *arg, void *tg_cookie); 1673 1674 /* 1675 * For printing RMW warning message timely 1676 */ 1677 static void sd_rmw_msg_print_handler(void *arg); 1678 1679 /* 1680 * Constants for failfast support: 1681 * 1682 * SD_FAILFAST_INACTIVE: Instance is currently in a normal state, with NO 1683 * failfast processing being performed. 1684 * 1685 * SD_FAILFAST_ACTIVE: Instance is in the failfast state and is performing 1686 * failfast processing on all bufs with B_FAILFAST set. 1687 */ 1688 1689 #define SD_FAILFAST_INACTIVE 0 1690 #define SD_FAILFAST_ACTIVE 1 1691 1692 /* 1693 * Bitmask to control behavior of buf(9S) flushes when a transition to 1694 * the failfast state occurs. Optional bits include: 1695 * 1696 * SD_FAILFAST_FLUSH_ALL_BUFS: When set, flush ALL bufs including those that 1697 * do NOT have B_FAILFAST set. When clear, only bufs with B_FAILFAST will 1698 * be flushed. 1699 * 1700 * SD_FAILFAST_FLUSH_ALL_QUEUES: When set, flush any/all other queues in the 1701 * driver, in addition to the regular wait queue. This includes the xbuf 1702 * queues. When clear, only the driver's wait queue will be flushed. 1703 */ 1704 #define SD_FAILFAST_FLUSH_ALL_BUFS 0x01 1705 #define SD_FAILFAST_FLUSH_ALL_QUEUES 0x02 1706 1707 /* 1708 * The default behavior is to only flush bufs that have B_FAILFAST set, but 1709 * to flush all queues within the driver. 1710 */ 1711 static int sd_failfast_flushctl = SD_FAILFAST_FLUSH_ALL_QUEUES; 1712 1713 1714 /* 1715 * SD Testing Fault Injection 1716 */ 1717 #ifdef SD_FAULT_INJECTION 1718 static void sd_faultinjection_ioctl(int cmd, intptr_t arg, struct sd_lun *un); 1719 static void sd_faultinjection(struct scsi_pkt *pktp); 1720 static void sd_injection_log(char *buf, struct sd_lun *un); 1721 #endif 1722 1723 /* 1724 * Device driver ops vector 1725 */ 1726 static struct cb_ops sd_cb_ops = { 1727 sdopen, /* open */ 1728 sdclose, /* close */ 1729 sdstrategy, /* strategy */ 1730 nodev, /* print */ 1731 sddump, /* dump */ 1732 sdread, /* read */ 1733 sdwrite, /* write */ 1734 sdioctl, /* ioctl */ 1735 nodev, /* devmap */ 1736 nodev, /* mmap */ 1737 nodev, /* segmap */ 1738 nochpoll, /* poll */ 1739 sd_prop_op, /* cb_prop_op */ 1740 0, /* streamtab */ 1741 D_64BIT | D_MP | D_NEW | D_HOTPLUG, /* Driver compatibility flags */ 1742 CB_REV, /* cb_rev */ 1743 sdaread, /* async I/O read entry point */ 1744 sdawrite /* async I/O write entry point */ 1745 }; 1746 1747 struct dev_ops sd_ops = { 1748 DEVO_REV, /* devo_rev, */ 1749 0, /* refcnt */ 1750 sdinfo, /* info */ 1751 nulldev, /* identify */ 1752 sdprobe, /* probe */ 1753 sdattach, /* attach */ 1754 sddetach, /* detach */ 1755 nodev, /* reset */ 1756 &sd_cb_ops, /* driver operations */ 1757 NULL, /* bus operations */ 1758 sdpower, /* power */ 1759 ddi_quiesce_not_needed, /* quiesce */ 1760 }; 1761 1762 /* 1763 * This is the loadable module wrapper. 1764 */ 1765 #include <sys/modctl.h> 1766 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 static cmlb_tg_ops_t sd_tgops = { 1778 TG_DK_OPS_VERSION_1, 1779 sd_tg_rdwr, 1780 sd_tg_getinfo 1781 }; 1782 1783 static struct scsi_asq_key_strings sd_additional_codes[] = { 1784 0x81, 0, "Logical Unit is Reserved", 1785 0x85, 0, "Audio Address Not Valid", 1786 0xb6, 0, "Media Load Mechanism Failed", 1787 0xB9, 0, "Audio Play Operation Aborted", 1788 0xbf, 0, "Buffer Overflow for Read All Subcodes Command", 1789 0x53, 2, "Medium removal prevented", 1790 0x6f, 0, "Authentication failed during key exchange", 1791 0x6f, 1, "Key not present", 1792 0x6f, 2, "Key not established", 1793 0x6f, 3, "Read without proper authentication", 1794 0x6f, 4, "Mismatched region to this logical unit", 1795 0x6f, 5, "Region reset count error", 1796 0xffff, 0x0, NULL 1797 }; 1798 1799 1800 /* 1801 * Struct for passing printing information for sense data messages 1802 */ 1803 struct sd_sense_info { 1804 int ssi_severity; 1805 int ssi_pfa_flag; 1806 }; 1807 1808 /* 1809 * Table of function pointers for iostart-side routines. Separate "chains" 1810 * of layered function calls are formed by placing the function pointers 1811 * sequentially in the desired order. Functions are called according to an 1812 * incrementing table index ordering. The last function in each chain must 1813 * be sd_core_iostart(). The corresponding iodone-side routines are expected 1814 * in the sd_iodone_chain[] array. 1815 * 1816 * Note: It may seem more natural to organize both the iostart and iodone 1817 * functions together, into an array of structures (or some similar 1818 * organization) with a common index, rather than two separate arrays which 1819 * must be maintained in synchronization. The purpose of this division is 1820 * to achieve improved performance: individual arrays allows for more 1821 * effective cache line utilization on certain platforms. 1822 */ 1823 1824 typedef void (*sd_chain_t)(int index, struct sd_lun *un, struct buf *bp); 1825 1826 1827 static sd_chain_t sd_iostart_chain[] = { 1828 1829 /* Chain for buf IO for disk drive targets (PM enabled) */ 1830 sd_mapblockaddr_iostart, /* Index: 0 */ 1831 sd_pm_iostart, /* Index: 1 */ 1832 sd_core_iostart, /* Index: 2 */ 1833 1834 /* Chain for buf IO for disk drive targets (PM disabled) */ 1835 sd_mapblockaddr_iostart, /* Index: 3 */ 1836 sd_core_iostart, /* Index: 4 */ 1837 1838 /* 1839 * Chain for buf IO for removable-media or large sector size 1840 * disk drive targets with RMW needed (PM enabled) 1841 */ 1842 sd_mapblockaddr_iostart, /* Index: 5 */ 1843 sd_mapblocksize_iostart, /* Index: 6 */ 1844 sd_pm_iostart, /* Index: 7 */ 1845 sd_core_iostart, /* Index: 8 */ 1846 1847 /* 1848 * Chain for buf IO for removable-media or large sector size 1849 * disk drive targets with RMW needed (PM disabled) 1850 */ 1851 sd_mapblockaddr_iostart, /* Index: 9 */ 1852 sd_mapblocksize_iostart, /* Index: 10 */ 1853 sd_core_iostart, /* Index: 11 */ 1854 1855 /* Chain for buf IO for disk drives with checksumming (PM enabled) */ 1856 sd_mapblockaddr_iostart, /* Index: 12 */ 1857 sd_checksum_iostart, /* Index: 13 */ 1858 sd_pm_iostart, /* Index: 14 */ 1859 sd_core_iostart, /* Index: 15 */ 1860 1861 /* Chain for buf IO for disk drives with checksumming (PM disabled) */ 1862 sd_mapblockaddr_iostart, /* Index: 16 */ 1863 sd_checksum_iostart, /* Index: 17 */ 1864 sd_core_iostart, /* Index: 18 */ 1865 1866 /* Chain for USCSI commands (all targets) */ 1867 sd_pm_iostart, /* Index: 19 */ 1868 sd_core_iostart, /* Index: 20 */ 1869 1870 /* Chain for checksumming USCSI commands (all targets) */ 1871 sd_checksum_uscsi_iostart, /* Index: 21 */ 1872 sd_pm_iostart, /* Index: 22 */ 1873 sd_core_iostart, /* Index: 23 */ 1874 1875 /* Chain for "direct" USCSI commands (all targets) */ 1876 sd_core_iostart, /* Index: 24 */ 1877 1878 /* Chain for "direct priority" USCSI commands (all targets) */ 1879 sd_core_iostart, /* Index: 25 */ 1880 1881 /* 1882 * Chain for buf IO for large sector size disk drive targets 1883 * with RMW needed with checksumming (PM enabled) 1884 */ 1885 sd_mapblockaddr_iostart, /* Index: 26 */ 1886 sd_mapblocksize_iostart, /* Index: 27 */ 1887 sd_checksum_iostart, /* Index: 28 */ 1888 sd_pm_iostart, /* Index: 29 */ 1889 sd_core_iostart, /* Index: 30 */ 1890 1891 /* 1892 * Chain for buf IO for large sector size disk drive targets 1893 * with RMW needed with checksumming (PM disabled) 1894 */ 1895 sd_mapblockaddr_iostart, /* Index: 31 */ 1896 sd_mapblocksize_iostart, /* Index: 32 */ 1897 sd_checksum_iostart, /* Index: 33 */ 1898 sd_core_iostart, /* Index: 34 */ 1899 1900 }; 1901 1902 /* 1903 * Macros to locate the first function of each iostart chain in the 1904 * sd_iostart_chain[] array. These are located by the index in the array. 1905 */ 1906 #define SD_CHAIN_DISK_IOSTART 0 1907 #define SD_CHAIN_DISK_IOSTART_NO_PM 3 1908 #define SD_CHAIN_MSS_DISK_IOSTART 5 1909 #define SD_CHAIN_RMMEDIA_IOSTART 5 1910 #define SD_CHAIN_MSS_DISK_IOSTART_NO_PM 9 1911 #define SD_CHAIN_RMMEDIA_IOSTART_NO_PM 9 1912 #define SD_CHAIN_CHKSUM_IOSTART 12 1913 #define SD_CHAIN_CHKSUM_IOSTART_NO_PM 16 1914 #define SD_CHAIN_USCSI_CMD_IOSTART 19 1915 #define SD_CHAIN_USCSI_CHKSUM_IOSTART 21 1916 #define SD_CHAIN_DIRECT_CMD_IOSTART 24 1917 #define SD_CHAIN_PRIORITY_CMD_IOSTART 25 1918 #define SD_CHAIN_MSS_CHKSUM_IOSTART 26 1919 #define SD_CHAIN_MSS_CHKSUM_IOSTART_NO_PM 31 1920 1921 1922 /* 1923 * Table of function pointers for the iodone-side routines for the driver- 1924 * internal layering mechanism. The calling sequence for iodone routines 1925 * uses a decrementing table index, so the last routine called in a chain 1926 * must be at the lowest array index location for that chain. The last 1927 * routine for each chain must be either sd_buf_iodone() (for buf(9S) IOs) 1928 * or sd_uscsi_iodone() (for uscsi IOs). Other than this, the ordering 1929 * of the functions in an iodone side chain must correspond to the ordering 1930 * of the iostart routines for that chain. Note that there is no iodone 1931 * side routine that corresponds to sd_core_iostart(), so there is no 1932 * entry in the table for this. 1933 */ 1934 1935 static sd_chain_t sd_iodone_chain[] = { 1936 1937 /* Chain for buf IO for disk drive targets (PM enabled) */ 1938 sd_buf_iodone, /* Index: 0 */ 1939 sd_mapblockaddr_iodone, /* Index: 1 */ 1940 sd_pm_iodone, /* Index: 2 */ 1941 1942 /* Chain for buf IO for disk drive targets (PM disabled) */ 1943 sd_buf_iodone, /* Index: 3 */ 1944 sd_mapblockaddr_iodone, /* Index: 4 */ 1945 1946 /* 1947 * Chain for buf IO for removable-media or large sector size 1948 * disk drive targets with RMW needed (PM enabled) 1949 */ 1950 sd_buf_iodone, /* Index: 5 */ 1951 sd_mapblockaddr_iodone, /* Index: 6 */ 1952 sd_mapblocksize_iodone, /* Index: 7 */ 1953 sd_pm_iodone, /* Index: 8 */ 1954 1955 /* 1956 * Chain for buf IO for removable-media or large sector size 1957 * disk drive targets with RMW needed (PM disabled) 1958 */ 1959 sd_buf_iodone, /* Index: 9 */ 1960 sd_mapblockaddr_iodone, /* Index: 10 */ 1961 sd_mapblocksize_iodone, /* Index: 11 */ 1962 1963 /* Chain for buf IO for disk drives with checksumming (PM enabled) */ 1964 sd_buf_iodone, /* Index: 12 */ 1965 sd_mapblockaddr_iodone, /* Index: 13 */ 1966 sd_checksum_iodone, /* Index: 14 */ 1967 sd_pm_iodone, /* Index: 15 */ 1968 1969 /* Chain for buf IO for disk drives with checksumming (PM disabled) */ 1970 sd_buf_iodone, /* Index: 16 */ 1971 sd_mapblockaddr_iodone, /* Index: 17 */ 1972 sd_checksum_iodone, /* Index: 18 */ 1973 1974 /* Chain for USCSI commands (non-checksum targets) */ 1975 sd_uscsi_iodone, /* Index: 19 */ 1976 sd_pm_iodone, /* Index: 20 */ 1977 1978 /* Chain for USCSI commands (checksum targets) */ 1979 sd_uscsi_iodone, /* Index: 21 */ 1980 sd_checksum_uscsi_iodone, /* Index: 22 */ 1981 sd_pm_iodone, /* Index: 22 */ 1982 1983 /* Chain for "direct" USCSI commands (all targets) */ 1984 sd_uscsi_iodone, /* Index: 24 */ 1985 1986 /* Chain for "direct priority" USCSI commands (all targets) */ 1987 sd_uscsi_iodone, /* Index: 25 */ 1988 1989 /* 1990 * Chain for buf IO for large sector size disk drive targets 1991 * with checksumming (PM enabled) 1992 */ 1993 sd_buf_iodone, /* Index: 26 */ 1994 sd_mapblockaddr_iodone, /* Index: 27 */ 1995 sd_mapblocksize_iodone, /* Index: 28 */ 1996 sd_checksum_iodone, /* Index: 29 */ 1997 sd_pm_iodone, /* Index: 30 */ 1998 1999 /* 2000 * Chain for buf IO for large sector size disk drive targets 2001 * with checksumming (PM disabled) 2002 */ 2003 sd_buf_iodone, /* Index: 31 */ 2004 sd_mapblockaddr_iodone, /* Index: 32 */ 2005 sd_mapblocksize_iodone, /* Index: 33 */ 2006 sd_checksum_iodone, /* Index: 34 */ 2007 }; 2008 2009 2010 /* 2011 * Macros to locate the "first" function in the sd_iodone_chain[] array for 2012 * each iodone-side chain. These are located by the array index, but as the 2013 * iodone side functions are called in a decrementing-index order, the 2014 * highest index number in each chain must be specified (as these correspond 2015 * to the first function in the iodone chain that will be called by the core 2016 * at IO completion time). 2017 */ 2018 2019 #define SD_CHAIN_DISK_IODONE 2 2020 #define SD_CHAIN_DISK_IODONE_NO_PM 4 2021 #define SD_CHAIN_RMMEDIA_IODONE 8 2022 #define SD_CHAIN_MSS_DISK_IODONE 8 2023 #define SD_CHAIN_RMMEDIA_IODONE_NO_PM 11 2024 #define SD_CHAIN_MSS_DISK_IODONE_NO_PM 11 2025 #define SD_CHAIN_CHKSUM_IODONE 15 2026 #define SD_CHAIN_CHKSUM_IODONE_NO_PM 18 2027 #define SD_CHAIN_USCSI_CMD_IODONE 20 2028 #define SD_CHAIN_USCSI_CHKSUM_IODONE 22 2029 #define SD_CHAIN_DIRECT_CMD_IODONE 24 2030 #define SD_CHAIN_PRIORITY_CMD_IODONE 25 2031 #define SD_CHAIN_MSS_CHKSUM_IODONE 30 2032 #define SD_CHAIN_MSS_CHKSUM_IODONE_NO_PM 34 2033 2034 2035 2036 /* 2037 * Array to map a layering chain index to the appropriate initpkt routine. 2038 * The redundant entries are present so that the index used for accessing 2039 * the above sd_iostart_chain and sd_iodone_chain tables can be used directly 2040 * with this table as well. 2041 */ 2042 typedef int (*sd_initpkt_t)(struct buf *, struct scsi_pkt **); 2043 2044 static sd_initpkt_t sd_initpkt_map[] = { 2045 2046 /* Chain for buf IO for disk drive targets (PM enabled) */ 2047 sd_initpkt_for_buf, /* Index: 0 */ 2048 sd_initpkt_for_buf, /* Index: 1 */ 2049 sd_initpkt_for_buf, /* Index: 2 */ 2050 2051 /* Chain for buf IO for disk drive targets (PM disabled) */ 2052 sd_initpkt_for_buf, /* Index: 3 */ 2053 sd_initpkt_for_buf, /* Index: 4 */ 2054 2055 /* 2056 * Chain for buf IO for removable-media or large sector size 2057 * disk drive targets (PM enabled) 2058 */ 2059 sd_initpkt_for_buf, /* Index: 5 */ 2060 sd_initpkt_for_buf, /* Index: 6 */ 2061 sd_initpkt_for_buf, /* Index: 7 */ 2062 sd_initpkt_for_buf, /* Index: 8 */ 2063 2064 /* 2065 * Chain for buf IO for removable-media or large sector size 2066 * disk drive targets (PM disabled) 2067 */ 2068 sd_initpkt_for_buf, /* Index: 9 */ 2069 sd_initpkt_for_buf, /* Index: 10 */ 2070 sd_initpkt_for_buf, /* Index: 11 */ 2071 2072 /* Chain for buf IO for disk drives with checksumming (PM enabled) */ 2073 sd_initpkt_for_buf, /* Index: 12 */ 2074 sd_initpkt_for_buf, /* Index: 13 */ 2075 sd_initpkt_for_buf, /* Index: 14 */ 2076 sd_initpkt_for_buf, /* Index: 15 */ 2077 2078 /* Chain for buf IO for disk drives with checksumming (PM disabled) */ 2079 sd_initpkt_for_buf, /* Index: 16 */ 2080 sd_initpkt_for_buf, /* Index: 17 */ 2081 sd_initpkt_for_buf, /* Index: 18 */ 2082 2083 /* Chain for USCSI commands (non-checksum targets) */ 2084 sd_initpkt_for_uscsi, /* Index: 19 */ 2085 sd_initpkt_for_uscsi, /* Index: 20 */ 2086 2087 /* Chain for USCSI commands (checksum targets) */ 2088 sd_initpkt_for_uscsi, /* Index: 21 */ 2089 sd_initpkt_for_uscsi, /* Index: 22 */ 2090 sd_initpkt_for_uscsi, /* Index: 22 */ 2091 2092 /* Chain for "direct" USCSI commands (all targets) */ 2093 sd_initpkt_for_uscsi, /* Index: 24 */ 2094 2095 /* Chain for "direct priority" USCSI commands (all targets) */ 2096 sd_initpkt_for_uscsi, /* Index: 25 */ 2097 2098 /* 2099 * Chain for buf IO for large sector size disk drive targets 2100 * with checksumming (PM enabled) 2101 */ 2102 sd_initpkt_for_buf, /* Index: 26 */ 2103 sd_initpkt_for_buf, /* Index: 27 */ 2104 sd_initpkt_for_buf, /* Index: 28 */ 2105 sd_initpkt_for_buf, /* Index: 29 */ 2106 sd_initpkt_for_buf, /* Index: 30 */ 2107 2108 /* 2109 * Chain for buf IO for large sector size disk drive targets 2110 * with checksumming (PM disabled) 2111 */ 2112 sd_initpkt_for_buf, /* Index: 31 */ 2113 sd_initpkt_for_buf, /* Index: 32 */ 2114 sd_initpkt_for_buf, /* Index: 33 */ 2115 sd_initpkt_for_buf, /* Index: 34 */ 2116 }; 2117 2118 2119 /* 2120 * Array to map a layering chain index to the appropriate destroypktpkt routine. 2121 * The redundant entries are present so that the index used for accessing 2122 * the above sd_iostart_chain and sd_iodone_chain tables can be used directly 2123 * with this table as well. 2124 */ 2125 typedef void (*sd_destroypkt_t)(struct buf *); 2126 2127 static sd_destroypkt_t sd_destroypkt_map[] = { 2128 2129 /* Chain for buf IO for disk drive targets (PM enabled) */ 2130 sd_destroypkt_for_buf, /* Index: 0 */ 2131 sd_destroypkt_for_buf, /* Index: 1 */ 2132 sd_destroypkt_for_buf, /* Index: 2 */ 2133 2134 /* Chain for buf IO for disk drive targets (PM disabled) */ 2135 sd_destroypkt_for_buf, /* Index: 3 */ 2136 sd_destroypkt_for_buf, /* Index: 4 */ 2137 2138 /* 2139 * Chain for buf IO for removable-media or large sector size 2140 * disk drive targets (PM enabled) 2141 */ 2142 sd_destroypkt_for_buf, /* Index: 5 */ 2143 sd_destroypkt_for_buf, /* Index: 6 */ 2144 sd_destroypkt_for_buf, /* Index: 7 */ 2145 sd_destroypkt_for_buf, /* Index: 8 */ 2146 2147 /* 2148 * Chain for buf IO for removable-media or large sector size 2149 * disk drive targets (PM disabled) 2150 */ 2151 sd_destroypkt_for_buf, /* Index: 9 */ 2152 sd_destroypkt_for_buf, /* Index: 10 */ 2153 sd_destroypkt_for_buf, /* Index: 11 */ 2154 2155 /* Chain for buf IO for disk drives with checksumming (PM enabled) */ 2156 sd_destroypkt_for_buf, /* Index: 12 */ 2157 sd_destroypkt_for_buf, /* Index: 13 */ 2158 sd_destroypkt_for_buf, /* Index: 14 */ 2159 sd_destroypkt_for_buf, /* Index: 15 */ 2160 2161 /* Chain for buf IO for disk drives with checksumming (PM disabled) */ 2162 sd_destroypkt_for_buf, /* Index: 16 */ 2163 sd_destroypkt_for_buf, /* Index: 17 */ 2164 sd_destroypkt_for_buf, /* Index: 18 */ 2165 2166 /* Chain for USCSI commands (non-checksum targets) */ 2167 sd_destroypkt_for_uscsi, /* Index: 19 */ 2168 sd_destroypkt_for_uscsi, /* Index: 20 */ 2169 2170 /* Chain for USCSI commands (checksum targets) */ 2171 sd_destroypkt_for_uscsi, /* Index: 21 */ 2172 sd_destroypkt_for_uscsi, /* Index: 22 */ 2173 sd_destroypkt_for_uscsi, /* Index: 22 */ 2174 2175 /* Chain for "direct" USCSI commands (all targets) */ 2176 sd_destroypkt_for_uscsi, /* Index: 24 */ 2177 2178 /* Chain for "direct priority" USCSI commands (all targets) */ 2179 sd_destroypkt_for_uscsi, /* Index: 25 */ 2180 2181 /* 2182 * Chain for buf IO for large sector size disk drive targets 2183 * with checksumming (PM disabled) 2184 */ 2185 sd_destroypkt_for_buf, /* Index: 26 */ 2186 sd_destroypkt_for_buf, /* Index: 27 */ 2187 sd_destroypkt_for_buf, /* Index: 28 */ 2188 sd_destroypkt_for_buf, /* Index: 29 */ 2189 sd_destroypkt_for_buf, /* Index: 30 */ 2190 2191 /* 2192 * Chain for buf IO for large sector size disk drive targets 2193 * with checksumming (PM enabled) 2194 */ 2195 sd_destroypkt_for_buf, /* Index: 31 */ 2196 sd_destroypkt_for_buf, /* Index: 32 */ 2197 sd_destroypkt_for_buf, /* Index: 33 */ 2198 sd_destroypkt_for_buf, /* Index: 34 */ 2199 }; 2200 2201 2202 2203 /* 2204 * Array to map a layering chain index to the appropriate chain "type". 2205 * The chain type indicates a specific property/usage of the chain. 2206 * The redundant entries are present so that the index used for accessing 2207 * the above sd_iostart_chain and sd_iodone_chain tables can be used directly 2208 * with this table as well. 2209 */ 2210 2211 #define SD_CHAIN_NULL 0 /* for the special RQS cmd */ 2212 #define SD_CHAIN_BUFIO 1 /* regular buf IO */ 2213 #define SD_CHAIN_USCSI 2 /* regular USCSI commands */ 2214 #define SD_CHAIN_DIRECT 3 /* uscsi, w/ bypass power mgt */ 2215 #define SD_CHAIN_DIRECT_PRIORITY 4 /* uscsi, w/ bypass power mgt */ 2216 /* (for error recovery) */ 2217 2218 static int sd_chain_type_map[] = { 2219 2220 /* Chain for buf IO for disk drive targets (PM enabled) */ 2221 SD_CHAIN_BUFIO, /* Index: 0 */ 2222 SD_CHAIN_BUFIO, /* Index: 1 */ 2223 SD_CHAIN_BUFIO, /* Index: 2 */ 2224 2225 /* Chain for buf IO for disk drive targets (PM disabled) */ 2226 SD_CHAIN_BUFIO, /* Index: 3 */ 2227 SD_CHAIN_BUFIO, /* Index: 4 */ 2228 2229 /* 2230 * Chain for buf IO for removable-media or large sector size 2231 * disk drive targets (PM enabled) 2232 */ 2233 SD_CHAIN_BUFIO, /* Index: 5 */ 2234 SD_CHAIN_BUFIO, /* Index: 6 */ 2235 SD_CHAIN_BUFIO, /* Index: 7 */ 2236 SD_CHAIN_BUFIO, /* Index: 8 */ 2237 2238 /* 2239 * Chain for buf IO for removable-media or large sector size 2240 * disk drive targets (PM disabled) 2241 */ 2242 SD_CHAIN_BUFIO, /* Index: 9 */ 2243 SD_CHAIN_BUFIO, /* Index: 10 */ 2244 SD_CHAIN_BUFIO, /* Index: 11 */ 2245 2246 /* Chain for buf IO for disk drives with checksumming (PM enabled) */ 2247 SD_CHAIN_BUFIO, /* Index: 12 */ 2248 SD_CHAIN_BUFIO, /* Index: 13 */ 2249 SD_CHAIN_BUFIO, /* Index: 14 */ 2250 SD_CHAIN_BUFIO, /* Index: 15 */ 2251 2252 /* Chain for buf IO for disk drives with checksumming (PM disabled) */ 2253 SD_CHAIN_BUFIO, /* Index: 16 */ 2254 SD_CHAIN_BUFIO, /* Index: 17 */ 2255 SD_CHAIN_BUFIO, /* Index: 18 */ 2256 2257 /* Chain for USCSI commands (non-checksum targets) */ 2258 SD_CHAIN_USCSI, /* Index: 19 */ 2259 SD_CHAIN_USCSI, /* Index: 20 */ 2260 2261 /* Chain for USCSI commands (checksum targets) */ 2262 SD_CHAIN_USCSI, /* Index: 21 */ 2263 SD_CHAIN_USCSI, /* Index: 22 */ 2264 SD_CHAIN_USCSI, /* Index: 23 */ 2265 2266 /* Chain for "direct" USCSI commands (all targets) */ 2267 SD_CHAIN_DIRECT, /* Index: 24 */ 2268 2269 /* Chain for "direct priority" USCSI commands (all targets) */ 2270 SD_CHAIN_DIRECT_PRIORITY, /* Index: 25 */ 2271 2272 /* 2273 * Chain for buf IO for large sector size disk drive targets 2274 * with checksumming (PM enabled) 2275 */ 2276 SD_CHAIN_BUFIO, /* Index: 26 */ 2277 SD_CHAIN_BUFIO, /* Index: 27 */ 2278 SD_CHAIN_BUFIO, /* Index: 28 */ 2279 SD_CHAIN_BUFIO, /* Index: 29 */ 2280 SD_CHAIN_BUFIO, /* Index: 30 */ 2281 2282 /* 2283 * Chain for buf IO for large sector size disk drive targets 2284 * with checksumming (PM disabled) 2285 */ 2286 SD_CHAIN_BUFIO, /* Index: 31 */ 2287 SD_CHAIN_BUFIO, /* Index: 32 */ 2288 SD_CHAIN_BUFIO, /* Index: 33 */ 2289 SD_CHAIN_BUFIO, /* Index: 34 */ 2290 }; 2291 2292 2293 /* Macro to return TRUE if the IO has come from the sd_buf_iostart() chain. */ 2294 #define SD_IS_BUFIO(xp) \ 2295 (sd_chain_type_map[(xp)->xb_chain_iostart] == SD_CHAIN_BUFIO) 2296 2297 /* Macro to return TRUE if the IO has come from the "direct priority" chain. */ 2298 #define SD_IS_DIRECT_PRIORITY(xp) \ 2299 (sd_chain_type_map[(xp)->xb_chain_iostart] == SD_CHAIN_DIRECT_PRIORITY) 2300 2301 2302 2303 /* 2304 * Struct, array, and macros to map a specific chain to the appropriate 2305 * layering indexes in the sd_iostart_chain[] and sd_iodone_chain[] arrays. 2306 * 2307 * The sd_chain_index_map[] array is used at attach time to set the various 2308 * un_xxx_chain type members of the sd_lun softstate to the specific layering 2309 * chain to be used with the instance. This allows different instances to use 2310 * different chain for buf IO, uscsi IO, etc.. Also, since the xb_chain_iostart 2311 * and xb_chain_iodone index values in the sd_xbuf are initialized to these 2312 * values at sd_xbuf init time, this allows (1) layering chains may be changed 2313 * dynamically & without the use of locking; and (2) a layer may update the 2314 * xb_chain_io[start|done] member in a given xbuf with its current index value, 2315 * to allow for deferred processing of an IO within the same chain from a 2316 * different execution context. 2317 */ 2318 2319 struct sd_chain_index { 2320 int sci_iostart_index; 2321 int sci_iodone_index; 2322 }; 2323 2324 static struct sd_chain_index sd_chain_index_map[] = { 2325 { SD_CHAIN_DISK_IOSTART, SD_CHAIN_DISK_IODONE }, 2326 { SD_CHAIN_DISK_IOSTART_NO_PM, SD_CHAIN_DISK_IODONE_NO_PM }, 2327 { SD_CHAIN_RMMEDIA_IOSTART, SD_CHAIN_RMMEDIA_IODONE }, 2328 { SD_CHAIN_RMMEDIA_IOSTART_NO_PM, SD_CHAIN_RMMEDIA_IODONE_NO_PM }, 2329 { SD_CHAIN_CHKSUM_IOSTART, SD_CHAIN_CHKSUM_IODONE }, 2330 { SD_CHAIN_CHKSUM_IOSTART_NO_PM, SD_CHAIN_CHKSUM_IODONE_NO_PM }, 2331 { SD_CHAIN_USCSI_CMD_IOSTART, SD_CHAIN_USCSI_CMD_IODONE }, 2332 { SD_CHAIN_USCSI_CHKSUM_IOSTART, SD_CHAIN_USCSI_CHKSUM_IODONE }, 2333 { SD_CHAIN_DIRECT_CMD_IOSTART, SD_CHAIN_DIRECT_CMD_IODONE }, 2334 { SD_CHAIN_PRIORITY_CMD_IOSTART, SD_CHAIN_PRIORITY_CMD_IODONE }, 2335 { SD_CHAIN_MSS_CHKSUM_IOSTART, SD_CHAIN_MSS_CHKSUM_IODONE }, 2336 { SD_CHAIN_MSS_CHKSUM_IOSTART_NO_PM, SD_CHAIN_MSS_CHKSUM_IODONE_NO_PM }, 2337 2338 }; 2339 2340 2341 /* 2342 * The following are indexes into the sd_chain_index_map[] array. 2343 */ 2344 2345 /* un->un_buf_chain_type must be set to one of these */ 2346 #define SD_CHAIN_INFO_DISK 0 2347 #define SD_CHAIN_INFO_DISK_NO_PM 1 2348 #define SD_CHAIN_INFO_RMMEDIA 2 2349 #define SD_CHAIN_INFO_MSS_DISK 2 2350 #define SD_CHAIN_INFO_RMMEDIA_NO_PM 3 2351 #define SD_CHAIN_INFO_MSS_DSK_NO_PM 3 2352 #define SD_CHAIN_INFO_CHKSUM 4 2353 #define SD_CHAIN_INFO_CHKSUM_NO_PM 5 2354 #define SD_CHAIN_INFO_MSS_DISK_CHKSUM 10 2355 #define SD_CHAIN_INFO_MSS_DISK_CHKSUM_NO_PM 11 2356 2357 /* un->un_uscsi_chain_type must be set to one of these */ 2358 #define SD_CHAIN_INFO_USCSI_CMD 6 2359 /* USCSI with PM disabled is the same as DIRECT */ 2360 #define SD_CHAIN_INFO_USCSI_CMD_NO_PM 8 2361 #define SD_CHAIN_INFO_USCSI_CHKSUM 7 2362 2363 /* un->un_direct_chain_type must be set to one of these */ 2364 #define SD_CHAIN_INFO_DIRECT_CMD 8 2365 2366 /* un->un_priority_chain_type must be set to one of these */ 2367 #define SD_CHAIN_INFO_PRIORITY_CMD 9 2368 2369 /* size for devid inquiries */ 2370 #define MAX_INQUIRY_SIZE 0xF0 2371 2372 /* 2373 * Macros used by functions to pass a given buf(9S) struct along to the 2374 * next function in the layering chain for further processing. 2375 * 2376 * In the following macros, passing more than three arguments to the called 2377 * routines causes the optimizer for the SPARC compiler to stop doing tail 2378 * call elimination which results in significant performance degradation. 2379 */ 2380 #define SD_BEGIN_IOSTART(index, un, bp) \ 2381 ((*(sd_iostart_chain[index]))(index, un, bp)) 2382 2383 #define SD_BEGIN_IODONE(index, un, bp) \ 2384 ((*(sd_iodone_chain[index]))(index, un, bp)) 2385 2386 #define SD_NEXT_IOSTART(index, un, bp) \ 2387 ((*(sd_iostart_chain[(index) + 1]))((index) + 1, un, bp)) 2388 2389 #define SD_NEXT_IODONE(index, un, bp) \ 2390 ((*(sd_iodone_chain[(index) - 1]))((index) - 1, un, bp)) 2391 2392 /* 2393 * Function: _init 2394 * 2395 * Description: This is the driver _init(9E) entry point. 2396 * 2397 * Return Code: Returns the value from mod_install(9F) or 2398 * ddi_soft_state_init(9F) as appropriate. 2399 * 2400 * Context: Called when driver module loaded. 2401 */ 2402 2403 int 2404 _init(void) 2405 { 2406 int err; 2407 2408 /* establish driver name from module name */ 2409 sd_label = (char *)mod_modname(&modlinkage); 2410 2411 err = ddi_soft_state_init(&sd_state, sizeof (struct sd_lun), 2412 SD_MAXUNIT); 2413 if (err != 0) { 2414 return (err); 2415 } 2416 2417 mutex_init(&sd_detach_mutex, NULL, MUTEX_DRIVER, NULL); 2418 mutex_init(&sd_log_mutex, NULL, MUTEX_DRIVER, NULL); 2419 mutex_init(&sd_label_mutex, NULL, MUTEX_DRIVER, NULL); 2420 2421 mutex_init(&sd_tr.srq_resv_reclaim_mutex, NULL, MUTEX_DRIVER, NULL); 2422 cv_init(&sd_tr.srq_resv_reclaim_cv, NULL, CV_DRIVER, NULL); 2423 cv_init(&sd_tr.srq_inprocess_cv, NULL, CV_DRIVER, NULL); 2424 2425 /* 2426 * it's ok to init here even for fibre device 2427 */ 2428 sd_scsi_probe_cache_init(); 2429 2430 sd_scsi_target_lun_init(); 2431 2432 /* 2433 * Creating taskq before mod_install ensures that all callers (threads) 2434 * that enter the module after a successful mod_install encounter 2435 * a valid taskq. 2436 */ 2437 sd_taskq_create(); 2438 2439 err = mod_install(&modlinkage); 2440 if (err != 0) { 2441 /* delete taskq if install fails */ 2442 sd_taskq_delete(); 2443 2444 mutex_destroy(&sd_detach_mutex); 2445 mutex_destroy(&sd_log_mutex); 2446 mutex_destroy(&sd_label_mutex); 2447 2448 mutex_destroy(&sd_tr.srq_resv_reclaim_mutex); 2449 cv_destroy(&sd_tr.srq_resv_reclaim_cv); 2450 cv_destroy(&sd_tr.srq_inprocess_cv); 2451 2452 sd_scsi_probe_cache_fini(); 2453 2454 sd_scsi_target_lun_fini(); 2455 2456 ddi_soft_state_fini(&sd_state); 2457 2458 return (err); 2459 } 2460 2461 return (err); 2462 } 2463 2464 2465 /* 2466 * Function: _fini 2467 * 2468 * Description: This is the driver _fini(9E) entry point. 2469 * 2470 * Return Code: Returns the value from mod_remove(9F) 2471 * 2472 * Context: Called when driver module is unloaded. 2473 */ 2474 2475 int 2476 _fini(void) 2477 { 2478 int err; 2479 2480 if ((err = mod_remove(&modlinkage)) != 0) { 2481 return (err); 2482 } 2483 2484 sd_taskq_delete(); 2485 2486 mutex_destroy(&sd_detach_mutex); 2487 mutex_destroy(&sd_log_mutex); 2488 mutex_destroy(&sd_label_mutex); 2489 mutex_destroy(&sd_tr.srq_resv_reclaim_mutex); 2490 2491 sd_scsi_probe_cache_fini(); 2492 2493 sd_scsi_target_lun_fini(); 2494 2495 cv_destroy(&sd_tr.srq_resv_reclaim_cv); 2496 cv_destroy(&sd_tr.srq_inprocess_cv); 2497 2498 ddi_soft_state_fini(&sd_state); 2499 2500 return (err); 2501 } 2502 2503 2504 /* 2505 * Function: _info 2506 * 2507 * Description: This is the driver _info(9E) entry point. 2508 * 2509 * Arguments: modinfop - pointer to the driver modinfo structure 2510 * 2511 * Return Code: Returns the value from mod_info(9F). 2512 * 2513 * Context: Kernel thread context 2514 */ 2515 2516 int 2517 _info(struct modinfo *modinfop) 2518 { 2519 return (mod_info(&modlinkage, modinfop)); 2520 } 2521 2522 2523 /* 2524 * The following routines implement the driver message logging facility. 2525 * They provide component- and level- based debug output filtering. 2526 * Output may also be restricted to messages for a single instance by 2527 * specifying a soft state pointer in sd_debug_un. If sd_debug_un is set 2528 * to NULL, then messages for all instances are printed. 2529 * 2530 * These routines have been cloned from each other due to the language 2531 * constraints of macros and variable argument list processing. 2532 */ 2533 2534 2535 /* 2536 * Function: sd_log_err 2537 * 2538 * Description: This routine is called by the SD_ERROR macro for debug 2539 * logging of error conditions. 2540 * 2541 * Arguments: comp - driver component being logged 2542 * dev - pointer to driver info structure 2543 * fmt - error string and format to be logged 2544 */ 2545 2546 static void 2547 sd_log_err(uint_t comp, struct sd_lun *un, const char *fmt, ...) 2548 { 2549 va_list ap; 2550 dev_info_t *dev; 2551 2552 ASSERT(un != NULL); 2553 dev = SD_DEVINFO(un); 2554 ASSERT(dev != NULL); 2555 2556 /* 2557 * Filter messages based on the global component and level masks. 2558 * Also print if un matches the value of sd_debug_un, or if 2559 * sd_debug_un is set to NULL. 2560 */ 2561 if ((sd_component_mask & comp) && (sd_level_mask & SD_LOGMASK_ERROR) && 2562 ((sd_debug_un == NULL) || (sd_debug_un == un))) { 2563 mutex_enter(&sd_log_mutex); 2564 va_start(ap, fmt); 2565 (void) vsprintf(sd_log_buf, fmt, ap); 2566 va_end(ap); 2567 scsi_log(dev, sd_label, CE_CONT, "%s", sd_log_buf); 2568 mutex_exit(&sd_log_mutex); 2569 } 2570 #ifdef SD_FAULT_INJECTION 2571 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::sd_injection_mask)); 2572 if (un->sd_injection_mask & comp) { 2573 mutex_enter(&sd_log_mutex); 2574 va_start(ap, fmt); 2575 (void) vsprintf(sd_log_buf, fmt, ap); 2576 va_end(ap); 2577 sd_injection_log(sd_log_buf, un); 2578 mutex_exit(&sd_log_mutex); 2579 } 2580 #endif 2581 } 2582 2583 2584 /* 2585 * Function: sd_log_info 2586 * 2587 * Description: This routine is called by the SD_INFO macro for debug 2588 * logging of general purpose informational conditions. 2589 * 2590 * Arguments: comp - driver component being logged 2591 * dev - pointer to driver info structure 2592 * fmt - info string and format to be logged 2593 */ 2594 2595 static void 2596 sd_log_info(uint_t component, struct sd_lun *un, const char *fmt, ...) 2597 { 2598 va_list ap; 2599 dev_info_t *dev; 2600 2601 ASSERT(un != NULL); 2602 dev = SD_DEVINFO(un); 2603 ASSERT(dev != NULL); 2604 2605 /* 2606 * Filter messages based on the global component and level masks. 2607 * Also print if un matches the value of sd_debug_un, or if 2608 * sd_debug_un is set to NULL. 2609 */ 2610 if ((sd_component_mask & component) && 2611 (sd_level_mask & SD_LOGMASK_INFO) && 2612 ((sd_debug_un == NULL) || (sd_debug_un == un))) { 2613 mutex_enter(&sd_log_mutex); 2614 va_start(ap, fmt); 2615 (void) vsprintf(sd_log_buf, fmt, ap); 2616 va_end(ap); 2617 scsi_log(dev, sd_label, CE_CONT, "%s", sd_log_buf); 2618 mutex_exit(&sd_log_mutex); 2619 } 2620 #ifdef SD_FAULT_INJECTION 2621 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::sd_injection_mask)); 2622 if (un->sd_injection_mask & component) { 2623 mutex_enter(&sd_log_mutex); 2624 va_start(ap, fmt); 2625 (void) vsprintf(sd_log_buf, fmt, ap); 2626 va_end(ap); 2627 sd_injection_log(sd_log_buf, un); 2628 mutex_exit(&sd_log_mutex); 2629 } 2630 #endif 2631 } 2632 2633 2634 /* 2635 * Function: sd_log_trace 2636 * 2637 * Description: This routine is called by the SD_TRACE macro for debug 2638 * logging of trace conditions (i.e. function entry/exit). 2639 * 2640 * Arguments: comp - driver component being logged 2641 * dev - pointer to driver info structure 2642 * fmt - trace string and format to be logged 2643 */ 2644 2645 static void 2646 sd_log_trace(uint_t component, struct sd_lun *un, const char *fmt, ...) 2647 { 2648 va_list ap; 2649 dev_info_t *dev; 2650 2651 ASSERT(un != NULL); 2652 dev = SD_DEVINFO(un); 2653 ASSERT(dev != NULL); 2654 2655 /* 2656 * Filter messages based on the global component and level masks. 2657 * Also print if un matches the value of sd_debug_un, or if 2658 * sd_debug_un is set to NULL. 2659 */ 2660 if ((sd_component_mask & component) && 2661 (sd_level_mask & SD_LOGMASK_TRACE) && 2662 ((sd_debug_un == NULL) || (sd_debug_un == un))) { 2663 mutex_enter(&sd_log_mutex); 2664 va_start(ap, fmt); 2665 (void) vsprintf(sd_log_buf, fmt, ap); 2666 va_end(ap); 2667 scsi_log(dev, sd_label, CE_CONT, "%s", sd_log_buf); 2668 mutex_exit(&sd_log_mutex); 2669 } 2670 #ifdef SD_FAULT_INJECTION 2671 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::sd_injection_mask)); 2672 if (un->sd_injection_mask & component) { 2673 mutex_enter(&sd_log_mutex); 2674 va_start(ap, fmt); 2675 (void) vsprintf(sd_log_buf, fmt, ap); 2676 va_end(ap); 2677 sd_injection_log(sd_log_buf, un); 2678 mutex_exit(&sd_log_mutex); 2679 } 2680 #endif 2681 } 2682 2683 2684 /* 2685 * Function: sdprobe 2686 * 2687 * Description: This is the driver probe(9e) entry point function. 2688 * 2689 * Arguments: devi - opaque device info handle 2690 * 2691 * Return Code: DDI_PROBE_SUCCESS: If the probe was successful. 2692 * DDI_PROBE_FAILURE: If the probe failed. 2693 * DDI_PROBE_PARTIAL: If the instance is not present now, 2694 * but may be present in the future. 2695 */ 2696 2697 static int 2698 sdprobe(dev_info_t *devi) 2699 { 2700 struct scsi_device *devp; 2701 int rval; 2702 int instance = ddi_get_instance(devi); 2703 2704 /* 2705 * if it wasn't for pln, sdprobe could actually be nulldev 2706 * in the "__fibre" case. 2707 */ 2708 if (ddi_dev_is_sid(devi) == DDI_SUCCESS) { 2709 return (DDI_PROBE_DONTCARE); 2710 } 2711 2712 devp = ddi_get_driver_private(devi); 2713 2714 if (devp == NULL) { 2715 /* Ooops... nexus driver is mis-configured... */ 2716 return (DDI_PROBE_FAILURE); 2717 } 2718 2719 if (ddi_get_soft_state(sd_state, instance) != NULL) { 2720 return (DDI_PROBE_PARTIAL); 2721 } 2722 2723 /* 2724 * Call the SCSA utility probe routine to see if we actually 2725 * have a target at this SCSI nexus. 2726 */ 2727 switch (sd_scsi_probe_with_cache(devp, NULL_FUNC)) { 2728 case SCSIPROBE_EXISTS: 2729 switch (devp->sd_inq->inq_dtype) { 2730 case DTYPE_DIRECT: 2731 rval = DDI_PROBE_SUCCESS; 2732 break; 2733 case DTYPE_RODIRECT: 2734 /* CDs etc. Can be removable media */ 2735 rval = DDI_PROBE_SUCCESS; 2736 break; 2737 case DTYPE_OPTICAL: 2738 /* 2739 * Rewritable optical driver HP115AA 2740 * Can also be removable media 2741 */ 2742 2743 /* 2744 * Do not attempt to bind to DTYPE_OPTICAL if 2745 * pre solaris 9 sparc sd behavior is required 2746 * 2747 * If first time through and sd_dtype_optical_bind 2748 * has not been set in /etc/system check properties 2749 */ 2750 2751 if (sd_dtype_optical_bind < 0) { 2752 sd_dtype_optical_bind = ddi_prop_get_int 2753 (DDI_DEV_T_ANY, devi, 0, 2754 "optical-device-bind", 1); 2755 } 2756 2757 if (sd_dtype_optical_bind == 0) { 2758 rval = DDI_PROBE_FAILURE; 2759 } else { 2760 rval = DDI_PROBE_SUCCESS; 2761 } 2762 break; 2763 2764 case DTYPE_NOTPRESENT: 2765 default: 2766 rval = DDI_PROBE_FAILURE; 2767 break; 2768 } 2769 break; 2770 default: 2771 rval = DDI_PROBE_PARTIAL; 2772 break; 2773 } 2774 2775 /* 2776 * This routine checks for resource allocation prior to freeing, 2777 * so it will take care of the "smart probing" case where a 2778 * scsi_probe() may or may not have been issued and will *not* 2779 * free previously-freed resources. 2780 */ 2781 scsi_unprobe(devp); 2782 return (rval); 2783 } 2784 2785 2786 /* 2787 * Function: sdinfo 2788 * 2789 * Description: This is the driver getinfo(9e) entry point function. 2790 * Given the device number, return the devinfo pointer from 2791 * the scsi_device structure or the instance number 2792 * associated with the dev_t. 2793 * 2794 * Arguments: dip - pointer to device info structure 2795 * infocmd - command argument (DDI_INFO_DEVT2DEVINFO, 2796 * DDI_INFO_DEVT2INSTANCE) 2797 * arg - driver dev_t 2798 * resultp - user buffer for request response 2799 * 2800 * Return Code: DDI_SUCCESS 2801 * DDI_FAILURE 2802 */ 2803 /* ARGSUSED */ 2804 static int 2805 sdinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result) 2806 { 2807 struct sd_lun *un; 2808 dev_t dev; 2809 int instance; 2810 int error; 2811 2812 switch (infocmd) { 2813 case DDI_INFO_DEVT2DEVINFO: 2814 dev = (dev_t)arg; 2815 instance = SDUNIT(dev); 2816 if ((un = ddi_get_soft_state(sd_state, instance)) == NULL) { 2817 return (DDI_FAILURE); 2818 } 2819 *result = (void *) SD_DEVINFO(un); 2820 error = DDI_SUCCESS; 2821 break; 2822 case DDI_INFO_DEVT2INSTANCE: 2823 dev = (dev_t)arg; 2824 instance = SDUNIT(dev); 2825 *result = (void *)(uintptr_t)instance; 2826 error = DDI_SUCCESS; 2827 break; 2828 default: 2829 error = DDI_FAILURE; 2830 } 2831 return (error); 2832 } 2833 2834 /* 2835 * Function: sd_prop_op 2836 * 2837 * Description: This is the driver prop_op(9e) entry point function. 2838 * Return the number of blocks for the partition in question 2839 * or forward the request to the property facilities. 2840 * 2841 * Arguments: dev - device number 2842 * dip - pointer to device info structure 2843 * prop_op - property operator 2844 * mod_flags - DDI_PROP_DONTPASS, don't pass to parent 2845 * name - pointer to property name 2846 * valuep - pointer or address of the user buffer 2847 * lengthp - property length 2848 * 2849 * Return Code: DDI_PROP_SUCCESS 2850 * DDI_PROP_NOT_FOUND 2851 * DDI_PROP_UNDEFINED 2852 * DDI_PROP_NO_MEMORY 2853 * DDI_PROP_BUF_TOO_SMALL 2854 */ 2855 2856 static int 2857 sd_prop_op(dev_t dev, dev_info_t *dip, ddi_prop_op_t prop_op, int mod_flags, 2858 char *name, caddr_t valuep, int *lengthp) 2859 { 2860 struct sd_lun *un; 2861 2862 if ((un = ddi_get_soft_state(sd_state, ddi_get_instance(dip))) == NULL) 2863 return (ddi_prop_op(dev, dip, prop_op, mod_flags, 2864 name, valuep, lengthp)); 2865 2866 return (cmlb_prop_op(un->un_cmlbhandle, 2867 dev, dip, prop_op, mod_flags, name, valuep, lengthp, 2868 SDPART(dev), (void *)SD_PATH_DIRECT)); 2869 } 2870 2871 /* 2872 * The following functions are for smart probing: 2873 * sd_scsi_probe_cache_init() 2874 * sd_scsi_probe_cache_fini() 2875 * sd_scsi_clear_probe_cache() 2876 * sd_scsi_probe_with_cache() 2877 */ 2878 2879 /* 2880 * Function: sd_scsi_probe_cache_init 2881 * 2882 * Description: Initializes the probe response cache mutex and head pointer. 2883 * 2884 * Context: Kernel thread context 2885 */ 2886 2887 static void 2888 sd_scsi_probe_cache_init(void) 2889 { 2890 mutex_init(&sd_scsi_probe_cache_mutex, NULL, MUTEX_DRIVER, NULL); 2891 sd_scsi_probe_cache_head = NULL; 2892 } 2893 2894 2895 /* 2896 * Function: sd_scsi_probe_cache_fini 2897 * 2898 * Description: Frees all resources associated with the probe response cache. 2899 * 2900 * Context: Kernel thread context 2901 */ 2902 2903 static void 2904 sd_scsi_probe_cache_fini(void) 2905 { 2906 struct sd_scsi_probe_cache *cp; 2907 struct sd_scsi_probe_cache *ncp; 2908 2909 /* Clean up our smart probing linked list */ 2910 for (cp = sd_scsi_probe_cache_head; cp != NULL; cp = ncp) { 2911 ncp = cp->next; 2912 kmem_free(cp, sizeof (struct sd_scsi_probe_cache)); 2913 } 2914 sd_scsi_probe_cache_head = NULL; 2915 mutex_destroy(&sd_scsi_probe_cache_mutex); 2916 } 2917 2918 2919 /* 2920 * Function: sd_scsi_clear_probe_cache 2921 * 2922 * Description: This routine clears the probe response cache. This is 2923 * done when open() returns ENXIO so that when deferred 2924 * attach is attempted (possibly after a device has been 2925 * turned on) we will retry the probe. Since we don't know 2926 * which target we failed to open, we just clear the 2927 * entire cache. 2928 * 2929 * Context: Kernel thread context 2930 */ 2931 2932 static void 2933 sd_scsi_clear_probe_cache(void) 2934 { 2935 struct sd_scsi_probe_cache *cp; 2936 int i; 2937 2938 mutex_enter(&sd_scsi_probe_cache_mutex); 2939 for (cp = sd_scsi_probe_cache_head; cp != NULL; cp = cp->next) { 2940 /* 2941 * Reset all entries to SCSIPROBE_EXISTS. This will 2942 * force probing to be performed the next time 2943 * sd_scsi_probe_with_cache is called. 2944 */ 2945 for (i = 0; i < NTARGETS_WIDE; i++) { 2946 cp->cache[i] = SCSIPROBE_EXISTS; 2947 } 2948 } 2949 mutex_exit(&sd_scsi_probe_cache_mutex); 2950 } 2951 2952 2953 /* 2954 * Function: sd_scsi_probe_with_cache 2955 * 2956 * Description: This routine implements support for a scsi device probe 2957 * with cache. The driver maintains a cache of the target 2958 * responses to scsi probes. If we get no response from a 2959 * target during a probe inquiry, we remember that, and we 2960 * avoid additional calls to scsi_probe on non-zero LUNs 2961 * on the same target until the cache is cleared. By doing 2962 * so we avoid the 1/4 sec selection timeout for nonzero 2963 * LUNs. lun0 of a target is always probed. 2964 * 2965 * Arguments: devp - Pointer to a scsi_device(9S) structure 2966 * waitfunc - indicates what the allocator routines should 2967 * do when resources are not available. This value 2968 * is passed on to scsi_probe() when that routine 2969 * is called. 2970 * 2971 * Return Code: SCSIPROBE_NORESP if a NORESP in probe response cache; 2972 * otherwise the value returned by scsi_probe(9F). 2973 * 2974 * Context: Kernel thread context 2975 */ 2976 2977 static int 2978 sd_scsi_probe_with_cache(struct scsi_device *devp, int (*waitfn)()) 2979 { 2980 struct sd_scsi_probe_cache *cp; 2981 dev_info_t *pdip = ddi_get_parent(devp->sd_dev); 2982 int lun, tgt; 2983 2984 lun = ddi_prop_get_int(DDI_DEV_T_ANY, devp->sd_dev, DDI_PROP_DONTPASS, 2985 SCSI_ADDR_PROP_LUN, 0); 2986 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, devp->sd_dev, DDI_PROP_DONTPASS, 2987 SCSI_ADDR_PROP_TARGET, -1); 2988 2989 /* Make sure caching enabled and target in range */ 2990 if ((tgt < 0) || (tgt >= NTARGETS_WIDE)) { 2991 /* do it the old way (no cache) */ 2992 return (scsi_probe(devp, waitfn)); 2993 } 2994 2995 mutex_enter(&sd_scsi_probe_cache_mutex); 2996 2997 /* Find the cache for this scsi bus instance */ 2998 for (cp = sd_scsi_probe_cache_head; cp != NULL; cp = cp->next) { 2999 if (cp->pdip == pdip) { 3000 break; 3001 } 3002 } 3003 3004 /* If we can't find a cache for this pdip, create one */ 3005 if (cp == NULL) { 3006 int i; 3007 3008 cp = kmem_zalloc(sizeof (struct sd_scsi_probe_cache), 3009 KM_SLEEP); 3010 cp->pdip = pdip; 3011 cp->next = sd_scsi_probe_cache_head; 3012 sd_scsi_probe_cache_head = cp; 3013 for (i = 0; i < NTARGETS_WIDE; i++) { 3014 cp->cache[i] = SCSIPROBE_EXISTS; 3015 } 3016 } 3017 3018 mutex_exit(&sd_scsi_probe_cache_mutex); 3019 3020 /* Recompute the cache for this target if LUN zero */ 3021 if (lun == 0) { 3022 cp->cache[tgt] = SCSIPROBE_EXISTS; 3023 } 3024 3025 /* Don't probe if cache remembers a NORESP from a previous LUN. */ 3026 if (cp->cache[tgt] != SCSIPROBE_EXISTS) { 3027 return (SCSIPROBE_NORESP); 3028 } 3029 3030 /* Do the actual probe; save & return the result */ 3031 return (cp->cache[tgt] = scsi_probe(devp, waitfn)); 3032 } 3033 3034 3035 /* 3036 * Function: sd_scsi_target_lun_init 3037 * 3038 * Description: Initializes the attached lun chain mutex and head pointer. 3039 * 3040 * Context: Kernel thread context 3041 */ 3042 3043 static void 3044 sd_scsi_target_lun_init(void) 3045 { 3046 mutex_init(&sd_scsi_target_lun_mutex, NULL, MUTEX_DRIVER, NULL); 3047 sd_scsi_target_lun_head = NULL; 3048 } 3049 3050 3051 /* 3052 * Function: sd_scsi_target_lun_fini 3053 * 3054 * Description: Frees all resources associated with the attached lun 3055 * chain 3056 * 3057 * Context: Kernel thread context 3058 */ 3059 3060 static void 3061 sd_scsi_target_lun_fini(void) 3062 { 3063 struct sd_scsi_hba_tgt_lun *cp; 3064 struct sd_scsi_hba_tgt_lun *ncp; 3065 3066 for (cp = sd_scsi_target_lun_head; cp != NULL; cp = ncp) { 3067 ncp = cp->next; 3068 kmem_free(cp, sizeof (struct sd_scsi_hba_tgt_lun)); 3069 } 3070 sd_scsi_target_lun_head = NULL; 3071 mutex_destroy(&sd_scsi_target_lun_mutex); 3072 } 3073 3074 3075 /* 3076 * Function: sd_scsi_get_target_lun_count 3077 * 3078 * Description: This routine will check in the attached lun chain to see 3079 * how many luns are attached on the required SCSI controller 3080 * and target. Currently, some capabilities like tagged queue 3081 * are supported per target based by HBA. So all luns in a 3082 * target have the same capabilities. Based on this assumption, 3083 * sd should only set these capabilities once per target. This 3084 * function is called when sd needs to decide how many luns 3085 * already attached on a target. 3086 * 3087 * Arguments: dip - Pointer to the system's dev_info_t for the SCSI 3088 * controller device. 3089 * target - The target ID on the controller's SCSI bus. 3090 * 3091 * Return Code: The number of luns attached on the required target and 3092 * controller. 3093 * -1 if target ID is not in parallel SCSI scope or the given 3094 * dip is not in the chain. 3095 * 3096 * Context: Kernel thread context 3097 */ 3098 3099 static int 3100 sd_scsi_get_target_lun_count(dev_info_t *dip, int target) 3101 { 3102 struct sd_scsi_hba_tgt_lun *cp; 3103 3104 if ((target < 0) || (target >= NTARGETS_WIDE)) { 3105 return (-1); 3106 } 3107 3108 mutex_enter(&sd_scsi_target_lun_mutex); 3109 3110 for (cp = sd_scsi_target_lun_head; cp != NULL; cp = cp->next) { 3111 if (cp->pdip == dip) { 3112 break; 3113 } 3114 } 3115 3116 mutex_exit(&sd_scsi_target_lun_mutex); 3117 3118 if (cp == NULL) { 3119 return (-1); 3120 } 3121 3122 return (cp->nlun[target]); 3123 } 3124 3125 3126 /* 3127 * Function: sd_scsi_update_lun_on_target 3128 * 3129 * Description: This routine is used to update the attached lun chain when a 3130 * lun is attached or detached on a target. 3131 * 3132 * Arguments: dip - Pointer to the system's dev_info_t for the SCSI 3133 * controller device. 3134 * target - The target ID on the controller's SCSI bus. 3135 * flag - Indicate the lun is attached or detached. 3136 * 3137 * Context: Kernel thread context 3138 */ 3139 3140 static void 3141 sd_scsi_update_lun_on_target(dev_info_t *dip, int target, int flag) 3142 { 3143 struct sd_scsi_hba_tgt_lun *cp; 3144 3145 mutex_enter(&sd_scsi_target_lun_mutex); 3146 3147 for (cp = sd_scsi_target_lun_head; cp != NULL; cp = cp->next) { 3148 if (cp->pdip == dip) { 3149 break; 3150 } 3151 } 3152 3153 if ((cp == NULL) && (flag == SD_SCSI_LUN_ATTACH)) { 3154 cp = kmem_zalloc(sizeof (struct sd_scsi_hba_tgt_lun), 3155 KM_SLEEP); 3156 cp->pdip = dip; 3157 cp->next = sd_scsi_target_lun_head; 3158 sd_scsi_target_lun_head = cp; 3159 } 3160 3161 mutex_exit(&sd_scsi_target_lun_mutex); 3162 3163 if (cp != NULL) { 3164 if (flag == SD_SCSI_LUN_ATTACH) { 3165 cp->nlun[target] ++; 3166 } else { 3167 cp->nlun[target] --; 3168 } 3169 } 3170 } 3171 3172 3173 /* 3174 * Function: sd_spin_up_unit 3175 * 3176 * Description: Issues the following commands to spin-up the device: 3177 * START STOP UNIT, and INQUIRY. 3178 * 3179 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 3180 * structure for this target. 3181 * 3182 * Return Code: 0 - success 3183 * EIO - failure 3184 * EACCES - reservation conflict 3185 * 3186 * Context: Kernel thread context 3187 */ 3188 3189 static int 3190 sd_spin_up_unit(sd_ssc_t *ssc) 3191 { 3192 size_t resid = 0; 3193 int has_conflict = FALSE; 3194 uchar_t *bufaddr; 3195 int status; 3196 struct sd_lun *un; 3197 3198 ASSERT(ssc != NULL); 3199 un = ssc->ssc_un; 3200 ASSERT(un != NULL); 3201 3202 /* 3203 * Send a throwaway START UNIT command. 3204 * 3205 * If we fail on this, we don't care presently what precisely 3206 * is wrong. EMC's arrays will also fail this with a check 3207 * condition (0x2/0x4/0x3) if the device is "inactive," but 3208 * we don't want to fail the attach because it may become 3209 * "active" later. 3210 * We don't know if power condition is supported or not at 3211 * this stage, use START STOP bit. 3212 */ 3213 status = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP, 3214 SD_TARGET_START, SD_PATH_DIRECT); 3215 3216 if (status != 0) { 3217 if (status == EACCES) 3218 has_conflict = TRUE; 3219 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 3220 } 3221 3222 /* 3223 * Send another INQUIRY command to the target. This is necessary for 3224 * non-removable media direct access devices because their INQUIRY data 3225 * may not be fully qualified until they are spun up (perhaps via the 3226 * START command above). Note: This seems to be needed for some 3227 * legacy devices only.) The INQUIRY command should succeed even if a 3228 * Reservation Conflict is present. 3229 */ 3230 bufaddr = kmem_zalloc(SUN_INQSIZE, KM_SLEEP); 3231 3232 if (sd_send_scsi_INQUIRY(ssc, bufaddr, SUN_INQSIZE, 0, 0, &resid) 3233 != 0) { 3234 kmem_free(bufaddr, SUN_INQSIZE); 3235 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 3236 return (EIO); 3237 } 3238 3239 /* 3240 * If we got enough INQUIRY data, copy it over the old INQUIRY data. 3241 * Note that this routine does not return a failure here even if the 3242 * INQUIRY command did not return any data. This is a legacy behavior. 3243 */ 3244 if ((SUN_INQSIZE - resid) >= SUN_MIN_INQLEN) { 3245 bcopy(bufaddr, SD_INQUIRY(un), SUN_INQSIZE); 3246 } 3247 3248 kmem_free(bufaddr, SUN_INQSIZE); 3249 3250 /* If we hit a reservation conflict above, tell the caller. */ 3251 if (has_conflict == TRUE) { 3252 return (EACCES); 3253 } 3254 3255 return (0); 3256 } 3257 3258 #ifdef _LP64 3259 /* 3260 * Function: sd_enable_descr_sense 3261 * 3262 * Description: This routine attempts to select descriptor sense format 3263 * using the Control mode page. Devices that support 64 bit 3264 * LBAs (for >2TB luns) should also implement descriptor 3265 * sense data so we will call this function whenever we see 3266 * a lun larger than 2TB. If for some reason the device 3267 * supports 64 bit LBAs but doesn't support descriptor sense 3268 * presumably the mode select will fail. Everything will 3269 * continue to work normally except that we will not get 3270 * complete sense data for commands that fail with an LBA 3271 * larger than 32 bits. 3272 * 3273 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 3274 * structure for this target. 3275 * 3276 * Context: Kernel thread context only 3277 */ 3278 3279 static void 3280 sd_enable_descr_sense(sd_ssc_t *ssc) 3281 { 3282 uchar_t *header; 3283 struct mode_control_scsi3 *ctrl_bufp; 3284 size_t buflen; 3285 size_t bd_len; 3286 int status; 3287 struct sd_lun *un; 3288 3289 ASSERT(ssc != NULL); 3290 un = ssc->ssc_un; 3291 ASSERT(un != NULL); 3292 3293 /* 3294 * Read MODE SENSE page 0xA, Control Mode Page 3295 */ 3296 buflen = MODE_HEADER_LENGTH + MODE_BLK_DESC_LENGTH + 3297 sizeof (struct mode_control_scsi3); 3298 header = kmem_zalloc(buflen, KM_SLEEP); 3299 3300 status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, header, buflen, 3301 MODEPAGE_CTRL_MODE, SD_PATH_DIRECT); 3302 3303 if (status != 0) { 3304 SD_ERROR(SD_LOG_COMMON, un, 3305 "sd_enable_descr_sense: mode sense ctrl page failed\n"); 3306 goto eds_exit; 3307 } 3308 3309 /* 3310 * Determine size of Block Descriptors in order to locate 3311 * the mode page data. ATAPI devices return 0, SCSI devices 3312 * should return MODE_BLK_DESC_LENGTH. 3313 */ 3314 bd_len = ((struct mode_header *)header)->bdesc_length; 3315 3316 /* Clear the mode data length field for MODE SELECT */ 3317 ((struct mode_header *)header)->length = 0; 3318 3319 ctrl_bufp = (struct mode_control_scsi3 *) 3320 (header + MODE_HEADER_LENGTH + bd_len); 3321 3322 /* 3323 * If the page length is smaller than the expected value, 3324 * the target device doesn't support D_SENSE. Bail out here. 3325 */ 3326 if (ctrl_bufp->mode_page.length < 3327 sizeof (struct mode_control_scsi3) - 2) { 3328 SD_ERROR(SD_LOG_COMMON, un, 3329 "sd_enable_descr_sense: enable D_SENSE failed\n"); 3330 goto eds_exit; 3331 } 3332 3333 /* 3334 * Clear PS bit for MODE SELECT 3335 */ 3336 ctrl_bufp->mode_page.ps = 0; 3337 3338 /* 3339 * Set D_SENSE to enable descriptor sense format. 3340 */ 3341 ctrl_bufp->d_sense = 1; 3342 3343 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 3344 3345 /* 3346 * Use MODE SELECT to commit the change to the D_SENSE bit 3347 */ 3348 status = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, header, 3349 buflen, SD_DONTSAVE_PAGE, SD_PATH_DIRECT); 3350 3351 if (status != 0) { 3352 SD_INFO(SD_LOG_COMMON, un, 3353 "sd_enable_descr_sense: mode select ctrl page failed\n"); 3354 } else { 3355 kmem_free(header, buflen); 3356 return; 3357 } 3358 3359 eds_exit: 3360 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 3361 kmem_free(header, buflen); 3362 } 3363 3364 /* 3365 * Function: sd_reenable_dsense_task 3366 * 3367 * Description: Re-enable descriptor sense after device or bus reset 3368 * 3369 * Context: Executes in a taskq() thread context 3370 */ 3371 static void 3372 sd_reenable_dsense_task(void *arg) 3373 { 3374 struct sd_lun *un = arg; 3375 sd_ssc_t *ssc; 3376 3377 ASSERT(un != NULL); 3378 3379 ssc = sd_ssc_init(un); 3380 sd_enable_descr_sense(ssc); 3381 sd_ssc_fini(ssc); 3382 } 3383 #endif /* _LP64 */ 3384 3385 /* 3386 * Function: sd_set_mmc_caps 3387 * 3388 * Description: This routine determines if the device is MMC compliant and if 3389 * the device supports CDDA via a mode sense of the CDVD 3390 * capabilities mode page. Also checks if the device is a 3391 * dvdram writable device. 3392 * 3393 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 3394 * structure for this target. 3395 * 3396 * Context: Kernel thread context only 3397 */ 3398 3399 static void 3400 sd_set_mmc_caps(sd_ssc_t *ssc) 3401 { 3402 struct mode_header_grp2 *sense_mhp; 3403 uchar_t *sense_page; 3404 caddr_t buf; 3405 int bd_len; 3406 int status; 3407 struct uscsi_cmd com; 3408 int rtn; 3409 uchar_t *out_data_rw, *out_data_hd; 3410 uchar_t *rqbuf_rw, *rqbuf_hd; 3411 uchar_t *out_data_gesn; 3412 int gesn_len; 3413 struct sd_lun *un; 3414 3415 ASSERT(ssc != NULL); 3416 un = ssc->ssc_un; 3417 ASSERT(un != NULL); 3418 3419 /* 3420 * The flags which will be set in this function are - mmc compliant, 3421 * dvdram writable device, cdda support. Initialize them to FALSE 3422 * and if a capability is detected - it will be set to TRUE. 3423 */ 3424 un->un_f_mmc_cap = FALSE; 3425 un->un_f_dvdram_writable_device = FALSE; 3426 un->un_f_cfg_cdda = FALSE; 3427 3428 buf = kmem_zalloc(BUFLEN_MODE_CDROM_CAP, KM_SLEEP); 3429 status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, (uchar_t *)buf, 3430 BUFLEN_MODE_CDROM_CAP, MODEPAGE_CDROM_CAP, SD_PATH_DIRECT); 3431 3432 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 3433 3434 if (status != 0) { 3435 /* command failed; just return */ 3436 kmem_free(buf, BUFLEN_MODE_CDROM_CAP); 3437 return; 3438 } 3439 /* 3440 * If the mode sense request for the CDROM CAPABILITIES 3441 * page (0x2A) succeeds the device is assumed to be MMC. 3442 */ 3443 un->un_f_mmc_cap = TRUE; 3444 3445 /* See if GET STATUS EVENT NOTIFICATION is supported */ 3446 if (un->un_f_mmc_gesn_polling) { 3447 gesn_len = SD_GESN_HEADER_LEN + SD_GESN_MEDIA_DATA_LEN; 3448 out_data_gesn = kmem_zalloc(gesn_len, KM_SLEEP); 3449 3450 rtn = sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION(ssc, 3451 out_data_gesn, gesn_len, 1 << SD_GESN_MEDIA_CLASS); 3452 3453 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 3454 3455 if ((rtn != 0) || !sd_gesn_media_data_valid(out_data_gesn)) { 3456 un->un_f_mmc_gesn_polling = FALSE; 3457 SD_INFO(SD_LOG_ATTACH_DETACH, un, 3458 "sd_set_mmc_caps: gesn not supported " 3459 "%d %x %x %x %x\n", rtn, 3460 out_data_gesn[0], out_data_gesn[1], 3461 out_data_gesn[2], out_data_gesn[3]); 3462 } 3463 3464 kmem_free(out_data_gesn, gesn_len); 3465 } 3466 3467 /* Get to the page data */ 3468 sense_mhp = (struct mode_header_grp2 *)buf; 3469 bd_len = (sense_mhp->bdesc_length_hi << 8) | 3470 sense_mhp->bdesc_length_lo; 3471 if (bd_len > MODE_BLK_DESC_LENGTH) { 3472 /* 3473 * We did not get back the expected block descriptor 3474 * length so we cannot determine if the device supports 3475 * CDDA. However, we still indicate the device is MMC 3476 * according to the successful response to the page 3477 * 0x2A mode sense request. 3478 */ 3479 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 3480 "sd_set_mmc_caps: Mode Sense returned " 3481 "invalid block descriptor length\n"); 3482 kmem_free(buf, BUFLEN_MODE_CDROM_CAP); 3483 return; 3484 } 3485 3486 /* See if read CDDA is supported */ 3487 sense_page = (uchar_t *)(buf + MODE_HEADER_LENGTH_GRP2 + 3488 bd_len); 3489 un->un_f_cfg_cdda = (sense_page[5] & 0x01) ? TRUE : FALSE; 3490 3491 /* See if writing DVD RAM is supported. */ 3492 un->un_f_dvdram_writable_device = (sense_page[3] & 0x20) ? TRUE : FALSE; 3493 if (un->un_f_dvdram_writable_device == TRUE) { 3494 kmem_free(buf, BUFLEN_MODE_CDROM_CAP); 3495 return; 3496 } 3497 3498 /* 3499 * If the device presents DVD or CD capabilities in the mode 3500 * page, we can return here since a RRD will not have 3501 * these capabilities. 3502 */ 3503 if ((sense_page[2] & 0x3f) || (sense_page[3] & 0x3f)) { 3504 kmem_free(buf, BUFLEN_MODE_CDROM_CAP); 3505 return; 3506 } 3507 kmem_free(buf, BUFLEN_MODE_CDROM_CAP); 3508 3509 /* 3510 * If un->un_f_dvdram_writable_device is still FALSE, 3511 * check for a Removable Rigid Disk (RRD). A RRD 3512 * device is identified by the features RANDOM_WRITABLE and 3513 * HARDWARE_DEFECT_MANAGEMENT. 3514 */ 3515 out_data_rw = kmem_zalloc(SD_CURRENT_FEATURE_LEN, KM_SLEEP); 3516 rqbuf_rw = kmem_zalloc(SENSE_LENGTH, KM_SLEEP); 3517 3518 rtn = sd_send_scsi_feature_GET_CONFIGURATION(ssc, &com, rqbuf_rw, 3519 SENSE_LENGTH, out_data_rw, SD_CURRENT_FEATURE_LEN, 3520 RANDOM_WRITABLE, SD_PATH_STANDARD); 3521 3522 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 3523 3524 if (rtn != 0) { 3525 kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN); 3526 kmem_free(rqbuf_rw, SENSE_LENGTH); 3527 return; 3528 } 3529 3530 out_data_hd = kmem_zalloc(SD_CURRENT_FEATURE_LEN, KM_SLEEP); 3531 rqbuf_hd = kmem_zalloc(SENSE_LENGTH, KM_SLEEP); 3532 3533 rtn = sd_send_scsi_feature_GET_CONFIGURATION(ssc, &com, rqbuf_hd, 3534 SENSE_LENGTH, out_data_hd, SD_CURRENT_FEATURE_LEN, 3535 HARDWARE_DEFECT_MANAGEMENT, SD_PATH_STANDARD); 3536 3537 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 3538 3539 if (rtn == 0) { 3540 /* 3541 * We have good information, check for random writable 3542 * and hardware defect features. 3543 */ 3544 if ((out_data_rw[9] & RANDOM_WRITABLE) && 3545 (out_data_hd[9] & HARDWARE_DEFECT_MANAGEMENT)) { 3546 un->un_f_dvdram_writable_device = TRUE; 3547 } 3548 } 3549 3550 kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN); 3551 kmem_free(rqbuf_rw, SENSE_LENGTH); 3552 kmem_free(out_data_hd, SD_CURRENT_FEATURE_LEN); 3553 kmem_free(rqbuf_hd, SENSE_LENGTH); 3554 } 3555 3556 /* 3557 * Function: sd_check_for_writable_cd 3558 * 3559 * Description: This routine determines if the media in the device is 3560 * writable or not. It uses the get configuration command (0x46) 3561 * to determine if the media is writable 3562 * 3563 * Arguments: un - driver soft state (unit) structure 3564 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" 3565 * chain and the normal command waitq, or 3566 * SD_PATH_DIRECT_PRIORITY to use the USCSI 3567 * "direct" chain and bypass the normal command 3568 * waitq. 3569 * 3570 * Context: Never called at interrupt context. 3571 */ 3572 3573 static void 3574 sd_check_for_writable_cd(sd_ssc_t *ssc, int path_flag) 3575 { 3576 struct uscsi_cmd com; 3577 uchar_t *out_data; 3578 uchar_t *rqbuf; 3579 int rtn; 3580 uchar_t *out_data_rw, *out_data_hd; 3581 uchar_t *rqbuf_rw, *rqbuf_hd; 3582 struct mode_header_grp2 *sense_mhp; 3583 uchar_t *sense_page; 3584 caddr_t buf; 3585 int bd_len; 3586 int status; 3587 struct sd_lun *un; 3588 3589 ASSERT(ssc != NULL); 3590 un = ssc->ssc_un; 3591 ASSERT(un != NULL); 3592 ASSERT(mutex_owned(SD_MUTEX(un))); 3593 3594 /* 3595 * Initialize the writable media to false, if configuration info. 3596 * tells us otherwise then only we will set it. 3597 */ 3598 un->un_f_mmc_writable_media = FALSE; 3599 mutex_exit(SD_MUTEX(un)); 3600 3601 out_data = kmem_zalloc(SD_PROFILE_HEADER_LEN, KM_SLEEP); 3602 rqbuf = kmem_zalloc(SENSE_LENGTH, KM_SLEEP); 3603 3604 rtn = sd_send_scsi_GET_CONFIGURATION(ssc, &com, rqbuf, SENSE_LENGTH, 3605 out_data, SD_PROFILE_HEADER_LEN, path_flag); 3606 3607 if (rtn != 0) 3608 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 3609 3610 mutex_enter(SD_MUTEX(un)); 3611 if (rtn == 0) { 3612 /* 3613 * We have good information, check for writable DVD. 3614 */ 3615 if ((out_data[6] == 0) && (out_data[7] == 0x12)) { 3616 un->un_f_mmc_writable_media = TRUE; 3617 kmem_free(out_data, SD_PROFILE_HEADER_LEN); 3618 kmem_free(rqbuf, SENSE_LENGTH); 3619 return; 3620 } 3621 } 3622 3623 kmem_free(out_data, SD_PROFILE_HEADER_LEN); 3624 kmem_free(rqbuf, SENSE_LENGTH); 3625 3626 /* 3627 * Determine if this is a RRD type device. 3628 */ 3629 mutex_exit(SD_MUTEX(un)); 3630 buf = kmem_zalloc(BUFLEN_MODE_CDROM_CAP, KM_SLEEP); 3631 status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, (uchar_t *)buf, 3632 BUFLEN_MODE_CDROM_CAP, MODEPAGE_CDROM_CAP, path_flag); 3633 3634 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 3635 3636 mutex_enter(SD_MUTEX(un)); 3637 if (status != 0) { 3638 /* command failed; just return */ 3639 kmem_free(buf, BUFLEN_MODE_CDROM_CAP); 3640 return; 3641 } 3642 3643 /* Get to the page data */ 3644 sense_mhp = (struct mode_header_grp2 *)buf; 3645 bd_len = (sense_mhp->bdesc_length_hi << 8) | sense_mhp->bdesc_length_lo; 3646 if (bd_len > MODE_BLK_DESC_LENGTH) { 3647 /* 3648 * We did not get back the expected block descriptor length so 3649 * we cannot check the mode page. 3650 */ 3651 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 3652 "sd_check_for_writable_cd: Mode Sense returned " 3653 "invalid block descriptor length\n"); 3654 kmem_free(buf, BUFLEN_MODE_CDROM_CAP); 3655 return; 3656 } 3657 3658 /* 3659 * If the device presents DVD or CD capabilities in the mode 3660 * page, we can return here since a RRD device will not have 3661 * these capabilities. 3662 */ 3663 sense_page = (uchar_t *)(buf + MODE_HEADER_LENGTH_GRP2 + bd_len); 3664 if ((sense_page[2] & 0x3f) || (sense_page[3] & 0x3f)) { 3665 kmem_free(buf, BUFLEN_MODE_CDROM_CAP); 3666 return; 3667 } 3668 kmem_free(buf, BUFLEN_MODE_CDROM_CAP); 3669 3670 /* 3671 * If un->un_f_mmc_writable_media is still FALSE, 3672 * check for RRD type media. A RRD device is identified 3673 * by the features RANDOM_WRITABLE and HARDWARE_DEFECT_MANAGEMENT. 3674 */ 3675 mutex_exit(SD_MUTEX(un)); 3676 out_data_rw = kmem_zalloc(SD_CURRENT_FEATURE_LEN, KM_SLEEP); 3677 rqbuf_rw = kmem_zalloc(SENSE_LENGTH, KM_SLEEP); 3678 3679 rtn = sd_send_scsi_feature_GET_CONFIGURATION(ssc, &com, rqbuf_rw, 3680 SENSE_LENGTH, out_data_rw, SD_CURRENT_FEATURE_LEN, 3681 RANDOM_WRITABLE, path_flag); 3682 3683 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 3684 if (rtn != 0) { 3685 kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN); 3686 kmem_free(rqbuf_rw, SENSE_LENGTH); 3687 mutex_enter(SD_MUTEX(un)); 3688 return; 3689 } 3690 3691 out_data_hd = kmem_zalloc(SD_CURRENT_FEATURE_LEN, KM_SLEEP); 3692 rqbuf_hd = kmem_zalloc(SENSE_LENGTH, KM_SLEEP); 3693 3694 rtn = sd_send_scsi_feature_GET_CONFIGURATION(ssc, &com, rqbuf_hd, 3695 SENSE_LENGTH, out_data_hd, SD_CURRENT_FEATURE_LEN, 3696 HARDWARE_DEFECT_MANAGEMENT, path_flag); 3697 3698 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 3699 mutex_enter(SD_MUTEX(un)); 3700 if (rtn == 0) { 3701 /* 3702 * We have good information, check for random writable 3703 * and hardware defect features as current. 3704 */ 3705 if ((out_data_rw[9] & RANDOM_WRITABLE) && 3706 (out_data_rw[10] & 0x1) && 3707 (out_data_hd[9] & HARDWARE_DEFECT_MANAGEMENT) && 3708 (out_data_hd[10] & 0x1)) { 3709 un->un_f_mmc_writable_media = TRUE; 3710 } 3711 } 3712 3713 kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN); 3714 kmem_free(rqbuf_rw, SENSE_LENGTH); 3715 kmem_free(out_data_hd, SD_CURRENT_FEATURE_LEN); 3716 kmem_free(rqbuf_hd, SENSE_LENGTH); 3717 } 3718 3719 /* 3720 * Function: sd_read_unit_properties 3721 * 3722 * Description: The following implements a property lookup mechanism. 3723 * Properties for particular disks (keyed on vendor, model 3724 * and rev numbers) are sought in the sd.conf file via 3725 * sd_process_sdconf_file(), and if not found there, are 3726 * looked for in a list hardcoded in this driver via 3727 * sd_process_sdconf_table() Once located the properties 3728 * are used to update the driver unit structure. 3729 * 3730 * Arguments: un - driver soft state (unit) structure 3731 */ 3732 3733 static void 3734 sd_read_unit_properties(struct sd_lun *un) 3735 { 3736 /* 3737 * sd_process_sdconf_file returns SD_FAILURE if it cannot find 3738 * the "sd-config-list" property (from the sd.conf file) or if 3739 * there was not a match for the inquiry vid/pid. If this event 3740 * occurs the static driver configuration table is searched for 3741 * a match. 3742 */ 3743 ASSERT(un != NULL); 3744 if (sd_process_sdconf_file(un) == SD_FAILURE) { 3745 sd_process_sdconf_table(un); 3746 } 3747 3748 /* check for LSI device */ 3749 sd_is_lsi(un); 3750 3751 3752 } 3753 3754 3755 /* 3756 * Function: sd_process_sdconf_file 3757 * 3758 * Description: Use ddi_prop_lookup(9F) to obtain the properties from the 3759 * driver's config file (ie, sd.conf) and update the driver 3760 * soft state structure accordingly. 3761 * 3762 * Arguments: un - driver soft state (unit) structure 3763 * 3764 * Return Code: SD_SUCCESS - The properties were successfully set according 3765 * to the driver configuration file. 3766 * SD_FAILURE - The driver config list was not obtained or 3767 * there was no vid/pid match. This indicates that 3768 * the static config table should be used. 3769 * 3770 * The config file has a property, "sd-config-list". Currently we support 3771 * two kinds of formats. For both formats, the value of this property 3772 * is a list of duplets: 3773 * 3774 * sd-config-list= 3775 * <duplet>, 3776 * [,<duplet>]*; 3777 * 3778 * For the improved format, where 3779 * 3780 * <duplet>:= "<vid+pid>","<tunable-list>" 3781 * 3782 * and 3783 * 3784 * <tunable-list>:= <tunable> [, <tunable> ]*; 3785 * <tunable> = <name> : <value> 3786 * 3787 * The <vid+pid> is the string that is returned by the target device on a 3788 * SCSI inquiry command, the <tunable-list> contains one or more tunables 3789 * to apply to all target devices with the specified <vid+pid>. 3790 * 3791 * Each <tunable> is a "<name> : <value>" pair. 3792 * 3793 * For the old format, the structure of each duplet is as follows: 3794 * 3795 * <duplet>:= "<vid+pid>","<data-property-name_list>" 3796 * 3797 * The first entry of the duplet is the device ID string (the concatenated 3798 * vid & pid; not to be confused with a device_id). This is defined in 3799 * the same way as in the sd_disk_table. 3800 * 3801 * The second part of the duplet is a string that identifies a 3802 * data-property-name-list. The data-property-name-list is defined as 3803 * follows: 3804 * 3805 * <data-property-name-list>:=<data-property-name> [<data-property-name>] 3806 * 3807 * The syntax of <data-property-name> depends on the <version> field. 3808 * 3809 * If version = SD_CONF_VERSION_1 we have the following syntax: 3810 * 3811 * <data-property-name>:=<version>,<flags>,<prop0>,<prop1>,.....<propN> 3812 * 3813 * where the prop0 value will be used to set prop0 if bit0 set in the 3814 * flags, prop1 if bit1 set, etc. and N = SD_CONF_MAX_ITEMS -1 3815 * 3816 */ 3817 3818 static int 3819 sd_process_sdconf_file(struct sd_lun *un) 3820 { 3821 char **config_list = NULL; 3822 uint_t nelements; 3823 char *vidptr; 3824 int vidlen; 3825 char *dnlist_ptr; 3826 char *dataname_ptr; 3827 char *dataname_lasts; 3828 int *data_list = NULL; 3829 uint_t data_list_len; 3830 int rval = SD_FAILURE; 3831 int i; 3832 3833 ASSERT(un != NULL); 3834 3835 /* Obtain the configuration list associated with the .conf file */ 3836 if (ddi_prop_lookup_string_array(DDI_DEV_T_ANY, SD_DEVINFO(un), 3837 DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, sd_config_list, 3838 &config_list, &nelements) != DDI_PROP_SUCCESS) { 3839 return (SD_FAILURE); 3840 } 3841 3842 /* 3843 * Compare vids in each duplet to the inquiry vid - if a match is 3844 * made, get the data value and update the soft state structure 3845 * accordingly. 3846 * 3847 * Each duplet should show as a pair of strings, return SD_FAILURE 3848 * otherwise. 3849 */ 3850 if (nelements & 1) { 3851 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 3852 "sd-config-list should show as pairs of strings.\n"); 3853 if (config_list) 3854 ddi_prop_free(config_list); 3855 return (SD_FAILURE); 3856 } 3857 3858 for (i = 0; i < nelements; i += 2) { 3859 /* 3860 * Note: The assumption here is that each vid entry is on 3861 * a unique line from its associated duplet. 3862 */ 3863 vidptr = config_list[i]; 3864 vidlen = (int)strlen(vidptr); 3865 if (sd_sdconf_id_match(un, vidptr, vidlen) != SD_SUCCESS) { 3866 continue; 3867 } 3868 3869 /* 3870 * dnlist contains 1 or more blank separated 3871 * data-property-name entries 3872 */ 3873 dnlist_ptr = config_list[i + 1]; 3874 3875 if (strchr(dnlist_ptr, ':') != NULL) { 3876 /* 3877 * Decode the improved format sd-config-list. 3878 */ 3879 sd_nvpair_str_decode(un, dnlist_ptr); 3880 } else { 3881 /* 3882 * The old format sd-config-list, loop through all 3883 * data-property-name entries in the 3884 * data-property-name-list 3885 * setting the properties for each. 3886 */ 3887 for (dataname_ptr = sd_strtok_r(dnlist_ptr, " \t", 3888 &dataname_lasts); dataname_ptr != NULL; 3889 dataname_ptr = sd_strtok_r(NULL, " \t", 3890 &dataname_lasts)) { 3891 int version; 3892 3893 SD_INFO(SD_LOG_ATTACH_DETACH, un, 3894 "sd_process_sdconf_file: disk:%s, " 3895 "data:%s\n", vidptr, dataname_ptr); 3896 3897 /* Get the data list */ 3898 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, 3899 SD_DEVINFO(un), 0, dataname_ptr, &data_list, 3900 &data_list_len) != DDI_PROP_SUCCESS) { 3901 SD_INFO(SD_LOG_ATTACH_DETACH, un, 3902 "sd_process_sdconf_file: data " 3903 "property (%s) has no value\n", 3904 dataname_ptr); 3905 continue; 3906 } 3907 3908 version = data_list[0]; 3909 3910 if (version == SD_CONF_VERSION_1) { 3911 sd_tunables values; 3912 3913 /* Set the properties */ 3914 if (sd_chk_vers1_data(un, data_list[1], 3915 &data_list[2], data_list_len, 3916 dataname_ptr) == SD_SUCCESS) { 3917 sd_get_tunables_from_conf(un, 3918 data_list[1], &data_list[2], 3919 &values); 3920 sd_set_vers1_properties(un, 3921 data_list[1], &values); 3922 rval = SD_SUCCESS; 3923 } else { 3924 rval = SD_FAILURE; 3925 } 3926 } else { 3927 scsi_log(SD_DEVINFO(un), sd_label, 3928 CE_WARN, "data property %s version " 3929 "0x%x is invalid.", 3930 dataname_ptr, version); 3931 rval = SD_FAILURE; 3932 } 3933 if (data_list) 3934 ddi_prop_free(data_list); 3935 } 3936 } 3937 } 3938 3939 /* free up the memory allocated by ddi_prop_lookup_string_array(). */ 3940 if (config_list) { 3941 ddi_prop_free(config_list); 3942 } 3943 3944 return (rval); 3945 } 3946 3947 /* 3948 * Function: sd_nvpair_str_decode() 3949 * 3950 * Description: Parse the improved format sd-config-list to get 3951 * each entry of tunable, which includes a name-value pair. 3952 * Then call sd_set_properties() to set the property. 3953 * 3954 * Arguments: un - driver soft state (unit) structure 3955 * nvpair_str - the tunable list 3956 */ 3957 static void 3958 sd_nvpair_str_decode(struct sd_lun *un, char *nvpair_str) 3959 { 3960 char *nv, *name, *value, *token; 3961 char *nv_lasts, *v_lasts, *x_lasts; 3962 3963 for (nv = sd_strtok_r(nvpair_str, ",", &nv_lasts); nv != NULL; 3964 nv = sd_strtok_r(NULL, ",", &nv_lasts)) { 3965 token = sd_strtok_r(nv, ":", &v_lasts); 3966 name = sd_strtok_r(token, " \t", &x_lasts); 3967 token = sd_strtok_r(NULL, ":", &v_lasts); 3968 value = sd_strtok_r(token, " \t", &x_lasts); 3969 if (name == NULL || value == NULL) { 3970 SD_INFO(SD_LOG_ATTACH_DETACH, un, 3971 "sd_nvpair_str_decode: " 3972 "name or value is not valid!\n"); 3973 } else { 3974 sd_set_properties(un, name, value); 3975 } 3976 } 3977 } 3978 3979 /* 3980 * Function: sd_strtok_r() 3981 * 3982 * Description: This function uses strpbrk and strspn to break 3983 * string into tokens on sequentially subsequent calls. Return 3984 * NULL when no non-separator characters remain. The first 3985 * argument is NULL for subsequent calls. 3986 */ 3987 static char * 3988 sd_strtok_r(char *string, const char *sepset, char **lasts) 3989 { 3990 char *q, *r; 3991 3992 /* First or subsequent call */ 3993 if (string == NULL) 3994 string = *lasts; 3995 3996 if (string == NULL) 3997 return (NULL); 3998 3999 /* Skip leading separators */ 4000 q = string + strspn(string, sepset); 4001 4002 if (*q == '\0') 4003 return (NULL); 4004 4005 if ((r = strpbrk(q, sepset)) == NULL) 4006 *lasts = NULL; 4007 else { 4008 *r = '\0'; 4009 *lasts = r + 1; 4010 } 4011 return (q); 4012 } 4013 4014 /* 4015 * Function: sd_set_properties() 4016 * 4017 * Description: Set device properties based on the improved 4018 * format sd-config-list. 4019 * 4020 * Arguments: un - driver soft state (unit) structure 4021 * name - supported tunable name 4022 * value - tunable value 4023 */ 4024 static void 4025 sd_set_properties(struct sd_lun *un, char *name, char *value) 4026 { 4027 char *endptr = NULL; 4028 long val = 0; 4029 4030 if (strcasecmp(name, "cache-nonvolatile") == 0) { 4031 if (strcasecmp(value, "true") == 0) { 4032 un->un_f_suppress_cache_flush = TRUE; 4033 } else if (strcasecmp(value, "false") == 0) { 4034 un->un_f_suppress_cache_flush = FALSE; 4035 } else { 4036 goto value_invalid; 4037 } 4038 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4039 "suppress_cache_flush flag set to %d\n", 4040 un->un_f_suppress_cache_flush); 4041 return; 4042 } 4043 4044 if (strcasecmp(name, "controller-type") == 0) { 4045 if (ddi_strtol(value, &endptr, 0, &val) == 0) { 4046 un->un_ctype = val; 4047 } else { 4048 goto value_invalid; 4049 } 4050 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4051 "ctype set to %d\n", un->un_ctype); 4052 return; 4053 } 4054 4055 if (strcasecmp(name, "delay-busy") == 0) { 4056 if (ddi_strtol(value, &endptr, 0, &val) == 0) { 4057 un->un_busy_timeout = drv_usectohz(val / 1000); 4058 } else { 4059 goto value_invalid; 4060 } 4061 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4062 "busy_timeout set to %d\n", un->un_busy_timeout); 4063 return; 4064 } 4065 4066 if (strcasecmp(name, "disksort") == 0) { 4067 if (strcasecmp(value, "true") == 0) { 4068 un->un_f_disksort_disabled = FALSE; 4069 } else if (strcasecmp(value, "false") == 0) { 4070 un->un_f_disksort_disabled = TRUE; 4071 } else { 4072 goto value_invalid; 4073 } 4074 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4075 "disksort disabled flag set to %d\n", 4076 un->un_f_disksort_disabled); 4077 return; 4078 } 4079 4080 if (strcasecmp(name, "power-condition") == 0) { 4081 if (strcasecmp(value, "true") == 0) { 4082 un->un_f_power_condition_disabled = FALSE; 4083 } else if (strcasecmp(value, "false") == 0) { 4084 un->un_f_power_condition_disabled = TRUE; 4085 } else { 4086 goto value_invalid; 4087 } 4088 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4089 "power condition disabled flag set to %d\n", 4090 un->un_f_power_condition_disabled); 4091 return; 4092 } 4093 4094 if (strcasecmp(name, "timeout-releasereservation") == 0) { 4095 if (ddi_strtol(value, &endptr, 0, &val) == 0) { 4096 un->un_reserve_release_time = val; 4097 } else { 4098 goto value_invalid; 4099 } 4100 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4101 "reservation release timeout set to %d\n", 4102 un->un_reserve_release_time); 4103 return; 4104 } 4105 4106 if (strcasecmp(name, "reset-lun") == 0) { 4107 if (strcasecmp(value, "true") == 0) { 4108 un->un_f_lun_reset_enabled = TRUE; 4109 } else if (strcasecmp(value, "false") == 0) { 4110 un->un_f_lun_reset_enabled = FALSE; 4111 } else { 4112 goto value_invalid; 4113 } 4114 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4115 "lun reset enabled flag set to %d\n", 4116 un->un_f_lun_reset_enabled); 4117 return; 4118 } 4119 4120 if (strcasecmp(name, "retries-busy") == 0) { 4121 if (ddi_strtol(value, &endptr, 0, &val) == 0) { 4122 un->un_busy_retry_count = val; 4123 } else { 4124 goto value_invalid; 4125 } 4126 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4127 "busy retry count set to %d\n", un->un_busy_retry_count); 4128 return; 4129 } 4130 4131 if (strcasecmp(name, "retries-timeout") == 0) { 4132 if (ddi_strtol(value, &endptr, 0, &val) == 0) { 4133 un->un_retry_count = val; 4134 } else { 4135 goto value_invalid; 4136 } 4137 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4138 "timeout retry count set to %d\n", un->un_retry_count); 4139 return; 4140 } 4141 4142 if (strcasecmp(name, "retries-notready") == 0) { 4143 if (ddi_strtol(value, &endptr, 0, &val) == 0) { 4144 un->un_notready_retry_count = val; 4145 } else { 4146 goto value_invalid; 4147 } 4148 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4149 "notready retry count set to %d\n", 4150 un->un_notready_retry_count); 4151 return; 4152 } 4153 4154 if (strcasecmp(name, "retries-reset") == 0) { 4155 if (ddi_strtol(value, &endptr, 0, &val) == 0) { 4156 un->un_reset_retry_count = val; 4157 } else { 4158 goto value_invalid; 4159 } 4160 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4161 "reset retry count set to %d\n", 4162 un->un_reset_retry_count); 4163 return; 4164 } 4165 4166 if (strcasecmp(name, "throttle-max") == 0) { 4167 if (ddi_strtol(value, &endptr, 0, &val) == 0) { 4168 un->un_saved_throttle = un->un_throttle = val; 4169 } else { 4170 goto value_invalid; 4171 } 4172 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4173 "throttle set to %d\n", un->un_throttle); 4174 } 4175 4176 if (strcasecmp(name, "throttle-min") == 0) { 4177 if (ddi_strtol(value, &endptr, 0, &val) == 0) { 4178 un->un_min_throttle = val; 4179 } else { 4180 goto value_invalid; 4181 } 4182 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4183 "min throttle set to %d\n", un->un_min_throttle); 4184 } 4185 4186 if (strcasecmp(name, "rmw-type") == 0) { 4187 if (ddi_strtol(value, &endptr, 0, &val) == 0) { 4188 un->un_f_rmw_type = val; 4189 } else { 4190 goto value_invalid; 4191 } 4192 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4193 "RMW type set to %d\n", un->un_f_rmw_type); 4194 } 4195 4196 if (strcasecmp(name, "physical-block-size") == 0) { 4197 if (ddi_strtol(value, &endptr, 0, &val) == 0 && 4198 ISP2(val) && val >= un->un_tgt_blocksize && 4199 val >= un->un_sys_blocksize) { 4200 un->un_phy_blocksize = val; 4201 } else { 4202 goto value_invalid; 4203 } 4204 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4205 "physical block size set to %d\n", un->un_phy_blocksize); 4206 } 4207 4208 if (strcasecmp(name, "retries-victim") == 0) { 4209 if (ddi_strtol(value, &endptr, 0, &val) == 0) { 4210 un->un_victim_retry_count = val; 4211 } else { 4212 goto value_invalid; 4213 } 4214 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4215 "victim retry count set to %d\n", 4216 un->un_victim_retry_count); 4217 return; 4218 } 4219 4220 /* 4221 * Validate the throttle values. 4222 * If any of the numbers are invalid, set everything to defaults. 4223 */ 4224 if ((un->un_throttle < SD_LOWEST_VALID_THROTTLE) || 4225 (un->un_min_throttle < SD_LOWEST_VALID_THROTTLE) || 4226 (un->un_min_throttle > un->un_throttle)) { 4227 un->un_saved_throttle = un->un_throttle = sd_max_throttle; 4228 un->un_min_throttle = sd_min_throttle; 4229 } 4230 4231 if (strcasecmp(name, "mmc-gesn-polling") == 0) { 4232 if (strcasecmp(value, "true") == 0) { 4233 un->un_f_mmc_gesn_polling = TRUE; 4234 } else if (strcasecmp(value, "false") == 0) { 4235 un->un_f_mmc_gesn_polling = FALSE; 4236 } else { 4237 goto value_invalid; 4238 } 4239 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4240 "mmc-gesn-polling set to %d\n", 4241 un->un_f_mmc_gesn_polling); 4242 } 4243 4244 return; 4245 4246 value_invalid: 4247 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " 4248 "value of prop %s is invalid\n", name); 4249 } 4250 4251 /* 4252 * Function: sd_get_tunables_from_conf() 4253 * 4254 * 4255 * This function reads the data list from the sd.conf file and pulls 4256 * the values that can have numeric values as arguments and places 4257 * the values in the appropriate sd_tunables member. 4258 * Since the order of the data list members varies across platforms 4259 * This function reads them from the data list in a platform specific 4260 * order and places them into the correct sd_tunable member that is 4261 * consistent across all platforms. 4262 */ 4263 static void 4264 sd_get_tunables_from_conf(struct sd_lun *un, int flags, int *data_list, 4265 sd_tunables *values) 4266 { 4267 int i; 4268 int mask; 4269 4270 bzero(values, sizeof (sd_tunables)); 4271 4272 for (i = 0; i < SD_CONF_MAX_ITEMS; i++) { 4273 4274 mask = 1 << i; 4275 if (mask > flags) { 4276 break; 4277 } 4278 4279 switch (mask & flags) { 4280 case 0: /* This mask bit not set in flags */ 4281 continue; 4282 case SD_CONF_BSET_THROTTLE: 4283 values->sdt_throttle = data_list[i]; 4284 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4285 "sd_get_tunables_from_conf: throttle = %d\n", 4286 values->sdt_throttle); 4287 break; 4288 case SD_CONF_BSET_CTYPE: 4289 values->sdt_ctype = data_list[i]; 4290 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4291 "sd_get_tunables_from_conf: ctype = %d\n", 4292 values->sdt_ctype); 4293 break; 4294 case SD_CONF_BSET_NRR_COUNT: 4295 values->sdt_not_rdy_retries = data_list[i]; 4296 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4297 "sd_get_tunables_from_conf: not_rdy_retries = %d\n", 4298 values->sdt_not_rdy_retries); 4299 break; 4300 case SD_CONF_BSET_BSY_RETRY_COUNT: 4301 values->sdt_busy_retries = data_list[i]; 4302 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4303 "sd_get_tunables_from_conf: busy_retries = %d\n", 4304 values->sdt_busy_retries); 4305 break; 4306 case SD_CONF_BSET_RST_RETRIES: 4307 values->sdt_reset_retries = data_list[i]; 4308 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4309 "sd_get_tunables_from_conf: reset_retries = %d\n", 4310 values->sdt_reset_retries); 4311 break; 4312 case SD_CONF_BSET_RSV_REL_TIME: 4313 values->sdt_reserv_rel_time = data_list[i]; 4314 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4315 "sd_get_tunables_from_conf: reserv_rel_time = %d\n", 4316 values->sdt_reserv_rel_time); 4317 break; 4318 case SD_CONF_BSET_MIN_THROTTLE: 4319 values->sdt_min_throttle = data_list[i]; 4320 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4321 "sd_get_tunables_from_conf: min_throttle = %d\n", 4322 values->sdt_min_throttle); 4323 break; 4324 case SD_CONF_BSET_DISKSORT_DISABLED: 4325 values->sdt_disk_sort_dis = data_list[i]; 4326 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4327 "sd_get_tunables_from_conf: disk_sort_dis = %d\n", 4328 values->sdt_disk_sort_dis); 4329 break; 4330 case SD_CONF_BSET_LUN_RESET_ENABLED: 4331 values->sdt_lun_reset_enable = data_list[i]; 4332 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4333 "sd_get_tunables_from_conf: lun_reset_enable = %d" 4334 "\n", values->sdt_lun_reset_enable); 4335 break; 4336 case SD_CONF_BSET_CACHE_IS_NV: 4337 values->sdt_suppress_cache_flush = data_list[i]; 4338 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4339 "sd_get_tunables_from_conf: \ 4340 suppress_cache_flush = %d" 4341 "\n", values->sdt_suppress_cache_flush); 4342 break; 4343 case SD_CONF_BSET_PC_DISABLED: 4344 values->sdt_disk_sort_dis = data_list[i]; 4345 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4346 "sd_get_tunables_from_conf: power_condition_dis = " 4347 "%d\n", values->sdt_power_condition_dis); 4348 break; 4349 } 4350 } 4351 } 4352 4353 /* 4354 * Function: sd_process_sdconf_table 4355 * 4356 * Description: Search the static configuration table for a match on the 4357 * inquiry vid/pid and update the driver soft state structure 4358 * according to the table property values for the device. 4359 * 4360 * The form of a configuration table entry is: 4361 * <vid+pid>,<flags>,<property-data> 4362 * "SEAGATE ST42400N",1,0x40000, 4363 * 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1; 4364 * 4365 * Arguments: un - driver soft state (unit) structure 4366 */ 4367 4368 static void 4369 sd_process_sdconf_table(struct sd_lun *un) 4370 { 4371 char *id = NULL; 4372 int table_index; 4373 int idlen; 4374 4375 ASSERT(un != NULL); 4376 for (table_index = 0; table_index < sd_disk_table_size; 4377 table_index++) { 4378 id = sd_disk_table[table_index].device_id; 4379 idlen = strlen(id); 4380 4381 /* 4382 * The static configuration table currently does not 4383 * implement version 10 properties. Additionally, 4384 * multiple data-property-name entries are not 4385 * implemented in the static configuration table. 4386 */ 4387 if (sd_sdconf_id_match(un, id, idlen) == SD_SUCCESS) { 4388 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4389 "sd_process_sdconf_table: disk %s\n", id); 4390 sd_set_vers1_properties(un, 4391 sd_disk_table[table_index].flags, 4392 sd_disk_table[table_index].properties); 4393 break; 4394 } 4395 } 4396 } 4397 4398 4399 /* 4400 * Function: sd_sdconf_id_match 4401 * 4402 * Description: This local function implements a case sensitive vid/pid 4403 * comparison as well as the boundary cases of wild card and 4404 * multiple blanks. 4405 * 4406 * Note: An implicit assumption made here is that the scsi 4407 * inquiry structure will always keep the vid, pid and 4408 * revision strings in consecutive sequence, so they can be 4409 * read as a single string. If this assumption is not the 4410 * case, a separate string, to be used for the check, needs 4411 * to be built with these strings concatenated. 4412 * 4413 * Arguments: un - driver soft state (unit) structure 4414 * id - table or config file vid/pid 4415 * idlen - length of the vid/pid (bytes) 4416 * 4417 * Return Code: SD_SUCCESS - Indicates a match with the inquiry vid/pid 4418 * SD_FAILURE - Indicates no match with the inquiry vid/pid 4419 */ 4420 4421 static int 4422 sd_sdconf_id_match(struct sd_lun *un, char *id, int idlen) 4423 { 4424 struct scsi_inquiry *sd_inq; 4425 int rval = SD_SUCCESS; 4426 4427 ASSERT(un != NULL); 4428 sd_inq = un->un_sd->sd_inq; 4429 ASSERT(id != NULL); 4430 4431 /* 4432 * We use the inq_vid as a pointer to a buffer containing the 4433 * vid and pid and use the entire vid/pid length of the table 4434 * entry for the comparison. This works because the inq_pid 4435 * data member follows inq_vid in the scsi_inquiry structure. 4436 */ 4437 if (strncasecmp(sd_inq->inq_vid, id, idlen) != 0) { 4438 /* 4439 * The user id string is compared to the inquiry vid/pid 4440 * using a case insensitive comparison and ignoring 4441 * multiple spaces. 4442 */ 4443 rval = sd_blank_cmp(un, id, idlen); 4444 if (rval != SD_SUCCESS) { 4445 /* 4446 * User id strings that start and end with a "*" 4447 * are a special case. These do not have a 4448 * specific vendor, and the product string can 4449 * appear anywhere in the 16 byte PID portion of 4450 * the inquiry data. This is a simple strstr() 4451 * type search for the user id in the inquiry data. 4452 */ 4453 if ((id[0] == '*') && (id[idlen - 1] == '*')) { 4454 char *pidptr = &id[1]; 4455 int i; 4456 int j; 4457 int pidstrlen = idlen - 2; 4458 j = sizeof (SD_INQUIRY(un)->inq_pid) - 4459 pidstrlen; 4460 4461 if (j < 0) { 4462 return (SD_FAILURE); 4463 } 4464 for (i = 0; i < j; i++) { 4465 if (bcmp(&SD_INQUIRY(un)->inq_pid[i], 4466 pidptr, pidstrlen) == 0) { 4467 rval = SD_SUCCESS; 4468 break; 4469 } 4470 } 4471 } 4472 } 4473 } 4474 return (rval); 4475 } 4476 4477 4478 /* 4479 * Function: sd_blank_cmp 4480 * 4481 * Description: If the id string starts and ends with a space, treat 4482 * multiple consecutive spaces as equivalent to a single 4483 * space. For example, this causes a sd_disk_table entry 4484 * of " NEC CDROM " to match a device's id string of 4485 * "NEC CDROM". 4486 * 4487 * Note: The success exit condition for this routine is if 4488 * the pointer to the table entry is '\0' and the cnt of 4489 * the inquiry length is zero. This will happen if the inquiry 4490 * string returned by the device is padded with spaces to be 4491 * exactly 24 bytes in length (8 byte vid + 16 byte pid). The 4492 * SCSI spec states that the inquiry string is to be padded with 4493 * spaces. 4494 * 4495 * Arguments: un - driver soft state (unit) structure 4496 * id - table or config file vid/pid 4497 * idlen - length of the vid/pid (bytes) 4498 * 4499 * Return Code: SD_SUCCESS - Indicates a match with the inquiry vid/pid 4500 * SD_FAILURE - Indicates no match with the inquiry vid/pid 4501 */ 4502 4503 static int 4504 sd_blank_cmp(struct sd_lun *un, char *id, int idlen) 4505 { 4506 char *p1; 4507 char *p2; 4508 int cnt; 4509 cnt = sizeof (SD_INQUIRY(un)->inq_vid) + 4510 sizeof (SD_INQUIRY(un)->inq_pid); 4511 4512 ASSERT(un != NULL); 4513 p2 = un->un_sd->sd_inq->inq_vid; 4514 ASSERT(id != NULL); 4515 p1 = id; 4516 4517 if ((id[0] == ' ') && (id[idlen - 1] == ' ')) { 4518 /* 4519 * Note: string p1 is terminated by a NUL but string p2 4520 * isn't. The end of p2 is determined by cnt. 4521 */ 4522 for (;;) { 4523 /* skip over any extra blanks in both strings */ 4524 while ((*p1 != '\0') && (*p1 == ' ')) { 4525 p1++; 4526 } 4527 while ((cnt != 0) && (*p2 == ' ')) { 4528 p2++; 4529 cnt--; 4530 } 4531 4532 /* compare the two strings */ 4533 if ((cnt == 0) || 4534 (SD_TOUPPER(*p1) != SD_TOUPPER(*p2))) { 4535 break; 4536 } 4537 while ((cnt > 0) && 4538 (SD_TOUPPER(*p1) == SD_TOUPPER(*p2))) { 4539 p1++; 4540 p2++; 4541 cnt--; 4542 } 4543 } 4544 } 4545 4546 /* return SD_SUCCESS if both strings match */ 4547 return (((*p1 == '\0') && (cnt == 0)) ? SD_SUCCESS : SD_FAILURE); 4548 } 4549 4550 4551 /* 4552 * Function: sd_chk_vers1_data 4553 * 4554 * Description: Verify the version 1 device properties provided by the 4555 * user via the configuration file 4556 * 4557 * Arguments: un - driver soft state (unit) structure 4558 * flags - integer mask indicating properties to be set 4559 * prop_list - integer list of property values 4560 * list_len - number of the elements 4561 * 4562 * Return Code: SD_SUCCESS - Indicates the user provided data is valid 4563 * SD_FAILURE - Indicates the user provided data is invalid 4564 */ 4565 4566 static int 4567 sd_chk_vers1_data(struct sd_lun *un, int flags, int *prop_list, 4568 int list_len, char *dataname_ptr) 4569 { 4570 int i; 4571 int mask = 1; 4572 int index = 0; 4573 4574 ASSERT(un != NULL); 4575 4576 /* Check for a NULL property name and list */ 4577 if (dataname_ptr == NULL) { 4578 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 4579 "sd_chk_vers1_data: NULL data property name."); 4580 return (SD_FAILURE); 4581 } 4582 if (prop_list == NULL) { 4583 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 4584 "sd_chk_vers1_data: %s NULL data property list.", 4585 dataname_ptr); 4586 return (SD_FAILURE); 4587 } 4588 4589 /* Display a warning if undefined bits are set in the flags */ 4590 if (flags & ~SD_CONF_BIT_MASK) { 4591 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 4592 "sd_chk_vers1_data: invalid bits 0x%x in data list %s. " 4593 "Properties not set.", 4594 (flags & ~SD_CONF_BIT_MASK), dataname_ptr); 4595 return (SD_FAILURE); 4596 } 4597 4598 /* 4599 * Verify the length of the list by identifying the highest bit set 4600 * in the flags and validating that the property list has a length 4601 * up to the index of this bit. 4602 */ 4603 for (i = 0; i < SD_CONF_MAX_ITEMS; i++) { 4604 if (flags & mask) { 4605 index++; 4606 } 4607 mask = 1 << i; 4608 } 4609 if (list_len < (index + 2)) { 4610 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 4611 "sd_chk_vers1_data: " 4612 "Data property list %s size is incorrect. " 4613 "Properties not set.", dataname_ptr); 4614 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, "Size expected: " 4615 "version + 1 flagword + %d properties", SD_CONF_MAX_ITEMS); 4616 return (SD_FAILURE); 4617 } 4618 return (SD_SUCCESS); 4619 } 4620 4621 4622 /* 4623 * Function: sd_set_vers1_properties 4624 * 4625 * Description: Set version 1 device properties based on a property list 4626 * retrieved from the driver configuration file or static 4627 * configuration table. Version 1 properties have the format: 4628 * 4629 * <data-property-name>:=<version>,<flags>,<prop0>,<prop1>,.....<propN> 4630 * 4631 * where the prop0 value will be used to set prop0 if bit0 4632 * is set in the flags 4633 * 4634 * Arguments: un - driver soft state (unit) structure 4635 * flags - integer mask indicating properties to be set 4636 * prop_list - integer list of property values 4637 */ 4638 4639 static void 4640 sd_set_vers1_properties(struct sd_lun *un, int flags, sd_tunables *prop_list) 4641 { 4642 ASSERT(un != NULL); 4643 4644 /* 4645 * Set the flag to indicate cache is to be disabled. An attempt 4646 * to disable the cache via sd_cache_control() will be made 4647 * later during attach once the basic initialization is complete. 4648 */ 4649 if (flags & SD_CONF_BSET_NOCACHE) { 4650 un->un_f_opt_disable_cache = TRUE; 4651 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4652 "sd_set_vers1_properties: caching disabled flag set\n"); 4653 } 4654 4655 /* CD-specific configuration parameters */ 4656 if (flags & SD_CONF_BSET_PLAYMSF_BCD) { 4657 un->un_f_cfg_playmsf_bcd = TRUE; 4658 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4659 "sd_set_vers1_properties: playmsf_bcd set\n"); 4660 } 4661 if (flags & SD_CONF_BSET_READSUB_BCD) { 4662 un->un_f_cfg_readsub_bcd = TRUE; 4663 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4664 "sd_set_vers1_properties: readsub_bcd set\n"); 4665 } 4666 if (flags & SD_CONF_BSET_READ_TOC_TRK_BCD) { 4667 un->un_f_cfg_read_toc_trk_bcd = TRUE; 4668 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4669 "sd_set_vers1_properties: read_toc_trk_bcd set\n"); 4670 } 4671 if (flags & SD_CONF_BSET_READ_TOC_ADDR_BCD) { 4672 un->un_f_cfg_read_toc_addr_bcd = TRUE; 4673 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4674 "sd_set_vers1_properties: read_toc_addr_bcd set\n"); 4675 } 4676 if (flags & SD_CONF_BSET_NO_READ_HEADER) { 4677 un->un_f_cfg_no_read_header = TRUE; 4678 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4679 "sd_set_vers1_properties: no_read_header set\n"); 4680 } 4681 if (flags & SD_CONF_BSET_READ_CD_XD4) { 4682 un->un_f_cfg_read_cd_xd4 = TRUE; 4683 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4684 "sd_set_vers1_properties: read_cd_xd4 set\n"); 4685 } 4686 4687 /* Support for devices which do not have valid/unique serial numbers */ 4688 if (flags & SD_CONF_BSET_FAB_DEVID) { 4689 un->un_f_opt_fab_devid = TRUE; 4690 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4691 "sd_set_vers1_properties: fab_devid bit set\n"); 4692 } 4693 4694 /* Support for user throttle configuration */ 4695 if (flags & SD_CONF_BSET_THROTTLE) { 4696 ASSERT(prop_list != NULL); 4697 un->un_saved_throttle = un->un_throttle = 4698 prop_list->sdt_throttle; 4699 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4700 "sd_set_vers1_properties: throttle set to %d\n", 4701 prop_list->sdt_throttle); 4702 } 4703 4704 /* Set the per disk retry count according to the conf file or table. */ 4705 if (flags & SD_CONF_BSET_NRR_COUNT) { 4706 ASSERT(prop_list != NULL); 4707 if (prop_list->sdt_not_rdy_retries) { 4708 un->un_notready_retry_count = 4709 prop_list->sdt_not_rdy_retries; 4710 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4711 "sd_set_vers1_properties: not ready retry count" 4712 " set to %d\n", un->un_notready_retry_count); 4713 } 4714 } 4715 4716 /* The controller type is reported for generic disk driver ioctls */ 4717 if (flags & SD_CONF_BSET_CTYPE) { 4718 ASSERT(prop_list != NULL); 4719 switch (prop_list->sdt_ctype) { 4720 case CTYPE_CDROM: 4721 un->un_ctype = prop_list->sdt_ctype; 4722 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4723 "sd_set_vers1_properties: ctype set to " 4724 "CTYPE_CDROM\n"); 4725 break; 4726 case CTYPE_CCS: 4727 un->un_ctype = prop_list->sdt_ctype; 4728 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4729 "sd_set_vers1_properties: ctype set to " 4730 "CTYPE_CCS\n"); 4731 break; 4732 case CTYPE_ROD: /* RW optical */ 4733 un->un_ctype = prop_list->sdt_ctype; 4734 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4735 "sd_set_vers1_properties: ctype set to " 4736 "CTYPE_ROD\n"); 4737 break; 4738 default: 4739 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 4740 "sd_set_vers1_properties: Could not set " 4741 "invalid ctype value (%d)", 4742 prop_list->sdt_ctype); 4743 } 4744 } 4745 4746 /* Purple failover timeout */ 4747 if (flags & SD_CONF_BSET_BSY_RETRY_COUNT) { 4748 ASSERT(prop_list != NULL); 4749 un->un_busy_retry_count = 4750 prop_list->sdt_busy_retries; 4751 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4752 "sd_set_vers1_properties: " 4753 "busy retry count set to %d\n", 4754 un->un_busy_retry_count); 4755 } 4756 4757 /* Purple reset retry count */ 4758 if (flags & SD_CONF_BSET_RST_RETRIES) { 4759 ASSERT(prop_list != NULL); 4760 un->un_reset_retry_count = 4761 prop_list->sdt_reset_retries; 4762 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4763 "sd_set_vers1_properties: " 4764 "reset retry count set to %d\n", 4765 un->un_reset_retry_count); 4766 } 4767 4768 /* Purple reservation release timeout */ 4769 if (flags & SD_CONF_BSET_RSV_REL_TIME) { 4770 ASSERT(prop_list != NULL); 4771 un->un_reserve_release_time = 4772 prop_list->sdt_reserv_rel_time; 4773 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4774 "sd_set_vers1_properties: " 4775 "reservation release timeout set to %d\n", 4776 un->un_reserve_release_time); 4777 } 4778 4779 /* 4780 * Driver flag telling the driver to verify that no commands are pending 4781 * for a device before issuing a Test Unit Ready. This is a workaround 4782 * for a firmware bug in some Seagate eliteI drives. 4783 */ 4784 if (flags & SD_CONF_BSET_TUR_CHECK) { 4785 un->un_f_cfg_tur_check = TRUE; 4786 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4787 "sd_set_vers1_properties: tur queue check set\n"); 4788 } 4789 4790 if (flags & SD_CONF_BSET_MIN_THROTTLE) { 4791 un->un_min_throttle = prop_list->sdt_min_throttle; 4792 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4793 "sd_set_vers1_properties: min throttle set to %d\n", 4794 un->un_min_throttle); 4795 } 4796 4797 if (flags & SD_CONF_BSET_DISKSORT_DISABLED) { 4798 un->un_f_disksort_disabled = 4799 (prop_list->sdt_disk_sort_dis != 0) ? 4800 TRUE : FALSE; 4801 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4802 "sd_set_vers1_properties: disksort disabled " 4803 "flag set to %d\n", 4804 prop_list->sdt_disk_sort_dis); 4805 } 4806 4807 if (flags & SD_CONF_BSET_LUN_RESET_ENABLED) { 4808 un->un_f_lun_reset_enabled = 4809 (prop_list->sdt_lun_reset_enable != 0) ? 4810 TRUE : FALSE; 4811 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4812 "sd_set_vers1_properties: lun reset enabled " 4813 "flag set to %d\n", 4814 prop_list->sdt_lun_reset_enable); 4815 } 4816 4817 if (flags & SD_CONF_BSET_CACHE_IS_NV) { 4818 un->un_f_suppress_cache_flush = 4819 (prop_list->sdt_suppress_cache_flush != 0) ? 4820 TRUE : FALSE; 4821 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4822 "sd_set_vers1_properties: suppress_cache_flush " 4823 "flag set to %d\n", 4824 prop_list->sdt_suppress_cache_flush); 4825 } 4826 4827 if (flags & SD_CONF_BSET_PC_DISABLED) { 4828 un->un_f_power_condition_disabled = 4829 (prop_list->sdt_power_condition_dis != 0) ? 4830 TRUE : FALSE; 4831 SD_INFO(SD_LOG_ATTACH_DETACH, un, 4832 "sd_set_vers1_properties: power_condition_disabled " 4833 "flag set to %d\n", 4834 prop_list->sdt_power_condition_dis); 4835 } 4836 4837 /* 4838 * Validate the throttle values. 4839 * If any of the numbers are invalid, set everything to defaults. 4840 */ 4841 if ((un->un_throttle < SD_LOWEST_VALID_THROTTLE) || 4842 (un->un_min_throttle < SD_LOWEST_VALID_THROTTLE) || 4843 (un->un_min_throttle > un->un_throttle)) { 4844 un->un_saved_throttle = un->un_throttle = sd_max_throttle; 4845 un->un_min_throttle = sd_min_throttle; 4846 } 4847 } 4848 4849 /* 4850 * Function: sd_is_lsi() 4851 * 4852 * Description: Check for lsi devices, step through the static device 4853 * table to match vid/pid. 4854 * 4855 * Args: un - ptr to sd_lun 4856 * 4857 * Notes: When creating new LSI property, need to add the new LSI property 4858 * to this function. 4859 */ 4860 static void 4861 sd_is_lsi(struct sd_lun *un) 4862 { 4863 char *id = NULL; 4864 int table_index; 4865 int idlen; 4866 void *prop; 4867 4868 ASSERT(un != NULL); 4869 for (table_index = 0; table_index < sd_disk_table_size; 4870 table_index++) { 4871 id = sd_disk_table[table_index].device_id; 4872 idlen = strlen(id); 4873 if (idlen == 0) { 4874 continue; 4875 } 4876 4877 if (sd_sdconf_id_match(un, id, idlen) == SD_SUCCESS) { 4878 prop = sd_disk_table[table_index].properties; 4879 if (prop == &lsi_properties || 4880 prop == &lsi_oem_properties || 4881 prop == &lsi_properties_scsi || 4882 prop == &symbios_properties) { 4883 un->un_f_cfg_is_lsi = TRUE; 4884 } 4885 break; 4886 } 4887 } 4888 } 4889 4890 /* 4891 * Function: sd_get_physical_geometry 4892 * 4893 * Description: Retrieve the MODE SENSE page 3 (Format Device Page) and 4894 * MODE SENSE page 4 (Rigid Disk Drive Geometry Page) from the 4895 * target, and use this information to initialize the physical 4896 * geometry cache specified by pgeom_p. 4897 * 4898 * MODE SENSE is an optional command, so failure in this case 4899 * does not necessarily denote an error. We want to use the 4900 * MODE SENSE commands to derive the physical geometry of the 4901 * device, but if either command fails, the logical geometry is 4902 * used as the fallback for disk label geometry in cmlb. 4903 * 4904 * This requires that un->un_blockcount and un->un_tgt_blocksize 4905 * have already been initialized for the current target and 4906 * that the current values be passed as args so that we don't 4907 * end up ever trying to use -1 as a valid value. This could 4908 * happen if either value is reset while we're not holding 4909 * the mutex. 4910 * 4911 * Arguments: un - driver soft state (unit) structure 4912 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 4913 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 4914 * to use the USCSI "direct" chain and bypass the normal 4915 * command waitq. 4916 * 4917 * Context: Kernel thread only (can sleep). 4918 */ 4919 4920 static int 4921 sd_get_physical_geometry(struct sd_lun *un, cmlb_geom_t *pgeom_p, 4922 diskaddr_t capacity, int lbasize, int path_flag) 4923 { 4924 struct mode_format *page3p; 4925 struct mode_geometry *page4p; 4926 struct mode_header *headerp; 4927 int sector_size; 4928 int nsect; 4929 int nhead; 4930 int ncyl; 4931 int intrlv; 4932 int spc; 4933 diskaddr_t modesense_capacity; 4934 int rpm; 4935 int bd_len; 4936 int mode_header_length; 4937 uchar_t *p3bufp; 4938 uchar_t *p4bufp; 4939 int cdbsize; 4940 int ret = EIO; 4941 sd_ssc_t *ssc; 4942 int status; 4943 4944 ASSERT(un != NULL); 4945 4946 if (lbasize == 0) { 4947 if (ISCD(un)) { 4948 lbasize = 2048; 4949 } else { 4950 lbasize = un->un_sys_blocksize; 4951 } 4952 } 4953 pgeom_p->g_secsize = (unsigned short)lbasize; 4954 4955 /* 4956 * If the unit is a cd/dvd drive MODE SENSE page three 4957 * and MODE SENSE page four are reserved (see SBC spec 4958 * and MMC spec). To prevent soft errors just return 4959 * using the default LBA size. 4960 * 4961 * Since SATA MODE SENSE function (sata_txlt_mode_sense()) does not 4962 * implement support for mode pages 3 and 4 return here to prevent 4963 * illegal requests on SATA drives. 4964 * 4965 * These pages are also reserved in SBC-2 and later. We assume SBC-2 4966 * or later for a direct-attached block device if the SCSI version is 4967 * at least SPC-3. 4968 */ 4969 4970 if (ISCD(un) || 4971 un->un_interconnect_type == SD_INTERCONNECT_SATA || 4972 (un->un_ctype == CTYPE_CCS && SD_INQUIRY(un)->inq_ansi >= 5)) 4973 return (ret); 4974 4975 cdbsize = (un->un_f_cfg_is_atapi == TRUE) ? CDB_GROUP2 : CDB_GROUP0; 4976 4977 /* 4978 * Retrieve MODE SENSE page 3 - Format Device Page 4979 */ 4980 p3bufp = kmem_zalloc(SD_MODE_SENSE_PAGE3_LENGTH, KM_SLEEP); 4981 ssc = sd_ssc_init(un); 4982 status = sd_send_scsi_MODE_SENSE(ssc, cdbsize, p3bufp, 4983 SD_MODE_SENSE_PAGE3_LENGTH, SD_MODE_SENSE_PAGE3_CODE, path_flag); 4984 if (status != 0) { 4985 SD_ERROR(SD_LOG_COMMON, un, 4986 "sd_get_physical_geometry: mode sense page 3 failed\n"); 4987 goto page3_exit; 4988 } 4989 4990 /* 4991 * Determine size of Block Descriptors in order to locate the mode 4992 * page data. ATAPI devices return 0, SCSI devices should return 4993 * MODE_BLK_DESC_LENGTH. 4994 */ 4995 headerp = (struct mode_header *)p3bufp; 4996 if (un->un_f_cfg_is_atapi == TRUE) { 4997 struct mode_header_grp2 *mhp = 4998 (struct mode_header_grp2 *)headerp; 4999 mode_header_length = MODE_HEADER_LENGTH_GRP2; 5000 bd_len = (mhp->bdesc_length_hi << 8) | mhp->bdesc_length_lo; 5001 } else { 5002 mode_header_length = MODE_HEADER_LENGTH; 5003 bd_len = ((struct mode_header *)headerp)->bdesc_length; 5004 } 5005 5006 if (bd_len > MODE_BLK_DESC_LENGTH) { 5007 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON, 5008 "sd_get_physical_geometry: received unexpected bd_len " 5009 "of %d, page3\n", bd_len); 5010 status = EIO; 5011 goto page3_exit; 5012 } 5013 5014 page3p = (struct mode_format *) 5015 ((caddr_t)headerp + mode_header_length + bd_len); 5016 5017 if (page3p->mode_page.code != SD_MODE_SENSE_PAGE3_CODE) { 5018 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON, 5019 "sd_get_physical_geometry: mode sense pg3 code mismatch " 5020 "%d\n", page3p->mode_page.code); 5021 status = EIO; 5022 goto page3_exit; 5023 } 5024 5025 /* 5026 * Use this physical geometry data only if BOTH MODE SENSE commands 5027 * complete successfully; otherwise, revert to the logical geometry. 5028 * So, we need to save everything in temporary variables. 5029 */ 5030 sector_size = BE_16(page3p->data_bytes_sect); 5031 5032 /* 5033 * 1243403: The NEC D38x7 drives do not support MODE SENSE sector size 5034 */ 5035 if (sector_size == 0) { 5036 sector_size = un->un_sys_blocksize; 5037 } else { 5038 sector_size &= ~(un->un_sys_blocksize - 1); 5039 } 5040 5041 nsect = BE_16(page3p->sect_track); 5042 intrlv = BE_16(page3p->interleave); 5043 5044 SD_INFO(SD_LOG_COMMON, un, 5045 "sd_get_physical_geometry: Format Parameters (page 3)\n"); 5046 SD_INFO(SD_LOG_COMMON, un, 5047 " mode page: %d; nsect: %d; sector size: %d;\n", 5048 page3p->mode_page.code, nsect, sector_size); 5049 SD_INFO(SD_LOG_COMMON, un, 5050 " interleave: %d; track skew: %d; cylinder skew: %d;\n", intrlv, 5051 BE_16(page3p->track_skew), 5052 BE_16(page3p->cylinder_skew)); 5053 5054 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 5055 5056 /* 5057 * Retrieve MODE SENSE page 4 - Rigid Disk Drive Geometry Page 5058 */ 5059 p4bufp = kmem_zalloc(SD_MODE_SENSE_PAGE4_LENGTH, KM_SLEEP); 5060 status = sd_send_scsi_MODE_SENSE(ssc, cdbsize, p4bufp, 5061 SD_MODE_SENSE_PAGE4_LENGTH, SD_MODE_SENSE_PAGE4_CODE, path_flag); 5062 if (status != 0) { 5063 SD_ERROR(SD_LOG_COMMON, un, 5064 "sd_get_physical_geometry: mode sense page 4 failed\n"); 5065 goto page4_exit; 5066 } 5067 5068 /* 5069 * Determine size of Block Descriptors in order to locate the mode 5070 * page data. ATAPI devices return 0, SCSI devices should return 5071 * MODE_BLK_DESC_LENGTH. 5072 */ 5073 headerp = (struct mode_header *)p4bufp; 5074 if (un->un_f_cfg_is_atapi == TRUE) { 5075 struct mode_header_grp2 *mhp = 5076 (struct mode_header_grp2 *)headerp; 5077 bd_len = (mhp->bdesc_length_hi << 8) | mhp->bdesc_length_lo; 5078 } else { 5079 bd_len = ((struct mode_header *)headerp)->bdesc_length; 5080 } 5081 5082 if (bd_len > MODE_BLK_DESC_LENGTH) { 5083 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON, 5084 "sd_get_physical_geometry: received unexpected bd_len of " 5085 "%d, page4\n", bd_len); 5086 status = EIO; 5087 goto page4_exit; 5088 } 5089 5090 page4p = (struct mode_geometry *) 5091 ((caddr_t)headerp + mode_header_length + bd_len); 5092 5093 if (page4p->mode_page.code != SD_MODE_SENSE_PAGE4_CODE) { 5094 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON, 5095 "sd_get_physical_geometry: mode sense pg4 code mismatch " 5096 "%d\n", page4p->mode_page.code); 5097 status = EIO; 5098 goto page4_exit; 5099 } 5100 5101 /* 5102 * Stash the data now, after we know that both commands completed. 5103 */ 5104 5105 5106 nhead = (int)page4p->heads; /* uchar, so no conversion needed */ 5107 spc = nhead * nsect; 5108 ncyl = (page4p->cyl_ub << 16) + (page4p->cyl_mb << 8) + page4p->cyl_lb; 5109 rpm = BE_16(page4p->rpm); 5110 5111 modesense_capacity = spc * ncyl; 5112 5113 SD_INFO(SD_LOG_COMMON, un, 5114 "sd_get_physical_geometry: Geometry Parameters (page 4)\n"); 5115 SD_INFO(SD_LOG_COMMON, un, 5116 " cylinders: %d; heads: %d; rpm: %d;\n", ncyl, nhead, rpm); 5117 SD_INFO(SD_LOG_COMMON, un, 5118 " computed capacity(h*s*c): %d;\n", modesense_capacity); 5119 SD_INFO(SD_LOG_COMMON, un, " pgeom_p: %p; read cap: %d\n", 5120 (void *)pgeom_p, capacity); 5121 5122 /* 5123 * Compensate if the drive's geometry is not rectangular, i.e., 5124 * the product of C * H * S returned by MODE SENSE >= that returned 5125 * by read capacity. This is an idiosyncrasy of the original x86 5126 * disk subsystem. 5127 */ 5128 if (modesense_capacity >= capacity) { 5129 SD_INFO(SD_LOG_COMMON, un, 5130 "sd_get_physical_geometry: adjusting acyl; " 5131 "old: %d; new: %d\n", pgeom_p->g_acyl, 5132 (modesense_capacity - capacity + spc - 1) / spc); 5133 if (sector_size != 0) { 5134 /* 1243403: NEC D38x7 drives don't support sec size */ 5135 pgeom_p->g_secsize = (unsigned short)sector_size; 5136 } 5137 pgeom_p->g_nsect = (unsigned short)nsect; 5138 pgeom_p->g_nhead = (unsigned short)nhead; 5139 pgeom_p->g_capacity = capacity; 5140 pgeom_p->g_acyl = 5141 (modesense_capacity - pgeom_p->g_capacity + spc - 1) / spc; 5142 pgeom_p->g_ncyl = ncyl - pgeom_p->g_acyl; 5143 } 5144 5145 pgeom_p->g_rpm = (unsigned short)rpm; 5146 pgeom_p->g_intrlv = (unsigned short)intrlv; 5147 ret = 0; 5148 5149 SD_INFO(SD_LOG_COMMON, un, 5150 "sd_get_physical_geometry: mode sense geometry:\n"); 5151 SD_INFO(SD_LOG_COMMON, un, 5152 " nsect: %d; sector size: %d; interlv: %d\n", 5153 nsect, sector_size, intrlv); 5154 SD_INFO(SD_LOG_COMMON, un, 5155 " nhead: %d; ncyl: %d; rpm: %d; capacity(ms): %d\n", 5156 nhead, ncyl, rpm, modesense_capacity); 5157 SD_INFO(SD_LOG_COMMON, un, 5158 "sd_get_physical_geometry: (cached)\n"); 5159 SD_INFO(SD_LOG_COMMON, un, 5160 " ncyl: %ld; acyl: %d; nhead: %d; nsect: %d\n", 5161 pgeom_p->g_ncyl, pgeom_p->g_acyl, 5162 pgeom_p->g_nhead, pgeom_p->g_nsect); 5163 SD_INFO(SD_LOG_COMMON, un, 5164 " lbasize: %d; capacity: %ld; intrlv: %d; rpm: %d\n", 5165 pgeom_p->g_secsize, pgeom_p->g_capacity, 5166 pgeom_p->g_intrlv, pgeom_p->g_rpm); 5167 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 5168 5169 page4_exit: 5170 kmem_free(p4bufp, SD_MODE_SENSE_PAGE4_LENGTH); 5171 5172 page3_exit: 5173 kmem_free(p3bufp, SD_MODE_SENSE_PAGE3_LENGTH); 5174 5175 if (status != 0) { 5176 if (status == EIO) { 5177 /* 5178 * Some disks do not support mode sense(6), we 5179 * should ignore this kind of error(sense key is 5180 * 0x5 - illegal request). 5181 */ 5182 uint8_t *sensep; 5183 int senlen; 5184 5185 sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf; 5186 senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen - 5187 ssc->ssc_uscsi_cmd->uscsi_rqresid); 5188 5189 if (senlen > 0 && 5190 scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) { 5191 sd_ssc_assessment(ssc, 5192 SD_FMT_IGNORE_COMPROMISE); 5193 } else { 5194 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 5195 } 5196 } else { 5197 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 5198 } 5199 } 5200 sd_ssc_fini(ssc); 5201 return (ret); 5202 } 5203 5204 /* 5205 * Function: sd_get_virtual_geometry 5206 * 5207 * Description: Ask the controller to tell us about the target device. 5208 * 5209 * Arguments: un - pointer to softstate 5210 * capacity - disk capacity in #blocks 5211 * lbasize - disk block size in bytes 5212 * 5213 * Context: Kernel thread only 5214 */ 5215 5216 static int 5217 sd_get_virtual_geometry(struct sd_lun *un, cmlb_geom_t *lgeom_p, 5218 diskaddr_t capacity, int lbasize) 5219 { 5220 uint_t geombuf; 5221 int spc; 5222 5223 ASSERT(un != NULL); 5224 5225 /* Set sector size, and total number of sectors */ 5226 (void) scsi_ifsetcap(SD_ADDRESS(un), "sector-size", lbasize, 1); 5227 (void) scsi_ifsetcap(SD_ADDRESS(un), "total-sectors", capacity, 1); 5228 5229 /* Let the HBA tell us its geometry */ 5230 geombuf = (uint_t)scsi_ifgetcap(SD_ADDRESS(un), "geometry", 1); 5231 5232 /* A value of -1 indicates an undefined "geometry" property */ 5233 if (geombuf == (-1)) { 5234 return (EINVAL); 5235 } 5236 5237 /* Initialize the logical geometry cache. */ 5238 lgeom_p->g_nhead = (geombuf >> 16) & 0xffff; 5239 lgeom_p->g_nsect = geombuf & 0xffff; 5240 lgeom_p->g_secsize = un->un_sys_blocksize; 5241 5242 spc = lgeom_p->g_nhead * lgeom_p->g_nsect; 5243 5244 /* 5245 * Note: The driver originally converted the capacity value from 5246 * target blocks to system blocks. However, the capacity value passed 5247 * to this routine is already in terms of system blocks (this scaling 5248 * is done when the READ CAPACITY command is issued and processed). 5249 * This 'error' may have gone undetected because the usage of g_ncyl 5250 * (which is based upon g_capacity) is very limited within the driver 5251 */ 5252 lgeom_p->g_capacity = capacity; 5253 5254 /* 5255 * Set ncyl to zero if the hba returned a zero nhead or nsect value. The 5256 * hba may return zero values if the device has been removed. 5257 */ 5258 if (spc == 0) { 5259 lgeom_p->g_ncyl = 0; 5260 } else { 5261 lgeom_p->g_ncyl = lgeom_p->g_capacity / spc; 5262 } 5263 lgeom_p->g_acyl = 0; 5264 5265 SD_INFO(SD_LOG_COMMON, un, "sd_get_virtual_geometry: (cached)\n"); 5266 return (0); 5267 5268 } 5269 /* 5270 * Function: sd_update_block_info 5271 * 5272 * Description: Calculate a byte count to sector count bitshift value 5273 * from sector size. 5274 * 5275 * Arguments: un: unit struct. 5276 * lbasize: new target sector size 5277 * capacity: new target capacity, ie. block count 5278 * 5279 * Context: Kernel thread context 5280 */ 5281 5282 static void 5283 sd_update_block_info(struct sd_lun *un, uint32_t lbasize, uint64_t capacity) 5284 { 5285 if (lbasize != 0) { 5286 un->un_tgt_blocksize = lbasize; 5287 un->un_f_tgt_blocksize_is_valid = TRUE; 5288 if (!un->un_f_has_removable_media) { 5289 un->un_sys_blocksize = lbasize; 5290 } 5291 } 5292 5293 if (capacity != 0) { 5294 un->un_blockcount = capacity; 5295 un->un_f_blockcount_is_valid = TRUE; 5296 5297 /* 5298 * The capacity has changed so update the errstats. 5299 */ 5300 if (un->un_errstats != NULL) { 5301 struct sd_errstats *stp; 5302 5303 capacity *= un->un_sys_blocksize; 5304 stp = (struct sd_errstats *)un->un_errstats->ks_data; 5305 if (stp->sd_capacity.value.ui64 < capacity) 5306 stp->sd_capacity.value.ui64 = capacity; 5307 } 5308 } 5309 } 5310 5311 5312 /* 5313 * Function: sd_register_devid 5314 * 5315 * Description: This routine will obtain the device id information from the 5316 * target, obtain the serial number, and register the device 5317 * id with the ddi framework. 5318 * 5319 * Arguments: devi - the system's dev_info_t for the device. 5320 * un - driver soft state (unit) structure 5321 * reservation_flag - indicates if a reservation conflict 5322 * occurred during attach 5323 * 5324 * Context: Kernel Thread 5325 */ 5326 static void 5327 sd_register_devid(sd_ssc_t *ssc, dev_info_t *devi, int reservation_flag) 5328 { 5329 int rval = 0; 5330 uchar_t *inq80 = NULL; 5331 size_t inq80_len = MAX_INQUIRY_SIZE; 5332 size_t inq80_resid = 0; 5333 uchar_t *inq83 = NULL; 5334 size_t inq83_len = MAX_INQUIRY_SIZE; 5335 size_t inq83_resid = 0; 5336 int dlen, len; 5337 char *sn; 5338 struct sd_lun *un; 5339 5340 ASSERT(ssc != NULL); 5341 un = ssc->ssc_un; 5342 ASSERT(un != NULL); 5343 ASSERT(mutex_owned(SD_MUTEX(un))); 5344 ASSERT((SD_DEVINFO(un)) == devi); 5345 5346 5347 /* 5348 * We check the availability of the World Wide Name (0x83) and Unit 5349 * Serial Number (0x80) pages in sd_check_vpd_page_support(), and using 5350 * un_vpd_page_mask from them, we decide which way to get the WWN. If 5351 * 0x83 is available, that is the best choice. Our next choice is 5352 * 0x80. If neither are available, we munge the devid from the device 5353 * vid/pid/serial # for Sun qualified disks, or use the ddi framework 5354 * to fabricate a devid for non-Sun qualified disks. 5355 */ 5356 if (sd_check_vpd_page_support(ssc) == 0) { 5357 /* collect page 80 data if available */ 5358 if (un->un_vpd_page_mask & SD_VPD_UNIT_SERIAL_PG) { 5359 5360 mutex_exit(SD_MUTEX(un)); 5361 inq80 = kmem_zalloc(inq80_len, KM_SLEEP); 5362 5363 rval = sd_send_scsi_INQUIRY(ssc, inq80, inq80_len, 5364 0x01, 0x80, &inq80_resid); 5365 5366 if (rval != 0) { 5367 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 5368 kmem_free(inq80, inq80_len); 5369 inq80 = NULL; 5370 inq80_len = 0; 5371 } else if (ddi_prop_exists( 5372 DDI_DEV_T_NONE, SD_DEVINFO(un), 5373 DDI_PROP_NOTPROM | DDI_PROP_DONTPASS, 5374 INQUIRY_SERIAL_NO) == 0) { 5375 /* 5376 * If we don't already have a serial number 5377 * property, do quick verify of data returned 5378 * and define property. 5379 */ 5380 dlen = inq80_len - inq80_resid; 5381 len = (size_t)inq80[3]; 5382 if ((dlen >= 4) && ((len + 4) <= dlen)) { 5383 /* 5384 * Ensure sn termination, skip leading 5385 * blanks, and create property 5386 * 'inquiry-serial-no'. 5387 */ 5388 sn = (char *)&inq80[4]; 5389 sn[len] = 0; 5390 while (*sn && (*sn == ' ')) 5391 sn++; 5392 if (*sn) { 5393 (void) ddi_prop_update_string( 5394 DDI_DEV_T_NONE, 5395 SD_DEVINFO(un), 5396 INQUIRY_SERIAL_NO, sn); 5397 } 5398 } 5399 } 5400 mutex_enter(SD_MUTEX(un)); 5401 } 5402 5403 /* collect page 83 data if available */ 5404 if (un->un_vpd_page_mask & SD_VPD_DEVID_WWN_PG) { 5405 mutex_exit(SD_MUTEX(un)); 5406 inq83 = kmem_zalloc(inq83_len, KM_SLEEP); 5407 5408 rval = sd_send_scsi_INQUIRY(ssc, inq83, inq83_len, 5409 0x01, 0x83, &inq83_resid); 5410 5411 if (rval != 0) { 5412 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 5413 kmem_free(inq83, inq83_len); 5414 inq83 = NULL; 5415 inq83_len = 0; 5416 } 5417 mutex_enter(SD_MUTEX(un)); 5418 } 5419 } 5420 5421 /* 5422 * If transport has already registered a devid for this target 5423 * then that takes precedence over the driver's determination 5424 * of the devid. 5425 * 5426 * NOTE: The reason this check is done here instead of at the beginning 5427 * of the function is to allow the code above to create the 5428 * 'inquiry-serial-no' property. 5429 */ 5430 if (ddi_devid_get(SD_DEVINFO(un), &un->un_devid) == DDI_SUCCESS) { 5431 ASSERT(un->un_devid); 5432 un->un_f_devid_transport_defined = TRUE; 5433 goto cleanup; /* use devid registered by the transport */ 5434 } 5435 5436 /* 5437 * This is the case of antiquated Sun disk drives that have the 5438 * FAB_DEVID property set in the disk_table. These drives 5439 * manage the devid's by storing them in last 2 available sectors 5440 * on the drive and have them fabricated by the ddi layer by calling 5441 * ddi_devid_init and passing the DEVID_FAB flag. 5442 */ 5443 if (un->un_f_opt_fab_devid == TRUE) { 5444 /* 5445 * Depending on EINVAL isn't reliable, since a reserved disk 5446 * may result in invalid geometry, so check to make sure a 5447 * reservation conflict did not occur during attach. 5448 */ 5449 if ((sd_get_devid(ssc) == EINVAL) && 5450 (reservation_flag != SD_TARGET_IS_RESERVED)) { 5451 /* 5452 * The devid is invalid AND there is no reservation 5453 * conflict. Fabricate a new devid. 5454 */ 5455 (void) sd_create_devid(ssc); 5456 } 5457 5458 /* Register the devid if it exists */ 5459 if (un->un_devid != NULL) { 5460 (void) ddi_devid_register(SD_DEVINFO(un), 5461 un->un_devid); 5462 SD_INFO(SD_LOG_ATTACH_DETACH, un, 5463 "sd_register_devid: Devid Fabricated\n"); 5464 } 5465 goto cleanup; 5466 } 5467 5468 /* encode best devid possible based on data available */ 5469 if (ddi_devid_scsi_encode(DEVID_SCSI_ENCODE_VERSION_LATEST, 5470 (char *)ddi_driver_name(SD_DEVINFO(un)), 5471 (uchar_t *)SD_INQUIRY(un), sizeof (*SD_INQUIRY(un)), 5472 inq80, inq80_len - inq80_resid, inq83, inq83_len - 5473 inq83_resid, &un->un_devid) == DDI_SUCCESS) { 5474 5475 /* devid successfully encoded, register devid */ 5476 (void) ddi_devid_register(SD_DEVINFO(un), un->un_devid); 5477 5478 } else { 5479 /* 5480 * Unable to encode a devid based on data available. 5481 * This is not a Sun qualified disk. Older Sun disk 5482 * drives that have the SD_FAB_DEVID property 5483 * set in the disk_table and non Sun qualified 5484 * disks are treated in the same manner. These 5485 * drives manage the devid's by storing them in 5486 * last 2 available sectors on the drive and 5487 * have them fabricated by the ddi layer by 5488 * calling ddi_devid_init and passing the 5489 * DEVID_FAB flag. 5490 * Create a fabricate devid only if there's no 5491 * fabricate devid existed. 5492 */ 5493 if (sd_get_devid(ssc) == EINVAL) { 5494 (void) sd_create_devid(ssc); 5495 } 5496 un->un_f_opt_fab_devid = TRUE; 5497 5498 /* Register the devid if it exists */ 5499 if (un->un_devid != NULL) { 5500 (void) ddi_devid_register(SD_DEVINFO(un), 5501 un->un_devid); 5502 SD_INFO(SD_LOG_ATTACH_DETACH, un, 5503 "sd_register_devid: devid fabricated using " 5504 "ddi framework\n"); 5505 } 5506 } 5507 5508 cleanup: 5509 /* clean up resources */ 5510 if (inq80 != NULL) { 5511 kmem_free(inq80, inq80_len); 5512 } 5513 if (inq83 != NULL) { 5514 kmem_free(inq83, inq83_len); 5515 } 5516 } 5517 5518 5519 5520 /* 5521 * Function: sd_get_devid 5522 * 5523 * Description: This routine will return 0 if a valid device id has been 5524 * obtained from the target and stored in the soft state. If a 5525 * valid device id has not been previously read and stored, a 5526 * read attempt will be made. 5527 * 5528 * Arguments: un - driver soft state (unit) structure 5529 * 5530 * Return Code: 0 if we successfully get the device id 5531 * 5532 * Context: Kernel Thread 5533 */ 5534 5535 static int 5536 sd_get_devid(sd_ssc_t *ssc) 5537 { 5538 struct dk_devid *dkdevid; 5539 ddi_devid_t tmpid; 5540 uint_t *ip; 5541 size_t sz; 5542 diskaddr_t blk; 5543 int status; 5544 int chksum; 5545 int i; 5546 size_t buffer_size; 5547 struct sd_lun *un; 5548 5549 ASSERT(ssc != NULL); 5550 un = ssc->ssc_un; 5551 ASSERT(un != NULL); 5552 ASSERT(mutex_owned(SD_MUTEX(un))); 5553 5554 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_get_devid: entry: un: 0x%p\n", 5555 un); 5556 5557 if (un->un_devid != NULL) { 5558 return (0); 5559 } 5560 5561 mutex_exit(SD_MUTEX(un)); 5562 if (cmlb_get_devid_block(un->un_cmlbhandle, &blk, 5563 (void *)SD_PATH_DIRECT) != 0) { 5564 mutex_enter(SD_MUTEX(un)); 5565 return (EINVAL); 5566 } 5567 5568 /* 5569 * Read and verify device id, stored in the reserved cylinders at the 5570 * end of the disk. Backup label is on the odd sectors of the last 5571 * track of the last cylinder. Device id will be on track of the next 5572 * to last cylinder. 5573 */ 5574 mutex_enter(SD_MUTEX(un)); 5575 buffer_size = SD_REQBYTES2TGTBYTES(un, sizeof (struct dk_devid)); 5576 mutex_exit(SD_MUTEX(un)); 5577 dkdevid = kmem_alloc(buffer_size, KM_SLEEP); 5578 status = sd_send_scsi_READ(ssc, dkdevid, buffer_size, blk, 5579 SD_PATH_DIRECT); 5580 5581 if (status != 0) { 5582 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 5583 goto error; 5584 } 5585 5586 /* Validate the revision */ 5587 if ((dkdevid->dkd_rev_hi != DK_DEVID_REV_MSB) || 5588 (dkdevid->dkd_rev_lo != DK_DEVID_REV_LSB)) { 5589 status = EINVAL; 5590 goto error; 5591 } 5592 5593 /* Calculate the checksum */ 5594 chksum = 0; 5595 ip = (uint_t *)dkdevid; 5596 for (i = 0; i < ((DEV_BSIZE - sizeof (int)) / sizeof (int)); 5597 i++) { 5598 chksum ^= ip[i]; 5599 } 5600 5601 /* Compare the checksums */ 5602 if (DKD_GETCHKSUM(dkdevid) != chksum) { 5603 status = EINVAL; 5604 goto error; 5605 } 5606 5607 /* Validate the device id */ 5608 if (ddi_devid_valid((ddi_devid_t)&dkdevid->dkd_devid) != DDI_SUCCESS) { 5609 status = EINVAL; 5610 goto error; 5611 } 5612 5613 /* 5614 * Store the device id in the driver soft state 5615 */ 5616 sz = ddi_devid_sizeof((ddi_devid_t)&dkdevid->dkd_devid); 5617 tmpid = kmem_alloc(sz, KM_SLEEP); 5618 5619 mutex_enter(SD_MUTEX(un)); 5620 5621 un->un_devid = tmpid; 5622 bcopy(&dkdevid->dkd_devid, un->un_devid, sz); 5623 5624 kmem_free(dkdevid, buffer_size); 5625 5626 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_get_devid: exit: un:0x%p\n", un); 5627 5628 return (status); 5629 error: 5630 mutex_enter(SD_MUTEX(un)); 5631 kmem_free(dkdevid, buffer_size); 5632 return (status); 5633 } 5634 5635 5636 /* 5637 * Function: sd_create_devid 5638 * 5639 * Description: This routine will fabricate the device id and write it 5640 * to the disk. 5641 * 5642 * Arguments: un - driver soft state (unit) structure 5643 * 5644 * Return Code: value of the fabricated device id 5645 * 5646 * Context: Kernel Thread 5647 */ 5648 5649 static ddi_devid_t 5650 sd_create_devid(sd_ssc_t *ssc) 5651 { 5652 struct sd_lun *un; 5653 5654 ASSERT(ssc != NULL); 5655 un = ssc->ssc_un; 5656 ASSERT(un != NULL); 5657 5658 /* Fabricate the devid */ 5659 if (ddi_devid_init(SD_DEVINFO(un), DEVID_FAB, 0, NULL, &un->un_devid) 5660 == DDI_FAILURE) { 5661 return (NULL); 5662 } 5663 5664 /* Write the devid to disk */ 5665 if (sd_write_deviceid(ssc) != 0) { 5666 ddi_devid_free(un->un_devid); 5667 un->un_devid = NULL; 5668 } 5669 5670 return (un->un_devid); 5671 } 5672 5673 5674 /* 5675 * Function: sd_write_deviceid 5676 * 5677 * Description: This routine will write the device id to the disk 5678 * reserved sector. 5679 * 5680 * Arguments: un - driver soft state (unit) structure 5681 * 5682 * Return Code: EINVAL 5683 * value returned by sd_send_scsi_cmd 5684 * 5685 * Context: Kernel Thread 5686 */ 5687 5688 static int 5689 sd_write_deviceid(sd_ssc_t *ssc) 5690 { 5691 struct dk_devid *dkdevid; 5692 uchar_t *buf; 5693 diskaddr_t blk; 5694 uint_t *ip, chksum; 5695 int status; 5696 int i; 5697 struct sd_lun *un; 5698 5699 ASSERT(ssc != NULL); 5700 un = ssc->ssc_un; 5701 ASSERT(un != NULL); 5702 ASSERT(mutex_owned(SD_MUTEX(un))); 5703 5704 mutex_exit(SD_MUTEX(un)); 5705 if (cmlb_get_devid_block(un->un_cmlbhandle, &blk, 5706 (void *)SD_PATH_DIRECT) != 0) { 5707 mutex_enter(SD_MUTEX(un)); 5708 return (-1); 5709 } 5710 5711 5712 /* Allocate the buffer */ 5713 buf = kmem_zalloc(un->un_sys_blocksize, KM_SLEEP); 5714 dkdevid = (struct dk_devid *)buf; 5715 5716 /* Fill in the revision */ 5717 dkdevid->dkd_rev_hi = DK_DEVID_REV_MSB; 5718 dkdevid->dkd_rev_lo = DK_DEVID_REV_LSB; 5719 5720 /* Copy in the device id */ 5721 mutex_enter(SD_MUTEX(un)); 5722 bcopy(un->un_devid, &dkdevid->dkd_devid, 5723 ddi_devid_sizeof(un->un_devid)); 5724 mutex_exit(SD_MUTEX(un)); 5725 5726 /* Calculate the checksum */ 5727 chksum = 0; 5728 ip = (uint_t *)dkdevid; 5729 for (i = 0; i < ((DEV_BSIZE - sizeof (int)) / sizeof (int)); 5730 i++) { 5731 chksum ^= ip[i]; 5732 } 5733 5734 /* Fill-in checksum */ 5735 DKD_FORMCHKSUM(chksum, dkdevid); 5736 5737 /* Write the reserved sector */ 5738 status = sd_send_scsi_WRITE(ssc, buf, un->un_sys_blocksize, blk, 5739 SD_PATH_DIRECT); 5740 if (status != 0) 5741 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 5742 5743 kmem_free(buf, un->un_sys_blocksize); 5744 5745 mutex_enter(SD_MUTEX(un)); 5746 return (status); 5747 } 5748 5749 5750 /* 5751 * Function: sd_check_vpd_page_support 5752 * 5753 * Description: This routine sends an inquiry command with the EVPD bit set and 5754 * a page code of 0x00 to the device. It is used to determine which 5755 * vital product pages are available to find the devid. We are 5756 * looking for pages 0x83 0x80 or 0xB1. If we return a negative 1, 5757 * the device does not support that command. 5758 * 5759 * Arguments: un - driver soft state (unit) structure 5760 * 5761 * Return Code: 0 - success 5762 * 1 - check condition 5763 * 5764 * Context: This routine can sleep. 5765 */ 5766 5767 static int 5768 sd_check_vpd_page_support(sd_ssc_t *ssc) 5769 { 5770 uchar_t *page_list = NULL; 5771 uchar_t page_length = 0xff; /* Use max possible length */ 5772 uchar_t evpd = 0x01; /* Set the EVPD bit */ 5773 uchar_t page_code = 0x00; /* Supported VPD Pages */ 5774 int rval = 0; 5775 int counter; 5776 struct sd_lun *un; 5777 5778 ASSERT(ssc != NULL); 5779 un = ssc->ssc_un; 5780 ASSERT(un != NULL); 5781 ASSERT(mutex_owned(SD_MUTEX(un))); 5782 5783 mutex_exit(SD_MUTEX(un)); 5784 5785 /* 5786 * We'll set the page length to the maximum to save figuring it out 5787 * with an additional call. 5788 */ 5789 page_list = kmem_zalloc(page_length, KM_SLEEP); 5790 5791 rval = sd_send_scsi_INQUIRY(ssc, page_list, page_length, evpd, 5792 page_code, NULL); 5793 5794 if (rval != 0) 5795 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 5796 5797 mutex_enter(SD_MUTEX(un)); 5798 5799 /* 5800 * Now we must validate that the device accepted the command, as some 5801 * drives do not support it. If the drive does support it, we will 5802 * return 0, and the supported pages will be in un_vpd_page_mask. If 5803 * not, we return -1. 5804 */ 5805 if ((rval == 0) && (page_list[VPD_MODE_PAGE] == 0x00)) { 5806 /* Loop to find one of the 2 pages we need */ 5807 counter = 4; /* Supported pages start at byte 4, with 0x00 */ 5808 5809 /* 5810 * Pages are returned in ascending order, and 0x83 is what we 5811 * are hoping for. 5812 */ 5813 while ((page_list[counter] <= 0xB1) && 5814 (counter <= (page_list[VPD_PAGE_LENGTH] + 5815 VPD_HEAD_OFFSET))) { 5816 /* 5817 * Add 3 because page_list[3] is the number of 5818 * pages minus 3 5819 */ 5820 5821 switch (page_list[counter]) { 5822 case 0x00: 5823 un->un_vpd_page_mask |= SD_VPD_SUPPORTED_PG; 5824 break; 5825 case 0x80: 5826 un->un_vpd_page_mask |= SD_VPD_UNIT_SERIAL_PG; 5827 break; 5828 case 0x81: 5829 un->un_vpd_page_mask |= SD_VPD_OPERATING_PG; 5830 break; 5831 case 0x82: 5832 un->un_vpd_page_mask |= SD_VPD_ASCII_OP_PG; 5833 break; 5834 case 0x83: 5835 un->un_vpd_page_mask |= SD_VPD_DEVID_WWN_PG; 5836 break; 5837 case 0x86: 5838 un->un_vpd_page_mask |= SD_VPD_EXTENDED_DATA_PG; 5839 break; 5840 case 0xB1: 5841 un->un_vpd_page_mask |= SD_VPD_DEV_CHARACTER_PG; 5842 break; 5843 } 5844 counter++; 5845 } 5846 5847 } else { 5848 rval = -1; 5849 5850 SD_INFO(SD_LOG_ATTACH_DETACH, un, 5851 "sd_check_vpd_page_support: This drive does not implement " 5852 "VPD pages.\n"); 5853 } 5854 5855 kmem_free(page_list, page_length); 5856 5857 return (rval); 5858 } 5859 5860 5861 /* 5862 * Function: sd_setup_pm 5863 * 5864 * Description: Initialize Power Management on the device 5865 * 5866 * Context: Kernel Thread 5867 */ 5868 5869 static void 5870 sd_setup_pm(sd_ssc_t *ssc, dev_info_t *devi) 5871 { 5872 uint_t log_page_size; 5873 uchar_t *log_page_data; 5874 int rval = 0; 5875 struct sd_lun *un; 5876 5877 ASSERT(ssc != NULL); 5878 un = ssc->ssc_un; 5879 ASSERT(un != NULL); 5880 5881 /* 5882 * Since we are called from attach, holding a mutex for 5883 * un is unnecessary. Because some of the routines called 5884 * from here require SD_MUTEX to not be held, assert this 5885 * right up front. 5886 */ 5887 ASSERT(!mutex_owned(SD_MUTEX(un))); 5888 /* 5889 * Since the sd device does not have the 'reg' property, 5890 * cpr will not call its DDI_SUSPEND/DDI_RESUME entries. 5891 * The following code is to tell cpr that this device 5892 * DOES need to be suspended and resumed. 5893 */ 5894 (void) ddi_prop_update_string(DDI_DEV_T_NONE, devi, 5895 "pm-hardware-state", "needs-suspend-resume"); 5896 5897 /* 5898 * This complies with the new power management framework 5899 * for certain desktop machines. Create the pm_components 5900 * property as a string array property. 5901 * If un_f_pm_supported is TRUE, that means the disk 5902 * attached HBA has set the "pm-capable" property and 5903 * the value of this property is bigger than 0. 5904 */ 5905 if (un->un_f_pm_supported) { 5906 /* 5907 * not all devices have a motor, try it first. 5908 * some devices may return ILLEGAL REQUEST, some 5909 * will hang 5910 * The following START_STOP_UNIT is used to check if target 5911 * device has a motor. 5912 */ 5913 un->un_f_start_stop_supported = TRUE; 5914 5915 if (un->un_f_power_condition_supported) { 5916 rval = sd_send_scsi_START_STOP_UNIT(ssc, 5917 SD_POWER_CONDITION, SD_TARGET_ACTIVE, 5918 SD_PATH_DIRECT); 5919 if (rval != 0) { 5920 un->un_f_power_condition_supported = FALSE; 5921 } 5922 } 5923 if (!un->un_f_power_condition_supported) { 5924 rval = sd_send_scsi_START_STOP_UNIT(ssc, 5925 SD_START_STOP, SD_TARGET_START, SD_PATH_DIRECT); 5926 } 5927 if (rval != 0) { 5928 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 5929 un->un_f_start_stop_supported = FALSE; 5930 } 5931 5932 /* 5933 * create pm properties anyways otherwise the parent can't 5934 * go to sleep 5935 */ 5936 un->un_f_pm_is_enabled = TRUE; 5937 (void) sd_create_pm_components(devi, un); 5938 5939 /* 5940 * If it claims that log sense is supported, check it out. 5941 */ 5942 if (un->un_f_log_sense_supported) { 5943 rval = sd_log_page_supported(ssc, 5944 START_STOP_CYCLE_PAGE); 5945 if (rval == 1) { 5946 /* Page found, use it. */ 5947 un->un_start_stop_cycle_page = 5948 START_STOP_CYCLE_PAGE; 5949 } else { 5950 /* 5951 * Page not found or log sense is not 5952 * supported. 5953 * Notice we do not check the old style 5954 * START_STOP_CYCLE_VU_PAGE because this 5955 * code path does not apply to old disks. 5956 */ 5957 un->un_f_log_sense_supported = FALSE; 5958 un->un_f_pm_log_sense_smart = FALSE; 5959 } 5960 } 5961 5962 return; 5963 } 5964 5965 /* 5966 * For the disk whose attached HBA has not set the "pm-capable" 5967 * property, check if it supports the power management. 5968 */ 5969 if (!un->un_f_log_sense_supported) { 5970 un->un_power_level = SD_SPINDLE_ON; 5971 un->un_f_pm_is_enabled = FALSE; 5972 return; 5973 } 5974 5975 rval = sd_log_page_supported(ssc, START_STOP_CYCLE_PAGE); 5976 5977 #ifdef SDDEBUG 5978 if (sd_force_pm_supported) { 5979 /* Force a successful result */ 5980 rval = 1; 5981 } 5982 #endif 5983 5984 /* 5985 * If the start-stop cycle counter log page is not supported 5986 * or if the pm-capable property is set to be false (0), 5987 * then we should not create the pm_components property. 5988 */ 5989 if (rval == -1) { 5990 /* 5991 * Error. 5992 * Reading log sense failed, most likely this is 5993 * an older drive that does not support log sense. 5994 * If this fails auto-pm is not supported. 5995 */ 5996 un->un_power_level = SD_SPINDLE_ON; 5997 un->un_f_pm_is_enabled = FALSE; 5998 5999 } else if (rval == 0) { 6000 /* 6001 * Page not found. 6002 * The start stop cycle counter is implemented as page 6003 * START_STOP_CYCLE_PAGE_VU_PAGE (0x31) in older disks. For 6004 * newer disks it is implemented as START_STOP_CYCLE_PAGE (0xE). 6005 */ 6006 if (sd_log_page_supported(ssc, START_STOP_CYCLE_VU_PAGE) == 1) { 6007 /* 6008 * Page found, use this one. 6009 */ 6010 un->un_start_stop_cycle_page = START_STOP_CYCLE_VU_PAGE; 6011 un->un_f_pm_is_enabled = TRUE; 6012 } else { 6013 /* 6014 * Error or page not found. 6015 * auto-pm is not supported for this device. 6016 */ 6017 un->un_power_level = SD_SPINDLE_ON; 6018 un->un_f_pm_is_enabled = FALSE; 6019 } 6020 } else { 6021 /* 6022 * Page found, use it. 6023 */ 6024 un->un_start_stop_cycle_page = START_STOP_CYCLE_PAGE; 6025 un->un_f_pm_is_enabled = TRUE; 6026 } 6027 6028 6029 if (un->un_f_pm_is_enabled == TRUE) { 6030 log_page_size = START_STOP_CYCLE_COUNTER_PAGE_SIZE; 6031 log_page_data = kmem_zalloc(log_page_size, KM_SLEEP); 6032 6033 rval = sd_send_scsi_LOG_SENSE(ssc, log_page_data, 6034 log_page_size, un->un_start_stop_cycle_page, 6035 0x01, 0, SD_PATH_DIRECT); 6036 6037 if (rval != 0) { 6038 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 6039 } 6040 6041 #ifdef SDDEBUG 6042 if (sd_force_pm_supported) { 6043 /* Force a successful result */ 6044 rval = 0; 6045 } 6046 #endif 6047 6048 /* 6049 * If the Log sense for Page( Start/stop cycle counter page) 6050 * succeeds, then power management is supported and we can 6051 * enable auto-pm. 6052 */ 6053 if (rval == 0) { 6054 (void) sd_create_pm_components(devi, un); 6055 } else { 6056 un->un_power_level = SD_SPINDLE_ON; 6057 un->un_f_pm_is_enabled = FALSE; 6058 } 6059 6060 kmem_free(log_page_data, log_page_size); 6061 } 6062 } 6063 6064 6065 /* 6066 * Function: sd_create_pm_components 6067 * 6068 * Description: Initialize PM property. 6069 * 6070 * Context: Kernel thread context 6071 */ 6072 6073 static void 6074 sd_create_pm_components(dev_info_t *devi, struct sd_lun *un) 6075 { 6076 ASSERT(!mutex_owned(SD_MUTEX(un))); 6077 6078 if (un->un_f_power_condition_supported) { 6079 if (ddi_prop_update_string_array(DDI_DEV_T_NONE, devi, 6080 "pm-components", sd_pwr_pc.pm_comp, 5) 6081 != DDI_PROP_SUCCESS) { 6082 un->un_power_level = SD_SPINDLE_ACTIVE; 6083 un->un_f_pm_is_enabled = FALSE; 6084 return; 6085 } 6086 } else { 6087 if (ddi_prop_update_string_array(DDI_DEV_T_NONE, devi, 6088 "pm-components", sd_pwr_ss.pm_comp, 3) 6089 != DDI_PROP_SUCCESS) { 6090 un->un_power_level = SD_SPINDLE_ON; 6091 un->un_f_pm_is_enabled = FALSE; 6092 return; 6093 } 6094 } 6095 /* 6096 * When components are initially created they are idle, 6097 * power up any non-removables. 6098 * Note: the return value of pm_raise_power can't be used 6099 * for determining if PM should be enabled for this device. 6100 * Even if you check the return values and remove this 6101 * property created above, the PM framework will not honor the 6102 * change after the first call to pm_raise_power. Hence, 6103 * removal of that property does not help if pm_raise_power 6104 * fails. In the case of removable media, the start/stop 6105 * will fail if the media is not present. 6106 */ 6107 if (un->un_f_attach_spinup && (pm_raise_power(SD_DEVINFO(un), 0, 6108 SD_PM_STATE_ACTIVE(un)) == DDI_SUCCESS)) { 6109 mutex_enter(SD_MUTEX(un)); 6110 un->un_power_level = SD_PM_STATE_ACTIVE(un); 6111 mutex_enter(&un->un_pm_mutex); 6112 /* Set to on and not busy. */ 6113 un->un_pm_count = 0; 6114 } else { 6115 mutex_enter(SD_MUTEX(un)); 6116 un->un_power_level = SD_PM_STATE_STOPPED(un); 6117 mutex_enter(&un->un_pm_mutex); 6118 /* Set to off. */ 6119 un->un_pm_count = -1; 6120 } 6121 mutex_exit(&un->un_pm_mutex); 6122 mutex_exit(SD_MUTEX(un)); 6123 } 6124 6125 6126 /* 6127 * Function: sd_ddi_suspend 6128 * 6129 * Description: Performs system power-down operations. This includes 6130 * setting the drive state to indicate its suspended so 6131 * that no new commands will be accepted. Also, wait for 6132 * all commands that are in transport or queued to a timer 6133 * for retry to complete. All timeout threads are cancelled. 6134 * 6135 * Return Code: DDI_FAILURE or DDI_SUCCESS 6136 * 6137 * Context: Kernel thread context 6138 */ 6139 6140 static int 6141 sd_ddi_suspend(dev_info_t *devi) 6142 { 6143 struct sd_lun *un; 6144 clock_t wait_cmds_complete; 6145 6146 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi)); 6147 if (un == NULL) { 6148 return (DDI_FAILURE); 6149 } 6150 6151 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: entry\n"); 6152 6153 mutex_enter(SD_MUTEX(un)); 6154 6155 /* Return success if the device is already suspended. */ 6156 if (un->un_state == SD_STATE_SUSPENDED) { 6157 mutex_exit(SD_MUTEX(un)); 6158 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: " 6159 "device already suspended, exiting\n"); 6160 return (DDI_SUCCESS); 6161 } 6162 6163 /* Return failure if the device is being used by HA */ 6164 if (un->un_resvd_status & 6165 (SD_RESERVE | SD_WANT_RESERVE | SD_LOST_RESERVE)) { 6166 mutex_exit(SD_MUTEX(un)); 6167 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: " 6168 "device in use by HA, exiting\n"); 6169 return (DDI_FAILURE); 6170 } 6171 6172 /* 6173 * Return failure if the device is in a resource wait 6174 * or power changing state. 6175 */ 6176 if ((un->un_state == SD_STATE_RWAIT) || 6177 (un->un_state == SD_STATE_PM_CHANGING)) { 6178 mutex_exit(SD_MUTEX(un)); 6179 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: " 6180 "device in resource wait state, exiting\n"); 6181 return (DDI_FAILURE); 6182 } 6183 6184 6185 un->un_save_state = un->un_last_state; 6186 New_state(un, SD_STATE_SUSPENDED); 6187 6188 /* 6189 * Wait for all commands that are in transport or queued to a timer 6190 * for retry to complete. 6191 * 6192 * While waiting, no new commands will be accepted or sent because of 6193 * the new state we set above. 6194 * 6195 * Wait till current operation has completed. If we are in the resource 6196 * wait state (with an intr outstanding) then we need to wait till the 6197 * intr completes and starts the next cmd. We want to wait for 6198 * SD_WAIT_CMDS_COMPLETE seconds before failing the DDI_SUSPEND. 6199 */ 6200 wait_cmds_complete = ddi_get_lbolt() + 6201 (sd_wait_cmds_complete * drv_usectohz(1000000)); 6202 6203 while (un->un_ncmds_in_transport != 0) { 6204 /* 6205 * Fail if commands do not finish in the specified time. 6206 */ 6207 if (cv_timedwait(&un->un_disk_busy_cv, SD_MUTEX(un), 6208 wait_cmds_complete) == -1) { 6209 /* 6210 * Undo the state changes made above. Everything 6211 * must go back to it's original value. 6212 */ 6213 Restore_state(un); 6214 un->un_last_state = un->un_save_state; 6215 /* Wake up any threads that might be waiting. */ 6216 cv_broadcast(&un->un_suspend_cv); 6217 mutex_exit(SD_MUTEX(un)); 6218 SD_ERROR(SD_LOG_IO_PM, un, 6219 "sd_ddi_suspend: failed due to outstanding cmds\n"); 6220 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: exiting\n"); 6221 return (DDI_FAILURE); 6222 } 6223 } 6224 6225 /* 6226 * Cancel SCSI watch thread and timeouts, if any are active 6227 */ 6228 6229 if (SD_OK_TO_SUSPEND_SCSI_WATCHER(un)) { 6230 opaque_t temp_token = un->un_swr_token; 6231 mutex_exit(SD_MUTEX(un)); 6232 scsi_watch_suspend(temp_token); 6233 mutex_enter(SD_MUTEX(un)); 6234 } 6235 6236 if (un->un_reset_throttle_timeid != NULL) { 6237 timeout_id_t temp_id = un->un_reset_throttle_timeid; 6238 un->un_reset_throttle_timeid = NULL; 6239 mutex_exit(SD_MUTEX(un)); 6240 (void) untimeout(temp_id); 6241 mutex_enter(SD_MUTEX(un)); 6242 } 6243 6244 if (un->un_dcvb_timeid != NULL) { 6245 timeout_id_t temp_id = un->un_dcvb_timeid; 6246 un->un_dcvb_timeid = NULL; 6247 mutex_exit(SD_MUTEX(un)); 6248 (void) untimeout(temp_id); 6249 mutex_enter(SD_MUTEX(un)); 6250 } 6251 6252 mutex_enter(&un->un_pm_mutex); 6253 if (un->un_pm_timeid != NULL) { 6254 timeout_id_t temp_id = un->un_pm_timeid; 6255 un->un_pm_timeid = NULL; 6256 mutex_exit(&un->un_pm_mutex); 6257 mutex_exit(SD_MUTEX(un)); 6258 (void) untimeout(temp_id); 6259 mutex_enter(SD_MUTEX(un)); 6260 } else { 6261 mutex_exit(&un->un_pm_mutex); 6262 } 6263 6264 if (un->un_rmw_msg_timeid != NULL) { 6265 timeout_id_t temp_id = un->un_rmw_msg_timeid; 6266 un->un_rmw_msg_timeid = NULL; 6267 mutex_exit(SD_MUTEX(un)); 6268 (void) untimeout(temp_id); 6269 mutex_enter(SD_MUTEX(un)); 6270 } 6271 6272 if (un->un_retry_timeid != NULL) { 6273 timeout_id_t temp_id = un->un_retry_timeid; 6274 un->un_retry_timeid = NULL; 6275 mutex_exit(SD_MUTEX(un)); 6276 (void) untimeout(temp_id); 6277 mutex_enter(SD_MUTEX(un)); 6278 6279 if (un->un_retry_bp != NULL) { 6280 un->un_retry_bp->av_forw = un->un_waitq_headp; 6281 un->un_waitq_headp = un->un_retry_bp; 6282 if (un->un_waitq_tailp == NULL) { 6283 un->un_waitq_tailp = un->un_retry_bp; 6284 } 6285 un->un_retry_bp = NULL; 6286 un->un_retry_statp = NULL; 6287 } 6288 } 6289 6290 if (un->un_direct_priority_timeid != NULL) { 6291 timeout_id_t temp_id = un->un_direct_priority_timeid; 6292 un->un_direct_priority_timeid = NULL; 6293 mutex_exit(SD_MUTEX(un)); 6294 (void) untimeout(temp_id); 6295 mutex_enter(SD_MUTEX(un)); 6296 } 6297 6298 if (un->un_f_is_fibre == TRUE) { 6299 /* 6300 * Remove callbacks for insert and remove events 6301 */ 6302 if (un->un_insert_event != NULL) { 6303 mutex_exit(SD_MUTEX(un)); 6304 (void) ddi_remove_event_handler(un->un_insert_cb_id); 6305 mutex_enter(SD_MUTEX(un)); 6306 un->un_insert_event = NULL; 6307 } 6308 6309 if (un->un_remove_event != NULL) { 6310 mutex_exit(SD_MUTEX(un)); 6311 (void) ddi_remove_event_handler(un->un_remove_cb_id); 6312 mutex_enter(SD_MUTEX(un)); 6313 un->un_remove_event = NULL; 6314 } 6315 } 6316 6317 mutex_exit(SD_MUTEX(un)); 6318 6319 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: exit\n"); 6320 6321 return (DDI_SUCCESS); 6322 } 6323 6324 6325 /* 6326 * Function: sd_ddi_resume 6327 * 6328 * Description: Performs system power-up operations.. 6329 * 6330 * Return Code: DDI_SUCCESS 6331 * DDI_FAILURE 6332 * 6333 * Context: Kernel thread context 6334 */ 6335 6336 static int 6337 sd_ddi_resume(dev_info_t *devi) 6338 { 6339 struct sd_lun *un; 6340 6341 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi)); 6342 if (un == NULL) { 6343 return (DDI_FAILURE); 6344 } 6345 6346 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_resume: entry\n"); 6347 6348 mutex_enter(SD_MUTEX(un)); 6349 Restore_state(un); 6350 6351 /* 6352 * Restore the state which was saved to give the 6353 * the right state in un_last_state 6354 */ 6355 un->un_last_state = un->un_save_state; 6356 /* 6357 * Note: throttle comes back at full. 6358 * Also note: this MUST be done before calling pm_raise_power 6359 * otherwise the system can get hung in biowait. The scenario where 6360 * this'll happen is under cpr suspend. Writing of the system 6361 * state goes through sddump, which writes 0 to un_throttle. If 6362 * writing the system state then fails, example if the partition is 6363 * too small, then cpr attempts a resume. If throttle isn't restored 6364 * from the saved value until after calling pm_raise_power then 6365 * cmds sent in sdpower are not transported and sd_send_scsi_cmd hangs 6366 * in biowait. 6367 */ 6368 un->un_throttle = un->un_saved_throttle; 6369 6370 /* 6371 * The chance of failure is very rare as the only command done in power 6372 * entry point is START command when you transition from 0->1 or 6373 * unknown->1. Put it to SPINDLE ON state irrespective of the state at 6374 * which suspend was done. Ignore the return value as the resume should 6375 * not be failed. In the case of removable media the media need not be 6376 * inserted and hence there is a chance that raise power will fail with 6377 * media not present. 6378 */ 6379 if (un->un_f_attach_spinup) { 6380 mutex_exit(SD_MUTEX(un)); 6381 (void) pm_raise_power(SD_DEVINFO(un), 0, 6382 SD_PM_STATE_ACTIVE(un)); 6383 mutex_enter(SD_MUTEX(un)); 6384 } 6385 6386 /* 6387 * Don't broadcast to the suspend cv and therefore possibly 6388 * start I/O until after power has been restored. 6389 */ 6390 cv_broadcast(&un->un_suspend_cv); 6391 cv_broadcast(&un->un_state_cv); 6392 6393 /* restart thread */ 6394 if (SD_OK_TO_RESUME_SCSI_WATCHER(un)) { 6395 scsi_watch_resume(un->un_swr_token); 6396 } 6397 6398 #if (defined(__fibre)) 6399 if (un->un_f_is_fibre == TRUE) { 6400 /* 6401 * Add callbacks for insert and remove events 6402 */ 6403 if (strcmp(un->un_node_type, DDI_NT_BLOCK_CHAN)) { 6404 sd_init_event_callbacks(un); 6405 } 6406 } 6407 #endif 6408 6409 /* 6410 * Transport any pending commands to the target. 6411 * 6412 * If this is a low-activity device commands in queue will have to wait 6413 * until new commands come in, which may take awhile. Also, we 6414 * specifically don't check un_ncmds_in_transport because we know that 6415 * there really are no commands in progress after the unit was 6416 * suspended and we could have reached the throttle level, been 6417 * suspended, and have no new commands coming in for awhile. Highly 6418 * unlikely, but so is the low-activity disk scenario. 6419 */ 6420 ddi_xbuf_dispatch(un->un_xbuf_attr); 6421 6422 sd_start_cmds(un, NULL); 6423 mutex_exit(SD_MUTEX(un)); 6424 6425 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_resume: exit\n"); 6426 6427 return (DDI_SUCCESS); 6428 } 6429 6430 6431 /* 6432 * Function: sd_pm_state_change 6433 * 6434 * Description: Change the driver power state. 6435 * Someone else is required to actually change the driver 6436 * power level. 6437 * 6438 * Arguments: un - driver soft state (unit) structure 6439 * level - the power level that is changed to 6440 * flag - to decide how to change the power state 6441 * 6442 * Return Code: DDI_SUCCESS 6443 * 6444 * Context: Kernel thread context 6445 */ 6446 static int 6447 sd_pm_state_change(struct sd_lun *un, int level, int flag) 6448 { 6449 ASSERT(un != NULL); 6450 SD_TRACE(SD_LOG_POWER, un, "sd_pm_state_change: entry\n"); 6451 6452 ASSERT(!mutex_owned(SD_MUTEX(un))); 6453 mutex_enter(SD_MUTEX(un)); 6454 6455 if (flag == SD_PM_STATE_ROLLBACK || SD_PM_IS_IO_CAPABLE(un, level)) { 6456 un->un_power_level = level; 6457 ASSERT(!mutex_owned(&un->un_pm_mutex)); 6458 mutex_enter(&un->un_pm_mutex); 6459 if (SD_DEVICE_IS_IN_LOW_POWER(un)) { 6460 un->un_pm_count++; 6461 ASSERT(un->un_pm_count == 0); 6462 } 6463 mutex_exit(&un->un_pm_mutex); 6464 } else { 6465 /* 6466 * Exit if power management is not enabled for this device, 6467 * or if the device is being used by HA. 6468 */ 6469 if ((un->un_f_pm_is_enabled == FALSE) || (un->un_resvd_status & 6470 (SD_RESERVE | SD_WANT_RESERVE | SD_LOST_RESERVE))) { 6471 mutex_exit(SD_MUTEX(un)); 6472 SD_TRACE(SD_LOG_POWER, un, 6473 "sd_pm_state_change: exiting\n"); 6474 return (DDI_FAILURE); 6475 } 6476 6477 SD_INFO(SD_LOG_POWER, un, "sd_pm_state_change: " 6478 "un_ncmds_in_driver=%ld\n", un->un_ncmds_in_driver); 6479 6480 /* 6481 * See if the device is not busy, ie.: 6482 * - we have no commands in the driver for this device 6483 * - not waiting for resources 6484 */ 6485 if ((un->un_ncmds_in_driver == 0) && 6486 (un->un_state != SD_STATE_RWAIT)) { 6487 /* 6488 * The device is not busy, so it is OK to go to low 6489 * power state. Indicate low power, but rely on someone 6490 * else to actually change it. 6491 */ 6492 mutex_enter(&un->un_pm_mutex); 6493 un->un_pm_count = -1; 6494 mutex_exit(&un->un_pm_mutex); 6495 un->un_power_level = level; 6496 } 6497 } 6498 6499 mutex_exit(SD_MUTEX(un)); 6500 6501 SD_TRACE(SD_LOG_POWER, un, "sd_pm_state_change: exit\n"); 6502 6503 return (DDI_SUCCESS); 6504 } 6505 6506 6507 /* 6508 * Function: sd_pm_idletimeout_handler 6509 * 6510 * Description: A timer routine that's active only while a device is busy. 6511 * The purpose is to extend slightly the pm framework's busy 6512 * view of the device to prevent busy/idle thrashing for 6513 * back-to-back commands. Do this by comparing the current time 6514 * to the time at which the last command completed and when the 6515 * difference is greater than sd_pm_idletime, call 6516 * pm_idle_component. In addition to indicating idle to the pm 6517 * framework, update the chain type to again use the internal pm 6518 * layers of the driver. 6519 * 6520 * Arguments: arg - driver soft state (unit) structure 6521 * 6522 * Context: Executes in a timeout(9F) thread context 6523 */ 6524 6525 static void 6526 sd_pm_idletimeout_handler(void *arg) 6527 { 6528 const hrtime_t idletime = sd_pm_idletime * NANOSEC; 6529 struct sd_lun *un = arg; 6530 6531 mutex_enter(&sd_detach_mutex); 6532 if (un->un_detach_count != 0) { 6533 /* Abort if the instance is detaching */ 6534 mutex_exit(&sd_detach_mutex); 6535 return; 6536 } 6537 mutex_exit(&sd_detach_mutex); 6538 6539 /* 6540 * Grab both mutexes, in the proper order, since we're accessing 6541 * both PM and softstate variables. 6542 */ 6543 mutex_enter(SD_MUTEX(un)); 6544 mutex_enter(&un->un_pm_mutex); 6545 if (((gethrtime() - un->un_pm_idle_time) > idletime) && 6546 (un->un_ncmds_in_driver == 0) && (un->un_pm_count == 0)) { 6547 /* 6548 * Update the chain types. 6549 * This takes affect on the next new command received. 6550 */ 6551 if (un->un_f_non_devbsize_supported) { 6552 un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA; 6553 } else { 6554 un->un_buf_chain_type = SD_CHAIN_INFO_DISK; 6555 } 6556 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD; 6557 6558 SD_TRACE(SD_LOG_IO_PM, un, 6559 "sd_pm_idletimeout_handler: idling device\n"); 6560 (void) pm_idle_component(SD_DEVINFO(un), 0); 6561 un->un_pm_idle_timeid = NULL; 6562 } else { 6563 un->un_pm_idle_timeid = 6564 timeout(sd_pm_idletimeout_handler, un, 6565 (drv_usectohz((clock_t)300000))); /* 300 ms. */ 6566 } 6567 mutex_exit(&un->un_pm_mutex); 6568 mutex_exit(SD_MUTEX(un)); 6569 } 6570 6571 6572 /* 6573 * Function: sd_pm_timeout_handler 6574 * 6575 * Description: Callback to tell framework we are idle. 6576 * 6577 * Context: timeout(9f) thread context. 6578 */ 6579 6580 static void 6581 sd_pm_timeout_handler(void *arg) 6582 { 6583 struct sd_lun *un = arg; 6584 6585 (void) pm_idle_component(SD_DEVINFO(un), 0); 6586 mutex_enter(&un->un_pm_mutex); 6587 un->un_pm_timeid = NULL; 6588 mutex_exit(&un->un_pm_mutex); 6589 } 6590 6591 6592 /* 6593 * Function: sdpower 6594 * 6595 * Description: PM entry point. 6596 * 6597 * Return Code: DDI_SUCCESS 6598 * DDI_FAILURE 6599 * 6600 * Context: Kernel thread context 6601 */ 6602 6603 static int 6604 sdpower(dev_info_t *devi, int component, int level) 6605 { 6606 struct sd_lun *un; 6607 int instance; 6608 int rval = DDI_SUCCESS; 6609 uint_t i, log_page_size, maxcycles, ncycles; 6610 uchar_t *log_page_data; 6611 int log_sense_page; 6612 int medium_present; 6613 time_t intvlp; 6614 struct pm_trans_data sd_pm_tran_data; 6615 uchar_t save_state = SD_STATE_NORMAL; 6616 int sval; 6617 uchar_t state_before_pm; 6618 int got_semaphore_here; 6619 sd_ssc_t *ssc; 6620 int last_power_level = SD_SPINDLE_UNINIT; 6621 6622 instance = ddi_get_instance(devi); 6623 6624 if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) || 6625 !SD_PM_IS_LEVEL_VALID(un, level) || component != 0) { 6626 return (DDI_FAILURE); 6627 } 6628 6629 ssc = sd_ssc_init(un); 6630 6631 SD_TRACE(SD_LOG_IO_PM, un, "sdpower: entry, level = %d\n", level); 6632 6633 /* 6634 * Must synchronize power down with close. 6635 * Attempt to decrement/acquire the open/close semaphore, 6636 * but do NOT wait on it. If it's not greater than zero, 6637 * ie. it can't be decremented without waiting, then 6638 * someone else, either open or close, already has it 6639 * and the try returns 0. Use that knowledge here to determine 6640 * if it's OK to change the device power level. 6641 * Also, only increment it on exit if it was decremented, ie. gotten, 6642 * here. 6643 */ 6644 got_semaphore_here = sema_tryp(&un->un_semoclose); 6645 6646 mutex_enter(SD_MUTEX(un)); 6647 6648 SD_INFO(SD_LOG_POWER, un, "sdpower: un_ncmds_in_driver = %ld\n", 6649 un->un_ncmds_in_driver); 6650 6651 /* 6652 * If un_ncmds_in_driver is non-zero it indicates commands are 6653 * already being processed in the driver, or if the semaphore was 6654 * not gotten here it indicates an open or close is being processed. 6655 * At the same time somebody is requesting to go to a lower power 6656 * that can't perform I/O, which can't happen, therefore we need to 6657 * return failure. 6658 */ 6659 if ((!SD_PM_IS_IO_CAPABLE(un, level)) && 6660 ((un->un_ncmds_in_driver != 0) || (got_semaphore_here == 0))) { 6661 mutex_exit(SD_MUTEX(un)); 6662 6663 if (got_semaphore_here != 0) { 6664 sema_v(&un->un_semoclose); 6665 } 6666 SD_TRACE(SD_LOG_IO_PM, un, 6667 "sdpower: exit, device has queued cmds.\n"); 6668 6669 goto sdpower_failed; 6670 } 6671 6672 /* 6673 * if it is OFFLINE that means the disk is completely dead 6674 * in our case we have to put the disk in on or off by sending commands 6675 * Of course that will fail anyway so return back here. 6676 * 6677 * Power changes to a device that's OFFLINE or SUSPENDED 6678 * are not allowed. 6679 */ 6680 if ((un->un_state == SD_STATE_OFFLINE) || 6681 (un->un_state == SD_STATE_SUSPENDED)) { 6682 mutex_exit(SD_MUTEX(un)); 6683 6684 if (got_semaphore_here != 0) { 6685 sema_v(&un->un_semoclose); 6686 } 6687 SD_TRACE(SD_LOG_IO_PM, un, 6688 "sdpower: exit, device is off-line.\n"); 6689 6690 goto sdpower_failed; 6691 } 6692 6693 /* 6694 * Change the device's state to indicate it's power level 6695 * is being changed. Do this to prevent a power off in the 6696 * middle of commands, which is especially bad on devices 6697 * that are really powered off instead of just spun down. 6698 */ 6699 state_before_pm = un->un_state; 6700 un->un_state = SD_STATE_PM_CHANGING; 6701 6702 mutex_exit(SD_MUTEX(un)); 6703 6704 /* 6705 * If log sense command is not supported, bypass the 6706 * following checking, otherwise, check the log sense 6707 * information for this device. 6708 */ 6709 if (SD_PM_STOP_MOTOR_NEEDED(un, level) && 6710 un->un_f_log_sense_supported) { 6711 /* 6712 * Get the log sense information to understand whether the 6713 * the powercycle counts have gone beyond the threshhold. 6714 */ 6715 log_page_size = START_STOP_CYCLE_COUNTER_PAGE_SIZE; 6716 log_page_data = kmem_zalloc(log_page_size, KM_SLEEP); 6717 6718 mutex_enter(SD_MUTEX(un)); 6719 log_sense_page = un->un_start_stop_cycle_page; 6720 mutex_exit(SD_MUTEX(un)); 6721 6722 rval = sd_send_scsi_LOG_SENSE(ssc, log_page_data, 6723 log_page_size, log_sense_page, 0x01, 0, SD_PATH_DIRECT); 6724 6725 if (rval != 0) { 6726 if (rval == EIO) 6727 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 6728 else 6729 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 6730 } 6731 6732 #ifdef SDDEBUG 6733 if (sd_force_pm_supported) { 6734 /* Force a successful result */ 6735 rval = 0; 6736 } 6737 #endif 6738 if (rval != 0) { 6739 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 6740 "Log Sense Failed\n"); 6741 6742 kmem_free(log_page_data, log_page_size); 6743 /* Cannot support power management on those drives */ 6744 6745 if (got_semaphore_here != 0) { 6746 sema_v(&un->un_semoclose); 6747 } 6748 /* 6749 * On exit put the state back to it's original value 6750 * and broadcast to anyone waiting for the power 6751 * change completion. 6752 */ 6753 mutex_enter(SD_MUTEX(un)); 6754 un->un_state = state_before_pm; 6755 cv_broadcast(&un->un_suspend_cv); 6756 mutex_exit(SD_MUTEX(un)); 6757 SD_TRACE(SD_LOG_IO_PM, un, 6758 "sdpower: exit, Log Sense Failed.\n"); 6759 6760 goto sdpower_failed; 6761 } 6762 6763 /* 6764 * From the page data - Convert the essential information to 6765 * pm_trans_data 6766 */ 6767 maxcycles = 6768 (log_page_data[0x1c] << 24) | (log_page_data[0x1d] << 16) | 6769 (log_page_data[0x1E] << 8) | log_page_data[0x1F]; 6770 6771 ncycles = 6772 (log_page_data[0x24] << 24) | (log_page_data[0x25] << 16) | 6773 (log_page_data[0x26] << 8) | log_page_data[0x27]; 6774 6775 if (un->un_f_pm_log_sense_smart) { 6776 sd_pm_tran_data.un.smart_count.allowed = maxcycles; 6777 sd_pm_tran_data.un.smart_count.consumed = ncycles; 6778 sd_pm_tran_data.un.smart_count.flag = 0; 6779 sd_pm_tran_data.format = DC_SMART_FORMAT; 6780 } else { 6781 sd_pm_tran_data.un.scsi_cycles.lifemax = maxcycles; 6782 sd_pm_tran_data.un.scsi_cycles.ncycles = ncycles; 6783 for (i = 0; i < DC_SCSI_MFR_LEN; i++) { 6784 sd_pm_tran_data.un.scsi_cycles.svc_date[i] = 6785 log_page_data[8+i]; 6786 } 6787 sd_pm_tran_data.un.scsi_cycles.flag = 0; 6788 sd_pm_tran_data.format = DC_SCSI_FORMAT; 6789 } 6790 6791 kmem_free(log_page_data, log_page_size); 6792 6793 /* 6794 * Call pm_trans_check routine to get the Ok from 6795 * the global policy 6796 */ 6797 rval = pm_trans_check(&sd_pm_tran_data, &intvlp); 6798 #ifdef SDDEBUG 6799 if (sd_force_pm_supported) { 6800 /* Force a successful result */ 6801 rval = 1; 6802 } 6803 #endif 6804 switch (rval) { 6805 case 0: 6806 /* 6807 * Not Ok to Power cycle or error in parameters passed 6808 * Would have given the advised time to consider power 6809 * cycle. Based on the new intvlp parameter we are 6810 * supposed to pretend we are busy so that pm framework 6811 * will never call our power entry point. Because of 6812 * that install a timeout handler and wait for the 6813 * recommended time to elapse so that power management 6814 * can be effective again. 6815 * 6816 * To effect this behavior, call pm_busy_component to 6817 * indicate to the framework this device is busy. 6818 * By not adjusting un_pm_count the rest of PM in 6819 * the driver will function normally, and independent 6820 * of this but because the framework is told the device 6821 * is busy it won't attempt powering down until it gets 6822 * a matching idle. The timeout handler sends this. 6823 * Note: sd_pm_entry can't be called here to do this 6824 * because sdpower may have been called as a result 6825 * of a call to pm_raise_power from within sd_pm_entry. 6826 * 6827 * If a timeout handler is already active then 6828 * don't install another. 6829 */ 6830 mutex_enter(&un->un_pm_mutex); 6831 if (un->un_pm_timeid == NULL) { 6832 un->un_pm_timeid = 6833 timeout(sd_pm_timeout_handler, 6834 un, intvlp * drv_usectohz(1000000)); 6835 mutex_exit(&un->un_pm_mutex); 6836 (void) pm_busy_component(SD_DEVINFO(un), 0); 6837 } else { 6838 mutex_exit(&un->un_pm_mutex); 6839 } 6840 if (got_semaphore_here != 0) { 6841 sema_v(&un->un_semoclose); 6842 } 6843 /* 6844 * On exit put the state back to it's original value 6845 * and broadcast to anyone waiting for the power 6846 * change completion. 6847 */ 6848 mutex_enter(SD_MUTEX(un)); 6849 un->un_state = state_before_pm; 6850 cv_broadcast(&un->un_suspend_cv); 6851 mutex_exit(SD_MUTEX(un)); 6852 6853 SD_TRACE(SD_LOG_IO_PM, un, "sdpower: exit, " 6854 "trans check Failed, not ok to power cycle.\n"); 6855 6856 goto sdpower_failed; 6857 case -1: 6858 if (got_semaphore_here != 0) { 6859 sema_v(&un->un_semoclose); 6860 } 6861 /* 6862 * On exit put the state back to it's original value 6863 * and broadcast to anyone waiting for the power 6864 * change completion. 6865 */ 6866 mutex_enter(SD_MUTEX(un)); 6867 un->un_state = state_before_pm; 6868 cv_broadcast(&un->un_suspend_cv); 6869 mutex_exit(SD_MUTEX(un)); 6870 SD_TRACE(SD_LOG_IO_PM, un, 6871 "sdpower: exit, trans check command Failed.\n"); 6872 6873 goto sdpower_failed; 6874 } 6875 } 6876 6877 if (!SD_PM_IS_IO_CAPABLE(un, level)) { 6878 /* 6879 * Save the last state... if the STOP FAILS we need it 6880 * for restoring 6881 */ 6882 mutex_enter(SD_MUTEX(un)); 6883 save_state = un->un_last_state; 6884 last_power_level = un->un_power_level; 6885 /* 6886 * There must not be any cmds. getting processed 6887 * in the driver when we get here. Power to the 6888 * device is potentially going off. 6889 */ 6890 ASSERT(un->un_ncmds_in_driver == 0); 6891 mutex_exit(SD_MUTEX(un)); 6892 6893 /* 6894 * For now PM suspend the device completely before spindle is 6895 * turned off 6896 */ 6897 if ((rval = sd_pm_state_change(un, level, SD_PM_STATE_CHANGE)) 6898 == DDI_FAILURE) { 6899 if (got_semaphore_here != 0) { 6900 sema_v(&un->un_semoclose); 6901 } 6902 /* 6903 * On exit put the state back to it's original value 6904 * and broadcast to anyone waiting for the power 6905 * change completion. 6906 */ 6907 mutex_enter(SD_MUTEX(un)); 6908 un->un_state = state_before_pm; 6909 un->un_power_level = last_power_level; 6910 cv_broadcast(&un->un_suspend_cv); 6911 mutex_exit(SD_MUTEX(un)); 6912 SD_TRACE(SD_LOG_IO_PM, un, 6913 "sdpower: exit, PM suspend Failed.\n"); 6914 6915 goto sdpower_failed; 6916 } 6917 } 6918 6919 /* 6920 * The transition from SPINDLE_OFF to SPINDLE_ON can happen in open, 6921 * close, or strategy. Dump no long uses this routine, it uses it's 6922 * own code so it can be done in polled mode. 6923 */ 6924 6925 medium_present = TRUE; 6926 6927 /* 6928 * When powering up, issue a TUR in case the device is at unit 6929 * attention. Don't do retries. Bypass the PM layer, otherwise 6930 * a deadlock on un_pm_busy_cv will occur. 6931 */ 6932 if (SD_PM_IS_IO_CAPABLE(un, level)) { 6933 sval = sd_send_scsi_TEST_UNIT_READY(ssc, 6934 SD_DONT_RETRY_TUR | SD_BYPASS_PM); 6935 if (sval != 0) 6936 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 6937 } 6938 6939 if (un->un_f_power_condition_supported) { 6940 char *pm_condition_name[] = {"STOPPED", "STANDBY", 6941 "IDLE", "ACTIVE"}; 6942 SD_TRACE(SD_LOG_IO_PM, un, 6943 "sdpower: sending \'%s\' power condition", 6944 pm_condition_name[level]); 6945 sval = sd_send_scsi_START_STOP_UNIT(ssc, SD_POWER_CONDITION, 6946 sd_pl2pc[level], SD_PATH_DIRECT); 6947 } else { 6948 SD_TRACE(SD_LOG_IO_PM, un, "sdpower: sending \'%s\' unit\n", 6949 ((level == SD_SPINDLE_ON) ? "START" : "STOP")); 6950 sval = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP, 6951 ((level == SD_SPINDLE_ON) ? SD_TARGET_START : 6952 SD_TARGET_STOP), SD_PATH_DIRECT); 6953 } 6954 if (sval != 0) { 6955 if (sval == EIO) 6956 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 6957 else 6958 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 6959 } 6960 6961 /* Command failed, check for media present. */ 6962 if ((sval == ENXIO) && un->un_f_has_removable_media) { 6963 medium_present = FALSE; 6964 } 6965 6966 /* 6967 * The conditions of interest here are: 6968 * if a spindle off with media present fails, 6969 * then restore the state and return an error. 6970 * else if a spindle on fails, 6971 * then return an error (there's no state to restore). 6972 * In all other cases we setup for the new state 6973 * and return success. 6974 */ 6975 if (!SD_PM_IS_IO_CAPABLE(un, level)) { 6976 if ((medium_present == TRUE) && (sval != 0)) { 6977 /* The stop command from above failed */ 6978 rval = DDI_FAILURE; 6979 /* 6980 * The stop command failed, and we have media 6981 * present. Put the level back by calling the 6982 * sd_pm_resume() and set the state back to 6983 * it's previous value. 6984 */ 6985 (void) sd_pm_state_change(un, last_power_level, 6986 SD_PM_STATE_ROLLBACK); 6987 mutex_enter(SD_MUTEX(un)); 6988 un->un_last_state = save_state; 6989 mutex_exit(SD_MUTEX(un)); 6990 } else if (un->un_f_monitor_media_state) { 6991 /* 6992 * The stop command from above succeeded. 6993 * Terminate watch thread in case of removable media 6994 * devices going into low power state. This is as per 6995 * the requirements of pm framework, otherwise commands 6996 * will be generated for the device (through watch 6997 * thread), even when the device is in low power state. 6998 */ 6999 mutex_enter(SD_MUTEX(un)); 7000 un->un_f_watcht_stopped = FALSE; 7001 if (un->un_swr_token != NULL) { 7002 opaque_t temp_token = un->un_swr_token; 7003 un->un_f_watcht_stopped = TRUE; 7004 un->un_swr_token = NULL; 7005 mutex_exit(SD_MUTEX(un)); 7006 (void) scsi_watch_request_terminate(temp_token, 7007 SCSI_WATCH_TERMINATE_ALL_WAIT); 7008 } else { 7009 mutex_exit(SD_MUTEX(un)); 7010 } 7011 } 7012 } else { 7013 /* 7014 * The level requested is I/O capable. 7015 * Legacy behavior: return success on a failed spinup 7016 * if there is no media in the drive. 7017 * Do this by looking at medium_present here. 7018 */ 7019 if ((sval != 0) && medium_present) { 7020 /* The start command from above failed */ 7021 rval = DDI_FAILURE; 7022 } else { 7023 /* 7024 * The start command from above succeeded 7025 * PM resume the devices now that we have 7026 * started the disks 7027 */ 7028 (void) sd_pm_state_change(un, level, 7029 SD_PM_STATE_CHANGE); 7030 7031 /* 7032 * Resume the watch thread since it was suspended 7033 * when the device went into low power mode. 7034 */ 7035 if (un->un_f_monitor_media_state) { 7036 mutex_enter(SD_MUTEX(un)); 7037 if (un->un_f_watcht_stopped == TRUE) { 7038 opaque_t temp_token; 7039 7040 un->un_f_watcht_stopped = FALSE; 7041 mutex_exit(SD_MUTEX(un)); 7042 temp_token = 7043 sd_watch_request_submit(un); 7044 mutex_enter(SD_MUTEX(un)); 7045 un->un_swr_token = temp_token; 7046 } 7047 mutex_exit(SD_MUTEX(un)); 7048 } 7049 } 7050 } 7051 7052 if (got_semaphore_here != 0) { 7053 sema_v(&un->un_semoclose); 7054 } 7055 /* 7056 * On exit put the state back to it's original value 7057 * and broadcast to anyone waiting for the power 7058 * change completion. 7059 */ 7060 mutex_enter(SD_MUTEX(un)); 7061 un->un_state = state_before_pm; 7062 cv_broadcast(&un->un_suspend_cv); 7063 mutex_exit(SD_MUTEX(un)); 7064 7065 SD_TRACE(SD_LOG_IO_PM, un, "sdpower: exit, status = 0x%x\n", rval); 7066 7067 sd_ssc_fini(ssc); 7068 return (rval); 7069 7070 sdpower_failed: 7071 7072 sd_ssc_fini(ssc); 7073 return (DDI_FAILURE); 7074 } 7075 7076 7077 7078 /* 7079 * Function: sdattach 7080 * 7081 * Description: Driver's attach(9e) entry point function. 7082 * 7083 * Arguments: devi - opaque device info handle 7084 * cmd - attach type 7085 * 7086 * Return Code: DDI_SUCCESS 7087 * DDI_FAILURE 7088 * 7089 * Context: Kernel thread context 7090 */ 7091 7092 static int 7093 sdattach(dev_info_t *devi, ddi_attach_cmd_t cmd) 7094 { 7095 switch (cmd) { 7096 case DDI_ATTACH: 7097 return (sd_unit_attach(devi)); 7098 case DDI_RESUME: 7099 return (sd_ddi_resume(devi)); 7100 default: 7101 break; 7102 } 7103 return (DDI_FAILURE); 7104 } 7105 7106 7107 /* 7108 * Function: sddetach 7109 * 7110 * Description: Driver's detach(9E) entry point function. 7111 * 7112 * Arguments: devi - opaque device info handle 7113 * cmd - detach type 7114 * 7115 * Return Code: DDI_SUCCESS 7116 * DDI_FAILURE 7117 * 7118 * Context: Kernel thread context 7119 */ 7120 7121 static int 7122 sddetach(dev_info_t *devi, ddi_detach_cmd_t cmd) 7123 { 7124 switch (cmd) { 7125 case DDI_DETACH: 7126 return (sd_unit_detach(devi)); 7127 case DDI_SUSPEND: 7128 return (sd_ddi_suspend(devi)); 7129 default: 7130 break; 7131 } 7132 return (DDI_FAILURE); 7133 } 7134 7135 7136 /* 7137 * Function: sd_sync_with_callback 7138 * 7139 * Description: Prevents sd_unit_attach or sd_unit_detach from freeing the soft 7140 * state while the callback routine is active. 7141 * 7142 * Arguments: un: softstate structure for the instance 7143 * 7144 * Context: Kernel thread context 7145 */ 7146 7147 static void 7148 sd_sync_with_callback(struct sd_lun *un) 7149 { 7150 ASSERT(un != NULL); 7151 7152 mutex_enter(SD_MUTEX(un)); 7153 7154 ASSERT(un->un_in_callback >= 0); 7155 7156 while (un->un_in_callback > 0) { 7157 mutex_exit(SD_MUTEX(un)); 7158 delay(2); 7159 mutex_enter(SD_MUTEX(un)); 7160 } 7161 7162 mutex_exit(SD_MUTEX(un)); 7163 } 7164 7165 /* 7166 * Function: sd_unit_attach 7167 * 7168 * Description: Performs DDI_ATTACH processing for sdattach(). Allocates 7169 * the soft state structure for the device and performs 7170 * all necessary structure and device initializations. 7171 * 7172 * Arguments: devi: the system's dev_info_t for the device. 7173 * 7174 * Return Code: DDI_SUCCESS if attach is successful. 7175 * DDI_FAILURE if any part of the attach fails. 7176 * 7177 * Context: Called at attach(9e) time for the DDI_ATTACH flag. 7178 * Kernel thread context only. Can sleep. 7179 */ 7180 7181 static int 7182 sd_unit_attach(dev_info_t *devi) 7183 { 7184 struct scsi_device *devp; 7185 struct sd_lun *un; 7186 char *variantp; 7187 char name_str[48]; 7188 int reservation_flag = SD_TARGET_IS_UNRESERVED; 7189 int instance; 7190 int rval; 7191 int wc_enabled; 7192 int wc_changeable; 7193 int tgt; 7194 uint64_t capacity; 7195 uint_t lbasize = 0; 7196 dev_info_t *pdip = ddi_get_parent(devi); 7197 int offbyone = 0; 7198 int geom_label_valid = 0; 7199 sd_ssc_t *ssc; 7200 int status; 7201 struct sd_fm_internal *sfip = NULL; 7202 int max_xfer_size; 7203 7204 /* 7205 * Retrieve the target driver's private data area. This was set 7206 * up by the HBA. 7207 */ 7208 devp = ddi_get_driver_private(devi); 7209 7210 /* 7211 * Retrieve the target ID of the device. 7212 */ 7213 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS, 7214 SCSI_ADDR_PROP_TARGET, -1); 7215 7216 /* 7217 * Since we have no idea what state things were left in by the last 7218 * user of the device, set up some 'default' settings, ie. turn 'em 7219 * off. The scsi_ifsetcap calls force re-negotiations with the drive. 7220 * Do this before the scsi_probe, which sends an inquiry. 7221 * This is a fix for bug (4430280). 7222 * Of special importance is wide-xfer. The drive could have been left 7223 * in wide transfer mode by the last driver to communicate with it, 7224 * this includes us. If that's the case, and if the following is not 7225 * setup properly or we don't re-negotiate with the drive prior to 7226 * transferring data to/from the drive, it causes bus parity errors, 7227 * data overruns, and unexpected interrupts. This first occurred when 7228 * the fix for bug (4378686) was made. 7229 */ 7230 (void) scsi_ifsetcap(&devp->sd_address, "lun-reset", 0, 1); 7231 (void) scsi_ifsetcap(&devp->sd_address, "wide-xfer", 0, 1); 7232 (void) scsi_ifsetcap(&devp->sd_address, "auto-rqsense", 0, 1); 7233 7234 /* 7235 * Currently, scsi_ifsetcap sets tagged-qing capability for all LUNs 7236 * on a target. Setting it per lun instance actually sets the 7237 * capability of this target, which affects those luns already 7238 * attached on the same target. So during attach, we can only disable 7239 * this capability only when no other lun has been attached on this 7240 * target. By doing this, we assume a target has the same tagged-qing 7241 * capability for every lun. The condition can be removed when HBA 7242 * is changed to support per lun based tagged-qing capability. 7243 */ 7244 if (sd_scsi_get_target_lun_count(pdip, tgt) < 1) { 7245 (void) scsi_ifsetcap(&devp->sd_address, "tagged-qing", 0, 1); 7246 } 7247 7248 /* 7249 * Use scsi_probe() to issue an INQUIRY command to the device. 7250 * This call will allocate and fill in the scsi_inquiry structure 7251 * and point the sd_inq member of the scsi_device structure to it. 7252 * If the attach succeeds, then this memory will not be de-allocated 7253 * (via scsi_unprobe()) until the instance is detached. 7254 */ 7255 if (scsi_probe(devp, SLEEP_FUNC) != SCSIPROBE_EXISTS) { 7256 goto probe_failed; 7257 } 7258 7259 /* 7260 * Check the device type as specified in the inquiry data and 7261 * claim it if it is of a type that we support. 7262 */ 7263 switch (devp->sd_inq->inq_dtype) { 7264 case DTYPE_DIRECT: 7265 break; 7266 case DTYPE_RODIRECT: 7267 break; 7268 case DTYPE_OPTICAL: 7269 break; 7270 case DTYPE_NOTPRESENT: 7271 default: 7272 /* Unsupported device type; fail the attach. */ 7273 goto probe_failed; 7274 } 7275 7276 /* 7277 * Allocate the soft state structure for this unit. 7278 * 7279 * We rely upon this memory being set to all zeroes by 7280 * ddi_soft_state_zalloc(). We assume that any member of the 7281 * soft state structure that is not explicitly initialized by 7282 * this routine will have a value of zero. 7283 */ 7284 instance = ddi_get_instance(devp->sd_dev); 7285 if (ddi_soft_state_zalloc(sd_state, instance) != DDI_SUCCESS) { 7286 goto probe_failed; 7287 } 7288 7289 /* 7290 * Retrieve a pointer to the newly-allocated soft state. 7291 * 7292 * This should NEVER fail if the ddi_soft_state_zalloc() call above 7293 * was successful, unless something has gone horribly wrong and the 7294 * ddi's soft state internals are corrupt (in which case it is 7295 * probably better to halt here than just fail the attach....) 7296 */ 7297 if ((un = ddi_get_soft_state(sd_state, instance)) == NULL) { 7298 panic("sd_unit_attach: NULL soft state on instance:0x%x", 7299 instance); 7300 /*NOTREACHED*/ 7301 } 7302 7303 /* 7304 * Link the back ptr of the driver soft state to the scsi_device 7305 * struct for this lun. 7306 * Save a pointer to the softstate in the driver-private area of 7307 * the scsi_device struct. 7308 * Note: We cannot call SD_INFO, SD_TRACE, SD_ERROR, or SD_DIAG until 7309 * we first set un->un_sd below. 7310 */ 7311 un->un_sd = devp; 7312 devp->sd_private = (opaque_t)un; 7313 7314 /* 7315 * The following must be after devp is stored in the soft state struct. 7316 */ 7317 #ifdef SDDEBUG 7318 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 7319 "%s_unit_attach: un:0x%p instance:%d\n", 7320 ddi_driver_name(devi), un, instance); 7321 #endif 7322 7323 /* 7324 * Set up the device type and node type (for the minor nodes). 7325 * By default we assume that the device can at least support the 7326 * Common Command Set. Call it a CD-ROM if it reports itself 7327 * as a RODIRECT device. 7328 */ 7329 switch (devp->sd_inq->inq_dtype) { 7330 case DTYPE_RODIRECT: 7331 un->un_node_type = DDI_NT_CD_CHAN; 7332 un->un_ctype = CTYPE_CDROM; 7333 break; 7334 case DTYPE_OPTICAL: 7335 un->un_node_type = DDI_NT_BLOCK_CHAN; 7336 un->un_ctype = CTYPE_ROD; 7337 break; 7338 default: 7339 un->un_node_type = DDI_NT_BLOCK_CHAN; 7340 un->un_ctype = CTYPE_CCS; 7341 break; 7342 } 7343 7344 /* 7345 * Try to read the interconnect type from the HBA. 7346 * 7347 * Note: This driver is currently compiled as two binaries, a parallel 7348 * scsi version (sd) and a fibre channel version (ssd). All functional 7349 * differences are determined at compile time. In the future a single 7350 * binary will be provided and the interconnect type will be used to 7351 * differentiate between fibre and parallel scsi behaviors. At that time 7352 * it will be necessary for all fibre channel HBAs to support this 7353 * property. 7354 * 7355 * set un_f_is_fiber to TRUE ( default fiber ) 7356 */ 7357 un->un_f_is_fibre = TRUE; 7358 switch (scsi_ifgetcap(SD_ADDRESS(un), "interconnect-type", -1)) { 7359 case INTERCONNECT_SSA: 7360 un->un_interconnect_type = SD_INTERCONNECT_SSA; 7361 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7362 "sd_unit_attach: un:0x%p SD_INTERCONNECT_SSA\n", un); 7363 break; 7364 case INTERCONNECT_PARALLEL: 7365 un->un_f_is_fibre = FALSE; 7366 un->un_interconnect_type = SD_INTERCONNECT_PARALLEL; 7367 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7368 "sd_unit_attach: un:0x%p SD_INTERCONNECT_PARALLEL\n", un); 7369 break; 7370 case INTERCONNECT_SAS: 7371 un->un_f_is_fibre = FALSE; 7372 un->un_interconnect_type = SD_INTERCONNECT_SAS; 7373 un->un_node_type = DDI_NT_BLOCK_SAS; 7374 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7375 "sd_unit_attach: un:0x%p SD_INTERCONNECT_SAS\n", un); 7376 break; 7377 case INTERCONNECT_SATA: 7378 un->un_f_is_fibre = FALSE; 7379 un->un_interconnect_type = SD_INTERCONNECT_SATA; 7380 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7381 "sd_unit_attach: un:0x%p SD_INTERCONNECT_SATA\n", un); 7382 break; 7383 case INTERCONNECT_FIBRE: 7384 un->un_interconnect_type = SD_INTERCONNECT_FIBRE; 7385 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7386 "sd_unit_attach: un:0x%p SD_INTERCONNECT_FIBRE\n", un); 7387 break; 7388 case INTERCONNECT_FABRIC: 7389 un->un_interconnect_type = SD_INTERCONNECT_FABRIC; 7390 un->un_node_type = DDI_NT_BLOCK_FABRIC; 7391 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7392 "sd_unit_attach: un:0x%p SD_INTERCONNECT_FABRIC\n", un); 7393 break; 7394 default: 7395 #ifdef SD_DEFAULT_INTERCONNECT_TYPE 7396 /* 7397 * The HBA does not support the "interconnect-type" property 7398 * (or did not provide a recognized type). 7399 * 7400 * Note: This will be obsoleted when a single fibre channel 7401 * and parallel scsi driver is delivered. In the meantime the 7402 * interconnect type will be set to the platform default.If that 7403 * type is not parallel SCSI, it means that we should be 7404 * assuming "ssd" semantics. However, here this also means that 7405 * the FC HBA is not supporting the "interconnect-type" property 7406 * like we expect it to, so log this occurrence. 7407 */ 7408 un->un_interconnect_type = SD_DEFAULT_INTERCONNECT_TYPE; 7409 if (!SD_IS_PARALLEL_SCSI(un)) { 7410 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7411 "sd_unit_attach: un:0x%p Assuming " 7412 "INTERCONNECT_FIBRE\n", un); 7413 } else { 7414 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7415 "sd_unit_attach: un:0x%p Assuming " 7416 "INTERCONNECT_PARALLEL\n", un); 7417 un->un_f_is_fibre = FALSE; 7418 } 7419 #else 7420 /* 7421 * Note: This source will be implemented when a single fibre 7422 * channel and parallel scsi driver is delivered. The default 7423 * will be to assume that if a device does not support the 7424 * "interconnect-type" property it is a parallel SCSI HBA and 7425 * we will set the interconnect type for parallel scsi. 7426 */ 7427 un->un_interconnect_type = SD_INTERCONNECT_PARALLEL; 7428 un->un_f_is_fibre = FALSE; 7429 #endif 7430 break; 7431 } 7432 7433 if (un->un_f_is_fibre == TRUE) { 7434 if (scsi_ifgetcap(SD_ADDRESS(un), "scsi-version", 1) == 7435 SCSI_VERSION_3) { 7436 switch (un->un_interconnect_type) { 7437 case SD_INTERCONNECT_FIBRE: 7438 case SD_INTERCONNECT_SSA: 7439 un->un_node_type = DDI_NT_BLOCK_WWN; 7440 break; 7441 default: 7442 break; 7443 } 7444 } 7445 } 7446 7447 /* 7448 * Initialize the Request Sense command for the target 7449 */ 7450 if (sd_alloc_rqs(devp, un) != DDI_SUCCESS) { 7451 goto alloc_rqs_failed; 7452 } 7453 7454 /* 7455 * Set un_retry_count with SD_RETRY_COUNT, this is ok for Sparc 7456 * with separate binary for sd and ssd. 7457 * 7458 * x86 has 1 binary, un_retry_count is set base on connection type. 7459 * The hardcoded values will go away when Sparc uses 1 binary 7460 * for sd and ssd. This hardcoded values need to match 7461 * SD_RETRY_COUNT in sddef.h 7462 * The value used is base on interconnect type. 7463 * fibre = 3, parallel = 5 7464 */ 7465 #if defined(__i386) || defined(__amd64) 7466 un->un_retry_count = un->un_f_is_fibre ? 3 : 5; 7467 #else 7468 un->un_retry_count = SD_RETRY_COUNT; 7469 #endif 7470 7471 /* 7472 * Set the per disk retry count to the default number of retries 7473 * for disks and CDROMs. This value can be overridden by the 7474 * disk property list or an entry in sd.conf. 7475 */ 7476 un->un_notready_retry_count = 7477 ISCD(un) ? CD_NOT_READY_RETRY_COUNT(un) 7478 : DISK_NOT_READY_RETRY_COUNT(un); 7479 7480 /* 7481 * Set the busy retry count to the default value of un_retry_count. 7482 * This can be overridden by entries in sd.conf or the device 7483 * config table. 7484 */ 7485 un->un_busy_retry_count = un->un_retry_count; 7486 7487 /* 7488 * Init the reset threshold for retries. This number determines 7489 * how many retries must be performed before a reset can be issued 7490 * (for certain error conditions). This can be overridden by entries 7491 * in sd.conf or the device config table. 7492 */ 7493 un->un_reset_retry_count = (un->un_retry_count / 2); 7494 7495 /* 7496 * Set the victim_retry_count to the default un_retry_count 7497 */ 7498 un->un_victim_retry_count = (2 * un->un_retry_count); 7499 7500 /* 7501 * Set the reservation release timeout to the default value of 7502 * 5 seconds. This can be overridden by entries in ssd.conf or the 7503 * device config table. 7504 */ 7505 un->un_reserve_release_time = 5; 7506 7507 /* 7508 * Set up the default maximum transfer size. Note that this may 7509 * get updated later in the attach, when setting up default wide 7510 * operations for disks. 7511 */ 7512 #if defined(__i386) || defined(__amd64) 7513 un->un_max_xfer_size = (uint_t)SD_DEFAULT_MAX_XFER_SIZE; 7514 un->un_partial_dma_supported = 1; 7515 #else 7516 un->un_max_xfer_size = (uint_t)maxphys; 7517 #endif 7518 7519 /* 7520 * Get "allow bus device reset" property (defaults to "enabled" if 7521 * the property was not defined). This is to disable bus resets for 7522 * certain kinds of error recovery. Note: In the future when a run-time 7523 * fibre check is available the soft state flag should default to 7524 * enabled. 7525 */ 7526 if (un->un_f_is_fibre == TRUE) { 7527 un->un_f_allow_bus_device_reset = TRUE; 7528 } else { 7529 if (ddi_getprop(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS, 7530 "allow-bus-device-reset", 1) != 0) { 7531 un->un_f_allow_bus_device_reset = TRUE; 7532 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7533 "sd_unit_attach: un:0x%p Bus device reset " 7534 "enabled\n", un); 7535 } else { 7536 un->un_f_allow_bus_device_reset = FALSE; 7537 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7538 "sd_unit_attach: un:0x%p Bus device reset " 7539 "disabled\n", un); 7540 } 7541 } 7542 7543 /* 7544 * Check if this is an ATAPI device. ATAPI devices use Group 1 7545 * Read/Write commands and Group 2 Mode Sense/Select commands. 7546 * 7547 * Note: The "obsolete" way of doing this is to check for the "atapi" 7548 * property. The new "variant" property with a value of "atapi" has been 7549 * introduced so that future 'variants' of standard SCSI behavior (like 7550 * atapi) could be specified by the underlying HBA drivers by supplying 7551 * a new value for the "variant" property, instead of having to define a 7552 * new property. 7553 */ 7554 if (ddi_prop_get_int(DDI_DEV_T_ANY, devi, 0, "atapi", -1) != -1) { 7555 un->un_f_cfg_is_atapi = TRUE; 7556 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7557 "sd_unit_attach: un:0x%p Atapi device\n", un); 7558 } 7559 if (ddi_prop_lookup_string(DDI_DEV_T_ANY, devi, 0, "variant", 7560 &variantp) == DDI_PROP_SUCCESS) { 7561 if (strcmp(variantp, "atapi") == 0) { 7562 un->un_f_cfg_is_atapi = TRUE; 7563 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7564 "sd_unit_attach: un:0x%p Atapi device\n", un); 7565 } 7566 ddi_prop_free(variantp); 7567 } 7568 7569 un->un_cmd_timeout = SD_IO_TIME; 7570 7571 un->un_busy_timeout = SD_BSY_TIMEOUT; 7572 7573 /* Info on current states, statuses, etc. (Updated frequently) */ 7574 un->un_state = SD_STATE_NORMAL; 7575 un->un_last_state = SD_STATE_NORMAL; 7576 7577 /* Control & status info for command throttling */ 7578 un->un_throttle = sd_max_throttle; 7579 un->un_saved_throttle = sd_max_throttle; 7580 un->un_min_throttle = sd_min_throttle; 7581 7582 if (un->un_f_is_fibre == TRUE) { 7583 un->un_f_use_adaptive_throttle = TRUE; 7584 } else { 7585 un->un_f_use_adaptive_throttle = FALSE; 7586 } 7587 7588 /* Removable media support. */ 7589 cv_init(&un->un_state_cv, NULL, CV_DRIVER, NULL); 7590 un->un_mediastate = DKIO_NONE; 7591 un->un_specified_mediastate = DKIO_NONE; 7592 7593 /* CVs for suspend/resume (PM or DR) */ 7594 cv_init(&un->un_suspend_cv, NULL, CV_DRIVER, NULL); 7595 cv_init(&un->un_disk_busy_cv, NULL, CV_DRIVER, NULL); 7596 7597 /* Power management support. */ 7598 un->un_power_level = SD_SPINDLE_UNINIT; 7599 7600 cv_init(&un->un_wcc_cv, NULL, CV_DRIVER, NULL); 7601 un->un_f_wcc_inprog = 0; 7602 7603 /* 7604 * The open/close semaphore is used to serialize threads executing 7605 * in the driver's open & close entry point routines for a given 7606 * instance. 7607 */ 7608 (void) sema_init(&un->un_semoclose, 1, NULL, SEMA_DRIVER, NULL); 7609 7610 /* 7611 * The conf file entry and softstate variable is a forceful override, 7612 * meaning a non-zero value must be entered to change the default. 7613 */ 7614 un->un_f_disksort_disabled = FALSE; 7615 un->un_f_rmw_type = SD_RMW_TYPE_DEFAULT; 7616 un->un_f_enable_rmw = FALSE; 7617 7618 /* 7619 * GET EVENT STATUS NOTIFICATION media polling enabled by default, but 7620 * can be overridden via [s]sd-config-list "mmc-gesn-polling" property. 7621 */ 7622 un->un_f_mmc_gesn_polling = TRUE; 7623 7624 /* 7625 * physical sector size defaults to DEV_BSIZE currently. We can 7626 * override this value via the driver configuration file so we must 7627 * set it before calling sd_read_unit_properties(). 7628 */ 7629 un->un_phy_blocksize = DEV_BSIZE; 7630 7631 /* 7632 * Retrieve the properties from the static driver table or the driver 7633 * configuration file (.conf) for this unit and update the soft state 7634 * for the device as needed for the indicated properties. 7635 * Note: the property configuration needs to occur here as some of the 7636 * following routines may have dependencies on soft state flags set 7637 * as part of the driver property configuration. 7638 */ 7639 sd_read_unit_properties(un); 7640 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 7641 "sd_unit_attach: un:0x%p property configuration complete.\n", un); 7642 7643 /* 7644 * Only if a device has "hotpluggable" property, it is 7645 * treated as hotpluggable device. Otherwise, it is 7646 * regarded as non-hotpluggable one. 7647 */ 7648 if (ddi_prop_get_int(DDI_DEV_T_ANY, devi, 0, "hotpluggable", 7649 -1) != -1) { 7650 un->un_f_is_hotpluggable = TRUE; 7651 } 7652 7653 /* 7654 * set unit's attributes(flags) according to "hotpluggable" and 7655 * RMB bit in INQUIRY data. 7656 */ 7657 sd_set_unit_attributes(un, devi); 7658 7659 /* 7660 * By default, we mark the capacity, lbasize, and geometry 7661 * as invalid. Only if we successfully read a valid capacity 7662 * will we update the un_blockcount and un_tgt_blocksize with the 7663 * valid values (the geometry will be validated later). 7664 */ 7665 un->un_f_blockcount_is_valid = FALSE; 7666 un->un_f_tgt_blocksize_is_valid = FALSE; 7667 7668 /* 7669 * Use DEV_BSIZE and DEV_BSHIFT as defaults, until we can determine 7670 * otherwise. 7671 */ 7672 un->un_tgt_blocksize = un->un_sys_blocksize = DEV_BSIZE; 7673 un->un_blockcount = 0; 7674 7675 /* 7676 * Set up the per-instance info needed to determine the correct 7677 * CDBs and other info for issuing commands to the target. 7678 */ 7679 sd_init_cdb_limits(un); 7680 7681 /* 7682 * Set up the IO chains to use, based upon the target type. 7683 */ 7684 if (un->un_f_non_devbsize_supported) { 7685 un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA; 7686 } else { 7687 un->un_buf_chain_type = SD_CHAIN_INFO_DISK; 7688 } 7689 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD; 7690 un->un_direct_chain_type = SD_CHAIN_INFO_DIRECT_CMD; 7691 un->un_priority_chain_type = SD_CHAIN_INFO_PRIORITY_CMD; 7692 7693 un->un_xbuf_attr = ddi_xbuf_attr_create(sizeof (struct sd_xbuf), 7694 sd_xbuf_strategy, un, sd_xbuf_active_limit, sd_xbuf_reserve_limit, 7695 ddi_driver_major(devi), DDI_XBUF_QTHREAD_DRIVER); 7696 ddi_xbuf_attr_register_devinfo(un->un_xbuf_attr, devi); 7697 7698 7699 if (ISCD(un)) { 7700 un->un_additional_codes = sd_additional_codes; 7701 } else { 7702 un->un_additional_codes = NULL; 7703 } 7704 7705 /* 7706 * Create the kstats here so they can be available for attach-time 7707 * routines that send commands to the unit (either polled or via 7708 * sd_send_scsi_cmd). 7709 * 7710 * Note: This is a critical sequence that needs to be maintained: 7711 * 1) Instantiate the kstats here, before any routines using the 7712 * iopath (i.e. sd_send_scsi_cmd). 7713 * 2) Instantiate and initialize the partition stats 7714 * (sd_set_pstats). 7715 * 3) Initialize the error stats (sd_set_errstats), following 7716 * sd_validate_geometry(),sd_register_devid(), 7717 * and sd_cache_control(). 7718 */ 7719 7720 un->un_stats = kstat_create(sd_label, instance, 7721 NULL, "disk", KSTAT_TYPE_IO, 1, KSTAT_FLAG_PERSISTENT); 7722 if (un->un_stats != NULL) { 7723 un->un_stats->ks_lock = SD_MUTEX(un); 7724 kstat_install(un->un_stats); 7725 } 7726 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 7727 "sd_unit_attach: un:0x%p un_stats created\n", un); 7728 7729 sd_create_errstats(un, instance); 7730 if (un->un_errstats == NULL) { 7731 goto create_errstats_failed; 7732 } 7733 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 7734 "sd_unit_attach: un:0x%p errstats created\n", un); 7735 7736 /* 7737 * The following if/else code was relocated here from below as part 7738 * of the fix for bug (4430280). However with the default setup added 7739 * on entry to this routine, it's no longer absolutely necessary for 7740 * this to be before the call to sd_spin_up_unit. 7741 */ 7742 if (SD_IS_PARALLEL_SCSI(un) || SD_IS_SERIAL(un)) { 7743 int tq_trigger_flag = (((devp->sd_inq->inq_ansi == 4) || 7744 (devp->sd_inq->inq_ansi == 5)) && 7745 devp->sd_inq->inq_bque) || devp->sd_inq->inq_cmdque; 7746 7747 /* 7748 * If tagged queueing is supported by the target 7749 * and by the host adapter then we will enable it 7750 */ 7751 un->un_tagflags = 0; 7752 if ((devp->sd_inq->inq_rdf == RDF_SCSI2) && tq_trigger_flag && 7753 (un->un_f_arq_enabled == TRUE)) { 7754 if (scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 7755 1, 1) == 1) { 7756 un->un_tagflags = FLAG_STAG; 7757 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7758 "sd_unit_attach: un:0x%p tag queueing " 7759 "enabled\n", un); 7760 } else if (scsi_ifgetcap(SD_ADDRESS(un), 7761 "untagged-qing", 0) == 1) { 7762 un->un_f_opt_queueing = TRUE; 7763 un->un_saved_throttle = un->un_throttle = 7764 min(un->un_throttle, 3); 7765 } else { 7766 un->un_f_opt_queueing = FALSE; 7767 un->un_saved_throttle = un->un_throttle = 1; 7768 } 7769 } else if ((scsi_ifgetcap(SD_ADDRESS(un), "untagged-qing", 0) 7770 == 1) && (un->un_f_arq_enabled == TRUE)) { 7771 /* The Host Adapter supports internal queueing. */ 7772 un->un_f_opt_queueing = TRUE; 7773 un->un_saved_throttle = un->un_throttle = 7774 min(un->un_throttle, 3); 7775 } else { 7776 un->un_f_opt_queueing = FALSE; 7777 un->un_saved_throttle = un->un_throttle = 1; 7778 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7779 "sd_unit_attach: un:0x%p no tag queueing\n", un); 7780 } 7781 7782 /* 7783 * Enable large transfers for SATA/SAS drives 7784 */ 7785 if (SD_IS_SERIAL(un)) { 7786 un->un_max_xfer_size = 7787 ddi_getprop(DDI_DEV_T_ANY, devi, 0, 7788 sd_max_xfer_size, SD_MAX_XFER_SIZE); 7789 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7790 "sd_unit_attach: un:0x%p max transfer " 7791 "size=0x%x\n", un, un->un_max_xfer_size); 7792 7793 } 7794 7795 /* Setup or tear down default wide operations for disks */ 7796 7797 /* 7798 * Note: Legacy: it may be possible for both "sd_max_xfer_size" 7799 * and "ssd_max_xfer_size" to exist simultaneously on the same 7800 * system and be set to different values. In the future this 7801 * code may need to be updated when the ssd module is 7802 * obsoleted and removed from the system. (4299588) 7803 */ 7804 if (SD_IS_PARALLEL_SCSI(un) && 7805 (devp->sd_inq->inq_rdf == RDF_SCSI2) && 7806 (devp->sd_inq->inq_wbus16 || devp->sd_inq->inq_wbus32)) { 7807 if (scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", 7808 1, 1) == 1) { 7809 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7810 "sd_unit_attach: un:0x%p Wide Transfer " 7811 "enabled\n", un); 7812 } 7813 7814 /* 7815 * If tagged queuing has also been enabled, then 7816 * enable large xfers 7817 */ 7818 if (un->un_saved_throttle == sd_max_throttle) { 7819 un->un_max_xfer_size = 7820 ddi_getprop(DDI_DEV_T_ANY, devi, 0, 7821 sd_max_xfer_size, SD_MAX_XFER_SIZE); 7822 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7823 "sd_unit_attach: un:0x%p max transfer " 7824 "size=0x%x\n", un, un->un_max_xfer_size); 7825 } 7826 } else { 7827 if (scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", 7828 0, 1) == 1) { 7829 SD_INFO(SD_LOG_ATTACH_DETACH, un, 7830 "sd_unit_attach: un:0x%p " 7831 "Wide Transfer disabled\n", un); 7832 } 7833 } 7834 } else { 7835 un->un_tagflags = FLAG_STAG; 7836 un->un_max_xfer_size = ddi_getprop(DDI_DEV_T_ANY, 7837 devi, 0, sd_max_xfer_size, SD_MAX_XFER_SIZE); 7838 } 7839 7840 /* 7841 * If this target supports LUN reset, try to enable it. 7842 */ 7843 if (un->un_f_lun_reset_enabled) { 7844 if (scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 1, 1) == 1) { 7845 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: " 7846 "un:0x%p lun_reset capability set\n", un); 7847 } else { 7848 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: " 7849 "un:0x%p lun-reset capability not set\n", un); 7850 } 7851 } 7852 7853 /* 7854 * Adjust the maximum transfer size. This is to fix 7855 * the problem of partial DMA support on SPARC. Some 7856 * HBA driver, like aac, has very small dma_attr_maxxfer 7857 * size, which requires partial DMA support on SPARC. 7858 * In the future the SPARC pci nexus driver may solve 7859 * the problem instead of this fix. 7860 */ 7861 max_xfer_size = scsi_ifgetcap(SD_ADDRESS(un), "dma-max", 1); 7862 if ((max_xfer_size > 0) && (max_xfer_size < un->un_max_xfer_size)) { 7863 /* We need DMA partial even on sparc to ensure sddump() works */ 7864 un->un_max_xfer_size = max_xfer_size; 7865 if (un->un_partial_dma_supported == 0) 7866 un->un_partial_dma_supported = 1; 7867 } 7868 if (ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un), 7869 DDI_PROP_DONTPASS, "buf_break", 0) == 1) { 7870 if (ddi_xbuf_attr_setup_brk(un->un_xbuf_attr, 7871 un->un_max_xfer_size) == 1) { 7872 un->un_buf_breakup_supported = 1; 7873 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: " 7874 "un:0x%p Buf breakup enabled\n", un); 7875 } 7876 } 7877 7878 /* 7879 * Set PKT_DMA_PARTIAL flag. 7880 */ 7881 if (un->un_partial_dma_supported == 1) { 7882 un->un_pkt_flags = PKT_DMA_PARTIAL; 7883 } else { 7884 un->un_pkt_flags = 0; 7885 } 7886 7887 /* Initialize sd_ssc_t for internal uscsi commands */ 7888 ssc = sd_ssc_init(un); 7889 scsi_fm_init(devp); 7890 7891 /* 7892 * Allocate memory for SCSI FMA stuffs. 7893 */ 7894 un->un_fm_private = 7895 kmem_zalloc(sizeof (struct sd_fm_internal), KM_SLEEP); 7896 sfip = (struct sd_fm_internal *)un->un_fm_private; 7897 sfip->fm_ssc.ssc_uscsi_cmd = &sfip->fm_ucmd; 7898 sfip->fm_ssc.ssc_uscsi_info = &sfip->fm_uinfo; 7899 sfip->fm_ssc.ssc_un = un; 7900 7901 if (ISCD(un) || 7902 un->un_f_has_removable_media || 7903 devp->sd_fm_capable == DDI_FM_NOT_CAPABLE) { 7904 /* 7905 * We don't touch CDROM or the DDI_FM_NOT_CAPABLE device. 7906 * Their log are unchanged. 7907 */ 7908 sfip->fm_log_level = SD_FM_LOG_NSUP; 7909 } else { 7910 /* 7911 * If enter here, it should be non-CDROM and FM-capable 7912 * device, and it will not keep the old scsi_log as before 7913 * in /var/adm/messages. However, the property 7914 * "fm-scsi-log" will control whether the FM telemetry will 7915 * be logged in /var/adm/messages. 7916 */ 7917 int fm_scsi_log; 7918 fm_scsi_log = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un), 7919 DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, "fm-scsi-log", 0); 7920 7921 if (fm_scsi_log) 7922 sfip->fm_log_level = SD_FM_LOG_EREPORT; 7923 else 7924 sfip->fm_log_level = SD_FM_LOG_SILENT; 7925 } 7926 7927 /* 7928 * At this point in the attach, we have enough info in the 7929 * soft state to be able to issue commands to the target. 7930 * 7931 * All command paths used below MUST issue their commands as 7932 * SD_PATH_DIRECT. This is important as intermediate layers 7933 * are not all initialized yet (such as PM). 7934 */ 7935 7936 /* 7937 * Send a TEST UNIT READY command to the device. This should clear 7938 * any outstanding UNIT ATTENTION that may be present. 7939 * 7940 * Note: Don't check for success, just track if there is a reservation, 7941 * this is a throw away command to clear any unit attentions. 7942 * 7943 * Note: This MUST be the first command issued to the target during 7944 * attach to ensure power on UNIT ATTENTIONS are cleared. 7945 * Pass in flag SD_DONT_RETRY_TUR to prevent the long delays associated 7946 * with attempts at spinning up a device with no media. 7947 */ 7948 status = sd_send_scsi_TEST_UNIT_READY(ssc, SD_DONT_RETRY_TUR); 7949 if (status != 0) { 7950 if (status == EACCES) 7951 reservation_flag = SD_TARGET_IS_RESERVED; 7952 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 7953 } 7954 7955 /* 7956 * If the device is NOT a removable media device, attempt to spin 7957 * it up (using the START_STOP_UNIT command) and read its capacity 7958 * (using the READ CAPACITY command). Note, however, that either 7959 * of these could fail and in some cases we would continue with 7960 * the attach despite the failure (see below). 7961 */ 7962 if (un->un_f_descr_format_supported) { 7963 7964 switch (sd_spin_up_unit(ssc)) { 7965 case 0: 7966 /* 7967 * Spin-up was successful; now try to read the 7968 * capacity. If successful then save the results 7969 * and mark the capacity & lbasize as valid. 7970 */ 7971 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 7972 "sd_unit_attach: un:0x%p spin-up successful\n", un); 7973 7974 status = sd_send_scsi_READ_CAPACITY(ssc, &capacity, 7975 &lbasize, SD_PATH_DIRECT); 7976 7977 switch (status) { 7978 case 0: { 7979 if (capacity > DK_MAX_BLOCKS) { 7980 #ifdef _LP64 7981 if ((capacity + 1) > 7982 SD_GROUP1_MAX_ADDRESS) { 7983 /* 7984 * Enable descriptor format 7985 * sense data so that we can 7986 * get 64 bit sense data 7987 * fields. 7988 */ 7989 sd_enable_descr_sense(ssc); 7990 } 7991 #else 7992 /* 32-bit kernels can't handle this */ 7993 scsi_log(SD_DEVINFO(un), 7994 sd_label, CE_WARN, 7995 "disk has %llu blocks, which " 7996 "is too large for a 32-bit " 7997 "kernel", capacity); 7998 7999 #if defined(__i386) || defined(__amd64) 8000 /* 8001 * 1TB disk was treated as (1T - 512)B 8002 * in the past, so that it might have 8003 * valid VTOC and solaris partitions, 8004 * we have to allow it to continue to 8005 * work. 8006 */ 8007 if (capacity -1 > DK_MAX_BLOCKS) 8008 #endif 8009 goto spinup_failed; 8010 #endif 8011 } 8012 8013 /* 8014 * Here it's not necessary to check the case: 8015 * the capacity of the device is bigger than 8016 * what the max hba cdb can support. Because 8017 * sd_send_scsi_READ_CAPACITY will retrieve 8018 * the capacity by sending USCSI command, which 8019 * is constrained by the max hba cdb. Actually, 8020 * sd_send_scsi_READ_CAPACITY will return 8021 * EINVAL when using bigger cdb than required 8022 * cdb length. Will handle this case in 8023 * "case EINVAL". 8024 */ 8025 8026 /* 8027 * The following relies on 8028 * sd_send_scsi_READ_CAPACITY never 8029 * returning 0 for capacity and/or lbasize. 8030 */ 8031 sd_update_block_info(un, lbasize, capacity); 8032 8033 SD_INFO(SD_LOG_ATTACH_DETACH, un, 8034 "sd_unit_attach: un:0x%p capacity = %ld " 8035 "blocks; lbasize= %ld.\n", un, 8036 un->un_blockcount, un->un_tgt_blocksize); 8037 8038 break; 8039 } 8040 case EINVAL: 8041 /* 8042 * In the case where the max-cdb-length property 8043 * is smaller than the required CDB length for 8044 * a SCSI device, a target driver can fail to 8045 * attach to that device. 8046 */ 8047 scsi_log(SD_DEVINFO(un), 8048 sd_label, CE_WARN, 8049 "disk capacity is too large " 8050 "for current cdb length"); 8051 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 8052 8053 goto spinup_failed; 8054 case EACCES: 8055 /* 8056 * Should never get here if the spin-up 8057 * succeeded, but code it in anyway. 8058 * From here, just continue with the attach... 8059 */ 8060 SD_INFO(SD_LOG_ATTACH_DETACH, un, 8061 "sd_unit_attach: un:0x%p " 8062 "sd_send_scsi_READ_CAPACITY " 8063 "returned reservation conflict\n", un); 8064 reservation_flag = SD_TARGET_IS_RESERVED; 8065 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 8066 break; 8067 default: 8068 /* 8069 * Likewise, should never get here if the 8070 * spin-up succeeded. Just continue with 8071 * the attach... 8072 */ 8073 if (status == EIO) 8074 sd_ssc_assessment(ssc, 8075 SD_FMT_STATUS_CHECK); 8076 else 8077 sd_ssc_assessment(ssc, 8078 SD_FMT_IGNORE); 8079 break; 8080 } 8081 break; 8082 case EACCES: 8083 /* 8084 * Device is reserved by another host. In this case 8085 * we could not spin it up or read the capacity, but 8086 * we continue with the attach anyway. 8087 */ 8088 SD_INFO(SD_LOG_ATTACH_DETACH, un, 8089 "sd_unit_attach: un:0x%p spin-up reservation " 8090 "conflict.\n", un); 8091 reservation_flag = SD_TARGET_IS_RESERVED; 8092 break; 8093 default: 8094 /* Fail the attach if the spin-up failed. */ 8095 SD_INFO(SD_LOG_ATTACH_DETACH, un, 8096 "sd_unit_attach: un:0x%p spin-up failed.", un); 8097 goto spinup_failed; 8098 } 8099 8100 } 8101 8102 /* 8103 * Check to see if this is a MMC drive 8104 */ 8105 if (ISCD(un)) { 8106 sd_set_mmc_caps(ssc); 8107 } 8108 8109 /* 8110 * Add a zero-length attribute to tell the world we support 8111 * kernel ioctls (for layered drivers) 8112 */ 8113 (void) ddi_prop_create(DDI_DEV_T_NONE, devi, DDI_PROP_CANSLEEP, 8114 DDI_KERNEL_IOCTL, NULL, 0); 8115 8116 /* 8117 * Add a boolean property to tell the world we support 8118 * the B_FAILFAST flag (for layered drivers) 8119 */ 8120 (void) ddi_prop_create(DDI_DEV_T_NONE, devi, DDI_PROP_CANSLEEP, 8121 "ddi-failfast-supported", NULL, 0); 8122 8123 /* 8124 * Initialize power management 8125 */ 8126 mutex_init(&un->un_pm_mutex, NULL, MUTEX_DRIVER, NULL); 8127 cv_init(&un->un_pm_busy_cv, NULL, CV_DRIVER, NULL); 8128 sd_setup_pm(ssc, devi); 8129 if (un->un_f_pm_is_enabled == FALSE) { 8130 /* 8131 * For performance, point to a jump table that does 8132 * not include pm. 8133 * The direct and priority chains don't change with PM. 8134 * 8135 * Note: this is currently done based on individual device 8136 * capabilities. When an interface for determining system 8137 * power enabled state becomes available, or when additional 8138 * layers are added to the command chain, these values will 8139 * have to be re-evaluated for correctness. 8140 */ 8141 if (un->un_f_non_devbsize_supported) { 8142 un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA_NO_PM; 8143 } else { 8144 un->un_buf_chain_type = SD_CHAIN_INFO_DISK_NO_PM; 8145 } 8146 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD_NO_PM; 8147 } 8148 8149 /* 8150 * This property is set to 0 by HA software to avoid retries 8151 * on a reserved disk. (The preferred property name is 8152 * "retry-on-reservation-conflict") (1189689) 8153 * 8154 * Note: The use of a global here can have unintended consequences. A 8155 * per instance variable is preferable to match the capabilities of 8156 * different underlying hba's (4402600) 8157 */ 8158 sd_retry_on_reservation_conflict = ddi_getprop(DDI_DEV_T_ANY, devi, 8159 DDI_PROP_DONTPASS, "retry-on-reservation-conflict", 8160 sd_retry_on_reservation_conflict); 8161 if (sd_retry_on_reservation_conflict != 0) { 8162 sd_retry_on_reservation_conflict = ddi_getprop(DDI_DEV_T_ANY, 8163 devi, DDI_PROP_DONTPASS, sd_resv_conflict_name, 8164 sd_retry_on_reservation_conflict); 8165 } 8166 8167 /* Set up options for QFULL handling. */ 8168 if ((rval = ddi_getprop(DDI_DEV_T_ANY, devi, 0, 8169 "qfull-retries", -1)) != -1) { 8170 (void) scsi_ifsetcap(SD_ADDRESS(un), "qfull-retries", 8171 rval, 1); 8172 } 8173 if ((rval = ddi_getprop(DDI_DEV_T_ANY, devi, 0, 8174 "qfull-retry-interval", -1)) != -1) { 8175 (void) scsi_ifsetcap(SD_ADDRESS(un), "qfull-retry-interval", 8176 rval, 1); 8177 } 8178 8179 /* 8180 * This just prints a message that announces the existence of the 8181 * device. The message is always printed in the system logfile, but 8182 * only appears on the console if the system is booted with the 8183 * -v (verbose) argument. 8184 */ 8185 ddi_report_dev(devi); 8186 8187 un->un_mediastate = DKIO_NONE; 8188 8189 /* 8190 * Check Block Device Characteristics VPD. 8191 */ 8192 sd_check_bdc_vpd(ssc); 8193 8194 /* 8195 * Check whether the drive is in emulation mode. 8196 */ 8197 sd_check_emulation_mode(ssc); 8198 8199 cmlb_alloc_handle(&un->un_cmlbhandle); 8200 8201 #if defined(__i386) || defined(__amd64) 8202 /* 8203 * On x86, compensate for off-by-1 legacy error 8204 */ 8205 if (!un->un_f_has_removable_media && !un->un_f_is_hotpluggable && 8206 (lbasize == un->un_sys_blocksize)) 8207 offbyone = CMLB_OFF_BY_ONE; 8208 #endif 8209 8210 if (cmlb_attach(devi, &sd_tgops, (int)devp->sd_inq->inq_dtype, 8211 VOID2BOOLEAN(un->un_f_has_removable_media != 0), 8212 VOID2BOOLEAN(un->un_f_is_hotpluggable != 0), 8213 un->un_node_type, offbyone, un->un_cmlbhandle, 8214 (void *)SD_PATH_DIRECT) != 0) { 8215 goto cmlb_attach_failed; 8216 } 8217 8218 8219 /* 8220 * Read and validate the device's geometry (ie, disk label) 8221 * A new unformatted drive will not have a valid geometry, but 8222 * the driver needs to successfully attach to this device so 8223 * the drive can be formatted via ioctls. 8224 */ 8225 geom_label_valid = (cmlb_validate(un->un_cmlbhandle, 0, 8226 (void *)SD_PATH_DIRECT) == 0) ? 1: 0; 8227 8228 mutex_enter(SD_MUTEX(un)); 8229 8230 /* 8231 * Read and initialize the devid for the unit. 8232 */ 8233 if (un->un_f_devid_supported) { 8234 sd_register_devid(ssc, devi, reservation_flag); 8235 } 8236 mutex_exit(SD_MUTEX(un)); 8237 8238 #if (defined(__fibre)) 8239 /* 8240 * Register callbacks for fibre only. You can't do this solely 8241 * on the basis of the devid_type because this is hba specific. 8242 * We need to query our hba capabilities to find out whether to 8243 * register or not. 8244 */ 8245 if (un->un_f_is_fibre) { 8246 if (strcmp(un->un_node_type, DDI_NT_BLOCK_CHAN)) { 8247 sd_init_event_callbacks(un); 8248 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 8249 "sd_unit_attach: un:0x%p event callbacks inserted", 8250 un); 8251 } 8252 } 8253 #endif 8254 8255 if (un->un_f_opt_disable_cache == TRUE) { 8256 /* 8257 * Disable both read cache and write cache. This is 8258 * the historic behavior of the keywords in the config file. 8259 */ 8260 if (sd_cache_control(ssc, SD_CACHE_DISABLE, SD_CACHE_DISABLE) != 8261 0) { 8262 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8263 "sd_unit_attach: un:0x%p Could not disable " 8264 "caching", un); 8265 goto devid_failed; 8266 } 8267 } 8268 8269 /* 8270 * Check the value of the WCE bit and if it's allowed to be changed, 8271 * set un_f_write_cache_enabled and un_f_cache_mode_changeable 8272 * accordingly. 8273 */ 8274 (void) sd_get_write_cache_enabled(ssc, &wc_enabled); 8275 sd_get_write_cache_changeable(ssc, &wc_changeable); 8276 mutex_enter(SD_MUTEX(un)); 8277 un->un_f_write_cache_enabled = (wc_enabled != 0); 8278 un->un_f_cache_mode_changeable = (wc_changeable != 0); 8279 mutex_exit(SD_MUTEX(un)); 8280 8281 if ((un->un_f_rmw_type != SD_RMW_TYPE_RETURN_ERROR && 8282 un->un_tgt_blocksize != DEV_BSIZE) || 8283 un->un_f_enable_rmw) { 8284 if (!(un->un_wm_cache)) { 8285 (void) snprintf(name_str, sizeof (name_str), 8286 "%s%d_cache", 8287 ddi_driver_name(SD_DEVINFO(un)), 8288 ddi_get_instance(SD_DEVINFO(un))); 8289 un->un_wm_cache = kmem_cache_create( 8290 name_str, sizeof (struct sd_w_map), 8291 8, sd_wm_cache_constructor, 8292 sd_wm_cache_destructor, NULL, 8293 (void *)un, NULL, 0); 8294 if (!(un->un_wm_cache)) { 8295 goto wm_cache_failed; 8296 } 8297 } 8298 } 8299 8300 /* 8301 * Check the value of the NV_SUP bit and set 8302 * un_f_suppress_cache_flush accordingly. 8303 */ 8304 sd_get_nv_sup(ssc); 8305 8306 /* 8307 * Find out what type of reservation this disk supports. 8308 */ 8309 status = sd_send_scsi_PERSISTENT_RESERVE_IN(ssc, SD_READ_KEYS, 0, NULL); 8310 8311 switch (status) { 8312 case 0: 8313 /* 8314 * SCSI-3 reservations are supported. 8315 */ 8316 un->un_reservation_type = SD_SCSI3_RESERVATION; 8317 SD_INFO(SD_LOG_ATTACH_DETACH, un, 8318 "sd_unit_attach: un:0x%p SCSI-3 reservations\n", un); 8319 break; 8320 case ENOTSUP: 8321 /* 8322 * The PERSISTENT RESERVE IN command would not be recognized by 8323 * a SCSI-2 device, so assume the reservation type is SCSI-2. 8324 */ 8325 SD_INFO(SD_LOG_ATTACH_DETACH, un, 8326 "sd_unit_attach: un:0x%p SCSI-2 reservations\n", un); 8327 un->un_reservation_type = SD_SCSI2_RESERVATION; 8328 8329 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 8330 break; 8331 default: 8332 /* 8333 * default to SCSI-3 reservations 8334 */ 8335 SD_INFO(SD_LOG_ATTACH_DETACH, un, 8336 "sd_unit_attach: un:0x%p default SCSI3 reservations\n", un); 8337 un->un_reservation_type = SD_SCSI3_RESERVATION; 8338 8339 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 8340 break; 8341 } 8342 8343 /* 8344 * Set the pstat and error stat values here, so data obtained during the 8345 * previous attach-time routines is available. 8346 * 8347 * Note: This is a critical sequence that needs to be maintained: 8348 * 1) Instantiate the kstats before any routines using the iopath 8349 * (i.e. sd_send_scsi_cmd). 8350 * 2) Initialize the error stats (sd_set_errstats) and partition 8351 * stats (sd_set_pstats)here, following 8352 * cmlb_validate_geometry(), sd_register_devid(), and 8353 * sd_cache_control(). 8354 */ 8355 8356 if (un->un_f_pkstats_enabled && geom_label_valid) { 8357 sd_set_pstats(un); 8358 SD_TRACE(SD_LOG_IO_PARTITION, un, 8359 "sd_unit_attach: un:0x%p pstats created and set\n", un); 8360 } 8361 8362 sd_set_errstats(un); 8363 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 8364 "sd_unit_attach: un:0x%p errstats set\n", un); 8365 8366 8367 /* 8368 * After successfully attaching an instance, we record the information 8369 * of how many luns have been attached on the relative target and 8370 * controller for parallel SCSI. This information is used when sd tries 8371 * to set the tagged queuing capability in HBA. 8372 */ 8373 if (SD_IS_PARALLEL_SCSI(un) && (tgt >= 0) && (tgt < NTARGETS_WIDE)) { 8374 sd_scsi_update_lun_on_target(pdip, tgt, SD_SCSI_LUN_ATTACH); 8375 } 8376 8377 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 8378 "sd_unit_attach: un:0x%p exit success\n", un); 8379 8380 /* Uninitialize sd_ssc_t pointer */ 8381 sd_ssc_fini(ssc); 8382 8383 return (DDI_SUCCESS); 8384 8385 /* 8386 * An error occurred during the attach; clean up & return failure. 8387 */ 8388 wm_cache_failed: 8389 devid_failed: 8390 ddi_remove_minor_node(devi, NULL); 8391 8392 cmlb_attach_failed: 8393 /* 8394 * Cleanup from the scsi_ifsetcap() calls (437868) 8395 */ 8396 (void) scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 0, 1); 8397 (void) scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", 0, 1); 8398 8399 /* 8400 * Refer to the comments of setting tagged-qing in the beginning of 8401 * sd_unit_attach. We can only disable tagged queuing when there is 8402 * no lun attached on the target. 8403 */ 8404 if (sd_scsi_get_target_lun_count(pdip, tgt) < 1) { 8405 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1); 8406 } 8407 8408 if (un->un_f_is_fibre == FALSE) { 8409 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 0, 1); 8410 } 8411 8412 spinup_failed: 8413 8414 /* Uninitialize sd_ssc_t pointer */ 8415 sd_ssc_fini(ssc); 8416 8417 mutex_enter(SD_MUTEX(un)); 8418 8419 /* Deallocate SCSI FMA memory spaces */ 8420 kmem_free(un->un_fm_private, sizeof (struct sd_fm_internal)); 8421 8422 /* Cancel callback for SD_PATH_DIRECT_PRIORITY cmd. restart */ 8423 if (un->un_direct_priority_timeid != NULL) { 8424 timeout_id_t temp_id = un->un_direct_priority_timeid; 8425 un->un_direct_priority_timeid = NULL; 8426 mutex_exit(SD_MUTEX(un)); 8427 (void) untimeout(temp_id); 8428 mutex_enter(SD_MUTEX(un)); 8429 } 8430 8431 /* Cancel any pending start/stop timeouts */ 8432 if (un->un_startstop_timeid != NULL) { 8433 timeout_id_t temp_id = un->un_startstop_timeid; 8434 un->un_startstop_timeid = NULL; 8435 mutex_exit(SD_MUTEX(un)); 8436 (void) untimeout(temp_id); 8437 mutex_enter(SD_MUTEX(un)); 8438 } 8439 8440 /* Cancel any pending reset-throttle timeouts */ 8441 if (un->un_reset_throttle_timeid != NULL) { 8442 timeout_id_t temp_id = un->un_reset_throttle_timeid; 8443 un->un_reset_throttle_timeid = NULL; 8444 mutex_exit(SD_MUTEX(un)); 8445 (void) untimeout(temp_id); 8446 mutex_enter(SD_MUTEX(un)); 8447 } 8448 8449 /* Cancel rmw warning message timeouts */ 8450 if (un->un_rmw_msg_timeid != NULL) { 8451 timeout_id_t temp_id = un->un_rmw_msg_timeid; 8452 un->un_rmw_msg_timeid = NULL; 8453 mutex_exit(SD_MUTEX(un)); 8454 (void) untimeout(temp_id); 8455 mutex_enter(SD_MUTEX(un)); 8456 } 8457 8458 /* Cancel any pending retry timeouts */ 8459 if (un->un_retry_timeid != NULL) { 8460 timeout_id_t temp_id = un->un_retry_timeid; 8461 un->un_retry_timeid = NULL; 8462 mutex_exit(SD_MUTEX(un)); 8463 (void) untimeout(temp_id); 8464 mutex_enter(SD_MUTEX(un)); 8465 } 8466 8467 /* Cancel any pending delayed cv broadcast timeouts */ 8468 if (un->un_dcvb_timeid != NULL) { 8469 timeout_id_t temp_id = un->un_dcvb_timeid; 8470 un->un_dcvb_timeid = NULL; 8471 mutex_exit(SD_MUTEX(un)); 8472 (void) untimeout(temp_id); 8473 mutex_enter(SD_MUTEX(un)); 8474 } 8475 8476 mutex_exit(SD_MUTEX(un)); 8477 8478 /* There should not be any in-progress I/O so ASSERT this check */ 8479 ASSERT(un->un_ncmds_in_transport == 0); 8480 ASSERT(un->un_ncmds_in_driver == 0); 8481 8482 /* Do not free the softstate if the callback routine is active */ 8483 sd_sync_with_callback(un); 8484 8485 /* 8486 * Partition stats apparently are not used with removables. These would 8487 * not have been created during attach, so no need to clean them up... 8488 */ 8489 if (un->un_errstats != NULL) { 8490 kstat_delete(un->un_errstats); 8491 un->un_errstats = NULL; 8492 } 8493 8494 create_errstats_failed: 8495 8496 if (un->un_stats != NULL) { 8497 kstat_delete(un->un_stats); 8498 un->un_stats = NULL; 8499 } 8500 8501 ddi_xbuf_attr_unregister_devinfo(un->un_xbuf_attr, devi); 8502 ddi_xbuf_attr_destroy(un->un_xbuf_attr); 8503 8504 ddi_prop_remove_all(devi); 8505 sema_destroy(&un->un_semoclose); 8506 cv_destroy(&un->un_state_cv); 8507 8508 sd_free_rqs(un); 8509 8510 alloc_rqs_failed: 8511 8512 devp->sd_private = NULL; 8513 bzero(un, sizeof (struct sd_lun)); /* Clear any stale data! */ 8514 8515 /* 8516 * Note: the man pages are unclear as to whether or not doing a 8517 * ddi_soft_state_free(sd_state, instance) is the right way to 8518 * clean up after the ddi_soft_state_zalloc() if the subsequent 8519 * ddi_get_soft_state() fails. The implication seems to be 8520 * that the get_soft_state cannot fail if the zalloc succeeds. 8521 */ 8522 #ifndef XPV_HVM_DRIVER 8523 ddi_soft_state_free(sd_state, instance); 8524 #endif /* !XPV_HVM_DRIVER */ 8525 8526 probe_failed: 8527 scsi_unprobe(devp); 8528 8529 return (DDI_FAILURE); 8530 } 8531 8532 8533 /* 8534 * Function: sd_unit_detach 8535 * 8536 * Description: Performs DDI_DETACH processing for sddetach(). 8537 * 8538 * Return Code: DDI_SUCCESS 8539 * DDI_FAILURE 8540 * 8541 * Context: Kernel thread context 8542 */ 8543 8544 static int 8545 sd_unit_detach(dev_info_t *devi) 8546 { 8547 struct scsi_device *devp; 8548 struct sd_lun *un; 8549 int i; 8550 int tgt; 8551 dev_t dev; 8552 dev_info_t *pdip = ddi_get_parent(devi); 8553 int instance = ddi_get_instance(devi); 8554 8555 mutex_enter(&sd_detach_mutex); 8556 8557 /* 8558 * Fail the detach for any of the following: 8559 * - Unable to get the sd_lun struct for the instance 8560 * - A layered driver has an outstanding open on the instance 8561 * - Another thread is already detaching this instance 8562 * - Another thread is currently performing an open 8563 */ 8564 devp = ddi_get_driver_private(devi); 8565 if ((devp == NULL) || 8566 ((un = (struct sd_lun *)devp->sd_private) == NULL) || 8567 (un->un_ncmds_in_driver != 0) || (un->un_layer_count != 0) || 8568 (un->un_detach_count != 0) || (un->un_opens_in_progress != 0)) { 8569 mutex_exit(&sd_detach_mutex); 8570 return (DDI_FAILURE); 8571 } 8572 8573 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_unit_detach: entry 0x%p\n", un); 8574 8575 /* 8576 * Mark this instance as currently in a detach, to inhibit any 8577 * opens from a layered driver. 8578 */ 8579 un->un_detach_count++; 8580 mutex_exit(&sd_detach_mutex); 8581 8582 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS, 8583 SCSI_ADDR_PROP_TARGET, -1); 8584 8585 dev = sd_make_device(SD_DEVINFO(un)); 8586 8587 #ifndef lint 8588 _NOTE(COMPETING_THREADS_NOW); 8589 #endif 8590 8591 mutex_enter(SD_MUTEX(un)); 8592 8593 /* 8594 * Fail the detach if there are any outstanding layered 8595 * opens on this device. 8596 */ 8597 for (i = 0; i < NDKMAP; i++) { 8598 if (un->un_ocmap.lyropen[i] != 0) { 8599 goto err_notclosed; 8600 } 8601 } 8602 8603 /* 8604 * Verify there are NO outstanding commands issued to this device. 8605 * ie, un_ncmds_in_transport == 0. 8606 * It's possible to have outstanding commands through the physio 8607 * code path, even though everything's closed. 8608 */ 8609 if ((un->un_ncmds_in_transport != 0) || (un->un_retry_timeid != NULL) || 8610 (un->un_direct_priority_timeid != NULL) || 8611 (un->un_state == SD_STATE_RWAIT)) { 8612 mutex_exit(SD_MUTEX(un)); 8613 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8614 "sd_dr_detach: Detach failure due to outstanding cmds\n"); 8615 goto err_stillbusy; 8616 } 8617 8618 /* 8619 * If we have the device reserved, release the reservation. 8620 */ 8621 if ((un->un_resvd_status & SD_RESERVE) && 8622 !(un->un_resvd_status & SD_LOST_RESERVE)) { 8623 mutex_exit(SD_MUTEX(un)); 8624 /* 8625 * Note: sd_reserve_release sends a command to the device 8626 * via the sd_ioctlcmd() path, and can sleep. 8627 */ 8628 if (sd_reserve_release(dev, SD_RELEASE) != 0) { 8629 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8630 "sd_dr_detach: Cannot release reservation \n"); 8631 } 8632 } else { 8633 mutex_exit(SD_MUTEX(un)); 8634 } 8635 8636 /* 8637 * Untimeout any reserve recover, throttle reset, restart unit 8638 * and delayed broadcast timeout threads. Protect the timeout pointer 8639 * from getting nulled by their callback functions. 8640 */ 8641 mutex_enter(SD_MUTEX(un)); 8642 if (un->un_resvd_timeid != NULL) { 8643 timeout_id_t temp_id = un->un_resvd_timeid; 8644 un->un_resvd_timeid = NULL; 8645 mutex_exit(SD_MUTEX(un)); 8646 (void) untimeout(temp_id); 8647 mutex_enter(SD_MUTEX(un)); 8648 } 8649 8650 if (un->un_reset_throttle_timeid != NULL) { 8651 timeout_id_t temp_id = un->un_reset_throttle_timeid; 8652 un->un_reset_throttle_timeid = NULL; 8653 mutex_exit(SD_MUTEX(un)); 8654 (void) untimeout(temp_id); 8655 mutex_enter(SD_MUTEX(un)); 8656 } 8657 8658 if (un->un_startstop_timeid != NULL) { 8659 timeout_id_t temp_id = un->un_startstop_timeid; 8660 un->un_startstop_timeid = NULL; 8661 mutex_exit(SD_MUTEX(un)); 8662 (void) untimeout(temp_id); 8663 mutex_enter(SD_MUTEX(un)); 8664 } 8665 8666 if (un->un_rmw_msg_timeid != NULL) { 8667 timeout_id_t temp_id = un->un_rmw_msg_timeid; 8668 un->un_rmw_msg_timeid = NULL; 8669 mutex_exit(SD_MUTEX(un)); 8670 (void) untimeout(temp_id); 8671 mutex_enter(SD_MUTEX(un)); 8672 } 8673 8674 if (un->un_dcvb_timeid != NULL) { 8675 timeout_id_t temp_id = un->un_dcvb_timeid; 8676 un->un_dcvb_timeid = NULL; 8677 mutex_exit(SD_MUTEX(un)); 8678 (void) untimeout(temp_id); 8679 } else { 8680 mutex_exit(SD_MUTEX(un)); 8681 } 8682 8683 /* Remove any pending reservation reclaim requests for this device */ 8684 sd_rmv_resv_reclaim_req(dev); 8685 8686 mutex_enter(SD_MUTEX(un)); 8687 8688 /* Cancel any pending callbacks for SD_PATH_DIRECT_PRIORITY cmd. */ 8689 if (un->un_direct_priority_timeid != NULL) { 8690 timeout_id_t temp_id = un->un_direct_priority_timeid; 8691 un->un_direct_priority_timeid = NULL; 8692 mutex_exit(SD_MUTEX(un)); 8693 (void) untimeout(temp_id); 8694 mutex_enter(SD_MUTEX(un)); 8695 } 8696 8697 /* Cancel any active multi-host disk watch thread requests */ 8698 if (un->un_mhd_token != NULL) { 8699 mutex_exit(SD_MUTEX(un)); 8700 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_mhd_token)); 8701 if (scsi_watch_request_terminate(un->un_mhd_token, 8702 SCSI_WATCH_TERMINATE_NOWAIT)) { 8703 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8704 "sd_dr_detach: Cannot cancel mhd watch request\n"); 8705 /* 8706 * Note: We are returning here after having removed 8707 * some driver timeouts above. This is consistent with 8708 * the legacy implementation but perhaps the watch 8709 * terminate call should be made with the wait flag set. 8710 */ 8711 goto err_stillbusy; 8712 } 8713 mutex_enter(SD_MUTEX(un)); 8714 un->un_mhd_token = NULL; 8715 } 8716 8717 if (un->un_swr_token != NULL) { 8718 mutex_exit(SD_MUTEX(un)); 8719 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_swr_token)); 8720 if (scsi_watch_request_terminate(un->un_swr_token, 8721 SCSI_WATCH_TERMINATE_NOWAIT)) { 8722 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8723 "sd_dr_detach: Cannot cancel swr watch request\n"); 8724 /* 8725 * Note: We are returning here after having removed 8726 * some driver timeouts above. This is consistent with 8727 * the legacy implementation but perhaps the watch 8728 * terminate call should be made with the wait flag set. 8729 */ 8730 goto err_stillbusy; 8731 } 8732 mutex_enter(SD_MUTEX(un)); 8733 un->un_swr_token = NULL; 8734 } 8735 8736 mutex_exit(SD_MUTEX(un)); 8737 8738 /* 8739 * Clear any scsi_reset_notifies. We clear the reset notifies 8740 * if we have not registered one. 8741 * Note: The sd_mhd_reset_notify_cb() fn tries to acquire SD_MUTEX! 8742 */ 8743 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_CANCEL, 8744 sd_mhd_reset_notify_cb, (caddr_t)un); 8745 8746 /* 8747 * protect the timeout pointers from getting nulled by 8748 * their callback functions during the cancellation process. 8749 * In such a scenario untimeout can be invoked with a null value. 8750 */ 8751 _NOTE(NO_COMPETING_THREADS_NOW); 8752 8753 mutex_enter(&un->un_pm_mutex); 8754 if (un->un_pm_idle_timeid != NULL) { 8755 timeout_id_t temp_id = un->un_pm_idle_timeid; 8756 un->un_pm_idle_timeid = NULL; 8757 mutex_exit(&un->un_pm_mutex); 8758 8759 /* 8760 * Timeout is active; cancel it. 8761 * Note that it'll never be active on a device 8762 * that does not support PM therefore we don't 8763 * have to check before calling pm_idle_component. 8764 */ 8765 (void) untimeout(temp_id); 8766 (void) pm_idle_component(SD_DEVINFO(un), 0); 8767 mutex_enter(&un->un_pm_mutex); 8768 } 8769 8770 /* 8771 * Check whether there is already a timeout scheduled for power 8772 * management. If yes then don't lower the power here, that's. 8773 * the timeout handler's job. 8774 */ 8775 if (un->un_pm_timeid != NULL) { 8776 timeout_id_t temp_id = un->un_pm_timeid; 8777 un->un_pm_timeid = NULL; 8778 mutex_exit(&un->un_pm_mutex); 8779 /* 8780 * Timeout is active; cancel it. 8781 * Note that it'll never be active on a device 8782 * that does not support PM therefore we don't 8783 * have to check before calling pm_idle_component. 8784 */ 8785 (void) untimeout(temp_id); 8786 (void) pm_idle_component(SD_DEVINFO(un), 0); 8787 8788 } else { 8789 mutex_exit(&un->un_pm_mutex); 8790 if ((un->un_f_pm_is_enabled == TRUE) && 8791 (pm_lower_power(SD_DEVINFO(un), 0, SD_PM_STATE_STOPPED(un)) 8792 != DDI_SUCCESS)) { 8793 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8794 "sd_dr_detach: Lower power request failed, ignoring.\n"); 8795 /* 8796 * Fix for bug: 4297749, item # 13 8797 * The above test now includes a check to see if PM is 8798 * supported by this device before call 8799 * pm_lower_power(). 8800 * Note, the following is not dead code. The call to 8801 * pm_lower_power above will generate a call back into 8802 * our sdpower routine which might result in a timeout 8803 * handler getting activated. Therefore the following 8804 * code is valid and necessary. 8805 */ 8806 mutex_enter(&un->un_pm_mutex); 8807 if (un->un_pm_timeid != NULL) { 8808 timeout_id_t temp_id = un->un_pm_timeid; 8809 un->un_pm_timeid = NULL; 8810 mutex_exit(&un->un_pm_mutex); 8811 (void) untimeout(temp_id); 8812 (void) pm_idle_component(SD_DEVINFO(un), 0); 8813 } else { 8814 mutex_exit(&un->un_pm_mutex); 8815 } 8816 } 8817 } 8818 8819 /* 8820 * Cleanup from the scsi_ifsetcap() calls (437868) 8821 * Relocated here from above to be after the call to 8822 * pm_lower_power, which was getting errors. 8823 */ 8824 (void) scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 0, 1); 8825 (void) scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", 0, 1); 8826 8827 /* 8828 * Currently, tagged queuing is supported per target based by HBA. 8829 * Setting this per lun instance actually sets the capability of this 8830 * target in HBA, which affects those luns already attached on the 8831 * same target. So during detach, we can only disable this capability 8832 * only when this is the only lun left on this target. By doing 8833 * this, we assume a target has the same tagged queuing capability 8834 * for every lun. The condition can be removed when HBA is changed to 8835 * support per lun based tagged queuing capability. 8836 */ 8837 if (sd_scsi_get_target_lun_count(pdip, tgt) <= 1) { 8838 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1); 8839 } 8840 8841 if (un->un_f_is_fibre == FALSE) { 8842 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 0, 1); 8843 } 8844 8845 /* 8846 * Remove any event callbacks, fibre only 8847 */ 8848 if (un->un_f_is_fibre == TRUE) { 8849 if ((un->un_insert_event != NULL) && 8850 (ddi_remove_event_handler(un->un_insert_cb_id) != 8851 DDI_SUCCESS)) { 8852 /* 8853 * Note: We are returning here after having done 8854 * substantial cleanup above. This is consistent 8855 * with the legacy implementation but this may not 8856 * be the right thing to do. 8857 */ 8858 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8859 "sd_dr_detach: Cannot cancel insert event\n"); 8860 goto err_remove_event; 8861 } 8862 un->un_insert_event = NULL; 8863 8864 if ((un->un_remove_event != NULL) && 8865 (ddi_remove_event_handler(un->un_remove_cb_id) != 8866 DDI_SUCCESS)) { 8867 /* 8868 * Note: We are returning here after having done 8869 * substantial cleanup above. This is consistent 8870 * with the legacy implementation but this may not 8871 * be the right thing to do. 8872 */ 8873 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8874 "sd_dr_detach: Cannot cancel remove event\n"); 8875 goto err_remove_event; 8876 } 8877 un->un_remove_event = NULL; 8878 } 8879 8880 /* Do not free the softstate if the callback routine is active */ 8881 sd_sync_with_callback(un); 8882 8883 cmlb_detach(un->un_cmlbhandle, (void *)SD_PATH_DIRECT); 8884 cmlb_free_handle(&un->un_cmlbhandle); 8885 8886 /* 8887 * Hold the detach mutex here, to make sure that no other threads ever 8888 * can access a (partially) freed soft state structure. 8889 */ 8890 mutex_enter(&sd_detach_mutex); 8891 8892 /* 8893 * Clean up the soft state struct. 8894 * Cleanup is done in reverse order of allocs/inits. 8895 * At this point there should be no competing threads anymore. 8896 */ 8897 8898 scsi_fm_fini(devp); 8899 8900 /* 8901 * Deallocate memory for SCSI FMA. 8902 */ 8903 kmem_free(un->un_fm_private, sizeof (struct sd_fm_internal)); 8904 8905 /* 8906 * Unregister and free device id if it was not registered 8907 * by the transport. 8908 */ 8909 if (un->un_f_devid_transport_defined == FALSE) 8910 ddi_devid_unregister(devi); 8911 8912 /* 8913 * free the devid structure if allocated before (by ddi_devid_init() 8914 * or ddi_devid_get()). 8915 */ 8916 if (un->un_devid) { 8917 ddi_devid_free(un->un_devid); 8918 un->un_devid = NULL; 8919 } 8920 8921 /* 8922 * Destroy wmap cache if it exists. 8923 */ 8924 if (un->un_wm_cache != NULL) { 8925 kmem_cache_destroy(un->un_wm_cache); 8926 un->un_wm_cache = NULL; 8927 } 8928 8929 /* 8930 * kstat cleanup is done in detach for all device types (4363169). 8931 * We do not want to fail detach if the device kstats are not deleted 8932 * since there is a confusion about the devo_refcnt for the device. 8933 * We just delete the kstats and let detach complete successfully. 8934 */ 8935 if (un->un_stats != NULL) { 8936 kstat_delete(un->un_stats); 8937 un->un_stats = NULL; 8938 } 8939 if (un->un_errstats != NULL) { 8940 kstat_delete(un->un_errstats); 8941 un->un_errstats = NULL; 8942 } 8943 8944 /* Remove partition stats */ 8945 if (un->un_f_pkstats_enabled) { 8946 for (i = 0; i < NSDMAP; i++) { 8947 if (un->un_pstats[i] != NULL) { 8948 kstat_delete(un->un_pstats[i]); 8949 un->un_pstats[i] = NULL; 8950 } 8951 } 8952 } 8953 8954 /* Remove xbuf registration */ 8955 ddi_xbuf_attr_unregister_devinfo(un->un_xbuf_attr, devi); 8956 ddi_xbuf_attr_destroy(un->un_xbuf_attr); 8957 8958 /* Remove driver properties */ 8959 ddi_prop_remove_all(devi); 8960 8961 mutex_destroy(&un->un_pm_mutex); 8962 cv_destroy(&un->un_pm_busy_cv); 8963 8964 cv_destroy(&un->un_wcc_cv); 8965 8966 /* Open/close semaphore */ 8967 sema_destroy(&un->un_semoclose); 8968 8969 /* Removable media condvar. */ 8970 cv_destroy(&un->un_state_cv); 8971 8972 /* Suspend/resume condvar. */ 8973 cv_destroy(&un->un_suspend_cv); 8974 cv_destroy(&un->un_disk_busy_cv); 8975 8976 sd_free_rqs(un); 8977 8978 /* Free up soft state */ 8979 devp->sd_private = NULL; 8980 8981 bzero(un, sizeof (struct sd_lun)); 8982 8983 ddi_soft_state_free(sd_state, instance); 8984 8985 mutex_exit(&sd_detach_mutex); 8986 8987 /* This frees up the INQUIRY data associated with the device. */ 8988 scsi_unprobe(devp); 8989 8990 /* 8991 * After successfully detaching an instance, we update the information 8992 * of how many luns have been attached in the relative target and 8993 * controller for parallel SCSI. This information is used when sd tries 8994 * to set the tagged queuing capability in HBA. 8995 * Since un has been released, we can't use SD_IS_PARALLEL_SCSI(un) to 8996 * check if the device is parallel SCSI. However, we don't need to 8997 * check here because we've already checked during attach. No device 8998 * that is not parallel SCSI is in the chain. 8999 */ 9000 if ((tgt >= 0) && (tgt < NTARGETS_WIDE)) { 9001 sd_scsi_update_lun_on_target(pdip, tgt, SD_SCSI_LUN_DETACH); 9002 } 9003 9004 return (DDI_SUCCESS); 9005 9006 err_notclosed: 9007 mutex_exit(SD_MUTEX(un)); 9008 9009 err_stillbusy: 9010 _NOTE(NO_COMPETING_THREADS_NOW); 9011 9012 err_remove_event: 9013 mutex_enter(&sd_detach_mutex); 9014 un->un_detach_count--; 9015 mutex_exit(&sd_detach_mutex); 9016 9017 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_unit_detach: exit failure\n"); 9018 return (DDI_FAILURE); 9019 } 9020 9021 9022 /* 9023 * Function: sd_create_errstats 9024 * 9025 * Description: This routine instantiates the device error stats. 9026 * 9027 * Note: During attach the stats are instantiated first so they are 9028 * available for attach-time routines that utilize the driver 9029 * iopath to send commands to the device. The stats are initialized 9030 * separately so data obtained during some attach-time routines is 9031 * available. (4362483) 9032 * 9033 * Arguments: un - driver soft state (unit) structure 9034 * instance - driver instance 9035 * 9036 * Context: Kernel thread context 9037 */ 9038 9039 static void 9040 sd_create_errstats(struct sd_lun *un, int instance) 9041 { 9042 struct sd_errstats *stp; 9043 char kstatmodule_err[KSTAT_STRLEN]; 9044 char kstatname[KSTAT_STRLEN]; 9045 int ndata = (sizeof (struct sd_errstats) / sizeof (kstat_named_t)); 9046 9047 ASSERT(un != NULL); 9048 9049 if (un->un_errstats != NULL) { 9050 return; 9051 } 9052 9053 (void) snprintf(kstatmodule_err, sizeof (kstatmodule_err), 9054 "%serr", sd_label); 9055 (void) snprintf(kstatname, sizeof (kstatname), 9056 "%s%d,err", sd_label, instance); 9057 9058 un->un_errstats = kstat_create(kstatmodule_err, instance, kstatname, 9059 "device_error", KSTAT_TYPE_NAMED, ndata, KSTAT_FLAG_PERSISTENT); 9060 9061 if (un->un_errstats == NULL) { 9062 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 9063 "sd_create_errstats: Failed kstat_create\n"); 9064 return; 9065 } 9066 9067 stp = (struct sd_errstats *)un->un_errstats->ks_data; 9068 kstat_named_init(&stp->sd_softerrs, "Soft Errors", 9069 KSTAT_DATA_UINT32); 9070 kstat_named_init(&stp->sd_harderrs, "Hard Errors", 9071 KSTAT_DATA_UINT32); 9072 kstat_named_init(&stp->sd_transerrs, "Transport Errors", 9073 KSTAT_DATA_UINT32); 9074 kstat_named_init(&stp->sd_vid, "Vendor", 9075 KSTAT_DATA_CHAR); 9076 kstat_named_init(&stp->sd_pid, "Product", 9077 KSTAT_DATA_CHAR); 9078 kstat_named_init(&stp->sd_revision, "Revision", 9079 KSTAT_DATA_CHAR); 9080 kstat_named_init(&stp->sd_serial, "Serial No", 9081 KSTAT_DATA_CHAR); 9082 kstat_named_init(&stp->sd_capacity, "Size", 9083 KSTAT_DATA_ULONGLONG); 9084 kstat_named_init(&stp->sd_rq_media_err, "Media Error", 9085 KSTAT_DATA_UINT32); 9086 kstat_named_init(&stp->sd_rq_ntrdy_err, "Device Not Ready", 9087 KSTAT_DATA_UINT32); 9088 kstat_named_init(&stp->sd_rq_nodev_err, "No Device", 9089 KSTAT_DATA_UINT32); 9090 kstat_named_init(&stp->sd_rq_recov_err, "Recoverable", 9091 KSTAT_DATA_UINT32); 9092 kstat_named_init(&stp->sd_rq_illrq_err, "Illegal Request", 9093 KSTAT_DATA_UINT32); 9094 kstat_named_init(&stp->sd_rq_pfa_err, "Predictive Failure Analysis", 9095 KSTAT_DATA_UINT32); 9096 9097 un->un_errstats->ks_private = un; 9098 un->un_errstats->ks_update = nulldev; 9099 9100 kstat_install(un->un_errstats); 9101 } 9102 9103 9104 /* 9105 * Function: sd_set_errstats 9106 * 9107 * Description: This routine sets the value of the vendor id, product id, 9108 * revision, serial number, and capacity device error stats. 9109 * 9110 * Note: During attach the stats are instantiated first so they are 9111 * available for attach-time routines that utilize the driver 9112 * iopath to send commands to the device. The stats are initialized 9113 * separately so data obtained during some attach-time routines is 9114 * available. (4362483) 9115 * 9116 * Arguments: un - driver soft state (unit) structure 9117 * 9118 * Context: Kernel thread context 9119 */ 9120 9121 static void 9122 sd_set_errstats(struct sd_lun *un) 9123 { 9124 struct sd_errstats *stp; 9125 char *sn; 9126 9127 ASSERT(un != NULL); 9128 ASSERT(un->un_errstats != NULL); 9129 stp = (struct sd_errstats *)un->un_errstats->ks_data; 9130 ASSERT(stp != NULL); 9131 (void) strncpy(stp->sd_vid.value.c, un->un_sd->sd_inq->inq_vid, 8); 9132 (void) strncpy(stp->sd_pid.value.c, un->un_sd->sd_inq->inq_pid, 16); 9133 (void) strncpy(stp->sd_revision.value.c, 9134 un->un_sd->sd_inq->inq_revision, 4); 9135 9136 /* 9137 * All the errstats are persistent across detach/attach, 9138 * so reset all the errstats here in case of the hot 9139 * replacement of disk drives, except for not changed 9140 * Sun qualified drives. 9141 */ 9142 if ((bcmp(&SD_INQUIRY(un)->inq_pid[9], "SUN", 3) != 0) || 9143 (bcmp(&SD_INQUIRY(un)->inq_serial, stp->sd_serial.value.c, 9144 sizeof (SD_INQUIRY(un)->inq_serial)) != 0)) { 9145 stp->sd_softerrs.value.ui32 = 0; 9146 stp->sd_harderrs.value.ui32 = 0; 9147 stp->sd_transerrs.value.ui32 = 0; 9148 stp->sd_rq_media_err.value.ui32 = 0; 9149 stp->sd_rq_ntrdy_err.value.ui32 = 0; 9150 stp->sd_rq_nodev_err.value.ui32 = 0; 9151 stp->sd_rq_recov_err.value.ui32 = 0; 9152 stp->sd_rq_illrq_err.value.ui32 = 0; 9153 stp->sd_rq_pfa_err.value.ui32 = 0; 9154 } 9155 9156 /* 9157 * Set the "Serial No" kstat for Sun qualified drives (indicated by 9158 * "SUN" in bytes 25-27 of the inquiry data (bytes 9-11 of the pid) 9159 * (4376302)) 9160 */ 9161 if (bcmp(&SD_INQUIRY(un)->inq_pid[9], "SUN", 3) == 0) { 9162 bcopy(&SD_INQUIRY(un)->inq_serial, stp->sd_serial.value.c, 9163 sizeof (SD_INQUIRY(un)->inq_serial)); 9164 } else { 9165 /* 9166 * Set the "Serial No" kstat for non-Sun qualified drives 9167 */ 9168 if (ddi_prop_lookup_string(DDI_DEV_T_ANY, SD_DEVINFO(un), 9169 DDI_PROP_NOTPROM | DDI_PROP_DONTPASS, 9170 INQUIRY_SERIAL_NO, &sn) == DDI_SUCCESS) { 9171 (void) strlcpy(stp->sd_serial.value.c, sn, 9172 sizeof (stp->sd_serial.value.c)); 9173 ddi_prop_free(sn); 9174 } 9175 } 9176 9177 if (un->un_f_blockcount_is_valid != TRUE) { 9178 /* 9179 * Set capacity error stat to 0 for no media. This ensures 9180 * a valid capacity is displayed in response to 'iostat -E' 9181 * when no media is present in the device. 9182 */ 9183 stp->sd_capacity.value.ui64 = 0; 9184 } else { 9185 /* 9186 * Multiply un_blockcount by un->un_sys_blocksize to get 9187 * capacity. 9188 * 9189 * Note: for non-512 blocksize devices "un_blockcount" has been 9190 * "scaled" in sd_send_scsi_READ_CAPACITY by multiplying by 9191 * (un_tgt_blocksize / un->un_sys_blocksize). 9192 */ 9193 stp->sd_capacity.value.ui64 = (uint64_t) 9194 ((uint64_t)un->un_blockcount * un->un_sys_blocksize); 9195 } 9196 } 9197 9198 9199 /* 9200 * Function: sd_set_pstats 9201 * 9202 * Description: This routine instantiates and initializes the partition 9203 * stats for each partition with more than zero blocks. 9204 * (4363169) 9205 * 9206 * Arguments: un - driver soft state (unit) structure 9207 * 9208 * Context: Kernel thread context 9209 */ 9210 9211 static void 9212 sd_set_pstats(struct sd_lun *un) 9213 { 9214 char kstatname[KSTAT_STRLEN]; 9215 int instance; 9216 int i; 9217 diskaddr_t nblks = 0; 9218 char *partname = NULL; 9219 9220 ASSERT(un != NULL); 9221 9222 instance = ddi_get_instance(SD_DEVINFO(un)); 9223 9224 /* Note:x86: is this a VTOC8/VTOC16 difference? */ 9225 for (i = 0; i < NSDMAP; i++) { 9226 9227 if (cmlb_partinfo(un->un_cmlbhandle, i, 9228 &nblks, NULL, &partname, NULL, (void *)SD_PATH_DIRECT) != 0) 9229 continue; 9230 mutex_enter(SD_MUTEX(un)); 9231 9232 if ((un->un_pstats[i] == NULL) && 9233 (nblks != 0)) { 9234 9235 (void) snprintf(kstatname, sizeof (kstatname), 9236 "%s%d,%s", sd_label, instance, 9237 partname); 9238 9239 un->un_pstats[i] = kstat_create(sd_label, 9240 instance, kstatname, "partition", KSTAT_TYPE_IO, 9241 1, KSTAT_FLAG_PERSISTENT); 9242 if (un->un_pstats[i] != NULL) { 9243 un->un_pstats[i]->ks_lock = SD_MUTEX(un); 9244 kstat_install(un->un_pstats[i]); 9245 } 9246 } 9247 mutex_exit(SD_MUTEX(un)); 9248 } 9249 } 9250 9251 9252 #if (defined(__fibre)) 9253 /* 9254 * Function: sd_init_event_callbacks 9255 * 9256 * Description: This routine initializes the insertion and removal event 9257 * callbacks. (fibre only) 9258 * 9259 * Arguments: un - driver soft state (unit) structure 9260 * 9261 * Context: Kernel thread context 9262 */ 9263 9264 static void 9265 sd_init_event_callbacks(struct sd_lun *un) 9266 { 9267 ASSERT(un != NULL); 9268 9269 if ((un->un_insert_event == NULL) && 9270 (ddi_get_eventcookie(SD_DEVINFO(un), FCAL_INSERT_EVENT, 9271 &un->un_insert_event) == DDI_SUCCESS)) { 9272 /* 9273 * Add the callback for an insertion event 9274 */ 9275 (void) ddi_add_event_handler(SD_DEVINFO(un), 9276 un->un_insert_event, sd_event_callback, (void *)un, 9277 &(un->un_insert_cb_id)); 9278 } 9279 9280 if ((un->un_remove_event == NULL) && 9281 (ddi_get_eventcookie(SD_DEVINFO(un), FCAL_REMOVE_EVENT, 9282 &un->un_remove_event) == DDI_SUCCESS)) { 9283 /* 9284 * Add the callback for a removal event 9285 */ 9286 (void) ddi_add_event_handler(SD_DEVINFO(un), 9287 un->un_remove_event, sd_event_callback, (void *)un, 9288 &(un->un_remove_cb_id)); 9289 } 9290 } 9291 9292 9293 /* 9294 * Function: sd_event_callback 9295 * 9296 * Description: This routine handles insert/remove events (photon). The 9297 * state is changed to OFFLINE which can be used to supress 9298 * error msgs. (fibre only) 9299 * 9300 * Arguments: un - driver soft state (unit) structure 9301 * 9302 * Context: Callout thread context 9303 */ 9304 /* ARGSUSED */ 9305 static void 9306 sd_event_callback(dev_info_t *dip, ddi_eventcookie_t event, void *arg, 9307 void *bus_impldata) 9308 { 9309 struct sd_lun *un = (struct sd_lun *)arg; 9310 9311 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_insert_event)); 9312 if (event == un->un_insert_event) { 9313 SD_TRACE(SD_LOG_COMMON, un, "sd_event_callback: insert event"); 9314 mutex_enter(SD_MUTEX(un)); 9315 if (un->un_state == SD_STATE_OFFLINE) { 9316 if (un->un_last_state != SD_STATE_SUSPENDED) { 9317 un->un_state = un->un_last_state; 9318 } else { 9319 /* 9320 * We have gone through SUSPEND/RESUME while 9321 * we were offline. Restore the last state 9322 */ 9323 un->un_state = un->un_save_state; 9324 } 9325 } 9326 mutex_exit(SD_MUTEX(un)); 9327 9328 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_remove_event)); 9329 } else if (event == un->un_remove_event) { 9330 SD_TRACE(SD_LOG_COMMON, un, "sd_event_callback: remove event"); 9331 mutex_enter(SD_MUTEX(un)); 9332 /* 9333 * We need to handle an event callback that occurs during 9334 * the suspend operation, since we don't prevent it. 9335 */ 9336 if (un->un_state != SD_STATE_OFFLINE) { 9337 if (un->un_state != SD_STATE_SUSPENDED) { 9338 New_state(un, SD_STATE_OFFLINE); 9339 } else { 9340 un->un_last_state = SD_STATE_OFFLINE; 9341 } 9342 } 9343 mutex_exit(SD_MUTEX(un)); 9344 } else { 9345 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE, 9346 "!Unknown event\n"); 9347 } 9348 9349 } 9350 #endif 9351 9352 /* 9353 * Values related to caching mode page depending on whether the unit is ATAPI. 9354 */ 9355 #define SDC_CDB_GROUP(un) ((un->un_f_cfg_is_atapi == TRUE) ? \ 9356 CDB_GROUP1 : CDB_GROUP0) 9357 #define SDC_HDRLEN(un) ((un->un_f_cfg_is_atapi == TRUE) ? \ 9358 MODE_HEADER_LENGTH_GRP2 : MODE_HEADER_LENGTH) 9359 /* 9360 * Use mode_cache_scsi3 to ensure we get all of the mode sense data, otherwise 9361 * the mode select will fail (mode_cache_scsi3 is a superset of mode_caching). 9362 */ 9363 #define SDC_BUFLEN(un) (SDC_HDRLEN(un) + MODE_BLK_DESC_LENGTH + \ 9364 sizeof (struct mode_cache_scsi3)) 9365 9366 static int 9367 sd_get_caching_mode_page(sd_ssc_t *ssc, uchar_t page_control, uchar_t **header, 9368 int *bdlen) 9369 { 9370 struct sd_lun *un = ssc->ssc_un; 9371 struct mode_caching *mode_caching_page; 9372 size_t buflen = SDC_BUFLEN(un); 9373 int hdrlen = SDC_HDRLEN(un); 9374 int rval; 9375 9376 /* 9377 * Do a test unit ready, otherwise a mode sense may not work if this 9378 * is the first command sent to the device after boot. 9379 */ 9380 if (sd_send_scsi_TEST_UNIT_READY(ssc, 0) != 0) 9381 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9382 9383 /* 9384 * Allocate memory for the retrieved mode page and its headers. Set 9385 * a pointer to the page itself. 9386 */ 9387 *header = kmem_zalloc(buflen, KM_SLEEP); 9388 9389 /* Get the information from the device */ 9390 rval = sd_send_scsi_MODE_SENSE(ssc, SDC_CDB_GROUP(un), *header, buflen, 9391 page_control | MODEPAGE_CACHING, SD_PATH_DIRECT); 9392 if (rval != 0) { 9393 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un, "%s: Mode Sense Failed\n", 9394 __func__); 9395 goto mode_sense_failed; 9396 } 9397 9398 /* 9399 * Determine size of Block Descriptors in order to locate 9400 * the mode page data. ATAPI devices return 0, SCSI devices 9401 * should return MODE_BLK_DESC_LENGTH. 9402 */ 9403 if (un->un_f_cfg_is_atapi == TRUE) { 9404 struct mode_header_grp2 *mhp = 9405 (struct mode_header_grp2 *)(*header); 9406 *bdlen = (mhp->bdesc_length_hi << 8) | mhp->bdesc_length_lo; 9407 } else { 9408 *bdlen = ((struct mode_header *)(*header))->bdesc_length; 9409 } 9410 9411 if (*bdlen > MODE_BLK_DESC_LENGTH) { 9412 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, 0, 9413 "%s: Mode Sense returned invalid block descriptor length\n", 9414 __func__); 9415 rval = EIO; 9416 goto mode_sense_failed; 9417 } 9418 9419 mode_caching_page = (struct mode_caching *)(*header + hdrlen + *bdlen); 9420 if (mode_caching_page->mode_page.code != MODEPAGE_CACHING) { 9421 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON, 9422 "%s: Mode Sense caching page code mismatch %d\n", 9423 __func__, mode_caching_page->mode_page.code); 9424 rval = EIO; 9425 } 9426 9427 mode_sense_failed: 9428 if (rval != 0) { 9429 kmem_free(*header, buflen); 9430 *header = NULL; 9431 *bdlen = 0; 9432 } 9433 return (rval); 9434 } 9435 9436 /* 9437 * Function: sd_cache_control() 9438 * 9439 * Description: This routine is the driver entry point for setting 9440 * read and write caching by modifying the WCE (write cache 9441 * enable) and RCD (read cache disable) bits of mode 9442 * page 8 (MODEPAGE_CACHING). 9443 * 9444 * Arguments: ssc - ssc contains pointer to driver soft state 9445 * (unit) structure for this target. 9446 * rcd_flag - flag for controlling the read cache 9447 * wce_flag - flag for controlling the write cache 9448 * 9449 * Return Code: EIO 9450 * code returned by sd_send_scsi_MODE_SENSE and 9451 * sd_send_scsi_MODE_SELECT 9452 * 9453 * Context: Kernel Thread 9454 */ 9455 9456 static int 9457 sd_cache_control(sd_ssc_t *ssc, int rcd_flag, int wce_flag) 9458 { 9459 struct sd_lun *un = ssc->ssc_un; 9460 struct mode_caching *mode_caching_page; 9461 uchar_t *header; 9462 size_t buflen = SDC_BUFLEN(un); 9463 int hdrlen = SDC_HDRLEN(un); 9464 int bdlen; 9465 int rval; 9466 9467 rval = sd_get_caching_mode_page(ssc, MODEPAGE_CURRENT, &header, &bdlen); 9468 switch (rval) { 9469 case 0: 9470 /* Check the relevant bits on successful mode sense */ 9471 mode_caching_page = (struct mode_caching *)(header + hdrlen + 9472 bdlen); 9473 if ((mode_caching_page->rcd && rcd_flag == SD_CACHE_ENABLE) || 9474 (!mode_caching_page->rcd && rcd_flag == SD_CACHE_DISABLE) || 9475 (mode_caching_page->wce && wce_flag == SD_CACHE_DISABLE) || 9476 (!mode_caching_page->wce && wce_flag == SD_CACHE_ENABLE)) { 9477 size_t sbuflen; 9478 uchar_t save_pg; 9479 9480 /* 9481 * Construct select buffer length based on the 9482 * length of the sense data returned. 9483 */ 9484 sbuflen = hdrlen + bdlen + sizeof (struct mode_page) + 9485 (int)mode_caching_page->mode_page.length; 9486 9487 /* Set the caching bits as requested */ 9488 if (rcd_flag == SD_CACHE_ENABLE) 9489 mode_caching_page->rcd = 0; 9490 else if (rcd_flag == SD_CACHE_DISABLE) 9491 mode_caching_page->rcd = 1; 9492 9493 if (wce_flag == SD_CACHE_ENABLE) 9494 mode_caching_page->wce = 1; 9495 else if (wce_flag == SD_CACHE_DISABLE) 9496 mode_caching_page->wce = 0; 9497 9498 /* 9499 * Save the page if the mode sense says the 9500 * drive supports it. 9501 */ 9502 save_pg = mode_caching_page->mode_page.ps ? 9503 SD_SAVE_PAGE : SD_DONTSAVE_PAGE; 9504 9505 /* Clear reserved bits before mode select */ 9506 mode_caching_page->mode_page.ps = 0; 9507 9508 /* 9509 * Clear out mode header for mode select. 9510 * The rest of the retrieved page will be reused. 9511 */ 9512 bzero(header, hdrlen); 9513 9514 if (un->un_f_cfg_is_atapi == TRUE) { 9515 struct mode_header_grp2 *mhp = 9516 (struct mode_header_grp2 *)header; 9517 mhp->bdesc_length_hi = bdlen >> 8; 9518 mhp->bdesc_length_lo = (uchar_t)bdlen & 0xff; 9519 } else { 9520 ((struct mode_header *)header)->bdesc_length = 9521 bdlen; 9522 } 9523 9524 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9525 9526 /* Issue mode select to change the cache settings */ 9527 rval = sd_send_scsi_MODE_SELECT(ssc, SDC_CDB_GROUP(un), 9528 header, sbuflen, save_pg, SD_PATH_DIRECT); 9529 } 9530 kmem_free(header, buflen); 9531 break; 9532 case EIO: 9533 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 9534 break; 9535 default: 9536 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9537 break; 9538 } 9539 9540 return (rval); 9541 } 9542 9543 9544 /* 9545 * Function: sd_get_write_cache_enabled() 9546 * 9547 * Description: This routine is the driver entry point for determining if write 9548 * caching is enabled. It examines the WCE (write cache enable) 9549 * bits of mode page 8 (MODEPAGE_CACHING) with Page Control field 9550 * bits set to MODEPAGE_CURRENT. 9551 * 9552 * Arguments: ssc - ssc contains pointer to driver soft state 9553 * (unit) structure for this target. 9554 * is_enabled - pointer to int where write cache enabled state 9555 * is returned (non-zero -> write cache enabled) 9556 * 9557 * Return Code: EIO 9558 * code returned by sd_send_scsi_MODE_SENSE 9559 * 9560 * Context: Kernel Thread 9561 * 9562 * NOTE: If ioctl is added to disable write cache, this sequence should 9563 * be followed so that no locking is required for accesses to 9564 * un->un_f_write_cache_enabled: 9565 * do mode select to clear wce 9566 * do synchronize cache to flush cache 9567 * set un->un_f_write_cache_enabled = FALSE 9568 * 9569 * Conversely, an ioctl to enable the write cache should be done 9570 * in this order: 9571 * set un->un_f_write_cache_enabled = TRUE 9572 * do mode select to set wce 9573 */ 9574 9575 static int 9576 sd_get_write_cache_enabled(sd_ssc_t *ssc, int *is_enabled) 9577 { 9578 struct sd_lun *un = ssc->ssc_un; 9579 struct mode_caching *mode_caching_page; 9580 uchar_t *header; 9581 size_t buflen = SDC_BUFLEN(un); 9582 int hdrlen = SDC_HDRLEN(un); 9583 int bdlen; 9584 int rval; 9585 9586 /* In case of error, flag as enabled */ 9587 *is_enabled = TRUE; 9588 9589 rval = sd_get_caching_mode_page(ssc, MODEPAGE_CURRENT, &header, &bdlen); 9590 switch (rval) { 9591 case 0: 9592 mode_caching_page = (struct mode_caching *)(header + hdrlen + 9593 bdlen); 9594 *is_enabled = mode_caching_page->wce; 9595 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 9596 kmem_free(header, buflen); 9597 break; 9598 case EIO: { 9599 /* 9600 * Some disks do not support Mode Sense(6), we 9601 * should ignore this kind of error (sense key is 9602 * 0x5 - illegal request). 9603 */ 9604 uint8_t *sensep; 9605 int senlen; 9606 9607 sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf; 9608 senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen - 9609 ssc->ssc_uscsi_cmd->uscsi_rqresid); 9610 9611 if (senlen > 0 && 9612 scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) { 9613 sd_ssc_assessment(ssc, SD_FMT_IGNORE_COMPROMISE); 9614 } else { 9615 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 9616 } 9617 break; 9618 } 9619 default: 9620 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9621 break; 9622 } 9623 9624 return (rval); 9625 } 9626 9627 /* 9628 * Function: sd_get_write_cache_changeable() 9629 * 9630 * Description: This routine is the driver entry point for determining if write 9631 * caching is changeable. It examines the WCE (write cache enable) 9632 * bits of mode page 8 (MODEPAGE_CACHING) with Page Control field 9633 * bits set to MODEPAGE_CHANGEABLE. 9634 * 9635 * Arguments: ssc - ssc contains pointer to driver soft state 9636 * (unit) structure for this target. 9637 * is_changeable - pointer to int where write cache changeable 9638 * state is returned (non-zero -> write cache 9639 * changeable) 9640 * 9641 * Context: Kernel Thread 9642 */ 9643 9644 static void 9645 sd_get_write_cache_changeable(sd_ssc_t *ssc, int *is_changeable) 9646 { 9647 struct sd_lun *un = ssc->ssc_un; 9648 struct mode_caching *mode_caching_page; 9649 uchar_t *header; 9650 size_t buflen = SDC_BUFLEN(un); 9651 int hdrlen = SDC_HDRLEN(un); 9652 int bdlen; 9653 int rval; 9654 9655 /* In case of error, flag as enabled */ 9656 *is_changeable = TRUE; 9657 9658 rval = sd_get_caching_mode_page(ssc, MODEPAGE_CHANGEABLE, &header, 9659 &bdlen); 9660 switch (rval) { 9661 case 0: 9662 mode_caching_page = (struct mode_caching *)(header + hdrlen + 9663 bdlen); 9664 *is_changeable = mode_caching_page->wce; 9665 kmem_free(header, buflen); 9666 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 9667 break; 9668 case EIO: 9669 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 9670 break; 9671 default: 9672 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9673 break; 9674 } 9675 } 9676 9677 /* 9678 * Function: sd_get_nv_sup() 9679 * 9680 * Description: This routine is the driver entry point for 9681 * determining whether non-volatile cache is supported. This 9682 * determination process works as follows: 9683 * 9684 * 1. sd first queries sd.conf on whether 9685 * suppress_cache_flush bit is set for this device. 9686 * 9687 * 2. if not there, then queries the internal disk table. 9688 * 9689 * 3. if either sd.conf or internal disk table specifies 9690 * cache flush be suppressed, we don't bother checking 9691 * NV_SUP bit. 9692 * 9693 * If SUPPRESS_CACHE_FLUSH bit is not set to 1, sd queries 9694 * the optional INQUIRY VPD page 0x86. If the device 9695 * supports VPD page 0x86, sd examines the NV_SUP 9696 * (non-volatile cache support) bit in the INQUIRY VPD page 9697 * 0x86: 9698 * o If NV_SUP bit is set, sd assumes the device has a 9699 * non-volatile cache and set the 9700 * un_f_sync_nv_supported to TRUE. 9701 * o Otherwise cache is not non-volatile, 9702 * un_f_sync_nv_supported is set to FALSE. 9703 * 9704 * Arguments: un - driver soft state (unit) structure 9705 * 9706 * Return Code: 9707 * 9708 * Context: Kernel Thread 9709 */ 9710 9711 static void 9712 sd_get_nv_sup(sd_ssc_t *ssc) 9713 { 9714 int rval = 0; 9715 uchar_t *inq86 = NULL; 9716 size_t inq86_len = MAX_INQUIRY_SIZE; 9717 size_t inq86_resid = 0; 9718 struct dk_callback *dkc; 9719 struct sd_lun *un; 9720 9721 ASSERT(ssc != NULL); 9722 un = ssc->ssc_un; 9723 ASSERT(un != NULL); 9724 9725 mutex_enter(SD_MUTEX(un)); 9726 9727 /* 9728 * Be conservative on the device's support of 9729 * SYNC_NV bit: un_f_sync_nv_supported is 9730 * initialized to be false. 9731 */ 9732 un->un_f_sync_nv_supported = FALSE; 9733 9734 /* 9735 * If either sd.conf or internal disk table 9736 * specifies cache flush be suppressed, then 9737 * we don't bother checking NV_SUP bit. 9738 */ 9739 if (un->un_f_suppress_cache_flush == TRUE) { 9740 mutex_exit(SD_MUTEX(un)); 9741 return; 9742 } 9743 9744 if (sd_check_vpd_page_support(ssc) == 0 && 9745 un->un_vpd_page_mask & SD_VPD_EXTENDED_DATA_PG) { 9746 mutex_exit(SD_MUTEX(un)); 9747 /* collect page 86 data if available */ 9748 inq86 = kmem_zalloc(inq86_len, KM_SLEEP); 9749 9750 rval = sd_send_scsi_INQUIRY(ssc, inq86, inq86_len, 9751 0x01, 0x86, &inq86_resid); 9752 9753 if (rval == 0 && (inq86_len - inq86_resid > 6)) { 9754 SD_TRACE(SD_LOG_COMMON, un, 9755 "sd_get_nv_sup: \ 9756 successfully get VPD page: %x \ 9757 PAGE LENGTH: %x BYTE 6: %x\n", 9758 inq86[1], inq86[3], inq86[6]); 9759 9760 mutex_enter(SD_MUTEX(un)); 9761 /* 9762 * check the value of NV_SUP bit: only if the device 9763 * reports NV_SUP bit to be 1, the 9764 * un_f_sync_nv_supported bit will be set to true. 9765 */ 9766 if (inq86[6] & SD_VPD_NV_SUP) { 9767 un->un_f_sync_nv_supported = TRUE; 9768 } 9769 mutex_exit(SD_MUTEX(un)); 9770 } else if (rval != 0) { 9771 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9772 } 9773 9774 kmem_free(inq86, inq86_len); 9775 } else { 9776 mutex_exit(SD_MUTEX(un)); 9777 } 9778 9779 /* 9780 * Send a SYNC CACHE command to check whether 9781 * SYNC_NV bit is supported. This command should have 9782 * un_f_sync_nv_supported set to correct value. 9783 */ 9784 mutex_enter(SD_MUTEX(un)); 9785 if (un->un_f_sync_nv_supported) { 9786 mutex_exit(SD_MUTEX(un)); 9787 dkc = kmem_zalloc(sizeof (struct dk_callback), KM_SLEEP); 9788 dkc->dkc_flag = FLUSH_VOLATILE; 9789 (void) sd_send_scsi_SYNCHRONIZE_CACHE(un, dkc); 9790 9791 /* 9792 * Send a TEST UNIT READY command to the device. This should 9793 * clear any outstanding UNIT ATTENTION that may be present. 9794 */ 9795 rval = sd_send_scsi_TEST_UNIT_READY(ssc, SD_DONT_RETRY_TUR); 9796 if (rval != 0) 9797 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9798 9799 kmem_free(dkc, sizeof (struct dk_callback)); 9800 } else { 9801 mutex_exit(SD_MUTEX(un)); 9802 } 9803 9804 SD_TRACE(SD_LOG_COMMON, un, "sd_get_nv_sup: \ 9805 un_f_suppress_cache_flush is set to %d\n", 9806 un->un_f_suppress_cache_flush); 9807 } 9808 9809 /* 9810 * Function: sd_make_device 9811 * 9812 * Description: Utility routine to return the Solaris device number from 9813 * the data in the device's dev_info structure. 9814 * 9815 * Return Code: The Solaris device number 9816 * 9817 * Context: Any 9818 */ 9819 9820 static dev_t 9821 sd_make_device(dev_info_t *devi) 9822 { 9823 return (makedevice(ddi_driver_major(devi), 9824 ddi_get_instance(devi) << SDUNIT_SHIFT)); 9825 } 9826 9827 9828 /* 9829 * Function: sd_pm_entry 9830 * 9831 * Description: Called at the start of a new command to manage power 9832 * and busy status of a device. This includes determining whether 9833 * the current power state of the device is sufficient for 9834 * performing the command or whether it must be changed. 9835 * The PM framework is notified appropriately. 9836 * Only with a return status of DDI_SUCCESS will the 9837 * component be busy to the framework. 9838 * 9839 * All callers of sd_pm_entry must check the return status 9840 * and only call sd_pm_exit it it was DDI_SUCCESS. A status 9841 * of DDI_FAILURE indicates the device failed to power up. 9842 * In this case un_pm_count has been adjusted so the result 9843 * on exit is still powered down, ie. count is less than 0. 9844 * Calling sd_pm_exit with this count value hits an ASSERT. 9845 * 9846 * Return Code: DDI_SUCCESS or DDI_FAILURE 9847 * 9848 * Context: Kernel thread context. 9849 */ 9850 9851 static int 9852 sd_pm_entry(struct sd_lun *un) 9853 { 9854 int return_status = DDI_SUCCESS; 9855 9856 ASSERT(!mutex_owned(SD_MUTEX(un))); 9857 ASSERT(!mutex_owned(&un->un_pm_mutex)); 9858 9859 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_entry: entry\n"); 9860 9861 if (un->un_f_pm_is_enabled == FALSE) { 9862 SD_TRACE(SD_LOG_IO_PM, un, 9863 "sd_pm_entry: exiting, PM not enabled\n"); 9864 return (return_status); 9865 } 9866 9867 /* 9868 * Just increment a counter if PM is enabled. On the transition from 9869 * 0 ==> 1, mark the device as busy. The iodone side will decrement 9870 * the count with each IO and mark the device as idle when the count 9871 * hits 0. 9872 * 9873 * If the count is less than 0 the device is powered down. If a powered 9874 * down device is successfully powered up then the count must be 9875 * incremented to reflect the power up. Note that it'll get incremented 9876 * a second time to become busy. 9877 * 9878 * Because the following has the potential to change the device state 9879 * and must release the un_pm_mutex to do so, only one thread can be 9880 * allowed through at a time. 9881 */ 9882 9883 mutex_enter(&un->un_pm_mutex); 9884 while (un->un_pm_busy == TRUE) { 9885 cv_wait(&un->un_pm_busy_cv, &un->un_pm_mutex); 9886 } 9887 un->un_pm_busy = TRUE; 9888 9889 if (un->un_pm_count < 1) { 9890 9891 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_entry: busy component\n"); 9892 9893 /* 9894 * Indicate we are now busy so the framework won't attempt to 9895 * power down the device. This call will only fail if either 9896 * we passed a bad component number or the device has no 9897 * components. Neither of these should ever happen. 9898 */ 9899 mutex_exit(&un->un_pm_mutex); 9900 return_status = pm_busy_component(SD_DEVINFO(un), 0); 9901 ASSERT(return_status == DDI_SUCCESS); 9902 9903 mutex_enter(&un->un_pm_mutex); 9904 9905 if (un->un_pm_count < 0) { 9906 mutex_exit(&un->un_pm_mutex); 9907 9908 SD_TRACE(SD_LOG_IO_PM, un, 9909 "sd_pm_entry: power up component\n"); 9910 9911 /* 9912 * pm_raise_power will cause sdpower to be called 9913 * which brings the device power level to the 9914 * desired state, If successful, un_pm_count and 9915 * un_power_level will be updated appropriately. 9916 */ 9917 return_status = pm_raise_power(SD_DEVINFO(un), 0, 9918 SD_PM_STATE_ACTIVE(un)); 9919 9920 mutex_enter(&un->un_pm_mutex); 9921 9922 if (return_status != DDI_SUCCESS) { 9923 /* 9924 * Power up failed. 9925 * Idle the device and adjust the count 9926 * so the result on exit is that we're 9927 * still powered down, ie. count is less than 0. 9928 */ 9929 SD_TRACE(SD_LOG_IO_PM, un, 9930 "sd_pm_entry: power up failed," 9931 " idle the component\n"); 9932 9933 (void) pm_idle_component(SD_DEVINFO(un), 0); 9934 un->un_pm_count--; 9935 } else { 9936 /* 9937 * Device is powered up, verify the 9938 * count is non-negative. 9939 * This is debug only. 9940 */ 9941 ASSERT(un->un_pm_count == 0); 9942 } 9943 } 9944 9945 if (return_status == DDI_SUCCESS) { 9946 /* 9947 * For performance, now that the device has been tagged 9948 * as busy, and it's known to be powered up, update the 9949 * chain types to use jump tables that do not include 9950 * pm. This significantly lowers the overhead and 9951 * therefore improves performance. 9952 */ 9953 9954 mutex_exit(&un->un_pm_mutex); 9955 mutex_enter(SD_MUTEX(un)); 9956 SD_TRACE(SD_LOG_IO_PM, un, 9957 "sd_pm_entry: changing uscsi_chain_type from %d\n", 9958 un->un_uscsi_chain_type); 9959 9960 if (un->un_f_non_devbsize_supported) { 9961 un->un_buf_chain_type = 9962 SD_CHAIN_INFO_RMMEDIA_NO_PM; 9963 } else { 9964 un->un_buf_chain_type = 9965 SD_CHAIN_INFO_DISK_NO_PM; 9966 } 9967 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD_NO_PM; 9968 9969 SD_TRACE(SD_LOG_IO_PM, un, 9970 " changed uscsi_chain_type to %d\n", 9971 un->un_uscsi_chain_type); 9972 mutex_exit(SD_MUTEX(un)); 9973 mutex_enter(&un->un_pm_mutex); 9974 9975 if (un->un_pm_idle_timeid == NULL) { 9976 /* 300 ms. */ 9977 un->un_pm_idle_timeid = 9978 timeout(sd_pm_idletimeout_handler, un, 9979 (drv_usectohz((clock_t)300000))); 9980 /* 9981 * Include an extra call to busy which keeps the 9982 * device busy with-respect-to the PM layer 9983 * until the timer fires, at which time it'll 9984 * get the extra idle call. 9985 */ 9986 (void) pm_busy_component(SD_DEVINFO(un), 0); 9987 } 9988 } 9989 } 9990 un->un_pm_busy = FALSE; 9991 /* Next... */ 9992 cv_signal(&un->un_pm_busy_cv); 9993 9994 un->un_pm_count++; 9995 9996 SD_TRACE(SD_LOG_IO_PM, un, 9997 "sd_pm_entry: exiting, un_pm_count = %d\n", un->un_pm_count); 9998 9999 mutex_exit(&un->un_pm_mutex); 10000 10001 return (return_status); 10002 } 10003 10004 10005 /* 10006 * Function: sd_pm_exit 10007 * 10008 * Description: Called at the completion of a command to manage busy 10009 * status for the device. If the device becomes idle the 10010 * PM framework is notified. 10011 * 10012 * Context: Kernel thread context 10013 */ 10014 10015 static void 10016 sd_pm_exit(struct sd_lun *un) 10017 { 10018 ASSERT(!mutex_owned(SD_MUTEX(un))); 10019 ASSERT(!mutex_owned(&un->un_pm_mutex)); 10020 10021 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_exit: entry\n"); 10022 10023 /* 10024 * After attach the following flag is only read, so don't 10025 * take the penalty of acquiring a mutex for it. 10026 */ 10027 if (un->un_f_pm_is_enabled == TRUE) { 10028 10029 mutex_enter(&un->un_pm_mutex); 10030 un->un_pm_count--; 10031 10032 SD_TRACE(SD_LOG_IO_PM, un, 10033 "sd_pm_exit: un_pm_count = %d\n", un->un_pm_count); 10034 10035 ASSERT(un->un_pm_count >= 0); 10036 if (un->un_pm_count == 0) { 10037 mutex_exit(&un->un_pm_mutex); 10038 10039 SD_TRACE(SD_LOG_IO_PM, un, 10040 "sd_pm_exit: idle component\n"); 10041 10042 (void) pm_idle_component(SD_DEVINFO(un), 0); 10043 10044 } else { 10045 mutex_exit(&un->un_pm_mutex); 10046 } 10047 } 10048 10049 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_exit: exiting\n"); 10050 } 10051 10052 10053 /* 10054 * Function: sdopen 10055 * 10056 * Description: Driver's open(9e) entry point function. 10057 * 10058 * Arguments: dev_i - pointer to device number 10059 * flag - how to open file (FEXCL, FNDELAY, FREAD, FWRITE) 10060 * otyp - open type (OTYP_BLK, OTYP_CHR, OTYP_LYR) 10061 * cred_p - user credential pointer 10062 * 10063 * Return Code: EINVAL 10064 * ENXIO 10065 * EIO 10066 * EROFS 10067 * EBUSY 10068 * 10069 * Context: Kernel thread context 10070 */ 10071 /* ARGSUSED */ 10072 static int 10073 sdopen(dev_t *dev_p, int flag, int otyp, cred_t *cred_p) 10074 { 10075 struct sd_lun *un; 10076 int nodelay; 10077 int part; 10078 uint64_t partmask; 10079 int instance; 10080 dev_t dev; 10081 int rval = EIO; 10082 diskaddr_t nblks = 0; 10083 diskaddr_t label_cap; 10084 10085 /* Validate the open type */ 10086 if (otyp >= OTYPCNT) { 10087 return (EINVAL); 10088 } 10089 10090 dev = *dev_p; 10091 instance = SDUNIT(dev); 10092 mutex_enter(&sd_detach_mutex); 10093 10094 /* 10095 * Fail the open if there is no softstate for the instance, or 10096 * if another thread somewhere is trying to detach the instance. 10097 */ 10098 if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) || 10099 (un->un_detach_count != 0)) { 10100 mutex_exit(&sd_detach_mutex); 10101 /* 10102 * The probe cache only needs to be cleared when open (9e) fails 10103 * with ENXIO (4238046). 10104 */ 10105 /* 10106 * un-conditionally clearing probe cache is ok with 10107 * separate sd/ssd binaries 10108 * x86 platform can be an issue with both parallel 10109 * and fibre in 1 binary 10110 */ 10111 sd_scsi_clear_probe_cache(); 10112 return (ENXIO); 10113 } 10114 10115 /* 10116 * The un_layer_count is to prevent another thread in specfs from 10117 * trying to detach the instance, which can happen when we are 10118 * called from a higher-layer driver instead of thru specfs. 10119 * This will not be needed when DDI provides a layered driver 10120 * interface that allows specfs to know that an instance is in 10121 * use by a layered driver & should not be detached. 10122 * 10123 * Note: the semantics for layered driver opens are exactly one 10124 * close for every open. 10125 */ 10126 if (otyp == OTYP_LYR) { 10127 un->un_layer_count++; 10128 } 10129 10130 /* 10131 * Keep a count of the current # of opens in progress. This is because 10132 * some layered drivers try to call us as a regular open. This can 10133 * cause problems that we cannot prevent, however by keeping this count 10134 * we can at least keep our open and detach routines from racing against 10135 * each other under such conditions. 10136 */ 10137 un->un_opens_in_progress++; 10138 mutex_exit(&sd_detach_mutex); 10139 10140 nodelay = (flag & (FNDELAY | FNONBLOCK)); 10141 part = SDPART(dev); 10142 partmask = 1 << part; 10143 10144 /* 10145 * We use a semaphore here in order to serialize 10146 * open and close requests on the device. 10147 */ 10148 sema_p(&un->un_semoclose); 10149 10150 mutex_enter(SD_MUTEX(un)); 10151 10152 /* 10153 * All device accesses go thru sdstrategy() where we check 10154 * on suspend status but there could be a scsi_poll command, 10155 * which bypasses sdstrategy(), so we need to check pm 10156 * status. 10157 */ 10158 10159 if (!nodelay) { 10160 while ((un->un_state == SD_STATE_SUSPENDED) || 10161 (un->un_state == SD_STATE_PM_CHANGING)) { 10162 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 10163 } 10164 10165 mutex_exit(SD_MUTEX(un)); 10166 if (sd_pm_entry(un) != DDI_SUCCESS) { 10167 rval = EIO; 10168 SD_ERROR(SD_LOG_OPEN_CLOSE, un, 10169 "sdopen: sd_pm_entry failed\n"); 10170 goto open_failed_with_pm; 10171 } 10172 mutex_enter(SD_MUTEX(un)); 10173 } 10174 10175 /* check for previous exclusive open */ 10176 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: un=%p\n", (void *)un); 10177 SD_TRACE(SD_LOG_OPEN_CLOSE, un, 10178 "sdopen: exclopen=%x, flag=%x, regopen=%x\n", 10179 un->un_exclopen, flag, un->un_ocmap.regopen[otyp]); 10180 10181 if (un->un_exclopen & (partmask)) { 10182 goto excl_open_fail; 10183 } 10184 10185 if (flag & FEXCL) { 10186 int i; 10187 if (un->un_ocmap.lyropen[part]) { 10188 goto excl_open_fail; 10189 } 10190 for (i = 0; i < (OTYPCNT - 1); i++) { 10191 if (un->un_ocmap.regopen[i] & (partmask)) { 10192 goto excl_open_fail; 10193 } 10194 } 10195 } 10196 10197 /* 10198 * Check the write permission if this is a removable media device, 10199 * NDELAY has not been set, and writable permission is requested. 10200 * 10201 * Note: If NDELAY was set and this is write-protected media the WRITE 10202 * attempt will fail with EIO as part of the I/O processing. This is a 10203 * more permissive implementation that allows the open to succeed and 10204 * WRITE attempts to fail when appropriate. 10205 */ 10206 if (un->un_f_chk_wp_open) { 10207 if ((flag & FWRITE) && (!nodelay)) { 10208 mutex_exit(SD_MUTEX(un)); 10209 /* 10210 * Defer the check for write permission on writable 10211 * DVD drive till sdstrategy and will not fail open even 10212 * if FWRITE is set as the device can be writable 10213 * depending upon the media and the media can change 10214 * after the call to open(). 10215 */ 10216 if (un->un_f_dvdram_writable_device == FALSE) { 10217 if (ISCD(un) || sr_check_wp(dev)) { 10218 rval = EROFS; 10219 mutex_enter(SD_MUTEX(un)); 10220 SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: " 10221 "write to cd or write protected media\n"); 10222 goto open_fail; 10223 } 10224 } 10225 mutex_enter(SD_MUTEX(un)); 10226 } 10227 } 10228 10229 /* 10230 * If opening in NDELAY/NONBLOCK mode, just return. 10231 * Check if disk is ready and has a valid geometry later. 10232 */ 10233 if (!nodelay) { 10234 sd_ssc_t *ssc; 10235 10236 mutex_exit(SD_MUTEX(un)); 10237 ssc = sd_ssc_init(un); 10238 rval = sd_ready_and_valid(ssc, part); 10239 sd_ssc_fini(ssc); 10240 mutex_enter(SD_MUTEX(un)); 10241 /* 10242 * Fail if device is not ready or if the number of disk 10243 * blocks is zero or negative for non CD devices. 10244 */ 10245 10246 nblks = 0; 10247 10248 if (rval == SD_READY_VALID && (!ISCD(un))) { 10249 /* if cmlb_partinfo fails, nblks remains 0 */ 10250 mutex_exit(SD_MUTEX(un)); 10251 (void) cmlb_partinfo(un->un_cmlbhandle, part, &nblks, 10252 NULL, NULL, NULL, (void *)SD_PATH_DIRECT); 10253 mutex_enter(SD_MUTEX(un)); 10254 } 10255 10256 if ((rval != SD_READY_VALID) || 10257 (!ISCD(un) && nblks <= 0)) { 10258 rval = un->un_f_has_removable_media ? ENXIO : EIO; 10259 SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: " 10260 "device not ready or invalid disk block value\n"); 10261 goto open_fail; 10262 } 10263 #if defined(__i386) || defined(__amd64) 10264 } else { 10265 uchar_t *cp; 10266 /* 10267 * x86 requires special nodelay handling, so that p0 is 10268 * always defined and accessible. 10269 * Invalidate geometry only if device is not already open. 10270 */ 10271 cp = &un->un_ocmap.chkd[0]; 10272 while (cp < &un->un_ocmap.chkd[OCSIZE]) { 10273 if (*cp != (uchar_t)0) { 10274 break; 10275 } 10276 cp++; 10277 } 10278 if (cp == &un->un_ocmap.chkd[OCSIZE]) { 10279 mutex_exit(SD_MUTEX(un)); 10280 cmlb_invalidate(un->un_cmlbhandle, 10281 (void *)SD_PATH_DIRECT); 10282 mutex_enter(SD_MUTEX(un)); 10283 } 10284 10285 #endif 10286 } 10287 10288 if (otyp == OTYP_LYR) { 10289 un->un_ocmap.lyropen[part]++; 10290 } else { 10291 un->un_ocmap.regopen[otyp] |= partmask; 10292 } 10293 10294 /* Set up open and exclusive open flags */ 10295 if (flag & FEXCL) { 10296 un->un_exclopen |= (partmask); 10297 } 10298 10299 /* 10300 * If the lun is EFI labeled and lun capacity is greater than the 10301 * capacity contained in the label, log a sys-event to notify the 10302 * interested module. 10303 * To avoid an infinite loop of logging sys-event, we only log the 10304 * event when the lun is not opened in NDELAY mode. The event handler 10305 * should open the lun in NDELAY mode. 10306 */ 10307 if (!nodelay) { 10308 mutex_exit(SD_MUTEX(un)); 10309 if (cmlb_efi_label_capacity(un->un_cmlbhandle, &label_cap, 10310 (void*)SD_PATH_DIRECT) == 0) { 10311 mutex_enter(SD_MUTEX(un)); 10312 if (un->un_f_blockcount_is_valid && 10313 un->un_blockcount > label_cap && 10314 un->un_f_expnevent == B_FALSE) { 10315 un->un_f_expnevent = B_TRUE; 10316 mutex_exit(SD_MUTEX(un)); 10317 sd_log_lun_expansion_event(un, 10318 (nodelay ? KM_NOSLEEP : KM_SLEEP)); 10319 mutex_enter(SD_MUTEX(un)); 10320 } 10321 } else { 10322 mutex_enter(SD_MUTEX(un)); 10323 } 10324 } 10325 10326 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: " 10327 "open of part %d type %d\n", part, otyp); 10328 10329 mutex_exit(SD_MUTEX(un)); 10330 if (!nodelay) { 10331 sd_pm_exit(un); 10332 } 10333 10334 sema_v(&un->un_semoclose); 10335 10336 mutex_enter(&sd_detach_mutex); 10337 un->un_opens_in_progress--; 10338 mutex_exit(&sd_detach_mutex); 10339 10340 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: exit success\n"); 10341 return (DDI_SUCCESS); 10342 10343 excl_open_fail: 10344 SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: fail exclusive open\n"); 10345 rval = EBUSY; 10346 10347 open_fail: 10348 mutex_exit(SD_MUTEX(un)); 10349 10350 /* 10351 * On a failed open we must exit the pm management. 10352 */ 10353 if (!nodelay) { 10354 sd_pm_exit(un); 10355 } 10356 open_failed_with_pm: 10357 sema_v(&un->un_semoclose); 10358 10359 mutex_enter(&sd_detach_mutex); 10360 un->un_opens_in_progress--; 10361 if (otyp == OTYP_LYR) { 10362 un->un_layer_count--; 10363 } 10364 mutex_exit(&sd_detach_mutex); 10365 10366 return (rval); 10367 } 10368 10369 10370 /* 10371 * Function: sdclose 10372 * 10373 * Description: Driver's close(9e) entry point function. 10374 * 10375 * Arguments: dev - device number 10376 * flag - file status flag, informational only 10377 * otyp - close type (OTYP_BLK, OTYP_CHR, OTYP_LYR) 10378 * cred_p - user credential pointer 10379 * 10380 * Return Code: ENXIO 10381 * 10382 * Context: Kernel thread context 10383 */ 10384 /* ARGSUSED */ 10385 static int 10386 sdclose(dev_t dev, int flag, int otyp, cred_t *cred_p) 10387 { 10388 struct sd_lun *un; 10389 uchar_t *cp; 10390 int part; 10391 int nodelay; 10392 int rval = 0; 10393 10394 /* Validate the open type */ 10395 if (otyp >= OTYPCNT) { 10396 return (ENXIO); 10397 } 10398 10399 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 10400 return (ENXIO); 10401 } 10402 10403 part = SDPART(dev); 10404 nodelay = flag & (FNDELAY | FNONBLOCK); 10405 10406 SD_TRACE(SD_LOG_OPEN_CLOSE, un, 10407 "sdclose: close of part %d type %d\n", part, otyp); 10408 10409 /* 10410 * We use a semaphore here in order to serialize 10411 * open and close requests on the device. 10412 */ 10413 sema_p(&un->un_semoclose); 10414 10415 mutex_enter(SD_MUTEX(un)); 10416 10417 /* Don't proceed if power is being changed. */ 10418 while (un->un_state == SD_STATE_PM_CHANGING) { 10419 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 10420 } 10421 10422 if (un->un_exclopen & (1 << part)) { 10423 un->un_exclopen &= ~(1 << part); 10424 } 10425 10426 /* Update the open partition map */ 10427 if (otyp == OTYP_LYR) { 10428 un->un_ocmap.lyropen[part] -= 1; 10429 } else { 10430 un->un_ocmap.regopen[otyp] &= ~(1 << part); 10431 } 10432 10433 cp = &un->un_ocmap.chkd[0]; 10434 while (cp < &un->un_ocmap.chkd[OCSIZE]) { 10435 if (*cp != NULL) { 10436 break; 10437 } 10438 cp++; 10439 } 10440 10441 if (cp == &un->un_ocmap.chkd[OCSIZE]) { 10442 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdclose: last close\n"); 10443 10444 /* 10445 * We avoid persistance upon the last close, and set 10446 * the throttle back to the maximum. 10447 */ 10448 un->un_throttle = un->un_saved_throttle; 10449 10450 if (un->un_state == SD_STATE_OFFLINE) { 10451 if (un->un_f_is_fibre == FALSE) { 10452 scsi_log(SD_DEVINFO(un), sd_label, 10453 CE_WARN, "offline\n"); 10454 } 10455 mutex_exit(SD_MUTEX(un)); 10456 cmlb_invalidate(un->un_cmlbhandle, 10457 (void *)SD_PATH_DIRECT); 10458 mutex_enter(SD_MUTEX(un)); 10459 10460 } else { 10461 /* 10462 * Flush any outstanding writes in NVRAM cache. 10463 * Note: SYNCHRONIZE CACHE is an optional SCSI-2 10464 * cmd, it may not work for non-Pluto devices. 10465 * SYNCHRONIZE CACHE is not required for removables, 10466 * except DVD-RAM drives. 10467 * 10468 * Also note: because SYNCHRONIZE CACHE is currently 10469 * the only command issued here that requires the 10470 * drive be powered up, only do the power up before 10471 * sending the Sync Cache command. If additional 10472 * commands are added which require a powered up 10473 * drive, the following sequence may have to change. 10474 * 10475 * And finally, note that parallel SCSI on SPARC 10476 * only issues a Sync Cache to DVD-RAM, a newly 10477 * supported device. 10478 */ 10479 #if defined(__i386) || defined(__amd64) 10480 if ((un->un_f_sync_cache_supported && 10481 un->un_f_sync_cache_required) || 10482 un->un_f_dvdram_writable_device == TRUE) { 10483 #else 10484 if (un->un_f_dvdram_writable_device == TRUE) { 10485 #endif 10486 mutex_exit(SD_MUTEX(un)); 10487 if (sd_pm_entry(un) == DDI_SUCCESS) { 10488 rval = 10489 sd_send_scsi_SYNCHRONIZE_CACHE(un, 10490 NULL); 10491 /* ignore error if not supported */ 10492 if (rval == ENOTSUP) { 10493 rval = 0; 10494 } else if (rval != 0) { 10495 rval = EIO; 10496 } 10497 sd_pm_exit(un); 10498 } else { 10499 rval = EIO; 10500 } 10501 mutex_enter(SD_MUTEX(un)); 10502 } 10503 10504 /* 10505 * For devices which supports DOOR_LOCK, send an ALLOW 10506 * MEDIA REMOVAL command, but don't get upset if it 10507 * fails. We need to raise the power of the drive before 10508 * we can call sd_send_scsi_DOORLOCK() 10509 */ 10510 if (un->un_f_doorlock_supported) { 10511 mutex_exit(SD_MUTEX(un)); 10512 if (sd_pm_entry(un) == DDI_SUCCESS) { 10513 sd_ssc_t *ssc; 10514 10515 ssc = sd_ssc_init(un); 10516 rval = sd_send_scsi_DOORLOCK(ssc, 10517 SD_REMOVAL_ALLOW, SD_PATH_DIRECT); 10518 if (rval != 0) 10519 sd_ssc_assessment(ssc, 10520 SD_FMT_IGNORE); 10521 sd_ssc_fini(ssc); 10522 10523 sd_pm_exit(un); 10524 if (ISCD(un) && (rval != 0) && 10525 (nodelay != 0)) { 10526 rval = ENXIO; 10527 } 10528 } else { 10529 rval = EIO; 10530 } 10531 mutex_enter(SD_MUTEX(un)); 10532 } 10533 10534 /* 10535 * If a device has removable media, invalidate all 10536 * parameters related to media, such as geometry, 10537 * blocksize, and blockcount. 10538 */ 10539 if (un->un_f_has_removable_media) { 10540 sr_ejected(un); 10541 } 10542 10543 /* 10544 * Destroy the cache (if it exists) which was 10545 * allocated for the write maps since this is 10546 * the last close for this media. 10547 */ 10548 if (un->un_wm_cache) { 10549 /* 10550 * Check if there are pending commands. 10551 * and if there are give a warning and 10552 * do not destroy the cache. 10553 */ 10554 if (un->un_ncmds_in_driver > 0) { 10555 scsi_log(SD_DEVINFO(un), 10556 sd_label, CE_WARN, 10557 "Unable to clean up memory " 10558 "because of pending I/O\n"); 10559 } else { 10560 kmem_cache_destroy( 10561 un->un_wm_cache); 10562 un->un_wm_cache = NULL; 10563 } 10564 } 10565 } 10566 } 10567 10568 mutex_exit(SD_MUTEX(un)); 10569 sema_v(&un->un_semoclose); 10570 10571 if (otyp == OTYP_LYR) { 10572 mutex_enter(&sd_detach_mutex); 10573 /* 10574 * The detach routine may run when the layer count 10575 * drops to zero. 10576 */ 10577 un->un_layer_count--; 10578 mutex_exit(&sd_detach_mutex); 10579 } 10580 10581 return (rval); 10582 } 10583 10584 10585 /* 10586 * Function: sd_ready_and_valid 10587 * 10588 * Description: Test if device is ready and has a valid geometry. 10589 * 10590 * Arguments: ssc - sd_ssc_t will contain un 10591 * un - driver soft state (unit) structure 10592 * 10593 * Return Code: SD_READY_VALID ready and valid label 10594 * SD_NOT_READY_VALID not ready, no label 10595 * SD_RESERVED_BY_OTHERS reservation conflict 10596 * 10597 * Context: Never called at interrupt context. 10598 */ 10599 10600 static int 10601 sd_ready_and_valid(sd_ssc_t *ssc, int part) 10602 { 10603 struct sd_errstats *stp; 10604 uint64_t capacity; 10605 uint_t lbasize; 10606 int rval = SD_READY_VALID; 10607 char name_str[48]; 10608 boolean_t is_valid; 10609 struct sd_lun *un; 10610 int status; 10611 10612 ASSERT(ssc != NULL); 10613 un = ssc->ssc_un; 10614 ASSERT(un != NULL); 10615 ASSERT(!mutex_owned(SD_MUTEX(un))); 10616 10617 mutex_enter(SD_MUTEX(un)); 10618 /* 10619 * If a device has removable media, we must check if media is 10620 * ready when checking if this device is ready and valid. 10621 */ 10622 if (un->un_f_has_removable_media) { 10623 mutex_exit(SD_MUTEX(un)); 10624 status = sd_send_scsi_TEST_UNIT_READY(ssc, 0); 10625 10626 if (status != 0) { 10627 rval = SD_NOT_READY_VALID; 10628 mutex_enter(SD_MUTEX(un)); 10629 10630 /* Ignore all failed status for removalbe media */ 10631 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 10632 10633 goto done; 10634 } 10635 10636 is_valid = SD_IS_VALID_LABEL(un); 10637 mutex_enter(SD_MUTEX(un)); 10638 if (!is_valid || 10639 (un->un_f_blockcount_is_valid == FALSE) || 10640 (un->un_f_tgt_blocksize_is_valid == FALSE)) { 10641 10642 /* capacity has to be read every open. */ 10643 mutex_exit(SD_MUTEX(un)); 10644 status = sd_send_scsi_READ_CAPACITY(ssc, &capacity, 10645 &lbasize, SD_PATH_DIRECT); 10646 10647 if (status != 0) { 10648 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 10649 10650 cmlb_invalidate(un->un_cmlbhandle, 10651 (void *)SD_PATH_DIRECT); 10652 mutex_enter(SD_MUTEX(un)); 10653 rval = SD_NOT_READY_VALID; 10654 10655 goto done; 10656 } else { 10657 mutex_enter(SD_MUTEX(un)); 10658 sd_update_block_info(un, lbasize, capacity); 10659 } 10660 } 10661 10662 /* 10663 * Check if the media in the device is writable or not. 10664 */ 10665 if (!is_valid && ISCD(un)) { 10666 sd_check_for_writable_cd(ssc, SD_PATH_DIRECT); 10667 } 10668 10669 } else { 10670 /* 10671 * Do a test unit ready to clear any unit attention from non-cd 10672 * devices. 10673 */ 10674 mutex_exit(SD_MUTEX(un)); 10675 10676 status = sd_send_scsi_TEST_UNIT_READY(ssc, 0); 10677 if (status != 0) { 10678 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 10679 } 10680 10681 mutex_enter(SD_MUTEX(un)); 10682 } 10683 10684 10685 /* 10686 * If this is a non 512 block device, allocate space for 10687 * the wmap cache. This is being done here since every time 10688 * a media is changed this routine will be called and the 10689 * block size is a function of media rather than device. 10690 */ 10691 if (((un->un_f_rmw_type != SD_RMW_TYPE_RETURN_ERROR || 10692 un->un_f_non_devbsize_supported) && 10693 un->un_tgt_blocksize != DEV_BSIZE) || 10694 un->un_f_enable_rmw) { 10695 if (!(un->un_wm_cache)) { 10696 (void) snprintf(name_str, sizeof (name_str), 10697 "%s%d_cache", 10698 ddi_driver_name(SD_DEVINFO(un)), 10699 ddi_get_instance(SD_DEVINFO(un))); 10700 un->un_wm_cache = kmem_cache_create( 10701 name_str, sizeof (struct sd_w_map), 10702 8, sd_wm_cache_constructor, 10703 sd_wm_cache_destructor, NULL, 10704 (void *)un, NULL, 0); 10705 if (!(un->un_wm_cache)) { 10706 rval = ENOMEM; 10707 goto done; 10708 } 10709 } 10710 } 10711 10712 if (un->un_state == SD_STATE_NORMAL) { 10713 /* 10714 * If the target is not yet ready here (defined by a TUR 10715 * failure), invalidate the geometry and print an 'offline' 10716 * message. This is a legacy message, as the state of the 10717 * target is not actually changed to SD_STATE_OFFLINE. 10718 * 10719 * If the TUR fails for EACCES (Reservation Conflict), 10720 * SD_RESERVED_BY_OTHERS will be returned to indicate 10721 * reservation conflict. If the TUR fails for other 10722 * reasons, SD_NOT_READY_VALID will be returned. 10723 */ 10724 int err; 10725 10726 mutex_exit(SD_MUTEX(un)); 10727 err = sd_send_scsi_TEST_UNIT_READY(ssc, 0); 10728 mutex_enter(SD_MUTEX(un)); 10729 10730 if (err != 0) { 10731 mutex_exit(SD_MUTEX(un)); 10732 cmlb_invalidate(un->un_cmlbhandle, 10733 (void *)SD_PATH_DIRECT); 10734 mutex_enter(SD_MUTEX(un)); 10735 if (err == EACCES) { 10736 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 10737 "reservation conflict\n"); 10738 rval = SD_RESERVED_BY_OTHERS; 10739 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 10740 } else { 10741 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 10742 "drive offline\n"); 10743 rval = SD_NOT_READY_VALID; 10744 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 10745 } 10746 goto done; 10747 } 10748 } 10749 10750 if (un->un_f_format_in_progress == FALSE) { 10751 mutex_exit(SD_MUTEX(un)); 10752 10753 (void) cmlb_validate(un->un_cmlbhandle, 0, 10754 (void *)SD_PATH_DIRECT); 10755 if (cmlb_partinfo(un->un_cmlbhandle, part, NULL, NULL, NULL, 10756 NULL, (void *) SD_PATH_DIRECT) != 0) { 10757 rval = SD_NOT_READY_VALID; 10758 mutex_enter(SD_MUTEX(un)); 10759 10760 goto done; 10761 } 10762 if (un->un_f_pkstats_enabled) { 10763 sd_set_pstats(un); 10764 SD_TRACE(SD_LOG_IO_PARTITION, un, 10765 "sd_ready_and_valid: un:0x%p pstats created and " 10766 "set\n", un); 10767 } 10768 mutex_enter(SD_MUTEX(un)); 10769 } 10770 10771 /* 10772 * If this device supports DOOR_LOCK command, try and send 10773 * this command to PREVENT MEDIA REMOVAL, but don't get upset 10774 * if it fails. For a CD, however, it is an error 10775 */ 10776 if (un->un_f_doorlock_supported) { 10777 mutex_exit(SD_MUTEX(un)); 10778 status = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT, 10779 SD_PATH_DIRECT); 10780 10781 if ((status != 0) && ISCD(un)) { 10782 rval = SD_NOT_READY_VALID; 10783 mutex_enter(SD_MUTEX(un)); 10784 10785 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 10786 10787 goto done; 10788 } else if (status != 0) 10789 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 10790 mutex_enter(SD_MUTEX(un)); 10791 } 10792 10793 /* The state has changed, inform the media watch routines */ 10794 un->un_mediastate = DKIO_INSERTED; 10795 cv_broadcast(&un->un_state_cv); 10796 rval = SD_READY_VALID; 10797 10798 done: 10799 10800 /* 10801 * Initialize the capacity kstat value, if no media previously 10802 * (capacity kstat is 0) and a media has been inserted 10803 * (un_blockcount > 0). 10804 */ 10805 if (un->un_errstats != NULL) { 10806 stp = (struct sd_errstats *)un->un_errstats->ks_data; 10807 if ((stp->sd_capacity.value.ui64 == 0) && 10808 (un->un_f_blockcount_is_valid == TRUE)) { 10809 stp->sd_capacity.value.ui64 = 10810 (uint64_t)((uint64_t)un->un_blockcount * 10811 un->un_sys_blocksize); 10812 } 10813 } 10814 10815 mutex_exit(SD_MUTEX(un)); 10816 return (rval); 10817 } 10818 10819 10820 /* 10821 * Function: sdmin 10822 * 10823 * Description: Routine to limit the size of a data transfer. Used in 10824 * conjunction with physio(9F). 10825 * 10826 * Arguments: bp - pointer to the indicated buf(9S) struct. 10827 * 10828 * Context: Kernel thread context. 10829 */ 10830 10831 static void 10832 sdmin(struct buf *bp) 10833 { 10834 struct sd_lun *un; 10835 int instance; 10836 10837 instance = SDUNIT(bp->b_edev); 10838 10839 un = ddi_get_soft_state(sd_state, instance); 10840 ASSERT(un != NULL); 10841 10842 /* 10843 * We depend on buf breakup to restrict 10844 * IO size if it is enabled. 10845 */ 10846 if (un->un_buf_breakup_supported) { 10847 return; 10848 } 10849 10850 if (bp->b_bcount > un->un_max_xfer_size) { 10851 bp->b_bcount = un->un_max_xfer_size; 10852 } 10853 } 10854 10855 10856 /* 10857 * Function: sdread 10858 * 10859 * Description: Driver's read(9e) entry point function. 10860 * 10861 * Arguments: dev - device number 10862 * uio - structure pointer describing where data is to be stored 10863 * in user's space 10864 * cred_p - user credential pointer 10865 * 10866 * Return Code: ENXIO 10867 * EIO 10868 * EINVAL 10869 * value returned by physio 10870 * 10871 * Context: Kernel thread context. 10872 */ 10873 /* ARGSUSED */ 10874 static int 10875 sdread(dev_t dev, struct uio *uio, cred_t *cred_p) 10876 { 10877 struct sd_lun *un = NULL; 10878 int secmask; 10879 int err = 0; 10880 sd_ssc_t *ssc; 10881 10882 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 10883 return (ENXIO); 10884 } 10885 10886 ASSERT(!mutex_owned(SD_MUTEX(un))); 10887 10888 10889 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { 10890 mutex_enter(SD_MUTEX(un)); 10891 /* 10892 * Because the call to sd_ready_and_valid will issue I/O we 10893 * must wait here if either the device is suspended or 10894 * if it's power level is changing. 10895 */ 10896 while ((un->un_state == SD_STATE_SUSPENDED) || 10897 (un->un_state == SD_STATE_PM_CHANGING)) { 10898 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 10899 } 10900 un->un_ncmds_in_driver++; 10901 mutex_exit(SD_MUTEX(un)); 10902 10903 /* Initialize sd_ssc_t for internal uscsi commands */ 10904 ssc = sd_ssc_init(un); 10905 if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) { 10906 err = EIO; 10907 } else { 10908 err = 0; 10909 } 10910 sd_ssc_fini(ssc); 10911 10912 mutex_enter(SD_MUTEX(un)); 10913 un->un_ncmds_in_driver--; 10914 ASSERT(un->un_ncmds_in_driver >= 0); 10915 mutex_exit(SD_MUTEX(un)); 10916 if (err != 0) 10917 return (err); 10918 } 10919 10920 /* 10921 * Read requests are restricted to multiples of the system block size. 10922 */ 10923 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && 10924 !un->un_f_enable_rmw) 10925 secmask = un->un_tgt_blocksize - 1; 10926 else 10927 secmask = DEV_BSIZE - 1; 10928 10929 if (uio->uio_loffset & ((offset_t)(secmask))) { 10930 SD_ERROR(SD_LOG_READ_WRITE, un, 10931 "sdread: file offset not modulo %d\n", 10932 secmask + 1); 10933 err = EINVAL; 10934 } else if (uio->uio_iov->iov_len & (secmask)) { 10935 SD_ERROR(SD_LOG_READ_WRITE, un, 10936 "sdread: transfer length not modulo %d\n", 10937 secmask + 1); 10938 err = EINVAL; 10939 } else { 10940 err = physio(sdstrategy, NULL, dev, B_READ, sdmin, uio); 10941 } 10942 10943 return (err); 10944 } 10945 10946 10947 /* 10948 * Function: sdwrite 10949 * 10950 * Description: Driver's write(9e) entry point function. 10951 * 10952 * Arguments: dev - device number 10953 * uio - structure pointer describing where data is stored in 10954 * user's space 10955 * cred_p - user credential pointer 10956 * 10957 * Return Code: ENXIO 10958 * EIO 10959 * EINVAL 10960 * value returned by physio 10961 * 10962 * Context: Kernel thread context. 10963 */ 10964 /* ARGSUSED */ 10965 static int 10966 sdwrite(dev_t dev, struct uio *uio, cred_t *cred_p) 10967 { 10968 struct sd_lun *un = NULL; 10969 int secmask; 10970 int err = 0; 10971 sd_ssc_t *ssc; 10972 10973 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 10974 return (ENXIO); 10975 } 10976 10977 ASSERT(!mutex_owned(SD_MUTEX(un))); 10978 10979 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { 10980 mutex_enter(SD_MUTEX(un)); 10981 /* 10982 * Because the call to sd_ready_and_valid will issue I/O we 10983 * must wait here if either the device is suspended or 10984 * if it's power level is changing. 10985 */ 10986 while ((un->un_state == SD_STATE_SUSPENDED) || 10987 (un->un_state == SD_STATE_PM_CHANGING)) { 10988 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 10989 } 10990 un->un_ncmds_in_driver++; 10991 mutex_exit(SD_MUTEX(un)); 10992 10993 /* Initialize sd_ssc_t for internal uscsi commands */ 10994 ssc = sd_ssc_init(un); 10995 if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) { 10996 err = EIO; 10997 } else { 10998 err = 0; 10999 } 11000 sd_ssc_fini(ssc); 11001 11002 mutex_enter(SD_MUTEX(un)); 11003 un->un_ncmds_in_driver--; 11004 ASSERT(un->un_ncmds_in_driver >= 0); 11005 mutex_exit(SD_MUTEX(un)); 11006 if (err != 0) 11007 return (err); 11008 } 11009 11010 /* 11011 * Write requests are restricted to multiples of the system block size. 11012 */ 11013 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && 11014 !un->un_f_enable_rmw) 11015 secmask = un->un_tgt_blocksize - 1; 11016 else 11017 secmask = DEV_BSIZE - 1; 11018 11019 if (uio->uio_loffset & ((offset_t)(secmask))) { 11020 SD_ERROR(SD_LOG_READ_WRITE, un, 11021 "sdwrite: file offset not modulo %d\n", 11022 secmask + 1); 11023 err = EINVAL; 11024 } else if (uio->uio_iov->iov_len & (secmask)) { 11025 SD_ERROR(SD_LOG_READ_WRITE, un, 11026 "sdwrite: transfer length not modulo %d\n", 11027 secmask + 1); 11028 err = EINVAL; 11029 } else { 11030 err = physio(sdstrategy, NULL, dev, B_WRITE, sdmin, uio); 11031 } 11032 11033 return (err); 11034 } 11035 11036 11037 /* 11038 * Function: sdaread 11039 * 11040 * Description: Driver's aread(9e) entry point function. 11041 * 11042 * Arguments: dev - device number 11043 * aio - structure pointer describing where data is to be stored 11044 * cred_p - user credential pointer 11045 * 11046 * Return Code: ENXIO 11047 * EIO 11048 * EINVAL 11049 * value returned by aphysio 11050 * 11051 * Context: Kernel thread context. 11052 */ 11053 /* ARGSUSED */ 11054 static int 11055 sdaread(dev_t dev, struct aio_req *aio, cred_t *cred_p) 11056 { 11057 struct sd_lun *un = NULL; 11058 struct uio *uio = aio->aio_uio; 11059 int secmask; 11060 int err = 0; 11061 sd_ssc_t *ssc; 11062 11063 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 11064 return (ENXIO); 11065 } 11066 11067 ASSERT(!mutex_owned(SD_MUTEX(un))); 11068 11069 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { 11070 mutex_enter(SD_MUTEX(un)); 11071 /* 11072 * Because the call to sd_ready_and_valid will issue I/O we 11073 * must wait here if either the device is suspended or 11074 * if it's power level is changing. 11075 */ 11076 while ((un->un_state == SD_STATE_SUSPENDED) || 11077 (un->un_state == SD_STATE_PM_CHANGING)) { 11078 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 11079 } 11080 un->un_ncmds_in_driver++; 11081 mutex_exit(SD_MUTEX(un)); 11082 11083 /* Initialize sd_ssc_t for internal uscsi commands */ 11084 ssc = sd_ssc_init(un); 11085 if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) { 11086 err = EIO; 11087 } else { 11088 err = 0; 11089 } 11090 sd_ssc_fini(ssc); 11091 11092 mutex_enter(SD_MUTEX(un)); 11093 un->un_ncmds_in_driver--; 11094 ASSERT(un->un_ncmds_in_driver >= 0); 11095 mutex_exit(SD_MUTEX(un)); 11096 if (err != 0) 11097 return (err); 11098 } 11099 11100 /* 11101 * Read requests are restricted to multiples of the system block size. 11102 */ 11103 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && 11104 !un->un_f_enable_rmw) 11105 secmask = un->un_tgt_blocksize - 1; 11106 else 11107 secmask = DEV_BSIZE - 1; 11108 11109 if (uio->uio_loffset & ((offset_t)(secmask))) { 11110 SD_ERROR(SD_LOG_READ_WRITE, un, 11111 "sdaread: file offset not modulo %d\n", 11112 secmask + 1); 11113 err = EINVAL; 11114 } else if (uio->uio_iov->iov_len & (secmask)) { 11115 SD_ERROR(SD_LOG_READ_WRITE, un, 11116 "sdaread: transfer length not modulo %d\n", 11117 secmask + 1); 11118 err = EINVAL; 11119 } else { 11120 err = aphysio(sdstrategy, anocancel, dev, B_READ, sdmin, aio); 11121 } 11122 11123 return (err); 11124 } 11125 11126 11127 /* 11128 * Function: sdawrite 11129 * 11130 * Description: Driver's awrite(9e) entry point function. 11131 * 11132 * Arguments: dev - device number 11133 * aio - structure pointer describing where data is stored 11134 * cred_p - user credential pointer 11135 * 11136 * Return Code: ENXIO 11137 * EIO 11138 * EINVAL 11139 * value returned by aphysio 11140 * 11141 * Context: Kernel thread context. 11142 */ 11143 /* ARGSUSED */ 11144 static int 11145 sdawrite(dev_t dev, struct aio_req *aio, cred_t *cred_p) 11146 { 11147 struct sd_lun *un = NULL; 11148 struct uio *uio = aio->aio_uio; 11149 int secmask; 11150 int err = 0; 11151 sd_ssc_t *ssc; 11152 11153 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 11154 return (ENXIO); 11155 } 11156 11157 ASSERT(!mutex_owned(SD_MUTEX(un))); 11158 11159 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { 11160 mutex_enter(SD_MUTEX(un)); 11161 /* 11162 * Because the call to sd_ready_and_valid will issue I/O we 11163 * must wait here if either the device is suspended or 11164 * if it's power level is changing. 11165 */ 11166 while ((un->un_state == SD_STATE_SUSPENDED) || 11167 (un->un_state == SD_STATE_PM_CHANGING)) { 11168 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 11169 } 11170 un->un_ncmds_in_driver++; 11171 mutex_exit(SD_MUTEX(un)); 11172 11173 /* Initialize sd_ssc_t for internal uscsi commands */ 11174 ssc = sd_ssc_init(un); 11175 if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) { 11176 err = EIO; 11177 } else { 11178 err = 0; 11179 } 11180 sd_ssc_fini(ssc); 11181 11182 mutex_enter(SD_MUTEX(un)); 11183 un->un_ncmds_in_driver--; 11184 ASSERT(un->un_ncmds_in_driver >= 0); 11185 mutex_exit(SD_MUTEX(un)); 11186 if (err != 0) 11187 return (err); 11188 } 11189 11190 /* 11191 * Write requests are restricted to multiples of the system block size. 11192 */ 11193 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && 11194 !un->un_f_enable_rmw) 11195 secmask = un->un_tgt_blocksize - 1; 11196 else 11197 secmask = DEV_BSIZE - 1; 11198 11199 if (uio->uio_loffset & ((offset_t)(secmask))) { 11200 SD_ERROR(SD_LOG_READ_WRITE, un, 11201 "sdawrite: file offset not modulo %d\n", 11202 secmask + 1); 11203 err = EINVAL; 11204 } else if (uio->uio_iov->iov_len & (secmask)) { 11205 SD_ERROR(SD_LOG_READ_WRITE, un, 11206 "sdawrite: transfer length not modulo %d\n", 11207 secmask + 1); 11208 err = EINVAL; 11209 } else { 11210 err = aphysio(sdstrategy, anocancel, dev, B_WRITE, sdmin, aio); 11211 } 11212 11213 return (err); 11214 } 11215 11216 11217 11218 11219 11220 /* 11221 * Driver IO processing follows the following sequence: 11222 * 11223 * sdioctl(9E) sdstrategy(9E) biodone(9F) 11224 * | | ^ 11225 * v v | 11226 * sd_send_scsi_cmd() ddi_xbuf_qstrategy() +-------------------+ 11227 * | | | | 11228 * v | | | 11229 * sd_uscsi_strategy() sd_xbuf_strategy() sd_buf_iodone() sd_uscsi_iodone() 11230 * | | ^ ^ 11231 * v v | | 11232 * SD_BEGIN_IOSTART() SD_BEGIN_IOSTART() | | 11233 * | | | | 11234 * +---+ | +------------+ +-------+ 11235 * | | | | 11236 * | SD_NEXT_IOSTART()| SD_NEXT_IODONE()| | 11237 * | v | | 11238 * | sd_mapblockaddr_iostart() sd_mapblockaddr_iodone() | 11239 * | | ^ | 11240 * | SD_NEXT_IOSTART()| SD_NEXT_IODONE()| | 11241 * | v | | 11242 * | sd_mapblocksize_iostart() sd_mapblocksize_iodone() | 11243 * | | ^ | 11244 * | SD_NEXT_IOSTART()| SD_NEXT_IODONE()| | 11245 * | v | | 11246 * | sd_checksum_iostart() sd_checksum_iodone() | 11247 * | | ^ | 11248 * +-> SD_NEXT_IOSTART()| SD_NEXT_IODONE()+------------->+ 11249 * | v | | 11250 * | sd_pm_iostart() sd_pm_iodone() | 11251 * | | ^ | 11252 * | | | | 11253 * +-> SD_NEXT_IOSTART()| SD_BEGIN_IODONE()--+--------------+ 11254 * | ^ 11255 * v | 11256 * sd_core_iostart() | 11257 * | | 11258 * | +------>(*destroypkt)() 11259 * +-> sd_start_cmds() <-+ | | 11260 * | | | v 11261 * | | | scsi_destroy_pkt(9F) 11262 * | | | 11263 * +->(*initpkt)() +- sdintr() 11264 * | | | | 11265 * | +-> scsi_init_pkt(9F) | +-> sd_handle_xxx() 11266 * | +-> scsi_setup_cdb(9F) | 11267 * | | 11268 * +--> scsi_transport(9F) | 11269 * | | 11270 * +----> SCSA ---->+ 11271 * 11272 * 11273 * This code is based upon the following presumptions: 11274 * 11275 * - iostart and iodone functions operate on buf(9S) structures. These 11276 * functions perform the necessary operations on the buf(9S) and pass 11277 * them along to the next function in the chain by using the macros 11278 * SD_NEXT_IOSTART() (for iostart side functions) and SD_NEXT_IODONE() 11279 * (for iodone side functions). 11280 * 11281 * - The iostart side functions may sleep. The iodone side functions 11282 * are called under interrupt context and may NOT sleep. Therefore 11283 * iodone side functions also may not call iostart side functions. 11284 * (NOTE: iostart side functions should NOT sleep for memory, as 11285 * this could result in deadlock.) 11286 * 11287 * - An iostart side function may call its corresponding iodone side 11288 * function directly (if necessary). 11289 * 11290 * - In the event of an error, an iostart side function can return a buf(9S) 11291 * to its caller by calling SD_BEGIN_IODONE() (after setting B_ERROR and 11292 * b_error in the usual way of course). 11293 * 11294 * - The taskq mechanism may be used by the iodone side functions to dispatch 11295 * requests to the iostart side functions. The iostart side functions in 11296 * this case would be called under the context of a taskq thread, so it's 11297 * OK for them to block/sleep/spin in this case. 11298 * 11299 * - iostart side functions may allocate "shadow" buf(9S) structs and 11300 * pass them along to the next function in the chain. The corresponding 11301 * iodone side functions must coalesce the "shadow" bufs and return 11302 * the "original" buf to the next higher layer. 11303 * 11304 * - The b_private field of the buf(9S) struct holds a pointer to 11305 * an sd_xbuf struct, which contains information needed to 11306 * construct the scsi_pkt for the command. 11307 * 11308 * - The SD_MUTEX(un) is NOT held across calls to the next layer. Each 11309 * layer must acquire & release the SD_MUTEX(un) as needed. 11310 */ 11311 11312 11313 /* 11314 * Create taskq for all targets in the system. This is created at 11315 * _init(9E) and destroyed at _fini(9E). 11316 * 11317 * Note: here we set the minalloc to a reasonably high number to ensure that 11318 * we will have an adequate supply of task entries available at interrupt time. 11319 * This is used in conjunction with the TASKQ_PREPOPULATE flag in 11320 * sd_create_taskq(). Since we do not want to sleep for allocations at 11321 * interrupt time, set maxalloc equal to minalloc. That way we will just fail 11322 * the command if we ever try to dispatch more than SD_TASKQ_MAXALLOC taskq 11323 * requests any one instant in time. 11324 */ 11325 #define SD_TASKQ_NUMTHREADS 8 11326 #define SD_TASKQ_MINALLOC 256 11327 #define SD_TASKQ_MAXALLOC 256 11328 11329 static taskq_t *sd_tq = NULL; 11330 _NOTE(SCHEME_PROTECTS_DATA("stable data", sd_tq)) 11331 11332 static int sd_taskq_minalloc = SD_TASKQ_MINALLOC; 11333 static int sd_taskq_maxalloc = SD_TASKQ_MAXALLOC; 11334 11335 /* 11336 * The following task queue is being created for the write part of 11337 * read-modify-write of non-512 block size devices. 11338 * Limit the number of threads to 1 for now. This number has been chosen 11339 * considering the fact that it applies only to dvd ram drives/MO drives 11340 * currently. Performance for which is not main criteria at this stage. 11341 * Note: It needs to be explored if we can use a single taskq in future 11342 */ 11343 #define SD_WMR_TASKQ_NUMTHREADS 1 11344 static taskq_t *sd_wmr_tq = NULL; 11345 _NOTE(SCHEME_PROTECTS_DATA("stable data", sd_wmr_tq)) 11346 11347 /* 11348 * Function: sd_taskq_create 11349 * 11350 * Description: Create taskq thread(s) and preallocate task entries 11351 * 11352 * Return Code: Returns a pointer to the allocated taskq_t. 11353 * 11354 * Context: Can sleep. Requires blockable context. 11355 * 11356 * Notes: - The taskq() facility currently is NOT part of the DDI. 11357 * (definitely NOT recommeded for 3rd-party drivers!) :-) 11358 * - taskq_create() will block for memory, also it will panic 11359 * if it cannot create the requested number of threads. 11360 * - Currently taskq_create() creates threads that cannot be 11361 * swapped. 11362 * - We use TASKQ_PREPOPULATE to ensure we have an adequate 11363 * supply of taskq entries at interrupt time (ie, so that we 11364 * do not have to sleep for memory) 11365 */ 11366 11367 static void 11368 sd_taskq_create(void) 11369 { 11370 char taskq_name[TASKQ_NAMELEN]; 11371 11372 ASSERT(sd_tq == NULL); 11373 ASSERT(sd_wmr_tq == NULL); 11374 11375 (void) snprintf(taskq_name, sizeof (taskq_name), 11376 "%s_drv_taskq", sd_label); 11377 sd_tq = (taskq_create(taskq_name, SD_TASKQ_NUMTHREADS, 11378 (v.v_maxsyspri - 2), sd_taskq_minalloc, sd_taskq_maxalloc, 11379 TASKQ_PREPOPULATE)); 11380 11381 (void) snprintf(taskq_name, sizeof (taskq_name), 11382 "%s_rmw_taskq", sd_label); 11383 sd_wmr_tq = (taskq_create(taskq_name, SD_WMR_TASKQ_NUMTHREADS, 11384 (v.v_maxsyspri - 2), sd_taskq_minalloc, sd_taskq_maxalloc, 11385 TASKQ_PREPOPULATE)); 11386 } 11387 11388 11389 /* 11390 * Function: sd_taskq_delete 11391 * 11392 * Description: Complementary cleanup routine for sd_taskq_create(). 11393 * 11394 * Context: Kernel thread context. 11395 */ 11396 11397 static void 11398 sd_taskq_delete(void) 11399 { 11400 ASSERT(sd_tq != NULL); 11401 ASSERT(sd_wmr_tq != NULL); 11402 taskq_destroy(sd_tq); 11403 taskq_destroy(sd_wmr_tq); 11404 sd_tq = NULL; 11405 sd_wmr_tq = NULL; 11406 } 11407 11408 11409 /* 11410 * Function: sdstrategy 11411 * 11412 * Description: Driver's strategy (9E) entry point function. 11413 * 11414 * Arguments: bp - pointer to buf(9S) 11415 * 11416 * Return Code: Always returns zero 11417 * 11418 * Context: Kernel thread context. 11419 */ 11420 11421 static int 11422 sdstrategy(struct buf *bp) 11423 { 11424 struct sd_lun *un; 11425 11426 un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp)); 11427 if (un == NULL) { 11428 bioerror(bp, EIO); 11429 bp->b_resid = bp->b_bcount; 11430 biodone(bp); 11431 return (0); 11432 } 11433 11434 /* As was done in the past, fail new cmds. if state is dumping. */ 11435 if (un->un_state == SD_STATE_DUMPING) { 11436 bioerror(bp, ENXIO); 11437 bp->b_resid = bp->b_bcount; 11438 biodone(bp); 11439 return (0); 11440 } 11441 11442 ASSERT(!mutex_owned(SD_MUTEX(un))); 11443 11444 /* 11445 * Commands may sneak in while we released the mutex in 11446 * DDI_SUSPEND, we should block new commands. However, old 11447 * commands that are still in the driver at this point should 11448 * still be allowed to drain. 11449 */ 11450 mutex_enter(SD_MUTEX(un)); 11451 /* 11452 * Must wait here if either the device is suspended or 11453 * if it's power level is changing. 11454 */ 11455 while ((un->un_state == SD_STATE_SUSPENDED) || 11456 (un->un_state == SD_STATE_PM_CHANGING)) { 11457 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 11458 } 11459 11460 un->un_ncmds_in_driver++; 11461 11462 /* 11463 * atapi: Since we are running the CD for now in PIO mode we need to 11464 * call bp_mapin here to avoid bp_mapin called interrupt context under 11465 * the HBA's init_pkt routine. 11466 */ 11467 if (un->un_f_cfg_is_atapi == TRUE) { 11468 mutex_exit(SD_MUTEX(un)); 11469 bp_mapin(bp); 11470 mutex_enter(SD_MUTEX(un)); 11471 } 11472 SD_INFO(SD_LOG_IO, un, "sdstrategy: un_ncmds_in_driver = %ld\n", 11473 un->un_ncmds_in_driver); 11474 11475 if (bp->b_flags & B_WRITE) 11476 un->un_f_sync_cache_required = TRUE; 11477 11478 mutex_exit(SD_MUTEX(un)); 11479 11480 /* 11481 * This will (eventually) allocate the sd_xbuf area and 11482 * call sd_xbuf_strategy(). We just want to return the 11483 * result of ddi_xbuf_qstrategy so that we have an opt- 11484 * imized tail call which saves us a stack frame. 11485 */ 11486 return (ddi_xbuf_qstrategy(bp, un->un_xbuf_attr)); 11487 } 11488 11489 11490 /* 11491 * Function: sd_xbuf_strategy 11492 * 11493 * Description: Function for initiating IO operations via the 11494 * ddi_xbuf_qstrategy() mechanism. 11495 * 11496 * Context: Kernel thread context. 11497 */ 11498 11499 static void 11500 sd_xbuf_strategy(struct buf *bp, ddi_xbuf_t xp, void *arg) 11501 { 11502 struct sd_lun *un = arg; 11503 11504 ASSERT(bp != NULL); 11505 ASSERT(xp != NULL); 11506 ASSERT(un != NULL); 11507 ASSERT(!mutex_owned(SD_MUTEX(un))); 11508 11509 /* 11510 * Initialize the fields in the xbuf and save a pointer to the 11511 * xbuf in bp->b_private. 11512 */ 11513 sd_xbuf_init(un, bp, xp, SD_CHAIN_BUFIO, NULL); 11514 11515 /* Send the buf down the iostart chain */ 11516 SD_BEGIN_IOSTART(((struct sd_xbuf *)xp)->xb_chain_iostart, un, bp); 11517 } 11518 11519 11520 /* 11521 * Function: sd_xbuf_init 11522 * 11523 * Description: Prepare the given sd_xbuf struct for use. 11524 * 11525 * Arguments: un - ptr to softstate 11526 * bp - ptr to associated buf(9S) 11527 * xp - ptr to associated sd_xbuf 11528 * chain_type - IO chain type to use: 11529 * SD_CHAIN_NULL 11530 * SD_CHAIN_BUFIO 11531 * SD_CHAIN_USCSI 11532 * SD_CHAIN_DIRECT 11533 * SD_CHAIN_DIRECT_PRIORITY 11534 * pktinfop - ptr to private data struct for scsi_pkt(9S) 11535 * initialization; may be NULL if none. 11536 * 11537 * Context: Kernel thread context 11538 */ 11539 11540 static void 11541 sd_xbuf_init(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 11542 uchar_t chain_type, void *pktinfop) 11543 { 11544 int index; 11545 11546 ASSERT(un != NULL); 11547 ASSERT(bp != NULL); 11548 ASSERT(xp != NULL); 11549 11550 SD_INFO(SD_LOG_IO, un, "sd_xbuf_init: buf:0x%p chain type:0x%x\n", 11551 bp, chain_type); 11552 11553 xp->xb_un = un; 11554 xp->xb_pktp = NULL; 11555 xp->xb_pktinfo = pktinfop; 11556 xp->xb_private = bp->b_private; 11557 xp->xb_blkno = (daddr_t)bp->b_blkno; 11558 11559 /* 11560 * Set up the iostart and iodone chain indexes in the xbuf, based 11561 * upon the specified chain type to use. 11562 */ 11563 switch (chain_type) { 11564 case SD_CHAIN_NULL: 11565 /* 11566 * Fall thru to just use the values for the buf type, even 11567 * tho for the NULL chain these values will never be used. 11568 */ 11569 /* FALLTHRU */ 11570 case SD_CHAIN_BUFIO: 11571 index = un->un_buf_chain_type; 11572 if ((!un->un_f_has_removable_media) && 11573 (un->un_tgt_blocksize != 0) && 11574 (un->un_tgt_blocksize != DEV_BSIZE || 11575 un->un_f_enable_rmw)) { 11576 int secmask = 0, blknomask = 0; 11577 if (un->un_f_enable_rmw) { 11578 blknomask = 11579 (un->un_phy_blocksize / DEV_BSIZE) - 1; 11580 secmask = un->un_phy_blocksize - 1; 11581 } else { 11582 blknomask = 11583 (un->un_tgt_blocksize / DEV_BSIZE) - 1; 11584 secmask = un->un_tgt_blocksize - 1; 11585 } 11586 11587 if ((bp->b_lblkno & (blknomask)) || 11588 (bp->b_bcount & (secmask))) { 11589 if ((un->un_f_rmw_type != 11590 SD_RMW_TYPE_RETURN_ERROR) || 11591 un->un_f_enable_rmw) { 11592 if (un->un_f_pm_is_enabled == FALSE) 11593 index = 11594 SD_CHAIN_INFO_MSS_DSK_NO_PM; 11595 else 11596 index = 11597 SD_CHAIN_INFO_MSS_DISK; 11598 } 11599 } 11600 } 11601 break; 11602 case SD_CHAIN_USCSI: 11603 index = un->un_uscsi_chain_type; 11604 break; 11605 case SD_CHAIN_DIRECT: 11606 index = un->un_direct_chain_type; 11607 break; 11608 case SD_CHAIN_DIRECT_PRIORITY: 11609 index = un->un_priority_chain_type; 11610 break; 11611 default: 11612 /* We're really broken if we ever get here... */ 11613 panic("sd_xbuf_init: illegal chain type!"); 11614 /*NOTREACHED*/ 11615 } 11616 11617 xp->xb_chain_iostart = sd_chain_index_map[index].sci_iostart_index; 11618 xp->xb_chain_iodone = sd_chain_index_map[index].sci_iodone_index; 11619 11620 /* 11621 * It might be a bit easier to simply bzero the entire xbuf above, 11622 * but it turns out that since we init a fair number of members anyway, 11623 * we save a fair number cycles by doing explicit assignment of zero. 11624 */ 11625 xp->xb_pkt_flags = 0; 11626 xp->xb_dma_resid = 0; 11627 xp->xb_retry_count = 0; 11628 xp->xb_victim_retry_count = 0; 11629 xp->xb_ua_retry_count = 0; 11630 xp->xb_nr_retry_count = 0; 11631 xp->xb_sense_bp = NULL; 11632 xp->xb_sense_status = 0; 11633 xp->xb_sense_state = 0; 11634 xp->xb_sense_resid = 0; 11635 xp->xb_ena = 0; 11636 11637 bp->b_private = xp; 11638 bp->b_flags &= ~(B_DONE | B_ERROR); 11639 bp->b_resid = 0; 11640 bp->av_forw = NULL; 11641 bp->av_back = NULL; 11642 bioerror(bp, 0); 11643 11644 SD_INFO(SD_LOG_IO, un, "sd_xbuf_init: done.\n"); 11645 } 11646 11647 11648 /* 11649 * Function: sd_uscsi_strategy 11650 * 11651 * Description: Wrapper for calling into the USCSI chain via physio(9F) 11652 * 11653 * Arguments: bp - buf struct ptr 11654 * 11655 * Return Code: Always returns 0 11656 * 11657 * Context: Kernel thread context 11658 */ 11659 11660 static int 11661 sd_uscsi_strategy(struct buf *bp) 11662 { 11663 struct sd_lun *un; 11664 struct sd_uscsi_info *uip; 11665 struct sd_xbuf *xp; 11666 uchar_t chain_type; 11667 uchar_t cmd; 11668 11669 ASSERT(bp != NULL); 11670 11671 un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp)); 11672 if (un == NULL) { 11673 bioerror(bp, EIO); 11674 bp->b_resid = bp->b_bcount; 11675 biodone(bp); 11676 return (0); 11677 } 11678 11679 ASSERT(!mutex_owned(SD_MUTEX(un))); 11680 11681 SD_TRACE(SD_LOG_IO, un, "sd_uscsi_strategy: entry: buf:0x%p\n", bp); 11682 11683 /* 11684 * A pointer to a struct sd_uscsi_info is expected in bp->b_private 11685 */ 11686 ASSERT(bp->b_private != NULL); 11687 uip = (struct sd_uscsi_info *)bp->b_private; 11688 cmd = ((struct uscsi_cmd *)(uip->ui_cmdp))->uscsi_cdb[0]; 11689 11690 mutex_enter(SD_MUTEX(un)); 11691 /* 11692 * atapi: Since we are running the CD for now in PIO mode we need to 11693 * call bp_mapin here to avoid bp_mapin called interrupt context under 11694 * the HBA's init_pkt routine. 11695 */ 11696 if (un->un_f_cfg_is_atapi == TRUE) { 11697 mutex_exit(SD_MUTEX(un)); 11698 bp_mapin(bp); 11699 mutex_enter(SD_MUTEX(un)); 11700 } 11701 un->un_ncmds_in_driver++; 11702 SD_INFO(SD_LOG_IO, un, "sd_uscsi_strategy: un_ncmds_in_driver = %ld\n", 11703 un->un_ncmds_in_driver); 11704 11705 if ((bp->b_flags & B_WRITE) && (bp->b_bcount != 0) && 11706 (cmd != SCMD_MODE_SELECT) && (cmd != SCMD_MODE_SELECT_G1)) 11707 un->un_f_sync_cache_required = TRUE; 11708 11709 mutex_exit(SD_MUTEX(un)); 11710 11711 switch (uip->ui_flags) { 11712 case SD_PATH_DIRECT: 11713 chain_type = SD_CHAIN_DIRECT; 11714 break; 11715 case SD_PATH_DIRECT_PRIORITY: 11716 chain_type = SD_CHAIN_DIRECT_PRIORITY; 11717 break; 11718 default: 11719 chain_type = SD_CHAIN_USCSI; 11720 break; 11721 } 11722 11723 /* 11724 * We may allocate extra buf for external USCSI commands. If the 11725 * application asks for bigger than 20-byte sense data via USCSI, 11726 * SCSA layer will allocate 252 bytes sense buf for that command. 11727 */ 11728 if (((struct uscsi_cmd *)(uip->ui_cmdp))->uscsi_rqlen > 11729 SENSE_LENGTH) { 11730 xp = kmem_zalloc(sizeof (struct sd_xbuf) - SENSE_LENGTH + 11731 MAX_SENSE_LENGTH, KM_SLEEP); 11732 } else { 11733 xp = kmem_zalloc(sizeof (struct sd_xbuf), KM_SLEEP); 11734 } 11735 11736 sd_xbuf_init(un, bp, xp, chain_type, uip->ui_cmdp); 11737 11738 /* Use the index obtained within xbuf_init */ 11739 SD_BEGIN_IOSTART(xp->xb_chain_iostart, un, bp); 11740 11741 SD_TRACE(SD_LOG_IO, un, "sd_uscsi_strategy: exit: buf:0x%p\n", bp); 11742 11743 return (0); 11744 } 11745 11746 /* 11747 * Function: sd_send_scsi_cmd 11748 * 11749 * Description: Runs a USCSI command for user (when called thru sdioctl), 11750 * or for the driver 11751 * 11752 * Arguments: dev - the dev_t for the device 11753 * incmd - ptr to a valid uscsi_cmd struct 11754 * flag - bit flag, indicating open settings, 32/64 bit type 11755 * dataspace - UIO_USERSPACE or UIO_SYSSPACE 11756 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 11757 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 11758 * to use the USCSI "direct" chain and bypass the normal 11759 * command waitq. 11760 * 11761 * Return Code: 0 - successful completion of the given command 11762 * EIO - scsi_uscsi_handle_command() failed 11763 * ENXIO - soft state not found for specified dev 11764 * EINVAL 11765 * EFAULT - copyin/copyout error 11766 * return code of scsi_uscsi_handle_command(): 11767 * EIO 11768 * ENXIO 11769 * EACCES 11770 * 11771 * Context: Waits for command to complete. Can sleep. 11772 */ 11773 11774 static int 11775 sd_send_scsi_cmd(dev_t dev, struct uscsi_cmd *incmd, int flag, 11776 enum uio_seg dataspace, int path_flag) 11777 { 11778 struct sd_lun *un; 11779 sd_ssc_t *ssc; 11780 int rval; 11781 11782 un = ddi_get_soft_state(sd_state, SDUNIT(dev)); 11783 if (un == NULL) { 11784 return (ENXIO); 11785 } 11786 11787 /* 11788 * Using sd_ssc_send to handle uscsi cmd 11789 */ 11790 ssc = sd_ssc_init(un); 11791 rval = sd_ssc_send(ssc, incmd, flag, dataspace, path_flag); 11792 sd_ssc_fini(ssc); 11793 11794 return (rval); 11795 } 11796 11797 /* 11798 * Function: sd_ssc_init 11799 * 11800 * Description: Uscsi end-user call this function to initialize necessary 11801 * fields, such as uscsi_cmd and sd_uscsi_info struct. 11802 * 11803 * The return value of sd_send_scsi_cmd will be treated as a 11804 * fault in various conditions. Even it is not Zero, some 11805 * callers may ignore the return value. That is to say, we can 11806 * not make an accurate assessment in sdintr, since if a 11807 * command is failed in sdintr it does not mean the caller of 11808 * sd_send_scsi_cmd will treat it as a real failure. 11809 * 11810 * To avoid printing too many error logs for a failed uscsi 11811 * packet that the caller may not treat it as a failure, the 11812 * sd will keep silent for handling all uscsi commands. 11813 * 11814 * During detach->attach and attach-open, for some types of 11815 * problems, the driver should be providing information about 11816 * the problem encountered. Device use USCSI_SILENT, which 11817 * suppresses all driver information. The result is that no 11818 * information about the problem is available. Being 11819 * completely silent during this time is inappropriate. The 11820 * driver needs a more selective filter than USCSI_SILENT, so 11821 * that information related to faults is provided. 11822 * 11823 * To make the accurate accessment, the caller of 11824 * sd_send_scsi_USCSI_CMD should take the ownership and 11825 * get necessary information to print error messages. 11826 * 11827 * If we want to print necessary info of uscsi command, we need to 11828 * keep the uscsi_cmd and sd_uscsi_info till we can make the 11829 * assessment. We use sd_ssc_init to alloc necessary 11830 * structs for sending an uscsi command and we are also 11831 * responsible for free the memory by calling 11832 * sd_ssc_fini. 11833 * 11834 * The calling secquences will look like: 11835 * sd_ssc_init-> 11836 * 11837 * ... 11838 * 11839 * sd_send_scsi_USCSI_CMD-> 11840 * sd_ssc_send-> - - - sdintr 11841 * ... 11842 * 11843 * if we think the return value should be treated as a 11844 * failure, we make the accessment here and print out 11845 * necessary by retrieving uscsi_cmd and sd_uscsi_info' 11846 * 11847 * ... 11848 * 11849 * sd_ssc_fini 11850 * 11851 * 11852 * Arguments: un - pointer to driver soft state (unit) structure for this 11853 * target. 11854 * 11855 * Return code: sd_ssc_t - pointer to allocated sd_ssc_t struct, it contains 11856 * uscsi_cmd and sd_uscsi_info. 11857 * NULL - if can not alloc memory for sd_ssc_t struct 11858 * 11859 * Context: Kernel Thread. 11860 */ 11861 static sd_ssc_t * 11862 sd_ssc_init(struct sd_lun *un) 11863 { 11864 sd_ssc_t *ssc; 11865 struct uscsi_cmd *ucmdp; 11866 struct sd_uscsi_info *uip; 11867 11868 ASSERT(un != NULL); 11869 ASSERT(!mutex_owned(SD_MUTEX(un))); 11870 11871 /* 11872 * Allocate sd_ssc_t structure 11873 */ 11874 ssc = kmem_zalloc(sizeof (sd_ssc_t), KM_SLEEP); 11875 11876 /* 11877 * Allocate uscsi_cmd by calling scsi_uscsi_alloc common routine 11878 */ 11879 ucmdp = scsi_uscsi_alloc(); 11880 11881 /* 11882 * Allocate sd_uscsi_info structure 11883 */ 11884 uip = kmem_zalloc(sizeof (struct sd_uscsi_info), KM_SLEEP); 11885 11886 ssc->ssc_uscsi_cmd = ucmdp; 11887 ssc->ssc_uscsi_info = uip; 11888 ssc->ssc_un = un; 11889 11890 return (ssc); 11891 } 11892 11893 /* 11894 * Function: sd_ssc_fini 11895 * 11896 * Description: To free sd_ssc_t and it's hanging off 11897 * 11898 * Arguments: ssc - struct pointer of sd_ssc_t. 11899 */ 11900 static void 11901 sd_ssc_fini(sd_ssc_t *ssc) 11902 { 11903 scsi_uscsi_free(ssc->ssc_uscsi_cmd); 11904 11905 if (ssc->ssc_uscsi_info != NULL) { 11906 kmem_free(ssc->ssc_uscsi_info, sizeof (struct sd_uscsi_info)); 11907 ssc->ssc_uscsi_info = NULL; 11908 } 11909 11910 kmem_free(ssc, sizeof (sd_ssc_t)); 11911 ssc = NULL; 11912 } 11913 11914 /* 11915 * Function: sd_ssc_send 11916 * 11917 * Description: Runs a USCSI command for user when called through sdioctl, 11918 * or for the driver. 11919 * 11920 * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and 11921 * sd_uscsi_info in. 11922 * incmd - ptr to a valid uscsi_cmd struct 11923 * flag - bit flag, indicating open settings, 32/64 bit type 11924 * dataspace - UIO_USERSPACE or UIO_SYSSPACE 11925 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 11926 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 11927 * to use the USCSI "direct" chain and bypass the normal 11928 * command waitq. 11929 * 11930 * Return Code: 0 - successful completion of the given command 11931 * EIO - scsi_uscsi_handle_command() failed 11932 * ENXIO - soft state not found for specified dev 11933 * ECANCELED - command cancelled due to low power 11934 * EINVAL 11935 * EFAULT - copyin/copyout error 11936 * return code of scsi_uscsi_handle_command(): 11937 * EIO 11938 * ENXIO 11939 * EACCES 11940 * 11941 * Context: Kernel Thread; 11942 * Waits for command to complete. Can sleep. 11943 */ 11944 static int 11945 sd_ssc_send(sd_ssc_t *ssc, struct uscsi_cmd *incmd, int flag, 11946 enum uio_seg dataspace, int path_flag) 11947 { 11948 struct sd_uscsi_info *uip; 11949 struct uscsi_cmd *uscmd; 11950 struct sd_lun *un; 11951 dev_t dev; 11952 11953 int format = 0; 11954 int rval; 11955 11956 ASSERT(ssc != NULL); 11957 un = ssc->ssc_un; 11958 ASSERT(un != NULL); 11959 uscmd = ssc->ssc_uscsi_cmd; 11960 ASSERT(uscmd != NULL); 11961 ASSERT(!mutex_owned(SD_MUTEX(un))); 11962 if (ssc->ssc_flags & SSC_FLAGS_NEED_ASSESSMENT) { 11963 /* 11964 * If enter here, it indicates that the previous uscsi 11965 * command has not been processed by sd_ssc_assessment. 11966 * This is violating our rules of FMA telemetry processing. 11967 * We should print out this message and the last undisposed 11968 * uscsi command. 11969 */ 11970 if (uscmd->uscsi_cdb != NULL) { 11971 SD_INFO(SD_LOG_SDTEST, un, 11972 "sd_ssc_send is missing the alternative " 11973 "sd_ssc_assessment when running command 0x%x.\n", 11974 uscmd->uscsi_cdb[0]); 11975 } 11976 /* 11977 * Set the ssc_flags to SSC_FLAGS_UNKNOWN, which should be 11978 * the initial status. 11979 */ 11980 ssc->ssc_flags = SSC_FLAGS_UNKNOWN; 11981 } 11982 11983 /* 11984 * We need to make sure sd_ssc_send will have sd_ssc_assessment 11985 * followed to avoid missing FMA telemetries. 11986 */ 11987 ssc->ssc_flags |= SSC_FLAGS_NEED_ASSESSMENT; 11988 11989 /* 11990 * if USCSI_PMFAILFAST is set and un is in low power, fail the 11991 * command immediately. 11992 */ 11993 mutex_enter(SD_MUTEX(un)); 11994 mutex_enter(&un->un_pm_mutex); 11995 if ((uscmd->uscsi_flags & USCSI_PMFAILFAST) && 11996 SD_DEVICE_IS_IN_LOW_POWER(un)) { 11997 SD_TRACE(SD_LOG_IO, un, "sd_ssc_send:" 11998 "un:0x%p is in low power\n", un); 11999 mutex_exit(&un->un_pm_mutex); 12000 mutex_exit(SD_MUTEX(un)); 12001 return (ECANCELED); 12002 } 12003 mutex_exit(&un->un_pm_mutex); 12004 mutex_exit(SD_MUTEX(un)); 12005 12006 #ifdef SDDEBUG 12007 switch (dataspace) { 12008 case UIO_USERSPACE: 12009 SD_TRACE(SD_LOG_IO, un, 12010 "sd_ssc_send: entry: un:0x%p UIO_USERSPACE\n", un); 12011 break; 12012 case UIO_SYSSPACE: 12013 SD_TRACE(SD_LOG_IO, un, 12014 "sd_ssc_send: entry: un:0x%p UIO_SYSSPACE\n", un); 12015 break; 12016 default: 12017 SD_TRACE(SD_LOG_IO, un, 12018 "sd_ssc_send: entry: un:0x%p UNEXPECTED SPACE\n", un); 12019 break; 12020 } 12021 #endif 12022 12023 rval = scsi_uscsi_copyin((intptr_t)incmd, flag, 12024 SD_ADDRESS(un), &uscmd); 12025 if (rval != 0) { 12026 SD_TRACE(SD_LOG_IO, un, "sd_sense_scsi_cmd: " 12027 "scsi_uscsi_alloc_and_copyin failed\n", un); 12028 return (rval); 12029 } 12030 12031 if ((uscmd->uscsi_cdb != NULL) && 12032 (uscmd->uscsi_cdb[0] == SCMD_FORMAT)) { 12033 mutex_enter(SD_MUTEX(un)); 12034 un->un_f_format_in_progress = TRUE; 12035 mutex_exit(SD_MUTEX(un)); 12036 format = 1; 12037 } 12038 12039 /* 12040 * Allocate an sd_uscsi_info struct and fill it with the info 12041 * needed by sd_initpkt_for_uscsi(). Then put the pointer into 12042 * b_private in the buf for sd_initpkt_for_uscsi(). Note that 12043 * since we allocate the buf here in this function, we do not 12044 * need to preserve the prior contents of b_private. 12045 * The sd_uscsi_info struct is also used by sd_uscsi_strategy() 12046 */ 12047 uip = ssc->ssc_uscsi_info; 12048 uip->ui_flags = path_flag; 12049 uip->ui_cmdp = uscmd; 12050 12051 /* 12052 * Commands sent with priority are intended for error recovery 12053 * situations, and do not have retries performed. 12054 */ 12055 if (path_flag == SD_PATH_DIRECT_PRIORITY) { 12056 uscmd->uscsi_flags |= USCSI_DIAGNOSE; 12057 } 12058 uscmd->uscsi_flags &= ~USCSI_NOINTR; 12059 12060 dev = SD_GET_DEV(un); 12061 rval = scsi_uscsi_handle_cmd(dev, dataspace, uscmd, 12062 sd_uscsi_strategy, NULL, uip); 12063 12064 /* 12065 * mark ssc_flags right after handle_cmd to make sure 12066 * the uscsi has been sent 12067 */ 12068 ssc->ssc_flags |= SSC_FLAGS_CMD_ISSUED; 12069 12070 #ifdef SDDEBUG 12071 SD_INFO(SD_LOG_IO, un, "sd_ssc_send: " 12072 "uscsi_status: 0x%02x uscsi_resid:0x%x\n", 12073 uscmd->uscsi_status, uscmd->uscsi_resid); 12074 if (uscmd->uscsi_bufaddr != NULL) { 12075 SD_INFO(SD_LOG_IO, un, "sd_ssc_send: " 12076 "uscmd->uscsi_bufaddr: 0x%p uscmd->uscsi_buflen:%d\n", 12077 uscmd->uscsi_bufaddr, uscmd->uscsi_buflen); 12078 if (dataspace == UIO_SYSSPACE) { 12079 SD_DUMP_MEMORY(un, SD_LOG_IO, 12080 "data", (uchar_t *)uscmd->uscsi_bufaddr, 12081 uscmd->uscsi_buflen, SD_LOG_HEX); 12082 } 12083 } 12084 #endif 12085 12086 if (format == 1) { 12087 mutex_enter(SD_MUTEX(un)); 12088 un->un_f_format_in_progress = FALSE; 12089 mutex_exit(SD_MUTEX(un)); 12090 } 12091 12092 (void) scsi_uscsi_copyout((intptr_t)incmd, uscmd); 12093 12094 return (rval); 12095 } 12096 12097 /* 12098 * Function: sd_ssc_print 12099 * 12100 * Description: Print information available to the console. 12101 * 12102 * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and 12103 * sd_uscsi_info in. 12104 * sd_severity - log level. 12105 * Context: Kernel thread or interrupt context. 12106 */ 12107 static void 12108 sd_ssc_print(sd_ssc_t *ssc, int sd_severity) 12109 { 12110 struct uscsi_cmd *ucmdp; 12111 struct scsi_device *devp; 12112 dev_info_t *devinfo; 12113 uchar_t *sensep; 12114 int senlen; 12115 union scsi_cdb *cdbp; 12116 uchar_t com; 12117 extern struct scsi_key_strings scsi_cmds[]; 12118 12119 ASSERT(ssc != NULL); 12120 ASSERT(ssc->ssc_un != NULL); 12121 12122 if (SD_FM_LOG(ssc->ssc_un) != SD_FM_LOG_EREPORT) 12123 return; 12124 ucmdp = ssc->ssc_uscsi_cmd; 12125 devp = SD_SCSI_DEVP(ssc->ssc_un); 12126 devinfo = SD_DEVINFO(ssc->ssc_un); 12127 ASSERT(ucmdp != NULL); 12128 ASSERT(devp != NULL); 12129 ASSERT(devinfo != NULL); 12130 sensep = (uint8_t *)ucmdp->uscsi_rqbuf; 12131 senlen = ucmdp->uscsi_rqlen - ucmdp->uscsi_rqresid; 12132 cdbp = (union scsi_cdb *)ucmdp->uscsi_cdb; 12133 12134 /* In certain case (like DOORLOCK), the cdb could be NULL. */ 12135 if (cdbp == NULL) 12136 return; 12137 /* We don't print log if no sense data available. */ 12138 if (senlen == 0) 12139 sensep = NULL; 12140 com = cdbp->scc_cmd; 12141 scsi_generic_errmsg(devp, sd_label, sd_severity, 0, 0, com, 12142 scsi_cmds, sensep, ssc->ssc_un->un_additional_codes, NULL); 12143 } 12144 12145 /* 12146 * Function: sd_ssc_assessment 12147 * 12148 * Description: We use this function to make an assessment at the point 12149 * where SD driver may encounter a potential error. 12150 * 12151 * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and 12152 * sd_uscsi_info in. 12153 * tp_assess - a hint of strategy for ereport posting. 12154 * Possible values of tp_assess include: 12155 * SD_FMT_IGNORE - we don't post any ereport because we're 12156 * sure that it is ok to ignore the underlying problems. 12157 * SD_FMT_IGNORE_COMPROMISE - we don't post any ereport for now 12158 * but it might be not correct to ignore the underlying hardware 12159 * error. 12160 * SD_FMT_STATUS_CHECK - we will post an ereport with the 12161 * payload driver-assessment of value "fail" or 12162 * "fatal"(depending on what information we have here). This 12163 * assessment value is usually set when SD driver think there 12164 * is a potential error occurred(Typically, when return value 12165 * of the SCSI command is EIO). 12166 * SD_FMT_STANDARD - we will post an ereport with the payload 12167 * driver-assessment of value "info". This assessment value is 12168 * set when the SCSI command returned successfully and with 12169 * sense data sent back. 12170 * 12171 * Context: Kernel thread. 12172 */ 12173 static void 12174 sd_ssc_assessment(sd_ssc_t *ssc, enum sd_type_assessment tp_assess) 12175 { 12176 int senlen = 0; 12177 struct uscsi_cmd *ucmdp = NULL; 12178 struct sd_lun *un; 12179 12180 ASSERT(ssc != NULL); 12181 un = ssc->ssc_un; 12182 ASSERT(un != NULL); 12183 ucmdp = ssc->ssc_uscsi_cmd; 12184 ASSERT(ucmdp != NULL); 12185 12186 if (ssc->ssc_flags & SSC_FLAGS_NEED_ASSESSMENT) { 12187 ssc->ssc_flags &= ~SSC_FLAGS_NEED_ASSESSMENT; 12188 } else { 12189 /* 12190 * If enter here, it indicates that we have a wrong 12191 * calling sequence of sd_ssc_send and sd_ssc_assessment, 12192 * both of which should be called in a pair in case of 12193 * loss of FMA telemetries. 12194 */ 12195 if (ucmdp->uscsi_cdb != NULL) { 12196 SD_INFO(SD_LOG_SDTEST, un, 12197 "sd_ssc_assessment is missing the " 12198 "alternative sd_ssc_send when running 0x%x, " 12199 "or there are superfluous sd_ssc_assessment for " 12200 "the same sd_ssc_send.\n", 12201 ucmdp->uscsi_cdb[0]); 12202 } 12203 /* 12204 * Set the ssc_flags to the initial value to avoid passing 12205 * down dirty flags to the following sd_ssc_send function. 12206 */ 12207 ssc->ssc_flags = SSC_FLAGS_UNKNOWN; 12208 return; 12209 } 12210 12211 /* 12212 * Only handle an issued command which is waiting for assessment. 12213 * A command which is not issued will not have 12214 * SSC_FLAGS_INVALID_DATA set, so it'ok we just return here. 12215 */ 12216 if (!(ssc->ssc_flags & SSC_FLAGS_CMD_ISSUED)) { 12217 sd_ssc_print(ssc, SCSI_ERR_INFO); 12218 return; 12219 } else { 12220 /* 12221 * For an issued command, we should clear this flag in 12222 * order to make the sd_ssc_t structure be used off 12223 * multiple uscsi commands. 12224 */ 12225 ssc->ssc_flags &= ~SSC_FLAGS_CMD_ISSUED; 12226 } 12227 12228 /* 12229 * We will not deal with non-retryable(flag USCSI_DIAGNOSE set) 12230 * commands here. And we should clear the ssc_flags before return. 12231 */ 12232 if (ucmdp->uscsi_flags & USCSI_DIAGNOSE) { 12233 ssc->ssc_flags = SSC_FLAGS_UNKNOWN; 12234 return; 12235 } 12236 12237 switch (tp_assess) { 12238 case SD_FMT_IGNORE: 12239 case SD_FMT_IGNORE_COMPROMISE: 12240 break; 12241 case SD_FMT_STATUS_CHECK: 12242 /* 12243 * For a failed command(including the succeeded command 12244 * with invalid data sent back). 12245 */ 12246 sd_ssc_post(ssc, SD_FM_DRV_FATAL); 12247 break; 12248 case SD_FMT_STANDARD: 12249 /* 12250 * Always for the succeeded commands probably with sense 12251 * data sent back. 12252 * Limitation: 12253 * We can only handle a succeeded command with sense 12254 * data sent back when auto-request-sense is enabled. 12255 */ 12256 senlen = ssc->ssc_uscsi_cmd->uscsi_rqlen - 12257 ssc->ssc_uscsi_cmd->uscsi_rqresid; 12258 if ((ssc->ssc_uscsi_info->ui_pkt_state & STATE_ARQ_DONE) && 12259 (un->un_f_arq_enabled == TRUE) && 12260 senlen > 0 && 12261 ssc->ssc_uscsi_cmd->uscsi_rqbuf != NULL) { 12262 sd_ssc_post(ssc, SD_FM_DRV_NOTICE); 12263 } 12264 break; 12265 default: 12266 /* 12267 * Should not have other type of assessment. 12268 */ 12269 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, 12270 "sd_ssc_assessment got wrong " 12271 "sd_type_assessment %d.\n", tp_assess); 12272 break; 12273 } 12274 /* 12275 * Clear up the ssc_flags before return. 12276 */ 12277 ssc->ssc_flags = SSC_FLAGS_UNKNOWN; 12278 } 12279 12280 /* 12281 * Function: sd_ssc_post 12282 * 12283 * Description: 1. read the driver property to get fm-scsi-log flag. 12284 * 2. print log if fm_log_capable is non-zero. 12285 * 3. call sd_ssc_ereport_post to post ereport if possible. 12286 * 12287 * Context: May be called from kernel thread or interrupt context. 12288 */ 12289 static void 12290 sd_ssc_post(sd_ssc_t *ssc, enum sd_driver_assessment sd_assess) 12291 { 12292 struct sd_lun *un; 12293 int sd_severity; 12294 12295 ASSERT(ssc != NULL); 12296 un = ssc->ssc_un; 12297 ASSERT(un != NULL); 12298 12299 /* 12300 * We may enter here from sd_ssc_assessment(for USCSI command) or 12301 * by directly called from sdintr context. 12302 * We don't handle a non-disk drive(CD-ROM, removable media). 12303 * Clear the ssc_flags before return in case we've set 12304 * SSC_FLAGS_INVALID_XXX which should be skipped for a non-disk 12305 * driver. 12306 */ 12307 if (ISCD(un) || un->un_f_has_removable_media) { 12308 ssc->ssc_flags = SSC_FLAGS_UNKNOWN; 12309 return; 12310 } 12311 12312 switch (sd_assess) { 12313 case SD_FM_DRV_FATAL: 12314 sd_severity = SCSI_ERR_FATAL; 12315 break; 12316 case SD_FM_DRV_RECOVERY: 12317 sd_severity = SCSI_ERR_RECOVERED; 12318 break; 12319 case SD_FM_DRV_RETRY: 12320 sd_severity = SCSI_ERR_RETRYABLE; 12321 break; 12322 case SD_FM_DRV_NOTICE: 12323 sd_severity = SCSI_ERR_INFO; 12324 break; 12325 default: 12326 sd_severity = SCSI_ERR_UNKNOWN; 12327 } 12328 /* print log */ 12329 sd_ssc_print(ssc, sd_severity); 12330 12331 /* always post ereport */ 12332 sd_ssc_ereport_post(ssc, sd_assess); 12333 } 12334 12335 /* 12336 * Function: sd_ssc_set_info 12337 * 12338 * Description: Mark ssc_flags and set ssc_info which would be the 12339 * payload of uderr ereport. This function will cause 12340 * sd_ssc_ereport_post to post uderr ereport only. 12341 * Besides, when ssc_flags == SSC_FLAGS_INVALID_DATA(USCSI), 12342 * the function will also call SD_ERROR or scsi_log for a 12343 * CDROM/removable-media/DDI_FM_NOT_CAPABLE device. 12344 * 12345 * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and 12346 * sd_uscsi_info in. 12347 * ssc_flags - indicate the sub-category of a uderr. 12348 * comp - this argument is meaningful only when 12349 * ssc_flags == SSC_FLAGS_INVALID_DATA, and its possible 12350 * values include: 12351 * > 0, SD_ERROR is used with comp as the driver logging 12352 * component; 12353 * = 0, scsi-log is used to log error telemetries; 12354 * < 0, no log available for this telemetry. 12355 * 12356 * Context: Kernel thread or interrupt context 12357 */ 12358 static void 12359 sd_ssc_set_info(sd_ssc_t *ssc, int ssc_flags, uint_t comp, const char *fmt, ...) 12360 { 12361 va_list ap; 12362 12363 ASSERT(ssc != NULL); 12364 ASSERT(ssc->ssc_un != NULL); 12365 12366 ssc->ssc_flags |= ssc_flags; 12367 va_start(ap, fmt); 12368 (void) vsnprintf(ssc->ssc_info, sizeof (ssc->ssc_info), fmt, ap); 12369 va_end(ap); 12370 12371 /* 12372 * If SSC_FLAGS_INVALID_DATA is set, it should be a uscsi command 12373 * with invalid data sent back. For non-uscsi command, the 12374 * following code will be bypassed. 12375 */ 12376 if (ssc_flags & SSC_FLAGS_INVALID_DATA) { 12377 if (SD_FM_LOG(ssc->ssc_un) == SD_FM_LOG_NSUP) { 12378 /* 12379 * If the error belong to certain component and we 12380 * do not want it to show up on the console, we 12381 * will use SD_ERROR, otherwise scsi_log is 12382 * preferred. 12383 */ 12384 if (comp > 0) { 12385 SD_ERROR(comp, ssc->ssc_un, ssc->ssc_info); 12386 } else if (comp == 0) { 12387 scsi_log(SD_DEVINFO(ssc->ssc_un), sd_label, 12388 CE_WARN, ssc->ssc_info); 12389 } 12390 } 12391 } 12392 } 12393 12394 /* 12395 * Function: sd_buf_iodone 12396 * 12397 * Description: Frees the sd_xbuf & returns the buf to its originator. 12398 * 12399 * Context: May be called from interrupt context. 12400 */ 12401 /* ARGSUSED */ 12402 static void 12403 sd_buf_iodone(int index, struct sd_lun *un, struct buf *bp) 12404 { 12405 struct sd_xbuf *xp; 12406 12407 ASSERT(un != NULL); 12408 ASSERT(bp != NULL); 12409 ASSERT(!mutex_owned(SD_MUTEX(un))); 12410 12411 SD_TRACE(SD_LOG_IO_CORE, un, "sd_buf_iodone: entry.\n"); 12412 12413 xp = SD_GET_XBUF(bp); 12414 ASSERT(xp != NULL); 12415 12416 /* xbuf is gone after this */ 12417 if (ddi_xbuf_done(bp, un->un_xbuf_attr)) { 12418 mutex_enter(SD_MUTEX(un)); 12419 12420 /* 12421 * Grab time when the cmd completed. 12422 * This is used for determining if the system has been 12423 * idle long enough to make it idle to the PM framework. 12424 * This is for lowering the overhead, and therefore improving 12425 * performance per I/O operation. 12426 */ 12427 un->un_pm_idle_time = gethrtime(); 12428 12429 un->un_ncmds_in_driver--; 12430 ASSERT(un->un_ncmds_in_driver >= 0); 12431 SD_INFO(SD_LOG_IO, un, 12432 "sd_buf_iodone: un_ncmds_in_driver = %ld\n", 12433 un->un_ncmds_in_driver); 12434 12435 mutex_exit(SD_MUTEX(un)); 12436 } 12437 12438 biodone(bp); /* bp is gone after this */ 12439 12440 SD_TRACE(SD_LOG_IO_CORE, un, "sd_buf_iodone: exit.\n"); 12441 } 12442 12443 12444 /* 12445 * Function: sd_uscsi_iodone 12446 * 12447 * Description: Frees the sd_xbuf & returns the buf to its originator. 12448 * 12449 * Context: May be called from interrupt context. 12450 */ 12451 /* ARGSUSED */ 12452 static void 12453 sd_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp) 12454 { 12455 struct sd_xbuf *xp; 12456 12457 ASSERT(un != NULL); 12458 ASSERT(bp != NULL); 12459 12460 xp = SD_GET_XBUF(bp); 12461 ASSERT(xp != NULL); 12462 ASSERT(!mutex_owned(SD_MUTEX(un))); 12463 12464 SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: entry.\n"); 12465 12466 bp->b_private = xp->xb_private; 12467 12468 mutex_enter(SD_MUTEX(un)); 12469 12470 /* 12471 * Grab time when the cmd completed. 12472 * This is used for determining if the system has been 12473 * idle long enough to make it idle to the PM framework. 12474 * This is for lowering the overhead, and therefore improving 12475 * performance per I/O operation. 12476 */ 12477 un->un_pm_idle_time = gethrtime(); 12478 12479 un->un_ncmds_in_driver--; 12480 ASSERT(un->un_ncmds_in_driver >= 0); 12481 SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: un_ncmds_in_driver = %ld\n", 12482 un->un_ncmds_in_driver); 12483 12484 mutex_exit(SD_MUTEX(un)); 12485 12486 if (((struct uscsi_cmd *)(xp->xb_pktinfo))->uscsi_rqlen > 12487 SENSE_LENGTH) { 12488 kmem_free(xp, sizeof (struct sd_xbuf) - SENSE_LENGTH + 12489 MAX_SENSE_LENGTH); 12490 } else { 12491 kmem_free(xp, sizeof (struct sd_xbuf)); 12492 } 12493 12494 biodone(bp); 12495 12496 SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: exit.\n"); 12497 } 12498 12499 12500 /* 12501 * Function: sd_mapblockaddr_iostart 12502 * 12503 * Description: Verify request lies within the partition limits for 12504 * the indicated minor device. Issue "overrun" buf if 12505 * request would exceed partition range. Converts 12506 * partition-relative block address to absolute. 12507 * 12508 * Upon exit of this function: 12509 * 1.I/O is aligned 12510 * xp->xb_blkno represents the absolute sector address 12511 * 2.I/O is misaligned 12512 * xp->xb_blkno represents the absolute logical block address 12513 * based on DEV_BSIZE. The logical block address will be 12514 * converted to physical sector address in sd_mapblocksize_\ 12515 * iostart. 12516 * 3.I/O is misaligned but is aligned in "overrun" buf 12517 * xp->xb_blkno represents the absolute logical block address 12518 * based on DEV_BSIZE. The logical block address will be 12519 * converted to physical sector address in sd_mapblocksize_\ 12520 * iostart. But no RMW will be issued in this case. 12521 * 12522 * Context: Can sleep 12523 * 12524 * Issues: This follows what the old code did, in terms of accessing 12525 * some of the partition info in the unit struct without holding 12526 * the mutext. This is a general issue, if the partition info 12527 * can be altered while IO is in progress... as soon as we send 12528 * a buf, its partitioning can be invalid before it gets to the 12529 * device. Probably the right fix is to move partitioning out 12530 * of the driver entirely. 12531 */ 12532 12533 static void 12534 sd_mapblockaddr_iostart(int index, struct sd_lun *un, struct buf *bp) 12535 { 12536 diskaddr_t nblocks; /* #blocks in the given partition */ 12537 daddr_t blocknum; /* Block number specified by the buf */ 12538 size_t requested_nblocks; 12539 size_t available_nblocks; 12540 int partition; 12541 diskaddr_t partition_offset; 12542 struct sd_xbuf *xp; 12543 int secmask = 0, blknomask = 0; 12544 ushort_t is_aligned = TRUE; 12545 12546 ASSERT(un != NULL); 12547 ASSERT(bp != NULL); 12548 ASSERT(!mutex_owned(SD_MUTEX(un))); 12549 12550 SD_TRACE(SD_LOG_IO_PARTITION, un, 12551 "sd_mapblockaddr_iostart: entry: buf:0x%p\n", bp); 12552 12553 xp = SD_GET_XBUF(bp); 12554 ASSERT(xp != NULL); 12555 12556 /* 12557 * If the geometry is not indicated as valid, attempt to access 12558 * the unit & verify the geometry/label. This can be the case for 12559 * removable-media devices, of if the device was opened in 12560 * NDELAY/NONBLOCK mode. 12561 */ 12562 partition = SDPART(bp->b_edev); 12563 12564 if (!SD_IS_VALID_LABEL(un)) { 12565 sd_ssc_t *ssc; 12566 /* 12567 * Initialize sd_ssc_t for internal uscsi commands 12568 * In case of potential porformance issue, we need 12569 * to alloc memory only if there is invalid label 12570 */ 12571 ssc = sd_ssc_init(un); 12572 12573 if (sd_ready_and_valid(ssc, partition) != SD_READY_VALID) { 12574 /* 12575 * For removable devices it is possible to start an 12576 * I/O without a media by opening the device in nodelay 12577 * mode. Also for writable CDs there can be many 12578 * scenarios where there is no geometry yet but volume 12579 * manager is trying to issue a read() just because 12580 * it can see TOC on the CD. So do not print a message 12581 * for removables. 12582 */ 12583 if (!un->un_f_has_removable_media) { 12584 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 12585 "i/o to invalid geometry\n"); 12586 } 12587 bioerror(bp, EIO); 12588 bp->b_resid = bp->b_bcount; 12589 SD_BEGIN_IODONE(index, un, bp); 12590 12591 sd_ssc_fini(ssc); 12592 return; 12593 } 12594 sd_ssc_fini(ssc); 12595 } 12596 12597 nblocks = 0; 12598 (void) cmlb_partinfo(un->un_cmlbhandle, partition, 12599 &nblocks, &partition_offset, NULL, NULL, (void *)SD_PATH_DIRECT); 12600 12601 if (un->un_f_enable_rmw) { 12602 blknomask = (un->un_phy_blocksize / DEV_BSIZE) - 1; 12603 secmask = un->un_phy_blocksize - 1; 12604 } else { 12605 blknomask = (un->un_tgt_blocksize / DEV_BSIZE) - 1; 12606 secmask = un->un_tgt_blocksize - 1; 12607 } 12608 12609 if ((bp->b_lblkno & (blknomask)) || (bp->b_bcount & (secmask))) { 12610 is_aligned = FALSE; 12611 } 12612 12613 if (!(NOT_DEVBSIZE(un)) || un->un_f_enable_rmw) { 12614 /* 12615 * If I/O is aligned, no need to involve RMW(Read Modify Write) 12616 * Convert the logical block number to target's physical sector 12617 * number. 12618 */ 12619 if (is_aligned) { 12620 xp->xb_blkno = SD_SYS2TGTBLOCK(un, xp->xb_blkno); 12621 } else { 12622 /* 12623 * There is no RMW if we're just reading, so don't 12624 * warn or error out because of it. 12625 */ 12626 if (bp->b_flags & B_READ) { 12627 /*EMPTY*/ 12628 } else if (!un->un_f_enable_rmw && 12629 un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR) { 12630 bp->b_flags |= B_ERROR; 12631 goto error_exit; 12632 } else if (un->un_f_rmw_type == SD_RMW_TYPE_DEFAULT) { 12633 mutex_enter(SD_MUTEX(un)); 12634 if (!un->un_f_enable_rmw && 12635 un->un_rmw_msg_timeid == NULL) { 12636 scsi_log(SD_DEVINFO(un), sd_label, 12637 CE_WARN, "I/O request is not " 12638 "aligned with %d disk sector size. " 12639 "It is handled through Read Modify " 12640 "Write but the performance is " 12641 "very low.\n", 12642 un->un_tgt_blocksize); 12643 un->un_rmw_msg_timeid = 12644 timeout(sd_rmw_msg_print_handler, 12645 un, SD_RMW_MSG_PRINT_TIMEOUT); 12646 } else { 12647 un->un_rmw_incre_count ++; 12648 } 12649 mutex_exit(SD_MUTEX(un)); 12650 } 12651 12652 nblocks = SD_TGT2SYSBLOCK(un, nblocks); 12653 partition_offset = SD_TGT2SYSBLOCK(un, 12654 partition_offset); 12655 } 12656 } 12657 12658 /* 12659 * blocknum is the starting block number of the request. At this 12660 * point it is still relative to the start of the minor device. 12661 */ 12662 blocknum = xp->xb_blkno; 12663 12664 /* 12665 * Legacy: If the starting block number is one past the last block 12666 * in the partition, do not set B_ERROR in the buf. 12667 */ 12668 if (blocknum == nblocks) { 12669 goto error_exit; 12670 } 12671 12672 /* 12673 * Confirm that the first block of the request lies within the 12674 * partition limits. Also the requested number of bytes must be 12675 * a multiple of the system block size. 12676 */ 12677 if ((blocknum < 0) || (blocknum >= nblocks) || 12678 ((bp->b_bcount & (DEV_BSIZE - 1)) != 0)) { 12679 bp->b_flags |= B_ERROR; 12680 goto error_exit; 12681 } 12682 12683 /* 12684 * If the requsted # blocks exceeds the available # blocks, that 12685 * is an overrun of the partition. 12686 */ 12687 if ((!NOT_DEVBSIZE(un)) && is_aligned) { 12688 requested_nblocks = SD_BYTES2TGTBLOCKS(un, bp->b_bcount); 12689 } else { 12690 requested_nblocks = SD_BYTES2SYSBLOCKS(bp->b_bcount); 12691 } 12692 12693 available_nblocks = (size_t)(nblocks - blocknum); 12694 ASSERT(nblocks >= blocknum); 12695 12696 if (requested_nblocks > available_nblocks) { 12697 size_t resid; 12698 12699 /* 12700 * Allocate an "overrun" buf to allow the request to proceed 12701 * for the amount of space available in the partition. The 12702 * amount not transferred will be added into the b_resid 12703 * when the operation is complete. The overrun buf 12704 * replaces the original buf here, and the original buf 12705 * is saved inside the overrun buf, for later use. 12706 */ 12707 if ((!NOT_DEVBSIZE(un)) && is_aligned) { 12708 resid = SD_TGTBLOCKS2BYTES(un, 12709 (offset_t)(requested_nblocks - available_nblocks)); 12710 } else { 12711 resid = SD_SYSBLOCKS2BYTES( 12712 (offset_t)(requested_nblocks - available_nblocks)); 12713 } 12714 12715 size_t count = bp->b_bcount - resid; 12716 /* 12717 * Note: count is an unsigned entity thus it'll NEVER 12718 * be less than 0 so ASSERT the original values are 12719 * correct. 12720 */ 12721 ASSERT(bp->b_bcount >= resid); 12722 12723 bp = sd_bioclone_alloc(bp, count, blocknum, 12724 (int (*)(struct buf *)) sd_mapblockaddr_iodone); 12725 xp = SD_GET_XBUF(bp); /* Update for 'new' bp! */ 12726 ASSERT(xp != NULL); 12727 } 12728 12729 /* At this point there should be no residual for this buf. */ 12730 ASSERT(bp->b_resid == 0); 12731 12732 /* Convert the block number to an absolute address. */ 12733 xp->xb_blkno += partition_offset; 12734 12735 SD_NEXT_IOSTART(index, un, bp); 12736 12737 SD_TRACE(SD_LOG_IO_PARTITION, un, 12738 "sd_mapblockaddr_iostart: exit 0: buf:0x%p\n", bp); 12739 12740 return; 12741 12742 error_exit: 12743 bp->b_resid = bp->b_bcount; 12744 SD_BEGIN_IODONE(index, un, bp); 12745 SD_TRACE(SD_LOG_IO_PARTITION, un, 12746 "sd_mapblockaddr_iostart: exit 1: buf:0x%p\n", bp); 12747 } 12748 12749 12750 /* 12751 * Function: sd_mapblockaddr_iodone 12752 * 12753 * Description: Completion-side processing for partition management. 12754 * 12755 * Context: May be called under interrupt context 12756 */ 12757 12758 static void 12759 sd_mapblockaddr_iodone(int index, struct sd_lun *un, struct buf *bp) 12760 { 12761 /* int partition; */ /* Not used, see below. */ 12762 ASSERT(un != NULL); 12763 ASSERT(bp != NULL); 12764 ASSERT(!mutex_owned(SD_MUTEX(un))); 12765 12766 SD_TRACE(SD_LOG_IO_PARTITION, un, 12767 "sd_mapblockaddr_iodone: entry: buf:0x%p\n", bp); 12768 12769 if (bp->b_iodone == (int (*)(struct buf *)) sd_mapblockaddr_iodone) { 12770 /* 12771 * We have an "overrun" buf to deal with... 12772 */ 12773 struct sd_xbuf *xp; 12774 struct buf *obp; /* ptr to the original buf */ 12775 12776 xp = SD_GET_XBUF(bp); 12777 ASSERT(xp != NULL); 12778 12779 /* Retrieve the pointer to the original buf */ 12780 obp = (struct buf *)xp->xb_private; 12781 ASSERT(obp != NULL); 12782 12783 obp->b_resid = obp->b_bcount - (bp->b_bcount - bp->b_resid); 12784 bioerror(obp, bp->b_error); 12785 12786 sd_bioclone_free(bp); 12787 12788 /* 12789 * Get back the original buf. 12790 * Note that since the restoration of xb_blkno below 12791 * was removed, the sd_xbuf is not needed. 12792 */ 12793 bp = obp; 12794 /* 12795 * xp = SD_GET_XBUF(bp); 12796 * ASSERT(xp != NULL); 12797 */ 12798 } 12799 12800 /* 12801 * Convert sd->xb_blkno back to a minor-device relative value. 12802 * Note: this has been commented out, as it is not needed in the 12803 * current implementation of the driver (ie, since this function 12804 * is at the top of the layering chains, so the info will be 12805 * discarded) and it is in the "hot" IO path. 12806 * 12807 * partition = getminor(bp->b_edev) & SDPART_MASK; 12808 * xp->xb_blkno -= un->un_offset[partition]; 12809 */ 12810 12811 SD_NEXT_IODONE(index, un, bp); 12812 12813 SD_TRACE(SD_LOG_IO_PARTITION, un, 12814 "sd_mapblockaddr_iodone: exit: buf:0x%p\n", bp); 12815 } 12816 12817 12818 /* 12819 * Function: sd_mapblocksize_iostart 12820 * 12821 * Description: Convert between system block size (un->un_sys_blocksize) 12822 * and target block size (un->un_tgt_blocksize). 12823 * 12824 * Context: Can sleep to allocate resources. 12825 * 12826 * Assumptions: A higher layer has already performed any partition validation, 12827 * and converted the xp->xb_blkno to an absolute value relative 12828 * to the start of the device. 12829 * 12830 * It is also assumed that the higher layer has implemented 12831 * an "overrun" mechanism for the case where the request would 12832 * read/write beyond the end of a partition. In this case we 12833 * assume (and ASSERT) that bp->b_resid == 0. 12834 * 12835 * Note: The implementation for this routine assumes the target 12836 * block size remains constant between allocation and transport. 12837 */ 12838 12839 static void 12840 sd_mapblocksize_iostart(int index, struct sd_lun *un, struct buf *bp) 12841 { 12842 struct sd_mapblocksize_info *bsp; 12843 struct sd_xbuf *xp; 12844 offset_t first_byte; 12845 daddr_t start_block, end_block; 12846 daddr_t request_bytes; 12847 ushort_t is_aligned = FALSE; 12848 12849 ASSERT(un != NULL); 12850 ASSERT(bp != NULL); 12851 ASSERT(!mutex_owned(SD_MUTEX(un))); 12852 ASSERT(bp->b_resid == 0); 12853 12854 SD_TRACE(SD_LOG_IO_RMMEDIA, un, 12855 "sd_mapblocksize_iostart: entry: buf:0x%p\n", bp); 12856 12857 /* 12858 * For a non-writable CD, a write request is an error 12859 */ 12860 if (ISCD(un) && ((bp->b_flags & B_READ) == 0) && 12861 (un->un_f_mmc_writable_media == FALSE)) { 12862 bioerror(bp, EIO); 12863 bp->b_resid = bp->b_bcount; 12864 SD_BEGIN_IODONE(index, un, bp); 12865 return; 12866 } 12867 12868 /* 12869 * We do not need a shadow buf if the device is using 12870 * un->un_sys_blocksize as its block size or if bcount == 0. 12871 * In this case there is no layer-private data block allocated. 12872 */ 12873 if ((un->un_tgt_blocksize == DEV_BSIZE && !un->un_f_enable_rmw) || 12874 (bp->b_bcount == 0)) { 12875 goto done; 12876 } 12877 12878 #if defined(__i386) || defined(__amd64) 12879 /* We do not support non-block-aligned transfers for ROD devices */ 12880 ASSERT(!ISROD(un)); 12881 #endif 12882 12883 xp = SD_GET_XBUF(bp); 12884 ASSERT(xp != NULL); 12885 12886 SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: " 12887 "tgt_blocksize:0x%x sys_blocksize: 0x%x\n", 12888 un->un_tgt_blocksize, DEV_BSIZE); 12889 SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: " 12890 "request start block:0x%x\n", xp->xb_blkno); 12891 SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: " 12892 "request len:0x%x\n", bp->b_bcount); 12893 12894 /* 12895 * Allocate the layer-private data area for the mapblocksize layer. 12896 * Layers are allowed to use the xp_private member of the sd_xbuf 12897 * struct to store the pointer to their layer-private data block, but 12898 * each layer also has the responsibility of restoring the prior 12899 * contents of xb_private before returning the buf/xbuf to the 12900 * higher layer that sent it. 12901 * 12902 * Here we save the prior contents of xp->xb_private into the 12903 * bsp->mbs_oprivate field of our layer-private data area. This value 12904 * is restored by sd_mapblocksize_iodone() just prior to freeing up 12905 * the layer-private area and returning the buf/xbuf to the layer 12906 * that sent it. 12907 * 12908 * Note that here we use kmem_zalloc for the allocation as there are 12909 * parts of the mapblocksize code that expect certain fields to be 12910 * zero unless explicitly set to a required value. 12911 */ 12912 bsp = kmem_zalloc(sizeof (struct sd_mapblocksize_info), KM_SLEEP); 12913 bsp->mbs_oprivate = xp->xb_private; 12914 xp->xb_private = bsp; 12915 12916 /* 12917 * This treats the data on the disk (target) as an array of bytes. 12918 * first_byte is the byte offset, from the beginning of the device, 12919 * to the location of the request. This is converted from a 12920 * un->un_sys_blocksize block address to a byte offset, and then back 12921 * to a block address based upon a un->un_tgt_blocksize block size. 12922 * 12923 * xp->xb_blkno should be absolute upon entry into this function, 12924 * but, but it is based upon partitions that use the "system" 12925 * block size. It must be adjusted to reflect the block size of 12926 * the target. 12927 * 12928 * Note that end_block is actually the block that follows the last 12929 * block of the request, but that's what is needed for the computation. 12930 */ 12931 first_byte = SD_SYSBLOCKS2BYTES((offset_t)xp->xb_blkno); 12932 if (un->un_f_enable_rmw) { 12933 start_block = xp->xb_blkno = 12934 (first_byte / un->un_phy_blocksize) * 12935 (un->un_phy_blocksize / DEV_BSIZE); 12936 end_block = ((first_byte + bp->b_bcount + 12937 un->un_phy_blocksize - 1) / un->un_phy_blocksize) * 12938 (un->un_phy_blocksize / DEV_BSIZE); 12939 } else { 12940 start_block = xp->xb_blkno = first_byte / un->un_tgt_blocksize; 12941 end_block = (first_byte + bp->b_bcount + 12942 un->un_tgt_blocksize - 1) / un->un_tgt_blocksize; 12943 } 12944 12945 /* request_bytes is rounded up to a multiple of the target block size */ 12946 request_bytes = (end_block - start_block) * un->un_tgt_blocksize; 12947 12948 /* 12949 * See if the starting address of the request and the request 12950 * length are aligned on a un->un_tgt_blocksize boundary. If aligned 12951 * then we do not need to allocate a shadow buf to handle the request. 12952 */ 12953 if (un->un_f_enable_rmw) { 12954 if (((first_byte % un->un_phy_blocksize) == 0) && 12955 ((bp->b_bcount % un->un_phy_blocksize) == 0)) { 12956 is_aligned = TRUE; 12957 } 12958 } else { 12959 if (((first_byte % un->un_tgt_blocksize) == 0) && 12960 ((bp->b_bcount % un->un_tgt_blocksize) == 0)) { 12961 is_aligned = TRUE; 12962 } 12963 } 12964 12965 if ((bp->b_flags & B_READ) == 0) { 12966 /* 12967 * Lock the range for a write operation. An aligned request is 12968 * considered a simple write; otherwise the request must be a 12969 * read-modify-write. 12970 */ 12971 bsp->mbs_wmp = sd_range_lock(un, start_block, end_block - 1, 12972 (is_aligned == TRUE) ? SD_WTYPE_SIMPLE : SD_WTYPE_RMW); 12973 } 12974 12975 /* 12976 * Alloc a shadow buf if the request is not aligned. Also, this is 12977 * where the READ command is generated for a read-modify-write. (The 12978 * write phase is deferred until after the read completes.) 12979 */ 12980 if (is_aligned == FALSE) { 12981 12982 struct sd_mapblocksize_info *shadow_bsp; 12983 struct sd_xbuf *shadow_xp; 12984 struct buf *shadow_bp; 12985 12986 /* 12987 * Allocate the shadow buf and it associated xbuf. Note that 12988 * after this call the xb_blkno value in both the original 12989 * buf's sd_xbuf _and_ the shadow buf's sd_xbuf will be the 12990 * same: absolute relative to the start of the device, and 12991 * adjusted for the target block size. The b_blkno in the 12992 * shadow buf will also be set to this value. We should never 12993 * change b_blkno in the original bp however. 12994 * 12995 * Note also that the shadow buf will always need to be a 12996 * READ command, regardless of whether the incoming command 12997 * is a READ or a WRITE. 12998 */ 12999 shadow_bp = sd_shadow_buf_alloc(bp, request_bytes, B_READ, 13000 xp->xb_blkno, 13001 (int (*)(struct buf *)) sd_mapblocksize_iodone); 13002 13003 shadow_xp = SD_GET_XBUF(shadow_bp); 13004 13005 /* 13006 * Allocate the layer-private data for the shadow buf. 13007 * (No need to preserve xb_private in the shadow xbuf.) 13008 */ 13009 shadow_xp->xb_private = shadow_bsp = 13010 kmem_zalloc(sizeof (struct sd_mapblocksize_info), KM_SLEEP); 13011 13012 /* 13013 * bsp->mbs_copy_offset is used later by sd_mapblocksize_iodone 13014 * to figure out where the start of the user data is (based upon 13015 * the system block size) in the data returned by the READ 13016 * command (which will be based upon the target blocksize). Note 13017 * that this is only really used if the request is unaligned. 13018 */ 13019 if (un->un_f_enable_rmw) { 13020 bsp->mbs_copy_offset = (ssize_t)(first_byte - 13021 ((offset_t)xp->xb_blkno * un->un_sys_blocksize)); 13022 ASSERT((bsp->mbs_copy_offset >= 0) && 13023 (bsp->mbs_copy_offset < un->un_phy_blocksize)); 13024 } else { 13025 bsp->mbs_copy_offset = (ssize_t)(first_byte - 13026 ((offset_t)xp->xb_blkno * un->un_tgt_blocksize)); 13027 ASSERT((bsp->mbs_copy_offset >= 0) && 13028 (bsp->mbs_copy_offset < un->un_tgt_blocksize)); 13029 } 13030 13031 shadow_bsp->mbs_copy_offset = bsp->mbs_copy_offset; 13032 13033 shadow_bsp->mbs_layer_index = bsp->mbs_layer_index = index; 13034 13035 /* Transfer the wmap (if any) to the shadow buf */ 13036 shadow_bsp->mbs_wmp = bsp->mbs_wmp; 13037 bsp->mbs_wmp = NULL; 13038 13039 /* 13040 * The shadow buf goes on from here in place of the 13041 * original buf. 13042 */ 13043 shadow_bsp->mbs_orig_bp = bp; 13044 bp = shadow_bp; 13045 } 13046 13047 SD_INFO(SD_LOG_IO_RMMEDIA, un, 13048 "sd_mapblocksize_iostart: tgt start block:0x%x\n", xp->xb_blkno); 13049 SD_INFO(SD_LOG_IO_RMMEDIA, un, 13050 "sd_mapblocksize_iostart: tgt request len:0x%x\n", 13051 request_bytes); 13052 SD_INFO(SD_LOG_IO_RMMEDIA, un, 13053 "sd_mapblocksize_iostart: shadow buf:0x%x\n", bp); 13054 13055 done: 13056 SD_NEXT_IOSTART(index, un, bp); 13057 13058 SD_TRACE(SD_LOG_IO_RMMEDIA, un, 13059 "sd_mapblocksize_iostart: exit: buf:0x%p\n", bp); 13060 } 13061 13062 13063 /* 13064 * Function: sd_mapblocksize_iodone 13065 * 13066 * Description: Completion side processing for block-size mapping. 13067 * 13068 * Context: May be called under interrupt context 13069 */ 13070 13071 static void 13072 sd_mapblocksize_iodone(int index, struct sd_lun *un, struct buf *bp) 13073 { 13074 struct sd_mapblocksize_info *bsp; 13075 struct sd_xbuf *xp; 13076 struct sd_xbuf *orig_xp; /* sd_xbuf for the original buf */ 13077 struct buf *orig_bp; /* ptr to the original buf */ 13078 offset_t shadow_end; 13079 offset_t request_end; 13080 offset_t shadow_start; 13081 ssize_t copy_offset; 13082 size_t copy_length; 13083 size_t shortfall; 13084 uint_t is_write; /* TRUE if this bp is a WRITE */ 13085 uint_t has_wmap; /* TRUE is this bp has a wmap */ 13086 13087 ASSERT(un != NULL); 13088 ASSERT(bp != NULL); 13089 13090 SD_TRACE(SD_LOG_IO_RMMEDIA, un, 13091 "sd_mapblocksize_iodone: entry: buf:0x%p\n", bp); 13092 13093 /* 13094 * There is no shadow buf or layer-private data if the target is 13095 * using un->un_sys_blocksize as its block size or if bcount == 0. 13096 */ 13097 if ((un->un_tgt_blocksize == DEV_BSIZE && !un->un_f_enable_rmw) || 13098 (bp->b_bcount == 0)) { 13099 goto exit; 13100 } 13101 13102 xp = SD_GET_XBUF(bp); 13103 ASSERT(xp != NULL); 13104 13105 /* Retrieve the pointer to the layer-private data area from the xbuf. */ 13106 bsp = xp->xb_private; 13107 13108 is_write = ((bp->b_flags & B_READ) == 0) ? TRUE : FALSE; 13109 has_wmap = (bsp->mbs_wmp != NULL) ? TRUE : FALSE; 13110 13111 if (is_write) { 13112 /* 13113 * For a WRITE request we must free up the block range that 13114 * we have locked up. This holds regardless of whether this is 13115 * an aligned write request or a read-modify-write request. 13116 */ 13117 sd_range_unlock(un, bsp->mbs_wmp); 13118 bsp->mbs_wmp = NULL; 13119 } 13120 13121 if ((bp->b_iodone != (int(*)(struct buf *))sd_mapblocksize_iodone)) { 13122 /* 13123 * An aligned read or write command will have no shadow buf; 13124 * there is not much else to do with it. 13125 */ 13126 goto done; 13127 } 13128 13129 orig_bp = bsp->mbs_orig_bp; 13130 ASSERT(orig_bp != NULL); 13131 orig_xp = SD_GET_XBUF(orig_bp); 13132 ASSERT(orig_xp != NULL); 13133 ASSERT(!mutex_owned(SD_MUTEX(un))); 13134 13135 if (!is_write && has_wmap) { 13136 /* 13137 * A READ with a wmap means this is the READ phase of a 13138 * read-modify-write. If an error occurred on the READ then 13139 * we do not proceed with the WRITE phase or copy any data. 13140 * Just release the write maps and return with an error. 13141 */ 13142 if ((bp->b_resid != 0) || (bp->b_error != 0)) { 13143 orig_bp->b_resid = orig_bp->b_bcount; 13144 bioerror(orig_bp, bp->b_error); 13145 sd_range_unlock(un, bsp->mbs_wmp); 13146 goto freebuf_done; 13147 } 13148 } 13149 13150 /* 13151 * Here is where we set up to copy the data from the shadow buf 13152 * into the space associated with the original buf. 13153 * 13154 * To deal with the conversion between block sizes, these 13155 * computations treat the data as an array of bytes, with the 13156 * first byte (byte 0) corresponding to the first byte in the 13157 * first block on the disk. 13158 */ 13159 13160 /* 13161 * shadow_start and shadow_len indicate the location and size of 13162 * the data returned with the shadow IO request. 13163 */ 13164 if (un->un_f_enable_rmw) { 13165 shadow_start = SD_SYSBLOCKS2BYTES((offset_t)xp->xb_blkno); 13166 } else { 13167 shadow_start = SD_TGTBLOCKS2BYTES(un, (offset_t)xp->xb_blkno); 13168 } 13169 shadow_end = shadow_start + bp->b_bcount - bp->b_resid; 13170 13171 /* 13172 * copy_offset gives the offset (in bytes) from the start of the first 13173 * block of the READ request to the beginning of the data. We retrieve 13174 * this value from xb_pktp in the ORIGINAL xbuf, as it has been saved 13175 * there by sd_mapblockize_iostart(). copy_length gives the amount of 13176 * data to be copied (in bytes). 13177 */ 13178 copy_offset = bsp->mbs_copy_offset; 13179 if (un->un_f_enable_rmw) { 13180 ASSERT((copy_offset >= 0) && 13181 (copy_offset < un->un_phy_blocksize)); 13182 } else { 13183 ASSERT((copy_offset >= 0) && 13184 (copy_offset < un->un_tgt_blocksize)); 13185 } 13186 13187 copy_length = orig_bp->b_bcount; 13188 request_end = shadow_start + copy_offset + orig_bp->b_bcount; 13189 13190 /* 13191 * Set up the resid and error fields of orig_bp as appropriate. 13192 */ 13193 if (shadow_end >= request_end) { 13194 /* We got all the requested data; set resid to zero */ 13195 orig_bp->b_resid = 0; 13196 } else { 13197 /* 13198 * We failed to get enough data to fully satisfy the original 13199 * request. Just copy back whatever data we got and set 13200 * up the residual and error code as required. 13201 * 13202 * 'shortfall' is the amount by which the data received with the 13203 * shadow buf has "fallen short" of the requested amount. 13204 */ 13205 shortfall = (size_t)(request_end - shadow_end); 13206 13207 if (shortfall > orig_bp->b_bcount) { 13208 /* 13209 * We did not get enough data to even partially 13210 * fulfill the original request. The residual is 13211 * equal to the amount requested. 13212 */ 13213 orig_bp->b_resid = orig_bp->b_bcount; 13214 } else { 13215 /* 13216 * We did not get all the data that we requested 13217 * from the device, but we will try to return what 13218 * portion we did get. 13219 */ 13220 orig_bp->b_resid = shortfall; 13221 } 13222 ASSERT(copy_length >= orig_bp->b_resid); 13223 copy_length -= orig_bp->b_resid; 13224 } 13225 13226 /* Propagate the error code from the shadow buf to the original buf */ 13227 bioerror(orig_bp, bp->b_error); 13228 13229 if (is_write) { 13230 goto freebuf_done; /* No data copying for a WRITE */ 13231 } 13232 13233 if (has_wmap) { 13234 /* 13235 * This is a READ command from the READ phase of a 13236 * read-modify-write request. We have to copy the data given 13237 * by the user OVER the data returned by the READ command, 13238 * then convert the command from a READ to a WRITE and send 13239 * it back to the target. 13240 */ 13241 bcopy(orig_bp->b_un.b_addr, bp->b_un.b_addr + copy_offset, 13242 copy_length); 13243 13244 bp->b_flags &= ~((int)B_READ); /* Convert to a WRITE */ 13245 13246 /* 13247 * Dispatch the WRITE command to the taskq thread, which 13248 * will in turn send the command to the target. When the 13249 * WRITE command completes, we (sd_mapblocksize_iodone()) 13250 * will get called again as part of the iodone chain 13251 * processing for it. Note that we will still be dealing 13252 * with the shadow buf at that point. 13253 */ 13254 if (taskq_dispatch(sd_wmr_tq, sd_read_modify_write_task, bp, 13255 KM_NOSLEEP) != 0) { 13256 /* 13257 * Dispatch was successful so we are done. Return 13258 * without going any higher up the iodone chain. Do 13259 * not free up any layer-private data until after the 13260 * WRITE completes. 13261 */ 13262 return; 13263 } 13264 13265 /* 13266 * Dispatch of the WRITE command failed; set up the error 13267 * condition and send this IO back up the iodone chain. 13268 */ 13269 bioerror(orig_bp, EIO); 13270 orig_bp->b_resid = orig_bp->b_bcount; 13271 13272 } else { 13273 /* 13274 * This is a regular READ request (ie, not a RMW). Copy the 13275 * data from the shadow buf into the original buf. The 13276 * copy_offset compensates for any "misalignment" between the 13277 * shadow buf (with its un->un_tgt_blocksize blocks) and the 13278 * original buf (with its un->un_sys_blocksize blocks). 13279 */ 13280 bcopy(bp->b_un.b_addr + copy_offset, orig_bp->b_un.b_addr, 13281 copy_length); 13282 } 13283 13284 freebuf_done: 13285 13286 /* 13287 * At this point we still have both the shadow buf AND the original 13288 * buf to deal with, as well as the layer-private data area in each. 13289 * Local variables are as follows: 13290 * 13291 * bp -- points to shadow buf 13292 * xp -- points to xbuf of shadow buf 13293 * bsp -- points to layer-private data area of shadow buf 13294 * orig_bp -- points to original buf 13295 * 13296 * First free the shadow buf and its associated xbuf, then free the 13297 * layer-private data area from the shadow buf. There is no need to 13298 * restore xb_private in the shadow xbuf. 13299 */ 13300 sd_shadow_buf_free(bp); 13301 kmem_free(bsp, sizeof (struct sd_mapblocksize_info)); 13302 13303 /* 13304 * Now update the local variables to point to the original buf, xbuf, 13305 * and layer-private area. 13306 */ 13307 bp = orig_bp; 13308 xp = SD_GET_XBUF(bp); 13309 ASSERT(xp != NULL); 13310 ASSERT(xp == orig_xp); 13311 bsp = xp->xb_private; 13312 ASSERT(bsp != NULL); 13313 13314 done: 13315 /* 13316 * Restore xb_private to whatever it was set to by the next higher 13317 * layer in the chain, then free the layer-private data area. 13318 */ 13319 xp->xb_private = bsp->mbs_oprivate; 13320 kmem_free(bsp, sizeof (struct sd_mapblocksize_info)); 13321 13322 exit: 13323 SD_TRACE(SD_LOG_IO_RMMEDIA, SD_GET_UN(bp), 13324 "sd_mapblocksize_iodone: calling SD_NEXT_IODONE: buf:0x%p\n", bp); 13325 13326 SD_NEXT_IODONE(index, un, bp); 13327 } 13328 13329 13330 /* 13331 * Function: sd_checksum_iostart 13332 * 13333 * Description: A stub function for a layer that's currently not used. 13334 * For now just a placeholder. 13335 * 13336 * Context: Kernel thread context 13337 */ 13338 13339 static void 13340 sd_checksum_iostart(int index, struct sd_lun *un, struct buf *bp) 13341 { 13342 ASSERT(un != NULL); 13343 ASSERT(bp != NULL); 13344 ASSERT(!mutex_owned(SD_MUTEX(un))); 13345 SD_NEXT_IOSTART(index, un, bp); 13346 } 13347 13348 13349 /* 13350 * Function: sd_checksum_iodone 13351 * 13352 * Description: A stub function for a layer that's currently not used. 13353 * For now just a placeholder. 13354 * 13355 * Context: May be called under interrupt context 13356 */ 13357 13358 static void 13359 sd_checksum_iodone(int index, struct sd_lun *un, struct buf *bp) 13360 { 13361 ASSERT(un != NULL); 13362 ASSERT(bp != NULL); 13363 ASSERT(!mutex_owned(SD_MUTEX(un))); 13364 SD_NEXT_IODONE(index, un, bp); 13365 } 13366 13367 13368 /* 13369 * Function: sd_checksum_uscsi_iostart 13370 * 13371 * Description: A stub function for a layer that's currently not used. 13372 * For now just a placeholder. 13373 * 13374 * Context: Kernel thread context 13375 */ 13376 13377 static void 13378 sd_checksum_uscsi_iostart(int index, struct sd_lun *un, struct buf *bp) 13379 { 13380 ASSERT(un != NULL); 13381 ASSERT(bp != NULL); 13382 ASSERT(!mutex_owned(SD_MUTEX(un))); 13383 SD_NEXT_IOSTART(index, un, bp); 13384 } 13385 13386 13387 /* 13388 * Function: sd_checksum_uscsi_iodone 13389 * 13390 * Description: A stub function for a layer that's currently not used. 13391 * For now just a placeholder. 13392 * 13393 * Context: May be called under interrupt context 13394 */ 13395 13396 static void 13397 sd_checksum_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp) 13398 { 13399 ASSERT(un != NULL); 13400 ASSERT(bp != NULL); 13401 ASSERT(!mutex_owned(SD_MUTEX(un))); 13402 SD_NEXT_IODONE(index, un, bp); 13403 } 13404 13405 13406 /* 13407 * Function: sd_pm_iostart 13408 * 13409 * Description: iostart-side routine for Power mangement. 13410 * 13411 * Context: Kernel thread context 13412 */ 13413 13414 static void 13415 sd_pm_iostart(int index, struct sd_lun *un, struct buf *bp) 13416 { 13417 ASSERT(un != NULL); 13418 ASSERT(bp != NULL); 13419 ASSERT(!mutex_owned(SD_MUTEX(un))); 13420 ASSERT(!mutex_owned(&un->un_pm_mutex)); 13421 13422 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: entry\n"); 13423 13424 if (sd_pm_entry(un) != DDI_SUCCESS) { 13425 /* 13426 * Set up to return the failed buf back up the 'iodone' 13427 * side of the calling chain. 13428 */ 13429 bioerror(bp, EIO); 13430 bp->b_resid = bp->b_bcount; 13431 13432 SD_BEGIN_IODONE(index, un, bp); 13433 13434 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: exit\n"); 13435 return; 13436 } 13437 13438 SD_NEXT_IOSTART(index, un, bp); 13439 13440 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: exit\n"); 13441 } 13442 13443 13444 /* 13445 * Function: sd_pm_iodone 13446 * 13447 * Description: iodone-side routine for power mangement. 13448 * 13449 * Context: may be called from interrupt context 13450 */ 13451 13452 static void 13453 sd_pm_iodone(int index, struct sd_lun *un, struct buf *bp) 13454 { 13455 ASSERT(un != NULL); 13456 ASSERT(bp != NULL); 13457 ASSERT(!mutex_owned(&un->un_pm_mutex)); 13458 13459 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iodone: entry\n"); 13460 13461 /* 13462 * After attach the following flag is only read, so don't 13463 * take the penalty of acquiring a mutex for it. 13464 */ 13465 if (un->un_f_pm_is_enabled == TRUE) { 13466 sd_pm_exit(un); 13467 } 13468 13469 SD_NEXT_IODONE(index, un, bp); 13470 13471 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iodone: exit\n"); 13472 } 13473 13474 13475 /* 13476 * Function: sd_core_iostart 13477 * 13478 * Description: Primary driver function for enqueuing buf(9S) structs from 13479 * the system and initiating IO to the target device 13480 * 13481 * Context: Kernel thread context. Can sleep. 13482 * 13483 * Assumptions: - The given xp->xb_blkno is absolute 13484 * (ie, relative to the start of the device). 13485 * - The IO is to be done using the native blocksize of 13486 * the device, as specified in un->un_tgt_blocksize. 13487 */ 13488 /* ARGSUSED */ 13489 static void 13490 sd_core_iostart(int index, struct sd_lun *un, struct buf *bp) 13491 { 13492 struct sd_xbuf *xp; 13493 13494 ASSERT(un != NULL); 13495 ASSERT(bp != NULL); 13496 ASSERT(!mutex_owned(SD_MUTEX(un))); 13497 ASSERT(bp->b_resid == 0); 13498 13499 SD_TRACE(SD_LOG_IO_CORE, un, "sd_core_iostart: entry: bp:0x%p\n", bp); 13500 13501 xp = SD_GET_XBUF(bp); 13502 ASSERT(xp != NULL); 13503 13504 mutex_enter(SD_MUTEX(un)); 13505 13506 /* 13507 * If we are currently in the failfast state, fail any new IO 13508 * that has B_FAILFAST set, then return. 13509 */ 13510 if ((bp->b_flags & B_FAILFAST) && 13511 (un->un_failfast_state == SD_FAILFAST_ACTIVE)) { 13512 mutex_exit(SD_MUTEX(un)); 13513 bioerror(bp, EIO); 13514 bp->b_resid = bp->b_bcount; 13515 SD_BEGIN_IODONE(index, un, bp); 13516 return; 13517 } 13518 13519 if (SD_IS_DIRECT_PRIORITY(xp)) { 13520 /* 13521 * Priority command -- transport it immediately. 13522 * 13523 * Note: We may want to assert that USCSI_DIAGNOSE is set, 13524 * because all direct priority commands should be associated 13525 * with error recovery actions which we don't want to retry. 13526 */ 13527 sd_start_cmds(un, bp); 13528 } else { 13529 /* 13530 * Normal command -- add it to the wait queue, then start 13531 * transporting commands from the wait queue. 13532 */ 13533 sd_add_buf_to_waitq(un, bp); 13534 SD_UPDATE_KSTATS(un, kstat_waitq_enter, bp); 13535 sd_start_cmds(un, NULL); 13536 } 13537 13538 mutex_exit(SD_MUTEX(un)); 13539 13540 SD_TRACE(SD_LOG_IO_CORE, un, "sd_core_iostart: exit: bp:0x%p\n", bp); 13541 } 13542 13543 13544 /* 13545 * Function: sd_init_cdb_limits 13546 * 13547 * Description: This is to handle scsi_pkt initialization differences 13548 * between the driver platforms. 13549 * 13550 * Legacy behaviors: 13551 * 13552 * If the block number or the sector count exceeds the 13553 * capabilities of a Group 0 command, shift over to a 13554 * Group 1 command. We don't blindly use Group 1 13555 * commands because a) some drives (CDC Wren IVs) get a 13556 * bit confused, and b) there is probably a fair amount 13557 * of speed difference for a target to receive and decode 13558 * a 10 byte command instead of a 6 byte command. 13559 * 13560 * The xfer time difference of 6 vs 10 byte CDBs is 13561 * still significant so this code is still worthwhile. 13562 * 10 byte CDBs are very inefficient with the fas HBA driver 13563 * and older disks. Each CDB byte took 1 usec with some 13564 * popular disks. 13565 * 13566 * Context: Must be called at attach time 13567 */ 13568 13569 static void 13570 sd_init_cdb_limits(struct sd_lun *un) 13571 { 13572 int hba_cdb_limit; 13573 13574 /* 13575 * Use CDB_GROUP1 commands for most devices except for 13576 * parallel SCSI fixed drives in which case we get better 13577 * performance using CDB_GROUP0 commands (where applicable). 13578 */ 13579 un->un_mincdb = SD_CDB_GROUP1; 13580 #if !defined(__fibre) 13581 if (!un->un_f_is_fibre && !un->un_f_cfg_is_atapi && !ISROD(un) && 13582 !un->un_f_has_removable_media) { 13583 un->un_mincdb = SD_CDB_GROUP0; 13584 } 13585 #endif 13586 13587 /* 13588 * Try to read the max-cdb-length supported by HBA. 13589 */ 13590 un->un_max_hba_cdb = scsi_ifgetcap(SD_ADDRESS(un), "max-cdb-length", 1); 13591 if (0 >= un->un_max_hba_cdb) { 13592 un->un_max_hba_cdb = CDB_GROUP4; 13593 hba_cdb_limit = SD_CDB_GROUP4; 13594 } else if (0 < un->un_max_hba_cdb && 13595 un->un_max_hba_cdb < CDB_GROUP1) { 13596 hba_cdb_limit = SD_CDB_GROUP0; 13597 } else if (CDB_GROUP1 <= un->un_max_hba_cdb && 13598 un->un_max_hba_cdb < CDB_GROUP5) { 13599 hba_cdb_limit = SD_CDB_GROUP1; 13600 } else if (CDB_GROUP5 <= un->un_max_hba_cdb && 13601 un->un_max_hba_cdb < CDB_GROUP4) { 13602 hba_cdb_limit = SD_CDB_GROUP5; 13603 } else { 13604 hba_cdb_limit = SD_CDB_GROUP4; 13605 } 13606 13607 /* 13608 * Use CDB_GROUP5 commands for removable devices. Use CDB_GROUP4 13609 * commands for fixed disks unless we are building for a 32 bit 13610 * kernel. 13611 */ 13612 #ifdef _LP64 13613 un->un_maxcdb = (un->un_f_has_removable_media) ? SD_CDB_GROUP5 : 13614 min(hba_cdb_limit, SD_CDB_GROUP4); 13615 #else 13616 un->un_maxcdb = (un->un_f_has_removable_media) ? SD_CDB_GROUP5 : 13617 min(hba_cdb_limit, SD_CDB_GROUP1); 13618 #endif 13619 13620 un->un_status_len = (int)((un->un_f_arq_enabled == TRUE) 13621 ? sizeof (struct scsi_arq_status) : 1); 13622 if (!ISCD(un)) 13623 un->un_cmd_timeout = (ushort_t)sd_io_time; 13624 un->un_uscsi_timeout = ((ISCD(un)) ? 2 : 1) * un->un_cmd_timeout; 13625 } 13626 13627 13628 /* 13629 * Function: sd_initpkt_for_buf 13630 * 13631 * Description: Allocate and initialize for transport a scsi_pkt struct, 13632 * based upon the info specified in the given buf struct. 13633 * 13634 * Assumes the xb_blkno in the request is absolute (ie, 13635 * relative to the start of the device (NOT partition!). 13636 * Also assumes that the request is using the native block 13637 * size of the device (as returned by the READ CAPACITY 13638 * command). 13639 * 13640 * Return Code: SD_PKT_ALLOC_SUCCESS 13641 * SD_PKT_ALLOC_FAILURE 13642 * SD_PKT_ALLOC_FAILURE_NO_DMA 13643 * SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL 13644 * 13645 * Context: Kernel thread and may be called from software interrupt context 13646 * as part of a sdrunout callback. This function may not block or 13647 * call routines that block 13648 */ 13649 13650 static int 13651 sd_initpkt_for_buf(struct buf *bp, struct scsi_pkt **pktpp) 13652 { 13653 struct sd_xbuf *xp; 13654 struct scsi_pkt *pktp = NULL; 13655 struct sd_lun *un; 13656 size_t blockcount; 13657 daddr_t startblock; 13658 int rval; 13659 int cmd_flags; 13660 13661 ASSERT(bp != NULL); 13662 ASSERT(pktpp != NULL); 13663 xp = SD_GET_XBUF(bp); 13664 ASSERT(xp != NULL); 13665 un = SD_GET_UN(bp); 13666 ASSERT(un != NULL); 13667 ASSERT(mutex_owned(SD_MUTEX(un))); 13668 ASSERT(bp->b_resid == 0); 13669 13670 SD_TRACE(SD_LOG_IO_CORE, un, 13671 "sd_initpkt_for_buf: entry: buf:0x%p\n", bp); 13672 13673 mutex_exit(SD_MUTEX(un)); 13674 13675 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 13676 if (xp->xb_pkt_flags & SD_XB_DMA_FREED) { 13677 /* 13678 * Already have a scsi_pkt -- just need DMA resources. 13679 * We must recompute the CDB in case the mapping returns 13680 * a nonzero pkt_resid. 13681 * Note: if this is a portion of a PKT_DMA_PARTIAL transfer 13682 * that is being retried, the unmap/remap of the DMA resouces 13683 * will result in the entire transfer starting over again 13684 * from the very first block. 13685 */ 13686 ASSERT(xp->xb_pktp != NULL); 13687 pktp = xp->xb_pktp; 13688 } else { 13689 pktp = NULL; 13690 } 13691 #endif /* __i386 || __amd64 */ 13692 13693 startblock = xp->xb_blkno; /* Absolute block num. */ 13694 blockcount = SD_BYTES2TGTBLOCKS(un, bp->b_bcount); 13695 13696 cmd_flags = un->un_pkt_flags | (xp->xb_pkt_flags & SD_XB_INITPKT_MASK); 13697 13698 /* 13699 * sd_setup_rw_pkt will determine the appropriate CDB group to use, 13700 * call scsi_init_pkt, and build the CDB. 13701 */ 13702 rval = sd_setup_rw_pkt(un, &pktp, bp, 13703 cmd_flags, sdrunout, (caddr_t)un, 13704 startblock, blockcount); 13705 13706 if (rval == 0) { 13707 /* 13708 * Success. 13709 * 13710 * If partial DMA is being used and required for this transfer. 13711 * set it up here. 13712 */ 13713 if ((un->un_pkt_flags & PKT_DMA_PARTIAL) != 0 && 13714 (pktp->pkt_resid != 0)) { 13715 13716 /* 13717 * Save the CDB length and pkt_resid for the 13718 * next xfer 13719 */ 13720 xp->xb_dma_resid = pktp->pkt_resid; 13721 13722 /* rezero resid */ 13723 pktp->pkt_resid = 0; 13724 13725 } else { 13726 xp->xb_dma_resid = 0; 13727 } 13728 13729 pktp->pkt_flags = un->un_tagflags; 13730 pktp->pkt_time = un->un_cmd_timeout; 13731 pktp->pkt_comp = sdintr; 13732 13733 pktp->pkt_private = bp; 13734 *pktpp = pktp; 13735 13736 SD_TRACE(SD_LOG_IO_CORE, un, 13737 "sd_initpkt_for_buf: exit: buf:0x%p\n", bp); 13738 13739 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 13740 xp->xb_pkt_flags &= ~SD_XB_DMA_FREED; 13741 #endif 13742 13743 mutex_enter(SD_MUTEX(un)); 13744 return (SD_PKT_ALLOC_SUCCESS); 13745 13746 } 13747 13748 /* 13749 * SD_PKT_ALLOC_FAILURE is the only expected failure code 13750 * from sd_setup_rw_pkt. 13751 */ 13752 ASSERT(rval == SD_PKT_ALLOC_FAILURE); 13753 13754 if (rval == SD_PKT_ALLOC_FAILURE) { 13755 *pktpp = NULL; 13756 /* 13757 * Set the driver state to RWAIT to indicate the driver 13758 * is waiting on resource allocations. The driver will not 13759 * suspend, pm_suspend, or detatch while the state is RWAIT. 13760 */ 13761 mutex_enter(SD_MUTEX(un)); 13762 New_state(un, SD_STATE_RWAIT); 13763 13764 SD_ERROR(SD_LOG_IO_CORE, un, 13765 "sd_initpkt_for_buf: No pktp. exit bp:0x%p\n", bp); 13766 13767 if ((bp->b_flags & B_ERROR) != 0) { 13768 return (SD_PKT_ALLOC_FAILURE_NO_DMA); 13769 } 13770 return (SD_PKT_ALLOC_FAILURE); 13771 } else { 13772 /* 13773 * PKT_ALLOC_FAILURE_CDB_TOO_SMALL 13774 * 13775 * This should never happen. Maybe someone messed with the 13776 * kernel's minphys? 13777 */ 13778 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 13779 "Request rejected: too large for CDB: " 13780 "lba:0x%08lx len:0x%08lx\n", startblock, blockcount); 13781 SD_ERROR(SD_LOG_IO_CORE, un, 13782 "sd_initpkt_for_buf: No cp. exit bp:0x%p\n", bp); 13783 mutex_enter(SD_MUTEX(un)); 13784 return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL); 13785 13786 } 13787 } 13788 13789 13790 /* 13791 * Function: sd_destroypkt_for_buf 13792 * 13793 * Description: Free the scsi_pkt(9S) for the given bp (buf IO processing). 13794 * 13795 * Context: Kernel thread or interrupt context 13796 */ 13797 13798 static void 13799 sd_destroypkt_for_buf(struct buf *bp) 13800 { 13801 ASSERT(bp != NULL); 13802 ASSERT(SD_GET_UN(bp) != NULL); 13803 13804 SD_TRACE(SD_LOG_IO_CORE, SD_GET_UN(bp), 13805 "sd_destroypkt_for_buf: entry: buf:0x%p\n", bp); 13806 13807 ASSERT(SD_GET_PKTP(bp) != NULL); 13808 scsi_destroy_pkt(SD_GET_PKTP(bp)); 13809 13810 SD_TRACE(SD_LOG_IO_CORE, SD_GET_UN(bp), 13811 "sd_destroypkt_for_buf: exit: buf:0x%p\n", bp); 13812 } 13813 13814 /* 13815 * Function: sd_setup_rw_pkt 13816 * 13817 * Description: Determines appropriate CDB group for the requested LBA 13818 * and transfer length, calls scsi_init_pkt, and builds 13819 * the CDB. Do not use for partial DMA transfers except 13820 * for the initial transfer since the CDB size must 13821 * remain constant. 13822 * 13823 * Context: Kernel thread and may be called from software interrupt 13824 * context as part of a sdrunout callback. This function may not 13825 * block or call routines that block 13826 */ 13827 13828 13829 int 13830 sd_setup_rw_pkt(struct sd_lun *un, 13831 struct scsi_pkt **pktpp, struct buf *bp, int flags, 13832 int (*callback)(caddr_t), caddr_t callback_arg, 13833 diskaddr_t lba, uint32_t blockcount) 13834 { 13835 struct scsi_pkt *return_pktp; 13836 union scsi_cdb *cdbp; 13837 struct sd_cdbinfo *cp = NULL; 13838 int i; 13839 13840 /* 13841 * See which size CDB to use, based upon the request. 13842 */ 13843 for (i = un->un_mincdb; i <= un->un_maxcdb; i++) { 13844 13845 /* 13846 * Check lba and block count against sd_cdbtab limits. 13847 * In the partial DMA case, we have to use the same size 13848 * CDB for all the transfers. Check lba + blockcount 13849 * against the max LBA so we know that segment of the 13850 * transfer can use the CDB we select. 13851 */ 13852 if ((lba + blockcount - 1 <= sd_cdbtab[i].sc_maxlba) && 13853 (blockcount <= sd_cdbtab[i].sc_maxlen)) { 13854 13855 /* 13856 * The command will fit into the CDB type 13857 * specified by sd_cdbtab[i]. 13858 */ 13859 cp = sd_cdbtab + i; 13860 13861 /* 13862 * Call scsi_init_pkt so we can fill in the 13863 * CDB. 13864 */ 13865 return_pktp = scsi_init_pkt(SD_ADDRESS(un), *pktpp, 13866 bp, cp->sc_grpcode, un->un_status_len, 0, 13867 flags, callback, callback_arg); 13868 13869 if (return_pktp != NULL) { 13870 13871 /* 13872 * Return new value of pkt 13873 */ 13874 *pktpp = return_pktp; 13875 13876 /* 13877 * To be safe, zero the CDB insuring there is 13878 * no leftover data from a previous command. 13879 */ 13880 bzero(return_pktp->pkt_cdbp, cp->sc_grpcode); 13881 13882 /* 13883 * Handle partial DMA mapping 13884 */ 13885 if (return_pktp->pkt_resid != 0) { 13886 13887 /* 13888 * Not going to xfer as many blocks as 13889 * originally expected 13890 */ 13891 blockcount -= 13892 SD_BYTES2TGTBLOCKS(un, 13893 return_pktp->pkt_resid); 13894 } 13895 13896 cdbp = (union scsi_cdb *)return_pktp->pkt_cdbp; 13897 13898 /* 13899 * Set command byte based on the CDB 13900 * type we matched. 13901 */ 13902 cdbp->scc_cmd = cp->sc_grpmask | 13903 ((bp->b_flags & B_READ) ? 13904 SCMD_READ : SCMD_WRITE); 13905 13906 SD_FILL_SCSI1_LUN(un, return_pktp); 13907 13908 /* 13909 * Fill in LBA and length 13910 */ 13911 ASSERT((cp->sc_grpcode == CDB_GROUP1) || 13912 (cp->sc_grpcode == CDB_GROUP4) || 13913 (cp->sc_grpcode == CDB_GROUP0) || 13914 (cp->sc_grpcode == CDB_GROUP5)); 13915 13916 if (cp->sc_grpcode == CDB_GROUP1) { 13917 FORMG1ADDR(cdbp, lba); 13918 FORMG1COUNT(cdbp, blockcount); 13919 return (0); 13920 } else if (cp->sc_grpcode == CDB_GROUP4) { 13921 FORMG4LONGADDR(cdbp, lba); 13922 FORMG4COUNT(cdbp, blockcount); 13923 return (0); 13924 } else if (cp->sc_grpcode == CDB_GROUP0) { 13925 FORMG0ADDR(cdbp, lba); 13926 FORMG0COUNT(cdbp, blockcount); 13927 return (0); 13928 } else if (cp->sc_grpcode == CDB_GROUP5) { 13929 FORMG5ADDR(cdbp, lba); 13930 FORMG5COUNT(cdbp, blockcount); 13931 return (0); 13932 } 13933 13934 /* 13935 * It should be impossible to not match one 13936 * of the CDB types above, so we should never 13937 * reach this point. Set the CDB command byte 13938 * to test-unit-ready to avoid writing 13939 * to somewhere we don't intend. 13940 */ 13941 cdbp->scc_cmd = SCMD_TEST_UNIT_READY; 13942 return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL); 13943 } else { 13944 /* 13945 * Couldn't get scsi_pkt 13946 */ 13947 return (SD_PKT_ALLOC_FAILURE); 13948 } 13949 } 13950 } 13951 13952 /* 13953 * None of the available CDB types were suitable. This really 13954 * should never happen: on a 64 bit system we support 13955 * READ16/WRITE16 which will hold an entire 64 bit disk address 13956 * and on a 32 bit system we will refuse to bind to a device 13957 * larger than 2TB so addresses will never be larger than 32 bits. 13958 */ 13959 return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL); 13960 } 13961 13962 /* 13963 * Function: sd_setup_next_rw_pkt 13964 * 13965 * Description: Setup packet for partial DMA transfers, except for the 13966 * initial transfer. sd_setup_rw_pkt should be used for 13967 * the initial transfer. 13968 * 13969 * Context: Kernel thread and may be called from interrupt context. 13970 */ 13971 13972 int 13973 sd_setup_next_rw_pkt(struct sd_lun *un, 13974 struct scsi_pkt *pktp, struct buf *bp, 13975 diskaddr_t lba, uint32_t blockcount) 13976 { 13977 uchar_t com; 13978 union scsi_cdb *cdbp; 13979 uchar_t cdb_group_id; 13980 13981 ASSERT(pktp != NULL); 13982 ASSERT(pktp->pkt_cdbp != NULL); 13983 13984 cdbp = (union scsi_cdb *)pktp->pkt_cdbp; 13985 com = cdbp->scc_cmd; 13986 cdb_group_id = CDB_GROUPID(com); 13987 13988 ASSERT((cdb_group_id == CDB_GROUPID_0) || 13989 (cdb_group_id == CDB_GROUPID_1) || 13990 (cdb_group_id == CDB_GROUPID_4) || 13991 (cdb_group_id == CDB_GROUPID_5)); 13992 13993 /* 13994 * Move pkt to the next portion of the xfer. 13995 * func is NULL_FUNC so we do not have to release 13996 * the disk mutex here. 13997 */ 13998 if (scsi_init_pkt(SD_ADDRESS(un), pktp, bp, 0, 0, 0, 0, 13999 NULL_FUNC, NULL) == pktp) { 14000 /* Success. Handle partial DMA */ 14001 if (pktp->pkt_resid != 0) { 14002 blockcount -= 14003 SD_BYTES2TGTBLOCKS(un, pktp->pkt_resid); 14004 } 14005 14006 cdbp->scc_cmd = com; 14007 SD_FILL_SCSI1_LUN(un, pktp); 14008 if (cdb_group_id == CDB_GROUPID_1) { 14009 FORMG1ADDR(cdbp, lba); 14010 FORMG1COUNT(cdbp, blockcount); 14011 return (0); 14012 } else if (cdb_group_id == CDB_GROUPID_4) { 14013 FORMG4LONGADDR(cdbp, lba); 14014 FORMG4COUNT(cdbp, blockcount); 14015 return (0); 14016 } else if (cdb_group_id == CDB_GROUPID_0) { 14017 FORMG0ADDR(cdbp, lba); 14018 FORMG0COUNT(cdbp, blockcount); 14019 return (0); 14020 } else if (cdb_group_id == CDB_GROUPID_5) { 14021 FORMG5ADDR(cdbp, lba); 14022 FORMG5COUNT(cdbp, blockcount); 14023 return (0); 14024 } 14025 14026 /* Unreachable */ 14027 return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL); 14028 } 14029 14030 /* 14031 * Error setting up next portion of cmd transfer. 14032 * Something is definitely very wrong and this 14033 * should not happen. 14034 */ 14035 return (SD_PKT_ALLOC_FAILURE); 14036 } 14037 14038 /* 14039 * Function: sd_initpkt_for_uscsi 14040 * 14041 * Description: Allocate and initialize for transport a scsi_pkt struct, 14042 * based upon the info specified in the given uscsi_cmd struct. 14043 * 14044 * Return Code: SD_PKT_ALLOC_SUCCESS 14045 * SD_PKT_ALLOC_FAILURE 14046 * SD_PKT_ALLOC_FAILURE_NO_DMA 14047 * SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL 14048 * 14049 * Context: Kernel thread and may be called from software interrupt context 14050 * as part of a sdrunout callback. This function may not block or 14051 * call routines that block 14052 */ 14053 14054 static int 14055 sd_initpkt_for_uscsi(struct buf *bp, struct scsi_pkt **pktpp) 14056 { 14057 struct uscsi_cmd *uscmd; 14058 struct sd_xbuf *xp; 14059 struct scsi_pkt *pktp; 14060 struct sd_lun *un; 14061 uint32_t flags = 0; 14062 14063 ASSERT(bp != NULL); 14064 ASSERT(pktpp != NULL); 14065 xp = SD_GET_XBUF(bp); 14066 ASSERT(xp != NULL); 14067 un = SD_GET_UN(bp); 14068 ASSERT(un != NULL); 14069 ASSERT(mutex_owned(SD_MUTEX(un))); 14070 14071 /* The pointer to the uscsi_cmd struct is expected in xb_pktinfo */ 14072 uscmd = (struct uscsi_cmd *)xp->xb_pktinfo; 14073 ASSERT(uscmd != NULL); 14074 14075 SD_TRACE(SD_LOG_IO_CORE, un, 14076 "sd_initpkt_for_uscsi: entry: buf:0x%p\n", bp); 14077 14078 /* 14079 * Allocate the scsi_pkt for the command. 14080 * Note: If PKT_DMA_PARTIAL flag is set, scsi_vhci binds a path 14081 * during scsi_init_pkt time and will continue to use the 14082 * same path as long as the same scsi_pkt is used without 14083 * intervening scsi_dma_free(). Since uscsi command does 14084 * not call scsi_dmafree() before retry failed command, it 14085 * is necessary to make sure PKT_DMA_PARTIAL flag is NOT 14086 * set such that scsi_vhci can use other available path for 14087 * retry. Besides, ucsci command does not allow DMA breakup, 14088 * so there is no need to set PKT_DMA_PARTIAL flag. 14089 */ 14090 if (uscmd->uscsi_rqlen > SENSE_LENGTH) { 14091 pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, 14092 ((bp->b_bcount != 0) ? bp : NULL), uscmd->uscsi_cdblen, 14093 ((int)(uscmd->uscsi_rqlen) + sizeof (struct scsi_arq_status) 14094 - sizeof (struct scsi_extended_sense)), 0, 14095 (un->un_pkt_flags & ~PKT_DMA_PARTIAL) | PKT_XARQ, 14096 sdrunout, (caddr_t)un); 14097 } else { 14098 pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, 14099 ((bp->b_bcount != 0) ? bp : NULL), uscmd->uscsi_cdblen, 14100 sizeof (struct scsi_arq_status), 0, 14101 (un->un_pkt_flags & ~PKT_DMA_PARTIAL), 14102 sdrunout, (caddr_t)un); 14103 } 14104 14105 if (pktp == NULL) { 14106 *pktpp = NULL; 14107 /* 14108 * Set the driver state to RWAIT to indicate the driver 14109 * is waiting on resource allocations. The driver will not 14110 * suspend, pm_suspend, or detatch while the state is RWAIT. 14111 */ 14112 New_state(un, SD_STATE_RWAIT); 14113 14114 SD_ERROR(SD_LOG_IO_CORE, un, 14115 "sd_initpkt_for_uscsi: No pktp. exit bp:0x%p\n", bp); 14116 14117 if ((bp->b_flags & B_ERROR) != 0) { 14118 return (SD_PKT_ALLOC_FAILURE_NO_DMA); 14119 } 14120 return (SD_PKT_ALLOC_FAILURE); 14121 } 14122 14123 /* 14124 * We do not do DMA breakup for USCSI commands, so return failure 14125 * here if all the needed DMA resources were not allocated. 14126 */ 14127 if ((un->un_pkt_flags & PKT_DMA_PARTIAL) && 14128 (bp->b_bcount != 0) && (pktp->pkt_resid != 0)) { 14129 scsi_destroy_pkt(pktp); 14130 SD_ERROR(SD_LOG_IO_CORE, un, "sd_initpkt_for_uscsi: " 14131 "No partial DMA for USCSI. exit: buf:0x%p\n", bp); 14132 return (SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL); 14133 } 14134 14135 /* Init the cdb from the given uscsi struct */ 14136 (void) scsi_setup_cdb((union scsi_cdb *)pktp->pkt_cdbp, 14137 uscmd->uscsi_cdb[0], 0, 0, 0); 14138 14139 SD_FILL_SCSI1_LUN(un, pktp); 14140 14141 /* 14142 * Set up the optional USCSI flags. See the uscsi (7I) man page 14143 * for listing of the supported flags. 14144 */ 14145 14146 if (uscmd->uscsi_flags & USCSI_SILENT) { 14147 flags |= FLAG_SILENT; 14148 } 14149 14150 if (uscmd->uscsi_flags & USCSI_DIAGNOSE) { 14151 flags |= FLAG_DIAGNOSE; 14152 } 14153 14154 if (uscmd->uscsi_flags & USCSI_ISOLATE) { 14155 flags |= FLAG_ISOLATE; 14156 } 14157 14158 if (un->un_f_is_fibre == FALSE) { 14159 if (uscmd->uscsi_flags & USCSI_RENEGOT) { 14160 flags |= FLAG_RENEGOTIATE_WIDE_SYNC; 14161 } 14162 } 14163 14164 /* 14165 * Set the pkt flags here so we save time later. 14166 * Note: These flags are NOT in the uscsi man page!!! 14167 */ 14168 if (uscmd->uscsi_flags & USCSI_HEAD) { 14169 flags |= FLAG_HEAD; 14170 } 14171 14172 if (uscmd->uscsi_flags & USCSI_NOINTR) { 14173 flags |= FLAG_NOINTR; 14174 } 14175 14176 /* 14177 * For tagged queueing, things get a bit complicated. 14178 * Check first for head of queue and last for ordered queue. 14179 * If neither head nor order, use the default driver tag flags. 14180 */ 14181 if ((uscmd->uscsi_flags & USCSI_NOTAG) == 0) { 14182 if (uscmd->uscsi_flags & USCSI_HTAG) { 14183 flags |= FLAG_HTAG; 14184 } else if (uscmd->uscsi_flags & USCSI_OTAG) { 14185 flags |= FLAG_OTAG; 14186 } else { 14187 flags |= un->un_tagflags & FLAG_TAGMASK; 14188 } 14189 } 14190 14191 if (uscmd->uscsi_flags & USCSI_NODISCON) { 14192 flags = (flags & ~FLAG_TAGMASK) | FLAG_NODISCON; 14193 } 14194 14195 pktp->pkt_flags = flags; 14196 14197 /* Transfer uscsi information to scsi_pkt */ 14198 (void) scsi_uscsi_pktinit(uscmd, pktp); 14199 14200 /* Copy the caller's CDB into the pkt... */ 14201 bcopy(uscmd->uscsi_cdb, pktp->pkt_cdbp, uscmd->uscsi_cdblen); 14202 14203 if (uscmd->uscsi_timeout == 0) { 14204 pktp->pkt_time = un->un_uscsi_timeout; 14205 } else { 14206 pktp->pkt_time = uscmd->uscsi_timeout; 14207 } 14208 14209 /* need it later to identify USCSI request in sdintr */ 14210 xp->xb_pkt_flags |= SD_XB_USCSICMD; 14211 14212 xp->xb_sense_resid = uscmd->uscsi_rqresid; 14213 14214 pktp->pkt_private = bp; 14215 pktp->pkt_comp = sdintr; 14216 *pktpp = pktp; 14217 14218 SD_TRACE(SD_LOG_IO_CORE, un, 14219 "sd_initpkt_for_uscsi: exit: buf:0x%p\n", bp); 14220 14221 return (SD_PKT_ALLOC_SUCCESS); 14222 } 14223 14224 14225 /* 14226 * Function: sd_destroypkt_for_uscsi 14227 * 14228 * Description: Free the scsi_pkt(9S) struct for the given bp, for uscsi 14229 * IOs.. Also saves relevant info into the associated uscsi_cmd 14230 * struct. 14231 * 14232 * Context: May be called under interrupt context 14233 */ 14234 14235 static void 14236 sd_destroypkt_for_uscsi(struct buf *bp) 14237 { 14238 struct uscsi_cmd *uscmd; 14239 struct sd_xbuf *xp; 14240 struct scsi_pkt *pktp; 14241 struct sd_lun *un; 14242 struct sd_uscsi_info *suip; 14243 14244 ASSERT(bp != NULL); 14245 xp = SD_GET_XBUF(bp); 14246 ASSERT(xp != NULL); 14247 un = SD_GET_UN(bp); 14248 ASSERT(un != NULL); 14249 ASSERT(!mutex_owned(SD_MUTEX(un))); 14250 pktp = SD_GET_PKTP(bp); 14251 ASSERT(pktp != NULL); 14252 14253 SD_TRACE(SD_LOG_IO_CORE, un, 14254 "sd_destroypkt_for_uscsi: entry: buf:0x%p\n", bp); 14255 14256 /* The pointer to the uscsi_cmd struct is expected in xb_pktinfo */ 14257 uscmd = (struct uscsi_cmd *)xp->xb_pktinfo; 14258 ASSERT(uscmd != NULL); 14259 14260 /* Save the status and the residual into the uscsi_cmd struct */ 14261 uscmd->uscsi_status = ((*(pktp)->pkt_scbp) & STATUS_MASK); 14262 uscmd->uscsi_resid = bp->b_resid; 14263 14264 /* Transfer scsi_pkt information to uscsi */ 14265 (void) scsi_uscsi_pktfini(pktp, uscmd); 14266 14267 /* 14268 * If enabled, copy any saved sense data into the area specified 14269 * by the uscsi command. 14270 */ 14271 if (((uscmd->uscsi_flags & USCSI_RQENABLE) != 0) && 14272 (uscmd->uscsi_rqlen != 0) && (uscmd->uscsi_rqbuf != NULL)) { 14273 /* 14274 * Note: uscmd->uscsi_rqbuf should always point to a buffer 14275 * at least SENSE_LENGTH bytes in size (see sd_send_scsi_cmd()) 14276 */ 14277 uscmd->uscsi_rqstatus = xp->xb_sense_status; 14278 uscmd->uscsi_rqresid = xp->xb_sense_resid; 14279 if (uscmd->uscsi_rqlen > SENSE_LENGTH) { 14280 bcopy(xp->xb_sense_data, uscmd->uscsi_rqbuf, 14281 MAX_SENSE_LENGTH); 14282 } else { 14283 bcopy(xp->xb_sense_data, uscmd->uscsi_rqbuf, 14284 SENSE_LENGTH); 14285 } 14286 } 14287 /* 14288 * The following assignments are for SCSI FMA. 14289 */ 14290 ASSERT(xp->xb_private != NULL); 14291 suip = (struct sd_uscsi_info *)xp->xb_private; 14292 suip->ui_pkt_reason = pktp->pkt_reason; 14293 suip->ui_pkt_state = pktp->pkt_state; 14294 suip->ui_pkt_statistics = pktp->pkt_statistics; 14295 suip->ui_lba = (uint64_t)SD_GET_BLKNO(bp); 14296 14297 /* We are done with the scsi_pkt; free it now */ 14298 ASSERT(SD_GET_PKTP(bp) != NULL); 14299 scsi_destroy_pkt(SD_GET_PKTP(bp)); 14300 14301 SD_TRACE(SD_LOG_IO_CORE, un, 14302 "sd_destroypkt_for_uscsi: exit: buf:0x%p\n", bp); 14303 } 14304 14305 14306 /* 14307 * Function: sd_bioclone_alloc 14308 * 14309 * Description: Allocate a buf(9S) and init it as per the given buf 14310 * and the various arguments. The associated sd_xbuf 14311 * struct is (nearly) duplicated. The struct buf *bp 14312 * argument is saved in new_xp->xb_private. 14313 * 14314 * Arguments: bp - ptr the the buf(9S) to be "shadowed" 14315 * datalen - size of data area for the shadow bp 14316 * blkno - starting LBA 14317 * func - function pointer for b_iodone in the shadow buf. (May 14318 * be NULL if none.) 14319 * 14320 * Return Code: Pointer to allocates buf(9S) struct 14321 * 14322 * Context: Can sleep. 14323 */ 14324 14325 static struct buf * 14326 sd_bioclone_alloc(struct buf *bp, size_t datalen, daddr_t blkno, 14327 int (*func)(struct buf *)) 14328 { 14329 struct sd_lun *un; 14330 struct sd_xbuf *xp; 14331 struct sd_xbuf *new_xp; 14332 struct buf *new_bp; 14333 14334 ASSERT(bp != NULL); 14335 xp = SD_GET_XBUF(bp); 14336 ASSERT(xp != NULL); 14337 un = SD_GET_UN(bp); 14338 ASSERT(un != NULL); 14339 ASSERT(!mutex_owned(SD_MUTEX(un))); 14340 14341 new_bp = bioclone(bp, 0, datalen, SD_GET_DEV(un), blkno, func, 14342 NULL, KM_SLEEP); 14343 14344 new_bp->b_lblkno = blkno; 14345 14346 /* 14347 * Allocate an xbuf for the shadow bp and copy the contents of the 14348 * original xbuf into it. 14349 */ 14350 new_xp = kmem_alloc(sizeof (struct sd_xbuf), KM_SLEEP); 14351 bcopy(xp, new_xp, sizeof (struct sd_xbuf)); 14352 14353 /* 14354 * The given bp is automatically saved in the xb_private member 14355 * of the new xbuf. Callers are allowed to depend on this. 14356 */ 14357 new_xp->xb_private = bp; 14358 14359 new_bp->b_private = new_xp; 14360 14361 return (new_bp); 14362 } 14363 14364 /* 14365 * Function: sd_shadow_buf_alloc 14366 * 14367 * Description: Allocate a buf(9S) and init it as per the given buf 14368 * and the various arguments. The associated sd_xbuf 14369 * struct is (nearly) duplicated. The struct buf *bp 14370 * argument is saved in new_xp->xb_private. 14371 * 14372 * Arguments: bp - ptr the the buf(9S) to be "shadowed" 14373 * datalen - size of data area for the shadow bp 14374 * bflags - B_READ or B_WRITE (pseudo flag) 14375 * blkno - starting LBA 14376 * func - function pointer for b_iodone in the shadow buf. (May 14377 * be NULL if none.) 14378 * 14379 * Return Code: Pointer to allocates buf(9S) struct 14380 * 14381 * Context: Can sleep. 14382 */ 14383 14384 static struct buf * 14385 sd_shadow_buf_alloc(struct buf *bp, size_t datalen, uint_t bflags, 14386 daddr_t blkno, int (*func)(struct buf *)) 14387 { 14388 struct sd_lun *un; 14389 struct sd_xbuf *xp; 14390 struct sd_xbuf *new_xp; 14391 struct buf *new_bp; 14392 14393 ASSERT(bp != NULL); 14394 xp = SD_GET_XBUF(bp); 14395 ASSERT(xp != NULL); 14396 un = SD_GET_UN(bp); 14397 ASSERT(un != NULL); 14398 ASSERT(!mutex_owned(SD_MUTEX(un))); 14399 14400 if (bp->b_flags & (B_PAGEIO | B_PHYS)) { 14401 bp_mapin(bp); 14402 } 14403 14404 bflags &= (B_READ | B_WRITE); 14405 #if defined(__i386) || defined(__amd64) 14406 new_bp = getrbuf(KM_SLEEP); 14407 new_bp->b_un.b_addr = kmem_zalloc(datalen, KM_SLEEP); 14408 new_bp->b_bcount = datalen; 14409 new_bp->b_flags = bflags | 14410 (bp->b_flags & ~(B_PAGEIO | B_PHYS | B_REMAPPED | B_SHADOW)); 14411 #else 14412 new_bp = scsi_alloc_consistent_buf(SD_ADDRESS(un), NULL, 14413 datalen, bflags, SLEEP_FUNC, NULL); 14414 #endif 14415 new_bp->av_forw = NULL; 14416 new_bp->av_back = NULL; 14417 new_bp->b_dev = bp->b_dev; 14418 new_bp->b_blkno = blkno; 14419 new_bp->b_iodone = func; 14420 new_bp->b_edev = bp->b_edev; 14421 new_bp->b_resid = 0; 14422 14423 /* We need to preserve the B_FAILFAST flag */ 14424 if (bp->b_flags & B_FAILFAST) { 14425 new_bp->b_flags |= B_FAILFAST; 14426 } 14427 14428 /* 14429 * Allocate an xbuf for the shadow bp and copy the contents of the 14430 * original xbuf into it. 14431 */ 14432 new_xp = kmem_alloc(sizeof (struct sd_xbuf), KM_SLEEP); 14433 bcopy(xp, new_xp, sizeof (struct sd_xbuf)); 14434 14435 /* Need later to copy data between the shadow buf & original buf! */ 14436 new_xp->xb_pkt_flags |= PKT_CONSISTENT; 14437 14438 /* 14439 * The given bp is automatically saved in the xb_private member 14440 * of the new xbuf. Callers are allowed to depend on this. 14441 */ 14442 new_xp->xb_private = bp; 14443 14444 new_bp->b_private = new_xp; 14445 14446 return (new_bp); 14447 } 14448 14449 /* 14450 * Function: sd_bioclone_free 14451 * 14452 * Description: Deallocate a buf(9S) that was used for 'shadow' IO operations 14453 * in the larger than partition operation. 14454 * 14455 * Context: May be called under interrupt context 14456 */ 14457 14458 static void 14459 sd_bioclone_free(struct buf *bp) 14460 { 14461 struct sd_xbuf *xp; 14462 14463 ASSERT(bp != NULL); 14464 xp = SD_GET_XBUF(bp); 14465 ASSERT(xp != NULL); 14466 14467 /* 14468 * Call bp_mapout() before freeing the buf, in case a lower 14469 * layer or HBA had done a bp_mapin(). we must do this here 14470 * as we are the "originator" of the shadow buf. 14471 */ 14472 bp_mapout(bp); 14473 14474 /* 14475 * Null out b_iodone before freeing the bp, to ensure that the driver 14476 * never gets confused by a stale value in this field. (Just a little 14477 * extra defensiveness here.) 14478 */ 14479 bp->b_iodone = NULL; 14480 14481 freerbuf(bp); 14482 14483 kmem_free(xp, sizeof (struct sd_xbuf)); 14484 } 14485 14486 /* 14487 * Function: sd_shadow_buf_free 14488 * 14489 * Description: Deallocate a buf(9S) that was used for 'shadow' IO operations. 14490 * 14491 * Context: May be called under interrupt context 14492 */ 14493 14494 static void 14495 sd_shadow_buf_free(struct buf *bp) 14496 { 14497 struct sd_xbuf *xp; 14498 14499 ASSERT(bp != NULL); 14500 xp = SD_GET_XBUF(bp); 14501 ASSERT(xp != NULL); 14502 14503 #if defined(__sparc) 14504 /* 14505 * Call bp_mapout() before freeing the buf, in case a lower 14506 * layer or HBA had done a bp_mapin(). we must do this here 14507 * as we are the "originator" of the shadow buf. 14508 */ 14509 bp_mapout(bp); 14510 #endif 14511 14512 /* 14513 * Null out b_iodone before freeing the bp, to ensure that the driver 14514 * never gets confused by a stale value in this field. (Just a little 14515 * extra defensiveness here.) 14516 */ 14517 bp->b_iodone = NULL; 14518 14519 #if defined(__i386) || defined(__amd64) 14520 kmem_free(bp->b_un.b_addr, bp->b_bcount); 14521 freerbuf(bp); 14522 #else 14523 scsi_free_consistent_buf(bp); 14524 #endif 14525 14526 kmem_free(xp, sizeof (struct sd_xbuf)); 14527 } 14528 14529 14530 /* 14531 * Function: sd_print_transport_rejected_message 14532 * 14533 * Description: This implements the ludicrously complex rules for printing 14534 * a "transport rejected" message. This is to address the 14535 * specific problem of having a flood of this error message 14536 * produced when a failover occurs. 14537 * 14538 * Context: Any. 14539 */ 14540 14541 static void 14542 sd_print_transport_rejected_message(struct sd_lun *un, struct sd_xbuf *xp, 14543 int code) 14544 { 14545 ASSERT(un != NULL); 14546 ASSERT(mutex_owned(SD_MUTEX(un))); 14547 ASSERT(xp != NULL); 14548 14549 /* 14550 * Print the "transport rejected" message under the following 14551 * conditions: 14552 * 14553 * - Whenever the SD_LOGMASK_DIAG bit of sd_level_mask is set 14554 * - The error code from scsi_transport() is NOT a TRAN_FATAL_ERROR. 14555 * - If the error code IS a TRAN_FATAL_ERROR, then the message is 14556 * printed the FIRST time a TRAN_FATAL_ERROR is returned from 14557 * scsi_transport(9F) (which indicates that the target might have 14558 * gone off-line). This uses the un->un_tran_fatal_count 14559 * count, which is incremented whenever a TRAN_FATAL_ERROR is 14560 * received, and reset to zero whenver a TRAN_ACCEPT is returned 14561 * from scsi_transport(). 14562 * 14563 * The FLAG_SILENT in the scsi_pkt must be CLEARED in ALL of 14564 * the preceeding cases in order for the message to be printed. 14565 */ 14566 if (((xp->xb_pktp->pkt_flags & FLAG_SILENT) == 0) && 14567 (SD_FM_LOG(un) == SD_FM_LOG_NSUP)) { 14568 if ((sd_level_mask & SD_LOGMASK_DIAG) || 14569 (code != TRAN_FATAL_ERROR) || 14570 (un->un_tran_fatal_count == 1)) { 14571 switch (code) { 14572 case TRAN_BADPKT: 14573 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 14574 "transport rejected bad packet\n"); 14575 break; 14576 case TRAN_FATAL_ERROR: 14577 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 14578 "transport rejected fatal error\n"); 14579 break; 14580 default: 14581 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 14582 "transport rejected (%d)\n", code); 14583 break; 14584 } 14585 } 14586 } 14587 } 14588 14589 14590 /* 14591 * Function: sd_add_buf_to_waitq 14592 * 14593 * Description: Add the given buf(9S) struct to the wait queue for the 14594 * instance. If sorting is enabled, then the buf is added 14595 * to the queue via an elevator sort algorithm (a la 14596 * disksort(9F)). The SD_GET_BLKNO(bp) is used as the sort key. 14597 * If sorting is not enabled, then the buf is just added 14598 * to the end of the wait queue. 14599 * 14600 * Return Code: void 14601 * 14602 * Context: Does not sleep/block, therefore technically can be called 14603 * from any context. However if sorting is enabled then the 14604 * execution time is indeterminate, and may take long if 14605 * the wait queue grows large. 14606 */ 14607 14608 static void 14609 sd_add_buf_to_waitq(struct sd_lun *un, struct buf *bp) 14610 { 14611 struct buf *ap; 14612 14613 ASSERT(bp != NULL); 14614 ASSERT(un != NULL); 14615 ASSERT(mutex_owned(SD_MUTEX(un))); 14616 14617 /* If the queue is empty, add the buf as the only entry & return. */ 14618 if (un->un_waitq_headp == NULL) { 14619 ASSERT(un->un_waitq_tailp == NULL); 14620 un->un_waitq_headp = un->un_waitq_tailp = bp; 14621 bp->av_forw = NULL; 14622 return; 14623 } 14624 14625 ASSERT(un->un_waitq_tailp != NULL); 14626 14627 /* 14628 * If sorting is disabled, just add the buf to the tail end of 14629 * the wait queue and return. 14630 */ 14631 if (un->un_f_disksort_disabled || un->un_f_enable_rmw) { 14632 un->un_waitq_tailp->av_forw = bp; 14633 un->un_waitq_tailp = bp; 14634 bp->av_forw = NULL; 14635 return; 14636 } 14637 14638 /* 14639 * Sort thru the list of requests currently on the wait queue 14640 * and add the new buf request at the appropriate position. 14641 * 14642 * The un->un_waitq_headp is an activity chain pointer on which 14643 * we keep two queues, sorted in ascending SD_GET_BLKNO() order. The 14644 * first queue holds those requests which are positioned after 14645 * the current SD_GET_BLKNO() (in the first request); the second holds 14646 * requests which came in after their SD_GET_BLKNO() number was passed. 14647 * Thus we implement a one way scan, retracting after reaching 14648 * the end of the drive to the first request on the second 14649 * queue, at which time it becomes the first queue. 14650 * A one-way scan is natural because of the way UNIX read-ahead 14651 * blocks are allocated. 14652 * 14653 * If we lie after the first request, then we must locate the 14654 * second request list and add ourselves to it. 14655 */ 14656 ap = un->un_waitq_headp; 14657 if (SD_GET_BLKNO(bp) < SD_GET_BLKNO(ap)) { 14658 while (ap->av_forw != NULL) { 14659 /* 14660 * Look for an "inversion" in the (normally 14661 * ascending) block numbers. This indicates 14662 * the start of the second request list. 14663 */ 14664 if (SD_GET_BLKNO(ap->av_forw) < SD_GET_BLKNO(ap)) { 14665 /* 14666 * Search the second request list for the 14667 * first request at a larger block number. 14668 * We go before that; however if there is 14669 * no such request, we go at the end. 14670 */ 14671 do { 14672 if (SD_GET_BLKNO(bp) < 14673 SD_GET_BLKNO(ap->av_forw)) { 14674 goto insert; 14675 } 14676 ap = ap->av_forw; 14677 } while (ap->av_forw != NULL); 14678 goto insert; /* after last */ 14679 } 14680 ap = ap->av_forw; 14681 } 14682 14683 /* 14684 * No inversions... we will go after the last, and 14685 * be the first request in the second request list. 14686 */ 14687 goto insert; 14688 } 14689 14690 /* 14691 * Request is at/after the current request... 14692 * sort in the first request list. 14693 */ 14694 while (ap->av_forw != NULL) { 14695 /* 14696 * We want to go after the current request (1) if 14697 * there is an inversion after it (i.e. it is the end 14698 * of the first request list), or (2) if the next 14699 * request is a larger block no. than our request. 14700 */ 14701 if ((SD_GET_BLKNO(ap->av_forw) < SD_GET_BLKNO(ap)) || 14702 (SD_GET_BLKNO(bp) < SD_GET_BLKNO(ap->av_forw))) { 14703 goto insert; 14704 } 14705 ap = ap->av_forw; 14706 } 14707 14708 /* 14709 * Neither a second list nor a larger request, therefore 14710 * we go at the end of the first list (which is the same 14711 * as the end of the whole schebang). 14712 */ 14713 insert: 14714 bp->av_forw = ap->av_forw; 14715 ap->av_forw = bp; 14716 14717 /* 14718 * If we inserted onto the tail end of the waitq, make sure the 14719 * tail pointer is updated. 14720 */ 14721 if (ap == un->un_waitq_tailp) { 14722 un->un_waitq_tailp = bp; 14723 } 14724 } 14725 14726 14727 /* 14728 * Function: sd_start_cmds 14729 * 14730 * Description: Remove and transport cmds from the driver queues. 14731 * 14732 * Arguments: un - pointer to the unit (soft state) struct for the target. 14733 * 14734 * immed_bp - ptr to a buf to be transported immediately. Only 14735 * the immed_bp is transported; bufs on the waitq are not 14736 * processed and the un_retry_bp is not checked. If immed_bp is 14737 * NULL, then normal queue processing is performed. 14738 * 14739 * Context: May be called from kernel thread context, interrupt context, 14740 * or runout callback context. This function may not block or 14741 * call routines that block. 14742 */ 14743 14744 static void 14745 sd_start_cmds(struct sd_lun *un, struct buf *immed_bp) 14746 { 14747 struct sd_xbuf *xp; 14748 struct buf *bp; 14749 void (*statp)(kstat_io_t *); 14750 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 14751 void (*saved_statp)(kstat_io_t *); 14752 #endif 14753 int rval; 14754 struct sd_fm_internal *sfip = NULL; 14755 14756 ASSERT(un != NULL); 14757 ASSERT(mutex_owned(SD_MUTEX(un))); 14758 ASSERT(un->un_ncmds_in_transport >= 0); 14759 ASSERT(un->un_throttle >= 0); 14760 14761 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_start_cmds: entry\n"); 14762 14763 do { 14764 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 14765 saved_statp = NULL; 14766 #endif 14767 14768 /* 14769 * If we are syncing or dumping, fail the command to 14770 * avoid recursively calling back into scsi_transport(). 14771 * The dump I/O itself uses a separate code path so this 14772 * only prevents non-dump I/O from being sent while dumping. 14773 * File system sync takes place before dumping begins. 14774 * During panic, filesystem I/O is allowed provided 14775 * un_in_callback is <= 1. This is to prevent recursion 14776 * such as sd_start_cmds -> scsi_transport -> sdintr -> 14777 * sd_start_cmds and so on. See panic.c for more information 14778 * about the states the system can be in during panic. 14779 */ 14780 if ((un->un_state == SD_STATE_DUMPING) || 14781 (ddi_in_panic() && (un->un_in_callback > 1))) { 14782 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 14783 "sd_start_cmds: panicking\n"); 14784 goto exit; 14785 } 14786 14787 if ((bp = immed_bp) != NULL) { 14788 /* 14789 * We have a bp that must be transported immediately. 14790 * It's OK to transport the immed_bp here without doing 14791 * the throttle limit check because the immed_bp is 14792 * always used in a retry/recovery case. This means 14793 * that we know we are not at the throttle limit by 14794 * virtue of the fact that to get here we must have 14795 * already gotten a command back via sdintr(). This also 14796 * relies on (1) the command on un_retry_bp preventing 14797 * further commands from the waitq from being issued; 14798 * and (2) the code in sd_retry_command checking the 14799 * throttle limit before issuing a delayed or immediate 14800 * retry. This holds even if the throttle limit is 14801 * currently ratcheted down from its maximum value. 14802 */ 14803 statp = kstat_runq_enter; 14804 if (bp == un->un_retry_bp) { 14805 ASSERT((un->un_retry_statp == NULL) || 14806 (un->un_retry_statp == kstat_waitq_enter) || 14807 (un->un_retry_statp == 14808 kstat_runq_back_to_waitq)); 14809 /* 14810 * If the waitq kstat was incremented when 14811 * sd_set_retry_bp() queued this bp for a retry, 14812 * then we must set up statp so that the waitq 14813 * count will get decremented correctly below. 14814 * Also we must clear un->un_retry_statp to 14815 * ensure that we do not act on a stale value 14816 * in this field. 14817 */ 14818 if ((un->un_retry_statp == kstat_waitq_enter) || 14819 (un->un_retry_statp == 14820 kstat_runq_back_to_waitq)) { 14821 statp = kstat_waitq_to_runq; 14822 } 14823 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 14824 saved_statp = un->un_retry_statp; 14825 #endif 14826 un->un_retry_statp = NULL; 14827 14828 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, 14829 "sd_start_cmds: un:0x%p: GOT retry_bp:0x%p " 14830 "un_throttle:%d un_ncmds_in_transport:%d\n", 14831 un, un->un_retry_bp, un->un_throttle, 14832 un->un_ncmds_in_transport); 14833 } else { 14834 SD_TRACE(SD_LOG_IO_CORE, un, "sd_start_cmds: " 14835 "processing priority bp:0x%p\n", bp); 14836 } 14837 14838 } else if ((bp = un->un_waitq_headp) != NULL) { 14839 /* 14840 * A command on the waitq is ready to go, but do not 14841 * send it if: 14842 * 14843 * (1) the throttle limit has been reached, or 14844 * (2) a retry is pending, or 14845 * (3) a START_STOP_UNIT callback pending, or 14846 * (4) a callback for a SD_PATH_DIRECT_PRIORITY 14847 * command is pending. 14848 * 14849 * For all of these conditions, IO processing will 14850 * restart after the condition is cleared. 14851 */ 14852 if (un->un_ncmds_in_transport >= un->un_throttle) { 14853 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 14854 "sd_start_cmds: exiting, " 14855 "throttle limit reached!\n"); 14856 goto exit; 14857 } 14858 if (un->un_retry_bp != NULL) { 14859 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 14860 "sd_start_cmds: exiting, retry pending!\n"); 14861 goto exit; 14862 } 14863 if (un->un_startstop_timeid != NULL) { 14864 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 14865 "sd_start_cmds: exiting, " 14866 "START_STOP pending!\n"); 14867 goto exit; 14868 } 14869 if (un->un_direct_priority_timeid != NULL) { 14870 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 14871 "sd_start_cmds: exiting, " 14872 "SD_PATH_DIRECT_PRIORITY cmd. pending!\n"); 14873 goto exit; 14874 } 14875 14876 /* Dequeue the command */ 14877 un->un_waitq_headp = bp->av_forw; 14878 if (un->un_waitq_headp == NULL) { 14879 un->un_waitq_tailp = NULL; 14880 } 14881 bp->av_forw = NULL; 14882 statp = kstat_waitq_to_runq; 14883 SD_TRACE(SD_LOG_IO_CORE, un, 14884 "sd_start_cmds: processing waitq bp:0x%p\n", bp); 14885 14886 } else { 14887 /* No work to do so bail out now */ 14888 SD_TRACE(SD_LOG_IO_CORE, un, 14889 "sd_start_cmds: no more work, exiting!\n"); 14890 goto exit; 14891 } 14892 14893 /* 14894 * Reset the state to normal. This is the mechanism by which 14895 * the state transitions from either SD_STATE_RWAIT or 14896 * SD_STATE_OFFLINE to SD_STATE_NORMAL. 14897 * If state is SD_STATE_PM_CHANGING then this command is 14898 * part of the device power control and the state must 14899 * not be put back to normal. Doing so would would 14900 * allow new commands to proceed when they shouldn't, 14901 * the device may be going off. 14902 */ 14903 if ((un->un_state != SD_STATE_SUSPENDED) && 14904 (un->un_state != SD_STATE_PM_CHANGING)) { 14905 New_state(un, SD_STATE_NORMAL); 14906 } 14907 14908 xp = SD_GET_XBUF(bp); 14909 ASSERT(xp != NULL); 14910 14911 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 14912 /* 14913 * Allocate the scsi_pkt if we need one, or attach DMA 14914 * resources if we have a scsi_pkt that needs them. The 14915 * latter should only occur for commands that are being 14916 * retried. 14917 */ 14918 if ((xp->xb_pktp == NULL) || 14919 ((xp->xb_pkt_flags & SD_XB_DMA_FREED) != 0)) { 14920 #else 14921 if (xp->xb_pktp == NULL) { 14922 #endif 14923 /* 14924 * There is no scsi_pkt allocated for this buf. Call 14925 * the initpkt function to allocate & init one. 14926 * 14927 * The scsi_init_pkt runout callback functionality is 14928 * implemented as follows: 14929 * 14930 * 1) The initpkt function always calls 14931 * scsi_init_pkt(9F) with sdrunout specified as the 14932 * callback routine. 14933 * 2) A successful packet allocation is initialized and 14934 * the I/O is transported. 14935 * 3) The I/O associated with an allocation resource 14936 * failure is left on its queue to be retried via 14937 * runout or the next I/O. 14938 * 4) The I/O associated with a DMA error is removed 14939 * from the queue and failed with EIO. Processing of 14940 * the transport queues is also halted to be 14941 * restarted via runout or the next I/O. 14942 * 5) The I/O associated with a CDB size or packet 14943 * size error is removed from the queue and failed 14944 * with EIO. Processing of the transport queues is 14945 * continued. 14946 * 14947 * Note: there is no interface for canceling a runout 14948 * callback. To prevent the driver from detaching or 14949 * suspending while a runout is pending the driver 14950 * state is set to SD_STATE_RWAIT 14951 * 14952 * Note: using the scsi_init_pkt callback facility can 14953 * result in an I/O request persisting at the head of 14954 * the list which cannot be satisfied even after 14955 * multiple retries. In the future the driver may 14956 * implement some kind of maximum runout count before 14957 * failing an I/O. 14958 * 14959 * Note: the use of funcp below may seem superfluous, 14960 * but it helps warlock figure out the correct 14961 * initpkt function calls (see [s]sd.wlcmd). 14962 */ 14963 struct scsi_pkt *pktp; 14964 int (*funcp)(struct buf *bp, struct scsi_pkt **pktp); 14965 14966 ASSERT(bp != un->un_rqs_bp); 14967 14968 funcp = sd_initpkt_map[xp->xb_chain_iostart]; 14969 switch ((*funcp)(bp, &pktp)) { 14970 case SD_PKT_ALLOC_SUCCESS: 14971 xp->xb_pktp = pktp; 14972 SD_TRACE(SD_LOG_IO_CORE, un, 14973 "sd_start_cmd: SD_PKT_ALLOC_SUCCESS 0x%p\n", 14974 pktp); 14975 goto got_pkt; 14976 14977 case SD_PKT_ALLOC_FAILURE: 14978 /* 14979 * Temporary (hopefully) resource depletion. 14980 * Since retries and RQS commands always have a 14981 * scsi_pkt allocated, these cases should never 14982 * get here. So the only cases this needs to 14983 * handle is a bp from the waitq (which we put 14984 * back onto the waitq for sdrunout), or a bp 14985 * sent as an immed_bp (which we just fail). 14986 */ 14987 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 14988 "sd_start_cmds: SD_PKT_ALLOC_FAILURE\n"); 14989 14990 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 14991 14992 if (bp == immed_bp) { 14993 /* 14994 * If SD_XB_DMA_FREED is clear, then 14995 * this is a failure to allocate a 14996 * scsi_pkt, and we must fail the 14997 * command. 14998 */ 14999 if ((xp->xb_pkt_flags & 15000 SD_XB_DMA_FREED) == 0) { 15001 break; 15002 } 15003 15004 /* 15005 * If this immediate command is NOT our 15006 * un_retry_bp, then we must fail it. 15007 */ 15008 if (bp != un->un_retry_bp) { 15009 break; 15010 } 15011 15012 /* 15013 * We get here if this cmd is our 15014 * un_retry_bp that was DMAFREED, but 15015 * scsi_init_pkt() failed to reallocate 15016 * DMA resources when we attempted to 15017 * retry it. This can happen when an 15018 * mpxio failover is in progress, but 15019 * we don't want to just fail the 15020 * command in this case. 15021 * 15022 * Use timeout(9F) to restart it after 15023 * a 100ms delay. We don't want to 15024 * let sdrunout() restart it, because 15025 * sdrunout() is just supposed to start 15026 * commands that are sitting on the 15027 * wait queue. The un_retry_bp stays 15028 * set until the command completes, but 15029 * sdrunout can be called many times 15030 * before that happens. Since sdrunout 15031 * cannot tell if the un_retry_bp is 15032 * already in the transport, it could 15033 * end up calling scsi_transport() for 15034 * the un_retry_bp multiple times. 15035 * 15036 * Also: don't schedule the callback 15037 * if some other callback is already 15038 * pending. 15039 */ 15040 if (un->un_retry_statp == NULL) { 15041 /* 15042 * restore the kstat pointer to 15043 * keep kstat counts coherent 15044 * when we do retry the command. 15045 */ 15046 un->un_retry_statp = 15047 saved_statp; 15048 } 15049 15050 if ((un->un_startstop_timeid == NULL) && 15051 (un->un_retry_timeid == NULL) && 15052 (un->un_direct_priority_timeid == 15053 NULL)) { 15054 15055 un->un_retry_timeid = 15056 timeout( 15057 sd_start_retry_command, 15058 un, SD_RESTART_TIMEOUT); 15059 } 15060 goto exit; 15061 } 15062 15063 #else 15064 if (bp == immed_bp) { 15065 break; /* Just fail the command */ 15066 } 15067 #endif 15068 15069 /* Add the buf back to the head of the waitq */ 15070 bp->av_forw = un->un_waitq_headp; 15071 un->un_waitq_headp = bp; 15072 if (un->un_waitq_tailp == NULL) { 15073 un->un_waitq_tailp = bp; 15074 } 15075 goto exit; 15076 15077 case SD_PKT_ALLOC_FAILURE_NO_DMA: 15078 /* 15079 * HBA DMA resource failure. Fail the command 15080 * and continue processing of the queues. 15081 */ 15082 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15083 "sd_start_cmds: " 15084 "SD_PKT_ALLOC_FAILURE_NO_DMA\n"); 15085 break; 15086 15087 case SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL: 15088 /* 15089 * Note:x86: Partial DMA mapping not supported 15090 * for USCSI commands, and all the needed DMA 15091 * resources were not allocated. 15092 */ 15093 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15094 "sd_start_cmds: " 15095 "SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL\n"); 15096 break; 15097 15098 case SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL: 15099 /* 15100 * Note:x86: Request cannot fit into CDB based 15101 * on lba and len. 15102 */ 15103 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15104 "sd_start_cmds: " 15105 "SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL\n"); 15106 break; 15107 15108 default: 15109 /* Should NEVER get here! */ 15110 panic("scsi_initpkt error"); 15111 /*NOTREACHED*/ 15112 } 15113 15114 /* 15115 * Fatal error in allocating a scsi_pkt for this buf. 15116 * Update kstats & return the buf with an error code. 15117 * We must use sd_return_failed_command_no_restart() to 15118 * avoid a recursive call back into sd_start_cmds(). 15119 * However this also means that we must keep processing 15120 * the waitq here in order to avoid stalling. 15121 */ 15122 if (statp == kstat_waitq_to_runq) { 15123 SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp); 15124 } 15125 sd_return_failed_command_no_restart(un, bp, EIO); 15126 if (bp == immed_bp) { 15127 /* immed_bp is gone by now, so clear this */ 15128 immed_bp = NULL; 15129 } 15130 continue; 15131 } 15132 got_pkt: 15133 if (bp == immed_bp) { 15134 /* goto the head of the class.... */ 15135 xp->xb_pktp->pkt_flags |= FLAG_HEAD; 15136 } 15137 15138 un->un_ncmds_in_transport++; 15139 SD_UPDATE_KSTATS(un, statp, bp); 15140 15141 /* 15142 * Call scsi_transport() to send the command to the target. 15143 * According to SCSA architecture, we must drop the mutex here 15144 * before calling scsi_transport() in order to avoid deadlock. 15145 * Note that the scsi_pkt's completion routine can be executed 15146 * (from interrupt context) even before the call to 15147 * scsi_transport() returns. 15148 */ 15149 SD_TRACE(SD_LOG_IO_CORE, un, 15150 "sd_start_cmds: calling scsi_transport()\n"); 15151 DTRACE_PROBE1(scsi__transport__dispatch, struct buf *, bp); 15152 15153 mutex_exit(SD_MUTEX(un)); 15154 rval = scsi_transport(xp->xb_pktp); 15155 mutex_enter(SD_MUTEX(un)); 15156 15157 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15158 "sd_start_cmds: scsi_transport() returned %d\n", rval); 15159 15160 switch (rval) { 15161 case TRAN_ACCEPT: 15162 /* Clear this with every pkt accepted by the HBA */ 15163 un->un_tran_fatal_count = 0; 15164 break; /* Success; try the next cmd (if any) */ 15165 15166 case TRAN_BUSY: 15167 un->un_ncmds_in_transport--; 15168 ASSERT(un->un_ncmds_in_transport >= 0); 15169 15170 /* 15171 * Don't retry request sense, the sense data 15172 * is lost when another request is sent. 15173 * Free up the rqs buf and retry 15174 * the original failed cmd. Update kstat. 15175 */ 15176 if (bp == un->un_rqs_bp) { 15177 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp); 15178 bp = sd_mark_rqs_idle(un, xp); 15179 sd_retry_command(un, bp, SD_RETRIES_STANDARD, 15180 NULL, NULL, EIO, un->un_busy_timeout / 500, 15181 kstat_waitq_enter); 15182 goto exit; 15183 } 15184 15185 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 15186 /* 15187 * Free the DMA resources for the scsi_pkt. This will 15188 * allow mpxio to select another path the next time 15189 * we call scsi_transport() with this scsi_pkt. 15190 * See sdintr() for the rationalization behind this. 15191 */ 15192 if ((un->un_f_is_fibre == TRUE) && 15193 ((xp->xb_pkt_flags & SD_XB_USCSICMD) == 0) && 15194 ((xp->xb_pktp->pkt_flags & FLAG_SENSING) == 0)) { 15195 scsi_dmafree(xp->xb_pktp); 15196 xp->xb_pkt_flags |= SD_XB_DMA_FREED; 15197 } 15198 #endif 15199 15200 if (SD_IS_DIRECT_PRIORITY(SD_GET_XBUF(bp))) { 15201 /* 15202 * Commands that are SD_PATH_DIRECT_PRIORITY 15203 * are for error recovery situations. These do 15204 * not use the normal command waitq, so if they 15205 * get a TRAN_BUSY we cannot put them back onto 15206 * the waitq for later retry. One possible 15207 * problem is that there could already be some 15208 * other command on un_retry_bp that is waiting 15209 * for this one to complete, so we would be 15210 * deadlocked if we put this command back onto 15211 * the waitq for later retry (since un_retry_bp 15212 * must complete before the driver gets back to 15213 * commands on the waitq). 15214 * 15215 * To avoid deadlock we must schedule a callback 15216 * that will restart this command after a set 15217 * interval. This should keep retrying for as 15218 * long as the underlying transport keeps 15219 * returning TRAN_BUSY (just like for other 15220 * commands). Use the same timeout interval as 15221 * for the ordinary TRAN_BUSY retry. 15222 */ 15223 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15224 "sd_start_cmds: scsi_transport() returned " 15225 "TRAN_BUSY for DIRECT_PRIORITY cmd!\n"); 15226 15227 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp); 15228 un->un_direct_priority_timeid = 15229 timeout(sd_start_direct_priority_command, 15230 bp, un->un_busy_timeout / 500); 15231 15232 goto exit; 15233 } 15234 15235 /* 15236 * For TRAN_BUSY, we want to reduce the throttle value, 15237 * unless we are retrying a command. 15238 */ 15239 if (bp != un->un_retry_bp) { 15240 sd_reduce_throttle(un, SD_THROTTLE_TRAN_BUSY); 15241 } 15242 15243 /* 15244 * Set up the bp to be tried again 10 ms later. 15245 * Note:x86: Is there a timeout value in the sd_lun 15246 * for this condition? 15247 */ 15248 sd_set_retry_bp(un, bp, un->un_busy_timeout / 500, 15249 kstat_runq_back_to_waitq); 15250 goto exit; 15251 15252 case TRAN_FATAL_ERROR: 15253 un->un_tran_fatal_count++; 15254 /* FALLTHRU */ 15255 15256 case TRAN_BADPKT: 15257 default: 15258 un->un_ncmds_in_transport--; 15259 ASSERT(un->un_ncmds_in_transport >= 0); 15260 15261 /* 15262 * If this is our REQUEST SENSE command with a 15263 * transport error, we must get back the pointers 15264 * to the original buf, and mark the REQUEST 15265 * SENSE command as "available". 15266 */ 15267 if (bp == un->un_rqs_bp) { 15268 bp = sd_mark_rqs_idle(un, xp); 15269 xp = SD_GET_XBUF(bp); 15270 } else { 15271 /* 15272 * Legacy behavior: do not update transport 15273 * error count for request sense commands. 15274 */ 15275 SD_UPDATE_ERRSTATS(un, sd_transerrs); 15276 } 15277 15278 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp); 15279 sd_print_transport_rejected_message(un, xp, rval); 15280 15281 /* 15282 * This command will be terminated by SD driver due 15283 * to a fatal transport error. We should post 15284 * ereport.io.scsi.cmd.disk.tran with driver-assessment 15285 * of "fail" for any command to indicate this 15286 * situation. 15287 */ 15288 if (xp->xb_ena > 0) { 15289 ASSERT(un->un_fm_private != NULL); 15290 sfip = un->un_fm_private; 15291 sfip->fm_ssc.ssc_flags |= SSC_FLAGS_TRAN_ABORT; 15292 sd_ssc_extract_info(&sfip->fm_ssc, un, 15293 xp->xb_pktp, bp, xp); 15294 sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_FATAL); 15295 } 15296 15297 /* 15298 * We must use sd_return_failed_command_no_restart() to 15299 * avoid a recursive call back into sd_start_cmds(). 15300 * However this also means that we must keep processing 15301 * the waitq here in order to avoid stalling. 15302 */ 15303 sd_return_failed_command_no_restart(un, bp, EIO); 15304 15305 /* 15306 * Notify any threads waiting in sd_ddi_suspend() that 15307 * a command completion has occurred. 15308 */ 15309 if (un->un_state == SD_STATE_SUSPENDED) { 15310 cv_broadcast(&un->un_disk_busy_cv); 15311 } 15312 15313 if (bp == immed_bp) { 15314 /* immed_bp is gone by now, so clear this */ 15315 immed_bp = NULL; 15316 } 15317 break; 15318 } 15319 15320 } while (immed_bp == NULL); 15321 15322 exit: 15323 ASSERT(mutex_owned(SD_MUTEX(un))); 15324 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_start_cmds: exit\n"); 15325 } 15326 15327 15328 /* 15329 * Function: sd_return_command 15330 * 15331 * Description: Returns a command to its originator (with or without an 15332 * error). Also starts commands waiting to be transported 15333 * to the target. 15334 * 15335 * Context: May be called from interrupt, kernel, or timeout context 15336 */ 15337 15338 static void 15339 sd_return_command(struct sd_lun *un, struct buf *bp) 15340 { 15341 struct sd_xbuf *xp; 15342 struct scsi_pkt *pktp; 15343 struct sd_fm_internal *sfip; 15344 15345 ASSERT(bp != NULL); 15346 ASSERT(un != NULL); 15347 ASSERT(mutex_owned(SD_MUTEX(un))); 15348 ASSERT(bp != un->un_rqs_bp); 15349 xp = SD_GET_XBUF(bp); 15350 ASSERT(xp != NULL); 15351 15352 pktp = SD_GET_PKTP(bp); 15353 sfip = (struct sd_fm_internal *)un->un_fm_private; 15354 ASSERT(sfip != NULL); 15355 15356 SD_TRACE(SD_LOG_IO_CORE, un, "sd_return_command: entry\n"); 15357 15358 /* 15359 * Note: check for the "sdrestart failed" case. 15360 */ 15361 if ((un->un_partial_dma_supported == 1) && 15362 ((xp->xb_pkt_flags & SD_XB_USCSICMD) != SD_XB_USCSICMD) && 15363 (geterror(bp) == 0) && (xp->xb_dma_resid != 0) && 15364 (xp->xb_pktp->pkt_resid == 0)) { 15365 15366 if (sd_setup_next_xfer(un, bp, pktp, xp) != 0) { 15367 /* 15368 * Successfully set up next portion of cmd 15369 * transfer, try sending it 15370 */ 15371 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, 15372 NULL, NULL, 0, (clock_t)0, NULL); 15373 sd_start_cmds(un, NULL); 15374 return; /* Note:x86: need a return here? */ 15375 } 15376 } 15377 15378 /* 15379 * If this is the failfast bp, clear it from un_failfast_bp. This 15380 * can happen if upon being re-tried the failfast bp either 15381 * succeeded or encountered another error (possibly even a different 15382 * error than the one that precipitated the failfast state, but in 15383 * that case it would have had to exhaust retries as well). Regardless, 15384 * this should not occur whenever the instance is in the active 15385 * failfast state. 15386 */ 15387 if (bp == un->un_failfast_bp) { 15388 ASSERT(un->un_failfast_state == SD_FAILFAST_INACTIVE); 15389 un->un_failfast_bp = NULL; 15390 } 15391 15392 /* 15393 * Clear the failfast state upon successful completion of ANY cmd. 15394 */ 15395 if (bp->b_error == 0) { 15396 un->un_failfast_state = SD_FAILFAST_INACTIVE; 15397 /* 15398 * If this is a successful command, but used to be retried, 15399 * we will take it as a recovered command and post an 15400 * ereport with driver-assessment of "recovered". 15401 */ 15402 if (xp->xb_ena > 0) { 15403 sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp); 15404 sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_RECOVERY); 15405 } 15406 } else { 15407 /* 15408 * If this is a failed non-USCSI command we will post an 15409 * ereport with driver-assessment set accordingly("fail" or 15410 * "fatal"). 15411 */ 15412 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 15413 sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp); 15414 sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_FATAL); 15415 } 15416 } 15417 15418 /* 15419 * This is used if the command was retried one or more times. Show that 15420 * we are done with it, and allow processing of the waitq to resume. 15421 */ 15422 if (bp == un->un_retry_bp) { 15423 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15424 "sd_return_command: un:0x%p: " 15425 "RETURNING retry_bp:0x%p\n", un, un->un_retry_bp); 15426 un->un_retry_bp = NULL; 15427 un->un_retry_statp = NULL; 15428 } 15429 15430 SD_UPDATE_RDWR_STATS(un, bp); 15431 SD_UPDATE_PARTITION_STATS(un, bp); 15432 15433 switch (un->un_state) { 15434 case SD_STATE_SUSPENDED: 15435 /* 15436 * Notify any threads waiting in sd_ddi_suspend() that 15437 * a command completion has occurred. 15438 */ 15439 cv_broadcast(&un->un_disk_busy_cv); 15440 break; 15441 default: 15442 sd_start_cmds(un, NULL); 15443 break; 15444 } 15445 15446 /* Return this command up the iodone chain to its originator. */ 15447 mutex_exit(SD_MUTEX(un)); 15448 15449 (*(sd_destroypkt_map[xp->xb_chain_iodone]))(bp); 15450 xp->xb_pktp = NULL; 15451 15452 SD_BEGIN_IODONE(xp->xb_chain_iodone, un, bp); 15453 15454 ASSERT(!mutex_owned(SD_MUTEX(un))); 15455 mutex_enter(SD_MUTEX(un)); 15456 15457 SD_TRACE(SD_LOG_IO_CORE, un, "sd_return_command: exit\n"); 15458 } 15459 15460 15461 /* 15462 * Function: sd_return_failed_command 15463 * 15464 * Description: Command completion when an error occurred. 15465 * 15466 * Context: May be called from interrupt context 15467 */ 15468 15469 static void 15470 sd_return_failed_command(struct sd_lun *un, struct buf *bp, int errcode) 15471 { 15472 ASSERT(bp != NULL); 15473 ASSERT(un != NULL); 15474 ASSERT(mutex_owned(SD_MUTEX(un))); 15475 15476 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15477 "sd_return_failed_command: entry\n"); 15478 15479 /* 15480 * b_resid could already be nonzero due to a partial data 15481 * transfer, so do not change it here. 15482 */ 15483 SD_BIOERROR(bp, errcode); 15484 15485 sd_return_command(un, bp); 15486 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15487 "sd_return_failed_command: exit\n"); 15488 } 15489 15490 15491 /* 15492 * Function: sd_return_failed_command_no_restart 15493 * 15494 * Description: Same as sd_return_failed_command, but ensures that no 15495 * call back into sd_start_cmds will be issued. 15496 * 15497 * Context: May be called from interrupt context 15498 */ 15499 15500 static void 15501 sd_return_failed_command_no_restart(struct sd_lun *un, struct buf *bp, 15502 int errcode) 15503 { 15504 struct sd_xbuf *xp; 15505 15506 ASSERT(bp != NULL); 15507 ASSERT(un != NULL); 15508 ASSERT(mutex_owned(SD_MUTEX(un))); 15509 xp = SD_GET_XBUF(bp); 15510 ASSERT(xp != NULL); 15511 ASSERT(errcode != 0); 15512 15513 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15514 "sd_return_failed_command_no_restart: entry\n"); 15515 15516 /* 15517 * b_resid could already be nonzero due to a partial data 15518 * transfer, so do not change it here. 15519 */ 15520 SD_BIOERROR(bp, errcode); 15521 15522 /* 15523 * If this is the failfast bp, clear it. This can happen if the 15524 * failfast bp encounterd a fatal error when we attempted to 15525 * re-try it (such as a scsi_transport(9F) failure). However 15526 * we should NOT be in an active failfast state if the failfast 15527 * bp is not NULL. 15528 */ 15529 if (bp == un->un_failfast_bp) { 15530 ASSERT(un->un_failfast_state == SD_FAILFAST_INACTIVE); 15531 un->un_failfast_bp = NULL; 15532 } 15533 15534 if (bp == un->un_retry_bp) { 15535 /* 15536 * This command was retried one or more times. Show that we are 15537 * done with it, and allow processing of the waitq to resume. 15538 */ 15539 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15540 "sd_return_failed_command_no_restart: " 15541 " un:0x%p: RETURNING retry_bp:0x%p\n", un, un->un_retry_bp); 15542 un->un_retry_bp = NULL; 15543 un->un_retry_statp = NULL; 15544 } 15545 15546 SD_UPDATE_RDWR_STATS(un, bp); 15547 SD_UPDATE_PARTITION_STATS(un, bp); 15548 15549 mutex_exit(SD_MUTEX(un)); 15550 15551 if (xp->xb_pktp != NULL) { 15552 (*(sd_destroypkt_map[xp->xb_chain_iodone]))(bp); 15553 xp->xb_pktp = NULL; 15554 } 15555 15556 SD_BEGIN_IODONE(xp->xb_chain_iodone, un, bp); 15557 15558 mutex_enter(SD_MUTEX(un)); 15559 15560 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15561 "sd_return_failed_command_no_restart: exit\n"); 15562 } 15563 15564 15565 /* 15566 * Function: sd_retry_command 15567 * 15568 * Description: queue up a command for retry, or (optionally) fail it 15569 * if retry counts are exhausted. 15570 * 15571 * Arguments: un - Pointer to the sd_lun struct for the target. 15572 * 15573 * bp - Pointer to the buf for the command to be retried. 15574 * 15575 * retry_check_flag - Flag to see which (if any) of the retry 15576 * counts should be decremented/checked. If the indicated 15577 * retry count is exhausted, then the command will not be 15578 * retried; it will be failed instead. This should use a 15579 * value equal to one of the following: 15580 * 15581 * SD_RETRIES_NOCHECK 15582 * SD_RESD_RETRIES_STANDARD 15583 * SD_RETRIES_VICTIM 15584 * 15585 * Optionally may be bitwise-OR'ed with SD_RETRIES_ISOLATE 15586 * if the check should be made to see of FLAG_ISOLATE is set 15587 * in the pkt. If FLAG_ISOLATE is set, then the command is 15588 * not retried, it is simply failed. 15589 * 15590 * user_funcp - Ptr to function to call before dispatching the 15591 * command. May be NULL if no action needs to be performed. 15592 * (Primarily intended for printing messages.) 15593 * 15594 * user_arg - Optional argument to be passed along to 15595 * the user_funcp call. 15596 * 15597 * failure_code - errno return code to set in the bp if the 15598 * command is going to be failed. 15599 * 15600 * retry_delay - Retry delay interval in (clock_t) units. May 15601 * be zero which indicates that the retry should be retried 15602 * immediately (ie, without an intervening delay). 15603 * 15604 * statp - Ptr to kstat function to be updated if the command 15605 * is queued for a delayed retry. May be NULL if no kstat 15606 * update is desired. 15607 * 15608 * Context: May be called from interrupt context. 15609 */ 15610 15611 static void 15612 sd_retry_command(struct sd_lun *un, struct buf *bp, int retry_check_flag, 15613 void (*user_funcp)(struct sd_lun *un, struct buf *bp, void *argp, int code), 15614 void *user_arg, int failure_code, clock_t retry_delay, 15615 void (*statp)(kstat_io_t *)) 15616 { 15617 struct sd_xbuf *xp; 15618 struct scsi_pkt *pktp; 15619 struct sd_fm_internal *sfip; 15620 15621 ASSERT(un != NULL); 15622 ASSERT(mutex_owned(SD_MUTEX(un))); 15623 ASSERT(bp != NULL); 15624 xp = SD_GET_XBUF(bp); 15625 ASSERT(xp != NULL); 15626 pktp = SD_GET_PKTP(bp); 15627 ASSERT(pktp != NULL); 15628 15629 sfip = (struct sd_fm_internal *)un->un_fm_private; 15630 ASSERT(sfip != NULL); 15631 15632 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, 15633 "sd_retry_command: entry: bp:0x%p xp:0x%p\n", bp, xp); 15634 15635 /* 15636 * If we are syncing or dumping, fail the command to avoid 15637 * recursively calling back into scsi_transport(). 15638 */ 15639 if (ddi_in_panic()) { 15640 goto fail_command_no_log; 15641 } 15642 15643 /* 15644 * We should never be be retrying a command with FLAG_DIAGNOSE set, so 15645 * log an error and fail the command. 15646 */ 15647 if ((pktp->pkt_flags & FLAG_DIAGNOSE) != 0) { 15648 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE, 15649 "ERROR, retrying FLAG_DIAGNOSE command.\n"); 15650 sd_dump_memory(un, SD_LOG_IO, "CDB", 15651 (uchar_t *)pktp->pkt_cdbp, CDB_SIZE, SD_LOG_HEX); 15652 sd_dump_memory(un, SD_LOG_IO, "Sense Data", 15653 (uchar_t *)xp->xb_sense_data, SENSE_LENGTH, SD_LOG_HEX); 15654 goto fail_command; 15655 } 15656 15657 /* 15658 * If we are suspended, then put the command onto head of the 15659 * wait queue since we don't want to start more commands, and 15660 * clear the un_retry_bp. Next time when we are resumed, will 15661 * handle the command in the wait queue. 15662 */ 15663 switch (un->un_state) { 15664 case SD_STATE_SUSPENDED: 15665 case SD_STATE_DUMPING: 15666 bp->av_forw = un->un_waitq_headp; 15667 un->un_waitq_headp = bp; 15668 if (un->un_waitq_tailp == NULL) { 15669 un->un_waitq_tailp = bp; 15670 } 15671 if (bp == un->un_retry_bp) { 15672 un->un_retry_bp = NULL; 15673 un->un_retry_statp = NULL; 15674 } 15675 SD_UPDATE_KSTATS(un, kstat_waitq_enter, bp); 15676 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: " 15677 "exiting; cmd bp:0x%p requeued for SUSPEND/DUMP\n", bp); 15678 return; 15679 default: 15680 break; 15681 } 15682 15683 /* 15684 * If the caller wants us to check FLAG_ISOLATE, then see if that 15685 * is set; if it is then we do not want to retry the command. 15686 * Normally, FLAG_ISOLATE is only used with USCSI cmds. 15687 */ 15688 if ((retry_check_flag & SD_RETRIES_ISOLATE) != 0) { 15689 if ((pktp->pkt_flags & FLAG_ISOLATE) != 0) { 15690 goto fail_command; 15691 } 15692 } 15693 15694 15695 /* 15696 * If SD_RETRIES_FAILFAST is set, it indicates that either a 15697 * command timeout or a selection timeout has occurred. This means 15698 * that we were unable to establish an kind of communication with 15699 * the target, and subsequent retries and/or commands are likely 15700 * to encounter similar results and take a long time to complete. 15701 * 15702 * If this is a failfast error condition, we need to update the 15703 * failfast state, even if this bp does not have B_FAILFAST set. 15704 */ 15705 if (retry_check_flag & SD_RETRIES_FAILFAST) { 15706 if (un->un_failfast_state == SD_FAILFAST_ACTIVE) { 15707 ASSERT(un->un_failfast_bp == NULL); 15708 /* 15709 * If we are already in the active failfast state, and 15710 * another failfast error condition has been detected, 15711 * then fail this command if it has B_FAILFAST set. 15712 * If B_FAILFAST is clear, then maintain the legacy 15713 * behavior of retrying heroically, even tho this will 15714 * take a lot more time to fail the command. 15715 */ 15716 if (bp->b_flags & B_FAILFAST) { 15717 goto fail_command; 15718 } 15719 } else { 15720 /* 15721 * We're not in the active failfast state, but we 15722 * have a failfast error condition, so we must begin 15723 * transition to the next state. We do this regardless 15724 * of whether or not this bp has B_FAILFAST set. 15725 */ 15726 if (un->un_failfast_bp == NULL) { 15727 /* 15728 * This is the first bp to meet a failfast 15729 * condition so save it on un_failfast_bp & 15730 * do normal retry processing. Do not enter 15731 * active failfast state yet. This marks 15732 * entry into the "failfast pending" state. 15733 */ 15734 un->un_failfast_bp = bp; 15735 15736 } else if (un->un_failfast_bp == bp) { 15737 /* 15738 * This is the second time *this* bp has 15739 * encountered a failfast error condition, 15740 * so enter active failfast state & flush 15741 * queues as appropriate. 15742 */ 15743 un->un_failfast_state = SD_FAILFAST_ACTIVE; 15744 un->un_failfast_bp = NULL; 15745 sd_failfast_flushq(un); 15746 15747 /* 15748 * Fail this bp now if B_FAILFAST set; 15749 * otherwise continue with retries. (It would 15750 * be pretty ironic if this bp succeeded on a 15751 * subsequent retry after we just flushed all 15752 * the queues). 15753 */ 15754 if (bp->b_flags & B_FAILFAST) { 15755 goto fail_command; 15756 } 15757 15758 #if !defined(lint) && !defined(__lint) 15759 } else { 15760 /* 15761 * If neither of the preceeding conditionals 15762 * was true, it means that there is some 15763 * *other* bp that has met an inital failfast 15764 * condition and is currently either being 15765 * retried or is waiting to be retried. In 15766 * that case we should perform normal retry 15767 * processing on *this* bp, since there is a 15768 * chance that the current failfast condition 15769 * is transient and recoverable. If that does 15770 * not turn out to be the case, then retries 15771 * will be cleared when the wait queue is 15772 * flushed anyway. 15773 */ 15774 #endif 15775 } 15776 } 15777 } else { 15778 /* 15779 * SD_RETRIES_FAILFAST is clear, which indicates that we 15780 * likely were able to at least establish some level of 15781 * communication with the target and subsequent commands 15782 * and/or retries are likely to get through to the target, 15783 * In this case we want to be aggressive about clearing 15784 * the failfast state. Note that this does not affect 15785 * the "failfast pending" condition. 15786 */ 15787 un->un_failfast_state = SD_FAILFAST_INACTIVE; 15788 } 15789 15790 15791 /* 15792 * Check the specified retry count to see if we can still do 15793 * any retries with this pkt before we should fail it. 15794 */ 15795 switch (retry_check_flag & SD_RETRIES_MASK) { 15796 case SD_RETRIES_VICTIM: 15797 /* 15798 * Check the victim retry count. If exhausted, then fall 15799 * thru & check against the standard retry count. 15800 */ 15801 if (xp->xb_victim_retry_count < un->un_victim_retry_count) { 15802 /* Increment count & proceed with the retry */ 15803 xp->xb_victim_retry_count++; 15804 break; 15805 } 15806 /* Victim retries exhausted, fall back to std. retries... */ 15807 /* FALLTHRU */ 15808 15809 case SD_RETRIES_STANDARD: 15810 if (xp->xb_retry_count >= un->un_retry_count) { 15811 /* Retries exhausted, fail the command */ 15812 SD_TRACE(SD_LOG_IO_CORE, un, 15813 "sd_retry_command: retries exhausted!\n"); 15814 /* 15815 * update b_resid for failed SCMD_READ & SCMD_WRITE 15816 * commands with nonzero pkt_resid. 15817 */ 15818 if ((pktp->pkt_reason == CMD_CMPLT) && 15819 (SD_GET_PKT_STATUS(pktp) == STATUS_GOOD) && 15820 (pktp->pkt_resid != 0)) { 15821 uchar_t op = SD_GET_PKT_OPCODE(pktp) & 0x1F; 15822 if ((op == SCMD_READ) || (op == SCMD_WRITE)) { 15823 SD_UPDATE_B_RESID(bp, pktp); 15824 } 15825 } 15826 goto fail_command; 15827 } 15828 xp->xb_retry_count++; 15829 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15830 "sd_retry_command: retry count:%d\n", xp->xb_retry_count); 15831 break; 15832 15833 case SD_RETRIES_UA: 15834 if (xp->xb_ua_retry_count >= sd_ua_retry_count) { 15835 /* Retries exhausted, fail the command */ 15836 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 15837 "Unit Attention retries exhausted. " 15838 "Check the target.\n"); 15839 goto fail_command; 15840 } 15841 xp->xb_ua_retry_count++; 15842 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15843 "sd_retry_command: retry count:%d\n", 15844 xp->xb_ua_retry_count); 15845 break; 15846 15847 case SD_RETRIES_BUSY: 15848 if (xp->xb_retry_count >= un->un_busy_retry_count) { 15849 /* Retries exhausted, fail the command */ 15850 SD_TRACE(SD_LOG_IO_CORE, un, 15851 "sd_retry_command: retries exhausted!\n"); 15852 goto fail_command; 15853 } 15854 xp->xb_retry_count++; 15855 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15856 "sd_retry_command: retry count:%d\n", xp->xb_retry_count); 15857 break; 15858 15859 case SD_RETRIES_NOCHECK: 15860 default: 15861 /* No retry count to check. Just proceed with the retry */ 15862 break; 15863 } 15864 15865 xp->xb_pktp->pkt_flags |= FLAG_HEAD; 15866 15867 /* 15868 * If this is a non-USCSI command being retried 15869 * during execution last time, we should post an ereport with 15870 * driver-assessment of the value "retry". 15871 * For partial DMA, request sense and STATUS_QFULL, there are no 15872 * hardware errors, we bypass ereport posting. 15873 */ 15874 if (failure_code != 0) { 15875 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 15876 sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp); 15877 sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_RETRY); 15878 } 15879 } 15880 15881 /* 15882 * If we were given a zero timeout, we must attempt to retry the 15883 * command immediately (ie, without a delay). 15884 */ 15885 if (retry_delay == 0) { 15886 /* 15887 * Check some limiting conditions to see if we can actually 15888 * do the immediate retry. If we cannot, then we must 15889 * fall back to queueing up a delayed retry. 15890 */ 15891 if (un->un_ncmds_in_transport >= un->un_throttle) { 15892 /* 15893 * We are at the throttle limit for the target, 15894 * fall back to delayed retry. 15895 */ 15896 retry_delay = un->un_busy_timeout; 15897 statp = kstat_waitq_enter; 15898 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15899 "sd_retry_command: immed. retry hit " 15900 "throttle!\n"); 15901 } else { 15902 /* 15903 * We're clear to proceed with the immediate retry. 15904 * First call the user-provided function (if any) 15905 */ 15906 if (user_funcp != NULL) { 15907 (*user_funcp)(un, bp, user_arg, 15908 SD_IMMEDIATE_RETRY_ISSUED); 15909 #ifdef __lock_lint 15910 sd_print_incomplete_msg(un, bp, user_arg, 15911 SD_IMMEDIATE_RETRY_ISSUED); 15912 sd_print_cmd_incomplete_msg(un, bp, user_arg, 15913 SD_IMMEDIATE_RETRY_ISSUED); 15914 sd_print_sense_failed_msg(un, bp, user_arg, 15915 SD_IMMEDIATE_RETRY_ISSUED); 15916 #endif 15917 } 15918 15919 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15920 "sd_retry_command: issuing immediate retry\n"); 15921 15922 /* 15923 * Call sd_start_cmds() to transport the command to 15924 * the target. 15925 */ 15926 sd_start_cmds(un, bp); 15927 15928 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15929 "sd_retry_command exit\n"); 15930 return; 15931 } 15932 } 15933 15934 /* 15935 * Set up to retry the command after a delay. 15936 * First call the user-provided function (if any) 15937 */ 15938 if (user_funcp != NULL) { 15939 (*user_funcp)(un, bp, user_arg, SD_DELAYED_RETRY_ISSUED); 15940 } 15941 15942 sd_set_retry_bp(un, bp, retry_delay, statp); 15943 15944 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: exit\n"); 15945 return; 15946 15947 fail_command: 15948 15949 if (user_funcp != NULL) { 15950 (*user_funcp)(un, bp, user_arg, SD_NO_RETRY_ISSUED); 15951 } 15952 15953 fail_command_no_log: 15954 15955 SD_INFO(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15956 "sd_retry_command: returning failed command\n"); 15957 15958 sd_return_failed_command(un, bp, failure_code); 15959 15960 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: exit\n"); 15961 } 15962 15963 15964 /* 15965 * Function: sd_set_retry_bp 15966 * 15967 * Description: Set up the given bp for retry. 15968 * 15969 * Arguments: un - ptr to associated softstate 15970 * bp - ptr to buf(9S) for the command 15971 * retry_delay - time interval before issuing retry (may be 0) 15972 * statp - optional pointer to kstat function 15973 * 15974 * Context: May be called under interrupt context 15975 */ 15976 15977 static void 15978 sd_set_retry_bp(struct sd_lun *un, struct buf *bp, clock_t retry_delay, 15979 void (*statp)(kstat_io_t *)) 15980 { 15981 ASSERT(un != NULL); 15982 ASSERT(mutex_owned(SD_MUTEX(un))); 15983 ASSERT(bp != NULL); 15984 15985 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, 15986 "sd_set_retry_bp: entry: un:0x%p bp:0x%p\n", un, bp); 15987 15988 /* 15989 * Indicate that the command is being retried. This will not allow any 15990 * other commands on the wait queue to be transported to the target 15991 * until this command has been completed (success or failure). The 15992 * "retry command" is not transported to the target until the given 15993 * time delay expires, unless the user specified a 0 retry_delay. 15994 * 15995 * Note: the timeout(9F) callback routine is what actually calls 15996 * sd_start_cmds() to transport the command, with the exception of a 15997 * zero retry_delay. The only current implementor of a zero retry delay 15998 * is the case where a START_STOP_UNIT is sent to spin-up a device. 15999 */ 16000 if (un->un_retry_bp == NULL) { 16001 ASSERT(un->un_retry_statp == NULL); 16002 un->un_retry_bp = bp; 16003 16004 /* 16005 * If the user has not specified a delay the command should 16006 * be queued and no timeout should be scheduled. 16007 */ 16008 if (retry_delay == 0) { 16009 /* 16010 * Save the kstat pointer that will be used in the 16011 * call to SD_UPDATE_KSTATS() below, so that 16012 * sd_start_cmds() can correctly decrement the waitq 16013 * count when it is time to transport this command. 16014 */ 16015 un->un_retry_statp = statp; 16016 goto done; 16017 } 16018 } 16019 16020 if (un->un_retry_bp == bp) { 16021 /* 16022 * Save the kstat pointer that will be used in the call to 16023 * SD_UPDATE_KSTATS() below, so that sd_start_cmds() can 16024 * correctly decrement the waitq count when it is time to 16025 * transport this command. 16026 */ 16027 un->un_retry_statp = statp; 16028 16029 /* 16030 * Schedule a timeout if: 16031 * 1) The user has specified a delay. 16032 * 2) There is not a START_STOP_UNIT callback pending. 16033 * 16034 * If no delay has been specified, then it is up to the caller 16035 * to ensure that IO processing continues without stalling. 16036 * Effectively, this means that the caller will issue the 16037 * required call to sd_start_cmds(). The START_STOP_UNIT 16038 * callback does this after the START STOP UNIT command has 16039 * completed. In either of these cases we should not schedule 16040 * a timeout callback here. Also don't schedule the timeout if 16041 * an SD_PATH_DIRECT_PRIORITY command is waiting to restart. 16042 */ 16043 if ((retry_delay != 0) && (un->un_startstop_timeid == NULL) && 16044 (un->un_direct_priority_timeid == NULL)) { 16045 un->un_retry_timeid = 16046 timeout(sd_start_retry_command, un, retry_delay); 16047 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16048 "sd_set_retry_bp: setting timeout: un: 0x%p" 16049 " bp:0x%p un_retry_timeid:0x%p\n", 16050 un, bp, un->un_retry_timeid); 16051 } 16052 } else { 16053 /* 16054 * We only get in here if there is already another command 16055 * waiting to be retried. In this case, we just put the 16056 * given command onto the wait queue, so it can be transported 16057 * after the current retry command has completed. 16058 * 16059 * Also we have to make sure that if the command at the head 16060 * of the wait queue is the un_failfast_bp, that we do not 16061 * put ahead of it any other commands that are to be retried. 16062 */ 16063 if ((un->un_failfast_bp != NULL) && 16064 (un->un_failfast_bp == un->un_waitq_headp)) { 16065 /* 16066 * Enqueue this command AFTER the first command on 16067 * the wait queue (which is also un_failfast_bp). 16068 */ 16069 bp->av_forw = un->un_waitq_headp->av_forw; 16070 un->un_waitq_headp->av_forw = bp; 16071 if (un->un_waitq_headp == un->un_waitq_tailp) { 16072 un->un_waitq_tailp = bp; 16073 } 16074 } else { 16075 /* Enqueue this command at the head of the waitq. */ 16076 bp->av_forw = un->un_waitq_headp; 16077 un->un_waitq_headp = bp; 16078 if (un->un_waitq_tailp == NULL) { 16079 un->un_waitq_tailp = bp; 16080 } 16081 } 16082 16083 if (statp == NULL) { 16084 statp = kstat_waitq_enter; 16085 } 16086 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16087 "sd_set_retry_bp: un:0x%p already delayed retry\n", un); 16088 } 16089 16090 done: 16091 if (statp != NULL) { 16092 SD_UPDATE_KSTATS(un, statp, bp); 16093 } 16094 16095 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16096 "sd_set_retry_bp: exit un:0x%p\n", un); 16097 } 16098 16099 16100 /* 16101 * Function: sd_start_retry_command 16102 * 16103 * Description: Start the command that has been waiting on the target's 16104 * retry queue. Called from timeout(9F) context after the 16105 * retry delay interval has expired. 16106 * 16107 * Arguments: arg - pointer to associated softstate for the device. 16108 * 16109 * Context: timeout(9F) thread context. May not sleep. 16110 */ 16111 16112 static void 16113 sd_start_retry_command(void *arg) 16114 { 16115 struct sd_lun *un = arg; 16116 16117 ASSERT(un != NULL); 16118 ASSERT(!mutex_owned(SD_MUTEX(un))); 16119 16120 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16121 "sd_start_retry_command: entry\n"); 16122 16123 mutex_enter(SD_MUTEX(un)); 16124 16125 un->un_retry_timeid = NULL; 16126 16127 if (un->un_retry_bp != NULL) { 16128 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16129 "sd_start_retry_command: un:0x%p STARTING bp:0x%p\n", 16130 un, un->un_retry_bp); 16131 sd_start_cmds(un, un->un_retry_bp); 16132 } 16133 16134 mutex_exit(SD_MUTEX(un)); 16135 16136 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16137 "sd_start_retry_command: exit\n"); 16138 } 16139 16140 /* 16141 * Function: sd_rmw_msg_print_handler 16142 * 16143 * Description: If RMW mode is enabled and warning message is triggered 16144 * print I/O count during a fixed interval. 16145 * 16146 * Arguments: arg - pointer to associated softstate for the device. 16147 * 16148 * Context: timeout(9F) thread context. May not sleep. 16149 */ 16150 static void 16151 sd_rmw_msg_print_handler(void *arg) 16152 { 16153 struct sd_lun *un = arg; 16154 16155 ASSERT(un != NULL); 16156 ASSERT(!mutex_owned(SD_MUTEX(un))); 16157 16158 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16159 "sd_rmw_msg_print_handler: entry\n"); 16160 16161 mutex_enter(SD_MUTEX(un)); 16162 16163 if (un->un_rmw_incre_count > 0) { 16164 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 16165 "%"PRIu64" I/O requests are not aligned with %d disk " 16166 "sector size in %ld seconds. They are handled through " 16167 "Read Modify Write but the performance is very low!\n", 16168 un->un_rmw_incre_count, un->un_tgt_blocksize, 16169 drv_hztousec(SD_RMW_MSG_PRINT_TIMEOUT) / 1000000); 16170 un->un_rmw_incre_count = 0; 16171 un->un_rmw_msg_timeid = timeout(sd_rmw_msg_print_handler, 16172 un, SD_RMW_MSG_PRINT_TIMEOUT); 16173 } else { 16174 un->un_rmw_msg_timeid = NULL; 16175 } 16176 16177 mutex_exit(SD_MUTEX(un)); 16178 16179 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16180 "sd_rmw_msg_print_handler: exit\n"); 16181 } 16182 16183 /* 16184 * Function: sd_start_direct_priority_command 16185 * 16186 * Description: Used to re-start an SD_PATH_DIRECT_PRIORITY command that had 16187 * received TRAN_BUSY when we called scsi_transport() to send it 16188 * to the underlying HBA. This function is called from timeout(9F) 16189 * context after the delay interval has expired. 16190 * 16191 * Arguments: arg - pointer to associated buf(9S) to be restarted. 16192 * 16193 * Context: timeout(9F) thread context. May not sleep. 16194 */ 16195 16196 static void 16197 sd_start_direct_priority_command(void *arg) 16198 { 16199 struct buf *priority_bp = arg; 16200 struct sd_lun *un; 16201 16202 ASSERT(priority_bp != NULL); 16203 un = SD_GET_UN(priority_bp); 16204 ASSERT(un != NULL); 16205 ASSERT(!mutex_owned(SD_MUTEX(un))); 16206 16207 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16208 "sd_start_direct_priority_command: entry\n"); 16209 16210 mutex_enter(SD_MUTEX(un)); 16211 un->un_direct_priority_timeid = NULL; 16212 sd_start_cmds(un, priority_bp); 16213 mutex_exit(SD_MUTEX(un)); 16214 16215 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16216 "sd_start_direct_priority_command: exit\n"); 16217 } 16218 16219 16220 /* 16221 * Function: sd_send_request_sense_command 16222 * 16223 * Description: Sends a REQUEST SENSE command to the target 16224 * 16225 * Context: May be called from interrupt context. 16226 */ 16227 16228 static void 16229 sd_send_request_sense_command(struct sd_lun *un, struct buf *bp, 16230 struct scsi_pkt *pktp) 16231 { 16232 ASSERT(bp != NULL); 16233 ASSERT(un != NULL); 16234 ASSERT(mutex_owned(SD_MUTEX(un))); 16235 16236 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_send_request_sense_command: " 16237 "entry: buf:0x%p\n", bp); 16238 16239 /* 16240 * If we are syncing or dumping, then fail the command to avoid a 16241 * recursive callback into scsi_transport(). Also fail the command 16242 * if we are suspended (legacy behavior). 16243 */ 16244 if (ddi_in_panic() || (un->un_state == SD_STATE_SUSPENDED) || 16245 (un->un_state == SD_STATE_DUMPING)) { 16246 sd_return_failed_command(un, bp, EIO); 16247 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16248 "sd_send_request_sense_command: syncing/dumping, exit\n"); 16249 return; 16250 } 16251 16252 /* 16253 * Retry the failed command and don't issue the request sense if: 16254 * 1) the sense buf is busy 16255 * 2) we have 1 or more outstanding commands on the target 16256 * (the sense data will be cleared or invalidated any way) 16257 * 16258 * Note: There could be an issue with not checking a retry limit here, 16259 * the problem is determining which retry limit to check. 16260 */ 16261 if ((un->un_sense_isbusy != 0) || (un->un_ncmds_in_transport > 0)) { 16262 /* Don't retry if the command is flagged as non-retryable */ 16263 if ((pktp->pkt_flags & FLAG_DIAGNOSE) == 0) { 16264 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, 16265 NULL, NULL, 0, un->un_busy_timeout, 16266 kstat_waitq_enter); 16267 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16268 "sd_send_request_sense_command: " 16269 "at full throttle, retrying exit\n"); 16270 } else { 16271 sd_return_failed_command(un, bp, EIO); 16272 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16273 "sd_send_request_sense_command: " 16274 "at full throttle, non-retryable exit\n"); 16275 } 16276 return; 16277 } 16278 16279 sd_mark_rqs_busy(un, bp); 16280 sd_start_cmds(un, un->un_rqs_bp); 16281 16282 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16283 "sd_send_request_sense_command: exit\n"); 16284 } 16285 16286 16287 /* 16288 * Function: sd_mark_rqs_busy 16289 * 16290 * Description: Indicate that the request sense bp for this instance is 16291 * in use. 16292 * 16293 * Context: May be called under interrupt context 16294 */ 16295 16296 static void 16297 sd_mark_rqs_busy(struct sd_lun *un, struct buf *bp) 16298 { 16299 struct sd_xbuf *sense_xp; 16300 16301 ASSERT(un != NULL); 16302 ASSERT(bp != NULL); 16303 ASSERT(mutex_owned(SD_MUTEX(un))); 16304 ASSERT(un->un_sense_isbusy == 0); 16305 16306 SD_TRACE(SD_LOG_IO_CORE, un, "sd_mark_rqs_busy: entry: " 16307 "buf:0x%p xp:0x%p un:0x%p\n", bp, SD_GET_XBUF(bp), un); 16308 16309 sense_xp = SD_GET_XBUF(un->un_rqs_bp); 16310 ASSERT(sense_xp != NULL); 16311 16312 SD_INFO(SD_LOG_IO, un, 16313 "sd_mark_rqs_busy: entry: sense_xp:0x%p\n", sense_xp); 16314 16315 ASSERT(sense_xp->xb_pktp != NULL); 16316 ASSERT((sense_xp->xb_pktp->pkt_flags & (FLAG_SENSING | FLAG_HEAD)) 16317 == (FLAG_SENSING | FLAG_HEAD)); 16318 16319 un->un_sense_isbusy = 1; 16320 un->un_rqs_bp->b_resid = 0; 16321 sense_xp->xb_pktp->pkt_resid = 0; 16322 sense_xp->xb_pktp->pkt_reason = 0; 16323 16324 /* So we can get back the bp at interrupt time! */ 16325 sense_xp->xb_sense_bp = bp; 16326 16327 bzero(un->un_rqs_bp->b_un.b_addr, SENSE_LENGTH); 16328 16329 /* 16330 * Mark this buf as awaiting sense data. (This is already set in 16331 * the pkt_flags for the RQS packet.) 16332 */ 16333 ((SD_GET_XBUF(bp))->xb_pktp)->pkt_flags |= FLAG_SENSING; 16334 16335 /* Request sense down same path */ 16336 if (scsi_pkt_allocated_correctly((SD_GET_XBUF(bp))->xb_pktp) && 16337 ((SD_GET_XBUF(bp))->xb_pktp)->pkt_path_instance) 16338 sense_xp->xb_pktp->pkt_path_instance = 16339 ((SD_GET_XBUF(bp))->xb_pktp)->pkt_path_instance; 16340 16341 sense_xp->xb_retry_count = 0; 16342 sense_xp->xb_victim_retry_count = 0; 16343 sense_xp->xb_ua_retry_count = 0; 16344 sense_xp->xb_nr_retry_count = 0; 16345 sense_xp->xb_dma_resid = 0; 16346 16347 /* Clean up the fields for auto-request sense */ 16348 sense_xp->xb_sense_status = 0; 16349 sense_xp->xb_sense_state = 0; 16350 sense_xp->xb_sense_resid = 0; 16351 bzero(sense_xp->xb_sense_data, sizeof (sense_xp->xb_sense_data)); 16352 16353 SD_TRACE(SD_LOG_IO_CORE, un, "sd_mark_rqs_busy: exit\n"); 16354 } 16355 16356 16357 /* 16358 * Function: sd_mark_rqs_idle 16359 * 16360 * Description: SD_MUTEX must be held continuously through this routine 16361 * to prevent reuse of the rqs struct before the caller can 16362 * complete it's processing. 16363 * 16364 * Return Code: Pointer to the RQS buf 16365 * 16366 * Context: May be called under interrupt context 16367 */ 16368 16369 static struct buf * 16370 sd_mark_rqs_idle(struct sd_lun *un, struct sd_xbuf *sense_xp) 16371 { 16372 struct buf *bp; 16373 ASSERT(un != NULL); 16374 ASSERT(sense_xp != NULL); 16375 ASSERT(mutex_owned(SD_MUTEX(un))); 16376 ASSERT(un->un_sense_isbusy != 0); 16377 16378 un->un_sense_isbusy = 0; 16379 bp = sense_xp->xb_sense_bp; 16380 sense_xp->xb_sense_bp = NULL; 16381 16382 /* This pkt is no longer interested in getting sense data */ 16383 ((SD_GET_XBUF(bp))->xb_pktp)->pkt_flags &= ~FLAG_SENSING; 16384 16385 return (bp); 16386 } 16387 16388 16389 16390 /* 16391 * Function: sd_alloc_rqs 16392 * 16393 * Description: Set up the unit to receive auto request sense data 16394 * 16395 * Return Code: DDI_SUCCESS or DDI_FAILURE 16396 * 16397 * Context: Called under attach(9E) context 16398 */ 16399 16400 static int 16401 sd_alloc_rqs(struct scsi_device *devp, struct sd_lun *un) 16402 { 16403 struct sd_xbuf *xp; 16404 16405 ASSERT(un != NULL); 16406 ASSERT(!mutex_owned(SD_MUTEX(un))); 16407 ASSERT(un->un_rqs_bp == NULL); 16408 ASSERT(un->un_rqs_pktp == NULL); 16409 16410 /* 16411 * First allocate the required buf and scsi_pkt structs, then set up 16412 * the CDB in the scsi_pkt for a REQUEST SENSE command. 16413 */ 16414 un->un_rqs_bp = scsi_alloc_consistent_buf(&devp->sd_address, NULL, 16415 MAX_SENSE_LENGTH, B_READ, SLEEP_FUNC, NULL); 16416 if (un->un_rqs_bp == NULL) { 16417 return (DDI_FAILURE); 16418 } 16419 16420 un->un_rqs_pktp = scsi_init_pkt(&devp->sd_address, NULL, un->un_rqs_bp, 16421 CDB_GROUP0, 1, 0, PKT_CONSISTENT, SLEEP_FUNC, NULL); 16422 16423 if (un->un_rqs_pktp == NULL) { 16424 sd_free_rqs(un); 16425 return (DDI_FAILURE); 16426 } 16427 16428 /* Set up the CDB in the scsi_pkt for a REQUEST SENSE command. */ 16429 (void) scsi_setup_cdb((union scsi_cdb *)un->un_rqs_pktp->pkt_cdbp, 16430 SCMD_REQUEST_SENSE, 0, MAX_SENSE_LENGTH, 0); 16431 16432 SD_FILL_SCSI1_LUN(un, un->un_rqs_pktp); 16433 16434 /* Set up the other needed members in the ARQ scsi_pkt. */ 16435 un->un_rqs_pktp->pkt_comp = sdintr; 16436 un->un_rqs_pktp->pkt_time = sd_io_time; 16437 un->un_rqs_pktp->pkt_flags |= 16438 (FLAG_SENSING | FLAG_HEAD); /* (1222170) */ 16439 16440 /* 16441 * Allocate & init the sd_xbuf struct for the RQS command. Do not 16442 * provide any intpkt, destroypkt routines as we take care of 16443 * scsi_pkt allocation/freeing here and in sd_free_rqs(). 16444 */ 16445 xp = kmem_alloc(sizeof (struct sd_xbuf), KM_SLEEP); 16446 sd_xbuf_init(un, un->un_rqs_bp, xp, SD_CHAIN_NULL, NULL); 16447 xp->xb_pktp = un->un_rqs_pktp; 16448 SD_INFO(SD_LOG_ATTACH_DETACH, un, 16449 "sd_alloc_rqs: un 0x%p, rqs xp 0x%p, pkt 0x%p, buf 0x%p\n", 16450 un, xp, un->un_rqs_pktp, un->un_rqs_bp); 16451 16452 /* 16453 * Save the pointer to the request sense private bp so it can 16454 * be retrieved in sdintr. 16455 */ 16456 un->un_rqs_pktp->pkt_private = un->un_rqs_bp; 16457 ASSERT(un->un_rqs_bp->b_private == xp); 16458 16459 /* 16460 * See if the HBA supports auto-request sense for the specified 16461 * target/lun. If it does, then try to enable it (if not already 16462 * enabled). 16463 * 16464 * Note: For some HBAs (ifp & sf), scsi_ifsetcap will always return 16465 * failure, while for other HBAs (pln) scsi_ifsetcap will always 16466 * return success. However, in both of these cases ARQ is always 16467 * enabled and scsi_ifgetcap will always return true. The best approach 16468 * is to issue the scsi_ifgetcap() first, then try the scsi_ifsetcap(). 16469 * 16470 * The 3rd case is the HBA (adp) always return enabled on 16471 * scsi_ifgetgetcap even when it's not enable, the best approach 16472 * is issue a scsi_ifsetcap then a scsi_ifgetcap 16473 * Note: this case is to circumvent the Adaptec bug. (x86 only) 16474 */ 16475 16476 if (un->un_f_is_fibre == TRUE) { 16477 un->un_f_arq_enabled = TRUE; 16478 } else { 16479 #if defined(__i386) || defined(__amd64) 16480 /* 16481 * Circumvent the Adaptec bug, remove this code when 16482 * the bug is fixed 16483 */ 16484 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 1, 1); 16485 #endif 16486 switch (scsi_ifgetcap(SD_ADDRESS(un), "auto-rqsense", 1)) { 16487 case 0: 16488 SD_INFO(SD_LOG_ATTACH_DETACH, un, 16489 "sd_alloc_rqs: HBA supports ARQ\n"); 16490 /* 16491 * ARQ is supported by this HBA but currently is not 16492 * enabled. Attempt to enable it and if successful then 16493 * mark this instance as ARQ enabled. 16494 */ 16495 if (scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 1, 1) 16496 == 1) { 16497 /* Successfully enabled ARQ in the HBA */ 16498 SD_INFO(SD_LOG_ATTACH_DETACH, un, 16499 "sd_alloc_rqs: ARQ enabled\n"); 16500 un->un_f_arq_enabled = TRUE; 16501 } else { 16502 /* Could not enable ARQ in the HBA */ 16503 SD_INFO(SD_LOG_ATTACH_DETACH, un, 16504 "sd_alloc_rqs: failed ARQ enable\n"); 16505 un->un_f_arq_enabled = FALSE; 16506 } 16507 break; 16508 case 1: 16509 /* 16510 * ARQ is supported by this HBA and is already enabled. 16511 * Just mark ARQ as enabled for this instance. 16512 */ 16513 SD_INFO(SD_LOG_ATTACH_DETACH, un, 16514 "sd_alloc_rqs: ARQ already enabled\n"); 16515 un->un_f_arq_enabled = TRUE; 16516 break; 16517 default: 16518 /* 16519 * ARQ is not supported by this HBA; disable it for this 16520 * instance. 16521 */ 16522 SD_INFO(SD_LOG_ATTACH_DETACH, un, 16523 "sd_alloc_rqs: HBA does not support ARQ\n"); 16524 un->un_f_arq_enabled = FALSE; 16525 break; 16526 } 16527 } 16528 16529 return (DDI_SUCCESS); 16530 } 16531 16532 16533 /* 16534 * Function: sd_free_rqs 16535 * 16536 * Description: Cleanup for the pre-instance RQS command. 16537 * 16538 * Context: Kernel thread context 16539 */ 16540 16541 static void 16542 sd_free_rqs(struct sd_lun *un) 16543 { 16544 ASSERT(un != NULL); 16545 16546 SD_TRACE(SD_LOG_IO_CORE, un, "sd_free_rqs: entry\n"); 16547 16548 /* 16549 * If consistent memory is bound to a scsi_pkt, the pkt 16550 * has to be destroyed *before* freeing the consistent memory. 16551 * Don't change the sequence of this operations. 16552 * scsi_destroy_pkt() might access memory, which isn't allowed, 16553 * after it was freed in scsi_free_consistent_buf(). 16554 */ 16555 if (un->un_rqs_pktp != NULL) { 16556 scsi_destroy_pkt(un->un_rqs_pktp); 16557 un->un_rqs_pktp = NULL; 16558 } 16559 16560 if (un->un_rqs_bp != NULL) { 16561 struct sd_xbuf *xp = SD_GET_XBUF(un->un_rqs_bp); 16562 if (xp != NULL) { 16563 kmem_free(xp, sizeof (struct sd_xbuf)); 16564 } 16565 scsi_free_consistent_buf(un->un_rqs_bp); 16566 un->un_rqs_bp = NULL; 16567 } 16568 SD_TRACE(SD_LOG_IO_CORE, un, "sd_free_rqs: exit\n"); 16569 } 16570 16571 16572 16573 /* 16574 * Function: sd_reduce_throttle 16575 * 16576 * Description: Reduces the maximum # of outstanding commands on a 16577 * target to the current number of outstanding commands. 16578 * Queues a tiemout(9F) callback to restore the limit 16579 * after a specified interval has elapsed. 16580 * Typically used when we get a TRAN_BUSY return code 16581 * back from scsi_transport(). 16582 * 16583 * Arguments: un - ptr to the sd_lun softstate struct 16584 * throttle_type: SD_THROTTLE_TRAN_BUSY or SD_THROTTLE_QFULL 16585 * 16586 * Context: May be called from interrupt context 16587 */ 16588 16589 static void 16590 sd_reduce_throttle(struct sd_lun *un, int throttle_type) 16591 { 16592 ASSERT(un != NULL); 16593 ASSERT(mutex_owned(SD_MUTEX(un))); 16594 ASSERT(un->un_ncmds_in_transport >= 0); 16595 16596 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reduce_throttle: " 16597 "entry: un:0x%p un_throttle:%d un_ncmds_in_transport:%d\n", 16598 un, un->un_throttle, un->un_ncmds_in_transport); 16599 16600 if (un->un_throttle > 1) { 16601 if (un->un_f_use_adaptive_throttle == TRUE) { 16602 switch (throttle_type) { 16603 case SD_THROTTLE_TRAN_BUSY: 16604 if (un->un_busy_throttle == 0) { 16605 un->un_busy_throttle = un->un_throttle; 16606 } 16607 break; 16608 case SD_THROTTLE_QFULL: 16609 un->un_busy_throttle = 0; 16610 break; 16611 default: 16612 ASSERT(FALSE); 16613 } 16614 16615 if (un->un_ncmds_in_transport > 0) { 16616 un->un_throttle = un->un_ncmds_in_transport; 16617 } 16618 16619 } else { 16620 if (un->un_ncmds_in_transport == 0) { 16621 un->un_throttle = 1; 16622 } else { 16623 un->un_throttle = un->un_ncmds_in_transport; 16624 } 16625 } 16626 } 16627 16628 /* Reschedule the timeout if none is currently active */ 16629 if (un->un_reset_throttle_timeid == NULL) { 16630 un->un_reset_throttle_timeid = timeout(sd_restore_throttle, 16631 un, SD_THROTTLE_RESET_INTERVAL); 16632 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16633 "sd_reduce_throttle: timeout scheduled!\n"); 16634 } 16635 16636 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reduce_throttle: " 16637 "exit: un:0x%p un_throttle:%d\n", un, un->un_throttle); 16638 } 16639 16640 16641 16642 /* 16643 * Function: sd_restore_throttle 16644 * 16645 * Description: Callback function for timeout(9F). Resets the current 16646 * value of un->un_throttle to its default. 16647 * 16648 * Arguments: arg - pointer to associated softstate for the device. 16649 * 16650 * Context: May be called from interrupt context 16651 */ 16652 16653 static void 16654 sd_restore_throttle(void *arg) 16655 { 16656 struct sd_lun *un = arg; 16657 16658 ASSERT(un != NULL); 16659 ASSERT(!mutex_owned(SD_MUTEX(un))); 16660 16661 mutex_enter(SD_MUTEX(un)); 16662 16663 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: " 16664 "entry: un:0x%p un_throttle:%d\n", un, un->un_throttle); 16665 16666 un->un_reset_throttle_timeid = NULL; 16667 16668 if (un->un_f_use_adaptive_throttle == TRUE) { 16669 /* 16670 * If un_busy_throttle is nonzero, then it contains the 16671 * value that un_throttle was when we got a TRAN_BUSY back 16672 * from scsi_transport(). We want to revert back to this 16673 * value. 16674 * 16675 * In the QFULL case, the throttle limit will incrementally 16676 * increase until it reaches max throttle. 16677 */ 16678 if (un->un_busy_throttle > 0) { 16679 un->un_throttle = un->un_busy_throttle; 16680 un->un_busy_throttle = 0; 16681 } else { 16682 /* 16683 * increase throttle by 10% open gate slowly, schedule 16684 * another restore if saved throttle has not been 16685 * reached 16686 */ 16687 short throttle; 16688 if (sd_qfull_throttle_enable) { 16689 throttle = un->un_throttle + 16690 max((un->un_throttle / 10), 1); 16691 un->un_throttle = 16692 (throttle < un->un_saved_throttle) ? 16693 throttle : un->un_saved_throttle; 16694 if (un->un_throttle < un->un_saved_throttle) { 16695 un->un_reset_throttle_timeid = 16696 timeout(sd_restore_throttle, 16697 un, 16698 SD_QFULL_THROTTLE_RESET_INTERVAL); 16699 } 16700 } 16701 } 16702 16703 /* 16704 * If un_throttle has fallen below the low-water mark, we 16705 * restore the maximum value here (and allow it to ratchet 16706 * down again if necessary). 16707 */ 16708 if (un->un_throttle < un->un_min_throttle) { 16709 un->un_throttle = un->un_saved_throttle; 16710 } 16711 } else { 16712 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: " 16713 "restoring limit from 0x%x to 0x%x\n", 16714 un->un_throttle, un->un_saved_throttle); 16715 un->un_throttle = un->un_saved_throttle; 16716 } 16717 16718 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, 16719 "sd_restore_throttle: calling sd_start_cmds!\n"); 16720 16721 sd_start_cmds(un, NULL); 16722 16723 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, 16724 "sd_restore_throttle: exit: un:0x%p un_throttle:%d\n", 16725 un, un->un_throttle); 16726 16727 mutex_exit(SD_MUTEX(un)); 16728 16729 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: exit\n"); 16730 } 16731 16732 /* 16733 * Function: sdrunout 16734 * 16735 * Description: Callback routine for scsi_init_pkt when a resource allocation 16736 * fails. 16737 * 16738 * Arguments: arg - a pointer to the sd_lun unit struct for the particular 16739 * soft state instance. 16740 * 16741 * Return Code: The scsi_init_pkt routine allows for the callback function to 16742 * return a 0 indicating the callback should be rescheduled or a 1 16743 * indicating not to reschedule. This routine always returns 1 16744 * because the driver always provides a callback function to 16745 * scsi_init_pkt. This results in a callback always being scheduled 16746 * (via the scsi_init_pkt callback implementation) if a resource 16747 * failure occurs. 16748 * 16749 * Context: This callback function may not block or call routines that block 16750 * 16751 * Note: Using the scsi_init_pkt callback facility can result in an I/O 16752 * request persisting at the head of the list which cannot be 16753 * satisfied even after multiple retries. In the future the driver 16754 * may implement some time of maximum runout count before failing 16755 * an I/O. 16756 */ 16757 16758 static int 16759 sdrunout(caddr_t arg) 16760 { 16761 struct sd_lun *un = (struct sd_lun *)arg; 16762 16763 ASSERT(un != NULL); 16764 ASSERT(!mutex_owned(SD_MUTEX(un))); 16765 16766 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdrunout: entry\n"); 16767 16768 mutex_enter(SD_MUTEX(un)); 16769 sd_start_cmds(un, NULL); 16770 mutex_exit(SD_MUTEX(un)); 16771 /* 16772 * This callback routine always returns 1 (i.e. do not reschedule) 16773 * because we always specify sdrunout as the callback handler for 16774 * scsi_init_pkt inside the call to sd_start_cmds. 16775 */ 16776 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdrunout: exit\n"); 16777 return (1); 16778 } 16779 16780 16781 /* 16782 * Function: sdintr 16783 * 16784 * Description: Completion callback routine for scsi_pkt(9S) structs 16785 * sent to the HBA driver via scsi_transport(9F). 16786 * 16787 * Context: Interrupt context 16788 */ 16789 16790 static void 16791 sdintr(struct scsi_pkt *pktp) 16792 { 16793 struct buf *bp; 16794 struct sd_xbuf *xp; 16795 struct sd_lun *un; 16796 size_t actual_len; 16797 sd_ssc_t *sscp; 16798 16799 ASSERT(pktp != NULL); 16800 bp = (struct buf *)pktp->pkt_private; 16801 ASSERT(bp != NULL); 16802 xp = SD_GET_XBUF(bp); 16803 ASSERT(xp != NULL); 16804 ASSERT(xp->xb_pktp != NULL); 16805 un = SD_GET_UN(bp); 16806 ASSERT(un != NULL); 16807 ASSERT(!mutex_owned(SD_MUTEX(un))); 16808 16809 #ifdef SD_FAULT_INJECTION 16810 16811 SD_INFO(SD_LOG_IOERR, un, "sdintr: sdintr calling Fault injection\n"); 16812 /* SD FaultInjection */ 16813 sd_faultinjection(pktp); 16814 16815 #endif /* SD_FAULT_INJECTION */ 16816 16817 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdintr: entry: buf:0x%p," 16818 " xp:0x%p, un:0x%p\n", bp, xp, un); 16819 16820 mutex_enter(SD_MUTEX(un)); 16821 16822 ASSERT(un->un_fm_private != NULL); 16823 sscp = &((struct sd_fm_internal *)(un->un_fm_private))->fm_ssc; 16824 ASSERT(sscp != NULL); 16825 16826 /* Reduce the count of the #commands currently in transport */ 16827 un->un_ncmds_in_transport--; 16828 ASSERT(un->un_ncmds_in_transport >= 0); 16829 16830 /* Increment counter to indicate that the callback routine is active */ 16831 un->un_in_callback++; 16832 16833 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp); 16834 16835 #ifdef SDDEBUG 16836 if (bp == un->un_retry_bp) { 16837 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sdintr: " 16838 "un:0x%p: GOT retry_bp:0x%p un_ncmds_in_transport:%d\n", 16839 un, un->un_retry_bp, un->un_ncmds_in_transport); 16840 } 16841 #endif 16842 16843 /* 16844 * If pkt_reason is CMD_DEV_GONE, fail the command, and update the media 16845 * state if needed. 16846 */ 16847 if (pktp->pkt_reason == CMD_DEV_GONE) { 16848 /* Prevent multiple console messages for the same failure. */ 16849 if (un->un_last_pkt_reason != CMD_DEV_GONE) { 16850 un->un_last_pkt_reason = CMD_DEV_GONE; 16851 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 16852 "Command failed to complete...Device is gone\n"); 16853 } 16854 if (un->un_mediastate != DKIO_DEV_GONE) { 16855 un->un_mediastate = DKIO_DEV_GONE; 16856 cv_broadcast(&un->un_state_cv); 16857 } 16858 /* 16859 * If the command happens to be the REQUEST SENSE command, 16860 * free up the rqs buf and fail the original command. 16861 */ 16862 if (bp == un->un_rqs_bp) { 16863 bp = sd_mark_rqs_idle(un, xp); 16864 } 16865 sd_return_failed_command(un, bp, EIO); 16866 goto exit; 16867 } 16868 16869 if (pktp->pkt_state & STATE_XARQ_DONE) { 16870 SD_TRACE(SD_LOG_COMMON, un, 16871 "sdintr: extra sense data received. pkt=%p\n", pktp); 16872 } 16873 16874 /* 16875 * First see if the pkt has auto-request sense data with it.... 16876 * Look at the packet state first so we don't take a performance 16877 * hit looking at the arq enabled flag unless absolutely necessary. 16878 */ 16879 if ((pktp->pkt_state & STATE_ARQ_DONE) && 16880 (un->un_f_arq_enabled == TRUE)) { 16881 /* 16882 * The HBA did an auto request sense for this command so check 16883 * for FLAG_DIAGNOSE. If set this indicates a uscsi or internal 16884 * driver command that should not be retried. 16885 */ 16886 if ((pktp->pkt_flags & FLAG_DIAGNOSE) != 0) { 16887 /* 16888 * Save the relevant sense info into the xp for the 16889 * original cmd. 16890 */ 16891 struct scsi_arq_status *asp; 16892 asp = (struct scsi_arq_status *)(pktp->pkt_scbp); 16893 xp->xb_sense_status = 16894 *((uchar_t *)(&(asp->sts_rqpkt_status))); 16895 xp->xb_sense_state = asp->sts_rqpkt_state; 16896 xp->xb_sense_resid = asp->sts_rqpkt_resid; 16897 if (pktp->pkt_state & STATE_XARQ_DONE) { 16898 actual_len = MAX_SENSE_LENGTH - 16899 xp->xb_sense_resid; 16900 bcopy(&asp->sts_sensedata, xp->xb_sense_data, 16901 MAX_SENSE_LENGTH); 16902 } else { 16903 if (xp->xb_sense_resid > SENSE_LENGTH) { 16904 actual_len = MAX_SENSE_LENGTH - 16905 xp->xb_sense_resid; 16906 } else { 16907 actual_len = SENSE_LENGTH - 16908 xp->xb_sense_resid; 16909 } 16910 if (xp->xb_pkt_flags & SD_XB_USCSICMD) { 16911 if ((((struct uscsi_cmd *) 16912 (xp->xb_pktinfo))->uscsi_rqlen) > 16913 actual_len) { 16914 xp->xb_sense_resid = 16915 (((struct uscsi_cmd *) 16916 (xp->xb_pktinfo))-> 16917 uscsi_rqlen) - actual_len; 16918 } else { 16919 xp->xb_sense_resid = 0; 16920 } 16921 } 16922 bcopy(&asp->sts_sensedata, xp->xb_sense_data, 16923 SENSE_LENGTH); 16924 } 16925 16926 /* fail the command */ 16927 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16928 "sdintr: arq done and FLAG_DIAGNOSE set\n"); 16929 sd_return_failed_command(un, bp, EIO); 16930 goto exit; 16931 } 16932 16933 #if (defined(__i386) || defined(__amd64)) /* DMAFREE for x86 only */ 16934 /* 16935 * We want to either retry or fail this command, so free 16936 * the DMA resources here. If we retry the command then 16937 * the DMA resources will be reallocated in sd_start_cmds(). 16938 * Note that when PKT_DMA_PARTIAL is used, this reallocation 16939 * causes the *entire* transfer to start over again from the 16940 * beginning of the request, even for PARTIAL chunks that 16941 * have already transferred successfully. 16942 */ 16943 if ((un->un_f_is_fibre == TRUE) && 16944 ((xp->xb_pkt_flags & SD_XB_USCSICMD) == 0) && 16945 ((pktp->pkt_flags & FLAG_SENSING) == 0)) { 16946 scsi_dmafree(pktp); 16947 xp->xb_pkt_flags |= SD_XB_DMA_FREED; 16948 } 16949 #endif 16950 16951 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16952 "sdintr: arq done, sd_handle_auto_request_sense\n"); 16953 16954 sd_handle_auto_request_sense(un, bp, xp, pktp); 16955 goto exit; 16956 } 16957 16958 /* Next see if this is the REQUEST SENSE pkt for the instance */ 16959 if (pktp->pkt_flags & FLAG_SENSING) { 16960 /* This pktp is from the unit's REQUEST_SENSE command */ 16961 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16962 "sdintr: sd_handle_request_sense\n"); 16963 sd_handle_request_sense(un, bp, xp, pktp); 16964 goto exit; 16965 } 16966 16967 /* 16968 * Check to see if the command successfully completed as requested; 16969 * this is the most common case (and also the hot performance path). 16970 * 16971 * Requirements for successful completion are: 16972 * pkt_reason is CMD_CMPLT and packet status is status good. 16973 * In addition: 16974 * - A residual of zero indicates successful completion no matter what 16975 * the command is. 16976 * - If the residual is not zero and the command is not a read or 16977 * write, then it's still defined as successful completion. In other 16978 * words, if the command is a read or write the residual must be 16979 * zero for successful completion. 16980 * - If the residual is not zero and the command is a read or 16981 * write, and it's a USCSICMD, then it's still defined as 16982 * successful completion. 16983 */ 16984 if ((pktp->pkt_reason == CMD_CMPLT) && 16985 (SD_GET_PKT_STATUS(pktp) == STATUS_GOOD)) { 16986 16987 /* 16988 * Since this command is returned with a good status, we 16989 * can reset the count for Sonoma failover. 16990 */ 16991 un->un_sonoma_failure_count = 0; 16992 16993 /* 16994 * Return all USCSI commands on good status 16995 */ 16996 if (pktp->pkt_resid == 0) { 16997 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16998 "sdintr: returning command for resid == 0\n"); 16999 } else if (((SD_GET_PKT_OPCODE(pktp) & 0x1F) != SCMD_READ) && 17000 ((SD_GET_PKT_OPCODE(pktp) & 0x1F) != SCMD_WRITE)) { 17001 SD_UPDATE_B_RESID(bp, pktp); 17002 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17003 "sdintr: returning command for resid != 0\n"); 17004 } else if (xp->xb_pkt_flags & SD_XB_USCSICMD) { 17005 SD_UPDATE_B_RESID(bp, pktp); 17006 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17007 "sdintr: returning uscsi command\n"); 17008 } else { 17009 goto not_successful; 17010 } 17011 sd_return_command(un, bp); 17012 17013 /* 17014 * Decrement counter to indicate that the callback routine 17015 * is done. 17016 */ 17017 un->un_in_callback--; 17018 ASSERT(un->un_in_callback >= 0); 17019 mutex_exit(SD_MUTEX(un)); 17020 17021 return; 17022 } 17023 17024 not_successful: 17025 17026 #if (defined(__i386) || defined(__amd64)) /* DMAFREE for x86 only */ 17027 /* 17028 * The following is based upon knowledge of the underlying transport 17029 * and its use of DMA resources. This code should be removed when 17030 * PKT_DMA_PARTIAL support is taken out of the disk driver in favor 17031 * of the new PKT_CMD_BREAKUP protocol. See also sd_initpkt_for_buf() 17032 * and sd_start_cmds(). 17033 * 17034 * Free any DMA resources associated with this command if there 17035 * is a chance it could be retried or enqueued for later retry. 17036 * If we keep the DMA binding then mpxio cannot reissue the 17037 * command on another path whenever a path failure occurs. 17038 * 17039 * Note that when PKT_DMA_PARTIAL is used, free/reallocation 17040 * causes the *entire* transfer to start over again from the 17041 * beginning of the request, even for PARTIAL chunks that 17042 * have already transferred successfully. 17043 * 17044 * This is only done for non-uscsi commands (and also skipped for the 17045 * driver's internal RQS command). Also just do this for Fibre Channel 17046 * devices as these are the only ones that support mpxio. 17047 */ 17048 if ((un->un_f_is_fibre == TRUE) && 17049 ((xp->xb_pkt_flags & SD_XB_USCSICMD) == 0) && 17050 ((pktp->pkt_flags & FLAG_SENSING) == 0)) { 17051 scsi_dmafree(pktp); 17052 xp->xb_pkt_flags |= SD_XB_DMA_FREED; 17053 } 17054 #endif 17055 17056 /* 17057 * The command did not successfully complete as requested so check 17058 * for FLAG_DIAGNOSE. If set this indicates a uscsi or internal 17059 * driver command that should not be retried so just return. If 17060 * FLAG_DIAGNOSE is not set the error will be processed below. 17061 */ 17062 if ((pktp->pkt_flags & FLAG_DIAGNOSE) != 0) { 17063 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17064 "sdintr: FLAG_DIAGNOSE: sd_return_failed_command\n"); 17065 /* 17066 * Issue a request sense if a check condition caused the error 17067 * (we handle the auto request sense case above), otherwise 17068 * just fail the command. 17069 */ 17070 if ((pktp->pkt_reason == CMD_CMPLT) && 17071 (SD_GET_PKT_STATUS(pktp) == STATUS_CHECK)) { 17072 sd_send_request_sense_command(un, bp, pktp); 17073 } else { 17074 sd_return_failed_command(un, bp, EIO); 17075 } 17076 goto exit; 17077 } 17078 17079 /* 17080 * The command did not successfully complete as requested so process 17081 * the error, retry, and/or attempt recovery. 17082 */ 17083 switch (pktp->pkt_reason) { 17084 case CMD_CMPLT: 17085 switch (SD_GET_PKT_STATUS(pktp)) { 17086 case STATUS_GOOD: 17087 /* 17088 * The command completed successfully with a non-zero 17089 * residual 17090 */ 17091 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17092 "sdintr: STATUS_GOOD \n"); 17093 sd_pkt_status_good(un, bp, xp, pktp); 17094 break; 17095 17096 case STATUS_CHECK: 17097 case STATUS_TERMINATED: 17098 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17099 "sdintr: STATUS_TERMINATED | STATUS_CHECK\n"); 17100 sd_pkt_status_check_condition(un, bp, xp, pktp); 17101 break; 17102 17103 case STATUS_BUSY: 17104 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17105 "sdintr: STATUS_BUSY\n"); 17106 sd_pkt_status_busy(un, bp, xp, pktp); 17107 break; 17108 17109 case STATUS_RESERVATION_CONFLICT: 17110 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17111 "sdintr: STATUS_RESERVATION_CONFLICT\n"); 17112 sd_pkt_status_reservation_conflict(un, bp, xp, pktp); 17113 break; 17114 17115 case STATUS_QFULL: 17116 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17117 "sdintr: STATUS_QFULL\n"); 17118 sd_pkt_status_qfull(un, bp, xp, pktp); 17119 break; 17120 17121 case STATUS_MET: 17122 case STATUS_INTERMEDIATE: 17123 case STATUS_SCSI2: 17124 case STATUS_INTERMEDIATE_MET: 17125 case STATUS_ACA_ACTIVE: 17126 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 17127 "Unexpected SCSI status received: 0x%x\n", 17128 SD_GET_PKT_STATUS(pktp)); 17129 /* 17130 * Mark the ssc_flags when detected invalid status 17131 * code for non-USCSI command. 17132 */ 17133 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 17134 sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_STATUS, 17135 0, "stat-code"); 17136 } 17137 sd_return_failed_command(un, bp, EIO); 17138 break; 17139 17140 default: 17141 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 17142 "Invalid SCSI status received: 0x%x\n", 17143 SD_GET_PKT_STATUS(pktp)); 17144 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 17145 sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_STATUS, 17146 0, "stat-code"); 17147 } 17148 sd_return_failed_command(un, bp, EIO); 17149 break; 17150 17151 } 17152 break; 17153 17154 case CMD_INCOMPLETE: 17155 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17156 "sdintr: CMD_INCOMPLETE\n"); 17157 sd_pkt_reason_cmd_incomplete(un, bp, xp, pktp); 17158 break; 17159 case CMD_TRAN_ERR: 17160 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17161 "sdintr: CMD_TRAN_ERR\n"); 17162 sd_pkt_reason_cmd_tran_err(un, bp, xp, pktp); 17163 break; 17164 case CMD_RESET: 17165 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17166 "sdintr: CMD_RESET \n"); 17167 sd_pkt_reason_cmd_reset(un, bp, xp, pktp); 17168 break; 17169 case CMD_ABORTED: 17170 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17171 "sdintr: CMD_ABORTED \n"); 17172 sd_pkt_reason_cmd_aborted(un, bp, xp, pktp); 17173 break; 17174 case CMD_TIMEOUT: 17175 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17176 "sdintr: CMD_TIMEOUT\n"); 17177 sd_pkt_reason_cmd_timeout(un, bp, xp, pktp); 17178 break; 17179 case CMD_UNX_BUS_FREE: 17180 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17181 "sdintr: CMD_UNX_BUS_FREE \n"); 17182 sd_pkt_reason_cmd_unx_bus_free(un, bp, xp, pktp); 17183 break; 17184 case CMD_TAG_REJECT: 17185 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17186 "sdintr: CMD_TAG_REJECT\n"); 17187 sd_pkt_reason_cmd_tag_reject(un, bp, xp, pktp); 17188 break; 17189 default: 17190 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17191 "sdintr: default\n"); 17192 /* 17193 * Mark the ssc_flags for detecting invliad pkt_reason. 17194 */ 17195 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 17196 sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_PKT_REASON, 17197 0, "pkt-reason"); 17198 } 17199 sd_pkt_reason_default(un, bp, xp, pktp); 17200 break; 17201 } 17202 17203 exit: 17204 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdintr: exit\n"); 17205 17206 /* Decrement counter to indicate that the callback routine is done. */ 17207 un->un_in_callback--; 17208 ASSERT(un->un_in_callback >= 0); 17209 17210 /* 17211 * At this point, the pkt has been dispatched, ie, it is either 17212 * being re-tried or has been returned to its caller and should 17213 * not be referenced. 17214 */ 17215 17216 mutex_exit(SD_MUTEX(un)); 17217 } 17218 17219 17220 /* 17221 * Function: sd_print_incomplete_msg 17222 * 17223 * Description: Prints the error message for a CMD_INCOMPLETE error. 17224 * 17225 * Arguments: un - ptr to associated softstate for the device. 17226 * bp - ptr to the buf(9S) for the command. 17227 * arg - message string ptr 17228 * code - SD_DELAYED_RETRY_ISSUED, SD_IMMEDIATE_RETRY_ISSUED, 17229 * or SD_NO_RETRY_ISSUED. 17230 * 17231 * Context: May be called under interrupt context 17232 */ 17233 17234 static void 17235 sd_print_incomplete_msg(struct sd_lun *un, struct buf *bp, void *arg, int code) 17236 { 17237 struct scsi_pkt *pktp; 17238 char *msgp; 17239 char *cmdp = arg; 17240 17241 ASSERT(un != NULL); 17242 ASSERT(mutex_owned(SD_MUTEX(un))); 17243 ASSERT(bp != NULL); 17244 ASSERT(arg != NULL); 17245 pktp = SD_GET_PKTP(bp); 17246 ASSERT(pktp != NULL); 17247 17248 switch (code) { 17249 case SD_DELAYED_RETRY_ISSUED: 17250 case SD_IMMEDIATE_RETRY_ISSUED: 17251 msgp = "retrying"; 17252 break; 17253 case SD_NO_RETRY_ISSUED: 17254 default: 17255 msgp = "giving up"; 17256 break; 17257 } 17258 17259 if ((pktp->pkt_flags & FLAG_SILENT) == 0) { 17260 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 17261 "incomplete %s- %s\n", cmdp, msgp); 17262 } 17263 } 17264 17265 17266 17267 /* 17268 * Function: sd_pkt_status_good 17269 * 17270 * Description: Processing for a STATUS_GOOD code in pkt_status. 17271 * 17272 * Context: May be called under interrupt context 17273 */ 17274 17275 static void 17276 sd_pkt_status_good(struct sd_lun *un, struct buf *bp, 17277 struct sd_xbuf *xp, struct scsi_pkt *pktp) 17278 { 17279 char *cmdp; 17280 17281 ASSERT(un != NULL); 17282 ASSERT(mutex_owned(SD_MUTEX(un))); 17283 ASSERT(bp != NULL); 17284 ASSERT(xp != NULL); 17285 ASSERT(pktp != NULL); 17286 ASSERT(pktp->pkt_reason == CMD_CMPLT); 17287 ASSERT(SD_GET_PKT_STATUS(pktp) == STATUS_GOOD); 17288 ASSERT(pktp->pkt_resid != 0); 17289 17290 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: entry\n"); 17291 17292 SD_UPDATE_ERRSTATS(un, sd_harderrs); 17293 switch (SD_GET_PKT_OPCODE(pktp) & 0x1F) { 17294 case SCMD_READ: 17295 cmdp = "read"; 17296 break; 17297 case SCMD_WRITE: 17298 cmdp = "write"; 17299 break; 17300 default: 17301 SD_UPDATE_B_RESID(bp, pktp); 17302 sd_return_command(un, bp); 17303 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: exit\n"); 17304 return; 17305 } 17306 17307 /* 17308 * See if we can retry the read/write, preferrably immediately. 17309 * If retries are exhaused, then sd_retry_command() will update 17310 * the b_resid count. 17311 */ 17312 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_incomplete_msg, 17313 cmdp, EIO, (clock_t)0, NULL); 17314 17315 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: exit\n"); 17316 } 17317 17318 17319 17320 17321 17322 /* 17323 * Function: sd_handle_request_sense 17324 * 17325 * Description: Processing for non-auto Request Sense command. 17326 * 17327 * Arguments: un - ptr to associated softstate 17328 * sense_bp - ptr to buf(9S) for the RQS command 17329 * sense_xp - ptr to the sd_xbuf for the RQS command 17330 * sense_pktp - ptr to the scsi_pkt(9S) for the RQS command 17331 * 17332 * Context: May be called under interrupt context 17333 */ 17334 17335 static void 17336 sd_handle_request_sense(struct sd_lun *un, struct buf *sense_bp, 17337 struct sd_xbuf *sense_xp, struct scsi_pkt *sense_pktp) 17338 { 17339 struct buf *cmd_bp; /* buf for the original command */ 17340 struct sd_xbuf *cmd_xp; /* sd_xbuf for the original command */ 17341 struct scsi_pkt *cmd_pktp; /* pkt for the original command */ 17342 size_t actual_len; /* actual sense data length */ 17343 17344 ASSERT(un != NULL); 17345 ASSERT(mutex_owned(SD_MUTEX(un))); 17346 ASSERT(sense_bp != NULL); 17347 ASSERT(sense_xp != NULL); 17348 ASSERT(sense_pktp != NULL); 17349 17350 /* 17351 * Note the sense_bp, sense_xp, and sense_pktp here are for the 17352 * RQS command and not the original command. 17353 */ 17354 ASSERT(sense_pktp == un->un_rqs_pktp); 17355 ASSERT(sense_bp == un->un_rqs_bp); 17356 ASSERT((sense_pktp->pkt_flags & (FLAG_SENSING | FLAG_HEAD)) == 17357 (FLAG_SENSING | FLAG_HEAD)); 17358 ASSERT((((SD_GET_XBUF(sense_xp->xb_sense_bp))->xb_pktp->pkt_flags) & 17359 FLAG_SENSING) == FLAG_SENSING); 17360 17361 /* These are the bp, xp, and pktp for the original command */ 17362 cmd_bp = sense_xp->xb_sense_bp; 17363 cmd_xp = SD_GET_XBUF(cmd_bp); 17364 cmd_pktp = SD_GET_PKTP(cmd_bp); 17365 17366 if (sense_pktp->pkt_reason != CMD_CMPLT) { 17367 /* 17368 * The REQUEST SENSE command failed. Release the REQUEST 17369 * SENSE command for re-use, get back the bp for the original 17370 * command, and attempt to re-try the original command if 17371 * FLAG_DIAGNOSE is not set in the original packet. 17372 */ 17373 SD_UPDATE_ERRSTATS(un, sd_harderrs); 17374 if ((cmd_pktp->pkt_flags & FLAG_DIAGNOSE) == 0) { 17375 cmd_bp = sd_mark_rqs_idle(un, sense_xp); 17376 sd_retry_command(un, cmd_bp, SD_RETRIES_STANDARD, 17377 NULL, NULL, EIO, (clock_t)0, NULL); 17378 return; 17379 } 17380 } 17381 17382 /* 17383 * Save the relevant sense info into the xp for the original cmd. 17384 * 17385 * Note: if the request sense failed the state info will be zero 17386 * as set in sd_mark_rqs_busy() 17387 */ 17388 cmd_xp->xb_sense_status = *(sense_pktp->pkt_scbp); 17389 cmd_xp->xb_sense_state = sense_pktp->pkt_state; 17390 actual_len = MAX_SENSE_LENGTH - sense_pktp->pkt_resid; 17391 if ((cmd_xp->xb_pkt_flags & SD_XB_USCSICMD) && 17392 (((struct uscsi_cmd *)cmd_xp->xb_pktinfo)->uscsi_rqlen > 17393 SENSE_LENGTH)) { 17394 bcopy(sense_bp->b_un.b_addr, cmd_xp->xb_sense_data, 17395 MAX_SENSE_LENGTH); 17396 cmd_xp->xb_sense_resid = sense_pktp->pkt_resid; 17397 } else { 17398 bcopy(sense_bp->b_un.b_addr, cmd_xp->xb_sense_data, 17399 SENSE_LENGTH); 17400 if (actual_len < SENSE_LENGTH) { 17401 cmd_xp->xb_sense_resid = SENSE_LENGTH - actual_len; 17402 } else { 17403 cmd_xp->xb_sense_resid = 0; 17404 } 17405 } 17406 17407 /* 17408 * Free up the RQS command.... 17409 * NOTE: 17410 * Must do this BEFORE calling sd_validate_sense_data! 17411 * sd_validate_sense_data may return the original command in 17412 * which case the pkt will be freed and the flags can no 17413 * longer be touched. 17414 * SD_MUTEX is held through this process until the command 17415 * is dispatched based upon the sense data, so there are 17416 * no race conditions. 17417 */ 17418 (void) sd_mark_rqs_idle(un, sense_xp); 17419 17420 /* 17421 * For a retryable command see if we have valid sense data, if so then 17422 * turn it over to sd_decode_sense() to figure out the right course of 17423 * action. Just fail a non-retryable command. 17424 */ 17425 if ((cmd_pktp->pkt_flags & FLAG_DIAGNOSE) == 0) { 17426 if (sd_validate_sense_data(un, cmd_bp, cmd_xp, actual_len) == 17427 SD_SENSE_DATA_IS_VALID) { 17428 sd_decode_sense(un, cmd_bp, cmd_xp, cmd_pktp); 17429 } 17430 } else { 17431 SD_DUMP_MEMORY(un, SD_LOG_IO_CORE, "Failed CDB", 17432 (uchar_t *)cmd_pktp->pkt_cdbp, CDB_SIZE, SD_LOG_HEX); 17433 SD_DUMP_MEMORY(un, SD_LOG_IO_CORE, "Sense Data", 17434 (uchar_t *)cmd_xp->xb_sense_data, SENSE_LENGTH, SD_LOG_HEX); 17435 sd_return_failed_command(un, cmd_bp, EIO); 17436 } 17437 } 17438 17439 17440 17441 17442 /* 17443 * Function: sd_handle_auto_request_sense 17444 * 17445 * Description: Processing for auto-request sense information. 17446 * 17447 * Arguments: un - ptr to associated softstate 17448 * bp - ptr to buf(9S) for the command 17449 * xp - ptr to the sd_xbuf for the command 17450 * pktp - ptr to the scsi_pkt(9S) for the command 17451 * 17452 * Context: May be called under interrupt context 17453 */ 17454 17455 static void 17456 sd_handle_auto_request_sense(struct sd_lun *un, struct buf *bp, 17457 struct sd_xbuf *xp, struct scsi_pkt *pktp) 17458 { 17459 struct scsi_arq_status *asp; 17460 size_t actual_len; 17461 17462 ASSERT(un != NULL); 17463 ASSERT(mutex_owned(SD_MUTEX(un))); 17464 ASSERT(bp != NULL); 17465 ASSERT(xp != NULL); 17466 ASSERT(pktp != NULL); 17467 ASSERT(pktp != un->un_rqs_pktp); 17468 ASSERT(bp != un->un_rqs_bp); 17469 17470 /* 17471 * For auto-request sense, we get a scsi_arq_status back from 17472 * the HBA, with the sense data in the sts_sensedata member. 17473 * The pkt_scbp of the packet points to this scsi_arq_status. 17474 */ 17475 asp = (struct scsi_arq_status *)(pktp->pkt_scbp); 17476 17477 if (asp->sts_rqpkt_reason != CMD_CMPLT) { 17478 /* 17479 * The auto REQUEST SENSE failed; see if we can re-try 17480 * the original command. 17481 */ 17482 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 17483 "auto request sense failed (reason=%s)\n", 17484 scsi_rname(asp->sts_rqpkt_reason)); 17485 17486 sd_reset_target(un, pktp); 17487 17488 sd_retry_command(un, bp, SD_RETRIES_STANDARD, 17489 NULL, NULL, EIO, (clock_t)0, NULL); 17490 return; 17491 } 17492 17493 /* Save the relevant sense info into the xp for the original cmd. */ 17494 xp->xb_sense_status = *((uchar_t *)(&(asp->sts_rqpkt_status))); 17495 xp->xb_sense_state = asp->sts_rqpkt_state; 17496 xp->xb_sense_resid = asp->sts_rqpkt_resid; 17497 if (xp->xb_sense_state & STATE_XARQ_DONE) { 17498 actual_len = MAX_SENSE_LENGTH - xp->xb_sense_resid; 17499 bcopy(&asp->sts_sensedata, xp->xb_sense_data, 17500 MAX_SENSE_LENGTH); 17501 } else { 17502 if (xp->xb_sense_resid > SENSE_LENGTH) { 17503 actual_len = MAX_SENSE_LENGTH - xp->xb_sense_resid; 17504 } else { 17505 actual_len = SENSE_LENGTH - xp->xb_sense_resid; 17506 } 17507 if (xp->xb_pkt_flags & SD_XB_USCSICMD) { 17508 if ((((struct uscsi_cmd *) 17509 (xp->xb_pktinfo))->uscsi_rqlen) > actual_len) { 17510 xp->xb_sense_resid = (((struct uscsi_cmd *) 17511 (xp->xb_pktinfo))->uscsi_rqlen) - 17512 actual_len; 17513 } else { 17514 xp->xb_sense_resid = 0; 17515 } 17516 } 17517 bcopy(&asp->sts_sensedata, xp->xb_sense_data, SENSE_LENGTH); 17518 } 17519 17520 /* 17521 * See if we have valid sense data, if so then turn it over to 17522 * sd_decode_sense() to figure out the right course of action. 17523 */ 17524 if (sd_validate_sense_data(un, bp, xp, actual_len) == 17525 SD_SENSE_DATA_IS_VALID) { 17526 sd_decode_sense(un, bp, xp, pktp); 17527 } 17528 } 17529 17530 17531 /* 17532 * Function: sd_print_sense_failed_msg 17533 * 17534 * Description: Print log message when RQS has failed. 17535 * 17536 * Arguments: un - ptr to associated softstate 17537 * bp - ptr to buf(9S) for the command 17538 * arg - generic message string ptr 17539 * code - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED, 17540 * or SD_NO_RETRY_ISSUED 17541 * 17542 * Context: May be called from interrupt context 17543 */ 17544 17545 static void 17546 sd_print_sense_failed_msg(struct sd_lun *un, struct buf *bp, void *arg, 17547 int code) 17548 { 17549 char *msgp = arg; 17550 17551 ASSERT(un != NULL); 17552 ASSERT(mutex_owned(SD_MUTEX(un))); 17553 ASSERT(bp != NULL); 17554 17555 if ((code == SD_NO_RETRY_ISSUED) && (msgp != NULL)) { 17556 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, msgp); 17557 } 17558 } 17559 17560 17561 /* 17562 * Function: sd_validate_sense_data 17563 * 17564 * Description: Check the given sense data for validity. 17565 * If the sense data is not valid, the command will 17566 * be either failed or retried! 17567 * 17568 * Return Code: SD_SENSE_DATA_IS_INVALID 17569 * SD_SENSE_DATA_IS_VALID 17570 * 17571 * Context: May be called from interrupt context 17572 */ 17573 17574 static int 17575 sd_validate_sense_data(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 17576 size_t actual_len) 17577 { 17578 struct scsi_extended_sense *esp; 17579 struct scsi_pkt *pktp; 17580 char *msgp = NULL; 17581 sd_ssc_t *sscp; 17582 17583 ASSERT(un != NULL); 17584 ASSERT(mutex_owned(SD_MUTEX(un))); 17585 ASSERT(bp != NULL); 17586 ASSERT(bp != un->un_rqs_bp); 17587 ASSERT(xp != NULL); 17588 ASSERT(un->un_fm_private != NULL); 17589 17590 pktp = SD_GET_PKTP(bp); 17591 ASSERT(pktp != NULL); 17592 17593 sscp = &((struct sd_fm_internal *)(un->un_fm_private))->fm_ssc; 17594 ASSERT(sscp != NULL); 17595 17596 /* 17597 * Check the status of the RQS command (auto or manual). 17598 */ 17599 switch (xp->xb_sense_status & STATUS_MASK) { 17600 case STATUS_GOOD: 17601 break; 17602 17603 case STATUS_RESERVATION_CONFLICT: 17604 sd_pkt_status_reservation_conflict(un, bp, xp, pktp); 17605 return (SD_SENSE_DATA_IS_INVALID); 17606 17607 case STATUS_BUSY: 17608 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 17609 "Busy Status on REQUEST SENSE\n"); 17610 sd_retry_command(un, bp, SD_RETRIES_BUSY, NULL, 17611 NULL, EIO, un->un_busy_timeout / 500, kstat_waitq_enter); 17612 return (SD_SENSE_DATA_IS_INVALID); 17613 17614 case STATUS_QFULL: 17615 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 17616 "QFULL Status on REQUEST SENSE\n"); 17617 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, 17618 NULL, EIO, un->un_busy_timeout / 500, kstat_waitq_enter); 17619 return (SD_SENSE_DATA_IS_INVALID); 17620 17621 case STATUS_CHECK: 17622 case STATUS_TERMINATED: 17623 msgp = "Check Condition on REQUEST SENSE\n"; 17624 goto sense_failed; 17625 17626 default: 17627 msgp = "Not STATUS_GOOD on REQUEST_SENSE\n"; 17628 goto sense_failed; 17629 } 17630 17631 /* 17632 * See if we got the minimum required amount of sense data. 17633 * Note: We are assuming the returned sense data is SENSE_LENGTH bytes 17634 * or less. 17635 */ 17636 if (((xp->xb_sense_state & STATE_XFERRED_DATA) == 0) || 17637 (actual_len == 0)) { 17638 msgp = "Request Sense couldn't get sense data\n"; 17639 goto sense_failed; 17640 } 17641 17642 if (actual_len < SUN_MIN_SENSE_LENGTH) { 17643 msgp = "Not enough sense information\n"; 17644 /* Mark the ssc_flags for detecting invalid sense data */ 17645 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 17646 sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_SENSE, 0, 17647 "sense-data"); 17648 } 17649 goto sense_failed; 17650 } 17651 17652 /* 17653 * We require the extended sense data 17654 */ 17655 esp = (struct scsi_extended_sense *)xp->xb_sense_data; 17656 if (esp->es_class != CLASS_EXTENDED_SENSE) { 17657 if ((pktp->pkt_flags & FLAG_SILENT) == 0) { 17658 static char tmp[8]; 17659 static char buf[148]; 17660 char *p = (char *)(xp->xb_sense_data); 17661 int i; 17662 17663 mutex_enter(&sd_sense_mutex); 17664 (void) strcpy(buf, "undecodable sense information:"); 17665 for (i = 0; i < actual_len; i++) { 17666 (void) sprintf(tmp, " 0x%x", *(p++)&0xff); 17667 (void) strcpy(&buf[strlen(buf)], tmp); 17668 } 17669 i = strlen(buf); 17670 (void) strcpy(&buf[i], "-(assumed fatal)\n"); 17671 17672 if (SD_FM_LOG(un) == SD_FM_LOG_NSUP) { 17673 scsi_log(SD_DEVINFO(un), sd_label, 17674 CE_WARN, buf); 17675 } 17676 mutex_exit(&sd_sense_mutex); 17677 } 17678 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 17685 /* Note: Legacy behavior, fail the command with no retry */ 17686 sd_return_failed_command(un, bp, EIO); 17687 return (SD_SENSE_DATA_IS_INVALID); 17688 } 17689 17690 /* 17691 * Check that es_code is valid (es_class concatenated with es_code 17692 * make up the "response code" field. es_class will always be 7, so 17693 * make sure es_code is 0, 1, 2, 3 or 0xf. es_code will indicate the 17694 * format. 17695 */ 17696 if ((esp->es_code != CODE_FMT_FIXED_CURRENT) && 17697 (esp->es_code != CODE_FMT_FIXED_DEFERRED) && 17698 (esp->es_code != CODE_FMT_DESCR_CURRENT) && 17699 (esp->es_code != CODE_FMT_DESCR_DEFERRED) && 17700 (esp->es_code != CODE_FMT_VENDOR_SPECIFIC)) { 17701 /* Mark the ssc_flags for detecting invalid sense data */ 17702 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 17703 sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_SENSE, 0, 17704 "sense-data"); 17705 } 17706 goto sense_failed; 17707 } 17708 17709 return (SD_SENSE_DATA_IS_VALID); 17710 17711 sense_failed: 17712 /* 17713 * If the request sense failed (for whatever reason), attempt 17714 * to retry the original command. 17715 */ 17716 #if defined(__i386) || defined(__amd64) 17717 /* 17718 * SD_RETRY_DELAY is conditionally compile (#if fibre) in 17719 * sddef.h for Sparc platform, and x86 uses 1 binary 17720 * for both SCSI/FC. 17721 * The SD_RETRY_DELAY value need to be adjusted here 17722 * when SD_RETRY_DELAY change in sddef.h 17723 */ 17724 sd_retry_command(un, bp, SD_RETRIES_STANDARD, 17725 sd_print_sense_failed_msg, msgp, EIO, 17726 un->un_f_is_fibre?drv_usectohz(100000):(clock_t)0, NULL); 17727 #else 17728 sd_retry_command(un, bp, SD_RETRIES_STANDARD, 17729 sd_print_sense_failed_msg, msgp, EIO, SD_RETRY_DELAY, NULL); 17730 #endif 17731 17732 return (SD_SENSE_DATA_IS_INVALID); 17733 } 17734 17735 /* 17736 * Function: sd_decode_sense 17737 * 17738 * Description: Take recovery action(s) when SCSI Sense Data is received. 17739 * 17740 * Context: Interrupt context. 17741 */ 17742 17743 static void 17744 sd_decode_sense(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 17745 struct scsi_pkt *pktp) 17746 { 17747 uint8_t sense_key; 17748 17749 ASSERT(un != NULL); 17750 ASSERT(mutex_owned(SD_MUTEX(un))); 17751 ASSERT(bp != NULL); 17752 ASSERT(bp != un->un_rqs_bp); 17753 ASSERT(xp != NULL); 17754 ASSERT(pktp != NULL); 17755 17756 sense_key = scsi_sense_key(xp->xb_sense_data); 17757 17758 switch (sense_key) { 17759 case KEY_NO_SENSE: 17760 sd_sense_key_no_sense(un, bp, xp, pktp); 17761 break; 17762 case KEY_RECOVERABLE_ERROR: 17763 sd_sense_key_recoverable_error(un, xp->xb_sense_data, 17764 bp, xp, pktp); 17765 break; 17766 case KEY_NOT_READY: 17767 sd_sense_key_not_ready(un, xp->xb_sense_data, 17768 bp, xp, pktp); 17769 break; 17770 case KEY_MEDIUM_ERROR: 17771 case KEY_HARDWARE_ERROR: 17772 sd_sense_key_medium_or_hardware_error(un, 17773 xp->xb_sense_data, bp, xp, pktp); 17774 break; 17775 case KEY_ILLEGAL_REQUEST: 17776 sd_sense_key_illegal_request(un, bp, xp, pktp); 17777 break; 17778 case KEY_UNIT_ATTENTION: 17779 sd_sense_key_unit_attention(un, xp->xb_sense_data, 17780 bp, xp, pktp); 17781 break; 17782 case KEY_WRITE_PROTECT: 17783 case KEY_VOLUME_OVERFLOW: 17784 case KEY_MISCOMPARE: 17785 sd_sense_key_fail_command(un, bp, xp, pktp); 17786 break; 17787 case KEY_BLANK_CHECK: 17788 sd_sense_key_blank_check(un, bp, xp, pktp); 17789 break; 17790 case KEY_ABORTED_COMMAND: 17791 sd_sense_key_aborted_command(un, bp, xp, pktp); 17792 break; 17793 case KEY_VENDOR_UNIQUE: 17794 case KEY_COPY_ABORTED: 17795 case KEY_EQUAL: 17796 case KEY_RESERVED: 17797 default: 17798 sd_sense_key_default(un, xp->xb_sense_data, 17799 bp, xp, pktp); 17800 break; 17801 } 17802 } 17803 17804 17805 /* 17806 * Function: sd_dump_memory 17807 * 17808 * Description: Debug logging routine to print the contents of a user provided 17809 * buffer. The output of the buffer is broken up into 256 byte 17810 * segments due to a size constraint of the scsi_log. 17811 * implementation. 17812 * 17813 * Arguments: un - ptr to softstate 17814 * comp - component mask 17815 * title - "title" string to preceed data when printed 17816 * data - ptr to data block to be printed 17817 * len - size of data block to be printed 17818 * fmt - SD_LOG_HEX (use 0x%02x format) or SD_LOG_CHAR (use %c) 17819 * 17820 * Context: May be called from interrupt context 17821 */ 17822 17823 #define SD_DUMP_MEMORY_BUF_SIZE 256 17824 17825 static char *sd_dump_format_string[] = { 17826 " 0x%02x", 17827 " %c" 17828 }; 17829 17830 static void 17831 sd_dump_memory(struct sd_lun *un, uint_t comp, char *title, uchar_t *data, 17832 int len, int fmt) 17833 { 17834 int i, j; 17835 int avail_count; 17836 int start_offset; 17837 int end_offset; 17838 size_t entry_len; 17839 char *bufp; 17840 char *local_buf; 17841 char *format_string; 17842 17843 ASSERT((fmt == SD_LOG_HEX) || (fmt == SD_LOG_CHAR)); 17844 17845 /* 17846 * In the debug version of the driver, this function is called from a 17847 * number of places which are NOPs in the release driver. 17848 * The debug driver therefore has additional methods of filtering 17849 * debug output. 17850 */ 17851 #ifdef SDDEBUG 17852 /* 17853 * In the debug version of the driver we can reduce the amount of debug 17854 * messages by setting sd_error_level to something other than 17855 * SCSI_ERR_ALL and clearing bits in sd_level_mask and 17856 * sd_component_mask. 17857 */ 17858 if (((sd_level_mask & (SD_LOGMASK_DUMP_MEM | SD_LOGMASK_DIAG)) == 0) || 17859 (sd_error_level != SCSI_ERR_ALL)) { 17860 return; 17861 } 17862 if (((sd_component_mask & comp) == 0) || 17863 (sd_error_level != SCSI_ERR_ALL)) { 17864 return; 17865 } 17866 #else 17867 if (sd_error_level != SCSI_ERR_ALL) { 17868 return; 17869 } 17870 #endif 17871 17872 local_buf = kmem_zalloc(SD_DUMP_MEMORY_BUF_SIZE, KM_SLEEP); 17873 bufp = local_buf; 17874 /* 17875 * Available length is the length of local_buf[], minus the 17876 * length of the title string, minus one for the ":", minus 17877 * one for the newline, minus one for the NULL terminator. 17878 * This gives the #bytes available for holding the printed 17879 * values from the given data buffer. 17880 */ 17881 if (fmt == SD_LOG_HEX) { 17882 format_string = sd_dump_format_string[0]; 17883 } else /* SD_LOG_CHAR */ { 17884 format_string = sd_dump_format_string[1]; 17885 } 17886 /* 17887 * Available count is the number of elements from the given 17888 * data buffer that we can fit into the available length. 17889 * This is based upon the size of the format string used. 17890 * Make one entry and find it's size. 17891 */ 17892 (void) sprintf(bufp, format_string, data[0]); 17893 entry_len = strlen(bufp); 17894 avail_count = (SD_DUMP_MEMORY_BUF_SIZE - strlen(title) - 3) / entry_len; 17895 17896 j = 0; 17897 while (j < len) { 17898 bufp = local_buf; 17899 bzero(bufp, SD_DUMP_MEMORY_BUF_SIZE); 17900 start_offset = j; 17901 17902 end_offset = start_offset + avail_count; 17903 17904 (void) sprintf(bufp, "%s:", title); 17905 bufp += strlen(bufp); 17906 for (i = start_offset; ((i < end_offset) && (j < len)); 17907 i++, j++) { 17908 (void) sprintf(bufp, format_string, data[i]); 17909 bufp += entry_len; 17910 } 17911 (void) sprintf(bufp, "\n"); 17912 17913 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE, "%s", local_buf); 17914 } 17915 kmem_free(local_buf, SD_DUMP_MEMORY_BUF_SIZE); 17916 } 17917 17918 /* 17919 * Function: sd_print_sense_msg 17920 * 17921 * Description: Log a message based upon the given sense data. 17922 * 17923 * Arguments: un - ptr to associated softstate 17924 * bp - ptr to buf(9S) for the command 17925 * arg - ptr to associate sd_sense_info struct 17926 * code - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED, 17927 * or SD_NO_RETRY_ISSUED 17928 * 17929 * Context: May be called from interrupt context 17930 */ 17931 17932 static void 17933 sd_print_sense_msg(struct sd_lun *un, struct buf *bp, void *arg, int code) 17934 { 17935 struct sd_xbuf *xp; 17936 struct scsi_pkt *pktp; 17937 uint8_t *sensep; 17938 daddr_t request_blkno; 17939 diskaddr_t err_blkno; 17940 int severity; 17941 int pfa_flag; 17942 extern struct scsi_key_strings scsi_cmds[]; 17943 17944 ASSERT(un != NULL); 17945 ASSERT(mutex_owned(SD_MUTEX(un))); 17946 ASSERT(bp != NULL); 17947 xp = SD_GET_XBUF(bp); 17948 ASSERT(xp != NULL); 17949 pktp = SD_GET_PKTP(bp); 17950 ASSERT(pktp != NULL); 17951 ASSERT(arg != NULL); 17952 17953 severity = ((struct sd_sense_info *)(arg))->ssi_severity; 17954 pfa_flag = ((struct sd_sense_info *)(arg))->ssi_pfa_flag; 17955 17956 if ((code == SD_DELAYED_RETRY_ISSUED) || 17957 (code == SD_IMMEDIATE_RETRY_ISSUED)) { 17958 severity = SCSI_ERR_RETRYABLE; 17959 } 17960 17961 /* Use absolute block number for the request block number */ 17962 request_blkno = xp->xb_blkno; 17963 17964 /* 17965 * Now try to get the error block number from the sense data 17966 */ 17967 sensep = xp->xb_sense_data; 17968 17969 if (scsi_sense_info_uint64(sensep, SENSE_LENGTH, 17970 (uint64_t *)&err_blkno)) { 17971 /* 17972 * We retrieved the error block number from the information 17973 * portion of the sense data. 17974 * 17975 * For USCSI commands we are better off using the error 17976 * block no. as the requested block no. (This is the best 17977 * we can estimate.) 17978 */ 17979 if ((SD_IS_BUFIO(xp) == FALSE) && 17980 ((pktp->pkt_flags & FLAG_SILENT) == 0)) { 17981 request_blkno = err_blkno; 17982 } 17983 } else { 17984 /* 17985 * Without the es_valid bit set (for fixed format) or an 17986 * information descriptor (for descriptor format) we cannot 17987 * be certain of the error blkno, so just use the 17988 * request_blkno. 17989 */ 17990 err_blkno = (diskaddr_t)request_blkno; 17991 } 17992 17993 /* 17994 * The following will log the buffer contents for the release driver 17995 * if the SD_LOGMASK_DIAG bit of sd_level_mask is set, or the error 17996 * level is set to verbose. 17997 */ 17998 sd_dump_memory(un, SD_LOG_IO, "Failed CDB", 17999 (uchar_t *)pktp->pkt_cdbp, CDB_SIZE, SD_LOG_HEX); 18000 sd_dump_memory(un, SD_LOG_IO, "Sense Data", 18001 (uchar_t *)sensep, SENSE_LENGTH, SD_LOG_HEX); 18002 18003 if (pfa_flag == FALSE) { 18004 /* This is normally only set for USCSI */ 18005 if ((pktp->pkt_flags & FLAG_SILENT) != 0) { 18006 return; 18007 } 18008 18009 if ((SD_IS_BUFIO(xp) == TRUE) && 18010 (((sd_level_mask & SD_LOGMASK_DIAG) == 0) && 18011 (severity < sd_error_level))) { 18012 return; 18013 } 18014 } 18015 /* 18016 * Check for Sonoma Failover and keep a count of how many failed I/O's 18017 */ 18018 if ((SD_IS_LSI(un)) && 18019 (scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) && 18020 (scsi_sense_asc(sensep) == 0x94) && 18021 (scsi_sense_ascq(sensep) == 0x01)) { 18022 un->un_sonoma_failure_count++; 18023 if (un->un_sonoma_failure_count > 1) { 18024 return; 18025 } 18026 } 18027 18028 if (SD_FM_LOG(un) == SD_FM_LOG_NSUP || 18029 ((scsi_sense_key(sensep) == KEY_RECOVERABLE_ERROR) && 18030 (pktp->pkt_resid == 0))) { 18031 scsi_vu_errmsg(SD_SCSI_DEVP(un), pktp, sd_label, severity, 18032 request_blkno, err_blkno, scsi_cmds, 18033 (struct scsi_extended_sense *)sensep, 18034 un->un_additional_codes, NULL); 18035 } 18036 } 18037 18038 /* 18039 * Function: sd_sense_key_no_sense 18040 * 18041 * Description: Recovery action when sense data was not received. 18042 * 18043 * Context: May be called from interrupt context 18044 */ 18045 18046 static void 18047 sd_sense_key_no_sense(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 18048 struct scsi_pkt *pktp) 18049 { 18050 struct sd_sense_info si; 18051 18052 ASSERT(un != NULL); 18053 ASSERT(mutex_owned(SD_MUTEX(un))); 18054 ASSERT(bp != NULL); 18055 ASSERT(xp != NULL); 18056 ASSERT(pktp != NULL); 18057 18058 si.ssi_severity = SCSI_ERR_FATAL; 18059 si.ssi_pfa_flag = FALSE; 18060 18061 SD_UPDATE_ERRSTATS(un, sd_softerrs); 18062 18063 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg, 18064 &si, EIO, (clock_t)0, NULL); 18065 } 18066 18067 18068 /* 18069 * Function: sd_sense_key_recoverable_error 18070 * 18071 * Description: Recovery actions for a SCSI "Recovered Error" sense key. 18072 * 18073 * Context: May be called from interrupt context 18074 */ 18075 18076 static void 18077 sd_sense_key_recoverable_error(struct sd_lun *un, uint8_t *sense_datap, 18078 struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp) 18079 { 18080 struct sd_sense_info si; 18081 uint8_t asc = scsi_sense_asc(sense_datap); 18082 uint8_t ascq = scsi_sense_ascq(sense_datap); 18083 18084 ASSERT(un != NULL); 18085 ASSERT(mutex_owned(SD_MUTEX(un))); 18086 ASSERT(bp != NULL); 18087 ASSERT(xp != NULL); 18088 ASSERT(pktp != NULL); 18089 18090 /* 18091 * 0x00, 0x1D: ATA PASSTHROUGH INFORMATION AVAILABLE 18092 */ 18093 if (asc == 0x00 && ascq == 0x1D) { 18094 sd_return_command(un, bp); 18095 return; 18096 } 18097 18098 /* 18099 * 0x5D: FAILURE PREDICTION THRESHOLD EXCEEDED 18100 */ 18101 if ((asc == 0x5D) && (sd_report_pfa != 0)) { 18102 SD_UPDATE_ERRSTATS(un, sd_rq_pfa_err); 18103 si.ssi_severity = SCSI_ERR_INFO; 18104 si.ssi_pfa_flag = TRUE; 18105 } else { 18106 SD_UPDATE_ERRSTATS(un, sd_softerrs); 18107 SD_UPDATE_ERRSTATS(un, sd_rq_recov_err); 18108 si.ssi_severity = SCSI_ERR_RECOVERED; 18109 si.ssi_pfa_flag = FALSE; 18110 } 18111 18112 if (pktp->pkt_resid == 0) { 18113 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 18114 sd_return_command(un, bp); 18115 return; 18116 } 18117 18118 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg, 18119 &si, EIO, (clock_t)0, NULL); 18120 } 18121 18122 18123 18124 18125 /* 18126 * Function: sd_sense_key_not_ready 18127 * 18128 * Description: Recovery actions for a SCSI "Not Ready" sense key. 18129 * 18130 * Context: May be called from interrupt context 18131 */ 18132 18133 static void 18134 sd_sense_key_not_ready(struct sd_lun *un, uint8_t *sense_datap, struct buf *bp, 18135 struct sd_xbuf *xp, struct scsi_pkt *pktp) 18136 { 18137 struct sd_sense_info si; 18138 uint8_t asc = scsi_sense_asc(sense_datap); 18139 uint8_t ascq = scsi_sense_ascq(sense_datap); 18140 18141 ASSERT(un != NULL); 18142 ASSERT(mutex_owned(SD_MUTEX(un))); 18143 ASSERT(bp != NULL); 18144 ASSERT(xp != NULL); 18145 ASSERT(pktp != NULL); 18146 18147 si.ssi_severity = SCSI_ERR_FATAL; 18148 si.ssi_pfa_flag = FALSE; 18149 18150 /* 18151 * Update error stats after first NOT READY error. Disks may have 18152 * been powered down and may need to be restarted. For CDROMs, 18153 * report NOT READY errors only if media is present. 18154 */ 18155 if ((ISCD(un) && (asc == 0x3A)) || 18156 (xp->xb_nr_retry_count > 0)) { 18157 SD_UPDATE_ERRSTATS(un, sd_harderrs); 18158 SD_UPDATE_ERRSTATS(un, sd_rq_ntrdy_err); 18159 } 18160 18161 /* 18162 * Just fail if the "not ready" retry limit has been reached. 18163 */ 18164 if (xp->xb_nr_retry_count >= un->un_notready_retry_count) { 18165 /* Special check for error message printing for removables. */ 18166 if (un->un_f_has_removable_media && (asc == 0x04) && 18167 (ascq >= 0x04)) { 18168 si.ssi_severity = SCSI_ERR_ALL; 18169 } 18170 goto fail_command; 18171 } 18172 18173 /* 18174 * Check the ASC and ASCQ in the sense data as needed, to determine 18175 * what to do. 18176 */ 18177 switch (asc) { 18178 case 0x04: /* LOGICAL UNIT NOT READY */ 18179 /* 18180 * disk drives that don't spin up result in a very long delay 18181 * in format without warning messages. We will log a message 18182 * if the error level is set to verbose. 18183 */ 18184 if (sd_error_level < SCSI_ERR_RETRYABLE) { 18185 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 18186 "logical unit not ready, resetting disk\n"); 18187 } 18188 18189 /* 18190 * There are different requirements for CDROMs and disks for 18191 * the number of retries. If a CD-ROM is giving this, it is 18192 * probably reading TOC and is in the process of getting 18193 * ready, so we should keep on trying for a long time to make 18194 * sure that all types of media are taken in account (for 18195 * some media the drive takes a long time to read TOC). For 18196 * disks we do not want to retry this too many times as this 18197 * can cause a long hang in format when the drive refuses to 18198 * spin up (a very common failure). 18199 */ 18200 switch (ascq) { 18201 case 0x00: /* LUN NOT READY, CAUSE NOT REPORTABLE */ 18202 /* 18203 * Disk drives frequently refuse to spin up which 18204 * results in a very long hang in format without 18205 * warning messages. 18206 * 18207 * Note: This code preserves the legacy behavior of 18208 * comparing xb_nr_retry_count against zero for fibre 18209 * channel targets instead of comparing against the 18210 * un_reset_retry_count value. The reason for this 18211 * discrepancy has been so utterly lost beneath the 18212 * Sands of Time that even Indiana Jones could not 18213 * find it. 18214 */ 18215 if (un->un_f_is_fibre == TRUE) { 18216 if (((sd_level_mask & SD_LOGMASK_DIAG) || 18217 (xp->xb_nr_retry_count > 0)) && 18218 (un->un_startstop_timeid == NULL)) { 18219 scsi_log(SD_DEVINFO(un), sd_label, 18220 CE_WARN, "logical unit not ready, " 18221 "resetting disk\n"); 18222 sd_reset_target(un, pktp); 18223 } 18224 } else { 18225 if (((sd_level_mask & SD_LOGMASK_DIAG) || 18226 (xp->xb_nr_retry_count > 18227 un->un_reset_retry_count)) && 18228 (un->un_startstop_timeid == NULL)) { 18229 scsi_log(SD_DEVINFO(un), sd_label, 18230 CE_WARN, "logical unit not ready, " 18231 "resetting disk\n"); 18232 sd_reset_target(un, pktp); 18233 } 18234 } 18235 break; 18236 18237 case 0x01: /* LUN IS IN PROCESS OF BECOMING READY */ 18238 /* 18239 * If the target is in the process of becoming 18240 * ready, just proceed with the retry. This can 18241 * happen with CD-ROMs that take a long time to 18242 * read TOC after a power cycle or reset. 18243 */ 18244 goto do_retry; 18245 18246 case 0x02: /* LUN NOT READY, INITITIALIZING CMD REQUIRED */ 18247 break; 18248 18249 case 0x03: /* LUN NOT READY, MANUAL INTERVENTION REQUIRED */ 18250 /* 18251 * Retries cannot help here so just fail right away. 18252 */ 18253 goto fail_command; 18254 18255 case 0x88: 18256 /* 18257 * Vendor-unique code for T3/T4: it indicates a 18258 * path problem in a mutipathed config, but as far as 18259 * the target driver is concerned it equates to a fatal 18260 * error, so we should just fail the command right away 18261 * (without printing anything to the console). If this 18262 * is not a T3/T4, fall thru to the default recovery 18263 * action. 18264 * T3/T4 is FC only, don't need to check is_fibre 18265 */ 18266 if (SD_IS_T3(un) || SD_IS_T4(un)) { 18267 sd_return_failed_command(un, bp, EIO); 18268 return; 18269 } 18270 /* FALLTHRU */ 18271 18272 case 0x04: /* LUN NOT READY, FORMAT IN PROGRESS */ 18273 case 0x05: /* LUN NOT READY, REBUILD IN PROGRESS */ 18274 case 0x06: /* LUN NOT READY, RECALCULATION IN PROGRESS */ 18275 case 0x07: /* LUN NOT READY, OPERATION IN PROGRESS */ 18276 case 0x08: /* LUN NOT READY, LONG WRITE IN PROGRESS */ 18277 default: /* Possible future codes in SCSI spec? */ 18278 /* 18279 * For removable-media devices, do not retry if 18280 * ASCQ > 2 as these result mostly from USCSI commands 18281 * on MMC devices issued to check status of an 18282 * operation initiated in immediate mode. Also for 18283 * ASCQ >= 4 do not print console messages as these 18284 * mainly represent a user-initiated operation 18285 * instead of a system failure. 18286 */ 18287 if (un->un_f_has_removable_media) { 18288 si.ssi_severity = SCSI_ERR_ALL; 18289 goto fail_command; 18290 } 18291 break; 18292 } 18293 18294 /* 18295 * As part of our recovery attempt for the NOT READY 18296 * condition, we issue a START STOP UNIT command. However 18297 * we want to wait for a short delay before attempting this 18298 * as there may still be more commands coming back from the 18299 * target with the check condition. To do this we use 18300 * timeout(9F) to call sd_start_stop_unit_callback() after 18301 * the delay interval expires. (sd_start_stop_unit_callback() 18302 * dispatches sd_start_stop_unit_task(), which will issue 18303 * the actual START STOP UNIT command. The delay interval 18304 * is one-half of the delay that we will use to retry the 18305 * command that generated the NOT READY condition. 18306 * 18307 * Note that we could just dispatch sd_start_stop_unit_task() 18308 * from here and allow it to sleep for the delay interval, 18309 * but then we would be tying up the taskq thread 18310 * uncesessarily for the duration of the delay. 18311 * 18312 * Do not issue the START STOP UNIT if the current command 18313 * is already a START STOP UNIT. 18314 */ 18315 if (pktp->pkt_cdbp[0] == SCMD_START_STOP) { 18316 break; 18317 } 18318 18319 /* 18320 * Do not schedule the timeout if one is already pending. 18321 */ 18322 if (un->un_startstop_timeid != NULL) { 18323 SD_INFO(SD_LOG_ERROR, un, 18324 "sd_sense_key_not_ready: restart already issued to" 18325 " %s%d\n", ddi_driver_name(SD_DEVINFO(un)), 18326 ddi_get_instance(SD_DEVINFO(un))); 18327 break; 18328 } 18329 18330 /* 18331 * Schedule the START STOP UNIT command, then queue the command 18332 * for a retry. 18333 * 18334 * Note: A timeout is not scheduled for this retry because we 18335 * want the retry to be serial with the START_STOP_UNIT. The 18336 * retry will be started when the START_STOP_UNIT is completed 18337 * in sd_start_stop_unit_task. 18338 */ 18339 un->un_startstop_timeid = timeout(sd_start_stop_unit_callback, 18340 un, un->un_busy_timeout / 2); 18341 xp->xb_nr_retry_count++; 18342 sd_set_retry_bp(un, bp, 0, kstat_waitq_enter); 18343 return; 18344 18345 case 0x05: /* LOGICAL UNIT DOES NOT RESPOND TO SELECTION */ 18346 if (sd_error_level < SCSI_ERR_RETRYABLE) { 18347 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 18348 "unit does not respond to selection\n"); 18349 } 18350 break; 18351 18352 case 0x3A: /* MEDIUM NOT PRESENT */ 18353 if (sd_error_level >= SCSI_ERR_FATAL) { 18354 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 18355 "Caddy not inserted in drive\n"); 18356 } 18357 18358 sr_ejected(un); 18359 un->un_mediastate = DKIO_EJECTED; 18360 /* The state has changed, inform the media watch routines */ 18361 cv_broadcast(&un->un_state_cv); 18362 /* Just fail if no media is present in the drive. */ 18363 goto fail_command; 18364 18365 default: 18366 if (sd_error_level < SCSI_ERR_RETRYABLE) { 18367 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE, 18368 "Unit not Ready. Additional sense code 0x%x\n", 18369 asc); 18370 } 18371 break; 18372 } 18373 18374 do_retry: 18375 18376 /* 18377 * Retry the command, as some targets may report NOT READY for 18378 * several seconds after being reset. 18379 */ 18380 xp->xb_nr_retry_count++; 18381 si.ssi_severity = SCSI_ERR_RETRYABLE; 18382 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, sd_print_sense_msg, 18383 &si, EIO, un->un_busy_timeout, NULL); 18384 18385 return; 18386 18387 fail_command: 18388 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 18389 sd_return_failed_command(un, bp, EIO); 18390 } 18391 18392 18393 18394 /* 18395 * Function: sd_sense_key_medium_or_hardware_error 18396 * 18397 * Description: Recovery actions for a SCSI "Medium Error" or "Hardware Error" 18398 * sense key. 18399 * 18400 * Context: May be called from interrupt context 18401 */ 18402 18403 static void 18404 sd_sense_key_medium_or_hardware_error(struct sd_lun *un, uint8_t *sense_datap, 18405 struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp) 18406 { 18407 struct sd_sense_info si; 18408 uint8_t sense_key = scsi_sense_key(sense_datap); 18409 uint8_t asc = scsi_sense_asc(sense_datap); 18410 18411 ASSERT(un != NULL); 18412 ASSERT(mutex_owned(SD_MUTEX(un))); 18413 ASSERT(bp != NULL); 18414 ASSERT(xp != NULL); 18415 ASSERT(pktp != NULL); 18416 18417 si.ssi_severity = SCSI_ERR_FATAL; 18418 si.ssi_pfa_flag = FALSE; 18419 18420 if (sense_key == KEY_MEDIUM_ERROR) { 18421 SD_UPDATE_ERRSTATS(un, sd_rq_media_err); 18422 } 18423 18424 SD_UPDATE_ERRSTATS(un, sd_harderrs); 18425 18426 if ((un->un_reset_retry_count != 0) && 18427 (xp->xb_retry_count == un->un_reset_retry_count)) { 18428 mutex_exit(SD_MUTEX(un)); 18429 /* Do NOT do a RESET_ALL here: too intrusive. (4112858) */ 18430 if (un->un_f_allow_bus_device_reset == TRUE) { 18431 18432 boolean_t try_resetting_target = B_TRUE; 18433 18434 /* 18435 * We need to be able to handle specific ASC when we are 18436 * handling a KEY_HARDWARE_ERROR. In particular 18437 * taking the default action of resetting the target may 18438 * not be the appropriate way to attempt recovery. 18439 * Resetting a target because of a single LUN failure 18440 * victimizes all LUNs on that target. 18441 * 18442 * This is true for the LSI arrays, if an LSI 18443 * array controller returns an ASC of 0x84 (LUN Dead) we 18444 * should trust it. 18445 */ 18446 18447 if (sense_key == KEY_HARDWARE_ERROR) { 18448 switch (asc) { 18449 case 0x84: 18450 if (SD_IS_LSI(un)) { 18451 try_resetting_target = B_FALSE; 18452 } 18453 break; 18454 default: 18455 break; 18456 } 18457 } 18458 18459 if (try_resetting_target == B_TRUE) { 18460 int reset_retval = 0; 18461 if (un->un_f_lun_reset_enabled == TRUE) { 18462 SD_TRACE(SD_LOG_IO_CORE, un, 18463 "sd_sense_key_medium_or_hardware_" 18464 "error: issuing RESET_LUN\n"); 18465 reset_retval = 18466 scsi_reset(SD_ADDRESS(un), 18467 RESET_LUN); 18468 } 18469 if (reset_retval == 0) { 18470 SD_TRACE(SD_LOG_IO_CORE, un, 18471 "sd_sense_key_medium_or_hardware_" 18472 "error: issuing RESET_TARGET\n"); 18473 (void) scsi_reset(SD_ADDRESS(un), 18474 RESET_TARGET); 18475 } 18476 } 18477 } 18478 mutex_enter(SD_MUTEX(un)); 18479 } 18480 18481 /* 18482 * This really ought to be a fatal error, but we will retry anyway 18483 * as some drives report this as a spurious error. 18484 */ 18485 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg, 18486 &si, EIO, (clock_t)0, NULL); 18487 } 18488 18489 18490 18491 /* 18492 * Function: sd_sense_key_illegal_request 18493 * 18494 * Description: Recovery actions for a SCSI "Illegal Request" sense key. 18495 * 18496 * Context: May be called from interrupt context 18497 */ 18498 18499 static void 18500 sd_sense_key_illegal_request(struct sd_lun *un, struct buf *bp, 18501 struct sd_xbuf *xp, struct scsi_pkt *pktp) 18502 { 18503 struct sd_sense_info si; 18504 18505 ASSERT(un != NULL); 18506 ASSERT(mutex_owned(SD_MUTEX(un))); 18507 ASSERT(bp != NULL); 18508 ASSERT(xp != NULL); 18509 ASSERT(pktp != NULL); 18510 18511 SD_UPDATE_ERRSTATS(un, sd_rq_illrq_err); 18512 18513 si.ssi_severity = SCSI_ERR_INFO; 18514 si.ssi_pfa_flag = FALSE; 18515 18516 /* Pointless to retry if the target thinks it's an illegal request */ 18517 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 18518 sd_return_failed_command(un, bp, EIO); 18519 } 18520 18521 18522 18523 18524 /* 18525 * Function: sd_sense_key_unit_attention 18526 * 18527 * Description: Recovery actions for a SCSI "Unit Attention" sense key. 18528 * 18529 * Context: May be called from interrupt context 18530 */ 18531 18532 static void 18533 sd_sense_key_unit_attention(struct sd_lun *un, uint8_t *sense_datap, 18534 struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp) 18535 { 18536 /* 18537 * For UNIT ATTENTION we allow retries for one minute. Devices 18538 * like Sonoma can return UNIT ATTENTION close to a minute 18539 * under certain conditions. 18540 */ 18541 int retry_check_flag = SD_RETRIES_UA; 18542 boolean_t kstat_updated = B_FALSE; 18543 struct sd_sense_info si; 18544 uint8_t asc = scsi_sense_asc(sense_datap); 18545 uint8_t ascq = scsi_sense_ascq(sense_datap); 18546 18547 ASSERT(un != NULL); 18548 ASSERT(mutex_owned(SD_MUTEX(un))); 18549 ASSERT(bp != NULL); 18550 ASSERT(xp != NULL); 18551 ASSERT(pktp != NULL); 18552 18553 si.ssi_severity = SCSI_ERR_INFO; 18554 si.ssi_pfa_flag = FALSE; 18555 18556 18557 switch (asc) { 18558 case 0x5D: /* FAILURE PREDICTION THRESHOLD EXCEEDED */ 18559 if (sd_report_pfa != 0) { 18560 SD_UPDATE_ERRSTATS(un, sd_rq_pfa_err); 18561 si.ssi_pfa_flag = TRUE; 18562 retry_check_flag = SD_RETRIES_STANDARD; 18563 goto do_retry; 18564 } 18565 18566 break; 18567 18568 case 0x29: /* POWER ON, RESET, OR BUS DEVICE RESET OCCURRED */ 18569 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) { 18570 un->un_resvd_status |= 18571 (SD_LOST_RESERVE | SD_WANT_RESERVE); 18572 } 18573 #ifdef _LP64 18574 if (un->un_blockcount + 1 > SD_GROUP1_MAX_ADDRESS) { 18575 if (taskq_dispatch(sd_tq, sd_reenable_dsense_task, 18576 un, KM_NOSLEEP) == 0) { 18577 /* 18578 * If we can't dispatch the task we'll just 18579 * live without descriptor sense. We can 18580 * try again on the next "unit attention" 18581 */ 18582 SD_ERROR(SD_LOG_ERROR, un, 18583 "sd_sense_key_unit_attention: " 18584 "Could not dispatch " 18585 "sd_reenable_dsense_task\n"); 18586 } 18587 } 18588 #endif /* _LP64 */ 18589 /* FALLTHRU */ 18590 18591 case 0x28: /* NOT READY TO READY CHANGE, MEDIUM MAY HAVE CHANGED */ 18592 if (!un->un_f_has_removable_media) { 18593 break; 18594 } 18595 18596 /* 18597 * When we get a unit attention from a removable-media device, 18598 * it may be in a state that will take a long time to recover 18599 * (e.g., from a reset). Since we are executing in interrupt 18600 * context here, we cannot wait around for the device to come 18601 * back. So hand this command off to sd_media_change_task() 18602 * for deferred processing under taskq thread context. (Note 18603 * that the command still may be failed if a problem is 18604 * encountered at a later time.) 18605 */ 18606 if (taskq_dispatch(sd_tq, sd_media_change_task, pktp, 18607 KM_NOSLEEP) == 0) { 18608 /* 18609 * Cannot dispatch the request so fail the command. 18610 */ 18611 SD_UPDATE_ERRSTATS(un, sd_harderrs); 18612 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err); 18613 si.ssi_severity = SCSI_ERR_FATAL; 18614 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 18615 sd_return_failed_command(un, bp, EIO); 18616 } 18617 18618 /* 18619 * If failed to dispatch sd_media_change_task(), we already 18620 * updated kstat. If succeed to dispatch sd_media_change_task(), 18621 * we should update kstat later if it encounters an error. So, 18622 * we update kstat_updated flag here. 18623 */ 18624 kstat_updated = B_TRUE; 18625 18626 /* 18627 * Either the command has been successfully dispatched to a 18628 * task Q for retrying, or the dispatch failed. In either case 18629 * do NOT retry again by calling sd_retry_command. This sets up 18630 * two retries of the same command and when one completes and 18631 * frees the resources the other will access freed memory, 18632 * a bad thing. 18633 */ 18634 return; 18635 18636 default: 18637 break; 18638 } 18639 18640 /* 18641 * ASC ASCQ 18642 * 2A 09 Capacity data has changed 18643 * 2A 01 Mode parameters changed 18644 * 3F 0E Reported luns data has changed 18645 * Arrays that support logical unit expansion should report 18646 * capacity changes(2Ah/09). Mode parameters changed and 18647 * reported luns data has changed are the approximation. 18648 */ 18649 if (((asc == 0x2a) && (ascq == 0x09)) || 18650 ((asc == 0x2a) && (ascq == 0x01)) || 18651 ((asc == 0x3f) && (ascq == 0x0e))) { 18652 if (taskq_dispatch(sd_tq, sd_target_change_task, un, 18653 KM_NOSLEEP) == 0) { 18654 SD_ERROR(SD_LOG_ERROR, un, 18655 "sd_sense_key_unit_attention: " 18656 "Could not dispatch sd_target_change_task\n"); 18657 } 18658 } 18659 18660 /* 18661 * Update kstat if we haven't done that. 18662 */ 18663 if (!kstat_updated) { 18664 SD_UPDATE_ERRSTATS(un, sd_harderrs); 18665 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err); 18666 } 18667 18668 do_retry: 18669 sd_retry_command(un, bp, retry_check_flag, sd_print_sense_msg, &si, 18670 EIO, SD_UA_RETRY_DELAY, NULL); 18671 } 18672 18673 18674 18675 /* 18676 * Function: sd_sense_key_fail_command 18677 * 18678 * Description: Use to fail a command when we don't like the sense key that 18679 * was returned. 18680 * 18681 * Context: May be called from interrupt context 18682 */ 18683 18684 static void 18685 sd_sense_key_fail_command(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 18686 struct scsi_pkt *pktp) 18687 { 18688 struct sd_sense_info si; 18689 18690 ASSERT(un != NULL); 18691 ASSERT(mutex_owned(SD_MUTEX(un))); 18692 ASSERT(bp != NULL); 18693 ASSERT(xp != NULL); 18694 ASSERT(pktp != NULL); 18695 18696 si.ssi_severity = SCSI_ERR_FATAL; 18697 si.ssi_pfa_flag = FALSE; 18698 18699 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 18700 sd_return_failed_command(un, bp, EIO); 18701 } 18702 18703 18704 18705 /* 18706 * Function: sd_sense_key_blank_check 18707 * 18708 * Description: Recovery actions for a SCSI "Blank Check" sense key. 18709 * Has no monetary connotation. 18710 * 18711 * Context: May be called from interrupt context 18712 */ 18713 18714 static void 18715 sd_sense_key_blank_check(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 18716 struct scsi_pkt *pktp) 18717 { 18718 struct sd_sense_info si; 18719 18720 ASSERT(un != NULL); 18721 ASSERT(mutex_owned(SD_MUTEX(un))); 18722 ASSERT(bp != NULL); 18723 ASSERT(xp != NULL); 18724 ASSERT(pktp != NULL); 18725 18726 /* 18727 * Blank check is not fatal for removable devices, therefore 18728 * it does not require a console message. 18729 */ 18730 si.ssi_severity = (un->un_f_has_removable_media) ? SCSI_ERR_ALL : 18731 SCSI_ERR_FATAL; 18732 si.ssi_pfa_flag = FALSE; 18733 18734 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 18735 sd_return_failed_command(un, bp, EIO); 18736 } 18737 18738 18739 18740 18741 /* 18742 * Function: sd_sense_key_aborted_command 18743 * 18744 * Description: Recovery actions for a SCSI "Aborted Command" sense key. 18745 * 18746 * Context: May be called from interrupt context 18747 */ 18748 18749 static void 18750 sd_sense_key_aborted_command(struct sd_lun *un, struct buf *bp, 18751 struct sd_xbuf *xp, struct scsi_pkt *pktp) 18752 { 18753 struct sd_sense_info si; 18754 18755 ASSERT(un != NULL); 18756 ASSERT(mutex_owned(SD_MUTEX(un))); 18757 ASSERT(bp != NULL); 18758 ASSERT(xp != NULL); 18759 ASSERT(pktp != NULL); 18760 18761 si.ssi_severity = SCSI_ERR_FATAL; 18762 si.ssi_pfa_flag = FALSE; 18763 18764 SD_UPDATE_ERRSTATS(un, sd_harderrs); 18765 18766 /* 18767 * This really ought to be a fatal error, but we will retry anyway 18768 * as some drives report this as a spurious error. 18769 */ 18770 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg, 18771 &si, EIO, drv_usectohz(100000), NULL); 18772 } 18773 18774 18775 18776 /* 18777 * Function: sd_sense_key_default 18778 * 18779 * Description: Default recovery action for several SCSI sense keys (basically 18780 * attempts a retry). 18781 * 18782 * Context: May be called from interrupt context 18783 */ 18784 18785 static void 18786 sd_sense_key_default(struct sd_lun *un, uint8_t *sense_datap, struct buf *bp, 18787 struct sd_xbuf *xp, struct scsi_pkt *pktp) 18788 { 18789 struct sd_sense_info si; 18790 uint8_t sense_key = scsi_sense_key(sense_datap); 18791 18792 ASSERT(un != NULL); 18793 ASSERT(mutex_owned(SD_MUTEX(un))); 18794 ASSERT(bp != NULL); 18795 ASSERT(xp != NULL); 18796 ASSERT(pktp != NULL); 18797 18798 SD_UPDATE_ERRSTATS(un, sd_harderrs); 18799 18800 /* 18801 * Undecoded sense key. Attempt retries and hope that will fix 18802 * the problem. Otherwise, we're dead. 18803 */ 18804 if ((pktp->pkt_flags & FLAG_SILENT) == 0) { 18805 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 18806 "Unhandled Sense Key '%s'\n", sense_keys[sense_key]); 18807 } 18808 18809 si.ssi_severity = SCSI_ERR_FATAL; 18810 si.ssi_pfa_flag = FALSE; 18811 18812 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg, 18813 &si, EIO, (clock_t)0, NULL); 18814 } 18815 18816 18817 18818 /* 18819 * Function: sd_print_retry_msg 18820 * 18821 * Description: Print a message indicating the retry action being taken. 18822 * 18823 * Arguments: un - ptr to associated softstate 18824 * bp - ptr to buf(9S) for the command 18825 * arg - not used. 18826 * flag - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED, 18827 * or SD_NO_RETRY_ISSUED 18828 * 18829 * Context: May be called from interrupt context 18830 */ 18831 /* ARGSUSED */ 18832 static void 18833 sd_print_retry_msg(struct sd_lun *un, struct buf *bp, void *arg, int flag) 18834 { 18835 struct sd_xbuf *xp; 18836 struct scsi_pkt *pktp; 18837 char *reasonp; 18838 char *msgp; 18839 18840 ASSERT(un != NULL); 18841 ASSERT(mutex_owned(SD_MUTEX(un))); 18842 ASSERT(bp != NULL); 18843 pktp = SD_GET_PKTP(bp); 18844 ASSERT(pktp != NULL); 18845 xp = SD_GET_XBUF(bp); 18846 ASSERT(xp != NULL); 18847 18848 ASSERT(!mutex_owned(&un->un_pm_mutex)); 18849 mutex_enter(&un->un_pm_mutex); 18850 if ((un->un_state == SD_STATE_SUSPENDED) || 18851 (SD_DEVICE_IS_IN_LOW_POWER(un)) || 18852 (pktp->pkt_flags & FLAG_SILENT)) { 18853 mutex_exit(&un->un_pm_mutex); 18854 goto update_pkt_reason; 18855 } 18856 mutex_exit(&un->un_pm_mutex); 18857 18858 /* 18859 * Suppress messages if they are all the same pkt_reason; with 18860 * TQ, many (up to 256) are returned with the same pkt_reason. 18861 * If we are in panic, then suppress the retry messages. 18862 */ 18863 switch (flag) { 18864 case SD_NO_RETRY_ISSUED: 18865 msgp = "giving up"; 18866 break; 18867 case SD_IMMEDIATE_RETRY_ISSUED: 18868 case SD_DELAYED_RETRY_ISSUED: 18869 if (ddi_in_panic() || (un->un_state == SD_STATE_OFFLINE) || 18870 ((pktp->pkt_reason == un->un_last_pkt_reason) && 18871 (sd_error_level != SCSI_ERR_ALL))) { 18872 return; 18873 } 18874 msgp = "retrying command"; 18875 break; 18876 default: 18877 goto update_pkt_reason; 18878 } 18879 18880 reasonp = (((pktp->pkt_statistics & STAT_PERR) != 0) ? "parity error" : 18881 scsi_rname(pktp->pkt_reason)); 18882 18883 if (SD_FM_LOG(un) == SD_FM_LOG_NSUP) { 18884 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 18885 "SCSI transport failed: reason '%s': %s\n", reasonp, msgp); 18886 } 18887 18888 update_pkt_reason: 18889 /* 18890 * Update un->un_last_pkt_reason with the value in pktp->pkt_reason. 18891 * This is to prevent multiple console messages for the same failure 18892 * condition. Note that un->un_last_pkt_reason is NOT restored if & 18893 * when the command is retried successfully because there still may be 18894 * more commands coming back with the same value of pktp->pkt_reason. 18895 */ 18896 if ((pktp->pkt_reason != CMD_CMPLT) || (xp->xb_retry_count == 0)) { 18897 un->un_last_pkt_reason = pktp->pkt_reason; 18898 } 18899 } 18900 18901 18902 /* 18903 * Function: sd_print_cmd_incomplete_msg 18904 * 18905 * Description: Message logging fn. for a SCSA "CMD_INCOMPLETE" pkt_reason. 18906 * 18907 * Arguments: un - ptr to associated softstate 18908 * bp - ptr to buf(9S) for the command 18909 * arg - passed to sd_print_retry_msg() 18910 * code - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED, 18911 * or SD_NO_RETRY_ISSUED 18912 * 18913 * Context: May be called from interrupt context 18914 */ 18915 18916 static void 18917 sd_print_cmd_incomplete_msg(struct sd_lun *un, struct buf *bp, void *arg, 18918 int code) 18919 { 18920 dev_info_t *dip; 18921 18922 ASSERT(un != NULL); 18923 ASSERT(mutex_owned(SD_MUTEX(un))); 18924 ASSERT(bp != NULL); 18925 18926 switch (code) { 18927 case SD_NO_RETRY_ISSUED: 18928 /* Command was failed. Someone turned off this target? */ 18929 if (un->un_state != SD_STATE_OFFLINE) { 18930 /* 18931 * Suppress message if we are detaching and 18932 * device has been disconnected 18933 * Note that DEVI_IS_DEVICE_REMOVED is a consolidation 18934 * private interface and not part of the DDI 18935 */ 18936 dip = un->un_sd->sd_dev; 18937 if (!(DEVI_IS_DETACHING(dip) && 18938 DEVI_IS_DEVICE_REMOVED(dip))) { 18939 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 18940 "disk not responding to selection\n"); 18941 } 18942 New_state(un, SD_STATE_OFFLINE); 18943 } 18944 break; 18945 18946 case SD_DELAYED_RETRY_ISSUED: 18947 case SD_IMMEDIATE_RETRY_ISSUED: 18948 default: 18949 /* Command was successfully queued for retry */ 18950 sd_print_retry_msg(un, bp, arg, code); 18951 break; 18952 } 18953 } 18954 18955 18956 /* 18957 * Function: sd_pkt_reason_cmd_incomplete 18958 * 18959 * Description: Recovery actions for a SCSA "CMD_INCOMPLETE" pkt_reason. 18960 * 18961 * Context: May be called from interrupt context 18962 */ 18963 18964 static void 18965 sd_pkt_reason_cmd_incomplete(struct sd_lun *un, struct buf *bp, 18966 struct sd_xbuf *xp, struct scsi_pkt *pktp) 18967 { 18968 int flag = SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE; 18969 18970 ASSERT(un != NULL); 18971 ASSERT(mutex_owned(SD_MUTEX(un))); 18972 ASSERT(bp != NULL); 18973 ASSERT(xp != NULL); 18974 ASSERT(pktp != NULL); 18975 18976 /* Do not do a reset if selection did not complete */ 18977 /* Note: Should this not just check the bit? */ 18978 if (pktp->pkt_state != STATE_GOT_BUS) { 18979 SD_UPDATE_ERRSTATS(un, sd_transerrs); 18980 sd_reset_target(un, pktp); 18981 } 18982 18983 /* 18984 * If the target was not successfully selected, then set 18985 * SD_RETRIES_FAILFAST to indicate that we lost communication 18986 * with the target, and further retries and/or commands are 18987 * likely to take a long time. 18988 */ 18989 if ((pktp->pkt_state & STATE_GOT_TARGET) == 0) { 18990 flag |= SD_RETRIES_FAILFAST; 18991 } 18992 18993 SD_UPDATE_RESERVATION_STATUS(un, pktp); 18994 18995 sd_retry_command(un, bp, flag, 18996 sd_print_cmd_incomplete_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 18997 } 18998 18999 19000 19001 /* 19002 * Function: sd_pkt_reason_cmd_tran_err 19003 * 19004 * Description: Recovery actions for a SCSA "CMD_TRAN_ERR" pkt_reason. 19005 * 19006 * Context: May be called from interrupt context 19007 */ 19008 19009 static void 19010 sd_pkt_reason_cmd_tran_err(struct sd_lun *un, struct buf *bp, 19011 struct sd_xbuf *xp, struct scsi_pkt *pktp) 19012 { 19013 ASSERT(un != NULL); 19014 ASSERT(mutex_owned(SD_MUTEX(un))); 19015 ASSERT(bp != NULL); 19016 ASSERT(xp != NULL); 19017 ASSERT(pktp != NULL); 19018 19019 /* 19020 * Do not reset if we got a parity error, or if 19021 * selection did not complete. 19022 */ 19023 SD_UPDATE_ERRSTATS(un, sd_harderrs); 19024 /* Note: Should this not just check the bit for pkt_state? */ 19025 if (((pktp->pkt_statistics & STAT_PERR) == 0) && 19026 (pktp->pkt_state != STATE_GOT_BUS)) { 19027 SD_UPDATE_ERRSTATS(un, sd_transerrs); 19028 sd_reset_target(un, pktp); 19029 } 19030 19031 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19032 19033 sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE), 19034 sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19035 } 19036 19037 19038 19039 /* 19040 * Function: sd_pkt_reason_cmd_reset 19041 * 19042 * Description: Recovery actions for a SCSA "CMD_RESET" pkt_reason. 19043 * 19044 * Context: May be called from interrupt context 19045 */ 19046 19047 static void 19048 sd_pkt_reason_cmd_reset(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 19049 struct scsi_pkt *pktp) 19050 { 19051 ASSERT(un != NULL); 19052 ASSERT(mutex_owned(SD_MUTEX(un))); 19053 ASSERT(bp != NULL); 19054 ASSERT(xp != NULL); 19055 ASSERT(pktp != NULL); 19056 19057 /* The target may still be running the command, so try to reset. */ 19058 SD_UPDATE_ERRSTATS(un, sd_transerrs); 19059 sd_reset_target(un, pktp); 19060 19061 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19062 19063 /* 19064 * If pkt_reason is CMD_RESET chances are that this pkt got 19065 * reset because another target on this bus caused it. The target 19066 * that caused it should get CMD_TIMEOUT with pkt_statistics 19067 * of STAT_TIMEOUT/STAT_DEV_RESET. 19068 */ 19069 19070 sd_retry_command(un, bp, (SD_RETRIES_VICTIM | SD_RETRIES_ISOLATE), 19071 sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19072 } 19073 19074 19075 19076 19077 /* 19078 * Function: sd_pkt_reason_cmd_aborted 19079 * 19080 * Description: Recovery actions for a SCSA "CMD_ABORTED" pkt_reason. 19081 * 19082 * Context: May be called from interrupt context 19083 */ 19084 19085 static void 19086 sd_pkt_reason_cmd_aborted(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 19087 struct scsi_pkt *pktp) 19088 { 19089 ASSERT(un != NULL); 19090 ASSERT(mutex_owned(SD_MUTEX(un))); 19091 ASSERT(bp != NULL); 19092 ASSERT(xp != NULL); 19093 ASSERT(pktp != NULL); 19094 19095 /* The target may still be running the command, so try to reset. */ 19096 SD_UPDATE_ERRSTATS(un, sd_transerrs); 19097 sd_reset_target(un, pktp); 19098 19099 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19100 19101 /* 19102 * If pkt_reason is CMD_ABORTED chances are that this pkt got 19103 * aborted because another target on this bus caused it. The target 19104 * that caused it should get CMD_TIMEOUT with pkt_statistics 19105 * of STAT_TIMEOUT/STAT_DEV_RESET. 19106 */ 19107 19108 sd_retry_command(un, bp, (SD_RETRIES_VICTIM | SD_RETRIES_ISOLATE), 19109 sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19110 } 19111 19112 19113 19114 /* 19115 * Function: sd_pkt_reason_cmd_timeout 19116 * 19117 * Description: Recovery actions for a SCSA "CMD_TIMEOUT" pkt_reason. 19118 * 19119 * Context: May be called from interrupt context 19120 */ 19121 19122 static void 19123 sd_pkt_reason_cmd_timeout(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 19124 struct scsi_pkt *pktp) 19125 { 19126 ASSERT(un != NULL); 19127 ASSERT(mutex_owned(SD_MUTEX(un))); 19128 ASSERT(bp != NULL); 19129 ASSERT(xp != NULL); 19130 ASSERT(pktp != NULL); 19131 19132 19133 SD_UPDATE_ERRSTATS(un, sd_transerrs); 19134 sd_reset_target(un, pktp); 19135 19136 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19137 19138 /* 19139 * A command timeout indicates that we could not establish 19140 * communication with the target, so set SD_RETRIES_FAILFAST 19141 * as further retries/commands are likely to take a long time. 19142 */ 19143 sd_retry_command(un, bp, 19144 (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE | SD_RETRIES_FAILFAST), 19145 sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19146 } 19147 19148 19149 19150 /* 19151 * Function: sd_pkt_reason_cmd_unx_bus_free 19152 * 19153 * Description: Recovery actions for a SCSA "CMD_UNX_BUS_FREE" pkt_reason. 19154 * 19155 * Context: May be called from interrupt context 19156 */ 19157 19158 static void 19159 sd_pkt_reason_cmd_unx_bus_free(struct sd_lun *un, struct buf *bp, 19160 struct sd_xbuf *xp, struct scsi_pkt *pktp) 19161 { 19162 void (*funcp)(struct sd_lun *un, struct buf *bp, void *arg, int code); 19163 19164 ASSERT(un != NULL); 19165 ASSERT(mutex_owned(SD_MUTEX(un))); 19166 ASSERT(bp != NULL); 19167 ASSERT(xp != NULL); 19168 ASSERT(pktp != NULL); 19169 19170 SD_UPDATE_ERRSTATS(un, sd_harderrs); 19171 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19172 19173 funcp = ((pktp->pkt_statistics & STAT_PERR) == 0) ? 19174 sd_print_retry_msg : NULL; 19175 19176 sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE), 19177 funcp, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19178 } 19179 19180 19181 /* 19182 * Function: sd_pkt_reason_cmd_tag_reject 19183 * 19184 * Description: Recovery actions for a SCSA "CMD_TAG_REJECT" pkt_reason. 19185 * 19186 * Context: May be called from interrupt context 19187 */ 19188 19189 static void 19190 sd_pkt_reason_cmd_tag_reject(struct sd_lun *un, struct buf *bp, 19191 struct sd_xbuf *xp, struct scsi_pkt *pktp) 19192 { 19193 ASSERT(un != NULL); 19194 ASSERT(mutex_owned(SD_MUTEX(un))); 19195 ASSERT(bp != NULL); 19196 ASSERT(xp != NULL); 19197 ASSERT(pktp != NULL); 19198 19199 SD_UPDATE_ERRSTATS(un, sd_harderrs); 19200 pktp->pkt_flags = 0; 19201 un->un_tagflags = 0; 19202 if (un->un_f_opt_queueing == TRUE) { 19203 un->un_throttle = min(un->un_throttle, 3); 19204 } else { 19205 un->un_throttle = 1; 19206 } 19207 mutex_exit(SD_MUTEX(un)); 19208 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1); 19209 mutex_enter(SD_MUTEX(un)); 19210 19211 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19212 19213 /* Legacy behavior not to check retry counts here. */ 19214 sd_retry_command(un, bp, (SD_RETRIES_NOCHECK | SD_RETRIES_ISOLATE), 19215 sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19216 } 19217 19218 19219 /* 19220 * Function: sd_pkt_reason_default 19221 * 19222 * Description: Default recovery actions for SCSA pkt_reason values that 19223 * do not have more explicit recovery actions. 19224 * 19225 * Context: May be called from interrupt context 19226 */ 19227 19228 static void 19229 sd_pkt_reason_default(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 19230 struct scsi_pkt *pktp) 19231 { 19232 ASSERT(un != NULL); 19233 ASSERT(mutex_owned(SD_MUTEX(un))); 19234 ASSERT(bp != NULL); 19235 ASSERT(xp != NULL); 19236 ASSERT(pktp != NULL); 19237 19238 SD_UPDATE_ERRSTATS(un, sd_transerrs); 19239 sd_reset_target(un, pktp); 19240 19241 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19242 19243 sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE), 19244 sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19245 } 19246 19247 19248 19249 /* 19250 * Function: sd_pkt_status_check_condition 19251 * 19252 * Description: Recovery actions for a "STATUS_CHECK" SCSI command status. 19253 * 19254 * Context: May be called from interrupt context 19255 */ 19256 19257 static void 19258 sd_pkt_status_check_condition(struct sd_lun *un, struct buf *bp, 19259 struct sd_xbuf *xp, struct scsi_pkt *pktp) 19260 { 19261 ASSERT(un != NULL); 19262 ASSERT(mutex_owned(SD_MUTEX(un))); 19263 ASSERT(bp != NULL); 19264 ASSERT(xp != NULL); 19265 ASSERT(pktp != NULL); 19266 19267 SD_TRACE(SD_LOG_IO, un, "sd_pkt_status_check_condition: " 19268 "entry: buf:0x%p xp:0x%p\n", bp, xp); 19269 19270 /* 19271 * If ARQ is NOT enabled, then issue a REQUEST SENSE command (the 19272 * command will be retried after the request sense). Otherwise, retry 19273 * the command. Note: we are issuing the request sense even though the 19274 * retry limit may have been reached for the failed command. 19275 */ 19276 if (un->un_f_arq_enabled == FALSE) { 19277 SD_INFO(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: " 19278 "no ARQ, sending request sense command\n"); 19279 sd_send_request_sense_command(un, bp, pktp); 19280 } else { 19281 SD_INFO(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: " 19282 "ARQ,retrying request sense command\n"); 19283 #if defined(__i386) || defined(__amd64) 19284 /* 19285 * The SD_RETRY_DELAY value need to be adjusted here 19286 * when SD_RETRY_DELAY change in sddef.h 19287 */ 19288 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, EIO, 19289 un->un_f_is_fibre?drv_usectohz(100000):(clock_t)0, 19290 NULL); 19291 #else 19292 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, 19293 EIO, SD_RETRY_DELAY, NULL); 19294 #endif 19295 } 19296 19297 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: exit\n"); 19298 } 19299 19300 19301 /* 19302 * Function: sd_pkt_status_busy 19303 * 19304 * Description: Recovery actions for a "STATUS_BUSY" SCSI command status. 19305 * 19306 * Context: May be called from interrupt context 19307 */ 19308 19309 static void 19310 sd_pkt_status_busy(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 19311 struct scsi_pkt *pktp) 19312 { 19313 ASSERT(un != NULL); 19314 ASSERT(mutex_owned(SD_MUTEX(un))); 19315 ASSERT(bp != NULL); 19316 ASSERT(xp != NULL); 19317 ASSERT(pktp != NULL); 19318 19319 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19320 "sd_pkt_status_busy: entry\n"); 19321 19322 /* If retries are exhausted, just fail the command. */ 19323 if (xp->xb_retry_count >= un->un_busy_retry_count) { 19324 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 19325 "device busy too long\n"); 19326 sd_return_failed_command(un, bp, EIO); 19327 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19328 "sd_pkt_status_busy: exit\n"); 19329 return; 19330 } 19331 xp->xb_retry_count++; 19332 19333 /* 19334 * Try to reset the target. However, we do not want to perform 19335 * more than one reset if the device continues to fail. The reset 19336 * will be performed when the retry count reaches the reset 19337 * threshold. This threshold should be set such that at least 19338 * one retry is issued before the reset is performed. 19339 */ 19340 if (xp->xb_retry_count == 19341 ((un->un_reset_retry_count < 2) ? 2 : un->un_reset_retry_count)) { 19342 int rval = 0; 19343 mutex_exit(SD_MUTEX(un)); 19344 if (un->un_f_allow_bus_device_reset == TRUE) { 19345 /* 19346 * First try to reset the LUN; if we cannot then 19347 * try to reset the target. 19348 */ 19349 if (un->un_f_lun_reset_enabled == TRUE) { 19350 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19351 "sd_pkt_status_busy: RESET_LUN\n"); 19352 rval = scsi_reset(SD_ADDRESS(un), RESET_LUN); 19353 } 19354 if (rval == 0) { 19355 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19356 "sd_pkt_status_busy: RESET_TARGET\n"); 19357 rval = scsi_reset(SD_ADDRESS(un), RESET_TARGET); 19358 } 19359 } 19360 if (rval == 0) { 19361 /* 19362 * If the RESET_LUN and/or RESET_TARGET failed, 19363 * try RESET_ALL 19364 */ 19365 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19366 "sd_pkt_status_busy: RESET_ALL\n"); 19367 rval = scsi_reset(SD_ADDRESS(un), RESET_ALL); 19368 } 19369 mutex_enter(SD_MUTEX(un)); 19370 if (rval == 0) { 19371 /* 19372 * The RESET_LUN, RESET_TARGET, and/or RESET_ALL failed. 19373 * At this point we give up & fail the command. 19374 */ 19375 sd_return_failed_command(un, bp, EIO); 19376 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19377 "sd_pkt_status_busy: exit (failed cmd)\n"); 19378 return; 19379 } 19380 } 19381 19382 /* 19383 * Retry the command. Be sure to specify SD_RETRIES_NOCHECK as 19384 * we have already checked the retry counts above. 19385 */ 19386 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, NULL, NULL, 19387 EIO, un->un_busy_timeout, NULL); 19388 19389 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19390 "sd_pkt_status_busy: exit\n"); 19391 } 19392 19393 19394 /* 19395 * Function: sd_pkt_status_reservation_conflict 19396 * 19397 * Description: Recovery actions for a "STATUS_RESERVATION_CONFLICT" SCSI 19398 * command status. 19399 * 19400 * Context: May be called from interrupt context 19401 */ 19402 19403 static void 19404 sd_pkt_status_reservation_conflict(struct sd_lun *un, struct buf *bp, 19405 struct sd_xbuf *xp, struct scsi_pkt *pktp) 19406 { 19407 ASSERT(un != NULL); 19408 ASSERT(mutex_owned(SD_MUTEX(un))); 19409 ASSERT(bp != NULL); 19410 ASSERT(xp != NULL); 19411 ASSERT(pktp != NULL); 19412 19413 /* 19414 * If the command was PERSISTENT_RESERVATION_[IN|OUT] then reservation 19415 * conflict could be due to various reasons like incorrect keys, not 19416 * registered or not reserved etc. So, we return EACCES to the caller. 19417 */ 19418 if (un->un_reservation_type == SD_SCSI3_RESERVATION) { 19419 int cmd = SD_GET_PKT_OPCODE(pktp); 19420 if ((cmd == SCMD_PERSISTENT_RESERVE_IN) || 19421 (cmd == SCMD_PERSISTENT_RESERVE_OUT)) { 19422 sd_return_failed_command(un, bp, EACCES); 19423 return; 19424 } 19425 } 19426 19427 un->un_resvd_status |= SD_RESERVATION_CONFLICT; 19428 19429 if ((un->un_resvd_status & SD_FAILFAST) != 0) { 19430 if (sd_failfast_enable != 0) { 19431 /* By definition, we must panic here.... */ 19432 sd_panic_for_res_conflict(un); 19433 /*NOTREACHED*/ 19434 } 19435 SD_ERROR(SD_LOG_IO, un, 19436 "sd_handle_resv_conflict: Disk Reserved\n"); 19437 sd_return_failed_command(un, bp, EACCES); 19438 return; 19439 } 19440 19441 /* 19442 * 1147670: retry only if sd_retry_on_reservation_conflict 19443 * property is set (default is 1). Retries will not succeed 19444 * on a disk reserved by another initiator. HA systems 19445 * may reset this via sd.conf to avoid these retries. 19446 * 19447 * Note: The legacy return code for this failure is EIO, however EACCES 19448 * seems more appropriate for a reservation conflict. 19449 */ 19450 if (sd_retry_on_reservation_conflict == 0) { 19451 SD_ERROR(SD_LOG_IO, un, 19452 "sd_handle_resv_conflict: Device Reserved\n"); 19453 sd_return_failed_command(un, bp, EIO); 19454 return; 19455 } 19456 19457 /* 19458 * Retry the command if we can. 19459 * 19460 * Note: The legacy return code for this failure is EIO, however EACCES 19461 * seems more appropriate for a reservation conflict. 19462 */ 19463 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, EIO, 19464 (clock_t)2, NULL); 19465 } 19466 19467 19468 19469 /* 19470 * Function: sd_pkt_status_qfull 19471 * 19472 * Description: Handle a QUEUE FULL condition from the target. This can 19473 * occur if the HBA does not handle the queue full condition. 19474 * (Basically this means third-party HBAs as Sun HBAs will 19475 * handle the queue full condition.) Note that if there are 19476 * some commands already in the transport, then the queue full 19477 * has occurred because the queue for this nexus is actually 19478 * full. If there are no commands in the transport, then the 19479 * queue full is resulting from some other initiator or lun 19480 * consuming all the resources at the target. 19481 * 19482 * Context: May be called from interrupt context 19483 */ 19484 19485 static void 19486 sd_pkt_status_qfull(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 19487 struct scsi_pkt *pktp) 19488 { 19489 ASSERT(un != NULL); 19490 ASSERT(mutex_owned(SD_MUTEX(un))); 19491 ASSERT(bp != NULL); 19492 ASSERT(xp != NULL); 19493 ASSERT(pktp != NULL); 19494 19495 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19496 "sd_pkt_status_qfull: entry\n"); 19497 19498 /* 19499 * Just lower the QFULL throttle and retry the command. Note that 19500 * we do not limit the number of retries here. 19501 */ 19502 sd_reduce_throttle(un, SD_THROTTLE_QFULL); 19503 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, NULL, NULL, 0, 19504 SD_RESTART_TIMEOUT, NULL); 19505 19506 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19507 "sd_pkt_status_qfull: exit\n"); 19508 } 19509 19510 19511 /* 19512 * Function: sd_reset_target 19513 * 19514 * Description: Issue a scsi_reset(9F), with either RESET_LUN, 19515 * RESET_TARGET, or RESET_ALL. 19516 * 19517 * Context: May be called under interrupt context. 19518 */ 19519 19520 static void 19521 sd_reset_target(struct sd_lun *un, struct scsi_pkt *pktp) 19522 { 19523 int rval = 0; 19524 19525 ASSERT(un != NULL); 19526 ASSERT(mutex_owned(SD_MUTEX(un))); 19527 ASSERT(pktp != NULL); 19528 19529 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reset_target: entry\n"); 19530 19531 /* 19532 * No need to reset if the transport layer has already done so. 19533 */ 19534 if ((pktp->pkt_statistics & 19535 (STAT_BUS_RESET | STAT_DEV_RESET | STAT_ABORTED)) != 0) { 19536 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19537 "sd_reset_target: no reset\n"); 19538 return; 19539 } 19540 19541 mutex_exit(SD_MUTEX(un)); 19542 19543 if (un->un_f_allow_bus_device_reset == TRUE) { 19544 if (un->un_f_lun_reset_enabled == TRUE) { 19545 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19546 "sd_reset_target: RESET_LUN\n"); 19547 rval = scsi_reset(SD_ADDRESS(un), RESET_LUN); 19548 } 19549 if (rval == 0) { 19550 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19551 "sd_reset_target: RESET_TARGET\n"); 19552 rval = scsi_reset(SD_ADDRESS(un), RESET_TARGET); 19553 } 19554 } 19555 19556 if (rval == 0) { 19557 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19558 "sd_reset_target: RESET_ALL\n"); 19559 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL); 19560 } 19561 19562 mutex_enter(SD_MUTEX(un)); 19563 19564 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reset_target: exit\n"); 19565 } 19566 19567 /* 19568 * Function: sd_target_change_task 19569 * 19570 * Description: Handle dynamic target change 19571 * 19572 * Context: Executes in a taskq() thread context 19573 */ 19574 static void 19575 sd_target_change_task(void *arg) 19576 { 19577 struct sd_lun *un = arg; 19578 uint64_t capacity; 19579 diskaddr_t label_cap; 19580 uint_t lbasize; 19581 sd_ssc_t *ssc; 19582 19583 ASSERT(un != NULL); 19584 ASSERT(!mutex_owned(SD_MUTEX(un))); 19585 19586 if ((un->un_f_blockcount_is_valid == FALSE) || 19587 (un->un_f_tgt_blocksize_is_valid == FALSE)) { 19588 return; 19589 } 19590 19591 ssc = sd_ssc_init(un); 19592 19593 if (sd_send_scsi_READ_CAPACITY(ssc, &capacity, 19594 &lbasize, SD_PATH_DIRECT) != 0) { 19595 SD_ERROR(SD_LOG_ERROR, un, 19596 "sd_target_change_task: fail to read capacity\n"); 19597 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 19598 goto task_exit; 19599 } 19600 19601 mutex_enter(SD_MUTEX(un)); 19602 if (capacity <= un->un_blockcount) { 19603 mutex_exit(SD_MUTEX(un)); 19604 goto task_exit; 19605 } 19606 19607 sd_update_block_info(un, lbasize, capacity); 19608 mutex_exit(SD_MUTEX(un)); 19609 19610 /* 19611 * If lun is EFI labeled and lun capacity is greater than the 19612 * capacity contained in the label, log a sys event. 19613 */ 19614 if (cmlb_efi_label_capacity(un->un_cmlbhandle, &label_cap, 19615 (void*)SD_PATH_DIRECT) == 0) { 19616 mutex_enter(SD_MUTEX(un)); 19617 if (un->un_f_blockcount_is_valid && 19618 un->un_blockcount > label_cap) { 19619 mutex_exit(SD_MUTEX(un)); 19620 sd_log_lun_expansion_event(un, KM_SLEEP); 19621 } else { 19622 mutex_exit(SD_MUTEX(un)); 19623 } 19624 } 19625 19626 task_exit: 19627 sd_ssc_fini(ssc); 19628 } 19629 19630 19631 /* 19632 * Function: sd_log_dev_status_event 19633 * 19634 * Description: Log EC_dev_status sysevent 19635 * 19636 * Context: Never called from interrupt context 19637 */ 19638 static void 19639 sd_log_dev_status_event(struct sd_lun *un, char *esc, int km_flag) 19640 { 19641 int err; 19642 char *path; 19643 nvlist_t *attr_list; 19644 19645 /* Allocate and build sysevent attribute list */ 19646 err = nvlist_alloc(&attr_list, NV_UNIQUE_NAME_TYPE, km_flag); 19647 if (err != 0) { 19648 SD_ERROR(SD_LOG_ERROR, un, 19649 "sd_log_dev_status_event: fail to allocate space\n"); 19650 return; 19651 } 19652 19653 path = kmem_alloc(MAXPATHLEN, km_flag); 19654 if (path == NULL) { 19655 nvlist_free(attr_list); 19656 SD_ERROR(SD_LOG_ERROR, un, 19657 "sd_log_dev_status_event: fail to allocate space\n"); 19658 return; 19659 } 19660 /* 19661 * Add path attribute to identify the lun. 19662 * We are using minor node 'a' as the sysevent attribute. 19663 */ 19664 (void) snprintf(path, MAXPATHLEN, "/devices"); 19665 (void) ddi_pathname(SD_DEVINFO(un), path + strlen(path)); 19666 (void) snprintf(path + strlen(path), MAXPATHLEN - strlen(path), 19667 ":a"); 19668 19669 err = nvlist_add_string(attr_list, DEV_PHYS_PATH, path); 19670 if (err != 0) { 19671 nvlist_free(attr_list); 19672 kmem_free(path, MAXPATHLEN); 19673 SD_ERROR(SD_LOG_ERROR, un, 19674 "sd_log_dev_status_event: fail to add attribute\n"); 19675 return; 19676 } 19677 19678 /* Log dynamic lun expansion sysevent */ 19679 err = ddi_log_sysevent(SD_DEVINFO(un), SUNW_VENDOR, EC_DEV_STATUS, 19680 esc, attr_list, NULL, km_flag); 19681 if (err != DDI_SUCCESS) { 19682 SD_ERROR(SD_LOG_ERROR, un, 19683 "sd_log_dev_status_event: fail to log sysevent\n"); 19684 } 19685 19686 nvlist_free(attr_list); 19687 kmem_free(path, MAXPATHLEN); 19688 } 19689 19690 19691 /* 19692 * Function: sd_log_lun_expansion_event 19693 * 19694 * Description: Log lun expansion sys event 19695 * 19696 * Context: Never called from interrupt context 19697 */ 19698 static void 19699 sd_log_lun_expansion_event(struct sd_lun *un, int km_flag) 19700 { 19701 sd_log_dev_status_event(un, ESC_DEV_DLE, km_flag); 19702 } 19703 19704 19705 /* 19706 * Function: sd_log_eject_request_event 19707 * 19708 * Description: Log eject request sysevent 19709 * 19710 * Context: Never called from interrupt context 19711 */ 19712 static void 19713 sd_log_eject_request_event(struct sd_lun *un, int km_flag) 19714 { 19715 sd_log_dev_status_event(un, ESC_DEV_EJECT_REQUEST, km_flag); 19716 } 19717 19718 19719 /* 19720 * Function: sd_media_change_task 19721 * 19722 * Description: Recovery action for CDROM to become available. 19723 * 19724 * Context: Executes in a taskq() thread context 19725 */ 19726 19727 static void 19728 sd_media_change_task(void *arg) 19729 { 19730 struct scsi_pkt *pktp = arg; 19731 struct sd_lun *un; 19732 struct buf *bp; 19733 struct sd_xbuf *xp; 19734 int err = 0; 19735 int retry_count = 0; 19736 int retry_limit = SD_UNIT_ATTENTION_RETRY/10; 19737 struct sd_sense_info si; 19738 19739 ASSERT(pktp != NULL); 19740 bp = (struct buf *)pktp->pkt_private; 19741 ASSERT(bp != NULL); 19742 xp = SD_GET_XBUF(bp); 19743 ASSERT(xp != NULL); 19744 un = SD_GET_UN(bp); 19745 ASSERT(un != NULL); 19746 ASSERT(!mutex_owned(SD_MUTEX(un))); 19747 ASSERT(un->un_f_monitor_media_state); 19748 19749 si.ssi_severity = SCSI_ERR_INFO; 19750 si.ssi_pfa_flag = FALSE; 19751 19752 /* 19753 * When a reset is issued on a CDROM, it takes a long time to 19754 * recover. First few attempts to read capacity and other things 19755 * related to handling unit attention fail (with a ASC 0x4 and 19756 * ASCQ 0x1). In that case we want to do enough retries and we want 19757 * to limit the retries in other cases of genuine failures like 19758 * no media in drive. 19759 */ 19760 while (retry_count++ < retry_limit) { 19761 if ((err = sd_handle_mchange(un)) == 0) { 19762 break; 19763 } 19764 if (err == EAGAIN) { 19765 retry_limit = SD_UNIT_ATTENTION_RETRY; 19766 } 19767 /* Sleep for 0.5 sec. & try again */ 19768 delay(drv_usectohz(500000)); 19769 } 19770 19771 /* 19772 * Dispatch (retry or fail) the original command here, 19773 * along with appropriate console messages.... 19774 * 19775 * Must grab the mutex before calling sd_retry_command, 19776 * sd_print_sense_msg and sd_return_failed_command. 19777 */ 19778 mutex_enter(SD_MUTEX(un)); 19779 if (err != SD_CMD_SUCCESS) { 19780 SD_UPDATE_ERRSTATS(un, sd_harderrs); 19781 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err); 19782 si.ssi_severity = SCSI_ERR_FATAL; 19783 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 19784 sd_return_failed_command(un, bp, EIO); 19785 } else { 19786 sd_retry_command(un, bp, SD_RETRIES_UA, sd_print_sense_msg, 19787 &si, EIO, (clock_t)0, NULL); 19788 } 19789 mutex_exit(SD_MUTEX(un)); 19790 } 19791 19792 19793 19794 /* 19795 * Function: sd_handle_mchange 19796 * 19797 * Description: Perform geometry validation & other recovery when CDROM 19798 * has been removed from drive. 19799 * 19800 * Return Code: 0 for success 19801 * errno-type return code of either sd_send_scsi_DOORLOCK() or 19802 * sd_send_scsi_READ_CAPACITY() 19803 * 19804 * Context: Executes in a taskq() thread context 19805 */ 19806 19807 static int 19808 sd_handle_mchange(struct sd_lun *un) 19809 { 19810 uint64_t capacity; 19811 uint32_t lbasize; 19812 int rval; 19813 sd_ssc_t *ssc; 19814 19815 ASSERT(!mutex_owned(SD_MUTEX(un))); 19816 ASSERT(un->un_f_monitor_media_state); 19817 19818 ssc = sd_ssc_init(un); 19819 rval = sd_send_scsi_READ_CAPACITY(ssc, &capacity, &lbasize, 19820 SD_PATH_DIRECT_PRIORITY); 19821 19822 if (rval != 0) 19823 goto failed; 19824 19825 mutex_enter(SD_MUTEX(un)); 19826 sd_update_block_info(un, lbasize, capacity); 19827 19828 if (un->un_errstats != NULL) { 19829 struct sd_errstats *stp = 19830 (struct sd_errstats *)un->un_errstats->ks_data; 19831 stp->sd_capacity.value.ui64 = (uint64_t) 19832 ((uint64_t)un->un_blockcount * 19833 (uint64_t)un->un_tgt_blocksize); 19834 } 19835 19836 /* 19837 * Check if the media in the device is writable or not 19838 */ 19839 if (ISCD(un)) { 19840 sd_check_for_writable_cd(ssc, SD_PATH_DIRECT_PRIORITY); 19841 } 19842 19843 /* 19844 * Note: Maybe let the strategy/partitioning chain worry about getting 19845 * valid geometry. 19846 */ 19847 mutex_exit(SD_MUTEX(un)); 19848 cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT_PRIORITY); 19849 19850 19851 if (cmlb_validate(un->un_cmlbhandle, 0, 19852 (void *)SD_PATH_DIRECT_PRIORITY) != 0) { 19853 sd_ssc_fini(ssc); 19854 return (EIO); 19855 } else { 19856 if (un->un_f_pkstats_enabled) { 19857 sd_set_pstats(un); 19858 SD_TRACE(SD_LOG_IO_PARTITION, un, 19859 "sd_handle_mchange: un:0x%p pstats created and " 19860 "set\n", un); 19861 } 19862 } 19863 19864 /* 19865 * Try to lock the door 19866 */ 19867 rval = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT, 19868 SD_PATH_DIRECT_PRIORITY); 19869 failed: 19870 if (rval != 0) 19871 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 19872 sd_ssc_fini(ssc); 19873 return (rval); 19874 } 19875 19876 19877 /* 19878 * Function: sd_send_scsi_DOORLOCK 19879 * 19880 * Description: Issue the scsi DOOR LOCK command 19881 * 19882 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 19883 * structure for this target. 19884 * flag - SD_REMOVAL_ALLOW 19885 * SD_REMOVAL_PREVENT 19886 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 19887 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 19888 * to use the USCSI "direct" chain and bypass the normal 19889 * command waitq. SD_PATH_DIRECT_PRIORITY is used when this 19890 * command is issued as part of an error recovery action. 19891 * 19892 * Return Code: 0 - Success 19893 * errno return code from sd_ssc_send() 19894 * 19895 * Context: Can sleep. 19896 */ 19897 19898 static int 19899 sd_send_scsi_DOORLOCK(sd_ssc_t *ssc, int flag, int path_flag) 19900 { 19901 struct scsi_extended_sense sense_buf; 19902 union scsi_cdb cdb; 19903 struct uscsi_cmd ucmd_buf; 19904 int status; 19905 struct sd_lun *un; 19906 19907 ASSERT(ssc != NULL); 19908 un = ssc->ssc_un; 19909 ASSERT(un != NULL); 19910 ASSERT(!mutex_owned(SD_MUTEX(un))); 19911 19912 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_DOORLOCK: entry: un:0x%p\n", un); 19913 19914 /* already determined doorlock is not supported, fake success */ 19915 if (un->un_f_doorlock_supported == FALSE) { 19916 return (0); 19917 } 19918 19919 /* 19920 * If we are ejecting and see an SD_REMOVAL_PREVENT 19921 * ignore the command so we can complete the eject 19922 * operation. 19923 */ 19924 if (flag == SD_REMOVAL_PREVENT) { 19925 mutex_enter(SD_MUTEX(un)); 19926 if (un->un_f_ejecting == TRUE) { 19927 mutex_exit(SD_MUTEX(un)); 19928 return (EAGAIN); 19929 } 19930 mutex_exit(SD_MUTEX(un)); 19931 } 19932 19933 bzero(&cdb, sizeof (cdb)); 19934 bzero(&ucmd_buf, sizeof (ucmd_buf)); 19935 19936 cdb.scc_cmd = SCMD_DOORLOCK; 19937 cdb.cdb_opaque[4] = (uchar_t)flag; 19938 19939 ucmd_buf.uscsi_cdb = (char *)&cdb; 19940 ucmd_buf.uscsi_cdblen = CDB_GROUP0; 19941 ucmd_buf.uscsi_bufaddr = NULL; 19942 ucmd_buf.uscsi_buflen = 0; 19943 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 19944 ucmd_buf.uscsi_rqlen = sizeof (sense_buf); 19945 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_SILENT; 19946 ucmd_buf.uscsi_timeout = 15; 19947 19948 SD_TRACE(SD_LOG_IO, un, 19949 "sd_send_scsi_DOORLOCK: returning sd_ssc_send\n"); 19950 19951 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 19952 UIO_SYSSPACE, path_flag); 19953 19954 if (status == 0) 19955 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 19956 19957 if ((status == EIO) && (ucmd_buf.uscsi_status == STATUS_CHECK) && 19958 (ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 19959 (scsi_sense_key((uint8_t *)&sense_buf) == KEY_ILLEGAL_REQUEST)) { 19960 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 19961 19962 /* fake success and skip subsequent doorlock commands */ 19963 un->un_f_doorlock_supported = FALSE; 19964 return (0); 19965 } 19966 19967 return (status); 19968 } 19969 19970 /* 19971 * Function: sd_send_scsi_READ_CAPACITY 19972 * 19973 * Description: This routine uses the scsi READ CAPACITY command to determine 19974 * the device capacity in number of blocks and the device native 19975 * block size. If this function returns a failure, then the 19976 * values in *capp and *lbap are undefined. If the capacity 19977 * returned is 0xffffffff then the lun is too large for a 19978 * normal READ CAPACITY command and the results of a 19979 * READ CAPACITY 16 will be used instead. 19980 * 19981 * Arguments: ssc - ssc contains ptr to soft state struct for the target 19982 * capp - ptr to unsigned 64-bit variable to receive the 19983 * capacity value from the command. 19984 * lbap - ptr to unsigned 32-bit varaible to receive the 19985 * block size value from the command 19986 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 19987 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 19988 * to use the USCSI "direct" chain and bypass the normal 19989 * command waitq. SD_PATH_DIRECT_PRIORITY is used when this 19990 * command is issued as part of an error recovery action. 19991 * 19992 * Return Code: 0 - Success 19993 * EIO - IO error 19994 * EACCES - Reservation conflict detected 19995 * EAGAIN - Device is becoming ready 19996 * errno return code from sd_ssc_send() 19997 * 19998 * Context: Can sleep. Blocks until command completes. 19999 */ 20000 20001 #define SD_CAPACITY_SIZE sizeof (struct scsi_capacity) 20002 20003 static int 20004 sd_send_scsi_READ_CAPACITY(sd_ssc_t *ssc, uint64_t *capp, uint32_t *lbap, 20005 int path_flag) 20006 { 20007 struct scsi_extended_sense sense_buf; 20008 struct uscsi_cmd ucmd_buf; 20009 union scsi_cdb cdb; 20010 uint32_t *capacity_buf; 20011 uint64_t capacity; 20012 uint32_t lbasize; 20013 uint32_t pbsize; 20014 int status; 20015 struct sd_lun *un; 20016 20017 ASSERT(ssc != NULL); 20018 20019 un = ssc->ssc_un; 20020 ASSERT(un != NULL); 20021 ASSERT(!mutex_owned(SD_MUTEX(un))); 20022 ASSERT(capp != NULL); 20023 ASSERT(lbap != NULL); 20024 20025 SD_TRACE(SD_LOG_IO, un, 20026 "sd_send_scsi_READ_CAPACITY: entry: un:0x%p\n", un); 20027 20028 /* 20029 * First send a READ_CAPACITY command to the target. 20030 * (This command is mandatory under SCSI-2.) 20031 * 20032 * Set up the CDB for the READ_CAPACITY command. The Partial 20033 * Medium Indicator bit is cleared. The address field must be 20034 * zero if the PMI bit is zero. 20035 */ 20036 bzero(&cdb, sizeof (cdb)); 20037 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20038 20039 capacity_buf = kmem_zalloc(SD_CAPACITY_SIZE, KM_SLEEP); 20040 20041 cdb.scc_cmd = SCMD_READ_CAPACITY; 20042 20043 ucmd_buf.uscsi_cdb = (char *)&cdb; 20044 ucmd_buf.uscsi_cdblen = CDB_GROUP1; 20045 ucmd_buf.uscsi_bufaddr = (caddr_t)capacity_buf; 20046 ucmd_buf.uscsi_buflen = SD_CAPACITY_SIZE; 20047 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 20048 ucmd_buf.uscsi_rqlen = sizeof (sense_buf); 20049 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT; 20050 ucmd_buf.uscsi_timeout = 60; 20051 20052 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 20053 UIO_SYSSPACE, path_flag); 20054 20055 switch (status) { 20056 case 0: 20057 /* Return failure if we did not get valid capacity data. */ 20058 if (ucmd_buf.uscsi_resid != 0) { 20059 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1, 20060 "sd_send_scsi_READ_CAPACITY received invalid " 20061 "capacity data"); 20062 kmem_free(capacity_buf, SD_CAPACITY_SIZE); 20063 return (EIO); 20064 } 20065 /* 20066 * Read capacity and block size from the READ CAPACITY 10 data. 20067 * This data may be adjusted later due to device specific 20068 * issues. 20069 * 20070 * According to the SCSI spec, the READ CAPACITY 10 20071 * command returns the following: 20072 * 20073 * bytes 0-3: Maximum logical block address available. 20074 * (MSB in byte:0 & LSB in byte:3) 20075 * 20076 * bytes 4-7: Block length in bytes 20077 * (MSB in byte:4 & LSB in byte:7) 20078 * 20079 */ 20080 capacity = BE_32(capacity_buf[0]); 20081 lbasize = BE_32(capacity_buf[1]); 20082 20083 /* 20084 * Done with capacity_buf 20085 */ 20086 kmem_free(capacity_buf, SD_CAPACITY_SIZE); 20087 20088 /* 20089 * if the reported capacity is set to all 0xf's, then 20090 * this disk is too large and requires SBC-2 commands. 20091 * Reissue the request using READ CAPACITY 16. 20092 */ 20093 if (capacity == 0xffffffff) { 20094 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 20095 status = sd_send_scsi_READ_CAPACITY_16(ssc, &capacity, 20096 &lbasize, &pbsize, path_flag); 20097 if (status != 0) { 20098 return (status); 20099 } else { 20100 goto rc16_done; 20101 } 20102 } 20103 break; /* Success! */ 20104 case EIO: 20105 switch (ucmd_buf.uscsi_status) { 20106 case STATUS_RESERVATION_CONFLICT: 20107 status = EACCES; 20108 break; 20109 case STATUS_CHECK: 20110 /* 20111 * Check condition; look for ASC/ASCQ of 0x04/0x01 20112 * (LOGICAL UNIT IS IN PROCESS OF BECOMING READY) 20113 */ 20114 if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 20115 (scsi_sense_asc((uint8_t *)&sense_buf) == 0x04) && 20116 (scsi_sense_ascq((uint8_t *)&sense_buf) == 0x01)) { 20117 kmem_free(capacity_buf, SD_CAPACITY_SIZE); 20118 return (EAGAIN); 20119 } 20120 break; 20121 default: 20122 break; 20123 } 20124 /* FALLTHRU */ 20125 default: 20126 kmem_free(capacity_buf, SD_CAPACITY_SIZE); 20127 return (status); 20128 } 20129 20130 /* 20131 * Some ATAPI CD-ROM drives report inaccurate LBA size values 20132 * (2352 and 0 are common) so for these devices always force the value 20133 * to 2048 as required by the ATAPI specs. 20134 */ 20135 if ((un->un_f_cfg_is_atapi == TRUE) && (ISCD(un))) { 20136 lbasize = 2048; 20137 } 20138 20139 /* 20140 * Get the maximum LBA value from the READ CAPACITY data. 20141 * Here we assume that the Partial Medium Indicator (PMI) bit 20142 * was cleared when issuing the command. This means that the LBA 20143 * returned from the device is the LBA of the last logical block 20144 * on the logical unit. The actual logical block count will be 20145 * this value plus one. 20146 */ 20147 capacity += 1; 20148 20149 /* 20150 * Currently, for removable media, the capacity is saved in terms 20151 * of un->un_sys_blocksize, so scale the capacity value to reflect this. 20152 */ 20153 if (un->un_f_has_removable_media) 20154 capacity *= (lbasize / un->un_sys_blocksize); 20155 20156 rc16_done: 20157 20158 /* 20159 * Copy the values from the READ CAPACITY command into the space 20160 * provided by the caller. 20161 */ 20162 *capp = capacity; 20163 *lbap = lbasize; 20164 20165 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_READ_CAPACITY: " 20166 "capacity:0x%llx lbasize:0x%x\n", capacity, lbasize); 20167 20168 /* 20169 * Both the lbasize and capacity from the device must be nonzero, 20170 * otherwise we assume that the values are not valid and return 20171 * failure to the caller. (4203735) 20172 */ 20173 if ((capacity == 0) || (lbasize == 0)) { 20174 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1, 20175 "sd_send_scsi_READ_CAPACITY received invalid value " 20176 "capacity %llu lbasize %d", capacity, lbasize); 20177 return (EIO); 20178 } 20179 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 20180 return (0); 20181 } 20182 20183 /* 20184 * Function: sd_send_scsi_READ_CAPACITY_16 20185 * 20186 * Description: This routine uses the scsi READ CAPACITY 16 command to 20187 * determine the device capacity in number of blocks and the 20188 * device native block size. If this function returns a failure, 20189 * then the values in *capp and *lbap are undefined. 20190 * This routine should be called by sd_send_scsi_READ_CAPACITY 20191 * which will apply any device specific adjustments to capacity 20192 * and lbasize. One exception is it is also called by 20193 * sd_get_media_info_ext. In that function, there is no need to 20194 * adjust the capacity and lbasize. 20195 * 20196 * Arguments: ssc - ssc contains ptr to soft state struct for the target 20197 * capp - ptr to unsigned 64-bit variable to receive the 20198 * capacity value from the command. 20199 * lbap - ptr to unsigned 32-bit varaible to receive the 20200 * block size value from the command 20201 * psp - ptr to unsigned 32-bit variable to receive the 20202 * physical block size value from the command 20203 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 20204 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 20205 * to use the USCSI "direct" chain and bypass the normal 20206 * command waitq. SD_PATH_DIRECT_PRIORITY is used when 20207 * this command is issued as part of an error recovery 20208 * action. 20209 * 20210 * Return Code: 0 - Success 20211 * EIO - IO error 20212 * EACCES - Reservation conflict detected 20213 * EAGAIN - Device is becoming ready 20214 * errno return code from sd_ssc_send() 20215 * 20216 * Context: Can sleep. Blocks until command completes. 20217 */ 20218 20219 #define SD_CAPACITY_16_SIZE sizeof (struct scsi_capacity_16) 20220 20221 static int 20222 sd_send_scsi_READ_CAPACITY_16(sd_ssc_t *ssc, uint64_t *capp, uint32_t *lbap, 20223 uint32_t *psp, int path_flag) 20224 { 20225 struct scsi_extended_sense sense_buf; 20226 struct uscsi_cmd ucmd_buf; 20227 union scsi_cdb cdb; 20228 uint64_t *capacity16_buf; 20229 uint64_t capacity; 20230 uint32_t lbasize; 20231 uint32_t pbsize; 20232 uint32_t lbpb_exp; 20233 int status; 20234 struct sd_lun *un; 20235 20236 ASSERT(ssc != NULL); 20237 20238 un = ssc->ssc_un; 20239 ASSERT(un != NULL); 20240 ASSERT(!mutex_owned(SD_MUTEX(un))); 20241 ASSERT(capp != NULL); 20242 ASSERT(lbap != NULL); 20243 20244 SD_TRACE(SD_LOG_IO, un, 20245 "sd_send_scsi_READ_CAPACITY: entry: un:0x%p\n", un); 20246 20247 /* 20248 * First send a READ_CAPACITY_16 command to the target. 20249 * 20250 * Set up the CDB for the READ_CAPACITY_16 command. The Partial 20251 * Medium Indicator bit is cleared. The address field must be 20252 * zero if the PMI bit is zero. 20253 */ 20254 bzero(&cdb, sizeof (cdb)); 20255 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20256 20257 capacity16_buf = kmem_zalloc(SD_CAPACITY_16_SIZE, KM_SLEEP); 20258 20259 ucmd_buf.uscsi_cdb = (char *)&cdb; 20260 ucmd_buf.uscsi_cdblen = CDB_GROUP4; 20261 ucmd_buf.uscsi_bufaddr = (caddr_t)capacity16_buf; 20262 ucmd_buf.uscsi_buflen = SD_CAPACITY_16_SIZE; 20263 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 20264 ucmd_buf.uscsi_rqlen = sizeof (sense_buf); 20265 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT; 20266 ucmd_buf.uscsi_timeout = 60; 20267 20268 /* 20269 * Read Capacity (16) is a Service Action In command. One 20270 * command byte (0x9E) is overloaded for multiple operations, 20271 * with the second CDB byte specifying the desired operation 20272 */ 20273 cdb.scc_cmd = SCMD_SVC_ACTION_IN_G4; 20274 cdb.cdb_opaque[1] = SSVC_ACTION_READ_CAPACITY_G4; 20275 20276 /* 20277 * Fill in allocation length field 20278 */ 20279 FORMG4COUNT(&cdb, ucmd_buf.uscsi_buflen); 20280 20281 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 20282 UIO_SYSSPACE, path_flag); 20283 20284 switch (status) { 20285 case 0: 20286 /* Return failure if we did not get valid capacity data. */ 20287 if (ucmd_buf.uscsi_resid > 20) { 20288 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1, 20289 "sd_send_scsi_READ_CAPACITY_16 received invalid " 20290 "capacity data"); 20291 kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE); 20292 return (EIO); 20293 } 20294 20295 /* 20296 * Read capacity and block size from the READ CAPACITY 16 data. 20297 * This data may be adjusted later due to device specific 20298 * issues. 20299 * 20300 * According to the SCSI spec, the READ CAPACITY 16 20301 * command returns the following: 20302 * 20303 * bytes 0-7: Maximum logical block address available. 20304 * (MSB in byte:0 & LSB in byte:7) 20305 * 20306 * bytes 8-11: Block length in bytes 20307 * (MSB in byte:8 & LSB in byte:11) 20308 * 20309 * byte 13: LOGICAL BLOCKS PER PHYSICAL BLOCK EXPONENT 20310 */ 20311 capacity = BE_64(capacity16_buf[0]); 20312 lbasize = BE_32(*(uint32_t *)&capacity16_buf[1]); 20313 lbpb_exp = (BE_64(capacity16_buf[1]) >> 16) & 0x0f; 20314 20315 pbsize = lbasize << lbpb_exp; 20316 20317 /* 20318 * Done with capacity16_buf 20319 */ 20320 kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE); 20321 20322 /* 20323 * if the reported capacity is set to all 0xf's, then 20324 * this disk is too large. This could only happen with 20325 * a device that supports LBAs larger than 64 bits which 20326 * are not defined by any current T10 standards. 20327 */ 20328 if (capacity == 0xffffffffffffffff) { 20329 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1, 20330 "disk is too large"); 20331 return (EIO); 20332 } 20333 break; /* Success! */ 20334 case EIO: 20335 switch (ucmd_buf.uscsi_status) { 20336 case STATUS_RESERVATION_CONFLICT: 20337 status = EACCES; 20338 break; 20339 case STATUS_CHECK: 20340 /* 20341 * Check condition; look for ASC/ASCQ of 0x04/0x01 20342 * (LOGICAL UNIT IS IN PROCESS OF BECOMING READY) 20343 */ 20344 if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 20345 (scsi_sense_asc((uint8_t *)&sense_buf) == 0x04) && 20346 (scsi_sense_ascq((uint8_t *)&sense_buf) == 0x01)) { 20347 kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE); 20348 return (EAGAIN); 20349 } 20350 break; 20351 default: 20352 break; 20353 } 20354 /* FALLTHRU */ 20355 default: 20356 kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE); 20357 return (status); 20358 } 20359 20360 /* 20361 * Some ATAPI CD-ROM drives report inaccurate LBA size values 20362 * (2352 and 0 are common) so for these devices always force the value 20363 * to 2048 as required by the ATAPI specs. 20364 */ 20365 if ((un->un_f_cfg_is_atapi == TRUE) && (ISCD(un))) { 20366 lbasize = 2048; 20367 } 20368 20369 /* 20370 * Get the maximum LBA value from the READ CAPACITY 16 data. 20371 * Here we assume that the Partial Medium Indicator (PMI) bit 20372 * was cleared when issuing the command. This means that the LBA 20373 * returned from the device is the LBA of the last logical block 20374 * on the logical unit. The actual logical block count will be 20375 * this value plus one. 20376 */ 20377 capacity += 1; 20378 20379 /* 20380 * Currently, for removable media, the capacity is saved in terms 20381 * of un->un_sys_blocksize, so scale the capacity value to reflect this. 20382 */ 20383 if (un->un_f_has_removable_media) 20384 capacity *= (lbasize / un->un_sys_blocksize); 20385 20386 *capp = capacity; 20387 *lbap = lbasize; 20388 *psp = pbsize; 20389 20390 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_READ_CAPACITY_16: " 20391 "capacity:0x%llx lbasize:0x%x, pbsize: 0x%x\n", 20392 capacity, lbasize, pbsize); 20393 20394 if ((capacity == 0) || (lbasize == 0) || (pbsize == 0)) { 20395 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1, 20396 "sd_send_scsi_READ_CAPACITY_16 received invalid value " 20397 "capacity %llu lbasize %d pbsize %d", capacity, lbasize); 20398 return (EIO); 20399 } 20400 20401 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 20402 return (0); 20403 } 20404 20405 20406 /* 20407 * Function: sd_send_scsi_START_STOP_UNIT 20408 * 20409 * Description: Issue a scsi START STOP UNIT command to the target. 20410 * 20411 * Arguments: ssc - ssc contatins pointer to driver soft state (unit) 20412 * structure for this target. 20413 * pc_flag - SD_POWER_CONDITION 20414 * SD_START_STOP 20415 * flag - SD_TARGET_START 20416 * SD_TARGET_STOP 20417 * SD_TARGET_EJECT 20418 * SD_TARGET_CLOSE 20419 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 20420 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 20421 * to use the USCSI "direct" chain and bypass the normal 20422 * command waitq. SD_PATH_DIRECT_PRIORITY is used when this 20423 * command is issued as part of an error recovery action. 20424 * 20425 * Return Code: 0 - Success 20426 * EIO - IO error 20427 * EACCES - Reservation conflict detected 20428 * ENXIO - Not Ready, medium not present 20429 * errno return code from sd_ssc_send() 20430 * 20431 * Context: Can sleep. 20432 */ 20433 20434 static int 20435 sd_send_scsi_START_STOP_UNIT(sd_ssc_t *ssc, int pc_flag, int flag, 20436 int path_flag) 20437 { 20438 struct scsi_extended_sense sense_buf; 20439 union scsi_cdb cdb; 20440 struct uscsi_cmd ucmd_buf; 20441 int status; 20442 struct sd_lun *un; 20443 20444 ASSERT(ssc != NULL); 20445 un = ssc->ssc_un; 20446 ASSERT(un != NULL); 20447 ASSERT(!mutex_owned(SD_MUTEX(un))); 20448 20449 SD_TRACE(SD_LOG_IO, un, 20450 "sd_send_scsi_START_STOP_UNIT: entry: un:0x%p\n", un); 20451 20452 if (un->un_f_check_start_stop && 20453 (pc_flag == SD_START_STOP) && 20454 ((flag == SD_TARGET_START) || (flag == SD_TARGET_STOP)) && 20455 (un->un_f_start_stop_supported != TRUE)) { 20456 return (0); 20457 } 20458 20459 /* 20460 * If we are performing an eject operation and 20461 * we receive any command other than SD_TARGET_EJECT 20462 * we should immediately return. 20463 */ 20464 if (flag != SD_TARGET_EJECT) { 20465 mutex_enter(SD_MUTEX(un)); 20466 if (un->un_f_ejecting == TRUE) { 20467 mutex_exit(SD_MUTEX(un)); 20468 return (EAGAIN); 20469 } 20470 mutex_exit(SD_MUTEX(un)); 20471 } 20472 20473 bzero(&cdb, sizeof (cdb)); 20474 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20475 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 20476 20477 cdb.scc_cmd = SCMD_START_STOP; 20478 cdb.cdb_opaque[4] = (pc_flag == SD_POWER_CONDITION) ? 20479 (uchar_t)(flag << 4) : (uchar_t)flag; 20480 20481 ucmd_buf.uscsi_cdb = (char *)&cdb; 20482 ucmd_buf.uscsi_cdblen = CDB_GROUP0; 20483 ucmd_buf.uscsi_bufaddr = NULL; 20484 ucmd_buf.uscsi_buflen = 0; 20485 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 20486 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 20487 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_SILENT; 20488 ucmd_buf.uscsi_timeout = 200; 20489 20490 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 20491 UIO_SYSSPACE, path_flag); 20492 20493 switch (status) { 20494 case 0: 20495 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 20496 break; /* Success! */ 20497 case EIO: 20498 switch (ucmd_buf.uscsi_status) { 20499 case STATUS_RESERVATION_CONFLICT: 20500 status = EACCES; 20501 break; 20502 case STATUS_CHECK: 20503 if (ucmd_buf.uscsi_rqstatus == STATUS_GOOD) { 20504 switch (scsi_sense_key( 20505 (uint8_t *)&sense_buf)) { 20506 case KEY_ILLEGAL_REQUEST: 20507 status = ENOTSUP; 20508 break; 20509 case KEY_NOT_READY: 20510 if (scsi_sense_asc( 20511 (uint8_t *)&sense_buf) 20512 == 0x3A) { 20513 status = ENXIO; 20514 } 20515 break; 20516 default: 20517 break; 20518 } 20519 } 20520 break; 20521 default: 20522 break; 20523 } 20524 break; 20525 default: 20526 break; 20527 } 20528 20529 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_START_STOP_UNIT: exit\n"); 20530 20531 return (status); 20532 } 20533 20534 20535 /* 20536 * Function: sd_start_stop_unit_callback 20537 * 20538 * Description: timeout(9F) callback to begin recovery process for a 20539 * device that has spun down. 20540 * 20541 * Arguments: arg - pointer to associated softstate struct. 20542 * 20543 * Context: Executes in a timeout(9F) thread context 20544 */ 20545 20546 static void 20547 sd_start_stop_unit_callback(void *arg) 20548 { 20549 struct sd_lun *un = arg; 20550 ASSERT(un != NULL); 20551 ASSERT(!mutex_owned(SD_MUTEX(un))); 20552 20553 SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_callback: entry\n"); 20554 20555 (void) taskq_dispatch(sd_tq, sd_start_stop_unit_task, un, KM_NOSLEEP); 20556 } 20557 20558 20559 /* 20560 * Function: sd_start_stop_unit_task 20561 * 20562 * Description: Recovery procedure when a drive is spun down. 20563 * 20564 * Arguments: arg - pointer to associated softstate struct. 20565 * 20566 * Context: Executes in a taskq() thread context 20567 */ 20568 20569 static void 20570 sd_start_stop_unit_task(void *arg) 20571 { 20572 struct sd_lun *un = arg; 20573 sd_ssc_t *ssc; 20574 int power_level; 20575 int rval; 20576 20577 ASSERT(un != NULL); 20578 ASSERT(!mutex_owned(SD_MUTEX(un))); 20579 20580 SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_task: entry\n"); 20581 20582 /* 20583 * Some unformatted drives report not ready error, no need to 20584 * restart if format has been initiated. 20585 */ 20586 mutex_enter(SD_MUTEX(un)); 20587 if (un->un_f_format_in_progress == TRUE) { 20588 mutex_exit(SD_MUTEX(un)); 20589 return; 20590 } 20591 mutex_exit(SD_MUTEX(un)); 20592 20593 ssc = sd_ssc_init(un); 20594 /* 20595 * When a START STOP command is issued from here, it is part of a 20596 * failure recovery operation and must be issued before any other 20597 * commands, including any pending retries. Thus it must be sent 20598 * using SD_PATH_DIRECT_PRIORITY. It doesn't matter if the spin up 20599 * succeeds or not, we will start I/O after the attempt. 20600 * If power condition is supported and the current power level 20601 * is capable of performing I/O, we should set the power condition 20602 * to that level. Otherwise, set the power condition to ACTIVE. 20603 */ 20604 if (un->un_f_power_condition_supported) { 20605 mutex_enter(SD_MUTEX(un)); 20606 ASSERT(SD_PM_IS_LEVEL_VALID(un, un->un_power_level)); 20607 power_level = sd_pwr_pc.ran_perf[un->un_power_level] 20608 > 0 ? un->un_power_level : SD_SPINDLE_ACTIVE; 20609 mutex_exit(SD_MUTEX(un)); 20610 rval = sd_send_scsi_START_STOP_UNIT(ssc, SD_POWER_CONDITION, 20611 sd_pl2pc[power_level], SD_PATH_DIRECT_PRIORITY); 20612 } else { 20613 rval = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP, 20614 SD_TARGET_START, SD_PATH_DIRECT_PRIORITY); 20615 } 20616 20617 if (rval != 0) 20618 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 20619 sd_ssc_fini(ssc); 20620 /* 20621 * The above call blocks until the START_STOP_UNIT command completes. 20622 * Now that it has completed, we must re-try the original IO that 20623 * received the NOT READY condition in the first place. There are 20624 * three possible conditions here: 20625 * 20626 * (1) The original IO is on un_retry_bp. 20627 * (2) The original IO is on the regular wait queue, and un_retry_bp 20628 * is NULL. 20629 * (3) The original IO is on the regular wait queue, and un_retry_bp 20630 * points to some other, unrelated bp. 20631 * 20632 * For each case, we must call sd_start_cmds() with un_retry_bp 20633 * as the argument. If un_retry_bp is NULL, this will initiate 20634 * processing of the regular wait queue. If un_retry_bp is not NULL, 20635 * then this will process the bp on un_retry_bp. That may or may not 20636 * be the original IO, but that does not matter: the important thing 20637 * is to keep the IO processing going at this point. 20638 * 20639 * Note: This is a very specific error recovery sequence associated 20640 * with a drive that is not spun up. We attempt a START_STOP_UNIT and 20641 * serialize the I/O with completion of the spin-up. 20642 */ 20643 mutex_enter(SD_MUTEX(un)); 20644 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 20645 "sd_start_stop_unit_task: un:0x%p starting bp:0x%p\n", 20646 un, un->un_retry_bp); 20647 un->un_startstop_timeid = NULL; /* Timeout is no longer pending */ 20648 sd_start_cmds(un, un->un_retry_bp); 20649 mutex_exit(SD_MUTEX(un)); 20650 20651 SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_task: exit\n"); 20652 } 20653 20654 20655 /* 20656 * Function: sd_send_scsi_INQUIRY 20657 * 20658 * Description: Issue the scsi INQUIRY command. 20659 * 20660 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 20661 * structure for this target. 20662 * bufaddr 20663 * buflen 20664 * evpd 20665 * page_code 20666 * page_length 20667 * 20668 * Return Code: 0 - Success 20669 * errno return code from sd_ssc_send() 20670 * 20671 * Context: Can sleep. Does not return until command is completed. 20672 */ 20673 20674 static int 20675 sd_send_scsi_INQUIRY(sd_ssc_t *ssc, uchar_t *bufaddr, size_t buflen, 20676 uchar_t evpd, uchar_t page_code, size_t *residp) 20677 { 20678 union scsi_cdb cdb; 20679 struct uscsi_cmd ucmd_buf; 20680 int status; 20681 struct sd_lun *un; 20682 20683 ASSERT(ssc != NULL); 20684 un = ssc->ssc_un; 20685 ASSERT(un != NULL); 20686 ASSERT(!mutex_owned(SD_MUTEX(un))); 20687 ASSERT(bufaddr != NULL); 20688 20689 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_INQUIRY: entry: un:0x%p\n", un); 20690 20691 bzero(&cdb, sizeof (cdb)); 20692 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20693 bzero(bufaddr, buflen); 20694 20695 cdb.scc_cmd = SCMD_INQUIRY; 20696 cdb.cdb_opaque[1] = evpd; 20697 cdb.cdb_opaque[2] = page_code; 20698 FORMG0COUNT(&cdb, buflen); 20699 20700 ucmd_buf.uscsi_cdb = (char *)&cdb; 20701 ucmd_buf.uscsi_cdblen = CDB_GROUP0; 20702 ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr; 20703 ucmd_buf.uscsi_buflen = buflen; 20704 ucmd_buf.uscsi_rqbuf = NULL; 20705 ucmd_buf.uscsi_rqlen = 0; 20706 ucmd_buf.uscsi_flags = USCSI_READ | USCSI_SILENT; 20707 ucmd_buf.uscsi_timeout = 200; /* Excessive legacy value */ 20708 20709 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 20710 UIO_SYSSPACE, SD_PATH_DIRECT); 20711 20712 /* 20713 * Only handle status == 0, the upper-level caller 20714 * will put different assessment based on the context. 20715 */ 20716 if (status == 0) 20717 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 20718 20719 if ((status == 0) && (residp != NULL)) { 20720 *residp = ucmd_buf.uscsi_resid; 20721 } 20722 20723 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_INQUIRY: exit\n"); 20724 20725 return (status); 20726 } 20727 20728 20729 /* 20730 * Function: sd_send_scsi_TEST_UNIT_READY 20731 * 20732 * Description: Issue the scsi TEST UNIT READY command. 20733 * This routine can be told to set the flag USCSI_DIAGNOSE to 20734 * prevent retrying failed commands. Use this when the intent 20735 * is either to check for device readiness, to clear a Unit 20736 * Attention, or to clear any outstanding sense data. 20737 * However under specific conditions the expected behavior 20738 * is for retries to bring a device ready, so use the flag 20739 * with caution. 20740 * 20741 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 20742 * structure for this target. 20743 * flag: SD_CHECK_FOR_MEDIA: return ENXIO if no media present 20744 * SD_DONT_RETRY_TUR: include uscsi flag USCSI_DIAGNOSE. 20745 * 0: dont check for media present, do retries on cmd. 20746 * 20747 * Return Code: 0 - Success 20748 * EIO - IO error 20749 * EACCES - Reservation conflict detected 20750 * ENXIO - Not Ready, medium not present 20751 * errno return code from sd_ssc_send() 20752 * 20753 * Context: Can sleep. Does not return until command is completed. 20754 */ 20755 20756 static int 20757 sd_send_scsi_TEST_UNIT_READY(sd_ssc_t *ssc, int flag) 20758 { 20759 struct scsi_extended_sense sense_buf; 20760 union scsi_cdb cdb; 20761 struct uscsi_cmd ucmd_buf; 20762 int status; 20763 struct sd_lun *un; 20764 20765 ASSERT(ssc != NULL); 20766 un = ssc->ssc_un; 20767 ASSERT(un != NULL); 20768 ASSERT(!mutex_owned(SD_MUTEX(un))); 20769 20770 SD_TRACE(SD_LOG_IO, un, 20771 "sd_send_scsi_TEST_UNIT_READY: entry: un:0x%p\n", un); 20772 20773 /* 20774 * Some Seagate elite1 TQ devices get hung with disconnect/reconnect 20775 * timeouts when they receive a TUR and the queue is not empty. Check 20776 * the configuration flag set during attach (indicating the drive has 20777 * this firmware bug) and un_ncmds_in_transport before issuing the 20778 * TUR. If there are 20779 * pending commands return success, this is a bit arbitrary but is ok 20780 * for non-removables (i.e. the eliteI disks) and non-clustering 20781 * configurations. 20782 */ 20783 if (un->un_f_cfg_tur_check == TRUE) { 20784 mutex_enter(SD_MUTEX(un)); 20785 if (un->un_ncmds_in_transport != 0) { 20786 mutex_exit(SD_MUTEX(un)); 20787 return (0); 20788 } 20789 mutex_exit(SD_MUTEX(un)); 20790 } 20791 20792 bzero(&cdb, sizeof (cdb)); 20793 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20794 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 20795 20796 cdb.scc_cmd = SCMD_TEST_UNIT_READY; 20797 20798 ucmd_buf.uscsi_cdb = (char *)&cdb; 20799 ucmd_buf.uscsi_cdblen = CDB_GROUP0; 20800 ucmd_buf.uscsi_bufaddr = NULL; 20801 ucmd_buf.uscsi_buflen = 0; 20802 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 20803 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 20804 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_SILENT; 20805 20806 /* Use flag USCSI_DIAGNOSE to prevent retries if it fails. */ 20807 if ((flag & SD_DONT_RETRY_TUR) != 0) { 20808 ucmd_buf.uscsi_flags |= USCSI_DIAGNOSE; 20809 } 20810 ucmd_buf.uscsi_timeout = 60; 20811 20812 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 20813 UIO_SYSSPACE, ((flag & SD_BYPASS_PM) ? SD_PATH_DIRECT : 20814 SD_PATH_STANDARD)); 20815 20816 switch (status) { 20817 case 0: 20818 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 20819 break; /* Success! */ 20820 case EIO: 20821 switch (ucmd_buf.uscsi_status) { 20822 case STATUS_RESERVATION_CONFLICT: 20823 status = EACCES; 20824 break; 20825 case STATUS_CHECK: 20826 if ((flag & SD_CHECK_FOR_MEDIA) == 0) { 20827 break; 20828 } 20829 if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 20830 (scsi_sense_key((uint8_t *)&sense_buf) == 20831 KEY_NOT_READY) && 20832 (scsi_sense_asc((uint8_t *)&sense_buf) == 0x3A)) { 20833 status = ENXIO; 20834 } 20835 break; 20836 default: 20837 break; 20838 } 20839 break; 20840 default: 20841 break; 20842 } 20843 20844 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_TEST_UNIT_READY: exit\n"); 20845 20846 return (status); 20847 } 20848 20849 /* 20850 * Function: sd_send_scsi_PERSISTENT_RESERVE_IN 20851 * 20852 * Description: Issue the scsi PERSISTENT RESERVE IN command. 20853 * 20854 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 20855 * structure for this target. 20856 * 20857 * Return Code: 0 - Success 20858 * EACCES 20859 * ENOTSUP 20860 * errno return code from sd_ssc_send() 20861 * 20862 * Context: Can sleep. Does not return until command is completed. 20863 */ 20864 20865 static int 20866 sd_send_scsi_PERSISTENT_RESERVE_IN(sd_ssc_t *ssc, uchar_t usr_cmd, 20867 uint16_t data_len, uchar_t *data_bufp) 20868 { 20869 struct scsi_extended_sense sense_buf; 20870 union scsi_cdb cdb; 20871 struct uscsi_cmd ucmd_buf; 20872 int status; 20873 int no_caller_buf = FALSE; 20874 struct sd_lun *un; 20875 20876 ASSERT(ssc != NULL); 20877 un = ssc->ssc_un; 20878 ASSERT(un != NULL); 20879 ASSERT(!mutex_owned(SD_MUTEX(un))); 20880 ASSERT((usr_cmd == SD_READ_KEYS) || (usr_cmd == SD_READ_RESV)); 20881 20882 SD_TRACE(SD_LOG_IO, un, 20883 "sd_send_scsi_PERSISTENT_RESERVE_IN: entry: un:0x%p\n", un); 20884 20885 bzero(&cdb, sizeof (cdb)); 20886 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20887 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 20888 if (data_bufp == NULL) { 20889 /* Allocate a default buf if the caller did not give one */ 20890 ASSERT(data_len == 0); 20891 data_len = MHIOC_RESV_KEY_SIZE; 20892 data_bufp = kmem_zalloc(MHIOC_RESV_KEY_SIZE, KM_SLEEP); 20893 no_caller_buf = TRUE; 20894 } 20895 20896 cdb.scc_cmd = SCMD_PERSISTENT_RESERVE_IN; 20897 cdb.cdb_opaque[1] = usr_cmd; 20898 FORMG1COUNT(&cdb, data_len); 20899 20900 ucmd_buf.uscsi_cdb = (char *)&cdb; 20901 ucmd_buf.uscsi_cdblen = CDB_GROUP1; 20902 ucmd_buf.uscsi_bufaddr = (caddr_t)data_bufp; 20903 ucmd_buf.uscsi_buflen = data_len; 20904 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 20905 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 20906 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT; 20907 ucmd_buf.uscsi_timeout = 60; 20908 20909 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 20910 UIO_SYSSPACE, SD_PATH_STANDARD); 20911 20912 switch (status) { 20913 case 0: 20914 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 20915 20916 break; /* Success! */ 20917 case EIO: 20918 switch (ucmd_buf.uscsi_status) { 20919 case STATUS_RESERVATION_CONFLICT: 20920 status = EACCES; 20921 break; 20922 case STATUS_CHECK: 20923 if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 20924 (scsi_sense_key((uint8_t *)&sense_buf) == 20925 KEY_ILLEGAL_REQUEST)) { 20926 status = ENOTSUP; 20927 } 20928 break; 20929 default: 20930 break; 20931 } 20932 break; 20933 default: 20934 break; 20935 } 20936 20937 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_PERSISTENT_RESERVE_IN: exit\n"); 20938 20939 if (no_caller_buf == TRUE) { 20940 kmem_free(data_bufp, data_len); 20941 } 20942 20943 return (status); 20944 } 20945 20946 20947 /* 20948 * Function: sd_send_scsi_PERSISTENT_RESERVE_OUT 20949 * 20950 * Description: This routine is the driver entry point for handling CD-ROM 20951 * multi-host persistent reservation requests (MHIOCGRP_INKEYS, 20952 * MHIOCGRP_INRESV) by sending the SCSI-3 PROUT commands to the 20953 * device. 20954 * 20955 * Arguments: ssc - ssc contains un - pointer to soft state struct 20956 * for the target. 20957 * usr_cmd SCSI-3 reservation facility command (one of 20958 * SD_SCSI3_REGISTER, SD_SCSI3_RESERVE, SD_SCSI3_RELEASE, 20959 * SD_SCSI3_PREEMPTANDABORT, SD_SCSI3_CLEAR) 20960 * usr_bufp - user provided pointer register, reserve descriptor or 20961 * preempt and abort structure (mhioc_register_t, 20962 * mhioc_resv_desc_t, mhioc_preemptandabort_t) 20963 * 20964 * Return Code: 0 - Success 20965 * EACCES 20966 * ENOTSUP 20967 * errno return code from sd_ssc_send() 20968 * 20969 * Context: Can sleep. Does not return until command is completed. 20970 */ 20971 20972 static int 20973 sd_send_scsi_PERSISTENT_RESERVE_OUT(sd_ssc_t *ssc, uchar_t usr_cmd, 20974 uchar_t *usr_bufp) 20975 { 20976 struct scsi_extended_sense sense_buf; 20977 union scsi_cdb cdb; 20978 struct uscsi_cmd ucmd_buf; 20979 int status; 20980 uchar_t data_len = sizeof (sd_prout_t); 20981 sd_prout_t *prp; 20982 struct sd_lun *un; 20983 20984 ASSERT(ssc != NULL); 20985 un = ssc->ssc_un; 20986 ASSERT(un != NULL); 20987 ASSERT(!mutex_owned(SD_MUTEX(un))); 20988 ASSERT(data_len == 24); /* required by scsi spec */ 20989 20990 SD_TRACE(SD_LOG_IO, un, 20991 "sd_send_scsi_PERSISTENT_RESERVE_OUT: entry: un:0x%p\n", un); 20992 20993 if (usr_bufp == NULL) { 20994 return (EINVAL); 20995 } 20996 20997 bzero(&cdb, sizeof (cdb)); 20998 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20999 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 21000 prp = kmem_zalloc(data_len, KM_SLEEP); 21001 21002 cdb.scc_cmd = SCMD_PERSISTENT_RESERVE_OUT; 21003 cdb.cdb_opaque[1] = usr_cmd; 21004 FORMG1COUNT(&cdb, data_len); 21005 21006 ucmd_buf.uscsi_cdb = (char *)&cdb; 21007 ucmd_buf.uscsi_cdblen = CDB_GROUP1; 21008 ucmd_buf.uscsi_bufaddr = (caddr_t)prp; 21009 ucmd_buf.uscsi_buflen = data_len; 21010 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 21011 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 21012 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_WRITE | USCSI_SILENT; 21013 ucmd_buf.uscsi_timeout = 60; 21014 21015 switch (usr_cmd) { 21016 case SD_SCSI3_REGISTER: { 21017 mhioc_register_t *ptr = (mhioc_register_t *)usr_bufp; 21018 21019 bcopy(ptr->oldkey.key, prp->res_key, MHIOC_RESV_KEY_SIZE); 21020 bcopy(ptr->newkey.key, prp->service_key, 21021 MHIOC_RESV_KEY_SIZE); 21022 prp->aptpl = ptr->aptpl; 21023 break; 21024 } 21025 case SD_SCSI3_CLEAR: { 21026 mhioc_resv_desc_t *ptr = (mhioc_resv_desc_t *)usr_bufp; 21027 21028 bcopy(ptr->key.key, prp->res_key, MHIOC_RESV_KEY_SIZE); 21029 break; 21030 } 21031 case SD_SCSI3_RESERVE: 21032 case SD_SCSI3_RELEASE: { 21033 mhioc_resv_desc_t *ptr = (mhioc_resv_desc_t *)usr_bufp; 21034 21035 bcopy(ptr->key.key, prp->res_key, MHIOC_RESV_KEY_SIZE); 21036 prp->scope_address = BE_32(ptr->scope_specific_addr); 21037 cdb.cdb_opaque[2] = ptr->type; 21038 break; 21039 } 21040 case SD_SCSI3_PREEMPTANDABORT: { 21041 mhioc_preemptandabort_t *ptr = 21042 (mhioc_preemptandabort_t *)usr_bufp; 21043 21044 bcopy(ptr->resvdesc.key.key, prp->res_key, MHIOC_RESV_KEY_SIZE); 21045 bcopy(ptr->victim_key.key, prp->service_key, 21046 MHIOC_RESV_KEY_SIZE); 21047 prp->scope_address = BE_32(ptr->resvdesc.scope_specific_addr); 21048 cdb.cdb_opaque[2] = ptr->resvdesc.type; 21049 ucmd_buf.uscsi_flags |= USCSI_HEAD; 21050 break; 21051 } 21052 case SD_SCSI3_REGISTERANDIGNOREKEY: 21053 { 21054 mhioc_registerandignorekey_t *ptr; 21055 ptr = (mhioc_registerandignorekey_t *)usr_bufp; 21056 bcopy(ptr->newkey.key, 21057 prp->service_key, MHIOC_RESV_KEY_SIZE); 21058 prp->aptpl = ptr->aptpl; 21059 break; 21060 } 21061 default: 21062 ASSERT(FALSE); 21063 break; 21064 } 21065 21066 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 21067 UIO_SYSSPACE, SD_PATH_STANDARD); 21068 21069 switch (status) { 21070 case 0: 21071 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 21072 break; /* Success! */ 21073 case EIO: 21074 switch (ucmd_buf.uscsi_status) { 21075 case STATUS_RESERVATION_CONFLICT: 21076 status = EACCES; 21077 break; 21078 case STATUS_CHECK: 21079 if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 21080 (scsi_sense_key((uint8_t *)&sense_buf) == 21081 KEY_ILLEGAL_REQUEST)) { 21082 status = ENOTSUP; 21083 } 21084 break; 21085 default: 21086 break; 21087 } 21088 break; 21089 default: 21090 break; 21091 } 21092 21093 kmem_free(prp, data_len); 21094 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_PERSISTENT_RESERVE_OUT: exit\n"); 21095 return (status); 21096 } 21097 21098 21099 /* 21100 * Function: sd_send_scsi_SYNCHRONIZE_CACHE 21101 * 21102 * Description: Issues a scsi SYNCHRONIZE CACHE command to the target 21103 * 21104 * Arguments: un - pointer to the target's soft state struct 21105 * dkc - pointer to the callback structure 21106 * 21107 * Return Code: 0 - success 21108 * errno-type error code 21109 * 21110 * Context: kernel thread context only. 21111 * 21112 * _______________________________________________________________ 21113 * | dkc_flag & | dkc_callback | DKIOCFLUSHWRITECACHE | 21114 * |FLUSH_VOLATILE| | operation | 21115 * |______________|______________|_________________________________| 21116 * | 0 | NULL | Synchronous flush on both | 21117 * | | | volatile and non-volatile cache | 21118 * |______________|______________|_________________________________| 21119 * | 1 | NULL | Synchronous flush on volatile | 21120 * | | | cache; disk drivers may suppress| 21121 * | | | flush if disk table indicates | 21122 * | | | non-volatile cache | 21123 * |______________|______________|_________________________________| 21124 * | 0 | !NULL | Asynchronous flush on both | 21125 * | | | volatile and non-volatile cache;| 21126 * |______________|______________|_________________________________| 21127 * | 1 | !NULL | Asynchronous flush on volatile | 21128 * | | | cache; disk drivers may suppress| 21129 * | | | flush if disk table indicates | 21130 * | | | non-volatile cache | 21131 * |______________|______________|_________________________________| 21132 * 21133 */ 21134 21135 static int 21136 sd_send_scsi_SYNCHRONIZE_CACHE(struct sd_lun *un, struct dk_callback *dkc) 21137 { 21138 struct sd_uscsi_info *uip; 21139 struct uscsi_cmd *uscmd; 21140 union scsi_cdb *cdb; 21141 struct buf *bp; 21142 int rval = 0; 21143 int is_async; 21144 21145 SD_TRACE(SD_LOG_IO, un, 21146 "sd_send_scsi_SYNCHRONIZE_CACHE: entry: un:0x%p\n", un); 21147 21148 ASSERT(un != NULL); 21149 ASSERT(!mutex_owned(SD_MUTEX(un))); 21150 21151 if (dkc == NULL || dkc->dkc_callback == NULL) { 21152 is_async = FALSE; 21153 } else { 21154 is_async = TRUE; 21155 } 21156 21157 mutex_enter(SD_MUTEX(un)); 21158 /* check whether cache flush should be suppressed */ 21159 if (un->un_f_suppress_cache_flush == TRUE) { 21160 mutex_exit(SD_MUTEX(un)); 21161 /* 21162 * suppress the cache flush if the device is told to do 21163 * so by sd.conf or disk table 21164 */ 21165 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_SYNCHRONIZE_CACHE: \ 21166 skip the cache flush since suppress_cache_flush is %d!\n", 21167 un->un_f_suppress_cache_flush); 21168 21169 if (is_async == TRUE) { 21170 /* invoke callback for asynchronous flush */ 21171 (*dkc->dkc_callback)(dkc->dkc_cookie, 0); 21172 } 21173 return (rval); 21174 } 21175 mutex_exit(SD_MUTEX(un)); 21176 21177 /* 21178 * check dkc_flag & FLUSH_VOLATILE so SYNC_NV bit can be 21179 * set properly 21180 */ 21181 cdb = kmem_zalloc(CDB_GROUP1, KM_SLEEP); 21182 cdb->scc_cmd = SCMD_SYNCHRONIZE_CACHE; 21183 21184 mutex_enter(SD_MUTEX(un)); 21185 if (dkc != NULL && un->un_f_sync_nv_supported && 21186 (dkc->dkc_flag & FLUSH_VOLATILE)) { 21187 /* 21188 * if the device supports SYNC_NV bit, turn on 21189 * the SYNC_NV bit to only flush volatile cache 21190 */ 21191 cdb->cdb_un.tag |= SD_SYNC_NV_BIT; 21192 } 21193 mutex_exit(SD_MUTEX(un)); 21194 21195 /* 21196 * First get some memory for the uscsi_cmd struct and cdb 21197 * and initialize for SYNCHRONIZE_CACHE cmd. 21198 */ 21199 uscmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 21200 uscmd->uscsi_cdblen = CDB_GROUP1; 21201 uscmd->uscsi_cdb = (caddr_t)cdb; 21202 uscmd->uscsi_bufaddr = NULL; 21203 uscmd->uscsi_buflen = 0; 21204 uscmd->uscsi_rqbuf = kmem_zalloc(SENSE_LENGTH, KM_SLEEP); 21205 uscmd->uscsi_rqlen = SENSE_LENGTH; 21206 uscmd->uscsi_rqresid = SENSE_LENGTH; 21207 uscmd->uscsi_flags = USCSI_RQENABLE | USCSI_SILENT; 21208 uscmd->uscsi_timeout = sd_io_time; 21209 21210 /* 21211 * Allocate an sd_uscsi_info struct and fill it with the info 21212 * needed by sd_initpkt_for_uscsi(). Then put the pointer into 21213 * b_private in the buf for sd_initpkt_for_uscsi(). Note that 21214 * since we allocate the buf here in this function, we do not 21215 * need to preserve the prior contents of b_private. 21216 * The sd_uscsi_info struct is also used by sd_uscsi_strategy() 21217 */ 21218 uip = kmem_zalloc(sizeof (struct sd_uscsi_info), KM_SLEEP); 21219 uip->ui_flags = SD_PATH_DIRECT; 21220 uip->ui_cmdp = uscmd; 21221 21222 bp = getrbuf(KM_SLEEP); 21223 bp->b_private = uip; 21224 21225 /* 21226 * Setup buffer to carry uscsi request. 21227 */ 21228 bp->b_flags = B_BUSY; 21229 bp->b_bcount = 0; 21230 bp->b_blkno = 0; 21231 21232 if (is_async == TRUE) { 21233 bp->b_iodone = sd_send_scsi_SYNCHRONIZE_CACHE_biodone; 21234 uip->ui_dkc = *dkc; 21235 } 21236 21237 bp->b_edev = SD_GET_DEV(un); 21238 bp->b_dev = cmpdev(bp->b_edev); /* maybe unnecessary? */ 21239 21240 /* 21241 * Unset un_f_sync_cache_required flag 21242 */ 21243 mutex_enter(SD_MUTEX(un)); 21244 un->un_f_sync_cache_required = FALSE; 21245 mutex_exit(SD_MUTEX(un)); 21246 21247 (void) sd_uscsi_strategy(bp); 21248 21249 /* 21250 * If synchronous request, wait for completion 21251 * If async just return and let b_iodone callback 21252 * cleanup. 21253 * NOTE: On return, u_ncmds_in_driver will be decremented, 21254 * but it was also incremented in sd_uscsi_strategy(), so 21255 * we should be ok. 21256 */ 21257 if (is_async == FALSE) { 21258 (void) biowait(bp); 21259 rval = sd_send_scsi_SYNCHRONIZE_CACHE_biodone(bp); 21260 } 21261 21262 return (rval); 21263 } 21264 21265 21266 static int 21267 sd_send_scsi_SYNCHRONIZE_CACHE_biodone(struct buf *bp) 21268 { 21269 struct sd_uscsi_info *uip; 21270 struct uscsi_cmd *uscmd; 21271 uint8_t *sense_buf; 21272 struct sd_lun *un; 21273 int status; 21274 union scsi_cdb *cdb; 21275 21276 uip = (struct sd_uscsi_info *)(bp->b_private); 21277 ASSERT(uip != NULL); 21278 21279 uscmd = uip->ui_cmdp; 21280 ASSERT(uscmd != NULL); 21281 21282 sense_buf = (uint8_t *)uscmd->uscsi_rqbuf; 21283 ASSERT(sense_buf != NULL); 21284 21285 un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp)); 21286 ASSERT(un != NULL); 21287 21288 cdb = (union scsi_cdb *)uscmd->uscsi_cdb; 21289 21290 status = geterror(bp); 21291 switch (status) { 21292 case 0: 21293 break; /* Success! */ 21294 case EIO: 21295 switch (uscmd->uscsi_status) { 21296 case STATUS_RESERVATION_CONFLICT: 21297 /* Ignore reservation conflict */ 21298 status = 0; 21299 goto done; 21300 21301 case STATUS_CHECK: 21302 if ((uscmd->uscsi_rqstatus == STATUS_GOOD) && 21303 (scsi_sense_key(sense_buf) == 21304 KEY_ILLEGAL_REQUEST)) { 21305 /* Ignore Illegal Request error */ 21306 if (cdb->cdb_un.tag&SD_SYNC_NV_BIT) { 21307 mutex_enter(SD_MUTEX(un)); 21308 un->un_f_sync_nv_supported = FALSE; 21309 mutex_exit(SD_MUTEX(un)); 21310 status = 0; 21311 SD_TRACE(SD_LOG_IO, un, 21312 "un_f_sync_nv_supported \ 21313 is set to false.\n"); 21314 goto done; 21315 } 21316 21317 mutex_enter(SD_MUTEX(un)); 21318 un->un_f_sync_cache_supported = FALSE; 21319 mutex_exit(SD_MUTEX(un)); 21320 SD_TRACE(SD_LOG_IO, un, 21321 "sd_send_scsi_SYNCHRONIZE_CACHE_biodone: \ 21322 un_f_sync_cache_supported set to false \ 21323 with asc = %x, ascq = %x\n", 21324 scsi_sense_asc(sense_buf), 21325 scsi_sense_ascq(sense_buf)); 21326 status = ENOTSUP; 21327 goto done; 21328 } 21329 break; 21330 default: 21331 break; 21332 } 21333 /* FALLTHRU */ 21334 default: 21335 /* 21336 * Turn on the un_f_sync_cache_required flag 21337 * since the SYNC CACHE command failed 21338 */ 21339 mutex_enter(SD_MUTEX(un)); 21340 un->un_f_sync_cache_required = TRUE; 21341 mutex_exit(SD_MUTEX(un)); 21342 21343 /* 21344 * Don't log an error message if this device 21345 * has removable media. 21346 */ 21347 if (!un->un_f_has_removable_media) { 21348 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 21349 "SYNCHRONIZE CACHE command failed (%d)\n", status); 21350 } 21351 break; 21352 } 21353 21354 done: 21355 if (uip->ui_dkc.dkc_callback != NULL) { 21356 (*uip->ui_dkc.dkc_callback)(uip->ui_dkc.dkc_cookie, status); 21357 } 21358 21359 ASSERT((bp->b_flags & B_REMAPPED) == 0); 21360 freerbuf(bp); 21361 kmem_free(uip, sizeof (struct sd_uscsi_info)); 21362 kmem_free(uscmd->uscsi_rqbuf, SENSE_LENGTH); 21363 kmem_free(uscmd->uscsi_cdb, (size_t)uscmd->uscsi_cdblen); 21364 kmem_free(uscmd, sizeof (struct uscsi_cmd)); 21365 21366 return (status); 21367 } 21368 21369 21370 /* 21371 * Function: sd_send_scsi_GET_CONFIGURATION 21372 * 21373 * Description: Issues the get configuration command to the device. 21374 * Called from sd_check_for_writable_cd & sd_get_media_info 21375 * caller needs to ensure that buflen = SD_PROFILE_HEADER_LEN 21376 * Arguments: ssc 21377 * ucmdbuf 21378 * rqbuf 21379 * rqbuflen 21380 * bufaddr 21381 * buflen 21382 * path_flag 21383 * 21384 * Return Code: 0 - Success 21385 * errno return code from sd_ssc_send() 21386 * 21387 * Context: Can sleep. Does not return until command is completed. 21388 * 21389 */ 21390 21391 static int 21392 sd_send_scsi_GET_CONFIGURATION(sd_ssc_t *ssc, struct uscsi_cmd *ucmdbuf, 21393 uchar_t *rqbuf, uint_t rqbuflen, uchar_t *bufaddr, uint_t buflen, 21394 int path_flag) 21395 { 21396 char cdb[CDB_GROUP1]; 21397 int status; 21398 struct sd_lun *un; 21399 21400 ASSERT(ssc != NULL); 21401 un = ssc->ssc_un; 21402 ASSERT(un != NULL); 21403 ASSERT(!mutex_owned(SD_MUTEX(un))); 21404 ASSERT(bufaddr != NULL); 21405 ASSERT(ucmdbuf != NULL); 21406 ASSERT(rqbuf != NULL); 21407 21408 SD_TRACE(SD_LOG_IO, un, 21409 "sd_send_scsi_GET_CONFIGURATION: entry: un:0x%p\n", un); 21410 21411 bzero(cdb, sizeof (cdb)); 21412 bzero(ucmdbuf, sizeof (struct uscsi_cmd)); 21413 bzero(rqbuf, rqbuflen); 21414 bzero(bufaddr, buflen); 21415 21416 /* 21417 * Set up cdb field for the get configuration command. 21418 */ 21419 cdb[0] = SCMD_GET_CONFIGURATION; 21420 cdb[1] = 0x02; /* Requested Type */ 21421 cdb[8] = SD_PROFILE_HEADER_LEN; 21422 ucmdbuf->uscsi_cdb = cdb; 21423 ucmdbuf->uscsi_cdblen = CDB_GROUP1; 21424 ucmdbuf->uscsi_bufaddr = (caddr_t)bufaddr; 21425 ucmdbuf->uscsi_buflen = buflen; 21426 ucmdbuf->uscsi_timeout = sd_io_time; 21427 ucmdbuf->uscsi_rqbuf = (caddr_t)rqbuf; 21428 ucmdbuf->uscsi_rqlen = rqbuflen; 21429 ucmdbuf->uscsi_flags = USCSI_RQENABLE|USCSI_SILENT|USCSI_READ; 21430 21431 status = sd_ssc_send(ssc, ucmdbuf, FKIOCTL, 21432 UIO_SYSSPACE, path_flag); 21433 21434 switch (status) { 21435 case 0: 21436 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 21437 break; /* Success! */ 21438 case EIO: 21439 switch (ucmdbuf->uscsi_status) { 21440 case STATUS_RESERVATION_CONFLICT: 21441 status = EACCES; 21442 break; 21443 default: 21444 break; 21445 } 21446 break; 21447 default: 21448 break; 21449 } 21450 21451 if (status == 0) { 21452 SD_DUMP_MEMORY(un, SD_LOG_IO, 21453 "sd_send_scsi_GET_CONFIGURATION: data", 21454 (uchar_t *)bufaddr, SD_PROFILE_HEADER_LEN, SD_LOG_HEX); 21455 } 21456 21457 SD_TRACE(SD_LOG_IO, un, 21458 "sd_send_scsi_GET_CONFIGURATION: exit\n"); 21459 21460 return (status); 21461 } 21462 21463 /* 21464 * Function: sd_send_scsi_feature_GET_CONFIGURATION 21465 * 21466 * Description: Issues the get configuration command to the device to 21467 * retrieve a specific feature. Called from 21468 * sd_check_for_writable_cd & sd_set_mmc_caps. 21469 * Arguments: ssc 21470 * ucmdbuf 21471 * rqbuf 21472 * rqbuflen 21473 * bufaddr 21474 * buflen 21475 * feature 21476 * 21477 * Return Code: 0 - Success 21478 * errno return code from sd_ssc_send() 21479 * 21480 * Context: Can sleep. Does not return until command is completed. 21481 * 21482 */ 21483 static int 21484 sd_send_scsi_feature_GET_CONFIGURATION(sd_ssc_t *ssc, struct uscsi_cmd *ucmdbuf, 21485 uchar_t *rqbuf, uint_t rqbuflen, uchar_t *bufaddr, uint_t buflen, 21486 char feature, int path_flag) 21487 { 21488 char cdb[CDB_GROUP1]; 21489 int status; 21490 struct sd_lun *un; 21491 21492 ASSERT(ssc != NULL); 21493 un = ssc->ssc_un; 21494 ASSERT(un != NULL); 21495 ASSERT(!mutex_owned(SD_MUTEX(un))); 21496 ASSERT(bufaddr != NULL); 21497 ASSERT(ucmdbuf != NULL); 21498 ASSERT(rqbuf != NULL); 21499 21500 SD_TRACE(SD_LOG_IO, un, 21501 "sd_send_scsi_feature_GET_CONFIGURATION: entry: un:0x%p\n", un); 21502 21503 bzero(cdb, sizeof (cdb)); 21504 bzero(ucmdbuf, sizeof (struct uscsi_cmd)); 21505 bzero(rqbuf, rqbuflen); 21506 bzero(bufaddr, buflen); 21507 21508 /* 21509 * Set up cdb field for the get configuration command. 21510 */ 21511 cdb[0] = SCMD_GET_CONFIGURATION; 21512 cdb[1] = 0x02; /* Requested Type */ 21513 cdb[3] = feature; 21514 cdb[8] = buflen; 21515 ucmdbuf->uscsi_cdb = cdb; 21516 ucmdbuf->uscsi_cdblen = CDB_GROUP1; 21517 ucmdbuf->uscsi_bufaddr = (caddr_t)bufaddr; 21518 ucmdbuf->uscsi_buflen = buflen; 21519 ucmdbuf->uscsi_timeout = sd_io_time; 21520 ucmdbuf->uscsi_rqbuf = (caddr_t)rqbuf; 21521 ucmdbuf->uscsi_rqlen = rqbuflen; 21522 ucmdbuf->uscsi_flags = USCSI_RQENABLE|USCSI_SILENT|USCSI_READ; 21523 21524 status = sd_ssc_send(ssc, ucmdbuf, FKIOCTL, 21525 UIO_SYSSPACE, path_flag); 21526 21527 switch (status) { 21528 case 0: 21529 21530 break; /* Success! */ 21531 case EIO: 21532 switch (ucmdbuf->uscsi_status) { 21533 case STATUS_RESERVATION_CONFLICT: 21534 status = EACCES; 21535 break; 21536 default: 21537 break; 21538 } 21539 break; 21540 default: 21541 break; 21542 } 21543 21544 if (status == 0) { 21545 SD_DUMP_MEMORY(un, SD_LOG_IO, 21546 "sd_send_scsi_feature_GET_CONFIGURATION: data", 21547 (uchar_t *)bufaddr, SD_PROFILE_HEADER_LEN, SD_LOG_HEX); 21548 } 21549 21550 SD_TRACE(SD_LOG_IO, un, 21551 "sd_send_scsi_feature_GET_CONFIGURATION: exit\n"); 21552 21553 return (status); 21554 } 21555 21556 21557 /* 21558 * Function: sd_send_scsi_MODE_SENSE 21559 * 21560 * Description: Utility function for issuing a scsi MODE SENSE command. 21561 * Note: This routine uses a consistent implementation for Group0, 21562 * Group1, and Group2 commands across all platforms. ATAPI devices 21563 * use Group 1 Read/Write commands and Group 2 Mode Sense/Select 21564 * 21565 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 21566 * structure for this target. 21567 * cdbsize - size CDB to be used (CDB_GROUP0 (6 byte), or 21568 * CDB_GROUP[1|2] (10 byte). 21569 * bufaddr - buffer for page data retrieved from the target. 21570 * buflen - size of page to be retrieved. 21571 * page_code - page code of data to be retrieved from the target. 21572 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 21573 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 21574 * to use the USCSI "direct" chain and bypass the normal 21575 * command waitq. 21576 * 21577 * Return Code: 0 - Success 21578 * errno return code from sd_ssc_send() 21579 * 21580 * Context: Can sleep. Does not return until command is completed. 21581 */ 21582 21583 static int 21584 sd_send_scsi_MODE_SENSE(sd_ssc_t *ssc, int cdbsize, uchar_t *bufaddr, 21585 size_t buflen, uchar_t page_code, int path_flag) 21586 { 21587 struct scsi_extended_sense sense_buf; 21588 union scsi_cdb cdb; 21589 struct uscsi_cmd ucmd_buf; 21590 int status; 21591 int headlen; 21592 struct sd_lun *un; 21593 21594 ASSERT(ssc != NULL); 21595 un = ssc->ssc_un; 21596 ASSERT(un != NULL); 21597 ASSERT(!mutex_owned(SD_MUTEX(un))); 21598 ASSERT(bufaddr != NULL); 21599 ASSERT((cdbsize == CDB_GROUP0) || (cdbsize == CDB_GROUP1) || 21600 (cdbsize == CDB_GROUP2)); 21601 21602 SD_TRACE(SD_LOG_IO, un, 21603 "sd_send_scsi_MODE_SENSE: entry: un:0x%p\n", un); 21604 21605 bzero(&cdb, sizeof (cdb)); 21606 bzero(&ucmd_buf, sizeof (ucmd_buf)); 21607 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 21608 bzero(bufaddr, buflen); 21609 21610 if (cdbsize == CDB_GROUP0) { 21611 cdb.scc_cmd = SCMD_MODE_SENSE; 21612 cdb.cdb_opaque[2] = page_code; 21613 FORMG0COUNT(&cdb, buflen); 21614 headlen = MODE_HEADER_LENGTH; 21615 } else { 21616 cdb.scc_cmd = SCMD_MODE_SENSE_G1; 21617 cdb.cdb_opaque[2] = page_code; 21618 FORMG1COUNT(&cdb, buflen); 21619 headlen = MODE_HEADER_LENGTH_GRP2; 21620 } 21621 21622 ASSERT(headlen <= buflen); 21623 SD_FILL_SCSI1_LUN_CDB(un, &cdb); 21624 21625 ucmd_buf.uscsi_cdb = (char *)&cdb; 21626 ucmd_buf.uscsi_cdblen = (uchar_t)cdbsize; 21627 ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr; 21628 ucmd_buf.uscsi_buflen = buflen; 21629 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 21630 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 21631 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT; 21632 ucmd_buf.uscsi_timeout = 60; 21633 21634 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 21635 UIO_SYSSPACE, path_flag); 21636 21637 switch (status) { 21638 case 0: 21639 /* 21640 * sr_check_wp() uses 0x3f page code and check the header of 21641 * mode page to determine if target device is write-protected. 21642 * But some USB devices return 0 bytes for 0x3f page code. For 21643 * this case, make sure that mode page header is returned at 21644 * least. 21645 */ 21646 if (buflen - ucmd_buf.uscsi_resid < headlen) { 21647 status = EIO; 21648 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1, 21649 "mode page header is not returned"); 21650 } 21651 break; /* Success! */ 21652 case EIO: 21653 switch (ucmd_buf.uscsi_status) { 21654 case STATUS_RESERVATION_CONFLICT: 21655 status = EACCES; 21656 break; 21657 default: 21658 break; 21659 } 21660 break; 21661 default: 21662 break; 21663 } 21664 21665 if (status == 0) { 21666 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_MODE_SENSE: data", 21667 (uchar_t *)bufaddr, buflen, SD_LOG_HEX); 21668 } 21669 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_MODE_SENSE: exit\n"); 21670 21671 return (status); 21672 } 21673 21674 21675 /* 21676 * Function: sd_send_scsi_MODE_SELECT 21677 * 21678 * Description: Utility function for issuing a scsi MODE SELECT command. 21679 * Note: This routine uses a consistent implementation for Group0, 21680 * Group1, and Group2 commands across all platforms. ATAPI devices 21681 * use Group 1 Read/Write commands and Group 2 Mode Sense/Select 21682 * 21683 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 21684 * structure for this target. 21685 * cdbsize - size CDB to be used (CDB_GROUP0 (6 byte), or 21686 * CDB_GROUP[1|2] (10 byte). 21687 * bufaddr - buffer for page data retrieved from the target. 21688 * buflen - size of page to be retrieved. 21689 * save_page - boolean to determin if SP bit should be set. 21690 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 21691 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 21692 * to use the USCSI "direct" chain and bypass the normal 21693 * command waitq. 21694 * 21695 * Return Code: 0 - Success 21696 * errno return code from sd_ssc_send() 21697 * 21698 * Context: Can sleep. Does not return until command is completed. 21699 */ 21700 21701 static int 21702 sd_send_scsi_MODE_SELECT(sd_ssc_t *ssc, int cdbsize, uchar_t *bufaddr, 21703 size_t buflen, uchar_t save_page, int path_flag) 21704 { 21705 struct scsi_extended_sense sense_buf; 21706 union scsi_cdb cdb; 21707 struct uscsi_cmd ucmd_buf; 21708 int status; 21709 struct sd_lun *un; 21710 21711 ASSERT(ssc != NULL); 21712 un = ssc->ssc_un; 21713 ASSERT(un != NULL); 21714 ASSERT(!mutex_owned(SD_MUTEX(un))); 21715 ASSERT(bufaddr != NULL); 21716 ASSERT((cdbsize == CDB_GROUP0) || (cdbsize == CDB_GROUP1) || 21717 (cdbsize == CDB_GROUP2)); 21718 21719 SD_TRACE(SD_LOG_IO, un, 21720 "sd_send_scsi_MODE_SELECT: entry: un:0x%p\n", un); 21721 21722 bzero(&cdb, sizeof (cdb)); 21723 bzero(&ucmd_buf, sizeof (ucmd_buf)); 21724 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 21725 21726 /* Set the PF bit for many third party drives */ 21727 cdb.cdb_opaque[1] = 0x10; 21728 21729 /* Set the savepage(SP) bit if given */ 21730 if (save_page == SD_SAVE_PAGE) { 21731 cdb.cdb_opaque[1] |= 0x01; 21732 } 21733 21734 if (cdbsize == CDB_GROUP0) { 21735 cdb.scc_cmd = SCMD_MODE_SELECT; 21736 FORMG0COUNT(&cdb, buflen); 21737 } else { 21738 cdb.scc_cmd = SCMD_MODE_SELECT_G1; 21739 FORMG1COUNT(&cdb, buflen); 21740 } 21741 21742 SD_FILL_SCSI1_LUN_CDB(un, &cdb); 21743 21744 ucmd_buf.uscsi_cdb = (char *)&cdb; 21745 ucmd_buf.uscsi_cdblen = (uchar_t)cdbsize; 21746 ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr; 21747 ucmd_buf.uscsi_buflen = buflen; 21748 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 21749 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 21750 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_WRITE | USCSI_SILENT; 21751 ucmd_buf.uscsi_timeout = 60; 21752 21753 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 21754 UIO_SYSSPACE, path_flag); 21755 21756 switch (status) { 21757 case 0: 21758 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 21759 break; /* Success! */ 21760 case EIO: 21761 switch (ucmd_buf.uscsi_status) { 21762 case STATUS_RESERVATION_CONFLICT: 21763 status = EACCES; 21764 break; 21765 default: 21766 break; 21767 } 21768 break; 21769 default: 21770 break; 21771 } 21772 21773 if (status == 0) { 21774 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_MODE_SELECT: data", 21775 (uchar_t *)bufaddr, buflen, SD_LOG_HEX); 21776 } 21777 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_MODE_SELECT: exit\n"); 21778 21779 return (status); 21780 } 21781 21782 21783 /* 21784 * Function: sd_send_scsi_RDWR 21785 * 21786 * Description: Issue a scsi READ or WRITE command with the given parameters. 21787 * 21788 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 21789 * structure for this target. 21790 * cmd: SCMD_READ or SCMD_WRITE 21791 * bufaddr: Address of caller's buffer to receive the RDWR data 21792 * buflen: Length of caller's buffer receive the RDWR data. 21793 * start_block: Block number for the start of the RDWR operation. 21794 * (Assumes target-native block size.) 21795 * residp: Pointer to variable to receive the redisual of the 21796 * RDWR operation (may be NULL of no residual requested). 21797 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 21798 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 21799 * to use the USCSI "direct" chain and bypass the normal 21800 * command waitq. 21801 * 21802 * Return Code: 0 - Success 21803 * errno return code from sd_ssc_send() 21804 * 21805 * Context: Can sleep. Does not return until command is completed. 21806 */ 21807 21808 static int 21809 sd_send_scsi_RDWR(sd_ssc_t *ssc, uchar_t cmd, void *bufaddr, 21810 size_t buflen, daddr_t start_block, int path_flag) 21811 { 21812 struct scsi_extended_sense sense_buf; 21813 union scsi_cdb cdb; 21814 struct uscsi_cmd ucmd_buf; 21815 uint32_t block_count; 21816 int status; 21817 int cdbsize; 21818 uchar_t flag; 21819 struct sd_lun *un; 21820 21821 ASSERT(ssc != NULL); 21822 un = ssc->ssc_un; 21823 ASSERT(un != NULL); 21824 ASSERT(!mutex_owned(SD_MUTEX(un))); 21825 ASSERT(bufaddr != NULL); 21826 ASSERT((cmd == SCMD_READ) || (cmd == SCMD_WRITE)); 21827 21828 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_RDWR: entry: un:0x%p\n", un); 21829 21830 if (un->un_f_tgt_blocksize_is_valid != TRUE) { 21831 return (EINVAL); 21832 } 21833 21834 mutex_enter(SD_MUTEX(un)); 21835 block_count = SD_BYTES2TGTBLOCKS(un, buflen); 21836 mutex_exit(SD_MUTEX(un)); 21837 21838 flag = (cmd == SCMD_READ) ? USCSI_READ : USCSI_WRITE; 21839 21840 SD_INFO(SD_LOG_IO, un, "sd_send_scsi_RDWR: " 21841 "bufaddr:0x%p buflen:0x%x start_block:0x%p block_count:0x%x\n", 21842 bufaddr, buflen, start_block, block_count); 21843 21844 bzero(&cdb, sizeof (cdb)); 21845 bzero(&ucmd_buf, sizeof (ucmd_buf)); 21846 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 21847 21848 /* Compute CDB size to use */ 21849 if (start_block > 0xffffffff) 21850 cdbsize = CDB_GROUP4; 21851 else if ((start_block & 0xFFE00000) || 21852 (un->un_f_cfg_is_atapi == TRUE)) 21853 cdbsize = CDB_GROUP1; 21854 else 21855 cdbsize = CDB_GROUP0; 21856 21857 switch (cdbsize) { 21858 case CDB_GROUP0: /* 6-byte CDBs */ 21859 cdb.scc_cmd = cmd; 21860 FORMG0ADDR(&cdb, start_block); 21861 FORMG0COUNT(&cdb, block_count); 21862 break; 21863 case CDB_GROUP1: /* 10-byte CDBs */ 21864 cdb.scc_cmd = cmd | SCMD_GROUP1; 21865 FORMG1ADDR(&cdb, start_block); 21866 FORMG1COUNT(&cdb, block_count); 21867 break; 21868 case CDB_GROUP4: /* 16-byte CDBs */ 21869 cdb.scc_cmd = cmd | SCMD_GROUP4; 21870 FORMG4LONGADDR(&cdb, (uint64_t)start_block); 21871 FORMG4COUNT(&cdb, block_count); 21872 break; 21873 case CDB_GROUP5: /* 12-byte CDBs (currently unsupported) */ 21874 default: 21875 /* All others reserved */ 21876 return (EINVAL); 21877 } 21878 21879 /* Set LUN bit(s) in CDB if this is a SCSI-1 device */ 21880 SD_FILL_SCSI1_LUN_CDB(un, &cdb); 21881 21882 ucmd_buf.uscsi_cdb = (char *)&cdb; 21883 ucmd_buf.uscsi_cdblen = (uchar_t)cdbsize; 21884 ucmd_buf.uscsi_bufaddr = bufaddr; 21885 ucmd_buf.uscsi_buflen = buflen; 21886 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 21887 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 21888 ucmd_buf.uscsi_flags = flag | USCSI_RQENABLE | USCSI_SILENT; 21889 ucmd_buf.uscsi_timeout = 60; 21890 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 21891 UIO_SYSSPACE, path_flag); 21892 21893 switch (status) { 21894 case 0: 21895 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 21896 break; /* Success! */ 21897 case EIO: 21898 switch (ucmd_buf.uscsi_status) { 21899 case STATUS_RESERVATION_CONFLICT: 21900 status = EACCES; 21901 break; 21902 default: 21903 break; 21904 } 21905 break; 21906 default: 21907 break; 21908 } 21909 21910 if (status == 0) { 21911 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_RDWR: data", 21912 (uchar_t *)bufaddr, buflen, SD_LOG_HEX); 21913 } 21914 21915 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_RDWR: exit\n"); 21916 21917 return (status); 21918 } 21919 21920 21921 /* 21922 * Function: sd_send_scsi_LOG_SENSE 21923 * 21924 * Description: Issue a scsi LOG_SENSE command with the given parameters. 21925 * 21926 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 21927 * structure for this target. 21928 * 21929 * Return Code: 0 - Success 21930 * errno return code from sd_ssc_send() 21931 * 21932 * Context: Can sleep. Does not return until command is completed. 21933 */ 21934 21935 static int 21936 sd_send_scsi_LOG_SENSE(sd_ssc_t *ssc, uchar_t *bufaddr, uint16_t buflen, 21937 uchar_t page_code, uchar_t page_control, uint16_t param_ptr, int path_flag) 21938 { 21939 struct scsi_extended_sense sense_buf; 21940 union scsi_cdb cdb; 21941 struct uscsi_cmd ucmd_buf; 21942 int status; 21943 struct sd_lun *un; 21944 21945 ASSERT(ssc != NULL); 21946 un = ssc->ssc_un; 21947 ASSERT(un != NULL); 21948 ASSERT(!mutex_owned(SD_MUTEX(un))); 21949 21950 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_LOG_SENSE: entry: un:0x%p\n", un); 21951 21952 bzero(&cdb, sizeof (cdb)); 21953 bzero(&ucmd_buf, sizeof (ucmd_buf)); 21954 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 21955 21956 cdb.scc_cmd = SCMD_LOG_SENSE_G1; 21957 cdb.cdb_opaque[2] = (page_control << 6) | page_code; 21958 cdb.cdb_opaque[5] = (uchar_t)((param_ptr & 0xFF00) >> 8); 21959 cdb.cdb_opaque[6] = (uchar_t)(param_ptr & 0x00FF); 21960 FORMG1COUNT(&cdb, buflen); 21961 21962 ucmd_buf.uscsi_cdb = (char *)&cdb; 21963 ucmd_buf.uscsi_cdblen = CDB_GROUP1; 21964 ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr; 21965 ucmd_buf.uscsi_buflen = buflen; 21966 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 21967 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 21968 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT; 21969 ucmd_buf.uscsi_timeout = 60; 21970 21971 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 21972 UIO_SYSSPACE, path_flag); 21973 21974 switch (status) { 21975 case 0: 21976 break; 21977 case EIO: 21978 switch (ucmd_buf.uscsi_status) { 21979 case STATUS_RESERVATION_CONFLICT: 21980 status = EACCES; 21981 break; 21982 case STATUS_CHECK: 21983 if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 21984 (scsi_sense_key((uint8_t *)&sense_buf) == 21985 KEY_ILLEGAL_REQUEST) && 21986 (scsi_sense_asc((uint8_t *)&sense_buf) == 0x24)) { 21987 /* 21988 * ASC 0x24: INVALID FIELD IN CDB 21989 */ 21990 switch (page_code) { 21991 case START_STOP_CYCLE_PAGE: 21992 /* 21993 * The start stop cycle counter is 21994 * implemented as page 0x31 in earlier 21995 * generation disks. In new generation 21996 * disks the start stop cycle counter is 21997 * implemented as page 0xE. To properly 21998 * handle this case if an attempt for 21999 * log page 0xE is made and fails we 22000 * will try again using page 0x31. 22001 * 22002 * Network storage BU committed to 22003 * maintain the page 0x31 for this 22004 * purpose and will not have any other 22005 * page implemented with page code 0x31 22006 * until all disks transition to the 22007 * standard page. 22008 */ 22009 mutex_enter(SD_MUTEX(un)); 22010 un->un_start_stop_cycle_page = 22011 START_STOP_CYCLE_VU_PAGE; 22012 cdb.cdb_opaque[2] = 22013 (char)(page_control << 6) | 22014 un->un_start_stop_cycle_page; 22015 mutex_exit(SD_MUTEX(un)); 22016 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 22017 status = sd_ssc_send( 22018 ssc, &ucmd_buf, FKIOCTL, 22019 UIO_SYSSPACE, path_flag); 22020 22021 break; 22022 case TEMPERATURE_PAGE: 22023 status = ENOTTY; 22024 break; 22025 default: 22026 break; 22027 } 22028 } 22029 break; 22030 default: 22031 break; 22032 } 22033 break; 22034 default: 22035 break; 22036 } 22037 22038 if (status == 0) { 22039 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 22040 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_LOG_SENSE: data", 22041 (uchar_t *)bufaddr, buflen, SD_LOG_HEX); 22042 } 22043 22044 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_LOG_SENSE: exit\n"); 22045 22046 return (status); 22047 } 22048 22049 22050 /* 22051 * Function: sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION 22052 * 22053 * Description: Issue the scsi GET EVENT STATUS NOTIFICATION command. 22054 * 22055 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 22056 * structure for this target. 22057 * bufaddr 22058 * buflen 22059 * class_req 22060 * 22061 * Return Code: 0 - Success 22062 * errno return code from sd_ssc_send() 22063 * 22064 * Context: Can sleep. Does not return until command is completed. 22065 */ 22066 22067 static int 22068 sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION(sd_ssc_t *ssc, uchar_t *bufaddr, 22069 size_t buflen, uchar_t class_req) 22070 { 22071 union scsi_cdb cdb; 22072 struct uscsi_cmd ucmd_buf; 22073 int status; 22074 struct sd_lun *un; 22075 22076 ASSERT(ssc != NULL); 22077 un = ssc->ssc_un; 22078 ASSERT(un != NULL); 22079 ASSERT(!mutex_owned(SD_MUTEX(un))); 22080 ASSERT(bufaddr != NULL); 22081 22082 SD_TRACE(SD_LOG_IO, un, 22083 "sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION: entry: un:0x%p\n", un); 22084 22085 bzero(&cdb, sizeof (cdb)); 22086 bzero(&ucmd_buf, sizeof (ucmd_buf)); 22087 bzero(bufaddr, buflen); 22088 22089 cdb.scc_cmd = SCMD_GET_EVENT_STATUS_NOTIFICATION; 22090 cdb.cdb_opaque[1] = 1; /* polled */ 22091 cdb.cdb_opaque[4] = class_req; 22092 FORMG1COUNT(&cdb, buflen); 22093 22094 ucmd_buf.uscsi_cdb = (char *)&cdb; 22095 ucmd_buf.uscsi_cdblen = CDB_GROUP1; 22096 ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr; 22097 ucmd_buf.uscsi_buflen = buflen; 22098 ucmd_buf.uscsi_rqbuf = NULL; 22099 ucmd_buf.uscsi_rqlen = 0; 22100 ucmd_buf.uscsi_flags = USCSI_READ | USCSI_SILENT; 22101 ucmd_buf.uscsi_timeout = 60; 22102 22103 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 22104 UIO_SYSSPACE, SD_PATH_DIRECT); 22105 22106 /* 22107 * Only handle status == 0, the upper-level caller 22108 * will put different assessment based on the context. 22109 */ 22110 if (status == 0) { 22111 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 22112 22113 if (ucmd_buf.uscsi_resid != 0) { 22114 status = EIO; 22115 } 22116 } 22117 22118 SD_TRACE(SD_LOG_IO, un, 22119 "sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION: exit\n"); 22120 22121 return (status); 22122 } 22123 22124 22125 static boolean_t 22126 sd_gesn_media_data_valid(uchar_t *data) 22127 { 22128 uint16_t len; 22129 22130 len = (data[1] << 8) | data[0]; 22131 return ((len >= 6) && 22132 ((data[2] & SD_GESN_HEADER_NEA) == 0) && 22133 ((data[2] & SD_GESN_HEADER_CLASS) == SD_GESN_MEDIA_CLASS) && 22134 ((data[3] & (1 << SD_GESN_MEDIA_CLASS)) != 0)); 22135 } 22136 22137 22138 /* 22139 * Function: sdioctl 22140 * 22141 * Description: Driver's ioctl(9e) entry point function. 22142 * 22143 * Arguments: dev - device number 22144 * cmd - ioctl operation to be performed 22145 * arg - user argument, contains data to be set or reference 22146 * parameter for get 22147 * flag - bit flag, indicating open settings, 32/64 bit type 22148 * cred_p - user credential pointer 22149 * rval_p - calling process return value (OPT) 22150 * 22151 * Return Code: EINVAL 22152 * ENOTTY 22153 * ENXIO 22154 * EIO 22155 * EFAULT 22156 * ENOTSUP 22157 * EPERM 22158 * 22159 * Context: Called from the device switch at normal priority. 22160 */ 22161 22162 static int 22163 sdioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cred_p, int *rval_p) 22164 { 22165 struct sd_lun *un = NULL; 22166 int err = 0; 22167 int i = 0; 22168 cred_t *cr; 22169 int tmprval = EINVAL; 22170 boolean_t is_valid; 22171 sd_ssc_t *ssc; 22172 22173 /* 22174 * All device accesses go thru sdstrategy where we check on suspend 22175 * status 22176 */ 22177 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 22178 return (ENXIO); 22179 } 22180 22181 ASSERT(!mutex_owned(SD_MUTEX(un))); 22182 22183 /* Initialize sd_ssc_t for internal uscsi commands */ 22184 ssc = sd_ssc_init(un); 22185 22186 is_valid = SD_IS_VALID_LABEL(un); 22187 22188 /* 22189 * Moved this wait from sd_uscsi_strategy to here for 22190 * reasons of deadlock prevention. Internal driver commands, 22191 * specifically those to change a devices power level, result 22192 * in a call to sd_uscsi_strategy. 22193 */ 22194 mutex_enter(SD_MUTEX(un)); 22195 while ((un->un_state == SD_STATE_SUSPENDED) || 22196 (un->un_state == SD_STATE_PM_CHANGING)) { 22197 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 22198 } 22199 /* 22200 * Twiddling the counter here protects commands from now 22201 * through to the top of sd_uscsi_strategy. Without the 22202 * counter inc. a power down, for example, could get in 22203 * after the above check for state is made and before 22204 * execution gets to the top of sd_uscsi_strategy. 22205 * That would cause problems. 22206 */ 22207 un->un_ncmds_in_driver++; 22208 22209 if (!is_valid && 22210 (flag & (FNDELAY | FNONBLOCK))) { 22211 switch (cmd) { 22212 case DKIOCGGEOM: /* SD_PATH_DIRECT */ 22213 case DKIOCGVTOC: 22214 case DKIOCGEXTVTOC: 22215 case DKIOCGAPART: 22216 case DKIOCPARTINFO: 22217 case DKIOCEXTPARTINFO: 22218 case DKIOCSGEOM: 22219 case DKIOCSAPART: 22220 case DKIOCGETEFI: 22221 case DKIOCPARTITION: 22222 case DKIOCSVTOC: 22223 case DKIOCSEXTVTOC: 22224 case DKIOCSETEFI: 22225 case DKIOCGMBOOT: 22226 case DKIOCSMBOOT: 22227 case DKIOCG_PHYGEOM: 22228 case DKIOCG_VIRTGEOM: 22229 #if defined(__i386) || defined(__amd64) 22230 case DKIOCSETEXTPART: 22231 #endif 22232 /* let cmlb handle it */ 22233 goto skip_ready_valid; 22234 22235 case CDROMPAUSE: 22236 case CDROMRESUME: 22237 case CDROMPLAYMSF: 22238 case CDROMPLAYTRKIND: 22239 case CDROMREADTOCHDR: 22240 case CDROMREADTOCENTRY: 22241 case CDROMSTOP: 22242 case CDROMSTART: 22243 case CDROMVOLCTRL: 22244 case CDROMSUBCHNL: 22245 case CDROMREADMODE2: 22246 case CDROMREADMODE1: 22247 case CDROMREADOFFSET: 22248 case CDROMSBLKMODE: 22249 case CDROMGBLKMODE: 22250 case CDROMGDRVSPEED: 22251 case CDROMSDRVSPEED: 22252 case CDROMCDDA: 22253 case CDROMCDXA: 22254 case CDROMSUBCODE: 22255 if (!ISCD(un)) { 22256 un->un_ncmds_in_driver--; 22257 ASSERT(un->un_ncmds_in_driver >= 0); 22258 mutex_exit(SD_MUTEX(un)); 22259 err = ENOTTY; 22260 goto done_without_assess; 22261 } 22262 break; 22263 case FDEJECT: 22264 case DKIOCEJECT: 22265 case CDROMEJECT: 22266 if (!un->un_f_eject_media_supported) { 22267 un->un_ncmds_in_driver--; 22268 ASSERT(un->un_ncmds_in_driver >= 0); 22269 mutex_exit(SD_MUTEX(un)); 22270 err = ENOTTY; 22271 goto done_without_assess; 22272 } 22273 break; 22274 case DKIOCFLUSHWRITECACHE: 22275 mutex_exit(SD_MUTEX(un)); 22276 err = sd_send_scsi_TEST_UNIT_READY(ssc, 0); 22277 if (err != 0) { 22278 mutex_enter(SD_MUTEX(un)); 22279 un->un_ncmds_in_driver--; 22280 ASSERT(un->un_ncmds_in_driver >= 0); 22281 mutex_exit(SD_MUTEX(un)); 22282 err = EIO; 22283 goto done_quick_assess; 22284 } 22285 mutex_enter(SD_MUTEX(un)); 22286 /* FALLTHROUGH */ 22287 case DKIOCREMOVABLE: 22288 case DKIOCHOTPLUGGABLE: 22289 case DKIOCINFO: 22290 case DKIOCGMEDIAINFO: 22291 case DKIOCGMEDIAINFOEXT: 22292 case DKIOCSOLIDSTATE: 22293 case MHIOCENFAILFAST: 22294 case MHIOCSTATUS: 22295 case MHIOCTKOWN: 22296 case MHIOCRELEASE: 22297 case MHIOCGRP_INKEYS: 22298 case MHIOCGRP_INRESV: 22299 case MHIOCGRP_REGISTER: 22300 case MHIOCGRP_CLEAR: 22301 case MHIOCGRP_RESERVE: 22302 case MHIOCGRP_PREEMPTANDABORT: 22303 case MHIOCGRP_REGISTERANDIGNOREKEY: 22304 case CDROMCLOSETRAY: 22305 case USCSICMD: 22306 goto skip_ready_valid; 22307 default: 22308 break; 22309 } 22310 22311 mutex_exit(SD_MUTEX(un)); 22312 err = sd_ready_and_valid(ssc, SDPART(dev)); 22313 mutex_enter(SD_MUTEX(un)); 22314 22315 if (err != SD_READY_VALID) { 22316 switch (cmd) { 22317 case DKIOCSTATE: 22318 case CDROMGDRVSPEED: 22319 case CDROMSDRVSPEED: 22320 case FDEJECT: /* for eject command */ 22321 case DKIOCEJECT: 22322 case CDROMEJECT: 22323 case DKIOCREMOVABLE: 22324 case DKIOCHOTPLUGGABLE: 22325 break; 22326 default: 22327 if (un->un_f_has_removable_media) { 22328 err = ENXIO; 22329 } else { 22330 /* Do not map SD_RESERVED_BY_OTHERS to EIO */ 22331 if (err == SD_RESERVED_BY_OTHERS) { 22332 err = EACCES; 22333 } else { 22334 err = EIO; 22335 } 22336 } 22337 un->un_ncmds_in_driver--; 22338 ASSERT(un->un_ncmds_in_driver >= 0); 22339 mutex_exit(SD_MUTEX(un)); 22340 22341 goto done_without_assess; 22342 } 22343 } 22344 } 22345 22346 skip_ready_valid: 22347 mutex_exit(SD_MUTEX(un)); 22348 22349 switch (cmd) { 22350 case DKIOCINFO: 22351 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCINFO\n"); 22352 err = sd_dkio_ctrl_info(dev, (caddr_t)arg, flag); 22353 break; 22354 22355 case DKIOCGMEDIAINFO: 22356 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGMEDIAINFO\n"); 22357 err = sd_get_media_info(dev, (caddr_t)arg, flag); 22358 break; 22359 22360 case DKIOCGMEDIAINFOEXT: 22361 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGMEDIAINFOEXT\n"); 22362 err = sd_get_media_info_ext(dev, (caddr_t)arg, flag); 22363 break; 22364 22365 case DKIOCGGEOM: 22366 case DKIOCGVTOC: 22367 case DKIOCGEXTVTOC: 22368 case DKIOCGAPART: 22369 case DKIOCPARTINFO: 22370 case DKIOCEXTPARTINFO: 22371 case DKIOCSGEOM: 22372 case DKIOCSAPART: 22373 case DKIOCGETEFI: 22374 case DKIOCPARTITION: 22375 case DKIOCSVTOC: 22376 case DKIOCSEXTVTOC: 22377 case DKIOCSETEFI: 22378 case DKIOCGMBOOT: 22379 case DKIOCSMBOOT: 22380 case DKIOCG_PHYGEOM: 22381 case DKIOCG_VIRTGEOM: 22382 #if defined(__i386) || defined(__amd64) 22383 case DKIOCSETEXTPART: 22384 #endif 22385 SD_TRACE(SD_LOG_IOCTL, un, "DKIOC %d\n", cmd); 22386 22387 /* TUR should spin up */ 22388 22389 if (un->un_f_has_removable_media) 22390 err = sd_send_scsi_TEST_UNIT_READY(ssc, 22391 SD_CHECK_FOR_MEDIA); 22392 22393 else 22394 err = sd_send_scsi_TEST_UNIT_READY(ssc, 0); 22395 22396 if (err != 0) 22397 goto done_with_assess; 22398 22399 err = cmlb_ioctl(un->un_cmlbhandle, dev, 22400 cmd, arg, flag, cred_p, rval_p, (void *)SD_PATH_DIRECT); 22401 22402 if ((err == 0) && 22403 ((cmd == DKIOCSETEFI) || 22404 ((un->un_f_pkstats_enabled) && 22405 (cmd == DKIOCSAPART || cmd == DKIOCSVTOC || 22406 cmd == DKIOCSEXTVTOC)))) { 22407 22408 tmprval = cmlb_validate(un->un_cmlbhandle, CMLB_SILENT, 22409 (void *)SD_PATH_DIRECT); 22410 if ((tmprval == 0) && un->un_f_pkstats_enabled) { 22411 sd_set_pstats(un); 22412 SD_TRACE(SD_LOG_IO_PARTITION, un, 22413 "sd_ioctl: un:0x%p pstats created and " 22414 "set\n", un); 22415 } 22416 } 22417 22418 if ((cmd == DKIOCSVTOC || cmd == DKIOCSEXTVTOC) || 22419 ((cmd == DKIOCSETEFI) && (tmprval == 0))) { 22420 22421 mutex_enter(SD_MUTEX(un)); 22422 if (un->un_f_devid_supported && 22423 (un->un_f_opt_fab_devid == TRUE)) { 22424 if (un->un_devid == NULL) { 22425 sd_register_devid(ssc, SD_DEVINFO(un), 22426 SD_TARGET_IS_UNRESERVED); 22427 } else { 22428 /* 22429 * The device id for this disk 22430 * has been fabricated. The 22431 * device id must be preserved 22432 * by writing it back out to 22433 * disk. 22434 */ 22435 if (sd_write_deviceid(ssc) != 0) { 22436 ddi_devid_free(un->un_devid); 22437 un->un_devid = NULL; 22438 } 22439 } 22440 } 22441 mutex_exit(SD_MUTEX(un)); 22442 } 22443 22444 break; 22445 22446 case DKIOCLOCK: 22447 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCLOCK\n"); 22448 err = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT, 22449 SD_PATH_STANDARD); 22450 goto done_with_assess; 22451 22452 case DKIOCUNLOCK: 22453 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCUNLOCK\n"); 22454 err = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_ALLOW, 22455 SD_PATH_STANDARD); 22456 goto done_with_assess; 22457 22458 case DKIOCSTATE: { 22459 enum dkio_state state; 22460 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCSTATE\n"); 22461 22462 if (ddi_copyin((void *)arg, &state, sizeof (int), flag) != 0) { 22463 err = EFAULT; 22464 } else { 22465 err = sd_check_media(dev, state); 22466 if (err == 0) { 22467 if (ddi_copyout(&un->un_mediastate, (void *)arg, 22468 sizeof (int), flag) != 0) 22469 err = EFAULT; 22470 } 22471 } 22472 break; 22473 } 22474 22475 case DKIOCREMOVABLE: 22476 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCREMOVABLE\n"); 22477 i = un->un_f_has_removable_media ? 1 : 0; 22478 if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) { 22479 err = EFAULT; 22480 } else { 22481 err = 0; 22482 } 22483 break; 22484 22485 case DKIOCSOLIDSTATE: 22486 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCSOLIDSTATE\n"); 22487 i = un->un_f_is_solid_state ? 1 : 0; 22488 if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) { 22489 err = EFAULT; 22490 } else { 22491 err = 0; 22492 } 22493 break; 22494 22495 case DKIOCHOTPLUGGABLE: 22496 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCHOTPLUGGABLE\n"); 22497 i = un->un_f_is_hotpluggable ? 1 : 0; 22498 if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) { 22499 err = EFAULT; 22500 } else { 22501 err = 0; 22502 } 22503 break; 22504 22505 case DKIOCREADONLY: 22506 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCREADONLY\n"); 22507 i = 0; 22508 if ((ISCD(un) && !un->un_f_mmc_writable_media) || 22509 (sr_check_wp(dev) != 0)) { 22510 i = 1; 22511 } 22512 if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) { 22513 err = EFAULT; 22514 } else { 22515 err = 0; 22516 } 22517 break; 22518 22519 case DKIOCGTEMPERATURE: 22520 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGTEMPERATURE\n"); 22521 err = sd_dkio_get_temp(dev, (caddr_t)arg, flag); 22522 break; 22523 22524 case MHIOCENFAILFAST: 22525 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCENFAILFAST\n"); 22526 if ((err = drv_priv(cred_p)) == 0) { 22527 err = sd_mhdioc_failfast(dev, (caddr_t)arg, flag); 22528 } 22529 break; 22530 22531 case MHIOCTKOWN: 22532 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCTKOWN\n"); 22533 if ((err = drv_priv(cred_p)) == 0) { 22534 err = sd_mhdioc_takeown(dev, (caddr_t)arg, flag); 22535 } 22536 break; 22537 22538 case MHIOCRELEASE: 22539 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCRELEASE\n"); 22540 if ((err = drv_priv(cred_p)) == 0) { 22541 err = sd_mhdioc_release(dev); 22542 } 22543 break; 22544 22545 case MHIOCSTATUS: 22546 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCSTATUS\n"); 22547 if ((err = drv_priv(cred_p)) == 0) { 22548 switch (sd_send_scsi_TEST_UNIT_READY(ssc, 0)) { 22549 case 0: 22550 err = 0; 22551 break; 22552 case EACCES: 22553 *rval_p = 1; 22554 err = 0; 22555 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 22556 break; 22557 default: 22558 err = EIO; 22559 goto done_with_assess; 22560 } 22561 } 22562 break; 22563 22564 case MHIOCQRESERVE: 22565 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCQRESERVE\n"); 22566 if ((err = drv_priv(cred_p)) == 0) { 22567 err = sd_reserve_release(dev, SD_RESERVE); 22568 } 22569 break; 22570 22571 case MHIOCREREGISTERDEVID: 22572 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCREREGISTERDEVID\n"); 22573 if (drv_priv(cred_p) == EPERM) { 22574 err = EPERM; 22575 } else if (!un->un_f_devid_supported) { 22576 err = ENOTTY; 22577 } else { 22578 err = sd_mhdioc_register_devid(dev); 22579 } 22580 break; 22581 22582 case MHIOCGRP_INKEYS: 22583 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_INKEYS\n"); 22584 if (((err = drv_priv(cred_p)) != EPERM) && arg != NULL) { 22585 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22586 err = ENOTSUP; 22587 } else { 22588 err = sd_mhdioc_inkeys(dev, (caddr_t)arg, 22589 flag); 22590 } 22591 } 22592 break; 22593 22594 case MHIOCGRP_INRESV: 22595 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_INRESV\n"); 22596 if (((err = drv_priv(cred_p)) != EPERM) && arg != NULL) { 22597 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22598 err = ENOTSUP; 22599 } else { 22600 err = sd_mhdioc_inresv(dev, (caddr_t)arg, flag); 22601 } 22602 } 22603 break; 22604 22605 case MHIOCGRP_REGISTER: 22606 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_REGISTER\n"); 22607 if ((err = drv_priv(cred_p)) != EPERM) { 22608 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22609 err = ENOTSUP; 22610 } else if (arg != NULL) { 22611 mhioc_register_t reg; 22612 if (ddi_copyin((void *)arg, ®, 22613 sizeof (mhioc_register_t), flag) != 0) { 22614 err = EFAULT; 22615 } else { 22616 err = 22617 sd_send_scsi_PERSISTENT_RESERVE_OUT( 22618 ssc, SD_SCSI3_REGISTER, 22619 (uchar_t *)®); 22620 if (err != 0) 22621 goto done_with_assess; 22622 } 22623 } 22624 } 22625 break; 22626 22627 case MHIOCGRP_CLEAR: 22628 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_CLEAR\n"); 22629 if ((err = drv_priv(cred_p)) != EPERM) { 22630 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22631 err = ENOTSUP; 22632 } else if (arg != NULL) { 22633 mhioc_register_t reg; 22634 if (ddi_copyin((void *)arg, ®, 22635 sizeof (mhioc_register_t), flag) != 0) { 22636 err = EFAULT; 22637 } else { 22638 err = 22639 sd_send_scsi_PERSISTENT_RESERVE_OUT( 22640 ssc, SD_SCSI3_CLEAR, 22641 (uchar_t *)®); 22642 if (err != 0) 22643 goto done_with_assess; 22644 } 22645 } 22646 } 22647 break; 22648 22649 case MHIOCGRP_RESERVE: 22650 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_RESERVE\n"); 22651 if ((err = drv_priv(cred_p)) != EPERM) { 22652 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22653 err = ENOTSUP; 22654 } else if (arg != NULL) { 22655 mhioc_resv_desc_t resv_desc; 22656 if (ddi_copyin((void *)arg, &resv_desc, 22657 sizeof (mhioc_resv_desc_t), flag) != 0) { 22658 err = EFAULT; 22659 } else { 22660 err = 22661 sd_send_scsi_PERSISTENT_RESERVE_OUT( 22662 ssc, SD_SCSI3_RESERVE, 22663 (uchar_t *)&resv_desc); 22664 if (err != 0) 22665 goto done_with_assess; 22666 } 22667 } 22668 } 22669 break; 22670 22671 case MHIOCGRP_PREEMPTANDABORT: 22672 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_PREEMPTANDABORT\n"); 22673 if ((err = drv_priv(cred_p)) != EPERM) { 22674 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22675 err = ENOTSUP; 22676 } else if (arg != NULL) { 22677 mhioc_preemptandabort_t preempt_abort; 22678 if (ddi_copyin((void *)arg, &preempt_abort, 22679 sizeof (mhioc_preemptandabort_t), 22680 flag) != 0) { 22681 err = EFAULT; 22682 } else { 22683 err = 22684 sd_send_scsi_PERSISTENT_RESERVE_OUT( 22685 ssc, SD_SCSI3_PREEMPTANDABORT, 22686 (uchar_t *)&preempt_abort); 22687 if (err != 0) 22688 goto done_with_assess; 22689 } 22690 } 22691 } 22692 break; 22693 22694 case MHIOCGRP_REGISTERANDIGNOREKEY: 22695 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_REGISTERANDIGNOREKEY\n"); 22696 if ((err = drv_priv(cred_p)) != EPERM) { 22697 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22698 err = ENOTSUP; 22699 } else if (arg != NULL) { 22700 mhioc_registerandignorekey_t r_and_i; 22701 if (ddi_copyin((void *)arg, (void *)&r_and_i, 22702 sizeof (mhioc_registerandignorekey_t), 22703 flag) != 0) { 22704 err = EFAULT; 22705 } else { 22706 err = 22707 sd_send_scsi_PERSISTENT_RESERVE_OUT( 22708 ssc, SD_SCSI3_REGISTERANDIGNOREKEY, 22709 (uchar_t *)&r_and_i); 22710 if (err != 0) 22711 goto done_with_assess; 22712 } 22713 } 22714 } 22715 break; 22716 22717 case USCSICMD: 22718 SD_TRACE(SD_LOG_IOCTL, un, "USCSICMD\n"); 22719 cr = ddi_get_cred(); 22720 if ((drv_priv(cred_p) != 0) && (drv_priv(cr) != 0)) { 22721 err = EPERM; 22722 } else { 22723 enum uio_seg uioseg; 22724 22725 uioseg = (flag & FKIOCTL) ? UIO_SYSSPACE : 22726 UIO_USERSPACE; 22727 if (un->un_f_format_in_progress == TRUE) { 22728 err = EAGAIN; 22729 break; 22730 } 22731 22732 err = sd_ssc_send(ssc, 22733 (struct uscsi_cmd *)arg, 22734 flag, uioseg, SD_PATH_STANDARD); 22735 if (err != 0) 22736 goto done_with_assess; 22737 else 22738 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 22739 } 22740 break; 22741 22742 case CDROMPAUSE: 22743 case CDROMRESUME: 22744 SD_TRACE(SD_LOG_IOCTL, un, "PAUSE-RESUME\n"); 22745 if (!ISCD(un)) { 22746 err = ENOTTY; 22747 } else { 22748 err = sr_pause_resume(dev, cmd); 22749 } 22750 break; 22751 22752 case CDROMPLAYMSF: 22753 SD_TRACE(SD_LOG_IOCTL, un, "CDROMPLAYMSF\n"); 22754 if (!ISCD(un)) { 22755 err = ENOTTY; 22756 } else { 22757 err = sr_play_msf(dev, (caddr_t)arg, flag); 22758 } 22759 break; 22760 22761 case CDROMPLAYTRKIND: 22762 SD_TRACE(SD_LOG_IOCTL, un, "CDROMPLAYTRKIND\n"); 22763 #if defined(__i386) || defined(__amd64) 22764 /* 22765 * not supported on ATAPI CD drives, use CDROMPLAYMSF instead 22766 */ 22767 if (!ISCD(un) || (un->un_f_cfg_is_atapi == TRUE)) { 22768 #else 22769 if (!ISCD(un)) { 22770 #endif 22771 err = ENOTTY; 22772 } else { 22773 err = sr_play_trkind(dev, (caddr_t)arg, flag); 22774 } 22775 break; 22776 22777 case CDROMREADTOCHDR: 22778 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADTOCHDR\n"); 22779 if (!ISCD(un)) { 22780 err = ENOTTY; 22781 } else { 22782 err = sr_read_tochdr(dev, (caddr_t)arg, flag); 22783 } 22784 break; 22785 22786 case CDROMREADTOCENTRY: 22787 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADTOCENTRY\n"); 22788 if (!ISCD(un)) { 22789 err = ENOTTY; 22790 } else { 22791 err = sr_read_tocentry(dev, (caddr_t)arg, flag); 22792 } 22793 break; 22794 22795 case CDROMSTOP: 22796 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSTOP\n"); 22797 if (!ISCD(un)) { 22798 err = ENOTTY; 22799 } else { 22800 err = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP, 22801 SD_TARGET_STOP, SD_PATH_STANDARD); 22802 goto done_with_assess; 22803 } 22804 break; 22805 22806 case CDROMSTART: 22807 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSTART\n"); 22808 if (!ISCD(un)) { 22809 err = ENOTTY; 22810 } else { 22811 err = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP, 22812 SD_TARGET_START, SD_PATH_STANDARD); 22813 goto done_with_assess; 22814 } 22815 break; 22816 22817 case CDROMCLOSETRAY: 22818 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCLOSETRAY\n"); 22819 if (!ISCD(un)) { 22820 err = ENOTTY; 22821 } else { 22822 err = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP, 22823 SD_TARGET_CLOSE, SD_PATH_STANDARD); 22824 goto done_with_assess; 22825 } 22826 break; 22827 22828 case FDEJECT: /* for eject command */ 22829 case DKIOCEJECT: 22830 case CDROMEJECT: 22831 SD_TRACE(SD_LOG_IOCTL, un, "EJECT\n"); 22832 if (!un->un_f_eject_media_supported) { 22833 err = ENOTTY; 22834 } else { 22835 err = sr_eject(dev); 22836 } 22837 break; 22838 22839 case CDROMVOLCTRL: 22840 SD_TRACE(SD_LOG_IOCTL, un, "CDROMVOLCTRL\n"); 22841 if (!ISCD(un)) { 22842 err = ENOTTY; 22843 } else { 22844 err = sr_volume_ctrl(dev, (caddr_t)arg, flag); 22845 } 22846 break; 22847 22848 case CDROMSUBCHNL: 22849 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSUBCHNL\n"); 22850 if (!ISCD(un)) { 22851 err = ENOTTY; 22852 } else { 22853 err = sr_read_subchannel(dev, (caddr_t)arg, flag); 22854 } 22855 break; 22856 22857 case CDROMREADMODE2: 22858 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADMODE2\n"); 22859 if (!ISCD(un)) { 22860 err = ENOTTY; 22861 } else if (un->un_f_cfg_is_atapi == TRUE) { 22862 /* 22863 * If the drive supports READ CD, use that instead of 22864 * switching the LBA size via a MODE SELECT 22865 * Block Descriptor 22866 */ 22867 err = sr_read_cd_mode2(dev, (caddr_t)arg, flag); 22868 } else { 22869 err = sr_read_mode2(dev, (caddr_t)arg, flag); 22870 } 22871 break; 22872 22873 case CDROMREADMODE1: 22874 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADMODE1\n"); 22875 if (!ISCD(un)) { 22876 err = ENOTTY; 22877 } else { 22878 err = sr_read_mode1(dev, (caddr_t)arg, flag); 22879 } 22880 break; 22881 22882 case CDROMREADOFFSET: 22883 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADOFFSET\n"); 22884 if (!ISCD(un)) { 22885 err = ENOTTY; 22886 } else { 22887 err = sr_read_sony_session_offset(dev, (caddr_t)arg, 22888 flag); 22889 } 22890 break; 22891 22892 case CDROMSBLKMODE: 22893 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSBLKMODE\n"); 22894 /* 22895 * There is no means of changing block size in case of atapi 22896 * drives, thus return ENOTTY if drive type is atapi 22897 */ 22898 if (!ISCD(un) || (un->un_f_cfg_is_atapi == TRUE)) { 22899 err = ENOTTY; 22900 } else if (un->un_f_mmc_cap == TRUE) { 22901 22902 /* 22903 * MMC Devices do not support changing the 22904 * logical block size 22905 * 22906 * Note: EINVAL is being returned instead of ENOTTY to 22907 * maintain consistancy with the original mmc 22908 * driver update. 22909 */ 22910 err = EINVAL; 22911 } else { 22912 mutex_enter(SD_MUTEX(un)); 22913 if ((!(un->un_exclopen & (1<<SDPART(dev)))) || 22914 (un->un_ncmds_in_transport > 0)) { 22915 mutex_exit(SD_MUTEX(un)); 22916 err = EINVAL; 22917 } else { 22918 mutex_exit(SD_MUTEX(un)); 22919 err = sr_change_blkmode(dev, cmd, arg, flag); 22920 } 22921 } 22922 break; 22923 22924 case CDROMGBLKMODE: 22925 SD_TRACE(SD_LOG_IOCTL, un, "CDROMGBLKMODE\n"); 22926 if (!ISCD(un)) { 22927 err = ENOTTY; 22928 } else if ((un->un_f_cfg_is_atapi != FALSE) && 22929 (un->un_f_blockcount_is_valid != FALSE)) { 22930 /* 22931 * Drive is an ATAPI drive so return target block 22932 * size for ATAPI drives since we cannot change the 22933 * blocksize on ATAPI drives. Used primarily to detect 22934 * if an ATAPI cdrom is present. 22935 */ 22936 if (ddi_copyout(&un->un_tgt_blocksize, (void *)arg, 22937 sizeof (int), flag) != 0) { 22938 err = EFAULT; 22939 } else { 22940 err = 0; 22941 } 22942 22943 } else { 22944 /* 22945 * Drive supports changing block sizes via a Mode 22946 * Select. 22947 */ 22948 err = sr_change_blkmode(dev, cmd, arg, flag); 22949 } 22950 break; 22951 22952 case CDROMGDRVSPEED: 22953 case CDROMSDRVSPEED: 22954 SD_TRACE(SD_LOG_IOCTL, un, "CDROMXDRVSPEED\n"); 22955 if (!ISCD(un)) { 22956 err = ENOTTY; 22957 } else if (un->un_f_mmc_cap == TRUE) { 22958 /* 22959 * Note: In the future the driver implementation 22960 * for getting and 22961 * setting cd speed should entail: 22962 * 1) If non-mmc try the Toshiba mode page 22963 * (sr_change_speed) 22964 * 2) If mmc but no support for Real Time Streaming try 22965 * the SET CD SPEED (0xBB) command 22966 * (sr_atapi_change_speed) 22967 * 3) If mmc and support for Real Time Streaming 22968 * try the GET PERFORMANCE and SET STREAMING 22969 * commands (not yet implemented, 4380808) 22970 */ 22971 /* 22972 * As per recent MMC spec, CD-ROM speed is variable 22973 * and changes with LBA. Since there is no such 22974 * things as drive speed now, fail this ioctl. 22975 * 22976 * Note: EINVAL is returned for consistancy of original 22977 * implementation which included support for getting 22978 * the drive speed of mmc devices but not setting 22979 * the drive speed. Thus EINVAL would be returned 22980 * if a set request was made for an mmc device. 22981 * We no longer support get or set speed for 22982 * mmc but need to remain consistent with regard 22983 * to the error code returned. 22984 */ 22985 err = EINVAL; 22986 } else if (un->un_f_cfg_is_atapi == TRUE) { 22987 err = sr_atapi_change_speed(dev, cmd, arg, flag); 22988 } else { 22989 err = sr_change_speed(dev, cmd, arg, flag); 22990 } 22991 break; 22992 22993 case CDROMCDDA: 22994 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCDDA\n"); 22995 if (!ISCD(un)) { 22996 err = ENOTTY; 22997 } else { 22998 err = sr_read_cdda(dev, (void *)arg, flag); 22999 } 23000 break; 23001 23002 case CDROMCDXA: 23003 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCDXA\n"); 23004 if (!ISCD(un)) { 23005 err = ENOTTY; 23006 } else { 23007 err = sr_read_cdxa(dev, (caddr_t)arg, flag); 23008 } 23009 break; 23010 23011 case CDROMSUBCODE: 23012 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSUBCODE\n"); 23013 if (!ISCD(un)) { 23014 err = ENOTTY; 23015 } else { 23016 err = sr_read_all_subcodes(dev, (caddr_t)arg, flag); 23017 } 23018 break; 23019 23020 23021 #ifdef SDDEBUG 23022 /* RESET/ABORTS testing ioctls */ 23023 case DKIOCRESET: { 23024 int reset_level; 23025 23026 if (ddi_copyin((void *)arg, &reset_level, sizeof (int), flag)) { 23027 err = EFAULT; 23028 } else { 23029 SD_INFO(SD_LOG_IOCTL, un, "sdioctl: DKIOCRESET: " 23030 "reset_level = 0x%lx\n", reset_level); 23031 if (scsi_reset(SD_ADDRESS(un), reset_level)) { 23032 err = 0; 23033 } else { 23034 err = EIO; 23035 } 23036 } 23037 break; 23038 } 23039 23040 case DKIOCABORT: 23041 SD_INFO(SD_LOG_IOCTL, un, "sdioctl: DKIOCABORT:\n"); 23042 if (scsi_abort(SD_ADDRESS(un), NULL)) { 23043 err = 0; 23044 } else { 23045 err = EIO; 23046 } 23047 break; 23048 #endif 23049 23050 #ifdef SD_FAULT_INJECTION 23051 /* SDIOC FaultInjection testing ioctls */ 23052 case SDIOCSTART: 23053 case SDIOCSTOP: 23054 case SDIOCINSERTPKT: 23055 case SDIOCINSERTXB: 23056 case SDIOCINSERTUN: 23057 case SDIOCINSERTARQ: 23058 case SDIOCPUSH: 23059 case SDIOCRETRIEVE: 23060 case SDIOCRUN: 23061 SD_INFO(SD_LOG_SDTEST, un, "sdioctl:" 23062 "SDIOC detected cmd:0x%X:\n", cmd); 23063 /* call error generator */ 23064 sd_faultinjection_ioctl(cmd, arg, un); 23065 err = 0; 23066 break; 23067 23068 #endif /* SD_FAULT_INJECTION */ 23069 23070 case DKIOCFLUSHWRITECACHE: 23071 { 23072 struct dk_callback *dkc = (struct dk_callback *)arg; 23073 23074 mutex_enter(SD_MUTEX(un)); 23075 if (!un->un_f_sync_cache_supported || 23076 !un->un_f_write_cache_enabled) { 23077 err = un->un_f_sync_cache_supported ? 23078 0 : ENOTSUP; 23079 mutex_exit(SD_MUTEX(un)); 23080 if ((flag & FKIOCTL) && dkc != NULL && 23081 dkc->dkc_callback != NULL) { 23082 (*dkc->dkc_callback)(dkc->dkc_cookie, 23083 err); 23084 /* 23085 * Did callback and reported error. 23086 * Since we did a callback, ioctl 23087 * should return 0. 23088 */ 23089 err = 0; 23090 } 23091 break; 23092 } 23093 mutex_exit(SD_MUTEX(un)); 23094 23095 if ((flag & FKIOCTL) && dkc != NULL && 23096 dkc->dkc_callback != NULL) { 23097 /* async SYNC CACHE request */ 23098 err = sd_send_scsi_SYNCHRONIZE_CACHE(un, dkc); 23099 } else { 23100 /* synchronous SYNC CACHE request */ 23101 err = sd_send_scsi_SYNCHRONIZE_CACHE(un, NULL); 23102 } 23103 } 23104 break; 23105 23106 case DKIOCGETWCE: { 23107 23108 int wce; 23109 23110 if ((err = sd_get_write_cache_enabled(ssc, &wce)) != 0) { 23111 break; 23112 } 23113 23114 if (ddi_copyout(&wce, (void *)arg, sizeof (wce), flag)) { 23115 err = EFAULT; 23116 } 23117 break; 23118 } 23119 23120 case DKIOCSETWCE: { 23121 23122 int wce, sync_supported; 23123 int cur_wce = 0; 23124 23125 if (!un->un_f_cache_mode_changeable) { 23126 err = EINVAL; 23127 break; 23128 } 23129 23130 if (ddi_copyin((void *)arg, &wce, sizeof (wce), flag)) { 23131 err = EFAULT; 23132 break; 23133 } 23134 23135 /* 23136 * Synchronize multiple threads trying to enable 23137 * or disable the cache via the un_f_wcc_cv 23138 * condition variable. 23139 */ 23140 mutex_enter(SD_MUTEX(un)); 23141 23142 /* 23143 * Don't allow the cache to be enabled if the 23144 * config file has it disabled. 23145 */ 23146 if (un->un_f_opt_disable_cache && wce) { 23147 mutex_exit(SD_MUTEX(un)); 23148 err = EINVAL; 23149 break; 23150 } 23151 23152 /* 23153 * Wait for write cache change in progress 23154 * bit to be clear before proceeding. 23155 */ 23156 while (un->un_f_wcc_inprog) 23157 cv_wait(&un->un_wcc_cv, SD_MUTEX(un)); 23158 23159 un->un_f_wcc_inprog = 1; 23160 23161 mutex_exit(SD_MUTEX(un)); 23162 23163 /* 23164 * Get the current write cache state 23165 */ 23166 if ((err = sd_get_write_cache_enabled(ssc, &cur_wce)) != 0) { 23167 mutex_enter(SD_MUTEX(un)); 23168 un->un_f_wcc_inprog = 0; 23169 cv_broadcast(&un->un_wcc_cv); 23170 mutex_exit(SD_MUTEX(un)); 23171 break; 23172 } 23173 23174 mutex_enter(SD_MUTEX(un)); 23175 un->un_f_write_cache_enabled = (cur_wce != 0); 23176 23177 if (un->un_f_write_cache_enabled && wce == 0) { 23178 /* 23179 * Disable the write cache. Don't clear 23180 * un_f_write_cache_enabled until after 23181 * the mode select and flush are complete. 23182 */ 23183 sync_supported = un->un_f_sync_cache_supported; 23184 23185 /* 23186 * If cache flush is suppressed, we assume that the 23187 * controller firmware will take care of managing the 23188 * write cache for us: no need to explicitly 23189 * disable it. 23190 */ 23191 if (!un->un_f_suppress_cache_flush) { 23192 mutex_exit(SD_MUTEX(un)); 23193 if ((err = sd_cache_control(ssc, 23194 SD_CACHE_NOCHANGE, 23195 SD_CACHE_DISABLE)) == 0 && 23196 sync_supported) { 23197 err = sd_send_scsi_SYNCHRONIZE_CACHE(un, 23198 NULL); 23199 } 23200 } else { 23201 mutex_exit(SD_MUTEX(un)); 23202 } 23203 23204 mutex_enter(SD_MUTEX(un)); 23205 if (err == 0) { 23206 un->un_f_write_cache_enabled = 0; 23207 } 23208 23209 } else if (!un->un_f_write_cache_enabled && wce != 0) { 23210 /* 23211 * Set un_f_write_cache_enabled first, so there is 23212 * no window where the cache is enabled, but the 23213 * bit says it isn't. 23214 */ 23215 un->un_f_write_cache_enabled = 1; 23216 23217 /* 23218 * If cache flush is suppressed, we assume that the 23219 * controller firmware will take care of managing the 23220 * write cache for us: no need to explicitly 23221 * enable it. 23222 */ 23223 if (!un->un_f_suppress_cache_flush) { 23224 mutex_exit(SD_MUTEX(un)); 23225 err = sd_cache_control(ssc, SD_CACHE_NOCHANGE, 23226 SD_CACHE_ENABLE); 23227 } else { 23228 mutex_exit(SD_MUTEX(un)); 23229 } 23230 23231 mutex_enter(SD_MUTEX(un)); 23232 23233 if (err) { 23234 un->un_f_write_cache_enabled = 0; 23235 } 23236 } 23237 23238 un->un_f_wcc_inprog = 0; 23239 cv_broadcast(&un->un_wcc_cv); 23240 mutex_exit(SD_MUTEX(un)); 23241 break; 23242 } 23243 23244 default: 23245 err = ENOTTY; 23246 break; 23247 } 23248 mutex_enter(SD_MUTEX(un)); 23249 un->un_ncmds_in_driver--; 23250 ASSERT(un->un_ncmds_in_driver >= 0); 23251 mutex_exit(SD_MUTEX(un)); 23252 23253 23254 done_without_assess: 23255 sd_ssc_fini(ssc); 23256 23257 SD_TRACE(SD_LOG_IOCTL, un, "sdioctl: exit: %d\n", err); 23258 return (err); 23259 23260 done_with_assess: 23261 mutex_enter(SD_MUTEX(un)); 23262 un->un_ncmds_in_driver--; 23263 ASSERT(un->un_ncmds_in_driver >= 0); 23264 mutex_exit(SD_MUTEX(un)); 23265 23266 done_quick_assess: 23267 if (err != 0) 23268 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 23269 /* Uninitialize sd_ssc_t pointer */ 23270 sd_ssc_fini(ssc); 23271 23272 SD_TRACE(SD_LOG_IOCTL, un, "sdioctl: exit: %d\n", err); 23273 return (err); 23274 } 23275 23276 23277 /* 23278 * Function: sd_dkio_ctrl_info 23279 * 23280 * Description: This routine is the driver entry point for handling controller 23281 * information ioctl requests (DKIOCINFO). 23282 * 23283 * Arguments: dev - the device number 23284 * arg - pointer to user provided dk_cinfo structure 23285 * specifying the controller type and attributes. 23286 * flag - this argument is a pass through to ddi_copyxxx() 23287 * directly from the mode argument of ioctl(). 23288 * 23289 * Return Code: 0 23290 * EFAULT 23291 * ENXIO 23292 */ 23293 23294 static int 23295 sd_dkio_ctrl_info(dev_t dev, caddr_t arg, int flag) 23296 { 23297 struct sd_lun *un = NULL; 23298 struct dk_cinfo *info; 23299 dev_info_t *pdip; 23300 int lun, tgt; 23301 23302 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 23303 return (ENXIO); 23304 } 23305 23306 info = (struct dk_cinfo *) 23307 kmem_zalloc(sizeof (struct dk_cinfo), KM_SLEEP); 23308 23309 switch (un->un_ctype) { 23310 case CTYPE_CDROM: 23311 info->dki_ctype = DKC_CDROM; 23312 break; 23313 default: 23314 info->dki_ctype = DKC_SCSI_CCS; 23315 break; 23316 } 23317 pdip = ddi_get_parent(SD_DEVINFO(un)); 23318 info->dki_cnum = ddi_get_instance(pdip); 23319 if (strlen(ddi_get_name(pdip)) < DK_DEVLEN) { 23320 (void) strcpy(info->dki_cname, ddi_get_name(pdip)); 23321 } else { 23322 (void) strncpy(info->dki_cname, ddi_node_name(pdip), 23323 DK_DEVLEN - 1); 23324 } 23325 23326 lun = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un), 23327 DDI_PROP_DONTPASS, SCSI_ADDR_PROP_LUN, 0); 23328 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un), 23329 DDI_PROP_DONTPASS, SCSI_ADDR_PROP_TARGET, 0); 23330 23331 /* Unit Information */ 23332 info->dki_unit = ddi_get_instance(SD_DEVINFO(un)); 23333 info->dki_slave = ((tgt << 3) | lun); 23334 (void) strncpy(info->dki_dname, ddi_driver_name(SD_DEVINFO(un)), 23335 DK_DEVLEN - 1); 23336 info->dki_flags = DKI_FMTVOL; 23337 info->dki_partition = SDPART(dev); 23338 23339 /* Max Transfer size of this device in blocks */ 23340 info->dki_maxtransfer = un->un_max_xfer_size / un->un_sys_blocksize; 23341 info->dki_addr = 0; 23342 info->dki_space = 0; 23343 info->dki_prio = 0; 23344 info->dki_vec = 0; 23345 23346 if (ddi_copyout(info, arg, sizeof (struct dk_cinfo), flag) != 0) { 23347 kmem_free(info, sizeof (struct dk_cinfo)); 23348 return (EFAULT); 23349 } else { 23350 kmem_free(info, sizeof (struct dk_cinfo)); 23351 return (0); 23352 } 23353 } 23354 23355 /* 23356 * Function: sd_get_media_info_com 23357 * 23358 * Description: This routine returns the information required to populate 23359 * the fields for the dk_minfo/dk_minfo_ext structures. 23360 * 23361 * Arguments: dev - the device number 23362 * dki_media_type - media_type 23363 * dki_lbsize - logical block size 23364 * dki_capacity - capacity in blocks 23365 * dki_pbsize - physical block size (if requested) 23366 * 23367 * Return Code: 0 23368 * EACCESS 23369 * EFAULT 23370 * ENXIO 23371 * EIO 23372 */ 23373 static int 23374 sd_get_media_info_com(dev_t dev, uint_t *dki_media_type, uint_t *dki_lbsize, 23375 diskaddr_t *dki_capacity, uint_t *dki_pbsize) 23376 { 23377 struct sd_lun *un = NULL; 23378 struct uscsi_cmd com; 23379 struct scsi_inquiry *sinq; 23380 u_longlong_t media_capacity; 23381 uint64_t capacity; 23382 uint_t lbasize; 23383 uint_t pbsize; 23384 uchar_t *out_data; 23385 uchar_t *rqbuf; 23386 int rval = 0; 23387 int rtn; 23388 sd_ssc_t *ssc; 23389 23390 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 23391 (un->un_state == SD_STATE_OFFLINE)) { 23392 return (ENXIO); 23393 } 23394 23395 SD_TRACE(SD_LOG_IOCTL_DKIO, un, "sd_get_media_info_com: entry\n"); 23396 23397 out_data = kmem_zalloc(SD_PROFILE_HEADER_LEN, KM_SLEEP); 23398 rqbuf = kmem_zalloc(SENSE_LENGTH, KM_SLEEP); 23399 ssc = sd_ssc_init(un); 23400 23401 /* Issue a TUR to determine if the drive is ready with media present */ 23402 rval = sd_send_scsi_TEST_UNIT_READY(ssc, SD_CHECK_FOR_MEDIA); 23403 if (rval == ENXIO) { 23404 goto done; 23405 } else if (rval != 0) { 23406 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 23407 } 23408 23409 /* Now get configuration data */ 23410 if (ISCD(un)) { 23411 *dki_media_type = DK_CDROM; 23412 23413 /* Allow SCMD_GET_CONFIGURATION to MMC devices only */ 23414 if (un->un_f_mmc_cap == TRUE) { 23415 rtn = sd_send_scsi_GET_CONFIGURATION(ssc, &com, rqbuf, 23416 SENSE_LENGTH, out_data, SD_PROFILE_HEADER_LEN, 23417 SD_PATH_STANDARD); 23418 23419 if (rtn) { 23420 /* 23421 * We ignore all failures for CD and need to 23422 * put the assessment before processing code 23423 * to avoid missing assessment for FMA. 23424 */ 23425 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 23426 /* 23427 * Failed for other than an illegal request 23428 * or command not supported 23429 */ 23430 if ((com.uscsi_status == STATUS_CHECK) && 23431 (com.uscsi_rqstatus == STATUS_GOOD)) { 23432 if ((rqbuf[2] != KEY_ILLEGAL_REQUEST) || 23433 (rqbuf[12] != 0x20)) { 23434 rval = EIO; 23435 goto no_assessment; 23436 } 23437 } 23438 } else { 23439 /* 23440 * The GET CONFIGURATION command succeeded 23441 * so set the media type according to the 23442 * returned data 23443 */ 23444 *dki_media_type = out_data[6]; 23445 *dki_media_type <<= 8; 23446 *dki_media_type |= out_data[7]; 23447 } 23448 } 23449 } else { 23450 /* 23451 * The profile list is not available, so we attempt to identify 23452 * the media type based on the inquiry data 23453 */ 23454 sinq = un->un_sd->sd_inq; 23455 if ((sinq->inq_dtype == DTYPE_DIRECT) || 23456 (sinq->inq_dtype == DTYPE_OPTICAL)) { 23457 /* This is a direct access device or optical disk */ 23458 *dki_media_type = DK_FIXED_DISK; 23459 23460 if ((bcmp(sinq->inq_vid, "IOMEGA", 6) == 0) || 23461 (bcmp(sinq->inq_vid, "iomega", 6) == 0)) { 23462 if ((bcmp(sinq->inq_pid, "ZIP", 3) == 0)) { 23463 *dki_media_type = DK_ZIP; 23464 } else if ( 23465 (bcmp(sinq->inq_pid, "jaz", 3) == 0)) { 23466 *dki_media_type = DK_JAZ; 23467 } 23468 } 23469 } else { 23470 /* 23471 * Not a CD, direct access or optical disk so return 23472 * unknown media 23473 */ 23474 *dki_media_type = DK_UNKNOWN; 23475 } 23476 } 23477 23478 /* 23479 * Now read the capacity so we can provide the lbasize, 23480 * pbsize and capacity. 23481 */ 23482 if (dki_pbsize && un->un_f_descr_format_supported) { 23483 rval = sd_send_scsi_READ_CAPACITY_16(ssc, &capacity, &lbasize, 23484 &pbsize, SD_PATH_DIRECT); 23485 23486 /* 23487 * Override the physical blocksize if the instance already 23488 * has a larger value. 23489 */ 23490 pbsize = MAX(pbsize, un->un_phy_blocksize); 23491 } 23492 23493 if (dki_pbsize == NULL || rval != 0 || 23494 !un->un_f_descr_format_supported) { 23495 rval = sd_send_scsi_READ_CAPACITY(ssc, &capacity, &lbasize, 23496 SD_PATH_DIRECT); 23497 23498 switch (rval) { 23499 case 0: 23500 if (un->un_f_enable_rmw && 23501 un->un_phy_blocksize != 0) { 23502 pbsize = un->un_phy_blocksize; 23503 } else { 23504 pbsize = lbasize; 23505 } 23506 media_capacity = capacity; 23507 23508 /* 23509 * sd_send_scsi_READ_CAPACITY() reports capacity in 23510 * un->un_sys_blocksize chunks. So we need to convert 23511 * it into cap.lbsize chunks. 23512 */ 23513 if (un->un_f_has_removable_media) { 23514 media_capacity *= un->un_sys_blocksize; 23515 media_capacity /= lbasize; 23516 } 23517 break; 23518 case EACCES: 23519 rval = EACCES; 23520 goto done; 23521 default: 23522 rval = EIO; 23523 goto done; 23524 } 23525 } else { 23526 if (un->un_f_enable_rmw && 23527 !ISP2(pbsize % DEV_BSIZE)) { 23528 pbsize = SSD_SECSIZE; 23529 } else if (!ISP2(lbasize % DEV_BSIZE) || 23530 !ISP2(pbsize % DEV_BSIZE)) { 23531 pbsize = lbasize = DEV_BSIZE; 23532 } 23533 media_capacity = capacity; 23534 } 23535 23536 /* 23537 * If lun is expanded dynamically, update the un structure. 23538 */ 23539 mutex_enter(SD_MUTEX(un)); 23540 if ((un->un_f_blockcount_is_valid == TRUE) && 23541 (un->un_f_tgt_blocksize_is_valid == TRUE) && 23542 (capacity > un->un_blockcount)) { 23543 un->un_f_expnevent = B_FALSE; 23544 sd_update_block_info(un, lbasize, capacity); 23545 } 23546 mutex_exit(SD_MUTEX(un)); 23547 23548 *dki_lbsize = lbasize; 23549 *dki_capacity = media_capacity; 23550 if (dki_pbsize) 23551 *dki_pbsize = pbsize; 23552 23553 done: 23554 if (rval != 0) { 23555 if (rval == EIO) 23556 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 23557 else 23558 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 23559 } 23560 no_assessment: 23561 sd_ssc_fini(ssc); 23562 kmem_free(out_data, SD_PROFILE_HEADER_LEN); 23563 kmem_free(rqbuf, SENSE_LENGTH); 23564 return (rval); 23565 } 23566 23567 /* 23568 * Function: sd_get_media_info 23569 * 23570 * Description: This routine is the driver entry point for handling ioctl 23571 * requests for the media type or command set profile used by the 23572 * drive to operate on the media (DKIOCGMEDIAINFO). 23573 * 23574 * Arguments: dev - the device number 23575 * arg - pointer to user provided dk_minfo structure 23576 * specifying the media type, logical block size and 23577 * drive capacity. 23578 * flag - this argument is a pass through to ddi_copyxxx() 23579 * directly from the mode argument of ioctl(). 23580 * 23581 * Return Code: returns the value from sd_get_media_info_com 23582 */ 23583 static int 23584 sd_get_media_info(dev_t dev, caddr_t arg, int flag) 23585 { 23586 struct dk_minfo mi; 23587 int rval; 23588 23589 rval = sd_get_media_info_com(dev, &mi.dki_media_type, 23590 &mi.dki_lbsize, &mi.dki_capacity, NULL); 23591 23592 if (rval) 23593 return (rval); 23594 if (ddi_copyout(&mi, arg, sizeof (struct dk_minfo), flag)) 23595 rval = EFAULT; 23596 return (rval); 23597 } 23598 23599 /* 23600 * Function: sd_get_media_info_ext 23601 * 23602 * Description: This routine is the driver entry point for handling ioctl 23603 * requests for the media type or command set profile used by the 23604 * drive to operate on the media (DKIOCGMEDIAINFOEXT). The 23605 * difference this ioctl and DKIOCGMEDIAINFO is the return value 23606 * of this ioctl contains both logical block size and physical 23607 * block size. 23608 * 23609 * 23610 * Arguments: dev - the device number 23611 * arg - pointer to user provided dk_minfo_ext structure 23612 * specifying the media type, logical block size, 23613 * physical block size and disk capacity. 23614 * flag - this argument is a pass through to ddi_copyxxx() 23615 * directly from the mode argument of ioctl(). 23616 * 23617 * Return Code: returns the value from sd_get_media_info_com 23618 */ 23619 static int 23620 sd_get_media_info_ext(dev_t dev, caddr_t arg, int flag) 23621 { 23622 struct dk_minfo_ext mie; 23623 int rval = 0; 23624 23625 rval = sd_get_media_info_com(dev, &mie.dki_media_type, 23626 &mie.dki_lbsize, &mie.dki_capacity, &mie.dki_pbsize); 23627 23628 if (rval) 23629 return (rval); 23630 if (ddi_copyout(&mie, arg, sizeof (struct dk_minfo_ext), flag)) 23631 rval = EFAULT; 23632 return (rval); 23633 23634 } 23635 23636 /* 23637 * Function: sd_watch_request_submit 23638 * 23639 * Description: Call scsi_watch_request_submit or scsi_mmc_watch_request_submit 23640 * depending on which is supported by device. 23641 */ 23642 static opaque_t 23643 sd_watch_request_submit(struct sd_lun *un) 23644 { 23645 dev_t dev; 23646 23647 /* All submissions are unified to use same device number */ 23648 dev = sd_make_device(SD_DEVINFO(un)); 23649 23650 if (un->un_f_mmc_cap && un->un_f_mmc_gesn_polling) { 23651 return (scsi_mmc_watch_request_submit(SD_SCSI_DEVP(un), 23652 sd_check_media_time, SENSE_LENGTH, sd_media_watch_cb, 23653 (caddr_t)dev)); 23654 } else { 23655 return (scsi_watch_request_submit(SD_SCSI_DEVP(un), 23656 sd_check_media_time, SENSE_LENGTH, sd_media_watch_cb, 23657 (caddr_t)dev)); 23658 } 23659 } 23660 23661 23662 /* 23663 * Function: sd_check_media 23664 * 23665 * Description: This utility routine implements the functionality for the 23666 * DKIOCSTATE ioctl. This ioctl blocks the user thread until the 23667 * driver state changes from that specified by the user 23668 * (inserted or ejected). For example, if the user specifies 23669 * DKIO_EJECTED and the current media state is inserted this 23670 * routine will immediately return DKIO_INSERTED. However, if the 23671 * current media state is not inserted the user thread will be 23672 * blocked until the drive state changes. If DKIO_NONE is specified 23673 * the user thread will block until a drive state change occurs. 23674 * 23675 * Arguments: dev - the device number 23676 * state - user pointer to a dkio_state, updated with the current 23677 * drive state at return. 23678 * 23679 * Return Code: ENXIO 23680 * EIO 23681 * EAGAIN 23682 * EINTR 23683 */ 23684 23685 static int 23686 sd_check_media(dev_t dev, enum dkio_state state) 23687 { 23688 struct sd_lun *un = NULL; 23689 enum dkio_state prev_state; 23690 opaque_t token = NULL; 23691 int rval = 0; 23692 sd_ssc_t *ssc; 23693 23694 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 23695 return (ENXIO); 23696 } 23697 23698 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: entry\n"); 23699 23700 ssc = sd_ssc_init(un); 23701 23702 mutex_enter(SD_MUTEX(un)); 23703 23704 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: " 23705 "state=%x, mediastate=%x\n", state, un->un_mediastate); 23706 23707 prev_state = un->un_mediastate; 23708 23709 /* is there anything to do? */ 23710 if (state == un->un_mediastate || un->un_mediastate == DKIO_NONE) { 23711 /* 23712 * submit the request to the scsi_watch service; 23713 * scsi_media_watch_cb() does the real work 23714 */ 23715 mutex_exit(SD_MUTEX(un)); 23716 23717 /* 23718 * This change handles the case where a scsi watch request is 23719 * added to a device that is powered down. To accomplish this 23720 * we power up the device before adding the scsi watch request, 23721 * since the scsi watch sends a TUR directly to the device 23722 * which the device cannot handle if it is powered down. 23723 */ 23724 if (sd_pm_entry(un) != DDI_SUCCESS) { 23725 mutex_enter(SD_MUTEX(un)); 23726 goto done; 23727 } 23728 23729 token = sd_watch_request_submit(un); 23730 23731 sd_pm_exit(un); 23732 23733 mutex_enter(SD_MUTEX(un)); 23734 if (token == NULL) { 23735 rval = EAGAIN; 23736 goto done; 23737 } 23738 23739 /* 23740 * This is a special case IOCTL that doesn't return 23741 * until the media state changes. Routine sdpower 23742 * knows about and handles this so don't count it 23743 * as an active cmd in the driver, which would 23744 * keep the device busy to the pm framework. 23745 * If the count isn't decremented the device can't 23746 * be powered down. 23747 */ 23748 un->un_ncmds_in_driver--; 23749 ASSERT(un->un_ncmds_in_driver >= 0); 23750 23751 /* 23752 * if a prior request had been made, this will be the same 23753 * token, as scsi_watch was designed that way. 23754 */ 23755 un->un_swr_token = token; 23756 un->un_specified_mediastate = state; 23757 23758 /* 23759 * now wait for media change 23760 * we will not be signalled unless mediastate == state but it is 23761 * still better to test for this condition, since there is a 23762 * 2 sec cv_broadcast delay when mediastate == DKIO_INSERTED 23763 */ 23764 SD_TRACE(SD_LOG_COMMON, un, 23765 "sd_check_media: waiting for media state change\n"); 23766 while (un->un_mediastate == state) { 23767 if (cv_wait_sig(&un->un_state_cv, SD_MUTEX(un)) == 0) { 23768 SD_TRACE(SD_LOG_COMMON, un, 23769 "sd_check_media: waiting for media state " 23770 "was interrupted\n"); 23771 un->un_ncmds_in_driver++; 23772 rval = EINTR; 23773 goto done; 23774 } 23775 SD_TRACE(SD_LOG_COMMON, un, 23776 "sd_check_media: received signal, state=%x\n", 23777 un->un_mediastate); 23778 } 23779 /* 23780 * Inc the counter to indicate the device once again 23781 * has an active outstanding cmd. 23782 */ 23783 un->un_ncmds_in_driver++; 23784 } 23785 23786 /* invalidate geometry */ 23787 if (prev_state == DKIO_INSERTED && un->un_mediastate == DKIO_EJECTED) { 23788 sr_ejected(un); 23789 } 23790 23791 if (un->un_mediastate == DKIO_INSERTED && prev_state != DKIO_INSERTED) { 23792 uint64_t capacity; 23793 uint_t lbasize; 23794 23795 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: media inserted\n"); 23796 mutex_exit(SD_MUTEX(un)); 23797 /* 23798 * Since the following routines use SD_PATH_DIRECT, we must 23799 * call PM directly before the upcoming disk accesses. This 23800 * may cause the disk to be power/spin up. 23801 */ 23802 23803 if (sd_pm_entry(un) == DDI_SUCCESS) { 23804 rval = sd_send_scsi_READ_CAPACITY(ssc, 23805 &capacity, &lbasize, SD_PATH_DIRECT); 23806 if (rval != 0) { 23807 sd_pm_exit(un); 23808 if (rval == EIO) 23809 sd_ssc_assessment(ssc, 23810 SD_FMT_STATUS_CHECK); 23811 else 23812 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 23813 mutex_enter(SD_MUTEX(un)); 23814 goto done; 23815 } 23816 } else { 23817 rval = EIO; 23818 mutex_enter(SD_MUTEX(un)); 23819 goto done; 23820 } 23821 mutex_enter(SD_MUTEX(un)); 23822 23823 sd_update_block_info(un, lbasize, capacity); 23824 23825 /* 23826 * Check if the media in the device is writable or not 23827 */ 23828 if (ISCD(un)) { 23829 sd_check_for_writable_cd(ssc, SD_PATH_DIRECT); 23830 } 23831 23832 mutex_exit(SD_MUTEX(un)); 23833 cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT); 23834 if ((cmlb_validate(un->un_cmlbhandle, 0, 23835 (void *)SD_PATH_DIRECT) == 0) && un->un_f_pkstats_enabled) { 23836 sd_set_pstats(un); 23837 SD_TRACE(SD_LOG_IO_PARTITION, un, 23838 "sd_check_media: un:0x%p pstats created and " 23839 "set\n", un); 23840 } 23841 23842 rval = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT, 23843 SD_PATH_DIRECT); 23844 23845 sd_pm_exit(un); 23846 23847 if (rval != 0) { 23848 if (rval == EIO) 23849 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 23850 else 23851 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 23852 } 23853 23854 mutex_enter(SD_MUTEX(un)); 23855 } 23856 done: 23857 sd_ssc_fini(ssc); 23858 un->un_f_watcht_stopped = FALSE; 23859 if (token != NULL && un->un_swr_token != NULL) { 23860 /* 23861 * Use of this local token and the mutex ensures that we avoid 23862 * some race conditions associated with terminating the 23863 * scsi watch. 23864 */ 23865 token = un->un_swr_token; 23866 mutex_exit(SD_MUTEX(un)); 23867 (void) scsi_watch_request_terminate(token, 23868 SCSI_WATCH_TERMINATE_WAIT); 23869 if (scsi_watch_get_ref_count(token) == 0) { 23870 mutex_enter(SD_MUTEX(un)); 23871 un->un_swr_token = (opaque_t)NULL; 23872 } else { 23873 mutex_enter(SD_MUTEX(un)); 23874 } 23875 } 23876 23877 /* 23878 * Update the capacity kstat value, if no media previously 23879 * (capacity kstat is 0) and a media has been inserted 23880 * (un_f_blockcount_is_valid == TRUE) 23881 */ 23882 if (un->un_errstats) { 23883 struct sd_errstats *stp = NULL; 23884 23885 stp = (struct sd_errstats *)un->un_errstats->ks_data; 23886 if ((stp->sd_capacity.value.ui64 == 0) && 23887 (un->un_f_blockcount_is_valid == TRUE)) { 23888 stp->sd_capacity.value.ui64 = 23889 (uint64_t)((uint64_t)un->un_blockcount * 23890 un->un_sys_blocksize); 23891 } 23892 } 23893 mutex_exit(SD_MUTEX(un)); 23894 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: done\n"); 23895 return (rval); 23896 } 23897 23898 23899 /* 23900 * Function: sd_delayed_cv_broadcast 23901 * 23902 * Description: Delayed cv_broadcast to allow for target to recover from media 23903 * insertion. 23904 * 23905 * Arguments: arg - driver soft state (unit) structure 23906 */ 23907 23908 static void 23909 sd_delayed_cv_broadcast(void *arg) 23910 { 23911 struct sd_lun *un = arg; 23912 23913 SD_TRACE(SD_LOG_COMMON, un, "sd_delayed_cv_broadcast\n"); 23914 23915 mutex_enter(SD_MUTEX(un)); 23916 un->un_dcvb_timeid = NULL; 23917 cv_broadcast(&un->un_state_cv); 23918 mutex_exit(SD_MUTEX(un)); 23919 } 23920 23921 23922 /* 23923 * Function: sd_media_watch_cb 23924 * 23925 * Description: Callback routine used for support of the DKIOCSTATE ioctl. This 23926 * routine processes the TUR sense data and updates the driver 23927 * state if a transition has occurred. The user thread 23928 * (sd_check_media) is then signalled. 23929 * 23930 * Arguments: arg - the device 'dev_t' is used for context to discriminate 23931 * among multiple watches that share this callback function 23932 * resultp - scsi watch facility result packet containing scsi 23933 * packet, status byte and sense data 23934 * 23935 * Return Code: 0 for success, -1 for failure 23936 */ 23937 23938 static int 23939 sd_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp) 23940 { 23941 struct sd_lun *un; 23942 struct scsi_status *statusp = resultp->statusp; 23943 uint8_t *sensep = (uint8_t *)resultp->sensep; 23944 enum dkio_state state = DKIO_NONE; 23945 dev_t dev = (dev_t)arg; 23946 uchar_t actual_sense_length; 23947 uint8_t skey, asc, ascq; 23948 23949 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 23950 return (-1); 23951 } 23952 actual_sense_length = resultp->actual_sense_length; 23953 23954 mutex_enter(SD_MUTEX(un)); 23955 SD_TRACE(SD_LOG_COMMON, un, 23956 "sd_media_watch_cb: status=%x, sensep=%p, len=%x\n", 23957 *((char *)statusp), (void *)sensep, actual_sense_length); 23958 23959 if (resultp->pkt->pkt_reason == CMD_DEV_GONE) { 23960 un->un_mediastate = DKIO_DEV_GONE; 23961 cv_broadcast(&un->un_state_cv); 23962 mutex_exit(SD_MUTEX(un)); 23963 23964 return (0); 23965 } 23966 23967 if (un->un_f_mmc_cap && un->un_f_mmc_gesn_polling) { 23968 if (sd_gesn_media_data_valid(resultp->mmc_data)) { 23969 if ((resultp->mmc_data[5] & 23970 SD_GESN_MEDIA_EVENT_STATUS_PRESENT) != 0) { 23971 state = DKIO_INSERTED; 23972 } else { 23973 state = DKIO_EJECTED; 23974 } 23975 if ((resultp->mmc_data[4] & SD_GESN_MEDIA_EVENT_CODE) == 23976 SD_GESN_MEDIA_EVENT_EJECTREQUEST) { 23977 sd_log_eject_request_event(un, KM_NOSLEEP); 23978 } 23979 } 23980 } else if (sensep != NULL) { 23981 /* 23982 * If there was a check condition then sensep points to valid 23983 * sense data. If status was not a check condition but a 23984 * reservation or busy status then the new state is DKIO_NONE. 23985 */ 23986 skey = scsi_sense_key(sensep); 23987 asc = scsi_sense_asc(sensep); 23988 ascq = scsi_sense_ascq(sensep); 23989 23990 SD_INFO(SD_LOG_COMMON, un, 23991 "sd_media_watch_cb: sense KEY=%x, ASC=%x, ASCQ=%x\n", 23992 skey, asc, ascq); 23993 /* This routine only uses up to 13 bytes of sense data. */ 23994 if (actual_sense_length >= 13) { 23995 if (skey == KEY_UNIT_ATTENTION) { 23996 if (asc == 0x28) { 23997 state = DKIO_INSERTED; 23998 } 23999 } else if (skey == KEY_NOT_READY) { 24000 /* 24001 * Sense data of 02/06/00 means that the 24002 * drive could not read the media (No 24003 * reference position found). In this case 24004 * to prevent a hang on the DKIOCSTATE IOCTL 24005 * we set the media state to DKIO_INSERTED. 24006 */ 24007 if (asc == 0x06 && ascq == 0x00) 24008 state = DKIO_INSERTED; 24009 24010 /* 24011 * if 02/04/02 means that the host 24012 * should send start command. Explicitly 24013 * leave the media state as is 24014 * (inserted) as the media is inserted 24015 * and host has stopped device for PM 24016 * reasons. Upon next true read/write 24017 * to this media will bring the 24018 * device to the right state good for 24019 * media access. 24020 */ 24021 if (asc == 0x3a) { 24022 state = DKIO_EJECTED; 24023 } else { 24024 /* 24025 * If the drive is busy with an 24026 * operation or long write, keep the 24027 * media in an inserted state. 24028 */ 24029 24030 if ((asc == 0x04) && 24031 ((ascq == 0x02) || 24032 (ascq == 0x07) || 24033 (ascq == 0x08))) { 24034 state = DKIO_INSERTED; 24035 } 24036 } 24037 } else if (skey == KEY_NO_SENSE) { 24038 if ((asc == 0x00) && (ascq == 0x00)) { 24039 /* 24040 * Sense Data 00/00/00 does not provide 24041 * any information about the state of 24042 * the media. Ignore it. 24043 */ 24044 mutex_exit(SD_MUTEX(un)); 24045 return (0); 24046 } 24047 } 24048 } 24049 } else if ((*((char *)statusp) == STATUS_GOOD) && 24050 (resultp->pkt->pkt_reason == CMD_CMPLT)) { 24051 state = DKIO_INSERTED; 24052 } 24053 24054 SD_TRACE(SD_LOG_COMMON, un, 24055 "sd_media_watch_cb: state=%x, specified=%x\n", 24056 state, un->un_specified_mediastate); 24057 24058 /* 24059 * now signal the waiting thread if this is *not* the specified state; 24060 * delay the signal if the state is DKIO_INSERTED to allow the target 24061 * to recover 24062 */ 24063 if (state != un->un_specified_mediastate) { 24064 un->un_mediastate = state; 24065 if (state == DKIO_INSERTED) { 24066 /* 24067 * delay the signal to give the drive a chance 24068 * to do what it apparently needs to do 24069 */ 24070 SD_TRACE(SD_LOG_COMMON, un, 24071 "sd_media_watch_cb: delayed cv_broadcast\n"); 24072 if (un->un_dcvb_timeid == NULL) { 24073 un->un_dcvb_timeid = 24074 timeout(sd_delayed_cv_broadcast, un, 24075 drv_usectohz((clock_t)MEDIA_ACCESS_DELAY)); 24076 } 24077 } else { 24078 SD_TRACE(SD_LOG_COMMON, un, 24079 "sd_media_watch_cb: immediate cv_broadcast\n"); 24080 cv_broadcast(&un->un_state_cv); 24081 } 24082 } 24083 mutex_exit(SD_MUTEX(un)); 24084 return (0); 24085 } 24086 24087 24088 /* 24089 * Function: sd_dkio_get_temp 24090 * 24091 * Description: This routine is the driver entry point for handling ioctl 24092 * requests to get the disk temperature. 24093 * 24094 * Arguments: dev - the device number 24095 * arg - pointer to user provided dk_temperature structure. 24096 * flag - this argument is a pass through to ddi_copyxxx() 24097 * directly from the mode argument of ioctl(). 24098 * 24099 * Return Code: 0 24100 * EFAULT 24101 * ENXIO 24102 * EAGAIN 24103 */ 24104 24105 static int 24106 sd_dkio_get_temp(dev_t dev, caddr_t arg, int flag) 24107 { 24108 struct sd_lun *un = NULL; 24109 struct dk_temperature *dktemp = NULL; 24110 uchar_t *temperature_page; 24111 int rval = 0; 24112 int path_flag = SD_PATH_STANDARD; 24113 sd_ssc_t *ssc; 24114 24115 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24116 return (ENXIO); 24117 } 24118 24119 ssc = sd_ssc_init(un); 24120 dktemp = kmem_zalloc(sizeof (struct dk_temperature), KM_SLEEP); 24121 24122 /* copyin the disk temp argument to get the user flags */ 24123 if (ddi_copyin((void *)arg, dktemp, 24124 sizeof (struct dk_temperature), flag) != 0) { 24125 rval = EFAULT; 24126 goto done; 24127 } 24128 24129 /* Initialize the temperature to invalid. */ 24130 dktemp->dkt_cur_temp = (short)DKT_INVALID_TEMP; 24131 dktemp->dkt_ref_temp = (short)DKT_INVALID_TEMP; 24132 24133 /* 24134 * Note: Investigate removing the "bypass pm" semantic. 24135 * Can we just bypass PM always? 24136 */ 24137 if (dktemp->dkt_flags & DKT_BYPASS_PM) { 24138 path_flag = SD_PATH_DIRECT; 24139 ASSERT(!mutex_owned(&un->un_pm_mutex)); 24140 mutex_enter(&un->un_pm_mutex); 24141 if (SD_DEVICE_IS_IN_LOW_POWER(un)) { 24142 /* 24143 * If DKT_BYPASS_PM is set, and the drive happens to be 24144 * in low power mode, we can not wake it up, Need to 24145 * return EAGAIN. 24146 */ 24147 mutex_exit(&un->un_pm_mutex); 24148 rval = EAGAIN; 24149 goto done; 24150 } else { 24151 /* 24152 * Indicate to PM the device is busy. This is required 24153 * to avoid a race - i.e. the ioctl is issuing a 24154 * command and the pm framework brings down the device 24155 * to low power mode (possible power cut-off on some 24156 * platforms). 24157 */ 24158 mutex_exit(&un->un_pm_mutex); 24159 if (sd_pm_entry(un) != DDI_SUCCESS) { 24160 rval = EAGAIN; 24161 goto done; 24162 } 24163 } 24164 } 24165 24166 temperature_page = kmem_zalloc(TEMPERATURE_PAGE_SIZE, KM_SLEEP); 24167 24168 rval = sd_send_scsi_LOG_SENSE(ssc, temperature_page, 24169 TEMPERATURE_PAGE_SIZE, TEMPERATURE_PAGE, 1, 0, path_flag); 24170 if (rval != 0) 24171 goto done2; 24172 24173 /* 24174 * For the current temperature verify that the parameter length is 0x02 24175 * and the parameter code is 0x00 24176 */ 24177 if ((temperature_page[7] == 0x02) && (temperature_page[4] == 0x00) && 24178 (temperature_page[5] == 0x00)) { 24179 if (temperature_page[9] == 0xFF) { 24180 dktemp->dkt_cur_temp = (short)DKT_INVALID_TEMP; 24181 } else { 24182 dktemp->dkt_cur_temp = (short)(temperature_page[9]); 24183 } 24184 } 24185 24186 /* 24187 * For the reference temperature verify that the parameter 24188 * length is 0x02 and the parameter code is 0x01 24189 */ 24190 if ((temperature_page[13] == 0x02) && (temperature_page[10] == 0x00) && 24191 (temperature_page[11] == 0x01)) { 24192 if (temperature_page[15] == 0xFF) { 24193 dktemp->dkt_ref_temp = (short)DKT_INVALID_TEMP; 24194 } else { 24195 dktemp->dkt_ref_temp = (short)(temperature_page[15]); 24196 } 24197 } 24198 24199 /* Do the copyout regardless of the temperature commands status. */ 24200 if (ddi_copyout(dktemp, (void *)arg, sizeof (struct dk_temperature), 24201 flag) != 0) { 24202 rval = EFAULT; 24203 goto done1; 24204 } 24205 24206 done2: 24207 if (rval != 0) { 24208 if (rval == EIO) 24209 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 24210 else 24211 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 24212 } 24213 done1: 24214 if (path_flag == SD_PATH_DIRECT) { 24215 sd_pm_exit(un); 24216 } 24217 24218 kmem_free(temperature_page, TEMPERATURE_PAGE_SIZE); 24219 done: 24220 sd_ssc_fini(ssc); 24221 if (dktemp != NULL) { 24222 kmem_free(dktemp, sizeof (struct dk_temperature)); 24223 } 24224 24225 return (rval); 24226 } 24227 24228 24229 /* 24230 * Function: sd_log_page_supported 24231 * 24232 * Description: This routine uses sd_send_scsi_LOG_SENSE to find the list of 24233 * supported log pages. 24234 * 24235 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 24236 * structure for this target. 24237 * log_page - 24238 * 24239 * Return Code: -1 - on error (log sense is optional and may not be supported). 24240 * 0 - log page not found. 24241 * 1 - log page found. 24242 */ 24243 24244 static int 24245 sd_log_page_supported(sd_ssc_t *ssc, int log_page) 24246 { 24247 uchar_t *log_page_data; 24248 int i; 24249 int match = 0; 24250 int log_size; 24251 int status = 0; 24252 struct sd_lun *un; 24253 24254 ASSERT(ssc != NULL); 24255 un = ssc->ssc_un; 24256 ASSERT(un != NULL); 24257 24258 log_page_data = kmem_zalloc(0xFF, KM_SLEEP); 24259 24260 status = sd_send_scsi_LOG_SENSE(ssc, log_page_data, 0xFF, 0, 0x01, 0, 24261 SD_PATH_DIRECT); 24262 24263 if (status != 0) { 24264 if (status == EIO) { 24265 /* 24266 * Some disks do not support log sense, we 24267 * should ignore this kind of error(sense key is 24268 * 0x5 - illegal request). 24269 */ 24270 uint8_t *sensep; 24271 int senlen; 24272 24273 sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf; 24274 senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen - 24275 ssc->ssc_uscsi_cmd->uscsi_rqresid); 24276 24277 if (senlen > 0 && 24278 scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) { 24279 sd_ssc_assessment(ssc, 24280 SD_FMT_IGNORE_COMPROMISE); 24281 } else { 24282 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 24283 } 24284 } else { 24285 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 24286 } 24287 24288 SD_ERROR(SD_LOG_COMMON, un, 24289 "sd_log_page_supported: failed log page retrieval\n"); 24290 kmem_free(log_page_data, 0xFF); 24291 return (-1); 24292 } 24293 24294 log_size = log_page_data[3]; 24295 24296 /* 24297 * The list of supported log pages start from the fourth byte. Check 24298 * until we run out of log pages or a match is found. 24299 */ 24300 for (i = 4; (i < (log_size + 4)) && !match; i++) { 24301 if (log_page_data[i] == log_page) { 24302 match++; 24303 } 24304 } 24305 kmem_free(log_page_data, 0xFF); 24306 return (match); 24307 } 24308 24309 24310 /* 24311 * Function: sd_mhdioc_failfast 24312 * 24313 * Description: This routine is the driver entry point for handling ioctl 24314 * requests to enable/disable the multihost failfast option. 24315 * (MHIOCENFAILFAST) 24316 * 24317 * Arguments: dev - the device number 24318 * arg - user specified probing interval. 24319 * flag - this argument is a pass through to ddi_copyxxx() 24320 * directly from the mode argument of ioctl(). 24321 * 24322 * Return Code: 0 24323 * EFAULT 24324 * ENXIO 24325 */ 24326 24327 static int 24328 sd_mhdioc_failfast(dev_t dev, caddr_t arg, int flag) 24329 { 24330 struct sd_lun *un = NULL; 24331 int mh_time; 24332 int rval = 0; 24333 24334 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24335 return (ENXIO); 24336 } 24337 24338 if (ddi_copyin((void *)arg, &mh_time, sizeof (int), flag)) 24339 return (EFAULT); 24340 24341 if (mh_time) { 24342 mutex_enter(SD_MUTEX(un)); 24343 un->un_resvd_status |= SD_FAILFAST; 24344 mutex_exit(SD_MUTEX(un)); 24345 /* 24346 * If mh_time is INT_MAX, then this ioctl is being used for 24347 * SCSI-3 PGR purposes, and we don't need to spawn watch thread. 24348 */ 24349 if (mh_time != INT_MAX) { 24350 rval = sd_check_mhd(dev, mh_time); 24351 } 24352 } else { 24353 (void) sd_check_mhd(dev, 0); 24354 mutex_enter(SD_MUTEX(un)); 24355 un->un_resvd_status &= ~SD_FAILFAST; 24356 mutex_exit(SD_MUTEX(un)); 24357 } 24358 return (rval); 24359 } 24360 24361 24362 /* 24363 * Function: sd_mhdioc_takeown 24364 * 24365 * Description: This routine is the driver entry point for handling ioctl 24366 * requests to forcefully acquire exclusive access rights to the 24367 * multihost disk (MHIOCTKOWN). 24368 * 24369 * Arguments: dev - the device number 24370 * arg - user provided structure specifying the delay 24371 * parameters in milliseconds 24372 * flag - this argument is a pass through to ddi_copyxxx() 24373 * directly from the mode argument of ioctl(). 24374 * 24375 * Return Code: 0 24376 * EFAULT 24377 * ENXIO 24378 */ 24379 24380 static int 24381 sd_mhdioc_takeown(dev_t dev, caddr_t arg, int flag) 24382 { 24383 struct sd_lun *un = NULL; 24384 struct mhioctkown *tkown = NULL; 24385 int rval = 0; 24386 24387 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24388 return (ENXIO); 24389 } 24390 24391 if (arg != NULL) { 24392 tkown = (struct mhioctkown *) 24393 kmem_zalloc(sizeof (struct mhioctkown), KM_SLEEP); 24394 rval = ddi_copyin(arg, tkown, sizeof (struct mhioctkown), flag); 24395 if (rval != 0) { 24396 rval = EFAULT; 24397 goto error; 24398 } 24399 } 24400 24401 rval = sd_take_ownership(dev, tkown); 24402 mutex_enter(SD_MUTEX(un)); 24403 if (rval == 0) { 24404 un->un_resvd_status |= SD_RESERVE; 24405 if (tkown != NULL && tkown->reinstate_resv_delay != 0) { 24406 sd_reinstate_resv_delay = 24407 tkown->reinstate_resv_delay * 1000; 24408 } else { 24409 sd_reinstate_resv_delay = SD_REINSTATE_RESV_DELAY; 24410 } 24411 /* 24412 * Give the scsi_watch routine interval set by 24413 * the MHIOCENFAILFAST ioctl precedence here. 24414 */ 24415 if ((un->un_resvd_status & SD_FAILFAST) == 0) { 24416 mutex_exit(SD_MUTEX(un)); 24417 (void) sd_check_mhd(dev, sd_reinstate_resv_delay/1000); 24418 SD_TRACE(SD_LOG_IOCTL_MHD, un, 24419 "sd_mhdioc_takeown : %d\n", 24420 sd_reinstate_resv_delay); 24421 } else { 24422 mutex_exit(SD_MUTEX(un)); 24423 } 24424 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_NOTIFY, 24425 sd_mhd_reset_notify_cb, (caddr_t)un); 24426 } else { 24427 un->un_resvd_status &= ~SD_RESERVE; 24428 mutex_exit(SD_MUTEX(un)); 24429 } 24430 24431 error: 24432 if (tkown != NULL) { 24433 kmem_free(tkown, sizeof (struct mhioctkown)); 24434 } 24435 return (rval); 24436 } 24437 24438 24439 /* 24440 * Function: sd_mhdioc_release 24441 * 24442 * Description: This routine is the driver entry point for handling ioctl 24443 * requests to release exclusive access rights to the multihost 24444 * disk (MHIOCRELEASE). 24445 * 24446 * Arguments: dev - the device number 24447 * 24448 * Return Code: 0 24449 * ENXIO 24450 */ 24451 24452 static int 24453 sd_mhdioc_release(dev_t dev) 24454 { 24455 struct sd_lun *un = NULL; 24456 timeout_id_t resvd_timeid_save; 24457 int resvd_status_save; 24458 int rval = 0; 24459 24460 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24461 return (ENXIO); 24462 } 24463 24464 mutex_enter(SD_MUTEX(un)); 24465 resvd_status_save = un->un_resvd_status; 24466 un->un_resvd_status &= 24467 ~(SD_RESERVE | SD_LOST_RESERVE | SD_WANT_RESERVE); 24468 if (un->un_resvd_timeid) { 24469 resvd_timeid_save = un->un_resvd_timeid; 24470 un->un_resvd_timeid = NULL; 24471 mutex_exit(SD_MUTEX(un)); 24472 (void) untimeout(resvd_timeid_save); 24473 } else { 24474 mutex_exit(SD_MUTEX(un)); 24475 } 24476 24477 /* 24478 * destroy any pending timeout thread that may be attempting to 24479 * reinstate reservation on this device. 24480 */ 24481 sd_rmv_resv_reclaim_req(dev); 24482 24483 if ((rval = sd_reserve_release(dev, SD_RELEASE)) == 0) { 24484 mutex_enter(SD_MUTEX(un)); 24485 if ((un->un_mhd_token) && 24486 ((un->un_resvd_status & SD_FAILFAST) == 0)) { 24487 mutex_exit(SD_MUTEX(un)); 24488 (void) sd_check_mhd(dev, 0); 24489 } else { 24490 mutex_exit(SD_MUTEX(un)); 24491 } 24492 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_CANCEL, 24493 sd_mhd_reset_notify_cb, (caddr_t)un); 24494 } else { 24495 /* 24496 * sd_mhd_watch_cb will restart the resvd recover timeout thread 24497 */ 24498 mutex_enter(SD_MUTEX(un)); 24499 un->un_resvd_status = resvd_status_save; 24500 mutex_exit(SD_MUTEX(un)); 24501 } 24502 return (rval); 24503 } 24504 24505 24506 /* 24507 * Function: sd_mhdioc_register_devid 24508 * 24509 * Description: This routine is the driver entry point for handling ioctl 24510 * requests to register the device id (MHIOCREREGISTERDEVID). 24511 * 24512 * Note: The implementation for this ioctl has been updated to 24513 * be consistent with the original PSARC case (1999/357) 24514 * (4375899, 4241671, 4220005) 24515 * 24516 * Arguments: dev - the device number 24517 * 24518 * Return Code: 0 24519 * ENXIO 24520 */ 24521 24522 static int 24523 sd_mhdioc_register_devid(dev_t dev) 24524 { 24525 struct sd_lun *un = NULL; 24526 int rval = 0; 24527 sd_ssc_t *ssc; 24528 24529 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24530 return (ENXIO); 24531 } 24532 24533 ASSERT(!mutex_owned(SD_MUTEX(un))); 24534 24535 mutex_enter(SD_MUTEX(un)); 24536 24537 /* If a devid already exists, de-register it */ 24538 if (un->un_devid != NULL) { 24539 ddi_devid_unregister(SD_DEVINFO(un)); 24540 /* 24541 * After unregister devid, needs to free devid memory 24542 */ 24543 ddi_devid_free(un->un_devid); 24544 un->un_devid = NULL; 24545 } 24546 24547 /* Check for reservation conflict */ 24548 mutex_exit(SD_MUTEX(un)); 24549 ssc = sd_ssc_init(un); 24550 rval = sd_send_scsi_TEST_UNIT_READY(ssc, 0); 24551 mutex_enter(SD_MUTEX(un)); 24552 24553 switch (rval) { 24554 case 0: 24555 sd_register_devid(ssc, SD_DEVINFO(un), SD_TARGET_IS_UNRESERVED); 24556 break; 24557 case EACCES: 24558 break; 24559 default: 24560 rval = EIO; 24561 } 24562 24563 mutex_exit(SD_MUTEX(un)); 24564 if (rval != 0) { 24565 if (rval == EIO) 24566 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 24567 else 24568 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 24569 } 24570 sd_ssc_fini(ssc); 24571 return (rval); 24572 } 24573 24574 24575 /* 24576 * Function: sd_mhdioc_inkeys 24577 * 24578 * Description: This routine is the driver entry point for handling ioctl 24579 * requests to issue the SCSI-3 Persistent In Read Keys command 24580 * to the device (MHIOCGRP_INKEYS). 24581 * 24582 * Arguments: dev - the device number 24583 * arg - user provided in_keys structure 24584 * flag - this argument is a pass through to ddi_copyxxx() 24585 * directly from the mode argument of ioctl(). 24586 * 24587 * Return Code: code returned by sd_persistent_reservation_in_read_keys() 24588 * ENXIO 24589 * EFAULT 24590 */ 24591 24592 static int 24593 sd_mhdioc_inkeys(dev_t dev, caddr_t arg, int flag) 24594 { 24595 struct sd_lun *un; 24596 mhioc_inkeys_t inkeys; 24597 int rval = 0; 24598 24599 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24600 return (ENXIO); 24601 } 24602 24603 #ifdef _MULTI_DATAMODEL 24604 switch (ddi_model_convert_from(flag & FMODELS)) { 24605 case DDI_MODEL_ILP32: { 24606 struct mhioc_inkeys32 inkeys32; 24607 24608 if (ddi_copyin(arg, &inkeys32, 24609 sizeof (struct mhioc_inkeys32), flag) != 0) { 24610 return (EFAULT); 24611 } 24612 inkeys.li = (mhioc_key_list_t *)(uintptr_t)inkeys32.li; 24613 if ((rval = sd_persistent_reservation_in_read_keys(un, 24614 &inkeys, flag)) != 0) { 24615 return (rval); 24616 } 24617 inkeys32.generation = inkeys.generation; 24618 if (ddi_copyout(&inkeys32, arg, sizeof (struct mhioc_inkeys32), 24619 flag) != 0) { 24620 return (EFAULT); 24621 } 24622 break; 24623 } 24624 case DDI_MODEL_NONE: 24625 if (ddi_copyin(arg, &inkeys, sizeof (mhioc_inkeys_t), 24626 flag) != 0) { 24627 return (EFAULT); 24628 } 24629 if ((rval = sd_persistent_reservation_in_read_keys(un, 24630 &inkeys, flag)) != 0) { 24631 return (rval); 24632 } 24633 if (ddi_copyout(&inkeys, arg, sizeof (mhioc_inkeys_t), 24634 flag) != 0) { 24635 return (EFAULT); 24636 } 24637 break; 24638 } 24639 24640 #else /* ! _MULTI_DATAMODEL */ 24641 24642 if (ddi_copyin(arg, &inkeys, sizeof (mhioc_inkeys_t), flag) != 0) { 24643 return (EFAULT); 24644 } 24645 rval = sd_persistent_reservation_in_read_keys(un, &inkeys, flag); 24646 if (rval != 0) { 24647 return (rval); 24648 } 24649 if (ddi_copyout(&inkeys, arg, sizeof (mhioc_inkeys_t), flag) != 0) { 24650 return (EFAULT); 24651 } 24652 24653 #endif /* _MULTI_DATAMODEL */ 24654 24655 return (rval); 24656 } 24657 24658 24659 /* 24660 * Function: sd_mhdioc_inresv 24661 * 24662 * Description: This routine is the driver entry point for handling ioctl 24663 * requests to issue the SCSI-3 Persistent In Read Reservations 24664 * command to the device (MHIOCGRP_INKEYS). 24665 * 24666 * Arguments: dev - the device number 24667 * arg - user provided in_resv structure 24668 * flag - this argument is a pass through to ddi_copyxxx() 24669 * directly from the mode argument of ioctl(). 24670 * 24671 * Return Code: code returned by sd_persistent_reservation_in_read_resv() 24672 * ENXIO 24673 * EFAULT 24674 */ 24675 24676 static int 24677 sd_mhdioc_inresv(dev_t dev, caddr_t arg, int flag) 24678 { 24679 struct sd_lun *un; 24680 mhioc_inresvs_t inresvs; 24681 int rval = 0; 24682 24683 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24684 return (ENXIO); 24685 } 24686 24687 #ifdef _MULTI_DATAMODEL 24688 24689 switch (ddi_model_convert_from(flag & FMODELS)) { 24690 case DDI_MODEL_ILP32: { 24691 struct mhioc_inresvs32 inresvs32; 24692 24693 if (ddi_copyin(arg, &inresvs32, 24694 sizeof (struct mhioc_inresvs32), flag) != 0) { 24695 return (EFAULT); 24696 } 24697 inresvs.li = (mhioc_resv_desc_list_t *)(uintptr_t)inresvs32.li; 24698 if ((rval = sd_persistent_reservation_in_read_resv(un, 24699 &inresvs, flag)) != 0) { 24700 return (rval); 24701 } 24702 inresvs32.generation = inresvs.generation; 24703 if (ddi_copyout(&inresvs32, arg, 24704 sizeof (struct mhioc_inresvs32), flag) != 0) { 24705 return (EFAULT); 24706 } 24707 break; 24708 } 24709 case DDI_MODEL_NONE: 24710 if (ddi_copyin(arg, &inresvs, 24711 sizeof (mhioc_inresvs_t), flag) != 0) { 24712 return (EFAULT); 24713 } 24714 if ((rval = sd_persistent_reservation_in_read_resv(un, 24715 &inresvs, flag)) != 0) { 24716 return (rval); 24717 } 24718 if (ddi_copyout(&inresvs, arg, 24719 sizeof (mhioc_inresvs_t), flag) != 0) { 24720 return (EFAULT); 24721 } 24722 break; 24723 } 24724 24725 #else /* ! _MULTI_DATAMODEL */ 24726 24727 if (ddi_copyin(arg, &inresvs, sizeof (mhioc_inresvs_t), flag) != 0) { 24728 return (EFAULT); 24729 } 24730 rval = sd_persistent_reservation_in_read_resv(un, &inresvs, flag); 24731 if (rval != 0) { 24732 return (rval); 24733 } 24734 if (ddi_copyout(&inresvs, arg, sizeof (mhioc_inresvs_t), flag)) { 24735 return (EFAULT); 24736 } 24737 24738 #endif /* ! _MULTI_DATAMODEL */ 24739 24740 return (rval); 24741 } 24742 24743 24744 /* 24745 * The following routines support the clustering functionality described below 24746 * and implement lost reservation reclaim functionality. 24747 * 24748 * Clustering 24749 * ---------- 24750 * The clustering code uses two different, independent forms of SCSI 24751 * reservation. Traditional SCSI-2 Reserve/Release and the newer SCSI-3 24752 * Persistent Group Reservations. For any particular disk, it will use either 24753 * SCSI-2 or SCSI-3 PGR but never both at the same time for the same disk. 24754 * 24755 * SCSI-2 24756 * The cluster software takes ownership of a multi-hosted disk by issuing the 24757 * MHIOCTKOWN ioctl to the disk driver. It releases ownership by issuing the 24758 * MHIOCRELEASE ioctl. Closely related is the MHIOCENFAILFAST ioctl -- a 24759 * cluster, just after taking ownership of the disk with the MHIOCTKOWN ioctl 24760 * then issues the MHIOCENFAILFAST ioctl. This ioctl "enables failfast" in the 24761 * driver. The meaning of failfast is that if the driver (on this host) ever 24762 * encounters the scsi error return code RESERVATION_CONFLICT from the device, 24763 * it should immediately panic the host. The motivation for this ioctl is that 24764 * if this host does encounter reservation conflict, the underlying cause is 24765 * that some other host of the cluster has decided that this host is no longer 24766 * in the cluster and has seized control of the disks for itself. Since this 24767 * host is no longer in the cluster, it ought to panic itself. The 24768 * MHIOCENFAILFAST ioctl does two things: 24769 * (a) it sets a flag that will cause any returned RESERVATION_CONFLICT 24770 * error to panic the host 24771 * (b) it sets up a periodic timer to test whether this host still has 24772 * "access" (in that no other host has reserved the device): if the 24773 * periodic timer gets RESERVATION_CONFLICT, the host is panicked. The 24774 * purpose of that periodic timer is to handle scenarios where the host is 24775 * otherwise temporarily quiescent, temporarily doing no real i/o. 24776 * The MHIOCTKOWN ioctl will "break" a reservation that is held by another host, 24777 * by issuing a SCSI Bus Device Reset. It will then issue a SCSI Reserve for 24778 * the device itself. 24779 * 24780 * SCSI-3 PGR 24781 * A direct semantic implementation of the SCSI-3 Persistent Reservation 24782 * facility is supported through the shared multihost disk ioctls 24783 * (MHIOCGRP_INKEYS, MHIOCGRP_INRESV, MHIOCGRP_REGISTER, MHIOCGRP_RESERVE, 24784 * MHIOCGRP_PREEMPTANDABORT, MHIOCGRP_CLEAR) 24785 * 24786 * Reservation Reclaim: 24787 * -------------------- 24788 * To support the lost reservation reclaim operations this driver creates a 24789 * single thread to handle reinstating reservations on all devices that have 24790 * lost reservations sd_resv_reclaim_requests are logged for all devices that 24791 * have LOST RESERVATIONS when the scsi watch facility callsback sd_mhd_watch_cb 24792 * and the reservation reclaim thread loops through the requests to regain the 24793 * lost reservations. 24794 */ 24795 24796 /* 24797 * Function: sd_check_mhd() 24798 * 24799 * Description: This function sets up and submits a scsi watch request or 24800 * terminates an existing watch request. This routine is used in 24801 * support of reservation reclaim. 24802 * 24803 * Arguments: dev - the device 'dev_t' is used for context to discriminate 24804 * among multiple watches that share the callback function 24805 * interval - the number of microseconds specifying the watch 24806 * interval for issuing TEST UNIT READY commands. If 24807 * set to 0 the watch should be terminated. If the 24808 * interval is set to 0 and if the device is required 24809 * to hold reservation while disabling failfast, the 24810 * watch is restarted with an interval of 24811 * reinstate_resv_delay. 24812 * 24813 * Return Code: 0 - Successful submit/terminate of scsi watch request 24814 * ENXIO - Indicates an invalid device was specified 24815 * EAGAIN - Unable to submit the scsi watch request 24816 */ 24817 24818 static int 24819 sd_check_mhd(dev_t dev, int interval) 24820 { 24821 struct sd_lun *un; 24822 opaque_t token; 24823 24824 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24825 return (ENXIO); 24826 } 24827 24828 /* is this a watch termination request? */ 24829 if (interval == 0) { 24830 mutex_enter(SD_MUTEX(un)); 24831 /* if there is an existing watch task then terminate it */ 24832 if (un->un_mhd_token) { 24833 token = un->un_mhd_token; 24834 un->un_mhd_token = NULL; 24835 mutex_exit(SD_MUTEX(un)); 24836 (void) scsi_watch_request_terminate(token, 24837 SCSI_WATCH_TERMINATE_ALL_WAIT); 24838 mutex_enter(SD_MUTEX(un)); 24839 } else { 24840 mutex_exit(SD_MUTEX(un)); 24841 /* 24842 * Note: If we return here we don't check for the 24843 * failfast case. This is the original legacy 24844 * implementation but perhaps we should be checking 24845 * the failfast case. 24846 */ 24847 return (0); 24848 } 24849 /* 24850 * If the device is required to hold reservation while 24851 * disabling failfast, we need to restart the scsi_watch 24852 * routine with an interval of reinstate_resv_delay. 24853 */ 24854 if (un->un_resvd_status & SD_RESERVE) { 24855 interval = sd_reinstate_resv_delay/1000; 24856 } else { 24857 /* no failfast so bail */ 24858 mutex_exit(SD_MUTEX(un)); 24859 return (0); 24860 } 24861 mutex_exit(SD_MUTEX(un)); 24862 } 24863 24864 /* 24865 * adjust minimum time interval to 1 second, 24866 * and convert from msecs to usecs 24867 */ 24868 if (interval > 0 && interval < 1000) { 24869 interval = 1000; 24870 } 24871 interval *= 1000; 24872 24873 /* 24874 * submit the request to the scsi_watch service 24875 */ 24876 token = scsi_watch_request_submit(SD_SCSI_DEVP(un), interval, 24877 SENSE_LENGTH, sd_mhd_watch_cb, (caddr_t)dev); 24878 if (token == NULL) { 24879 return (EAGAIN); 24880 } 24881 24882 /* 24883 * save token for termination later on 24884 */ 24885 mutex_enter(SD_MUTEX(un)); 24886 un->un_mhd_token = token; 24887 mutex_exit(SD_MUTEX(un)); 24888 return (0); 24889 } 24890 24891 24892 /* 24893 * Function: sd_mhd_watch_cb() 24894 * 24895 * Description: This function is the call back function used by the scsi watch 24896 * facility. The scsi watch facility sends the "Test Unit Ready" 24897 * and processes the status. If applicable (i.e. a "Unit Attention" 24898 * status and automatic "Request Sense" not used) the scsi watch 24899 * facility will send a "Request Sense" and retrieve the sense data 24900 * to be passed to this callback function. In either case the 24901 * automatic "Request Sense" or the facility submitting one, this 24902 * callback is passed the status and sense data. 24903 * 24904 * Arguments: arg - the device 'dev_t' is used for context to discriminate 24905 * among multiple watches that share this callback function 24906 * resultp - scsi watch facility result packet containing scsi 24907 * packet, status byte and sense data 24908 * 24909 * Return Code: 0 - continue the watch task 24910 * non-zero - terminate the watch task 24911 */ 24912 24913 static int 24914 sd_mhd_watch_cb(caddr_t arg, struct scsi_watch_result *resultp) 24915 { 24916 struct sd_lun *un; 24917 struct scsi_status *statusp; 24918 uint8_t *sensep; 24919 struct scsi_pkt *pkt; 24920 uchar_t actual_sense_length; 24921 dev_t dev = (dev_t)arg; 24922 24923 ASSERT(resultp != NULL); 24924 statusp = resultp->statusp; 24925 sensep = (uint8_t *)resultp->sensep; 24926 pkt = resultp->pkt; 24927 actual_sense_length = resultp->actual_sense_length; 24928 24929 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24930 return (ENXIO); 24931 } 24932 24933 SD_TRACE(SD_LOG_IOCTL_MHD, un, 24934 "sd_mhd_watch_cb: reason '%s', status '%s'\n", 24935 scsi_rname(pkt->pkt_reason), sd_sname(*((unsigned char *)statusp))); 24936 24937 /* Begin processing of the status and/or sense data */ 24938 if (pkt->pkt_reason != CMD_CMPLT) { 24939 /* Handle the incomplete packet */ 24940 sd_mhd_watch_incomplete(un, pkt); 24941 return (0); 24942 } else if (*((unsigned char *)statusp) != STATUS_GOOD) { 24943 if (*((unsigned char *)statusp) 24944 == STATUS_RESERVATION_CONFLICT) { 24945 /* 24946 * Handle a reservation conflict by panicking if 24947 * configured for failfast or by logging the conflict 24948 * and updating the reservation status 24949 */ 24950 mutex_enter(SD_MUTEX(un)); 24951 if ((un->un_resvd_status & SD_FAILFAST) && 24952 (sd_failfast_enable)) { 24953 sd_panic_for_res_conflict(un); 24954 /*NOTREACHED*/ 24955 } 24956 SD_INFO(SD_LOG_IOCTL_MHD, un, 24957 "sd_mhd_watch_cb: Reservation Conflict\n"); 24958 un->un_resvd_status |= SD_RESERVATION_CONFLICT; 24959 mutex_exit(SD_MUTEX(un)); 24960 } 24961 } 24962 24963 if (sensep != NULL) { 24964 if (actual_sense_length >= (SENSE_LENGTH - 2)) { 24965 mutex_enter(SD_MUTEX(un)); 24966 if ((scsi_sense_asc(sensep) == 24967 SD_SCSI_RESET_SENSE_CODE) && 24968 (un->un_resvd_status & SD_RESERVE)) { 24969 /* 24970 * The additional sense code indicates a power 24971 * on or bus device reset has occurred; update 24972 * the reservation status. 24973 */ 24974 un->un_resvd_status |= 24975 (SD_LOST_RESERVE | SD_WANT_RESERVE); 24976 SD_INFO(SD_LOG_IOCTL_MHD, un, 24977 "sd_mhd_watch_cb: Lost Reservation\n"); 24978 } 24979 } else { 24980 return (0); 24981 } 24982 } else { 24983 mutex_enter(SD_MUTEX(un)); 24984 } 24985 24986 if ((un->un_resvd_status & SD_RESERVE) && 24987 (un->un_resvd_status & SD_LOST_RESERVE)) { 24988 if (un->un_resvd_status & SD_WANT_RESERVE) { 24989 /* 24990 * A reset occurred in between the last probe and this 24991 * one so if a timeout is pending cancel it. 24992 */ 24993 if (un->un_resvd_timeid) { 24994 timeout_id_t temp_id = un->un_resvd_timeid; 24995 un->un_resvd_timeid = NULL; 24996 mutex_exit(SD_MUTEX(un)); 24997 (void) untimeout(temp_id); 24998 mutex_enter(SD_MUTEX(un)); 24999 } 25000 un->un_resvd_status &= ~SD_WANT_RESERVE; 25001 } 25002 if (un->un_resvd_timeid == 0) { 25003 /* Schedule a timeout to handle the lost reservation */ 25004 un->un_resvd_timeid = timeout(sd_mhd_resvd_recover, 25005 (void *)dev, 25006 drv_usectohz(sd_reinstate_resv_delay)); 25007 } 25008 } 25009 mutex_exit(SD_MUTEX(un)); 25010 return (0); 25011 } 25012 25013 25014 /* 25015 * Function: sd_mhd_watch_incomplete() 25016 * 25017 * Description: This function is used to find out why a scsi pkt sent by the 25018 * scsi watch facility was not completed. Under some scenarios this 25019 * routine will return. Otherwise it will send a bus reset to see 25020 * if the drive is still online. 25021 * 25022 * Arguments: un - driver soft state (unit) structure 25023 * pkt - incomplete scsi pkt 25024 */ 25025 25026 static void 25027 sd_mhd_watch_incomplete(struct sd_lun *un, struct scsi_pkt *pkt) 25028 { 25029 int be_chatty; 25030 int perr; 25031 25032 ASSERT(pkt != NULL); 25033 ASSERT(un != NULL); 25034 be_chatty = (!(pkt->pkt_flags & FLAG_SILENT)); 25035 perr = (pkt->pkt_statistics & STAT_PERR); 25036 25037 mutex_enter(SD_MUTEX(un)); 25038 if (un->un_state == SD_STATE_DUMPING) { 25039 mutex_exit(SD_MUTEX(un)); 25040 return; 25041 } 25042 25043 switch (pkt->pkt_reason) { 25044 case CMD_UNX_BUS_FREE: 25045 /* 25046 * If we had a parity error that caused the target to drop BSY*, 25047 * don't be chatty about it. 25048 */ 25049 if (perr && be_chatty) { 25050 be_chatty = 0; 25051 } 25052 break; 25053 case CMD_TAG_REJECT: 25054 /* 25055 * The SCSI-2 spec states that a tag reject will be sent by the 25056 * target if tagged queuing is not supported. A tag reject may 25057 * also be sent during certain initialization periods or to 25058 * control internal resources. For the latter case the target 25059 * may also return Queue Full. 25060 * 25061 * If this driver receives a tag reject from a target that is 25062 * going through an init period or controlling internal 25063 * resources tagged queuing will be disabled. This is a less 25064 * than optimal behavior but the driver is unable to determine 25065 * the target state and assumes tagged queueing is not supported 25066 */ 25067 pkt->pkt_flags = 0; 25068 un->un_tagflags = 0; 25069 25070 if (un->un_f_opt_queueing == TRUE) { 25071 un->un_throttle = min(un->un_throttle, 3); 25072 } else { 25073 un->un_throttle = 1; 25074 } 25075 mutex_exit(SD_MUTEX(un)); 25076 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1); 25077 mutex_enter(SD_MUTEX(un)); 25078 break; 25079 case CMD_INCOMPLETE: 25080 /* 25081 * The transport stopped with an abnormal state, fallthrough and 25082 * reset the target and/or bus unless selection did not complete 25083 * (indicated by STATE_GOT_BUS) in which case we don't want to 25084 * go through a target/bus reset 25085 */ 25086 if (pkt->pkt_state == STATE_GOT_BUS) { 25087 break; 25088 } 25089 /*FALLTHROUGH*/ 25090 25091 case CMD_TIMEOUT: 25092 default: 25093 /* 25094 * The lun may still be running the command, so a lun reset 25095 * should be attempted. If the lun reset fails or cannot be 25096 * issued, than try a target reset. Lastly try a bus reset. 25097 */ 25098 if ((pkt->pkt_statistics & 25099 (STAT_BUS_RESET|STAT_DEV_RESET|STAT_ABORTED)) == 0) { 25100 int reset_retval = 0; 25101 mutex_exit(SD_MUTEX(un)); 25102 if (un->un_f_allow_bus_device_reset == TRUE) { 25103 if (un->un_f_lun_reset_enabled == TRUE) { 25104 reset_retval = 25105 scsi_reset(SD_ADDRESS(un), 25106 RESET_LUN); 25107 } 25108 if (reset_retval == 0) { 25109 reset_retval = 25110 scsi_reset(SD_ADDRESS(un), 25111 RESET_TARGET); 25112 } 25113 } 25114 if (reset_retval == 0) { 25115 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL); 25116 } 25117 mutex_enter(SD_MUTEX(un)); 25118 } 25119 break; 25120 } 25121 25122 /* A device/bus reset has occurred; update the reservation status. */ 25123 if ((pkt->pkt_reason == CMD_RESET) || (pkt->pkt_statistics & 25124 (STAT_BUS_RESET | STAT_DEV_RESET))) { 25125 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) { 25126 un->un_resvd_status |= 25127 (SD_LOST_RESERVE | SD_WANT_RESERVE); 25128 SD_INFO(SD_LOG_IOCTL_MHD, un, 25129 "sd_mhd_watch_incomplete: Lost Reservation\n"); 25130 } 25131 } 25132 25133 /* 25134 * The disk has been turned off; Update the device state. 25135 * 25136 * Note: Should we be offlining the disk here? 25137 */ 25138 if (pkt->pkt_state == STATE_GOT_BUS) { 25139 SD_INFO(SD_LOG_IOCTL_MHD, un, "sd_mhd_watch_incomplete: " 25140 "Disk not responding to selection\n"); 25141 if (un->un_state != SD_STATE_OFFLINE) { 25142 New_state(un, SD_STATE_OFFLINE); 25143 } 25144 } else if (be_chatty) { 25145 /* 25146 * suppress messages if they are all the same pkt reason; 25147 * with TQ, many (up to 256) are returned with the same 25148 * pkt_reason 25149 */ 25150 if (pkt->pkt_reason != un->un_last_pkt_reason) { 25151 SD_ERROR(SD_LOG_IOCTL_MHD, un, 25152 "sd_mhd_watch_incomplete: " 25153 "SCSI transport failed: reason '%s'\n", 25154 scsi_rname(pkt->pkt_reason)); 25155 } 25156 } 25157 un->un_last_pkt_reason = pkt->pkt_reason; 25158 mutex_exit(SD_MUTEX(un)); 25159 } 25160 25161 25162 /* 25163 * Function: sd_sname() 25164 * 25165 * Description: This is a simple little routine to return a string containing 25166 * a printable description of command status byte for use in 25167 * logging. 25168 * 25169 * Arguments: status - pointer to a status byte 25170 * 25171 * Return Code: char * - string containing status description. 25172 */ 25173 25174 static char * 25175 sd_sname(uchar_t status) 25176 { 25177 switch (status & STATUS_MASK) { 25178 case STATUS_GOOD: 25179 return ("good status"); 25180 case STATUS_CHECK: 25181 return ("check condition"); 25182 case STATUS_MET: 25183 return ("condition met"); 25184 case STATUS_BUSY: 25185 return ("busy"); 25186 case STATUS_INTERMEDIATE: 25187 return ("intermediate"); 25188 case STATUS_INTERMEDIATE_MET: 25189 return ("intermediate - condition met"); 25190 case STATUS_RESERVATION_CONFLICT: 25191 return ("reservation_conflict"); 25192 case STATUS_TERMINATED: 25193 return ("command terminated"); 25194 case STATUS_QFULL: 25195 return ("queue full"); 25196 default: 25197 return ("<unknown status>"); 25198 } 25199 } 25200 25201 25202 /* 25203 * Function: sd_mhd_resvd_recover() 25204 * 25205 * Description: This function adds a reservation entry to the 25206 * sd_resv_reclaim_request list and signals the reservation 25207 * reclaim thread that there is work pending. If the reservation 25208 * reclaim thread has not been previously created this function 25209 * will kick it off. 25210 * 25211 * Arguments: arg - the device 'dev_t' is used for context to discriminate 25212 * among multiple watches that share this callback function 25213 * 25214 * Context: This routine is called by timeout() and is run in interrupt 25215 * context. It must not sleep or call other functions which may 25216 * sleep. 25217 */ 25218 25219 static void 25220 sd_mhd_resvd_recover(void *arg) 25221 { 25222 dev_t dev = (dev_t)arg; 25223 struct sd_lun *un; 25224 struct sd_thr_request *sd_treq = NULL; 25225 struct sd_thr_request *sd_cur = NULL; 25226 struct sd_thr_request *sd_prev = NULL; 25227 int already_there = 0; 25228 25229 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 25230 return; 25231 } 25232 25233 mutex_enter(SD_MUTEX(un)); 25234 un->un_resvd_timeid = NULL; 25235 if (un->un_resvd_status & SD_WANT_RESERVE) { 25236 /* 25237 * There was a reset so don't issue the reserve, allow the 25238 * sd_mhd_watch_cb callback function to notice this and 25239 * reschedule the timeout for reservation. 25240 */ 25241 mutex_exit(SD_MUTEX(un)); 25242 return; 25243 } 25244 mutex_exit(SD_MUTEX(un)); 25245 25246 /* 25247 * Add this device to the sd_resv_reclaim_request list and the 25248 * sd_resv_reclaim_thread should take care of the rest. 25249 * 25250 * Note: We can't sleep in this context so if the memory allocation 25251 * fails allow the sd_mhd_watch_cb callback function to notice this and 25252 * reschedule the timeout for reservation. (4378460) 25253 */ 25254 sd_treq = (struct sd_thr_request *) 25255 kmem_zalloc(sizeof (struct sd_thr_request), KM_NOSLEEP); 25256 if (sd_treq == NULL) { 25257 return; 25258 } 25259 25260 sd_treq->sd_thr_req_next = NULL; 25261 sd_treq->dev = dev; 25262 mutex_enter(&sd_tr.srq_resv_reclaim_mutex); 25263 if (sd_tr.srq_thr_req_head == NULL) { 25264 sd_tr.srq_thr_req_head = sd_treq; 25265 } else { 25266 sd_cur = sd_prev = sd_tr.srq_thr_req_head; 25267 for (; sd_cur != NULL; sd_cur = sd_cur->sd_thr_req_next) { 25268 if (sd_cur->dev == dev) { 25269 /* 25270 * already in Queue so don't log 25271 * another request for the device 25272 */ 25273 already_there = 1; 25274 break; 25275 } 25276 sd_prev = sd_cur; 25277 } 25278 if (!already_there) { 25279 SD_INFO(SD_LOG_IOCTL_MHD, un, "sd_mhd_resvd_recover: " 25280 "logging request for %lx\n", dev); 25281 sd_prev->sd_thr_req_next = sd_treq; 25282 } else { 25283 kmem_free(sd_treq, sizeof (struct sd_thr_request)); 25284 } 25285 } 25286 25287 /* 25288 * Create a kernel thread to do the reservation reclaim and free up this 25289 * thread. We cannot block this thread while we go away to do the 25290 * reservation reclaim 25291 */ 25292 if (sd_tr.srq_resv_reclaim_thread == NULL) 25293 sd_tr.srq_resv_reclaim_thread = thread_create(NULL, 0, 25294 sd_resv_reclaim_thread, NULL, 25295 0, &p0, TS_RUN, v.v_maxsyspri - 2); 25296 25297 /* Tell the reservation reclaim thread that it has work to do */ 25298 cv_signal(&sd_tr.srq_resv_reclaim_cv); 25299 mutex_exit(&sd_tr.srq_resv_reclaim_mutex); 25300 } 25301 25302 /* 25303 * Function: sd_resv_reclaim_thread() 25304 * 25305 * Description: This function implements the reservation reclaim operations 25306 * 25307 * Arguments: arg - the device 'dev_t' is used for context to discriminate 25308 * among multiple watches that share this callback function 25309 */ 25310 25311 static void 25312 sd_resv_reclaim_thread() 25313 { 25314 struct sd_lun *un; 25315 struct sd_thr_request *sd_mhreq; 25316 25317 /* Wait for work */ 25318 mutex_enter(&sd_tr.srq_resv_reclaim_mutex); 25319 if (sd_tr.srq_thr_req_head == NULL) { 25320 cv_wait(&sd_tr.srq_resv_reclaim_cv, 25321 &sd_tr.srq_resv_reclaim_mutex); 25322 } 25323 25324 /* Loop while we have work */ 25325 while ((sd_tr.srq_thr_cur_req = sd_tr.srq_thr_req_head) != NULL) { 25326 un = ddi_get_soft_state(sd_state, 25327 SDUNIT(sd_tr.srq_thr_cur_req->dev)); 25328 if (un == NULL) { 25329 /* 25330 * softstate structure is NULL so just 25331 * dequeue the request and continue 25332 */ 25333 sd_tr.srq_thr_req_head = 25334 sd_tr.srq_thr_cur_req->sd_thr_req_next; 25335 kmem_free(sd_tr.srq_thr_cur_req, 25336 sizeof (struct sd_thr_request)); 25337 continue; 25338 } 25339 25340 /* dequeue the request */ 25341 sd_mhreq = sd_tr.srq_thr_cur_req; 25342 sd_tr.srq_thr_req_head = 25343 sd_tr.srq_thr_cur_req->sd_thr_req_next; 25344 mutex_exit(&sd_tr.srq_resv_reclaim_mutex); 25345 25346 /* 25347 * Reclaim reservation only if SD_RESERVE is still set. There 25348 * may have been a call to MHIOCRELEASE before we got here. 25349 */ 25350 mutex_enter(SD_MUTEX(un)); 25351 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) { 25352 /* 25353 * Note: The SD_LOST_RESERVE flag is cleared before 25354 * reclaiming the reservation. If this is done after the 25355 * call to sd_reserve_release a reservation loss in the 25356 * window between pkt completion of reserve cmd and 25357 * mutex_enter below may not be recognized 25358 */ 25359 un->un_resvd_status &= ~SD_LOST_RESERVE; 25360 mutex_exit(SD_MUTEX(un)); 25361 25362 if (sd_reserve_release(sd_mhreq->dev, 25363 SD_RESERVE) == 0) { 25364 mutex_enter(SD_MUTEX(un)); 25365 un->un_resvd_status |= SD_RESERVE; 25366 mutex_exit(SD_MUTEX(un)); 25367 SD_INFO(SD_LOG_IOCTL_MHD, un, 25368 "sd_resv_reclaim_thread: " 25369 "Reservation Recovered\n"); 25370 } else { 25371 mutex_enter(SD_MUTEX(un)); 25372 un->un_resvd_status |= SD_LOST_RESERVE; 25373 mutex_exit(SD_MUTEX(un)); 25374 SD_INFO(SD_LOG_IOCTL_MHD, un, 25375 "sd_resv_reclaim_thread: Failed " 25376 "Reservation Recovery\n"); 25377 } 25378 } else { 25379 mutex_exit(SD_MUTEX(un)); 25380 } 25381 mutex_enter(&sd_tr.srq_resv_reclaim_mutex); 25382 ASSERT(sd_mhreq == sd_tr.srq_thr_cur_req); 25383 kmem_free(sd_mhreq, sizeof (struct sd_thr_request)); 25384 sd_mhreq = sd_tr.srq_thr_cur_req = NULL; 25385 /* 25386 * wakeup the destroy thread if anyone is waiting on 25387 * us to complete. 25388 */ 25389 cv_signal(&sd_tr.srq_inprocess_cv); 25390 SD_TRACE(SD_LOG_IOCTL_MHD, un, 25391 "sd_resv_reclaim_thread: cv_signalling current request \n"); 25392 } 25393 25394 /* 25395 * cleanup the sd_tr structure now that this thread will not exist 25396 */ 25397 ASSERT(sd_tr.srq_thr_req_head == NULL); 25398 ASSERT(sd_tr.srq_thr_cur_req == NULL); 25399 sd_tr.srq_resv_reclaim_thread = NULL; 25400 mutex_exit(&sd_tr.srq_resv_reclaim_mutex); 25401 thread_exit(); 25402 } 25403 25404 25405 /* 25406 * Function: sd_rmv_resv_reclaim_req() 25407 * 25408 * Description: This function removes any pending reservation reclaim requests 25409 * for the specified device. 25410 * 25411 * Arguments: dev - the device 'dev_t' 25412 */ 25413 25414 static void 25415 sd_rmv_resv_reclaim_req(dev_t dev) 25416 { 25417 struct sd_thr_request *sd_mhreq; 25418 struct sd_thr_request *sd_prev; 25419 25420 /* Remove a reservation reclaim request from the list */ 25421 mutex_enter(&sd_tr.srq_resv_reclaim_mutex); 25422 if (sd_tr.srq_thr_cur_req && sd_tr.srq_thr_cur_req->dev == dev) { 25423 /* 25424 * We are attempting to reinstate reservation for 25425 * this device. We wait for sd_reserve_release() 25426 * to return before we return. 25427 */ 25428 cv_wait(&sd_tr.srq_inprocess_cv, 25429 &sd_tr.srq_resv_reclaim_mutex); 25430 } else { 25431 sd_prev = sd_mhreq = sd_tr.srq_thr_req_head; 25432 if (sd_mhreq && sd_mhreq->dev == dev) { 25433 sd_tr.srq_thr_req_head = sd_mhreq->sd_thr_req_next; 25434 kmem_free(sd_mhreq, sizeof (struct sd_thr_request)); 25435 mutex_exit(&sd_tr.srq_resv_reclaim_mutex); 25436 return; 25437 } 25438 for (; sd_mhreq != NULL; sd_mhreq = sd_mhreq->sd_thr_req_next) { 25439 if (sd_mhreq && sd_mhreq->dev == dev) { 25440 break; 25441 } 25442 sd_prev = sd_mhreq; 25443 } 25444 if (sd_mhreq != NULL) { 25445 sd_prev->sd_thr_req_next = sd_mhreq->sd_thr_req_next; 25446 kmem_free(sd_mhreq, sizeof (struct sd_thr_request)); 25447 } 25448 } 25449 mutex_exit(&sd_tr.srq_resv_reclaim_mutex); 25450 } 25451 25452 25453 /* 25454 * Function: sd_mhd_reset_notify_cb() 25455 * 25456 * Description: This is a call back function for scsi_reset_notify. This 25457 * function updates the softstate reserved status and logs the 25458 * reset. The driver scsi watch facility callback function 25459 * (sd_mhd_watch_cb) and reservation reclaim thread functionality 25460 * will reclaim the reservation. 25461 * 25462 * Arguments: arg - driver soft state (unit) structure 25463 */ 25464 25465 static void 25466 sd_mhd_reset_notify_cb(caddr_t arg) 25467 { 25468 struct sd_lun *un = (struct sd_lun *)arg; 25469 25470 mutex_enter(SD_MUTEX(un)); 25471 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) { 25472 un->un_resvd_status |= (SD_LOST_RESERVE | SD_WANT_RESERVE); 25473 SD_INFO(SD_LOG_IOCTL_MHD, un, 25474 "sd_mhd_reset_notify_cb: Lost Reservation\n"); 25475 } 25476 mutex_exit(SD_MUTEX(un)); 25477 } 25478 25479 25480 /* 25481 * Function: sd_take_ownership() 25482 * 25483 * Description: This routine implements an algorithm to achieve a stable 25484 * reservation on disks which don't implement priority reserve, 25485 * and makes sure that other host lose re-reservation attempts. 25486 * This algorithm contains of a loop that keeps issuing the RESERVE 25487 * for some period of time (min_ownership_delay, default 6 seconds) 25488 * During that loop, it looks to see if there has been a bus device 25489 * reset or bus reset (both of which cause an existing reservation 25490 * to be lost). If the reservation is lost issue RESERVE until a 25491 * period of min_ownership_delay with no resets has gone by, or 25492 * until max_ownership_delay has expired. This loop ensures that 25493 * the host really did manage to reserve the device, in spite of 25494 * resets. The looping for min_ownership_delay (default six 25495 * seconds) is important to early generation clustering products, 25496 * Solstice HA 1.x and Sun Cluster 2.x. Those products use an 25497 * MHIOCENFAILFAST periodic timer of two seconds. By having 25498 * MHIOCTKOWN issue Reserves in a loop for six seconds, and having 25499 * MHIOCENFAILFAST poll every two seconds, the idea is that by the 25500 * time the MHIOCTKOWN ioctl returns, the other host (if any) will 25501 * have already noticed, via the MHIOCENFAILFAST polling, that it 25502 * no longer "owns" the disk and will have panicked itself. Thus, 25503 * the host issuing the MHIOCTKOWN is assured (with timing 25504 * dependencies) that by the time it actually starts to use the 25505 * disk for real work, the old owner is no longer accessing it. 25506 * 25507 * min_ownership_delay is the minimum amount of time for which the 25508 * disk must be reserved continuously devoid of resets before the 25509 * MHIOCTKOWN ioctl will return success. 25510 * 25511 * max_ownership_delay indicates the amount of time by which the 25512 * take ownership should succeed or timeout with an error. 25513 * 25514 * Arguments: dev - the device 'dev_t' 25515 * *p - struct containing timing info. 25516 * 25517 * Return Code: 0 for success or error code 25518 */ 25519 25520 static int 25521 sd_take_ownership(dev_t dev, struct mhioctkown *p) 25522 { 25523 struct sd_lun *un; 25524 int rval; 25525 int err; 25526 int reservation_count = 0; 25527 int min_ownership_delay = 6000000; /* in usec */ 25528 int max_ownership_delay = 30000000; /* in usec */ 25529 clock_t start_time; /* starting time of this algorithm */ 25530 clock_t end_time; /* time limit for giving up */ 25531 clock_t ownership_time; /* time limit for stable ownership */ 25532 clock_t current_time; 25533 clock_t previous_current_time; 25534 25535 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 25536 return (ENXIO); 25537 } 25538 25539 /* 25540 * Attempt a device reservation. A priority reservation is requested. 25541 */ 25542 if ((rval = sd_reserve_release(dev, SD_PRIORITY_RESERVE)) 25543 != SD_SUCCESS) { 25544 SD_ERROR(SD_LOG_IOCTL_MHD, un, 25545 "sd_take_ownership: return(1)=%d\n", rval); 25546 return (rval); 25547 } 25548 25549 /* Update the softstate reserved status to indicate the reservation */ 25550 mutex_enter(SD_MUTEX(un)); 25551 un->un_resvd_status |= SD_RESERVE; 25552 un->un_resvd_status &= 25553 ~(SD_LOST_RESERVE | SD_WANT_RESERVE | SD_RESERVATION_CONFLICT); 25554 mutex_exit(SD_MUTEX(un)); 25555 25556 if (p != NULL) { 25557 if (p->min_ownership_delay != 0) { 25558 min_ownership_delay = p->min_ownership_delay * 1000; 25559 } 25560 if (p->max_ownership_delay != 0) { 25561 max_ownership_delay = p->max_ownership_delay * 1000; 25562 } 25563 } 25564 SD_INFO(SD_LOG_IOCTL_MHD, un, 25565 "sd_take_ownership: min, max delays: %d, %d\n", 25566 min_ownership_delay, max_ownership_delay); 25567 25568 start_time = ddi_get_lbolt(); 25569 current_time = start_time; 25570 ownership_time = current_time + drv_usectohz(min_ownership_delay); 25571 end_time = start_time + drv_usectohz(max_ownership_delay); 25572 25573 while (current_time - end_time < 0) { 25574 delay(drv_usectohz(500000)); 25575 25576 if ((err = sd_reserve_release(dev, SD_RESERVE)) != 0) { 25577 if ((sd_reserve_release(dev, SD_RESERVE)) != 0) { 25578 mutex_enter(SD_MUTEX(un)); 25579 rval = (un->un_resvd_status & 25580 SD_RESERVATION_CONFLICT) ? EACCES : EIO; 25581 mutex_exit(SD_MUTEX(un)); 25582 break; 25583 } 25584 } 25585 previous_current_time = current_time; 25586 current_time = ddi_get_lbolt(); 25587 mutex_enter(SD_MUTEX(un)); 25588 if (err || (un->un_resvd_status & SD_LOST_RESERVE)) { 25589 ownership_time = ddi_get_lbolt() + 25590 drv_usectohz(min_ownership_delay); 25591 reservation_count = 0; 25592 } else { 25593 reservation_count++; 25594 } 25595 un->un_resvd_status |= SD_RESERVE; 25596 un->un_resvd_status &= ~(SD_LOST_RESERVE | SD_WANT_RESERVE); 25597 mutex_exit(SD_MUTEX(un)); 25598 25599 SD_INFO(SD_LOG_IOCTL_MHD, un, 25600 "sd_take_ownership: ticks for loop iteration=%ld, " 25601 "reservation=%s\n", (current_time - previous_current_time), 25602 reservation_count ? "ok" : "reclaimed"); 25603 25604 if (current_time - ownership_time >= 0 && 25605 reservation_count >= 4) { 25606 rval = 0; /* Achieved a stable ownership */ 25607 break; 25608 } 25609 if (current_time - end_time >= 0) { 25610 rval = EACCES; /* No ownership in max possible time */ 25611 break; 25612 } 25613 } 25614 SD_TRACE(SD_LOG_IOCTL_MHD, un, 25615 "sd_take_ownership: return(2)=%d\n", rval); 25616 return (rval); 25617 } 25618 25619 25620 /* 25621 * Function: sd_reserve_release() 25622 * 25623 * Description: This function builds and sends scsi RESERVE, RELEASE, and 25624 * PRIORITY RESERVE commands based on a user specified command type 25625 * 25626 * Arguments: dev - the device 'dev_t' 25627 * cmd - user specified command type; one of SD_PRIORITY_RESERVE, 25628 * SD_RESERVE, SD_RELEASE 25629 * 25630 * Return Code: 0 or Error Code 25631 */ 25632 25633 static int 25634 sd_reserve_release(dev_t dev, int cmd) 25635 { 25636 struct uscsi_cmd *com = NULL; 25637 struct sd_lun *un = NULL; 25638 char cdb[CDB_GROUP0]; 25639 int rval; 25640 25641 ASSERT((cmd == SD_RELEASE) || (cmd == SD_RESERVE) || 25642 (cmd == SD_PRIORITY_RESERVE)); 25643 25644 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 25645 return (ENXIO); 25646 } 25647 25648 /* instantiate and initialize the command and cdb */ 25649 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 25650 bzero(cdb, CDB_GROUP0); 25651 com->uscsi_flags = USCSI_SILENT; 25652 com->uscsi_timeout = un->un_reserve_release_time; 25653 com->uscsi_cdblen = CDB_GROUP0; 25654 com->uscsi_cdb = cdb; 25655 if (cmd == SD_RELEASE) { 25656 cdb[0] = SCMD_RELEASE; 25657 } else { 25658 cdb[0] = SCMD_RESERVE; 25659 } 25660 25661 /* Send the command. */ 25662 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 25663 SD_PATH_STANDARD); 25664 25665 /* 25666 * "break" a reservation that is held by another host, by issuing a 25667 * reset if priority reserve is desired, and we could not get the 25668 * device. 25669 */ 25670 if ((cmd == SD_PRIORITY_RESERVE) && 25671 (rval != 0) && (com->uscsi_status == STATUS_RESERVATION_CONFLICT)) { 25672 /* 25673 * First try to reset the LUN. If we cannot, then try a target 25674 * reset, followed by a bus reset if the target reset fails. 25675 */ 25676 int reset_retval = 0; 25677 if (un->un_f_lun_reset_enabled == TRUE) { 25678 reset_retval = scsi_reset(SD_ADDRESS(un), RESET_LUN); 25679 } 25680 if (reset_retval == 0) { 25681 /* The LUN reset either failed or was not issued */ 25682 reset_retval = scsi_reset(SD_ADDRESS(un), RESET_TARGET); 25683 } 25684 if ((reset_retval == 0) && 25685 (scsi_reset(SD_ADDRESS(un), RESET_ALL) == 0)) { 25686 rval = EIO; 25687 kmem_free(com, sizeof (*com)); 25688 return (rval); 25689 } 25690 25691 bzero(com, sizeof (struct uscsi_cmd)); 25692 com->uscsi_flags = USCSI_SILENT; 25693 com->uscsi_cdb = cdb; 25694 com->uscsi_cdblen = CDB_GROUP0; 25695 com->uscsi_timeout = 5; 25696 25697 /* 25698 * Reissue the last reserve command, this time without request 25699 * sense. Assume that it is just a regular reserve command. 25700 */ 25701 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 25702 SD_PATH_STANDARD); 25703 } 25704 25705 /* Return an error if still getting a reservation conflict. */ 25706 if ((rval != 0) && (com->uscsi_status == STATUS_RESERVATION_CONFLICT)) { 25707 rval = EACCES; 25708 } 25709 25710 kmem_free(com, sizeof (*com)); 25711 return (rval); 25712 } 25713 25714 25715 #define SD_NDUMP_RETRIES 12 25716 /* 25717 * System Crash Dump routine 25718 */ 25719 25720 static int 25721 sddump(dev_t dev, caddr_t addr, daddr_t blkno, int nblk) 25722 { 25723 int instance; 25724 int partition; 25725 int i; 25726 int err; 25727 struct sd_lun *un; 25728 struct scsi_pkt *wr_pktp; 25729 struct buf *wr_bp; 25730 struct buf wr_buf; 25731 daddr_t tgt_byte_offset; /* rmw - byte offset for target */ 25732 daddr_t tgt_blkno; /* rmw - blkno for target */ 25733 size_t tgt_byte_count; /* rmw - # of bytes to xfer */ 25734 size_t tgt_nblk; /* rmw - # of tgt blks to xfer */ 25735 size_t io_start_offset; 25736 int doing_rmw = FALSE; 25737 int rval; 25738 ssize_t dma_resid; 25739 daddr_t oblkno; 25740 diskaddr_t nblks = 0; 25741 diskaddr_t start_block; 25742 25743 instance = SDUNIT(dev); 25744 if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) || 25745 !SD_IS_VALID_LABEL(un) || ISCD(un)) { 25746 return (ENXIO); 25747 } 25748 25749 _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*un)) 25750 25751 SD_TRACE(SD_LOG_DUMP, un, "sddump: entry\n"); 25752 25753 partition = SDPART(dev); 25754 SD_INFO(SD_LOG_DUMP, un, "sddump: partition = %d\n", partition); 25755 25756 if (!(NOT_DEVBSIZE(un))) { 25757 int secmask = 0; 25758 int blknomask = 0; 25759 25760 blknomask = (un->un_tgt_blocksize / DEV_BSIZE) - 1; 25761 secmask = un->un_tgt_blocksize - 1; 25762 25763 if (blkno & blknomask) { 25764 SD_TRACE(SD_LOG_DUMP, un, 25765 "sddump: dump start block not modulo %d\n", 25766 un->un_tgt_blocksize); 25767 return (EINVAL); 25768 } 25769 25770 if ((nblk * DEV_BSIZE) & secmask) { 25771 SD_TRACE(SD_LOG_DUMP, un, 25772 "sddump: dump length not modulo %d\n", 25773 un->un_tgt_blocksize); 25774 return (EINVAL); 25775 } 25776 25777 } 25778 25779 /* Validate blocks to dump at against partition size. */ 25780 25781 (void) cmlb_partinfo(un->un_cmlbhandle, partition, 25782 &nblks, &start_block, NULL, NULL, (void *)SD_PATH_DIRECT); 25783 25784 if (NOT_DEVBSIZE(un)) { 25785 if ((blkno + nblk) > nblks) { 25786 SD_TRACE(SD_LOG_DUMP, un, 25787 "sddump: dump range larger than partition: " 25788 "blkno = 0x%x, nblk = 0x%x, dkl_nblk = 0x%x\n", 25789 blkno, nblk, nblks); 25790 return (EINVAL); 25791 } 25792 } else { 25793 if (((blkno / (un->un_tgt_blocksize / DEV_BSIZE)) + 25794 (nblk / (un->un_tgt_blocksize / DEV_BSIZE))) > nblks) { 25795 SD_TRACE(SD_LOG_DUMP, un, 25796 "sddump: dump range larger than partition: " 25797 "blkno = 0x%x, nblk = 0x%x, dkl_nblk = 0x%x\n", 25798 blkno, nblk, nblks); 25799 return (EINVAL); 25800 } 25801 } 25802 25803 mutex_enter(&un->un_pm_mutex); 25804 if (SD_DEVICE_IS_IN_LOW_POWER(un)) { 25805 struct scsi_pkt *start_pktp; 25806 25807 mutex_exit(&un->un_pm_mutex); 25808 25809 /* 25810 * use pm framework to power on HBA 1st 25811 */ 25812 (void) pm_raise_power(SD_DEVINFO(un), 0, 25813 SD_PM_STATE_ACTIVE(un)); 25814 25815 /* 25816 * Dump no long uses sdpower to power on a device, it's 25817 * in-line here so it can be done in polled mode. 25818 */ 25819 25820 SD_INFO(SD_LOG_DUMP, un, "sddump: starting device\n"); 25821 25822 start_pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, NULL, 25823 CDB_GROUP0, un->un_status_len, 0, 0, NULL_FUNC, NULL); 25824 25825 if (start_pktp == NULL) { 25826 /* We were not given a SCSI packet, fail. */ 25827 return (EIO); 25828 } 25829 bzero(start_pktp->pkt_cdbp, CDB_GROUP0); 25830 start_pktp->pkt_cdbp[0] = SCMD_START_STOP; 25831 start_pktp->pkt_cdbp[4] = SD_TARGET_START; 25832 start_pktp->pkt_flags = FLAG_NOINTR; 25833 25834 mutex_enter(SD_MUTEX(un)); 25835 SD_FILL_SCSI1_LUN(un, start_pktp); 25836 mutex_exit(SD_MUTEX(un)); 25837 /* 25838 * Scsi_poll returns 0 (success) if the command completes and 25839 * the status block is STATUS_GOOD. 25840 */ 25841 if (sd_scsi_poll(un, start_pktp) != 0) { 25842 scsi_destroy_pkt(start_pktp); 25843 return (EIO); 25844 } 25845 scsi_destroy_pkt(start_pktp); 25846 (void) sd_pm_state_change(un, SD_PM_STATE_ACTIVE(un), 25847 SD_PM_STATE_CHANGE); 25848 } else { 25849 mutex_exit(&un->un_pm_mutex); 25850 } 25851 25852 mutex_enter(SD_MUTEX(un)); 25853 un->un_throttle = 0; 25854 25855 /* 25856 * The first time through, reset the specific target device. 25857 * However, when cpr calls sddump we know that sd is in a 25858 * a good state so no bus reset is required. 25859 * Clear sense data via Request Sense cmd. 25860 * In sddump we don't care about allow_bus_device_reset anymore 25861 */ 25862 25863 if ((un->un_state != SD_STATE_SUSPENDED) && 25864 (un->un_state != SD_STATE_DUMPING)) { 25865 25866 New_state(un, SD_STATE_DUMPING); 25867 25868 if (un->un_f_is_fibre == FALSE) { 25869 mutex_exit(SD_MUTEX(un)); 25870 /* 25871 * Attempt a bus reset for parallel scsi. 25872 * 25873 * Note: A bus reset is required because on some host 25874 * systems (i.e. E420R) a bus device reset is 25875 * insufficient to reset the state of the target. 25876 * 25877 * Note: Don't issue the reset for fibre-channel, 25878 * because this tends to hang the bus (loop) for 25879 * too long while everyone is logging out and in 25880 * and the deadman timer for dumping will fire 25881 * before the dump is complete. 25882 */ 25883 if (scsi_reset(SD_ADDRESS(un), RESET_ALL) == 0) { 25884 mutex_enter(SD_MUTEX(un)); 25885 Restore_state(un); 25886 mutex_exit(SD_MUTEX(un)); 25887 return (EIO); 25888 } 25889 25890 /* Delay to give the device some recovery time. */ 25891 drv_usecwait(10000); 25892 25893 if (sd_send_polled_RQS(un) == SD_FAILURE) { 25894 SD_INFO(SD_LOG_DUMP, un, 25895 "sddump: sd_send_polled_RQS failed\n"); 25896 } 25897 mutex_enter(SD_MUTEX(un)); 25898 } 25899 } 25900 25901 /* 25902 * Convert the partition-relative block number to a 25903 * disk physical block number. 25904 */ 25905 if (NOT_DEVBSIZE(un)) { 25906 blkno += start_block; 25907 } else { 25908 blkno = blkno / (un->un_tgt_blocksize / DEV_BSIZE); 25909 blkno += start_block; 25910 } 25911 25912 SD_INFO(SD_LOG_DUMP, un, "sddump: disk blkno = 0x%x\n", blkno); 25913 25914 25915 /* 25916 * Check if the device has a non-512 block size. 25917 */ 25918 wr_bp = NULL; 25919 if (NOT_DEVBSIZE(un)) { 25920 tgt_byte_offset = blkno * un->un_sys_blocksize; 25921 tgt_byte_count = nblk * un->un_sys_blocksize; 25922 if ((tgt_byte_offset % un->un_tgt_blocksize) || 25923 (tgt_byte_count % un->un_tgt_blocksize)) { 25924 doing_rmw = TRUE; 25925 /* 25926 * Calculate the block number and number of block 25927 * in terms of the media block size. 25928 */ 25929 tgt_blkno = tgt_byte_offset / un->un_tgt_blocksize; 25930 tgt_nblk = 25931 ((tgt_byte_offset + tgt_byte_count + 25932 (un->un_tgt_blocksize - 1)) / 25933 un->un_tgt_blocksize) - tgt_blkno; 25934 25935 /* 25936 * Invoke the routine which is going to do read part 25937 * of read-modify-write. 25938 * Note that this routine returns a pointer to 25939 * a valid bp in wr_bp. 25940 */ 25941 err = sddump_do_read_of_rmw(un, tgt_blkno, tgt_nblk, 25942 &wr_bp); 25943 if (err) { 25944 mutex_exit(SD_MUTEX(un)); 25945 return (err); 25946 } 25947 /* 25948 * Offset is being calculated as - 25949 * (original block # * system block size) - 25950 * (new block # * target block size) 25951 */ 25952 io_start_offset = 25953 ((uint64_t)(blkno * un->un_sys_blocksize)) - 25954 ((uint64_t)(tgt_blkno * un->un_tgt_blocksize)); 25955 25956 ASSERT(io_start_offset < un->un_tgt_blocksize); 25957 /* 25958 * Do the modify portion of read modify write. 25959 */ 25960 bcopy(addr, &wr_bp->b_un.b_addr[io_start_offset], 25961 (size_t)nblk * un->un_sys_blocksize); 25962 } else { 25963 doing_rmw = FALSE; 25964 tgt_blkno = tgt_byte_offset / un->un_tgt_blocksize; 25965 tgt_nblk = tgt_byte_count / un->un_tgt_blocksize; 25966 } 25967 25968 /* Convert blkno and nblk to target blocks */ 25969 blkno = tgt_blkno; 25970 nblk = tgt_nblk; 25971 } else { 25972 wr_bp = &wr_buf; 25973 bzero(wr_bp, sizeof (struct buf)); 25974 wr_bp->b_flags = B_BUSY; 25975 wr_bp->b_un.b_addr = addr; 25976 wr_bp->b_bcount = nblk << DEV_BSHIFT; 25977 wr_bp->b_resid = 0; 25978 } 25979 25980 mutex_exit(SD_MUTEX(un)); 25981 25982 /* 25983 * Obtain a SCSI packet for the write command. 25984 * It should be safe to call the allocator here without 25985 * worrying about being locked for DVMA mapping because 25986 * the address we're passed is already a DVMA mapping 25987 * 25988 * We are also not going to worry about semaphore ownership 25989 * in the dump buffer. Dumping is single threaded at present. 25990 */ 25991 25992 wr_pktp = NULL; 25993 25994 dma_resid = wr_bp->b_bcount; 25995 oblkno = blkno; 25996 25997 if (!(NOT_DEVBSIZE(un))) { 25998 nblk = nblk / (un->un_tgt_blocksize / DEV_BSIZE); 25999 } 26000 26001 while (dma_resid != 0) { 26002 26003 for (i = 0; i < SD_NDUMP_RETRIES; i++) { 26004 wr_bp->b_flags &= ~B_ERROR; 26005 26006 if (un->un_partial_dma_supported == 1) { 26007 blkno = oblkno + 26008 ((wr_bp->b_bcount - dma_resid) / 26009 un->un_tgt_blocksize); 26010 nblk = dma_resid / un->un_tgt_blocksize; 26011 26012 if (wr_pktp) { 26013 /* 26014 * Partial DMA transfers after initial transfer 26015 */ 26016 rval = sd_setup_next_rw_pkt(un, wr_pktp, wr_bp, 26017 blkno, nblk); 26018 } else { 26019 /* Initial transfer */ 26020 rval = sd_setup_rw_pkt(un, &wr_pktp, wr_bp, 26021 un->un_pkt_flags, NULL_FUNC, NULL, 26022 blkno, nblk); 26023 } 26024 } else { 26025 rval = sd_setup_rw_pkt(un, &wr_pktp, wr_bp, 26026 0, NULL_FUNC, NULL, blkno, nblk); 26027 } 26028 26029 if (rval == 0) { 26030 /* We were given a SCSI packet, continue. */ 26031 break; 26032 } 26033 26034 if (i == 0) { 26035 if (wr_bp->b_flags & B_ERROR) { 26036 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26037 "no resources for dumping; " 26038 "error code: 0x%x, retrying", 26039 geterror(wr_bp)); 26040 } else { 26041 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26042 "no resources for dumping; retrying"); 26043 } 26044 } else if (i != (SD_NDUMP_RETRIES - 1)) { 26045 if (wr_bp->b_flags & B_ERROR) { 26046 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, 26047 "no resources for dumping; error code: " 26048 "0x%x, retrying\n", geterror(wr_bp)); 26049 } 26050 } else { 26051 if (wr_bp->b_flags & B_ERROR) { 26052 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, 26053 "no resources for dumping; " 26054 "error code: 0x%x, retries failed, " 26055 "giving up.\n", geterror(wr_bp)); 26056 } else { 26057 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, 26058 "no resources for dumping; " 26059 "retries failed, giving up.\n"); 26060 } 26061 mutex_enter(SD_MUTEX(un)); 26062 Restore_state(un); 26063 if (NOT_DEVBSIZE(un) && (doing_rmw == TRUE)) { 26064 mutex_exit(SD_MUTEX(un)); 26065 scsi_free_consistent_buf(wr_bp); 26066 } else { 26067 mutex_exit(SD_MUTEX(un)); 26068 } 26069 return (EIO); 26070 } 26071 drv_usecwait(10000); 26072 } 26073 26074 if (un->un_partial_dma_supported == 1) { 26075 /* 26076 * save the resid from PARTIAL_DMA 26077 */ 26078 dma_resid = wr_pktp->pkt_resid; 26079 if (dma_resid != 0) 26080 nblk -= SD_BYTES2TGTBLOCKS(un, dma_resid); 26081 wr_pktp->pkt_resid = 0; 26082 } else { 26083 dma_resid = 0; 26084 } 26085 26086 /* SunBug 1222170 */ 26087 wr_pktp->pkt_flags = FLAG_NOINTR; 26088 26089 err = EIO; 26090 for (i = 0; i < SD_NDUMP_RETRIES; i++) { 26091 26092 /* 26093 * Scsi_poll returns 0 (success) if the command completes and 26094 * the status block is STATUS_GOOD. We should only check 26095 * errors if this condition is not true. Even then we should 26096 * send our own request sense packet only if we have a check 26097 * condition and auto request sense has not been performed by 26098 * the hba. 26099 */ 26100 SD_TRACE(SD_LOG_DUMP, un, "sddump: sending write\n"); 26101 26102 if ((sd_scsi_poll(un, wr_pktp) == 0) && 26103 (wr_pktp->pkt_resid == 0)) { 26104 err = SD_SUCCESS; 26105 break; 26106 } 26107 26108 /* 26109 * Check CMD_DEV_GONE 1st, give up if device is gone. 26110 */ 26111 if (wr_pktp->pkt_reason == CMD_DEV_GONE) { 26112 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26113 "Error while dumping state...Device is gone\n"); 26114 break; 26115 } 26116 26117 if (SD_GET_PKT_STATUS(wr_pktp) == STATUS_CHECK) { 26118 SD_INFO(SD_LOG_DUMP, un, 26119 "sddump: write failed with CHECK, try # %d\n", i); 26120 if (((wr_pktp->pkt_state & STATE_ARQ_DONE) == 0)) { 26121 (void) sd_send_polled_RQS(un); 26122 } 26123 26124 continue; 26125 } 26126 26127 if (SD_GET_PKT_STATUS(wr_pktp) == STATUS_BUSY) { 26128 int reset_retval = 0; 26129 26130 SD_INFO(SD_LOG_DUMP, un, 26131 "sddump: write failed with BUSY, try # %d\n", i); 26132 26133 if (un->un_f_lun_reset_enabled == TRUE) { 26134 reset_retval = scsi_reset(SD_ADDRESS(un), 26135 RESET_LUN); 26136 } 26137 if (reset_retval == 0) { 26138 (void) scsi_reset(SD_ADDRESS(un), RESET_TARGET); 26139 } 26140 (void) sd_send_polled_RQS(un); 26141 26142 } else { 26143 SD_INFO(SD_LOG_DUMP, un, 26144 "sddump: write failed with 0x%x, try # %d\n", 26145 SD_GET_PKT_STATUS(wr_pktp), i); 26146 mutex_enter(SD_MUTEX(un)); 26147 sd_reset_target(un, wr_pktp); 26148 mutex_exit(SD_MUTEX(un)); 26149 } 26150 26151 /* 26152 * If we are not getting anywhere with lun/target resets, 26153 * let's reset the bus. 26154 */ 26155 if (i == SD_NDUMP_RETRIES/2) { 26156 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL); 26157 (void) sd_send_polled_RQS(un); 26158 } 26159 } 26160 } 26161 26162 scsi_destroy_pkt(wr_pktp); 26163 mutex_enter(SD_MUTEX(un)); 26164 if ((NOT_DEVBSIZE(un)) && (doing_rmw == TRUE)) { 26165 mutex_exit(SD_MUTEX(un)); 26166 scsi_free_consistent_buf(wr_bp); 26167 } else { 26168 mutex_exit(SD_MUTEX(un)); 26169 } 26170 SD_TRACE(SD_LOG_DUMP, un, "sddump: exit: err = %d\n", err); 26171 return (err); 26172 } 26173 26174 /* 26175 * Function: sd_scsi_poll() 26176 * 26177 * Description: This is a wrapper for the scsi_poll call. 26178 * 26179 * Arguments: sd_lun - The unit structure 26180 * scsi_pkt - The scsi packet being sent to the device. 26181 * 26182 * Return Code: 0 - Command completed successfully with good status 26183 * -1 - Command failed. This could indicate a check condition 26184 * or other status value requiring recovery action. 26185 * 26186 * NOTE: This code is only called off sddump(). 26187 */ 26188 26189 static int 26190 sd_scsi_poll(struct sd_lun *un, struct scsi_pkt *pktp) 26191 { 26192 int status; 26193 26194 ASSERT(un != NULL); 26195 ASSERT(!mutex_owned(SD_MUTEX(un))); 26196 ASSERT(pktp != NULL); 26197 26198 status = SD_SUCCESS; 26199 26200 if (scsi_ifgetcap(&pktp->pkt_address, "tagged-qing", 1) == 1) { 26201 pktp->pkt_flags |= un->un_tagflags; 26202 pktp->pkt_flags &= ~FLAG_NODISCON; 26203 } 26204 26205 status = sd_ddi_scsi_poll(pktp); 26206 /* 26207 * Scsi_poll returns 0 (success) if the command completes and the 26208 * status block is STATUS_GOOD. We should only check errors if this 26209 * condition is not true. Even then we should send our own request 26210 * sense packet only if we have a check condition and auto 26211 * request sense has not been performed by the hba. 26212 * Don't get RQS data if pkt_reason is CMD_DEV_GONE. 26213 */ 26214 if ((status != SD_SUCCESS) && 26215 (SD_GET_PKT_STATUS(pktp) == STATUS_CHECK) && 26216 (pktp->pkt_state & STATE_ARQ_DONE) == 0 && 26217 (pktp->pkt_reason != CMD_DEV_GONE)) 26218 (void) sd_send_polled_RQS(un); 26219 26220 return (status); 26221 } 26222 26223 /* 26224 * Function: sd_send_polled_RQS() 26225 * 26226 * Description: This sends the request sense command to a device. 26227 * 26228 * Arguments: sd_lun - The unit structure 26229 * 26230 * Return Code: 0 - Command completed successfully with good status 26231 * -1 - Command failed. 26232 * 26233 */ 26234 26235 static int 26236 sd_send_polled_RQS(struct sd_lun *un) 26237 { 26238 int ret_val; 26239 struct scsi_pkt *rqs_pktp; 26240 struct buf *rqs_bp; 26241 26242 ASSERT(un != NULL); 26243 ASSERT(!mutex_owned(SD_MUTEX(un))); 26244 26245 ret_val = SD_SUCCESS; 26246 26247 rqs_pktp = un->un_rqs_pktp; 26248 rqs_bp = un->un_rqs_bp; 26249 26250 mutex_enter(SD_MUTEX(un)); 26251 26252 if (un->un_sense_isbusy) { 26253 ret_val = SD_FAILURE; 26254 mutex_exit(SD_MUTEX(un)); 26255 return (ret_val); 26256 } 26257 26258 /* 26259 * If the request sense buffer (and packet) is not in use, 26260 * let's set the un_sense_isbusy and send our packet 26261 */ 26262 un->un_sense_isbusy = 1; 26263 rqs_pktp->pkt_resid = 0; 26264 rqs_pktp->pkt_reason = 0; 26265 rqs_pktp->pkt_flags |= FLAG_NOINTR; 26266 bzero(rqs_bp->b_un.b_addr, SENSE_LENGTH); 26267 26268 mutex_exit(SD_MUTEX(un)); 26269 26270 SD_INFO(SD_LOG_COMMON, un, "sd_send_polled_RQS: req sense buf at" 26271 " 0x%p\n", rqs_bp->b_un.b_addr); 26272 26273 /* 26274 * Can't send this to sd_scsi_poll, we wrap ourselves around the 26275 * axle - it has a call into us! 26276 */ 26277 if ((ret_val = sd_ddi_scsi_poll(rqs_pktp)) != 0) { 26278 SD_INFO(SD_LOG_COMMON, un, 26279 "sd_send_polled_RQS: RQS failed\n"); 26280 } 26281 26282 SD_DUMP_MEMORY(un, SD_LOG_COMMON, "sd_send_polled_RQS:", 26283 (uchar_t *)rqs_bp->b_un.b_addr, SENSE_LENGTH, SD_LOG_HEX); 26284 26285 mutex_enter(SD_MUTEX(un)); 26286 un->un_sense_isbusy = 0; 26287 mutex_exit(SD_MUTEX(un)); 26288 26289 return (ret_val); 26290 } 26291 26292 /* 26293 * Defines needed for localized version of the scsi_poll routine. 26294 */ 26295 #define CSEC 10000 /* usecs */ 26296 #define SEC_TO_CSEC (1000000/CSEC) 26297 26298 /* 26299 * Function: sd_ddi_scsi_poll() 26300 * 26301 * Description: Localized version of the scsi_poll routine. The purpose is to 26302 * send a scsi_pkt to a device as a polled command. This version 26303 * is to ensure more robust handling of transport errors. 26304 * Specifically this routine cures not ready, coming ready 26305 * transition for power up and reset of sonoma's. This can take 26306 * up to 45 seconds for power-on and 20 seconds for reset of a 26307 * sonoma lun. 26308 * 26309 * Arguments: scsi_pkt - The scsi_pkt being sent to a device 26310 * 26311 * Return Code: 0 - Command completed successfully with good status 26312 * -1 - Command failed. 26313 * 26314 * NOTE: This code is almost identical to scsi_poll, however before 6668774 can 26315 * be fixed (removing this code), we need to determine how to handle the 26316 * KEY_UNIT_ATTENTION condition below in conditions not as limited as sddump(). 26317 * 26318 * NOTE: This code is only called off sddump(). 26319 */ 26320 static int 26321 sd_ddi_scsi_poll(struct scsi_pkt *pkt) 26322 { 26323 int rval = -1; 26324 int savef; 26325 long savet; 26326 void (*savec)(); 26327 int timeout; 26328 int busy_count; 26329 int poll_delay; 26330 int rc; 26331 uint8_t *sensep; 26332 struct scsi_arq_status *arqstat; 26333 extern int do_polled_io; 26334 26335 ASSERT(pkt->pkt_scbp); 26336 26337 /* 26338 * save old flags.. 26339 */ 26340 savef = pkt->pkt_flags; 26341 savec = pkt->pkt_comp; 26342 savet = pkt->pkt_time; 26343 26344 pkt->pkt_flags |= FLAG_NOINTR; 26345 26346 /* 26347 * XXX there is nothing in the SCSA spec that states that we should not 26348 * do a callback for polled cmds; however, removing this will break sd 26349 * and probably other target drivers 26350 */ 26351 pkt->pkt_comp = NULL; 26352 26353 /* 26354 * we don't like a polled command without timeout. 26355 * 60 seconds seems long enough. 26356 */ 26357 if (pkt->pkt_time == 0) 26358 pkt->pkt_time = SCSI_POLL_TIMEOUT; 26359 26360 /* 26361 * Send polled cmd. 26362 * 26363 * We do some error recovery for various errors. Tran_busy, 26364 * queue full, and non-dispatched commands are retried every 10 msec. 26365 * as they are typically transient failures. Busy status and Not 26366 * Ready are retried every second as this status takes a while to 26367 * change. 26368 */ 26369 timeout = pkt->pkt_time * SEC_TO_CSEC; 26370 26371 for (busy_count = 0; busy_count < timeout; busy_count++) { 26372 /* 26373 * Initialize pkt status variables. 26374 */ 26375 *pkt->pkt_scbp = pkt->pkt_reason = pkt->pkt_state = 0; 26376 26377 if ((rc = scsi_transport(pkt)) != TRAN_ACCEPT) { 26378 if (rc != TRAN_BUSY) { 26379 /* Transport failed - give up. */ 26380 break; 26381 } else { 26382 /* Transport busy - try again. */ 26383 poll_delay = 1 * CSEC; /* 10 msec. */ 26384 } 26385 } else { 26386 /* 26387 * Transport accepted - check pkt status. 26388 */ 26389 rc = (*pkt->pkt_scbp) & STATUS_MASK; 26390 if ((pkt->pkt_reason == CMD_CMPLT) && 26391 (rc == STATUS_CHECK) && 26392 (pkt->pkt_state & STATE_ARQ_DONE)) { 26393 arqstat = 26394 (struct scsi_arq_status *)(pkt->pkt_scbp); 26395 sensep = (uint8_t *)&arqstat->sts_sensedata; 26396 } else { 26397 sensep = NULL; 26398 } 26399 26400 if ((pkt->pkt_reason == CMD_CMPLT) && 26401 (rc == STATUS_GOOD)) { 26402 /* No error - we're done */ 26403 rval = 0; 26404 break; 26405 26406 } else if (pkt->pkt_reason == CMD_DEV_GONE) { 26407 /* Lost connection - give up */ 26408 break; 26409 26410 } else if ((pkt->pkt_reason == CMD_INCOMPLETE) && 26411 (pkt->pkt_state == 0)) { 26412 /* Pkt not dispatched - try again. */ 26413 poll_delay = 1 * CSEC; /* 10 msec. */ 26414 26415 } else if ((pkt->pkt_reason == CMD_CMPLT) && 26416 (rc == STATUS_QFULL)) { 26417 /* Queue full - try again. */ 26418 poll_delay = 1 * CSEC; /* 10 msec. */ 26419 26420 } else if ((pkt->pkt_reason == CMD_CMPLT) && 26421 (rc == STATUS_BUSY)) { 26422 /* Busy - try again. */ 26423 poll_delay = 100 * CSEC; /* 1 sec. */ 26424 busy_count += (SEC_TO_CSEC - 1); 26425 26426 } else if ((sensep != NULL) && 26427 (scsi_sense_key(sensep) == KEY_UNIT_ATTENTION)) { 26428 /* 26429 * Unit Attention - try again. 26430 * Pretend it took 1 sec. 26431 * NOTE: 'continue' avoids poll_delay 26432 */ 26433 busy_count += (SEC_TO_CSEC - 1); 26434 continue; 26435 26436 } else if ((sensep != NULL) && 26437 (scsi_sense_key(sensep) == KEY_NOT_READY) && 26438 (scsi_sense_asc(sensep) == 0x04) && 26439 (scsi_sense_ascq(sensep) == 0x01)) { 26440 /* 26441 * Not ready -> ready - try again. 26442 * 04h/01h: LUN IS IN PROCESS OF BECOMING READY 26443 * ...same as STATUS_BUSY 26444 */ 26445 poll_delay = 100 * CSEC; /* 1 sec. */ 26446 busy_count += (SEC_TO_CSEC - 1); 26447 26448 } else { 26449 /* BAD status - give up. */ 26450 break; 26451 } 26452 } 26453 26454 if (((curthread->t_flag & T_INTR_THREAD) == 0) && 26455 !do_polled_io) { 26456 delay(drv_usectohz(poll_delay)); 26457 } else { 26458 /* we busy wait during cpr_dump or interrupt threads */ 26459 drv_usecwait(poll_delay); 26460 } 26461 } 26462 26463 pkt->pkt_flags = savef; 26464 pkt->pkt_comp = savec; 26465 pkt->pkt_time = savet; 26466 26467 /* return on error */ 26468 if (rval) 26469 return (rval); 26470 26471 /* 26472 * This is not a performance critical code path. 26473 * 26474 * As an accommodation for scsi_poll callers, to avoid ddi_dma_sync() 26475 * issues associated with looking at DMA memory prior to 26476 * scsi_pkt_destroy(), we scsi_sync_pkt() prior to return. 26477 */ 26478 scsi_sync_pkt(pkt); 26479 return (0); 26480 } 26481 26482 26483 26484 /* 26485 * Function: sd_persistent_reservation_in_read_keys 26486 * 26487 * Description: This routine is the driver entry point for handling CD-ROM 26488 * multi-host persistent reservation requests (MHIOCGRP_INKEYS) 26489 * by sending the SCSI-3 PRIN commands to the device. 26490 * Processes the read keys command response by copying the 26491 * reservation key information into the user provided buffer. 26492 * Support for the 32/64 bit _MULTI_DATAMODEL is implemented. 26493 * 26494 * Arguments: un - Pointer to soft state struct for the target. 26495 * usrp - user provided pointer to multihost Persistent In Read 26496 * Keys structure (mhioc_inkeys_t) 26497 * flag - this argument is a pass through to ddi_copyxxx() 26498 * directly from the mode argument of ioctl(). 26499 * 26500 * Return Code: 0 - Success 26501 * EACCES 26502 * ENOTSUP 26503 * errno return code from sd_send_scsi_cmd() 26504 * 26505 * Context: Can sleep. Does not return until command is completed. 26506 */ 26507 26508 static int 26509 sd_persistent_reservation_in_read_keys(struct sd_lun *un, 26510 mhioc_inkeys_t *usrp, int flag) 26511 { 26512 #ifdef _MULTI_DATAMODEL 26513 struct mhioc_key_list32 li32; 26514 #endif 26515 sd_prin_readkeys_t *in; 26516 mhioc_inkeys_t *ptr; 26517 mhioc_key_list_t li; 26518 uchar_t *data_bufp = NULL; 26519 int data_len = 0; 26520 int rval = 0; 26521 size_t copysz = 0; 26522 sd_ssc_t *ssc; 26523 26524 if ((ptr = (mhioc_inkeys_t *)usrp) == NULL) { 26525 return (EINVAL); 26526 } 26527 bzero(&li, sizeof (mhioc_key_list_t)); 26528 26529 ssc = sd_ssc_init(un); 26530 26531 /* 26532 * Get the listsize from user 26533 */ 26534 #ifdef _MULTI_DATAMODEL 26535 switch (ddi_model_convert_from(flag & FMODELS)) { 26536 case DDI_MODEL_ILP32: 26537 copysz = sizeof (struct mhioc_key_list32); 26538 if (ddi_copyin(ptr->li, &li32, copysz, flag)) { 26539 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26540 "sd_persistent_reservation_in_read_keys: " 26541 "failed ddi_copyin: mhioc_key_list32_t\n"); 26542 rval = EFAULT; 26543 goto done; 26544 } 26545 li.listsize = li32.listsize; 26546 li.list = (mhioc_resv_key_t *)(uintptr_t)li32.list; 26547 break; 26548 26549 case DDI_MODEL_NONE: 26550 copysz = sizeof (mhioc_key_list_t); 26551 if (ddi_copyin(ptr->li, &li, copysz, flag)) { 26552 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26553 "sd_persistent_reservation_in_read_keys: " 26554 "failed ddi_copyin: mhioc_key_list_t\n"); 26555 rval = EFAULT; 26556 goto done; 26557 } 26558 break; 26559 } 26560 26561 #else /* ! _MULTI_DATAMODEL */ 26562 copysz = sizeof (mhioc_key_list_t); 26563 if (ddi_copyin(ptr->li, &li, copysz, flag)) { 26564 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26565 "sd_persistent_reservation_in_read_keys: " 26566 "failed ddi_copyin: mhioc_key_list_t\n"); 26567 rval = EFAULT; 26568 goto done; 26569 } 26570 #endif 26571 26572 data_len = li.listsize * MHIOC_RESV_KEY_SIZE; 26573 data_len += (sizeof (sd_prin_readkeys_t) - sizeof (caddr_t)); 26574 data_bufp = kmem_zalloc(data_len, KM_SLEEP); 26575 26576 rval = sd_send_scsi_PERSISTENT_RESERVE_IN(ssc, SD_READ_KEYS, 26577 data_len, data_bufp); 26578 if (rval != 0) { 26579 if (rval == EIO) 26580 sd_ssc_assessment(ssc, SD_FMT_IGNORE_COMPROMISE); 26581 else 26582 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 26583 goto done; 26584 } 26585 in = (sd_prin_readkeys_t *)data_bufp; 26586 ptr->generation = BE_32(in->generation); 26587 li.listlen = BE_32(in->len) / MHIOC_RESV_KEY_SIZE; 26588 26589 /* 26590 * Return the min(listsize, listlen) keys 26591 */ 26592 #ifdef _MULTI_DATAMODEL 26593 26594 switch (ddi_model_convert_from(flag & FMODELS)) { 26595 case DDI_MODEL_ILP32: 26596 li32.listlen = li.listlen; 26597 if (ddi_copyout(&li32, ptr->li, copysz, flag)) { 26598 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26599 "sd_persistent_reservation_in_read_keys: " 26600 "failed ddi_copyout: mhioc_key_list32_t\n"); 26601 rval = EFAULT; 26602 goto done; 26603 } 26604 break; 26605 26606 case DDI_MODEL_NONE: 26607 if (ddi_copyout(&li, ptr->li, copysz, flag)) { 26608 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26609 "sd_persistent_reservation_in_read_keys: " 26610 "failed ddi_copyout: mhioc_key_list_t\n"); 26611 rval = EFAULT; 26612 goto done; 26613 } 26614 break; 26615 } 26616 26617 #else /* ! _MULTI_DATAMODEL */ 26618 26619 if (ddi_copyout(&li, ptr->li, copysz, flag)) { 26620 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26621 "sd_persistent_reservation_in_read_keys: " 26622 "failed ddi_copyout: mhioc_key_list_t\n"); 26623 rval = EFAULT; 26624 goto done; 26625 } 26626 26627 #endif /* _MULTI_DATAMODEL */ 26628 26629 copysz = min(li.listlen * MHIOC_RESV_KEY_SIZE, 26630 li.listsize * MHIOC_RESV_KEY_SIZE); 26631 if (ddi_copyout(&in->keylist, li.list, copysz, flag)) { 26632 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26633 "sd_persistent_reservation_in_read_keys: " 26634 "failed ddi_copyout: keylist\n"); 26635 rval = EFAULT; 26636 } 26637 done: 26638 sd_ssc_fini(ssc); 26639 kmem_free(data_bufp, data_len); 26640 return (rval); 26641 } 26642 26643 26644 /* 26645 * Function: sd_persistent_reservation_in_read_resv 26646 * 26647 * Description: This routine is the driver entry point for handling CD-ROM 26648 * multi-host persistent reservation requests (MHIOCGRP_INRESV) 26649 * by sending the SCSI-3 PRIN commands to the device. 26650 * Process the read persistent reservations command response by 26651 * copying the reservation information into the user provided 26652 * buffer. Support for the 32/64 _MULTI_DATAMODEL is implemented. 26653 * 26654 * Arguments: un - Pointer to soft state struct for the target. 26655 * usrp - user provided pointer to multihost Persistent In Read 26656 * Keys structure (mhioc_inkeys_t) 26657 * flag - this argument is a pass through to ddi_copyxxx() 26658 * directly from the mode argument of ioctl(). 26659 * 26660 * Return Code: 0 - Success 26661 * EACCES 26662 * ENOTSUP 26663 * errno return code from sd_send_scsi_cmd() 26664 * 26665 * Context: Can sleep. Does not return until command is completed. 26666 */ 26667 26668 static int 26669 sd_persistent_reservation_in_read_resv(struct sd_lun *un, 26670 mhioc_inresvs_t *usrp, int flag) 26671 { 26672 #ifdef _MULTI_DATAMODEL 26673 struct mhioc_resv_desc_list32 resvlist32; 26674 #endif 26675 sd_prin_readresv_t *in; 26676 mhioc_inresvs_t *ptr; 26677 sd_readresv_desc_t *readresv_ptr; 26678 mhioc_resv_desc_list_t resvlist; 26679 mhioc_resv_desc_t resvdesc; 26680 uchar_t *data_bufp = NULL; 26681 int data_len; 26682 int rval = 0; 26683 int i; 26684 size_t copysz = 0; 26685 mhioc_resv_desc_t *bufp; 26686 sd_ssc_t *ssc; 26687 26688 if ((ptr = usrp) == NULL) { 26689 return (EINVAL); 26690 } 26691 26692 ssc = sd_ssc_init(un); 26693 26694 /* 26695 * Get the listsize from user 26696 */ 26697 #ifdef _MULTI_DATAMODEL 26698 switch (ddi_model_convert_from(flag & FMODELS)) { 26699 case DDI_MODEL_ILP32: 26700 copysz = sizeof (struct mhioc_resv_desc_list32); 26701 if (ddi_copyin(ptr->li, &resvlist32, copysz, flag)) { 26702 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26703 "sd_persistent_reservation_in_read_resv: " 26704 "failed ddi_copyin: mhioc_resv_desc_list_t\n"); 26705 rval = EFAULT; 26706 goto done; 26707 } 26708 resvlist.listsize = resvlist32.listsize; 26709 resvlist.list = (mhioc_resv_desc_t *)(uintptr_t)resvlist32.list; 26710 break; 26711 26712 case DDI_MODEL_NONE: 26713 copysz = sizeof (mhioc_resv_desc_list_t); 26714 if (ddi_copyin(ptr->li, &resvlist, copysz, flag)) { 26715 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26716 "sd_persistent_reservation_in_read_resv: " 26717 "failed ddi_copyin: mhioc_resv_desc_list_t\n"); 26718 rval = EFAULT; 26719 goto done; 26720 } 26721 break; 26722 } 26723 #else /* ! _MULTI_DATAMODEL */ 26724 copysz = sizeof (mhioc_resv_desc_list_t); 26725 if (ddi_copyin(ptr->li, &resvlist, copysz, flag)) { 26726 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26727 "sd_persistent_reservation_in_read_resv: " 26728 "failed ddi_copyin: mhioc_resv_desc_list_t\n"); 26729 rval = EFAULT; 26730 goto done; 26731 } 26732 #endif /* ! _MULTI_DATAMODEL */ 26733 26734 data_len = resvlist.listsize * SCSI3_RESV_DESC_LEN; 26735 data_len += (sizeof (sd_prin_readresv_t) - sizeof (caddr_t)); 26736 data_bufp = kmem_zalloc(data_len, KM_SLEEP); 26737 26738 rval = sd_send_scsi_PERSISTENT_RESERVE_IN(ssc, SD_READ_RESV, 26739 data_len, data_bufp); 26740 if (rval != 0) { 26741 if (rval == EIO) 26742 sd_ssc_assessment(ssc, SD_FMT_IGNORE_COMPROMISE); 26743 else 26744 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 26745 goto done; 26746 } 26747 in = (sd_prin_readresv_t *)data_bufp; 26748 ptr->generation = BE_32(in->generation); 26749 resvlist.listlen = BE_32(in->len) / SCSI3_RESV_DESC_LEN; 26750 26751 /* 26752 * Return the min(listsize, listlen( keys 26753 */ 26754 #ifdef _MULTI_DATAMODEL 26755 26756 switch (ddi_model_convert_from(flag & FMODELS)) { 26757 case DDI_MODEL_ILP32: 26758 resvlist32.listlen = resvlist.listlen; 26759 if (ddi_copyout(&resvlist32, ptr->li, copysz, flag)) { 26760 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26761 "sd_persistent_reservation_in_read_resv: " 26762 "failed ddi_copyout: mhioc_resv_desc_list_t\n"); 26763 rval = EFAULT; 26764 goto done; 26765 } 26766 break; 26767 26768 case DDI_MODEL_NONE: 26769 if (ddi_copyout(&resvlist, ptr->li, copysz, flag)) { 26770 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26771 "sd_persistent_reservation_in_read_resv: " 26772 "failed ddi_copyout: mhioc_resv_desc_list_t\n"); 26773 rval = EFAULT; 26774 goto done; 26775 } 26776 break; 26777 } 26778 26779 #else /* ! _MULTI_DATAMODEL */ 26780 26781 if (ddi_copyout(&resvlist, ptr->li, copysz, flag)) { 26782 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26783 "sd_persistent_reservation_in_read_resv: " 26784 "failed ddi_copyout: mhioc_resv_desc_list_t\n"); 26785 rval = EFAULT; 26786 goto done; 26787 } 26788 26789 #endif /* ! _MULTI_DATAMODEL */ 26790 26791 readresv_ptr = (sd_readresv_desc_t *)&in->readresv_desc; 26792 bufp = resvlist.list; 26793 copysz = sizeof (mhioc_resv_desc_t); 26794 for (i = 0; i < min(resvlist.listlen, resvlist.listsize); 26795 i++, readresv_ptr++, bufp++) { 26796 26797 bcopy(&readresv_ptr->resvkey, &resvdesc.key, 26798 MHIOC_RESV_KEY_SIZE); 26799 resvdesc.type = readresv_ptr->type; 26800 resvdesc.scope = readresv_ptr->scope; 26801 resvdesc.scope_specific_addr = 26802 BE_32(readresv_ptr->scope_specific_addr); 26803 26804 if (ddi_copyout(&resvdesc, bufp, copysz, flag)) { 26805 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26806 "sd_persistent_reservation_in_read_resv: " 26807 "failed ddi_copyout: resvlist\n"); 26808 rval = EFAULT; 26809 goto done; 26810 } 26811 } 26812 done: 26813 sd_ssc_fini(ssc); 26814 /* only if data_bufp is allocated, we need to free it */ 26815 if (data_bufp) { 26816 kmem_free(data_bufp, data_len); 26817 } 26818 return (rval); 26819 } 26820 26821 26822 /* 26823 * Function: sr_change_blkmode() 26824 * 26825 * Description: This routine is the driver entry point for handling CD-ROM 26826 * block mode ioctl requests. Support for returning and changing 26827 * the current block size in use by the device is implemented. The 26828 * LBA size is changed via a MODE SELECT Block Descriptor. 26829 * 26830 * This routine issues a mode sense with an allocation length of 26831 * 12 bytes for the mode page header and a single block descriptor. 26832 * 26833 * Arguments: dev - the device 'dev_t' 26834 * cmd - the request type; one of CDROMGBLKMODE (get) or 26835 * CDROMSBLKMODE (set) 26836 * data - current block size or requested block size 26837 * flag - this argument is a pass through to ddi_copyxxx() directly 26838 * from the mode argument of ioctl(). 26839 * 26840 * Return Code: the code returned by sd_send_scsi_cmd() 26841 * EINVAL if invalid arguments are provided 26842 * EFAULT if ddi_copyxxx() fails 26843 * ENXIO if fail ddi_get_soft_state 26844 * EIO if invalid mode sense block descriptor length 26845 * 26846 */ 26847 26848 static int 26849 sr_change_blkmode(dev_t dev, int cmd, intptr_t data, int flag) 26850 { 26851 struct sd_lun *un = NULL; 26852 struct mode_header *sense_mhp, *select_mhp; 26853 struct block_descriptor *sense_desc, *select_desc; 26854 int current_bsize; 26855 int rval = EINVAL; 26856 uchar_t *sense = NULL; 26857 uchar_t *select = NULL; 26858 sd_ssc_t *ssc; 26859 26860 ASSERT((cmd == CDROMGBLKMODE) || (cmd == CDROMSBLKMODE)); 26861 26862 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 26863 return (ENXIO); 26864 } 26865 26866 /* 26867 * The block length is changed via the Mode Select block descriptor, the 26868 * "Read/Write Error Recovery" mode page (0x1) contents are not actually 26869 * required as part of this routine. Therefore the mode sense allocation 26870 * length is specified to be the length of a mode page header and a 26871 * block descriptor. 26872 */ 26873 sense = kmem_zalloc(BUFLEN_CHG_BLK_MODE, KM_SLEEP); 26874 26875 ssc = sd_ssc_init(un); 26876 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense, 26877 BUFLEN_CHG_BLK_MODE, MODEPAGE_ERR_RECOV, SD_PATH_STANDARD); 26878 sd_ssc_fini(ssc); 26879 if (rval != 0) { 26880 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26881 "sr_change_blkmode: Mode Sense Failed\n"); 26882 kmem_free(sense, BUFLEN_CHG_BLK_MODE); 26883 return (rval); 26884 } 26885 26886 /* Check the block descriptor len to handle only 1 block descriptor */ 26887 sense_mhp = (struct mode_header *)sense; 26888 if ((sense_mhp->bdesc_length == 0) || 26889 (sense_mhp->bdesc_length > MODE_BLK_DESC_LENGTH)) { 26890 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26891 "sr_change_blkmode: Mode Sense returned invalid block" 26892 " descriptor length\n"); 26893 kmem_free(sense, BUFLEN_CHG_BLK_MODE); 26894 return (EIO); 26895 } 26896 sense_desc = (struct block_descriptor *)(sense + MODE_HEADER_LENGTH); 26897 current_bsize = ((sense_desc->blksize_hi << 16) | 26898 (sense_desc->blksize_mid << 8) | sense_desc->blksize_lo); 26899 26900 /* Process command */ 26901 switch (cmd) { 26902 case CDROMGBLKMODE: 26903 /* Return the block size obtained during the mode sense */ 26904 if (ddi_copyout(¤t_bsize, (void *)data, 26905 sizeof (int), flag) != 0) 26906 rval = EFAULT; 26907 break; 26908 case CDROMSBLKMODE: 26909 /* Validate the requested block size */ 26910 switch (data) { 26911 case CDROM_BLK_512: 26912 case CDROM_BLK_1024: 26913 case CDROM_BLK_2048: 26914 case CDROM_BLK_2056: 26915 case CDROM_BLK_2336: 26916 case CDROM_BLK_2340: 26917 case CDROM_BLK_2352: 26918 case CDROM_BLK_2368: 26919 case CDROM_BLK_2448: 26920 case CDROM_BLK_2646: 26921 case CDROM_BLK_2647: 26922 break; 26923 default: 26924 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26925 "sr_change_blkmode: " 26926 "Block Size '%ld' Not Supported\n", data); 26927 kmem_free(sense, BUFLEN_CHG_BLK_MODE); 26928 return (EINVAL); 26929 } 26930 26931 /* 26932 * The current block size matches the requested block size so 26933 * there is no need to send the mode select to change the size 26934 */ 26935 if (current_bsize == data) { 26936 break; 26937 } 26938 26939 /* Build the select data for the requested block size */ 26940 select = kmem_zalloc(BUFLEN_CHG_BLK_MODE, KM_SLEEP); 26941 select_mhp = (struct mode_header *)select; 26942 select_desc = 26943 (struct block_descriptor *)(select + MODE_HEADER_LENGTH); 26944 /* 26945 * The LBA size is changed via the block descriptor, so the 26946 * descriptor is built according to the user data 26947 */ 26948 select_mhp->bdesc_length = MODE_BLK_DESC_LENGTH; 26949 select_desc->blksize_hi = (char)(((data) & 0x00ff0000) >> 16); 26950 select_desc->blksize_mid = (char)(((data) & 0x0000ff00) >> 8); 26951 select_desc->blksize_lo = (char)((data) & 0x000000ff); 26952 26953 /* Send the mode select for the requested block size */ 26954 ssc = sd_ssc_init(un); 26955 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, 26956 select, BUFLEN_CHG_BLK_MODE, SD_DONTSAVE_PAGE, 26957 SD_PATH_STANDARD); 26958 sd_ssc_fini(ssc); 26959 if (rval != 0) { 26960 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26961 "sr_change_blkmode: Mode Select Failed\n"); 26962 /* 26963 * The mode select failed for the requested block size, 26964 * so reset the data for the original block size and 26965 * send it to the target. The error is indicated by the 26966 * return value for the failed mode select. 26967 */ 26968 select_desc->blksize_hi = sense_desc->blksize_hi; 26969 select_desc->blksize_mid = sense_desc->blksize_mid; 26970 select_desc->blksize_lo = sense_desc->blksize_lo; 26971 ssc = sd_ssc_init(un); 26972 (void) sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, 26973 select, BUFLEN_CHG_BLK_MODE, SD_DONTSAVE_PAGE, 26974 SD_PATH_STANDARD); 26975 sd_ssc_fini(ssc); 26976 } else { 26977 ASSERT(!mutex_owned(SD_MUTEX(un))); 26978 mutex_enter(SD_MUTEX(un)); 26979 sd_update_block_info(un, (uint32_t)data, 0); 26980 mutex_exit(SD_MUTEX(un)); 26981 } 26982 break; 26983 default: 26984 /* should not reach here, but check anyway */ 26985 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26986 "sr_change_blkmode: Command '%x' Not Supported\n", cmd); 26987 rval = EINVAL; 26988 break; 26989 } 26990 26991 if (select) { 26992 kmem_free(select, BUFLEN_CHG_BLK_MODE); 26993 } 26994 if (sense) { 26995 kmem_free(sense, BUFLEN_CHG_BLK_MODE); 26996 } 26997 return (rval); 26998 } 26999 27000 27001 /* 27002 * Note: The following sr_change_speed() and sr_atapi_change_speed() routines 27003 * implement driver support for getting and setting the CD speed. The command 27004 * set used will be based on the device type. If the device has not been 27005 * identified as MMC the Toshiba vendor specific mode page will be used. If 27006 * the device is MMC but does not support the Real Time Streaming feature 27007 * the SET CD SPEED command will be used to set speed and mode page 0x2A will 27008 * be used to read the speed. 27009 */ 27010 27011 /* 27012 * Function: sr_change_speed() 27013 * 27014 * Description: This routine is the driver entry point for handling CD-ROM 27015 * drive speed ioctl requests for devices supporting the Toshiba 27016 * vendor specific drive speed mode page. Support for returning 27017 * and changing the current drive speed in use by the device is 27018 * implemented. 27019 * 27020 * Arguments: dev - the device 'dev_t' 27021 * cmd - the request type; one of CDROMGDRVSPEED (get) or 27022 * CDROMSDRVSPEED (set) 27023 * data - current drive speed or requested drive speed 27024 * flag - this argument is a pass through to ddi_copyxxx() directly 27025 * from the mode argument of ioctl(). 27026 * 27027 * Return Code: the code returned by sd_send_scsi_cmd() 27028 * EINVAL if invalid arguments are provided 27029 * EFAULT if ddi_copyxxx() fails 27030 * ENXIO if fail ddi_get_soft_state 27031 * EIO if invalid mode sense block descriptor length 27032 */ 27033 27034 static int 27035 sr_change_speed(dev_t dev, int cmd, intptr_t data, int flag) 27036 { 27037 struct sd_lun *un = NULL; 27038 struct mode_header *sense_mhp, *select_mhp; 27039 struct mode_speed *sense_page, *select_page; 27040 int current_speed; 27041 int rval = EINVAL; 27042 int bd_len; 27043 uchar_t *sense = NULL; 27044 uchar_t *select = NULL; 27045 sd_ssc_t *ssc; 27046 27047 ASSERT((cmd == CDROMGDRVSPEED) || (cmd == CDROMSDRVSPEED)); 27048 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 27049 return (ENXIO); 27050 } 27051 27052 /* 27053 * Note: The drive speed is being modified here according to a Toshiba 27054 * vendor specific mode page (0x31). 27055 */ 27056 sense = kmem_zalloc(BUFLEN_MODE_CDROM_SPEED, KM_SLEEP); 27057 27058 ssc = sd_ssc_init(un); 27059 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense, 27060 BUFLEN_MODE_CDROM_SPEED, CDROM_MODE_SPEED, 27061 SD_PATH_STANDARD); 27062 sd_ssc_fini(ssc); 27063 if (rval != 0) { 27064 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27065 "sr_change_speed: Mode Sense Failed\n"); 27066 kmem_free(sense, BUFLEN_MODE_CDROM_SPEED); 27067 return (rval); 27068 } 27069 sense_mhp = (struct mode_header *)sense; 27070 27071 /* Check the block descriptor len to handle only 1 block descriptor */ 27072 bd_len = sense_mhp->bdesc_length; 27073 if (bd_len > MODE_BLK_DESC_LENGTH) { 27074 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27075 "sr_change_speed: Mode Sense returned invalid block " 27076 "descriptor length\n"); 27077 kmem_free(sense, BUFLEN_MODE_CDROM_SPEED); 27078 return (EIO); 27079 } 27080 27081 sense_page = (struct mode_speed *) 27082 (sense + MODE_HEADER_LENGTH + sense_mhp->bdesc_length); 27083 current_speed = sense_page->speed; 27084 27085 /* Process command */ 27086 switch (cmd) { 27087 case CDROMGDRVSPEED: 27088 /* Return the drive speed obtained during the mode sense */ 27089 if (current_speed == 0x2) { 27090 current_speed = CDROM_TWELVE_SPEED; 27091 } 27092 if (ddi_copyout(¤t_speed, (void *)data, 27093 sizeof (int), flag) != 0) { 27094 rval = EFAULT; 27095 } 27096 break; 27097 case CDROMSDRVSPEED: 27098 /* Validate the requested drive speed */ 27099 switch ((uchar_t)data) { 27100 case CDROM_TWELVE_SPEED: 27101 data = 0x2; 27102 /*FALLTHROUGH*/ 27103 case CDROM_NORMAL_SPEED: 27104 case CDROM_DOUBLE_SPEED: 27105 case CDROM_QUAD_SPEED: 27106 case CDROM_MAXIMUM_SPEED: 27107 break; 27108 default: 27109 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27110 "sr_change_speed: " 27111 "Drive Speed '%d' Not Supported\n", (uchar_t)data); 27112 kmem_free(sense, BUFLEN_MODE_CDROM_SPEED); 27113 return (EINVAL); 27114 } 27115 27116 /* 27117 * The current drive speed matches the requested drive speed so 27118 * there is no need to send the mode select to change the speed 27119 */ 27120 if (current_speed == data) { 27121 break; 27122 } 27123 27124 /* Build the select data for the requested drive speed */ 27125 select = kmem_zalloc(BUFLEN_MODE_CDROM_SPEED, KM_SLEEP); 27126 select_mhp = (struct mode_header *)select; 27127 select_mhp->bdesc_length = 0; 27128 select_page = 27129 (struct mode_speed *)(select + MODE_HEADER_LENGTH); 27130 select_page = 27131 (struct mode_speed *)(select + MODE_HEADER_LENGTH); 27132 select_page->mode_page.code = CDROM_MODE_SPEED; 27133 select_page->mode_page.length = 2; 27134 select_page->speed = (uchar_t)data; 27135 27136 /* Send the mode select for the requested block size */ 27137 ssc = sd_ssc_init(un); 27138 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select, 27139 MODEPAGE_CDROM_SPEED_LEN + MODE_HEADER_LENGTH, 27140 SD_DONTSAVE_PAGE, SD_PATH_STANDARD); 27141 sd_ssc_fini(ssc); 27142 if (rval != 0) { 27143 /* 27144 * The mode select failed for the requested drive speed, 27145 * so reset the data for the original drive speed and 27146 * send it to the target. The error is indicated by the 27147 * return value for the failed mode select. 27148 */ 27149 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27150 "sr_drive_speed: Mode Select Failed\n"); 27151 select_page->speed = sense_page->speed; 27152 ssc = sd_ssc_init(un); 27153 (void) sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select, 27154 MODEPAGE_CDROM_SPEED_LEN + MODE_HEADER_LENGTH, 27155 SD_DONTSAVE_PAGE, SD_PATH_STANDARD); 27156 sd_ssc_fini(ssc); 27157 } 27158 break; 27159 default: 27160 /* should not reach here, but check anyway */ 27161 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27162 "sr_change_speed: Command '%x' Not Supported\n", cmd); 27163 rval = EINVAL; 27164 break; 27165 } 27166 27167 if (select) { 27168 kmem_free(select, BUFLEN_MODE_CDROM_SPEED); 27169 } 27170 if (sense) { 27171 kmem_free(sense, BUFLEN_MODE_CDROM_SPEED); 27172 } 27173 27174 return (rval); 27175 } 27176 27177 27178 /* 27179 * Function: sr_atapi_change_speed() 27180 * 27181 * Description: This routine is the driver entry point for handling CD-ROM 27182 * drive speed ioctl requests for MMC devices that do not support 27183 * the Real Time Streaming feature (0x107). 27184 * 27185 * Note: This routine will use the SET SPEED command which may not 27186 * be supported by all devices. 27187 * 27188 * Arguments: dev- the device 'dev_t' 27189 * cmd- the request type; one of CDROMGDRVSPEED (get) or 27190 * CDROMSDRVSPEED (set) 27191 * data- current drive speed or requested drive speed 27192 * flag- this argument is a pass through to ddi_copyxxx() directly 27193 * from the mode argument of ioctl(). 27194 * 27195 * Return Code: the code returned by sd_send_scsi_cmd() 27196 * EINVAL if invalid arguments are provided 27197 * EFAULT if ddi_copyxxx() fails 27198 * ENXIO if fail ddi_get_soft_state 27199 * EIO if invalid mode sense block descriptor length 27200 */ 27201 27202 static int 27203 sr_atapi_change_speed(dev_t dev, int cmd, intptr_t data, int flag) 27204 { 27205 struct sd_lun *un; 27206 struct uscsi_cmd *com = NULL; 27207 struct mode_header_grp2 *sense_mhp; 27208 uchar_t *sense_page; 27209 uchar_t *sense = NULL; 27210 char cdb[CDB_GROUP5]; 27211 int bd_len; 27212 int current_speed = 0; 27213 int max_speed = 0; 27214 int rval; 27215 sd_ssc_t *ssc; 27216 27217 ASSERT((cmd == CDROMGDRVSPEED) || (cmd == CDROMSDRVSPEED)); 27218 27219 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 27220 return (ENXIO); 27221 } 27222 27223 sense = kmem_zalloc(BUFLEN_MODE_CDROM_CAP, KM_SLEEP); 27224 27225 ssc = sd_ssc_init(un); 27226 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, sense, 27227 BUFLEN_MODE_CDROM_CAP, MODEPAGE_CDROM_CAP, 27228 SD_PATH_STANDARD); 27229 sd_ssc_fini(ssc); 27230 if (rval != 0) { 27231 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27232 "sr_atapi_change_speed: Mode Sense Failed\n"); 27233 kmem_free(sense, BUFLEN_MODE_CDROM_CAP); 27234 return (rval); 27235 } 27236 27237 /* Check the block descriptor len to handle only 1 block descriptor */ 27238 sense_mhp = (struct mode_header_grp2 *)sense; 27239 bd_len = (sense_mhp->bdesc_length_hi << 8) | sense_mhp->bdesc_length_lo; 27240 if (bd_len > MODE_BLK_DESC_LENGTH) { 27241 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27242 "sr_atapi_change_speed: Mode Sense returned invalid " 27243 "block descriptor length\n"); 27244 kmem_free(sense, BUFLEN_MODE_CDROM_CAP); 27245 return (EIO); 27246 } 27247 27248 /* Calculate the current and maximum drive speeds */ 27249 sense_page = (uchar_t *)(sense + MODE_HEADER_LENGTH_GRP2 + bd_len); 27250 current_speed = (sense_page[14] << 8) | sense_page[15]; 27251 max_speed = (sense_page[8] << 8) | sense_page[9]; 27252 27253 /* Process the command */ 27254 switch (cmd) { 27255 case CDROMGDRVSPEED: 27256 current_speed /= SD_SPEED_1X; 27257 if (ddi_copyout(¤t_speed, (void *)data, 27258 sizeof (int), flag) != 0) 27259 rval = EFAULT; 27260 break; 27261 case CDROMSDRVSPEED: 27262 /* Convert the speed code to KB/sec */ 27263 switch ((uchar_t)data) { 27264 case CDROM_NORMAL_SPEED: 27265 current_speed = SD_SPEED_1X; 27266 break; 27267 case CDROM_DOUBLE_SPEED: 27268 current_speed = 2 * SD_SPEED_1X; 27269 break; 27270 case CDROM_QUAD_SPEED: 27271 current_speed = 4 * SD_SPEED_1X; 27272 break; 27273 case CDROM_TWELVE_SPEED: 27274 current_speed = 12 * SD_SPEED_1X; 27275 break; 27276 case CDROM_MAXIMUM_SPEED: 27277 current_speed = 0xffff; 27278 break; 27279 default: 27280 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27281 "sr_atapi_change_speed: invalid drive speed %d\n", 27282 (uchar_t)data); 27283 kmem_free(sense, BUFLEN_MODE_CDROM_CAP); 27284 return (EINVAL); 27285 } 27286 27287 /* Check the request against the drive's max speed. */ 27288 if (current_speed != 0xffff) { 27289 if (current_speed > max_speed) { 27290 kmem_free(sense, BUFLEN_MODE_CDROM_CAP); 27291 return (EINVAL); 27292 } 27293 } 27294 27295 /* 27296 * Build and send the SET SPEED command 27297 * 27298 * Note: The SET SPEED (0xBB) command used in this routine is 27299 * obsolete per the SCSI MMC spec but still supported in the 27300 * MT FUJI vendor spec. Most equipment is adhereing to MT FUJI 27301 * therefore the command is still implemented in this routine. 27302 */ 27303 bzero(cdb, sizeof (cdb)); 27304 cdb[0] = (char)SCMD_SET_CDROM_SPEED; 27305 cdb[2] = (uchar_t)(current_speed >> 8); 27306 cdb[3] = (uchar_t)current_speed; 27307 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27308 com->uscsi_cdb = (caddr_t)cdb; 27309 com->uscsi_cdblen = CDB_GROUP5; 27310 com->uscsi_bufaddr = NULL; 27311 com->uscsi_buflen = 0; 27312 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT; 27313 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, 0, SD_PATH_STANDARD); 27314 break; 27315 default: 27316 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27317 "sr_atapi_change_speed: Command '%x' Not Supported\n", cmd); 27318 rval = EINVAL; 27319 } 27320 27321 if (sense) { 27322 kmem_free(sense, BUFLEN_MODE_CDROM_CAP); 27323 } 27324 if (com) { 27325 kmem_free(com, sizeof (*com)); 27326 } 27327 return (rval); 27328 } 27329 27330 27331 /* 27332 * Function: sr_pause_resume() 27333 * 27334 * Description: This routine is the driver entry point for handling CD-ROM 27335 * pause/resume ioctl requests. This only affects the audio play 27336 * operation. 27337 * 27338 * Arguments: dev - the device 'dev_t' 27339 * cmd - the request type; one of CDROMPAUSE or CDROMRESUME, used 27340 * for setting the resume bit of the cdb. 27341 * 27342 * Return Code: the code returned by sd_send_scsi_cmd() 27343 * EINVAL if invalid mode specified 27344 * 27345 */ 27346 27347 static int 27348 sr_pause_resume(dev_t dev, int cmd) 27349 { 27350 struct sd_lun *un; 27351 struct uscsi_cmd *com; 27352 char cdb[CDB_GROUP1]; 27353 int rval; 27354 27355 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 27356 return (ENXIO); 27357 } 27358 27359 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27360 bzero(cdb, CDB_GROUP1); 27361 cdb[0] = SCMD_PAUSE_RESUME; 27362 switch (cmd) { 27363 case CDROMRESUME: 27364 cdb[8] = 1; 27365 break; 27366 case CDROMPAUSE: 27367 cdb[8] = 0; 27368 break; 27369 default: 27370 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_pause_resume:" 27371 " Command '%x' Not Supported\n", cmd); 27372 rval = EINVAL; 27373 goto done; 27374 } 27375 27376 com->uscsi_cdb = cdb; 27377 com->uscsi_cdblen = CDB_GROUP1; 27378 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT; 27379 27380 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27381 SD_PATH_STANDARD); 27382 27383 done: 27384 kmem_free(com, sizeof (*com)); 27385 return (rval); 27386 } 27387 27388 27389 /* 27390 * Function: sr_play_msf() 27391 * 27392 * Description: This routine is the driver entry point for handling CD-ROM 27393 * ioctl requests to output the audio signals at the specified 27394 * starting address and continue the audio play until the specified 27395 * ending address (CDROMPLAYMSF) The address is in Minute Second 27396 * Frame (MSF) format. 27397 * 27398 * Arguments: dev - the device 'dev_t' 27399 * data - pointer to user provided audio msf structure, 27400 * specifying start/end addresses. 27401 * flag - this argument is a pass through to ddi_copyxxx() 27402 * directly from the mode argument of ioctl(). 27403 * 27404 * Return Code: the code returned by sd_send_scsi_cmd() 27405 * EFAULT if ddi_copyxxx() fails 27406 * ENXIO if fail ddi_get_soft_state 27407 * EINVAL if data pointer is NULL 27408 */ 27409 27410 static int 27411 sr_play_msf(dev_t dev, caddr_t data, int flag) 27412 { 27413 struct sd_lun *un; 27414 struct uscsi_cmd *com; 27415 struct cdrom_msf msf_struct; 27416 struct cdrom_msf *msf = &msf_struct; 27417 char cdb[CDB_GROUP1]; 27418 int rval; 27419 27420 if (data == NULL) { 27421 return (EINVAL); 27422 } 27423 27424 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 27425 return (ENXIO); 27426 } 27427 27428 if (ddi_copyin(data, msf, sizeof (struct cdrom_msf), flag)) { 27429 return (EFAULT); 27430 } 27431 27432 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27433 bzero(cdb, CDB_GROUP1); 27434 cdb[0] = SCMD_PLAYAUDIO_MSF; 27435 if (un->un_f_cfg_playmsf_bcd == TRUE) { 27436 cdb[3] = BYTE_TO_BCD(msf->cdmsf_min0); 27437 cdb[4] = BYTE_TO_BCD(msf->cdmsf_sec0); 27438 cdb[5] = BYTE_TO_BCD(msf->cdmsf_frame0); 27439 cdb[6] = BYTE_TO_BCD(msf->cdmsf_min1); 27440 cdb[7] = BYTE_TO_BCD(msf->cdmsf_sec1); 27441 cdb[8] = BYTE_TO_BCD(msf->cdmsf_frame1); 27442 } else { 27443 cdb[3] = msf->cdmsf_min0; 27444 cdb[4] = msf->cdmsf_sec0; 27445 cdb[5] = msf->cdmsf_frame0; 27446 cdb[6] = msf->cdmsf_min1; 27447 cdb[7] = msf->cdmsf_sec1; 27448 cdb[8] = msf->cdmsf_frame1; 27449 } 27450 com->uscsi_cdb = cdb; 27451 com->uscsi_cdblen = CDB_GROUP1; 27452 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT; 27453 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27454 SD_PATH_STANDARD); 27455 kmem_free(com, sizeof (*com)); 27456 return (rval); 27457 } 27458 27459 27460 /* 27461 * Function: sr_play_trkind() 27462 * 27463 * Description: This routine is the driver entry point for handling CD-ROM 27464 * ioctl requests to output the audio signals at the specified 27465 * starting address and continue the audio play until the specified 27466 * ending address (CDROMPLAYTRKIND). The address is in Track Index 27467 * format. 27468 * 27469 * Arguments: dev - the device 'dev_t' 27470 * data - pointer to user provided audio track/index structure, 27471 * specifying start/end addresses. 27472 * flag - this argument is a pass through to ddi_copyxxx() 27473 * directly from the mode argument of ioctl(). 27474 * 27475 * Return Code: the code returned by sd_send_scsi_cmd() 27476 * EFAULT if ddi_copyxxx() fails 27477 * ENXIO if fail ddi_get_soft_state 27478 * EINVAL if data pointer is NULL 27479 */ 27480 27481 static int 27482 sr_play_trkind(dev_t dev, caddr_t data, int flag) 27483 { 27484 struct cdrom_ti ti_struct; 27485 struct cdrom_ti *ti = &ti_struct; 27486 struct uscsi_cmd *com = NULL; 27487 char cdb[CDB_GROUP1]; 27488 int rval; 27489 27490 if (data == NULL) { 27491 return (EINVAL); 27492 } 27493 27494 if (ddi_copyin(data, ti, sizeof (struct cdrom_ti), flag)) { 27495 return (EFAULT); 27496 } 27497 27498 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27499 bzero(cdb, CDB_GROUP1); 27500 cdb[0] = SCMD_PLAYAUDIO_TI; 27501 cdb[4] = ti->cdti_trk0; 27502 cdb[5] = ti->cdti_ind0; 27503 cdb[7] = ti->cdti_trk1; 27504 cdb[8] = ti->cdti_ind1; 27505 com->uscsi_cdb = cdb; 27506 com->uscsi_cdblen = CDB_GROUP1; 27507 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT; 27508 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27509 SD_PATH_STANDARD); 27510 kmem_free(com, sizeof (*com)); 27511 return (rval); 27512 } 27513 27514 27515 /* 27516 * Function: sr_read_all_subcodes() 27517 * 27518 * Description: This routine is the driver entry point for handling CD-ROM 27519 * ioctl requests to return raw subcode data while the target is 27520 * playing audio (CDROMSUBCODE). 27521 * 27522 * Arguments: dev - the device 'dev_t' 27523 * data - pointer to user provided cdrom subcode structure, 27524 * specifying the transfer length and address. 27525 * flag - this argument is a pass through to ddi_copyxxx() 27526 * directly from the mode argument of ioctl(). 27527 * 27528 * Return Code: the code returned by sd_send_scsi_cmd() 27529 * EFAULT if ddi_copyxxx() fails 27530 * ENXIO if fail ddi_get_soft_state 27531 * EINVAL if data pointer is NULL 27532 */ 27533 27534 static int 27535 sr_read_all_subcodes(dev_t dev, caddr_t data, int flag) 27536 { 27537 struct sd_lun *un = NULL; 27538 struct uscsi_cmd *com = NULL; 27539 struct cdrom_subcode *subcode = NULL; 27540 int rval; 27541 size_t buflen; 27542 char cdb[CDB_GROUP5]; 27543 27544 #ifdef _MULTI_DATAMODEL 27545 /* To support ILP32 applications in an LP64 world */ 27546 struct cdrom_subcode32 cdrom_subcode32; 27547 struct cdrom_subcode32 *cdsc32 = &cdrom_subcode32; 27548 #endif 27549 if (data == NULL) { 27550 return (EINVAL); 27551 } 27552 27553 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 27554 return (ENXIO); 27555 } 27556 27557 subcode = kmem_zalloc(sizeof (struct cdrom_subcode), KM_SLEEP); 27558 27559 #ifdef _MULTI_DATAMODEL 27560 switch (ddi_model_convert_from(flag & FMODELS)) { 27561 case DDI_MODEL_ILP32: 27562 if (ddi_copyin(data, cdsc32, sizeof (*cdsc32), flag)) { 27563 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27564 "sr_read_all_subcodes: ddi_copyin Failed\n"); 27565 kmem_free(subcode, sizeof (struct cdrom_subcode)); 27566 return (EFAULT); 27567 } 27568 /* Convert the ILP32 uscsi data from the application to LP64 */ 27569 cdrom_subcode32tocdrom_subcode(cdsc32, subcode); 27570 break; 27571 case DDI_MODEL_NONE: 27572 if (ddi_copyin(data, subcode, 27573 sizeof (struct cdrom_subcode), flag)) { 27574 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27575 "sr_read_all_subcodes: ddi_copyin Failed\n"); 27576 kmem_free(subcode, sizeof (struct cdrom_subcode)); 27577 return (EFAULT); 27578 } 27579 break; 27580 } 27581 #else /* ! _MULTI_DATAMODEL */ 27582 if (ddi_copyin(data, subcode, sizeof (struct cdrom_subcode), flag)) { 27583 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27584 "sr_read_all_subcodes: ddi_copyin Failed\n"); 27585 kmem_free(subcode, sizeof (struct cdrom_subcode)); 27586 return (EFAULT); 27587 } 27588 #endif /* _MULTI_DATAMODEL */ 27589 27590 /* 27591 * Since MMC-2 expects max 3 bytes for length, check if the 27592 * length input is greater than 3 bytes 27593 */ 27594 if ((subcode->cdsc_length & 0xFF000000) != 0) { 27595 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27596 "sr_read_all_subcodes: " 27597 "cdrom transfer length too large: %d (limit %d)\n", 27598 subcode->cdsc_length, 0xFFFFFF); 27599 kmem_free(subcode, sizeof (struct cdrom_subcode)); 27600 return (EINVAL); 27601 } 27602 27603 buflen = CDROM_BLK_SUBCODE * subcode->cdsc_length; 27604 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27605 bzero(cdb, CDB_GROUP5); 27606 27607 if (un->un_f_mmc_cap == TRUE) { 27608 cdb[0] = (char)SCMD_READ_CD; 27609 cdb[2] = (char)0xff; 27610 cdb[3] = (char)0xff; 27611 cdb[4] = (char)0xff; 27612 cdb[5] = (char)0xff; 27613 cdb[6] = (((subcode->cdsc_length) & 0x00ff0000) >> 16); 27614 cdb[7] = (((subcode->cdsc_length) & 0x0000ff00) >> 8); 27615 cdb[8] = ((subcode->cdsc_length) & 0x000000ff); 27616 cdb[10] = 1; 27617 } else { 27618 /* 27619 * Note: A vendor specific command (0xDF) is being used here to 27620 * request a read of all subcodes. 27621 */ 27622 cdb[0] = (char)SCMD_READ_ALL_SUBCODES; 27623 cdb[6] = (((subcode->cdsc_length) & 0xff000000) >> 24); 27624 cdb[7] = (((subcode->cdsc_length) & 0x00ff0000) >> 16); 27625 cdb[8] = (((subcode->cdsc_length) & 0x0000ff00) >> 8); 27626 cdb[9] = ((subcode->cdsc_length) & 0x000000ff); 27627 } 27628 com->uscsi_cdb = cdb; 27629 com->uscsi_cdblen = CDB_GROUP5; 27630 com->uscsi_bufaddr = (caddr_t)subcode->cdsc_addr; 27631 com->uscsi_buflen = buflen; 27632 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 27633 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE, 27634 SD_PATH_STANDARD); 27635 kmem_free(subcode, sizeof (struct cdrom_subcode)); 27636 kmem_free(com, sizeof (*com)); 27637 return (rval); 27638 } 27639 27640 27641 /* 27642 * Function: sr_read_subchannel() 27643 * 27644 * Description: This routine is the driver entry point for handling CD-ROM 27645 * ioctl requests to return the Q sub-channel data of the CD 27646 * current position block. (CDROMSUBCHNL) The data includes the 27647 * track number, index number, absolute CD-ROM address (LBA or MSF 27648 * format per the user) , track relative CD-ROM address (LBA or MSF 27649 * format per the user), control data and audio status. 27650 * 27651 * Arguments: dev - the device 'dev_t' 27652 * data - pointer to user provided cdrom sub-channel structure 27653 * flag - this argument is a pass through to ddi_copyxxx() 27654 * directly from the mode argument of ioctl(). 27655 * 27656 * Return Code: the code returned by sd_send_scsi_cmd() 27657 * EFAULT if ddi_copyxxx() fails 27658 * ENXIO if fail ddi_get_soft_state 27659 * EINVAL if data pointer is NULL 27660 */ 27661 27662 static int 27663 sr_read_subchannel(dev_t dev, caddr_t data, int flag) 27664 { 27665 struct sd_lun *un; 27666 struct uscsi_cmd *com; 27667 struct cdrom_subchnl subchanel; 27668 struct cdrom_subchnl *subchnl = &subchanel; 27669 char cdb[CDB_GROUP1]; 27670 caddr_t buffer; 27671 int rval; 27672 27673 if (data == NULL) { 27674 return (EINVAL); 27675 } 27676 27677 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 27678 (un->un_state == SD_STATE_OFFLINE)) { 27679 return (ENXIO); 27680 } 27681 27682 if (ddi_copyin(data, subchnl, sizeof (struct cdrom_subchnl), flag)) { 27683 return (EFAULT); 27684 } 27685 27686 buffer = kmem_zalloc((size_t)16, KM_SLEEP); 27687 bzero(cdb, CDB_GROUP1); 27688 cdb[0] = SCMD_READ_SUBCHANNEL; 27689 /* Set the MSF bit based on the user requested address format */ 27690 cdb[1] = (subchnl->cdsc_format & CDROM_LBA) ? 0 : 0x02; 27691 /* 27692 * Set the Q bit in byte 2 to indicate that Q sub-channel data be 27693 * returned 27694 */ 27695 cdb[2] = 0x40; 27696 /* 27697 * Set byte 3 to specify the return data format. A value of 0x01 27698 * indicates that the CD-ROM current position should be returned. 27699 */ 27700 cdb[3] = 0x01; 27701 cdb[8] = 0x10; 27702 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27703 com->uscsi_cdb = cdb; 27704 com->uscsi_cdblen = CDB_GROUP1; 27705 com->uscsi_bufaddr = buffer; 27706 com->uscsi_buflen = 16; 27707 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 27708 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27709 SD_PATH_STANDARD); 27710 if (rval != 0) { 27711 kmem_free(buffer, 16); 27712 kmem_free(com, sizeof (*com)); 27713 return (rval); 27714 } 27715 27716 /* Process the returned Q sub-channel data */ 27717 subchnl->cdsc_audiostatus = buffer[1]; 27718 subchnl->cdsc_adr = (buffer[5] & 0xF0) >> 4; 27719 subchnl->cdsc_ctrl = (buffer[5] & 0x0F); 27720 subchnl->cdsc_trk = buffer[6]; 27721 subchnl->cdsc_ind = buffer[7]; 27722 if (subchnl->cdsc_format & CDROM_LBA) { 27723 subchnl->cdsc_absaddr.lba = 27724 ((uchar_t)buffer[8] << 24) + ((uchar_t)buffer[9] << 16) + 27725 ((uchar_t)buffer[10] << 8) + ((uchar_t)buffer[11]); 27726 subchnl->cdsc_reladdr.lba = 27727 ((uchar_t)buffer[12] << 24) + ((uchar_t)buffer[13] << 16) + 27728 ((uchar_t)buffer[14] << 8) + ((uchar_t)buffer[15]); 27729 } else if (un->un_f_cfg_readsub_bcd == TRUE) { 27730 subchnl->cdsc_absaddr.msf.minute = BCD_TO_BYTE(buffer[9]); 27731 subchnl->cdsc_absaddr.msf.second = BCD_TO_BYTE(buffer[10]); 27732 subchnl->cdsc_absaddr.msf.frame = BCD_TO_BYTE(buffer[11]); 27733 subchnl->cdsc_reladdr.msf.minute = BCD_TO_BYTE(buffer[13]); 27734 subchnl->cdsc_reladdr.msf.second = BCD_TO_BYTE(buffer[14]); 27735 subchnl->cdsc_reladdr.msf.frame = BCD_TO_BYTE(buffer[15]); 27736 } else { 27737 subchnl->cdsc_absaddr.msf.minute = buffer[9]; 27738 subchnl->cdsc_absaddr.msf.second = buffer[10]; 27739 subchnl->cdsc_absaddr.msf.frame = buffer[11]; 27740 subchnl->cdsc_reladdr.msf.minute = buffer[13]; 27741 subchnl->cdsc_reladdr.msf.second = buffer[14]; 27742 subchnl->cdsc_reladdr.msf.frame = buffer[15]; 27743 } 27744 kmem_free(buffer, 16); 27745 kmem_free(com, sizeof (*com)); 27746 if (ddi_copyout(subchnl, data, sizeof (struct cdrom_subchnl), flag) 27747 != 0) { 27748 return (EFAULT); 27749 } 27750 return (rval); 27751 } 27752 27753 27754 /* 27755 * Function: sr_read_tocentry() 27756 * 27757 * Description: This routine is the driver entry point for handling CD-ROM 27758 * ioctl requests to read from the Table of Contents (TOC) 27759 * (CDROMREADTOCENTRY). This routine provides the ADR and CTRL 27760 * fields, the starting address (LBA or MSF format per the user) 27761 * and the data mode if the user specified track is a data track. 27762 * 27763 * Note: The READ HEADER (0x44) command used in this routine is 27764 * obsolete per the SCSI MMC spec but still supported in the 27765 * MT FUJI vendor spec. Most equipment is adhereing to MT FUJI 27766 * therefore the command is still implemented in this routine. 27767 * 27768 * Arguments: dev - the device 'dev_t' 27769 * data - pointer to user provided toc entry structure, 27770 * specifying the track # and the address format 27771 * (LBA or MSF). 27772 * flag - this argument is a pass through to ddi_copyxxx() 27773 * directly from the mode argument of ioctl(). 27774 * 27775 * Return Code: the code returned by sd_send_scsi_cmd() 27776 * EFAULT if ddi_copyxxx() fails 27777 * ENXIO if fail ddi_get_soft_state 27778 * EINVAL if data pointer is NULL 27779 */ 27780 27781 static int 27782 sr_read_tocentry(dev_t dev, caddr_t data, int flag) 27783 { 27784 struct sd_lun *un = NULL; 27785 struct uscsi_cmd *com; 27786 struct cdrom_tocentry toc_entry; 27787 struct cdrom_tocentry *entry = &toc_entry; 27788 caddr_t buffer; 27789 int rval; 27790 char cdb[CDB_GROUP1]; 27791 27792 if (data == NULL) { 27793 return (EINVAL); 27794 } 27795 27796 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 27797 (un->un_state == SD_STATE_OFFLINE)) { 27798 return (ENXIO); 27799 } 27800 27801 if (ddi_copyin(data, entry, sizeof (struct cdrom_tocentry), flag)) { 27802 return (EFAULT); 27803 } 27804 27805 /* Validate the requested track and address format */ 27806 if (!(entry->cdte_format & (CDROM_LBA | CDROM_MSF))) { 27807 return (EINVAL); 27808 } 27809 27810 if (entry->cdte_track == 0) { 27811 return (EINVAL); 27812 } 27813 27814 buffer = kmem_zalloc((size_t)12, KM_SLEEP); 27815 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27816 bzero(cdb, CDB_GROUP1); 27817 27818 cdb[0] = SCMD_READ_TOC; 27819 /* Set the MSF bit based on the user requested address format */ 27820 cdb[1] = ((entry->cdte_format & CDROM_LBA) ? 0 : 2); 27821 if (un->un_f_cfg_read_toc_trk_bcd == TRUE) { 27822 cdb[6] = BYTE_TO_BCD(entry->cdte_track); 27823 } else { 27824 cdb[6] = entry->cdte_track; 27825 } 27826 27827 /* 27828 * Bytes 7 & 8 are the 12 byte allocation length for a single entry. 27829 * (4 byte TOC response header + 8 byte track descriptor) 27830 */ 27831 cdb[8] = 12; 27832 com->uscsi_cdb = cdb; 27833 com->uscsi_cdblen = CDB_GROUP1; 27834 com->uscsi_bufaddr = buffer; 27835 com->uscsi_buflen = 0x0C; 27836 com->uscsi_flags = (USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ); 27837 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27838 SD_PATH_STANDARD); 27839 if (rval != 0) { 27840 kmem_free(buffer, 12); 27841 kmem_free(com, sizeof (*com)); 27842 return (rval); 27843 } 27844 27845 /* Process the toc entry */ 27846 entry->cdte_adr = (buffer[5] & 0xF0) >> 4; 27847 entry->cdte_ctrl = (buffer[5] & 0x0F); 27848 if (entry->cdte_format & CDROM_LBA) { 27849 entry->cdte_addr.lba = 27850 ((uchar_t)buffer[8] << 24) + ((uchar_t)buffer[9] << 16) + 27851 ((uchar_t)buffer[10] << 8) + ((uchar_t)buffer[11]); 27852 } else if (un->un_f_cfg_read_toc_addr_bcd == TRUE) { 27853 entry->cdte_addr.msf.minute = BCD_TO_BYTE(buffer[9]); 27854 entry->cdte_addr.msf.second = BCD_TO_BYTE(buffer[10]); 27855 entry->cdte_addr.msf.frame = BCD_TO_BYTE(buffer[11]); 27856 /* 27857 * Send a READ TOC command using the LBA address format to get 27858 * the LBA for the track requested so it can be used in the 27859 * READ HEADER request 27860 * 27861 * Note: The MSF bit of the READ HEADER command specifies the 27862 * output format. The block address specified in that command 27863 * must be in LBA format. 27864 */ 27865 cdb[1] = 0; 27866 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27867 SD_PATH_STANDARD); 27868 if (rval != 0) { 27869 kmem_free(buffer, 12); 27870 kmem_free(com, sizeof (*com)); 27871 return (rval); 27872 } 27873 } else { 27874 entry->cdte_addr.msf.minute = buffer[9]; 27875 entry->cdte_addr.msf.second = buffer[10]; 27876 entry->cdte_addr.msf.frame = buffer[11]; 27877 /* 27878 * Send a READ TOC command using the LBA address format to get 27879 * the LBA for the track requested so it can be used in the 27880 * READ HEADER request 27881 * 27882 * Note: The MSF bit of the READ HEADER command specifies the 27883 * output format. The block address specified in that command 27884 * must be in LBA format. 27885 */ 27886 cdb[1] = 0; 27887 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27888 SD_PATH_STANDARD); 27889 if (rval != 0) { 27890 kmem_free(buffer, 12); 27891 kmem_free(com, sizeof (*com)); 27892 return (rval); 27893 } 27894 } 27895 27896 /* 27897 * Build and send the READ HEADER command to determine the data mode of 27898 * the user specified track. 27899 */ 27900 if ((entry->cdte_ctrl & CDROM_DATA_TRACK) && 27901 (entry->cdte_track != CDROM_LEADOUT)) { 27902 bzero(cdb, CDB_GROUP1); 27903 cdb[0] = SCMD_READ_HEADER; 27904 cdb[2] = buffer[8]; 27905 cdb[3] = buffer[9]; 27906 cdb[4] = buffer[10]; 27907 cdb[5] = buffer[11]; 27908 cdb[8] = 0x08; 27909 com->uscsi_buflen = 0x08; 27910 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27911 SD_PATH_STANDARD); 27912 if (rval == 0) { 27913 entry->cdte_datamode = buffer[0]; 27914 } else { 27915 /* 27916 * READ HEADER command failed, since this is 27917 * obsoleted in one spec, its better to return 27918 * -1 for an invlid track so that we can still 27919 * receive the rest of the TOC data. 27920 */ 27921 entry->cdte_datamode = (uchar_t)-1; 27922 } 27923 } else { 27924 entry->cdte_datamode = (uchar_t)-1; 27925 } 27926 27927 kmem_free(buffer, 12); 27928 kmem_free(com, sizeof (*com)); 27929 if (ddi_copyout(entry, data, sizeof (struct cdrom_tocentry), flag) != 0) 27930 return (EFAULT); 27931 27932 return (rval); 27933 } 27934 27935 27936 /* 27937 * Function: sr_read_tochdr() 27938 * 27939 * Description: This routine is the driver entry point for handling CD-ROM 27940 * ioctl requests to read the Table of Contents (TOC) header 27941 * (CDROMREADTOHDR). The TOC header consists of the disk starting 27942 * and ending track numbers 27943 * 27944 * Arguments: dev - the device 'dev_t' 27945 * data - pointer to user provided toc header structure, 27946 * specifying the starting and ending track numbers. 27947 * flag - this argument is a pass through to ddi_copyxxx() 27948 * directly from the mode argument of ioctl(). 27949 * 27950 * Return Code: the code returned by sd_send_scsi_cmd() 27951 * EFAULT if ddi_copyxxx() fails 27952 * ENXIO if fail ddi_get_soft_state 27953 * EINVAL if data pointer is NULL 27954 */ 27955 27956 static int 27957 sr_read_tochdr(dev_t dev, caddr_t data, int flag) 27958 { 27959 struct sd_lun *un; 27960 struct uscsi_cmd *com; 27961 struct cdrom_tochdr toc_header; 27962 struct cdrom_tochdr *hdr = &toc_header; 27963 char cdb[CDB_GROUP1]; 27964 int rval; 27965 caddr_t buffer; 27966 27967 if (data == NULL) { 27968 return (EINVAL); 27969 } 27970 27971 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 27972 (un->un_state == SD_STATE_OFFLINE)) { 27973 return (ENXIO); 27974 } 27975 27976 buffer = kmem_zalloc(4, KM_SLEEP); 27977 bzero(cdb, CDB_GROUP1); 27978 cdb[0] = SCMD_READ_TOC; 27979 /* 27980 * Specifying a track number of 0x00 in the READ TOC command indicates 27981 * that the TOC header should be returned 27982 */ 27983 cdb[6] = 0x00; 27984 /* 27985 * Bytes 7 & 8 are the 4 byte allocation length for TOC header. 27986 * (2 byte data len + 1 byte starting track # + 1 byte ending track #) 27987 */ 27988 cdb[8] = 0x04; 27989 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27990 com->uscsi_cdb = cdb; 27991 com->uscsi_cdblen = CDB_GROUP1; 27992 com->uscsi_bufaddr = buffer; 27993 com->uscsi_buflen = 0x04; 27994 com->uscsi_timeout = 300; 27995 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 27996 27997 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27998 SD_PATH_STANDARD); 27999 if (un->un_f_cfg_read_toc_trk_bcd == TRUE) { 28000 hdr->cdth_trk0 = BCD_TO_BYTE(buffer[2]); 28001 hdr->cdth_trk1 = BCD_TO_BYTE(buffer[3]); 28002 } else { 28003 hdr->cdth_trk0 = buffer[2]; 28004 hdr->cdth_trk1 = buffer[3]; 28005 } 28006 kmem_free(buffer, 4); 28007 kmem_free(com, sizeof (*com)); 28008 if (ddi_copyout(hdr, data, sizeof (struct cdrom_tochdr), flag) != 0) { 28009 return (EFAULT); 28010 } 28011 return (rval); 28012 } 28013 28014 28015 /* 28016 * Note: The following sr_read_mode1(), sr_read_cd_mode2(), sr_read_mode2(), 28017 * sr_read_cdda(), sr_read_cdxa(), routines implement driver support for 28018 * handling CDROMREAD ioctl requests for mode 1 user data, mode 2 user data, 28019 * digital audio and extended architecture digital audio. These modes are 28020 * defined in the IEC908 (Red Book), ISO10149 (Yellow Book), and the SCSI3 28021 * MMC specs. 28022 * 28023 * In addition to support for the various data formats these routines also 28024 * include support for devices that implement only the direct access READ 28025 * commands (0x08, 0x28), devices that implement the READ_CD commands 28026 * (0xBE, 0xD4), and devices that implement the vendor unique READ CDDA and 28027 * READ CDXA commands (0xD8, 0xDB) 28028 */ 28029 28030 /* 28031 * Function: sr_read_mode1() 28032 * 28033 * Description: This routine is the driver entry point for handling CD-ROM 28034 * ioctl read mode1 requests (CDROMREADMODE1). 28035 * 28036 * Arguments: dev - the device 'dev_t' 28037 * data - pointer to user provided cd read structure specifying 28038 * the lba buffer address and length. 28039 * flag - this argument is a pass through to ddi_copyxxx() 28040 * directly from the mode argument of ioctl(). 28041 * 28042 * Return Code: the code returned by sd_send_scsi_cmd() 28043 * EFAULT if ddi_copyxxx() fails 28044 * ENXIO if fail ddi_get_soft_state 28045 * EINVAL if data pointer is NULL 28046 */ 28047 28048 static int 28049 sr_read_mode1(dev_t dev, caddr_t data, int flag) 28050 { 28051 struct sd_lun *un; 28052 struct cdrom_read mode1_struct; 28053 struct cdrom_read *mode1 = &mode1_struct; 28054 int rval; 28055 sd_ssc_t *ssc; 28056 28057 #ifdef _MULTI_DATAMODEL 28058 /* To support ILP32 applications in an LP64 world */ 28059 struct cdrom_read32 cdrom_read32; 28060 struct cdrom_read32 *cdrd32 = &cdrom_read32; 28061 #endif /* _MULTI_DATAMODEL */ 28062 28063 if (data == NULL) { 28064 return (EINVAL); 28065 } 28066 28067 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 28068 (un->un_state == SD_STATE_OFFLINE)) { 28069 return (ENXIO); 28070 } 28071 28072 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 28073 "sd_read_mode1: entry: un:0x%p\n", un); 28074 28075 #ifdef _MULTI_DATAMODEL 28076 switch (ddi_model_convert_from(flag & FMODELS)) { 28077 case DDI_MODEL_ILP32: 28078 if (ddi_copyin(data, cdrd32, sizeof (*cdrd32), flag) != 0) { 28079 return (EFAULT); 28080 } 28081 /* Convert the ILP32 uscsi data from the application to LP64 */ 28082 cdrom_read32tocdrom_read(cdrd32, mode1); 28083 break; 28084 case DDI_MODEL_NONE: 28085 if (ddi_copyin(data, mode1, sizeof (struct cdrom_read), flag)) { 28086 return (EFAULT); 28087 } 28088 } 28089 #else /* ! _MULTI_DATAMODEL */ 28090 if (ddi_copyin(data, mode1, sizeof (struct cdrom_read), flag)) { 28091 return (EFAULT); 28092 } 28093 #endif /* _MULTI_DATAMODEL */ 28094 28095 ssc = sd_ssc_init(un); 28096 rval = sd_send_scsi_READ(ssc, mode1->cdread_bufaddr, 28097 mode1->cdread_buflen, mode1->cdread_lba, SD_PATH_STANDARD); 28098 sd_ssc_fini(ssc); 28099 28100 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 28101 "sd_read_mode1: exit: un:0x%p\n", un); 28102 28103 return (rval); 28104 } 28105 28106 28107 /* 28108 * Function: sr_read_cd_mode2() 28109 * 28110 * Description: This routine is the driver entry point for handling CD-ROM 28111 * ioctl read mode2 requests (CDROMREADMODE2) for devices that 28112 * support the READ CD (0xBE) command or the 1st generation 28113 * READ CD (0xD4) command. 28114 * 28115 * Arguments: dev - the device 'dev_t' 28116 * data - pointer to user provided cd read structure specifying 28117 * the lba buffer address and length. 28118 * flag - this argument is a pass through to ddi_copyxxx() 28119 * directly from the mode argument of ioctl(). 28120 * 28121 * Return Code: the code returned by sd_send_scsi_cmd() 28122 * EFAULT if ddi_copyxxx() fails 28123 * ENXIO if fail ddi_get_soft_state 28124 * EINVAL if data pointer is NULL 28125 */ 28126 28127 static int 28128 sr_read_cd_mode2(dev_t dev, caddr_t data, int flag) 28129 { 28130 struct sd_lun *un; 28131 struct uscsi_cmd *com; 28132 struct cdrom_read mode2_struct; 28133 struct cdrom_read *mode2 = &mode2_struct; 28134 uchar_t cdb[CDB_GROUP5]; 28135 int nblocks; 28136 int rval; 28137 #ifdef _MULTI_DATAMODEL 28138 /* To support ILP32 applications in an LP64 world */ 28139 struct cdrom_read32 cdrom_read32; 28140 struct cdrom_read32 *cdrd32 = &cdrom_read32; 28141 #endif /* _MULTI_DATAMODEL */ 28142 28143 if (data == NULL) { 28144 return (EINVAL); 28145 } 28146 28147 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 28148 (un->un_state == SD_STATE_OFFLINE)) { 28149 return (ENXIO); 28150 } 28151 28152 #ifdef _MULTI_DATAMODEL 28153 switch (ddi_model_convert_from(flag & FMODELS)) { 28154 case DDI_MODEL_ILP32: 28155 if (ddi_copyin(data, cdrd32, sizeof (*cdrd32), flag) != 0) { 28156 return (EFAULT); 28157 } 28158 /* Convert the ILP32 uscsi data from the application to LP64 */ 28159 cdrom_read32tocdrom_read(cdrd32, mode2); 28160 break; 28161 case DDI_MODEL_NONE: 28162 if (ddi_copyin(data, mode2, sizeof (*mode2), flag) != 0) { 28163 return (EFAULT); 28164 } 28165 break; 28166 } 28167 28168 #else /* ! _MULTI_DATAMODEL */ 28169 if (ddi_copyin(data, mode2, sizeof (*mode2), flag) != 0) { 28170 return (EFAULT); 28171 } 28172 #endif /* _MULTI_DATAMODEL */ 28173 28174 bzero(cdb, sizeof (cdb)); 28175 if (un->un_f_cfg_read_cd_xd4 == TRUE) { 28176 /* Read command supported by 1st generation atapi drives */ 28177 cdb[0] = SCMD_READ_CDD4; 28178 } else { 28179 /* Universal CD Access Command */ 28180 cdb[0] = SCMD_READ_CD; 28181 } 28182 28183 /* 28184 * Set expected sector type to: 2336s byte, Mode 2 Yellow Book 28185 */ 28186 cdb[1] = CDROM_SECTOR_TYPE_MODE2; 28187 28188 /* set the start address */ 28189 cdb[2] = (uchar_t)((mode2->cdread_lba >> 24) & 0XFF); 28190 cdb[3] = (uchar_t)((mode2->cdread_lba >> 16) & 0XFF); 28191 cdb[4] = (uchar_t)((mode2->cdread_lba >> 8) & 0xFF); 28192 cdb[5] = (uchar_t)(mode2->cdread_lba & 0xFF); 28193 28194 /* set the transfer length */ 28195 nblocks = mode2->cdread_buflen / 2336; 28196 cdb[6] = (uchar_t)(nblocks >> 16); 28197 cdb[7] = (uchar_t)(nblocks >> 8); 28198 cdb[8] = (uchar_t)nblocks; 28199 28200 /* set the filter bits */ 28201 cdb[9] = CDROM_READ_CD_USERDATA; 28202 28203 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 28204 com->uscsi_cdb = (caddr_t)cdb; 28205 com->uscsi_cdblen = sizeof (cdb); 28206 com->uscsi_bufaddr = mode2->cdread_bufaddr; 28207 com->uscsi_buflen = mode2->cdread_buflen; 28208 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 28209 28210 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE, 28211 SD_PATH_STANDARD); 28212 kmem_free(com, sizeof (*com)); 28213 return (rval); 28214 } 28215 28216 28217 /* 28218 * Function: sr_read_mode2() 28219 * 28220 * Description: This routine is the driver entry point for handling CD-ROM 28221 * ioctl read mode2 requests (CDROMREADMODE2) for devices that 28222 * do not support the READ CD (0xBE) command. 28223 * 28224 * Arguments: dev - the device 'dev_t' 28225 * data - pointer to user provided cd read structure specifying 28226 * the lba buffer address and length. 28227 * flag - this argument is a pass through to ddi_copyxxx() 28228 * directly from the mode argument of ioctl(). 28229 * 28230 * Return Code: the code returned by sd_send_scsi_cmd() 28231 * EFAULT if ddi_copyxxx() fails 28232 * ENXIO if fail ddi_get_soft_state 28233 * EINVAL if data pointer is NULL 28234 * EIO if fail to reset block size 28235 * EAGAIN if commands are in progress in the driver 28236 */ 28237 28238 static int 28239 sr_read_mode2(dev_t dev, caddr_t data, int flag) 28240 { 28241 struct sd_lun *un; 28242 struct cdrom_read mode2_struct; 28243 struct cdrom_read *mode2 = &mode2_struct; 28244 int rval; 28245 uint32_t restore_blksize; 28246 struct uscsi_cmd *com; 28247 uchar_t cdb[CDB_GROUP0]; 28248 int nblocks; 28249 28250 #ifdef _MULTI_DATAMODEL 28251 /* To support ILP32 applications in an LP64 world */ 28252 struct cdrom_read32 cdrom_read32; 28253 struct cdrom_read32 *cdrd32 = &cdrom_read32; 28254 #endif /* _MULTI_DATAMODEL */ 28255 28256 if (data == NULL) { 28257 return (EINVAL); 28258 } 28259 28260 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 28261 (un->un_state == SD_STATE_OFFLINE)) { 28262 return (ENXIO); 28263 } 28264 28265 /* 28266 * Because this routine will update the device and driver block size 28267 * being used we want to make sure there are no commands in progress. 28268 * If commands are in progress the user will have to try again. 28269 * 28270 * We check for 1 instead of 0 because we increment un_ncmds_in_driver 28271 * in sdioctl to protect commands from sdioctl through to the top of 28272 * sd_uscsi_strategy. See sdioctl for details. 28273 */ 28274 mutex_enter(SD_MUTEX(un)); 28275 if (un->un_ncmds_in_driver != 1) { 28276 mutex_exit(SD_MUTEX(un)); 28277 return (EAGAIN); 28278 } 28279 mutex_exit(SD_MUTEX(un)); 28280 28281 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 28282 "sd_read_mode2: entry: un:0x%p\n", un); 28283 28284 #ifdef _MULTI_DATAMODEL 28285 switch (ddi_model_convert_from(flag & FMODELS)) { 28286 case DDI_MODEL_ILP32: 28287 if (ddi_copyin(data, cdrd32, sizeof (*cdrd32), flag) != 0) { 28288 return (EFAULT); 28289 } 28290 /* Convert the ILP32 uscsi data from the application to LP64 */ 28291 cdrom_read32tocdrom_read(cdrd32, mode2); 28292 break; 28293 case DDI_MODEL_NONE: 28294 if (ddi_copyin(data, mode2, sizeof (*mode2), flag) != 0) { 28295 return (EFAULT); 28296 } 28297 break; 28298 } 28299 #else /* ! _MULTI_DATAMODEL */ 28300 if (ddi_copyin(data, mode2, sizeof (*mode2), flag)) { 28301 return (EFAULT); 28302 } 28303 #endif /* _MULTI_DATAMODEL */ 28304 28305 /* Store the current target block size for restoration later */ 28306 restore_blksize = un->un_tgt_blocksize; 28307 28308 /* Change the device and soft state target block size to 2336 */ 28309 if (sr_sector_mode(dev, SD_MODE2_BLKSIZE) != 0) { 28310 rval = EIO; 28311 goto done; 28312 } 28313 28314 28315 bzero(cdb, sizeof (cdb)); 28316 28317 /* set READ operation */ 28318 cdb[0] = SCMD_READ; 28319 28320 /* adjust lba for 2kbyte blocks from 512 byte blocks */ 28321 mode2->cdread_lba >>= 2; 28322 28323 /* set the start address */ 28324 cdb[1] = (uchar_t)((mode2->cdread_lba >> 16) & 0X1F); 28325 cdb[2] = (uchar_t)((mode2->cdread_lba >> 8) & 0xFF); 28326 cdb[3] = (uchar_t)(mode2->cdread_lba & 0xFF); 28327 28328 /* set the transfer length */ 28329 nblocks = mode2->cdread_buflen / 2336; 28330 cdb[4] = (uchar_t)nblocks & 0xFF; 28331 28332 /* build command */ 28333 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 28334 com->uscsi_cdb = (caddr_t)cdb; 28335 com->uscsi_cdblen = sizeof (cdb); 28336 com->uscsi_bufaddr = mode2->cdread_bufaddr; 28337 com->uscsi_buflen = mode2->cdread_buflen; 28338 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 28339 28340 /* 28341 * Issue SCSI command with user space address for read buffer. 28342 * 28343 * This sends the command through main channel in the driver. 28344 * 28345 * Since this is accessed via an IOCTL call, we go through the 28346 * standard path, so that if the device was powered down, then 28347 * it would be 'awakened' to handle the command. 28348 */ 28349 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE, 28350 SD_PATH_STANDARD); 28351 28352 kmem_free(com, sizeof (*com)); 28353 28354 /* Restore the device and soft state target block size */ 28355 if (sr_sector_mode(dev, restore_blksize) != 0) { 28356 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 28357 "can't do switch back to mode 1\n"); 28358 /* 28359 * If sd_send_scsi_READ succeeded we still need to report 28360 * an error because we failed to reset the block size 28361 */ 28362 if (rval == 0) { 28363 rval = EIO; 28364 } 28365 } 28366 28367 done: 28368 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 28369 "sd_read_mode2: exit: un:0x%p\n", un); 28370 28371 return (rval); 28372 } 28373 28374 28375 /* 28376 * Function: sr_sector_mode() 28377 * 28378 * Description: This utility function is used by sr_read_mode2 to set the target 28379 * block size based on the user specified size. This is a legacy 28380 * implementation based upon a vendor specific mode page 28381 * 28382 * Arguments: dev - the device 'dev_t' 28383 * data - flag indicating if block size is being set to 2336 or 28384 * 512. 28385 * 28386 * Return Code: the code returned by sd_send_scsi_cmd() 28387 * EFAULT if ddi_copyxxx() fails 28388 * ENXIO if fail ddi_get_soft_state 28389 * EINVAL if data pointer is NULL 28390 */ 28391 28392 static int 28393 sr_sector_mode(dev_t dev, uint32_t blksize) 28394 { 28395 struct sd_lun *un; 28396 uchar_t *sense; 28397 uchar_t *select; 28398 int rval; 28399 sd_ssc_t *ssc; 28400 28401 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 28402 (un->un_state == SD_STATE_OFFLINE)) { 28403 return (ENXIO); 28404 } 28405 28406 sense = kmem_zalloc(20, KM_SLEEP); 28407 28408 /* Note: This is a vendor specific mode page (0x81) */ 28409 ssc = sd_ssc_init(un); 28410 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense, 20, 0x81, 28411 SD_PATH_STANDARD); 28412 sd_ssc_fini(ssc); 28413 if (rval != 0) { 28414 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un, 28415 "sr_sector_mode: Mode Sense failed\n"); 28416 kmem_free(sense, 20); 28417 return (rval); 28418 } 28419 select = kmem_zalloc(20, KM_SLEEP); 28420 select[3] = 0x08; 28421 select[10] = ((blksize >> 8) & 0xff); 28422 select[11] = (blksize & 0xff); 28423 select[12] = 0x01; 28424 select[13] = 0x06; 28425 select[14] = sense[14]; 28426 select[15] = sense[15]; 28427 if (blksize == SD_MODE2_BLKSIZE) { 28428 select[14] |= 0x01; 28429 } 28430 28431 ssc = sd_ssc_init(un); 28432 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select, 20, 28433 SD_DONTSAVE_PAGE, SD_PATH_STANDARD); 28434 sd_ssc_fini(ssc); 28435 if (rval != 0) { 28436 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un, 28437 "sr_sector_mode: Mode Select failed\n"); 28438 } else { 28439 /* 28440 * Only update the softstate block size if we successfully 28441 * changed the device block mode. 28442 */ 28443 mutex_enter(SD_MUTEX(un)); 28444 sd_update_block_info(un, blksize, 0); 28445 mutex_exit(SD_MUTEX(un)); 28446 } 28447 kmem_free(sense, 20); 28448 kmem_free(select, 20); 28449 return (rval); 28450 } 28451 28452 28453 /* 28454 * Function: sr_read_cdda() 28455 * 28456 * Description: This routine is the driver entry point for handling CD-ROM 28457 * ioctl requests to return CD-DA or subcode data. (CDROMCDDA) If 28458 * the target supports CDDA these requests are handled via a vendor 28459 * specific command (0xD8) If the target does not support CDDA 28460 * these requests are handled via the READ CD command (0xBE). 28461 * 28462 * Arguments: dev - the device 'dev_t' 28463 * data - pointer to user provided CD-DA structure specifying 28464 * the track starting address, transfer length, and 28465 * subcode options. 28466 * flag - this argument is a pass through to ddi_copyxxx() 28467 * directly from the mode argument of ioctl(). 28468 * 28469 * Return Code: the code returned by sd_send_scsi_cmd() 28470 * EFAULT if ddi_copyxxx() fails 28471 * ENXIO if fail ddi_get_soft_state 28472 * EINVAL if invalid arguments are provided 28473 * ENOTTY 28474 */ 28475 28476 static int 28477 sr_read_cdda(dev_t dev, caddr_t data, int flag) 28478 { 28479 struct sd_lun *un; 28480 struct uscsi_cmd *com; 28481 struct cdrom_cdda *cdda; 28482 int rval; 28483 size_t buflen; 28484 char cdb[CDB_GROUP5]; 28485 28486 #ifdef _MULTI_DATAMODEL 28487 /* To support ILP32 applications in an LP64 world */ 28488 struct cdrom_cdda32 cdrom_cdda32; 28489 struct cdrom_cdda32 *cdda32 = &cdrom_cdda32; 28490 #endif /* _MULTI_DATAMODEL */ 28491 28492 if (data == NULL) { 28493 return (EINVAL); 28494 } 28495 28496 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 28497 return (ENXIO); 28498 } 28499 28500 cdda = kmem_zalloc(sizeof (struct cdrom_cdda), KM_SLEEP); 28501 28502 #ifdef _MULTI_DATAMODEL 28503 switch (ddi_model_convert_from(flag & FMODELS)) { 28504 case DDI_MODEL_ILP32: 28505 if (ddi_copyin(data, cdda32, sizeof (*cdda32), flag)) { 28506 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 28507 "sr_read_cdda: ddi_copyin Failed\n"); 28508 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28509 return (EFAULT); 28510 } 28511 /* Convert the ILP32 uscsi data from the application to LP64 */ 28512 cdrom_cdda32tocdrom_cdda(cdda32, cdda); 28513 break; 28514 case DDI_MODEL_NONE: 28515 if (ddi_copyin(data, cdda, sizeof (struct cdrom_cdda), flag)) { 28516 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 28517 "sr_read_cdda: ddi_copyin Failed\n"); 28518 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28519 return (EFAULT); 28520 } 28521 break; 28522 } 28523 #else /* ! _MULTI_DATAMODEL */ 28524 if (ddi_copyin(data, cdda, sizeof (struct cdrom_cdda), flag)) { 28525 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 28526 "sr_read_cdda: ddi_copyin Failed\n"); 28527 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28528 return (EFAULT); 28529 } 28530 #endif /* _MULTI_DATAMODEL */ 28531 28532 /* 28533 * Since MMC-2 expects max 3 bytes for length, check if the 28534 * length input is greater than 3 bytes 28535 */ 28536 if ((cdda->cdda_length & 0xFF000000) != 0) { 28537 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_read_cdda: " 28538 "cdrom transfer length too large: %d (limit %d)\n", 28539 cdda->cdda_length, 0xFFFFFF); 28540 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28541 return (EINVAL); 28542 } 28543 28544 switch (cdda->cdda_subcode) { 28545 case CDROM_DA_NO_SUBCODE: 28546 buflen = CDROM_BLK_2352 * cdda->cdda_length; 28547 break; 28548 case CDROM_DA_SUBQ: 28549 buflen = CDROM_BLK_2368 * cdda->cdda_length; 28550 break; 28551 case CDROM_DA_ALL_SUBCODE: 28552 buflen = CDROM_BLK_2448 * cdda->cdda_length; 28553 break; 28554 case CDROM_DA_SUBCODE_ONLY: 28555 buflen = CDROM_BLK_SUBCODE * cdda->cdda_length; 28556 break; 28557 default: 28558 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 28559 "sr_read_cdda: Subcode '0x%x' Not Supported\n", 28560 cdda->cdda_subcode); 28561 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28562 return (EINVAL); 28563 } 28564 28565 /* Build and send the command */ 28566 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 28567 bzero(cdb, CDB_GROUP5); 28568 28569 if (un->un_f_cfg_cdda == TRUE) { 28570 cdb[0] = (char)SCMD_READ_CD; 28571 cdb[1] = 0x04; 28572 cdb[2] = (((cdda->cdda_addr) & 0xff000000) >> 24); 28573 cdb[3] = (((cdda->cdda_addr) & 0x00ff0000) >> 16); 28574 cdb[4] = (((cdda->cdda_addr) & 0x0000ff00) >> 8); 28575 cdb[5] = ((cdda->cdda_addr) & 0x000000ff); 28576 cdb[6] = (((cdda->cdda_length) & 0x00ff0000) >> 16); 28577 cdb[7] = (((cdda->cdda_length) & 0x0000ff00) >> 8); 28578 cdb[8] = ((cdda->cdda_length) & 0x000000ff); 28579 cdb[9] = 0x10; 28580 switch (cdda->cdda_subcode) { 28581 case CDROM_DA_NO_SUBCODE : 28582 cdb[10] = 0x0; 28583 break; 28584 case CDROM_DA_SUBQ : 28585 cdb[10] = 0x2; 28586 break; 28587 case CDROM_DA_ALL_SUBCODE : 28588 cdb[10] = 0x1; 28589 break; 28590 case CDROM_DA_SUBCODE_ONLY : 28591 /* FALLTHROUGH */ 28592 default : 28593 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28594 kmem_free(com, sizeof (*com)); 28595 return (ENOTTY); 28596 } 28597 } else { 28598 cdb[0] = (char)SCMD_READ_CDDA; 28599 cdb[2] = (((cdda->cdda_addr) & 0xff000000) >> 24); 28600 cdb[3] = (((cdda->cdda_addr) & 0x00ff0000) >> 16); 28601 cdb[4] = (((cdda->cdda_addr) & 0x0000ff00) >> 8); 28602 cdb[5] = ((cdda->cdda_addr) & 0x000000ff); 28603 cdb[6] = (((cdda->cdda_length) & 0xff000000) >> 24); 28604 cdb[7] = (((cdda->cdda_length) & 0x00ff0000) >> 16); 28605 cdb[8] = (((cdda->cdda_length) & 0x0000ff00) >> 8); 28606 cdb[9] = ((cdda->cdda_length) & 0x000000ff); 28607 cdb[10] = cdda->cdda_subcode; 28608 } 28609 28610 com->uscsi_cdb = cdb; 28611 com->uscsi_cdblen = CDB_GROUP5; 28612 com->uscsi_bufaddr = (caddr_t)cdda->cdda_data; 28613 com->uscsi_buflen = buflen; 28614 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 28615 28616 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE, 28617 SD_PATH_STANDARD); 28618 28619 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28620 kmem_free(com, sizeof (*com)); 28621 return (rval); 28622 } 28623 28624 28625 /* 28626 * Function: sr_read_cdxa() 28627 * 28628 * Description: This routine is the driver entry point for handling CD-ROM 28629 * ioctl requests to return CD-XA (Extended Architecture) data. 28630 * (CDROMCDXA). 28631 * 28632 * Arguments: dev - the device 'dev_t' 28633 * data - pointer to user provided CD-XA structure specifying 28634 * the data starting address, transfer length, and format 28635 * flag - this argument is a pass through to ddi_copyxxx() 28636 * directly from the mode argument of ioctl(). 28637 * 28638 * Return Code: the code returned by sd_send_scsi_cmd() 28639 * EFAULT if ddi_copyxxx() fails 28640 * ENXIO if fail ddi_get_soft_state 28641 * EINVAL if data pointer is NULL 28642 */ 28643 28644 static int 28645 sr_read_cdxa(dev_t dev, caddr_t data, int flag) 28646 { 28647 struct sd_lun *un; 28648 struct uscsi_cmd *com; 28649 struct cdrom_cdxa *cdxa; 28650 int rval; 28651 size_t buflen; 28652 char cdb[CDB_GROUP5]; 28653 uchar_t read_flags; 28654 28655 #ifdef _MULTI_DATAMODEL 28656 /* To support ILP32 applications in an LP64 world */ 28657 struct cdrom_cdxa32 cdrom_cdxa32; 28658 struct cdrom_cdxa32 *cdxa32 = &cdrom_cdxa32; 28659 #endif /* _MULTI_DATAMODEL */ 28660 28661 if (data == NULL) { 28662 return (EINVAL); 28663 } 28664 28665 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 28666 return (ENXIO); 28667 } 28668 28669 cdxa = kmem_zalloc(sizeof (struct cdrom_cdxa), KM_SLEEP); 28670 28671 #ifdef _MULTI_DATAMODEL 28672 switch (ddi_model_convert_from(flag & FMODELS)) { 28673 case DDI_MODEL_ILP32: 28674 if (ddi_copyin(data, cdxa32, sizeof (*cdxa32), flag)) { 28675 kmem_free(cdxa, sizeof (struct cdrom_cdxa)); 28676 return (EFAULT); 28677 } 28678 /* 28679 * Convert the ILP32 uscsi data from the 28680 * application to LP64 for internal use. 28681 */ 28682 cdrom_cdxa32tocdrom_cdxa(cdxa32, cdxa); 28683 break; 28684 case DDI_MODEL_NONE: 28685 if (ddi_copyin(data, cdxa, sizeof (struct cdrom_cdxa), flag)) { 28686 kmem_free(cdxa, sizeof (struct cdrom_cdxa)); 28687 return (EFAULT); 28688 } 28689 break; 28690 } 28691 #else /* ! _MULTI_DATAMODEL */ 28692 if (ddi_copyin(data, cdxa, sizeof (struct cdrom_cdxa), flag)) { 28693 kmem_free(cdxa, sizeof (struct cdrom_cdxa)); 28694 return (EFAULT); 28695 } 28696 #endif /* _MULTI_DATAMODEL */ 28697 28698 /* 28699 * Since MMC-2 expects max 3 bytes for length, check if the 28700 * length input is greater than 3 bytes 28701 */ 28702 if ((cdxa->cdxa_length & 0xFF000000) != 0) { 28703 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_read_cdxa: " 28704 "cdrom transfer length too large: %d (limit %d)\n", 28705 cdxa->cdxa_length, 0xFFFFFF); 28706 kmem_free(cdxa, sizeof (struct cdrom_cdxa)); 28707 return (EINVAL); 28708 } 28709 28710 switch (cdxa->cdxa_format) { 28711 case CDROM_XA_DATA: 28712 buflen = CDROM_BLK_2048 * cdxa->cdxa_length; 28713 read_flags = 0x10; 28714 break; 28715 case CDROM_XA_SECTOR_DATA: 28716 buflen = CDROM_BLK_2352 * cdxa->cdxa_length; 28717 read_flags = 0xf8; 28718 break; 28719 case CDROM_XA_DATA_W_ERROR: 28720 buflen = CDROM_BLK_2646 * cdxa->cdxa_length; 28721 read_flags = 0xfc; 28722 break; 28723 default: 28724 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 28725 "sr_read_cdxa: Format '0x%x' Not Supported\n", 28726 cdxa->cdxa_format); 28727 kmem_free(cdxa, sizeof (struct cdrom_cdxa)); 28728 return (EINVAL); 28729 } 28730 28731 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 28732 bzero(cdb, CDB_GROUP5); 28733 if (un->un_f_mmc_cap == TRUE) { 28734 cdb[0] = (char)SCMD_READ_CD; 28735 cdb[2] = (((cdxa->cdxa_addr) & 0xff000000) >> 24); 28736 cdb[3] = (((cdxa->cdxa_addr) & 0x00ff0000) >> 16); 28737 cdb[4] = (((cdxa->cdxa_addr) & 0x0000ff00) >> 8); 28738 cdb[5] = ((cdxa->cdxa_addr) & 0x000000ff); 28739 cdb[6] = (((cdxa->cdxa_length) & 0x00ff0000) >> 16); 28740 cdb[7] = (((cdxa->cdxa_length) & 0x0000ff00) >> 8); 28741 cdb[8] = ((cdxa->cdxa_length) & 0x000000ff); 28742 cdb[9] = (char)read_flags; 28743 } else { 28744 /* 28745 * Note: A vendor specific command (0xDB) is being used her to 28746 * request a read of all subcodes. 28747 */ 28748 cdb[0] = (char)SCMD_READ_CDXA; 28749 cdb[2] = (((cdxa->cdxa_addr) & 0xff000000) >> 24); 28750 cdb[3] = (((cdxa->cdxa_addr) & 0x00ff0000) >> 16); 28751 cdb[4] = (((cdxa->cdxa_addr) & 0x0000ff00) >> 8); 28752 cdb[5] = ((cdxa->cdxa_addr) & 0x000000ff); 28753 cdb[6] = (((cdxa->cdxa_length) & 0xff000000) >> 24); 28754 cdb[7] = (((cdxa->cdxa_length) & 0x00ff0000) >> 16); 28755 cdb[8] = (((cdxa->cdxa_length) & 0x0000ff00) >> 8); 28756 cdb[9] = ((cdxa->cdxa_length) & 0x000000ff); 28757 cdb[10] = cdxa->cdxa_format; 28758 } 28759 com->uscsi_cdb = cdb; 28760 com->uscsi_cdblen = CDB_GROUP5; 28761 com->uscsi_bufaddr = (caddr_t)cdxa->cdxa_data; 28762 com->uscsi_buflen = buflen; 28763 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 28764 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE, 28765 SD_PATH_STANDARD); 28766 kmem_free(cdxa, sizeof (struct cdrom_cdxa)); 28767 kmem_free(com, sizeof (*com)); 28768 return (rval); 28769 } 28770 28771 28772 /* 28773 * Function: sr_eject() 28774 * 28775 * Description: This routine is the driver entry point for handling CD-ROM 28776 * eject ioctl requests (FDEJECT, DKIOCEJECT, CDROMEJECT) 28777 * 28778 * Arguments: dev - the device 'dev_t' 28779 * 28780 * Return Code: the code returned by sd_send_scsi_cmd() 28781 */ 28782 28783 static int 28784 sr_eject(dev_t dev) 28785 { 28786 struct sd_lun *un; 28787 int rval; 28788 sd_ssc_t *ssc; 28789 28790 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 28791 (un->un_state == SD_STATE_OFFLINE)) { 28792 return (ENXIO); 28793 } 28794 28795 /* 28796 * To prevent race conditions with the eject 28797 * command, keep track of an eject command as 28798 * it progresses. If we are already handling 28799 * an eject command in the driver for the given 28800 * unit and another request to eject is received 28801 * immediately return EAGAIN so we don't lose 28802 * the command if the current eject command fails. 28803 */ 28804 mutex_enter(SD_MUTEX(un)); 28805 if (un->un_f_ejecting == TRUE) { 28806 mutex_exit(SD_MUTEX(un)); 28807 return (EAGAIN); 28808 } 28809 un->un_f_ejecting = TRUE; 28810 mutex_exit(SD_MUTEX(un)); 28811 28812 ssc = sd_ssc_init(un); 28813 rval = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_ALLOW, 28814 SD_PATH_STANDARD); 28815 sd_ssc_fini(ssc); 28816 28817 if (rval != 0) { 28818 mutex_enter(SD_MUTEX(un)); 28819 un->un_f_ejecting = FALSE; 28820 mutex_exit(SD_MUTEX(un)); 28821 return (rval); 28822 } 28823 28824 ssc = sd_ssc_init(un); 28825 rval = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP, 28826 SD_TARGET_EJECT, SD_PATH_STANDARD); 28827 sd_ssc_fini(ssc); 28828 28829 if (rval == 0) { 28830 mutex_enter(SD_MUTEX(un)); 28831 sr_ejected(un); 28832 un->un_mediastate = DKIO_EJECTED; 28833 un->un_f_ejecting = FALSE; 28834 cv_broadcast(&un->un_state_cv); 28835 mutex_exit(SD_MUTEX(un)); 28836 } else { 28837 mutex_enter(SD_MUTEX(un)); 28838 un->un_f_ejecting = FALSE; 28839 mutex_exit(SD_MUTEX(un)); 28840 } 28841 return (rval); 28842 } 28843 28844 28845 /* 28846 * Function: sr_ejected() 28847 * 28848 * Description: This routine updates the soft state structure to invalidate the 28849 * geometry information after the media has been ejected or a 28850 * media eject has been detected. 28851 * 28852 * Arguments: un - driver soft state (unit) structure 28853 */ 28854 28855 static void 28856 sr_ejected(struct sd_lun *un) 28857 { 28858 struct sd_errstats *stp; 28859 28860 ASSERT(un != NULL); 28861 ASSERT(mutex_owned(SD_MUTEX(un))); 28862 28863 un->un_f_blockcount_is_valid = FALSE; 28864 un->un_f_tgt_blocksize_is_valid = FALSE; 28865 mutex_exit(SD_MUTEX(un)); 28866 cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT_PRIORITY); 28867 mutex_enter(SD_MUTEX(un)); 28868 28869 if (un->un_errstats != NULL) { 28870 stp = (struct sd_errstats *)un->un_errstats->ks_data; 28871 stp->sd_capacity.value.ui64 = 0; 28872 } 28873 } 28874 28875 28876 /* 28877 * Function: sr_check_wp() 28878 * 28879 * Description: This routine checks the write protection of a removable 28880 * media disk and hotpluggable devices via the write protect bit of 28881 * the Mode Page Header device specific field. Some devices choke 28882 * on unsupported mode page. In order to workaround this issue, 28883 * this routine has been implemented to use 0x3f mode page(request 28884 * for all pages) for all device types. 28885 * 28886 * Arguments: dev - the device 'dev_t' 28887 * 28888 * Return Code: int indicating if the device is write protected (1) or not (0) 28889 * 28890 * Context: Kernel thread. 28891 * 28892 */ 28893 28894 static int 28895 sr_check_wp(dev_t dev) 28896 { 28897 struct sd_lun *un; 28898 uchar_t device_specific; 28899 uchar_t *sense; 28900 int hdrlen; 28901 int rval = FALSE; 28902 int status; 28903 sd_ssc_t *ssc; 28904 28905 /* 28906 * Note: The return codes for this routine should be reworked to 28907 * properly handle the case of a NULL softstate. 28908 */ 28909 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 28910 return (FALSE); 28911 } 28912 28913 if (un->un_f_cfg_is_atapi == TRUE) { 28914 /* 28915 * The mode page contents are not required; set the allocation 28916 * length for the mode page header only 28917 */ 28918 hdrlen = MODE_HEADER_LENGTH_GRP2; 28919 sense = kmem_zalloc(hdrlen, KM_SLEEP); 28920 ssc = sd_ssc_init(un); 28921 status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, sense, hdrlen, 28922 MODEPAGE_ALLPAGES, SD_PATH_STANDARD); 28923 sd_ssc_fini(ssc); 28924 if (status != 0) 28925 goto err_exit; 28926 device_specific = 28927 ((struct mode_header_grp2 *)sense)->device_specific; 28928 } else { 28929 hdrlen = MODE_HEADER_LENGTH; 28930 sense = kmem_zalloc(hdrlen, KM_SLEEP); 28931 ssc = sd_ssc_init(un); 28932 status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense, hdrlen, 28933 MODEPAGE_ALLPAGES, SD_PATH_STANDARD); 28934 sd_ssc_fini(ssc); 28935 if (status != 0) 28936 goto err_exit; 28937 device_specific = 28938 ((struct mode_header *)sense)->device_specific; 28939 } 28940 28941 28942 /* 28943 * Write protect mode sense failed; not all disks 28944 * understand this query. Return FALSE assuming that 28945 * these devices are not writable. 28946 */ 28947 if (device_specific & WRITE_PROTECT) { 28948 rval = TRUE; 28949 } 28950 28951 err_exit: 28952 kmem_free(sense, hdrlen); 28953 return (rval); 28954 } 28955 28956 /* 28957 * Function: sr_volume_ctrl() 28958 * 28959 * Description: This routine is the driver entry point for handling CD-ROM 28960 * audio output volume ioctl requests. (CDROMVOLCTRL) 28961 * 28962 * Arguments: dev - the device 'dev_t' 28963 * data - pointer to user audio volume control structure 28964 * flag - this argument is a pass through to ddi_copyxxx() 28965 * directly from the mode argument of ioctl(). 28966 * 28967 * Return Code: the code returned by sd_send_scsi_cmd() 28968 * EFAULT if ddi_copyxxx() fails 28969 * ENXIO if fail ddi_get_soft_state 28970 * EINVAL if data pointer is NULL 28971 * 28972 */ 28973 28974 static int 28975 sr_volume_ctrl(dev_t dev, caddr_t data, int flag) 28976 { 28977 struct sd_lun *un; 28978 struct cdrom_volctrl volume; 28979 struct cdrom_volctrl *vol = &volume; 28980 uchar_t *sense_page; 28981 uchar_t *select_page; 28982 uchar_t *sense; 28983 uchar_t *select; 28984 int sense_buflen; 28985 int select_buflen; 28986 int rval; 28987 sd_ssc_t *ssc; 28988 28989 if (data == NULL) { 28990 return (EINVAL); 28991 } 28992 28993 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 28994 (un->un_state == SD_STATE_OFFLINE)) { 28995 return (ENXIO); 28996 } 28997 28998 if (ddi_copyin(data, vol, sizeof (struct cdrom_volctrl), flag)) { 28999 return (EFAULT); 29000 } 29001 29002 if ((un->un_f_cfg_is_atapi == TRUE) || (un->un_f_mmc_cap == TRUE)) { 29003 struct mode_header_grp2 *sense_mhp; 29004 struct mode_header_grp2 *select_mhp; 29005 int bd_len; 29006 29007 sense_buflen = MODE_PARAM_LENGTH_GRP2 + MODEPAGE_AUDIO_CTRL_LEN; 29008 select_buflen = MODE_HEADER_LENGTH_GRP2 + 29009 MODEPAGE_AUDIO_CTRL_LEN; 29010 sense = kmem_zalloc(sense_buflen, KM_SLEEP); 29011 select = kmem_zalloc(select_buflen, KM_SLEEP); 29012 ssc = sd_ssc_init(un); 29013 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, sense, 29014 sense_buflen, MODEPAGE_AUDIO_CTRL, 29015 SD_PATH_STANDARD); 29016 sd_ssc_fini(ssc); 29017 29018 if (rval != 0) { 29019 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un, 29020 "sr_volume_ctrl: Mode Sense Failed\n"); 29021 kmem_free(sense, sense_buflen); 29022 kmem_free(select, select_buflen); 29023 return (rval); 29024 } 29025 sense_mhp = (struct mode_header_grp2 *)sense; 29026 select_mhp = (struct mode_header_grp2 *)select; 29027 bd_len = (sense_mhp->bdesc_length_hi << 8) | 29028 sense_mhp->bdesc_length_lo; 29029 if (bd_len > MODE_BLK_DESC_LENGTH) { 29030 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 29031 "sr_volume_ctrl: Mode Sense returned invalid " 29032 "block descriptor length\n"); 29033 kmem_free(sense, sense_buflen); 29034 kmem_free(select, select_buflen); 29035 return (EIO); 29036 } 29037 sense_page = (uchar_t *) 29038 (sense + MODE_HEADER_LENGTH_GRP2 + bd_len); 29039 select_page = (uchar_t *)(select + MODE_HEADER_LENGTH_GRP2); 29040 select_mhp->length_msb = 0; 29041 select_mhp->length_lsb = 0; 29042 select_mhp->bdesc_length_hi = 0; 29043 select_mhp->bdesc_length_lo = 0; 29044 } else { 29045 struct mode_header *sense_mhp, *select_mhp; 29046 29047 sense_buflen = MODE_PARAM_LENGTH + MODEPAGE_AUDIO_CTRL_LEN; 29048 select_buflen = MODE_HEADER_LENGTH + 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_GROUP0, sense, 29053 sense_buflen, MODEPAGE_AUDIO_CTRL, 29054 SD_PATH_STANDARD); 29055 sd_ssc_fini(ssc); 29056 29057 if (rval != 0) { 29058 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 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 *)sense; 29065 select_mhp = (struct mode_header *)select; 29066 if (sense_mhp->bdesc_length > MODE_BLK_DESC_LENGTH) { 29067 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 29068 "sr_volume_ctrl: Mode Sense returned invalid " 29069 "block descriptor length\n"); 29070 kmem_free(sense, sense_buflen); 29071 kmem_free(select, select_buflen); 29072 return (EIO); 29073 } 29074 sense_page = (uchar_t *) 29075 (sense + MODE_HEADER_LENGTH + sense_mhp->bdesc_length); 29076 select_page = (uchar_t *)(select + MODE_HEADER_LENGTH); 29077 select_mhp->length = 0; 29078 select_mhp->bdesc_length = 0; 29079 } 29080 /* 29081 * Note: An audio control data structure could be created and overlayed 29082 * on the following in place of the array indexing method implemented. 29083 */ 29084 29085 /* Build the select data for the user volume data */ 29086 select_page[0] = MODEPAGE_AUDIO_CTRL; 29087 select_page[1] = 0xE; 29088 /* Set the immediate bit */ 29089 select_page[2] = 0x04; 29090 /* Zero out reserved fields */ 29091 select_page[3] = 0x00; 29092 select_page[4] = 0x00; 29093 /* Return sense data for fields not to be modified */ 29094 select_page[5] = sense_page[5]; 29095 select_page[6] = sense_page[6]; 29096 select_page[7] = sense_page[7]; 29097 /* Set the user specified volume levels for channel 0 and 1 */ 29098 select_page[8] = 0x01; 29099 select_page[9] = vol->channel0; 29100 select_page[10] = 0x02; 29101 select_page[11] = vol->channel1; 29102 /* Channel 2 and 3 are currently unsupported so return the sense data */ 29103 select_page[12] = sense_page[12]; 29104 select_page[13] = sense_page[13]; 29105 select_page[14] = sense_page[14]; 29106 select_page[15] = sense_page[15]; 29107 29108 ssc = sd_ssc_init(un); 29109 if ((un->un_f_cfg_is_atapi == TRUE) || (un->un_f_mmc_cap == TRUE)) { 29110 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP1, select, 29111 select_buflen, SD_DONTSAVE_PAGE, SD_PATH_STANDARD); 29112 } else { 29113 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select, 29114 select_buflen, SD_DONTSAVE_PAGE, SD_PATH_STANDARD); 29115 } 29116 sd_ssc_fini(ssc); 29117 29118 kmem_free(sense, sense_buflen); 29119 kmem_free(select, select_buflen); 29120 return (rval); 29121 } 29122 29123 29124 /* 29125 * Function: sr_read_sony_session_offset() 29126 * 29127 * Description: This routine is the driver entry point for handling CD-ROM 29128 * ioctl requests for session offset information. (CDROMREADOFFSET) 29129 * The address of the first track in the last session of a 29130 * multi-session CD-ROM is returned 29131 * 29132 * Note: This routine uses a vendor specific key value in the 29133 * command control field without implementing any vendor check here 29134 * or in the ioctl routine. 29135 * 29136 * Arguments: dev - the device 'dev_t' 29137 * data - pointer to an int to hold the requested address 29138 * flag - this argument is a pass through to ddi_copyxxx() 29139 * directly from the mode argument of ioctl(). 29140 * 29141 * Return Code: the code returned by sd_send_scsi_cmd() 29142 * EFAULT if ddi_copyxxx() fails 29143 * ENXIO if fail ddi_get_soft_state 29144 * EINVAL if data pointer is NULL 29145 */ 29146 29147 static int 29148 sr_read_sony_session_offset(dev_t dev, caddr_t data, int flag) 29149 { 29150 struct sd_lun *un; 29151 struct uscsi_cmd *com; 29152 caddr_t buffer; 29153 char cdb[CDB_GROUP1]; 29154 int session_offset = 0; 29155 int rval; 29156 29157 if (data == NULL) { 29158 return (EINVAL); 29159 } 29160 29161 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 29162 (un->un_state == SD_STATE_OFFLINE)) { 29163 return (ENXIO); 29164 } 29165 29166 buffer = kmem_zalloc((size_t)SONY_SESSION_OFFSET_LEN, KM_SLEEP); 29167 bzero(cdb, CDB_GROUP1); 29168 cdb[0] = SCMD_READ_TOC; 29169 /* 29170 * Bytes 7 & 8 are the 12 byte allocation length for a single entry. 29171 * (4 byte TOC response header + 8 byte response data) 29172 */ 29173 cdb[8] = SONY_SESSION_OFFSET_LEN; 29174 /* Byte 9 is the control byte. A vendor specific value is used */ 29175 cdb[9] = SONY_SESSION_OFFSET_KEY; 29176 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 29177 com->uscsi_cdb = cdb; 29178 com->uscsi_cdblen = CDB_GROUP1; 29179 com->uscsi_bufaddr = buffer; 29180 com->uscsi_buflen = SONY_SESSION_OFFSET_LEN; 29181 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 29182 29183 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 29184 SD_PATH_STANDARD); 29185 if (rval != 0) { 29186 kmem_free(buffer, SONY_SESSION_OFFSET_LEN); 29187 kmem_free(com, sizeof (*com)); 29188 return (rval); 29189 } 29190 if (buffer[1] == SONY_SESSION_OFFSET_VALID) { 29191 session_offset = 29192 ((uchar_t)buffer[8] << 24) + ((uchar_t)buffer[9] << 16) + 29193 ((uchar_t)buffer[10] << 8) + ((uchar_t)buffer[11]); 29194 /* 29195 * Offset returned offset in current lbasize block's. Convert to 29196 * 2k block's to return to the user 29197 */ 29198 if (un->un_tgt_blocksize == CDROM_BLK_512) { 29199 session_offset >>= 2; 29200 } else if (un->un_tgt_blocksize == CDROM_BLK_1024) { 29201 session_offset >>= 1; 29202 } 29203 } 29204 29205 if (ddi_copyout(&session_offset, data, sizeof (int), flag) != 0) { 29206 rval = EFAULT; 29207 } 29208 29209 kmem_free(buffer, SONY_SESSION_OFFSET_LEN); 29210 kmem_free(com, sizeof (*com)); 29211 return (rval); 29212 } 29213 29214 29215 /* 29216 * Function: sd_wm_cache_constructor() 29217 * 29218 * Description: Cache Constructor for the wmap cache for the read/modify/write 29219 * devices. 29220 * 29221 * Arguments: wm - A pointer to the sd_w_map to be initialized. 29222 * un - sd_lun structure for the device. 29223 * flag - the km flags passed to constructor 29224 * 29225 * Return Code: 0 on success. 29226 * -1 on failure. 29227 */ 29228 29229 /*ARGSUSED*/ 29230 static int 29231 sd_wm_cache_constructor(void *wm, void *un, int flags) 29232 { 29233 bzero(wm, sizeof (struct sd_w_map)); 29234 cv_init(&((struct sd_w_map *)wm)->wm_avail, NULL, CV_DRIVER, NULL); 29235 return (0); 29236 } 29237 29238 29239 /* 29240 * Function: sd_wm_cache_destructor() 29241 * 29242 * Description: Cache destructor for the wmap cache for the read/modify/write 29243 * devices. 29244 * 29245 * Arguments: wm - A pointer to the sd_w_map to be initialized. 29246 * un - sd_lun structure for the device. 29247 */ 29248 /*ARGSUSED*/ 29249 static void 29250 sd_wm_cache_destructor(void *wm, void *un) 29251 { 29252 cv_destroy(&((struct sd_w_map *)wm)->wm_avail); 29253 } 29254 29255 29256 /* 29257 * Function: sd_range_lock() 29258 * 29259 * Description: Lock the range of blocks specified as parameter to ensure 29260 * that read, modify write is atomic and no other i/o writes 29261 * to the same location. The range is specified in terms 29262 * of start and end blocks. Block numbers are the actual 29263 * media block numbers and not system. 29264 * 29265 * Arguments: un - sd_lun structure for the device. 29266 * startb - The starting block number 29267 * endb - The end block number 29268 * typ - type of i/o - simple/read_modify_write 29269 * 29270 * Return Code: wm - pointer to the wmap structure. 29271 * 29272 * Context: This routine can sleep. 29273 */ 29274 29275 static struct sd_w_map * 29276 sd_range_lock(struct sd_lun *un, daddr_t startb, daddr_t endb, ushort_t typ) 29277 { 29278 struct sd_w_map *wmp = NULL; 29279 struct sd_w_map *sl_wmp = NULL; 29280 struct sd_w_map *tmp_wmp; 29281 wm_state state = SD_WM_CHK_LIST; 29282 29283 29284 ASSERT(un != NULL); 29285 ASSERT(!mutex_owned(SD_MUTEX(un))); 29286 29287 mutex_enter(SD_MUTEX(un)); 29288 29289 while (state != SD_WM_DONE) { 29290 29291 switch (state) { 29292 case SD_WM_CHK_LIST: 29293 /* 29294 * This is the starting state. Check the wmap list 29295 * to see if the range is currently available. 29296 */ 29297 if (!(typ & SD_WTYPE_RMW) && !(un->un_rmw_count)) { 29298 /* 29299 * If this is a simple write and no rmw 29300 * i/o is pending then try to lock the 29301 * range as the range should be available. 29302 */ 29303 state = SD_WM_LOCK_RANGE; 29304 } else { 29305 tmp_wmp = sd_get_range(un, startb, endb); 29306 if (tmp_wmp != NULL) { 29307 if ((wmp != NULL) && ONLIST(un, wmp)) { 29308 /* 29309 * Should not keep onlist wmps 29310 * while waiting this macro 29311 * will also do wmp = NULL; 29312 */ 29313 FREE_ONLIST_WMAP(un, wmp); 29314 } 29315 /* 29316 * sl_wmp is the wmap on which wait 29317 * is done, since the tmp_wmp points 29318 * to the inuse wmap, set sl_wmp to 29319 * tmp_wmp and change the state to sleep 29320 */ 29321 sl_wmp = tmp_wmp; 29322 state = SD_WM_WAIT_MAP; 29323 } else { 29324 state = SD_WM_LOCK_RANGE; 29325 } 29326 29327 } 29328 break; 29329 29330 case SD_WM_LOCK_RANGE: 29331 ASSERT(un->un_wm_cache); 29332 /* 29333 * The range need to be locked, try to get a wmap. 29334 * First attempt it with NO_SLEEP, want to avoid a sleep 29335 * if possible as we will have to release the sd mutex 29336 * if we have to sleep. 29337 */ 29338 if (wmp == NULL) 29339 wmp = kmem_cache_alloc(un->un_wm_cache, 29340 KM_NOSLEEP); 29341 if (wmp == NULL) { 29342 mutex_exit(SD_MUTEX(un)); 29343 _NOTE(DATA_READABLE_WITHOUT_LOCK 29344 (sd_lun::un_wm_cache)) 29345 wmp = kmem_cache_alloc(un->un_wm_cache, 29346 KM_SLEEP); 29347 mutex_enter(SD_MUTEX(un)); 29348 /* 29349 * we released the mutex so recheck and go to 29350 * check list state. 29351 */ 29352 state = SD_WM_CHK_LIST; 29353 } else { 29354 /* 29355 * We exit out of state machine since we 29356 * have the wmap. Do the housekeeping first. 29357 * place the wmap on the wmap list if it is not 29358 * on it already and then set the state to done. 29359 */ 29360 wmp->wm_start = startb; 29361 wmp->wm_end = endb; 29362 wmp->wm_flags = typ | SD_WM_BUSY; 29363 if (typ & SD_WTYPE_RMW) { 29364 un->un_rmw_count++; 29365 } 29366 /* 29367 * If not already on the list then link 29368 */ 29369 if (!ONLIST(un, wmp)) { 29370 wmp->wm_next = un->un_wm; 29371 wmp->wm_prev = NULL; 29372 if (wmp->wm_next) 29373 wmp->wm_next->wm_prev = wmp; 29374 un->un_wm = wmp; 29375 } 29376 state = SD_WM_DONE; 29377 } 29378 break; 29379 29380 case SD_WM_WAIT_MAP: 29381 ASSERT(sl_wmp->wm_flags & SD_WM_BUSY); 29382 /* 29383 * Wait is done on sl_wmp, which is set in the 29384 * check_list state. 29385 */ 29386 sl_wmp->wm_wanted_count++; 29387 cv_wait(&sl_wmp->wm_avail, SD_MUTEX(un)); 29388 sl_wmp->wm_wanted_count--; 29389 /* 29390 * We can reuse the memory from the completed sl_wmp 29391 * lock range for our new lock, but only if noone is 29392 * waiting for it. 29393 */ 29394 ASSERT(!(sl_wmp->wm_flags & SD_WM_BUSY)); 29395 if (sl_wmp->wm_wanted_count == 0) { 29396 if (wmp != NULL) { 29397 CHK_N_FREEWMP(un, wmp); 29398 } 29399 wmp = sl_wmp; 29400 } 29401 sl_wmp = NULL; 29402 /* 29403 * After waking up, need to recheck for availability of 29404 * range. 29405 */ 29406 state = SD_WM_CHK_LIST; 29407 break; 29408 29409 default: 29410 panic("sd_range_lock: " 29411 "Unknown state %d in sd_range_lock", state); 29412 /*NOTREACHED*/ 29413 } /* switch(state) */ 29414 29415 } /* while(state != SD_WM_DONE) */ 29416 29417 mutex_exit(SD_MUTEX(un)); 29418 29419 ASSERT(wmp != NULL); 29420 29421 return (wmp); 29422 } 29423 29424 29425 /* 29426 * Function: sd_get_range() 29427 * 29428 * Description: Find if there any overlapping I/O to this one 29429 * Returns the write-map of 1st such I/O, NULL otherwise. 29430 * 29431 * Arguments: un - sd_lun structure for the device. 29432 * startb - The starting block number 29433 * endb - The end block number 29434 * 29435 * Return Code: wm - pointer to the wmap structure. 29436 */ 29437 29438 static struct sd_w_map * 29439 sd_get_range(struct sd_lun *un, daddr_t startb, daddr_t endb) 29440 { 29441 struct sd_w_map *wmp; 29442 29443 ASSERT(un != NULL); 29444 29445 for (wmp = un->un_wm; wmp != NULL; wmp = wmp->wm_next) { 29446 if (!(wmp->wm_flags & SD_WM_BUSY)) { 29447 continue; 29448 } 29449 if ((startb >= wmp->wm_start) && (startb <= wmp->wm_end)) { 29450 break; 29451 } 29452 if ((endb >= wmp->wm_start) && (endb <= wmp->wm_end)) { 29453 break; 29454 } 29455 } 29456 29457 return (wmp); 29458 } 29459 29460 29461 /* 29462 * Function: sd_free_inlist_wmap() 29463 * 29464 * Description: Unlink and free a write map struct. 29465 * 29466 * Arguments: un - sd_lun structure for the device. 29467 * wmp - sd_w_map which needs to be unlinked. 29468 */ 29469 29470 static void 29471 sd_free_inlist_wmap(struct sd_lun *un, struct sd_w_map *wmp) 29472 { 29473 ASSERT(un != NULL); 29474 29475 if (un->un_wm == wmp) { 29476 un->un_wm = wmp->wm_next; 29477 } else { 29478 wmp->wm_prev->wm_next = wmp->wm_next; 29479 } 29480 29481 if (wmp->wm_next) { 29482 wmp->wm_next->wm_prev = wmp->wm_prev; 29483 } 29484 29485 wmp->wm_next = wmp->wm_prev = NULL; 29486 29487 kmem_cache_free(un->un_wm_cache, wmp); 29488 } 29489 29490 29491 /* 29492 * Function: sd_range_unlock() 29493 * 29494 * Description: Unlock the range locked by wm. 29495 * Free write map if nobody else is waiting on it. 29496 * 29497 * Arguments: un - sd_lun structure for the device. 29498 * wmp - sd_w_map which needs to be unlinked. 29499 */ 29500 29501 static void 29502 sd_range_unlock(struct sd_lun *un, struct sd_w_map *wm) 29503 { 29504 ASSERT(un != NULL); 29505 ASSERT(wm != NULL); 29506 ASSERT(!mutex_owned(SD_MUTEX(un))); 29507 29508 mutex_enter(SD_MUTEX(un)); 29509 29510 if (wm->wm_flags & SD_WTYPE_RMW) { 29511 un->un_rmw_count--; 29512 } 29513 29514 if (wm->wm_wanted_count) { 29515 wm->wm_flags = 0; 29516 /* 29517 * Broadcast that the wmap is available now. 29518 */ 29519 cv_broadcast(&wm->wm_avail); 29520 } else { 29521 /* 29522 * If no one is waiting on the map, it should be free'ed. 29523 */ 29524 sd_free_inlist_wmap(un, wm); 29525 } 29526 29527 mutex_exit(SD_MUTEX(un)); 29528 } 29529 29530 29531 /* 29532 * Function: sd_read_modify_write_task 29533 * 29534 * Description: Called from a taskq thread to initiate the write phase of 29535 * a read-modify-write request. This is used for targets where 29536 * un->un_sys_blocksize != un->un_tgt_blocksize. 29537 * 29538 * Arguments: arg - a pointer to the buf(9S) struct for the write command. 29539 * 29540 * Context: Called under taskq thread context. 29541 */ 29542 29543 static void 29544 sd_read_modify_write_task(void *arg) 29545 { 29546 struct sd_mapblocksize_info *bsp; 29547 struct buf *bp; 29548 struct sd_xbuf *xp; 29549 struct sd_lun *un; 29550 29551 bp = arg; /* The bp is given in arg */ 29552 ASSERT(bp != NULL); 29553 29554 /* Get the pointer to the layer-private data struct */ 29555 xp = SD_GET_XBUF(bp); 29556 ASSERT(xp != NULL); 29557 bsp = xp->xb_private; 29558 ASSERT(bsp != NULL); 29559 29560 un = SD_GET_UN(bp); 29561 ASSERT(un != NULL); 29562 ASSERT(!mutex_owned(SD_MUTEX(un))); 29563 29564 SD_TRACE(SD_LOG_IO_RMMEDIA, un, 29565 "sd_read_modify_write_task: entry: buf:0x%p\n", bp); 29566 29567 /* 29568 * This is the write phase of a read-modify-write request, called 29569 * under the context of a taskq thread in response to the completion 29570 * of the read portion of the rmw request completing under interrupt 29571 * context. The write request must be sent from here down the iostart 29572 * chain as if it were being sent from sd_mapblocksize_iostart(), so 29573 * we use the layer index saved in the layer-private data area. 29574 */ 29575 SD_NEXT_IOSTART(bsp->mbs_layer_index, un, bp); 29576 29577 SD_TRACE(SD_LOG_IO_RMMEDIA, un, 29578 "sd_read_modify_write_task: exit: buf:0x%p\n", bp); 29579 } 29580 29581 29582 /* 29583 * Function: sddump_do_read_of_rmw() 29584 * 29585 * Description: This routine will be called from sddump, If sddump is called 29586 * with an I/O which not aligned on device blocksize boundary 29587 * then the write has to be converted to read-modify-write. 29588 * Do the read part here in order to keep sddump simple. 29589 * Note - That the sd_mutex is held across the call to this 29590 * routine. 29591 * 29592 * Arguments: un - sd_lun 29593 * blkno - block number in terms of media block size. 29594 * nblk - number of blocks. 29595 * bpp - pointer to pointer to the buf structure. On return 29596 * from this function, *bpp points to the valid buffer 29597 * to which the write has to be done. 29598 * 29599 * Return Code: 0 for success or errno-type return code 29600 */ 29601 29602 static int 29603 sddump_do_read_of_rmw(struct sd_lun *un, uint64_t blkno, uint64_t nblk, 29604 struct buf **bpp) 29605 { 29606 int err; 29607 int i; 29608 int rval; 29609 struct buf *bp; 29610 struct scsi_pkt *pkt = NULL; 29611 uint32_t target_blocksize; 29612 29613 ASSERT(un != NULL); 29614 ASSERT(mutex_owned(SD_MUTEX(un))); 29615 29616 target_blocksize = un->un_tgt_blocksize; 29617 29618 mutex_exit(SD_MUTEX(un)); 29619 29620 bp = scsi_alloc_consistent_buf(SD_ADDRESS(un), (struct buf *)NULL, 29621 (size_t)(nblk * target_blocksize), B_READ, NULL_FUNC, NULL); 29622 if (bp == NULL) { 29623 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 29624 "no resources for dumping; giving up"); 29625 err = ENOMEM; 29626 goto done; 29627 } 29628 29629 rval = sd_setup_rw_pkt(un, &pkt, bp, 0, NULL_FUNC, NULL, 29630 blkno, nblk); 29631 if (rval != 0) { 29632 scsi_free_consistent_buf(bp); 29633 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 29634 "no resources for dumping; giving up"); 29635 err = ENOMEM; 29636 goto done; 29637 } 29638 29639 pkt->pkt_flags |= FLAG_NOINTR; 29640 29641 err = EIO; 29642 for (i = 0; i < SD_NDUMP_RETRIES; i++) { 29643 29644 /* 29645 * Scsi_poll returns 0 (success) if the command completes and 29646 * the status block is STATUS_GOOD. We should only check 29647 * errors if this condition is not true. Even then we should 29648 * send our own request sense packet only if we have a check 29649 * condition and auto request sense has not been performed by 29650 * the hba. 29651 */ 29652 SD_TRACE(SD_LOG_DUMP, un, "sddump: sending read\n"); 29653 29654 if ((sd_scsi_poll(un, pkt) == 0) && (pkt->pkt_resid == 0)) { 29655 err = 0; 29656 break; 29657 } 29658 29659 /* 29660 * Check CMD_DEV_GONE 1st, give up if device is gone, 29661 * no need to read RQS data. 29662 */ 29663 if (pkt->pkt_reason == CMD_DEV_GONE) { 29664 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 29665 "Error while dumping state with rmw..." 29666 "Device is gone\n"); 29667 break; 29668 } 29669 29670 if (SD_GET_PKT_STATUS(pkt) == STATUS_CHECK) { 29671 SD_INFO(SD_LOG_DUMP, un, 29672 "sddump: read failed with CHECK, try # %d\n", i); 29673 if (((pkt->pkt_state & STATE_ARQ_DONE) == 0)) { 29674 (void) sd_send_polled_RQS(un); 29675 } 29676 29677 continue; 29678 } 29679 29680 if (SD_GET_PKT_STATUS(pkt) == STATUS_BUSY) { 29681 int reset_retval = 0; 29682 29683 SD_INFO(SD_LOG_DUMP, un, 29684 "sddump: read failed with BUSY, try # %d\n", i); 29685 29686 if (un->un_f_lun_reset_enabled == TRUE) { 29687 reset_retval = scsi_reset(SD_ADDRESS(un), 29688 RESET_LUN); 29689 } 29690 if (reset_retval == 0) { 29691 (void) scsi_reset(SD_ADDRESS(un), RESET_TARGET); 29692 } 29693 (void) sd_send_polled_RQS(un); 29694 29695 } else { 29696 SD_INFO(SD_LOG_DUMP, un, 29697 "sddump: read failed with 0x%x, try # %d\n", 29698 SD_GET_PKT_STATUS(pkt), i); 29699 mutex_enter(SD_MUTEX(un)); 29700 sd_reset_target(un, pkt); 29701 mutex_exit(SD_MUTEX(un)); 29702 } 29703 29704 /* 29705 * If we are not getting anywhere with lun/target resets, 29706 * let's reset the bus. 29707 */ 29708 if (i > SD_NDUMP_RETRIES/2) { 29709 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL); 29710 (void) sd_send_polled_RQS(un); 29711 } 29712 29713 } 29714 scsi_destroy_pkt(pkt); 29715 29716 if (err != 0) { 29717 scsi_free_consistent_buf(bp); 29718 *bpp = NULL; 29719 } else { 29720 *bpp = bp; 29721 } 29722 29723 done: 29724 mutex_enter(SD_MUTEX(un)); 29725 return (err); 29726 } 29727 29728 29729 /* 29730 * Function: sd_failfast_flushq 29731 * 29732 * Description: Take all bp's on the wait queue that have B_FAILFAST set 29733 * in b_flags and move them onto the failfast queue, then kick 29734 * off a thread to return all bp's on the failfast queue to 29735 * their owners with an error set. 29736 * 29737 * Arguments: un - pointer to the soft state struct for the instance. 29738 * 29739 * Context: may execute in interrupt context. 29740 */ 29741 29742 static void 29743 sd_failfast_flushq(struct sd_lun *un) 29744 { 29745 struct buf *bp; 29746 struct buf *next_waitq_bp; 29747 struct buf *prev_waitq_bp = NULL; 29748 29749 ASSERT(un != NULL); 29750 ASSERT(mutex_owned(SD_MUTEX(un))); 29751 ASSERT(un->un_failfast_state == SD_FAILFAST_ACTIVE); 29752 ASSERT(un->un_failfast_bp == NULL); 29753 29754 SD_TRACE(SD_LOG_IO_FAILFAST, un, 29755 "sd_failfast_flushq: entry: un:0x%p\n", un); 29756 29757 /* 29758 * Check if we should flush all bufs when entering failfast state, or 29759 * just those with B_FAILFAST set. 29760 */ 29761 if (sd_failfast_flushctl & SD_FAILFAST_FLUSH_ALL_BUFS) { 29762 /* 29763 * Move *all* bp's on the wait queue to the failfast flush 29764 * queue, including those that do NOT have B_FAILFAST set. 29765 */ 29766 if (un->un_failfast_headp == NULL) { 29767 ASSERT(un->un_failfast_tailp == NULL); 29768 un->un_failfast_headp = un->un_waitq_headp; 29769 } else { 29770 ASSERT(un->un_failfast_tailp != NULL); 29771 un->un_failfast_tailp->av_forw = un->un_waitq_headp; 29772 } 29773 29774 un->un_failfast_tailp = un->un_waitq_tailp; 29775 29776 /* update kstat for each bp moved out of the waitq */ 29777 for (bp = un->un_waitq_headp; bp != NULL; bp = bp->av_forw) { 29778 SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp); 29779 } 29780 29781 /* empty the waitq */ 29782 un->un_waitq_headp = un->un_waitq_tailp = NULL; 29783 29784 } else { 29785 /* 29786 * Go thru the wait queue, pick off all entries with 29787 * B_FAILFAST set, and move these onto the failfast queue. 29788 */ 29789 for (bp = un->un_waitq_headp; bp != NULL; bp = next_waitq_bp) { 29790 /* 29791 * Save the pointer to the next bp on the wait queue, 29792 * so we get to it on the next iteration of this loop. 29793 */ 29794 next_waitq_bp = bp->av_forw; 29795 29796 /* 29797 * If this bp from the wait queue does NOT have 29798 * B_FAILFAST set, just move on to the next element 29799 * in the wait queue. Note, this is the only place 29800 * where it is correct to set prev_waitq_bp. 29801 */ 29802 if ((bp->b_flags & B_FAILFAST) == 0) { 29803 prev_waitq_bp = bp; 29804 continue; 29805 } 29806 29807 /* 29808 * Remove the bp from the wait queue. 29809 */ 29810 if (bp == un->un_waitq_headp) { 29811 /* The bp is the first element of the waitq. */ 29812 un->un_waitq_headp = next_waitq_bp; 29813 if (un->un_waitq_headp == NULL) { 29814 /* The wait queue is now empty */ 29815 un->un_waitq_tailp = NULL; 29816 } 29817 } else { 29818 /* 29819 * The bp is either somewhere in the middle 29820 * or at the end of the wait queue. 29821 */ 29822 ASSERT(un->un_waitq_headp != NULL); 29823 ASSERT(prev_waitq_bp != NULL); 29824 ASSERT((prev_waitq_bp->b_flags & B_FAILFAST) 29825 == 0); 29826 if (bp == un->un_waitq_tailp) { 29827 /* bp is the last entry on the waitq. */ 29828 ASSERT(next_waitq_bp == NULL); 29829 un->un_waitq_tailp = prev_waitq_bp; 29830 } 29831 prev_waitq_bp->av_forw = next_waitq_bp; 29832 } 29833 bp->av_forw = NULL; 29834 29835 /* 29836 * update kstat since the bp is moved out of 29837 * the waitq 29838 */ 29839 SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp); 29840 29841 /* 29842 * Now put the bp onto the failfast queue. 29843 */ 29844 if (un->un_failfast_headp == NULL) { 29845 /* failfast queue is currently empty */ 29846 ASSERT(un->un_failfast_tailp == NULL); 29847 un->un_failfast_headp = 29848 un->un_failfast_tailp = bp; 29849 } else { 29850 /* Add the bp to the end of the failfast q */ 29851 ASSERT(un->un_failfast_tailp != NULL); 29852 ASSERT(un->un_failfast_tailp->b_flags & 29853 B_FAILFAST); 29854 un->un_failfast_tailp->av_forw = bp; 29855 un->un_failfast_tailp = bp; 29856 } 29857 } 29858 } 29859 29860 /* 29861 * Now return all bp's on the failfast queue to their owners. 29862 */ 29863 while ((bp = un->un_failfast_headp) != NULL) { 29864 29865 un->un_failfast_headp = bp->av_forw; 29866 if (un->un_failfast_headp == NULL) { 29867 un->un_failfast_tailp = NULL; 29868 } 29869 29870 /* 29871 * We want to return the bp with a failure error code, but 29872 * we do not want a call to sd_start_cmds() to occur here, 29873 * so use sd_return_failed_command_no_restart() instead of 29874 * sd_return_failed_command(). 29875 */ 29876 sd_return_failed_command_no_restart(un, bp, EIO); 29877 } 29878 29879 /* Flush the xbuf queues if required. */ 29880 if (sd_failfast_flushctl & SD_FAILFAST_FLUSH_ALL_QUEUES) { 29881 ddi_xbuf_flushq(un->un_xbuf_attr, sd_failfast_flushq_callback); 29882 } 29883 29884 SD_TRACE(SD_LOG_IO_FAILFAST, un, 29885 "sd_failfast_flushq: exit: un:0x%p\n", un); 29886 } 29887 29888 29889 /* 29890 * Function: sd_failfast_flushq_callback 29891 * 29892 * Description: Return TRUE if the given bp meets the criteria for failfast 29893 * flushing. Used with ddi_xbuf_flushq(9F). 29894 * 29895 * Arguments: bp - ptr to buf struct to be examined. 29896 * 29897 * Context: Any 29898 */ 29899 29900 static int 29901 sd_failfast_flushq_callback(struct buf *bp) 29902 { 29903 /* 29904 * Return TRUE if (1) we want to flush ALL bufs when the failfast 29905 * state is entered; OR (2) the given bp has B_FAILFAST set. 29906 */ 29907 return (((sd_failfast_flushctl & SD_FAILFAST_FLUSH_ALL_BUFS) || 29908 (bp->b_flags & B_FAILFAST)) ? TRUE : FALSE); 29909 } 29910 29911 29912 29913 /* 29914 * Function: sd_setup_next_xfer 29915 * 29916 * Description: Prepare next I/O operation using DMA_PARTIAL 29917 * 29918 */ 29919 29920 static int 29921 sd_setup_next_xfer(struct sd_lun *un, struct buf *bp, 29922 struct scsi_pkt *pkt, struct sd_xbuf *xp) 29923 { 29924 ssize_t num_blks_not_xfered; 29925 daddr_t strt_blk_num; 29926 ssize_t bytes_not_xfered; 29927 int rval; 29928 29929 ASSERT(pkt->pkt_resid == 0); 29930 29931 /* 29932 * Calculate next block number and amount to be transferred. 29933 * 29934 * How much data NOT transfered to the HBA yet. 29935 */ 29936 bytes_not_xfered = xp->xb_dma_resid; 29937 29938 /* 29939 * figure how many blocks NOT transfered to the HBA yet. 29940 */ 29941 num_blks_not_xfered = SD_BYTES2TGTBLOCKS(un, bytes_not_xfered); 29942 29943 /* 29944 * set starting block number to the end of what WAS transfered. 29945 */ 29946 strt_blk_num = xp->xb_blkno + 29947 SD_BYTES2TGTBLOCKS(un, bp->b_bcount - bytes_not_xfered); 29948 29949 /* 29950 * Move pkt to the next portion of the xfer. sd_setup_next_rw_pkt 29951 * will call scsi_initpkt with NULL_FUNC so we do not have to release 29952 * the disk mutex here. 29953 */ 29954 rval = sd_setup_next_rw_pkt(un, pkt, bp, 29955 strt_blk_num, num_blks_not_xfered); 29956 29957 if (rval == 0) { 29958 29959 /* 29960 * Success. 29961 * 29962 * Adjust things if there are still more blocks to be 29963 * transfered. 29964 */ 29965 xp->xb_dma_resid = pkt->pkt_resid; 29966 pkt->pkt_resid = 0; 29967 29968 return (1); 29969 } 29970 29971 /* 29972 * There's really only one possible return value from 29973 * sd_setup_next_rw_pkt which occurs when scsi_init_pkt 29974 * returns NULL. 29975 */ 29976 ASSERT(rval == SD_PKT_ALLOC_FAILURE); 29977 29978 bp->b_resid = bp->b_bcount; 29979 bp->b_flags |= B_ERROR; 29980 29981 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 29982 "Error setting up next portion of DMA transfer\n"); 29983 29984 return (0); 29985 } 29986 29987 /* 29988 * Function: sd_panic_for_res_conflict 29989 * 29990 * Description: Call panic with a string formatted with "Reservation Conflict" 29991 * and a human readable identifier indicating the SD instance 29992 * that experienced the reservation conflict. 29993 * 29994 * Arguments: un - pointer to the soft state struct for the instance. 29995 * 29996 * Context: may execute in interrupt context. 29997 */ 29998 29999 #define SD_RESV_CONFLICT_FMT_LEN 40 30000 void 30001 sd_panic_for_res_conflict(struct sd_lun *un) 30002 { 30003 char panic_str[SD_RESV_CONFLICT_FMT_LEN+MAXPATHLEN]; 30004 char path_str[MAXPATHLEN]; 30005 30006 (void) snprintf(panic_str, sizeof (panic_str), 30007 "Reservation Conflict\nDisk: %s", 30008 ddi_pathname(SD_DEVINFO(un), path_str)); 30009 30010 panic(panic_str); 30011 } 30012 30013 /* 30014 * Note: The following sd_faultinjection_ioctl( ) routines implement 30015 * driver support for handling fault injection for error analysis 30016 * causing faults in multiple layers of the driver. 30017 * 30018 */ 30019 30020 #ifdef SD_FAULT_INJECTION 30021 static uint_t sd_fault_injection_on = 0; 30022 30023 /* 30024 * Function: sd_faultinjection_ioctl() 30025 * 30026 * Description: This routine is the driver entry point for handling 30027 * faultinjection ioctls to inject errors into the 30028 * layer model 30029 * 30030 * Arguments: cmd - the ioctl cmd received 30031 * arg - the arguments from user and returns 30032 */ 30033 30034 static void 30035 sd_faultinjection_ioctl(int cmd, intptr_t arg, struct sd_lun *un) 30036 { 30037 uint_t i = 0; 30038 uint_t rval; 30039 30040 SD_TRACE(SD_LOG_IOERR, un, "sd_faultinjection_ioctl: entry\n"); 30041 30042 mutex_enter(SD_MUTEX(un)); 30043 30044 switch (cmd) { 30045 case SDIOCRUN: 30046 /* Allow pushed faults to be injected */ 30047 SD_INFO(SD_LOG_SDTEST, un, 30048 "sd_faultinjection_ioctl: Injecting Fault Run\n"); 30049 30050 sd_fault_injection_on = 1; 30051 30052 SD_INFO(SD_LOG_IOERR, un, 30053 "sd_faultinjection_ioctl: run finished\n"); 30054 break; 30055 30056 case SDIOCSTART: 30057 /* Start Injection Session */ 30058 SD_INFO(SD_LOG_SDTEST, un, 30059 "sd_faultinjection_ioctl: Injecting Fault Start\n"); 30060 30061 sd_fault_injection_on = 0; 30062 un->sd_injection_mask = 0xFFFFFFFF; 30063 for (i = 0; i < SD_FI_MAX_ERROR; i++) { 30064 un->sd_fi_fifo_pkt[i] = NULL; 30065 un->sd_fi_fifo_xb[i] = NULL; 30066 un->sd_fi_fifo_un[i] = NULL; 30067 un->sd_fi_fifo_arq[i] = NULL; 30068 } 30069 un->sd_fi_fifo_start = 0; 30070 un->sd_fi_fifo_end = 0; 30071 30072 mutex_enter(&(un->un_fi_mutex)); 30073 un->sd_fi_log[0] = '\0'; 30074 un->sd_fi_buf_len = 0; 30075 mutex_exit(&(un->un_fi_mutex)); 30076 30077 SD_INFO(SD_LOG_IOERR, un, 30078 "sd_faultinjection_ioctl: start finished\n"); 30079 break; 30080 30081 case SDIOCSTOP: 30082 /* Stop Injection Session */ 30083 SD_INFO(SD_LOG_SDTEST, un, 30084 "sd_faultinjection_ioctl: Injecting Fault Stop\n"); 30085 sd_fault_injection_on = 0; 30086 un->sd_injection_mask = 0x0; 30087 30088 /* Empty stray or unuseds structs from fifo */ 30089 for (i = 0; i < SD_FI_MAX_ERROR; i++) { 30090 if (un->sd_fi_fifo_pkt[i] != NULL) { 30091 kmem_free(un->sd_fi_fifo_pkt[i], 30092 sizeof (struct sd_fi_pkt)); 30093 } 30094 if (un->sd_fi_fifo_xb[i] != NULL) { 30095 kmem_free(un->sd_fi_fifo_xb[i], 30096 sizeof (struct sd_fi_xb)); 30097 } 30098 if (un->sd_fi_fifo_un[i] != NULL) { 30099 kmem_free(un->sd_fi_fifo_un[i], 30100 sizeof (struct sd_fi_un)); 30101 } 30102 if (un->sd_fi_fifo_arq[i] != NULL) { 30103 kmem_free(un->sd_fi_fifo_arq[i], 30104 sizeof (struct sd_fi_arq)); 30105 } 30106 un->sd_fi_fifo_pkt[i] = NULL; 30107 un->sd_fi_fifo_un[i] = NULL; 30108 un->sd_fi_fifo_xb[i] = NULL; 30109 un->sd_fi_fifo_arq[i] = NULL; 30110 } 30111 un->sd_fi_fifo_start = 0; 30112 un->sd_fi_fifo_end = 0; 30113 30114 SD_INFO(SD_LOG_IOERR, un, 30115 "sd_faultinjection_ioctl: stop finished\n"); 30116 break; 30117 30118 case SDIOCINSERTPKT: 30119 /* Store a packet struct to be pushed onto fifo */ 30120 SD_INFO(SD_LOG_SDTEST, un, 30121 "sd_faultinjection_ioctl: Injecting Fault Insert Pkt\n"); 30122 30123 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR; 30124 30125 sd_fault_injection_on = 0; 30126 30127 /* No more that SD_FI_MAX_ERROR allowed in Queue */ 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 (arg != NULL) { 30133 un->sd_fi_fifo_pkt[i] = 30134 kmem_alloc(sizeof (struct sd_fi_pkt), KM_NOSLEEP); 30135 if (un->sd_fi_fifo_pkt[i] == NULL) { 30136 /* Alloc failed don't store anything */ 30137 break; 30138 } 30139 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_pkt[i], 30140 sizeof (struct sd_fi_pkt), 0); 30141 if (rval == -1) { 30142 kmem_free(un->sd_fi_fifo_pkt[i], 30143 sizeof (struct sd_fi_pkt)); 30144 un->sd_fi_fifo_pkt[i] = NULL; 30145 } 30146 } else { 30147 SD_INFO(SD_LOG_IOERR, un, 30148 "sd_faultinjection_ioctl: pkt null\n"); 30149 } 30150 break; 30151 30152 case SDIOCINSERTXB: 30153 /* Store a xb struct to be pushed onto fifo */ 30154 SD_INFO(SD_LOG_SDTEST, un, 30155 "sd_faultinjection_ioctl: Injecting Fault Insert XB\n"); 30156 30157 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR; 30158 30159 sd_fault_injection_on = 0; 30160 30161 if (un->sd_fi_fifo_xb[i] != NULL) { 30162 kmem_free(un->sd_fi_fifo_xb[i], 30163 sizeof (struct sd_fi_xb)); 30164 un->sd_fi_fifo_xb[i] = NULL; 30165 } 30166 if (arg != NULL) { 30167 un->sd_fi_fifo_xb[i] = 30168 kmem_alloc(sizeof (struct sd_fi_xb), KM_NOSLEEP); 30169 if (un->sd_fi_fifo_xb[i] == NULL) { 30170 /* Alloc failed don't store anything */ 30171 break; 30172 } 30173 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_xb[i], 30174 sizeof (struct sd_fi_xb), 0); 30175 30176 if (rval == -1) { 30177 kmem_free(un->sd_fi_fifo_xb[i], 30178 sizeof (struct sd_fi_xb)); 30179 un->sd_fi_fifo_xb[i] = NULL; 30180 } 30181 } else { 30182 SD_INFO(SD_LOG_IOERR, un, 30183 "sd_faultinjection_ioctl: xb null\n"); 30184 } 30185 break; 30186 30187 case SDIOCINSERTUN: 30188 /* Store a un struct to be pushed onto fifo */ 30189 SD_INFO(SD_LOG_SDTEST, un, 30190 "sd_faultinjection_ioctl: Injecting Fault Insert UN\n"); 30191 30192 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR; 30193 30194 sd_fault_injection_on = 0; 30195 30196 if (un->sd_fi_fifo_un[i] != NULL) { 30197 kmem_free(un->sd_fi_fifo_un[i], 30198 sizeof (struct sd_fi_un)); 30199 un->sd_fi_fifo_un[i] = NULL; 30200 } 30201 if (arg != NULL) { 30202 un->sd_fi_fifo_un[i] = 30203 kmem_alloc(sizeof (struct sd_fi_un), KM_NOSLEEP); 30204 if (un->sd_fi_fifo_un[i] == NULL) { 30205 /* Alloc failed don't store anything */ 30206 break; 30207 } 30208 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_un[i], 30209 sizeof (struct sd_fi_un), 0); 30210 if (rval == -1) { 30211 kmem_free(un->sd_fi_fifo_un[i], 30212 sizeof (struct sd_fi_un)); 30213 un->sd_fi_fifo_un[i] = NULL; 30214 } 30215 30216 } else { 30217 SD_INFO(SD_LOG_IOERR, un, 30218 "sd_faultinjection_ioctl: un null\n"); 30219 } 30220 30221 break; 30222 30223 case SDIOCINSERTARQ: 30224 /* Store a arq struct to be pushed onto fifo */ 30225 SD_INFO(SD_LOG_SDTEST, un, 30226 "sd_faultinjection_ioctl: Injecting Fault Insert ARQ\n"); 30227 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR; 30228 30229 sd_fault_injection_on = 0; 30230 30231 if (un->sd_fi_fifo_arq[i] != NULL) { 30232 kmem_free(un->sd_fi_fifo_arq[i], 30233 sizeof (struct sd_fi_arq)); 30234 un->sd_fi_fifo_arq[i] = NULL; 30235 } 30236 if (arg != NULL) { 30237 un->sd_fi_fifo_arq[i] = 30238 kmem_alloc(sizeof (struct sd_fi_arq), KM_NOSLEEP); 30239 if (un->sd_fi_fifo_arq[i] == NULL) { 30240 /* Alloc failed don't store anything */ 30241 break; 30242 } 30243 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_arq[i], 30244 sizeof (struct sd_fi_arq), 0); 30245 if (rval == -1) { 30246 kmem_free(un->sd_fi_fifo_arq[i], 30247 sizeof (struct sd_fi_arq)); 30248 un->sd_fi_fifo_arq[i] = NULL; 30249 } 30250 30251 } else { 30252 SD_INFO(SD_LOG_IOERR, un, 30253 "sd_faultinjection_ioctl: arq null\n"); 30254 } 30255 30256 break; 30257 30258 case SDIOCPUSH: 30259 /* Push stored xb, pkt, un, and arq onto fifo */ 30260 sd_fault_injection_on = 0; 30261 30262 if (arg != NULL) { 30263 rval = ddi_copyin((void *)arg, &i, sizeof (uint_t), 0); 30264 if (rval != -1 && 30265 un->sd_fi_fifo_end + i < SD_FI_MAX_ERROR) { 30266 un->sd_fi_fifo_end += i; 30267 } 30268 } else { 30269 SD_INFO(SD_LOG_IOERR, un, 30270 "sd_faultinjection_ioctl: push arg null\n"); 30271 if (un->sd_fi_fifo_end + i < SD_FI_MAX_ERROR) { 30272 un->sd_fi_fifo_end++; 30273 } 30274 } 30275 SD_INFO(SD_LOG_IOERR, un, 30276 "sd_faultinjection_ioctl: push to end=%d\n", 30277 un->sd_fi_fifo_end); 30278 break; 30279 30280 case SDIOCRETRIEVE: 30281 /* Return buffer of log from Injection session */ 30282 SD_INFO(SD_LOG_SDTEST, un, 30283 "sd_faultinjection_ioctl: Injecting Fault Retreive"); 30284 30285 sd_fault_injection_on = 0; 30286 30287 mutex_enter(&(un->un_fi_mutex)); 30288 rval = ddi_copyout(un->sd_fi_log, (void *)arg, 30289 un->sd_fi_buf_len+1, 0); 30290 mutex_exit(&(un->un_fi_mutex)); 30291 30292 if (rval == -1) { 30293 /* 30294 * arg is possibly invalid setting 30295 * it to NULL for return 30296 */ 30297 arg = NULL; 30298 } 30299 break; 30300 } 30301 30302 mutex_exit(SD_MUTEX(un)); 30303 SD_TRACE(SD_LOG_IOERR, un, "sd_faultinjection_ioctl: exit\n"); 30304 } 30305 30306 30307 /* 30308 * Function: sd_injection_log() 30309 * 30310 * Description: This routine adds buff to the already existing injection log 30311 * for retrieval via faultinjection_ioctl for use in fault 30312 * detection and recovery 30313 * 30314 * Arguments: buf - the string to add to the log 30315 */ 30316 30317 static void 30318 sd_injection_log(char *buf, struct sd_lun *un) 30319 { 30320 uint_t len; 30321 30322 ASSERT(un != NULL); 30323 ASSERT(buf != NULL); 30324 30325 mutex_enter(&(un->un_fi_mutex)); 30326 30327 len = min(strlen(buf), 255); 30328 /* Add logged value to Injection log to be returned later */ 30329 if (len + un->sd_fi_buf_len < SD_FI_MAX_BUF) { 30330 uint_t offset = strlen((char *)un->sd_fi_log); 30331 char *destp = (char *)un->sd_fi_log + offset; 30332 int i; 30333 for (i = 0; i < len; i++) { 30334 *destp++ = *buf++; 30335 } 30336 un->sd_fi_buf_len += len; 30337 un->sd_fi_log[un->sd_fi_buf_len] = '\0'; 30338 } 30339 30340 mutex_exit(&(un->un_fi_mutex)); 30341 } 30342 30343 30344 /* 30345 * Function: sd_faultinjection() 30346 * 30347 * Description: This routine takes the pkt and changes its 30348 * content based on error injection scenerio. 30349 * 30350 * Arguments: pktp - packet to be changed 30351 */ 30352 30353 static void 30354 sd_faultinjection(struct scsi_pkt *pktp) 30355 { 30356 uint_t i; 30357 struct sd_fi_pkt *fi_pkt; 30358 struct sd_fi_xb *fi_xb; 30359 struct sd_fi_un *fi_un; 30360 struct sd_fi_arq *fi_arq; 30361 struct buf *bp; 30362 struct sd_xbuf *xb; 30363 struct sd_lun *un; 30364 30365 ASSERT(pktp != NULL); 30366 30367 /* pull bp xb and un from pktp */ 30368 bp = (struct buf *)pktp->pkt_private; 30369 xb = SD_GET_XBUF(bp); 30370 un = SD_GET_UN(bp); 30371 30372 ASSERT(un != NULL); 30373 30374 mutex_enter(SD_MUTEX(un)); 30375 30376 SD_TRACE(SD_LOG_SDTEST, un, 30377 "sd_faultinjection: entry Injection from sdintr\n"); 30378 30379 /* if injection is off return */ 30380 if (sd_fault_injection_on == 0 || 30381 un->sd_fi_fifo_start == un->sd_fi_fifo_end) { 30382 mutex_exit(SD_MUTEX(un)); 30383 return; 30384 } 30385 30386 SD_INFO(SD_LOG_SDTEST, un, 30387 "sd_faultinjection: is working for copying\n"); 30388 30389 /* take next set off fifo */ 30390 i = un->sd_fi_fifo_start % SD_FI_MAX_ERROR; 30391 30392 fi_pkt = un->sd_fi_fifo_pkt[i]; 30393 fi_xb = un->sd_fi_fifo_xb[i]; 30394 fi_un = un->sd_fi_fifo_un[i]; 30395 fi_arq = un->sd_fi_fifo_arq[i]; 30396 30397 30398 /* set variables accordingly */ 30399 /* set pkt if it was on fifo */ 30400 if (fi_pkt != NULL) { 30401 SD_CONDSET(pktp, pkt, pkt_flags, "pkt_flags"); 30402 SD_CONDSET(*pktp, pkt, pkt_scbp, "pkt_scbp"); 30403 if (fi_pkt->pkt_cdbp != 0xff) 30404 SD_CONDSET(*pktp, pkt, pkt_cdbp, "pkt_cdbp"); 30405 SD_CONDSET(pktp, pkt, pkt_state, "pkt_state"); 30406 SD_CONDSET(pktp, pkt, pkt_statistics, "pkt_statistics"); 30407 SD_CONDSET(pktp, pkt, pkt_reason, "pkt_reason"); 30408 30409 } 30410 /* set xb if it was on fifo */ 30411 if (fi_xb != NULL) { 30412 SD_CONDSET(xb, xb, xb_blkno, "xb_blkno"); 30413 SD_CONDSET(xb, xb, xb_dma_resid, "xb_dma_resid"); 30414 if (fi_xb->xb_retry_count != 0) 30415 SD_CONDSET(xb, xb, xb_retry_count, "xb_retry_count"); 30416 SD_CONDSET(xb, xb, xb_victim_retry_count, 30417 "xb_victim_retry_count"); 30418 SD_CONDSET(xb, xb, xb_sense_status, "xb_sense_status"); 30419 SD_CONDSET(xb, xb, xb_sense_state, "xb_sense_state"); 30420 SD_CONDSET(xb, xb, xb_sense_resid, "xb_sense_resid"); 30421 30422 /* copy in block data from sense */ 30423 /* 30424 * if (fi_xb->xb_sense_data[0] != -1) { 30425 * bcopy(fi_xb->xb_sense_data, xb->xb_sense_data, 30426 * SENSE_LENGTH); 30427 * } 30428 */ 30429 bcopy(fi_xb->xb_sense_data, xb->xb_sense_data, SENSE_LENGTH); 30430 30431 /* copy in extended sense codes */ 30432 SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data), 30433 xb, es_code, "es_code"); 30434 SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data), 30435 xb, es_key, "es_key"); 30436 SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data), 30437 xb, es_add_code, "es_add_code"); 30438 SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data), 30439 xb, es_qual_code, "es_qual_code"); 30440 struct scsi_extended_sense *esp; 30441 esp = (struct scsi_extended_sense *)xb->xb_sense_data; 30442 esp->es_class = CLASS_EXTENDED_SENSE; 30443 } 30444 30445 /* set un if it was on fifo */ 30446 if (fi_un != NULL) { 30447 SD_CONDSET(un->un_sd->sd_inq, un, inq_rmb, "inq_rmb"); 30448 SD_CONDSET(un, un, un_ctype, "un_ctype"); 30449 SD_CONDSET(un, un, un_reset_retry_count, 30450 "un_reset_retry_count"); 30451 SD_CONDSET(un, un, un_reservation_type, "un_reservation_type"); 30452 SD_CONDSET(un, un, un_resvd_status, "un_resvd_status"); 30453 SD_CONDSET(un, un, un_f_arq_enabled, "un_f_arq_enabled"); 30454 SD_CONDSET(un, un, un_f_allow_bus_device_reset, 30455 "un_f_allow_bus_device_reset"); 30456 SD_CONDSET(un, un, un_f_opt_queueing, "un_f_opt_queueing"); 30457 30458 } 30459 30460 /* copy in auto request sense if it was on fifo */ 30461 if (fi_arq != NULL) { 30462 bcopy(fi_arq, pktp->pkt_scbp, sizeof (struct sd_fi_arq)); 30463 } 30464 30465 /* free structs */ 30466 if (un->sd_fi_fifo_pkt[i] != NULL) { 30467 kmem_free(un->sd_fi_fifo_pkt[i], sizeof (struct sd_fi_pkt)); 30468 } 30469 if (un->sd_fi_fifo_xb[i] != NULL) { 30470 kmem_free(un->sd_fi_fifo_xb[i], sizeof (struct sd_fi_xb)); 30471 } 30472 if (un->sd_fi_fifo_un[i] != NULL) { 30473 kmem_free(un->sd_fi_fifo_un[i], sizeof (struct sd_fi_un)); 30474 } 30475 if (un->sd_fi_fifo_arq[i] != NULL) { 30476 kmem_free(un->sd_fi_fifo_arq[i], sizeof (struct sd_fi_arq)); 30477 } 30478 30479 /* 30480 * kmem_free does not gurantee to set to NULL 30481 * since we uses these to determine if we set 30482 * values or not lets confirm they are always 30483 * NULL after free 30484 */ 30485 un->sd_fi_fifo_pkt[i] = NULL; 30486 un->sd_fi_fifo_un[i] = NULL; 30487 un->sd_fi_fifo_xb[i] = NULL; 30488 un->sd_fi_fifo_arq[i] = NULL; 30489 30490 un->sd_fi_fifo_start++; 30491 30492 mutex_exit(SD_MUTEX(un)); 30493 30494 SD_INFO(SD_LOG_SDTEST, un, "sd_faultinjection: exit\n"); 30495 } 30496 30497 #endif /* SD_FAULT_INJECTION */ 30498 30499 /* 30500 * This routine is invoked in sd_unit_attach(). Before calling it, the 30501 * properties in conf file should be processed already, and "hotpluggable" 30502 * property was processed also. 30503 * 30504 * The sd driver distinguishes 3 different type of devices: removable media, 30505 * non-removable media, and hotpluggable. Below the differences are defined: 30506 * 30507 * 1. Device ID 30508 * 30509 * The device ID of a device is used to identify this device. Refer to 30510 * ddi_devid_register(9F). 30511 * 30512 * For a non-removable media disk device which can provide 0x80 or 0x83 30513 * VPD page (refer to INQUIRY command of SCSI SPC specification), a unique 30514 * device ID is created to identify this device. For other non-removable 30515 * media devices, a default device ID is created only if this device has 30516 * at least 2 alter cylinders. Otherwise, this device has no devid. 30517 * 30518 * ------------------------------------------------------- 30519 * removable media hotpluggable | Can Have Device ID 30520 * ------------------------------------------------------- 30521 * false false | Yes 30522 * false true | Yes 30523 * true x | No 30524 * ------------------------------------------------------ 30525 * 30526 * 30527 * 2. SCSI group 4 commands 30528 * 30529 * In SCSI specs, only some commands in group 4 command set can use 30530 * 8-byte addresses that can be used to access >2TB storage spaces. 30531 * Other commands have no such capability. Without supporting group4, 30532 * it is impossible to make full use of storage spaces of a disk with 30533 * capacity larger than 2TB. 30534 * 30535 * ----------------------------------------------- 30536 * removable media hotpluggable LP64 | Group 30537 * ----------------------------------------------- 30538 * false false false | 1 30539 * false false true | 4 30540 * false true false | 1 30541 * false true true | 4 30542 * true x x | 5 30543 * ----------------------------------------------- 30544 * 30545 * 30546 * 3. Check for VTOC Label 30547 * 30548 * If a direct-access disk has no EFI label, sd will check if it has a 30549 * valid VTOC label. Now, sd also does that check for removable media 30550 * and hotpluggable devices. 30551 * 30552 * -------------------------------------------------------------- 30553 * Direct-Access removable media hotpluggable | Check Label 30554 * ------------------------------------------------------------- 30555 * false false false | No 30556 * false false true | No 30557 * false true false | Yes 30558 * false true true | Yes 30559 * true x x | Yes 30560 * -------------------------------------------------------------- 30561 * 30562 * 30563 * 4. Building default VTOC label 30564 * 30565 * As section 3 says, sd checks if some kinds of devices have VTOC label. 30566 * If those devices have no valid VTOC label, sd(7d) will attempt to 30567 * create default VTOC for them. Currently sd creates default VTOC label 30568 * for all devices on x86 platform (VTOC_16), but only for removable 30569 * media devices on SPARC (VTOC_8). 30570 * 30571 * ----------------------------------------------------------- 30572 * removable media hotpluggable platform | Default Label 30573 * ----------------------------------------------------------- 30574 * false false sparc | No 30575 * false true x86 | Yes 30576 * false true sparc | Yes 30577 * true x x | Yes 30578 * ---------------------------------------------------------- 30579 * 30580 * 30581 * 5. Supported blocksizes of target devices 30582 * 30583 * Sd supports non-512-byte blocksize for removable media devices only. 30584 * For other devices, only 512-byte blocksize is supported. This may be 30585 * changed in near future because some RAID devices require non-512-byte 30586 * blocksize 30587 * 30588 * ----------------------------------------------------------- 30589 * removable media hotpluggable | non-512-byte blocksize 30590 * ----------------------------------------------------------- 30591 * false false | No 30592 * false true | No 30593 * true x | Yes 30594 * ----------------------------------------------------------- 30595 * 30596 * 30597 * 6. Automatic mount & unmount 30598 * 30599 * Sd(7d) driver provides DKIOCREMOVABLE ioctl. This ioctl is used to query 30600 * if a device is removable media device. It return 1 for removable media 30601 * devices, and 0 for others. 30602 * 30603 * The automatic mounting subsystem should distinguish between the types 30604 * of devices and apply automounting policies to each. 30605 * 30606 * 30607 * 7. fdisk partition management 30608 * 30609 * Fdisk is traditional partition method on x86 platform. Sd(7d) driver 30610 * just supports fdisk partitions on x86 platform. On sparc platform, sd 30611 * doesn't support fdisk partitions at all. Note: pcfs(7fs) can recognize 30612 * fdisk partitions on both x86 and SPARC platform. 30613 * 30614 * ----------------------------------------------------------- 30615 * platform removable media USB/1394 | fdisk supported 30616 * ----------------------------------------------------------- 30617 * x86 X X | true 30618 * ------------------------------------------------------------ 30619 * sparc X X | false 30620 * ------------------------------------------------------------ 30621 * 30622 * 30623 * 8. MBOOT/MBR 30624 * 30625 * Although sd(7d) doesn't support fdisk on SPARC platform, it does support 30626 * read/write mboot for removable media devices on sparc platform. 30627 * 30628 * ----------------------------------------------------------- 30629 * platform removable media USB/1394 | mboot supported 30630 * ----------------------------------------------------------- 30631 * x86 X X | true 30632 * ------------------------------------------------------------ 30633 * sparc false false | false 30634 * sparc false true | true 30635 * sparc true false | true 30636 * sparc true true | true 30637 * ------------------------------------------------------------ 30638 * 30639 * 30640 * 9. error handling during opening device 30641 * 30642 * If failed to open a disk device, an errno is returned. For some kinds 30643 * of errors, different errno is returned depending on if this device is 30644 * a removable media device. This brings USB/1394 hard disks in line with 30645 * expected hard disk behavior. It is not expected that this breaks any 30646 * application. 30647 * 30648 * ------------------------------------------------------ 30649 * removable media hotpluggable | errno 30650 * ------------------------------------------------------ 30651 * false false | EIO 30652 * false true | EIO 30653 * true x | ENXIO 30654 * ------------------------------------------------------ 30655 * 30656 * 30657 * 11. ioctls: DKIOCEJECT, CDROMEJECT 30658 * 30659 * These IOCTLs are applicable only to removable media devices. 30660 * 30661 * ----------------------------------------------------------- 30662 * removable media hotpluggable |DKIOCEJECT, CDROMEJECT 30663 * ----------------------------------------------------------- 30664 * false false | No 30665 * false true | No 30666 * true x | Yes 30667 * ----------------------------------------------------------- 30668 * 30669 * 30670 * 12. Kstats for partitions 30671 * 30672 * sd creates partition kstat for non-removable media devices. USB and 30673 * Firewire hard disks now have partition kstats 30674 * 30675 * ------------------------------------------------------ 30676 * removable media hotpluggable | kstat 30677 * ------------------------------------------------------ 30678 * false false | Yes 30679 * false true | Yes 30680 * true x | No 30681 * ------------------------------------------------------ 30682 * 30683 * 30684 * 13. Removable media & hotpluggable properties 30685 * 30686 * Sd driver creates a "removable-media" property for removable media 30687 * devices. Parent nexus drivers create a "hotpluggable" property if 30688 * it supports hotplugging. 30689 * 30690 * --------------------------------------------------------------------- 30691 * removable media hotpluggable | "removable-media" " hotpluggable" 30692 * --------------------------------------------------------------------- 30693 * false false | No No 30694 * false true | No Yes 30695 * true false | Yes No 30696 * true true | Yes Yes 30697 * --------------------------------------------------------------------- 30698 * 30699 * 30700 * 14. Power Management 30701 * 30702 * sd only power manages removable media devices or devices that support 30703 * LOG_SENSE or have a "pm-capable" property (PSARC/2002/250) 30704 * 30705 * A parent nexus that supports hotplugging can also set "pm-capable" 30706 * if the disk can be power managed. 30707 * 30708 * ------------------------------------------------------------ 30709 * removable media hotpluggable pm-capable | power manage 30710 * ------------------------------------------------------------ 30711 * false false false | No 30712 * false false true | Yes 30713 * false true false | No 30714 * false true true | Yes 30715 * true x x | Yes 30716 * ------------------------------------------------------------ 30717 * 30718 * USB and firewire hard disks can now be power managed independently 30719 * of the framebuffer 30720 * 30721 * 30722 * 15. Support for USB disks with capacity larger than 1TB 30723 * 30724 * Currently, sd doesn't permit a fixed disk device with capacity 30725 * larger than 1TB to be used in a 32-bit operating system environment. 30726 * However, sd doesn't do that for removable media devices. Instead, it 30727 * assumes that removable media devices cannot have a capacity larger 30728 * than 1TB. Therefore, using those devices on 32-bit system is partially 30729 * supported, which can cause some unexpected results. 30730 * 30731 * --------------------------------------------------------------------- 30732 * removable media USB/1394 | Capacity > 1TB | Used in 32-bit env 30733 * --------------------------------------------------------------------- 30734 * false false | true | no 30735 * false true | true | no 30736 * true false | true | Yes 30737 * true true | true | Yes 30738 * --------------------------------------------------------------------- 30739 * 30740 * 30741 * 16. Check write-protection at open time 30742 * 30743 * When a removable media device is being opened for writing without NDELAY 30744 * flag, sd will check if this device is writable. If attempting to open 30745 * without NDELAY flag a write-protected device, this operation will abort. 30746 * 30747 * ------------------------------------------------------------ 30748 * removable media USB/1394 | WP Check 30749 * ------------------------------------------------------------ 30750 * false false | No 30751 * false true | No 30752 * true false | Yes 30753 * true true | Yes 30754 * ------------------------------------------------------------ 30755 * 30756 * 30757 * 17. syslog when corrupted VTOC is encountered 30758 * 30759 * Currently, if an invalid VTOC is encountered, sd only print syslog 30760 * for fixed SCSI disks. 30761 * ------------------------------------------------------------ 30762 * removable media USB/1394 | print syslog 30763 * ------------------------------------------------------------ 30764 * false false | Yes 30765 * false true | No 30766 * true false | No 30767 * true true | No 30768 * ------------------------------------------------------------ 30769 */ 30770 static void 30771 sd_set_unit_attributes(struct sd_lun *un, dev_info_t *devi) 30772 { 30773 int pm_cap; 30774 30775 ASSERT(un->un_sd); 30776 ASSERT(un->un_sd->sd_inq); 30777 30778 /* 30779 * Enable SYNC CACHE support for all devices. 30780 */ 30781 un->un_f_sync_cache_supported = TRUE; 30782 30783 /* 30784 * Set the sync cache required flag to false. 30785 * This would ensure that there is no SYNC CACHE 30786 * sent when there are no writes 30787 */ 30788 un->un_f_sync_cache_required = FALSE; 30789 30790 if (un->un_sd->sd_inq->inq_rmb) { 30791 /* 30792 * The media of this device is removable. And for this kind 30793 * of devices, it is possible to change medium after opening 30794 * devices. Thus we should support this operation. 30795 */ 30796 un->un_f_has_removable_media = TRUE; 30797 30798 /* 30799 * support non-512-byte blocksize of removable media devices 30800 */ 30801 un->un_f_non_devbsize_supported = TRUE; 30802 30803 /* 30804 * Assume that all removable media devices support DOOR_LOCK 30805 */ 30806 un->un_f_doorlock_supported = TRUE; 30807 30808 /* 30809 * For a removable media device, it is possible to be opened 30810 * with NDELAY flag when there is no media in drive, in this 30811 * case we don't care if device is writable. But if without 30812 * NDELAY flag, we need to check if media is write-protected. 30813 */ 30814 un->un_f_chk_wp_open = TRUE; 30815 30816 /* 30817 * need to start a SCSI watch thread to monitor media state, 30818 * when media is being inserted or ejected, notify syseventd. 30819 */ 30820 un->un_f_monitor_media_state = TRUE; 30821 30822 /* 30823 * Some devices don't support START_STOP_UNIT command. 30824 * Therefore, we'd better check if a device supports it 30825 * before sending it. 30826 */ 30827 un->un_f_check_start_stop = TRUE; 30828 30829 /* 30830 * support eject media ioctl: 30831 * FDEJECT, DKIOCEJECT, CDROMEJECT 30832 */ 30833 un->un_f_eject_media_supported = TRUE; 30834 30835 /* 30836 * Because many removable-media devices don't support 30837 * LOG_SENSE, we couldn't use this command to check if 30838 * a removable media device support power-management. 30839 * We assume that they support power-management via 30840 * START_STOP_UNIT command and can be spun up and down 30841 * without limitations. 30842 */ 30843 un->un_f_pm_supported = TRUE; 30844 30845 /* 30846 * Need to create a zero length (Boolean) property 30847 * removable-media for the removable media devices. 30848 * Note that the return value of the property is not being 30849 * checked, since if unable to create the property 30850 * then do not want the attach to fail altogether. Consistent 30851 * with other property creation in attach. 30852 */ 30853 (void) ddi_prop_create(DDI_DEV_T_NONE, devi, 30854 DDI_PROP_CANSLEEP, "removable-media", NULL, 0); 30855 30856 } else { 30857 /* 30858 * create device ID for device 30859 */ 30860 un->un_f_devid_supported = TRUE; 30861 30862 /* 30863 * Spin up non-removable-media devices once it is attached 30864 */ 30865 un->un_f_attach_spinup = TRUE; 30866 30867 /* 30868 * According to SCSI specification, Sense data has two kinds of 30869 * format: fixed format, and descriptor format. At present, we 30870 * don't support descriptor format sense data for removable 30871 * media. 30872 */ 30873 if (SD_INQUIRY(un)->inq_dtype == DTYPE_DIRECT) { 30874 un->un_f_descr_format_supported = TRUE; 30875 } 30876 30877 /* 30878 * kstats are created only for non-removable media devices. 30879 * 30880 * Set this in sd.conf to 0 in order to disable kstats. The 30881 * default is 1, so they are enabled by default. 30882 */ 30883 un->un_f_pkstats_enabled = (ddi_prop_get_int(DDI_DEV_T_ANY, 30884 SD_DEVINFO(un), DDI_PROP_DONTPASS, 30885 "enable-partition-kstats", 1)); 30886 30887 /* 30888 * Check if HBA has set the "pm-capable" property. 30889 * If "pm-capable" exists and is non-zero then we can 30890 * power manage the device without checking the start/stop 30891 * cycle count log sense page. 30892 * 30893 * If "pm-capable" exists and is set to be false (0), 30894 * then we should not power manage the device. 30895 * 30896 * If "pm-capable" doesn't exist then pm_cap will 30897 * be set to SD_PM_CAPABLE_UNDEFINED (-1). In this case, 30898 * sd will check the start/stop cycle count log sense page 30899 * and power manage the device if the cycle count limit has 30900 * not been exceeded. 30901 */ 30902 pm_cap = ddi_prop_get_int(DDI_DEV_T_ANY, devi, 30903 DDI_PROP_DONTPASS, "pm-capable", SD_PM_CAPABLE_UNDEFINED); 30904 if (SD_PM_CAPABLE_IS_UNDEFINED(pm_cap)) { 30905 un->un_f_log_sense_supported = TRUE; 30906 if (!un->un_f_power_condition_disabled && 30907 SD_INQUIRY(un)->inq_ansi == 6) { 30908 un->un_f_power_condition_supported = TRUE; 30909 } 30910 } else { 30911 /* 30912 * pm-capable property exists. 30913 * 30914 * Convert "TRUE" values for pm_cap to 30915 * SD_PM_CAPABLE_IS_TRUE to make it easier to check 30916 * later. "TRUE" values are any values defined in 30917 * inquiry.h. 30918 */ 30919 if (SD_PM_CAPABLE_IS_FALSE(pm_cap)) { 30920 un->un_f_log_sense_supported = FALSE; 30921 } else { 30922 /* SD_PM_CAPABLE_IS_TRUE case */ 30923 un->un_f_pm_supported = TRUE; 30924 if (!un->un_f_power_condition_disabled && 30925 SD_PM_CAPABLE_IS_SPC_4(pm_cap)) { 30926 un->un_f_power_condition_supported = 30927 TRUE; 30928 } 30929 if (SD_PM_CAP_LOG_SUPPORTED(pm_cap)) { 30930 un->un_f_log_sense_supported = TRUE; 30931 un->un_f_pm_log_sense_smart = 30932 SD_PM_CAP_SMART_LOG(pm_cap); 30933 } 30934 } 30935 30936 SD_INFO(SD_LOG_ATTACH_DETACH, un, 30937 "sd_unit_attach: un:0x%p pm-capable " 30938 "property set to %d.\n", un, un->un_f_pm_supported); 30939 } 30940 } 30941 30942 if (un->un_f_is_hotpluggable) { 30943 30944 /* 30945 * Have to watch hotpluggable devices as well, since 30946 * that's the only way for userland applications to 30947 * detect hot removal while device is busy/mounted. 30948 */ 30949 un->un_f_monitor_media_state = TRUE; 30950 30951 un->un_f_check_start_stop = TRUE; 30952 30953 } 30954 } 30955 30956 /* 30957 * sd_tg_rdwr: 30958 * Provides rdwr access for cmlb via sd_tgops. The start_block is 30959 * in sys block size, req_length in bytes. 30960 * 30961 */ 30962 static int 30963 sd_tg_rdwr(dev_info_t *devi, uchar_t cmd, void *bufaddr, 30964 diskaddr_t start_block, size_t reqlength, void *tg_cookie) 30965 { 30966 struct sd_lun *un; 30967 int path_flag = (int)(uintptr_t)tg_cookie; 30968 char *dkl = NULL; 30969 diskaddr_t real_addr = start_block; 30970 diskaddr_t first_byte, end_block; 30971 30972 size_t buffer_size = reqlength; 30973 int rval = 0; 30974 diskaddr_t cap; 30975 uint32_t lbasize; 30976 sd_ssc_t *ssc; 30977 30978 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi)); 30979 if (un == NULL) 30980 return (ENXIO); 30981 30982 if (cmd != TG_READ && cmd != TG_WRITE) 30983 return (EINVAL); 30984 30985 ssc = sd_ssc_init(un); 30986 mutex_enter(SD_MUTEX(un)); 30987 if (un->un_f_tgt_blocksize_is_valid == FALSE) { 30988 mutex_exit(SD_MUTEX(un)); 30989 rval = sd_send_scsi_READ_CAPACITY(ssc, (uint64_t *)&cap, 30990 &lbasize, path_flag); 30991 if (rval != 0) 30992 goto done1; 30993 mutex_enter(SD_MUTEX(un)); 30994 sd_update_block_info(un, lbasize, cap); 30995 if ((un->un_f_tgt_blocksize_is_valid == FALSE)) { 30996 mutex_exit(SD_MUTEX(un)); 30997 rval = EIO; 30998 goto done; 30999 } 31000 } 31001 31002 if (NOT_DEVBSIZE(un)) { 31003 /* 31004 * sys_blocksize != tgt_blocksize, need to re-adjust 31005 * blkno and save the index to beginning of dk_label 31006 */ 31007 first_byte = SD_SYSBLOCKS2BYTES(start_block); 31008 real_addr = first_byte / un->un_tgt_blocksize; 31009 31010 end_block = (first_byte + reqlength + 31011 un->un_tgt_blocksize - 1) / un->un_tgt_blocksize; 31012 31013 /* round up buffer size to multiple of target block size */ 31014 buffer_size = (end_block - real_addr) * un->un_tgt_blocksize; 31015 31016 SD_TRACE(SD_LOG_IO_PARTITION, un, "sd_tg_rdwr", 31017 "label_addr: 0x%x allocation size: 0x%x\n", 31018 real_addr, buffer_size); 31019 31020 if (((first_byte % un->un_tgt_blocksize) != 0) || 31021 (reqlength % un->un_tgt_blocksize) != 0) 31022 /* the request is not aligned */ 31023 dkl = kmem_zalloc(buffer_size, KM_SLEEP); 31024 } 31025 31026 /* 31027 * The MMC standard allows READ CAPACITY to be 31028 * inaccurate by a bounded amount (in the interest of 31029 * response latency). As a result, failed READs are 31030 * commonplace (due to the reading of metadata and not 31031 * data). Depending on the per-Vendor/drive Sense data, 31032 * the failed READ can cause many (unnecessary) retries. 31033 */ 31034 31035 if (ISCD(un) && (cmd == TG_READ) && 31036 (un->un_f_blockcount_is_valid == TRUE) && 31037 ((start_block == (un->un_blockcount - 1))|| 31038 (start_block == (un->un_blockcount - 2)))) { 31039 path_flag = SD_PATH_DIRECT_PRIORITY; 31040 } 31041 31042 mutex_exit(SD_MUTEX(un)); 31043 if (cmd == TG_READ) { 31044 rval = sd_send_scsi_READ(ssc, (dkl != NULL)? dkl: bufaddr, 31045 buffer_size, real_addr, path_flag); 31046 if (dkl != NULL) 31047 bcopy(dkl + SD_TGTBYTEOFFSET(un, start_block, 31048 real_addr), bufaddr, reqlength); 31049 } else { 31050 if (dkl) { 31051 rval = sd_send_scsi_READ(ssc, dkl, buffer_size, 31052 real_addr, path_flag); 31053 if (rval) { 31054 goto done1; 31055 } 31056 bcopy(bufaddr, dkl + SD_TGTBYTEOFFSET(un, start_block, 31057 real_addr), reqlength); 31058 } 31059 rval = sd_send_scsi_WRITE(ssc, (dkl != NULL)? dkl: bufaddr, 31060 buffer_size, real_addr, path_flag); 31061 } 31062 31063 done1: 31064 if (dkl != NULL) 31065 kmem_free(dkl, buffer_size); 31066 31067 if (rval != 0) { 31068 if (rval == EIO) 31069 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 31070 else 31071 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 31072 } 31073 done: 31074 sd_ssc_fini(ssc); 31075 return (rval); 31076 } 31077 31078 31079 static int 31080 sd_tg_getinfo(dev_info_t *devi, int cmd, void *arg, void *tg_cookie) 31081 { 31082 31083 struct sd_lun *un; 31084 diskaddr_t cap; 31085 uint32_t lbasize; 31086 int path_flag = (int)(uintptr_t)tg_cookie; 31087 int ret = 0; 31088 31089 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi)); 31090 if (un == NULL) 31091 return (ENXIO); 31092 31093 switch (cmd) { 31094 case TG_GETPHYGEOM: 31095 case TG_GETVIRTGEOM: 31096 case TG_GETCAPACITY: 31097 case TG_GETBLOCKSIZE: 31098 mutex_enter(SD_MUTEX(un)); 31099 31100 if ((un->un_f_blockcount_is_valid == TRUE) && 31101 (un->un_f_tgt_blocksize_is_valid == TRUE)) { 31102 cap = un->un_blockcount; 31103 lbasize = un->un_tgt_blocksize; 31104 mutex_exit(SD_MUTEX(un)); 31105 } else { 31106 sd_ssc_t *ssc; 31107 mutex_exit(SD_MUTEX(un)); 31108 ssc = sd_ssc_init(un); 31109 ret = sd_send_scsi_READ_CAPACITY(ssc, (uint64_t *)&cap, 31110 &lbasize, path_flag); 31111 if (ret != 0) { 31112 if (ret == EIO) 31113 sd_ssc_assessment(ssc, 31114 SD_FMT_STATUS_CHECK); 31115 else 31116 sd_ssc_assessment(ssc, 31117 SD_FMT_IGNORE); 31118 sd_ssc_fini(ssc); 31119 return (ret); 31120 } 31121 sd_ssc_fini(ssc); 31122 mutex_enter(SD_MUTEX(un)); 31123 sd_update_block_info(un, lbasize, cap); 31124 if ((un->un_f_blockcount_is_valid == FALSE) || 31125 (un->un_f_tgt_blocksize_is_valid == FALSE)) { 31126 mutex_exit(SD_MUTEX(un)); 31127 return (EIO); 31128 } 31129 mutex_exit(SD_MUTEX(un)); 31130 } 31131 31132 if (cmd == TG_GETCAPACITY) { 31133 *(diskaddr_t *)arg = cap; 31134 return (0); 31135 } 31136 31137 if (cmd == TG_GETBLOCKSIZE) { 31138 *(uint32_t *)arg = lbasize; 31139 return (0); 31140 } 31141 31142 if (cmd == TG_GETPHYGEOM) 31143 ret = sd_get_physical_geometry(un, (cmlb_geom_t *)arg, 31144 cap, lbasize, path_flag); 31145 else 31146 /* TG_GETVIRTGEOM */ 31147 ret = sd_get_virtual_geometry(un, 31148 (cmlb_geom_t *)arg, cap, lbasize); 31149 31150 return (ret); 31151 31152 case TG_GETATTR: 31153 mutex_enter(SD_MUTEX(un)); 31154 ((tg_attribute_t *)arg)->media_is_writable = 31155 un->un_f_mmc_writable_media; 31156 ((tg_attribute_t *)arg)->media_is_solid_state = 31157 un->un_f_is_solid_state; 31158 ((tg_attribute_t *)arg)->media_is_rotational = 31159 un->un_f_is_rotational; 31160 mutex_exit(SD_MUTEX(un)); 31161 return (0); 31162 default: 31163 return (ENOTTY); 31164 31165 } 31166 } 31167 31168 /* 31169 * Function: sd_ssc_ereport_post 31170 * 31171 * Description: Will be called when SD driver need to post an ereport. 31172 * 31173 * Context: Kernel thread or interrupt context. 31174 */ 31175 31176 #define DEVID_IF_KNOWN(d) "devid", DATA_TYPE_STRING, (d) ? (d) : "unknown" 31177 31178 static void 31179 sd_ssc_ereport_post(sd_ssc_t *ssc, enum sd_driver_assessment drv_assess) 31180 { 31181 int uscsi_path_instance = 0; 31182 uchar_t uscsi_pkt_reason; 31183 uint32_t uscsi_pkt_state; 31184 uint32_t uscsi_pkt_statistics; 31185 uint64_t uscsi_ena; 31186 uchar_t op_code; 31187 uint8_t *sensep; 31188 union scsi_cdb *cdbp; 31189 uint_t cdblen = 0; 31190 uint_t senlen = 0; 31191 struct sd_lun *un; 31192 dev_info_t *dip; 31193 char *devid; 31194 int ssc_invalid_flags = SSC_FLAGS_INVALID_PKT_REASON | 31195 SSC_FLAGS_INVALID_STATUS | 31196 SSC_FLAGS_INVALID_SENSE | 31197 SSC_FLAGS_INVALID_DATA; 31198 char assessment[16]; 31199 31200 ASSERT(ssc != NULL); 31201 ASSERT(ssc->ssc_uscsi_cmd != NULL); 31202 ASSERT(ssc->ssc_uscsi_info != NULL); 31203 31204 un = ssc->ssc_un; 31205 ASSERT(un != NULL); 31206 31207 dip = un->un_sd->sd_dev; 31208 31209 /* 31210 * Get the devid: 31211 * devid will only be passed to non-transport error reports. 31212 */ 31213 devid = DEVI(dip)->devi_devid_str; 31214 31215 /* 31216 * If we are syncing or dumping, the command will not be executed 31217 * so we bypass this situation. 31218 */ 31219 if (ddi_in_panic() || (un->un_state == SD_STATE_SUSPENDED) || 31220 (un->un_state == SD_STATE_DUMPING)) 31221 return; 31222 31223 uscsi_pkt_reason = ssc->ssc_uscsi_info->ui_pkt_reason; 31224 uscsi_path_instance = ssc->ssc_uscsi_cmd->uscsi_path_instance; 31225 uscsi_pkt_state = ssc->ssc_uscsi_info->ui_pkt_state; 31226 uscsi_pkt_statistics = ssc->ssc_uscsi_info->ui_pkt_statistics; 31227 uscsi_ena = ssc->ssc_uscsi_info->ui_ena; 31228 31229 sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf; 31230 cdbp = (union scsi_cdb *)ssc->ssc_uscsi_cmd->uscsi_cdb; 31231 31232 /* In rare cases, EG:DOORLOCK, the cdb could be NULL */ 31233 if (cdbp == NULL) { 31234 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 31235 "sd_ssc_ereport_post meet empty cdb\n"); 31236 return; 31237 } 31238 31239 op_code = cdbp->scc_cmd; 31240 31241 cdblen = (int)ssc->ssc_uscsi_cmd->uscsi_cdblen; 31242 senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen - 31243 ssc->ssc_uscsi_cmd->uscsi_rqresid); 31244 31245 if (senlen > 0) 31246 ASSERT(sensep != NULL); 31247 31248 /* 31249 * Initialize drv_assess to corresponding values. 31250 * SD_FM_DRV_FATAL will be mapped to "fail" or "fatal" depending 31251 * on the sense-key returned back. 31252 */ 31253 switch (drv_assess) { 31254 case SD_FM_DRV_RECOVERY: 31255 (void) sprintf(assessment, "%s", "recovered"); 31256 break; 31257 case SD_FM_DRV_RETRY: 31258 (void) sprintf(assessment, "%s", "retry"); 31259 break; 31260 case SD_FM_DRV_NOTICE: 31261 (void) sprintf(assessment, "%s", "info"); 31262 break; 31263 case SD_FM_DRV_FATAL: 31264 default: 31265 (void) sprintf(assessment, "%s", "unknown"); 31266 } 31267 /* 31268 * If drv_assess == SD_FM_DRV_RECOVERY, this should be a recovered 31269 * command, we will post ereport.io.scsi.cmd.disk.recovered. 31270 * driver-assessment will always be "recovered" here. 31271 */ 31272 if (drv_assess == SD_FM_DRV_RECOVERY) { 31273 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, NULL, 31274 "cmd.disk.recovered", uscsi_ena, devid, NULL, 31275 DDI_NOSLEEP, NULL, 31276 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 31277 DEVID_IF_KNOWN(devid), 31278 "driver-assessment", DATA_TYPE_STRING, assessment, 31279 "op-code", DATA_TYPE_UINT8, op_code, 31280 "cdb", DATA_TYPE_UINT8_ARRAY, 31281 cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb, 31282 "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason, 31283 "pkt-state", DATA_TYPE_UINT32, uscsi_pkt_state, 31284 "pkt-stats", DATA_TYPE_UINT32, uscsi_pkt_statistics, 31285 NULL); 31286 return; 31287 } 31288 31289 /* 31290 * If there is un-expected/un-decodable data, we should post 31291 * ereport.io.scsi.cmd.disk.dev.uderr. 31292 * driver-assessment will be set based on parameter drv_assess. 31293 * SSC_FLAGS_INVALID_SENSE - invalid sense data sent back. 31294 * SSC_FLAGS_INVALID_PKT_REASON - invalid pkt-reason encountered. 31295 * SSC_FLAGS_INVALID_STATUS - invalid stat-code encountered. 31296 * SSC_FLAGS_INVALID_DATA - invalid data sent back. 31297 */ 31298 if (ssc->ssc_flags & ssc_invalid_flags) { 31299 if (ssc->ssc_flags & SSC_FLAGS_INVALID_SENSE) { 31300 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, 31301 NULL, "cmd.disk.dev.uderr", uscsi_ena, devid, 31302 NULL, DDI_NOSLEEP, NULL, 31303 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 31304 DEVID_IF_KNOWN(devid), 31305 "driver-assessment", DATA_TYPE_STRING, 31306 drv_assess == SD_FM_DRV_FATAL ? 31307 "fail" : assessment, 31308 "op-code", DATA_TYPE_UINT8, op_code, 31309 "cdb", DATA_TYPE_UINT8_ARRAY, 31310 cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb, 31311 "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason, 31312 "pkt-state", DATA_TYPE_UINT32, uscsi_pkt_state, 31313 "pkt-stats", DATA_TYPE_UINT32, 31314 uscsi_pkt_statistics, 31315 "stat-code", DATA_TYPE_UINT8, 31316 ssc->ssc_uscsi_cmd->uscsi_status, 31317 "un-decode-info", DATA_TYPE_STRING, 31318 ssc->ssc_info, 31319 "un-decode-value", DATA_TYPE_UINT8_ARRAY, 31320 senlen, sensep, 31321 NULL); 31322 } else { 31323 /* 31324 * For other type of invalid data, the 31325 * un-decode-value field would be empty because the 31326 * un-decodable content could be seen from upper 31327 * level payload or inside un-decode-info. 31328 */ 31329 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, 31330 NULL, 31331 "cmd.disk.dev.uderr", uscsi_ena, devid, 31332 NULL, DDI_NOSLEEP, NULL, 31333 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 31334 DEVID_IF_KNOWN(devid), 31335 "driver-assessment", DATA_TYPE_STRING, 31336 drv_assess == SD_FM_DRV_FATAL ? 31337 "fail" : assessment, 31338 "op-code", DATA_TYPE_UINT8, op_code, 31339 "cdb", DATA_TYPE_UINT8_ARRAY, 31340 cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb, 31341 "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason, 31342 "pkt-state", DATA_TYPE_UINT32, uscsi_pkt_state, 31343 "pkt-stats", DATA_TYPE_UINT32, 31344 uscsi_pkt_statistics, 31345 "stat-code", DATA_TYPE_UINT8, 31346 ssc->ssc_uscsi_cmd->uscsi_status, 31347 "un-decode-info", DATA_TYPE_STRING, 31348 ssc->ssc_info, 31349 "un-decode-value", DATA_TYPE_UINT8_ARRAY, 31350 0, NULL, 31351 NULL); 31352 } 31353 ssc->ssc_flags &= ~ssc_invalid_flags; 31354 return; 31355 } 31356 31357 if (uscsi_pkt_reason != CMD_CMPLT || 31358 (ssc->ssc_flags & SSC_FLAGS_TRAN_ABORT)) { 31359 /* 31360 * pkt-reason != CMD_CMPLT or SSC_FLAGS_TRAN_ABORT was 31361 * set inside sd_start_cmds due to errors(bad packet or 31362 * fatal transport error), we should take it as a 31363 * transport error, so we post ereport.io.scsi.cmd.disk.tran. 31364 * driver-assessment will be set based on drv_assess. 31365 * We will set devid to NULL because it is a transport 31366 * error. 31367 */ 31368 if (ssc->ssc_flags & SSC_FLAGS_TRAN_ABORT) 31369 ssc->ssc_flags &= ~SSC_FLAGS_TRAN_ABORT; 31370 31371 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, NULL, 31372 "cmd.disk.tran", uscsi_ena, NULL, NULL, DDI_NOSLEEP, NULL, 31373 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 31374 DEVID_IF_KNOWN(devid), 31375 "driver-assessment", DATA_TYPE_STRING, 31376 drv_assess == SD_FM_DRV_FATAL ? "fail" : assessment, 31377 "op-code", DATA_TYPE_UINT8, op_code, 31378 "cdb", DATA_TYPE_UINT8_ARRAY, 31379 cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb, 31380 "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason, 31381 "pkt-state", DATA_TYPE_UINT8, uscsi_pkt_state, 31382 "pkt-stats", DATA_TYPE_UINT32, uscsi_pkt_statistics, 31383 NULL); 31384 } else { 31385 /* 31386 * If we got here, we have a completed command, and we need 31387 * to further investigate the sense data to see what kind 31388 * of ereport we should post. 31389 * No ereport is needed if sense-key is KEY_RECOVERABLE_ERROR 31390 * and asc/ascq is "ATA PASS-THROUGH INFORMATION AVAILABLE". 31391 * Post ereport.io.scsi.cmd.disk.dev.rqs.merr if sense-key is 31392 * KEY_MEDIUM_ERROR. 31393 * Post ereport.io.scsi.cmd.disk.dev.rqs.derr otherwise. 31394 * driver-assessment will be set based on the parameter 31395 * drv_assess. 31396 */ 31397 if (senlen > 0) { 31398 /* 31399 * Here we have sense data available. 31400 */ 31401 uint8_t sense_key = scsi_sense_key(sensep); 31402 uint8_t sense_asc = scsi_sense_asc(sensep); 31403 uint8_t sense_ascq = scsi_sense_ascq(sensep); 31404 31405 if (sense_key == KEY_RECOVERABLE_ERROR && 31406 sense_asc == 0x00 && sense_ascq == 0x1d) 31407 return; 31408 31409 if (sense_key == KEY_MEDIUM_ERROR) { 31410 /* 31411 * driver-assessment should be "fatal" if 31412 * drv_assess is SD_FM_DRV_FATAL. 31413 */ 31414 scsi_fm_ereport_post(un->un_sd, 31415 uscsi_path_instance, NULL, 31416 "cmd.disk.dev.rqs.merr", 31417 uscsi_ena, devid, NULL, DDI_NOSLEEP, NULL, 31418 FM_VERSION, DATA_TYPE_UINT8, 31419 FM_EREPORT_VERS0, 31420 DEVID_IF_KNOWN(devid), 31421 "driver-assessment", 31422 DATA_TYPE_STRING, 31423 drv_assess == SD_FM_DRV_FATAL ? 31424 "fatal" : assessment, 31425 "op-code", 31426 DATA_TYPE_UINT8, op_code, 31427 "cdb", 31428 DATA_TYPE_UINT8_ARRAY, cdblen, 31429 ssc->ssc_uscsi_cmd->uscsi_cdb, 31430 "pkt-reason", 31431 DATA_TYPE_UINT8, uscsi_pkt_reason, 31432 "pkt-state", 31433 DATA_TYPE_UINT8, uscsi_pkt_state, 31434 "pkt-stats", 31435 DATA_TYPE_UINT32, 31436 uscsi_pkt_statistics, 31437 "stat-code", 31438 DATA_TYPE_UINT8, 31439 ssc->ssc_uscsi_cmd->uscsi_status, 31440 "key", 31441 DATA_TYPE_UINT8, 31442 scsi_sense_key(sensep), 31443 "asc", 31444 DATA_TYPE_UINT8, 31445 scsi_sense_asc(sensep), 31446 "ascq", 31447 DATA_TYPE_UINT8, 31448 scsi_sense_ascq(sensep), 31449 "sense-data", 31450 DATA_TYPE_UINT8_ARRAY, 31451 senlen, sensep, 31452 "lba", 31453 DATA_TYPE_UINT64, 31454 ssc->ssc_uscsi_info->ui_lba, 31455 NULL); 31456 } else { 31457 /* 31458 * if sense-key == 0x4(hardware 31459 * error), driver-assessment should 31460 * be "fatal" if drv_assess is 31461 * SD_FM_DRV_FATAL. 31462 */ 31463 scsi_fm_ereport_post(un->un_sd, 31464 uscsi_path_instance, NULL, 31465 "cmd.disk.dev.rqs.derr", 31466 uscsi_ena, devid, 31467 NULL, DDI_NOSLEEP, NULL, 31468 FM_VERSION, 31469 DATA_TYPE_UINT8, FM_EREPORT_VERS0, 31470 DEVID_IF_KNOWN(devid), 31471 "driver-assessment", 31472 DATA_TYPE_STRING, 31473 drv_assess == SD_FM_DRV_FATAL ? 31474 (sense_key == 0x4 ? 31475 "fatal" : "fail") : assessment, 31476 "op-code", 31477 DATA_TYPE_UINT8, op_code, 31478 "cdb", 31479 DATA_TYPE_UINT8_ARRAY, cdblen, 31480 ssc->ssc_uscsi_cmd->uscsi_cdb, 31481 "pkt-reason", 31482 DATA_TYPE_UINT8, uscsi_pkt_reason, 31483 "pkt-state", 31484 DATA_TYPE_UINT8, uscsi_pkt_state, 31485 "pkt-stats", 31486 DATA_TYPE_UINT32, 31487 uscsi_pkt_statistics, 31488 "stat-code", 31489 DATA_TYPE_UINT8, 31490 ssc->ssc_uscsi_cmd->uscsi_status, 31491 "key", 31492 DATA_TYPE_UINT8, 31493 scsi_sense_key(sensep), 31494 "asc", 31495 DATA_TYPE_UINT8, 31496 scsi_sense_asc(sensep), 31497 "ascq", 31498 DATA_TYPE_UINT8, 31499 scsi_sense_ascq(sensep), 31500 "sense-data", 31501 DATA_TYPE_UINT8_ARRAY, 31502 senlen, sensep, 31503 NULL); 31504 } 31505 } else { 31506 /* 31507 * For stat_code == STATUS_GOOD, this is not a 31508 * hardware error. 31509 */ 31510 if (ssc->ssc_uscsi_cmd->uscsi_status == STATUS_GOOD) 31511 return; 31512 31513 /* 31514 * Post ereport.io.scsi.cmd.disk.dev.serr if we got the 31515 * stat-code but with sense data unavailable. 31516 * driver-assessment will be set based on parameter 31517 * drv_assess. 31518 */ 31519 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, 31520 NULL, 31521 "cmd.disk.dev.serr", uscsi_ena, 31522 devid, NULL, DDI_NOSLEEP, NULL, 31523 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 31524 DEVID_IF_KNOWN(devid), 31525 "driver-assessment", DATA_TYPE_STRING, 31526 drv_assess == SD_FM_DRV_FATAL ? "fail" : assessment, 31527 "op-code", DATA_TYPE_UINT8, op_code, 31528 "cdb", 31529 DATA_TYPE_UINT8_ARRAY, 31530 cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb, 31531 "pkt-reason", 31532 DATA_TYPE_UINT8, uscsi_pkt_reason, 31533 "pkt-state", 31534 DATA_TYPE_UINT8, uscsi_pkt_state, 31535 "pkt-stats", 31536 DATA_TYPE_UINT32, uscsi_pkt_statistics, 31537 "stat-code", 31538 DATA_TYPE_UINT8, 31539 ssc->ssc_uscsi_cmd->uscsi_status, 31540 NULL); 31541 } 31542 } 31543 } 31544 31545 /* 31546 * Function: sd_ssc_extract_info 31547 * 31548 * Description: Extract information available to help generate ereport. 31549 * 31550 * Context: Kernel thread or interrupt context. 31551 */ 31552 static void 31553 sd_ssc_extract_info(sd_ssc_t *ssc, struct sd_lun *un, struct scsi_pkt *pktp, 31554 struct buf *bp, struct sd_xbuf *xp) 31555 { 31556 size_t senlen = 0; 31557 union scsi_cdb *cdbp; 31558 int path_instance; 31559 /* 31560 * Need scsi_cdb_size array to determine the cdb length. 31561 */ 31562 extern uchar_t scsi_cdb_size[]; 31563 31564 ASSERT(un != NULL); 31565 ASSERT(pktp != NULL); 31566 ASSERT(bp != NULL); 31567 ASSERT(xp != NULL); 31568 ASSERT(ssc != NULL); 31569 ASSERT(mutex_owned(SD_MUTEX(un))); 31570 31571 /* 31572 * Transfer the cdb buffer pointer here. 31573 */ 31574 cdbp = (union scsi_cdb *)pktp->pkt_cdbp; 31575 31576 ssc->ssc_uscsi_cmd->uscsi_cdblen = scsi_cdb_size[GETGROUP(cdbp)]; 31577 ssc->ssc_uscsi_cmd->uscsi_cdb = (caddr_t)cdbp; 31578 31579 /* 31580 * Transfer the sense data buffer pointer if sense data is available, 31581 * calculate the sense data length first. 31582 */ 31583 if ((xp->xb_sense_state & STATE_XARQ_DONE) || 31584 (xp->xb_sense_state & STATE_ARQ_DONE)) { 31585 /* 31586 * For arq case, we will enter here. 31587 */ 31588 if (xp->xb_sense_state & STATE_XARQ_DONE) { 31589 senlen = MAX_SENSE_LENGTH - xp->xb_sense_resid; 31590 } else { 31591 senlen = SENSE_LENGTH; 31592 } 31593 } else { 31594 /* 31595 * For non-arq case, we will enter this branch. 31596 */ 31597 if (SD_GET_PKT_STATUS(pktp) == STATUS_CHECK && 31598 (xp->xb_sense_state & STATE_XFERRED_DATA)) { 31599 senlen = SENSE_LENGTH - xp->xb_sense_resid; 31600 } 31601 31602 } 31603 31604 ssc->ssc_uscsi_cmd->uscsi_rqlen = (senlen & 0xff); 31605 ssc->ssc_uscsi_cmd->uscsi_rqresid = 0; 31606 ssc->ssc_uscsi_cmd->uscsi_rqbuf = (caddr_t)xp->xb_sense_data; 31607 31608 ssc->ssc_uscsi_cmd->uscsi_status = ((*(pktp)->pkt_scbp) & STATUS_MASK); 31609 31610 /* 31611 * Only transfer path_instance when scsi_pkt was properly allocated. 31612 */ 31613 path_instance = pktp->pkt_path_instance; 31614 if (scsi_pkt_allocated_correctly(pktp) && path_instance) 31615 ssc->ssc_uscsi_cmd->uscsi_path_instance = path_instance; 31616 else 31617 ssc->ssc_uscsi_cmd->uscsi_path_instance = 0; 31618 31619 /* 31620 * Copy in the other fields we may need when posting ereport. 31621 */ 31622 ssc->ssc_uscsi_info->ui_pkt_reason = pktp->pkt_reason; 31623 ssc->ssc_uscsi_info->ui_pkt_state = pktp->pkt_state; 31624 ssc->ssc_uscsi_info->ui_pkt_statistics = pktp->pkt_statistics; 31625 ssc->ssc_uscsi_info->ui_lba = (uint64_t)SD_GET_BLKNO(bp); 31626 31627 /* 31628 * For partially read/write command, we will not create ena 31629 * in case of a successful command be reconized as recovered. 31630 */ 31631 if ((pktp->pkt_reason == CMD_CMPLT) && 31632 (ssc->ssc_uscsi_cmd->uscsi_status == STATUS_GOOD) && 31633 (senlen == 0)) { 31634 return; 31635 } 31636 31637 /* 31638 * To associate ereports of a single command execution flow, we 31639 * need a shared ena for a specific command. 31640 */ 31641 if (xp->xb_ena == 0) 31642 xp->xb_ena = fm_ena_generate(0, FM_ENA_FMT1); 31643 ssc->ssc_uscsi_info->ui_ena = xp->xb_ena; 31644 } 31645 31646 31647 /* 31648 * Function: sd_check_bdc_vpd 31649 * 31650 * Description: Query the optional INQUIRY VPD page 0xb1. If the device 31651 * supports VPD page 0xb1, sd examines the MEDIUM ROTATION 31652 * RATE. 31653 * 31654 * Set the following based on RPM value: 31655 * = 0 device is not solid state, non-rotational 31656 * = 1 device is solid state, non-rotational 31657 * > 1 device is not solid state, rotational 31658 * 31659 * Context: Kernel thread or interrupt context. 31660 */ 31661 31662 static void 31663 sd_check_bdc_vpd(sd_ssc_t *ssc) 31664 { 31665 int rval = 0; 31666 uchar_t *inqb1 = NULL; 31667 size_t inqb1_len = MAX_INQUIRY_SIZE; 31668 size_t inqb1_resid = 0; 31669 struct sd_lun *un; 31670 31671 ASSERT(ssc != NULL); 31672 un = ssc->ssc_un; 31673 ASSERT(un != NULL); 31674 ASSERT(!mutex_owned(SD_MUTEX(un))); 31675 31676 mutex_enter(SD_MUTEX(un)); 31677 un->un_f_is_rotational = TRUE; 31678 un->un_f_is_solid_state = FALSE; 31679 31680 if (ISCD(un)) { 31681 mutex_exit(SD_MUTEX(un)); 31682 return; 31683 } 31684 31685 if (sd_check_vpd_page_support(ssc) == 0 && 31686 un->un_vpd_page_mask & SD_VPD_DEV_CHARACTER_PG) { 31687 mutex_exit(SD_MUTEX(un)); 31688 /* collect page b1 data */ 31689 inqb1 = kmem_zalloc(inqb1_len, KM_SLEEP); 31690 31691 rval = sd_send_scsi_INQUIRY(ssc, inqb1, inqb1_len, 31692 0x01, 0xB1, &inqb1_resid); 31693 31694 if (rval == 0 && (inqb1_len - inqb1_resid > 5)) { 31695 SD_TRACE(SD_LOG_COMMON, un, 31696 "sd_check_bdc_vpd: \ 31697 successfully get VPD page: %x \ 31698 PAGE LENGTH: %x BYTE 4: %x \ 31699 BYTE 5: %x", inqb1[1], inqb1[3], inqb1[4], 31700 inqb1[5]); 31701 31702 mutex_enter(SD_MUTEX(un)); 31703 /* 31704 * Check the MEDIUM ROTATION RATE. 31705 */ 31706 if (inqb1[4] == 0) { 31707 if (inqb1[5] == 0) { 31708 un->un_f_is_rotational = FALSE; 31709 } else if (inqb1[5] == 1) { 31710 un->un_f_is_rotational = FALSE; 31711 un->un_f_is_solid_state = TRUE; 31712 /* 31713 * Solid state drives don't need 31714 * disksort. 31715 */ 31716 un->un_f_disksort_disabled = TRUE; 31717 } 31718 } 31719 mutex_exit(SD_MUTEX(un)); 31720 } else if (rval != 0) { 31721 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 31722 } 31723 31724 kmem_free(inqb1, inqb1_len); 31725 } else { 31726 mutex_exit(SD_MUTEX(un)); 31727 } 31728 } 31729 31730 /* 31731 * Function: sd_check_emulation_mode 31732 * 31733 * Description: Check whether the SSD is at emulation mode 31734 * by issuing READ_CAPACITY_16 to see whether 31735 * we can get physical block size of the drive. 31736 * 31737 * Context: Kernel thread or interrupt context. 31738 */ 31739 31740 static void 31741 sd_check_emulation_mode(sd_ssc_t *ssc) 31742 { 31743 int rval = 0; 31744 uint64_t capacity; 31745 uint_t lbasize; 31746 uint_t pbsize; 31747 int i; 31748 int devid_len; 31749 struct sd_lun *un; 31750 31751 ASSERT(ssc != NULL); 31752 un = ssc->ssc_un; 31753 ASSERT(un != NULL); 31754 ASSERT(!mutex_owned(SD_MUTEX(un))); 31755 31756 mutex_enter(SD_MUTEX(un)); 31757 if (ISCD(un)) { 31758 mutex_exit(SD_MUTEX(un)); 31759 return; 31760 } 31761 31762 if (un->un_f_descr_format_supported) { 31763 mutex_exit(SD_MUTEX(un)); 31764 rval = sd_send_scsi_READ_CAPACITY_16(ssc, &capacity, &lbasize, 31765 &pbsize, SD_PATH_DIRECT); 31766 mutex_enter(SD_MUTEX(un)); 31767 31768 if (rval != 0) { 31769 un->un_phy_blocksize = DEV_BSIZE; 31770 } else { 31771 if (!ISP2(pbsize % DEV_BSIZE) || pbsize == 0) { 31772 un->un_phy_blocksize = DEV_BSIZE; 31773 } else if (pbsize > un->un_phy_blocksize) { 31774 /* 31775 * Don't reset the physical blocksize 31776 * unless we've detected a larger value. 31777 */ 31778 un->un_phy_blocksize = pbsize; 31779 } 31780 } 31781 } 31782 31783 for (i = 0; i < sd_flash_dev_table_size; i++) { 31784 devid_len = (int)strlen(sd_flash_dev_table[i]); 31785 if (sd_sdconf_id_match(un, sd_flash_dev_table[i], devid_len) 31786 == SD_SUCCESS) { 31787 un->un_phy_blocksize = SSD_SECSIZE; 31788 if (un->un_f_is_solid_state && 31789 un->un_phy_blocksize != un->un_tgt_blocksize) 31790 un->un_f_enable_rmw = TRUE; 31791 } 31792 } 31793 31794 mutex_exit(SD_MUTEX(un)); 31795 }