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 int devigone = DEVI(devi)->devi_gone; 8555 8556 mutex_enter(&sd_detach_mutex); 8557 8558 /* 8559 * Fail the detach for any of the following: 8560 * - Unable to get the sd_lun struct for the instance 8561 * - Another thread is already detaching this instance 8562 * - Another thread is currently performing an open 8563 * 8564 * Additionaly, if "device gone" flag is not set: 8565 * - There are outstanding commands in driver 8566 * - There are outstanding commands in transport 8567 */ 8568 devp = ddi_get_driver_private(devi); 8569 if (devp == NULL || (un = (struct sd_lun *)devp->sd_private) == NULL || 8570 un->un_detach_count != 0 || un->un_opens_in_progress != 0 || 8571 (!devigone && (un->un_ncmds_in_driver != 0 || 8572 un->un_ncmds_in_transport != 0 || 8573 un->un_state == SD_STATE_RWAIT))) { 8574 mutex_exit(&sd_detach_mutex); 8575 return (DDI_FAILURE); 8576 } 8577 8578 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "%s: entry 0x%p\n", __func__, un); 8579 8580 /* 8581 * Mark this instance as currently in a detach, to inhibit any 8582 * opens from a layered driver. 8583 */ 8584 un->un_detach_count++; 8585 mutex_exit(&sd_detach_mutex); 8586 8587 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS, 8588 SCSI_ADDR_PROP_TARGET, -1); 8589 8590 dev = sd_make_device(SD_DEVINFO(un)); 8591 8592 mutex_enter(SD_MUTEX(un)); 8593 8594 /* 8595 * Fail the detach if there are any outstanding layered 8596 * opens on this device. 8597 */ 8598 for (i = 0; i < NDKMAP; i++) { 8599 if (un->un_ocmap.lyropen[i] != 0) { 8600 goto err_notclosed; 8601 } 8602 } 8603 8604 /* 8605 * If we have the device reserved, release the reservation. 8606 */ 8607 if (!devigone && 8608 (un->un_resvd_status & SD_RESERVE) && 8609 !(un->un_resvd_status & SD_LOST_RESERVE)) { 8610 mutex_exit(SD_MUTEX(un)); 8611 /* 8612 * Note: sd_reserve_release sends a command to the device 8613 * via the sd_ioctlcmd() path, and can sleep. 8614 */ 8615 if (sd_reserve_release(dev, SD_RELEASE) != 0) { 8616 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8617 "%s: cannot release reservation\n", __func__); 8618 } 8619 } else { 8620 mutex_exit(SD_MUTEX(un)); 8621 } 8622 8623 /* 8624 * Untimeout any reserve recover, throttle reset, restart unit 8625 * and delayed broadcast timeout threads. Protect the timeout pointer 8626 * from getting nulled by their callback functions. 8627 */ 8628 mutex_enter(SD_MUTEX(un)); 8629 if (un->un_resvd_timeid != NULL) { 8630 timeout_id_t temp_id = un->un_resvd_timeid; 8631 un->un_resvd_timeid = NULL; 8632 mutex_exit(SD_MUTEX(un)); 8633 (void) untimeout(temp_id); 8634 mutex_enter(SD_MUTEX(un)); 8635 } 8636 8637 if (un->un_reset_throttle_timeid != NULL) { 8638 timeout_id_t temp_id = un->un_reset_throttle_timeid; 8639 un->un_reset_throttle_timeid = NULL; 8640 mutex_exit(SD_MUTEX(un)); 8641 (void) untimeout(temp_id); 8642 mutex_enter(SD_MUTEX(un)); 8643 } 8644 8645 if (un->un_startstop_timeid != NULL) { 8646 timeout_id_t temp_id = un->un_startstop_timeid; 8647 un->un_startstop_timeid = NULL; 8648 mutex_exit(SD_MUTEX(un)); 8649 (void) untimeout(temp_id); 8650 mutex_enter(SD_MUTEX(un)); 8651 } 8652 8653 if (un->un_rmw_msg_timeid != NULL) { 8654 timeout_id_t temp_id = un->un_rmw_msg_timeid; 8655 un->un_rmw_msg_timeid = NULL; 8656 mutex_exit(SD_MUTEX(un)); 8657 (void) untimeout(temp_id); 8658 mutex_enter(SD_MUTEX(un)); 8659 } 8660 8661 if (un->un_dcvb_timeid != NULL) { 8662 timeout_id_t temp_id = un->un_dcvb_timeid; 8663 un->un_dcvb_timeid = NULL; 8664 mutex_exit(SD_MUTEX(un)); 8665 (void) untimeout(temp_id); 8666 } else { 8667 mutex_exit(SD_MUTEX(un)); 8668 } 8669 8670 /* Remove any pending reservation reclaim requests for this device */ 8671 sd_rmv_resv_reclaim_req(dev); 8672 8673 mutex_enter(SD_MUTEX(un)); 8674 if (un->un_retry_timeid != NULL) { 8675 timeout_id_t temp_id = un->un_retry_timeid; 8676 un->un_retry_timeid = NULL; 8677 mutex_exit(SD_MUTEX(un)); 8678 (void) untimeout(temp_id); 8679 mutex_enter(SD_MUTEX(un)); 8680 } 8681 8682 /* Cancel any pending callbacks for SD_PATH_DIRECT_PRIORITY cmd. */ 8683 if (un->un_direct_priority_timeid != NULL) { 8684 timeout_id_t temp_id = un->un_direct_priority_timeid; 8685 un->un_direct_priority_timeid = NULL; 8686 mutex_exit(SD_MUTEX(un)); 8687 (void) untimeout(temp_id); 8688 mutex_enter(SD_MUTEX(un)); 8689 } 8690 8691 /* Cancel any active multi-host disk watch thread requests */ 8692 if (un->un_mhd_token != NULL) { 8693 mutex_exit(SD_MUTEX(un)); 8694 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_mhd_token)); 8695 if (scsi_watch_request_terminate(un->un_mhd_token, 8696 SCSI_WATCH_TERMINATE_NOWAIT)) { 8697 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8698 "%s: cannot cancel mhd watch request\n", __func__); 8699 /* 8700 * Note: We are returning here after having removed 8701 * some driver timeouts above. This is consistent with 8702 * the legacy implementation but perhaps the watch 8703 * terminate call should be made with the wait flag set. 8704 */ 8705 goto err_stillbusy; 8706 } 8707 mutex_enter(SD_MUTEX(un)); 8708 un->un_mhd_token = NULL; 8709 } 8710 8711 if (un->un_swr_token != NULL) { 8712 mutex_exit(SD_MUTEX(un)); 8713 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_swr_token)); 8714 if (scsi_watch_request_terminate(un->un_swr_token, 8715 SCSI_WATCH_TERMINATE_NOWAIT)) { 8716 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8717 "%s: cannot cancel swr watch request\n", __func__); 8718 /* 8719 * Note: We are returning here after having removed 8720 * some driver timeouts above. This is consistent with 8721 * the legacy implementation but perhaps the watch 8722 * terminate call should be made with the wait flag set. 8723 */ 8724 goto err_stillbusy; 8725 } 8726 mutex_enter(SD_MUTEX(un)); 8727 un->un_swr_token = NULL; 8728 } 8729 8730 /* 8731 * Clear any scsi_reset_notifies. We clear the reset notifies 8732 * if we have not registered one. 8733 * Note: The sd_mhd_reset_notify_cb() fn tries to acquire SD_MUTEX! 8734 */ 8735 mutex_exit(SD_MUTEX(un)); 8736 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_CANCEL, 8737 sd_mhd_reset_notify_cb, (caddr_t)un); 8738 8739 /* 8740 * protect the timeout pointers from getting nulled by 8741 * their callback functions during the cancellation process. 8742 * In such a scenario untimeout can be invoked with a null value. 8743 */ 8744 _NOTE(NO_COMPETING_THREADS_NOW); 8745 8746 mutex_enter(&un->un_pm_mutex); 8747 if (un->un_pm_idle_timeid != NULL) { 8748 timeout_id_t temp_id = un->un_pm_idle_timeid; 8749 un->un_pm_idle_timeid = NULL; 8750 mutex_exit(&un->un_pm_mutex); 8751 8752 /* 8753 * Timeout is active; cancel it. 8754 * Note that it'll never be active on a device 8755 * that does not support PM therefore we don't 8756 * have to check before calling pm_idle_component. 8757 */ 8758 (void) untimeout(temp_id); 8759 (void) pm_idle_component(SD_DEVINFO(un), 0); 8760 mutex_enter(&un->un_pm_mutex); 8761 } 8762 8763 /* 8764 * Check whether there is already a timeout scheduled for power 8765 * management. If yes then don't lower the power here, that's. 8766 * the timeout handler's job. 8767 */ 8768 if (un->un_pm_timeid != NULL) { 8769 timeout_id_t temp_id = un->un_pm_timeid; 8770 un->un_pm_timeid = NULL; 8771 mutex_exit(&un->un_pm_mutex); 8772 /* 8773 * Timeout is active; cancel it. 8774 * Note that it'll never be active on a device 8775 * that does not support PM therefore we don't 8776 * have to check before calling pm_idle_component. 8777 */ 8778 (void) untimeout(temp_id); 8779 (void) pm_idle_component(SD_DEVINFO(un), 0); 8780 8781 } else { 8782 mutex_exit(&un->un_pm_mutex); 8783 if ((un->un_f_pm_is_enabled == TRUE) && 8784 (pm_lower_power(SD_DEVINFO(un), 0, SD_PM_STATE_STOPPED(un)) 8785 != DDI_SUCCESS)) { 8786 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8787 "%s: lower power request failed, ignoring\n", 8788 __func__); 8789 /* 8790 * The above test now includes a check to see if PM is 8791 * supported by this device before call 8792 * pm_lower_power(). 8793 * Note, the following is not dead code. The call to 8794 * pm_lower_power above will generate a call back into 8795 * our sdpower routine which might result in a timeout 8796 * handler getting activated. Therefore the following 8797 * code is valid and necessary. 8798 */ 8799 mutex_enter(&un->un_pm_mutex); 8800 if (un->un_pm_timeid != NULL) { 8801 timeout_id_t temp_id = un->un_pm_timeid; 8802 un->un_pm_timeid = NULL; 8803 mutex_exit(&un->un_pm_mutex); 8804 (void) untimeout(temp_id); 8805 (void) pm_idle_component(SD_DEVINFO(un), 0); 8806 } else { 8807 mutex_exit(&un->un_pm_mutex); 8808 } 8809 } 8810 } 8811 8812 /* 8813 * Cleanup from the scsi_ifsetcap() calls (437868) 8814 * Relocated here from above to be after the call to 8815 * pm_lower_power, which was getting errors. 8816 */ 8817 (void) scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 0, 1); 8818 (void) scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", 0, 1); 8819 8820 /* 8821 * Currently, tagged queuing is supported per target based by HBA. 8822 * Setting this per lun instance actually sets the capability of this 8823 * target in HBA, which affects those luns already attached on the 8824 * same target. So during detach, we can only disable this capability 8825 * only when this is the only lun left on this target. By doing 8826 * this, we assume a target has the same tagged queuing capability 8827 * for every lun. The condition can be removed when HBA is changed to 8828 * support per lun based tagged queuing capability. 8829 */ 8830 if (sd_scsi_get_target_lun_count(pdip, tgt) <= 1) { 8831 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1); 8832 } 8833 8834 if (un->un_f_is_fibre == FALSE) { 8835 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 0, 1); 8836 } 8837 8838 /* 8839 * Remove any event callbacks, fibre only 8840 */ 8841 if (un->un_f_is_fibre == TRUE) { 8842 if ((un->un_insert_event != NULL) && 8843 (ddi_remove_event_handler(un->un_insert_cb_id) != 8844 DDI_SUCCESS)) { 8845 /* 8846 * Note: We are returning here after having done 8847 * substantial cleanup above. This is consistent 8848 * with the legacy implementation but this may not 8849 * be the right thing to do. 8850 */ 8851 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8852 "%s: cannot cancel insert event\n", __func__); 8853 goto err_remove_event; 8854 } 8855 un->un_insert_event = NULL; 8856 8857 if ((un->un_remove_event != NULL) && 8858 (ddi_remove_event_handler(un->un_remove_cb_id) != 8859 DDI_SUCCESS)) { 8860 /* 8861 * Note: We are returning here after having done 8862 * substantial cleanup above. This is consistent 8863 * with the legacy implementation but this may not 8864 * be the right thing to do. 8865 */ 8866 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 8867 "%s: cannot cancel remove event\n", __func__); 8868 goto err_remove_event; 8869 } 8870 un->un_remove_event = NULL; 8871 } 8872 8873 /* Do not free the softstate if the callback routine is active */ 8874 sd_sync_with_callback(un); 8875 8876 cmlb_detach(un->un_cmlbhandle, (void *)SD_PATH_DIRECT); 8877 cmlb_free_handle(&un->un_cmlbhandle); 8878 8879 /* 8880 * Hold the detach mutex here, to make sure that no other threads ever 8881 * can access a (partially) freed soft state structure. 8882 */ 8883 mutex_enter(&sd_detach_mutex); 8884 8885 /* 8886 * Clean up the soft state struct. 8887 * Cleanup is done in reverse order of allocs/inits. 8888 * At this point there should be no competing threads anymore. 8889 */ 8890 8891 scsi_fm_fini(devp); 8892 8893 /* 8894 * Deallocate memory for SCSI FMA. 8895 */ 8896 kmem_free(un->un_fm_private, sizeof (struct sd_fm_internal)); 8897 8898 /* 8899 * Unregister and free device id if it was not registered 8900 * by the transport. 8901 */ 8902 if (un->un_f_devid_transport_defined == FALSE) 8903 ddi_devid_unregister(devi); 8904 8905 /* 8906 * free the devid structure if allocated before (by ddi_devid_init() 8907 * or ddi_devid_get()). 8908 */ 8909 if (un->un_devid) { 8910 ddi_devid_free(un->un_devid); 8911 un->un_devid = NULL; 8912 } 8913 8914 /* 8915 * Destroy wmap cache if it exists. 8916 */ 8917 if (un->un_wm_cache != NULL) { 8918 kmem_cache_destroy(un->un_wm_cache); 8919 un->un_wm_cache = NULL; 8920 } 8921 8922 /* 8923 * kstat cleanup is done in detach for all device types (4363169). 8924 * We do not want to fail detach if the device kstats are not deleted 8925 * since there is a confusion about the devo_refcnt for the device. 8926 * We just delete the kstats and let detach complete successfully. 8927 */ 8928 if (un->un_stats != NULL) { 8929 kstat_delete(un->un_stats); 8930 un->un_stats = NULL; 8931 } 8932 if (un->un_errstats != NULL) { 8933 kstat_delete(un->un_errstats); 8934 un->un_errstats = NULL; 8935 } 8936 8937 /* Remove partition stats */ 8938 if (un->un_f_pkstats_enabled) { 8939 for (i = 0; i < NSDMAP; i++) { 8940 if (un->un_pstats[i] != NULL) { 8941 kstat_delete(un->un_pstats[i]); 8942 un->un_pstats[i] = NULL; 8943 } 8944 } 8945 } 8946 8947 /* Remove xbuf registration */ 8948 ddi_xbuf_attr_unregister_devinfo(un->un_xbuf_attr, devi); 8949 ddi_xbuf_attr_destroy(un->un_xbuf_attr); 8950 8951 /* Remove driver properties */ 8952 ddi_prop_remove_all(devi); 8953 8954 mutex_destroy(&un->un_pm_mutex); 8955 cv_destroy(&un->un_pm_busy_cv); 8956 8957 cv_destroy(&un->un_wcc_cv); 8958 8959 /* Open/close semaphore */ 8960 sema_destroy(&un->un_semoclose); 8961 8962 /* Removable media condvar. */ 8963 cv_destroy(&un->un_state_cv); 8964 8965 /* Suspend/resume condvar. */ 8966 cv_destroy(&un->un_suspend_cv); 8967 cv_destroy(&un->un_disk_busy_cv); 8968 8969 sd_free_rqs(un); 8970 8971 /* Free up soft state */ 8972 devp->sd_private = NULL; 8973 8974 bzero(un, sizeof (struct sd_lun)); 8975 8976 ddi_soft_state_free(sd_state, instance); 8977 8978 mutex_exit(&sd_detach_mutex); 8979 8980 /* This frees up the INQUIRY data associated with the device. */ 8981 scsi_unprobe(devp); 8982 8983 /* 8984 * After successfully detaching an instance, we update the information 8985 * of how many luns have been attached in the relative target and 8986 * controller for parallel SCSI. This information is used when sd tries 8987 * to set the tagged queuing capability in HBA. 8988 * Since un has been released, we can't use SD_IS_PARALLEL_SCSI(un) to 8989 * check if the device is parallel SCSI. However, we don't need to 8990 * check here because we've already checked during attach. No device 8991 * that is not parallel SCSI is in the chain. 8992 */ 8993 if ((tgt >= 0) && (tgt < NTARGETS_WIDE)) { 8994 sd_scsi_update_lun_on_target(pdip, tgt, SD_SCSI_LUN_DETACH); 8995 } 8996 8997 return (DDI_SUCCESS); 8998 8999 err_notclosed: 9000 mutex_exit(SD_MUTEX(un)); 9001 9002 err_stillbusy: 9003 _NOTE(NO_COMPETING_THREADS_NOW); 9004 9005 err_remove_event: 9006 mutex_enter(&sd_detach_mutex); 9007 un->un_detach_count--; 9008 mutex_exit(&sd_detach_mutex); 9009 9010 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "%s: exit failure\n", __func__); 9011 return (DDI_FAILURE); 9012 } 9013 9014 9015 /* 9016 * Function: sd_create_errstats 9017 * 9018 * Description: This routine instantiates the device error stats. 9019 * 9020 * Note: During attach the stats are instantiated first so they are 9021 * available for attach-time routines that utilize the driver 9022 * iopath to send commands to the device. The stats are initialized 9023 * separately so data obtained during some attach-time routines is 9024 * available. (4362483) 9025 * 9026 * Arguments: un - driver soft state (unit) structure 9027 * instance - driver instance 9028 * 9029 * Context: Kernel thread context 9030 */ 9031 9032 static void 9033 sd_create_errstats(struct sd_lun *un, int instance) 9034 { 9035 struct sd_errstats *stp; 9036 char kstatmodule_err[KSTAT_STRLEN]; 9037 char kstatname[KSTAT_STRLEN]; 9038 int ndata = (sizeof (struct sd_errstats) / sizeof (kstat_named_t)); 9039 9040 ASSERT(un != NULL); 9041 9042 if (un->un_errstats != NULL) { 9043 return; 9044 } 9045 9046 (void) snprintf(kstatmodule_err, sizeof (kstatmodule_err), 9047 "%serr", sd_label); 9048 (void) snprintf(kstatname, sizeof (kstatname), 9049 "%s%d,err", sd_label, instance); 9050 9051 un->un_errstats = kstat_create(kstatmodule_err, instance, kstatname, 9052 "device_error", KSTAT_TYPE_NAMED, ndata, KSTAT_FLAG_PERSISTENT); 9053 9054 if (un->un_errstats == NULL) { 9055 SD_ERROR(SD_LOG_ATTACH_DETACH, un, 9056 "sd_create_errstats: Failed kstat_create\n"); 9057 return; 9058 } 9059 9060 stp = (struct sd_errstats *)un->un_errstats->ks_data; 9061 kstat_named_init(&stp->sd_softerrs, "Soft Errors", 9062 KSTAT_DATA_UINT32); 9063 kstat_named_init(&stp->sd_harderrs, "Hard Errors", 9064 KSTAT_DATA_UINT32); 9065 kstat_named_init(&stp->sd_transerrs, "Transport Errors", 9066 KSTAT_DATA_UINT32); 9067 kstat_named_init(&stp->sd_vid, "Vendor", 9068 KSTAT_DATA_CHAR); 9069 kstat_named_init(&stp->sd_pid, "Product", 9070 KSTAT_DATA_CHAR); 9071 kstat_named_init(&stp->sd_revision, "Revision", 9072 KSTAT_DATA_CHAR); 9073 kstat_named_init(&stp->sd_serial, "Serial No", 9074 KSTAT_DATA_CHAR); 9075 kstat_named_init(&stp->sd_capacity, "Size", 9076 KSTAT_DATA_ULONGLONG); 9077 kstat_named_init(&stp->sd_rq_media_err, "Media Error", 9078 KSTAT_DATA_UINT32); 9079 kstat_named_init(&stp->sd_rq_ntrdy_err, "Device Not Ready", 9080 KSTAT_DATA_UINT32); 9081 kstat_named_init(&stp->sd_rq_nodev_err, "No Device", 9082 KSTAT_DATA_UINT32); 9083 kstat_named_init(&stp->sd_rq_recov_err, "Recoverable", 9084 KSTAT_DATA_UINT32); 9085 kstat_named_init(&stp->sd_rq_illrq_err, "Illegal Request", 9086 KSTAT_DATA_UINT32); 9087 kstat_named_init(&stp->sd_rq_pfa_err, "Predictive Failure Analysis", 9088 KSTAT_DATA_UINT32); 9089 9090 un->un_errstats->ks_private = un; 9091 un->un_errstats->ks_update = nulldev; 9092 9093 kstat_install(un->un_errstats); 9094 } 9095 9096 9097 /* 9098 * Function: sd_set_errstats 9099 * 9100 * Description: This routine sets the value of the vendor id, product id, 9101 * revision, serial number, and capacity device error stats. 9102 * 9103 * Note: During attach the stats are instantiated first so they are 9104 * available for attach-time routines that utilize the driver 9105 * iopath to send commands to the device. The stats are initialized 9106 * separately so data obtained during some attach-time routines is 9107 * available. (4362483) 9108 * 9109 * Arguments: un - driver soft state (unit) structure 9110 * 9111 * Context: Kernel thread context 9112 */ 9113 9114 static void 9115 sd_set_errstats(struct sd_lun *un) 9116 { 9117 struct sd_errstats *stp; 9118 char *sn; 9119 9120 ASSERT(un != NULL); 9121 ASSERT(un->un_errstats != NULL); 9122 stp = (struct sd_errstats *)un->un_errstats->ks_data; 9123 ASSERT(stp != NULL); 9124 (void) strncpy(stp->sd_vid.value.c, un->un_sd->sd_inq->inq_vid, 8); 9125 (void) strncpy(stp->sd_pid.value.c, un->un_sd->sd_inq->inq_pid, 16); 9126 (void) strncpy(stp->sd_revision.value.c, 9127 un->un_sd->sd_inq->inq_revision, 4); 9128 9129 /* 9130 * All the errstats are persistent across detach/attach, 9131 * so reset all the errstats here in case of the hot 9132 * replacement of disk drives, except for not changed 9133 * Sun qualified drives. 9134 */ 9135 if ((bcmp(&SD_INQUIRY(un)->inq_pid[9], "SUN", 3) != 0) || 9136 (bcmp(&SD_INQUIRY(un)->inq_serial, stp->sd_serial.value.c, 9137 sizeof (SD_INQUIRY(un)->inq_serial)) != 0)) { 9138 stp->sd_softerrs.value.ui32 = 0; 9139 stp->sd_harderrs.value.ui32 = 0; 9140 stp->sd_transerrs.value.ui32 = 0; 9141 stp->sd_rq_media_err.value.ui32 = 0; 9142 stp->sd_rq_ntrdy_err.value.ui32 = 0; 9143 stp->sd_rq_nodev_err.value.ui32 = 0; 9144 stp->sd_rq_recov_err.value.ui32 = 0; 9145 stp->sd_rq_illrq_err.value.ui32 = 0; 9146 stp->sd_rq_pfa_err.value.ui32 = 0; 9147 } 9148 9149 /* 9150 * Set the "Serial No" kstat for Sun qualified drives (indicated by 9151 * "SUN" in bytes 25-27 of the inquiry data (bytes 9-11 of the pid) 9152 * (4376302)) 9153 */ 9154 if (bcmp(&SD_INQUIRY(un)->inq_pid[9], "SUN", 3) == 0) { 9155 bcopy(&SD_INQUIRY(un)->inq_serial, stp->sd_serial.value.c, 9156 sizeof (SD_INQUIRY(un)->inq_serial)); 9157 } else { 9158 /* 9159 * Set the "Serial No" kstat for non-Sun qualified drives 9160 */ 9161 if (ddi_prop_lookup_string(DDI_DEV_T_ANY, SD_DEVINFO(un), 9162 DDI_PROP_NOTPROM | DDI_PROP_DONTPASS, 9163 INQUIRY_SERIAL_NO, &sn) == DDI_SUCCESS) { 9164 (void) strlcpy(stp->sd_serial.value.c, sn, 9165 sizeof (stp->sd_serial.value.c)); 9166 ddi_prop_free(sn); 9167 } 9168 } 9169 9170 if (un->un_f_blockcount_is_valid != TRUE) { 9171 /* 9172 * Set capacity error stat to 0 for no media. This ensures 9173 * a valid capacity is displayed in response to 'iostat -E' 9174 * when no media is present in the device. 9175 */ 9176 stp->sd_capacity.value.ui64 = 0; 9177 } else { 9178 /* 9179 * Multiply un_blockcount by un->un_sys_blocksize to get 9180 * capacity. 9181 * 9182 * Note: for non-512 blocksize devices "un_blockcount" has been 9183 * "scaled" in sd_send_scsi_READ_CAPACITY by multiplying by 9184 * (un_tgt_blocksize / un->un_sys_blocksize). 9185 */ 9186 stp->sd_capacity.value.ui64 = (uint64_t) 9187 ((uint64_t)un->un_blockcount * un->un_sys_blocksize); 9188 } 9189 } 9190 9191 9192 /* 9193 * Function: sd_set_pstats 9194 * 9195 * Description: This routine instantiates and initializes the partition 9196 * stats for each partition with more than zero blocks. 9197 * (4363169) 9198 * 9199 * Arguments: un - driver soft state (unit) structure 9200 * 9201 * Context: Kernel thread context 9202 */ 9203 9204 static void 9205 sd_set_pstats(struct sd_lun *un) 9206 { 9207 char kstatname[KSTAT_STRLEN]; 9208 int instance; 9209 int i; 9210 diskaddr_t nblks = 0; 9211 char *partname = NULL; 9212 9213 ASSERT(un != NULL); 9214 9215 instance = ddi_get_instance(SD_DEVINFO(un)); 9216 9217 /* Note:x86: is this a VTOC8/VTOC16 difference? */ 9218 for (i = 0; i < NSDMAP; i++) { 9219 9220 if (cmlb_partinfo(un->un_cmlbhandle, i, 9221 &nblks, NULL, &partname, NULL, (void *)SD_PATH_DIRECT) != 0) 9222 continue; 9223 mutex_enter(SD_MUTEX(un)); 9224 9225 if ((un->un_pstats[i] == NULL) && 9226 (nblks != 0)) { 9227 9228 (void) snprintf(kstatname, sizeof (kstatname), 9229 "%s%d,%s", sd_label, instance, 9230 partname); 9231 9232 un->un_pstats[i] = kstat_create(sd_label, 9233 instance, kstatname, "partition", KSTAT_TYPE_IO, 9234 1, KSTAT_FLAG_PERSISTENT); 9235 if (un->un_pstats[i] != NULL) { 9236 un->un_pstats[i]->ks_lock = SD_MUTEX(un); 9237 kstat_install(un->un_pstats[i]); 9238 } 9239 } 9240 mutex_exit(SD_MUTEX(un)); 9241 } 9242 } 9243 9244 9245 #if (defined(__fibre)) 9246 /* 9247 * Function: sd_init_event_callbacks 9248 * 9249 * Description: This routine initializes the insertion and removal event 9250 * callbacks. (fibre only) 9251 * 9252 * Arguments: un - driver soft state (unit) structure 9253 * 9254 * Context: Kernel thread context 9255 */ 9256 9257 static void 9258 sd_init_event_callbacks(struct sd_lun *un) 9259 { 9260 ASSERT(un != NULL); 9261 9262 if ((un->un_insert_event == NULL) && 9263 (ddi_get_eventcookie(SD_DEVINFO(un), FCAL_INSERT_EVENT, 9264 &un->un_insert_event) == DDI_SUCCESS)) { 9265 /* 9266 * Add the callback for an insertion event 9267 */ 9268 (void) ddi_add_event_handler(SD_DEVINFO(un), 9269 un->un_insert_event, sd_event_callback, (void *)un, 9270 &(un->un_insert_cb_id)); 9271 } 9272 9273 if ((un->un_remove_event == NULL) && 9274 (ddi_get_eventcookie(SD_DEVINFO(un), FCAL_REMOVE_EVENT, 9275 &un->un_remove_event) == DDI_SUCCESS)) { 9276 /* 9277 * Add the callback for a removal event 9278 */ 9279 (void) ddi_add_event_handler(SD_DEVINFO(un), 9280 un->un_remove_event, sd_event_callback, (void *)un, 9281 &(un->un_remove_cb_id)); 9282 } 9283 } 9284 9285 9286 /* 9287 * Function: sd_event_callback 9288 * 9289 * Description: This routine handles insert/remove events (photon). The 9290 * state is changed to OFFLINE which can be used to supress 9291 * error msgs. (fibre only) 9292 * 9293 * Arguments: un - driver soft state (unit) structure 9294 * 9295 * Context: Callout thread context 9296 */ 9297 /* ARGSUSED */ 9298 static void 9299 sd_event_callback(dev_info_t *dip, ddi_eventcookie_t event, void *arg, 9300 void *bus_impldata) 9301 { 9302 struct sd_lun *un = (struct sd_lun *)arg; 9303 9304 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_insert_event)); 9305 if (event == un->un_insert_event) { 9306 SD_TRACE(SD_LOG_COMMON, un, "sd_event_callback: insert event"); 9307 mutex_enter(SD_MUTEX(un)); 9308 if (un->un_state == SD_STATE_OFFLINE) { 9309 if (un->un_last_state != SD_STATE_SUSPENDED) { 9310 un->un_state = un->un_last_state; 9311 } else { 9312 /* 9313 * We have gone through SUSPEND/RESUME while 9314 * we were offline. Restore the last state 9315 */ 9316 un->un_state = un->un_save_state; 9317 } 9318 } 9319 mutex_exit(SD_MUTEX(un)); 9320 9321 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_remove_event)); 9322 } else if (event == un->un_remove_event) { 9323 SD_TRACE(SD_LOG_COMMON, un, "sd_event_callback: remove event"); 9324 mutex_enter(SD_MUTEX(un)); 9325 /* 9326 * We need to handle an event callback that occurs during 9327 * the suspend operation, since we don't prevent it. 9328 */ 9329 if (un->un_state != SD_STATE_OFFLINE) { 9330 if (un->un_state != SD_STATE_SUSPENDED) { 9331 New_state(un, SD_STATE_OFFLINE); 9332 } else { 9333 un->un_last_state = SD_STATE_OFFLINE; 9334 } 9335 } 9336 mutex_exit(SD_MUTEX(un)); 9337 } else { 9338 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE, 9339 "!Unknown event\n"); 9340 } 9341 9342 } 9343 #endif 9344 9345 /* 9346 * Values related to caching mode page depending on whether the unit is ATAPI. 9347 */ 9348 #define SDC_CDB_GROUP(un) ((un->un_f_cfg_is_atapi == TRUE) ? \ 9349 CDB_GROUP1 : CDB_GROUP0) 9350 #define SDC_HDRLEN(un) ((un->un_f_cfg_is_atapi == TRUE) ? \ 9351 MODE_HEADER_LENGTH_GRP2 : MODE_HEADER_LENGTH) 9352 /* 9353 * Use mode_cache_scsi3 to ensure we get all of the mode sense data, otherwise 9354 * the mode select will fail (mode_cache_scsi3 is a superset of mode_caching). 9355 */ 9356 #define SDC_BUFLEN(un) (SDC_HDRLEN(un) + MODE_BLK_DESC_LENGTH + \ 9357 sizeof (struct mode_cache_scsi3)) 9358 9359 static int 9360 sd_get_caching_mode_page(sd_ssc_t *ssc, uchar_t page_control, uchar_t **header, 9361 int *bdlen) 9362 { 9363 struct sd_lun *un = ssc->ssc_un; 9364 struct mode_caching *mode_caching_page; 9365 size_t buflen = SDC_BUFLEN(un); 9366 int hdrlen = SDC_HDRLEN(un); 9367 int rval; 9368 9369 /* 9370 * Do a test unit ready, otherwise a mode sense may not work if this 9371 * is the first command sent to the device after boot. 9372 */ 9373 if (sd_send_scsi_TEST_UNIT_READY(ssc, 0) != 0) 9374 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9375 9376 /* 9377 * Allocate memory for the retrieved mode page and its headers. Set 9378 * a pointer to the page itself. 9379 */ 9380 *header = kmem_zalloc(buflen, KM_SLEEP); 9381 9382 /* Get the information from the device */ 9383 rval = sd_send_scsi_MODE_SENSE(ssc, SDC_CDB_GROUP(un), *header, buflen, 9384 page_control | MODEPAGE_CACHING, SD_PATH_DIRECT); 9385 if (rval != 0) { 9386 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un, "%s: Mode Sense Failed\n", 9387 __func__); 9388 goto mode_sense_failed; 9389 } 9390 9391 /* 9392 * Determine size of Block Descriptors in order to locate 9393 * the mode page data. ATAPI devices return 0, SCSI devices 9394 * should return MODE_BLK_DESC_LENGTH. 9395 */ 9396 if (un->un_f_cfg_is_atapi == TRUE) { 9397 struct mode_header_grp2 *mhp = 9398 (struct mode_header_grp2 *)(*header); 9399 *bdlen = (mhp->bdesc_length_hi << 8) | mhp->bdesc_length_lo; 9400 } else { 9401 *bdlen = ((struct mode_header *)(*header))->bdesc_length; 9402 } 9403 9404 if (*bdlen > MODE_BLK_DESC_LENGTH) { 9405 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, 0, 9406 "%s: Mode Sense returned invalid block descriptor length\n", 9407 __func__); 9408 rval = EIO; 9409 goto mode_sense_failed; 9410 } 9411 9412 mode_caching_page = (struct mode_caching *)(*header + hdrlen + *bdlen); 9413 if (mode_caching_page->mode_page.code != MODEPAGE_CACHING) { 9414 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON, 9415 "%s: Mode Sense caching page code mismatch %d\n", 9416 __func__, mode_caching_page->mode_page.code); 9417 rval = EIO; 9418 } 9419 9420 mode_sense_failed: 9421 if (rval != 0) { 9422 kmem_free(*header, buflen); 9423 *header = NULL; 9424 *bdlen = 0; 9425 } 9426 return (rval); 9427 } 9428 9429 /* 9430 * Function: sd_cache_control() 9431 * 9432 * Description: This routine is the driver entry point for setting 9433 * read and write caching by modifying the WCE (write cache 9434 * enable) and RCD (read cache disable) bits of mode 9435 * page 8 (MODEPAGE_CACHING). 9436 * 9437 * Arguments: ssc - ssc contains pointer to driver soft state 9438 * (unit) structure for this target. 9439 * rcd_flag - flag for controlling the read cache 9440 * wce_flag - flag for controlling the write cache 9441 * 9442 * Return Code: EIO 9443 * code returned by sd_send_scsi_MODE_SENSE and 9444 * sd_send_scsi_MODE_SELECT 9445 * 9446 * Context: Kernel Thread 9447 */ 9448 9449 static int 9450 sd_cache_control(sd_ssc_t *ssc, int rcd_flag, int wce_flag) 9451 { 9452 struct sd_lun *un = ssc->ssc_un; 9453 struct mode_caching *mode_caching_page; 9454 uchar_t *header; 9455 size_t buflen = SDC_BUFLEN(un); 9456 int hdrlen = SDC_HDRLEN(un); 9457 int bdlen; 9458 int rval; 9459 9460 rval = sd_get_caching_mode_page(ssc, MODEPAGE_CURRENT, &header, &bdlen); 9461 switch (rval) { 9462 case 0: 9463 /* Check the relevant bits on successful mode sense */ 9464 mode_caching_page = (struct mode_caching *)(header + hdrlen + 9465 bdlen); 9466 if ((mode_caching_page->rcd && rcd_flag == SD_CACHE_ENABLE) || 9467 (!mode_caching_page->rcd && rcd_flag == SD_CACHE_DISABLE) || 9468 (mode_caching_page->wce && wce_flag == SD_CACHE_DISABLE) || 9469 (!mode_caching_page->wce && wce_flag == SD_CACHE_ENABLE)) { 9470 size_t sbuflen; 9471 uchar_t save_pg; 9472 9473 /* 9474 * Construct select buffer length based on the 9475 * length of the sense data returned. 9476 */ 9477 sbuflen = hdrlen + bdlen + sizeof (struct mode_page) + 9478 (int)mode_caching_page->mode_page.length; 9479 9480 /* Set the caching bits as requested */ 9481 if (rcd_flag == SD_CACHE_ENABLE) 9482 mode_caching_page->rcd = 0; 9483 else if (rcd_flag == SD_CACHE_DISABLE) 9484 mode_caching_page->rcd = 1; 9485 9486 if (wce_flag == SD_CACHE_ENABLE) 9487 mode_caching_page->wce = 1; 9488 else if (wce_flag == SD_CACHE_DISABLE) 9489 mode_caching_page->wce = 0; 9490 9491 /* 9492 * Save the page if the mode sense says the 9493 * drive supports it. 9494 */ 9495 save_pg = mode_caching_page->mode_page.ps ? 9496 SD_SAVE_PAGE : SD_DONTSAVE_PAGE; 9497 9498 /* Clear reserved bits before mode select */ 9499 mode_caching_page->mode_page.ps = 0; 9500 9501 /* 9502 * Clear out mode header for mode select. 9503 * The rest of the retrieved page will be reused. 9504 */ 9505 bzero(header, hdrlen); 9506 9507 if (un->un_f_cfg_is_atapi == TRUE) { 9508 struct mode_header_grp2 *mhp = 9509 (struct mode_header_grp2 *)header; 9510 mhp->bdesc_length_hi = bdlen >> 8; 9511 mhp->bdesc_length_lo = (uchar_t)bdlen & 0xff; 9512 } else { 9513 ((struct mode_header *)header)->bdesc_length = 9514 bdlen; 9515 } 9516 9517 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9518 9519 /* Issue mode select to change the cache settings */ 9520 rval = sd_send_scsi_MODE_SELECT(ssc, SDC_CDB_GROUP(un), 9521 header, sbuflen, save_pg, SD_PATH_DIRECT); 9522 } 9523 kmem_free(header, buflen); 9524 break; 9525 case EIO: 9526 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 9527 break; 9528 default: 9529 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9530 break; 9531 } 9532 9533 return (rval); 9534 } 9535 9536 9537 /* 9538 * Function: sd_get_write_cache_enabled() 9539 * 9540 * Description: This routine is the driver entry point for determining if write 9541 * caching is enabled. It examines the WCE (write cache enable) 9542 * bits of mode page 8 (MODEPAGE_CACHING) with Page Control field 9543 * bits set to MODEPAGE_CURRENT. 9544 * 9545 * Arguments: ssc - ssc contains pointer to driver soft state 9546 * (unit) structure for this target. 9547 * is_enabled - pointer to int where write cache enabled state 9548 * is returned (non-zero -> write cache enabled) 9549 * 9550 * Return Code: EIO 9551 * code returned by sd_send_scsi_MODE_SENSE 9552 * 9553 * Context: Kernel Thread 9554 * 9555 * NOTE: If ioctl is added to disable write cache, this sequence should 9556 * be followed so that no locking is required for accesses to 9557 * un->un_f_write_cache_enabled: 9558 * do mode select to clear wce 9559 * do synchronize cache to flush cache 9560 * set un->un_f_write_cache_enabled = FALSE 9561 * 9562 * Conversely, an ioctl to enable the write cache should be done 9563 * in this order: 9564 * set un->un_f_write_cache_enabled = TRUE 9565 * do mode select to set wce 9566 */ 9567 9568 static int 9569 sd_get_write_cache_enabled(sd_ssc_t *ssc, int *is_enabled) 9570 { 9571 struct sd_lun *un = ssc->ssc_un; 9572 struct mode_caching *mode_caching_page; 9573 uchar_t *header; 9574 size_t buflen = SDC_BUFLEN(un); 9575 int hdrlen = SDC_HDRLEN(un); 9576 int bdlen; 9577 int rval; 9578 9579 /* In case of error, flag as enabled */ 9580 *is_enabled = TRUE; 9581 9582 rval = sd_get_caching_mode_page(ssc, MODEPAGE_CURRENT, &header, &bdlen); 9583 switch (rval) { 9584 case 0: 9585 mode_caching_page = (struct mode_caching *)(header + hdrlen + 9586 bdlen); 9587 *is_enabled = mode_caching_page->wce; 9588 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 9589 kmem_free(header, buflen); 9590 break; 9591 case EIO: { 9592 /* 9593 * Some disks do not support Mode Sense(6), we 9594 * should ignore this kind of error (sense key is 9595 * 0x5 - illegal request). 9596 */ 9597 uint8_t *sensep; 9598 int senlen; 9599 9600 sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf; 9601 senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen - 9602 ssc->ssc_uscsi_cmd->uscsi_rqresid); 9603 9604 if (senlen > 0 && 9605 scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) { 9606 sd_ssc_assessment(ssc, SD_FMT_IGNORE_COMPROMISE); 9607 } else { 9608 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 9609 } 9610 break; 9611 } 9612 default: 9613 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9614 break; 9615 } 9616 9617 return (rval); 9618 } 9619 9620 /* 9621 * Function: sd_get_write_cache_changeable() 9622 * 9623 * Description: This routine is the driver entry point for determining if write 9624 * caching is changeable. It examines the WCE (write cache enable) 9625 * bits of mode page 8 (MODEPAGE_CACHING) with Page Control field 9626 * bits set to MODEPAGE_CHANGEABLE. 9627 * 9628 * Arguments: ssc - ssc contains pointer to driver soft state 9629 * (unit) structure for this target. 9630 * is_changeable - pointer to int where write cache changeable 9631 * state is returned (non-zero -> write cache 9632 * changeable) 9633 * 9634 * Context: Kernel Thread 9635 */ 9636 9637 static void 9638 sd_get_write_cache_changeable(sd_ssc_t *ssc, int *is_changeable) 9639 { 9640 struct sd_lun *un = ssc->ssc_un; 9641 struct mode_caching *mode_caching_page; 9642 uchar_t *header; 9643 size_t buflen = SDC_BUFLEN(un); 9644 int hdrlen = SDC_HDRLEN(un); 9645 int bdlen; 9646 int rval; 9647 9648 /* In case of error, flag as enabled */ 9649 *is_changeable = TRUE; 9650 9651 rval = sd_get_caching_mode_page(ssc, MODEPAGE_CHANGEABLE, &header, 9652 &bdlen); 9653 switch (rval) { 9654 case 0: 9655 mode_caching_page = (struct mode_caching *)(header + hdrlen + 9656 bdlen); 9657 *is_changeable = mode_caching_page->wce; 9658 kmem_free(header, buflen); 9659 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 9660 break; 9661 case EIO: 9662 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 9663 break; 9664 default: 9665 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9666 break; 9667 } 9668 } 9669 9670 /* 9671 * Function: sd_get_nv_sup() 9672 * 9673 * Description: This routine is the driver entry point for 9674 * determining whether non-volatile cache is supported. This 9675 * determination process works as follows: 9676 * 9677 * 1. sd first queries sd.conf on whether 9678 * suppress_cache_flush bit is set for this device. 9679 * 9680 * 2. if not there, then queries the internal disk table. 9681 * 9682 * 3. if either sd.conf or internal disk table specifies 9683 * cache flush be suppressed, we don't bother checking 9684 * NV_SUP bit. 9685 * 9686 * If SUPPRESS_CACHE_FLUSH bit is not set to 1, sd queries 9687 * the optional INQUIRY VPD page 0x86. If the device 9688 * supports VPD page 0x86, sd examines the NV_SUP 9689 * (non-volatile cache support) bit in the INQUIRY VPD page 9690 * 0x86: 9691 * o If NV_SUP bit is set, sd assumes the device has a 9692 * non-volatile cache and set the 9693 * un_f_sync_nv_supported to TRUE. 9694 * o Otherwise cache is not non-volatile, 9695 * un_f_sync_nv_supported is set to FALSE. 9696 * 9697 * Arguments: un - driver soft state (unit) structure 9698 * 9699 * Return Code: 9700 * 9701 * Context: Kernel Thread 9702 */ 9703 9704 static void 9705 sd_get_nv_sup(sd_ssc_t *ssc) 9706 { 9707 int rval = 0; 9708 uchar_t *inq86 = NULL; 9709 size_t inq86_len = MAX_INQUIRY_SIZE; 9710 size_t inq86_resid = 0; 9711 struct dk_callback *dkc; 9712 struct sd_lun *un; 9713 9714 ASSERT(ssc != NULL); 9715 un = ssc->ssc_un; 9716 ASSERT(un != NULL); 9717 9718 mutex_enter(SD_MUTEX(un)); 9719 9720 /* 9721 * Be conservative on the device's support of 9722 * SYNC_NV bit: un_f_sync_nv_supported is 9723 * initialized to be false. 9724 */ 9725 un->un_f_sync_nv_supported = FALSE; 9726 9727 /* 9728 * If either sd.conf or internal disk table 9729 * specifies cache flush be suppressed, then 9730 * we don't bother checking NV_SUP bit. 9731 */ 9732 if (un->un_f_suppress_cache_flush == TRUE) { 9733 mutex_exit(SD_MUTEX(un)); 9734 return; 9735 } 9736 9737 if (sd_check_vpd_page_support(ssc) == 0 && 9738 un->un_vpd_page_mask & SD_VPD_EXTENDED_DATA_PG) { 9739 mutex_exit(SD_MUTEX(un)); 9740 /* collect page 86 data if available */ 9741 inq86 = kmem_zalloc(inq86_len, KM_SLEEP); 9742 9743 rval = sd_send_scsi_INQUIRY(ssc, inq86, inq86_len, 9744 0x01, 0x86, &inq86_resid); 9745 9746 if (rval == 0 && (inq86_len - inq86_resid > 6)) { 9747 SD_TRACE(SD_LOG_COMMON, un, 9748 "sd_get_nv_sup: \ 9749 successfully get VPD page: %x \ 9750 PAGE LENGTH: %x BYTE 6: %x\n", 9751 inq86[1], inq86[3], inq86[6]); 9752 9753 mutex_enter(SD_MUTEX(un)); 9754 /* 9755 * check the value of NV_SUP bit: only if the device 9756 * reports NV_SUP bit to be 1, the 9757 * un_f_sync_nv_supported bit will be set to true. 9758 */ 9759 if (inq86[6] & SD_VPD_NV_SUP) { 9760 un->un_f_sync_nv_supported = TRUE; 9761 } 9762 mutex_exit(SD_MUTEX(un)); 9763 } else if (rval != 0) { 9764 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9765 } 9766 9767 kmem_free(inq86, inq86_len); 9768 } else { 9769 mutex_exit(SD_MUTEX(un)); 9770 } 9771 9772 /* 9773 * Send a SYNC CACHE command to check whether 9774 * SYNC_NV bit is supported. This command should have 9775 * un_f_sync_nv_supported set to correct value. 9776 */ 9777 mutex_enter(SD_MUTEX(un)); 9778 if (un->un_f_sync_nv_supported) { 9779 mutex_exit(SD_MUTEX(un)); 9780 dkc = kmem_zalloc(sizeof (struct dk_callback), KM_SLEEP); 9781 dkc->dkc_flag = FLUSH_VOLATILE; 9782 (void) sd_send_scsi_SYNCHRONIZE_CACHE(un, dkc); 9783 9784 /* 9785 * Send a TEST UNIT READY command to the device. This should 9786 * clear any outstanding UNIT ATTENTION that may be present. 9787 */ 9788 rval = sd_send_scsi_TEST_UNIT_READY(ssc, SD_DONT_RETRY_TUR); 9789 if (rval != 0) 9790 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 9791 9792 kmem_free(dkc, sizeof (struct dk_callback)); 9793 } else { 9794 mutex_exit(SD_MUTEX(un)); 9795 } 9796 9797 SD_TRACE(SD_LOG_COMMON, un, "sd_get_nv_sup: \ 9798 un_f_suppress_cache_flush is set to %d\n", 9799 un->un_f_suppress_cache_flush); 9800 } 9801 9802 /* 9803 * Function: sd_make_device 9804 * 9805 * Description: Utility routine to return the Solaris device number from 9806 * the data in the device's dev_info structure. 9807 * 9808 * Return Code: The Solaris device number 9809 * 9810 * Context: Any 9811 */ 9812 9813 static dev_t 9814 sd_make_device(dev_info_t *devi) 9815 { 9816 return (makedevice(ddi_driver_major(devi), 9817 ddi_get_instance(devi) << SDUNIT_SHIFT)); 9818 } 9819 9820 9821 /* 9822 * Function: sd_pm_entry 9823 * 9824 * Description: Called at the start of a new command to manage power 9825 * and busy status of a device. This includes determining whether 9826 * the current power state of the device is sufficient for 9827 * performing the command or whether it must be changed. 9828 * The PM framework is notified appropriately. 9829 * Only with a return status of DDI_SUCCESS will the 9830 * component be busy to the framework. 9831 * 9832 * All callers of sd_pm_entry must check the return status 9833 * and only call sd_pm_exit it it was DDI_SUCCESS. A status 9834 * of DDI_FAILURE indicates the device failed to power up. 9835 * In this case un_pm_count has been adjusted so the result 9836 * on exit is still powered down, ie. count is less than 0. 9837 * Calling sd_pm_exit with this count value hits an ASSERT. 9838 * 9839 * Return Code: DDI_SUCCESS or DDI_FAILURE 9840 * 9841 * Context: Kernel thread context. 9842 */ 9843 9844 static int 9845 sd_pm_entry(struct sd_lun *un) 9846 { 9847 int return_status = DDI_SUCCESS; 9848 9849 ASSERT(!mutex_owned(SD_MUTEX(un))); 9850 ASSERT(!mutex_owned(&un->un_pm_mutex)); 9851 9852 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_entry: entry\n"); 9853 9854 if (un->un_f_pm_is_enabled == FALSE) { 9855 SD_TRACE(SD_LOG_IO_PM, un, 9856 "sd_pm_entry: exiting, PM not enabled\n"); 9857 return (return_status); 9858 } 9859 9860 /* 9861 * Just increment a counter if PM is enabled. On the transition from 9862 * 0 ==> 1, mark the device as busy. The iodone side will decrement 9863 * the count with each IO and mark the device as idle when the count 9864 * hits 0. 9865 * 9866 * If the count is less than 0 the device is powered down. If a powered 9867 * down device is successfully powered up then the count must be 9868 * incremented to reflect the power up. Note that it'll get incremented 9869 * a second time to become busy. 9870 * 9871 * Because the following has the potential to change the device state 9872 * and must release the un_pm_mutex to do so, only one thread can be 9873 * allowed through at a time. 9874 */ 9875 9876 mutex_enter(&un->un_pm_mutex); 9877 while (un->un_pm_busy == TRUE) { 9878 cv_wait(&un->un_pm_busy_cv, &un->un_pm_mutex); 9879 } 9880 un->un_pm_busy = TRUE; 9881 9882 if (un->un_pm_count < 1) { 9883 9884 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_entry: busy component\n"); 9885 9886 /* 9887 * Indicate we are now busy so the framework won't attempt to 9888 * power down the device. This call will only fail if either 9889 * we passed a bad component number or the device has no 9890 * components. Neither of these should ever happen. 9891 */ 9892 mutex_exit(&un->un_pm_mutex); 9893 return_status = pm_busy_component(SD_DEVINFO(un), 0); 9894 ASSERT(return_status == DDI_SUCCESS); 9895 9896 mutex_enter(&un->un_pm_mutex); 9897 9898 if (un->un_pm_count < 0) { 9899 mutex_exit(&un->un_pm_mutex); 9900 9901 SD_TRACE(SD_LOG_IO_PM, un, 9902 "sd_pm_entry: power up component\n"); 9903 9904 /* 9905 * pm_raise_power will cause sdpower to be called 9906 * which brings the device power level to the 9907 * desired state, If successful, un_pm_count and 9908 * un_power_level will be updated appropriately. 9909 */ 9910 return_status = pm_raise_power(SD_DEVINFO(un), 0, 9911 SD_PM_STATE_ACTIVE(un)); 9912 9913 mutex_enter(&un->un_pm_mutex); 9914 9915 if (return_status != DDI_SUCCESS) { 9916 /* 9917 * Power up failed. 9918 * Idle the device and adjust the count 9919 * so the result on exit is that we're 9920 * still powered down, ie. count is less than 0. 9921 */ 9922 SD_TRACE(SD_LOG_IO_PM, un, 9923 "sd_pm_entry: power up failed," 9924 " idle the component\n"); 9925 9926 (void) pm_idle_component(SD_DEVINFO(un), 0); 9927 un->un_pm_count--; 9928 } else { 9929 /* 9930 * Device is powered up, verify the 9931 * count is non-negative. 9932 * This is debug only. 9933 */ 9934 ASSERT(un->un_pm_count == 0); 9935 } 9936 } 9937 9938 if (return_status == DDI_SUCCESS) { 9939 /* 9940 * For performance, now that the device has been tagged 9941 * as busy, and it's known to be powered up, update the 9942 * chain types to use jump tables that do not include 9943 * pm. This significantly lowers the overhead and 9944 * therefore improves performance. 9945 */ 9946 9947 mutex_exit(&un->un_pm_mutex); 9948 mutex_enter(SD_MUTEX(un)); 9949 SD_TRACE(SD_LOG_IO_PM, un, 9950 "sd_pm_entry: changing uscsi_chain_type from %d\n", 9951 un->un_uscsi_chain_type); 9952 9953 if (un->un_f_non_devbsize_supported) { 9954 un->un_buf_chain_type = 9955 SD_CHAIN_INFO_RMMEDIA_NO_PM; 9956 } else { 9957 un->un_buf_chain_type = 9958 SD_CHAIN_INFO_DISK_NO_PM; 9959 } 9960 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD_NO_PM; 9961 9962 SD_TRACE(SD_LOG_IO_PM, un, 9963 " changed uscsi_chain_type to %d\n", 9964 un->un_uscsi_chain_type); 9965 mutex_exit(SD_MUTEX(un)); 9966 mutex_enter(&un->un_pm_mutex); 9967 9968 if (un->un_pm_idle_timeid == NULL) { 9969 /* 300 ms. */ 9970 un->un_pm_idle_timeid = 9971 timeout(sd_pm_idletimeout_handler, un, 9972 (drv_usectohz((clock_t)300000))); 9973 /* 9974 * Include an extra call to busy which keeps the 9975 * device busy with-respect-to the PM layer 9976 * until the timer fires, at which time it'll 9977 * get the extra idle call. 9978 */ 9979 (void) pm_busy_component(SD_DEVINFO(un), 0); 9980 } 9981 } 9982 } 9983 un->un_pm_busy = FALSE; 9984 /* Next... */ 9985 cv_signal(&un->un_pm_busy_cv); 9986 9987 un->un_pm_count++; 9988 9989 SD_TRACE(SD_LOG_IO_PM, un, 9990 "sd_pm_entry: exiting, un_pm_count = %d\n", un->un_pm_count); 9991 9992 mutex_exit(&un->un_pm_mutex); 9993 9994 return (return_status); 9995 } 9996 9997 9998 /* 9999 * Function: sd_pm_exit 10000 * 10001 * Description: Called at the completion of a command to manage busy 10002 * status for the device. If the device becomes idle the 10003 * PM framework is notified. 10004 * 10005 * Context: Kernel thread context 10006 */ 10007 10008 static void 10009 sd_pm_exit(struct sd_lun *un) 10010 { 10011 ASSERT(!mutex_owned(SD_MUTEX(un))); 10012 ASSERT(!mutex_owned(&un->un_pm_mutex)); 10013 10014 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_exit: entry\n"); 10015 10016 /* 10017 * After attach the following flag is only read, so don't 10018 * take the penalty of acquiring a mutex for it. 10019 */ 10020 if (un->un_f_pm_is_enabled == TRUE) { 10021 10022 mutex_enter(&un->un_pm_mutex); 10023 un->un_pm_count--; 10024 10025 SD_TRACE(SD_LOG_IO_PM, un, 10026 "sd_pm_exit: un_pm_count = %d\n", un->un_pm_count); 10027 10028 ASSERT(un->un_pm_count >= 0); 10029 if (un->un_pm_count == 0) { 10030 mutex_exit(&un->un_pm_mutex); 10031 10032 SD_TRACE(SD_LOG_IO_PM, un, 10033 "sd_pm_exit: idle component\n"); 10034 10035 (void) pm_idle_component(SD_DEVINFO(un), 0); 10036 10037 } else { 10038 mutex_exit(&un->un_pm_mutex); 10039 } 10040 } 10041 10042 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_exit: exiting\n"); 10043 } 10044 10045 10046 /* 10047 * Function: sdopen 10048 * 10049 * Description: Driver's open(9e) entry point function. 10050 * 10051 * Arguments: dev_i - pointer to device number 10052 * flag - how to open file (FEXCL, FNDELAY, FREAD, FWRITE) 10053 * otyp - open type (OTYP_BLK, OTYP_CHR, OTYP_LYR) 10054 * cred_p - user credential pointer 10055 * 10056 * Return Code: EINVAL 10057 * ENXIO 10058 * EIO 10059 * EROFS 10060 * EBUSY 10061 * 10062 * Context: Kernel thread context 10063 */ 10064 /* ARGSUSED */ 10065 static int 10066 sdopen(dev_t *dev_p, int flag, int otyp, cred_t *cred_p) 10067 { 10068 struct sd_lun *un; 10069 int nodelay; 10070 int part; 10071 uint64_t partmask; 10072 int instance; 10073 dev_t dev; 10074 int rval = EIO; 10075 diskaddr_t nblks = 0; 10076 diskaddr_t label_cap; 10077 10078 /* Validate the open type */ 10079 if (otyp >= OTYPCNT) { 10080 return (EINVAL); 10081 } 10082 10083 dev = *dev_p; 10084 instance = SDUNIT(dev); 10085 mutex_enter(&sd_detach_mutex); 10086 10087 /* 10088 * Fail the open if there is no softstate for the instance, or 10089 * if another thread somewhere is trying to detach the instance. 10090 */ 10091 if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) || 10092 (un->un_detach_count != 0)) { 10093 mutex_exit(&sd_detach_mutex); 10094 /* 10095 * The probe cache only needs to be cleared when open (9e) fails 10096 * with ENXIO (4238046). 10097 */ 10098 /* 10099 * un-conditionally clearing probe cache is ok with 10100 * separate sd/ssd binaries 10101 * x86 platform can be an issue with both parallel 10102 * and fibre in 1 binary 10103 */ 10104 sd_scsi_clear_probe_cache(); 10105 return (ENXIO); 10106 } 10107 10108 /* 10109 * The un_layer_count is to prevent another thread in specfs from 10110 * trying to detach the instance, which can happen when we are 10111 * called from a higher-layer driver instead of thru specfs. 10112 * This will not be needed when DDI provides a layered driver 10113 * interface that allows specfs to know that an instance is in 10114 * use by a layered driver & should not be detached. 10115 * 10116 * Note: the semantics for layered driver opens are exactly one 10117 * close for every open. 10118 */ 10119 if (otyp == OTYP_LYR) { 10120 un->un_layer_count++; 10121 } 10122 10123 /* 10124 * Keep a count of the current # of opens in progress. This is because 10125 * some layered drivers try to call us as a regular open. This can 10126 * cause problems that we cannot prevent, however by keeping this count 10127 * we can at least keep our open and detach routines from racing against 10128 * each other under such conditions. 10129 */ 10130 un->un_opens_in_progress++; 10131 mutex_exit(&sd_detach_mutex); 10132 10133 nodelay = (flag & (FNDELAY | FNONBLOCK)); 10134 part = SDPART(dev); 10135 partmask = 1 << part; 10136 10137 /* 10138 * We use a semaphore here in order to serialize 10139 * open and close requests on the device. 10140 */ 10141 sema_p(&un->un_semoclose); 10142 10143 mutex_enter(SD_MUTEX(un)); 10144 10145 /* 10146 * All device accesses go thru sdstrategy() where we check 10147 * on suspend status but there could be a scsi_poll command, 10148 * which bypasses sdstrategy(), so we need to check pm 10149 * status. 10150 */ 10151 10152 if (!nodelay) { 10153 while ((un->un_state == SD_STATE_SUSPENDED) || 10154 (un->un_state == SD_STATE_PM_CHANGING)) { 10155 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 10156 } 10157 10158 mutex_exit(SD_MUTEX(un)); 10159 if (sd_pm_entry(un) != DDI_SUCCESS) { 10160 rval = EIO; 10161 SD_ERROR(SD_LOG_OPEN_CLOSE, un, 10162 "sdopen: sd_pm_entry failed\n"); 10163 goto open_failed_with_pm; 10164 } 10165 mutex_enter(SD_MUTEX(un)); 10166 } 10167 10168 /* check for previous exclusive open */ 10169 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: un=%p\n", (void *)un); 10170 SD_TRACE(SD_LOG_OPEN_CLOSE, un, 10171 "sdopen: exclopen=%x, flag=%x, regopen=%x\n", 10172 un->un_exclopen, flag, un->un_ocmap.regopen[otyp]); 10173 10174 if (un->un_exclopen & (partmask)) { 10175 goto excl_open_fail; 10176 } 10177 10178 if (flag & FEXCL) { 10179 int i; 10180 if (un->un_ocmap.lyropen[part]) { 10181 goto excl_open_fail; 10182 } 10183 for (i = 0; i < (OTYPCNT - 1); i++) { 10184 if (un->un_ocmap.regopen[i] & (partmask)) { 10185 goto excl_open_fail; 10186 } 10187 } 10188 } 10189 10190 /* 10191 * Check the write permission if this is a removable media device, 10192 * NDELAY has not been set, and writable permission is requested. 10193 * 10194 * Note: If NDELAY was set and this is write-protected media the WRITE 10195 * attempt will fail with EIO as part of the I/O processing. This is a 10196 * more permissive implementation that allows the open to succeed and 10197 * WRITE attempts to fail when appropriate. 10198 */ 10199 if (un->un_f_chk_wp_open) { 10200 if ((flag & FWRITE) && (!nodelay)) { 10201 mutex_exit(SD_MUTEX(un)); 10202 /* 10203 * Defer the check for write permission on writable 10204 * DVD drive till sdstrategy and will not fail open even 10205 * if FWRITE is set as the device can be writable 10206 * depending upon the media and the media can change 10207 * after the call to open(). 10208 */ 10209 if (un->un_f_dvdram_writable_device == FALSE) { 10210 if (ISCD(un) || sr_check_wp(dev)) { 10211 rval = EROFS; 10212 mutex_enter(SD_MUTEX(un)); 10213 SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: " 10214 "write to cd or write protected media\n"); 10215 goto open_fail; 10216 } 10217 } 10218 mutex_enter(SD_MUTEX(un)); 10219 } 10220 } 10221 10222 /* 10223 * If opening in NDELAY/NONBLOCK mode, just return. 10224 * Check if disk is ready and has a valid geometry later. 10225 */ 10226 if (!nodelay) { 10227 sd_ssc_t *ssc; 10228 10229 mutex_exit(SD_MUTEX(un)); 10230 ssc = sd_ssc_init(un); 10231 rval = sd_ready_and_valid(ssc, part); 10232 sd_ssc_fini(ssc); 10233 mutex_enter(SD_MUTEX(un)); 10234 /* 10235 * Fail if device is not ready or if the number of disk 10236 * blocks is zero or negative for non CD devices. 10237 */ 10238 10239 nblks = 0; 10240 10241 if (rval == SD_READY_VALID && (!ISCD(un))) { 10242 /* if cmlb_partinfo fails, nblks remains 0 */ 10243 mutex_exit(SD_MUTEX(un)); 10244 (void) cmlb_partinfo(un->un_cmlbhandle, part, &nblks, 10245 NULL, NULL, NULL, (void *)SD_PATH_DIRECT); 10246 mutex_enter(SD_MUTEX(un)); 10247 } 10248 10249 if ((rval != SD_READY_VALID) || 10250 (!ISCD(un) && nblks <= 0)) { 10251 rval = un->un_f_has_removable_media ? ENXIO : EIO; 10252 SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: " 10253 "device not ready or invalid disk block value\n"); 10254 goto open_fail; 10255 } 10256 #if defined(__i386) || defined(__amd64) 10257 } else { 10258 uchar_t *cp; 10259 /* 10260 * x86 requires special nodelay handling, so that p0 is 10261 * always defined and accessible. 10262 * Invalidate geometry only if device is not already open. 10263 */ 10264 cp = &un->un_ocmap.chkd[0]; 10265 while (cp < &un->un_ocmap.chkd[OCSIZE]) { 10266 if (*cp != (uchar_t)0) { 10267 break; 10268 } 10269 cp++; 10270 } 10271 if (cp == &un->un_ocmap.chkd[OCSIZE]) { 10272 mutex_exit(SD_MUTEX(un)); 10273 cmlb_invalidate(un->un_cmlbhandle, 10274 (void *)SD_PATH_DIRECT); 10275 mutex_enter(SD_MUTEX(un)); 10276 } 10277 10278 #endif 10279 } 10280 10281 if (otyp == OTYP_LYR) { 10282 un->un_ocmap.lyropen[part]++; 10283 } else { 10284 un->un_ocmap.regopen[otyp] |= partmask; 10285 } 10286 10287 /* Set up open and exclusive open flags */ 10288 if (flag & FEXCL) { 10289 un->un_exclopen |= (partmask); 10290 } 10291 10292 /* 10293 * If the lun is EFI labeled and lun capacity is greater than the 10294 * capacity contained in the label, log a sys-event to notify the 10295 * interested module. 10296 * To avoid an infinite loop of logging sys-event, we only log the 10297 * event when the lun is not opened in NDELAY mode. The event handler 10298 * should open the lun in NDELAY mode. 10299 */ 10300 if (!nodelay) { 10301 mutex_exit(SD_MUTEX(un)); 10302 if (cmlb_efi_label_capacity(un->un_cmlbhandle, &label_cap, 10303 (void*)SD_PATH_DIRECT) == 0) { 10304 mutex_enter(SD_MUTEX(un)); 10305 if (un->un_f_blockcount_is_valid && 10306 un->un_blockcount > label_cap && 10307 un->un_f_expnevent == B_FALSE) { 10308 un->un_f_expnevent = B_TRUE; 10309 mutex_exit(SD_MUTEX(un)); 10310 sd_log_lun_expansion_event(un, 10311 (nodelay ? KM_NOSLEEP : KM_SLEEP)); 10312 mutex_enter(SD_MUTEX(un)); 10313 } 10314 } else { 10315 mutex_enter(SD_MUTEX(un)); 10316 } 10317 } 10318 10319 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: " 10320 "open of part %d type %d\n", part, otyp); 10321 10322 mutex_exit(SD_MUTEX(un)); 10323 if (!nodelay) { 10324 sd_pm_exit(un); 10325 } 10326 10327 sema_v(&un->un_semoclose); 10328 10329 mutex_enter(&sd_detach_mutex); 10330 un->un_opens_in_progress--; 10331 mutex_exit(&sd_detach_mutex); 10332 10333 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: exit success\n"); 10334 return (DDI_SUCCESS); 10335 10336 excl_open_fail: 10337 SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: fail exclusive open\n"); 10338 rval = EBUSY; 10339 10340 open_fail: 10341 mutex_exit(SD_MUTEX(un)); 10342 10343 /* 10344 * On a failed open we must exit the pm management. 10345 */ 10346 if (!nodelay) { 10347 sd_pm_exit(un); 10348 } 10349 open_failed_with_pm: 10350 sema_v(&un->un_semoclose); 10351 10352 mutex_enter(&sd_detach_mutex); 10353 un->un_opens_in_progress--; 10354 if (otyp == OTYP_LYR) { 10355 un->un_layer_count--; 10356 } 10357 mutex_exit(&sd_detach_mutex); 10358 10359 return (rval); 10360 } 10361 10362 10363 /* 10364 * Function: sdclose 10365 * 10366 * Description: Driver's close(9e) entry point function. 10367 * 10368 * Arguments: dev - device number 10369 * flag - file status flag, informational only 10370 * otyp - close type (OTYP_BLK, OTYP_CHR, OTYP_LYR) 10371 * cred_p - user credential pointer 10372 * 10373 * Return Code: ENXIO 10374 * 10375 * Context: Kernel thread context 10376 */ 10377 /* ARGSUSED */ 10378 static int 10379 sdclose(dev_t dev, int flag, int otyp, cred_t *cred_p) 10380 { 10381 struct sd_lun *un; 10382 uchar_t *cp; 10383 int part; 10384 int nodelay; 10385 int rval = 0; 10386 10387 /* Validate the open type */ 10388 if (otyp >= OTYPCNT) { 10389 return (ENXIO); 10390 } 10391 10392 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 10393 return (ENXIO); 10394 } 10395 10396 part = SDPART(dev); 10397 nodelay = flag & (FNDELAY | FNONBLOCK); 10398 10399 SD_TRACE(SD_LOG_OPEN_CLOSE, un, 10400 "sdclose: close of part %d type %d\n", part, otyp); 10401 10402 /* 10403 * We use a semaphore here in order to serialize 10404 * open and close requests on the device. 10405 */ 10406 sema_p(&un->un_semoclose); 10407 10408 mutex_enter(SD_MUTEX(un)); 10409 10410 /* Don't proceed if power is being changed. */ 10411 while (un->un_state == SD_STATE_PM_CHANGING) { 10412 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 10413 } 10414 10415 if (un->un_exclopen & (1 << part)) { 10416 un->un_exclopen &= ~(1 << part); 10417 } 10418 10419 /* Update the open partition map */ 10420 if (otyp == OTYP_LYR) { 10421 un->un_ocmap.lyropen[part] -= 1; 10422 } else { 10423 un->un_ocmap.regopen[otyp] &= ~(1 << part); 10424 } 10425 10426 cp = &un->un_ocmap.chkd[0]; 10427 while (cp < &un->un_ocmap.chkd[OCSIZE]) { 10428 if (*cp != NULL) { 10429 break; 10430 } 10431 cp++; 10432 } 10433 10434 if (cp == &un->un_ocmap.chkd[OCSIZE]) { 10435 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdclose: last close\n"); 10436 10437 /* 10438 * We avoid persistance upon the last close, and set 10439 * the throttle back to the maximum. 10440 */ 10441 un->un_throttle = un->un_saved_throttle; 10442 10443 if (un->un_state == SD_STATE_OFFLINE) { 10444 if (un->un_f_is_fibre == FALSE) { 10445 scsi_log(SD_DEVINFO(un), sd_label, 10446 CE_WARN, "offline\n"); 10447 } 10448 mutex_exit(SD_MUTEX(un)); 10449 cmlb_invalidate(un->un_cmlbhandle, 10450 (void *)SD_PATH_DIRECT); 10451 mutex_enter(SD_MUTEX(un)); 10452 10453 } else { 10454 /* 10455 * Flush any outstanding writes in NVRAM cache. 10456 * Note: SYNCHRONIZE CACHE is an optional SCSI-2 10457 * cmd, it may not work for non-Pluto devices. 10458 * SYNCHRONIZE CACHE is not required for removables, 10459 * except DVD-RAM drives. 10460 * 10461 * Also note: because SYNCHRONIZE CACHE is currently 10462 * the only command issued here that requires the 10463 * drive be powered up, only do the power up before 10464 * sending the Sync Cache command. If additional 10465 * commands are added which require a powered up 10466 * drive, the following sequence may have to change. 10467 * 10468 * And finally, note that parallel SCSI on SPARC 10469 * only issues a Sync Cache to DVD-RAM, a newly 10470 * supported device. 10471 */ 10472 #if defined(__i386) || defined(__amd64) 10473 if ((un->un_f_sync_cache_supported && 10474 un->un_f_sync_cache_required) || 10475 un->un_f_dvdram_writable_device == TRUE) { 10476 #else 10477 if (un->un_f_dvdram_writable_device == TRUE) { 10478 #endif 10479 mutex_exit(SD_MUTEX(un)); 10480 if (sd_pm_entry(un) == DDI_SUCCESS) { 10481 rval = 10482 sd_send_scsi_SYNCHRONIZE_CACHE(un, 10483 NULL); 10484 /* ignore error if not supported */ 10485 if (rval == ENOTSUP) { 10486 rval = 0; 10487 } else if (rval != 0) { 10488 rval = EIO; 10489 } 10490 sd_pm_exit(un); 10491 } else { 10492 rval = EIO; 10493 } 10494 mutex_enter(SD_MUTEX(un)); 10495 } 10496 10497 /* 10498 * For devices which supports DOOR_LOCK, send an ALLOW 10499 * MEDIA REMOVAL command, but don't get upset if it 10500 * fails. We need to raise the power of the drive before 10501 * we can call sd_send_scsi_DOORLOCK() 10502 */ 10503 if (un->un_f_doorlock_supported) { 10504 mutex_exit(SD_MUTEX(un)); 10505 if (sd_pm_entry(un) == DDI_SUCCESS) { 10506 sd_ssc_t *ssc; 10507 10508 ssc = sd_ssc_init(un); 10509 rval = sd_send_scsi_DOORLOCK(ssc, 10510 SD_REMOVAL_ALLOW, SD_PATH_DIRECT); 10511 if (rval != 0) 10512 sd_ssc_assessment(ssc, 10513 SD_FMT_IGNORE); 10514 sd_ssc_fini(ssc); 10515 10516 sd_pm_exit(un); 10517 if (ISCD(un) && (rval != 0) && 10518 (nodelay != 0)) { 10519 rval = ENXIO; 10520 } 10521 } else { 10522 rval = EIO; 10523 } 10524 mutex_enter(SD_MUTEX(un)); 10525 } 10526 10527 /* 10528 * If a device has removable media, invalidate all 10529 * parameters related to media, such as geometry, 10530 * blocksize, and blockcount. 10531 */ 10532 if (un->un_f_has_removable_media) { 10533 sr_ejected(un); 10534 } 10535 10536 /* 10537 * Destroy the cache (if it exists) which was 10538 * allocated for the write maps since this is 10539 * the last close for this media. 10540 */ 10541 if (un->un_wm_cache) { 10542 /* 10543 * Check if there are pending commands. 10544 * and if there are give a warning and 10545 * do not destroy the cache. 10546 */ 10547 if (un->un_ncmds_in_driver > 0) { 10548 scsi_log(SD_DEVINFO(un), 10549 sd_label, CE_WARN, 10550 "Unable to clean up memory " 10551 "because of pending I/O\n"); 10552 } else { 10553 kmem_cache_destroy( 10554 un->un_wm_cache); 10555 un->un_wm_cache = NULL; 10556 } 10557 } 10558 } 10559 } 10560 10561 mutex_exit(SD_MUTEX(un)); 10562 sema_v(&un->un_semoclose); 10563 10564 if (otyp == OTYP_LYR) { 10565 mutex_enter(&sd_detach_mutex); 10566 /* 10567 * The detach routine may run when the layer count 10568 * drops to zero. 10569 */ 10570 un->un_layer_count--; 10571 mutex_exit(&sd_detach_mutex); 10572 } 10573 10574 return (rval); 10575 } 10576 10577 10578 /* 10579 * Function: sd_ready_and_valid 10580 * 10581 * Description: Test if device is ready and has a valid geometry. 10582 * 10583 * Arguments: ssc - sd_ssc_t will contain un 10584 * un - driver soft state (unit) structure 10585 * 10586 * Return Code: SD_READY_VALID ready and valid label 10587 * SD_NOT_READY_VALID not ready, no label 10588 * SD_RESERVED_BY_OTHERS reservation conflict 10589 * 10590 * Context: Never called at interrupt context. 10591 */ 10592 10593 static int 10594 sd_ready_and_valid(sd_ssc_t *ssc, int part) 10595 { 10596 struct sd_errstats *stp; 10597 uint64_t capacity; 10598 uint_t lbasize; 10599 int rval = SD_READY_VALID; 10600 char name_str[48]; 10601 boolean_t is_valid; 10602 struct sd_lun *un; 10603 int status; 10604 10605 ASSERT(ssc != NULL); 10606 un = ssc->ssc_un; 10607 ASSERT(un != NULL); 10608 ASSERT(!mutex_owned(SD_MUTEX(un))); 10609 10610 mutex_enter(SD_MUTEX(un)); 10611 /* 10612 * If a device has removable media, we must check if media is 10613 * ready when checking if this device is ready and valid. 10614 */ 10615 if (un->un_f_has_removable_media) { 10616 mutex_exit(SD_MUTEX(un)); 10617 status = sd_send_scsi_TEST_UNIT_READY(ssc, 0); 10618 10619 if (status != 0) { 10620 rval = SD_NOT_READY_VALID; 10621 mutex_enter(SD_MUTEX(un)); 10622 10623 /* Ignore all failed status for removalbe media */ 10624 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 10625 10626 goto done; 10627 } 10628 10629 is_valid = SD_IS_VALID_LABEL(un); 10630 mutex_enter(SD_MUTEX(un)); 10631 if (!is_valid || 10632 (un->un_f_blockcount_is_valid == FALSE) || 10633 (un->un_f_tgt_blocksize_is_valid == FALSE)) { 10634 10635 /* capacity has to be read every open. */ 10636 mutex_exit(SD_MUTEX(un)); 10637 status = sd_send_scsi_READ_CAPACITY(ssc, &capacity, 10638 &lbasize, SD_PATH_DIRECT); 10639 10640 if (status != 0) { 10641 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 10642 10643 cmlb_invalidate(un->un_cmlbhandle, 10644 (void *)SD_PATH_DIRECT); 10645 mutex_enter(SD_MUTEX(un)); 10646 rval = SD_NOT_READY_VALID; 10647 10648 goto done; 10649 } else { 10650 mutex_enter(SD_MUTEX(un)); 10651 sd_update_block_info(un, lbasize, capacity); 10652 } 10653 } 10654 10655 /* 10656 * Check if the media in the device is writable or not. 10657 */ 10658 if (!is_valid && ISCD(un)) { 10659 sd_check_for_writable_cd(ssc, SD_PATH_DIRECT); 10660 } 10661 10662 } else { 10663 /* 10664 * Do a test unit ready to clear any unit attention from non-cd 10665 * devices. 10666 */ 10667 mutex_exit(SD_MUTEX(un)); 10668 10669 status = sd_send_scsi_TEST_UNIT_READY(ssc, 0); 10670 if (status != 0) { 10671 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 10672 } 10673 10674 mutex_enter(SD_MUTEX(un)); 10675 } 10676 10677 10678 /* 10679 * If this is a non 512 block device, allocate space for 10680 * the wmap cache. This is being done here since every time 10681 * a media is changed this routine will be called and the 10682 * block size is a function of media rather than device. 10683 */ 10684 if (((un->un_f_rmw_type != SD_RMW_TYPE_RETURN_ERROR || 10685 un->un_f_non_devbsize_supported) && 10686 un->un_tgt_blocksize != DEV_BSIZE) || 10687 un->un_f_enable_rmw) { 10688 if (!(un->un_wm_cache)) { 10689 (void) snprintf(name_str, sizeof (name_str), 10690 "%s%d_cache", 10691 ddi_driver_name(SD_DEVINFO(un)), 10692 ddi_get_instance(SD_DEVINFO(un))); 10693 un->un_wm_cache = kmem_cache_create( 10694 name_str, sizeof (struct sd_w_map), 10695 8, sd_wm_cache_constructor, 10696 sd_wm_cache_destructor, NULL, 10697 (void *)un, NULL, 0); 10698 if (!(un->un_wm_cache)) { 10699 rval = ENOMEM; 10700 goto done; 10701 } 10702 } 10703 } 10704 10705 if (un->un_state == SD_STATE_NORMAL) { 10706 /* 10707 * If the target is not yet ready here (defined by a TUR 10708 * failure), invalidate the geometry and print an 'offline' 10709 * message. This is a legacy message, as the state of the 10710 * target is not actually changed to SD_STATE_OFFLINE. 10711 * 10712 * If the TUR fails for EACCES (Reservation Conflict), 10713 * SD_RESERVED_BY_OTHERS will be returned to indicate 10714 * reservation conflict. If the TUR fails for other 10715 * reasons, SD_NOT_READY_VALID will be returned. 10716 */ 10717 int err; 10718 10719 mutex_exit(SD_MUTEX(un)); 10720 err = sd_send_scsi_TEST_UNIT_READY(ssc, 0); 10721 mutex_enter(SD_MUTEX(un)); 10722 10723 if (err != 0) { 10724 mutex_exit(SD_MUTEX(un)); 10725 cmlb_invalidate(un->un_cmlbhandle, 10726 (void *)SD_PATH_DIRECT); 10727 mutex_enter(SD_MUTEX(un)); 10728 if (err == EACCES) { 10729 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 10730 "reservation conflict\n"); 10731 rval = SD_RESERVED_BY_OTHERS; 10732 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 10733 } else { 10734 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 10735 "drive offline\n"); 10736 rval = SD_NOT_READY_VALID; 10737 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 10738 } 10739 goto done; 10740 } 10741 } 10742 10743 if (un->un_f_format_in_progress == FALSE) { 10744 mutex_exit(SD_MUTEX(un)); 10745 10746 (void) cmlb_validate(un->un_cmlbhandle, 0, 10747 (void *)SD_PATH_DIRECT); 10748 if (cmlb_partinfo(un->un_cmlbhandle, part, NULL, NULL, NULL, 10749 NULL, (void *) SD_PATH_DIRECT) != 0) { 10750 rval = SD_NOT_READY_VALID; 10751 mutex_enter(SD_MUTEX(un)); 10752 10753 goto done; 10754 } 10755 if (un->un_f_pkstats_enabled) { 10756 sd_set_pstats(un); 10757 SD_TRACE(SD_LOG_IO_PARTITION, un, 10758 "sd_ready_and_valid: un:0x%p pstats created and " 10759 "set\n", un); 10760 } 10761 mutex_enter(SD_MUTEX(un)); 10762 } 10763 10764 /* 10765 * If this device supports DOOR_LOCK command, try and send 10766 * this command to PREVENT MEDIA REMOVAL, but don't get upset 10767 * if it fails. For a CD, however, it is an error 10768 */ 10769 if (un->un_f_doorlock_supported) { 10770 mutex_exit(SD_MUTEX(un)); 10771 status = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT, 10772 SD_PATH_DIRECT); 10773 10774 if ((status != 0) && ISCD(un)) { 10775 rval = SD_NOT_READY_VALID; 10776 mutex_enter(SD_MUTEX(un)); 10777 10778 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 10779 10780 goto done; 10781 } else if (status != 0) 10782 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 10783 mutex_enter(SD_MUTEX(un)); 10784 } 10785 10786 /* The state has changed, inform the media watch routines */ 10787 un->un_mediastate = DKIO_INSERTED; 10788 cv_broadcast(&un->un_state_cv); 10789 rval = SD_READY_VALID; 10790 10791 done: 10792 10793 /* 10794 * Initialize the capacity kstat value, if no media previously 10795 * (capacity kstat is 0) and a media has been inserted 10796 * (un_blockcount > 0). 10797 */ 10798 if (un->un_errstats != NULL) { 10799 stp = (struct sd_errstats *)un->un_errstats->ks_data; 10800 if ((stp->sd_capacity.value.ui64 == 0) && 10801 (un->un_f_blockcount_is_valid == TRUE)) { 10802 stp->sd_capacity.value.ui64 = 10803 (uint64_t)((uint64_t)un->un_blockcount * 10804 un->un_sys_blocksize); 10805 } 10806 } 10807 10808 mutex_exit(SD_MUTEX(un)); 10809 return (rval); 10810 } 10811 10812 10813 /* 10814 * Function: sdmin 10815 * 10816 * Description: Routine to limit the size of a data transfer. Used in 10817 * conjunction with physio(9F). 10818 * 10819 * Arguments: bp - pointer to the indicated buf(9S) struct. 10820 * 10821 * Context: Kernel thread context. 10822 */ 10823 10824 static void 10825 sdmin(struct buf *bp) 10826 { 10827 struct sd_lun *un; 10828 int instance; 10829 10830 instance = SDUNIT(bp->b_edev); 10831 10832 un = ddi_get_soft_state(sd_state, instance); 10833 ASSERT(un != NULL); 10834 10835 /* 10836 * We depend on buf breakup to restrict 10837 * IO size if it is enabled. 10838 */ 10839 if (un->un_buf_breakup_supported) { 10840 return; 10841 } 10842 10843 if (bp->b_bcount > un->un_max_xfer_size) { 10844 bp->b_bcount = un->un_max_xfer_size; 10845 } 10846 } 10847 10848 10849 /* 10850 * Function: sdread 10851 * 10852 * Description: Driver's read(9e) entry point function. 10853 * 10854 * Arguments: dev - device number 10855 * uio - structure pointer describing where data is to be stored 10856 * in user's space 10857 * cred_p - user credential pointer 10858 * 10859 * Return Code: ENXIO 10860 * EIO 10861 * EINVAL 10862 * value returned by physio 10863 * 10864 * Context: Kernel thread context. 10865 */ 10866 /* ARGSUSED */ 10867 static int 10868 sdread(dev_t dev, struct uio *uio, cred_t *cred_p) 10869 { 10870 struct sd_lun *un = NULL; 10871 int secmask; 10872 int err = 0; 10873 sd_ssc_t *ssc; 10874 10875 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 10876 return (ENXIO); 10877 } 10878 10879 ASSERT(!mutex_owned(SD_MUTEX(un))); 10880 10881 10882 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { 10883 mutex_enter(SD_MUTEX(un)); 10884 /* 10885 * Because the call to sd_ready_and_valid will issue I/O we 10886 * must wait here if either the device is suspended or 10887 * if it's power level is changing. 10888 */ 10889 while ((un->un_state == SD_STATE_SUSPENDED) || 10890 (un->un_state == SD_STATE_PM_CHANGING)) { 10891 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 10892 } 10893 un->un_ncmds_in_driver++; 10894 mutex_exit(SD_MUTEX(un)); 10895 10896 /* Initialize sd_ssc_t for internal uscsi commands */ 10897 ssc = sd_ssc_init(un); 10898 if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) { 10899 err = EIO; 10900 } else { 10901 err = 0; 10902 } 10903 sd_ssc_fini(ssc); 10904 10905 mutex_enter(SD_MUTEX(un)); 10906 un->un_ncmds_in_driver--; 10907 ASSERT(un->un_ncmds_in_driver >= 0); 10908 mutex_exit(SD_MUTEX(un)); 10909 if (err != 0) 10910 return (err); 10911 } 10912 10913 /* 10914 * Read requests are restricted to multiples of the system block size. 10915 */ 10916 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && 10917 !un->un_f_enable_rmw) 10918 secmask = un->un_tgt_blocksize - 1; 10919 else 10920 secmask = DEV_BSIZE - 1; 10921 10922 if (uio->uio_loffset & ((offset_t)(secmask))) { 10923 SD_ERROR(SD_LOG_READ_WRITE, un, 10924 "sdread: file offset not modulo %d\n", 10925 secmask + 1); 10926 err = EINVAL; 10927 } else if (uio->uio_iov->iov_len & (secmask)) { 10928 SD_ERROR(SD_LOG_READ_WRITE, un, 10929 "sdread: transfer length not modulo %d\n", 10930 secmask + 1); 10931 err = EINVAL; 10932 } else { 10933 err = physio(sdstrategy, NULL, dev, B_READ, sdmin, uio); 10934 } 10935 10936 return (err); 10937 } 10938 10939 10940 /* 10941 * Function: sdwrite 10942 * 10943 * Description: Driver's write(9e) entry point function. 10944 * 10945 * Arguments: dev - device number 10946 * uio - structure pointer describing where data is stored in 10947 * user's space 10948 * cred_p - user credential pointer 10949 * 10950 * Return Code: ENXIO 10951 * EIO 10952 * EINVAL 10953 * value returned by physio 10954 * 10955 * Context: Kernel thread context. 10956 */ 10957 /* ARGSUSED */ 10958 static int 10959 sdwrite(dev_t dev, struct uio *uio, cred_t *cred_p) 10960 { 10961 struct sd_lun *un = NULL; 10962 int secmask; 10963 int err = 0; 10964 sd_ssc_t *ssc; 10965 10966 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 10967 return (ENXIO); 10968 } 10969 10970 ASSERT(!mutex_owned(SD_MUTEX(un))); 10971 10972 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { 10973 mutex_enter(SD_MUTEX(un)); 10974 /* 10975 * Because the call to sd_ready_and_valid will issue I/O we 10976 * must wait here if either the device is suspended or 10977 * if it's power level is changing. 10978 */ 10979 while ((un->un_state == SD_STATE_SUSPENDED) || 10980 (un->un_state == SD_STATE_PM_CHANGING)) { 10981 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 10982 } 10983 un->un_ncmds_in_driver++; 10984 mutex_exit(SD_MUTEX(un)); 10985 10986 /* Initialize sd_ssc_t for internal uscsi commands */ 10987 ssc = sd_ssc_init(un); 10988 if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) { 10989 err = EIO; 10990 } else { 10991 err = 0; 10992 } 10993 sd_ssc_fini(ssc); 10994 10995 mutex_enter(SD_MUTEX(un)); 10996 un->un_ncmds_in_driver--; 10997 ASSERT(un->un_ncmds_in_driver >= 0); 10998 mutex_exit(SD_MUTEX(un)); 10999 if (err != 0) 11000 return (err); 11001 } 11002 11003 /* 11004 * Write requests are restricted to multiples of the system block size. 11005 */ 11006 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && 11007 !un->un_f_enable_rmw) 11008 secmask = un->un_tgt_blocksize - 1; 11009 else 11010 secmask = DEV_BSIZE - 1; 11011 11012 if (uio->uio_loffset & ((offset_t)(secmask))) { 11013 SD_ERROR(SD_LOG_READ_WRITE, un, 11014 "sdwrite: file offset not modulo %d\n", 11015 secmask + 1); 11016 err = EINVAL; 11017 } else if (uio->uio_iov->iov_len & (secmask)) { 11018 SD_ERROR(SD_LOG_READ_WRITE, un, 11019 "sdwrite: transfer length not modulo %d\n", 11020 secmask + 1); 11021 err = EINVAL; 11022 } else { 11023 err = physio(sdstrategy, NULL, dev, B_WRITE, sdmin, uio); 11024 } 11025 11026 return (err); 11027 } 11028 11029 11030 /* 11031 * Function: sdaread 11032 * 11033 * Description: Driver's aread(9e) entry point function. 11034 * 11035 * Arguments: dev - device number 11036 * aio - structure pointer describing where data is to be stored 11037 * cred_p - user credential pointer 11038 * 11039 * Return Code: ENXIO 11040 * EIO 11041 * EINVAL 11042 * value returned by aphysio 11043 * 11044 * Context: Kernel thread context. 11045 */ 11046 /* ARGSUSED */ 11047 static int 11048 sdaread(dev_t dev, struct aio_req *aio, cred_t *cred_p) 11049 { 11050 struct sd_lun *un = NULL; 11051 struct uio *uio = aio->aio_uio; 11052 int secmask; 11053 int err = 0; 11054 sd_ssc_t *ssc; 11055 11056 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 11057 return (ENXIO); 11058 } 11059 11060 ASSERT(!mutex_owned(SD_MUTEX(un))); 11061 11062 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { 11063 mutex_enter(SD_MUTEX(un)); 11064 /* 11065 * Because the call to sd_ready_and_valid will issue I/O we 11066 * must wait here if either the device is suspended or 11067 * if it's power level is changing. 11068 */ 11069 while ((un->un_state == SD_STATE_SUSPENDED) || 11070 (un->un_state == SD_STATE_PM_CHANGING)) { 11071 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 11072 } 11073 un->un_ncmds_in_driver++; 11074 mutex_exit(SD_MUTEX(un)); 11075 11076 /* Initialize sd_ssc_t for internal uscsi commands */ 11077 ssc = sd_ssc_init(un); 11078 if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) { 11079 err = EIO; 11080 } else { 11081 err = 0; 11082 } 11083 sd_ssc_fini(ssc); 11084 11085 mutex_enter(SD_MUTEX(un)); 11086 un->un_ncmds_in_driver--; 11087 ASSERT(un->un_ncmds_in_driver >= 0); 11088 mutex_exit(SD_MUTEX(un)); 11089 if (err != 0) 11090 return (err); 11091 } 11092 11093 /* 11094 * Read requests are restricted to multiples of the system block size. 11095 */ 11096 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && 11097 !un->un_f_enable_rmw) 11098 secmask = un->un_tgt_blocksize - 1; 11099 else 11100 secmask = DEV_BSIZE - 1; 11101 11102 if (uio->uio_loffset & ((offset_t)(secmask))) { 11103 SD_ERROR(SD_LOG_READ_WRITE, un, 11104 "sdaread: file offset not modulo %d\n", 11105 secmask + 1); 11106 err = EINVAL; 11107 } else if (uio->uio_iov->iov_len & (secmask)) { 11108 SD_ERROR(SD_LOG_READ_WRITE, un, 11109 "sdaread: transfer length not modulo %d\n", 11110 secmask + 1); 11111 err = EINVAL; 11112 } else { 11113 err = aphysio(sdstrategy, anocancel, dev, B_READ, sdmin, aio); 11114 } 11115 11116 return (err); 11117 } 11118 11119 11120 /* 11121 * Function: sdawrite 11122 * 11123 * Description: Driver's awrite(9e) entry point function. 11124 * 11125 * Arguments: dev - device number 11126 * aio - structure pointer describing where data is stored 11127 * cred_p - user credential pointer 11128 * 11129 * Return Code: ENXIO 11130 * EIO 11131 * EINVAL 11132 * value returned by aphysio 11133 * 11134 * Context: Kernel thread context. 11135 */ 11136 /* ARGSUSED */ 11137 static int 11138 sdawrite(dev_t dev, struct aio_req *aio, cred_t *cred_p) 11139 { 11140 struct sd_lun *un = NULL; 11141 struct uio *uio = aio->aio_uio; 11142 int secmask; 11143 int err = 0; 11144 sd_ssc_t *ssc; 11145 11146 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 11147 return (ENXIO); 11148 } 11149 11150 ASSERT(!mutex_owned(SD_MUTEX(un))); 11151 11152 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { 11153 mutex_enter(SD_MUTEX(un)); 11154 /* 11155 * Because the call to sd_ready_and_valid will issue I/O we 11156 * must wait here if either the device is suspended or 11157 * if it's power level is changing. 11158 */ 11159 while ((un->un_state == SD_STATE_SUSPENDED) || 11160 (un->un_state == SD_STATE_PM_CHANGING)) { 11161 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 11162 } 11163 un->un_ncmds_in_driver++; 11164 mutex_exit(SD_MUTEX(un)); 11165 11166 /* Initialize sd_ssc_t for internal uscsi commands */ 11167 ssc = sd_ssc_init(un); 11168 if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) { 11169 err = EIO; 11170 } else { 11171 err = 0; 11172 } 11173 sd_ssc_fini(ssc); 11174 11175 mutex_enter(SD_MUTEX(un)); 11176 un->un_ncmds_in_driver--; 11177 ASSERT(un->un_ncmds_in_driver >= 0); 11178 mutex_exit(SD_MUTEX(un)); 11179 if (err != 0) 11180 return (err); 11181 } 11182 11183 /* 11184 * Write requests are restricted to multiples of the system block size. 11185 */ 11186 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && 11187 !un->un_f_enable_rmw) 11188 secmask = un->un_tgt_blocksize - 1; 11189 else 11190 secmask = DEV_BSIZE - 1; 11191 11192 if (uio->uio_loffset & ((offset_t)(secmask))) { 11193 SD_ERROR(SD_LOG_READ_WRITE, un, 11194 "sdawrite: file offset not modulo %d\n", 11195 secmask + 1); 11196 err = EINVAL; 11197 } else if (uio->uio_iov->iov_len & (secmask)) { 11198 SD_ERROR(SD_LOG_READ_WRITE, un, 11199 "sdawrite: transfer length not modulo %d\n", 11200 secmask + 1); 11201 err = EINVAL; 11202 } else { 11203 err = aphysio(sdstrategy, anocancel, dev, B_WRITE, sdmin, aio); 11204 } 11205 11206 return (err); 11207 } 11208 11209 11210 11211 11212 11213 /* 11214 * Driver IO processing follows the following sequence: 11215 * 11216 * sdioctl(9E) sdstrategy(9E) biodone(9F) 11217 * | | ^ 11218 * v v | 11219 * sd_send_scsi_cmd() ddi_xbuf_qstrategy() +-------------------+ 11220 * | | | | 11221 * v | | | 11222 * sd_uscsi_strategy() sd_xbuf_strategy() sd_buf_iodone() sd_uscsi_iodone() 11223 * | | ^ ^ 11224 * v v | | 11225 * SD_BEGIN_IOSTART() SD_BEGIN_IOSTART() | | 11226 * | | | | 11227 * +---+ | +------------+ +-------+ 11228 * | | | | 11229 * | SD_NEXT_IOSTART()| SD_NEXT_IODONE()| | 11230 * | v | | 11231 * | sd_mapblockaddr_iostart() sd_mapblockaddr_iodone() | 11232 * | | ^ | 11233 * | SD_NEXT_IOSTART()| SD_NEXT_IODONE()| | 11234 * | v | | 11235 * | sd_mapblocksize_iostart() sd_mapblocksize_iodone() | 11236 * | | ^ | 11237 * | SD_NEXT_IOSTART()| SD_NEXT_IODONE()| | 11238 * | v | | 11239 * | sd_checksum_iostart() sd_checksum_iodone() | 11240 * | | ^ | 11241 * +-> SD_NEXT_IOSTART()| SD_NEXT_IODONE()+------------->+ 11242 * | v | | 11243 * | sd_pm_iostart() sd_pm_iodone() | 11244 * | | ^ | 11245 * | | | | 11246 * +-> SD_NEXT_IOSTART()| SD_BEGIN_IODONE()--+--------------+ 11247 * | ^ 11248 * v | 11249 * sd_core_iostart() | 11250 * | | 11251 * | +------>(*destroypkt)() 11252 * +-> sd_start_cmds() <-+ | | 11253 * | | | v 11254 * | | | scsi_destroy_pkt(9F) 11255 * | | | 11256 * +->(*initpkt)() +- sdintr() 11257 * | | | | 11258 * | +-> scsi_init_pkt(9F) | +-> sd_handle_xxx() 11259 * | +-> scsi_setup_cdb(9F) | 11260 * | | 11261 * +--> scsi_transport(9F) | 11262 * | | 11263 * +----> SCSA ---->+ 11264 * 11265 * 11266 * This code is based upon the following presumptions: 11267 * 11268 * - iostart and iodone functions operate on buf(9S) structures. These 11269 * functions perform the necessary operations on the buf(9S) and pass 11270 * them along to the next function in the chain by using the macros 11271 * SD_NEXT_IOSTART() (for iostart side functions) and SD_NEXT_IODONE() 11272 * (for iodone side functions). 11273 * 11274 * - The iostart side functions may sleep. The iodone side functions 11275 * are called under interrupt context and may NOT sleep. Therefore 11276 * iodone side functions also may not call iostart side functions. 11277 * (NOTE: iostart side functions should NOT sleep for memory, as 11278 * this could result in deadlock.) 11279 * 11280 * - An iostart side function may call its corresponding iodone side 11281 * function directly (if necessary). 11282 * 11283 * - In the event of an error, an iostart side function can return a buf(9S) 11284 * to its caller by calling SD_BEGIN_IODONE() (after setting B_ERROR and 11285 * b_error in the usual way of course). 11286 * 11287 * - The taskq mechanism may be used by the iodone side functions to dispatch 11288 * requests to the iostart side functions. The iostart side functions in 11289 * this case would be called under the context of a taskq thread, so it's 11290 * OK for them to block/sleep/spin in this case. 11291 * 11292 * - iostart side functions may allocate "shadow" buf(9S) structs and 11293 * pass them along to the next function in the chain. The corresponding 11294 * iodone side functions must coalesce the "shadow" bufs and return 11295 * the "original" buf to the next higher layer. 11296 * 11297 * - The b_private field of the buf(9S) struct holds a pointer to 11298 * an sd_xbuf struct, which contains information needed to 11299 * construct the scsi_pkt for the command. 11300 * 11301 * - The SD_MUTEX(un) is NOT held across calls to the next layer. Each 11302 * layer must acquire & release the SD_MUTEX(un) as needed. 11303 */ 11304 11305 11306 /* 11307 * Create taskq for all targets in the system. This is created at 11308 * _init(9E) and destroyed at _fini(9E). 11309 * 11310 * Note: here we set the minalloc to a reasonably high number to ensure that 11311 * we will have an adequate supply of task entries available at interrupt time. 11312 * This is used in conjunction with the TASKQ_PREPOPULATE flag in 11313 * sd_create_taskq(). Since we do not want to sleep for allocations at 11314 * interrupt time, set maxalloc equal to minalloc. That way we will just fail 11315 * the command if we ever try to dispatch more than SD_TASKQ_MAXALLOC taskq 11316 * requests any one instant in time. 11317 */ 11318 #define SD_TASKQ_NUMTHREADS 8 11319 #define SD_TASKQ_MINALLOC 256 11320 #define SD_TASKQ_MAXALLOC 256 11321 11322 static taskq_t *sd_tq = NULL; 11323 _NOTE(SCHEME_PROTECTS_DATA("stable data", sd_tq)) 11324 11325 static int sd_taskq_minalloc = SD_TASKQ_MINALLOC; 11326 static int sd_taskq_maxalloc = SD_TASKQ_MAXALLOC; 11327 11328 /* 11329 * The following task queue is being created for the write part of 11330 * read-modify-write of non-512 block size devices. 11331 * Limit the number of threads to 1 for now. This number has been chosen 11332 * considering the fact that it applies only to dvd ram drives/MO drives 11333 * currently. Performance for which is not main criteria at this stage. 11334 * Note: It needs to be explored if we can use a single taskq in future 11335 */ 11336 #define SD_WMR_TASKQ_NUMTHREADS 1 11337 static taskq_t *sd_wmr_tq = NULL; 11338 _NOTE(SCHEME_PROTECTS_DATA("stable data", sd_wmr_tq)) 11339 11340 /* 11341 * Function: sd_taskq_create 11342 * 11343 * Description: Create taskq thread(s) and preallocate task entries 11344 * 11345 * Return Code: Returns a pointer to the allocated taskq_t. 11346 * 11347 * Context: Can sleep. Requires blockable context. 11348 * 11349 * Notes: - The taskq() facility currently is NOT part of the DDI. 11350 * (definitely NOT recommeded for 3rd-party drivers!) :-) 11351 * - taskq_create() will block for memory, also it will panic 11352 * if it cannot create the requested number of threads. 11353 * - Currently taskq_create() creates threads that cannot be 11354 * swapped. 11355 * - We use TASKQ_PREPOPULATE to ensure we have an adequate 11356 * supply of taskq entries at interrupt time (ie, so that we 11357 * do not have to sleep for memory) 11358 */ 11359 11360 static void 11361 sd_taskq_create(void) 11362 { 11363 char taskq_name[TASKQ_NAMELEN]; 11364 11365 ASSERT(sd_tq == NULL); 11366 ASSERT(sd_wmr_tq == NULL); 11367 11368 (void) snprintf(taskq_name, sizeof (taskq_name), 11369 "%s_drv_taskq", sd_label); 11370 sd_tq = (taskq_create(taskq_name, SD_TASKQ_NUMTHREADS, 11371 (v.v_maxsyspri - 2), sd_taskq_minalloc, sd_taskq_maxalloc, 11372 TASKQ_PREPOPULATE)); 11373 11374 (void) snprintf(taskq_name, sizeof (taskq_name), 11375 "%s_rmw_taskq", sd_label); 11376 sd_wmr_tq = (taskq_create(taskq_name, SD_WMR_TASKQ_NUMTHREADS, 11377 (v.v_maxsyspri - 2), sd_taskq_minalloc, sd_taskq_maxalloc, 11378 TASKQ_PREPOPULATE)); 11379 } 11380 11381 11382 /* 11383 * Function: sd_taskq_delete 11384 * 11385 * Description: Complementary cleanup routine for sd_taskq_create(). 11386 * 11387 * Context: Kernel thread context. 11388 */ 11389 11390 static void 11391 sd_taskq_delete(void) 11392 { 11393 ASSERT(sd_tq != NULL); 11394 ASSERT(sd_wmr_tq != NULL); 11395 taskq_destroy(sd_tq); 11396 taskq_destroy(sd_wmr_tq); 11397 sd_tq = NULL; 11398 sd_wmr_tq = NULL; 11399 } 11400 11401 11402 /* 11403 * Function: sdstrategy 11404 * 11405 * Description: Driver's strategy (9E) entry point function. 11406 * 11407 * Arguments: bp - pointer to buf(9S) 11408 * 11409 * Return Code: Always returns zero 11410 * 11411 * Context: Kernel thread context. 11412 */ 11413 11414 static int 11415 sdstrategy(struct buf *bp) 11416 { 11417 struct sd_lun *un; 11418 11419 un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp)); 11420 if (un == NULL) { 11421 bioerror(bp, EIO); 11422 bp->b_resid = bp->b_bcount; 11423 biodone(bp); 11424 return (0); 11425 } 11426 11427 /* As was done in the past, fail new cmds. if state is dumping. */ 11428 if (un->un_state == SD_STATE_DUMPING) { 11429 bioerror(bp, ENXIO); 11430 bp->b_resid = bp->b_bcount; 11431 biodone(bp); 11432 return (0); 11433 } 11434 11435 ASSERT(!mutex_owned(SD_MUTEX(un))); 11436 11437 /* 11438 * Commands may sneak in while we released the mutex in 11439 * DDI_SUSPEND, we should block new commands. However, old 11440 * commands that are still in the driver at this point should 11441 * still be allowed to drain. 11442 */ 11443 mutex_enter(SD_MUTEX(un)); 11444 /* 11445 * Must wait here if either the device is suspended or 11446 * if it's power level is changing. 11447 */ 11448 while ((un->un_state == SD_STATE_SUSPENDED) || 11449 (un->un_state == SD_STATE_PM_CHANGING)) { 11450 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 11451 } 11452 11453 un->un_ncmds_in_driver++; 11454 11455 /* 11456 * atapi: Since we are running the CD for now in PIO mode we need to 11457 * call bp_mapin here to avoid bp_mapin called interrupt context under 11458 * the HBA's init_pkt routine. 11459 */ 11460 if (un->un_f_cfg_is_atapi == TRUE) { 11461 mutex_exit(SD_MUTEX(un)); 11462 bp_mapin(bp); 11463 mutex_enter(SD_MUTEX(un)); 11464 } 11465 SD_INFO(SD_LOG_IO, un, "sdstrategy: un_ncmds_in_driver = %ld\n", 11466 un->un_ncmds_in_driver); 11467 11468 if (bp->b_flags & B_WRITE) 11469 un->un_f_sync_cache_required = TRUE; 11470 11471 mutex_exit(SD_MUTEX(un)); 11472 11473 /* 11474 * This will (eventually) allocate the sd_xbuf area and 11475 * call sd_xbuf_strategy(). We just want to return the 11476 * result of ddi_xbuf_qstrategy so that we have an opt- 11477 * imized tail call which saves us a stack frame. 11478 */ 11479 return (ddi_xbuf_qstrategy(bp, un->un_xbuf_attr)); 11480 } 11481 11482 11483 /* 11484 * Function: sd_xbuf_strategy 11485 * 11486 * Description: Function for initiating IO operations via the 11487 * ddi_xbuf_qstrategy() mechanism. 11488 * 11489 * Context: Kernel thread context. 11490 */ 11491 11492 static void 11493 sd_xbuf_strategy(struct buf *bp, ddi_xbuf_t xp, void *arg) 11494 { 11495 struct sd_lun *un = arg; 11496 11497 ASSERT(bp != NULL); 11498 ASSERT(xp != NULL); 11499 ASSERT(un != NULL); 11500 ASSERT(!mutex_owned(SD_MUTEX(un))); 11501 11502 /* 11503 * Initialize the fields in the xbuf and save a pointer to the 11504 * xbuf in bp->b_private. 11505 */ 11506 sd_xbuf_init(un, bp, xp, SD_CHAIN_BUFIO, NULL); 11507 11508 /* Send the buf down the iostart chain */ 11509 SD_BEGIN_IOSTART(((struct sd_xbuf *)xp)->xb_chain_iostart, un, bp); 11510 } 11511 11512 11513 /* 11514 * Function: sd_xbuf_init 11515 * 11516 * Description: Prepare the given sd_xbuf struct for use. 11517 * 11518 * Arguments: un - ptr to softstate 11519 * bp - ptr to associated buf(9S) 11520 * xp - ptr to associated sd_xbuf 11521 * chain_type - IO chain type to use: 11522 * SD_CHAIN_NULL 11523 * SD_CHAIN_BUFIO 11524 * SD_CHAIN_USCSI 11525 * SD_CHAIN_DIRECT 11526 * SD_CHAIN_DIRECT_PRIORITY 11527 * pktinfop - ptr to private data struct for scsi_pkt(9S) 11528 * initialization; may be NULL if none. 11529 * 11530 * Context: Kernel thread context 11531 */ 11532 11533 static void 11534 sd_xbuf_init(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 11535 uchar_t chain_type, void *pktinfop) 11536 { 11537 int index; 11538 11539 ASSERT(un != NULL); 11540 ASSERT(bp != NULL); 11541 ASSERT(xp != NULL); 11542 11543 SD_INFO(SD_LOG_IO, un, "sd_xbuf_init: buf:0x%p chain type:0x%x\n", 11544 bp, chain_type); 11545 11546 xp->xb_un = un; 11547 xp->xb_pktp = NULL; 11548 xp->xb_pktinfo = pktinfop; 11549 xp->xb_private = bp->b_private; 11550 xp->xb_blkno = (daddr_t)bp->b_blkno; 11551 11552 /* 11553 * Set up the iostart and iodone chain indexes in the xbuf, based 11554 * upon the specified chain type to use. 11555 */ 11556 switch (chain_type) { 11557 case SD_CHAIN_NULL: 11558 /* 11559 * Fall thru to just use the values for the buf type, even 11560 * tho for the NULL chain these values will never be used. 11561 */ 11562 /* FALLTHRU */ 11563 case SD_CHAIN_BUFIO: 11564 index = un->un_buf_chain_type; 11565 if ((!un->un_f_has_removable_media) && 11566 (un->un_tgt_blocksize != 0) && 11567 (un->un_tgt_blocksize != DEV_BSIZE || 11568 un->un_f_enable_rmw)) { 11569 int secmask = 0, blknomask = 0; 11570 if (un->un_f_enable_rmw) { 11571 blknomask = 11572 (un->un_phy_blocksize / DEV_BSIZE) - 1; 11573 secmask = un->un_phy_blocksize - 1; 11574 } else { 11575 blknomask = 11576 (un->un_tgt_blocksize / DEV_BSIZE) - 1; 11577 secmask = un->un_tgt_blocksize - 1; 11578 } 11579 11580 if ((bp->b_lblkno & (blknomask)) || 11581 (bp->b_bcount & (secmask))) { 11582 if ((un->un_f_rmw_type != 11583 SD_RMW_TYPE_RETURN_ERROR) || 11584 un->un_f_enable_rmw) { 11585 if (un->un_f_pm_is_enabled == FALSE) 11586 index = 11587 SD_CHAIN_INFO_MSS_DSK_NO_PM; 11588 else 11589 index = 11590 SD_CHAIN_INFO_MSS_DISK; 11591 } 11592 } 11593 } 11594 break; 11595 case SD_CHAIN_USCSI: 11596 index = un->un_uscsi_chain_type; 11597 break; 11598 case SD_CHAIN_DIRECT: 11599 index = un->un_direct_chain_type; 11600 break; 11601 case SD_CHAIN_DIRECT_PRIORITY: 11602 index = un->un_priority_chain_type; 11603 break; 11604 default: 11605 /* We're really broken if we ever get here... */ 11606 panic("sd_xbuf_init: illegal chain type!"); 11607 /*NOTREACHED*/ 11608 } 11609 11610 xp->xb_chain_iostart = sd_chain_index_map[index].sci_iostart_index; 11611 xp->xb_chain_iodone = sd_chain_index_map[index].sci_iodone_index; 11612 11613 /* 11614 * It might be a bit easier to simply bzero the entire xbuf above, 11615 * but it turns out that since we init a fair number of members anyway, 11616 * we save a fair number cycles by doing explicit assignment of zero. 11617 */ 11618 xp->xb_pkt_flags = 0; 11619 xp->xb_dma_resid = 0; 11620 xp->xb_retry_count = 0; 11621 xp->xb_victim_retry_count = 0; 11622 xp->xb_ua_retry_count = 0; 11623 xp->xb_nr_retry_count = 0; 11624 xp->xb_sense_bp = NULL; 11625 xp->xb_sense_status = 0; 11626 xp->xb_sense_state = 0; 11627 xp->xb_sense_resid = 0; 11628 xp->xb_ena = 0; 11629 11630 bp->b_private = xp; 11631 bp->b_flags &= ~(B_DONE | B_ERROR); 11632 bp->b_resid = 0; 11633 bp->av_forw = NULL; 11634 bp->av_back = NULL; 11635 bioerror(bp, 0); 11636 11637 SD_INFO(SD_LOG_IO, un, "sd_xbuf_init: done.\n"); 11638 } 11639 11640 11641 /* 11642 * Function: sd_uscsi_strategy 11643 * 11644 * Description: Wrapper for calling into the USCSI chain via physio(9F) 11645 * 11646 * Arguments: bp - buf struct ptr 11647 * 11648 * Return Code: Always returns 0 11649 * 11650 * Context: Kernel thread context 11651 */ 11652 11653 static int 11654 sd_uscsi_strategy(struct buf *bp) 11655 { 11656 struct sd_lun *un; 11657 struct sd_uscsi_info *uip; 11658 struct sd_xbuf *xp; 11659 uchar_t chain_type; 11660 uchar_t cmd; 11661 11662 ASSERT(bp != NULL); 11663 11664 un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp)); 11665 if (un == NULL) { 11666 bioerror(bp, EIO); 11667 bp->b_resid = bp->b_bcount; 11668 biodone(bp); 11669 return (0); 11670 } 11671 11672 ASSERT(!mutex_owned(SD_MUTEX(un))); 11673 11674 SD_TRACE(SD_LOG_IO, un, "sd_uscsi_strategy: entry: buf:0x%p\n", bp); 11675 11676 /* 11677 * A pointer to a struct sd_uscsi_info is expected in bp->b_private 11678 */ 11679 ASSERT(bp->b_private != NULL); 11680 uip = (struct sd_uscsi_info *)bp->b_private; 11681 cmd = ((struct uscsi_cmd *)(uip->ui_cmdp))->uscsi_cdb[0]; 11682 11683 mutex_enter(SD_MUTEX(un)); 11684 /* 11685 * atapi: Since we are running the CD for now in PIO mode we need to 11686 * call bp_mapin here to avoid bp_mapin called interrupt context under 11687 * the HBA's init_pkt routine. 11688 */ 11689 if (un->un_f_cfg_is_atapi == TRUE) { 11690 mutex_exit(SD_MUTEX(un)); 11691 bp_mapin(bp); 11692 mutex_enter(SD_MUTEX(un)); 11693 } 11694 un->un_ncmds_in_driver++; 11695 SD_INFO(SD_LOG_IO, un, "sd_uscsi_strategy: un_ncmds_in_driver = %ld\n", 11696 un->un_ncmds_in_driver); 11697 11698 if ((bp->b_flags & B_WRITE) && (bp->b_bcount != 0) && 11699 (cmd != SCMD_MODE_SELECT) && (cmd != SCMD_MODE_SELECT_G1)) 11700 un->un_f_sync_cache_required = TRUE; 11701 11702 mutex_exit(SD_MUTEX(un)); 11703 11704 switch (uip->ui_flags) { 11705 case SD_PATH_DIRECT: 11706 chain_type = SD_CHAIN_DIRECT; 11707 break; 11708 case SD_PATH_DIRECT_PRIORITY: 11709 chain_type = SD_CHAIN_DIRECT_PRIORITY; 11710 break; 11711 default: 11712 chain_type = SD_CHAIN_USCSI; 11713 break; 11714 } 11715 11716 /* 11717 * We may allocate extra buf for external USCSI commands. If the 11718 * application asks for bigger than 20-byte sense data via USCSI, 11719 * SCSA layer will allocate 252 bytes sense buf for that command. 11720 */ 11721 if (((struct uscsi_cmd *)(uip->ui_cmdp))->uscsi_rqlen > 11722 SENSE_LENGTH) { 11723 xp = kmem_zalloc(sizeof (struct sd_xbuf) - SENSE_LENGTH + 11724 MAX_SENSE_LENGTH, KM_SLEEP); 11725 } else { 11726 xp = kmem_zalloc(sizeof (struct sd_xbuf), KM_SLEEP); 11727 } 11728 11729 sd_xbuf_init(un, bp, xp, chain_type, uip->ui_cmdp); 11730 11731 /* Use the index obtained within xbuf_init */ 11732 SD_BEGIN_IOSTART(xp->xb_chain_iostart, un, bp); 11733 11734 SD_TRACE(SD_LOG_IO, un, "sd_uscsi_strategy: exit: buf:0x%p\n", bp); 11735 11736 return (0); 11737 } 11738 11739 /* 11740 * Function: sd_send_scsi_cmd 11741 * 11742 * Description: Runs a USCSI command for user (when called thru sdioctl), 11743 * or for the driver 11744 * 11745 * Arguments: dev - the dev_t for the device 11746 * incmd - ptr to a valid uscsi_cmd struct 11747 * flag - bit flag, indicating open settings, 32/64 bit type 11748 * dataspace - UIO_USERSPACE or UIO_SYSSPACE 11749 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 11750 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 11751 * to use the USCSI "direct" chain and bypass the normal 11752 * command waitq. 11753 * 11754 * Return Code: 0 - successful completion of the given command 11755 * EIO - scsi_uscsi_handle_command() failed 11756 * ENXIO - soft state not found for specified dev 11757 * EINVAL 11758 * EFAULT - copyin/copyout error 11759 * return code of scsi_uscsi_handle_command(): 11760 * EIO 11761 * ENXIO 11762 * EACCES 11763 * 11764 * Context: Waits for command to complete. Can sleep. 11765 */ 11766 11767 static int 11768 sd_send_scsi_cmd(dev_t dev, struct uscsi_cmd *incmd, int flag, 11769 enum uio_seg dataspace, int path_flag) 11770 { 11771 struct sd_lun *un; 11772 sd_ssc_t *ssc; 11773 int rval; 11774 11775 un = ddi_get_soft_state(sd_state, SDUNIT(dev)); 11776 if (un == NULL) { 11777 return (ENXIO); 11778 } 11779 11780 /* 11781 * Using sd_ssc_send to handle uscsi cmd 11782 */ 11783 ssc = sd_ssc_init(un); 11784 rval = sd_ssc_send(ssc, incmd, flag, dataspace, path_flag); 11785 sd_ssc_fini(ssc); 11786 11787 return (rval); 11788 } 11789 11790 /* 11791 * Function: sd_ssc_init 11792 * 11793 * Description: Uscsi end-user call this function to initialize necessary 11794 * fields, such as uscsi_cmd and sd_uscsi_info struct. 11795 * 11796 * The return value of sd_send_scsi_cmd will be treated as a 11797 * fault in various conditions. Even it is not Zero, some 11798 * callers may ignore the return value. That is to say, we can 11799 * not make an accurate assessment in sdintr, since if a 11800 * command is failed in sdintr it does not mean the caller of 11801 * sd_send_scsi_cmd will treat it as a real failure. 11802 * 11803 * To avoid printing too many error logs for a failed uscsi 11804 * packet that the caller may not treat it as a failure, the 11805 * sd will keep silent for handling all uscsi commands. 11806 * 11807 * During detach->attach and attach-open, for some types of 11808 * problems, the driver should be providing information about 11809 * the problem encountered. Device use USCSI_SILENT, which 11810 * suppresses all driver information. The result is that no 11811 * information about the problem is available. Being 11812 * completely silent during this time is inappropriate. The 11813 * driver needs a more selective filter than USCSI_SILENT, so 11814 * that information related to faults is provided. 11815 * 11816 * To make the accurate accessment, the caller of 11817 * sd_send_scsi_USCSI_CMD should take the ownership and 11818 * get necessary information to print error messages. 11819 * 11820 * If we want to print necessary info of uscsi command, we need to 11821 * keep the uscsi_cmd and sd_uscsi_info till we can make the 11822 * assessment. We use sd_ssc_init to alloc necessary 11823 * structs for sending an uscsi command and we are also 11824 * responsible for free the memory by calling 11825 * sd_ssc_fini. 11826 * 11827 * The calling secquences will look like: 11828 * sd_ssc_init-> 11829 * 11830 * ... 11831 * 11832 * sd_send_scsi_USCSI_CMD-> 11833 * sd_ssc_send-> - - - sdintr 11834 * ... 11835 * 11836 * if we think the return value should be treated as a 11837 * failure, we make the accessment here and print out 11838 * necessary by retrieving uscsi_cmd and sd_uscsi_info' 11839 * 11840 * ... 11841 * 11842 * sd_ssc_fini 11843 * 11844 * 11845 * Arguments: un - pointer to driver soft state (unit) structure for this 11846 * target. 11847 * 11848 * Return code: sd_ssc_t - pointer to allocated sd_ssc_t struct, it contains 11849 * uscsi_cmd and sd_uscsi_info. 11850 * NULL - if can not alloc memory for sd_ssc_t struct 11851 * 11852 * Context: Kernel Thread. 11853 */ 11854 static sd_ssc_t * 11855 sd_ssc_init(struct sd_lun *un) 11856 { 11857 sd_ssc_t *ssc; 11858 struct uscsi_cmd *ucmdp; 11859 struct sd_uscsi_info *uip; 11860 11861 ASSERT(un != NULL); 11862 ASSERT(!mutex_owned(SD_MUTEX(un))); 11863 11864 /* 11865 * Allocate sd_ssc_t structure 11866 */ 11867 ssc = kmem_zalloc(sizeof (sd_ssc_t), KM_SLEEP); 11868 11869 /* 11870 * Allocate uscsi_cmd by calling scsi_uscsi_alloc common routine 11871 */ 11872 ucmdp = scsi_uscsi_alloc(); 11873 11874 /* 11875 * Allocate sd_uscsi_info structure 11876 */ 11877 uip = kmem_zalloc(sizeof (struct sd_uscsi_info), KM_SLEEP); 11878 11879 ssc->ssc_uscsi_cmd = ucmdp; 11880 ssc->ssc_uscsi_info = uip; 11881 ssc->ssc_un = un; 11882 11883 return (ssc); 11884 } 11885 11886 /* 11887 * Function: sd_ssc_fini 11888 * 11889 * Description: To free sd_ssc_t and it's hanging off 11890 * 11891 * Arguments: ssc - struct pointer of sd_ssc_t. 11892 */ 11893 static void 11894 sd_ssc_fini(sd_ssc_t *ssc) 11895 { 11896 scsi_uscsi_free(ssc->ssc_uscsi_cmd); 11897 11898 if (ssc->ssc_uscsi_info != NULL) { 11899 kmem_free(ssc->ssc_uscsi_info, sizeof (struct sd_uscsi_info)); 11900 ssc->ssc_uscsi_info = NULL; 11901 } 11902 11903 kmem_free(ssc, sizeof (sd_ssc_t)); 11904 ssc = NULL; 11905 } 11906 11907 /* 11908 * Function: sd_ssc_send 11909 * 11910 * Description: Runs a USCSI command for user when called through sdioctl, 11911 * or for the driver. 11912 * 11913 * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and 11914 * sd_uscsi_info in. 11915 * incmd - ptr to a valid uscsi_cmd struct 11916 * flag - bit flag, indicating open settings, 32/64 bit type 11917 * dataspace - UIO_USERSPACE or UIO_SYSSPACE 11918 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 11919 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 11920 * to use the USCSI "direct" chain and bypass the normal 11921 * command waitq. 11922 * 11923 * Return Code: 0 - successful completion of the given command 11924 * EIO - scsi_uscsi_handle_command() failed 11925 * ENXIO - soft state not found for specified dev 11926 * ECANCELED - command cancelled due to low power 11927 * EINVAL 11928 * EFAULT - copyin/copyout error 11929 * return code of scsi_uscsi_handle_command(): 11930 * EIO 11931 * ENXIO 11932 * EACCES 11933 * 11934 * Context: Kernel Thread; 11935 * Waits for command to complete. Can sleep. 11936 */ 11937 static int 11938 sd_ssc_send(sd_ssc_t *ssc, struct uscsi_cmd *incmd, int flag, 11939 enum uio_seg dataspace, int path_flag) 11940 { 11941 struct sd_uscsi_info *uip; 11942 struct uscsi_cmd *uscmd; 11943 struct sd_lun *un; 11944 dev_t dev; 11945 11946 int format = 0; 11947 int rval; 11948 11949 ASSERT(ssc != NULL); 11950 un = ssc->ssc_un; 11951 ASSERT(un != NULL); 11952 uscmd = ssc->ssc_uscsi_cmd; 11953 ASSERT(uscmd != NULL); 11954 ASSERT(!mutex_owned(SD_MUTEX(un))); 11955 if (ssc->ssc_flags & SSC_FLAGS_NEED_ASSESSMENT) { 11956 /* 11957 * If enter here, it indicates that the previous uscsi 11958 * command has not been processed by sd_ssc_assessment. 11959 * This is violating our rules of FMA telemetry processing. 11960 * We should print out this message and the last undisposed 11961 * uscsi command. 11962 */ 11963 if (uscmd->uscsi_cdb != NULL) { 11964 SD_INFO(SD_LOG_SDTEST, un, 11965 "sd_ssc_send is missing the alternative " 11966 "sd_ssc_assessment when running command 0x%x.\n", 11967 uscmd->uscsi_cdb[0]); 11968 } 11969 /* 11970 * Set the ssc_flags to SSC_FLAGS_UNKNOWN, which should be 11971 * the initial status. 11972 */ 11973 ssc->ssc_flags = SSC_FLAGS_UNKNOWN; 11974 } 11975 11976 /* 11977 * We need to make sure sd_ssc_send will have sd_ssc_assessment 11978 * followed to avoid missing FMA telemetries. 11979 */ 11980 ssc->ssc_flags |= SSC_FLAGS_NEED_ASSESSMENT; 11981 11982 /* 11983 * if USCSI_PMFAILFAST is set and un is in low power, fail the 11984 * command immediately. 11985 */ 11986 mutex_enter(SD_MUTEX(un)); 11987 mutex_enter(&un->un_pm_mutex); 11988 if ((uscmd->uscsi_flags & USCSI_PMFAILFAST) && 11989 SD_DEVICE_IS_IN_LOW_POWER(un)) { 11990 SD_TRACE(SD_LOG_IO, un, "sd_ssc_send:" 11991 "un:0x%p is in low power\n", un); 11992 mutex_exit(&un->un_pm_mutex); 11993 mutex_exit(SD_MUTEX(un)); 11994 return (ECANCELED); 11995 } 11996 mutex_exit(&un->un_pm_mutex); 11997 mutex_exit(SD_MUTEX(un)); 11998 11999 #ifdef SDDEBUG 12000 switch (dataspace) { 12001 case UIO_USERSPACE: 12002 SD_TRACE(SD_LOG_IO, un, 12003 "sd_ssc_send: entry: un:0x%p UIO_USERSPACE\n", un); 12004 break; 12005 case UIO_SYSSPACE: 12006 SD_TRACE(SD_LOG_IO, un, 12007 "sd_ssc_send: entry: un:0x%p UIO_SYSSPACE\n", un); 12008 break; 12009 default: 12010 SD_TRACE(SD_LOG_IO, un, 12011 "sd_ssc_send: entry: un:0x%p UNEXPECTED SPACE\n", un); 12012 break; 12013 } 12014 #endif 12015 12016 rval = scsi_uscsi_copyin((intptr_t)incmd, flag, 12017 SD_ADDRESS(un), &uscmd); 12018 if (rval != 0) { 12019 SD_TRACE(SD_LOG_IO, un, "sd_sense_scsi_cmd: " 12020 "scsi_uscsi_alloc_and_copyin failed\n", un); 12021 return (rval); 12022 } 12023 12024 if ((uscmd->uscsi_cdb != NULL) && 12025 (uscmd->uscsi_cdb[0] == SCMD_FORMAT)) { 12026 mutex_enter(SD_MUTEX(un)); 12027 un->un_f_format_in_progress = TRUE; 12028 mutex_exit(SD_MUTEX(un)); 12029 format = 1; 12030 } 12031 12032 /* 12033 * Allocate an sd_uscsi_info struct and fill it with the info 12034 * needed by sd_initpkt_for_uscsi(). Then put the pointer into 12035 * b_private in the buf for sd_initpkt_for_uscsi(). Note that 12036 * since we allocate the buf here in this function, we do not 12037 * need to preserve the prior contents of b_private. 12038 * The sd_uscsi_info struct is also used by sd_uscsi_strategy() 12039 */ 12040 uip = ssc->ssc_uscsi_info; 12041 uip->ui_flags = path_flag; 12042 uip->ui_cmdp = uscmd; 12043 12044 /* 12045 * Commands sent with priority are intended for error recovery 12046 * situations, and do not have retries performed. 12047 */ 12048 if (path_flag == SD_PATH_DIRECT_PRIORITY) { 12049 uscmd->uscsi_flags |= USCSI_DIAGNOSE; 12050 } 12051 uscmd->uscsi_flags &= ~USCSI_NOINTR; 12052 12053 dev = SD_GET_DEV(un); 12054 rval = scsi_uscsi_handle_cmd(dev, dataspace, uscmd, 12055 sd_uscsi_strategy, NULL, uip); 12056 12057 /* 12058 * mark ssc_flags right after handle_cmd to make sure 12059 * the uscsi has been sent 12060 */ 12061 ssc->ssc_flags |= SSC_FLAGS_CMD_ISSUED; 12062 12063 #ifdef SDDEBUG 12064 SD_INFO(SD_LOG_IO, un, "sd_ssc_send: " 12065 "uscsi_status: 0x%02x uscsi_resid:0x%x\n", 12066 uscmd->uscsi_status, uscmd->uscsi_resid); 12067 if (uscmd->uscsi_bufaddr != NULL) { 12068 SD_INFO(SD_LOG_IO, un, "sd_ssc_send: " 12069 "uscmd->uscsi_bufaddr: 0x%p uscmd->uscsi_buflen:%d\n", 12070 uscmd->uscsi_bufaddr, uscmd->uscsi_buflen); 12071 if (dataspace == UIO_SYSSPACE) { 12072 SD_DUMP_MEMORY(un, SD_LOG_IO, 12073 "data", (uchar_t *)uscmd->uscsi_bufaddr, 12074 uscmd->uscsi_buflen, SD_LOG_HEX); 12075 } 12076 } 12077 #endif 12078 12079 if (format == 1) { 12080 mutex_enter(SD_MUTEX(un)); 12081 un->un_f_format_in_progress = FALSE; 12082 mutex_exit(SD_MUTEX(un)); 12083 } 12084 12085 (void) scsi_uscsi_copyout((intptr_t)incmd, uscmd); 12086 12087 return (rval); 12088 } 12089 12090 /* 12091 * Function: sd_ssc_print 12092 * 12093 * Description: Print information available to the console. 12094 * 12095 * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and 12096 * sd_uscsi_info in. 12097 * sd_severity - log level. 12098 * Context: Kernel thread or interrupt context. 12099 */ 12100 static void 12101 sd_ssc_print(sd_ssc_t *ssc, int sd_severity) 12102 { 12103 struct uscsi_cmd *ucmdp; 12104 struct scsi_device *devp; 12105 dev_info_t *devinfo; 12106 uchar_t *sensep; 12107 int senlen; 12108 union scsi_cdb *cdbp; 12109 uchar_t com; 12110 extern struct scsi_key_strings scsi_cmds[]; 12111 12112 ASSERT(ssc != NULL); 12113 ASSERT(ssc->ssc_un != NULL); 12114 12115 if (SD_FM_LOG(ssc->ssc_un) != SD_FM_LOG_EREPORT) 12116 return; 12117 ucmdp = ssc->ssc_uscsi_cmd; 12118 devp = SD_SCSI_DEVP(ssc->ssc_un); 12119 devinfo = SD_DEVINFO(ssc->ssc_un); 12120 ASSERT(ucmdp != NULL); 12121 ASSERT(devp != NULL); 12122 ASSERT(devinfo != NULL); 12123 sensep = (uint8_t *)ucmdp->uscsi_rqbuf; 12124 senlen = ucmdp->uscsi_rqlen - ucmdp->uscsi_rqresid; 12125 cdbp = (union scsi_cdb *)ucmdp->uscsi_cdb; 12126 12127 /* In certain case (like DOORLOCK), the cdb could be NULL. */ 12128 if (cdbp == NULL) 12129 return; 12130 /* We don't print log if no sense data available. */ 12131 if (senlen == 0) 12132 sensep = NULL; 12133 com = cdbp->scc_cmd; 12134 scsi_generic_errmsg(devp, sd_label, sd_severity, 0, 0, com, 12135 scsi_cmds, sensep, ssc->ssc_un->un_additional_codes, NULL); 12136 } 12137 12138 /* 12139 * Function: sd_ssc_assessment 12140 * 12141 * Description: We use this function to make an assessment at the point 12142 * where SD driver may encounter a potential error. 12143 * 12144 * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and 12145 * sd_uscsi_info in. 12146 * tp_assess - a hint of strategy for ereport posting. 12147 * Possible values of tp_assess include: 12148 * SD_FMT_IGNORE - we don't post any ereport because we're 12149 * sure that it is ok to ignore the underlying problems. 12150 * SD_FMT_IGNORE_COMPROMISE - we don't post any ereport for now 12151 * but it might be not correct to ignore the underlying hardware 12152 * error. 12153 * SD_FMT_STATUS_CHECK - we will post an ereport with the 12154 * payload driver-assessment of value "fail" or 12155 * "fatal"(depending on what information we have here). This 12156 * assessment value is usually set when SD driver think there 12157 * is a potential error occurred(Typically, when return value 12158 * of the SCSI command is EIO). 12159 * SD_FMT_STANDARD - we will post an ereport with the payload 12160 * driver-assessment of value "info". This assessment value is 12161 * set when the SCSI command returned successfully and with 12162 * sense data sent back. 12163 * 12164 * Context: Kernel thread. 12165 */ 12166 static void 12167 sd_ssc_assessment(sd_ssc_t *ssc, enum sd_type_assessment tp_assess) 12168 { 12169 int senlen = 0; 12170 struct uscsi_cmd *ucmdp = NULL; 12171 struct sd_lun *un; 12172 12173 ASSERT(ssc != NULL); 12174 un = ssc->ssc_un; 12175 ASSERT(un != NULL); 12176 ucmdp = ssc->ssc_uscsi_cmd; 12177 ASSERT(ucmdp != NULL); 12178 12179 if (ssc->ssc_flags & SSC_FLAGS_NEED_ASSESSMENT) { 12180 ssc->ssc_flags &= ~SSC_FLAGS_NEED_ASSESSMENT; 12181 } else { 12182 /* 12183 * If enter here, it indicates that we have a wrong 12184 * calling sequence of sd_ssc_send and sd_ssc_assessment, 12185 * both of which should be called in a pair in case of 12186 * loss of FMA telemetries. 12187 */ 12188 if (ucmdp->uscsi_cdb != NULL) { 12189 SD_INFO(SD_LOG_SDTEST, un, 12190 "sd_ssc_assessment is missing the " 12191 "alternative sd_ssc_send when running 0x%x, " 12192 "or there are superfluous sd_ssc_assessment for " 12193 "the same sd_ssc_send.\n", 12194 ucmdp->uscsi_cdb[0]); 12195 } 12196 /* 12197 * Set the ssc_flags to the initial value to avoid passing 12198 * down dirty flags to the following sd_ssc_send function. 12199 */ 12200 ssc->ssc_flags = SSC_FLAGS_UNKNOWN; 12201 return; 12202 } 12203 12204 /* 12205 * Only handle an issued command which is waiting for assessment. 12206 * A command which is not issued will not have 12207 * SSC_FLAGS_INVALID_DATA set, so it'ok we just return here. 12208 */ 12209 if (!(ssc->ssc_flags & SSC_FLAGS_CMD_ISSUED)) { 12210 sd_ssc_print(ssc, SCSI_ERR_INFO); 12211 return; 12212 } else { 12213 /* 12214 * For an issued command, we should clear this flag in 12215 * order to make the sd_ssc_t structure be used off 12216 * multiple uscsi commands. 12217 */ 12218 ssc->ssc_flags &= ~SSC_FLAGS_CMD_ISSUED; 12219 } 12220 12221 /* 12222 * We will not deal with non-retryable(flag USCSI_DIAGNOSE set) 12223 * commands here. And we should clear the ssc_flags before return. 12224 */ 12225 if (ucmdp->uscsi_flags & USCSI_DIAGNOSE) { 12226 ssc->ssc_flags = SSC_FLAGS_UNKNOWN; 12227 return; 12228 } 12229 12230 switch (tp_assess) { 12231 case SD_FMT_IGNORE: 12232 case SD_FMT_IGNORE_COMPROMISE: 12233 break; 12234 case SD_FMT_STATUS_CHECK: 12235 /* 12236 * For a failed command(including the succeeded command 12237 * with invalid data sent back). 12238 */ 12239 sd_ssc_post(ssc, SD_FM_DRV_FATAL); 12240 break; 12241 case SD_FMT_STANDARD: 12242 /* 12243 * Always for the succeeded commands probably with sense 12244 * data sent back. 12245 * Limitation: 12246 * We can only handle a succeeded command with sense 12247 * data sent back when auto-request-sense is enabled. 12248 */ 12249 senlen = ssc->ssc_uscsi_cmd->uscsi_rqlen - 12250 ssc->ssc_uscsi_cmd->uscsi_rqresid; 12251 if ((ssc->ssc_uscsi_info->ui_pkt_state & STATE_ARQ_DONE) && 12252 (un->un_f_arq_enabled == TRUE) && 12253 senlen > 0 && 12254 ssc->ssc_uscsi_cmd->uscsi_rqbuf != NULL) { 12255 sd_ssc_post(ssc, SD_FM_DRV_NOTICE); 12256 } 12257 break; 12258 default: 12259 /* 12260 * Should not have other type of assessment. 12261 */ 12262 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, 12263 "sd_ssc_assessment got wrong " 12264 "sd_type_assessment %d.\n", tp_assess); 12265 break; 12266 } 12267 /* 12268 * Clear up the ssc_flags before return. 12269 */ 12270 ssc->ssc_flags = SSC_FLAGS_UNKNOWN; 12271 } 12272 12273 /* 12274 * Function: sd_ssc_post 12275 * 12276 * Description: 1. read the driver property to get fm-scsi-log flag. 12277 * 2. print log if fm_log_capable is non-zero. 12278 * 3. call sd_ssc_ereport_post to post ereport if possible. 12279 * 12280 * Context: May be called from kernel thread or interrupt context. 12281 */ 12282 static void 12283 sd_ssc_post(sd_ssc_t *ssc, enum sd_driver_assessment sd_assess) 12284 { 12285 struct sd_lun *un; 12286 int sd_severity; 12287 12288 ASSERT(ssc != NULL); 12289 un = ssc->ssc_un; 12290 ASSERT(un != NULL); 12291 12292 /* 12293 * We may enter here from sd_ssc_assessment(for USCSI command) or 12294 * by directly called from sdintr context. 12295 * We don't handle a non-disk drive(CD-ROM, removable media). 12296 * Clear the ssc_flags before return in case we've set 12297 * SSC_FLAGS_INVALID_XXX which should be skipped for a non-disk 12298 * driver. 12299 */ 12300 if (ISCD(un) || un->un_f_has_removable_media) { 12301 ssc->ssc_flags = SSC_FLAGS_UNKNOWN; 12302 return; 12303 } 12304 12305 switch (sd_assess) { 12306 case SD_FM_DRV_FATAL: 12307 sd_severity = SCSI_ERR_FATAL; 12308 break; 12309 case SD_FM_DRV_RECOVERY: 12310 sd_severity = SCSI_ERR_RECOVERED; 12311 break; 12312 case SD_FM_DRV_RETRY: 12313 sd_severity = SCSI_ERR_RETRYABLE; 12314 break; 12315 case SD_FM_DRV_NOTICE: 12316 sd_severity = SCSI_ERR_INFO; 12317 break; 12318 default: 12319 sd_severity = SCSI_ERR_UNKNOWN; 12320 } 12321 /* print log */ 12322 sd_ssc_print(ssc, sd_severity); 12323 12324 /* always post ereport */ 12325 sd_ssc_ereport_post(ssc, sd_assess); 12326 } 12327 12328 /* 12329 * Function: sd_ssc_set_info 12330 * 12331 * Description: Mark ssc_flags and set ssc_info which would be the 12332 * payload of uderr ereport. This function will cause 12333 * sd_ssc_ereport_post to post uderr ereport only. 12334 * Besides, when ssc_flags == SSC_FLAGS_INVALID_DATA(USCSI), 12335 * the function will also call SD_ERROR or scsi_log for a 12336 * CDROM/removable-media/DDI_FM_NOT_CAPABLE device. 12337 * 12338 * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and 12339 * sd_uscsi_info in. 12340 * ssc_flags - indicate the sub-category of a uderr. 12341 * comp - this argument is meaningful only when 12342 * ssc_flags == SSC_FLAGS_INVALID_DATA, and its possible 12343 * values include: 12344 * > 0, SD_ERROR is used with comp as the driver logging 12345 * component; 12346 * = 0, scsi-log is used to log error telemetries; 12347 * < 0, no log available for this telemetry. 12348 * 12349 * Context: Kernel thread or interrupt context 12350 */ 12351 static void 12352 sd_ssc_set_info(sd_ssc_t *ssc, int ssc_flags, uint_t comp, const char *fmt, ...) 12353 { 12354 va_list ap; 12355 12356 ASSERT(ssc != NULL); 12357 ASSERT(ssc->ssc_un != NULL); 12358 12359 ssc->ssc_flags |= ssc_flags; 12360 va_start(ap, fmt); 12361 (void) vsnprintf(ssc->ssc_info, sizeof (ssc->ssc_info), fmt, ap); 12362 va_end(ap); 12363 12364 /* 12365 * If SSC_FLAGS_INVALID_DATA is set, it should be a uscsi command 12366 * with invalid data sent back. For non-uscsi command, the 12367 * following code will be bypassed. 12368 */ 12369 if (ssc_flags & SSC_FLAGS_INVALID_DATA) { 12370 if (SD_FM_LOG(ssc->ssc_un) == SD_FM_LOG_NSUP) { 12371 /* 12372 * If the error belong to certain component and we 12373 * do not want it to show up on the console, we 12374 * will use SD_ERROR, otherwise scsi_log is 12375 * preferred. 12376 */ 12377 if (comp > 0) { 12378 SD_ERROR(comp, ssc->ssc_un, ssc->ssc_info); 12379 } else if (comp == 0) { 12380 scsi_log(SD_DEVINFO(ssc->ssc_un), sd_label, 12381 CE_WARN, ssc->ssc_info); 12382 } 12383 } 12384 } 12385 } 12386 12387 /* 12388 * Function: sd_buf_iodone 12389 * 12390 * Description: Frees the sd_xbuf & returns the buf to its originator. 12391 * 12392 * Context: May be called from interrupt context. 12393 */ 12394 /* ARGSUSED */ 12395 static void 12396 sd_buf_iodone(int index, struct sd_lun *un, struct buf *bp) 12397 { 12398 struct sd_xbuf *xp; 12399 12400 ASSERT(un != NULL); 12401 ASSERT(bp != NULL); 12402 ASSERT(!mutex_owned(SD_MUTEX(un))); 12403 12404 SD_TRACE(SD_LOG_IO_CORE, un, "sd_buf_iodone: entry.\n"); 12405 12406 xp = SD_GET_XBUF(bp); 12407 ASSERT(xp != NULL); 12408 12409 /* xbuf is gone after this */ 12410 if (ddi_xbuf_done(bp, un->un_xbuf_attr)) { 12411 mutex_enter(SD_MUTEX(un)); 12412 12413 /* 12414 * Grab time when the cmd completed. 12415 * This is used for determining if the system has been 12416 * idle long enough to make it idle to the PM framework. 12417 * This is for lowering the overhead, and therefore improving 12418 * performance per I/O operation. 12419 */ 12420 un->un_pm_idle_time = gethrtime(); 12421 12422 un->un_ncmds_in_driver--; 12423 ASSERT(un->un_ncmds_in_driver >= 0); 12424 SD_INFO(SD_LOG_IO, un, 12425 "sd_buf_iodone: un_ncmds_in_driver = %ld\n", 12426 un->un_ncmds_in_driver); 12427 12428 mutex_exit(SD_MUTEX(un)); 12429 } 12430 12431 biodone(bp); /* bp is gone after this */ 12432 12433 SD_TRACE(SD_LOG_IO_CORE, un, "sd_buf_iodone: exit.\n"); 12434 } 12435 12436 12437 /* 12438 * Function: sd_uscsi_iodone 12439 * 12440 * Description: Frees the sd_xbuf & returns the buf to its originator. 12441 * 12442 * Context: May be called from interrupt context. 12443 */ 12444 /* ARGSUSED */ 12445 static void 12446 sd_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp) 12447 { 12448 struct sd_xbuf *xp; 12449 12450 ASSERT(un != NULL); 12451 ASSERT(bp != NULL); 12452 12453 xp = SD_GET_XBUF(bp); 12454 ASSERT(xp != NULL); 12455 ASSERT(!mutex_owned(SD_MUTEX(un))); 12456 12457 SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: entry.\n"); 12458 12459 bp->b_private = xp->xb_private; 12460 12461 mutex_enter(SD_MUTEX(un)); 12462 12463 /* 12464 * Grab time when the cmd completed. 12465 * This is used for determining if the system has been 12466 * idle long enough to make it idle to the PM framework. 12467 * This is for lowering the overhead, and therefore improving 12468 * performance per I/O operation. 12469 */ 12470 un->un_pm_idle_time = gethrtime(); 12471 12472 un->un_ncmds_in_driver--; 12473 ASSERT(un->un_ncmds_in_driver >= 0); 12474 SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: un_ncmds_in_driver = %ld\n", 12475 un->un_ncmds_in_driver); 12476 12477 mutex_exit(SD_MUTEX(un)); 12478 12479 if (((struct uscsi_cmd *)(xp->xb_pktinfo))->uscsi_rqlen > 12480 SENSE_LENGTH) { 12481 kmem_free(xp, sizeof (struct sd_xbuf) - SENSE_LENGTH + 12482 MAX_SENSE_LENGTH); 12483 } else { 12484 kmem_free(xp, sizeof (struct sd_xbuf)); 12485 } 12486 12487 biodone(bp); 12488 12489 SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: exit.\n"); 12490 } 12491 12492 12493 /* 12494 * Function: sd_mapblockaddr_iostart 12495 * 12496 * Description: Verify request lies within the partition limits for 12497 * the indicated minor device. Issue "overrun" buf if 12498 * request would exceed partition range. Converts 12499 * partition-relative block address to absolute. 12500 * 12501 * Upon exit of this function: 12502 * 1.I/O is aligned 12503 * xp->xb_blkno represents the absolute sector address 12504 * 2.I/O is misaligned 12505 * xp->xb_blkno represents the absolute logical block address 12506 * based on DEV_BSIZE. The logical block address will be 12507 * converted to physical sector address in sd_mapblocksize_\ 12508 * iostart. 12509 * 3.I/O is misaligned but is aligned in "overrun" buf 12510 * xp->xb_blkno represents the absolute logical block address 12511 * based on DEV_BSIZE. The logical block address will be 12512 * converted to physical sector address in sd_mapblocksize_\ 12513 * iostart. But no RMW will be issued in this case. 12514 * 12515 * Context: Can sleep 12516 * 12517 * Issues: This follows what the old code did, in terms of accessing 12518 * some of the partition info in the unit struct without holding 12519 * the mutext. This is a general issue, if the partition info 12520 * can be altered while IO is in progress... as soon as we send 12521 * a buf, its partitioning can be invalid before it gets to the 12522 * device. Probably the right fix is to move partitioning out 12523 * of the driver entirely. 12524 */ 12525 12526 static void 12527 sd_mapblockaddr_iostart(int index, struct sd_lun *un, struct buf *bp) 12528 { 12529 diskaddr_t nblocks; /* #blocks in the given partition */ 12530 daddr_t blocknum; /* Block number specified by the buf */ 12531 size_t requested_nblocks; 12532 size_t available_nblocks; 12533 int partition; 12534 diskaddr_t partition_offset; 12535 struct sd_xbuf *xp; 12536 int secmask = 0, blknomask = 0; 12537 ushort_t is_aligned = TRUE; 12538 12539 ASSERT(un != NULL); 12540 ASSERT(bp != NULL); 12541 ASSERT(!mutex_owned(SD_MUTEX(un))); 12542 12543 SD_TRACE(SD_LOG_IO_PARTITION, un, 12544 "sd_mapblockaddr_iostart: entry: buf:0x%p\n", bp); 12545 12546 xp = SD_GET_XBUF(bp); 12547 ASSERT(xp != NULL); 12548 12549 /* 12550 * If the geometry is not indicated as valid, attempt to access 12551 * the unit & verify the geometry/label. This can be the case for 12552 * removable-media devices, of if the device was opened in 12553 * NDELAY/NONBLOCK mode. 12554 */ 12555 partition = SDPART(bp->b_edev); 12556 12557 if (!SD_IS_VALID_LABEL(un)) { 12558 sd_ssc_t *ssc; 12559 /* 12560 * Initialize sd_ssc_t for internal uscsi commands 12561 * In case of potential porformance issue, we need 12562 * to alloc memory only if there is invalid label 12563 */ 12564 ssc = sd_ssc_init(un); 12565 12566 if (sd_ready_and_valid(ssc, partition) != SD_READY_VALID) { 12567 /* 12568 * For removable devices it is possible to start an 12569 * I/O without a media by opening the device in nodelay 12570 * mode. Also for writable CDs there can be many 12571 * scenarios where there is no geometry yet but volume 12572 * manager is trying to issue a read() just because 12573 * it can see TOC on the CD. So do not print a message 12574 * for removables. 12575 */ 12576 if (!un->un_f_has_removable_media) { 12577 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 12578 "i/o to invalid geometry\n"); 12579 } 12580 bioerror(bp, EIO); 12581 bp->b_resid = bp->b_bcount; 12582 SD_BEGIN_IODONE(index, un, bp); 12583 12584 sd_ssc_fini(ssc); 12585 return; 12586 } 12587 sd_ssc_fini(ssc); 12588 } 12589 12590 nblocks = 0; 12591 (void) cmlb_partinfo(un->un_cmlbhandle, partition, 12592 &nblocks, &partition_offset, NULL, NULL, (void *)SD_PATH_DIRECT); 12593 12594 if (un->un_f_enable_rmw) { 12595 blknomask = (un->un_phy_blocksize / DEV_BSIZE) - 1; 12596 secmask = un->un_phy_blocksize - 1; 12597 } else { 12598 blknomask = (un->un_tgt_blocksize / DEV_BSIZE) - 1; 12599 secmask = un->un_tgt_blocksize - 1; 12600 } 12601 12602 if ((bp->b_lblkno & (blknomask)) || (bp->b_bcount & (secmask))) { 12603 is_aligned = FALSE; 12604 } 12605 12606 if (!(NOT_DEVBSIZE(un)) || un->un_f_enable_rmw) { 12607 /* 12608 * If I/O is aligned, no need to involve RMW(Read Modify Write) 12609 * Convert the logical block number to target's physical sector 12610 * number. 12611 */ 12612 if (is_aligned) { 12613 xp->xb_blkno = SD_SYS2TGTBLOCK(un, xp->xb_blkno); 12614 } else { 12615 /* 12616 * There is no RMW if we're just reading, so don't 12617 * warn or error out because of it. 12618 */ 12619 if (bp->b_flags & B_READ) { 12620 /*EMPTY*/ 12621 } else if (!un->un_f_enable_rmw && 12622 un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR) { 12623 bp->b_flags |= B_ERROR; 12624 goto error_exit; 12625 } else if (un->un_f_rmw_type == SD_RMW_TYPE_DEFAULT) { 12626 mutex_enter(SD_MUTEX(un)); 12627 if (!un->un_f_enable_rmw && 12628 un->un_rmw_msg_timeid == NULL) { 12629 scsi_log(SD_DEVINFO(un), sd_label, 12630 CE_WARN, "I/O request is not " 12631 "aligned with %d disk sector size. " 12632 "It is handled through Read Modify " 12633 "Write but the performance is " 12634 "very low.\n", 12635 un->un_tgt_blocksize); 12636 un->un_rmw_msg_timeid = 12637 timeout(sd_rmw_msg_print_handler, 12638 un, SD_RMW_MSG_PRINT_TIMEOUT); 12639 } else { 12640 un->un_rmw_incre_count ++; 12641 } 12642 mutex_exit(SD_MUTEX(un)); 12643 } 12644 12645 nblocks = SD_TGT2SYSBLOCK(un, nblocks); 12646 partition_offset = SD_TGT2SYSBLOCK(un, 12647 partition_offset); 12648 } 12649 } 12650 12651 /* 12652 * blocknum is the starting block number of the request. At this 12653 * point it is still relative to the start of the minor device. 12654 */ 12655 blocknum = xp->xb_blkno; 12656 12657 /* 12658 * Legacy: If the starting block number is one past the last block 12659 * in the partition, do not set B_ERROR in the buf. 12660 */ 12661 if (blocknum == nblocks) { 12662 goto error_exit; 12663 } 12664 12665 /* 12666 * Confirm that the first block of the request lies within the 12667 * partition limits. Also the requested number of bytes must be 12668 * a multiple of the system block size. 12669 */ 12670 if ((blocknum < 0) || (blocknum >= nblocks) || 12671 ((bp->b_bcount & (DEV_BSIZE - 1)) != 0)) { 12672 bp->b_flags |= B_ERROR; 12673 goto error_exit; 12674 } 12675 12676 /* 12677 * If the requsted # blocks exceeds the available # blocks, that 12678 * is an overrun of the partition. 12679 */ 12680 if ((!NOT_DEVBSIZE(un)) && is_aligned) { 12681 requested_nblocks = SD_BYTES2TGTBLOCKS(un, bp->b_bcount); 12682 } else { 12683 requested_nblocks = SD_BYTES2SYSBLOCKS(bp->b_bcount); 12684 } 12685 12686 available_nblocks = (size_t)(nblocks - blocknum); 12687 ASSERT(nblocks >= blocknum); 12688 12689 if (requested_nblocks > available_nblocks) { 12690 size_t resid; 12691 12692 /* 12693 * Allocate an "overrun" buf to allow the request to proceed 12694 * for the amount of space available in the partition. The 12695 * amount not transferred will be added into the b_resid 12696 * when the operation is complete. The overrun buf 12697 * replaces the original buf here, and the original buf 12698 * is saved inside the overrun buf, for later use. 12699 */ 12700 if ((!NOT_DEVBSIZE(un)) && is_aligned) { 12701 resid = SD_TGTBLOCKS2BYTES(un, 12702 (offset_t)(requested_nblocks - available_nblocks)); 12703 } else { 12704 resid = SD_SYSBLOCKS2BYTES( 12705 (offset_t)(requested_nblocks - available_nblocks)); 12706 } 12707 12708 size_t count = bp->b_bcount - resid; 12709 /* 12710 * Note: count is an unsigned entity thus it'll NEVER 12711 * be less than 0 so ASSERT the original values are 12712 * correct. 12713 */ 12714 ASSERT(bp->b_bcount >= resid); 12715 12716 bp = sd_bioclone_alloc(bp, count, blocknum, 12717 (int (*)(struct buf *)) sd_mapblockaddr_iodone); 12718 xp = SD_GET_XBUF(bp); /* Update for 'new' bp! */ 12719 ASSERT(xp != NULL); 12720 } 12721 12722 /* At this point there should be no residual for this buf. */ 12723 ASSERT(bp->b_resid == 0); 12724 12725 /* Convert the block number to an absolute address. */ 12726 xp->xb_blkno += partition_offset; 12727 12728 SD_NEXT_IOSTART(index, un, bp); 12729 12730 SD_TRACE(SD_LOG_IO_PARTITION, un, 12731 "sd_mapblockaddr_iostart: exit 0: buf:0x%p\n", bp); 12732 12733 return; 12734 12735 error_exit: 12736 bp->b_resid = bp->b_bcount; 12737 SD_BEGIN_IODONE(index, un, bp); 12738 SD_TRACE(SD_LOG_IO_PARTITION, un, 12739 "sd_mapblockaddr_iostart: exit 1: buf:0x%p\n", bp); 12740 } 12741 12742 12743 /* 12744 * Function: sd_mapblockaddr_iodone 12745 * 12746 * Description: Completion-side processing for partition management. 12747 * 12748 * Context: May be called under interrupt context 12749 */ 12750 12751 static void 12752 sd_mapblockaddr_iodone(int index, struct sd_lun *un, struct buf *bp) 12753 { 12754 /* int partition; */ /* Not used, see below. */ 12755 ASSERT(un != NULL); 12756 ASSERT(bp != NULL); 12757 ASSERT(!mutex_owned(SD_MUTEX(un))); 12758 12759 SD_TRACE(SD_LOG_IO_PARTITION, un, 12760 "sd_mapblockaddr_iodone: entry: buf:0x%p\n", bp); 12761 12762 if (bp->b_iodone == (int (*)(struct buf *)) sd_mapblockaddr_iodone) { 12763 /* 12764 * We have an "overrun" buf to deal with... 12765 */ 12766 struct sd_xbuf *xp; 12767 struct buf *obp; /* ptr to the original buf */ 12768 12769 xp = SD_GET_XBUF(bp); 12770 ASSERT(xp != NULL); 12771 12772 /* Retrieve the pointer to the original buf */ 12773 obp = (struct buf *)xp->xb_private; 12774 ASSERT(obp != NULL); 12775 12776 obp->b_resid = obp->b_bcount - (bp->b_bcount - bp->b_resid); 12777 bioerror(obp, bp->b_error); 12778 12779 sd_bioclone_free(bp); 12780 12781 /* 12782 * Get back the original buf. 12783 * Note that since the restoration of xb_blkno below 12784 * was removed, the sd_xbuf is not needed. 12785 */ 12786 bp = obp; 12787 /* 12788 * xp = SD_GET_XBUF(bp); 12789 * ASSERT(xp != NULL); 12790 */ 12791 } 12792 12793 /* 12794 * Convert sd->xb_blkno back to a minor-device relative value. 12795 * Note: this has been commented out, as it is not needed in the 12796 * current implementation of the driver (ie, since this function 12797 * is at the top of the layering chains, so the info will be 12798 * discarded) and it is in the "hot" IO path. 12799 * 12800 * partition = getminor(bp->b_edev) & SDPART_MASK; 12801 * xp->xb_blkno -= un->un_offset[partition]; 12802 */ 12803 12804 SD_NEXT_IODONE(index, un, bp); 12805 12806 SD_TRACE(SD_LOG_IO_PARTITION, un, 12807 "sd_mapblockaddr_iodone: exit: buf:0x%p\n", bp); 12808 } 12809 12810 12811 /* 12812 * Function: sd_mapblocksize_iostart 12813 * 12814 * Description: Convert between system block size (un->un_sys_blocksize) 12815 * and target block size (un->un_tgt_blocksize). 12816 * 12817 * Context: Can sleep to allocate resources. 12818 * 12819 * Assumptions: A higher layer has already performed any partition validation, 12820 * and converted the xp->xb_blkno to an absolute value relative 12821 * to the start of the device. 12822 * 12823 * It is also assumed that the higher layer has implemented 12824 * an "overrun" mechanism for the case where the request would 12825 * read/write beyond the end of a partition. In this case we 12826 * assume (and ASSERT) that bp->b_resid == 0. 12827 * 12828 * Note: The implementation for this routine assumes the target 12829 * block size remains constant between allocation and transport. 12830 */ 12831 12832 static void 12833 sd_mapblocksize_iostart(int index, struct sd_lun *un, struct buf *bp) 12834 { 12835 struct sd_mapblocksize_info *bsp; 12836 struct sd_xbuf *xp; 12837 offset_t first_byte; 12838 daddr_t start_block, end_block; 12839 daddr_t request_bytes; 12840 ushort_t is_aligned = FALSE; 12841 12842 ASSERT(un != NULL); 12843 ASSERT(bp != NULL); 12844 ASSERT(!mutex_owned(SD_MUTEX(un))); 12845 ASSERT(bp->b_resid == 0); 12846 12847 SD_TRACE(SD_LOG_IO_RMMEDIA, un, 12848 "sd_mapblocksize_iostart: entry: buf:0x%p\n", bp); 12849 12850 /* 12851 * For a non-writable CD, a write request is an error 12852 */ 12853 if (ISCD(un) && ((bp->b_flags & B_READ) == 0) && 12854 (un->un_f_mmc_writable_media == FALSE)) { 12855 bioerror(bp, EIO); 12856 bp->b_resid = bp->b_bcount; 12857 SD_BEGIN_IODONE(index, un, bp); 12858 return; 12859 } 12860 12861 /* 12862 * We do not need a shadow buf if the device is using 12863 * un->un_sys_blocksize as its block size or if bcount == 0. 12864 * In this case there is no layer-private data block allocated. 12865 */ 12866 if ((un->un_tgt_blocksize == DEV_BSIZE && !un->un_f_enable_rmw) || 12867 (bp->b_bcount == 0)) { 12868 goto done; 12869 } 12870 12871 #if defined(__i386) || defined(__amd64) 12872 /* We do not support non-block-aligned transfers for ROD devices */ 12873 ASSERT(!ISROD(un)); 12874 #endif 12875 12876 xp = SD_GET_XBUF(bp); 12877 ASSERT(xp != NULL); 12878 12879 SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: " 12880 "tgt_blocksize:0x%x sys_blocksize: 0x%x\n", 12881 un->un_tgt_blocksize, DEV_BSIZE); 12882 SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: " 12883 "request start block:0x%x\n", xp->xb_blkno); 12884 SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: " 12885 "request len:0x%x\n", bp->b_bcount); 12886 12887 /* 12888 * Allocate the layer-private data area for the mapblocksize layer. 12889 * Layers are allowed to use the xp_private member of the sd_xbuf 12890 * struct to store the pointer to their layer-private data block, but 12891 * each layer also has the responsibility of restoring the prior 12892 * contents of xb_private before returning the buf/xbuf to the 12893 * higher layer that sent it. 12894 * 12895 * Here we save the prior contents of xp->xb_private into the 12896 * bsp->mbs_oprivate field of our layer-private data area. This value 12897 * is restored by sd_mapblocksize_iodone() just prior to freeing up 12898 * the layer-private area and returning the buf/xbuf to the layer 12899 * that sent it. 12900 * 12901 * Note that here we use kmem_zalloc for the allocation as there are 12902 * parts of the mapblocksize code that expect certain fields to be 12903 * zero unless explicitly set to a required value. 12904 */ 12905 bsp = kmem_zalloc(sizeof (struct sd_mapblocksize_info), KM_SLEEP); 12906 bsp->mbs_oprivate = xp->xb_private; 12907 xp->xb_private = bsp; 12908 12909 /* 12910 * This treats the data on the disk (target) as an array of bytes. 12911 * first_byte is the byte offset, from the beginning of the device, 12912 * to the location of the request. This is converted from a 12913 * un->un_sys_blocksize block address to a byte offset, and then back 12914 * to a block address based upon a un->un_tgt_blocksize block size. 12915 * 12916 * xp->xb_blkno should be absolute upon entry into this function, 12917 * but, but it is based upon partitions that use the "system" 12918 * block size. It must be adjusted to reflect the block size of 12919 * the target. 12920 * 12921 * Note that end_block is actually the block that follows the last 12922 * block of the request, but that's what is needed for the computation. 12923 */ 12924 first_byte = SD_SYSBLOCKS2BYTES((offset_t)xp->xb_blkno); 12925 if (un->un_f_enable_rmw) { 12926 start_block = xp->xb_blkno = 12927 (first_byte / un->un_phy_blocksize) * 12928 (un->un_phy_blocksize / DEV_BSIZE); 12929 end_block = ((first_byte + bp->b_bcount + 12930 un->un_phy_blocksize - 1) / un->un_phy_blocksize) * 12931 (un->un_phy_blocksize / DEV_BSIZE); 12932 } else { 12933 start_block = xp->xb_blkno = first_byte / un->un_tgt_blocksize; 12934 end_block = (first_byte + bp->b_bcount + 12935 un->un_tgt_blocksize - 1) / un->un_tgt_blocksize; 12936 } 12937 12938 /* request_bytes is rounded up to a multiple of the target block size */ 12939 request_bytes = (end_block - start_block) * un->un_tgt_blocksize; 12940 12941 /* 12942 * See if the starting address of the request and the request 12943 * length are aligned on a un->un_tgt_blocksize boundary. If aligned 12944 * then we do not need to allocate a shadow buf to handle the request. 12945 */ 12946 if (un->un_f_enable_rmw) { 12947 if (((first_byte % un->un_phy_blocksize) == 0) && 12948 ((bp->b_bcount % un->un_phy_blocksize) == 0)) { 12949 is_aligned = TRUE; 12950 } 12951 } else { 12952 if (((first_byte % un->un_tgt_blocksize) == 0) && 12953 ((bp->b_bcount % un->un_tgt_blocksize) == 0)) { 12954 is_aligned = TRUE; 12955 } 12956 } 12957 12958 if ((bp->b_flags & B_READ) == 0) { 12959 /* 12960 * Lock the range for a write operation. An aligned request is 12961 * considered a simple write; otherwise the request must be a 12962 * read-modify-write. 12963 */ 12964 bsp->mbs_wmp = sd_range_lock(un, start_block, end_block - 1, 12965 (is_aligned == TRUE) ? SD_WTYPE_SIMPLE : SD_WTYPE_RMW); 12966 } 12967 12968 /* 12969 * Alloc a shadow buf if the request is not aligned. Also, this is 12970 * where the READ command is generated for a read-modify-write. (The 12971 * write phase is deferred until after the read completes.) 12972 */ 12973 if (is_aligned == FALSE) { 12974 12975 struct sd_mapblocksize_info *shadow_bsp; 12976 struct sd_xbuf *shadow_xp; 12977 struct buf *shadow_bp; 12978 12979 /* 12980 * Allocate the shadow buf and it associated xbuf. Note that 12981 * after this call the xb_blkno value in both the original 12982 * buf's sd_xbuf _and_ the shadow buf's sd_xbuf will be the 12983 * same: absolute relative to the start of the device, and 12984 * adjusted for the target block size. The b_blkno in the 12985 * shadow buf will also be set to this value. We should never 12986 * change b_blkno in the original bp however. 12987 * 12988 * Note also that the shadow buf will always need to be a 12989 * READ command, regardless of whether the incoming command 12990 * is a READ or a WRITE. 12991 */ 12992 shadow_bp = sd_shadow_buf_alloc(bp, request_bytes, B_READ, 12993 xp->xb_blkno, 12994 (int (*)(struct buf *)) sd_mapblocksize_iodone); 12995 12996 shadow_xp = SD_GET_XBUF(shadow_bp); 12997 12998 /* 12999 * Allocate the layer-private data for the shadow buf. 13000 * (No need to preserve xb_private in the shadow xbuf.) 13001 */ 13002 shadow_xp->xb_private = shadow_bsp = 13003 kmem_zalloc(sizeof (struct sd_mapblocksize_info), KM_SLEEP); 13004 13005 /* 13006 * bsp->mbs_copy_offset is used later by sd_mapblocksize_iodone 13007 * to figure out where the start of the user data is (based upon 13008 * the system block size) in the data returned by the READ 13009 * command (which will be based upon the target blocksize). Note 13010 * that this is only really used if the request is unaligned. 13011 */ 13012 if (un->un_f_enable_rmw) { 13013 bsp->mbs_copy_offset = (ssize_t)(first_byte - 13014 ((offset_t)xp->xb_blkno * un->un_sys_blocksize)); 13015 ASSERT((bsp->mbs_copy_offset >= 0) && 13016 (bsp->mbs_copy_offset < un->un_phy_blocksize)); 13017 } else { 13018 bsp->mbs_copy_offset = (ssize_t)(first_byte - 13019 ((offset_t)xp->xb_blkno * un->un_tgt_blocksize)); 13020 ASSERT((bsp->mbs_copy_offset >= 0) && 13021 (bsp->mbs_copy_offset < un->un_tgt_blocksize)); 13022 } 13023 13024 shadow_bsp->mbs_copy_offset = bsp->mbs_copy_offset; 13025 13026 shadow_bsp->mbs_layer_index = bsp->mbs_layer_index = index; 13027 13028 /* Transfer the wmap (if any) to the shadow buf */ 13029 shadow_bsp->mbs_wmp = bsp->mbs_wmp; 13030 bsp->mbs_wmp = NULL; 13031 13032 /* 13033 * The shadow buf goes on from here in place of the 13034 * original buf. 13035 */ 13036 shadow_bsp->mbs_orig_bp = bp; 13037 bp = shadow_bp; 13038 } 13039 13040 SD_INFO(SD_LOG_IO_RMMEDIA, un, 13041 "sd_mapblocksize_iostart: tgt start block:0x%x\n", xp->xb_blkno); 13042 SD_INFO(SD_LOG_IO_RMMEDIA, un, 13043 "sd_mapblocksize_iostart: tgt request len:0x%x\n", 13044 request_bytes); 13045 SD_INFO(SD_LOG_IO_RMMEDIA, un, 13046 "sd_mapblocksize_iostart: shadow buf:0x%x\n", bp); 13047 13048 done: 13049 SD_NEXT_IOSTART(index, un, bp); 13050 13051 SD_TRACE(SD_LOG_IO_RMMEDIA, un, 13052 "sd_mapblocksize_iostart: exit: buf:0x%p\n", bp); 13053 } 13054 13055 13056 /* 13057 * Function: sd_mapblocksize_iodone 13058 * 13059 * Description: Completion side processing for block-size mapping. 13060 * 13061 * Context: May be called under interrupt context 13062 */ 13063 13064 static void 13065 sd_mapblocksize_iodone(int index, struct sd_lun *un, struct buf *bp) 13066 { 13067 struct sd_mapblocksize_info *bsp; 13068 struct sd_xbuf *xp; 13069 struct sd_xbuf *orig_xp; /* sd_xbuf for the original buf */ 13070 struct buf *orig_bp; /* ptr to the original buf */ 13071 offset_t shadow_end; 13072 offset_t request_end; 13073 offset_t shadow_start; 13074 ssize_t copy_offset; 13075 size_t copy_length; 13076 size_t shortfall; 13077 uint_t is_write; /* TRUE if this bp is a WRITE */ 13078 uint_t has_wmap; /* TRUE is this bp has a wmap */ 13079 13080 ASSERT(un != NULL); 13081 ASSERT(bp != NULL); 13082 13083 SD_TRACE(SD_LOG_IO_RMMEDIA, un, 13084 "sd_mapblocksize_iodone: entry: buf:0x%p\n", bp); 13085 13086 /* 13087 * There is no shadow buf or layer-private data if the target is 13088 * using un->un_sys_blocksize as its block size or if bcount == 0. 13089 */ 13090 if ((un->un_tgt_blocksize == DEV_BSIZE && !un->un_f_enable_rmw) || 13091 (bp->b_bcount == 0)) { 13092 goto exit; 13093 } 13094 13095 xp = SD_GET_XBUF(bp); 13096 ASSERT(xp != NULL); 13097 13098 /* Retrieve the pointer to the layer-private data area from the xbuf. */ 13099 bsp = xp->xb_private; 13100 13101 is_write = ((bp->b_flags & B_READ) == 0) ? TRUE : FALSE; 13102 has_wmap = (bsp->mbs_wmp != NULL) ? TRUE : FALSE; 13103 13104 if (is_write) { 13105 /* 13106 * For a WRITE request we must free up the block range that 13107 * we have locked up. This holds regardless of whether this is 13108 * an aligned write request or a read-modify-write request. 13109 */ 13110 sd_range_unlock(un, bsp->mbs_wmp); 13111 bsp->mbs_wmp = NULL; 13112 } 13113 13114 if ((bp->b_iodone != (int(*)(struct buf *))sd_mapblocksize_iodone)) { 13115 /* 13116 * An aligned read or write command will have no shadow buf; 13117 * there is not much else to do with it. 13118 */ 13119 goto done; 13120 } 13121 13122 orig_bp = bsp->mbs_orig_bp; 13123 ASSERT(orig_bp != NULL); 13124 orig_xp = SD_GET_XBUF(orig_bp); 13125 ASSERT(orig_xp != NULL); 13126 ASSERT(!mutex_owned(SD_MUTEX(un))); 13127 13128 if (!is_write && has_wmap) { 13129 /* 13130 * A READ with a wmap means this is the READ phase of a 13131 * read-modify-write. If an error occurred on the READ then 13132 * we do not proceed with the WRITE phase or copy any data. 13133 * Just release the write maps and return with an error. 13134 */ 13135 if ((bp->b_resid != 0) || (bp->b_error != 0)) { 13136 orig_bp->b_resid = orig_bp->b_bcount; 13137 bioerror(orig_bp, bp->b_error); 13138 sd_range_unlock(un, bsp->mbs_wmp); 13139 goto freebuf_done; 13140 } 13141 } 13142 13143 /* 13144 * Here is where we set up to copy the data from the shadow buf 13145 * into the space associated with the original buf. 13146 * 13147 * To deal with the conversion between block sizes, these 13148 * computations treat the data as an array of bytes, with the 13149 * first byte (byte 0) corresponding to the first byte in the 13150 * first block on the disk. 13151 */ 13152 13153 /* 13154 * shadow_start and shadow_len indicate the location and size of 13155 * the data returned with the shadow IO request. 13156 */ 13157 if (un->un_f_enable_rmw) { 13158 shadow_start = SD_SYSBLOCKS2BYTES((offset_t)xp->xb_blkno); 13159 } else { 13160 shadow_start = SD_TGTBLOCKS2BYTES(un, (offset_t)xp->xb_blkno); 13161 } 13162 shadow_end = shadow_start + bp->b_bcount - bp->b_resid; 13163 13164 /* 13165 * copy_offset gives the offset (in bytes) from the start of the first 13166 * block of the READ request to the beginning of the data. We retrieve 13167 * this value from xb_pktp in the ORIGINAL xbuf, as it has been saved 13168 * there by sd_mapblockize_iostart(). copy_length gives the amount of 13169 * data to be copied (in bytes). 13170 */ 13171 copy_offset = bsp->mbs_copy_offset; 13172 if (un->un_f_enable_rmw) { 13173 ASSERT((copy_offset >= 0) && 13174 (copy_offset < un->un_phy_blocksize)); 13175 } else { 13176 ASSERT((copy_offset >= 0) && 13177 (copy_offset < un->un_tgt_blocksize)); 13178 } 13179 13180 copy_length = orig_bp->b_bcount; 13181 request_end = shadow_start + copy_offset + orig_bp->b_bcount; 13182 13183 /* 13184 * Set up the resid and error fields of orig_bp as appropriate. 13185 */ 13186 if (shadow_end >= request_end) { 13187 /* We got all the requested data; set resid to zero */ 13188 orig_bp->b_resid = 0; 13189 } else { 13190 /* 13191 * We failed to get enough data to fully satisfy the original 13192 * request. Just copy back whatever data we got and set 13193 * up the residual and error code as required. 13194 * 13195 * 'shortfall' is the amount by which the data received with the 13196 * shadow buf has "fallen short" of the requested amount. 13197 */ 13198 shortfall = (size_t)(request_end - shadow_end); 13199 13200 if (shortfall > orig_bp->b_bcount) { 13201 /* 13202 * We did not get enough data to even partially 13203 * fulfill the original request. The residual is 13204 * equal to the amount requested. 13205 */ 13206 orig_bp->b_resid = orig_bp->b_bcount; 13207 } else { 13208 /* 13209 * We did not get all the data that we requested 13210 * from the device, but we will try to return what 13211 * portion we did get. 13212 */ 13213 orig_bp->b_resid = shortfall; 13214 } 13215 ASSERT(copy_length >= orig_bp->b_resid); 13216 copy_length -= orig_bp->b_resid; 13217 } 13218 13219 /* Propagate the error code from the shadow buf to the original buf */ 13220 bioerror(orig_bp, bp->b_error); 13221 13222 if (is_write) { 13223 goto freebuf_done; /* No data copying for a WRITE */ 13224 } 13225 13226 if (has_wmap) { 13227 /* 13228 * This is a READ command from the READ phase of a 13229 * read-modify-write request. We have to copy the data given 13230 * by the user OVER the data returned by the READ command, 13231 * then convert the command from a READ to a WRITE and send 13232 * it back to the target. 13233 */ 13234 bcopy(orig_bp->b_un.b_addr, bp->b_un.b_addr + copy_offset, 13235 copy_length); 13236 13237 bp->b_flags &= ~((int)B_READ); /* Convert to a WRITE */ 13238 13239 /* 13240 * Dispatch the WRITE command to the taskq thread, which 13241 * will in turn send the command to the target. When the 13242 * WRITE command completes, we (sd_mapblocksize_iodone()) 13243 * will get called again as part of the iodone chain 13244 * processing for it. Note that we will still be dealing 13245 * with the shadow buf at that point. 13246 */ 13247 if (taskq_dispatch(sd_wmr_tq, sd_read_modify_write_task, bp, 13248 KM_NOSLEEP) != 0) { 13249 /* 13250 * Dispatch was successful so we are done. Return 13251 * without going any higher up the iodone chain. Do 13252 * not free up any layer-private data until after the 13253 * WRITE completes. 13254 */ 13255 return; 13256 } 13257 13258 /* 13259 * Dispatch of the WRITE command failed; set up the error 13260 * condition and send this IO back up the iodone chain. 13261 */ 13262 bioerror(orig_bp, EIO); 13263 orig_bp->b_resid = orig_bp->b_bcount; 13264 13265 } else { 13266 /* 13267 * This is a regular READ request (ie, not a RMW). Copy the 13268 * data from the shadow buf into the original buf. The 13269 * copy_offset compensates for any "misalignment" between the 13270 * shadow buf (with its un->un_tgt_blocksize blocks) and the 13271 * original buf (with its un->un_sys_blocksize blocks). 13272 */ 13273 bcopy(bp->b_un.b_addr + copy_offset, orig_bp->b_un.b_addr, 13274 copy_length); 13275 } 13276 13277 freebuf_done: 13278 13279 /* 13280 * At this point we still have both the shadow buf AND the original 13281 * buf to deal with, as well as the layer-private data area in each. 13282 * Local variables are as follows: 13283 * 13284 * bp -- points to shadow buf 13285 * xp -- points to xbuf of shadow buf 13286 * bsp -- points to layer-private data area of shadow buf 13287 * orig_bp -- points to original buf 13288 * 13289 * First free the shadow buf and its associated xbuf, then free the 13290 * layer-private data area from the shadow buf. There is no need to 13291 * restore xb_private in the shadow xbuf. 13292 */ 13293 sd_shadow_buf_free(bp); 13294 kmem_free(bsp, sizeof (struct sd_mapblocksize_info)); 13295 13296 /* 13297 * Now update the local variables to point to the original buf, xbuf, 13298 * and layer-private area. 13299 */ 13300 bp = orig_bp; 13301 xp = SD_GET_XBUF(bp); 13302 ASSERT(xp != NULL); 13303 ASSERT(xp == orig_xp); 13304 bsp = xp->xb_private; 13305 ASSERT(bsp != NULL); 13306 13307 done: 13308 /* 13309 * Restore xb_private to whatever it was set to by the next higher 13310 * layer in the chain, then free the layer-private data area. 13311 */ 13312 xp->xb_private = bsp->mbs_oprivate; 13313 kmem_free(bsp, sizeof (struct sd_mapblocksize_info)); 13314 13315 exit: 13316 SD_TRACE(SD_LOG_IO_RMMEDIA, SD_GET_UN(bp), 13317 "sd_mapblocksize_iodone: calling SD_NEXT_IODONE: buf:0x%p\n", bp); 13318 13319 SD_NEXT_IODONE(index, un, bp); 13320 } 13321 13322 13323 /* 13324 * Function: sd_checksum_iostart 13325 * 13326 * Description: A stub function for a layer that's currently not used. 13327 * For now just a placeholder. 13328 * 13329 * Context: Kernel thread context 13330 */ 13331 13332 static void 13333 sd_checksum_iostart(int index, struct sd_lun *un, struct buf *bp) 13334 { 13335 ASSERT(un != NULL); 13336 ASSERT(bp != NULL); 13337 ASSERT(!mutex_owned(SD_MUTEX(un))); 13338 SD_NEXT_IOSTART(index, un, bp); 13339 } 13340 13341 13342 /* 13343 * Function: sd_checksum_iodone 13344 * 13345 * Description: A stub function for a layer that's currently not used. 13346 * For now just a placeholder. 13347 * 13348 * Context: May be called under interrupt context 13349 */ 13350 13351 static void 13352 sd_checksum_iodone(int index, struct sd_lun *un, struct buf *bp) 13353 { 13354 ASSERT(un != NULL); 13355 ASSERT(bp != NULL); 13356 ASSERT(!mutex_owned(SD_MUTEX(un))); 13357 SD_NEXT_IODONE(index, un, bp); 13358 } 13359 13360 13361 /* 13362 * Function: sd_checksum_uscsi_iostart 13363 * 13364 * Description: A stub function for a layer that's currently not used. 13365 * For now just a placeholder. 13366 * 13367 * Context: Kernel thread context 13368 */ 13369 13370 static void 13371 sd_checksum_uscsi_iostart(int index, struct sd_lun *un, struct buf *bp) 13372 { 13373 ASSERT(un != NULL); 13374 ASSERT(bp != NULL); 13375 ASSERT(!mutex_owned(SD_MUTEX(un))); 13376 SD_NEXT_IOSTART(index, un, bp); 13377 } 13378 13379 13380 /* 13381 * Function: sd_checksum_uscsi_iodone 13382 * 13383 * Description: A stub function for a layer that's currently not used. 13384 * For now just a placeholder. 13385 * 13386 * Context: May be called under interrupt context 13387 */ 13388 13389 static void 13390 sd_checksum_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp) 13391 { 13392 ASSERT(un != NULL); 13393 ASSERT(bp != NULL); 13394 ASSERT(!mutex_owned(SD_MUTEX(un))); 13395 SD_NEXT_IODONE(index, un, bp); 13396 } 13397 13398 13399 /* 13400 * Function: sd_pm_iostart 13401 * 13402 * Description: iostart-side routine for Power mangement. 13403 * 13404 * Context: Kernel thread context 13405 */ 13406 13407 static void 13408 sd_pm_iostart(int index, struct sd_lun *un, struct buf *bp) 13409 { 13410 ASSERT(un != NULL); 13411 ASSERT(bp != NULL); 13412 ASSERT(!mutex_owned(SD_MUTEX(un))); 13413 ASSERT(!mutex_owned(&un->un_pm_mutex)); 13414 13415 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: entry\n"); 13416 13417 if (sd_pm_entry(un) != DDI_SUCCESS) { 13418 /* 13419 * Set up to return the failed buf back up the 'iodone' 13420 * side of the calling chain. 13421 */ 13422 bioerror(bp, EIO); 13423 bp->b_resid = bp->b_bcount; 13424 13425 SD_BEGIN_IODONE(index, un, bp); 13426 13427 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: exit\n"); 13428 return; 13429 } 13430 13431 SD_NEXT_IOSTART(index, un, bp); 13432 13433 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: exit\n"); 13434 } 13435 13436 13437 /* 13438 * Function: sd_pm_iodone 13439 * 13440 * Description: iodone-side routine for power mangement. 13441 * 13442 * Context: may be called from interrupt context 13443 */ 13444 13445 static void 13446 sd_pm_iodone(int index, struct sd_lun *un, struct buf *bp) 13447 { 13448 ASSERT(un != NULL); 13449 ASSERT(bp != NULL); 13450 ASSERT(!mutex_owned(&un->un_pm_mutex)); 13451 13452 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iodone: entry\n"); 13453 13454 /* 13455 * After attach the following flag is only read, so don't 13456 * take the penalty of acquiring a mutex for it. 13457 */ 13458 if (un->un_f_pm_is_enabled == TRUE) { 13459 sd_pm_exit(un); 13460 } 13461 13462 SD_NEXT_IODONE(index, un, bp); 13463 13464 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iodone: exit\n"); 13465 } 13466 13467 13468 /* 13469 * Function: sd_core_iostart 13470 * 13471 * Description: Primary driver function for enqueuing buf(9S) structs from 13472 * the system and initiating IO to the target device 13473 * 13474 * Context: Kernel thread context. Can sleep. 13475 * 13476 * Assumptions: - The given xp->xb_blkno is absolute 13477 * (ie, relative to the start of the device). 13478 * - The IO is to be done using the native blocksize of 13479 * the device, as specified in un->un_tgt_blocksize. 13480 */ 13481 /* ARGSUSED */ 13482 static void 13483 sd_core_iostart(int index, struct sd_lun *un, struct buf *bp) 13484 { 13485 struct sd_xbuf *xp; 13486 13487 ASSERT(un != NULL); 13488 ASSERT(bp != NULL); 13489 ASSERT(!mutex_owned(SD_MUTEX(un))); 13490 ASSERT(bp->b_resid == 0); 13491 13492 SD_TRACE(SD_LOG_IO_CORE, un, "sd_core_iostart: entry: bp:0x%p\n", bp); 13493 13494 xp = SD_GET_XBUF(bp); 13495 ASSERT(xp != NULL); 13496 13497 mutex_enter(SD_MUTEX(un)); 13498 13499 /* 13500 * If we are currently in the failfast state, fail any new IO 13501 * that has B_FAILFAST set, then return. 13502 */ 13503 if ((bp->b_flags & B_FAILFAST) && 13504 (un->un_failfast_state == SD_FAILFAST_ACTIVE)) { 13505 mutex_exit(SD_MUTEX(un)); 13506 bioerror(bp, EIO); 13507 bp->b_resid = bp->b_bcount; 13508 SD_BEGIN_IODONE(index, un, bp); 13509 return; 13510 } 13511 13512 if (SD_IS_DIRECT_PRIORITY(xp)) { 13513 /* 13514 * Priority command -- transport it immediately. 13515 * 13516 * Note: We may want to assert that USCSI_DIAGNOSE is set, 13517 * because all direct priority commands should be associated 13518 * with error recovery actions which we don't want to retry. 13519 */ 13520 sd_start_cmds(un, bp); 13521 } else { 13522 /* 13523 * Normal command -- add it to the wait queue, then start 13524 * transporting commands from the wait queue. 13525 */ 13526 sd_add_buf_to_waitq(un, bp); 13527 SD_UPDATE_KSTATS(un, kstat_waitq_enter, bp); 13528 sd_start_cmds(un, NULL); 13529 } 13530 13531 mutex_exit(SD_MUTEX(un)); 13532 13533 SD_TRACE(SD_LOG_IO_CORE, un, "sd_core_iostart: exit: bp:0x%p\n", bp); 13534 } 13535 13536 13537 /* 13538 * Function: sd_init_cdb_limits 13539 * 13540 * Description: This is to handle scsi_pkt initialization differences 13541 * between the driver platforms. 13542 * 13543 * Legacy behaviors: 13544 * 13545 * If the block number or the sector count exceeds the 13546 * capabilities of a Group 0 command, shift over to a 13547 * Group 1 command. We don't blindly use Group 1 13548 * commands because a) some drives (CDC Wren IVs) get a 13549 * bit confused, and b) there is probably a fair amount 13550 * of speed difference for a target to receive and decode 13551 * a 10 byte command instead of a 6 byte command. 13552 * 13553 * The xfer time difference of 6 vs 10 byte CDBs is 13554 * still significant so this code is still worthwhile. 13555 * 10 byte CDBs are very inefficient with the fas HBA driver 13556 * and older disks. Each CDB byte took 1 usec with some 13557 * popular disks. 13558 * 13559 * Context: Must be called at attach time 13560 */ 13561 13562 static void 13563 sd_init_cdb_limits(struct sd_lun *un) 13564 { 13565 int hba_cdb_limit; 13566 13567 /* 13568 * Use CDB_GROUP1 commands for most devices except for 13569 * parallel SCSI fixed drives in which case we get better 13570 * performance using CDB_GROUP0 commands (where applicable). 13571 */ 13572 un->un_mincdb = SD_CDB_GROUP1; 13573 #if !defined(__fibre) 13574 if (!un->un_f_is_fibre && !un->un_f_cfg_is_atapi && !ISROD(un) && 13575 !un->un_f_has_removable_media) { 13576 un->un_mincdb = SD_CDB_GROUP0; 13577 } 13578 #endif 13579 13580 /* 13581 * Try to read the max-cdb-length supported by HBA. 13582 */ 13583 un->un_max_hba_cdb = scsi_ifgetcap(SD_ADDRESS(un), "max-cdb-length", 1); 13584 if (0 >= un->un_max_hba_cdb) { 13585 un->un_max_hba_cdb = CDB_GROUP4; 13586 hba_cdb_limit = SD_CDB_GROUP4; 13587 } else if (0 < un->un_max_hba_cdb && 13588 un->un_max_hba_cdb < CDB_GROUP1) { 13589 hba_cdb_limit = SD_CDB_GROUP0; 13590 } else if (CDB_GROUP1 <= un->un_max_hba_cdb && 13591 un->un_max_hba_cdb < CDB_GROUP5) { 13592 hba_cdb_limit = SD_CDB_GROUP1; 13593 } else if (CDB_GROUP5 <= un->un_max_hba_cdb && 13594 un->un_max_hba_cdb < CDB_GROUP4) { 13595 hba_cdb_limit = SD_CDB_GROUP5; 13596 } else { 13597 hba_cdb_limit = SD_CDB_GROUP4; 13598 } 13599 13600 /* 13601 * Use CDB_GROUP5 commands for removable devices. Use CDB_GROUP4 13602 * commands for fixed disks unless we are building for a 32 bit 13603 * kernel. 13604 */ 13605 #ifdef _LP64 13606 un->un_maxcdb = (un->un_f_has_removable_media) ? SD_CDB_GROUP5 : 13607 min(hba_cdb_limit, SD_CDB_GROUP4); 13608 #else 13609 un->un_maxcdb = (un->un_f_has_removable_media) ? SD_CDB_GROUP5 : 13610 min(hba_cdb_limit, SD_CDB_GROUP1); 13611 #endif 13612 13613 un->un_status_len = (int)((un->un_f_arq_enabled == TRUE) 13614 ? sizeof (struct scsi_arq_status) : 1); 13615 if (!ISCD(un)) 13616 un->un_cmd_timeout = (ushort_t)sd_io_time; 13617 un->un_uscsi_timeout = ((ISCD(un)) ? 2 : 1) * un->un_cmd_timeout; 13618 } 13619 13620 13621 /* 13622 * Function: sd_initpkt_for_buf 13623 * 13624 * Description: Allocate and initialize for transport a scsi_pkt struct, 13625 * based upon the info specified in the given buf struct. 13626 * 13627 * Assumes the xb_blkno in the request is absolute (ie, 13628 * relative to the start of the device (NOT partition!). 13629 * Also assumes that the request is using the native block 13630 * size of the device (as returned by the READ CAPACITY 13631 * command). 13632 * 13633 * Return Code: SD_PKT_ALLOC_SUCCESS 13634 * SD_PKT_ALLOC_FAILURE 13635 * SD_PKT_ALLOC_FAILURE_NO_DMA 13636 * SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL 13637 * 13638 * Context: Kernel thread and may be called from software interrupt context 13639 * as part of a sdrunout callback. This function may not block or 13640 * call routines that block 13641 */ 13642 13643 static int 13644 sd_initpkt_for_buf(struct buf *bp, struct scsi_pkt **pktpp) 13645 { 13646 struct sd_xbuf *xp; 13647 struct scsi_pkt *pktp = NULL; 13648 struct sd_lun *un; 13649 size_t blockcount; 13650 daddr_t startblock; 13651 int rval; 13652 int cmd_flags; 13653 13654 ASSERT(bp != NULL); 13655 ASSERT(pktpp != NULL); 13656 xp = SD_GET_XBUF(bp); 13657 ASSERT(xp != NULL); 13658 un = SD_GET_UN(bp); 13659 ASSERT(un != NULL); 13660 ASSERT(mutex_owned(SD_MUTEX(un))); 13661 ASSERT(bp->b_resid == 0); 13662 13663 SD_TRACE(SD_LOG_IO_CORE, un, 13664 "sd_initpkt_for_buf: entry: buf:0x%p\n", bp); 13665 13666 mutex_exit(SD_MUTEX(un)); 13667 13668 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 13669 if (xp->xb_pkt_flags & SD_XB_DMA_FREED) { 13670 /* 13671 * Already have a scsi_pkt -- just need DMA resources. 13672 * We must recompute the CDB in case the mapping returns 13673 * a nonzero pkt_resid. 13674 * Note: if this is a portion of a PKT_DMA_PARTIAL transfer 13675 * that is being retried, the unmap/remap of the DMA resouces 13676 * will result in the entire transfer starting over again 13677 * from the very first block. 13678 */ 13679 ASSERT(xp->xb_pktp != NULL); 13680 pktp = xp->xb_pktp; 13681 } else { 13682 pktp = NULL; 13683 } 13684 #endif /* __i386 || __amd64 */ 13685 13686 startblock = xp->xb_blkno; /* Absolute block num. */ 13687 blockcount = SD_BYTES2TGTBLOCKS(un, bp->b_bcount); 13688 13689 cmd_flags = un->un_pkt_flags | (xp->xb_pkt_flags & SD_XB_INITPKT_MASK); 13690 13691 /* 13692 * sd_setup_rw_pkt will determine the appropriate CDB group to use, 13693 * call scsi_init_pkt, and build the CDB. 13694 */ 13695 rval = sd_setup_rw_pkt(un, &pktp, bp, 13696 cmd_flags, sdrunout, (caddr_t)un, 13697 startblock, blockcount); 13698 13699 if (rval == 0) { 13700 /* 13701 * Success. 13702 * 13703 * If partial DMA is being used and required for this transfer. 13704 * set it up here. 13705 */ 13706 if ((un->un_pkt_flags & PKT_DMA_PARTIAL) != 0 && 13707 (pktp->pkt_resid != 0)) { 13708 13709 /* 13710 * Save the CDB length and pkt_resid for the 13711 * next xfer 13712 */ 13713 xp->xb_dma_resid = pktp->pkt_resid; 13714 13715 /* rezero resid */ 13716 pktp->pkt_resid = 0; 13717 13718 } else { 13719 xp->xb_dma_resid = 0; 13720 } 13721 13722 pktp->pkt_flags = un->un_tagflags; 13723 pktp->pkt_time = un->un_cmd_timeout; 13724 pktp->pkt_comp = sdintr; 13725 13726 pktp->pkt_private = bp; 13727 *pktpp = pktp; 13728 13729 SD_TRACE(SD_LOG_IO_CORE, un, 13730 "sd_initpkt_for_buf: exit: buf:0x%p\n", bp); 13731 13732 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 13733 xp->xb_pkt_flags &= ~SD_XB_DMA_FREED; 13734 #endif 13735 13736 mutex_enter(SD_MUTEX(un)); 13737 return (SD_PKT_ALLOC_SUCCESS); 13738 13739 } 13740 13741 /* 13742 * SD_PKT_ALLOC_FAILURE is the only expected failure code 13743 * from sd_setup_rw_pkt. 13744 */ 13745 ASSERT(rval == SD_PKT_ALLOC_FAILURE); 13746 13747 if (rval == SD_PKT_ALLOC_FAILURE) { 13748 *pktpp = NULL; 13749 /* 13750 * Set the driver state to RWAIT to indicate the driver 13751 * is waiting on resource allocations. The driver will not 13752 * suspend, pm_suspend, or detatch while the state is RWAIT. 13753 */ 13754 mutex_enter(SD_MUTEX(un)); 13755 New_state(un, SD_STATE_RWAIT); 13756 13757 SD_ERROR(SD_LOG_IO_CORE, un, 13758 "sd_initpkt_for_buf: No pktp. exit bp:0x%p\n", bp); 13759 13760 if ((bp->b_flags & B_ERROR) != 0) { 13761 return (SD_PKT_ALLOC_FAILURE_NO_DMA); 13762 } 13763 return (SD_PKT_ALLOC_FAILURE); 13764 } else { 13765 /* 13766 * PKT_ALLOC_FAILURE_CDB_TOO_SMALL 13767 * 13768 * This should never happen. Maybe someone messed with the 13769 * kernel's minphys? 13770 */ 13771 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 13772 "Request rejected: too large for CDB: " 13773 "lba:0x%08lx len:0x%08lx\n", startblock, blockcount); 13774 SD_ERROR(SD_LOG_IO_CORE, un, 13775 "sd_initpkt_for_buf: No cp. exit bp:0x%p\n", bp); 13776 mutex_enter(SD_MUTEX(un)); 13777 return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL); 13778 13779 } 13780 } 13781 13782 13783 /* 13784 * Function: sd_destroypkt_for_buf 13785 * 13786 * Description: Free the scsi_pkt(9S) for the given bp (buf IO processing). 13787 * 13788 * Context: Kernel thread or interrupt context 13789 */ 13790 13791 static void 13792 sd_destroypkt_for_buf(struct buf *bp) 13793 { 13794 ASSERT(bp != NULL); 13795 ASSERT(SD_GET_UN(bp) != NULL); 13796 13797 SD_TRACE(SD_LOG_IO_CORE, SD_GET_UN(bp), 13798 "sd_destroypkt_for_buf: entry: buf:0x%p\n", bp); 13799 13800 ASSERT(SD_GET_PKTP(bp) != NULL); 13801 scsi_destroy_pkt(SD_GET_PKTP(bp)); 13802 13803 SD_TRACE(SD_LOG_IO_CORE, SD_GET_UN(bp), 13804 "sd_destroypkt_for_buf: exit: buf:0x%p\n", bp); 13805 } 13806 13807 /* 13808 * Function: sd_setup_rw_pkt 13809 * 13810 * Description: Determines appropriate CDB group for the requested LBA 13811 * and transfer length, calls scsi_init_pkt, and builds 13812 * the CDB. Do not use for partial DMA transfers except 13813 * for the initial transfer since the CDB size must 13814 * remain constant. 13815 * 13816 * Context: Kernel thread and may be called from software interrupt 13817 * context as part of a sdrunout callback. This function may not 13818 * block or call routines that block 13819 */ 13820 13821 13822 int 13823 sd_setup_rw_pkt(struct sd_lun *un, 13824 struct scsi_pkt **pktpp, struct buf *bp, int flags, 13825 int (*callback)(caddr_t), caddr_t callback_arg, 13826 diskaddr_t lba, uint32_t blockcount) 13827 { 13828 struct scsi_pkt *return_pktp; 13829 union scsi_cdb *cdbp; 13830 struct sd_cdbinfo *cp = NULL; 13831 int i; 13832 13833 /* 13834 * See which size CDB to use, based upon the request. 13835 */ 13836 for (i = un->un_mincdb; i <= un->un_maxcdb; i++) { 13837 13838 /* 13839 * Check lba and block count against sd_cdbtab limits. 13840 * In the partial DMA case, we have to use the same size 13841 * CDB for all the transfers. Check lba + blockcount 13842 * against the max LBA so we know that segment of the 13843 * transfer can use the CDB we select. 13844 */ 13845 if ((lba + blockcount - 1 <= sd_cdbtab[i].sc_maxlba) && 13846 (blockcount <= sd_cdbtab[i].sc_maxlen)) { 13847 13848 /* 13849 * The command will fit into the CDB type 13850 * specified by sd_cdbtab[i]. 13851 */ 13852 cp = sd_cdbtab + i; 13853 13854 /* 13855 * Call scsi_init_pkt so we can fill in the 13856 * CDB. 13857 */ 13858 return_pktp = scsi_init_pkt(SD_ADDRESS(un), *pktpp, 13859 bp, cp->sc_grpcode, un->un_status_len, 0, 13860 flags, callback, callback_arg); 13861 13862 if (return_pktp != NULL) { 13863 13864 /* 13865 * Return new value of pkt 13866 */ 13867 *pktpp = return_pktp; 13868 13869 /* 13870 * To be safe, zero the CDB insuring there is 13871 * no leftover data from a previous command. 13872 */ 13873 bzero(return_pktp->pkt_cdbp, cp->sc_grpcode); 13874 13875 /* 13876 * Handle partial DMA mapping 13877 */ 13878 if (return_pktp->pkt_resid != 0) { 13879 13880 /* 13881 * Not going to xfer as many blocks as 13882 * originally expected 13883 */ 13884 blockcount -= 13885 SD_BYTES2TGTBLOCKS(un, 13886 return_pktp->pkt_resid); 13887 } 13888 13889 cdbp = (union scsi_cdb *)return_pktp->pkt_cdbp; 13890 13891 /* 13892 * Set command byte based on the CDB 13893 * type we matched. 13894 */ 13895 cdbp->scc_cmd = cp->sc_grpmask | 13896 ((bp->b_flags & B_READ) ? 13897 SCMD_READ : SCMD_WRITE); 13898 13899 SD_FILL_SCSI1_LUN(un, return_pktp); 13900 13901 /* 13902 * Fill in LBA and length 13903 */ 13904 ASSERT((cp->sc_grpcode == CDB_GROUP1) || 13905 (cp->sc_grpcode == CDB_GROUP4) || 13906 (cp->sc_grpcode == CDB_GROUP0) || 13907 (cp->sc_grpcode == CDB_GROUP5)); 13908 13909 if (cp->sc_grpcode == CDB_GROUP1) { 13910 FORMG1ADDR(cdbp, lba); 13911 FORMG1COUNT(cdbp, blockcount); 13912 return (0); 13913 } else if (cp->sc_grpcode == CDB_GROUP4) { 13914 FORMG4LONGADDR(cdbp, lba); 13915 FORMG4COUNT(cdbp, blockcount); 13916 return (0); 13917 } else if (cp->sc_grpcode == CDB_GROUP0) { 13918 FORMG0ADDR(cdbp, lba); 13919 FORMG0COUNT(cdbp, blockcount); 13920 return (0); 13921 } else if (cp->sc_grpcode == CDB_GROUP5) { 13922 FORMG5ADDR(cdbp, lba); 13923 FORMG5COUNT(cdbp, blockcount); 13924 return (0); 13925 } 13926 13927 /* 13928 * It should be impossible to not match one 13929 * of the CDB types above, so we should never 13930 * reach this point. Set the CDB command byte 13931 * to test-unit-ready to avoid writing 13932 * to somewhere we don't intend. 13933 */ 13934 cdbp->scc_cmd = SCMD_TEST_UNIT_READY; 13935 return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL); 13936 } else { 13937 /* 13938 * Couldn't get scsi_pkt 13939 */ 13940 return (SD_PKT_ALLOC_FAILURE); 13941 } 13942 } 13943 } 13944 13945 /* 13946 * None of the available CDB types were suitable. This really 13947 * should never happen: on a 64 bit system we support 13948 * READ16/WRITE16 which will hold an entire 64 bit disk address 13949 * and on a 32 bit system we will refuse to bind to a device 13950 * larger than 2TB so addresses will never be larger than 32 bits. 13951 */ 13952 return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL); 13953 } 13954 13955 /* 13956 * Function: sd_setup_next_rw_pkt 13957 * 13958 * Description: Setup packet for partial DMA transfers, except for the 13959 * initial transfer. sd_setup_rw_pkt should be used for 13960 * the initial transfer. 13961 * 13962 * Context: Kernel thread and may be called from interrupt context. 13963 */ 13964 13965 int 13966 sd_setup_next_rw_pkt(struct sd_lun *un, 13967 struct scsi_pkt *pktp, struct buf *bp, 13968 diskaddr_t lba, uint32_t blockcount) 13969 { 13970 uchar_t com; 13971 union scsi_cdb *cdbp; 13972 uchar_t cdb_group_id; 13973 13974 ASSERT(pktp != NULL); 13975 ASSERT(pktp->pkt_cdbp != NULL); 13976 13977 cdbp = (union scsi_cdb *)pktp->pkt_cdbp; 13978 com = cdbp->scc_cmd; 13979 cdb_group_id = CDB_GROUPID(com); 13980 13981 ASSERT((cdb_group_id == CDB_GROUPID_0) || 13982 (cdb_group_id == CDB_GROUPID_1) || 13983 (cdb_group_id == CDB_GROUPID_4) || 13984 (cdb_group_id == CDB_GROUPID_5)); 13985 13986 /* 13987 * Move pkt to the next portion of the xfer. 13988 * func is NULL_FUNC so we do not have to release 13989 * the disk mutex here. 13990 */ 13991 if (scsi_init_pkt(SD_ADDRESS(un), pktp, bp, 0, 0, 0, 0, 13992 NULL_FUNC, NULL) == pktp) { 13993 /* Success. Handle partial DMA */ 13994 if (pktp->pkt_resid != 0) { 13995 blockcount -= 13996 SD_BYTES2TGTBLOCKS(un, pktp->pkt_resid); 13997 } 13998 13999 cdbp->scc_cmd = com; 14000 SD_FILL_SCSI1_LUN(un, pktp); 14001 if (cdb_group_id == CDB_GROUPID_1) { 14002 FORMG1ADDR(cdbp, lba); 14003 FORMG1COUNT(cdbp, blockcount); 14004 return (0); 14005 } else if (cdb_group_id == CDB_GROUPID_4) { 14006 FORMG4LONGADDR(cdbp, lba); 14007 FORMG4COUNT(cdbp, blockcount); 14008 return (0); 14009 } else if (cdb_group_id == CDB_GROUPID_0) { 14010 FORMG0ADDR(cdbp, lba); 14011 FORMG0COUNT(cdbp, blockcount); 14012 return (0); 14013 } else if (cdb_group_id == CDB_GROUPID_5) { 14014 FORMG5ADDR(cdbp, lba); 14015 FORMG5COUNT(cdbp, blockcount); 14016 return (0); 14017 } 14018 14019 /* Unreachable */ 14020 return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL); 14021 } 14022 14023 /* 14024 * Error setting up next portion of cmd transfer. 14025 * Something is definitely very wrong and this 14026 * should not happen. 14027 */ 14028 return (SD_PKT_ALLOC_FAILURE); 14029 } 14030 14031 /* 14032 * Function: sd_initpkt_for_uscsi 14033 * 14034 * Description: Allocate and initialize for transport a scsi_pkt struct, 14035 * based upon the info specified in the given uscsi_cmd struct. 14036 * 14037 * Return Code: SD_PKT_ALLOC_SUCCESS 14038 * SD_PKT_ALLOC_FAILURE 14039 * SD_PKT_ALLOC_FAILURE_NO_DMA 14040 * SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL 14041 * 14042 * Context: Kernel thread and may be called from software interrupt context 14043 * as part of a sdrunout callback. This function may not block or 14044 * call routines that block 14045 */ 14046 14047 static int 14048 sd_initpkt_for_uscsi(struct buf *bp, struct scsi_pkt **pktpp) 14049 { 14050 struct uscsi_cmd *uscmd; 14051 struct sd_xbuf *xp; 14052 struct scsi_pkt *pktp; 14053 struct sd_lun *un; 14054 uint32_t flags = 0; 14055 14056 ASSERT(bp != NULL); 14057 ASSERT(pktpp != NULL); 14058 xp = SD_GET_XBUF(bp); 14059 ASSERT(xp != NULL); 14060 un = SD_GET_UN(bp); 14061 ASSERT(un != NULL); 14062 ASSERT(mutex_owned(SD_MUTEX(un))); 14063 14064 /* The pointer to the uscsi_cmd struct is expected in xb_pktinfo */ 14065 uscmd = (struct uscsi_cmd *)xp->xb_pktinfo; 14066 ASSERT(uscmd != NULL); 14067 14068 SD_TRACE(SD_LOG_IO_CORE, un, 14069 "sd_initpkt_for_uscsi: entry: buf:0x%p\n", bp); 14070 14071 /* 14072 * Allocate the scsi_pkt for the command. 14073 * Note: If PKT_DMA_PARTIAL flag is set, scsi_vhci binds a path 14074 * during scsi_init_pkt time and will continue to use the 14075 * same path as long as the same scsi_pkt is used without 14076 * intervening scsi_dma_free(). Since uscsi command does 14077 * not call scsi_dmafree() before retry failed command, it 14078 * is necessary to make sure PKT_DMA_PARTIAL flag is NOT 14079 * set such that scsi_vhci can use other available path for 14080 * retry. Besides, ucsci command does not allow DMA breakup, 14081 * so there is no need to set PKT_DMA_PARTIAL flag. 14082 */ 14083 if (uscmd->uscsi_rqlen > SENSE_LENGTH) { 14084 pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, 14085 ((bp->b_bcount != 0) ? bp : NULL), uscmd->uscsi_cdblen, 14086 ((int)(uscmd->uscsi_rqlen) + sizeof (struct scsi_arq_status) 14087 - sizeof (struct scsi_extended_sense)), 0, 14088 (un->un_pkt_flags & ~PKT_DMA_PARTIAL) | PKT_XARQ, 14089 sdrunout, (caddr_t)un); 14090 } else { 14091 pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, 14092 ((bp->b_bcount != 0) ? bp : NULL), uscmd->uscsi_cdblen, 14093 sizeof (struct scsi_arq_status), 0, 14094 (un->un_pkt_flags & ~PKT_DMA_PARTIAL), 14095 sdrunout, (caddr_t)un); 14096 } 14097 14098 if (pktp == NULL) { 14099 *pktpp = NULL; 14100 /* 14101 * Set the driver state to RWAIT to indicate the driver 14102 * is waiting on resource allocations. The driver will not 14103 * suspend, pm_suspend, or detatch while the state is RWAIT. 14104 */ 14105 New_state(un, SD_STATE_RWAIT); 14106 14107 SD_ERROR(SD_LOG_IO_CORE, un, 14108 "sd_initpkt_for_uscsi: No pktp. exit bp:0x%p\n", bp); 14109 14110 if ((bp->b_flags & B_ERROR) != 0) { 14111 return (SD_PKT_ALLOC_FAILURE_NO_DMA); 14112 } 14113 return (SD_PKT_ALLOC_FAILURE); 14114 } 14115 14116 /* 14117 * We do not do DMA breakup for USCSI commands, so return failure 14118 * here if all the needed DMA resources were not allocated. 14119 */ 14120 if ((un->un_pkt_flags & PKT_DMA_PARTIAL) && 14121 (bp->b_bcount != 0) && (pktp->pkt_resid != 0)) { 14122 scsi_destroy_pkt(pktp); 14123 SD_ERROR(SD_LOG_IO_CORE, un, "sd_initpkt_for_uscsi: " 14124 "No partial DMA for USCSI. exit: buf:0x%p\n", bp); 14125 return (SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL); 14126 } 14127 14128 /* Init the cdb from the given uscsi struct */ 14129 (void) scsi_setup_cdb((union scsi_cdb *)pktp->pkt_cdbp, 14130 uscmd->uscsi_cdb[0], 0, 0, 0); 14131 14132 SD_FILL_SCSI1_LUN(un, pktp); 14133 14134 /* 14135 * Set up the optional USCSI flags. See the uscsi (7I) man page 14136 * for listing of the supported flags. 14137 */ 14138 14139 if (uscmd->uscsi_flags & USCSI_SILENT) { 14140 flags |= FLAG_SILENT; 14141 } 14142 14143 if (uscmd->uscsi_flags & USCSI_DIAGNOSE) { 14144 flags |= FLAG_DIAGNOSE; 14145 } 14146 14147 if (uscmd->uscsi_flags & USCSI_ISOLATE) { 14148 flags |= FLAG_ISOLATE; 14149 } 14150 14151 if (un->un_f_is_fibre == FALSE) { 14152 if (uscmd->uscsi_flags & USCSI_RENEGOT) { 14153 flags |= FLAG_RENEGOTIATE_WIDE_SYNC; 14154 } 14155 } 14156 14157 /* 14158 * Set the pkt flags here so we save time later. 14159 * Note: These flags are NOT in the uscsi man page!!! 14160 */ 14161 if (uscmd->uscsi_flags & USCSI_HEAD) { 14162 flags |= FLAG_HEAD; 14163 } 14164 14165 if (uscmd->uscsi_flags & USCSI_NOINTR) { 14166 flags |= FLAG_NOINTR; 14167 } 14168 14169 /* 14170 * For tagged queueing, things get a bit complicated. 14171 * Check first for head of queue and last for ordered queue. 14172 * If neither head nor order, use the default driver tag flags. 14173 */ 14174 if ((uscmd->uscsi_flags & USCSI_NOTAG) == 0) { 14175 if (uscmd->uscsi_flags & USCSI_HTAG) { 14176 flags |= FLAG_HTAG; 14177 } else if (uscmd->uscsi_flags & USCSI_OTAG) { 14178 flags |= FLAG_OTAG; 14179 } else { 14180 flags |= un->un_tagflags & FLAG_TAGMASK; 14181 } 14182 } 14183 14184 if (uscmd->uscsi_flags & USCSI_NODISCON) { 14185 flags = (flags & ~FLAG_TAGMASK) | FLAG_NODISCON; 14186 } 14187 14188 pktp->pkt_flags = flags; 14189 14190 /* Transfer uscsi information to scsi_pkt */ 14191 (void) scsi_uscsi_pktinit(uscmd, pktp); 14192 14193 /* Copy the caller's CDB into the pkt... */ 14194 bcopy(uscmd->uscsi_cdb, pktp->pkt_cdbp, uscmd->uscsi_cdblen); 14195 14196 if (uscmd->uscsi_timeout == 0) { 14197 pktp->pkt_time = un->un_uscsi_timeout; 14198 } else { 14199 pktp->pkt_time = uscmd->uscsi_timeout; 14200 } 14201 14202 /* need it later to identify USCSI request in sdintr */ 14203 xp->xb_pkt_flags |= SD_XB_USCSICMD; 14204 14205 xp->xb_sense_resid = uscmd->uscsi_rqresid; 14206 14207 pktp->pkt_private = bp; 14208 pktp->pkt_comp = sdintr; 14209 *pktpp = pktp; 14210 14211 SD_TRACE(SD_LOG_IO_CORE, un, 14212 "sd_initpkt_for_uscsi: exit: buf:0x%p\n", bp); 14213 14214 return (SD_PKT_ALLOC_SUCCESS); 14215 } 14216 14217 14218 /* 14219 * Function: sd_destroypkt_for_uscsi 14220 * 14221 * Description: Free the scsi_pkt(9S) struct for the given bp, for uscsi 14222 * IOs.. Also saves relevant info into the associated uscsi_cmd 14223 * struct. 14224 * 14225 * Context: May be called under interrupt context 14226 */ 14227 14228 static void 14229 sd_destroypkt_for_uscsi(struct buf *bp) 14230 { 14231 struct uscsi_cmd *uscmd; 14232 struct sd_xbuf *xp; 14233 struct scsi_pkt *pktp; 14234 struct sd_lun *un; 14235 struct sd_uscsi_info *suip; 14236 14237 ASSERT(bp != NULL); 14238 xp = SD_GET_XBUF(bp); 14239 ASSERT(xp != NULL); 14240 un = SD_GET_UN(bp); 14241 ASSERT(un != NULL); 14242 ASSERT(!mutex_owned(SD_MUTEX(un))); 14243 pktp = SD_GET_PKTP(bp); 14244 ASSERT(pktp != NULL); 14245 14246 SD_TRACE(SD_LOG_IO_CORE, un, 14247 "sd_destroypkt_for_uscsi: entry: buf:0x%p\n", bp); 14248 14249 /* The pointer to the uscsi_cmd struct is expected in xb_pktinfo */ 14250 uscmd = (struct uscsi_cmd *)xp->xb_pktinfo; 14251 ASSERT(uscmd != NULL); 14252 14253 /* Save the status and the residual into the uscsi_cmd struct */ 14254 uscmd->uscsi_status = ((*(pktp)->pkt_scbp) & STATUS_MASK); 14255 uscmd->uscsi_resid = bp->b_resid; 14256 14257 /* Transfer scsi_pkt information to uscsi */ 14258 (void) scsi_uscsi_pktfini(pktp, uscmd); 14259 14260 /* 14261 * If enabled, copy any saved sense data into the area specified 14262 * by the uscsi command. 14263 */ 14264 if (((uscmd->uscsi_flags & USCSI_RQENABLE) != 0) && 14265 (uscmd->uscsi_rqlen != 0) && (uscmd->uscsi_rqbuf != NULL)) { 14266 /* 14267 * Note: uscmd->uscsi_rqbuf should always point to a buffer 14268 * at least SENSE_LENGTH bytes in size (see sd_send_scsi_cmd()) 14269 */ 14270 uscmd->uscsi_rqstatus = xp->xb_sense_status; 14271 uscmd->uscsi_rqresid = xp->xb_sense_resid; 14272 if (uscmd->uscsi_rqlen > SENSE_LENGTH) { 14273 bcopy(xp->xb_sense_data, uscmd->uscsi_rqbuf, 14274 MAX_SENSE_LENGTH); 14275 } else { 14276 bcopy(xp->xb_sense_data, uscmd->uscsi_rqbuf, 14277 SENSE_LENGTH); 14278 } 14279 } 14280 /* 14281 * The following assignments are for SCSI FMA. 14282 */ 14283 ASSERT(xp->xb_private != NULL); 14284 suip = (struct sd_uscsi_info *)xp->xb_private; 14285 suip->ui_pkt_reason = pktp->pkt_reason; 14286 suip->ui_pkt_state = pktp->pkt_state; 14287 suip->ui_pkt_statistics = pktp->pkt_statistics; 14288 suip->ui_lba = (uint64_t)SD_GET_BLKNO(bp); 14289 14290 /* We are done with the scsi_pkt; free it now */ 14291 ASSERT(SD_GET_PKTP(bp) != NULL); 14292 scsi_destroy_pkt(SD_GET_PKTP(bp)); 14293 14294 SD_TRACE(SD_LOG_IO_CORE, un, 14295 "sd_destroypkt_for_uscsi: exit: buf:0x%p\n", bp); 14296 } 14297 14298 14299 /* 14300 * Function: sd_bioclone_alloc 14301 * 14302 * Description: Allocate a buf(9S) and init it as per the given buf 14303 * and the various arguments. The associated sd_xbuf 14304 * struct is (nearly) duplicated. The struct buf *bp 14305 * argument is saved in new_xp->xb_private. 14306 * 14307 * Arguments: bp - ptr the the buf(9S) to be "shadowed" 14308 * datalen - size of data area for the shadow bp 14309 * blkno - starting LBA 14310 * func - function pointer for b_iodone in the shadow buf. (May 14311 * be NULL if none.) 14312 * 14313 * Return Code: Pointer to allocates buf(9S) struct 14314 * 14315 * Context: Can sleep. 14316 */ 14317 14318 static struct buf * 14319 sd_bioclone_alloc(struct buf *bp, size_t datalen, daddr_t blkno, 14320 int (*func)(struct buf *)) 14321 { 14322 struct sd_lun *un; 14323 struct sd_xbuf *xp; 14324 struct sd_xbuf *new_xp; 14325 struct buf *new_bp; 14326 14327 ASSERT(bp != NULL); 14328 xp = SD_GET_XBUF(bp); 14329 ASSERT(xp != NULL); 14330 un = SD_GET_UN(bp); 14331 ASSERT(un != NULL); 14332 ASSERT(!mutex_owned(SD_MUTEX(un))); 14333 14334 new_bp = bioclone(bp, 0, datalen, SD_GET_DEV(un), blkno, func, 14335 NULL, KM_SLEEP); 14336 14337 new_bp->b_lblkno = blkno; 14338 14339 /* 14340 * Allocate an xbuf for the shadow bp and copy the contents of the 14341 * original xbuf into it. 14342 */ 14343 new_xp = kmem_alloc(sizeof (struct sd_xbuf), KM_SLEEP); 14344 bcopy(xp, new_xp, sizeof (struct sd_xbuf)); 14345 14346 /* 14347 * The given bp is automatically saved in the xb_private member 14348 * of the new xbuf. Callers are allowed to depend on this. 14349 */ 14350 new_xp->xb_private = bp; 14351 14352 new_bp->b_private = new_xp; 14353 14354 return (new_bp); 14355 } 14356 14357 /* 14358 * Function: sd_shadow_buf_alloc 14359 * 14360 * Description: Allocate a buf(9S) and init it as per the given buf 14361 * and the various arguments. The associated sd_xbuf 14362 * struct is (nearly) duplicated. The struct buf *bp 14363 * argument is saved in new_xp->xb_private. 14364 * 14365 * Arguments: bp - ptr the the buf(9S) to be "shadowed" 14366 * datalen - size of data area for the shadow bp 14367 * bflags - B_READ or B_WRITE (pseudo flag) 14368 * blkno - starting LBA 14369 * func - function pointer for b_iodone in the shadow buf. (May 14370 * be NULL if none.) 14371 * 14372 * Return Code: Pointer to allocates buf(9S) struct 14373 * 14374 * Context: Can sleep. 14375 */ 14376 14377 static struct buf * 14378 sd_shadow_buf_alloc(struct buf *bp, size_t datalen, uint_t bflags, 14379 daddr_t blkno, int (*func)(struct buf *)) 14380 { 14381 struct sd_lun *un; 14382 struct sd_xbuf *xp; 14383 struct sd_xbuf *new_xp; 14384 struct buf *new_bp; 14385 14386 ASSERT(bp != NULL); 14387 xp = SD_GET_XBUF(bp); 14388 ASSERT(xp != NULL); 14389 un = SD_GET_UN(bp); 14390 ASSERT(un != NULL); 14391 ASSERT(!mutex_owned(SD_MUTEX(un))); 14392 14393 if (bp->b_flags & (B_PAGEIO | B_PHYS)) { 14394 bp_mapin(bp); 14395 } 14396 14397 bflags &= (B_READ | B_WRITE); 14398 #if defined(__i386) || defined(__amd64) 14399 new_bp = getrbuf(KM_SLEEP); 14400 new_bp->b_un.b_addr = kmem_zalloc(datalen, KM_SLEEP); 14401 new_bp->b_bcount = datalen; 14402 new_bp->b_flags = bflags | 14403 (bp->b_flags & ~(B_PAGEIO | B_PHYS | B_REMAPPED | B_SHADOW)); 14404 #else 14405 new_bp = scsi_alloc_consistent_buf(SD_ADDRESS(un), NULL, 14406 datalen, bflags, SLEEP_FUNC, NULL); 14407 #endif 14408 new_bp->av_forw = NULL; 14409 new_bp->av_back = NULL; 14410 new_bp->b_dev = bp->b_dev; 14411 new_bp->b_blkno = blkno; 14412 new_bp->b_iodone = func; 14413 new_bp->b_edev = bp->b_edev; 14414 new_bp->b_resid = 0; 14415 14416 /* We need to preserve the B_FAILFAST flag */ 14417 if (bp->b_flags & B_FAILFAST) { 14418 new_bp->b_flags |= B_FAILFAST; 14419 } 14420 14421 /* 14422 * Allocate an xbuf for the shadow bp and copy the contents of the 14423 * original xbuf into it. 14424 */ 14425 new_xp = kmem_alloc(sizeof (struct sd_xbuf), KM_SLEEP); 14426 bcopy(xp, new_xp, sizeof (struct sd_xbuf)); 14427 14428 /* Need later to copy data between the shadow buf & original buf! */ 14429 new_xp->xb_pkt_flags |= PKT_CONSISTENT; 14430 14431 /* 14432 * The given bp is automatically saved in the xb_private member 14433 * of the new xbuf. Callers are allowed to depend on this. 14434 */ 14435 new_xp->xb_private = bp; 14436 14437 new_bp->b_private = new_xp; 14438 14439 return (new_bp); 14440 } 14441 14442 /* 14443 * Function: sd_bioclone_free 14444 * 14445 * Description: Deallocate a buf(9S) that was used for 'shadow' IO operations 14446 * in the larger than partition operation. 14447 * 14448 * Context: May be called under interrupt context 14449 */ 14450 14451 static void 14452 sd_bioclone_free(struct buf *bp) 14453 { 14454 struct sd_xbuf *xp; 14455 14456 ASSERT(bp != NULL); 14457 xp = SD_GET_XBUF(bp); 14458 ASSERT(xp != NULL); 14459 14460 /* 14461 * Call bp_mapout() before freeing the buf, in case a lower 14462 * layer or HBA had done a bp_mapin(). we must do this here 14463 * as we are the "originator" of the shadow buf. 14464 */ 14465 bp_mapout(bp); 14466 14467 /* 14468 * Null out b_iodone before freeing the bp, to ensure that the driver 14469 * never gets confused by a stale value in this field. (Just a little 14470 * extra defensiveness here.) 14471 */ 14472 bp->b_iodone = NULL; 14473 14474 freerbuf(bp); 14475 14476 kmem_free(xp, sizeof (struct sd_xbuf)); 14477 } 14478 14479 /* 14480 * Function: sd_shadow_buf_free 14481 * 14482 * Description: Deallocate a buf(9S) that was used for 'shadow' IO operations. 14483 * 14484 * Context: May be called under interrupt context 14485 */ 14486 14487 static void 14488 sd_shadow_buf_free(struct buf *bp) 14489 { 14490 struct sd_xbuf *xp; 14491 14492 ASSERT(bp != NULL); 14493 xp = SD_GET_XBUF(bp); 14494 ASSERT(xp != NULL); 14495 14496 #if defined(__sparc) 14497 /* 14498 * Call bp_mapout() before freeing the buf, in case a lower 14499 * layer or HBA had done a bp_mapin(). we must do this here 14500 * as we are the "originator" of the shadow buf. 14501 */ 14502 bp_mapout(bp); 14503 #endif 14504 14505 /* 14506 * Null out b_iodone before freeing the bp, to ensure that the driver 14507 * never gets confused by a stale value in this field. (Just a little 14508 * extra defensiveness here.) 14509 */ 14510 bp->b_iodone = NULL; 14511 14512 #if defined(__i386) || defined(__amd64) 14513 kmem_free(bp->b_un.b_addr, bp->b_bcount); 14514 freerbuf(bp); 14515 #else 14516 scsi_free_consistent_buf(bp); 14517 #endif 14518 14519 kmem_free(xp, sizeof (struct sd_xbuf)); 14520 } 14521 14522 14523 /* 14524 * Function: sd_print_transport_rejected_message 14525 * 14526 * Description: This implements the ludicrously complex rules for printing 14527 * a "transport rejected" message. This is to address the 14528 * specific problem of having a flood of this error message 14529 * produced when a failover occurs. 14530 * 14531 * Context: Any. 14532 */ 14533 14534 static void 14535 sd_print_transport_rejected_message(struct sd_lun *un, struct sd_xbuf *xp, 14536 int code) 14537 { 14538 ASSERT(un != NULL); 14539 ASSERT(mutex_owned(SD_MUTEX(un))); 14540 ASSERT(xp != NULL); 14541 14542 /* 14543 * Print the "transport rejected" message under the following 14544 * conditions: 14545 * 14546 * - Whenever the SD_LOGMASK_DIAG bit of sd_level_mask is set 14547 * - The error code from scsi_transport() is NOT a TRAN_FATAL_ERROR. 14548 * - If the error code IS a TRAN_FATAL_ERROR, then the message is 14549 * printed the FIRST time a TRAN_FATAL_ERROR is returned from 14550 * scsi_transport(9F) (which indicates that the target might have 14551 * gone off-line). This uses the un->un_tran_fatal_count 14552 * count, which is incremented whenever a TRAN_FATAL_ERROR is 14553 * received, and reset to zero whenver a TRAN_ACCEPT is returned 14554 * from scsi_transport(). 14555 * 14556 * The FLAG_SILENT in the scsi_pkt must be CLEARED in ALL of 14557 * the preceeding cases in order for the message to be printed. 14558 */ 14559 if (((xp->xb_pktp->pkt_flags & FLAG_SILENT) == 0) && 14560 (SD_FM_LOG(un) == SD_FM_LOG_NSUP)) { 14561 if ((sd_level_mask & SD_LOGMASK_DIAG) || 14562 (code != TRAN_FATAL_ERROR) || 14563 (un->un_tran_fatal_count == 1)) { 14564 switch (code) { 14565 case TRAN_BADPKT: 14566 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 14567 "transport rejected bad packet\n"); 14568 break; 14569 case TRAN_FATAL_ERROR: 14570 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 14571 "transport rejected fatal error\n"); 14572 break; 14573 default: 14574 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 14575 "transport rejected (%d)\n", code); 14576 break; 14577 } 14578 } 14579 } 14580 } 14581 14582 14583 /* 14584 * Function: sd_add_buf_to_waitq 14585 * 14586 * Description: Add the given buf(9S) struct to the wait queue for the 14587 * instance. If sorting is enabled, then the buf is added 14588 * to the queue via an elevator sort algorithm (a la 14589 * disksort(9F)). The SD_GET_BLKNO(bp) is used as the sort key. 14590 * If sorting is not enabled, then the buf is just added 14591 * to the end of the wait queue. 14592 * 14593 * Return Code: void 14594 * 14595 * Context: Does not sleep/block, therefore technically can be called 14596 * from any context. However if sorting is enabled then the 14597 * execution time is indeterminate, and may take long if 14598 * the wait queue grows large. 14599 */ 14600 14601 static void 14602 sd_add_buf_to_waitq(struct sd_lun *un, struct buf *bp) 14603 { 14604 struct buf *ap; 14605 14606 ASSERT(bp != NULL); 14607 ASSERT(un != NULL); 14608 ASSERT(mutex_owned(SD_MUTEX(un))); 14609 14610 /* If the queue is empty, add the buf as the only entry & return. */ 14611 if (un->un_waitq_headp == NULL) { 14612 ASSERT(un->un_waitq_tailp == NULL); 14613 un->un_waitq_headp = un->un_waitq_tailp = bp; 14614 bp->av_forw = NULL; 14615 return; 14616 } 14617 14618 ASSERT(un->un_waitq_tailp != NULL); 14619 14620 /* 14621 * If sorting is disabled, just add the buf to the tail end of 14622 * the wait queue and return. 14623 */ 14624 if (un->un_f_disksort_disabled || un->un_f_enable_rmw) { 14625 un->un_waitq_tailp->av_forw = bp; 14626 un->un_waitq_tailp = bp; 14627 bp->av_forw = NULL; 14628 return; 14629 } 14630 14631 /* 14632 * Sort thru the list of requests currently on the wait queue 14633 * and add the new buf request at the appropriate position. 14634 * 14635 * The un->un_waitq_headp is an activity chain pointer on which 14636 * we keep two queues, sorted in ascending SD_GET_BLKNO() order. The 14637 * first queue holds those requests which are positioned after 14638 * the current SD_GET_BLKNO() (in the first request); the second holds 14639 * requests which came in after their SD_GET_BLKNO() number was passed. 14640 * Thus we implement a one way scan, retracting after reaching 14641 * the end of the drive to the first request on the second 14642 * queue, at which time it becomes the first queue. 14643 * A one-way scan is natural because of the way UNIX read-ahead 14644 * blocks are allocated. 14645 * 14646 * If we lie after the first request, then we must locate the 14647 * second request list and add ourselves to it. 14648 */ 14649 ap = un->un_waitq_headp; 14650 if (SD_GET_BLKNO(bp) < SD_GET_BLKNO(ap)) { 14651 while (ap->av_forw != NULL) { 14652 /* 14653 * Look for an "inversion" in the (normally 14654 * ascending) block numbers. This indicates 14655 * the start of the second request list. 14656 */ 14657 if (SD_GET_BLKNO(ap->av_forw) < SD_GET_BLKNO(ap)) { 14658 /* 14659 * Search the second request list for the 14660 * first request at a larger block number. 14661 * We go before that; however if there is 14662 * no such request, we go at the end. 14663 */ 14664 do { 14665 if (SD_GET_BLKNO(bp) < 14666 SD_GET_BLKNO(ap->av_forw)) { 14667 goto insert; 14668 } 14669 ap = ap->av_forw; 14670 } while (ap->av_forw != NULL); 14671 goto insert; /* after last */ 14672 } 14673 ap = ap->av_forw; 14674 } 14675 14676 /* 14677 * No inversions... we will go after the last, and 14678 * be the first request in the second request list. 14679 */ 14680 goto insert; 14681 } 14682 14683 /* 14684 * Request is at/after the current request... 14685 * sort in the first request list. 14686 */ 14687 while (ap->av_forw != NULL) { 14688 /* 14689 * We want to go after the current request (1) if 14690 * there is an inversion after it (i.e. it is the end 14691 * of the first request list), or (2) if the next 14692 * request is a larger block no. than our request. 14693 */ 14694 if ((SD_GET_BLKNO(ap->av_forw) < SD_GET_BLKNO(ap)) || 14695 (SD_GET_BLKNO(bp) < SD_GET_BLKNO(ap->av_forw))) { 14696 goto insert; 14697 } 14698 ap = ap->av_forw; 14699 } 14700 14701 /* 14702 * Neither a second list nor a larger request, therefore 14703 * we go at the end of the first list (which is the same 14704 * as the end of the whole schebang). 14705 */ 14706 insert: 14707 bp->av_forw = ap->av_forw; 14708 ap->av_forw = bp; 14709 14710 /* 14711 * If we inserted onto the tail end of the waitq, make sure the 14712 * tail pointer is updated. 14713 */ 14714 if (ap == un->un_waitq_tailp) { 14715 un->un_waitq_tailp = bp; 14716 } 14717 } 14718 14719 14720 /* 14721 * Function: sd_start_cmds 14722 * 14723 * Description: Remove and transport cmds from the driver queues. 14724 * 14725 * Arguments: un - pointer to the unit (soft state) struct for the target. 14726 * 14727 * immed_bp - ptr to a buf to be transported immediately. Only 14728 * the immed_bp is transported; bufs on the waitq are not 14729 * processed and the un_retry_bp is not checked. If immed_bp is 14730 * NULL, then normal queue processing is performed. 14731 * 14732 * Context: May be called from kernel thread context, interrupt context, 14733 * or runout callback context. This function may not block or 14734 * call routines that block. 14735 */ 14736 14737 static void 14738 sd_start_cmds(struct sd_lun *un, struct buf *immed_bp) 14739 { 14740 struct sd_xbuf *xp; 14741 struct buf *bp; 14742 void (*statp)(kstat_io_t *); 14743 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 14744 void (*saved_statp)(kstat_io_t *); 14745 #endif 14746 int rval; 14747 struct sd_fm_internal *sfip = NULL; 14748 14749 ASSERT(un != NULL); 14750 ASSERT(mutex_owned(SD_MUTEX(un))); 14751 ASSERT(un->un_ncmds_in_transport >= 0); 14752 ASSERT(un->un_throttle >= 0); 14753 14754 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_start_cmds: entry\n"); 14755 14756 do { 14757 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 14758 saved_statp = NULL; 14759 #endif 14760 14761 /* 14762 * If we are syncing or dumping, fail the command to 14763 * avoid recursively calling back into scsi_transport(). 14764 * The dump I/O itself uses a separate code path so this 14765 * only prevents non-dump I/O from being sent while dumping. 14766 * File system sync takes place before dumping begins. 14767 * During panic, filesystem I/O is allowed provided 14768 * un_in_callback is <= 1. This is to prevent recursion 14769 * such as sd_start_cmds -> scsi_transport -> sdintr -> 14770 * sd_start_cmds and so on. See panic.c for more information 14771 * about the states the system can be in during panic. 14772 */ 14773 if ((un->un_state == SD_STATE_DUMPING) || 14774 (ddi_in_panic() && (un->un_in_callback > 1))) { 14775 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 14776 "sd_start_cmds: panicking\n"); 14777 goto exit; 14778 } 14779 14780 if ((bp = immed_bp) != NULL) { 14781 /* 14782 * We have a bp that must be transported immediately. 14783 * It's OK to transport the immed_bp here without doing 14784 * the throttle limit check because the immed_bp is 14785 * always used in a retry/recovery case. This means 14786 * that we know we are not at the throttle limit by 14787 * virtue of the fact that to get here we must have 14788 * already gotten a command back via sdintr(). This also 14789 * relies on (1) the command on un_retry_bp preventing 14790 * further commands from the waitq from being issued; 14791 * and (2) the code in sd_retry_command checking the 14792 * throttle limit before issuing a delayed or immediate 14793 * retry. This holds even if the throttle limit is 14794 * currently ratcheted down from its maximum value. 14795 */ 14796 statp = kstat_runq_enter; 14797 if (bp == un->un_retry_bp) { 14798 ASSERT((un->un_retry_statp == NULL) || 14799 (un->un_retry_statp == kstat_waitq_enter) || 14800 (un->un_retry_statp == 14801 kstat_runq_back_to_waitq)); 14802 /* 14803 * If the waitq kstat was incremented when 14804 * sd_set_retry_bp() queued this bp for a retry, 14805 * then we must set up statp so that the waitq 14806 * count will get decremented correctly below. 14807 * Also we must clear un->un_retry_statp to 14808 * ensure that we do not act on a stale value 14809 * in this field. 14810 */ 14811 if ((un->un_retry_statp == kstat_waitq_enter) || 14812 (un->un_retry_statp == 14813 kstat_runq_back_to_waitq)) { 14814 statp = kstat_waitq_to_runq; 14815 } 14816 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 14817 saved_statp = un->un_retry_statp; 14818 #endif 14819 un->un_retry_statp = NULL; 14820 14821 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, 14822 "sd_start_cmds: un:0x%p: GOT retry_bp:0x%p " 14823 "un_throttle:%d un_ncmds_in_transport:%d\n", 14824 un, un->un_retry_bp, un->un_throttle, 14825 un->un_ncmds_in_transport); 14826 } else { 14827 SD_TRACE(SD_LOG_IO_CORE, un, "sd_start_cmds: " 14828 "processing priority bp:0x%p\n", bp); 14829 } 14830 14831 } else if ((bp = un->un_waitq_headp) != NULL) { 14832 /* 14833 * A command on the waitq is ready to go, but do not 14834 * send it if: 14835 * 14836 * (1) the throttle limit has been reached, or 14837 * (2) a retry is pending, or 14838 * (3) a START_STOP_UNIT callback pending, or 14839 * (4) a callback for a SD_PATH_DIRECT_PRIORITY 14840 * command is pending. 14841 * 14842 * For all of these conditions, IO processing will 14843 * restart after the condition is cleared. 14844 */ 14845 if (un->un_ncmds_in_transport >= un->un_throttle) { 14846 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 14847 "sd_start_cmds: exiting, " 14848 "throttle limit reached!\n"); 14849 goto exit; 14850 } 14851 if (un->un_retry_bp != NULL) { 14852 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 14853 "sd_start_cmds: exiting, retry pending!\n"); 14854 goto exit; 14855 } 14856 if (un->un_startstop_timeid != NULL) { 14857 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 14858 "sd_start_cmds: exiting, " 14859 "START_STOP pending!\n"); 14860 goto exit; 14861 } 14862 if (un->un_direct_priority_timeid != NULL) { 14863 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 14864 "sd_start_cmds: exiting, " 14865 "SD_PATH_DIRECT_PRIORITY cmd. pending!\n"); 14866 goto exit; 14867 } 14868 14869 /* Dequeue the command */ 14870 un->un_waitq_headp = bp->av_forw; 14871 if (un->un_waitq_headp == NULL) { 14872 un->un_waitq_tailp = NULL; 14873 } 14874 bp->av_forw = NULL; 14875 statp = kstat_waitq_to_runq; 14876 SD_TRACE(SD_LOG_IO_CORE, un, 14877 "sd_start_cmds: processing waitq bp:0x%p\n", bp); 14878 14879 } else { 14880 /* No work to do so bail out now */ 14881 SD_TRACE(SD_LOG_IO_CORE, un, 14882 "sd_start_cmds: no more work, exiting!\n"); 14883 goto exit; 14884 } 14885 14886 /* 14887 * Reset the state to normal. This is the mechanism by which 14888 * the state transitions from either SD_STATE_RWAIT or 14889 * SD_STATE_OFFLINE to SD_STATE_NORMAL. 14890 * If state is SD_STATE_PM_CHANGING then this command is 14891 * part of the device power control and the state must 14892 * not be put back to normal. Doing so would would 14893 * allow new commands to proceed when they shouldn't, 14894 * the device may be going off. 14895 */ 14896 if ((un->un_state != SD_STATE_SUSPENDED) && 14897 (un->un_state != SD_STATE_PM_CHANGING)) { 14898 New_state(un, SD_STATE_NORMAL); 14899 } 14900 14901 xp = SD_GET_XBUF(bp); 14902 ASSERT(xp != NULL); 14903 14904 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 14905 /* 14906 * Allocate the scsi_pkt if we need one, or attach DMA 14907 * resources if we have a scsi_pkt that needs them. The 14908 * latter should only occur for commands that are being 14909 * retried. 14910 */ 14911 if ((xp->xb_pktp == NULL) || 14912 ((xp->xb_pkt_flags & SD_XB_DMA_FREED) != 0)) { 14913 #else 14914 if (xp->xb_pktp == NULL) { 14915 #endif 14916 /* 14917 * There is no scsi_pkt allocated for this buf. Call 14918 * the initpkt function to allocate & init one. 14919 * 14920 * The scsi_init_pkt runout callback functionality is 14921 * implemented as follows: 14922 * 14923 * 1) The initpkt function always calls 14924 * scsi_init_pkt(9F) with sdrunout specified as the 14925 * callback routine. 14926 * 2) A successful packet allocation is initialized and 14927 * the I/O is transported. 14928 * 3) The I/O associated with an allocation resource 14929 * failure is left on its queue to be retried via 14930 * runout or the next I/O. 14931 * 4) The I/O associated with a DMA error is removed 14932 * from the queue and failed with EIO. Processing of 14933 * the transport queues is also halted to be 14934 * restarted via runout or the next I/O. 14935 * 5) The I/O associated with a CDB size or packet 14936 * size error is removed from the queue and failed 14937 * with EIO. Processing of the transport queues is 14938 * continued. 14939 * 14940 * Note: there is no interface for canceling a runout 14941 * callback. To prevent the driver from detaching or 14942 * suspending while a runout is pending the driver 14943 * state is set to SD_STATE_RWAIT 14944 * 14945 * Note: using the scsi_init_pkt callback facility can 14946 * result in an I/O request persisting at the head of 14947 * the list which cannot be satisfied even after 14948 * multiple retries. In the future the driver may 14949 * implement some kind of maximum runout count before 14950 * failing an I/O. 14951 * 14952 * Note: the use of funcp below may seem superfluous, 14953 * but it helps warlock figure out the correct 14954 * initpkt function calls (see [s]sd.wlcmd). 14955 */ 14956 struct scsi_pkt *pktp; 14957 int (*funcp)(struct buf *bp, struct scsi_pkt **pktp); 14958 14959 ASSERT(bp != un->un_rqs_bp); 14960 14961 funcp = sd_initpkt_map[xp->xb_chain_iostart]; 14962 switch ((*funcp)(bp, &pktp)) { 14963 case SD_PKT_ALLOC_SUCCESS: 14964 xp->xb_pktp = pktp; 14965 SD_TRACE(SD_LOG_IO_CORE, un, 14966 "sd_start_cmd: SD_PKT_ALLOC_SUCCESS 0x%p\n", 14967 pktp); 14968 goto got_pkt; 14969 14970 case SD_PKT_ALLOC_FAILURE: 14971 /* 14972 * Temporary (hopefully) resource depletion. 14973 * Since retries and RQS commands always have a 14974 * scsi_pkt allocated, these cases should never 14975 * get here. So the only cases this needs to 14976 * handle is a bp from the waitq (which we put 14977 * back onto the waitq for sdrunout), or a bp 14978 * sent as an immed_bp (which we just fail). 14979 */ 14980 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 14981 "sd_start_cmds: SD_PKT_ALLOC_FAILURE\n"); 14982 14983 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 14984 14985 if (bp == immed_bp) { 14986 /* 14987 * If SD_XB_DMA_FREED is clear, then 14988 * this is a failure to allocate a 14989 * scsi_pkt, and we must fail the 14990 * command. 14991 */ 14992 if ((xp->xb_pkt_flags & 14993 SD_XB_DMA_FREED) == 0) { 14994 break; 14995 } 14996 14997 /* 14998 * If this immediate command is NOT our 14999 * un_retry_bp, then we must fail it. 15000 */ 15001 if (bp != un->un_retry_bp) { 15002 break; 15003 } 15004 15005 /* 15006 * We get here if this cmd is our 15007 * un_retry_bp that was DMAFREED, but 15008 * scsi_init_pkt() failed to reallocate 15009 * DMA resources when we attempted to 15010 * retry it. This can happen when an 15011 * mpxio failover is in progress, but 15012 * we don't want to just fail the 15013 * command in this case. 15014 * 15015 * Use timeout(9F) to restart it after 15016 * a 100ms delay. We don't want to 15017 * let sdrunout() restart it, because 15018 * sdrunout() is just supposed to start 15019 * commands that are sitting on the 15020 * wait queue. The un_retry_bp stays 15021 * set until the command completes, but 15022 * sdrunout can be called many times 15023 * before that happens. Since sdrunout 15024 * cannot tell if the un_retry_bp is 15025 * already in the transport, it could 15026 * end up calling scsi_transport() for 15027 * the un_retry_bp multiple times. 15028 * 15029 * Also: don't schedule the callback 15030 * if some other callback is already 15031 * pending. 15032 */ 15033 if (un->un_retry_statp == NULL) { 15034 /* 15035 * restore the kstat pointer to 15036 * keep kstat counts coherent 15037 * when we do retry the command. 15038 */ 15039 un->un_retry_statp = 15040 saved_statp; 15041 } 15042 15043 if ((un->un_startstop_timeid == NULL) && 15044 (un->un_retry_timeid == NULL) && 15045 (un->un_direct_priority_timeid == 15046 NULL)) { 15047 15048 un->un_retry_timeid = 15049 timeout( 15050 sd_start_retry_command, 15051 un, SD_RESTART_TIMEOUT); 15052 } 15053 goto exit; 15054 } 15055 15056 #else 15057 if (bp == immed_bp) { 15058 break; /* Just fail the command */ 15059 } 15060 #endif 15061 15062 /* Add the buf back to the head of the waitq */ 15063 bp->av_forw = un->un_waitq_headp; 15064 un->un_waitq_headp = bp; 15065 if (un->un_waitq_tailp == NULL) { 15066 un->un_waitq_tailp = bp; 15067 } 15068 goto exit; 15069 15070 case SD_PKT_ALLOC_FAILURE_NO_DMA: 15071 /* 15072 * HBA DMA resource failure. Fail the command 15073 * and continue processing of the queues. 15074 */ 15075 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15076 "sd_start_cmds: " 15077 "SD_PKT_ALLOC_FAILURE_NO_DMA\n"); 15078 break; 15079 15080 case SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL: 15081 /* 15082 * Note:x86: Partial DMA mapping not supported 15083 * for USCSI commands, and all the needed DMA 15084 * resources were not allocated. 15085 */ 15086 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15087 "sd_start_cmds: " 15088 "SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL\n"); 15089 break; 15090 15091 case SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL: 15092 /* 15093 * Note:x86: Request cannot fit into CDB based 15094 * on lba and len. 15095 */ 15096 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15097 "sd_start_cmds: " 15098 "SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL\n"); 15099 break; 15100 15101 default: 15102 /* Should NEVER get here! */ 15103 panic("scsi_initpkt error"); 15104 /*NOTREACHED*/ 15105 } 15106 15107 /* 15108 * Fatal error in allocating a scsi_pkt for this buf. 15109 * Update kstats & return the buf with an error code. 15110 * We must use sd_return_failed_command_no_restart() to 15111 * avoid a recursive call back into sd_start_cmds(). 15112 * However this also means that we must keep processing 15113 * the waitq here in order to avoid stalling. 15114 */ 15115 if (statp == kstat_waitq_to_runq) { 15116 SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp); 15117 } 15118 sd_return_failed_command_no_restart(un, bp, EIO); 15119 if (bp == immed_bp) { 15120 /* immed_bp is gone by now, so clear this */ 15121 immed_bp = NULL; 15122 } 15123 continue; 15124 } 15125 got_pkt: 15126 if (bp == immed_bp) { 15127 /* goto the head of the class.... */ 15128 xp->xb_pktp->pkt_flags |= FLAG_HEAD; 15129 } 15130 15131 un->un_ncmds_in_transport++; 15132 SD_UPDATE_KSTATS(un, statp, bp); 15133 15134 /* 15135 * Call scsi_transport() to send the command to the target. 15136 * According to SCSA architecture, we must drop the mutex here 15137 * before calling scsi_transport() in order to avoid deadlock. 15138 * Note that the scsi_pkt's completion routine can be executed 15139 * (from interrupt context) even before the call to 15140 * scsi_transport() returns. 15141 */ 15142 SD_TRACE(SD_LOG_IO_CORE, un, 15143 "sd_start_cmds: calling scsi_transport()\n"); 15144 DTRACE_PROBE1(scsi__transport__dispatch, struct buf *, bp); 15145 15146 mutex_exit(SD_MUTEX(un)); 15147 rval = scsi_transport(xp->xb_pktp); 15148 mutex_enter(SD_MUTEX(un)); 15149 15150 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15151 "sd_start_cmds: scsi_transport() returned %d\n", rval); 15152 15153 switch (rval) { 15154 case TRAN_ACCEPT: 15155 /* Clear this with every pkt accepted by the HBA */ 15156 un->un_tran_fatal_count = 0; 15157 break; /* Success; try the next cmd (if any) */ 15158 15159 case TRAN_BUSY: 15160 un->un_ncmds_in_transport--; 15161 ASSERT(un->un_ncmds_in_transport >= 0); 15162 15163 /* 15164 * Don't retry request sense, the sense data 15165 * is lost when another request is sent. 15166 * Free up the rqs buf and retry 15167 * the original failed cmd. Update kstat. 15168 */ 15169 if (bp == un->un_rqs_bp) { 15170 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp); 15171 bp = sd_mark_rqs_idle(un, xp); 15172 sd_retry_command(un, bp, SD_RETRIES_STANDARD, 15173 NULL, NULL, EIO, un->un_busy_timeout / 500, 15174 kstat_waitq_enter); 15175 goto exit; 15176 } 15177 15178 #if defined(__i386) || defined(__amd64) /* DMAFREE for x86 only */ 15179 /* 15180 * Free the DMA resources for the scsi_pkt. This will 15181 * allow mpxio to select another path the next time 15182 * we call scsi_transport() with this scsi_pkt. 15183 * See sdintr() for the rationalization behind this. 15184 */ 15185 if ((un->un_f_is_fibre == TRUE) && 15186 ((xp->xb_pkt_flags & SD_XB_USCSICMD) == 0) && 15187 ((xp->xb_pktp->pkt_flags & FLAG_SENSING) == 0)) { 15188 scsi_dmafree(xp->xb_pktp); 15189 xp->xb_pkt_flags |= SD_XB_DMA_FREED; 15190 } 15191 #endif 15192 15193 if (SD_IS_DIRECT_PRIORITY(SD_GET_XBUF(bp))) { 15194 /* 15195 * Commands that are SD_PATH_DIRECT_PRIORITY 15196 * are for error recovery situations. These do 15197 * not use the normal command waitq, so if they 15198 * get a TRAN_BUSY we cannot put them back onto 15199 * the waitq for later retry. One possible 15200 * problem is that there could already be some 15201 * other command on un_retry_bp that is waiting 15202 * for this one to complete, so we would be 15203 * deadlocked if we put this command back onto 15204 * the waitq for later retry (since un_retry_bp 15205 * must complete before the driver gets back to 15206 * commands on the waitq). 15207 * 15208 * To avoid deadlock we must schedule a callback 15209 * that will restart this command after a set 15210 * interval. This should keep retrying for as 15211 * long as the underlying transport keeps 15212 * returning TRAN_BUSY (just like for other 15213 * commands). Use the same timeout interval as 15214 * for the ordinary TRAN_BUSY retry. 15215 */ 15216 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15217 "sd_start_cmds: scsi_transport() returned " 15218 "TRAN_BUSY for DIRECT_PRIORITY cmd!\n"); 15219 15220 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp); 15221 un->un_direct_priority_timeid = 15222 timeout(sd_start_direct_priority_command, 15223 bp, un->un_busy_timeout / 500); 15224 15225 goto exit; 15226 } 15227 15228 /* 15229 * For TRAN_BUSY, we want to reduce the throttle value, 15230 * unless we are retrying a command. 15231 */ 15232 if (bp != un->un_retry_bp) { 15233 sd_reduce_throttle(un, SD_THROTTLE_TRAN_BUSY); 15234 } 15235 15236 /* 15237 * Set up the bp to be tried again 10 ms later. 15238 * Note:x86: Is there a timeout value in the sd_lun 15239 * for this condition? 15240 */ 15241 sd_set_retry_bp(un, bp, un->un_busy_timeout / 500, 15242 kstat_runq_back_to_waitq); 15243 goto exit; 15244 15245 case TRAN_FATAL_ERROR: 15246 un->un_tran_fatal_count++; 15247 /* FALLTHRU */ 15248 15249 case TRAN_BADPKT: 15250 default: 15251 un->un_ncmds_in_transport--; 15252 ASSERT(un->un_ncmds_in_transport >= 0); 15253 15254 /* 15255 * If this is our REQUEST SENSE command with a 15256 * transport error, we must get back the pointers 15257 * to the original buf, and mark the REQUEST 15258 * SENSE command as "available". 15259 */ 15260 if (bp == un->un_rqs_bp) { 15261 bp = sd_mark_rqs_idle(un, xp); 15262 xp = SD_GET_XBUF(bp); 15263 } else { 15264 /* 15265 * Legacy behavior: do not update transport 15266 * error count for request sense commands. 15267 */ 15268 SD_UPDATE_ERRSTATS(un, sd_transerrs); 15269 } 15270 15271 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp); 15272 sd_print_transport_rejected_message(un, xp, rval); 15273 15274 /* 15275 * This command will be terminated by SD driver due 15276 * to a fatal transport error. We should post 15277 * ereport.io.scsi.cmd.disk.tran with driver-assessment 15278 * of "fail" for any command to indicate this 15279 * situation. 15280 */ 15281 if (xp->xb_ena > 0) { 15282 ASSERT(un->un_fm_private != NULL); 15283 sfip = un->un_fm_private; 15284 sfip->fm_ssc.ssc_flags |= SSC_FLAGS_TRAN_ABORT; 15285 sd_ssc_extract_info(&sfip->fm_ssc, un, 15286 xp->xb_pktp, bp, xp); 15287 sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_FATAL); 15288 } 15289 15290 /* 15291 * We must use sd_return_failed_command_no_restart() to 15292 * avoid a recursive call back into sd_start_cmds(). 15293 * However this also means that we must keep processing 15294 * the waitq here in order to avoid stalling. 15295 */ 15296 sd_return_failed_command_no_restart(un, bp, EIO); 15297 15298 /* 15299 * Notify any threads waiting in sd_ddi_suspend() that 15300 * a command completion has occurred. 15301 */ 15302 if (un->un_state == SD_STATE_SUSPENDED) { 15303 cv_broadcast(&un->un_disk_busy_cv); 15304 } 15305 15306 if (bp == immed_bp) { 15307 /* immed_bp is gone by now, so clear this */ 15308 immed_bp = NULL; 15309 } 15310 break; 15311 } 15312 15313 } while (immed_bp == NULL); 15314 15315 exit: 15316 ASSERT(mutex_owned(SD_MUTEX(un))); 15317 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_start_cmds: exit\n"); 15318 } 15319 15320 15321 /* 15322 * Function: sd_return_command 15323 * 15324 * Description: Returns a command to its originator (with or without an 15325 * error). Also starts commands waiting to be transported 15326 * to the target. 15327 * 15328 * Context: May be called from interrupt, kernel, or timeout context 15329 */ 15330 15331 static void 15332 sd_return_command(struct sd_lun *un, struct buf *bp) 15333 { 15334 struct sd_xbuf *xp; 15335 struct scsi_pkt *pktp; 15336 struct sd_fm_internal *sfip; 15337 15338 ASSERT(bp != NULL); 15339 ASSERT(un != NULL); 15340 ASSERT(mutex_owned(SD_MUTEX(un))); 15341 ASSERT(bp != un->un_rqs_bp); 15342 xp = SD_GET_XBUF(bp); 15343 ASSERT(xp != NULL); 15344 15345 pktp = SD_GET_PKTP(bp); 15346 sfip = (struct sd_fm_internal *)un->un_fm_private; 15347 ASSERT(sfip != NULL); 15348 15349 SD_TRACE(SD_LOG_IO_CORE, un, "sd_return_command: entry\n"); 15350 15351 /* 15352 * Note: check for the "sdrestart failed" case. 15353 */ 15354 if ((un->un_partial_dma_supported == 1) && 15355 ((xp->xb_pkt_flags & SD_XB_USCSICMD) != SD_XB_USCSICMD) && 15356 (geterror(bp) == 0) && (xp->xb_dma_resid != 0) && 15357 (xp->xb_pktp->pkt_resid == 0)) { 15358 15359 if (sd_setup_next_xfer(un, bp, pktp, xp) != 0) { 15360 /* 15361 * Successfully set up next portion of cmd 15362 * transfer, try sending it 15363 */ 15364 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, 15365 NULL, NULL, 0, (clock_t)0, NULL); 15366 sd_start_cmds(un, NULL); 15367 return; /* Note:x86: need a return here? */ 15368 } 15369 } 15370 15371 /* 15372 * If this is the failfast bp, clear it from un_failfast_bp. This 15373 * can happen if upon being re-tried the failfast bp either 15374 * succeeded or encountered another error (possibly even a different 15375 * error than the one that precipitated the failfast state, but in 15376 * that case it would have had to exhaust retries as well). Regardless, 15377 * this should not occur whenever the instance is in the active 15378 * failfast state. 15379 */ 15380 if (bp == un->un_failfast_bp) { 15381 ASSERT(un->un_failfast_state == SD_FAILFAST_INACTIVE); 15382 un->un_failfast_bp = NULL; 15383 } 15384 15385 /* 15386 * Clear the failfast state upon successful completion of ANY cmd. 15387 */ 15388 if (bp->b_error == 0) { 15389 un->un_failfast_state = SD_FAILFAST_INACTIVE; 15390 /* 15391 * If this is a successful command, but used to be retried, 15392 * we will take it as a recovered command and post an 15393 * ereport with driver-assessment of "recovered". 15394 */ 15395 if (xp->xb_ena > 0) { 15396 sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp); 15397 sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_RECOVERY); 15398 } 15399 } else { 15400 /* 15401 * If this is a failed non-USCSI command we will post an 15402 * ereport with driver-assessment set accordingly("fail" or 15403 * "fatal"). 15404 */ 15405 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 15406 sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp); 15407 sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_FATAL); 15408 } 15409 } 15410 15411 /* 15412 * This is used if the command was retried one or more times. Show that 15413 * we are done with it, and allow processing of the waitq to resume. 15414 */ 15415 if (bp == un->un_retry_bp) { 15416 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15417 "sd_return_command: un:0x%p: " 15418 "RETURNING retry_bp:0x%p\n", un, un->un_retry_bp); 15419 un->un_retry_bp = NULL; 15420 un->un_retry_statp = NULL; 15421 } 15422 15423 SD_UPDATE_RDWR_STATS(un, bp); 15424 SD_UPDATE_PARTITION_STATS(un, bp); 15425 15426 switch (un->un_state) { 15427 case SD_STATE_SUSPENDED: 15428 /* 15429 * Notify any threads waiting in sd_ddi_suspend() that 15430 * a command completion has occurred. 15431 */ 15432 cv_broadcast(&un->un_disk_busy_cv); 15433 break; 15434 default: 15435 sd_start_cmds(un, NULL); 15436 break; 15437 } 15438 15439 /* Return this command up the iodone chain to its originator. */ 15440 mutex_exit(SD_MUTEX(un)); 15441 15442 (*(sd_destroypkt_map[xp->xb_chain_iodone]))(bp); 15443 xp->xb_pktp = NULL; 15444 15445 SD_BEGIN_IODONE(xp->xb_chain_iodone, un, bp); 15446 15447 ASSERT(!mutex_owned(SD_MUTEX(un))); 15448 mutex_enter(SD_MUTEX(un)); 15449 15450 SD_TRACE(SD_LOG_IO_CORE, un, "sd_return_command: exit\n"); 15451 } 15452 15453 15454 /* 15455 * Function: sd_return_failed_command 15456 * 15457 * Description: Command completion when an error occurred. 15458 * 15459 * Context: May be called from interrupt context 15460 */ 15461 15462 static void 15463 sd_return_failed_command(struct sd_lun *un, struct buf *bp, int errcode) 15464 { 15465 ASSERT(bp != NULL); 15466 ASSERT(un != NULL); 15467 ASSERT(mutex_owned(SD_MUTEX(un))); 15468 15469 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15470 "sd_return_failed_command: entry\n"); 15471 15472 /* 15473 * b_resid could already be nonzero due to a partial data 15474 * transfer, so do not change it here. 15475 */ 15476 SD_BIOERROR(bp, errcode); 15477 15478 sd_return_command(un, bp); 15479 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15480 "sd_return_failed_command: exit\n"); 15481 } 15482 15483 15484 /* 15485 * Function: sd_return_failed_command_no_restart 15486 * 15487 * Description: Same as sd_return_failed_command, but ensures that no 15488 * call back into sd_start_cmds will be issued. 15489 * 15490 * Context: May be called from interrupt context 15491 */ 15492 15493 static void 15494 sd_return_failed_command_no_restart(struct sd_lun *un, struct buf *bp, 15495 int errcode) 15496 { 15497 struct sd_xbuf *xp; 15498 15499 ASSERT(bp != NULL); 15500 ASSERT(un != NULL); 15501 ASSERT(mutex_owned(SD_MUTEX(un))); 15502 xp = SD_GET_XBUF(bp); 15503 ASSERT(xp != NULL); 15504 ASSERT(errcode != 0); 15505 15506 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15507 "sd_return_failed_command_no_restart: entry\n"); 15508 15509 /* 15510 * b_resid could already be nonzero due to a partial data 15511 * transfer, so do not change it here. 15512 */ 15513 SD_BIOERROR(bp, errcode); 15514 15515 /* 15516 * If this is the failfast bp, clear it. This can happen if the 15517 * failfast bp encounterd a fatal error when we attempted to 15518 * re-try it (such as a scsi_transport(9F) failure). However 15519 * we should NOT be in an active failfast state if the failfast 15520 * bp is not NULL. 15521 */ 15522 if (bp == un->un_failfast_bp) { 15523 ASSERT(un->un_failfast_state == SD_FAILFAST_INACTIVE); 15524 un->un_failfast_bp = NULL; 15525 } 15526 15527 if (bp == un->un_retry_bp) { 15528 /* 15529 * This command was retried one or more times. Show that we are 15530 * done with it, and allow processing of the waitq to resume. 15531 */ 15532 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15533 "sd_return_failed_command_no_restart: " 15534 " un:0x%p: RETURNING retry_bp:0x%p\n", un, un->un_retry_bp); 15535 un->un_retry_bp = NULL; 15536 un->un_retry_statp = NULL; 15537 } 15538 15539 SD_UPDATE_RDWR_STATS(un, bp); 15540 SD_UPDATE_PARTITION_STATS(un, bp); 15541 15542 mutex_exit(SD_MUTEX(un)); 15543 15544 if (xp->xb_pktp != NULL) { 15545 (*(sd_destroypkt_map[xp->xb_chain_iodone]))(bp); 15546 xp->xb_pktp = NULL; 15547 } 15548 15549 SD_BEGIN_IODONE(xp->xb_chain_iodone, un, bp); 15550 15551 mutex_enter(SD_MUTEX(un)); 15552 15553 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15554 "sd_return_failed_command_no_restart: exit\n"); 15555 } 15556 15557 15558 /* 15559 * Function: sd_retry_command 15560 * 15561 * Description: queue up a command for retry, or (optionally) fail it 15562 * if retry counts are exhausted. 15563 * 15564 * Arguments: un - Pointer to the sd_lun struct for the target. 15565 * 15566 * bp - Pointer to the buf for the command to be retried. 15567 * 15568 * retry_check_flag - Flag to see which (if any) of the retry 15569 * counts should be decremented/checked. If the indicated 15570 * retry count is exhausted, then the command will not be 15571 * retried; it will be failed instead. This should use a 15572 * value equal to one of the following: 15573 * 15574 * SD_RETRIES_NOCHECK 15575 * SD_RESD_RETRIES_STANDARD 15576 * SD_RETRIES_VICTIM 15577 * 15578 * Optionally may be bitwise-OR'ed with SD_RETRIES_ISOLATE 15579 * if the check should be made to see of FLAG_ISOLATE is set 15580 * in the pkt. If FLAG_ISOLATE is set, then the command is 15581 * not retried, it is simply failed. 15582 * 15583 * user_funcp - Ptr to function to call before dispatching the 15584 * command. May be NULL if no action needs to be performed. 15585 * (Primarily intended for printing messages.) 15586 * 15587 * user_arg - Optional argument to be passed along to 15588 * the user_funcp call. 15589 * 15590 * failure_code - errno return code to set in the bp if the 15591 * command is going to be failed. 15592 * 15593 * retry_delay - Retry delay interval in (clock_t) units. May 15594 * be zero which indicates that the retry should be retried 15595 * immediately (ie, without an intervening delay). 15596 * 15597 * statp - Ptr to kstat function to be updated if the command 15598 * is queued for a delayed retry. May be NULL if no kstat 15599 * update is desired. 15600 * 15601 * Context: May be called from interrupt context. 15602 */ 15603 15604 static void 15605 sd_retry_command(struct sd_lun *un, struct buf *bp, int retry_check_flag, 15606 void (*user_funcp)(struct sd_lun *un, struct buf *bp, void *argp, int code), 15607 void *user_arg, int failure_code, clock_t retry_delay, 15608 void (*statp)(kstat_io_t *)) 15609 { 15610 struct sd_xbuf *xp; 15611 struct scsi_pkt *pktp; 15612 struct sd_fm_internal *sfip; 15613 15614 ASSERT(un != NULL); 15615 ASSERT(mutex_owned(SD_MUTEX(un))); 15616 ASSERT(bp != NULL); 15617 xp = SD_GET_XBUF(bp); 15618 ASSERT(xp != NULL); 15619 pktp = SD_GET_PKTP(bp); 15620 ASSERT(pktp != NULL); 15621 15622 sfip = (struct sd_fm_internal *)un->un_fm_private; 15623 ASSERT(sfip != NULL); 15624 15625 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, 15626 "sd_retry_command: entry: bp:0x%p xp:0x%p\n", bp, xp); 15627 15628 /* 15629 * If we are syncing or dumping, fail the command to avoid 15630 * recursively calling back into scsi_transport(). 15631 */ 15632 if (ddi_in_panic()) { 15633 goto fail_command_no_log; 15634 } 15635 15636 /* 15637 * We should never be be retrying a command with FLAG_DIAGNOSE set, so 15638 * log an error and fail the command. 15639 */ 15640 if ((pktp->pkt_flags & FLAG_DIAGNOSE) != 0) { 15641 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE, 15642 "ERROR, retrying FLAG_DIAGNOSE command.\n"); 15643 sd_dump_memory(un, SD_LOG_IO, "CDB", 15644 (uchar_t *)pktp->pkt_cdbp, CDB_SIZE, SD_LOG_HEX); 15645 sd_dump_memory(un, SD_LOG_IO, "Sense Data", 15646 (uchar_t *)xp->xb_sense_data, SENSE_LENGTH, SD_LOG_HEX); 15647 goto fail_command; 15648 } 15649 15650 /* 15651 * If we are suspended, then put the command onto head of the 15652 * wait queue since we don't want to start more commands, and 15653 * clear the un_retry_bp. Next time when we are resumed, will 15654 * handle the command in the wait queue. 15655 */ 15656 switch (un->un_state) { 15657 case SD_STATE_SUSPENDED: 15658 case SD_STATE_DUMPING: 15659 bp->av_forw = un->un_waitq_headp; 15660 un->un_waitq_headp = bp; 15661 if (un->un_waitq_tailp == NULL) { 15662 un->un_waitq_tailp = bp; 15663 } 15664 if (bp == un->un_retry_bp) { 15665 un->un_retry_bp = NULL; 15666 un->un_retry_statp = NULL; 15667 } 15668 SD_UPDATE_KSTATS(un, kstat_waitq_enter, bp); 15669 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: " 15670 "exiting; cmd bp:0x%p requeued for SUSPEND/DUMP\n", bp); 15671 return; 15672 default: 15673 break; 15674 } 15675 15676 /* 15677 * If the caller wants us to check FLAG_ISOLATE, then see if that 15678 * is set; if it is then we do not want to retry the command. 15679 * Normally, FLAG_ISOLATE is only used with USCSI cmds. 15680 */ 15681 if ((retry_check_flag & SD_RETRIES_ISOLATE) != 0) { 15682 if ((pktp->pkt_flags & FLAG_ISOLATE) != 0) { 15683 goto fail_command; 15684 } 15685 } 15686 15687 15688 /* 15689 * If SD_RETRIES_FAILFAST is set, it indicates that either a 15690 * command timeout or a selection timeout has occurred. This means 15691 * that we were unable to establish an kind of communication with 15692 * the target, and subsequent retries and/or commands are likely 15693 * to encounter similar results and take a long time to complete. 15694 * 15695 * If this is a failfast error condition, we need to update the 15696 * failfast state, even if this bp does not have B_FAILFAST set. 15697 */ 15698 if (retry_check_flag & SD_RETRIES_FAILFAST) { 15699 if (un->un_failfast_state == SD_FAILFAST_ACTIVE) { 15700 ASSERT(un->un_failfast_bp == NULL); 15701 /* 15702 * If we are already in the active failfast state, and 15703 * another failfast error condition has been detected, 15704 * then fail this command if it has B_FAILFAST set. 15705 * If B_FAILFAST is clear, then maintain the legacy 15706 * behavior of retrying heroically, even tho this will 15707 * take a lot more time to fail the command. 15708 */ 15709 if (bp->b_flags & B_FAILFAST) { 15710 goto fail_command; 15711 } 15712 } else { 15713 /* 15714 * We're not in the active failfast state, but we 15715 * have a failfast error condition, so we must begin 15716 * transition to the next state. We do this regardless 15717 * of whether or not this bp has B_FAILFAST set. 15718 */ 15719 if (un->un_failfast_bp == NULL) { 15720 /* 15721 * This is the first bp to meet a failfast 15722 * condition so save it on un_failfast_bp & 15723 * do normal retry processing. Do not enter 15724 * active failfast state yet. This marks 15725 * entry into the "failfast pending" state. 15726 */ 15727 un->un_failfast_bp = bp; 15728 15729 } else if (un->un_failfast_bp == bp) { 15730 /* 15731 * This is the second time *this* bp has 15732 * encountered a failfast error condition, 15733 * so enter active failfast state & flush 15734 * queues as appropriate. 15735 */ 15736 un->un_failfast_state = SD_FAILFAST_ACTIVE; 15737 un->un_failfast_bp = NULL; 15738 sd_failfast_flushq(un); 15739 15740 /* 15741 * Fail this bp now if B_FAILFAST set; 15742 * otherwise continue with retries. (It would 15743 * be pretty ironic if this bp succeeded on a 15744 * subsequent retry after we just flushed all 15745 * the queues). 15746 */ 15747 if (bp->b_flags & B_FAILFAST) { 15748 goto fail_command; 15749 } 15750 15751 #if !defined(lint) && !defined(__lint) 15752 } else { 15753 /* 15754 * If neither of the preceeding conditionals 15755 * was true, it means that there is some 15756 * *other* bp that has met an inital failfast 15757 * condition and is currently either being 15758 * retried or is waiting to be retried. In 15759 * that case we should perform normal retry 15760 * processing on *this* bp, since there is a 15761 * chance that the current failfast condition 15762 * is transient and recoverable. If that does 15763 * not turn out to be the case, then retries 15764 * will be cleared when the wait queue is 15765 * flushed anyway. 15766 */ 15767 #endif 15768 } 15769 } 15770 } else { 15771 /* 15772 * SD_RETRIES_FAILFAST is clear, which indicates that we 15773 * likely were able to at least establish some level of 15774 * communication with the target and subsequent commands 15775 * and/or retries are likely to get through to the target, 15776 * In this case we want to be aggressive about clearing 15777 * the failfast state. Note that this does not affect 15778 * the "failfast pending" condition. 15779 */ 15780 un->un_failfast_state = SD_FAILFAST_INACTIVE; 15781 } 15782 15783 15784 /* 15785 * Check the specified retry count to see if we can still do 15786 * any retries with this pkt before we should fail it. 15787 */ 15788 switch (retry_check_flag & SD_RETRIES_MASK) { 15789 case SD_RETRIES_VICTIM: 15790 /* 15791 * Check the victim retry count. If exhausted, then fall 15792 * thru & check against the standard retry count. 15793 */ 15794 if (xp->xb_victim_retry_count < un->un_victim_retry_count) { 15795 /* Increment count & proceed with the retry */ 15796 xp->xb_victim_retry_count++; 15797 break; 15798 } 15799 /* Victim retries exhausted, fall back to std. retries... */ 15800 /* FALLTHRU */ 15801 15802 case SD_RETRIES_STANDARD: 15803 if (xp->xb_retry_count >= un->un_retry_count) { 15804 /* Retries exhausted, fail the command */ 15805 SD_TRACE(SD_LOG_IO_CORE, un, 15806 "sd_retry_command: retries exhausted!\n"); 15807 /* 15808 * update b_resid for failed SCMD_READ & SCMD_WRITE 15809 * commands with nonzero pkt_resid. 15810 */ 15811 if ((pktp->pkt_reason == CMD_CMPLT) && 15812 (SD_GET_PKT_STATUS(pktp) == STATUS_GOOD) && 15813 (pktp->pkt_resid != 0)) { 15814 uchar_t op = SD_GET_PKT_OPCODE(pktp) & 0x1F; 15815 if ((op == SCMD_READ) || (op == SCMD_WRITE)) { 15816 SD_UPDATE_B_RESID(bp, pktp); 15817 } 15818 } 15819 goto fail_command; 15820 } 15821 xp->xb_retry_count++; 15822 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15823 "sd_retry_command: retry count:%d\n", xp->xb_retry_count); 15824 break; 15825 15826 case SD_RETRIES_UA: 15827 if (xp->xb_ua_retry_count >= sd_ua_retry_count) { 15828 /* Retries exhausted, fail the command */ 15829 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 15830 "Unit Attention retries exhausted. " 15831 "Check the target.\n"); 15832 goto fail_command; 15833 } 15834 xp->xb_ua_retry_count++; 15835 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15836 "sd_retry_command: retry count:%d\n", 15837 xp->xb_ua_retry_count); 15838 break; 15839 15840 case SD_RETRIES_BUSY: 15841 if (xp->xb_retry_count >= un->un_busy_retry_count) { 15842 /* Retries exhausted, fail the command */ 15843 SD_TRACE(SD_LOG_IO_CORE, un, 15844 "sd_retry_command: retries exhausted!\n"); 15845 goto fail_command; 15846 } 15847 xp->xb_retry_count++; 15848 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15849 "sd_retry_command: retry count:%d\n", xp->xb_retry_count); 15850 break; 15851 15852 case SD_RETRIES_NOCHECK: 15853 default: 15854 /* No retry count to check. Just proceed with the retry */ 15855 break; 15856 } 15857 15858 xp->xb_pktp->pkt_flags |= FLAG_HEAD; 15859 15860 /* 15861 * If this is a non-USCSI command being retried 15862 * during execution last time, we should post an ereport with 15863 * driver-assessment of the value "retry". 15864 * For partial DMA, request sense and STATUS_QFULL, there are no 15865 * hardware errors, we bypass ereport posting. 15866 */ 15867 if (failure_code != 0) { 15868 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 15869 sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp); 15870 sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_RETRY); 15871 } 15872 } 15873 15874 /* 15875 * If we were given a zero timeout, we must attempt to retry the 15876 * command immediately (ie, without a delay). 15877 */ 15878 if (retry_delay == 0) { 15879 /* 15880 * Check some limiting conditions to see if we can actually 15881 * do the immediate retry. If we cannot, then we must 15882 * fall back to queueing up a delayed retry. 15883 */ 15884 if (un->un_ncmds_in_transport >= un->un_throttle) { 15885 /* 15886 * We are at the throttle limit for the target, 15887 * fall back to delayed retry. 15888 */ 15889 retry_delay = un->un_busy_timeout; 15890 statp = kstat_waitq_enter; 15891 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15892 "sd_retry_command: immed. retry hit " 15893 "throttle!\n"); 15894 } else { 15895 /* 15896 * We're clear to proceed with the immediate retry. 15897 * First call the user-provided function (if any) 15898 */ 15899 if (user_funcp != NULL) { 15900 (*user_funcp)(un, bp, user_arg, 15901 SD_IMMEDIATE_RETRY_ISSUED); 15902 #ifdef __lock_lint 15903 sd_print_incomplete_msg(un, bp, user_arg, 15904 SD_IMMEDIATE_RETRY_ISSUED); 15905 sd_print_cmd_incomplete_msg(un, bp, user_arg, 15906 SD_IMMEDIATE_RETRY_ISSUED); 15907 sd_print_sense_failed_msg(un, bp, user_arg, 15908 SD_IMMEDIATE_RETRY_ISSUED); 15909 #endif 15910 } 15911 15912 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15913 "sd_retry_command: issuing immediate retry\n"); 15914 15915 /* 15916 * Call sd_start_cmds() to transport the command to 15917 * the target. 15918 */ 15919 sd_start_cmds(un, bp); 15920 15921 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15922 "sd_retry_command exit\n"); 15923 return; 15924 } 15925 } 15926 15927 /* 15928 * Set up to retry the command after a delay. 15929 * First call the user-provided function (if any) 15930 */ 15931 if (user_funcp != NULL) { 15932 (*user_funcp)(un, bp, user_arg, SD_DELAYED_RETRY_ISSUED); 15933 } 15934 15935 sd_set_retry_bp(un, bp, retry_delay, statp); 15936 15937 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: exit\n"); 15938 return; 15939 15940 fail_command: 15941 15942 if (user_funcp != NULL) { 15943 (*user_funcp)(un, bp, user_arg, SD_NO_RETRY_ISSUED); 15944 } 15945 15946 fail_command_no_log: 15947 15948 SD_INFO(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 15949 "sd_retry_command: returning failed command\n"); 15950 15951 sd_return_failed_command(un, bp, failure_code); 15952 15953 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: exit\n"); 15954 } 15955 15956 15957 /* 15958 * Function: sd_set_retry_bp 15959 * 15960 * Description: Set up the given bp for retry. 15961 * 15962 * Arguments: un - ptr to associated softstate 15963 * bp - ptr to buf(9S) for the command 15964 * retry_delay - time interval before issuing retry (may be 0) 15965 * statp - optional pointer to kstat function 15966 * 15967 * Context: May be called under interrupt context 15968 */ 15969 15970 static void 15971 sd_set_retry_bp(struct sd_lun *un, struct buf *bp, clock_t retry_delay, 15972 void (*statp)(kstat_io_t *)) 15973 { 15974 ASSERT(un != NULL); 15975 ASSERT(mutex_owned(SD_MUTEX(un))); 15976 ASSERT(bp != NULL); 15977 15978 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, 15979 "sd_set_retry_bp: entry: un:0x%p bp:0x%p\n", un, bp); 15980 15981 /* 15982 * Indicate that the command is being retried. This will not allow any 15983 * other commands on the wait queue to be transported to the target 15984 * until this command has been completed (success or failure). The 15985 * "retry command" is not transported to the target until the given 15986 * time delay expires, unless the user specified a 0 retry_delay. 15987 * 15988 * Note: the timeout(9F) callback routine is what actually calls 15989 * sd_start_cmds() to transport the command, with the exception of a 15990 * zero retry_delay. The only current implementor of a zero retry delay 15991 * is the case where a START_STOP_UNIT is sent to spin-up a device. 15992 */ 15993 if (un->un_retry_bp == NULL) { 15994 ASSERT(un->un_retry_statp == NULL); 15995 un->un_retry_bp = bp; 15996 15997 /* 15998 * If the user has not specified a delay the command should 15999 * be queued and no timeout should be scheduled. 16000 */ 16001 if (retry_delay == 0) { 16002 /* 16003 * Save the kstat pointer that will be used in the 16004 * call to SD_UPDATE_KSTATS() below, so that 16005 * sd_start_cmds() can correctly decrement the waitq 16006 * count when it is time to transport this command. 16007 */ 16008 un->un_retry_statp = statp; 16009 goto done; 16010 } 16011 } 16012 16013 if (un->un_retry_bp == bp) { 16014 /* 16015 * Save the kstat pointer that will be used in the call to 16016 * SD_UPDATE_KSTATS() below, so that sd_start_cmds() can 16017 * correctly decrement the waitq count when it is time to 16018 * transport this command. 16019 */ 16020 un->un_retry_statp = statp; 16021 16022 /* 16023 * Schedule a timeout if: 16024 * 1) The user has specified a delay. 16025 * 2) There is not a START_STOP_UNIT callback pending. 16026 * 16027 * If no delay has been specified, then it is up to the caller 16028 * to ensure that IO processing continues without stalling. 16029 * Effectively, this means that the caller will issue the 16030 * required call to sd_start_cmds(). The START_STOP_UNIT 16031 * callback does this after the START STOP UNIT command has 16032 * completed. In either of these cases we should not schedule 16033 * a timeout callback here. Also don't schedule the timeout if 16034 * an SD_PATH_DIRECT_PRIORITY command is waiting to restart. 16035 */ 16036 if ((retry_delay != 0) && (un->un_startstop_timeid == NULL) && 16037 (un->un_direct_priority_timeid == NULL)) { 16038 un->un_retry_timeid = 16039 timeout(sd_start_retry_command, un, retry_delay); 16040 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16041 "sd_set_retry_bp: setting timeout: un: 0x%p" 16042 " bp:0x%p un_retry_timeid:0x%p\n", 16043 un, bp, un->un_retry_timeid); 16044 } 16045 } else { 16046 /* 16047 * We only get in here if there is already another command 16048 * waiting to be retried. In this case, we just put the 16049 * given command onto the wait queue, so it can be transported 16050 * after the current retry command has completed. 16051 * 16052 * Also we have to make sure that if the command at the head 16053 * of the wait queue is the un_failfast_bp, that we do not 16054 * put ahead of it any other commands that are to be retried. 16055 */ 16056 if ((un->un_failfast_bp != NULL) && 16057 (un->un_failfast_bp == un->un_waitq_headp)) { 16058 /* 16059 * Enqueue this command AFTER the first command on 16060 * the wait queue (which is also un_failfast_bp). 16061 */ 16062 bp->av_forw = un->un_waitq_headp->av_forw; 16063 un->un_waitq_headp->av_forw = bp; 16064 if (un->un_waitq_headp == un->un_waitq_tailp) { 16065 un->un_waitq_tailp = bp; 16066 } 16067 } else { 16068 /* Enqueue this command at the head of the waitq. */ 16069 bp->av_forw = un->un_waitq_headp; 16070 un->un_waitq_headp = bp; 16071 if (un->un_waitq_tailp == NULL) { 16072 un->un_waitq_tailp = bp; 16073 } 16074 } 16075 16076 if (statp == NULL) { 16077 statp = kstat_waitq_enter; 16078 } 16079 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16080 "sd_set_retry_bp: un:0x%p already delayed retry\n", un); 16081 } 16082 16083 done: 16084 if (statp != NULL) { 16085 SD_UPDATE_KSTATS(un, statp, bp); 16086 } 16087 16088 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16089 "sd_set_retry_bp: exit un:0x%p\n", un); 16090 } 16091 16092 16093 /* 16094 * Function: sd_start_retry_command 16095 * 16096 * Description: Start the command that has been waiting on the target's 16097 * retry queue. Called from timeout(9F) context after the 16098 * retry delay interval has expired. 16099 * 16100 * Arguments: arg - pointer to associated softstate for the device. 16101 * 16102 * Context: timeout(9F) thread context. May not sleep. 16103 */ 16104 16105 static void 16106 sd_start_retry_command(void *arg) 16107 { 16108 struct sd_lun *un = arg; 16109 16110 ASSERT(un != NULL); 16111 ASSERT(!mutex_owned(SD_MUTEX(un))); 16112 16113 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16114 "sd_start_retry_command: entry\n"); 16115 16116 mutex_enter(SD_MUTEX(un)); 16117 16118 un->un_retry_timeid = NULL; 16119 16120 if (un->un_retry_bp != NULL) { 16121 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16122 "sd_start_retry_command: un:0x%p STARTING bp:0x%p\n", 16123 un, un->un_retry_bp); 16124 sd_start_cmds(un, un->un_retry_bp); 16125 } 16126 16127 mutex_exit(SD_MUTEX(un)); 16128 16129 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16130 "sd_start_retry_command: exit\n"); 16131 } 16132 16133 /* 16134 * Function: sd_rmw_msg_print_handler 16135 * 16136 * Description: If RMW mode is enabled and warning message is triggered 16137 * print I/O count during a fixed interval. 16138 * 16139 * Arguments: arg - pointer to associated softstate for the device. 16140 * 16141 * Context: timeout(9F) thread context. May not sleep. 16142 */ 16143 static void 16144 sd_rmw_msg_print_handler(void *arg) 16145 { 16146 struct sd_lun *un = arg; 16147 16148 ASSERT(un != NULL); 16149 ASSERT(!mutex_owned(SD_MUTEX(un))); 16150 16151 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16152 "sd_rmw_msg_print_handler: entry\n"); 16153 16154 mutex_enter(SD_MUTEX(un)); 16155 16156 if (un->un_rmw_incre_count > 0) { 16157 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 16158 "%"PRIu64" I/O requests are not aligned with %d disk " 16159 "sector size in %ld seconds. They are handled through " 16160 "Read Modify Write but the performance is very low!\n", 16161 un->un_rmw_incre_count, un->un_tgt_blocksize, 16162 drv_hztousec(SD_RMW_MSG_PRINT_TIMEOUT) / 1000000); 16163 un->un_rmw_incre_count = 0; 16164 un->un_rmw_msg_timeid = timeout(sd_rmw_msg_print_handler, 16165 un, SD_RMW_MSG_PRINT_TIMEOUT); 16166 } else { 16167 un->un_rmw_msg_timeid = NULL; 16168 } 16169 16170 mutex_exit(SD_MUTEX(un)); 16171 16172 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16173 "sd_rmw_msg_print_handler: exit\n"); 16174 } 16175 16176 /* 16177 * Function: sd_start_direct_priority_command 16178 * 16179 * Description: Used to re-start an SD_PATH_DIRECT_PRIORITY command that had 16180 * received TRAN_BUSY when we called scsi_transport() to send it 16181 * to the underlying HBA. This function is called from timeout(9F) 16182 * context after the delay interval has expired. 16183 * 16184 * Arguments: arg - pointer to associated buf(9S) to be restarted. 16185 * 16186 * Context: timeout(9F) thread context. May not sleep. 16187 */ 16188 16189 static void 16190 sd_start_direct_priority_command(void *arg) 16191 { 16192 struct buf *priority_bp = arg; 16193 struct sd_lun *un; 16194 16195 ASSERT(priority_bp != NULL); 16196 un = SD_GET_UN(priority_bp); 16197 ASSERT(un != NULL); 16198 ASSERT(!mutex_owned(SD_MUTEX(un))); 16199 16200 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16201 "sd_start_direct_priority_command: entry\n"); 16202 16203 mutex_enter(SD_MUTEX(un)); 16204 un->un_direct_priority_timeid = NULL; 16205 sd_start_cmds(un, priority_bp); 16206 mutex_exit(SD_MUTEX(un)); 16207 16208 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16209 "sd_start_direct_priority_command: exit\n"); 16210 } 16211 16212 16213 /* 16214 * Function: sd_send_request_sense_command 16215 * 16216 * Description: Sends a REQUEST SENSE command to the target 16217 * 16218 * Context: May be called from interrupt context. 16219 */ 16220 16221 static void 16222 sd_send_request_sense_command(struct sd_lun *un, struct buf *bp, 16223 struct scsi_pkt *pktp) 16224 { 16225 ASSERT(bp != NULL); 16226 ASSERT(un != NULL); 16227 ASSERT(mutex_owned(SD_MUTEX(un))); 16228 16229 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_send_request_sense_command: " 16230 "entry: buf:0x%p\n", bp); 16231 16232 /* 16233 * If we are syncing or dumping, then fail the command to avoid a 16234 * recursive callback into scsi_transport(). Also fail the command 16235 * if we are suspended (legacy behavior). 16236 */ 16237 if (ddi_in_panic() || (un->un_state == SD_STATE_SUSPENDED) || 16238 (un->un_state == SD_STATE_DUMPING)) { 16239 sd_return_failed_command(un, bp, EIO); 16240 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16241 "sd_send_request_sense_command: syncing/dumping, exit\n"); 16242 return; 16243 } 16244 16245 /* 16246 * Retry the failed command and don't issue the request sense if: 16247 * 1) the sense buf is busy 16248 * 2) we have 1 or more outstanding commands on the target 16249 * (the sense data will be cleared or invalidated any way) 16250 * 16251 * Note: There could be an issue with not checking a retry limit here, 16252 * the problem is determining which retry limit to check. 16253 */ 16254 if ((un->un_sense_isbusy != 0) || (un->un_ncmds_in_transport > 0)) { 16255 /* Don't retry if the command is flagged as non-retryable */ 16256 if ((pktp->pkt_flags & FLAG_DIAGNOSE) == 0) { 16257 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, 16258 NULL, NULL, 0, un->un_busy_timeout, 16259 kstat_waitq_enter); 16260 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16261 "sd_send_request_sense_command: " 16262 "at full throttle, retrying exit\n"); 16263 } else { 16264 sd_return_failed_command(un, bp, EIO); 16265 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16266 "sd_send_request_sense_command: " 16267 "at full throttle, non-retryable exit\n"); 16268 } 16269 return; 16270 } 16271 16272 sd_mark_rqs_busy(un, bp); 16273 sd_start_cmds(un, un->un_rqs_bp); 16274 16275 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16276 "sd_send_request_sense_command: exit\n"); 16277 } 16278 16279 16280 /* 16281 * Function: sd_mark_rqs_busy 16282 * 16283 * Description: Indicate that the request sense bp for this instance is 16284 * in use. 16285 * 16286 * Context: May be called under interrupt context 16287 */ 16288 16289 static void 16290 sd_mark_rqs_busy(struct sd_lun *un, struct buf *bp) 16291 { 16292 struct sd_xbuf *sense_xp; 16293 16294 ASSERT(un != NULL); 16295 ASSERT(bp != NULL); 16296 ASSERT(mutex_owned(SD_MUTEX(un))); 16297 ASSERT(un->un_sense_isbusy == 0); 16298 16299 SD_TRACE(SD_LOG_IO_CORE, un, "sd_mark_rqs_busy: entry: " 16300 "buf:0x%p xp:0x%p un:0x%p\n", bp, SD_GET_XBUF(bp), un); 16301 16302 sense_xp = SD_GET_XBUF(un->un_rqs_bp); 16303 ASSERT(sense_xp != NULL); 16304 16305 SD_INFO(SD_LOG_IO, un, 16306 "sd_mark_rqs_busy: entry: sense_xp:0x%p\n", sense_xp); 16307 16308 ASSERT(sense_xp->xb_pktp != NULL); 16309 ASSERT((sense_xp->xb_pktp->pkt_flags & (FLAG_SENSING | FLAG_HEAD)) 16310 == (FLAG_SENSING | FLAG_HEAD)); 16311 16312 un->un_sense_isbusy = 1; 16313 un->un_rqs_bp->b_resid = 0; 16314 sense_xp->xb_pktp->pkt_resid = 0; 16315 sense_xp->xb_pktp->pkt_reason = 0; 16316 16317 /* So we can get back the bp at interrupt time! */ 16318 sense_xp->xb_sense_bp = bp; 16319 16320 bzero(un->un_rqs_bp->b_un.b_addr, SENSE_LENGTH); 16321 16322 /* 16323 * Mark this buf as awaiting sense data. (This is already set in 16324 * the pkt_flags for the RQS packet.) 16325 */ 16326 ((SD_GET_XBUF(bp))->xb_pktp)->pkt_flags |= FLAG_SENSING; 16327 16328 /* Request sense down same path */ 16329 if (scsi_pkt_allocated_correctly((SD_GET_XBUF(bp))->xb_pktp) && 16330 ((SD_GET_XBUF(bp))->xb_pktp)->pkt_path_instance) 16331 sense_xp->xb_pktp->pkt_path_instance = 16332 ((SD_GET_XBUF(bp))->xb_pktp)->pkt_path_instance; 16333 16334 sense_xp->xb_retry_count = 0; 16335 sense_xp->xb_victim_retry_count = 0; 16336 sense_xp->xb_ua_retry_count = 0; 16337 sense_xp->xb_nr_retry_count = 0; 16338 sense_xp->xb_dma_resid = 0; 16339 16340 /* Clean up the fields for auto-request sense */ 16341 sense_xp->xb_sense_status = 0; 16342 sense_xp->xb_sense_state = 0; 16343 sense_xp->xb_sense_resid = 0; 16344 bzero(sense_xp->xb_sense_data, sizeof (sense_xp->xb_sense_data)); 16345 16346 SD_TRACE(SD_LOG_IO_CORE, un, "sd_mark_rqs_busy: exit\n"); 16347 } 16348 16349 16350 /* 16351 * Function: sd_mark_rqs_idle 16352 * 16353 * Description: SD_MUTEX must be held continuously through this routine 16354 * to prevent reuse of the rqs struct before the caller can 16355 * complete it's processing. 16356 * 16357 * Return Code: Pointer to the RQS buf 16358 * 16359 * Context: May be called under interrupt context 16360 */ 16361 16362 static struct buf * 16363 sd_mark_rqs_idle(struct sd_lun *un, struct sd_xbuf *sense_xp) 16364 { 16365 struct buf *bp; 16366 ASSERT(un != NULL); 16367 ASSERT(sense_xp != NULL); 16368 ASSERT(mutex_owned(SD_MUTEX(un))); 16369 ASSERT(un->un_sense_isbusy != 0); 16370 16371 un->un_sense_isbusy = 0; 16372 bp = sense_xp->xb_sense_bp; 16373 sense_xp->xb_sense_bp = NULL; 16374 16375 /* This pkt is no longer interested in getting sense data */ 16376 ((SD_GET_XBUF(bp))->xb_pktp)->pkt_flags &= ~FLAG_SENSING; 16377 16378 return (bp); 16379 } 16380 16381 16382 16383 /* 16384 * Function: sd_alloc_rqs 16385 * 16386 * Description: Set up the unit to receive auto request sense data 16387 * 16388 * Return Code: DDI_SUCCESS or DDI_FAILURE 16389 * 16390 * Context: Called under attach(9E) context 16391 */ 16392 16393 static int 16394 sd_alloc_rqs(struct scsi_device *devp, struct sd_lun *un) 16395 { 16396 struct sd_xbuf *xp; 16397 16398 ASSERT(un != NULL); 16399 ASSERT(!mutex_owned(SD_MUTEX(un))); 16400 ASSERT(un->un_rqs_bp == NULL); 16401 ASSERT(un->un_rqs_pktp == NULL); 16402 16403 /* 16404 * First allocate the required buf and scsi_pkt structs, then set up 16405 * the CDB in the scsi_pkt for a REQUEST SENSE command. 16406 */ 16407 un->un_rqs_bp = scsi_alloc_consistent_buf(&devp->sd_address, NULL, 16408 MAX_SENSE_LENGTH, B_READ, SLEEP_FUNC, NULL); 16409 if (un->un_rqs_bp == NULL) { 16410 return (DDI_FAILURE); 16411 } 16412 16413 un->un_rqs_pktp = scsi_init_pkt(&devp->sd_address, NULL, un->un_rqs_bp, 16414 CDB_GROUP0, 1, 0, PKT_CONSISTENT, SLEEP_FUNC, NULL); 16415 16416 if (un->un_rqs_pktp == NULL) { 16417 sd_free_rqs(un); 16418 return (DDI_FAILURE); 16419 } 16420 16421 /* Set up the CDB in the scsi_pkt for a REQUEST SENSE command. */ 16422 (void) scsi_setup_cdb((union scsi_cdb *)un->un_rqs_pktp->pkt_cdbp, 16423 SCMD_REQUEST_SENSE, 0, MAX_SENSE_LENGTH, 0); 16424 16425 SD_FILL_SCSI1_LUN(un, un->un_rqs_pktp); 16426 16427 /* Set up the other needed members in the ARQ scsi_pkt. */ 16428 un->un_rqs_pktp->pkt_comp = sdintr; 16429 un->un_rqs_pktp->pkt_time = sd_io_time; 16430 un->un_rqs_pktp->pkt_flags |= 16431 (FLAG_SENSING | FLAG_HEAD); /* (1222170) */ 16432 16433 /* 16434 * Allocate & init the sd_xbuf struct for the RQS command. Do not 16435 * provide any intpkt, destroypkt routines as we take care of 16436 * scsi_pkt allocation/freeing here and in sd_free_rqs(). 16437 */ 16438 xp = kmem_alloc(sizeof (struct sd_xbuf), KM_SLEEP); 16439 sd_xbuf_init(un, un->un_rqs_bp, xp, SD_CHAIN_NULL, NULL); 16440 xp->xb_pktp = un->un_rqs_pktp; 16441 SD_INFO(SD_LOG_ATTACH_DETACH, un, 16442 "sd_alloc_rqs: un 0x%p, rqs xp 0x%p, pkt 0x%p, buf 0x%p\n", 16443 un, xp, un->un_rqs_pktp, un->un_rqs_bp); 16444 16445 /* 16446 * Save the pointer to the request sense private bp so it can 16447 * be retrieved in sdintr. 16448 */ 16449 un->un_rqs_pktp->pkt_private = un->un_rqs_bp; 16450 ASSERT(un->un_rqs_bp->b_private == xp); 16451 16452 /* 16453 * See if the HBA supports auto-request sense for the specified 16454 * target/lun. If it does, then try to enable it (if not already 16455 * enabled). 16456 * 16457 * Note: For some HBAs (ifp & sf), scsi_ifsetcap will always return 16458 * failure, while for other HBAs (pln) scsi_ifsetcap will always 16459 * return success. However, in both of these cases ARQ is always 16460 * enabled and scsi_ifgetcap will always return true. The best approach 16461 * is to issue the scsi_ifgetcap() first, then try the scsi_ifsetcap(). 16462 * 16463 * The 3rd case is the HBA (adp) always return enabled on 16464 * scsi_ifgetgetcap even when it's not enable, the best approach 16465 * is issue a scsi_ifsetcap then a scsi_ifgetcap 16466 * Note: this case is to circumvent the Adaptec bug. (x86 only) 16467 */ 16468 16469 if (un->un_f_is_fibre == TRUE) { 16470 un->un_f_arq_enabled = TRUE; 16471 } else { 16472 #if defined(__i386) || defined(__amd64) 16473 /* 16474 * Circumvent the Adaptec bug, remove this code when 16475 * the bug is fixed 16476 */ 16477 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 1, 1); 16478 #endif 16479 switch (scsi_ifgetcap(SD_ADDRESS(un), "auto-rqsense", 1)) { 16480 case 0: 16481 SD_INFO(SD_LOG_ATTACH_DETACH, un, 16482 "sd_alloc_rqs: HBA supports ARQ\n"); 16483 /* 16484 * ARQ is supported by this HBA but currently is not 16485 * enabled. Attempt to enable it and if successful then 16486 * mark this instance as ARQ enabled. 16487 */ 16488 if (scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 1, 1) 16489 == 1) { 16490 /* Successfully enabled ARQ in the HBA */ 16491 SD_INFO(SD_LOG_ATTACH_DETACH, un, 16492 "sd_alloc_rqs: ARQ enabled\n"); 16493 un->un_f_arq_enabled = TRUE; 16494 } else { 16495 /* Could not enable ARQ in the HBA */ 16496 SD_INFO(SD_LOG_ATTACH_DETACH, un, 16497 "sd_alloc_rqs: failed ARQ enable\n"); 16498 un->un_f_arq_enabled = FALSE; 16499 } 16500 break; 16501 case 1: 16502 /* 16503 * ARQ is supported by this HBA and is already enabled. 16504 * Just mark ARQ as enabled for this instance. 16505 */ 16506 SD_INFO(SD_LOG_ATTACH_DETACH, un, 16507 "sd_alloc_rqs: ARQ already enabled\n"); 16508 un->un_f_arq_enabled = TRUE; 16509 break; 16510 default: 16511 /* 16512 * ARQ is not supported by this HBA; disable it for this 16513 * instance. 16514 */ 16515 SD_INFO(SD_LOG_ATTACH_DETACH, un, 16516 "sd_alloc_rqs: HBA does not support ARQ\n"); 16517 un->un_f_arq_enabled = FALSE; 16518 break; 16519 } 16520 } 16521 16522 return (DDI_SUCCESS); 16523 } 16524 16525 16526 /* 16527 * Function: sd_free_rqs 16528 * 16529 * Description: Cleanup for the pre-instance RQS command. 16530 * 16531 * Context: Kernel thread context 16532 */ 16533 16534 static void 16535 sd_free_rqs(struct sd_lun *un) 16536 { 16537 ASSERT(un != NULL); 16538 16539 SD_TRACE(SD_LOG_IO_CORE, un, "sd_free_rqs: entry\n"); 16540 16541 /* 16542 * If consistent memory is bound to a scsi_pkt, the pkt 16543 * has to be destroyed *before* freeing the consistent memory. 16544 * Don't change the sequence of this operations. 16545 * scsi_destroy_pkt() might access memory, which isn't allowed, 16546 * after it was freed in scsi_free_consistent_buf(). 16547 */ 16548 if (un->un_rqs_pktp != NULL) { 16549 scsi_destroy_pkt(un->un_rqs_pktp); 16550 un->un_rqs_pktp = NULL; 16551 } 16552 16553 if (un->un_rqs_bp != NULL) { 16554 struct sd_xbuf *xp = SD_GET_XBUF(un->un_rqs_bp); 16555 if (xp != NULL) { 16556 kmem_free(xp, sizeof (struct sd_xbuf)); 16557 } 16558 scsi_free_consistent_buf(un->un_rqs_bp); 16559 un->un_rqs_bp = NULL; 16560 } 16561 SD_TRACE(SD_LOG_IO_CORE, un, "sd_free_rqs: exit\n"); 16562 } 16563 16564 16565 16566 /* 16567 * Function: sd_reduce_throttle 16568 * 16569 * Description: Reduces the maximum # of outstanding commands on a 16570 * target to the current number of outstanding commands. 16571 * Queues a tiemout(9F) callback to restore the limit 16572 * after a specified interval has elapsed. 16573 * Typically used when we get a TRAN_BUSY return code 16574 * back from scsi_transport(). 16575 * 16576 * Arguments: un - ptr to the sd_lun softstate struct 16577 * throttle_type: SD_THROTTLE_TRAN_BUSY or SD_THROTTLE_QFULL 16578 * 16579 * Context: May be called from interrupt context 16580 */ 16581 16582 static void 16583 sd_reduce_throttle(struct sd_lun *un, int throttle_type) 16584 { 16585 ASSERT(un != NULL); 16586 ASSERT(mutex_owned(SD_MUTEX(un))); 16587 ASSERT(un->un_ncmds_in_transport >= 0); 16588 16589 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reduce_throttle: " 16590 "entry: un:0x%p un_throttle:%d un_ncmds_in_transport:%d\n", 16591 un, un->un_throttle, un->un_ncmds_in_transport); 16592 16593 if (un->un_throttle > 1) { 16594 if (un->un_f_use_adaptive_throttle == TRUE) { 16595 switch (throttle_type) { 16596 case SD_THROTTLE_TRAN_BUSY: 16597 if (un->un_busy_throttle == 0) { 16598 un->un_busy_throttle = un->un_throttle; 16599 } 16600 break; 16601 case SD_THROTTLE_QFULL: 16602 un->un_busy_throttle = 0; 16603 break; 16604 default: 16605 ASSERT(FALSE); 16606 } 16607 16608 if (un->un_ncmds_in_transport > 0) { 16609 un->un_throttle = un->un_ncmds_in_transport; 16610 } 16611 16612 } else { 16613 if (un->un_ncmds_in_transport == 0) { 16614 un->un_throttle = 1; 16615 } else { 16616 un->un_throttle = un->un_ncmds_in_transport; 16617 } 16618 } 16619 } 16620 16621 /* Reschedule the timeout if none is currently active */ 16622 if (un->un_reset_throttle_timeid == NULL) { 16623 un->un_reset_throttle_timeid = timeout(sd_restore_throttle, 16624 un, SD_THROTTLE_RESET_INTERVAL); 16625 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16626 "sd_reduce_throttle: timeout scheduled!\n"); 16627 } 16628 16629 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reduce_throttle: " 16630 "exit: un:0x%p un_throttle:%d\n", un, un->un_throttle); 16631 } 16632 16633 16634 16635 /* 16636 * Function: sd_restore_throttle 16637 * 16638 * Description: Callback function for timeout(9F). Resets the current 16639 * value of un->un_throttle to its default. 16640 * 16641 * Arguments: arg - pointer to associated softstate for the device. 16642 * 16643 * Context: May be called from interrupt context 16644 */ 16645 16646 static void 16647 sd_restore_throttle(void *arg) 16648 { 16649 struct sd_lun *un = arg; 16650 16651 ASSERT(un != NULL); 16652 ASSERT(!mutex_owned(SD_MUTEX(un))); 16653 16654 mutex_enter(SD_MUTEX(un)); 16655 16656 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: " 16657 "entry: un:0x%p un_throttle:%d\n", un, un->un_throttle); 16658 16659 un->un_reset_throttle_timeid = NULL; 16660 16661 if (un->un_f_use_adaptive_throttle == TRUE) { 16662 /* 16663 * If un_busy_throttle is nonzero, then it contains the 16664 * value that un_throttle was when we got a TRAN_BUSY back 16665 * from scsi_transport(). We want to revert back to this 16666 * value. 16667 * 16668 * In the QFULL case, the throttle limit will incrementally 16669 * increase until it reaches max throttle. 16670 */ 16671 if (un->un_busy_throttle > 0) { 16672 un->un_throttle = un->un_busy_throttle; 16673 un->un_busy_throttle = 0; 16674 } else { 16675 /* 16676 * increase throttle by 10% open gate slowly, schedule 16677 * another restore if saved throttle has not been 16678 * reached 16679 */ 16680 short throttle; 16681 if (sd_qfull_throttle_enable) { 16682 throttle = un->un_throttle + 16683 max((un->un_throttle / 10), 1); 16684 un->un_throttle = 16685 (throttle < un->un_saved_throttle) ? 16686 throttle : un->un_saved_throttle; 16687 if (un->un_throttle < un->un_saved_throttle) { 16688 un->un_reset_throttle_timeid = 16689 timeout(sd_restore_throttle, 16690 un, 16691 SD_QFULL_THROTTLE_RESET_INTERVAL); 16692 } 16693 } 16694 } 16695 16696 /* 16697 * If un_throttle has fallen below the low-water mark, we 16698 * restore the maximum value here (and allow it to ratchet 16699 * down again if necessary). 16700 */ 16701 if (un->un_throttle < un->un_min_throttle) { 16702 un->un_throttle = un->un_saved_throttle; 16703 } 16704 } else { 16705 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: " 16706 "restoring limit from 0x%x to 0x%x\n", 16707 un->un_throttle, un->un_saved_throttle); 16708 un->un_throttle = un->un_saved_throttle; 16709 } 16710 16711 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, 16712 "sd_restore_throttle: calling sd_start_cmds!\n"); 16713 16714 sd_start_cmds(un, NULL); 16715 16716 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, 16717 "sd_restore_throttle: exit: un:0x%p un_throttle:%d\n", 16718 un, un->un_throttle); 16719 16720 mutex_exit(SD_MUTEX(un)); 16721 16722 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: exit\n"); 16723 } 16724 16725 /* 16726 * Function: sdrunout 16727 * 16728 * Description: Callback routine for scsi_init_pkt when a resource allocation 16729 * fails. 16730 * 16731 * Arguments: arg - a pointer to the sd_lun unit struct for the particular 16732 * soft state instance. 16733 * 16734 * Return Code: The scsi_init_pkt routine allows for the callback function to 16735 * return a 0 indicating the callback should be rescheduled or a 1 16736 * indicating not to reschedule. This routine always returns 1 16737 * because the driver always provides a callback function to 16738 * scsi_init_pkt. This results in a callback always being scheduled 16739 * (via the scsi_init_pkt callback implementation) if a resource 16740 * failure occurs. 16741 * 16742 * Context: This callback function may not block or call routines that block 16743 * 16744 * Note: Using the scsi_init_pkt callback facility can result in an I/O 16745 * request persisting at the head of the list which cannot be 16746 * satisfied even after multiple retries. In the future the driver 16747 * may implement some time of maximum runout count before failing 16748 * an I/O. 16749 */ 16750 16751 static int 16752 sdrunout(caddr_t arg) 16753 { 16754 struct sd_lun *un = (struct sd_lun *)arg; 16755 16756 ASSERT(un != NULL); 16757 ASSERT(!mutex_owned(SD_MUTEX(un))); 16758 16759 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdrunout: entry\n"); 16760 16761 mutex_enter(SD_MUTEX(un)); 16762 sd_start_cmds(un, NULL); 16763 mutex_exit(SD_MUTEX(un)); 16764 /* 16765 * This callback routine always returns 1 (i.e. do not reschedule) 16766 * because we always specify sdrunout as the callback handler for 16767 * scsi_init_pkt inside the call to sd_start_cmds. 16768 */ 16769 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdrunout: exit\n"); 16770 return (1); 16771 } 16772 16773 16774 /* 16775 * Function: sdintr 16776 * 16777 * Description: Completion callback routine for scsi_pkt(9S) structs 16778 * sent to the HBA driver via scsi_transport(9F). 16779 * 16780 * Context: Interrupt context 16781 */ 16782 16783 static void 16784 sdintr(struct scsi_pkt *pktp) 16785 { 16786 struct buf *bp; 16787 struct sd_xbuf *xp; 16788 struct sd_lun *un; 16789 size_t actual_len; 16790 sd_ssc_t *sscp; 16791 16792 ASSERT(pktp != NULL); 16793 bp = (struct buf *)pktp->pkt_private; 16794 ASSERT(bp != NULL); 16795 xp = SD_GET_XBUF(bp); 16796 ASSERT(xp != NULL); 16797 ASSERT(xp->xb_pktp != NULL); 16798 un = SD_GET_UN(bp); 16799 ASSERT(un != NULL); 16800 ASSERT(!mutex_owned(SD_MUTEX(un))); 16801 16802 #ifdef SD_FAULT_INJECTION 16803 16804 SD_INFO(SD_LOG_IOERR, un, "sdintr: sdintr calling Fault injection\n"); 16805 /* SD FaultInjection */ 16806 sd_faultinjection(pktp); 16807 16808 #endif /* SD_FAULT_INJECTION */ 16809 16810 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdintr: entry: buf:0x%p," 16811 " xp:0x%p, un:0x%p\n", bp, xp, un); 16812 16813 mutex_enter(SD_MUTEX(un)); 16814 16815 ASSERT(un->un_fm_private != NULL); 16816 sscp = &((struct sd_fm_internal *)(un->un_fm_private))->fm_ssc; 16817 ASSERT(sscp != NULL); 16818 16819 /* Reduce the count of the #commands currently in transport */ 16820 un->un_ncmds_in_transport--; 16821 ASSERT(un->un_ncmds_in_transport >= 0); 16822 16823 /* Increment counter to indicate that the callback routine is active */ 16824 un->un_in_callback++; 16825 16826 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp); 16827 16828 #ifdef SDDEBUG 16829 if (bp == un->un_retry_bp) { 16830 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sdintr: " 16831 "un:0x%p: GOT retry_bp:0x%p un_ncmds_in_transport:%d\n", 16832 un, un->un_retry_bp, un->un_ncmds_in_transport); 16833 } 16834 #endif 16835 16836 /* 16837 * If pkt_reason is CMD_DEV_GONE, fail the command, and update the media 16838 * state if needed. 16839 */ 16840 if (pktp->pkt_reason == CMD_DEV_GONE) { 16841 /* Prevent multiple console messages for the same failure. */ 16842 if (un->un_last_pkt_reason != CMD_DEV_GONE) { 16843 un->un_last_pkt_reason = CMD_DEV_GONE; 16844 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 16845 "Command failed to complete...Device is gone\n"); 16846 } 16847 if (un->un_mediastate != DKIO_DEV_GONE) { 16848 un->un_mediastate = DKIO_DEV_GONE; 16849 cv_broadcast(&un->un_state_cv); 16850 } 16851 /* 16852 * If the command happens to be the REQUEST SENSE command, 16853 * free up the rqs buf and fail the original command. 16854 */ 16855 if (bp == un->un_rqs_bp) { 16856 bp = sd_mark_rqs_idle(un, xp); 16857 } 16858 sd_return_failed_command(un, bp, EIO); 16859 goto exit; 16860 } 16861 16862 if (pktp->pkt_state & STATE_XARQ_DONE) { 16863 SD_TRACE(SD_LOG_COMMON, un, 16864 "sdintr: extra sense data received. pkt=%p\n", pktp); 16865 } 16866 16867 /* 16868 * First see if the pkt has auto-request sense data with it.... 16869 * Look at the packet state first so we don't take a performance 16870 * hit looking at the arq enabled flag unless absolutely necessary. 16871 */ 16872 if ((pktp->pkt_state & STATE_ARQ_DONE) && 16873 (un->un_f_arq_enabled == TRUE)) { 16874 /* 16875 * The HBA did an auto request sense for this command so check 16876 * for FLAG_DIAGNOSE. If set this indicates a uscsi or internal 16877 * driver command that should not be retried. 16878 */ 16879 if ((pktp->pkt_flags & FLAG_DIAGNOSE) != 0) { 16880 /* 16881 * Save the relevant sense info into the xp for the 16882 * original cmd. 16883 */ 16884 struct scsi_arq_status *asp; 16885 asp = (struct scsi_arq_status *)(pktp->pkt_scbp); 16886 xp->xb_sense_status = 16887 *((uchar_t *)(&(asp->sts_rqpkt_status))); 16888 xp->xb_sense_state = asp->sts_rqpkt_state; 16889 xp->xb_sense_resid = asp->sts_rqpkt_resid; 16890 if (pktp->pkt_state & STATE_XARQ_DONE) { 16891 actual_len = MAX_SENSE_LENGTH - 16892 xp->xb_sense_resid; 16893 bcopy(&asp->sts_sensedata, xp->xb_sense_data, 16894 MAX_SENSE_LENGTH); 16895 } else { 16896 if (xp->xb_sense_resid > SENSE_LENGTH) { 16897 actual_len = MAX_SENSE_LENGTH - 16898 xp->xb_sense_resid; 16899 } else { 16900 actual_len = SENSE_LENGTH - 16901 xp->xb_sense_resid; 16902 } 16903 if (xp->xb_pkt_flags & SD_XB_USCSICMD) { 16904 if ((((struct uscsi_cmd *) 16905 (xp->xb_pktinfo))->uscsi_rqlen) > 16906 actual_len) { 16907 xp->xb_sense_resid = 16908 (((struct uscsi_cmd *) 16909 (xp->xb_pktinfo))-> 16910 uscsi_rqlen) - actual_len; 16911 } else { 16912 xp->xb_sense_resid = 0; 16913 } 16914 } 16915 bcopy(&asp->sts_sensedata, xp->xb_sense_data, 16916 SENSE_LENGTH); 16917 } 16918 16919 /* fail the command */ 16920 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16921 "sdintr: arq done and FLAG_DIAGNOSE set\n"); 16922 sd_return_failed_command(un, bp, EIO); 16923 goto exit; 16924 } 16925 16926 #if (defined(__i386) || defined(__amd64)) /* DMAFREE for x86 only */ 16927 /* 16928 * We want to either retry or fail this command, so free 16929 * the DMA resources here. If we retry the command then 16930 * the DMA resources will be reallocated in sd_start_cmds(). 16931 * Note that when PKT_DMA_PARTIAL is used, this reallocation 16932 * causes the *entire* transfer to start over again from the 16933 * beginning of the request, even for PARTIAL chunks that 16934 * have already transferred successfully. 16935 */ 16936 if ((un->un_f_is_fibre == TRUE) && 16937 ((xp->xb_pkt_flags & SD_XB_USCSICMD) == 0) && 16938 ((pktp->pkt_flags & FLAG_SENSING) == 0)) { 16939 scsi_dmafree(pktp); 16940 xp->xb_pkt_flags |= SD_XB_DMA_FREED; 16941 } 16942 #endif 16943 16944 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16945 "sdintr: arq done, sd_handle_auto_request_sense\n"); 16946 16947 sd_handle_auto_request_sense(un, bp, xp, pktp); 16948 goto exit; 16949 } 16950 16951 /* Next see if this is the REQUEST SENSE pkt for the instance */ 16952 if (pktp->pkt_flags & FLAG_SENSING) { 16953 /* This pktp is from the unit's REQUEST_SENSE command */ 16954 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16955 "sdintr: sd_handle_request_sense\n"); 16956 sd_handle_request_sense(un, bp, xp, pktp); 16957 goto exit; 16958 } 16959 16960 /* 16961 * Check to see if the command successfully completed as requested; 16962 * this is the most common case (and also the hot performance path). 16963 * 16964 * Requirements for successful completion are: 16965 * pkt_reason is CMD_CMPLT and packet status is status good. 16966 * In addition: 16967 * - A residual of zero indicates successful completion no matter what 16968 * the command is. 16969 * - If the residual is not zero and the command is not a read or 16970 * write, then it's still defined as successful completion. In other 16971 * words, if the command is a read or write the residual must be 16972 * zero for successful completion. 16973 * - If the residual is not zero and the command is a read or 16974 * write, and it's a USCSICMD, then it's still defined as 16975 * successful completion. 16976 */ 16977 if ((pktp->pkt_reason == CMD_CMPLT) && 16978 (SD_GET_PKT_STATUS(pktp) == STATUS_GOOD)) { 16979 16980 /* 16981 * Since this command is returned with a good status, we 16982 * can reset the count for Sonoma failover. 16983 */ 16984 un->un_sonoma_failure_count = 0; 16985 16986 /* 16987 * Return all USCSI commands on good status 16988 */ 16989 if (pktp->pkt_resid == 0) { 16990 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16991 "sdintr: returning command for resid == 0\n"); 16992 } else if (((SD_GET_PKT_OPCODE(pktp) & 0x1F) != SCMD_READ) && 16993 ((SD_GET_PKT_OPCODE(pktp) & 0x1F) != SCMD_WRITE)) { 16994 SD_UPDATE_B_RESID(bp, pktp); 16995 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 16996 "sdintr: returning command for resid != 0\n"); 16997 } else if (xp->xb_pkt_flags & SD_XB_USCSICMD) { 16998 SD_UPDATE_B_RESID(bp, pktp); 16999 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17000 "sdintr: returning uscsi command\n"); 17001 } else { 17002 goto not_successful; 17003 } 17004 sd_return_command(un, bp); 17005 17006 /* 17007 * Decrement counter to indicate that the callback routine 17008 * is done. 17009 */ 17010 un->un_in_callback--; 17011 ASSERT(un->un_in_callback >= 0); 17012 mutex_exit(SD_MUTEX(un)); 17013 17014 return; 17015 } 17016 17017 not_successful: 17018 17019 #if (defined(__i386) || defined(__amd64)) /* DMAFREE for x86 only */ 17020 /* 17021 * The following is based upon knowledge of the underlying transport 17022 * and its use of DMA resources. This code should be removed when 17023 * PKT_DMA_PARTIAL support is taken out of the disk driver in favor 17024 * of the new PKT_CMD_BREAKUP protocol. See also sd_initpkt_for_buf() 17025 * and sd_start_cmds(). 17026 * 17027 * Free any DMA resources associated with this command if there 17028 * is a chance it could be retried or enqueued for later retry. 17029 * If we keep the DMA binding then mpxio cannot reissue the 17030 * command on another path whenever a path failure occurs. 17031 * 17032 * Note that when PKT_DMA_PARTIAL is used, free/reallocation 17033 * causes the *entire* transfer to start over again from the 17034 * beginning of the request, even for PARTIAL chunks that 17035 * have already transferred successfully. 17036 * 17037 * This is only done for non-uscsi commands (and also skipped for the 17038 * driver's internal RQS command). Also just do this for Fibre Channel 17039 * devices as these are the only ones that support mpxio. 17040 */ 17041 if ((un->un_f_is_fibre == TRUE) && 17042 ((xp->xb_pkt_flags & SD_XB_USCSICMD) == 0) && 17043 ((pktp->pkt_flags & FLAG_SENSING) == 0)) { 17044 scsi_dmafree(pktp); 17045 xp->xb_pkt_flags |= SD_XB_DMA_FREED; 17046 } 17047 #endif 17048 17049 /* 17050 * The command did not successfully complete as requested so check 17051 * for FLAG_DIAGNOSE. If set this indicates a uscsi or internal 17052 * driver command that should not be retried so just return. If 17053 * FLAG_DIAGNOSE is not set the error will be processed below. 17054 */ 17055 if ((pktp->pkt_flags & FLAG_DIAGNOSE) != 0) { 17056 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17057 "sdintr: FLAG_DIAGNOSE: sd_return_failed_command\n"); 17058 /* 17059 * Issue a request sense if a check condition caused the error 17060 * (we handle the auto request sense case above), otherwise 17061 * just fail the command. 17062 */ 17063 if ((pktp->pkt_reason == CMD_CMPLT) && 17064 (SD_GET_PKT_STATUS(pktp) == STATUS_CHECK)) { 17065 sd_send_request_sense_command(un, bp, pktp); 17066 } else { 17067 sd_return_failed_command(un, bp, EIO); 17068 } 17069 goto exit; 17070 } 17071 17072 /* 17073 * The command did not successfully complete as requested so process 17074 * the error, retry, and/or attempt recovery. 17075 */ 17076 switch (pktp->pkt_reason) { 17077 case CMD_CMPLT: 17078 switch (SD_GET_PKT_STATUS(pktp)) { 17079 case STATUS_GOOD: 17080 /* 17081 * The command completed successfully with a non-zero 17082 * residual 17083 */ 17084 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17085 "sdintr: STATUS_GOOD \n"); 17086 sd_pkt_status_good(un, bp, xp, pktp); 17087 break; 17088 17089 case STATUS_CHECK: 17090 case STATUS_TERMINATED: 17091 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17092 "sdintr: STATUS_TERMINATED | STATUS_CHECK\n"); 17093 sd_pkt_status_check_condition(un, bp, xp, pktp); 17094 break; 17095 17096 case STATUS_BUSY: 17097 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17098 "sdintr: STATUS_BUSY\n"); 17099 sd_pkt_status_busy(un, bp, xp, pktp); 17100 break; 17101 17102 case STATUS_RESERVATION_CONFLICT: 17103 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17104 "sdintr: STATUS_RESERVATION_CONFLICT\n"); 17105 sd_pkt_status_reservation_conflict(un, bp, xp, pktp); 17106 break; 17107 17108 case STATUS_QFULL: 17109 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17110 "sdintr: STATUS_QFULL\n"); 17111 sd_pkt_status_qfull(un, bp, xp, pktp); 17112 break; 17113 17114 case STATUS_MET: 17115 case STATUS_INTERMEDIATE: 17116 case STATUS_SCSI2: 17117 case STATUS_INTERMEDIATE_MET: 17118 case STATUS_ACA_ACTIVE: 17119 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 17120 "Unexpected SCSI status received: 0x%x\n", 17121 SD_GET_PKT_STATUS(pktp)); 17122 /* 17123 * Mark the ssc_flags when detected invalid status 17124 * code for non-USCSI command. 17125 */ 17126 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 17127 sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_STATUS, 17128 0, "stat-code"); 17129 } 17130 sd_return_failed_command(un, bp, EIO); 17131 break; 17132 17133 default: 17134 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 17135 "Invalid SCSI status received: 0x%x\n", 17136 SD_GET_PKT_STATUS(pktp)); 17137 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 17138 sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_STATUS, 17139 0, "stat-code"); 17140 } 17141 sd_return_failed_command(un, bp, EIO); 17142 break; 17143 17144 } 17145 break; 17146 17147 case CMD_INCOMPLETE: 17148 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17149 "sdintr: CMD_INCOMPLETE\n"); 17150 sd_pkt_reason_cmd_incomplete(un, bp, xp, pktp); 17151 break; 17152 case CMD_TRAN_ERR: 17153 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17154 "sdintr: CMD_TRAN_ERR\n"); 17155 sd_pkt_reason_cmd_tran_err(un, bp, xp, pktp); 17156 break; 17157 case CMD_RESET: 17158 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17159 "sdintr: CMD_RESET \n"); 17160 sd_pkt_reason_cmd_reset(un, bp, xp, pktp); 17161 break; 17162 case CMD_ABORTED: 17163 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17164 "sdintr: CMD_ABORTED \n"); 17165 sd_pkt_reason_cmd_aborted(un, bp, xp, pktp); 17166 break; 17167 case CMD_TIMEOUT: 17168 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17169 "sdintr: CMD_TIMEOUT\n"); 17170 sd_pkt_reason_cmd_timeout(un, bp, xp, pktp); 17171 break; 17172 case CMD_UNX_BUS_FREE: 17173 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17174 "sdintr: CMD_UNX_BUS_FREE \n"); 17175 sd_pkt_reason_cmd_unx_bus_free(un, bp, xp, pktp); 17176 break; 17177 case CMD_TAG_REJECT: 17178 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17179 "sdintr: CMD_TAG_REJECT\n"); 17180 sd_pkt_reason_cmd_tag_reject(un, bp, xp, pktp); 17181 break; 17182 default: 17183 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 17184 "sdintr: default\n"); 17185 /* 17186 * Mark the ssc_flags for detecting invliad pkt_reason. 17187 */ 17188 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 17189 sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_PKT_REASON, 17190 0, "pkt-reason"); 17191 } 17192 sd_pkt_reason_default(un, bp, xp, pktp); 17193 break; 17194 } 17195 17196 exit: 17197 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdintr: exit\n"); 17198 17199 /* Decrement counter to indicate that the callback routine is done. */ 17200 un->un_in_callback--; 17201 ASSERT(un->un_in_callback >= 0); 17202 17203 /* 17204 * At this point, the pkt has been dispatched, ie, it is either 17205 * being re-tried or has been returned to its caller and should 17206 * not be referenced. 17207 */ 17208 17209 mutex_exit(SD_MUTEX(un)); 17210 } 17211 17212 17213 /* 17214 * Function: sd_print_incomplete_msg 17215 * 17216 * Description: Prints the error message for a CMD_INCOMPLETE error. 17217 * 17218 * Arguments: un - ptr to associated softstate for the device. 17219 * bp - ptr to the buf(9S) for the command. 17220 * arg - message string ptr 17221 * code - SD_DELAYED_RETRY_ISSUED, SD_IMMEDIATE_RETRY_ISSUED, 17222 * or SD_NO_RETRY_ISSUED. 17223 * 17224 * Context: May be called under interrupt context 17225 */ 17226 17227 static void 17228 sd_print_incomplete_msg(struct sd_lun *un, struct buf *bp, void *arg, int code) 17229 { 17230 struct scsi_pkt *pktp; 17231 char *msgp; 17232 char *cmdp = arg; 17233 17234 ASSERT(un != NULL); 17235 ASSERT(mutex_owned(SD_MUTEX(un))); 17236 ASSERT(bp != NULL); 17237 ASSERT(arg != NULL); 17238 pktp = SD_GET_PKTP(bp); 17239 ASSERT(pktp != NULL); 17240 17241 switch (code) { 17242 case SD_DELAYED_RETRY_ISSUED: 17243 case SD_IMMEDIATE_RETRY_ISSUED: 17244 msgp = "retrying"; 17245 break; 17246 case SD_NO_RETRY_ISSUED: 17247 default: 17248 msgp = "giving up"; 17249 break; 17250 } 17251 17252 if ((pktp->pkt_flags & FLAG_SILENT) == 0) { 17253 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 17254 "incomplete %s- %s\n", cmdp, msgp); 17255 } 17256 } 17257 17258 17259 17260 /* 17261 * Function: sd_pkt_status_good 17262 * 17263 * Description: Processing for a STATUS_GOOD code in pkt_status. 17264 * 17265 * Context: May be called under interrupt context 17266 */ 17267 17268 static void 17269 sd_pkt_status_good(struct sd_lun *un, struct buf *bp, 17270 struct sd_xbuf *xp, struct scsi_pkt *pktp) 17271 { 17272 char *cmdp; 17273 17274 ASSERT(un != NULL); 17275 ASSERT(mutex_owned(SD_MUTEX(un))); 17276 ASSERT(bp != NULL); 17277 ASSERT(xp != NULL); 17278 ASSERT(pktp != NULL); 17279 ASSERT(pktp->pkt_reason == CMD_CMPLT); 17280 ASSERT(SD_GET_PKT_STATUS(pktp) == STATUS_GOOD); 17281 ASSERT(pktp->pkt_resid != 0); 17282 17283 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: entry\n"); 17284 17285 SD_UPDATE_ERRSTATS(un, sd_harderrs); 17286 switch (SD_GET_PKT_OPCODE(pktp) & 0x1F) { 17287 case SCMD_READ: 17288 cmdp = "read"; 17289 break; 17290 case SCMD_WRITE: 17291 cmdp = "write"; 17292 break; 17293 default: 17294 SD_UPDATE_B_RESID(bp, pktp); 17295 sd_return_command(un, bp); 17296 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: exit\n"); 17297 return; 17298 } 17299 17300 /* 17301 * See if we can retry the read/write, preferrably immediately. 17302 * If retries are exhaused, then sd_retry_command() will update 17303 * the b_resid count. 17304 */ 17305 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_incomplete_msg, 17306 cmdp, EIO, (clock_t)0, NULL); 17307 17308 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: exit\n"); 17309 } 17310 17311 17312 17313 17314 17315 /* 17316 * Function: sd_handle_request_sense 17317 * 17318 * Description: Processing for non-auto Request Sense command. 17319 * 17320 * Arguments: un - ptr to associated softstate 17321 * sense_bp - ptr to buf(9S) for the RQS command 17322 * sense_xp - ptr to the sd_xbuf for the RQS command 17323 * sense_pktp - ptr to the scsi_pkt(9S) for the RQS command 17324 * 17325 * Context: May be called under interrupt context 17326 */ 17327 17328 static void 17329 sd_handle_request_sense(struct sd_lun *un, struct buf *sense_bp, 17330 struct sd_xbuf *sense_xp, struct scsi_pkt *sense_pktp) 17331 { 17332 struct buf *cmd_bp; /* buf for the original command */ 17333 struct sd_xbuf *cmd_xp; /* sd_xbuf for the original command */ 17334 struct scsi_pkt *cmd_pktp; /* pkt for the original command */ 17335 size_t actual_len; /* actual sense data length */ 17336 17337 ASSERT(un != NULL); 17338 ASSERT(mutex_owned(SD_MUTEX(un))); 17339 ASSERT(sense_bp != NULL); 17340 ASSERT(sense_xp != NULL); 17341 ASSERT(sense_pktp != NULL); 17342 17343 /* 17344 * Note the sense_bp, sense_xp, and sense_pktp here are for the 17345 * RQS command and not the original command. 17346 */ 17347 ASSERT(sense_pktp == un->un_rqs_pktp); 17348 ASSERT(sense_bp == un->un_rqs_bp); 17349 ASSERT((sense_pktp->pkt_flags & (FLAG_SENSING | FLAG_HEAD)) == 17350 (FLAG_SENSING | FLAG_HEAD)); 17351 ASSERT((((SD_GET_XBUF(sense_xp->xb_sense_bp))->xb_pktp->pkt_flags) & 17352 FLAG_SENSING) == FLAG_SENSING); 17353 17354 /* These are the bp, xp, and pktp for the original command */ 17355 cmd_bp = sense_xp->xb_sense_bp; 17356 cmd_xp = SD_GET_XBUF(cmd_bp); 17357 cmd_pktp = SD_GET_PKTP(cmd_bp); 17358 17359 if (sense_pktp->pkt_reason != CMD_CMPLT) { 17360 /* 17361 * The REQUEST SENSE command failed. Release the REQUEST 17362 * SENSE command for re-use, get back the bp for the original 17363 * command, and attempt to re-try the original command if 17364 * FLAG_DIAGNOSE is not set in the original packet. 17365 */ 17366 SD_UPDATE_ERRSTATS(un, sd_harderrs); 17367 if ((cmd_pktp->pkt_flags & FLAG_DIAGNOSE) == 0) { 17368 cmd_bp = sd_mark_rqs_idle(un, sense_xp); 17369 sd_retry_command(un, cmd_bp, SD_RETRIES_STANDARD, 17370 NULL, NULL, EIO, (clock_t)0, NULL); 17371 return; 17372 } 17373 } 17374 17375 /* 17376 * Save the relevant sense info into the xp for the original cmd. 17377 * 17378 * Note: if the request sense failed the state info will be zero 17379 * as set in sd_mark_rqs_busy() 17380 */ 17381 cmd_xp->xb_sense_status = *(sense_pktp->pkt_scbp); 17382 cmd_xp->xb_sense_state = sense_pktp->pkt_state; 17383 actual_len = MAX_SENSE_LENGTH - sense_pktp->pkt_resid; 17384 if ((cmd_xp->xb_pkt_flags & SD_XB_USCSICMD) && 17385 (((struct uscsi_cmd *)cmd_xp->xb_pktinfo)->uscsi_rqlen > 17386 SENSE_LENGTH)) { 17387 bcopy(sense_bp->b_un.b_addr, cmd_xp->xb_sense_data, 17388 MAX_SENSE_LENGTH); 17389 cmd_xp->xb_sense_resid = sense_pktp->pkt_resid; 17390 } else { 17391 bcopy(sense_bp->b_un.b_addr, cmd_xp->xb_sense_data, 17392 SENSE_LENGTH); 17393 if (actual_len < SENSE_LENGTH) { 17394 cmd_xp->xb_sense_resid = SENSE_LENGTH - actual_len; 17395 } else { 17396 cmd_xp->xb_sense_resid = 0; 17397 } 17398 } 17399 17400 /* 17401 * Free up the RQS command.... 17402 * NOTE: 17403 * Must do this BEFORE calling sd_validate_sense_data! 17404 * sd_validate_sense_data may return the original command in 17405 * which case the pkt will be freed and the flags can no 17406 * longer be touched. 17407 * SD_MUTEX is held through this process until the command 17408 * is dispatched based upon the sense data, so there are 17409 * no race conditions. 17410 */ 17411 (void) sd_mark_rqs_idle(un, sense_xp); 17412 17413 /* 17414 * For a retryable command see if we have valid sense data, if so then 17415 * turn it over to sd_decode_sense() to figure out the right course of 17416 * action. Just fail a non-retryable command. 17417 */ 17418 if ((cmd_pktp->pkt_flags & FLAG_DIAGNOSE) == 0) { 17419 if (sd_validate_sense_data(un, cmd_bp, cmd_xp, actual_len) == 17420 SD_SENSE_DATA_IS_VALID) { 17421 sd_decode_sense(un, cmd_bp, cmd_xp, cmd_pktp); 17422 } 17423 } else { 17424 SD_DUMP_MEMORY(un, SD_LOG_IO_CORE, "Failed CDB", 17425 (uchar_t *)cmd_pktp->pkt_cdbp, CDB_SIZE, SD_LOG_HEX); 17426 SD_DUMP_MEMORY(un, SD_LOG_IO_CORE, "Sense Data", 17427 (uchar_t *)cmd_xp->xb_sense_data, SENSE_LENGTH, SD_LOG_HEX); 17428 sd_return_failed_command(un, cmd_bp, EIO); 17429 } 17430 } 17431 17432 17433 17434 17435 /* 17436 * Function: sd_handle_auto_request_sense 17437 * 17438 * Description: Processing for auto-request sense information. 17439 * 17440 * Arguments: un - ptr to associated softstate 17441 * bp - ptr to buf(9S) for the command 17442 * xp - ptr to the sd_xbuf for the command 17443 * pktp - ptr to the scsi_pkt(9S) for the command 17444 * 17445 * Context: May be called under interrupt context 17446 */ 17447 17448 static void 17449 sd_handle_auto_request_sense(struct sd_lun *un, struct buf *bp, 17450 struct sd_xbuf *xp, struct scsi_pkt *pktp) 17451 { 17452 struct scsi_arq_status *asp; 17453 size_t actual_len; 17454 17455 ASSERT(un != NULL); 17456 ASSERT(mutex_owned(SD_MUTEX(un))); 17457 ASSERT(bp != NULL); 17458 ASSERT(xp != NULL); 17459 ASSERT(pktp != NULL); 17460 ASSERT(pktp != un->un_rqs_pktp); 17461 ASSERT(bp != un->un_rqs_bp); 17462 17463 /* 17464 * For auto-request sense, we get a scsi_arq_status back from 17465 * the HBA, with the sense data in the sts_sensedata member. 17466 * The pkt_scbp of the packet points to this scsi_arq_status. 17467 */ 17468 asp = (struct scsi_arq_status *)(pktp->pkt_scbp); 17469 17470 if (asp->sts_rqpkt_reason != CMD_CMPLT) { 17471 /* 17472 * The auto REQUEST SENSE failed; see if we can re-try 17473 * the original command. 17474 */ 17475 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 17476 "auto request sense failed (reason=%s)\n", 17477 scsi_rname(asp->sts_rqpkt_reason)); 17478 17479 sd_reset_target(un, pktp); 17480 17481 sd_retry_command(un, bp, SD_RETRIES_STANDARD, 17482 NULL, NULL, EIO, (clock_t)0, NULL); 17483 return; 17484 } 17485 17486 /* Save the relevant sense info into the xp for the original cmd. */ 17487 xp->xb_sense_status = *((uchar_t *)(&(asp->sts_rqpkt_status))); 17488 xp->xb_sense_state = asp->sts_rqpkt_state; 17489 xp->xb_sense_resid = asp->sts_rqpkt_resid; 17490 if (xp->xb_sense_state & STATE_XARQ_DONE) { 17491 actual_len = MAX_SENSE_LENGTH - xp->xb_sense_resid; 17492 bcopy(&asp->sts_sensedata, xp->xb_sense_data, 17493 MAX_SENSE_LENGTH); 17494 } else { 17495 if (xp->xb_sense_resid > SENSE_LENGTH) { 17496 actual_len = MAX_SENSE_LENGTH - xp->xb_sense_resid; 17497 } else { 17498 actual_len = SENSE_LENGTH - xp->xb_sense_resid; 17499 } 17500 if (xp->xb_pkt_flags & SD_XB_USCSICMD) { 17501 if ((((struct uscsi_cmd *) 17502 (xp->xb_pktinfo))->uscsi_rqlen) > actual_len) { 17503 xp->xb_sense_resid = (((struct uscsi_cmd *) 17504 (xp->xb_pktinfo))->uscsi_rqlen) - 17505 actual_len; 17506 } else { 17507 xp->xb_sense_resid = 0; 17508 } 17509 } 17510 bcopy(&asp->sts_sensedata, xp->xb_sense_data, SENSE_LENGTH); 17511 } 17512 17513 /* 17514 * See if we have valid sense data, if so then turn it over to 17515 * sd_decode_sense() to figure out the right course of action. 17516 */ 17517 if (sd_validate_sense_data(un, bp, xp, actual_len) == 17518 SD_SENSE_DATA_IS_VALID) { 17519 sd_decode_sense(un, bp, xp, pktp); 17520 } 17521 } 17522 17523 17524 /* 17525 * Function: sd_print_sense_failed_msg 17526 * 17527 * Description: Print log message when RQS has failed. 17528 * 17529 * Arguments: un - ptr to associated softstate 17530 * bp - ptr to buf(9S) for the command 17531 * arg - generic message string ptr 17532 * code - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED, 17533 * or SD_NO_RETRY_ISSUED 17534 * 17535 * Context: May be called from interrupt context 17536 */ 17537 17538 static void 17539 sd_print_sense_failed_msg(struct sd_lun *un, struct buf *bp, void *arg, 17540 int code) 17541 { 17542 char *msgp = arg; 17543 17544 ASSERT(un != NULL); 17545 ASSERT(mutex_owned(SD_MUTEX(un))); 17546 ASSERT(bp != NULL); 17547 17548 if ((code == SD_NO_RETRY_ISSUED) && (msgp != NULL)) { 17549 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, msgp); 17550 } 17551 } 17552 17553 17554 /* 17555 * Function: sd_validate_sense_data 17556 * 17557 * Description: Check the given sense data for validity. 17558 * If the sense data is not valid, the command will 17559 * be either failed or retried! 17560 * 17561 * Return Code: SD_SENSE_DATA_IS_INVALID 17562 * SD_SENSE_DATA_IS_VALID 17563 * 17564 * Context: May be called from interrupt context 17565 */ 17566 17567 static int 17568 sd_validate_sense_data(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 17569 size_t actual_len) 17570 { 17571 struct scsi_extended_sense *esp; 17572 struct scsi_pkt *pktp; 17573 char *msgp = NULL; 17574 sd_ssc_t *sscp; 17575 17576 ASSERT(un != NULL); 17577 ASSERT(mutex_owned(SD_MUTEX(un))); 17578 ASSERT(bp != NULL); 17579 ASSERT(bp != un->un_rqs_bp); 17580 ASSERT(xp != NULL); 17581 ASSERT(un->un_fm_private != NULL); 17582 17583 pktp = SD_GET_PKTP(bp); 17584 ASSERT(pktp != NULL); 17585 17586 sscp = &((struct sd_fm_internal *)(un->un_fm_private))->fm_ssc; 17587 ASSERT(sscp != NULL); 17588 17589 /* 17590 * Check the status of the RQS command (auto or manual). 17591 */ 17592 switch (xp->xb_sense_status & STATUS_MASK) { 17593 case STATUS_GOOD: 17594 break; 17595 17596 case STATUS_RESERVATION_CONFLICT: 17597 sd_pkt_status_reservation_conflict(un, bp, xp, pktp); 17598 return (SD_SENSE_DATA_IS_INVALID); 17599 17600 case STATUS_BUSY: 17601 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 17602 "Busy Status on REQUEST SENSE\n"); 17603 sd_retry_command(un, bp, SD_RETRIES_BUSY, NULL, 17604 NULL, EIO, un->un_busy_timeout / 500, kstat_waitq_enter); 17605 return (SD_SENSE_DATA_IS_INVALID); 17606 17607 case STATUS_QFULL: 17608 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 17609 "QFULL Status on REQUEST SENSE\n"); 17610 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, 17611 NULL, EIO, un->un_busy_timeout / 500, kstat_waitq_enter); 17612 return (SD_SENSE_DATA_IS_INVALID); 17613 17614 case STATUS_CHECK: 17615 case STATUS_TERMINATED: 17616 msgp = "Check Condition on REQUEST SENSE\n"; 17617 goto sense_failed; 17618 17619 default: 17620 msgp = "Not STATUS_GOOD on REQUEST_SENSE\n"; 17621 goto sense_failed; 17622 } 17623 17624 /* 17625 * See if we got the minimum required amount of sense data. 17626 * Note: We are assuming the returned sense data is SENSE_LENGTH bytes 17627 * or less. 17628 */ 17629 if (((xp->xb_sense_state & STATE_XFERRED_DATA) == 0) || 17630 (actual_len == 0)) { 17631 msgp = "Request Sense couldn't get sense data\n"; 17632 goto sense_failed; 17633 } 17634 17635 if (actual_len < SUN_MIN_SENSE_LENGTH) { 17636 msgp = "Not enough sense information\n"; 17637 /* Mark the ssc_flags for detecting invalid sense data */ 17638 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 17639 sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_SENSE, 0, 17640 "sense-data"); 17641 } 17642 goto sense_failed; 17643 } 17644 17645 /* 17646 * We require the extended sense data 17647 */ 17648 esp = (struct scsi_extended_sense *)xp->xb_sense_data; 17649 if (esp->es_class != CLASS_EXTENDED_SENSE) { 17650 if ((pktp->pkt_flags & FLAG_SILENT) == 0) { 17651 static char tmp[8]; 17652 static char buf[148]; 17653 char *p = (char *)(xp->xb_sense_data); 17654 int i; 17655 17656 mutex_enter(&sd_sense_mutex); 17657 (void) strcpy(buf, "undecodable sense information:"); 17658 for (i = 0; i < actual_len; i++) { 17659 (void) sprintf(tmp, " 0x%x", *(p++)&0xff); 17660 (void) strcpy(&buf[strlen(buf)], tmp); 17661 } 17662 i = strlen(buf); 17663 (void) strcpy(&buf[i], "-(assumed fatal)\n"); 17664 17665 if (SD_FM_LOG(un) == SD_FM_LOG_NSUP) { 17666 scsi_log(SD_DEVINFO(un), sd_label, 17667 CE_WARN, buf); 17668 } 17669 mutex_exit(&sd_sense_mutex); 17670 } 17671 17672 /* Mark the ssc_flags for detecting invalid sense data */ 17673 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 17674 sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_SENSE, 0, 17675 "sense-data"); 17676 } 17677 17678 /* Note: Legacy behavior, fail the command with no retry */ 17679 sd_return_failed_command(un, bp, EIO); 17680 return (SD_SENSE_DATA_IS_INVALID); 17681 } 17682 17683 /* 17684 * Check that es_code is valid (es_class concatenated with es_code 17685 * make up the "response code" field. es_class will always be 7, so 17686 * make sure es_code is 0, 1, 2, 3 or 0xf. es_code will indicate the 17687 * format. 17688 */ 17689 if ((esp->es_code != CODE_FMT_FIXED_CURRENT) && 17690 (esp->es_code != CODE_FMT_FIXED_DEFERRED) && 17691 (esp->es_code != CODE_FMT_DESCR_CURRENT) && 17692 (esp->es_code != CODE_FMT_DESCR_DEFERRED) && 17693 (esp->es_code != CODE_FMT_VENDOR_SPECIFIC)) { 17694 /* Mark the ssc_flags for detecting invalid sense data */ 17695 if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) { 17696 sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_SENSE, 0, 17697 "sense-data"); 17698 } 17699 goto sense_failed; 17700 } 17701 17702 return (SD_SENSE_DATA_IS_VALID); 17703 17704 sense_failed: 17705 /* 17706 * If the request sense failed (for whatever reason), attempt 17707 * to retry the original command. 17708 */ 17709 #if defined(__i386) || defined(__amd64) 17710 /* 17711 * SD_RETRY_DELAY is conditionally compile (#if fibre) in 17712 * sddef.h for Sparc platform, and x86 uses 1 binary 17713 * for both SCSI/FC. 17714 * The SD_RETRY_DELAY value need to be adjusted here 17715 * when SD_RETRY_DELAY change in sddef.h 17716 */ 17717 sd_retry_command(un, bp, SD_RETRIES_STANDARD, 17718 sd_print_sense_failed_msg, msgp, EIO, 17719 un->un_f_is_fibre?drv_usectohz(100000):(clock_t)0, NULL); 17720 #else 17721 sd_retry_command(un, bp, SD_RETRIES_STANDARD, 17722 sd_print_sense_failed_msg, msgp, EIO, SD_RETRY_DELAY, NULL); 17723 #endif 17724 17725 return (SD_SENSE_DATA_IS_INVALID); 17726 } 17727 17728 /* 17729 * Function: sd_decode_sense 17730 * 17731 * Description: Take recovery action(s) when SCSI Sense Data is received. 17732 * 17733 * Context: Interrupt context. 17734 */ 17735 17736 static void 17737 sd_decode_sense(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 17738 struct scsi_pkt *pktp) 17739 { 17740 uint8_t sense_key; 17741 17742 ASSERT(un != NULL); 17743 ASSERT(mutex_owned(SD_MUTEX(un))); 17744 ASSERT(bp != NULL); 17745 ASSERT(bp != un->un_rqs_bp); 17746 ASSERT(xp != NULL); 17747 ASSERT(pktp != NULL); 17748 17749 sense_key = scsi_sense_key(xp->xb_sense_data); 17750 17751 switch (sense_key) { 17752 case KEY_NO_SENSE: 17753 sd_sense_key_no_sense(un, bp, xp, pktp); 17754 break; 17755 case KEY_RECOVERABLE_ERROR: 17756 sd_sense_key_recoverable_error(un, xp->xb_sense_data, 17757 bp, xp, pktp); 17758 break; 17759 case KEY_NOT_READY: 17760 sd_sense_key_not_ready(un, xp->xb_sense_data, 17761 bp, xp, pktp); 17762 break; 17763 case KEY_MEDIUM_ERROR: 17764 case KEY_HARDWARE_ERROR: 17765 sd_sense_key_medium_or_hardware_error(un, 17766 xp->xb_sense_data, bp, xp, pktp); 17767 break; 17768 case KEY_ILLEGAL_REQUEST: 17769 sd_sense_key_illegal_request(un, bp, xp, pktp); 17770 break; 17771 case KEY_UNIT_ATTENTION: 17772 sd_sense_key_unit_attention(un, xp->xb_sense_data, 17773 bp, xp, pktp); 17774 break; 17775 case KEY_WRITE_PROTECT: 17776 case KEY_VOLUME_OVERFLOW: 17777 case KEY_MISCOMPARE: 17778 sd_sense_key_fail_command(un, bp, xp, pktp); 17779 break; 17780 case KEY_BLANK_CHECK: 17781 sd_sense_key_blank_check(un, bp, xp, pktp); 17782 break; 17783 case KEY_ABORTED_COMMAND: 17784 sd_sense_key_aborted_command(un, bp, xp, pktp); 17785 break; 17786 case KEY_VENDOR_UNIQUE: 17787 case KEY_COPY_ABORTED: 17788 case KEY_EQUAL: 17789 case KEY_RESERVED: 17790 default: 17791 sd_sense_key_default(un, xp->xb_sense_data, 17792 bp, xp, pktp); 17793 break; 17794 } 17795 } 17796 17797 17798 /* 17799 * Function: sd_dump_memory 17800 * 17801 * Description: Debug logging routine to print the contents of a user provided 17802 * buffer. The output of the buffer is broken up into 256 byte 17803 * segments due to a size constraint of the scsi_log. 17804 * implementation. 17805 * 17806 * Arguments: un - ptr to softstate 17807 * comp - component mask 17808 * title - "title" string to preceed data when printed 17809 * data - ptr to data block to be printed 17810 * len - size of data block to be printed 17811 * fmt - SD_LOG_HEX (use 0x%02x format) or SD_LOG_CHAR (use %c) 17812 * 17813 * Context: May be called from interrupt context 17814 */ 17815 17816 #define SD_DUMP_MEMORY_BUF_SIZE 256 17817 17818 static char *sd_dump_format_string[] = { 17819 " 0x%02x", 17820 " %c" 17821 }; 17822 17823 static void 17824 sd_dump_memory(struct sd_lun *un, uint_t comp, char *title, uchar_t *data, 17825 int len, int fmt) 17826 { 17827 int i, j; 17828 int avail_count; 17829 int start_offset; 17830 int end_offset; 17831 size_t entry_len; 17832 char *bufp; 17833 char *local_buf; 17834 char *format_string; 17835 17836 ASSERT((fmt == SD_LOG_HEX) || (fmt == SD_LOG_CHAR)); 17837 17838 /* 17839 * In the debug version of the driver, this function is called from a 17840 * number of places which are NOPs in the release driver. 17841 * The debug driver therefore has additional methods of filtering 17842 * debug output. 17843 */ 17844 #ifdef SDDEBUG 17845 /* 17846 * In the debug version of the driver we can reduce the amount of debug 17847 * messages by setting sd_error_level to something other than 17848 * SCSI_ERR_ALL and clearing bits in sd_level_mask and 17849 * sd_component_mask. 17850 */ 17851 if (((sd_level_mask & (SD_LOGMASK_DUMP_MEM | SD_LOGMASK_DIAG)) == 0) || 17852 (sd_error_level != SCSI_ERR_ALL)) { 17853 return; 17854 } 17855 if (((sd_component_mask & comp) == 0) || 17856 (sd_error_level != SCSI_ERR_ALL)) { 17857 return; 17858 } 17859 #else 17860 if (sd_error_level != SCSI_ERR_ALL) { 17861 return; 17862 } 17863 #endif 17864 17865 local_buf = kmem_zalloc(SD_DUMP_MEMORY_BUF_SIZE, KM_SLEEP); 17866 bufp = local_buf; 17867 /* 17868 * Available length is the length of local_buf[], minus the 17869 * length of the title string, minus one for the ":", minus 17870 * one for the newline, minus one for the NULL terminator. 17871 * This gives the #bytes available for holding the printed 17872 * values from the given data buffer. 17873 */ 17874 if (fmt == SD_LOG_HEX) { 17875 format_string = sd_dump_format_string[0]; 17876 } else /* SD_LOG_CHAR */ { 17877 format_string = sd_dump_format_string[1]; 17878 } 17879 /* 17880 * Available count is the number of elements from the given 17881 * data buffer that we can fit into the available length. 17882 * This is based upon the size of the format string used. 17883 * Make one entry and find it's size. 17884 */ 17885 (void) sprintf(bufp, format_string, data[0]); 17886 entry_len = strlen(bufp); 17887 avail_count = (SD_DUMP_MEMORY_BUF_SIZE - strlen(title) - 3) / entry_len; 17888 17889 j = 0; 17890 while (j < len) { 17891 bufp = local_buf; 17892 bzero(bufp, SD_DUMP_MEMORY_BUF_SIZE); 17893 start_offset = j; 17894 17895 end_offset = start_offset + avail_count; 17896 17897 (void) sprintf(bufp, "%s:", title); 17898 bufp += strlen(bufp); 17899 for (i = start_offset; ((i < end_offset) && (j < len)); 17900 i++, j++) { 17901 (void) sprintf(bufp, format_string, data[i]); 17902 bufp += entry_len; 17903 } 17904 (void) sprintf(bufp, "\n"); 17905 17906 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE, "%s", local_buf); 17907 } 17908 kmem_free(local_buf, SD_DUMP_MEMORY_BUF_SIZE); 17909 } 17910 17911 /* 17912 * Function: sd_print_sense_msg 17913 * 17914 * Description: Log a message based upon the given sense data. 17915 * 17916 * Arguments: un - ptr to associated softstate 17917 * bp - ptr to buf(9S) for the command 17918 * arg - ptr to associate sd_sense_info struct 17919 * code - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED, 17920 * or SD_NO_RETRY_ISSUED 17921 * 17922 * Context: May be called from interrupt context 17923 */ 17924 17925 static void 17926 sd_print_sense_msg(struct sd_lun *un, struct buf *bp, void *arg, int code) 17927 { 17928 struct sd_xbuf *xp; 17929 struct scsi_pkt *pktp; 17930 uint8_t *sensep; 17931 daddr_t request_blkno; 17932 diskaddr_t err_blkno; 17933 int severity; 17934 int pfa_flag; 17935 extern struct scsi_key_strings scsi_cmds[]; 17936 17937 ASSERT(un != NULL); 17938 ASSERT(mutex_owned(SD_MUTEX(un))); 17939 ASSERT(bp != NULL); 17940 xp = SD_GET_XBUF(bp); 17941 ASSERT(xp != NULL); 17942 pktp = SD_GET_PKTP(bp); 17943 ASSERT(pktp != NULL); 17944 ASSERT(arg != NULL); 17945 17946 severity = ((struct sd_sense_info *)(arg))->ssi_severity; 17947 pfa_flag = ((struct sd_sense_info *)(arg))->ssi_pfa_flag; 17948 17949 if ((code == SD_DELAYED_RETRY_ISSUED) || 17950 (code == SD_IMMEDIATE_RETRY_ISSUED)) { 17951 severity = SCSI_ERR_RETRYABLE; 17952 } 17953 17954 /* Use absolute block number for the request block number */ 17955 request_blkno = xp->xb_blkno; 17956 17957 /* 17958 * Now try to get the error block number from the sense data 17959 */ 17960 sensep = xp->xb_sense_data; 17961 17962 if (scsi_sense_info_uint64(sensep, SENSE_LENGTH, 17963 (uint64_t *)&err_blkno)) { 17964 /* 17965 * We retrieved the error block number from the information 17966 * portion of the sense data. 17967 * 17968 * For USCSI commands we are better off using the error 17969 * block no. as the requested block no. (This is the best 17970 * we can estimate.) 17971 */ 17972 if ((SD_IS_BUFIO(xp) == FALSE) && 17973 ((pktp->pkt_flags & FLAG_SILENT) == 0)) { 17974 request_blkno = err_blkno; 17975 } 17976 } else { 17977 /* 17978 * Without the es_valid bit set (for fixed format) or an 17979 * information descriptor (for descriptor format) we cannot 17980 * be certain of the error blkno, so just use the 17981 * request_blkno. 17982 */ 17983 err_blkno = (diskaddr_t)request_blkno; 17984 } 17985 17986 /* 17987 * The following will log the buffer contents for the release driver 17988 * if the SD_LOGMASK_DIAG bit of sd_level_mask is set, or the error 17989 * level is set to verbose. 17990 */ 17991 sd_dump_memory(un, SD_LOG_IO, "Failed CDB", 17992 (uchar_t *)pktp->pkt_cdbp, CDB_SIZE, SD_LOG_HEX); 17993 sd_dump_memory(un, SD_LOG_IO, "Sense Data", 17994 (uchar_t *)sensep, SENSE_LENGTH, SD_LOG_HEX); 17995 17996 if (pfa_flag == FALSE) { 17997 /* This is normally only set for USCSI */ 17998 if ((pktp->pkt_flags & FLAG_SILENT) != 0) { 17999 return; 18000 } 18001 18002 if ((SD_IS_BUFIO(xp) == TRUE) && 18003 (((sd_level_mask & SD_LOGMASK_DIAG) == 0) && 18004 (severity < sd_error_level))) { 18005 return; 18006 } 18007 } 18008 /* 18009 * Check for Sonoma Failover and keep a count of how many failed I/O's 18010 */ 18011 if ((SD_IS_LSI(un)) && 18012 (scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) && 18013 (scsi_sense_asc(sensep) == 0x94) && 18014 (scsi_sense_ascq(sensep) == 0x01)) { 18015 un->un_sonoma_failure_count++; 18016 if (un->un_sonoma_failure_count > 1) { 18017 return; 18018 } 18019 } 18020 18021 if (SD_FM_LOG(un) == SD_FM_LOG_NSUP || 18022 ((scsi_sense_key(sensep) == KEY_RECOVERABLE_ERROR) && 18023 (pktp->pkt_resid == 0))) { 18024 scsi_vu_errmsg(SD_SCSI_DEVP(un), pktp, sd_label, severity, 18025 request_blkno, err_blkno, scsi_cmds, 18026 (struct scsi_extended_sense *)sensep, 18027 un->un_additional_codes, NULL); 18028 } 18029 } 18030 18031 /* 18032 * Function: sd_sense_key_no_sense 18033 * 18034 * Description: Recovery action when sense data was not received. 18035 * 18036 * Context: May be called from interrupt context 18037 */ 18038 18039 static void 18040 sd_sense_key_no_sense(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 18041 struct scsi_pkt *pktp) 18042 { 18043 struct sd_sense_info si; 18044 18045 ASSERT(un != NULL); 18046 ASSERT(mutex_owned(SD_MUTEX(un))); 18047 ASSERT(bp != NULL); 18048 ASSERT(xp != NULL); 18049 ASSERT(pktp != NULL); 18050 18051 si.ssi_severity = SCSI_ERR_FATAL; 18052 si.ssi_pfa_flag = FALSE; 18053 18054 SD_UPDATE_ERRSTATS(un, sd_softerrs); 18055 18056 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg, 18057 &si, EIO, (clock_t)0, NULL); 18058 } 18059 18060 18061 /* 18062 * Function: sd_sense_key_recoverable_error 18063 * 18064 * Description: Recovery actions for a SCSI "Recovered Error" sense key. 18065 * 18066 * Context: May be called from interrupt context 18067 */ 18068 18069 static void 18070 sd_sense_key_recoverable_error(struct sd_lun *un, uint8_t *sense_datap, 18071 struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp) 18072 { 18073 struct sd_sense_info si; 18074 uint8_t asc = scsi_sense_asc(sense_datap); 18075 uint8_t ascq = scsi_sense_ascq(sense_datap); 18076 18077 ASSERT(un != NULL); 18078 ASSERT(mutex_owned(SD_MUTEX(un))); 18079 ASSERT(bp != NULL); 18080 ASSERT(xp != NULL); 18081 ASSERT(pktp != NULL); 18082 18083 /* 18084 * 0x00, 0x1D: ATA PASSTHROUGH INFORMATION AVAILABLE 18085 */ 18086 if (asc == 0x00 && ascq == 0x1D) { 18087 sd_return_command(un, bp); 18088 return; 18089 } 18090 18091 /* 18092 * 0x5D: FAILURE PREDICTION THRESHOLD EXCEEDED 18093 */ 18094 if ((asc == 0x5D) && (sd_report_pfa != 0)) { 18095 SD_UPDATE_ERRSTATS(un, sd_rq_pfa_err); 18096 si.ssi_severity = SCSI_ERR_INFO; 18097 si.ssi_pfa_flag = TRUE; 18098 } else { 18099 SD_UPDATE_ERRSTATS(un, sd_softerrs); 18100 SD_UPDATE_ERRSTATS(un, sd_rq_recov_err); 18101 si.ssi_severity = SCSI_ERR_RECOVERED; 18102 si.ssi_pfa_flag = FALSE; 18103 } 18104 18105 if (pktp->pkt_resid == 0) { 18106 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 18107 sd_return_command(un, bp); 18108 return; 18109 } 18110 18111 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg, 18112 &si, EIO, (clock_t)0, NULL); 18113 } 18114 18115 18116 18117 18118 /* 18119 * Function: sd_sense_key_not_ready 18120 * 18121 * Description: Recovery actions for a SCSI "Not Ready" sense key. 18122 * 18123 * Context: May be called from interrupt context 18124 */ 18125 18126 static void 18127 sd_sense_key_not_ready(struct sd_lun *un, uint8_t *sense_datap, struct buf *bp, 18128 struct sd_xbuf *xp, struct scsi_pkt *pktp) 18129 { 18130 struct sd_sense_info si; 18131 uint8_t asc = scsi_sense_asc(sense_datap); 18132 uint8_t ascq = scsi_sense_ascq(sense_datap); 18133 18134 ASSERT(un != NULL); 18135 ASSERT(mutex_owned(SD_MUTEX(un))); 18136 ASSERT(bp != NULL); 18137 ASSERT(xp != NULL); 18138 ASSERT(pktp != NULL); 18139 18140 si.ssi_severity = SCSI_ERR_FATAL; 18141 si.ssi_pfa_flag = FALSE; 18142 18143 /* 18144 * Update error stats after first NOT READY error. Disks may have 18145 * been powered down and may need to be restarted. For CDROMs, 18146 * report NOT READY errors only if media is present. 18147 */ 18148 if ((ISCD(un) && (asc == 0x3A)) || 18149 (xp->xb_nr_retry_count > 0)) { 18150 SD_UPDATE_ERRSTATS(un, sd_harderrs); 18151 SD_UPDATE_ERRSTATS(un, sd_rq_ntrdy_err); 18152 } 18153 18154 /* 18155 * Just fail if the "not ready" retry limit has been reached. 18156 */ 18157 if (xp->xb_nr_retry_count >= un->un_notready_retry_count) { 18158 /* Special check for error message printing for removables. */ 18159 if (un->un_f_has_removable_media && (asc == 0x04) && 18160 (ascq >= 0x04)) { 18161 si.ssi_severity = SCSI_ERR_ALL; 18162 } 18163 goto fail_command; 18164 } 18165 18166 /* 18167 * Check the ASC and ASCQ in the sense data as needed, to determine 18168 * what to do. 18169 */ 18170 switch (asc) { 18171 case 0x04: /* LOGICAL UNIT NOT READY */ 18172 /* 18173 * disk drives that don't spin up result in a very long delay 18174 * in format without warning messages. We will log a message 18175 * if the error level is set to verbose. 18176 */ 18177 if (sd_error_level < SCSI_ERR_RETRYABLE) { 18178 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 18179 "logical unit not ready, resetting disk\n"); 18180 } 18181 18182 /* 18183 * There are different requirements for CDROMs and disks for 18184 * the number of retries. If a CD-ROM is giving this, it is 18185 * probably reading TOC and is in the process of getting 18186 * ready, so we should keep on trying for a long time to make 18187 * sure that all types of media are taken in account (for 18188 * some media the drive takes a long time to read TOC). For 18189 * disks we do not want to retry this too many times as this 18190 * can cause a long hang in format when the drive refuses to 18191 * spin up (a very common failure). 18192 */ 18193 switch (ascq) { 18194 case 0x00: /* LUN NOT READY, CAUSE NOT REPORTABLE */ 18195 /* 18196 * Disk drives frequently refuse to spin up which 18197 * results in a very long hang in format without 18198 * warning messages. 18199 * 18200 * Note: This code preserves the legacy behavior of 18201 * comparing xb_nr_retry_count against zero for fibre 18202 * channel targets instead of comparing against the 18203 * un_reset_retry_count value. The reason for this 18204 * discrepancy has been so utterly lost beneath the 18205 * Sands of Time that even Indiana Jones could not 18206 * find it. 18207 */ 18208 if (un->un_f_is_fibre == TRUE) { 18209 if (((sd_level_mask & SD_LOGMASK_DIAG) || 18210 (xp->xb_nr_retry_count > 0)) && 18211 (un->un_startstop_timeid == NULL)) { 18212 scsi_log(SD_DEVINFO(un), sd_label, 18213 CE_WARN, "logical unit not ready, " 18214 "resetting disk\n"); 18215 sd_reset_target(un, pktp); 18216 } 18217 } else { 18218 if (((sd_level_mask & SD_LOGMASK_DIAG) || 18219 (xp->xb_nr_retry_count > 18220 un->un_reset_retry_count)) && 18221 (un->un_startstop_timeid == NULL)) { 18222 scsi_log(SD_DEVINFO(un), sd_label, 18223 CE_WARN, "logical unit not ready, " 18224 "resetting disk\n"); 18225 sd_reset_target(un, pktp); 18226 } 18227 } 18228 break; 18229 18230 case 0x01: /* LUN IS IN PROCESS OF BECOMING READY */ 18231 /* 18232 * If the target is in the process of becoming 18233 * ready, just proceed with the retry. This can 18234 * happen with CD-ROMs that take a long time to 18235 * read TOC after a power cycle or reset. 18236 */ 18237 goto do_retry; 18238 18239 case 0x02: /* LUN NOT READY, INITITIALIZING CMD REQUIRED */ 18240 break; 18241 18242 case 0x03: /* LUN NOT READY, MANUAL INTERVENTION REQUIRED */ 18243 /* 18244 * Retries cannot help here so just fail right away. 18245 */ 18246 goto fail_command; 18247 18248 case 0x88: 18249 /* 18250 * Vendor-unique code for T3/T4: it indicates a 18251 * path problem in a mutipathed config, but as far as 18252 * the target driver is concerned it equates to a fatal 18253 * error, so we should just fail the command right away 18254 * (without printing anything to the console). If this 18255 * is not a T3/T4, fall thru to the default recovery 18256 * action. 18257 * T3/T4 is FC only, don't need to check is_fibre 18258 */ 18259 if (SD_IS_T3(un) || SD_IS_T4(un)) { 18260 sd_return_failed_command(un, bp, EIO); 18261 return; 18262 } 18263 /* FALLTHRU */ 18264 18265 case 0x04: /* LUN NOT READY, FORMAT IN PROGRESS */ 18266 case 0x05: /* LUN NOT READY, REBUILD IN PROGRESS */ 18267 case 0x06: /* LUN NOT READY, RECALCULATION IN PROGRESS */ 18268 case 0x07: /* LUN NOT READY, OPERATION IN PROGRESS */ 18269 case 0x08: /* LUN NOT READY, LONG WRITE IN PROGRESS */ 18270 default: /* Possible future codes in SCSI spec? */ 18271 /* 18272 * For removable-media devices, do not retry if 18273 * ASCQ > 2 as these result mostly from USCSI commands 18274 * on MMC devices issued to check status of an 18275 * operation initiated in immediate mode. Also for 18276 * ASCQ >= 4 do not print console messages as these 18277 * mainly represent a user-initiated operation 18278 * instead of a system failure. 18279 */ 18280 if (un->un_f_has_removable_media) { 18281 si.ssi_severity = SCSI_ERR_ALL; 18282 goto fail_command; 18283 } 18284 break; 18285 } 18286 18287 /* 18288 * As part of our recovery attempt for the NOT READY 18289 * condition, we issue a START STOP UNIT command. However 18290 * we want to wait for a short delay before attempting this 18291 * as there may still be more commands coming back from the 18292 * target with the check condition. To do this we use 18293 * timeout(9F) to call sd_start_stop_unit_callback() after 18294 * the delay interval expires. (sd_start_stop_unit_callback() 18295 * dispatches sd_start_stop_unit_task(), which will issue 18296 * the actual START STOP UNIT command. The delay interval 18297 * is one-half of the delay that we will use to retry the 18298 * command that generated the NOT READY condition. 18299 * 18300 * Note that we could just dispatch sd_start_stop_unit_task() 18301 * from here and allow it to sleep for the delay interval, 18302 * but then we would be tying up the taskq thread 18303 * uncesessarily for the duration of the delay. 18304 * 18305 * Do not issue the START STOP UNIT if the current command 18306 * is already a START STOP UNIT. 18307 */ 18308 if (pktp->pkt_cdbp[0] == SCMD_START_STOP) { 18309 break; 18310 } 18311 18312 /* 18313 * Do not schedule the timeout if one is already pending. 18314 */ 18315 if (un->un_startstop_timeid != NULL) { 18316 SD_INFO(SD_LOG_ERROR, un, 18317 "sd_sense_key_not_ready: restart already issued to" 18318 " %s%d\n", ddi_driver_name(SD_DEVINFO(un)), 18319 ddi_get_instance(SD_DEVINFO(un))); 18320 break; 18321 } 18322 18323 /* 18324 * Schedule the START STOP UNIT command, then queue the command 18325 * for a retry. 18326 * 18327 * Note: A timeout is not scheduled for this retry because we 18328 * want the retry to be serial with the START_STOP_UNIT. The 18329 * retry will be started when the START_STOP_UNIT is completed 18330 * in sd_start_stop_unit_task. 18331 */ 18332 un->un_startstop_timeid = timeout(sd_start_stop_unit_callback, 18333 un, un->un_busy_timeout / 2); 18334 xp->xb_nr_retry_count++; 18335 sd_set_retry_bp(un, bp, 0, kstat_waitq_enter); 18336 return; 18337 18338 case 0x05: /* LOGICAL UNIT DOES NOT RESPOND TO SELECTION */ 18339 if (sd_error_level < SCSI_ERR_RETRYABLE) { 18340 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 18341 "unit does not respond to selection\n"); 18342 } 18343 break; 18344 18345 case 0x3A: /* MEDIUM NOT PRESENT */ 18346 if (sd_error_level >= SCSI_ERR_FATAL) { 18347 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 18348 "Caddy not inserted in drive\n"); 18349 } 18350 18351 sr_ejected(un); 18352 un->un_mediastate = DKIO_EJECTED; 18353 /* The state has changed, inform the media watch routines */ 18354 cv_broadcast(&un->un_state_cv); 18355 /* Just fail if no media is present in the drive. */ 18356 goto fail_command; 18357 18358 default: 18359 if (sd_error_level < SCSI_ERR_RETRYABLE) { 18360 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE, 18361 "Unit not Ready. Additional sense code 0x%x\n", 18362 asc); 18363 } 18364 break; 18365 } 18366 18367 do_retry: 18368 18369 /* 18370 * Retry the command, as some targets may report NOT READY for 18371 * several seconds after being reset. 18372 */ 18373 xp->xb_nr_retry_count++; 18374 si.ssi_severity = SCSI_ERR_RETRYABLE; 18375 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, sd_print_sense_msg, 18376 &si, EIO, un->un_busy_timeout, NULL); 18377 18378 return; 18379 18380 fail_command: 18381 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 18382 sd_return_failed_command(un, bp, EIO); 18383 } 18384 18385 18386 18387 /* 18388 * Function: sd_sense_key_medium_or_hardware_error 18389 * 18390 * Description: Recovery actions for a SCSI "Medium Error" or "Hardware Error" 18391 * sense key. 18392 * 18393 * Context: May be called from interrupt context 18394 */ 18395 18396 static void 18397 sd_sense_key_medium_or_hardware_error(struct sd_lun *un, uint8_t *sense_datap, 18398 struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp) 18399 { 18400 struct sd_sense_info si; 18401 uint8_t sense_key = scsi_sense_key(sense_datap); 18402 uint8_t asc = scsi_sense_asc(sense_datap); 18403 18404 ASSERT(un != NULL); 18405 ASSERT(mutex_owned(SD_MUTEX(un))); 18406 ASSERT(bp != NULL); 18407 ASSERT(xp != NULL); 18408 ASSERT(pktp != NULL); 18409 18410 si.ssi_severity = SCSI_ERR_FATAL; 18411 si.ssi_pfa_flag = FALSE; 18412 18413 if (sense_key == KEY_MEDIUM_ERROR) { 18414 SD_UPDATE_ERRSTATS(un, sd_rq_media_err); 18415 } 18416 18417 SD_UPDATE_ERRSTATS(un, sd_harderrs); 18418 18419 if ((un->un_reset_retry_count != 0) && 18420 (xp->xb_retry_count == un->un_reset_retry_count)) { 18421 mutex_exit(SD_MUTEX(un)); 18422 /* Do NOT do a RESET_ALL here: too intrusive. (4112858) */ 18423 if (un->un_f_allow_bus_device_reset == TRUE) { 18424 18425 boolean_t try_resetting_target = B_TRUE; 18426 18427 /* 18428 * We need to be able to handle specific ASC when we are 18429 * handling a KEY_HARDWARE_ERROR. In particular 18430 * taking the default action of resetting the target may 18431 * not be the appropriate way to attempt recovery. 18432 * Resetting a target because of a single LUN failure 18433 * victimizes all LUNs on that target. 18434 * 18435 * This is true for the LSI arrays, if an LSI 18436 * array controller returns an ASC of 0x84 (LUN Dead) we 18437 * should trust it. 18438 */ 18439 18440 if (sense_key == KEY_HARDWARE_ERROR) { 18441 switch (asc) { 18442 case 0x84: 18443 if (SD_IS_LSI(un)) { 18444 try_resetting_target = B_FALSE; 18445 } 18446 break; 18447 default: 18448 break; 18449 } 18450 } 18451 18452 if (try_resetting_target == B_TRUE) { 18453 int reset_retval = 0; 18454 if (un->un_f_lun_reset_enabled == TRUE) { 18455 SD_TRACE(SD_LOG_IO_CORE, un, 18456 "sd_sense_key_medium_or_hardware_" 18457 "error: issuing RESET_LUN\n"); 18458 reset_retval = 18459 scsi_reset(SD_ADDRESS(un), 18460 RESET_LUN); 18461 } 18462 if (reset_retval == 0) { 18463 SD_TRACE(SD_LOG_IO_CORE, un, 18464 "sd_sense_key_medium_or_hardware_" 18465 "error: issuing RESET_TARGET\n"); 18466 (void) scsi_reset(SD_ADDRESS(un), 18467 RESET_TARGET); 18468 } 18469 } 18470 } 18471 mutex_enter(SD_MUTEX(un)); 18472 } 18473 18474 /* 18475 * This really ought to be a fatal error, but we will retry anyway 18476 * as some drives report this as a spurious error. 18477 */ 18478 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg, 18479 &si, EIO, (clock_t)0, NULL); 18480 } 18481 18482 18483 18484 /* 18485 * Function: sd_sense_key_illegal_request 18486 * 18487 * Description: Recovery actions for a SCSI "Illegal Request" sense key. 18488 * 18489 * Context: May be called from interrupt context 18490 */ 18491 18492 static void 18493 sd_sense_key_illegal_request(struct sd_lun *un, struct buf *bp, 18494 struct sd_xbuf *xp, struct scsi_pkt *pktp) 18495 { 18496 struct sd_sense_info si; 18497 18498 ASSERT(un != NULL); 18499 ASSERT(mutex_owned(SD_MUTEX(un))); 18500 ASSERT(bp != NULL); 18501 ASSERT(xp != NULL); 18502 ASSERT(pktp != NULL); 18503 18504 SD_UPDATE_ERRSTATS(un, sd_rq_illrq_err); 18505 18506 si.ssi_severity = SCSI_ERR_INFO; 18507 si.ssi_pfa_flag = FALSE; 18508 18509 /* Pointless to retry if the target thinks it's an illegal request */ 18510 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 18511 sd_return_failed_command(un, bp, EIO); 18512 } 18513 18514 18515 18516 18517 /* 18518 * Function: sd_sense_key_unit_attention 18519 * 18520 * Description: Recovery actions for a SCSI "Unit Attention" sense key. 18521 * 18522 * Context: May be called from interrupt context 18523 */ 18524 18525 static void 18526 sd_sense_key_unit_attention(struct sd_lun *un, uint8_t *sense_datap, 18527 struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp) 18528 { 18529 /* 18530 * For UNIT ATTENTION we allow retries for one minute. Devices 18531 * like Sonoma can return UNIT ATTENTION close to a minute 18532 * under certain conditions. 18533 */ 18534 int retry_check_flag = SD_RETRIES_UA; 18535 boolean_t kstat_updated = B_FALSE; 18536 struct sd_sense_info si; 18537 uint8_t asc = scsi_sense_asc(sense_datap); 18538 uint8_t ascq = scsi_sense_ascq(sense_datap); 18539 18540 ASSERT(un != NULL); 18541 ASSERT(mutex_owned(SD_MUTEX(un))); 18542 ASSERT(bp != NULL); 18543 ASSERT(xp != NULL); 18544 ASSERT(pktp != NULL); 18545 18546 si.ssi_severity = SCSI_ERR_INFO; 18547 si.ssi_pfa_flag = FALSE; 18548 18549 18550 switch (asc) { 18551 case 0x5D: /* FAILURE PREDICTION THRESHOLD EXCEEDED */ 18552 if (sd_report_pfa != 0) { 18553 SD_UPDATE_ERRSTATS(un, sd_rq_pfa_err); 18554 si.ssi_pfa_flag = TRUE; 18555 retry_check_flag = SD_RETRIES_STANDARD; 18556 goto do_retry; 18557 } 18558 18559 break; 18560 18561 case 0x29: /* POWER ON, RESET, OR BUS DEVICE RESET OCCURRED */ 18562 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) { 18563 un->un_resvd_status |= 18564 (SD_LOST_RESERVE | SD_WANT_RESERVE); 18565 } 18566 #ifdef _LP64 18567 if (un->un_blockcount + 1 > SD_GROUP1_MAX_ADDRESS) { 18568 if (taskq_dispatch(sd_tq, sd_reenable_dsense_task, 18569 un, KM_NOSLEEP) == 0) { 18570 /* 18571 * If we can't dispatch the task we'll just 18572 * live without descriptor sense. We can 18573 * try again on the next "unit attention" 18574 */ 18575 SD_ERROR(SD_LOG_ERROR, un, 18576 "sd_sense_key_unit_attention: " 18577 "Could not dispatch " 18578 "sd_reenable_dsense_task\n"); 18579 } 18580 } 18581 #endif /* _LP64 */ 18582 /* FALLTHRU */ 18583 18584 case 0x28: /* NOT READY TO READY CHANGE, MEDIUM MAY HAVE CHANGED */ 18585 if (!un->un_f_has_removable_media) { 18586 break; 18587 } 18588 18589 /* 18590 * When we get a unit attention from a removable-media device, 18591 * it may be in a state that will take a long time to recover 18592 * (e.g., from a reset). Since we are executing in interrupt 18593 * context here, we cannot wait around for the device to come 18594 * back. So hand this command off to sd_media_change_task() 18595 * for deferred processing under taskq thread context. (Note 18596 * that the command still may be failed if a problem is 18597 * encountered at a later time.) 18598 */ 18599 if (taskq_dispatch(sd_tq, sd_media_change_task, pktp, 18600 KM_NOSLEEP) == 0) { 18601 /* 18602 * Cannot dispatch the request so fail the command. 18603 */ 18604 SD_UPDATE_ERRSTATS(un, sd_harderrs); 18605 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err); 18606 si.ssi_severity = SCSI_ERR_FATAL; 18607 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 18608 sd_return_failed_command(un, bp, EIO); 18609 } 18610 18611 /* 18612 * If failed to dispatch sd_media_change_task(), we already 18613 * updated kstat. If succeed to dispatch sd_media_change_task(), 18614 * we should update kstat later if it encounters an error. So, 18615 * we update kstat_updated flag here. 18616 */ 18617 kstat_updated = B_TRUE; 18618 18619 /* 18620 * Either the command has been successfully dispatched to a 18621 * task Q for retrying, or the dispatch failed. In either case 18622 * do NOT retry again by calling sd_retry_command. This sets up 18623 * two retries of the same command and when one completes and 18624 * frees the resources the other will access freed memory, 18625 * a bad thing. 18626 */ 18627 return; 18628 18629 default: 18630 break; 18631 } 18632 18633 /* 18634 * ASC ASCQ 18635 * 2A 09 Capacity data has changed 18636 * 2A 01 Mode parameters changed 18637 * 3F 0E Reported luns data has changed 18638 * Arrays that support logical unit expansion should report 18639 * capacity changes(2Ah/09). Mode parameters changed and 18640 * reported luns data has changed are the approximation. 18641 */ 18642 if (((asc == 0x2a) && (ascq == 0x09)) || 18643 ((asc == 0x2a) && (ascq == 0x01)) || 18644 ((asc == 0x3f) && (ascq == 0x0e))) { 18645 if (taskq_dispatch(sd_tq, sd_target_change_task, un, 18646 KM_NOSLEEP) == 0) { 18647 SD_ERROR(SD_LOG_ERROR, un, 18648 "sd_sense_key_unit_attention: " 18649 "Could not dispatch sd_target_change_task\n"); 18650 } 18651 } 18652 18653 /* 18654 * Update kstat if we haven't done that. 18655 */ 18656 if (!kstat_updated) { 18657 SD_UPDATE_ERRSTATS(un, sd_harderrs); 18658 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err); 18659 } 18660 18661 do_retry: 18662 sd_retry_command(un, bp, retry_check_flag, sd_print_sense_msg, &si, 18663 EIO, SD_UA_RETRY_DELAY, NULL); 18664 } 18665 18666 18667 18668 /* 18669 * Function: sd_sense_key_fail_command 18670 * 18671 * Description: Use to fail a command when we don't like the sense key that 18672 * was returned. 18673 * 18674 * Context: May be called from interrupt context 18675 */ 18676 18677 static void 18678 sd_sense_key_fail_command(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 18679 struct scsi_pkt *pktp) 18680 { 18681 struct sd_sense_info si; 18682 18683 ASSERT(un != NULL); 18684 ASSERT(mutex_owned(SD_MUTEX(un))); 18685 ASSERT(bp != NULL); 18686 ASSERT(xp != NULL); 18687 ASSERT(pktp != NULL); 18688 18689 si.ssi_severity = SCSI_ERR_FATAL; 18690 si.ssi_pfa_flag = FALSE; 18691 18692 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 18693 sd_return_failed_command(un, bp, EIO); 18694 } 18695 18696 18697 18698 /* 18699 * Function: sd_sense_key_blank_check 18700 * 18701 * Description: Recovery actions for a SCSI "Blank Check" sense key. 18702 * Has no monetary connotation. 18703 * 18704 * Context: May be called from interrupt context 18705 */ 18706 18707 static void 18708 sd_sense_key_blank_check(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 18709 struct scsi_pkt *pktp) 18710 { 18711 struct sd_sense_info si; 18712 18713 ASSERT(un != NULL); 18714 ASSERT(mutex_owned(SD_MUTEX(un))); 18715 ASSERT(bp != NULL); 18716 ASSERT(xp != NULL); 18717 ASSERT(pktp != NULL); 18718 18719 /* 18720 * Blank check is not fatal for removable devices, therefore 18721 * it does not require a console message. 18722 */ 18723 si.ssi_severity = (un->un_f_has_removable_media) ? SCSI_ERR_ALL : 18724 SCSI_ERR_FATAL; 18725 si.ssi_pfa_flag = FALSE; 18726 18727 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 18728 sd_return_failed_command(un, bp, EIO); 18729 } 18730 18731 18732 18733 18734 /* 18735 * Function: sd_sense_key_aborted_command 18736 * 18737 * Description: Recovery actions for a SCSI "Aborted Command" sense key. 18738 * 18739 * Context: May be called from interrupt context 18740 */ 18741 18742 static void 18743 sd_sense_key_aborted_command(struct sd_lun *un, struct buf *bp, 18744 struct sd_xbuf *xp, struct scsi_pkt *pktp) 18745 { 18746 struct sd_sense_info si; 18747 18748 ASSERT(un != NULL); 18749 ASSERT(mutex_owned(SD_MUTEX(un))); 18750 ASSERT(bp != NULL); 18751 ASSERT(xp != NULL); 18752 ASSERT(pktp != NULL); 18753 18754 si.ssi_severity = SCSI_ERR_FATAL; 18755 si.ssi_pfa_flag = FALSE; 18756 18757 SD_UPDATE_ERRSTATS(un, sd_harderrs); 18758 18759 /* 18760 * This really ought to be a fatal error, but we will retry anyway 18761 * as some drives report this as a spurious error. 18762 */ 18763 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg, 18764 &si, EIO, drv_usectohz(100000), NULL); 18765 } 18766 18767 18768 18769 /* 18770 * Function: sd_sense_key_default 18771 * 18772 * Description: Default recovery action for several SCSI sense keys (basically 18773 * attempts a retry). 18774 * 18775 * Context: May be called from interrupt context 18776 */ 18777 18778 static void 18779 sd_sense_key_default(struct sd_lun *un, uint8_t *sense_datap, struct buf *bp, 18780 struct sd_xbuf *xp, struct scsi_pkt *pktp) 18781 { 18782 struct sd_sense_info si; 18783 uint8_t sense_key = scsi_sense_key(sense_datap); 18784 18785 ASSERT(un != NULL); 18786 ASSERT(mutex_owned(SD_MUTEX(un))); 18787 ASSERT(bp != NULL); 18788 ASSERT(xp != NULL); 18789 ASSERT(pktp != NULL); 18790 18791 SD_UPDATE_ERRSTATS(un, sd_harderrs); 18792 18793 /* 18794 * Undecoded sense key. Attempt retries and hope that will fix 18795 * the problem. Otherwise, we're dead. 18796 */ 18797 if ((pktp->pkt_flags & FLAG_SILENT) == 0) { 18798 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 18799 "Unhandled Sense Key '%s'\n", sense_keys[sense_key]); 18800 } 18801 18802 si.ssi_severity = SCSI_ERR_FATAL; 18803 si.ssi_pfa_flag = FALSE; 18804 18805 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg, 18806 &si, EIO, (clock_t)0, NULL); 18807 } 18808 18809 18810 18811 /* 18812 * Function: sd_print_retry_msg 18813 * 18814 * Description: Print a message indicating the retry action being taken. 18815 * 18816 * Arguments: un - ptr to associated softstate 18817 * bp - ptr to buf(9S) for the command 18818 * arg - not used. 18819 * flag - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED, 18820 * or SD_NO_RETRY_ISSUED 18821 * 18822 * Context: May be called from interrupt context 18823 */ 18824 /* ARGSUSED */ 18825 static void 18826 sd_print_retry_msg(struct sd_lun *un, struct buf *bp, void *arg, int flag) 18827 { 18828 struct sd_xbuf *xp; 18829 struct scsi_pkt *pktp; 18830 char *reasonp; 18831 char *msgp; 18832 18833 ASSERT(un != NULL); 18834 ASSERT(mutex_owned(SD_MUTEX(un))); 18835 ASSERT(bp != NULL); 18836 pktp = SD_GET_PKTP(bp); 18837 ASSERT(pktp != NULL); 18838 xp = SD_GET_XBUF(bp); 18839 ASSERT(xp != NULL); 18840 18841 ASSERT(!mutex_owned(&un->un_pm_mutex)); 18842 mutex_enter(&un->un_pm_mutex); 18843 if ((un->un_state == SD_STATE_SUSPENDED) || 18844 (SD_DEVICE_IS_IN_LOW_POWER(un)) || 18845 (pktp->pkt_flags & FLAG_SILENT)) { 18846 mutex_exit(&un->un_pm_mutex); 18847 goto update_pkt_reason; 18848 } 18849 mutex_exit(&un->un_pm_mutex); 18850 18851 /* 18852 * Suppress messages if they are all the same pkt_reason; with 18853 * TQ, many (up to 256) are returned with the same pkt_reason. 18854 * If we are in panic, then suppress the retry messages. 18855 */ 18856 switch (flag) { 18857 case SD_NO_RETRY_ISSUED: 18858 msgp = "giving up"; 18859 break; 18860 case SD_IMMEDIATE_RETRY_ISSUED: 18861 case SD_DELAYED_RETRY_ISSUED: 18862 if (ddi_in_panic() || (un->un_state == SD_STATE_OFFLINE) || 18863 ((pktp->pkt_reason == un->un_last_pkt_reason) && 18864 (sd_error_level != SCSI_ERR_ALL))) { 18865 return; 18866 } 18867 msgp = "retrying command"; 18868 break; 18869 default: 18870 goto update_pkt_reason; 18871 } 18872 18873 reasonp = (((pktp->pkt_statistics & STAT_PERR) != 0) ? "parity error" : 18874 scsi_rname(pktp->pkt_reason)); 18875 18876 if (SD_FM_LOG(un) == SD_FM_LOG_NSUP) { 18877 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 18878 "SCSI transport failed: reason '%s': %s\n", reasonp, msgp); 18879 } 18880 18881 update_pkt_reason: 18882 /* 18883 * Update un->un_last_pkt_reason with the value in pktp->pkt_reason. 18884 * This is to prevent multiple console messages for the same failure 18885 * condition. Note that un->un_last_pkt_reason is NOT restored if & 18886 * when the command is retried successfully because there still may be 18887 * more commands coming back with the same value of pktp->pkt_reason. 18888 */ 18889 if ((pktp->pkt_reason != CMD_CMPLT) || (xp->xb_retry_count == 0)) { 18890 un->un_last_pkt_reason = pktp->pkt_reason; 18891 } 18892 } 18893 18894 18895 /* 18896 * Function: sd_print_cmd_incomplete_msg 18897 * 18898 * Description: Message logging fn. for a SCSA "CMD_INCOMPLETE" pkt_reason. 18899 * 18900 * Arguments: un - ptr to associated softstate 18901 * bp - ptr to buf(9S) for the command 18902 * arg - passed to sd_print_retry_msg() 18903 * code - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED, 18904 * or SD_NO_RETRY_ISSUED 18905 * 18906 * Context: May be called from interrupt context 18907 */ 18908 18909 static void 18910 sd_print_cmd_incomplete_msg(struct sd_lun *un, struct buf *bp, void *arg, 18911 int code) 18912 { 18913 dev_info_t *dip; 18914 18915 ASSERT(un != NULL); 18916 ASSERT(mutex_owned(SD_MUTEX(un))); 18917 ASSERT(bp != NULL); 18918 18919 switch (code) { 18920 case SD_NO_RETRY_ISSUED: 18921 /* Command was failed. Someone turned off this target? */ 18922 if (un->un_state != SD_STATE_OFFLINE) { 18923 /* 18924 * Suppress message if we are detaching and 18925 * device has been disconnected 18926 * Note that DEVI_IS_DEVICE_REMOVED is a consolidation 18927 * private interface and not part of the DDI 18928 */ 18929 dip = un->un_sd->sd_dev; 18930 if (!(DEVI_IS_DETACHING(dip) && 18931 DEVI_IS_DEVICE_REMOVED(dip))) { 18932 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 18933 "disk not responding to selection\n"); 18934 } 18935 New_state(un, SD_STATE_OFFLINE); 18936 } 18937 break; 18938 18939 case SD_DELAYED_RETRY_ISSUED: 18940 case SD_IMMEDIATE_RETRY_ISSUED: 18941 default: 18942 /* Command was successfully queued for retry */ 18943 sd_print_retry_msg(un, bp, arg, code); 18944 break; 18945 } 18946 } 18947 18948 18949 /* 18950 * Function: sd_pkt_reason_cmd_incomplete 18951 * 18952 * Description: Recovery actions for a SCSA "CMD_INCOMPLETE" pkt_reason. 18953 * 18954 * Context: May be called from interrupt context 18955 */ 18956 18957 static void 18958 sd_pkt_reason_cmd_incomplete(struct sd_lun *un, struct buf *bp, 18959 struct sd_xbuf *xp, struct scsi_pkt *pktp) 18960 { 18961 int flag = SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE; 18962 18963 ASSERT(un != NULL); 18964 ASSERT(mutex_owned(SD_MUTEX(un))); 18965 ASSERT(bp != NULL); 18966 ASSERT(xp != NULL); 18967 ASSERT(pktp != NULL); 18968 18969 /* Do not do a reset if selection did not complete */ 18970 /* Note: Should this not just check the bit? */ 18971 if (pktp->pkt_state != STATE_GOT_BUS) { 18972 SD_UPDATE_ERRSTATS(un, sd_transerrs); 18973 sd_reset_target(un, pktp); 18974 } 18975 18976 /* 18977 * If the target was not successfully selected, then set 18978 * SD_RETRIES_FAILFAST to indicate that we lost communication 18979 * with the target, and further retries and/or commands are 18980 * likely to take a long time. 18981 */ 18982 if ((pktp->pkt_state & STATE_GOT_TARGET) == 0) { 18983 flag |= SD_RETRIES_FAILFAST; 18984 } 18985 18986 SD_UPDATE_RESERVATION_STATUS(un, pktp); 18987 18988 sd_retry_command(un, bp, flag, 18989 sd_print_cmd_incomplete_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 18990 } 18991 18992 18993 18994 /* 18995 * Function: sd_pkt_reason_cmd_tran_err 18996 * 18997 * Description: Recovery actions for a SCSA "CMD_TRAN_ERR" pkt_reason. 18998 * 18999 * Context: May be called from interrupt context 19000 */ 19001 19002 static void 19003 sd_pkt_reason_cmd_tran_err(struct sd_lun *un, struct buf *bp, 19004 struct sd_xbuf *xp, struct scsi_pkt *pktp) 19005 { 19006 ASSERT(un != NULL); 19007 ASSERT(mutex_owned(SD_MUTEX(un))); 19008 ASSERT(bp != NULL); 19009 ASSERT(xp != NULL); 19010 ASSERT(pktp != NULL); 19011 19012 /* 19013 * Do not reset if we got a parity error, or if 19014 * selection did not complete. 19015 */ 19016 SD_UPDATE_ERRSTATS(un, sd_harderrs); 19017 /* Note: Should this not just check the bit for pkt_state? */ 19018 if (((pktp->pkt_statistics & STAT_PERR) == 0) && 19019 (pktp->pkt_state != STATE_GOT_BUS)) { 19020 SD_UPDATE_ERRSTATS(un, sd_transerrs); 19021 sd_reset_target(un, pktp); 19022 } 19023 19024 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19025 19026 sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE), 19027 sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19028 } 19029 19030 19031 19032 /* 19033 * Function: sd_pkt_reason_cmd_reset 19034 * 19035 * Description: Recovery actions for a SCSA "CMD_RESET" pkt_reason. 19036 * 19037 * Context: May be called from interrupt context 19038 */ 19039 19040 static void 19041 sd_pkt_reason_cmd_reset(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 19042 struct scsi_pkt *pktp) 19043 { 19044 ASSERT(un != NULL); 19045 ASSERT(mutex_owned(SD_MUTEX(un))); 19046 ASSERT(bp != NULL); 19047 ASSERT(xp != NULL); 19048 ASSERT(pktp != NULL); 19049 19050 /* The target may still be running the command, so try to reset. */ 19051 SD_UPDATE_ERRSTATS(un, sd_transerrs); 19052 sd_reset_target(un, pktp); 19053 19054 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19055 19056 /* 19057 * If pkt_reason is CMD_RESET chances are that this pkt got 19058 * reset because another target on this bus caused it. The target 19059 * that caused it should get CMD_TIMEOUT with pkt_statistics 19060 * of STAT_TIMEOUT/STAT_DEV_RESET. 19061 */ 19062 19063 sd_retry_command(un, bp, (SD_RETRIES_VICTIM | SD_RETRIES_ISOLATE), 19064 sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19065 } 19066 19067 19068 19069 19070 /* 19071 * Function: sd_pkt_reason_cmd_aborted 19072 * 19073 * Description: Recovery actions for a SCSA "CMD_ABORTED" pkt_reason. 19074 * 19075 * Context: May be called from interrupt context 19076 */ 19077 19078 static void 19079 sd_pkt_reason_cmd_aborted(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 19080 struct scsi_pkt *pktp) 19081 { 19082 ASSERT(un != NULL); 19083 ASSERT(mutex_owned(SD_MUTEX(un))); 19084 ASSERT(bp != NULL); 19085 ASSERT(xp != NULL); 19086 ASSERT(pktp != NULL); 19087 19088 /* The target may still be running the command, so try to reset. */ 19089 SD_UPDATE_ERRSTATS(un, sd_transerrs); 19090 sd_reset_target(un, pktp); 19091 19092 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19093 19094 /* 19095 * If pkt_reason is CMD_ABORTED chances are that this pkt got 19096 * aborted because another target on this bus caused it. The target 19097 * that caused it should get CMD_TIMEOUT with pkt_statistics 19098 * of STAT_TIMEOUT/STAT_DEV_RESET. 19099 */ 19100 19101 sd_retry_command(un, bp, (SD_RETRIES_VICTIM | SD_RETRIES_ISOLATE), 19102 sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19103 } 19104 19105 19106 19107 /* 19108 * Function: sd_pkt_reason_cmd_timeout 19109 * 19110 * Description: Recovery actions for a SCSA "CMD_TIMEOUT" pkt_reason. 19111 * 19112 * Context: May be called from interrupt context 19113 */ 19114 19115 static void 19116 sd_pkt_reason_cmd_timeout(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 19117 struct scsi_pkt *pktp) 19118 { 19119 ASSERT(un != NULL); 19120 ASSERT(mutex_owned(SD_MUTEX(un))); 19121 ASSERT(bp != NULL); 19122 ASSERT(xp != NULL); 19123 ASSERT(pktp != NULL); 19124 19125 19126 SD_UPDATE_ERRSTATS(un, sd_transerrs); 19127 sd_reset_target(un, pktp); 19128 19129 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19130 19131 /* 19132 * A command timeout indicates that we could not establish 19133 * communication with the target, so set SD_RETRIES_FAILFAST 19134 * as further retries/commands are likely to take a long time. 19135 */ 19136 sd_retry_command(un, bp, 19137 (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE | SD_RETRIES_FAILFAST), 19138 sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19139 } 19140 19141 19142 19143 /* 19144 * Function: sd_pkt_reason_cmd_unx_bus_free 19145 * 19146 * Description: Recovery actions for a SCSA "CMD_UNX_BUS_FREE" pkt_reason. 19147 * 19148 * Context: May be called from interrupt context 19149 */ 19150 19151 static void 19152 sd_pkt_reason_cmd_unx_bus_free(struct sd_lun *un, struct buf *bp, 19153 struct sd_xbuf *xp, struct scsi_pkt *pktp) 19154 { 19155 void (*funcp)(struct sd_lun *un, struct buf *bp, void *arg, int code); 19156 19157 ASSERT(un != NULL); 19158 ASSERT(mutex_owned(SD_MUTEX(un))); 19159 ASSERT(bp != NULL); 19160 ASSERT(xp != NULL); 19161 ASSERT(pktp != NULL); 19162 19163 SD_UPDATE_ERRSTATS(un, sd_harderrs); 19164 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19165 19166 funcp = ((pktp->pkt_statistics & STAT_PERR) == 0) ? 19167 sd_print_retry_msg : NULL; 19168 19169 sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE), 19170 funcp, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19171 } 19172 19173 19174 /* 19175 * Function: sd_pkt_reason_cmd_tag_reject 19176 * 19177 * Description: Recovery actions for a SCSA "CMD_TAG_REJECT" pkt_reason. 19178 * 19179 * Context: May be called from interrupt context 19180 */ 19181 19182 static void 19183 sd_pkt_reason_cmd_tag_reject(struct sd_lun *un, struct buf *bp, 19184 struct sd_xbuf *xp, struct scsi_pkt *pktp) 19185 { 19186 ASSERT(un != NULL); 19187 ASSERT(mutex_owned(SD_MUTEX(un))); 19188 ASSERT(bp != NULL); 19189 ASSERT(xp != NULL); 19190 ASSERT(pktp != NULL); 19191 19192 SD_UPDATE_ERRSTATS(un, sd_harderrs); 19193 pktp->pkt_flags = 0; 19194 un->un_tagflags = 0; 19195 if (un->un_f_opt_queueing == TRUE) { 19196 un->un_throttle = min(un->un_throttle, 3); 19197 } else { 19198 un->un_throttle = 1; 19199 } 19200 mutex_exit(SD_MUTEX(un)); 19201 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1); 19202 mutex_enter(SD_MUTEX(un)); 19203 19204 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19205 19206 /* Legacy behavior not to check retry counts here. */ 19207 sd_retry_command(un, bp, (SD_RETRIES_NOCHECK | SD_RETRIES_ISOLATE), 19208 sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19209 } 19210 19211 19212 /* 19213 * Function: sd_pkt_reason_default 19214 * 19215 * Description: Default recovery actions for SCSA pkt_reason values that 19216 * do not have more explicit recovery actions. 19217 * 19218 * Context: May be called from interrupt context 19219 */ 19220 19221 static void 19222 sd_pkt_reason_default(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 19223 struct scsi_pkt *pktp) 19224 { 19225 ASSERT(un != NULL); 19226 ASSERT(mutex_owned(SD_MUTEX(un))); 19227 ASSERT(bp != NULL); 19228 ASSERT(xp != NULL); 19229 ASSERT(pktp != NULL); 19230 19231 SD_UPDATE_ERRSTATS(un, sd_transerrs); 19232 sd_reset_target(un, pktp); 19233 19234 SD_UPDATE_RESERVATION_STATUS(un, pktp); 19235 19236 sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE), 19237 sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL); 19238 } 19239 19240 19241 19242 /* 19243 * Function: sd_pkt_status_check_condition 19244 * 19245 * Description: Recovery actions for a "STATUS_CHECK" SCSI command status. 19246 * 19247 * Context: May be called from interrupt context 19248 */ 19249 19250 static void 19251 sd_pkt_status_check_condition(struct sd_lun *un, struct buf *bp, 19252 struct sd_xbuf *xp, struct scsi_pkt *pktp) 19253 { 19254 ASSERT(un != NULL); 19255 ASSERT(mutex_owned(SD_MUTEX(un))); 19256 ASSERT(bp != NULL); 19257 ASSERT(xp != NULL); 19258 ASSERT(pktp != NULL); 19259 19260 SD_TRACE(SD_LOG_IO, un, "sd_pkt_status_check_condition: " 19261 "entry: buf:0x%p xp:0x%p\n", bp, xp); 19262 19263 /* 19264 * If ARQ is NOT enabled, then issue a REQUEST SENSE command (the 19265 * command will be retried after the request sense). Otherwise, retry 19266 * the command. Note: we are issuing the request sense even though the 19267 * retry limit may have been reached for the failed command. 19268 */ 19269 if (un->un_f_arq_enabled == FALSE) { 19270 SD_INFO(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: " 19271 "no ARQ, sending request sense command\n"); 19272 sd_send_request_sense_command(un, bp, pktp); 19273 } else { 19274 SD_INFO(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: " 19275 "ARQ,retrying request sense command\n"); 19276 #if defined(__i386) || defined(__amd64) 19277 /* 19278 * The SD_RETRY_DELAY value need to be adjusted here 19279 * when SD_RETRY_DELAY change in sddef.h 19280 */ 19281 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, EIO, 19282 un->un_f_is_fibre?drv_usectohz(100000):(clock_t)0, 19283 NULL); 19284 #else 19285 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, 19286 EIO, SD_RETRY_DELAY, NULL); 19287 #endif 19288 } 19289 19290 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: exit\n"); 19291 } 19292 19293 19294 /* 19295 * Function: sd_pkt_status_busy 19296 * 19297 * Description: Recovery actions for a "STATUS_BUSY" SCSI command status. 19298 * 19299 * Context: May be called from interrupt context 19300 */ 19301 19302 static void 19303 sd_pkt_status_busy(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 19304 struct scsi_pkt *pktp) 19305 { 19306 ASSERT(un != NULL); 19307 ASSERT(mutex_owned(SD_MUTEX(un))); 19308 ASSERT(bp != NULL); 19309 ASSERT(xp != NULL); 19310 ASSERT(pktp != NULL); 19311 19312 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19313 "sd_pkt_status_busy: entry\n"); 19314 19315 /* If retries are exhausted, just fail the command. */ 19316 if (xp->xb_retry_count >= un->un_busy_retry_count) { 19317 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 19318 "device busy too long\n"); 19319 sd_return_failed_command(un, bp, EIO); 19320 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19321 "sd_pkt_status_busy: exit\n"); 19322 return; 19323 } 19324 xp->xb_retry_count++; 19325 19326 /* 19327 * Try to reset the target. However, we do not want to perform 19328 * more than one reset if the device continues to fail. The reset 19329 * will be performed when the retry count reaches the reset 19330 * threshold. This threshold should be set such that at least 19331 * one retry is issued before the reset is performed. 19332 */ 19333 if (xp->xb_retry_count == 19334 ((un->un_reset_retry_count < 2) ? 2 : un->un_reset_retry_count)) { 19335 int rval = 0; 19336 mutex_exit(SD_MUTEX(un)); 19337 if (un->un_f_allow_bus_device_reset == TRUE) { 19338 /* 19339 * First try to reset the LUN; if we cannot then 19340 * try to reset the target. 19341 */ 19342 if (un->un_f_lun_reset_enabled == TRUE) { 19343 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19344 "sd_pkt_status_busy: RESET_LUN\n"); 19345 rval = scsi_reset(SD_ADDRESS(un), RESET_LUN); 19346 } 19347 if (rval == 0) { 19348 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19349 "sd_pkt_status_busy: RESET_TARGET\n"); 19350 rval = scsi_reset(SD_ADDRESS(un), RESET_TARGET); 19351 } 19352 } 19353 if (rval == 0) { 19354 /* 19355 * If the RESET_LUN and/or RESET_TARGET failed, 19356 * try RESET_ALL 19357 */ 19358 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19359 "sd_pkt_status_busy: RESET_ALL\n"); 19360 rval = scsi_reset(SD_ADDRESS(un), RESET_ALL); 19361 } 19362 mutex_enter(SD_MUTEX(un)); 19363 if (rval == 0) { 19364 /* 19365 * The RESET_LUN, RESET_TARGET, and/or RESET_ALL failed. 19366 * At this point we give up & fail the command. 19367 */ 19368 sd_return_failed_command(un, bp, EIO); 19369 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19370 "sd_pkt_status_busy: exit (failed cmd)\n"); 19371 return; 19372 } 19373 } 19374 19375 /* 19376 * Retry the command. Be sure to specify SD_RETRIES_NOCHECK as 19377 * we have already checked the retry counts above. 19378 */ 19379 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, NULL, NULL, 19380 EIO, un->un_busy_timeout, NULL); 19381 19382 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19383 "sd_pkt_status_busy: exit\n"); 19384 } 19385 19386 19387 /* 19388 * Function: sd_pkt_status_reservation_conflict 19389 * 19390 * Description: Recovery actions for a "STATUS_RESERVATION_CONFLICT" SCSI 19391 * command status. 19392 * 19393 * Context: May be called from interrupt context 19394 */ 19395 19396 static void 19397 sd_pkt_status_reservation_conflict(struct sd_lun *un, struct buf *bp, 19398 struct sd_xbuf *xp, struct scsi_pkt *pktp) 19399 { 19400 ASSERT(un != NULL); 19401 ASSERT(mutex_owned(SD_MUTEX(un))); 19402 ASSERT(bp != NULL); 19403 ASSERT(xp != NULL); 19404 ASSERT(pktp != NULL); 19405 19406 /* 19407 * If the command was PERSISTENT_RESERVATION_[IN|OUT] then reservation 19408 * conflict could be due to various reasons like incorrect keys, not 19409 * registered or not reserved etc. So, we return EACCES to the caller. 19410 */ 19411 if (un->un_reservation_type == SD_SCSI3_RESERVATION) { 19412 int cmd = SD_GET_PKT_OPCODE(pktp); 19413 if ((cmd == SCMD_PERSISTENT_RESERVE_IN) || 19414 (cmd == SCMD_PERSISTENT_RESERVE_OUT)) { 19415 sd_return_failed_command(un, bp, EACCES); 19416 return; 19417 } 19418 } 19419 19420 un->un_resvd_status |= SD_RESERVATION_CONFLICT; 19421 19422 if ((un->un_resvd_status & SD_FAILFAST) != 0) { 19423 if (sd_failfast_enable != 0) { 19424 /* By definition, we must panic here.... */ 19425 sd_panic_for_res_conflict(un); 19426 /*NOTREACHED*/ 19427 } 19428 SD_ERROR(SD_LOG_IO, un, 19429 "sd_handle_resv_conflict: Disk Reserved\n"); 19430 sd_return_failed_command(un, bp, EACCES); 19431 return; 19432 } 19433 19434 /* 19435 * 1147670: retry only if sd_retry_on_reservation_conflict 19436 * property is set (default is 1). Retries will not succeed 19437 * on a disk reserved by another initiator. HA systems 19438 * may reset this via sd.conf to avoid these retries. 19439 * 19440 * Note: The legacy return code for this failure is EIO, however EACCES 19441 * seems more appropriate for a reservation conflict. 19442 */ 19443 if (sd_retry_on_reservation_conflict == 0) { 19444 SD_ERROR(SD_LOG_IO, un, 19445 "sd_handle_resv_conflict: Device Reserved\n"); 19446 sd_return_failed_command(un, bp, EIO); 19447 return; 19448 } 19449 19450 /* 19451 * Retry the command if we can. 19452 * 19453 * Note: The legacy return code for this failure is EIO, however EACCES 19454 * seems more appropriate for a reservation conflict. 19455 */ 19456 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, EIO, 19457 (clock_t)2, NULL); 19458 } 19459 19460 19461 19462 /* 19463 * Function: sd_pkt_status_qfull 19464 * 19465 * Description: Handle a QUEUE FULL condition from the target. This can 19466 * occur if the HBA does not handle the queue full condition. 19467 * (Basically this means third-party HBAs as Sun HBAs will 19468 * handle the queue full condition.) Note that if there are 19469 * some commands already in the transport, then the queue full 19470 * has occurred because the queue for this nexus is actually 19471 * full. If there are no commands in the transport, then the 19472 * queue full is resulting from some other initiator or lun 19473 * consuming all the resources at the target. 19474 * 19475 * Context: May be called from interrupt context 19476 */ 19477 19478 static void 19479 sd_pkt_status_qfull(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, 19480 struct scsi_pkt *pktp) 19481 { 19482 ASSERT(un != NULL); 19483 ASSERT(mutex_owned(SD_MUTEX(un))); 19484 ASSERT(bp != NULL); 19485 ASSERT(xp != NULL); 19486 ASSERT(pktp != NULL); 19487 19488 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19489 "sd_pkt_status_qfull: entry\n"); 19490 19491 /* 19492 * Just lower the QFULL throttle and retry the command. Note that 19493 * we do not limit the number of retries here. 19494 */ 19495 sd_reduce_throttle(un, SD_THROTTLE_QFULL); 19496 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, NULL, NULL, 0, 19497 SD_RESTART_TIMEOUT, NULL); 19498 19499 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19500 "sd_pkt_status_qfull: exit\n"); 19501 } 19502 19503 19504 /* 19505 * Function: sd_reset_target 19506 * 19507 * Description: Issue a scsi_reset(9F), with either RESET_LUN, 19508 * RESET_TARGET, or RESET_ALL. 19509 * 19510 * Context: May be called under interrupt context. 19511 */ 19512 19513 static void 19514 sd_reset_target(struct sd_lun *un, struct scsi_pkt *pktp) 19515 { 19516 int rval = 0; 19517 19518 ASSERT(un != NULL); 19519 ASSERT(mutex_owned(SD_MUTEX(un))); 19520 ASSERT(pktp != NULL); 19521 19522 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reset_target: entry\n"); 19523 19524 /* 19525 * No need to reset if the transport layer has already done so. 19526 */ 19527 if ((pktp->pkt_statistics & 19528 (STAT_BUS_RESET | STAT_DEV_RESET | STAT_ABORTED)) != 0) { 19529 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19530 "sd_reset_target: no reset\n"); 19531 return; 19532 } 19533 19534 mutex_exit(SD_MUTEX(un)); 19535 19536 if (un->un_f_allow_bus_device_reset == TRUE) { 19537 if (un->un_f_lun_reset_enabled == TRUE) { 19538 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19539 "sd_reset_target: RESET_LUN\n"); 19540 rval = scsi_reset(SD_ADDRESS(un), RESET_LUN); 19541 } 19542 if (rval == 0) { 19543 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19544 "sd_reset_target: RESET_TARGET\n"); 19545 rval = scsi_reset(SD_ADDRESS(un), RESET_TARGET); 19546 } 19547 } 19548 19549 if (rval == 0) { 19550 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 19551 "sd_reset_target: RESET_ALL\n"); 19552 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL); 19553 } 19554 19555 mutex_enter(SD_MUTEX(un)); 19556 19557 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reset_target: exit\n"); 19558 } 19559 19560 /* 19561 * Function: sd_target_change_task 19562 * 19563 * Description: Handle dynamic target change 19564 * 19565 * Context: Executes in a taskq() thread context 19566 */ 19567 static void 19568 sd_target_change_task(void *arg) 19569 { 19570 struct sd_lun *un = arg; 19571 uint64_t capacity; 19572 diskaddr_t label_cap; 19573 uint_t lbasize; 19574 sd_ssc_t *ssc; 19575 19576 ASSERT(un != NULL); 19577 ASSERT(!mutex_owned(SD_MUTEX(un))); 19578 19579 if ((un->un_f_blockcount_is_valid == FALSE) || 19580 (un->un_f_tgt_blocksize_is_valid == FALSE)) { 19581 return; 19582 } 19583 19584 ssc = sd_ssc_init(un); 19585 19586 if (sd_send_scsi_READ_CAPACITY(ssc, &capacity, 19587 &lbasize, SD_PATH_DIRECT) != 0) { 19588 SD_ERROR(SD_LOG_ERROR, un, 19589 "sd_target_change_task: fail to read capacity\n"); 19590 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 19591 goto task_exit; 19592 } 19593 19594 mutex_enter(SD_MUTEX(un)); 19595 if (capacity <= un->un_blockcount) { 19596 mutex_exit(SD_MUTEX(un)); 19597 goto task_exit; 19598 } 19599 19600 sd_update_block_info(un, lbasize, capacity); 19601 mutex_exit(SD_MUTEX(un)); 19602 19603 /* 19604 * If lun is EFI labeled and lun capacity is greater than the 19605 * capacity contained in the label, log a sys event. 19606 */ 19607 if (cmlb_efi_label_capacity(un->un_cmlbhandle, &label_cap, 19608 (void*)SD_PATH_DIRECT) == 0) { 19609 mutex_enter(SD_MUTEX(un)); 19610 if (un->un_f_blockcount_is_valid && 19611 un->un_blockcount > label_cap) { 19612 mutex_exit(SD_MUTEX(un)); 19613 sd_log_lun_expansion_event(un, KM_SLEEP); 19614 } else { 19615 mutex_exit(SD_MUTEX(un)); 19616 } 19617 } 19618 19619 task_exit: 19620 sd_ssc_fini(ssc); 19621 } 19622 19623 19624 /* 19625 * Function: sd_log_dev_status_event 19626 * 19627 * Description: Log EC_dev_status sysevent 19628 * 19629 * Context: Never called from interrupt context 19630 */ 19631 static void 19632 sd_log_dev_status_event(struct sd_lun *un, char *esc, int km_flag) 19633 { 19634 int err; 19635 char *path; 19636 nvlist_t *attr_list; 19637 19638 /* Allocate and build sysevent attribute list */ 19639 err = nvlist_alloc(&attr_list, NV_UNIQUE_NAME_TYPE, km_flag); 19640 if (err != 0) { 19641 SD_ERROR(SD_LOG_ERROR, un, 19642 "sd_log_dev_status_event: fail to allocate space\n"); 19643 return; 19644 } 19645 19646 path = kmem_alloc(MAXPATHLEN, km_flag); 19647 if (path == NULL) { 19648 nvlist_free(attr_list); 19649 SD_ERROR(SD_LOG_ERROR, un, 19650 "sd_log_dev_status_event: fail to allocate space\n"); 19651 return; 19652 } 19653 /* 19654 * Add path attribute to identify the lun. 19655 * We are using minor node 'a' as the sysevent attribute. 19656 */ 19657 (void) snprintf(path, MAXPATHLEN, "/devices"); 19658 (void) ddi_pathname(SD_DEVINFO(un), path + strlen(path)); 19659 (void) snprintf(path + strlen(path), MAXPATHLEN - strlen(path), 19660 ":a"); 19661 19662 err = nvlist_add_string(attr_list, DEV_PHYS_PATH, path); 19663 if (err != 0) { 19664 nvlist_free(attr_list); 19665 kmem_free(path, MAXPATHLEN); 19666 SD_ERROR(SD_LOG_ERROR, un, 19667 "sd_log_dev_status_event: fail to add attribute\n"); 19668 return; 19669 } 19670 19671 /* Log dynamic lun expansion sysevent */ 19672 err = ddi_log_sysevent(SD_DEVINFO(un), SUNW_VENDOR, EC_DEV_STATUS, 19673 esc, attr_list, NULL, km_flag); 19674 if (err != DDI_SUCCESS) { 19675 SD_ERROR(SD_LOG_ERROR, un, 19676 "sd_log_dev_status_event: fail to log sysevent\n"); 19677 } 19678 19679 nvlist_free(attr_list); 19680 kmem_free(path, MAXPATHLEN); 19681 } 19682 19683 19684 /* 19685 * Function: sd_log_lun_expansion_event 19686 * 19687 * Description: Log lun expansion sys event 19688 * 19689 * Context: Never called from interrupt context 19690 */ 19691 static void 19692 sd_log_lun_expansion_event(struct sd_lun *un, int km_flag) 19693 { 19694 sd_log_dev_status_event(un, ESC_DEV_DLE, km_flag); 19695 } 19696 19697 19698 /* 19699 * Function: sd_log_eject_request_event 19700 * 19701 * Description: Log eject request sysevent 19702 * 19703 * Context: Never called from interrupt context 19704 */ 19705 static void 19706 sd_log_eject_request_event(struct sd_lun *un, int km_flag) 19707 { 19708 sd_log_dev_status_event(un, ESC_DEV_EJECT_REQUEST, km_flag); 19709 } 19710 19711 19712 /* 19713 * Function: sd_media_change_task 19714 * 19715 * Description: Recovery action for CDROM to become available. 19716 * 19717 * Context: Executes in a taskq() thread context 19718 */ 19719 19720 static void 19721 sd_media_change_task(void *arg) 19722 { 19723 struct scsi_pkt *pktp = arg; 19724 struct sd_lun *un; 19725 struct buf *bp; 19726 struct sd_xbuf *xp; 19727 int err = 0; 19728 int retry_count = 0; 19729 int retry_limit = SD_UNIT_ATTENTION_RETRY/10; 19730 struct sd_sense_info si; 19731 19732 ASSERT(pktp != NULL); 19733 bp = (struct buf *)pktp->pkt_private; 19734 ASSERT(bp != NULL); 19735 xp = SD_GET_XBUF(bp); 19736 ASSERT(xp != NULL); 19737 un = SD_GET_UN(bp); 19738 ASSERT(un != NULL); 19739 ASSERT(!mutex_owned(SD_MUTEX(un))); 19740 ASSERT(un->un_f_monitor_media_state); 19741 19742 si.ssi_severity = SCSI_ERR_INFO; 19743 si.ssi_pfa_flag = FALSE; 19744 19745 /* 19746 * When a reset is issued on a CDROM, it takes a long time to 19747 * recover. First few attempts to read capacity and other things 19748 * related to handling unit attention fail (with a ASC 0x4 and 19749 * ASCQ 0x1). In that case we want to do enough retries and we want 19750 * to limit the retries in other cases of genuine failures like 19751 * no media in drive. 19752 */ 19753 while (retry_count++ < retry_limit) { 19754 if ((err = sd_handle_mchange(un)) == 0) { 19755 break; 19756 } 19757 if (err == EAGAIN) { 19758 retry_limit = SD_UNIT_ATTENTION_RETRY; 19759 } 19760 /* Sleep for 0.5 sec. & try again */ 19761 delay(drv_usectohz(500000)); 19762 } 19763 19764 /* 19765 * Dispatch (retry or fail) the original command here, 19766 * along with appropriate console messages.... 19767 * 19768 * Must grab the mutex before calling sd_retry_command, 19769 * sd_print_sense_msg and sd_return_failed_command. 19770 */ 19771 mutex_enter(SD_MUTEX(un)); 19772 if (err != SD_CMD_SUCCESS) { 19773 SD_UPDATE_ERRSTATS(un, sd_harderrs); 19774 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err); 19775 si.ssi_severity = SCSI_ERR_FATAL; 19776 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED); 19777 sd_return_failed_command(un, bp, EIO); 19778 } else { 19779 sd_retry_command(un, bp, SD_RETRIES_UA, sd_print_sense_msg, 19780 &si, EIO, (clock_t)0, NULL); 19781 } 19782 mutex_exit(SD_MUTEX(un)); 19783 } 19784 19785 19786 19787 /* 19788 * Function: sd_handle_mchange 19789 * 19790 * Description: Perform geometry validation & other recovery when CDROM 19791 * has been removed from drive. 19792 * 19793 * Return Code: 0 for success 19794 * errno-type return code of either sd_send_scsi_DOORLOCK() or 19795 * sd_send_scsi_READ_CAPACITY() 19796 * 19797 * Context: Executes in a taskq() thread context 19798 */ 19799 19800 static int 19801 sd_handle_mchange(struct sd_lun *un) 19802 { 19803 uint64_t capacity; 19804 uint32_t lbasize; 19805 int rval; 19806 sd_ssc_t *ssc; 19807 19808 ASSERT(!mutex_owned(SD_MUTEX(un))); 19809 ASSERT(un->un_f_monitor_media_state); 19810 19811 ssc = sd_ssc_init(un); 19812 rval = sd_send_scsi_READ_CAPACITY(ssc, &capacity, &lbasize, 19813 SD_PATH_DIRECT_PRIORITY); 19814 19815 if (rval != 0) 19816 goto failed; 19817 19818 mutex_enter(SD_MUTEX(un)); 19819 sd_update_block_info(un, lbasize, capacity); 19820 19821 if (un->un_errstats != NULL) { 19822 struct sd_errstats *stp = 19823 (struct sd_errstats *)un->un_errstats->ks_data; 19824 stp->sd_capacity.value.ui64 = (uint64_t) 19825 ((uint64_t)un->un_blockcount * 19826 (uint64_t)un->un_tgt_blocksize); 19827 } 19828 19829 /* 19830 * Check if the media in the device is writable or not 19831 */ 19832 if (ISCD(un)) { 19833 sd_check_for_writable_cd(ssc, SD_PATH_DIRECT_PRIORITY); 19834 } 19835 19836 /* 19837 * Note: Maybe let the strategy/partitioning chain worry about getting 19838 * valid geometry. 19839 */ 19840 mutex_exit(SD_MUTEX(un)); 19841 cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT_PRIORITY); 19842 19843 19844 if (cmlb_validate(un->un_cmlbhandle, 0, 19845 (void *)SD_PATH_DIRECT_PRIORITY) != 0) { 19846 sd_ssc_fini(ssc); 19847 return (EIO); 19848 } else { 19849 if (un->un_f_pkstats_enabled) { 19850 sd_set_pstats(un); 19851 SD_TRACE(SD_LOG_IO_PARTITION, un, 19852 "sd_handle_mchange: un:0x%p pstats created and " 19853 "set\n", un); 19854 } 19855 } 19856 19857 /* 19858 * Try to lock the door 19859 */ 19860 rval = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT, 19861 SD_PATH_DIRECT_PRIORITY); 19862 failed: 19863 if (rval != 0) 19864 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 19865 sd_ssc_fini(ssc); 19866 return (rval); 19867 } 19868 19869 19870 /* 19871 * Function: sd_send_scsi_DOORLOCK 19872 * 19873 * Description: Issue the scsi DOOR LOCK command 19874 * 19875 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 19876 * structure for this target. 19877 * flag - SD_REMOVAL_ALLOW 19878 * SD_REMOVAL_PREVENT 19879 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 19880 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 19881 * to use the USCSI "direct" chain and bypass the normal 19882 * command waitq. SD_PATH_DIRECT_PRIORITY is used when this 19883 * command is issued as part of an error recovery action. 19884 * 19885 * Return Code: 0 - Success 19886 * errno return code from sd_ssc_send() 19887 * 19888 * Context: Can sleep. 19889 */ 19890 19891 static int 19892 sd_send_scsi_DOORLOCK(sd_ssc_t *ssc, int flag, int path_flag) 19893 { 19894 struct scsi_extended_sense sense_buf; 19895 union scsi_cdb cdb; 19896 struct uscsi_cmd ucmd_buf; 19897 int status; 19898 struct sd_lun *un; 19899 19900 ASSERT(ssc != NULL); 19901 un = ssc->ssc_un; 19902 ASSERT(un != NULL); 19903 ASSERT(!mutex_owned(SD_MUTEX(un))); 19904 19905 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_DOORLOCK: entry: un:0x%p\n", un); 19906 19907 /* already determined doorlock is not supported, fake success */ 19908 if (un->un_f_doorlock_supported == FALSE) { 19909 return (0); 19910 } 19911 19912 /* 19913 * If we are ejecting and see an SD_REMOVAL_PREVENT 19914 * ignore the command so we can complete the eject 19915 * operation. 19916 */ 19917 if (flag == SD_REMOVAL_PREVENT) { 19918 mutex_enter(SD_MUTEX(un)); 19919 if (un->un_f_ejecting == TRUE) { 19920 mutex_exit(SD_MUTEX(un)); 19921 return (EAGAIN); 19922 } 19923 mutex_exit(SD_MUTEX(un)); 19924 } 19925 19926 bzero(&cdb, sizeof (cdb)); 19927 bzero(&ucmd_buf, sizeof (ucmd_buf)); 19928 19929 cdb.scc_cmd = SCMD_DOORLOCK; 19930 cdb.cdb_opaque[4] = (uchar_t)flag; 19931 19932 ucmd_buf.uscsi_cdb = (char *)&cdb; 19933 ucmd_buf.uscsi_cdblen = CDB_GROUP0; 19934 ucmd_buf.uscsi_bufaddr = NULL; 19935 ucmd_buf.uscsi_buflen = 0; 19936 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 19937 ucmd_buf.uscsi_rqlen = sizeof (sense_buf); 19938 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_SILENT; 19939 ucmd_buf.uscsi_timeout = 15; 19940 19941 SD_TRACE(SD_LOG_IO, un, 19942 "sd_send_scsi_DOORLOCK: returning sd_ssc_send\n"); 19943 19944 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 19945 UIO_SYSSPACE, path_flag); 19946 19947 if (status == 0) 19948 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 19949 19950 if ((status == EIO) && (ucmd_buf.uscsi_status == STATUS_CHECK) && 19951 (ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 19952 (scsi_sense_key((uint8_t *)&sense_buf) == KEY_ILLEGAL_REQUEST)) { 19953 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 19954 19955 /* fake success and skip subsequent doorlock commands */ 19956 un->un_f_doorlock_supported = FALSE; 19957 return (0); 19958 } 19959 19960 return (status); 19961 } 19962 19963 /* 19964 * Function: sd_send_scsi_READ_CAPACITY 19965 * 19966 * Description: This routine uses the scsi READ CAPACITY command to determine 19967 * the device capacity in number of blocks and the device native 19968 * block size. If this function returns a failure, then the 19969 * values in *capp and *lbap are undefined. If the capacity 19970 * returned is 0xffffffff then the lun is too large for a 19971 * normal READ CAPACITY command and the results of a 19972 * READ CAPACITY 16 will be used instead. 19973 * 19974 * Arguments: ssc - ssc contains ptr to soft state struct for the target 19975 * capp - ptr to unsigned 64-bit variable to receive the 19976 * capacity value from the command. 19977 * lbap - ptr to unsigned 32-bit varaible to receive the 19978 * block size value from the command 19979 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 19980 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 19981 * to use the USCSI "direct" chain and bypass the normal 19982 * command waitq. SD_PATH_DIRECT_PRIORITY is used when this 19983 * command is issued as part of an error recovery action. 19984 * 19985 * Return Code: 0 - Success 19986 * EIO - IO error 19987 * EACCES - Reservation conflict detected 19988 * EAGAIN - Device is becoming ready 19989 * errno return code from sd_ssc_send() 19990 * 19991 * Context: Can sleep. Blocks until command completes. 19992 */ 19993 19994 #define SD_CAPACITY_SIZE sizeof (struct scsi_capacity) 19995 19996 static int 19997 sd_send_scsi_READ_CAPACITY(sd_ssc_t *ssc, uint64_t *capp, uint32_t *lbap, 19998 int path_flag) 19999 { 20000 struct scsi_extended_sense sense_buf; 20001 struct uscsi_cmd ucmd_buf; 20002 union scsi_cdb cdb; 20003 uint32_t *capacity_buf; 20004 uint64_t capacity; 20005 uint32_t lbasize; 20006 uint32_t pbsize; 20007 int status; 20008 struct sd_lun *un; 20009 20010 ASSERT(ssc != NULL); 20011 20012 un = ssc->ssc_un; 20013 ASSERT(un != NULL); 20014 ASSERT(!mutex_owned(SD_MUTEX(un))); 20015 ASSERT(capp != NULL); 20016 ASSERT(lbap != NULL); 20017 20018 SD_TRACE(SD_LOG_IO, un, 20019 "sd_send_scsi_READ_CAPACITY: entry: un:0x%p\n", un); 20020 20021 /* 20022 * First send a READ_CAPACITY command to the target. 20023 * (This command is mandatory under SCSI-2.) 20024 * 20025 * Set up the CDB for the READ_CAPACITY command. The Partial 20026 * Medium Indicator bit is cleared. The address field must be 20027 * zero if the PMI bit is zero. 20028 */ 20029 bzero(&cdb, sizeof (cdb)); 20030 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20031 20032 capacity_buf = kmem_zalloc(SD_CAPACITY_SIZE, KM_SLEEP); 20033 20034 cdb.scc_cmd = SCMD_READ_CAPACITY; 20035 20036 ucmd_buf.uscsi_cdb = (char *)&cdb; 20037 ucmd_buf.uscsi_cdblen = CDB_GROUP1; 20038 ucmd_buf.uscsi_bufaddr = (caddr_t)capacity_buf; 20039 ucmd_buf.uscsi_buflen = SD_CAPACITY_SIZE; 20040 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 20041 ucmd_buf.uscsi_rqlen = sizeof (sense_buf); 20042 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT; 20043 ucmd_buf.uscsi_timeout = 60; 20044 20045 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 20046 UIO_SYSSPACE, path_flag); 20047 20048 switch (status) { 20049 case 0: 20050 /* Return failure if we did not get valid capacity data. */ 20051 if (ucmd_buf.uscsi_resid != 0) { 20052 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1, 20053 "sd_send_scsi_READ_CAPACITY received invalid " 20054 "capacity data"); 20055 kmem_free(capacity_buf, SD_CAPACITY_SIZE); 20056 return (EIO); 20057 } 20058 /* 20059 * Read capacity and block size from the READ CAPACITY 10 data. 20060 * This data may be adjusted later due to device specific 20061 * issues. 20062 * 20063 * According to the SCSI spec, the READ CAPACITY 10 20064 * command returns the following: 20065 * 20066 * bytes 0-3: Maximum logical block address available. 20067 * (MSB in byte:0 & LSB in byte:3) 20068 * 20069 * bytes 4-7: Block length in bytes 20070 * (MSB in byte:4 & LSB in byte:7) 20071 * 20072 */ 20073 capacity = BE_32(capacity_buf[0]); 20074 lbasize = BE_32(capacity_buf[1]); 20075 20076 /* 20077 * Done with capacity_buf 20078 */ 20079 kmem_free(capacity_buf, SD_CAPACITY_SIZE); 20080 20081 /* 20082 * if the reported capacity is set to all 0xf's, then 20083 * this disk is too large and requires SBC-2 commands. 20084 * Reissue the request using READ CAPACITY 16. 20085 */ 20086 if (capacity == 0xffffffff) { 20087 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 20088 status = sd_send_scsi_READ_CAPACITY_16(ssc, &capacity, 20089 &lbasize, &pbsize, path_flag); 20090 if (status != 0) { 20091 return (status); 20092 } else { 20093 goto rc16_done; 20094 } 20095 } 20096 break; /* Success! */ 20097 case EIO: 20098 switch (ucmd_buf.uscsi_status) { 20099 case STATUS_RESERVATION_CONFLICT: 20100 status = EACCES; 20101 break; 20102 case STATUS_CHECK: 20103 /* 20104 * Check condition; look for ASC/ASCQ of 0x04/0x01 20105 * (LOGICAL UNIT IS IN PROCESS OF BECOMING READY) 20106 */ 20107 if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 20108 (scsi_sense_asc((uint8_t *)&sense_buf) == 0x04) && 20109 (scsi_sense_ascq((uint8_t *)&sense_buf) == 0x01)) { 20110 kmem_free(capacity_buf, SD_CAPACITY_SIZE); 20111 return (EAGAIN); 20112 } 20113 break; 20114 default: 20115 break; 20116 } 20117 /* FALLTHRU */ 20118 default: 20119 kmem_free(capacity_buf, SD_CAPACITY_SIZE); 20120 return (status); 20121 } 20122 20123 /* 20124 * Some ATAPI CD-ROM drives report inaccurate LBA size values 20125 * (2352 and 0 are common) so for these devices always force the value 20126 * to 2048 as required by the ATAPI specs. 20127 */ 20128 if ((un->un_f_cfg_is_atapi == TRUE) && (ISCD(un))) { 20129 lbasize = 2048; 20130 } 20131 20132 /* 20133 * Get the maximum LBA value from the READ CAPACITY data. 20134 * Here we assume that the Partial Medium Indicator (PMI) bit 20135 * was cleared when issuing the command. This means that the LBA 20136 * returned from the device is the LBA of the last logical block 20137 * on the logical unit. The actual logical block count will be 20138 * this value plus one. 20139 */ 20140 capacity += 1; 20141 20142 /* 20143 * Currently, for removable media, the capacity is saved in terms 20144 * of un->un_sys_blocksize, so scale the capacity value to reflect this. 20145 */ 20146 if (un->un_f_has_removable_media) 20147 capacity *= (lbasize / un->un_sys_blocksize); 20148 20149 rc16_done: 20150 20151 /* 20152 * Copy the values from the READ CAPACITY command into the space 20153 * provided by the caller. 20154 */ 20155 *capp = capacity; 20156 *lbap = lbasize; 20157 20158 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_READ_CAPACITY: " 20159 "capacity:0x%llx lbasize:0x%x\n", capacity, lbasize); 20160 20161 /* 20162 * Both the lbasize and capacity from the device must be nonzero, 20163 * otherwise we assume that the values are not valid and return 20164 * failure to the caller. (4203735) 20165 */ 20166 if ((capacity == 0) || (lbasize == 0)) { 20167 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1, 20168 "sd_send_scsi_READ_CAPACITY received invalid value " 20169 "capacity %llu lbasize %d", capacity, lbasize); 20170 return (EIO); 20171 } 20172 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 20173 return (0); 20174 } 20175 20176 /* 20177 * Function: sd_send_scsi_READ_CAPACITY_16 20178 * 20179 * Description: This routine uses the scsi READ CAPACITY 16 command to 20180 * determine the device capacity in number of blocks and the 20181 * device native block size. If this function returns a failure, 20182 * then the values in *capp and *lbap are undefined. 20183 * This routine should be called by sd_send_scsi_READ_CAPACITY 20184 * which will apply any device specific adjustments to capacity 20185 * and lbasize. One exception is it is also called by 20186 * sd_get_media_info_ext. In that function, there is no need to 20187 * adjust the capacity and lbasize. 20188 * 20189 * Arguments: ssc - ssc contains ptr to soft state struct for the target 20190 * capp - ptr to unsigned 64-bit variable to receive the 20191 * capacity value from the command. 20192 * lbap - ptr to unsigned 32-bit varaible to receive the 20193 * block size value from the command 20194 * psp - ptr to unsigned 32-bit variable to receive the 20195 * physical block size value from the command 20196 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 20197 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 20198 * to use the USCSI "direct" chain and bypass the normal 20199 * command waitq. SD_PATH_DIRECT_PRIORITY is used when 20200 * this command is issued as part of an error recovery 20201 * action. 20202 * 20203 * Return Code: 0 - Success 20204 * EIO - IO error 20205 * EACCES - Reservation conflict detected 20206 * EAGAIN - Device is becoming ready 20207 * errno return code from sd_ssc_send() 20208 * 20209 * Context: Can sleep. Blocks until command completes. 20210 */ 20211 20212 #define SD_CAPACITY_16_SIZE sizeof (struct scsi_capacity_16) 20213 20214 static int 20215 sd_send_scsi_READ_CAPACITY_16(sd_ssc_t *ssc, uint64_t *capp, uint32_t *lbap, 20216 uint32_t *psp, int path_flag) 20217 { 20218 struct scsi_extended_sense sense_buf; 20219 struct uscsi_cmd ucmd_buf; 20220 union scsi_cdb cdb; 20221 uint64_t *capacity16_buf; 20222 uint64_t capacity; 20223 uint32_t lbasize; 20224 uint32_t pbsize; 20225 uint32_t lbpb_exp; 20226 int status; 20227 struct sd_lun *un; 20228 20229 ASSERT(ssc != NULL); 20230 20231 un = ssc->ssc_un; 20232 ASSERT(un != NULL); 20233 ASSERT(!mutex_owned(SD_MUTEX(un))); 20234 ASSERT(capp != NULL); 20235 ASSERT(lbap != NULL); 20236 20237 SD_TRACE(SD_LOG_IO, un, 20238 "sd_send_scsi_READ_CAPACITY: entry: un:0x%p\n", un); 20239 20240 /* 20241 * First send a READ_CAPACITY_16 command to the target. 20242 * 20243 * Set up the CDB for the READ_CAPACITY_16 command. The Partial 20244 * Medium Indicator bit is cleared. The address field must be 20245 * zero if the PMI bit is zero. 20246 */ 20247 bzero(&cdb, sizeof (cdb)); 20248 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20249 20250 capacity16_buf = kmem_zalloc(SD_CAPACITY_16_SIZE, KM_SLEEP); 20251 20252 ucmd_buf.uscsi_cdb = (char *)&cdb; 20253 ucmd_buf.uscsi_cdblen = CDB_GROUP4; 20254 ucmd_buf.uscsi_bufaddr = (caddr_t)capacity16_buf; 20255 ucmd_buf.uscsi_buflen = SD_CAPACITY_16_SIZE; 20256 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 20257 ucmd_buf.uscsi_rqlen = sizeof (sense_buf); 20258 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT; 20259 ucmd_buf.uscsi_timeout = 60; 20260 20261 /* 20262 * Read Capacity (16) is a Service Action In command. One 20263 * command byte (0x9E) is overloaded for multiple operations, 20264 * with the second CDB byte specifying the desired operation 20265 */ 20266 cdb.scc_cmd = SCMD_SVC_ACTION_IN_G4; 20267 cdb.cdb_opaque[1] = SSVC_ACTION_READ_CAPACITY_G4; 20268 20269 /* 20270 * Fill in allocation length field 20271 */ 20272 FORMG4COUNT(&cdb, ucmd_buf.uscsi_buflen); 20273 20274 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 20275 UIO_SYSSPACE, path_flag); 20276 20277 switch (status) { 20278 case 0: 20279 /* Return failure if we did not get valid capacity data. */ 20280 if (ucmd_buf.uscsi_resid > 20) { 20281 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1, 20282 "sd_send_scsi_READ_CAPACITY_16 received invalid " 20283 "capacity data"); 20284 kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE); 20285 return (EIO); 20286 } 20287 20288 /* 20289 * Read capacity and block size from the READ CAPACITY 16 data. 20290 * This data may be adjusted later due to device specific 20291 * issues. 20292 * 20293 * According to the SCSI spec, the READ CAPACITY 16 20294 * command returns the following: 20295 * 20296 * bytes 0-7: Maximum logical block address available. 20297 * (MSB in byte:0 & LSB in byte:7) 20298 * 20299 * bytes 8-11: Block length in bytes 20300 * (MSB in byte:8 & LSB in byte:11) 20301 * 20302 * byte 13: LOGICAL BLOCKS PER PHYSICAL BLOCK EXPONENT 20303 */ 20304 capacity = BE_64(capacity16_buf[0]); 20305 lbasize = BE_32(*(uint32_t *)&capacity16_buf[1]); 20306 lbpb_exp = (BE_64(capacity16_buf[1]) >> 16) & 0x0f; 20307 20308 pbsize = lbasize << lbpb_exp; 20309 20310 /* 20311 * Done with capacity16_buf 20312 */ 20313 kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE); 20314 20315 /* 20316 * if the reported capacity is set to all 0xf's, then 20317 * this disk is too large. This could only happen with 20318 * a device that supports LBAs larger than 64 bits which 20319 * are not defined by any current T10 standards. 20320 */ 20321 if (capacity == 0xffffffffffffffff) { 20322 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1, 20323 "disk is too large"); 20324 return (EIO); 20325 } 20326 break; /* Success! */ 20327 case EIO: 20328 switch (ucmd_buf.uscsi_status) { 20329 case STATUS_RESERVATION_CONFLICT: 20330 status = EACCES; 20331 break; 20332 case STATUS_CHECK: 20333 /* 20334 * Check condition; look for ASC/ASCQ of 0x04/0x01 20335 * (LOGICAL UNIT IS IN PROCESS OF BECOMING READY) 20336 */ 20337 if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 20338 (scsi_sense_asc((uint8_t *)&sense_buf) == 0x04) && 20339 (scsi_sense_ascq((uint8_t *)&sense_buf) == 0x01)) { 20340 kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE); 20341 return (EAGAIN); 20342 } 20343 break; 20344 default: 20345 break; 20346 } 20347 /* FALLTHRU */ 20348 default: 20349 kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE); 20350 return (status); 20351 } 20352 20353 /* 20354 * Some ATAPI CD-ROM drives report inaccurate LBA size values 20355 * (2352 and 0 are common) so for these devices always force the value 20356 * to 2048 as required by the ATAPI specs. 20357 */ 20358 if ((un->un_f_cfg_is_atapi == TRUE) && (ISCD(un))) { 20359 lbasize = 2048; 20360 } 20361 20362 /* 20363 * Get the maximum LBA value from the READ CAPACITY 16 data. 20364 * Here we assume that the Partial Medium Indicator (PMI) bit 20365 * was cleared when issuing the command. This means that the LBA 20366 * returned from the device is the LBA of the last logical block 20367 * on the logical unit. The actual logical block count will be 20368 * this value plus one. 20369 */ 20370 capacity += 1; 20371 20372 /* 20373 * Currently, for removable media, the capacity is saved in terms 20374 * of un->un_sys_blocksize, so scale the capacity value to reflect this. 20375 */ 20376 if (un->un_f_has_removable_media) 20377 capacity *= (lbasize / un->un_sys_blocksize); 20378 20379 *capp = capacity; 20380 *lbap = lbasize; 20381 *psp = pbsize; 20382 20383 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_READ_CAPACITY_16: " 20384 "capacity:0x%llx lbasize:0x%x, pbsize: 0x%x\n", 20385 capacity, lbasize, pbsize); 20386 20387 if ((capacity == 0) || (lbasize == 0) || (pbsize == 0)) { 20388 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1, 20389 "sd_send_scsi_READ_CAPACITY_16 received invalid value " 20390 "capacity %llu lbasize %d pbsize %d", capacity, lbasize); 20391 return (EIO); 20392 } 20393 20394 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 20395 return (0); 20396 } 20397 20398 20399 /* 20400 * Function: sd_send_scsi_START_STOP_UNIT 20401 * 20402 * Description: Issue a scsi START STOP UNIT command to the target. 20403 * 20404 * Arguments: ssc - ssc contatins pointer to driver soft state (unit) 20405 * structure for this target. 20406 * pc_flag - SD_POWER_CONDITION 20407 * SD_START_STOP 20408 * flag - SD_TARGET_START 20409 * SD_TARGET_STOP 20410 * SD_TARGET_EJECT 20411 * SD_TARGET_CLOSE 20412 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 20413 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 20414 * to use the USCSI "direct" chain and bypass the normal 20415 * command waitq. SD_PATH_DIRECT_PRIORITY is used when this 20416 * command is issued as part of an error recovery action. 20417 * 20418 * Return Code: 0 - Success 20419 * EIO - IO error 20420 * EACCES - Reservation conflict detected 20421 * ENXIO - Not Ready, medium not present 20422 * errno return code from sd_ssc_send() 20423 * 20424 * Context: Can sleep. 20425 */ 20426 20427 static int 20428 sd_send_scsi_START_STOP_UNIT(sd_ssc_t *ssc, int pc_flag, int flag, 20429 int path_flag) 20430 { 20431 struct scsi_extended_sense sense_buf; 20432 union scsi_cdb cdb; 20433 struct uscsi_cmd ucmd_buf; 20434 int status; 20435 struct sd_lun *un; 20436 20437 ASSERT(ssc != NULL); 20438 un = ssc->ssc_un; 20439 ASSERT(un != NULL); 20440 ASSERT(!mutex_owned(SD_MUTEX(un))); 20441 20442 SD_TRACE(SD_LOG_IO, un, 20443 "sd_send_scsi_START_STOP_UNIT: entry: un:0x%p\n", un); 20444 20445 if (un->un_f_check_start_stop && 20446 (pc_flag == SD_START_STOP) && 20447 ((flag == SD_TARGET_START) || (flag == SD_TARGET_STOP)) && 20448 (un->un_f_start_stop_supported != TRUE)) { 20449 return (0); 20450 } 20451 20452 /* 20453 * If we are performing an eject operation and 20454 * we receive any command other than SD_TARGET_EJECT 20455 * we should immediately return. 20456 */ 20457 if (flag != SD_TARGET_EJECT) { 20458 mutex_enter(SD_MUTEX(un)); 20459 if (un->un_f_ejecting == TRUE) { 20460 mutex_exit(SD_MUTEX(un)); 20461 return (EAGAIN); 20462 } 20463 mutex_exit(SD_MUTEX(un)); 20464 } 20465 20466 bzero(&cdb, sizeof (cdb)); 20467 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20468 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 20469 20470 cdb.scc_cmd = SCMD_START_STOP; 20471 cdb.cdb_opaque[4] = (pc_flag == SD_POWER_CONDITION) ? 20472 (uchar_t)(flag << 4) : (uchar_t)flag; 20473 20474 ucmd_buf.uscsi_cdb = (char *)&cdb; 20475 ucmd_buf.uscsi_cdblen = CDB_GROUP0; 20476 ucmd_buf.uscsi_bufaddr = NULL; 20477 ucmd_buf.uscsi_buflen = 0; 20478 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 20479 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 20480 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_SILENT; 20481 ucmd_buf.uscsi_timeout = 200; 20482 20483 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 20484 UIO_SYSSPACE, path_flag); 20485 20486 switch (status) { 20487 case 0: 20488 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 20489 break; /* Success! */ 20490 case EIO: 20491 switch (ucmd_buf.uscsi_status) { 20492 case STATUS_RESERVATION_CONFLICT: 20493 status = EACCES; 20494 break; 20495 case STATUS_CHECK: 20496 if (ucmd_buf.uscsi_rqstatus == STATUS_GOOD) { 20497 switch (scsi_sense_key( 20498 (uint8_t *)&sense_buf)) { 20499 case KEY_ILLEGAL_REQUEST: 20500 status = ENOTSUP; 20501 break; 20502 case KEY_NOT_READY: 20503 if (scsi_sense_asc( 20504 (uint8_t *)&sense_buf) 20505 == 0x3A) { 20506 status = ENXIO; 20507 } 20508 break; 20509 default: 20510 break; 20511 } 20512 } 20513 break; 20514 default: 20515 break; 20516 } 20517 break; 20518 default: 20519 break; 20520 } 20521 20522 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_START_STOP_UNIT: exit\n"); 20523 20524 return (status); 20525 } 20526 20527 20528 /* 20529 * Function: sd_start_stop_unit_callback 20530 * 20531 * Description: timeout(9F) callback to begin recovery process for a 20532 * device that has spun down. 20533 * 20534 * Arguments: arg - pointer to associated softstate struct. 20535 * 20536 * Context: Executes in a timeout(9F) thread context 20537 */ 20538 20539 static void 20540 sd_start_stop_unit_callback(void *arg) 20541 { 20542 struct sd_lun *un = arg; 20543 ASSERT(un != NULL); 20544 ASSERT(!mutex_owned(SD_MUTEX(un))); 20545 20546 SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_callback: entry\n"); 20547 20548 (void) taskq_dispatch(sd_tq, sd_start_stop_unit_task, un, KM_NOSLEEP); 20549 } 20550 20551 20552 /* 20553 * Function: sd_start_stop_unit_task 20554 * 20555 * Description: Recovery procedure when a drive is spun down. 20556 * 20557 * Arguments: arg - pointer to associated softstate struct. 20558 * 20559 * Context: Executes in a taskq() thread context 20560 */ 20561 20562 static void 20563 sd_start_stop_unit_task(void *arg) 20564 { 20565 struct sd_lun *un = arg; 20566 sd_ssc_t *ssc; 20567 int power_level; 20568 int rval; 20569 20570 ASSERT(un != NULL); 20571 ASSERT(!mutex_owned(SD_MUTEX(un))); 20572 20573 SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_task: entry\n"); 20574 20575 /* 20576 * Some unformatted drives report not ready error, no need to 20577 * restart if format has been initiated. 20578 */ 20579 mutex_enter(SD_MUTEX(un)); 20580 if (un->un_f_format_in_progress == TRUE) { 20581 mutex_exit(SD_MUTEX(un)); 20582 return; 20583 } 20584 mutex_exit(SD_MUTEX(un)); 20585 20586 ssc = sd_ssc_init(un); 20587 /* 20588 * When a START STOP command is issued from here, it is part of a 20589 * failure recovery operation and must be issued before any other 20590 * commands, including any pending retries. Thus it must be sent 20591 * using SD_PATH_DIRECT_PRIORITY. It doesn't matter if the spin up 20592 * succeeds or not, we will start I/O after the attempt. 20593 * If power condition is supported and the current power level 20594 * is capable of performing I/O, we should set the power condition 20595 * to that level. Otherwise, set the power condition to ACTIVE. 20596 */ 20597 if (un->un_f_power_condition_supported) { 20598 mutex_enter(SD_MUTEX(un)); 20599 ASSERT(SD_PM_IS_LEVEL_VALID(un, un->un_power_level)); 20600 power_level = sd_pwr_pc.ran_perf[un->un_power_level] 20601 > 0 ? un->un_power_level : SD_SPINDLE_ACTIVE; 20602 mutex_exit(SD_MUTEX(un)); 20603 rval = sd_send_scsi_START_STOP_UNIT(ssc, SD_POWER_CONDITION, 20604 sd_pl2pc[power_level], SD_PATH_DIRECT_PRIORITY); 20605 } else { 20606 rval = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP, 20607 SD_TARGET_START, SD_PATH_DIRECT_PRIORITY); 20608 } 20609 20610 if (rval != 0) 20611 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 20612 sd_ssc_fini(ssc); 20613 /* 20614 * The above call blocks until the START_STOP_UNIT command completes. 20615 * Now that it has completed, we must re-try the original IO that 20616 * received the NOT READY condition in the first place. There are 20617 * three possible conditions here: 20618 * 20619 * (1) The original IO is on un_retry_bp. 20620 * (2) The original IO is on the regular wait queue, and un_retry_bp 20621 * is NULL. 20622 * (3) The original IO is on the regular wait queue, and un_retry_bp 20623 * points to some other, unrelated bp. 20624 * 20625 * For each case, we must call sd_start_cmds() with un_retry_bp 20626 * as the argument. If un_retry_bp is NULL, this will initiate 20627 * processing of the regular wait queue. If un_retry_bp is not NULL, 20628 * then this will process the bp on un_retry_bp. That may or may not 20629 * be the original IO, but that does not matter: the important thing 20630 * is to keep the IO processing going at this point. 20631 * 20632 * Note: This is a very specific error recovery sequence associated 20633 * with a drive that is not spun up. We attempt a START_STOP_UNIT and 20634 * serialize the I/O with completion of the spin-up. 20635 */ 20636 mutex_enter(SD_MUTEX(un)); 20637 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, 20638 "sd_start_stop_unit_task: un:0x%p starting bp:0x%p\n", 20639 un, un->un_retry_bp); 20640 un->un_startstop_timeid = NULL; /* Timeout is no longer pending */ 20641 sd_start_cmds(un, un->un_retry_bp); 20642 mutex_exit(SD_MUTEX(un)); 20643 20644 SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_task: exit\n"); 20645 } 20646 20647 20648 /* 20649 * Function: sd_send_scsi_INQUIRY 20650 * 20651 * Description: Issue the scsi INQUIRY command. 20652 * 20653 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 20654 * structure for this target. 20655 * bufaddr 20656 * buflen 20657 * evpd 20658 * page_code 20659 * page_length 20660 * 20661 * Return Code: 0 - Success 20662 * errno return code from sd_ssc_send() 20663 * 20664 * Context: Can sleep. Does not return until command is completed. 20665 */ 20666 20667 static int 20668 sd_send_scsi_INQUIRY(sd_ssc_t *ssc, uchar_t *bufaddr, size_t buflen, 20669 uchar_t evpd, uchar_t page_code, size_t *residp) 20670 { 20671 union scsi_cdb cdb; 20672 struct uscsi_cmd ucmd_buf; 20673 int status; 20674 struct sd_lun *un; 20675 20676 ASSERT(ssc != NULL); 20677 un = ssc->ssc_un; 20678 ASSERT(un != NULL); 20679 ASSERT(!mutex_owned(SD_MUTEX(un))); 20680 ASSERT(bufaddr != NULL); 20681 20682 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_INQUIRY: entry: un:0x%p\n", un); 20683 20684 bzero(&cdb, sizeof (cdb)); 20685 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20686 bzero(bufaddr, buflen); 20687 20688 cdb.scc_cmd = SCMD_INQUIRY; 20689 cdb.cdb_opaque[1] = evpd; 20690 cdb.cdb_opaque[2] = page_code; 20691 FORMG0COUNT(&cdb, buflen); 20692 20693 ucmd_buf.uscsi_cdb = (char *)&cdb; 20694 ucmd_buf.uscsi_cdblen = CDB_GROUP0; 20695 ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr; 20696 ucmd_buf.uscsi_buflen = buflen; 20697 ucmd_buf.uscsi_rqbuf = NULL; 20698 ucmd_buf.uscsi_rqlen = 0; 20699 ucmd_buf.uscsi_flags = USCSI_READ | USCSI_SILENT; 20700 ucmd_buf.uscsi_timeout = 200; /* Excessive legacy value */ 20701 20702 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 20703 UIO_SYSSPACE, SD_PATH_DIRECT); 20704 20705 /* 20706 * Only handle status == 0, the upper-level caller 20707 * will put different assessment based on the context. 20708 */ 20709 if (status == 0) 20710 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 20711 20712 if ((status == 0) && (residp != NULL)) { 20713 *residp = ucmd_buf.uscsi_resid; 20714 } 20715 20716 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_INQUIRY: exit\n"); 20717 20718 return (status); 20719 } 20720 20721 20722 /* 20723 * Function: sd_send_scsi_TEST_UNIT_READY 20724 * 20725 * Description: Issue the scsi TEST UNIT READY command. 20726 * This routine can be told to set the flag USCSI_DIAGNOSE to 20727 * prevent retrying failed commands. Use this when the intent 20728 * is either to check for device readiness, to clear a Unit 20729 * Attention, or to clear any outstanding sense data. 20730 * However under specific conditions the expected behavior 20731 * is for retries to bring a device ready, so use the flag 20732 * with caution. 20733 * 20734 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 20735 * structure for this target. 20736 * flag: SD_CHECK_FOR_MEDIA: return ENXIO if no media present 20737 * SD_DONT_RETRY_TUR: include uscsi flag USCSI_DIAGNOSE. 20738 * 0: dont check for media present, do retries on cmd. 20739 * 20740 * Return Code: 0 - Success 20741 * EIO - IO error 20742 * EACCES - Reservation conflict detected 20743 * ENXIO - Not Ready, medium not present 20744 * errno return code from sd_ssc_send() 20745 * 20746 * Context: Can sleep. Does not return until command is completed. 20747 */ 20748 20749 static int 20750 sd_send_scsi_TEST_UNIT_READY(sd_ssc_t *ssc, int flag) 20751 { 20752 struct scsi_extended_sense sense_buf; 20753 union scsi_cdb cdb; 20754 struct uscsi_cmd ucmd_buf; 20755 int status; 20756 struct sd_lun *un; 20757 20758 ASSERT(ssc != NULL); 20759 un = ssc->ssc_un; 20760 ASSERT(un != NULL); 20761 ASSERT(!mutex_owned(SD_MUTEX(un))); 20762 20763 SD_TRACE(SD_LOG_IO, un, 20764 "sd_send_scsi_TEST_UNIT_READY: entry: un:0x%p\n", un); 20765 20766 /* 20767 * Some Seagate elite1 TQ devices get hung with disconnect/reconnect 20768 * timeouts when they receive a TUR and the queue is not empty. Check 20769 * the configuration flag set during attach (indicating the drive has 20770 * this firmware bug) and un_ncmds_in_transport before issuing the 20771 * TUR. If there are 20772 * pending commands return success, this is a bit arbitrary but is ok 20773 * for non-removables (i.e. the eliteI disks) and non-clustering 20774 * configurations. 20775 */ 20776 if (un->un_f_cfg_tur_check == TRUE) { 20777 mutex_enter(SD_MUTEX(un)); 20778 if (un->un_ncmds_in_transport != 0) { 20779 mutex_exit(SD_MUTEX(un)); 20780 return (0); 20781 } 20782 mutex_exit(SD_MUTEX(un)); 20783 } 20784 20785 bzero(&cdb, sizeof (cdb)); 20786 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20787 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 20788 20789 cdb.scc_cmd = SCMD_TEST_UNIT_READY; 20790 20791 ucmd_buf.uscsi_cdb = (char *)&cdb; 20792 ucmd_buf.uscsi_cdblen = CDB_GROUP0; 20793 ucmd_buf.uscsi_bufaddr = NULL; 20794 ucmd_buf.uscsi_buflen = 0; 20795 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 20796 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 20797 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_SILENT; 20798 20799 /* Use flag USCSI_DIAGNOSE to prevent retries if it fails. */ 20800 if ((flag & SD_DONT_RETRY_TUR) != 0) { 20801 ucmd_buf.uscsi_flags |= USCSI_DIAGNOSE; 20802 } 20803 ucmd_buf.uscsi_timeout = 60; 20804 20805 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 20806 UIO_SYSSPACE, ((flag & SD_BYPASS_PM) ? SD_PATH_DIRECT : 20807 SD_PATH_STANDARD)); 20808 20809 switch (status) { 20810 case 0: 20811 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 20812 break; /* Success! */ 20813 case EIO: 20814 switch (ucmd_buf.uscsi_status) { 20815 case STATUS_RESERVATION_CONFLICT: 20816 status = EACCES; 20817 break; 20818 case STATUS_CHECK: 20819 if ((flag & SD_CHECK_FOR_MEDIA) == 0) { 20820 break; 20821 } 20822 if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 20823 (scsi_sense_key((uint8_t *)&sense_buf) == 20824 KEY_NOT_READY) && 20825 (scsi_sense_asc((uint8_t *)&sense_buf) == 0x3A)) { 20826 status = ENXIO; 20827 } 20828 break; 20829 default: 20830 break; 20831 } 20832 break; 20833 default: 20834 break; 20835 } 20836 20837 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_TEST_UNIT_READY: exit\n"); 20838 20839 return (status); 20840 } 20841 20842 /* 20843 * Function: sd_send_scsi_PERSISTENT_RESERVE_IN 20844 * 20845 * Description: Issue the scsi PERSISTENT RESERVE IN command. 20846 * 20847 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 20848 * structure for this target. 20849 * 20850 * Return Code: 0 - Success 20851 * EACCES 20852 * ENOTSUP 20853 * errno return code from sd_ssc_send() 20854 * 20855 * Context: Can sleep. Does not return until command is completed. 20856 */ 20857 20858 static int 20859 sd_send_scsi_PERSISTENT_RESERVE_IN(sd_ssc_t *ssc, uchar_t usr_cmd, 20860 uint16_t data_len, uchar_t *data_bufp) 20861 { 20862 struct scsi_extended_sense sense_buf; 20863 union scsi_cdb cdb; 20864 struct uscsi_cmd ucmd_buf; 20865 int status; 20866 int no_caller_buf = FALSE; 20867 struct sd_lun *un; 20868 20869 ASSERT(ssc != NULL); 20870 un = ssc->ssc_un; 20871 ASSERT(un != NULL); 20872 ASSERT(!mutex_owned(SD_MUTEX(un))); 20873 ASSERT((usr_cmd == SD_READ_KEYS) || (usr_cmd == SD_READ_RESV)); 20874 20875 SD_TRACE(SD_LOG_IO, un, 20876 "sd_send_scsi_PERSISTENT_RESERVE_IN: entry: un:0x%p\n", un); 20877 20878 bzero(&cdb, sizeof (cdb)); 20879 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20880 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 20881 if (data_bufp == NULL) { 20882 /* Allocate a default buf if the caller did not give one */ 20883 ASSERT(data_len == 0); 20884 data_len = MHIOC_RESV_KEY_SIZE; 20885 data_bufp = kmem_zalloc(MHIOC_RESV_KEY_SIZE, KM_SLEEP); 20886 no_caller_buf = TRUE; 20887 } 20888 20889 cdb.scc_cmd = SCMD_PERSISTENT_RESERVE_IN; 20890 cdb.cdb_opaque[1] = usr_cmd; 20891 FORMG1COUNT(&cdb, data_len); 20892 20893 ucmd_buf.uscsi_cdb = (char *)&cdb; 20894 ucmd_buf.uscsi_cdblen = CDB_GROUP1; 20895 ucmd_buf.uscsi_bufaddr = (caddr_t)data_bufp; 20896 ucmd_buf.uscsi_buflen = data_len; 20897 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 20898 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 20899 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT; 20900 ucmd_buf.uscsi_timeout = 60; 20901 20902 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 20903 UIO_SYSSPACE, SD_PATH_STANDARD); 20904 20905 switch (status) { 20906 case 0: 20907 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 20908 20909 break; /* Success! */ 20910 case EIO: 20911 switch (ucmd_buf.uscsi_status) { 20912 case STATUS_RESERVATION_CONFLICT: 20913 status = EACCES; 20914 break; 20915 case STATUS_CHECK: 20916 if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 20917 (scsi_sense_key((uint8_t *)&sense_buf) == 20918 KEY_ILLEGAL_REQUEST)) { 20919 status = ENOTSUP; 20920 } 20921 break; 20922 default: 20923 break; 20924 } 20925 break; 20926 default: 20927 break; 20928 } 20929 20930 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_PERSISTENT_RESERVE_IN: exit\n"); 20931 20932 if (no_caller_buf == TRUE) { 20933 kmem_free(data_bufp, data_len); 20934 } 20935 20936 return (status); 20937 } 20938 20939 20940 /* 20941 * Function: sd_send_scsi_PERSISTENT_RESERVE_OUT 20942 * 20943 * Description: This routine is the driver entry point for handling CD-ROM 20944 * multi-host persistent reservation requests (MHIOCGRP_INKEYS, 20945 * MHIOCGRP_INRESV) by sending the SCSI-3 PROUT commands to the 20946 * device. 20947 * 20948 * Arguments: ssc - ssc contains un - pointer to soft state struct 20949 * for the target. 20950 * usr_cmd SCSI-3 reservation facility command (one of 20951 * SD_SCSI3_REGISTER, SD_SCSI3_RESERVE, SD_SCSI3_RELEASE, 20952 * SD_SCSI3_PREEMPTANDABORT, SD_SCSI3_CLEAR) 20953 * usr_bufp - user provided pointer register, reserve descriptor or 20954 * preempt and abort structure (mhioc_register_t, 20955 * mhioc_resv_desc_t, mhioc_preemptandabort_t) 20956 * 20957 * Return Code: 0 - Success 20958 * EACCES 20959 * ENOTSUP 20960 * errno return code from sd_ssc_send() 20961 * 20962 * Context: Can sleep. Does not return until command is completed. 20963 */ 20964 20965 static int 20966 sd_send_scsi_PERSISTENT_RESERVE_OUT(sd_ssc_t *ssc, uchar_t usr_cmd, 20967 uchar_t *usr_bufp) 20968 { 20969 struct scsi_extended_sense sense_buf; 20970 union scsi_cdb cdb; 20971 struct uscsi_cmd ucmd_buf; 20972 int status; 20973 uchar_t data_len = sizeof (sd_prout_t); 20974 sd_prout_t *prp; 20975 struct sd_lun *un; 20976 20977 ASSERT(ssc != NULL); 20978 un = ssc->ssc_un; 20979 ASSERT(un != NULL); 20980 ASSERT(!mutex_owned(SD_MUTEX(un))); 20981 ASSERT(data_len == 24); /* required by scsi spec */ 20982 20983 SD_TRACE(SD_LOG_IO, un, 20984 "sd_send_scsi_PERSISTENT_RESERVE_OUT: entry: un:0x%p\n", un); 20985 20986 if (usr_bufp == NULL) { 20987 return (EINVAL); 20988 } 20989 20990 bzero(&cdb, sizeof (cdb)); 20991 bzero(&ucmd_buf, sizeof (ucmd_buf)); 20992 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 20993 prp = kmem_zalloc(data_len, KM_SLEEP); 20994 20995 cdb.scc_cmd = SCMD_PERSISTENT_RESERVE_OUT; 20996 cdb.cdb_opaque[1] = usr_cmd; 20997 FORMG1COUNT(&cdb, data_len); 20998 20999 ucmd_buf.uscsi_cdb = (char *)&cdb; 21000 ucmd_buf.uscsi_cdblen = CDB_GROUP1; 21001 ucmd_buf.uscsi_bufaddr = (caddr_t)prp; 21002 ucmd_buf.uscsi_buflen = data_len; 21003 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 21004 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 21005 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_WRITE | USCSI_SILENT; 21006 ucmd_buf.uscsi_timeout = 60; 21007 21008 switch (usr_cmd) { 21009 case SD_SCSI3_REGISTER: { 21010 mhioc_register_t *ptr = (mhioc_register_t *)usr_bufp; 21011 21012 bcopy(ptr->oldkey.key, prp->res_key, MHIOC_RESV_KEY_SIZE); 21013 bcopy(ptr->newkey.key, prp->service_key, 21014 MHIOC_RESV_KEY_SIZE); 21015 prp->aptpl = ptr->aptpl; 21016 break; 21017 } 21018 case SD_SCSI3_CLEAR: { 21019 mhioc_resv_desc_t *ptr = (mhioc_resv_desc_t *)usr_bufp; 21020 21021 bcopy(ptr->key.key, prp->res_key, MHIOC_RESV_KEY_SIZE); 21022 break; 21023 } 21024 case SD_SCSI3_RESERVE: 21025 case SD_SCSI3_RELEASE: { 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 prp->scope_address = BE_32(ptr->scope_specific_addr); 21030 cdb.cdb_opaque[2] = ptr->type; 21031 break; 21032 } 21033 case SD_SCSI3_PREEMPTANDABORT: { 21034 mhioc_preemptandabort_t *ptr = 21035 (mhioc_preemptandabort_t *)usr_bufp; 21036 21037 bcopy(ptr->resvdesc.key.key, prp->res_key, MHIOC_RESV_KEY_SIZE); 21038 bcopy(ptr->victim_key.key, prp->service_key, 21039 MHIOC_RESV_KEY_SIZE); 21040 prp->scope_address = BE_32(ptr->resvdesc.scope_specific_addr); 21041 cdb.cdb_opaque[2] = ptr->resvdesc.type; 21042 ucmd_buf.uscsi_flags |= USCSI_HEAD; 21043 break; 21044 } 21045 case SD_SCSI3_REGISTERANDIGNOREKEY: 21046 { 21047 mhioc_registerandignorekey_t *ptr; 21048 ptr = (mhioc_registerandignorekey_t *)usr_bufp; 21049 bcopy(ptr->newkey.key, 21050 prp->service_key, MHIOC_RESV_KEY_SIZE); 21051 prp->aptpl = ptr->aptpl; 21052 break; 21053 } 21054 default: 21055 ASSERT(FALSE); 21056 break; 21057 } 21058 21059 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 21060 UIO_SYSSPACE, SD_PATH_STANDARD); 21061 21062 switch (status) { 21063 case 0: 21064 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 21065 break; /* Success! */ 21066 case EIO: 21067 switch (ucmd_buf.uscsi_status) { 21068 case STATUS_RESERVATION_CONFLICT: 21069 status = EACCES; 21070 break; 21071 case STATUS_CHECK: 21072 if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 21073 (scsi_sense_key((uint8_t *)&sense_buf) == 21074 KEY_ILLEGAL_REQUEST)) { 21075 status = ENOTSUP; 21076 } 21077 break; 21078 default: 21079 break; 21080 } 21081 break; 21082 default: 21083 break; 21084 } 21085 21086 kmem_free(prp, data_len); 21087 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_PERSISTENT_RESERVE_OUT: exit\n"); 21088 return (status); 21089 } 21090 21091 21092 /* 21093 * Function: sd_send_scsi_SYNCHRONIZE_CACHE 21094 * 21095 * Description: Issues a scsi SYNCHRONIZE CACHE command to the target 21096 * 21097 * Arguments: un - pointer to the target's soft state struct 21098 * dkc - pointer to the callback structure 21099 * 21100 * Return Code: 0 - success 21101 * errno-type error code 21102 * 21103 * Context: kernel thread context only. 21104 * 21105 * _______________________________________________________________ 21106 * | dkc_flag & | dkc_callback | DKIOCFLUSHWRITECACHE | 21107 * |FLUSH_VOLATILE| | operation | 21108 * |______________|______________|_________________________________| 21109 * | 0 | NULL | Synchronous flush on both | 21110 * | | | volatile and non-volatile cache | 21111 * |______________|______________|_________________________________| 21112 * | 1 | NULL | Synchronous flush on volatile | 21113 * | | | cache; disk drivers may suppress| 21114 * | | | flush if disk table indicates | 21115 * | | | non-volatile cache | 21116 * |______________|______________|_________________________________| 21117 * | 0 | !NULL | Asynchronous flush on both | 21118 * | | | volatile and non-volatile cache;| 21119 * |______________|______________|_________________________________| 21120 * | 1 | !NULL | Asynchronous flush on volatile | 21121 * | | | cache; disk drivers may suppress| 21122 * | | | flush if disk table indicates | 21123 * | | | non-volatile cache | 21124 * |______________|______________|_________________________________| 21125 * 21126 */ 21127 21128 static int 21129 sd_send_scsi_SYNCHRONIZE_CACHE(struct sd_lun *un, struct dk_callback *dkc) 21130 { 21131 struct sd_uscsi_info *uip; 21132 struct uscsi_cmd *uscmd; 21133 union scsi_cdb *cdb; 21134 struct buf *bp; 21135 int rval = 0; 21136 int is_async; 21137 21138 SD_TRACE(SD_LOG_IO, un, 21139 "sd_send_scsi_SYNCHRONIZE_CACHE: entry: un:0x%p\n", un); 21140 21141 ASSERT(un != NULL); 21142 ASSERT(!mutex_owned(SD_MUTEX(un))); 21143 21144 if (dkc == NULL || dkc->dkc_callback == NULL) { 21145 is_async = FALSE; 21146 } else { 21147 is_async = TRUE; 21148 } 21149 21150 mutex_enter(SD_MUTEX(un)); 21151 /* check whether cache flush should be suppressed */ 21152 if (un->un_f_suppress_cache_flush == TRUE) { 21153 mutex_exit(SD_MUTEX(un)); 21154 /* 21155 * suppress the cache flush if the device is told to do 21156 * so by sd.conf or disk table 21157 */ 21158 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_SYNCHRONIZE_CACHE: \ 21159 skip the cache flush since suppress_cache_flush is %d!\n", 21160 un->un_f_suppress_cache_flush); 21161 21162 if (is_async == TRUE) { 21163 /* invoke callback for asynchronous flush */ 21164 (*dkc->dkc_callback)(dkc->dkc_cookie, 0); 21165 } 21166 return (rval); 21167 } 21168 mutex_exit(SD_MUTEX(un)); 21169 21170 /* 21171 * check dkc_flag & FLUSH_VOLATILE so SYNC_NV bit can be 21172 * set properly 21173 */ 21174 cdb = kmem_zalloc(CDB_GROUP1, KM_SLEEP); 21175 cdb->scc_cmd = SCMD_SYNCHRONIZE_CACHE; 21176 21177 mutex_enter(SD_MUTEX(un)); 21178 if (dkc != NULL && un->un_f_sync_nv_supported && 21179 (dkc->dkc_flag & FLUSH_VOLATILE)) { 21180 /* 21181 * if the device supports SYNC_NV bit, turn on 21182 * the SYNC_NV bit to only flush volatile cache 21183 */ 21184 cdb->cdb_un.tag |= SD_SYNC_NV_BIT; 21185 } 21186 mutex_exit(SD_MUTEX(un)); 21187 21188 /* 21189 * First get some memory for the uscsi_cmd struct and cdb 21190 * and initialize for SYNCHRONIZE_CACHE cmd. 21191 */ 21192 uscmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 21193 uscmd->uscsi_cdblen = CDB_GROUP1; 21194 uscmd->uscsi_cdb = (caddr_t)cdb; 21195 uscmd->uscsi_bufaddr = NULL; 21196 uscmd->uscsi_buflen = 0; 21197 uscmd->uscsi_rqbuf = kmem_zalloc(SENSE_LENGTH, KM_SLEEP); 21198 uscmd->uscsi_rqlen = SENSE_LENGTH; 21199 uscmd->uscsi_rqresid = SENSE_LENGTH; 21200 uscmd->uscsi_flags = USCSI_RQENABLE | USCSI_SILENT; 21201 uscmd->uscsi_timeout = sd_io_time; 21202 21203 /* 21204 * Allocate an sd_uscsi_info struct and fill it with the info 21205 * needed by sd_initpkt_for_uscsi(). Then put the pointer into 21206 * b_private in the buf for sd_initpkt_for_uscsi(). Note that 21207 * since we allocate the buf here in this function, we do not 21208 * need to preserve the prior contents of b_private. 21209 * The sd_uscsi_info struct is also used by sd_uscsi_strategy() 21210 */ 21211 uip = kmem_zalloc(sizeof (struct sd_uscsi_info), KM_SLEEP); 21212 uip->ui_flags = SD_PATH_DIRECT; 21213 uip->ui_cmdp = uscmd; 21214 21215 bp = getrbuf(KM_SLEEP); 21216 bp->b_private = uip; 21217 21218 /* 21219 * Setup buffer to carry uscsi request. 21220 */ 21221 bp->b_flags = B_BUSY; 21222 bp->b_bcount = 0; 21223 bp->b_blkno = 0; 21224 21225 if (is_async == TRUE) { 21226 bp->b_iodone = sd_send_scsi_SYNCHRONIZE_CACHE_biodone; 21227 uip->ui_dkc = *dkc; 21228 } 21229 21230 bp->b_edev = SD_GET_DEV(un); 21231 bp->b_dev = cmpdev(bp->b_edev); /* maybe unnecessary? */ 21232 21233 /* 21234 * Unset un_f_sync_cache_required flag 21235 */ 21236 mutex_enter(SD_MUTEX(un)); 21237 un->un_f_sync_cache_required = FALSE; 21238 mutex_exit(SD_MUTEX(un)); 21239 21240 (void) sd_uscsi_strategy(bp); 21241 21242 /* 21243 * If synchronous request, wait for completion 21244 * If async just return and let b_iodone callback 21245 * cleanup. 21246 * NOTE: On return, u_ncmds_in_driver will be decremented, 21247 * but it was also incremented in sd_uscsi_strategy(), so 21248 * we should be ok. 21249 */ 21250 if (is_async == FALSE) { 21251 (void) biowait(bp); 21252 rval = sd_send_scsi_SYNCHRONIZE_CACHE_biodone(bp); 21253 } 21254 21255 return (rval); 21256 } 21257 21258 21259 static int 21260 sd_send_scsi_SYNCHRONIZE_CACHE_biodone(struct buf *bp) 21261 { 21262 struct sd_uscsi_info *uip; 21263 struct uscsi_cmd *uscmd; 21264 uint8_t *sense_buf; 21265 struct sd_lun *un; 21266 int status; 21267 union scsi_cdb *cdb; 21268 21269 uip = (struct sd_uscsi_info *)(bp->b_private); 21270 ASSERT(uip != NULL); 21271 21272 uscmd = uip->ui_cmdp; 21273 ASSERT(uscmd != NULL); 21274 21275 sense_buf = (uint8_t *)uscmd->uscsi_rqbuf; 21276 ASSERT(sense_buf != NULL); 21277 21278 un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp)); 21279 ASSERT(un != NULL); 21280 21281 cdb = (union scsi_cdb *)uscmd->uscsi_cdb; 21282 21283 status = geterror(bp); 21284 switch (status) { 21285 case 0: 21286 break; /* Success! */ 21287 case EIO: 21288 switch (uscmd->uscsi_status) { 21289 case STATUS_RESERVATION_CONFLICT: 21290 /* Ignore reservation conflict */ 21291 status = 0; 21292 goto done; 21293 21294 case STATUS_CHECK: 21295 if ((uscmd->uscsi_rqstatus == STATUS_GOOD) && 21296 (scsi_sense_key(sense_buf) == 21297 KEY_ILLEGAL_REQUEST)) { 21298 /* Ignore Illegal Request error */ 21299 if (cdb->cdb_un.tag&SD_SYNC_NV_BIT) { 21300 mutex_enter(SD_MUTEX(un)); 21301 un->un_f_sync_nv_supported = FALSE; 21302 mutex_exit(SD_MUTEX(un)); 21303 status = 0; 21304 SD_TRACE(SD_LOG_IO, un, 21305 "un_f_sync_nv_supported \ 21306 is set to false.\n"); 21307 goto done; 21308 } 21309 21310 mutex_enter(SD_MUTEX(un)); 21311 un->un_f_sync_cache_supported = FALSE; 21312 mutex_exit(SD_MUTEX(un)); 21313 SD_TRACE(SD_LOG_IO, un, 21314 "sd_send_scsi_SYNCHRONIZE_CACHE_biodone: \ 21315 un_f_sync_cache_supported set to false \ 21316 with asc = %x, ascq = %x\n", 21317 scsi_sense_asc(sense_buf), 21318 scsi_sense_ascq(sense_buf)); 21319 status = ENOTSUP; 21320 goto done; 21321 } 21322 break; 21323 default: 21324 break; 21325 } 21326 /* FALLTHRU */ 21327 default: 21328 /* 21329 * Turn on the un_f_sync_cache_required flag 21330 * since the SYNC CACHE command failed 21331 */ 21332 mutex_enter(SD_MUTEX(un)); 21333 un->un_f_sync_cache_required = TRUE; 21334 mutex_exit(SD_MUTEX(un)); 21335 21336 /* 21337 * Don't log an error message if this device 21338 * has removable media. 21339 */ 21340 if (!un->un_f_has_removable_media) { 21341 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 21342 "SYNCHRONIZE CACHE command failed (%d)\n", status); 21343 } 21344 break; 21345 } 21346 21347 done: 21348 if (uip->ui_dkc.dkc_callback != NULL) { 21349 (*uip->ui_dkc.dkc_callback)(uip->ui_dkc.dkc_cookie, status); 21350 } 21351 21352 ASSERT((bp->b_flags & B_REMAPPED) == 0); 21353 freerbuf(bp); 21354 kmem_free(uip, sizeof (struct sd_uscsi_info)); 21355 kmem_free(uscmd->uscsi_rqbuf, SENSE_LENGTH); 21356 kmem_free(uscmd->uscsi_cdb, (size_t)uscmd->uscsi_cdblen); 21357 kmem_free(uscmd, sizeof (struct uscsi_cmd)); 21358 21359 return (status); 21360 } 21361 21362 21363 /* 21364 * Function: sd_send_scsi_GET_CONFIGURATION 21365 * 21366 * Description: Issues the get configuration command to the device. 21367 * Called from sd_check_for_writable_cd & sd_get_media_info 21368 * caller needs to ensure that buflen = SD_PROFILE_HEADER_LEN 21369 * Arguments: ssc 21370 * ucmdbuf 21371 * rqbuf 21372 * rqbuflen 21373 * bufaddr 21374 * buflen 21375 * path_flag 21376 * 21377 * Return Code: 0 - Success 21378 * errno return code from sd_ssc_send() 21379 * 21380 * Context: Can sleep. Does not return until command is completed. 21381 * 21382 */ 21383 21384 static int 21385 sd_send_scsi_GET_CONFIGURATION(sd_ssc_t *ssc, struct uscsi_cmd *ucmdbuf, 21386 uchar_t *rqbuf, uint_t rqbuflen, uchar_t *bufaddr, uint_t buflen, 21387 int path_flag) 21388 { 21389 char cdb[CDB_GROUP1]; 21390 int status; 21391 struct sd_lun *un; 21392 21393 ASSERT(ssc != NULL); 21394 un = ssc->ssc_un; 21395 ASSERT(un != NULL); 21396 ASSERT(!mutex_owned(SD_MUTEX(un))); 21397 ASSERT(bufaddr != NULL); 21398 ASSERT(ucmdbuf != NULL); 21399 ASSERT(rqbuf != NULL); 21400 21401 SD_TRACE(SD_LOG_IO, un, 21402 "sd_send_scsi_GET_CONFIGURATION: entry: un:0x%p\n", un); 21403 21404 bzero(cdb, sizeof (cdb)); 21405 bzero(ucmdbuf, sizeof (struct uscsi_cmd)); 21406 bzero(rqbuf, rqbuflen); 21407 bzero(bufaddr, buflen); 21408 21409 /* 21410 * Set up cdb field for the get configuration command. 21411 */ 21412 cdb[0] = SCMD_GET_CONFIGURATION; 21413 cdb[1] = 0x02; /* Requested Type */ 21414 cdb[8] = SD_PROFILE_HEADER_LEN; 21415 ucmdbuf->uscsi_cdb = cdb; 21416 ucmdbuf->uscsi_cdblen = CDB_GROUP1; 21417 ucmdbuf->uscsi_bufaddr = (caddr_t)bufaddr; 21418 ucmdbuf->uscsi_buflen = buflen; 21419 ucmdbuf->uscsi_timeout = sd_io_time; 21420 ucmdbuf->uscsi_rqbuf = (caddr_t)rqbuf; 21421 ucmdbuf->uscsi_rqlen = rqbuflen; 21422 ucmdbuf->uscsi_flags = USCSI_RQENABLE|USCSI_SILENT|USCSI_READ; 21423 21424 status = sd_ssc_send(ssc, ucmdbuf, FKIOCTL, 21425 UIO_SYSSPACE, path_flag); 21426 21427 switch (status) { 21428 case 0: 21429 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 21430 break; /* Success! */ 21431 case EIO: 21432 switch (ucmdbuf->uscsi_status) { 21433 case STATUS_RESERVATION_CONFLICT: 21434 status = EACCES; 21435 break; 21436 default: 21437 break; 21438 } 21439 break; 21440 default: 21441 break; 21442 } 21443 21444 if (status == 0) { 21445 SD_DUMP_MEMORY(un, SD_LOG_IO, 21446 "sd_send_scsi_GET_CONFIGURATION: data", 21447 (uchar_t *)bufaddr, SD_PROFILE_HEADER_LEN, SD_LOG_HEX); 21448 } 21449 21450 SD_TRACE(SD_LOG_IO, un, 21451 "sd_send_scsi_GET_CONFIGURATION: exit\n"); 21452 21453 return (status); 21454 } 21455 21456 /* 21457 * Function: sd_send_scsi_feature_GET_CONFIGURATION 21458 * 21459 * Description: Issues the get configuration command to the device to 21460 * retrieve a specific feature. Called from 21461 * sd_check_for_writable_cd & sd_set_mmc_caps. 21462 * Arguments: ssc 21463 * ucmdbuf 21464 * rqbuf 21465 * rqbuflen 21466 * bufaddr 21467 * buflen 21468 * feature 21469 * 21470 * Return Code: 0 - Success 21471 * errno return code from sd_ssc_send() 21472 * 21473 * Context: Can sleep. Does not return until command is completed. 21474 * 21475 */ 21476 static int 21477 sd_send_scsi_feature_GET_CONFIGURATION(sd_ssc_t *ssc, struct uscsi_cmd *ucmdbuf, 21478 uchar_t *rqbuf, uint_t rqbuflen, uchar_t *bufaddr, uint_t buflen, 21479 char feature, int path_flag) 21480 { 21481 char cdb[CDB_GROUP1]; 21482 int status; 21483 struct sd_lun *un; 21484 21485 ASSERT(ssc != NULL); 21486 un = ssc->ssc_un; 21487 ASSERT(un != NULL); 21488 ASSERT(!mutex_owned(SD_MUTEX(un))); 21489 ASSERT(bufaddr != NULL); 21490 ASSERT(ucmdbuf != NULL); 21491 ASSERT(rqbuf != NULL); 21492 21493 SD_TRACE(SD_LOG_IO, un, 21494 "sd_send_scsi_feature_GET_CONFIGURATION: entry: un:0x%p\n", un); 21495 21496 bzero(cdb, sizeof (cdb)); 21497 bzero(ucmdbuf, sizeof (struct uscsi_cmd)); 21498 bzero(rqbuf, rqbuflen); 21499 bzero(bufaddr, buflen); 21500 21501 /* 21502 * Set up cdb field for the get configuration command. 21503 */ 21504 cdb[0] = SCMD_GET_CONFIGURATION; 21505 cdb[1] = 0x02; /* Requested Type */ 21506 cdb[3] = feature; 21507 cdb[8] = buflen; 21508 ucmdbuf->uscsi_cdb = cdb; 21509 ucmdbuf->uscsi_cdblen = CDB_GROUP1; 21510 ucmdbuf->uscsi_bufaddr = (caddr_t)bufaddr; 21511 ucmdbuf->uscsi_buflen = buflen; 21512 ucmdbuf->uscsi_timeout = sd_io_time; 21513 ucmdbuf->uscsi_rqbuf = (caddr_t)rqbuf; 21514 ucmdbuf->uscsi_rqlen = rqbuflen; 21515 ucmdbuf->uscsi_flags = USCSI_RQENABLE|USCSI_SILENT|USCSI_READ; 21516 21517 status = sd_ssc_send(ssc, ucmdbuf, FKIOCTL, 21518 UIO_SYSSPACE, path_flag); 21519 21520 switch (status) { 21521 case 0: 21522 21523 break; /* Success! */ 21524 case EIO: 21525 switch (ucmdbuf->uscsi_status) { 21526 case STATUS_RESERVATION_CONFLICT: 21527 status = EACCES; 21528 break; 21529 default: 21530 break; 21531 } 21532 break; 21533 default: 21534 break; 21535 } 21536 21537 if (status == 0) { 21538 SD_DUMP_MEMORY(un, SD_LOG_IO, 21539 "sd_send_scsi_feature_GET_CONFIGURATION: data", 21540 (uchar_t *)bufaddr, SD_PROFILE_HEADER_LEN, SD_LOG_HEX); 21541 } 21542 21543 SD_TRACE(SD_LOG_IO, un, 21544 "sd_send_scsi_feature_GET_CONFIGURATION: exit\n"); 21545 21546 return (status); 21547 } 21548 21549 21550 /* 21551 * Function: sd_send_scsi_MODE_SENSE 21552 * 21553 * Description: Utility function for issuing a scsi MODE SENSE command. 21554 * Note: This routine uses a consistent implementation for Group0, 21555 * Group1, and Group2 commands across all platforms. ATAPI devices 21556 * use Group 1 Read/Write commands and Group 2 Mode Sense/Select 21557 * 21558 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 21559 * structure for this target. 21560 * cdbsize - size CDB to be used (CDB_GROUP0 (6 byte), or 21561 * CDB_GROUP[1|2] (10 byte). 21562 * bufaddr - buffer for page data retrieved from the target. 21563 * buflen - size of page to be retrieved. 21564 * page_code - page code of data to be retrieved from the target. 21565 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 21566 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 21567 * to use the USCSI "direct" chain and bypass the normal 21568 * command waitq. 21569 * 21570 * Return Code: 0 - Success 21571 * errno return code from sd_ssc_send() 21572 * 21573 * Context: Can sleep. Does not return until command is completed. 21574 */ 21575 21576 static int 21577 sd_send_scsi_MODE_SENSE(sd_ssc_t *ssc, int cdbsize, uchar_t *bufaddr, 21578 size_t buflen, uchar_t page_code, int path_flag) 21579 { 21580 struct scsi_extended_sense sense_buf; 21581 union scsi_cdb cdb; 21582 struct uscsi_cmd ucmd_buf; 21583 int status; 21584 int headlen; 21585 struct sd_lun *un; 21586 21587 ASSERT(ssc != NULL); 21588 un = ssc->ssc_un; 21589 ASSERT(un != NULL); 21590 ASSERT(!mutex_owned(SD_MUTEX(un))); 21591 ASSERT(bufaddr != NULL); 21592 ASSERT((cdbsize == CDB_GROUP0) || (cdbsize == CDB_GROUP1) || 21593 (cdbsize == CDB_GROUP2)); 21594 21595 SD_TRACE(SD_LOG_IO, un, 21596 "sd_send_scsi_MODE_SENSE: entry: un:0x%p\n", un); 21597 21598 bzero(&cdb, sizeof (cdb)); 21599 bzero(&ucmd_buf, sizeof (ucmd_buf)); 21600 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 21601 bzero(bufaddr, buflen); 21602 21603 if (cdbsize == CDB_GROUP0) { 21604 cdb.scc_cmd = SCMD_MODE_SENSE; 21605 cdb.cdb_opaque[2] = page_code; 21606 FORMG0COUNT(&cdb, buflen); 21607 headlen = MODE_HEADER_LENGTH; 21608 } else { 21609 cdb.scc_cmd = SCMD_MODE_SENSE_G1; 21610 cdb.cdb_opaque[2] = page_code; 21611 FORMG1COUNT(&cdb, buflen); 21612 headlen = MODE_HEADER_LENGTH_GRP2; 21613 } 21614 21615 ASSERT(headlen <= buflen); 21616 SD_FILL_SCSI1_LUN_CDB(un, &cdb); 21617 21618 ucmd_buf.uscsi_cdb = (char *)&cdb; 21619 ucmd_buf.uscsi_cdblen = (uchar_t)cdbsize; 21620 ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr; 21621 ucmd_buf.uscsi_buflen = buflen; 21622 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 21623 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 21624 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT; 21625 ucmd_buf.uscsi_timeout = 60; 21626 21627 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 21628 UIO_SYSSPACE, path_flag); 21629 21630 switch (status) { 21631 case 0: 21632 /* 21633 * sr_check_wp() uses 0x3f page code and check the header of 21634 * mode page to determine if target device is write-protected. 21635 * But some USB devices return 0 bytes for 0x3f page code. For 21636 * this case, make sure that mode page header is returned at 21637 * least. 21638 */ 21639 if (buflen - ucmd_buf.uscsi_resid < headlen) { 21640 status = EIO; 21641 sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1, 21642 "mode page header is not returned"); 21643 } 21644 break; /* Success! */ 21645 case EIO: 21646 switch (ucmd_buf.uscsi_status) { 21647 case STATUS_RESERVATION_CONFLICT: 21648 status = EACCES; 21649 break; 21650 default: 21651 break; 21652 } 21653 break; 21654 default: 21655 break; 21656 } 21657 21658 if (status == 0) { 21659 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_MODE_SENSE: data", 21660 (uchar_t *)bufaddr, buflen, SD_LOG_HEX); 21661 } 21662 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_MODE_SENSE: exit\n"); 21663 21664 return (status); 21665 } 21666 21667 21668 /* 21669 * Function: sd_send_scsi_MODE_SELECT 21670 * 21671 * Description: Utility function for issuing a scsi MODE SELECT command. 21672 * Note: This routine uses a consistent implementation for Group0, 21673 * Group1, and Group2 commands across all platforms. ATAPI devices 21674 * use Group 1 Read/Write commands and Group 2 Mode Sense/Select 21675 * 21676 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 21677 * structure for this target. 21678 * cdbsize - size CDB to be used (CDB_GROUP0 (6 byte), or 21679 * CDB_GROUP[1|2] (10 byte). 21680 * bufaddr - buffer for page data retrieved from the target. 21681 * buflen - size of page to be retrieved. 21682 * save_page - boolean to determin if SP bit should be set. 21683 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 21684 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 21685 * to use the USCSI "direct" chain and bypass the normal 21686 * command waitq. 21687 * 21688 * Return Code: 0 - Success 21689 * errno return code from sd_ssc_send() 21690 * 21691 * Context: Can sleep. Does not return until command is completed. 21692 */ 21693 21694 static int 21695 sd_send_scsi_MODE_SELECT(sd_ssc_t *ssc, int cdbsize, uchar_t *bufaddr, 21696 size_t buflen, uchar_t save_page, int path_flag) 21697 { 21698 struct scsi_extended_sense sense_buf; 21699 union scsi_cdb cdb; 21700 struct uscsi_cmd ucmd_buf; 21701 int status; 21702 struct sd_lun *un; 21703 21704 ASSERT(ssc != NULL); 21705 un = ssc->ssc_un; 21706 ASSERT(un != NULL); 21707 ASSERT(!mutex_owned(SD_MUTEX(un))); 21708 ASSERT(bufaddr != NULL); 21709 ASSERT((cdbsize == CDB_GROUP0) || (cdbsize == CDB_GROUP1) || 21710 (cdbsize == CDB_GROUP2)); 21711 21712 SD_TRACE(SD_LOG_IO, un, 21713 "sd_send_scsi_MODE_SELECT: entry: un:0x%p\n", un); 21714 21715 bzero(&cdb, sizeof (cdb)); 21716 bzero(&ucmd_buf, sizeof (ucmd_buf)); 21717 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 21718 21719 /* Set the PF bit for many third party drives */ 21720 cdb.cdb_opaque[1] = 0x10; 21721 21722 /* Set the savepage(SP) bit if given */ 21723 if (save_page == SD_SAVE_PAGE) { 21724 cdb.cdb_opaque[1] |= 0x01; 21725 } 21726 21727 if (cdbsize == CDB_GROUP0) { 21728 cdb.scc_cmd = SCMD_MODE_SELECT; 21729 FORMG0COUNT(&cdb, buflen); 21730 } else { 21731 cdb.scc_cmd = SCMD_MODE_SELECT_G1; 21732 FORMG1COUNT(&cdb, buflen); 21733 } 21734 21735 SD_FILL_SCSI1_LUN_CDB(un, &cdb); 21736 21737 ucmd_buf.uscsi_cdb = (char *)&cdb; 21738 ucmd_buf.uscsi_cdblen = (uchar_t)cdbsize; 21739 ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr; 21740 ucmd_buf.uscsi_buflen = buflen; 21741 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 21742 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 21743 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_WRITE | USCSI_SILENT; 21744 ucmd_buf.uscsi_timeout = 60; 21745 21746 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 21747 UIO_SYSSPACE, path_flag); 21748 21749 switch (status) { 21750 case 0: 21751 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 21752 break; /* Success! */ 21753 case EIO: 21754 switch (ucmd_buf.uscsi_status) { 21755 case STATUS_RESERVATION_CONFLICT: 21756 status = EACCES; 21757 break; 21758 default: 21759 break; 21760 } 21761 break; 21762 default: 21763 break; 21764 } 21765 21766 if (status == 0) { 21767 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_MODE_SELECT: data", 21768 (uchar_t *)bufaddr, buflen, SD_LOG_HEX); 21769 } 21770 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_MODE_SELECT: exit\n"); 21771 21772 return (status); 21773 } 21774 21775 21776 /* 21777 * Function: sd_send_scsi_RDWR 21778 * 21779 * Description: Issue a scsi READ or WRITE command with the given parameters. 21780 * 21781 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 21782 * structure for this target. 21783 * cmd: SCMD_READ or SCMD_WRITE 21784 * bufaddr: Address of caller's buffer to receive the RDWR data 21785 * buflen: Length of caller's buffer receive the RDWR data. 21786 * start_block: Block number for the start of the RDWR operation. 21787 * (Assumes target-native block size.) 21788 * residp: Pointer to variable to receive the redisual of the 21789 * RDWR operation (may be NULL of no residual requested). 21790 * path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and 21791 * the normal command waitq, or SD_PATH_DIRECT_PRIORITY 21792 * to use the USCSI "direct" chain and bypass the normal 21793 * command waitq. 21794 * 21795 * Return Code: 0 - Success 21796 * errno return code from sd_ssc_send() 21797 * 21798 * Context: Can sleep. Does not return until command is completed. 21799 */ 21800 21801 static int 21802 sd_send_scsi_RDWR(sd_ssc_t *ssc, uchar_t cmd, void *bufaddr, 21803 size_t buflen, daddr_t start_block, int path_flag) 21804 { 21805 struct scsi_extended_sense sense_buf; 21806 union scsi_cdb cdb; 21807 struct uscsi_cmd ucmd_buf; 21808 uint32_t block_count; 21809 int status; 21810 int cdbsize; 21811 uchar_t flag; 21812 struct sd_lun *un; 21813 21814 ASSERT(ssc != NULL); 21815 un = ssc->ssc_un; 21816 ASSERT(un != NULL); 21817 ASSERT(!mutex_owned(SD_MUTEX(un))); 21818 ASSERT(bufaddr != NULL); 21819 ASSERT((cmd == SCMD_READ) || (cmd == SCMD_WRITE)); 21820 21821 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_RDWR: entry: un:0x%p\n", un); 21822 21823 if (un->un_f_tgt_blocksize_is_valid != TRUE) { 21824 return (EINVAL); 21825 } 21826 21827 mutex_enter(SD_MUTEX(un)); 21828 block_count = SD_BYTES2TGTBLOCKS(un, buflen); 21829 mutex_exit(SD_MUTEX(un)); 21830 21831 flag = (cmd == SCMD_READ) ? USCSI_READ : USCSI_WRITE; 21832 21833 SD_INFO(SD_LOG_IO, un, "sd_send_scsi_RDWR: " 21834 "bufaddr:0x%p buflen:0x%x start_block:0x%p block_count:0x%x\n", 21835 bufaddr, buflen, start_block, block_count); 21836 21837 bzero(&cdb, sizeof (cdb)); 21838 bzero(&ucmd_buf, sizeof (ucmd_buf)); 21839 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 21840 21841 /* Compute CDB size to use */ 21842 if (start_block > 0xffffffff) 21843 cdbsize = CDB_GROUP4; 21844 else if ((start_block & 0xFFE00000) || 21845 (un->un_f_cfg_is_atapi == TRUE)) 21846 cdbsize = CDB_GROUP1; 21847 else 21848 cdbsize = CDB_GROUP0; 21849 21850 switch (cdbsize) { 21851 case CDB_GROUP0: /* 6-byte CDBs */ 21852 cdb.scc_cmd = cmd; 21853 FORMG0ADDR(&cdb, start_block); 21854 FORMG0COUNT(&cdb, block_count); 21855 break; 21856 case CDB_GROUP1: /* 10-byte CDBs */ 21857 cdb.scc_cmd = cmd | SCMD_GROUP1; 21858 FORMG1ADDR(&cdb, start_block); 21859 FORMG1COUNT(&cdb, block_count); 21860 break; 21861 case CDB_GROUP4: /* 16-byte CDBs */ 21862 cdb.scc_cmd = cmd | SCMD_GROUP4; 21863 FORMG4LONGADDR(&cdb, (uint64_t)start_block); 21864 FORMG4COUNT(&cdb, block_count); 21865 break; 21866 case CDB_GROUP5: /* 12-byte CDBs (currently unsupported) */ 21867 default: 21868 /* All others reserved */ 21869 return (EINVAL); 21870 } 21871 21872 /* Set LUN bit(s) in CDB if this is a SCSI-1 device */ 21873 SD_FILL_SCSI1_LUN_CDB(un, &cdb); 21874 21875 ucmd_buf.uscsi_cdb = (char *)&cdb; 21876 ucmd_buf.uscsi_cdblen = (uchar_t)cdbsize; 21877 ucmd_buf.uscsi_bufaddr = bufaddr; 21878 ucmd_buf.uscsi_buflen = buflen; 21879 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 21880 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 21881 ucmd_buf.uscsi_flags = flag | USCSI_RQENABLE | USCSI_SILENT; 21882 ucmd_buf.uscsi_timeout = 60; 21883 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 21884 UIO_SYSSPACE, path_flag); 21885 21886 switch (status) { 21887 case 0: 21888 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 21889 break; /* Success! */ 21890 case EIO: 21891 switch (ucmd_buf.uscsi_status) { 21892 case STATUS_RESERVATION_CONFLICT: 21893 status = EACCES; 21894 break; 21895 default: 21896 break; 21897 } 21898 break; 21899 default: 21900 break; 21901 } 21902 21903 if (status == 0) { 21904 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_RDWR: data", 21905 (uchar_t *)bufaddr, buflen, SD_LOG_HEX); 21906 } 21907 21908 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_RDWR: exit\n"); 21909 21910 return (status); 21911 } 21912 21913 21914 /* 21915 * Function: sd_send_scsi_LOG_SENSE 21916 * 21917 * Description: Issue a scsi LOG_SENSE command with the given parameters. 21918 * 21919 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 21920 * structure for this target. 21921 * 21922 * Return Code: 0 - Success 21923 * errno return code from sd_ssc_send() 21924 * 21925 * Context: Can sleep. Does not return until command is completed. 21926 */ 21927 21928 static int 21929 sd_send_scsi_LOG_SENSE(sd_ssc_t *ssc, uchar_t *bufaddr, uint16_t buflen, 21930 uchar_t page_code, uchar_t page_control, uint16_t param_ptr, int path_flag) 21931 { 21932 struct scsi_extended_sense sense_buf; 21933 union scsi_cdb cdb; 21934 struct uscsi_cmd ucmd_buf; 21935 int status; 21936 struct sd_lun *un; 21937 21938 ASSERT(ssc != NULL); 21939 un = ssc->ssc_un; 21940 ASSERT(un != NULL); 21941 ASSERT(!mutex_owned(SD_MUTEX(un))); 21942 21943 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_LOG_SENSE: entry: un:0x%p\n", un); 21944 21945 bzero(&cdb, sizeof (cdb)); 21946 bzero(&ucmd_buf, sizeof (ucmd_buf)); 21947 bzero(&sense_buf, sizeof (struct scsi_extended_sense)); 21948 21949 cdb.scc_cmd = SCMD_LOG_SENSE_G1; 21950 cdb.cdb_opaque[2] = (page_control << 6) | page_code; 21951 cdb.cdb_opaque[5] = (uchar_t)((param_ptr & 0xFF00) >> 8); 21952 cdb.cdb_opaque[6] = (uchar_t)(param_ptr & 0x00FF); 21953 FORMG1COUNT(&cdb, buflen); 21954 21955 ucmd_buf.uscsi_cdb = (char *)&cdb; 21956 ucmd_buf.uscsi_cdblen = CDB_GROUP1; 21957 ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr; 21958 ucmd_buf.uscsi_buflen = buflen; 21959 ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf; 21960 ucmd_buf.uscsi_rqlen = sizeof (struct scsi_extended_sense); 21961 ucmd_buf.uscsi_flags = USCSI_RQENABLE | USCSI_READ | USCSI_SILENT; 21962 ucmd_buf.uscsi_timeout = 60; 21963 21964 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 21965 UIO_SYSSPACE, path_flag); 21966 21967 switch (status) { 21968 case 0: 21969 break; 21970 case EIO: 21971 switch (ucmd_buf.uscsi_status) { 21972 case STATUS_RESERVATION_CONFLICT: 21973 status = EACCES; 21974 break; 21975 case STATUS_CHECK: 21976 if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) && 21977 (scsi_sense_key((uint8_t *)&sense_buf) == 21978 KEY_ILLEGAL_REQUEST) && 21979 (scsi_sense_asc((uint8_t *)&sense_buf) == 0x24)) { 21980 /* 21981 * ASC 0x24: INVALID FIELD IN CDB 21982 */ 21983 switch (page_code) { 21984 case START_STOP_CYCLE_PAGE: 21985 /* 21986 * The start stop cycle counter is 21987 * implemented as page 0x31 in earlier 21988 * generation disks. In new generation 21989 * disks the start stop cycle counter is 21990 * implemented as page 0xE. To properly 21991 * handle this case if an attempt for 21992 * log page 0xE is made and fails we 21993 * will try again using page 0x31. 21994 * 21995 * Network storage BU committed to 21996 * maintain the page 0x31 for this 21997 * purpose and will not have any other 21998 * page implemented with page code 0x31 21999 * until all disks transition to the 22000 * standard page. 22001 */ 22002 mutex_enter(SD_MUTEX(un)); 22003 un->un_start_stop_cycle_page = 22004 START_STOP_CYCLE_VU_PAGE; 22005 cdb.cdb_opaque[2] = 22006 (char)(page_control << 6) | 22007 un->un_start_stop_cycle_page; 22008 mutex_exit(SD_MUTEX(un)); 22009 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 22010 status = sd_ssc_send( 22011 ssc, &ucmd_buf, FKIOCTL, 22012 UIO_SYSSPACE, path_flag); 22013 22014 break; 22015 case TEMPERATURE_PAGE: 22016 status = ENOTTY; 22017 break; 22018 default: 22019 break; 22020 } 22021 } 22022 break; 22023 default: 22024 break; 22025 } 22026 break; 22027 default: 22028 break; 22029 } 22030 22031 if (status == 0) { 22032 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 22033 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_LOG_SENSE: data", 22034 (uchar_t *)bufaddr, buflen, SD_LOG_HEX); 22035 } 22036 22037 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_LOG_SENSE: exit\n"); 22038 22039 return (status); 22040 } 22041 22042 22043 /* 22044 * Function: sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION 22045 * 22046 * Description: Issue the scsi GET EVENT STATUS NOTIFICATION command. 22047 * 22048 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 22049 * structure for this target. 22050 * bufaddr 22051 * buflen 22052 * class_req 22053 * 22054 * Return Code: 0 - Success 22055 * errno return code from sd_ssc_send() 22056 * 22057 * Context: Can sleep. Does not return until command is completed. 22058 */ 22059 22060 static int 22061 sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION(sd_ssc_t *ssc, uchar_t *bufaddr, 22062 size_t buflen, uchar_t class_req) 22063 { 22064 union scsi_cdb cdb; 22065 struct uscsi_cmd ucmd_buf; 22066 int status; 22067 struct sd_lun *un; 22068 22069 ASSERT(ssc != NULL); 22070 un = ssc->ssc_un; 22071 ASSERT(un != NULL); 22072 ASSERT(!mutex_owned(SD_MUTEX(un))); 22073 ASSERT(bufaddr != NULL); 22074 22075 SD_TRACE(SD_LOG_IO, un, 22076 "sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION: entry: un:0x%p\n", un); 22077 22078 bzero(&cdb, sizeof (cdb)); 22079 bzero(&ucmd_buf, sizeof (ucmd_buf)); 22080 bzero(bufaddr, buflen); 22081 22082 cdb.scc_cmd = SCMD_GET_EVENT_STATUS_NOTIFICATION; 22083 cdb.cdb_opaque[1] = 1; /* polled */ 22084 cdb.cdb_opaque[4] = class_req; 22085 FORMG1COUNT(&cdb, buflen); 22086 22087 ucmd_buf.uscsi_cdb = (char *)&cdb; 22088 ucmd_buf.uscsi_cdblen = CDB_GROUP1; 22089 ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr; 22090 ucmd_buf.uscsi_buflen = buflen; 22091 ucmd_buf.uscsi_rqbuf = NULL; 22092 ucmd_buf.uscsi_rqlen = 0; 22093 ucmd_buf.uscsi_flags = USCSI_READ | USCSI_SILENT; 22094 ucmd_buf.uscsi_timeout = 60; 22095 22096 status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL, 22097 UIO_SYSSPACE, SD_PATH_DIRECT); 22098 22099 /* 22100 * Only handle status == 0, the upper-level caller 22101 * will put different assessment based on the context. 22102 */ 22103 if (status == 0) { 22104 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 22105 22106 if (ucmd_buf.uscsi_resid != 0) { 22107 status = EIO; 22108 } 22109 } 22110 22111 SD_TRACE(SD_LOG_IO, un, 22112 "sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION: exit\n"); 22113 22114 return (status); 22115 } 22116 22117 22118 static boolean_t 22119 sd_gesn_media_data_valid(uchar_t *data) 22120 { 22121 uint16_t len; 22122 22123 len = (data[1] << 8) | data[0]; 22124 return ((len >= 6) && 22125 ((data[2] & SD_GESN_HEADER_NEA) == 0) && 22126 ((data[2] & SD_GESN_HEADER_CLASS) == SD_GESN_MEDIA_CLASS) && 22127 ((data[3] & (1 << SD_GESN_MEDIA_CLASS)) != 0)); 22128 } 22129 22130 22131 /* 22132 * Function: sdioctl 22133 * 22134 * Description: Driver's ioctl(9e) entry point function. 22135 * 22136 * Arguments: dev - device number 22137 * cmd - ioctl operation to be performed 22138 * arg - user argument, contains data to be set or reference 22139 * parameter for get 22140 * flag - bit flag, indicating open settings, 32/64 bit type 22141 * cred_p - user credential pointer 22142 * rval_p - calling process return value (OPT) 22143 * 22144 * Return Code: EINVAL 22145 * ENOTTY 22146 * ENXIO 22147 * EIO 22148 * EFAULT 22149 * ENOTSUP 22150 * EPERM 22151 * 22152 * Context: Called from the device switch at normal priority. 22153 */ 22154 22155 static int 22156 sdioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cred_p, int *rval_p) 22157 { 22158 struct sd_lun *un = NULL; 22159 int err = 0; 22160 int i = 0; 22161 cred_t *cr; 22162 int tmprval = EINVAL; 22163 boolean_t is_valid; 22164 sd_ssc_t *ssc; 22165 22166 /* 22167 * All device accesses go thru sdstrategy where we check on suspend 22168 * status 22169 */ 22170 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 22171 return (ENXIO); 22172 } 22173 22174 ASSERT(!mutex_owned(SD_MUTEX(un))); 22175 22176 /* Initialize sd_ssc_t for internal uscsi commands */ 22177 ssc = sd_ssc_init(un); 22178 22179 is_valid = SD_IS_VALID_LABEL(un); 22180 22181 /* 22182 * Moved this wait from sd_uscsi_strategy to here for 22183 * reasons of deadlock prevention. Internal driver commands, 22184 * specifically those to change a devices power level, result 22185 * in a call to sd_uscsi_strategy. 22186 */ 22187 mutex_enter(SD_MUTEX(un)); 22188 while ((un->un_state == SD_STATE_SUSPENDED) || 22189 (un->un_state == SD_STATE_PM_CHANGING)) { 22190 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); 22191 } 22192 /* 22193 * Twiddling the counter here protects commands from now 22194 * through to the top of sd_uscsi_strategy. Without the 22195 * counter inc. a power down, for example, could get in 22196 * after the above check for state is made and before 22197 * execution gets to the top of sd_uscsi_strategy. 22198 * That would cause problems. 22199 */ 22200 un->un_ncmds_in_driver++; 22201 22202 if (!is_valid && 22203 (flag & (FNDELAY | FNONBLOCK))) { 22204 switch (cmd) { 22205 case DKIOCGGEOM: /* SD_PATH_DIRECT */ 22206 case DKIOCGVTOC: 22207 case DKIOCGEXTVTOC: 22208 case DKIOCGAPART: 22209 case DKIOCPARTINFO: 22210 case DKIOCEXTPARTINFO: 22211 case DKIOCSGEOM: 22212 case DKIOCSAPART: 22213 case DKIOCGETEFI: 22214 case DKIOCPARTITION: 22215 case DKIOCSVTOC: 22216 case DKIOCSEXTVTOC: 22217 case DKIOCSETEFI: 22218 case DKIOCGMBOOT: 22219 case DKIOCSMBOOT: 22220 case DKIOCG_PHYGEOM: 22221 case DKIOCG_VIRTGEOM: 22222 #if defined(__i386) || defined(__amd64) 22223 case DKIOCSETEXTPART: 22224 #endif 22225 /* let cmlb handle it */ 22226 goto skip_ready_valid; 22227 22228 case CDROMPAUSE: 22229 case CDROMRESUME: 22230 case CDROMPLAYMSF: 22231 case CDROMPLAYTRKIND: 22232 case CDROMREADTOCHDR: 22233 case CDROMREADTOCENTRY: 22234 case CDROMSTOP: 22235 case CDROMSTART: 22236 case CDROMVOLCTRL: 22237 case CDROMSUBCHNL: 22238 case CDROMREADMODE2: 22239 case CDROMREADMODE1: 22240 case CDROMREADOFFSET: 22241 case CDROMSBLKMODE: 22242 case CDROMGBLKMODE: 22243 case CDROMGDRVSPEED: 22244 case CDROMSDRVSPEED: 22245 case CDROMCDDA: 22246 case CDROMCDXA: 22247 case CDROMSUBCODE: 22248 if (!ISCD(un)) { 22249 un->un_ncmds_in_driver--; 22250 ASSERT(un->un_ncmds_in_driver >= 0); 22251 mutex_exit(SD_MUTEX(un)); 22252 err = ENOTTY; 22253 goto done_without_assess; 22254 } 22255 break; 22256 case FDEJECT: 22257 case DKIOCEJECT: 22258 case CDROMEJECT: 22259 if (!un->un_f_eject_media_supported) { 22260 un->un_ncmds_in_driver--; 22261 ASSERT(un->un_ncmds_in_driver >= 0); 22262 mutex_exit(SD_MUTEX(un)); 22263 err = ENOTTY; 22264 goto done_without_assess; 22265 } 22266 break; 22267 case DKIOCFLUSHWRITECACHE: 22268 mutex_exit(SD_MUTEX(un)); 22269 err = sd_send_scsi_TEST_UNIT_READY(ssc, 0); 22270 if (err != 0) { 22271 mutex_enter(SD_MUTEX(un)); 22272 un->un_ncmds_in_driver--; 22273 ASSERT(un->un_ncmds_in_driver >= 0); 22274 mutex_exit(SD_MUTEX(un)); 22275 err = EIO; 22276 goto done_quick_assess; 22277 } 22278 mutex_enter(SD_MUTEX(un)); 22279 /* FALLTHROUGH */ 22280 case DKIOCREMOVABLE: 22281 case DKIOCHOTPLUGGABLE: 22282 case DKIOCINFO: 22283 case DKIOCGMEDIAINFO: 22284 case DKIOCGMEDIAINFOEXT: 22285 case DKIOCSOLIDSTATE: 22286 case MHIOCENFAILFAST: 22287 case MHIOCSTATUS: 22288 case MHIOCTKOWN: 22289 case MHIOCRELEASE: 22290 case MHIOCGRP_INKEYS: 22291 case MHIOCGRP_INRESV: 22292 case MHIOCGRP_REGISTER: 22293 case MHIOCGRP_CLEAR: 22294 case MHIOCGRP_RESERVE: 22295 case MHIOCGRP_PREEMPTANDABORT: 22296 case MHIOCGRP_REGISTERANDIGNOREKEY: 22297 case CDROMCLOSETRAY: 22298 case USCSICMD: 22299 goto skip_ready_valid; 22300 default: 22301 break; 22302 } 22303 22304 mutex_exit(SD_MUTEX(un)); 22305 err = sd_ready_and_valid(ssc, SDPART(dev)); 22306 mutex_enter(SD_MUTEX(un)); 22307 22308 if (err != SD_READY_VALID) { 22309 switch (cmd) { 22310 case DKIOCSTATE: 22311 case CDROMGDRVSPEED: 22312 case CDROMSDRVSPEED: 22313 case FDEJECT: /* for eject command */ 22314 case DKIOCEJECT: 22315 case CDROMEJECT: 22316 case DKIOCREMOVABLE: 22317 case DKIOCHOTPLUGGABLE: 22318 break; 22319 default: 22320 if (un->un_f_has_removable_media) { 22321 err = ENXIO; 22322 } else { 22323 /* Do not map SD_RESERVED_BY_OTHERS to EIO */ 22324 if (err == SD_RESERVED_BY_OTHERS) { 22325 err = EACCES; 22326 } else { 22327 err = EIO; 22328 } 22329 } 22330 un->un_ncmds_in_driver--; 22331 ASSERT(un->un_ncmds_in_driver >= 0); 22332 mutex_exit(SD_MUTEX(un)); 22333 22334 goto done_without_assess; 22335 } 22336 } 22337 } 22338 22339 skip_ready_valid: 22340 mutex_exit(SD_MUTEX(un)); 22341 22342 switch (cmd) { 22343 case DKIOCINFO: 22344 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCINFO\n"); 22345 err = sd_dkio_ctrl_info(dev, (caddr_t)arg, flag); 22346 break; 22347 22348 case DKIOCGMEDIAINFO: 22349 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGMEDIAINFO\n"); 22350 err = sd_get_media_info(dev, (caddr_t)arg, flag); 22351 break; 22352 22353 case DKIOCGMEDIAINFOEXT: 22354 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGMEDIAINFOEXT\n"); 22355 err = sd_get_media_info_ext(dev, (caddr_t)arg, flag); 22356 break; 22357 22358 case DKIOCGGEOM: 22359 case DKIOCGVTOC: 22360 case DKIOCGEXTVTOC: 22361 case DKIOCGAPART: 22362 case DKIOCPARTINFO: 22363 case DKIOCEXTPARTINFO: 22364 case DKIOCSGEOM: 22365 case DKIOCSAPART: 22366 case DKIOCGETEFI: 22367 case DKIOCPARTITION: 22368 case DKIOCSVTOC: 22369 case DKIOCSEXTVTOC: 22370 case DKIOCSETEFI: 22371 case DKIOCGMBOOT: 22372 case DKIOCSMBOOT: 22373 case DKIOCG_PHYGEOM: 22374 case DKIOCG_VIRTGEOM: 22375 #if defined(__i386) || defined(__amd64) 22376 case DKIOCSETEXTPART: 22377 #endif 22378 SD_TRACE(SD_LOG_IOCTL, un, "DKIOC %d\n", cmd); 22379 22380 /* TUR should spin up */ 22381 22382 if (un->un_f_has_removable_media) 22383 err = sd_send_scsi_TEST_UNIT_READY(ssc, 22384 SD_CHECK_FOR_MEDIA); 22385 22386 else 22387 err = sd_send_scsi_TEST_UNIT_READY(ssc, 0); 22388 22389 if (err != 0) 22390 goto done_with_assess; 22391 22392 err = cmlb_ioctl(un->un_cmlbhandle, dev, 22393 cmd, arg, flag, cred_p, rval_p, (void *)SD_PATH_DIRECT); 22394 22395 if ((err == 0) && 22396 ((cmd == DKIOCSETEFI) || 22397 ((un->un_f_pkstats_enabled) && 22398 (cmd == DKIOCSAPART || cmd == DKIOCSVTOC || 22399 cmd == DKIOCSEXTVTOC)))) { 22400 22401 tmprval = cmlb_validate(un->un_cmlbhandle, CMLB_SILENT, 22402 (void *)SD_PATH_DIRECT); 22403 if ((tmprval == 0) && un->un_f_pkstats_enabled) { 22404 sd_set_pstats(un); 22405 SD_TRACE(SD_LOG_IO_PARTITION, un, 22406 "sd_ioctl: un:0x%p pstats created and " 22407 "set\n", un); 22408 } 22409 } 22410 22411 if ((cmd == DKIOCSVTOC || cmd == DKIOCSEXTVTOC) || 22412 ((cmd == DKIOCSETEFI) && (tmprval == 0))) { 22413 22414 mutex_enter(SD_MUTEX(un)); 22415 if (un->un_f_devid_supported && 22416 (un->un_f_opt_fab_devid == TRUE)) { 22417 if (un->un_devid == NULL) { 22418 sd_register_devid(ssc, SD_DEVINFO(un), 22419 SD_TARGET_IS_UNRESERVED); 22420 } else { 22421 /* 22422 * The device id for this disk 22423 * has been fabricated. The 22424 * device id must be preserved 22425 * by writing it back out to 22426 * disk. 22427 */ 22428 if (sd_write_deviceid(ssc) != 0) { 22429 ddi_devid_free(un->un_devid); 22430 un->un_devid = NULL; 22431 } 22432 } 22433 } 22434 mutex_exit(SD_MUTEX(un)); 22435 } 22436 22437 break; 22438 22439 case DKIOCLOCK: 22440 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCLOCK\n"); 22441 err = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT, 22442 SD_PATH_STANDARD); 22443 goto done_with_assess; 22444 22445 case DKIOCUNLOCK: 22446 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCUNLOCK\n"); 22447 err = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_ALLOW, 22448 SD_PATH_STANDARD); 22449 goto done_with_assess; 22450 22451 case DKIOCSTATE: { 22452 enum dkio_state state; 22453 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCSTATE\n"); 22454 22455 if (ddi_copyin((void *)arg, &state, sizeof (int), flag) != 0) { 22456 err = EFAULT; 22457 } else { 22458 err = sd_check_media(dev, state); 22459 if (err == 0) { 22460 if (ddi_copyout(&un->un_mediastate, (void *)arg, 22461 sizeof (int), flag) != 0) 22462 err = EFAULT; 22463 } 22464 } 22465 break; 22466 } 22467 22468 case DKIOCREMOVABLE: 22469 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCREMOVABLE\n"); 22470 i = un->un_f_has_removable_media ? 1 : 0; 22471 if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) { 22472 err = EFAULT; 22473 } else { 22474 err = 0; 22475 } 22476 break; 22477 22478 case DKIOCSOLIDSTATE: 22479 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCSOLIDSTATE\n"); 22480 i = un->un_f_is_solid_state ? 1 : 0; 22481 if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) { 22482 err = EFAULT; 22483 } else { 22484 err = 0; 22485 } 22486 break; 22487 22488 case DKIOCHOTPLUGGABLE: 22489 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCHOTPLUGGABLE\n"); 22490 i = un->un_f_is_hotpluggable ? 1 : 0; 22491 if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) { 22492 err = EFAULT; 22493 } else { 22494 err = 0; 22495 } 22496 break; 22497 22498 case DKIOCREADONLY: 22499 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCREADONLY\n"); 22500 i = 0; 22501 if ((ISCD(un) && !un->un_f_mmc_writable_media) || 22502 (sr_check_wp(dev) != 0)) { 22503 i = 1; 22504 } 22505 if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) { 22506 err = EFAULT; 22507 } else { 22508 err = 0; 22509 } 22510 break; 22511 22512 case DKIOCGTEMPERATURE: 22513 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGTEMPERATURE\n"); 22514 err = sd_dkio_get_temp(dev, (caddr_t)arg, flag); 22515 break; 22516 22517 case MHIOCENFAILFAST: 22518 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCENFAILFAST\n"); 22519 if ((err = drv_priv(cred_p)) == 0) { 22520 err = sd_mhdioc_failfast(dev, (caddr_t)arg, flag); 22521 } 22522 break; 22523 22524 case MHIOCTKOWN: 22525 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCTKOWN\n"); 22526 if ((err = drv_priv(cred_p)) == 0) { 22527 err = sd_mhdioc_takeown(dev, (caddr_t)arg, flag); 22528 } 22529 break; 22530 22531 case MHIOCRELEASE: 22532 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCRELEASE\n"); 22533 if ((err = drv_priv(cred_p)) == 0) { 22534 err = sd_mhdioc_release(dev); 22535 } 22536 break; 22537 22538 case MHIOCSTATUS: 22539 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCSTATUS\n"); 22540 if ((err = drv_priv(cred_p)) == 0) { 22541 switch (sd_send_scsi_TEST_UNIT_READY(ssc, 0)) { 22542 case 0: 22543 err = 0; 22544 break; 22545 case EACCES: 22546 *rval_p = 1; 22547 err = 0; 22548 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 22549 break; 22550 default: 22551 err = EIO; 22552 goto done_with_assess; 22553 } 22554 } 22555 break; 22556 22557 case MHIOCQRESERVE: 22558 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCQRESERVE\n"); 22559 if ((err = drv_priv(cred_p)) == 0) { 22560 err = sd_reserve_release(dev, SD_RESERVE); 22561 } 22562 break; 22563 22564 case MHIOCREREGISTERDEVID: 22565 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCREREGISTERDEVID\n"); 22566 if (drv_priv(cred_p) == EPERM) { 22567 err = EPERM; 22568 } else if (!un->un_f_devid_supported) { 22569 err = ENOTTY; 22570 } else { 22571 err = sd_mhdioc_register_devid(dev); 22572 } 22573 break; 22574 22575 case MHIOCGRP_INKEYS: 22576 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_INKEYS\n"); 22577 if (((err = drv_priv(cred_p)) != EPERM) && arg != NULL) { 22578 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22579 err = ENOTSUP; 22580 } else { 22581 err = sd_mhdioc_inkeys(dev, (caddr_t)arg, 22582 flag); 22583 } 22584 } 22585 break; 22586 22587 case MHIOCGRP_INRESV: 22588 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_INRESV\n"); 22589 if (((err = drv_priv(cred_p)) != EPERM) && arg != NULL) { 22590 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22591 err = ENOTSUP; 22592 } else { 22593 err = sd_mhdioc_inresv(dev, (caddr_t)arg, flag); 22594 } 22595 } 22596 break; 22597 22598 case MHIOCGRP_REGISTER: 22599 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_REGISTER\n"); 22600 if ((err = drv_priv(cred_p)) != EPERM) { 22601 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22602 err = ENOTSUP; 22603 } else if (arg != NULL) { 22604 mhioc_register_t reg; 22605 if (ddi_copyin((void *)arg, ®, 22606 sizeof (mhioc_register_t), flag) != 0) { 22607 err = EFAULT; 22608 } else { 22609 err = 22610 sd_send_scsi_PERSISTENT_RESERVE_OUT( 22611 ssc, SD_SCSI3_REGISTER, 22612 (uchar_t *)®); 22613 if (err != 0) 22614 goto done_with_assess; 22615 } 22616 } 22617 } 22618 break; 22619 22620 case MHIOCGRP_CLEAR: 22621 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_CLEAR\n"); 22622 if ((err = drv_priv(cred_p)) != EPERM) { 22623 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22624 err = ENOTSUP; 22625 } else if (arg != NULL) { 22626 mhioc_register_t reg; 22627 if (ddi_copyin((void *)arg, ®, 22628 sizeof (mhioc_register_t), flag) != 0) { 22629 err = EFAULT; 22630 } else { 22631 err = 22632 sd_send_scsi_PERSISTENT_RESERVE_OUT( 22633 ssc, SD_SCSI3_CLEAR, 22634 (uchar_t *)®); 22635 if (err != 0) 22636 goto done_with_assess; 22637 } 22638 } 22639 } 22640 break; 22641 22642 case MHIOCGRP_RESERVE: 22643 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_RESERVE\n"); 22644 if ((err = drv_priv(cred_p)) != EPERM) { 22645 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22646 err = ENOTSUP; 22647 } else if (arg != NULL) { 22648 mhioc_resv_desc_t resv_desc; 22649 if (ddi_copyin((void *)arg, &resv_desc, 22650 sizeof (mhioc_resv_desc_t), flag) != 0) { 22651 err = EFAULT; 22652 } else { 22653 err = 22654 sd_send_scsi_PERSISTENT_RESERVE_OUT( 22655 ssc, SD_SCSI3_RESERVE, 22656 (uchar_t *)&resv_desc); 22657 if (err != 0) 22658 goto done_with_assess; 22659 } 22660 } 22661 } 22662 break; 22663 22664 case MHIOCGRP_PREEMPTANDABORT: 22665 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_PREEMPTANDABORT\n"); 22666 if ((err = drv_priv(cred_p)) != EPERM) { 22667 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22668 err = ENOTSUP; 22669 } else if (arg != NULL) { 22670 mhioc_preemptandabort_t preempt_abort; 22671 if (ddi_copyin((void *)arg, &preempt_abort, 22672 sizeof (mhioc_preemptandabort_t), 22673 flag) != 0) { 22674 err = EFAULT; 22675 } else { 22676 err = 22677 sd_send_scsi_PERSISTENT_RESERVE_OUT( 22678 ssc, SD_SCSI3_PREEMPTANDABORT, 22679 (uchar_t *)&preempt_abort); 22680 if (err != 0) 22681 goto done_with_assess; 22682 } 22683 } 22684 } 22685 break; 22686 22687 case MHIOCGRP_REGISTERANDIGNOREKEY: 22688 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_REGISTERANDIGNOREKEY\n"); 22689 if ((err = drv_priv(cred_p)) != EPERM) { 22690 if (un->un_reservation_type == SD_SCSI2_RESERVATION) { 22691 err = ENOTSUP; 22692 } else if (arg != NULL) { 22693 mhioc_registerandignorekey_t r_and_i; 22694 if (ddi_copyin((void *)arg, (void *)&r_and_i, 22695 sizeof (mhioc_registerandignorekey_t), 22696 flag) != 0) { 22697 err = EFAULT; 22698 } else { 22699 err = 22700 sd_send_scsi_PERSISTENT_RESERVE_OUT( 22701 ssc, SD_SCSI3_REGISTERANDIGNOREKEY, 22702 (uchar_t *)&r_and_i); 22703 if (err != 0) 22704 goto done_with_assess; 22705 } 22706 } 22707 } 22708 break; 22709 22710 case USCSICMD: 22711 SD_TRACE(SD_LOG_IOCTL, un, "USCSICMD\n"); 22712 cr = ddi_get_cred(); 22713 if ((drv_priv(cred_p) != 0) && (drv_priv(cr) != 0)) { 22714 err = EPERM; 22715 } else { 22716 enum uio_seg uioseg; 22717 22718 uioseg = (flag & FKIOCTL) ? UIO_SYSSPACE : 22719 UIO_USERSPACE; 22720 if (un->un_f_format_in_progress == TRUE) { 22721 err = EAGAIN; 22722 break; 22723 } 22724 22725 err = sd_ssc_send(ssc, 22726 (struct uscsi_cmd *)arg, 22727 flag, uioseg, SD_PATH_STANDARD); 22728 if (err != 0) 22729 goto done_with_assess; 22730 else 22731 sd_ssc_assessment(ssc, SD_FMT_STANDARD); 22732 } 22733 break; 22734 22735 case CDROMPAUSE: 22736 case CDROMRESUME: 22737 SD_TRACE(SD_LOG_IOCTL, un, "PAUSE-RESUME\n"); 22738 if (!ISCD(un)) { 22739 err = ENOTTY; 22740 } else { 22741 err = sr_pause_resume(dev, cmd); 22742 } 22743 break; 22744 22745 case CDROMPLAYMSF: 22746 SD_TRACE(SD_LOG_IOCTL, un, "CDROMPLAYMSF\n"); 22747 if (!ISCD(un)) { 22748 err = ENOTTY; 22749 } else { 22750 err = sr_play_msf(dev, (caddr_t)arg, flag); 22751 } 22752 break; 22753 22754 case CDROMPLAYTRKIND: 22755 SD_TRACE(SD_LOG_IOCTL, un, "CDROMPLAYTRKIND\n"); 22756 #if defined(__i386) || defined(__amd64) 22757 /* 22758 * not supported on ATAPI CD drives, use CDROMPLAYMSF instead 22759 */ 22760 if (!ISCD(un) || (un->un_f_cfg_is_atapi == TRUE)) { 22761 #else 22762 if (!ISCD(un)) { 22763 #endif 22764 err = ENOTTY; 22765 } else { 22766 err = sr_play_trkind(dev, (caddr_t)arg, flag); 22767 } 22768 break; 22769 22770 case CDROMREADTOCHDR: 22771 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADTOCHDR\n"); 22772 if (!ISCD(un)) { 22773 err = ENOTTY; 22774 } else { 22775 err = sr_read_tochdr(dev, (caddr_t)arg, flag); 22776 } 22777 break; 22778 22779 case CDROMREADTOCENTRY: 22780 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADTOCENTRY\n"); 22781 if (!ISCD(un)) { 22782 err = ENOTTY; 22783 } else { 22784 err = sr_read_tocentry(dev, (caddr_t)arg, flag); 22785 } 22786 break; 22787 22788 case CDROMSTOP: 22789 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSTOP\n"); 22790 if (!ISCD(un)) { 22791 err = ENOTTY; 22792 } else { 22793 err = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP, 22794 SD_TARGET_STOP, SD_PATH_STANDARD); 22795 goto done_with_assess; 22796 } 22797 break; 22798 22799 case CDROMSTART: 22800 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSTART\n"); 22801 if (!ISCD(un)) { 22802 err = ENOTTY; 22803 } else { 22804 err = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP, 22805 SD_TARGET_START, SD_PATH_STANDARD); 22806 goto done_with_assess; 22807 } 22808 break; 22809 22810 case CDROMCLOSETRAY: 22811 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCLOSETRAY\n"); 22812 if (!ISCD(un)) { 22813 err = ENOTTY; 22814 } else { 22815 err = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP, 22816 SD_TARGET_CLOSE, SD_PATH_STANDARD); 22817 goto done_with_assess; 22818 } 22819 break; 22820 22821 case FDEJECT: /* for eject command */ 22822 case DKIOCEJECT: 22823 case CDROMEJECT: 22824 SD_TRACE(SD_LOG_IOCTL, un, "EJECT\n"); 22825 if (!un->un_f_eject_media_supported) { 22826 err = ENOTTY; 22827 } else { 22828 err = sr_eject(dev); 22829 } 22830 break; 22831 22832 case CDROMVOLCTRL: 22833 SD_TRACE(SD_LOG_IOCTL, un, "CDROMVOLCTRL\n"); 22834 if (!ISCD(un)) { 22835 err = ENOTTY; 22836 } else { 22837 err = sr_volume_ctrl(dev, (caddr_t)arg, flag); 22838 } 22839 break; 22840 22841 case CDROMSUBCHNL: 22842 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSUBCHNL\n"); 22843 if (!ISCD(un)) { 22844 err = ENOTTY; 22845 } else { 22846 err = sr_read_subchannel(dev, (caddr_t)arg, flag); 22847 } 22848 break; 22849 22850 case CDROMREADMODE2: 22851 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADMODE2\n"); 22852 if (!ISCD(un)) { 22853 err = ENOTTY; 22854 } else if (un->un_f_cfg_is_atapi == TRUE) { 22855 /* 22856 * If the drive supports READ CD, use that instead of 22857 * switching the LBA size via a MODE SELECT 22858 * Block Descriptor 22859 */ 22860 err = sr_read_cd_mode2(dev, (caddr_t)arg, flag); 22861 } else { 22862 err = sr_read_mode2(dev, (caddr_t)arg, flag); 22863 } 22864 break; 22865 22866 case CDROMREADMODE1: 22867 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADMODE1\n"); 22868 if (!ISCD(un)) { 22869 err = ENOTTY; 22870 } else { 22871 err = sr_read_mode1(dev, (caddr_t)arg, flag); 22872 } 22873 break; 22874 22875 case CDROMREADOFFSET: 22876 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADOFFSET\n"); 22877 if (!ISCD(un)) { 22878 err = ENOTTY; 22879 } else { 22880 err = sr_read_sony_session_offset(dev, (caddr_t)arg, 22881 flag); 22882 } 22883 break; 22884 22885 case CDROMSBLKMODE: 22886 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSBLKMODE\n"); 22887 /* 22888 * There is no means of changing block size in case of atapi 22889 * drives, thus return ENOTTY if drive type is atapi 22890 */ 22891 if (!ISCD(un) || (un->un_f_cfg_is_atapi == TRUE)) { 22892 err = ENOTTY; 22893 } else if (un->un_f_mmc_cap == TRUE) { 22894 22895 /* 22896 * MMC Devices do not support changing the 22897 * logical block size 22898 * 22899 * Note: EINVAL is being returned instead of ENOTTY to 22900 * maintain consistancy with the original mmc 22901 * driver update. 22902 */ 22903 err = EINVAL; 22904 } else { 22905 mutex_enter(SD_MUTEX(un)); 22906 if ((!(un->un_exclopen & (1<<SDPART(dev)))) || 22907 (un->un_ncmds_in_transport > 0)) { 22908 mutex_exit(SD_MUTEX(un)); 22909 err = EINVAL; 22910 } else { 22911 mutex_exit(SD_MUTEX(un)); 22912 err = sr_change_blkmode(dev, cmd, arg, flag); 22913 } 22914 } 22915 break; 22916 22917 case CDROMGBLKMODE: 22918 SD_TRACE(SD_LOG_IOCTL, un, "CDROMGBLKMODE\n"); 22919 if (!ISCD(un)) { 22920 err = ENOTTY; 22921 } else if ((un->un_f_cfg_is_atapi != FALSE) && 22922 (un->un_f_blockcount_is_valid != FALSE)) { 22923 /* 22924 * Drive is an ATAPI drive so return target block 22925 * size for ATAPI drives since we cannot change the 22926 * blocksize on ATAPI drives. Used primarily to detect 22927 * if an ATAPI cdrom is present. 22928 */ 22929 if (ddi_copyout(&un->un_tgt_blocksize, (void *)arg, 22930 sizeof (int), flag) != 0) { 22931 err = EFAULT; 22932 } else { 22933 err = 0; 22934 } 22935 22936 } else { 22937 /* 22938 * Drive supports changing block sizes via a Mode 22939 * Select. 22940 */ 22941 err = sr_change_blkmode(dev, cmd, arg, flag); 22942 } 22943 break; 22944 22945 case CDROMGDRVSPEED: 22946 case CDROMSDRVSPEED: 22947 SD_TRACE(SD_LOG_IOCTL, un, "CDROMXDRVSPEED\n"); 22948 if (!ISCD(un)) { 22949 err = ENOTTY; 22950 } else if (un->un_f_mmc_cap == TRUE) { 22951 /* 22952 * Note: In the future the driver implementation 22953 * for getting and 22954 * setting cd speed should entail: 22955 * 1) If non-mmc try the Toshiba mode page 22956 * (sr_change_speed) 22957 * 2) If mmc but no support for Real Time Streaming try 22958 * the SET CD SPEED (0xBB) command 22959 * (sr_atapi_change_speed) 22960 * 3) If mmc and support for Real Time Streaming 22961 * try the GET PERFORMANCE and SET STREAMING 22962 * commands (not yet implemented, 4380808) 22963 */ 22964 /* 22965 * As per recent MMC spec, CD-ROM speed is variable 22966 * and changes with LBA. Since there is no such 22967 * things as drive speed now, fail this ioctl. 22968 * 22969 * Note: EINVAL is returned for consistancy of original 22970 * implementation which included support for getting 22971 * the drive speed of mmc devices but not setting 22972 * the drive speed. Thus EINVAL would be returned 22973 * if a set request was made for an mmc device. 22974 * We no longer support get or set speed for 22975 * mmc but need to remain consistent with regard 22976 * to the error code returned. 22977 */ 22978 err = EINVAL; 22979 } else if (un->un_f_cfg_is_atapi == TRUE) { 22980 err = sr_atapi_change_speed(dev, cmd, arg, flag); 22981 } else { 22982 err = sr_change_speed(dev, cmd, arg, flag); 22983 } 22984 break; 22985 22986 case CDROMCDDA: 22987 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCDDA\n"); 22988 if (!ISCD(un)) { 22989 err = ENOTTY; 22990 } else { 22991 err = sr_read_cdda(dev, (void *)arg, flag); 22992 } 22993 break; 22994 22995 case CDROMCDXA: 22996 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCDXA\n"); 22997 if (!ISCD(un)) { 22998 err = ENOTTY; 22999 } else { 23000 err = sr_read_cdxa(dev, (caddr_t)arg, flag); 23001 } 23002 break; 23003 23004 case CDROMSUBCODE: 23005 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSUBCODE\n"); 23006 if (!ISCD(un)) { 23007 err = ENOTTY; 23008 } else { 23009 err = sr_read_all_subcodes(dev, (caddr_t)arg, flag); 23010 } 23011 break; 23012 23013 23014 #ifdef SDDEBUG 23015 /* RESET/ABORTS testing ioctls */ 23016 case DKIOCRESET: { 23017 int reset_level; 23018 23019 if (ddi_copyin((void *)arg, &reset_level, sizeof (int), flag)) { 23020 err = EFAULT; 23021 } else { 23022 SD_INFO(SD_LOG_IOCTL, un, "sdioctl: DKIOCRESET: " 23023 "reset_level = 0x%lx\n", reset_level); 23024 if (scsi_reset(SD_ADDRESS(un), reset_level)) { 23025 err = 0; 23026 } else { 23027 err = EIO; 23028 } 23029 } 23030 break; 23031 } 23032 23033 case DKIOCABORT: 23034 SD_INFO(SD_LOG_IOCTL, un, "sdioctl: DKIOCABORT:\n"); 23035 if (scsi_abort(SD_ADDRESS(un), NULL)) { 23036 err = 0; 23037 } else { 23038 err = EIO; 23039 } 23040 break; 23041 #endif 23042 23043 #ifdef SD_FAULT_INJECTION 23044 /* SDIOC FaultInjection testing ioctls */ 23045 case SDIOCSTART: 23046 case SDIOCSTOP: 23047 case SDIOCINSERTPKT: 23048 case SDIOCINSERTXB: 23049 case SDIOCINSERTUN: 23050 case SDIOCINSERTARQ: 23051 case SDIOCPUSH: 23052 case SDIOCRETRIEVE: 23053 case SDIOCRUN: 23054 SD_INFO(SD_LOG_SDTEST, un, "sdioctl:" 23055 "SDIOC detected cmd:0x%X:\n", cmd); 23056 /* call error generator */ 23057 sd_faultinjection_ioctl(cmd, arg, un); 23058 err = 0; 23059 break; 23060 23061 #endif /* SD_FAULT_INJECTION */ 23062 23063 case DKIOCFLUSHWRITECACHE: 23064 { 23065 struct dk_callback *dkc = (struct dk_callback *)arg; 23066 23067 mutex_enter(SD_MUTEX(un)); 23068 if (!un->un_f_sync_cache_supported || 23069 !un->un_f_write_cache_enabled) { 23070 err = un->un_f_sync_cache_supported ? 23071 0 : ENOTSUP; 23072 mutex_exit(SD_MUTEX(un)); 23073 if ((flag & FKIOCTL) && dkc != NULL && 23074 dkc->dkc_callback != NULL) { 23075 (*dkc->dkc_callback)(dkc->dkc_cookie, 23076 err); 23077 /* 23078 * Did callback and reported error. 23079 * Since we did a callback, ioctl 23080 * should return 0. 23081 */ 23082 err = 0; 23083 } 23084 break; 23085 } 23086 mutex_exit(SD_MUTEX(un)); 23087 23088 if ((flag & FKIOCTL) && dkc != NULL && 23089 dkc->dkc_callback != NULL) { 23090 /* async SYNC CACHE request */ 23091 err = sd_send_scsi_SYNCHRONIZE_CACHE(un, dkc); 23092 } else { 23093 /* synchronous SYNC CACHE request */ 23094 err = sd_send_scsi_SYNCHRONIZE_CACHE(un, NULL); 23095 } 23096 } 23097 break; 23098 23099 case DKIOCGETWCE: { 23100 23101 int wce; 23102 23103 if ((err = sd_get_write_cache_enabled(ssc, &wce)) != 0) { 23104 break; 23105 } 23106 23107 if (ddi_copyout(&wce, (void *)arg, sizeof (wce), flag)) { 23108 err = EFAULT; 23109 } 23110 break; 23111 } 23112 23113 case DKIOCSETWCE: { 23114 23115 int wce, sync_supported; 23116 int cur_wce = 0; 23117 23118 if (!un->un_f_cache_mode_changeable) { 23119 err = EINVAL; 23120 break; 23121 } 23122 23123 if (ddi_copyin((void *)arg, &wce, sizeof (wce), flag)) { 23124 err = EFAULT; 23125 break; 23126 } 23127 23128 /* 23129 * Synchronize multiple threads trying to enable 23130 * or disable the cache via the un_f_wcc_cv 23131 * condition variable. 23132 */ 23133 mutex_enter(SD_MUTEX(un)); 23134 23135 /* 23136 * Don't allow the cache to be enabled if the 23137 * config file has it disabled. 23138 */ 23139 if (un->un_f_opt_disable_cache && wce) { 23140 mutex_exit(SD_MUTEX(un)); 23141 err = EINVAL; 23142 break; 23143 } 23144 23145 /* 23146 * Wait for write cache change in progress 23147 * bit to be clear before proceeding. 23148 */ 23149 while (un->un_f_wcc_inprog) 23150 cv_wait(&un->un_wcc_cv, SD_MUTEX(un)); 23151 23152 un->un_f_wcc_inprog = 1; 23153 23154 mutex_exit(SD_MUTEX(un)); 23155 23156 /* 23157 * Get the current write cache state 23158 */ 23159 if ((err = sd_get_write_cache_enabled(ssc, &cur_wce)) != 0) { 23160 mutex_enter(SD_MUTEX(un)); 23161 un->un_f_wcc_inprog = 0; 23162 cv_broadcast(&un->un_wcc_cv); 23163 mutex_exit(SD_MUTEX(un)); 23164 break; 23165 } 23166 23167 mutex_enter(SD_MUTEX(un)); 23168 un->un_f_write_cache_enabled = (cur_wce != 0); 23169 23170 if (un->un_f_write_cache_enabled && wce == 0) { 23171 /* 23172 * Disable the write cache. Don't clear 23173 * un_f_write_cache_enabled until after 23174 * the mode select and flush are complete. 23175 */ 23176 sync_supported = un->un_f_sync_cache_supported; 23177 23178 /* 23179 * If cache flush is suppressed, we assume that the 23180 * controller firmware will take care of managing the 23181 * write cache for us: no need to explicitly 23182 * disable it. 23183 */ 23184 if (!un->un_f_suppress_cache_flush) { 23185 mutex_exit(SD_MUTEX(un)); 23186 if ((err = sd_cache_control(ssc, 23187 SD_CACHE_NOCHANGE, 23188 SD_CACHE_DISABLE)) == 0 && 23189 sync_supported) { 23190 err = sd_send_scsi_SYNCHRONIZE_CACHE(un, 23191 NULL); 23192 } 23193 } else { 23194 mutex_exit(SD_MUTEX(un)); 23195 } 23196 23197 mutex_enter(SD_MUTEX(un)); 23198 if (err == 0) { 23199 un->un_f_write_cache_enabled = 0; 23200 } 23201 23202 } else if (!un->un_f_write_cache_enabled && wce != 0) { 23203 /* 23204 * Set un_f_write_cache_enabled first, so there is 23205 * no window where the cache is enabled, but the 23206 * bit says it isn't. 23207 */ 23208 un->un_f_write_cache_enabled = 1; 23209 23210 /* 23211 * If cache flush is suppressed, we assume that the 23212 * controller firmware will take care of managing the 23213 * write cache for us: no need to explicitly 23214 * enable it. 23215 */ 23216 if (!un->un_f_suppress_cache_flush) { 23217 mutex_exit(SD_MUTEX(un)); 23218 err = sd_cache_control(ssc, SD_CACHE_NOCHANGE, 23219 SD_CACHE_ENABLE); 23220 } else { 23221 mutex_exit(SD_MUTEX(un)); 23222 } 23223 23224 mutex_enter(SD_MUTEX(un)); 23225 23226 if (err) { 23227 un->un_f_write_cache_enabled = 0; 23228 } 23229 } 23230 23231 un->un_f_wcc_inprog = 0; 23232 cv_broadcast(&un->un_wcc_cv); 23233 mutex_exit(SD_MUTEX(un)); 23234 break; 23235 } 23236 23237 default: 23238 err = ENOTTY; 23239 break; 23240 } 23241 mutex_enter(SD_MUTEX(un)); 23242 un->un_ncmds_in_driver--; 23243 ASSERT(un->un_ncmds_in_driver >= 0); 23244 mutex_exit(SD_MUTEX(un)); 23245 23246 23247 done_without_assess: 23248 sd_ssc_fini(ssc); 23249 23250 SD_TRACE(SD_LOG_IOCTL, un, "sdioctl: exit: %d\n", err); 23251 return (err); 23252 23253 done_with_assess: 23254 mutex_enter(SD_MUTEX(un)); 23255 un->un_ncmds_in_driver--; 23256 ASSERT(un->un_ncmds_in_driver >= 0); 23257 mutex_exit(SD_MUTEX(un)); 23258 23259 done_quick_assess: 23260 if (err != 0) 23261 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 23262 /* Uninitialize sd_ssc_t pointer */ 23263 sd_ssc_fini(ssc); 23264 23265 SD_TRACE(SD_LOG_IOCTL, un, "sdioctl: exit: %d\n", err); 23266 return (err); 23267 } 23268 23269 23270 /* 23271 * Function: sd_dkio_ctrl_info 23272 * 23273 * Description: This routine is the driver entry point for handling controller 23274 * information ioctl requests (DKIOCINFO). 23275 * 23276 * Arguments: dev - the device number 23277 * arg - pointer to user provided dk_cinfo structure 23278 * specifying the controller type and attributes. 23279 * flag - this argument is a pass through to ddi_copyxxx() 23280 * directly from the mode argument of ioctl(). 23281 * 23282 * Return Code: 0 23283 * EFAULT 23284 * ENXIO 23285 */ 23286 23287 static int 23288 sd_dkio_ctrl_info(dev_t dev, caddr_t arg, int flag) 23289 { 23290 struct sd_lun *un = NULL; 23291 struct dk_cinfo *info; 23292 dev_info_t *pdip; 23293 int lun, tgt; 23294 23295 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 23296 return (ENXIO); 23297 } 23298 23299 info = (struct dk_cinfo *) 23300 kmem_zalloc(sizeof (struct dk_cinfo), KM_SLEEP); 23301 23302 switch (un->un_ctype) { 23303 case CTYPE_CDROM: 23304 info->dki_ctype = DKC_CDROM; 23305 break; 23306 default: 23307 info->dki_ctype = DKC_SCSI_CCS; 23308 break; 23309 } 23310 pdip = ddi_get_parent(SD_DEVINFO(un)); 23311 info->dki_cnum = ddi_get_instance(pdip); 23312 if (strlen(ddi_get_name(pdip)) < DK_DEVLEN) { 23313 (void) strcpy(info->dki_cname, ddi_get_name(pdip)); 23314 } else { 23315 (void) strncpy(info->dki_cname, ddi_node_name(pdip), 23316 DK_DEVLEN - 1); 23317 } 23318 23319 lun = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un), 23320 DDI_PROP_DONTPASS, SCSI_ADDR_PROP_LUN, 0); 23321 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un), 23322 DDI_PROP_DONTPASS, SCSI_ADDR_PROP_TARGET, 0); 23323 23324 /* Unit Information */ 23325 info->dki_unit = ddi_get_instance(SD_DEVINFO(un)); 23326 info->dki_slave = ((tgt << 3) | lun); 23327 (void) strncpy(info->dki_dname, ddi_driver_name(SD_DEVINFO(un)), 23328 DK_DEVLEN - 1); 23329 info->dki_flags = DKI_FMTVOL; 23330 info->dki_partition = SDPART(dev); 23331 23332 /* Max Transfer size of this device in blocks */ 23333 info->dki_maxtransfer = un->un_max_xfer_size / un->un_sys_blocksize; 23334 info->dki_addr = 0; 23335 info->dki_space = 0; 23336 info->dki_prio = 0; 23337 info->dki_vec = 0; 23338 23339 if (ddi_copyout(info, arg, sizeof (struct dk_cinfo), flag) != 0) { 23340 kmem_free(info, sizeof (struct dk_cinfo)); 23341 return (EFAULT); 23342 } else { 23343 kmem_free(info, sizeof (struct dk_cinfo)); 23344 return (0); 23345 } 23346 } 23347 23348 /* 23349 * Function: sd_get_media_info_com 23350 * 23351 * Description: This routine returns the information required to populate 23352 * the fields for the dk_minfo/dk_minfo_ext structures. 23353 * 23354 * Arguments: dev - the device number 23355 * dki_media_type - media_type 23356 * dki_lbsize - logical block size 23357 * dki_capacity - capacity in blocks 23358 * dki_pbsize - physical block size (if requested) 23359 * 23360 * Return Code: 0 23361 * EACCESS 23362 * EFAULT 23363 * ENXIO 23364 * EIO 23365 */ 23366 static int 23367 sd_get_media_info_com(dev_t dev, uint_t *dki_media_type, uint_t *dki_lbsize, 23368 diskaddr_t *dki_capacity, uint_t *dki_pbsize) 23369 { 23370 struct sd_lun *un = NULL; 23371 struct uscsi_cmd com; 23372 struct scsi_inquiry *sinq; 23373 u_longlong_t media_capacity; 23374 uint64_t capacity; 23375 uint_t lbasize; 23376 uint_t pbsize; 23377 uchar_t *out_data; 23378 uchar_t *rqbuf; 23379 int rval = 0; 23380 int rtn; 23381 sd_ssc_t *ssc; 23382 23383 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 23384 (un->un_state == SD_STATE_OFFLINE)) { 23385 return (ENXIO); 23386 } 23387 23388 SD_TRACE(SD_LOG_IOCTL_DKIO, un, "sd_get_media_info_com: entry\n"); 23389 23390 out_data = kmem_zalloc(SD_PROFILE_HEADER_LEN, KM_SLEEP); 23391 rqbuf = kmem_zalloc(SENSE_LENGTH, KM_SLEEP); 23392 ssc = sd_ssc_init(un); 23393 23394 /* Issue a TUR to determine if the drive is ready with media present */ 23395 rval = sd_send_scsi_TEST_UNIT_READY(ssc, SD_CHECK_FOR_MEDIA); 23396 if (rval == ENXIO) { 23397 goto done; 23398 } else if (rval != 0) { 23399 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 23400 } 23401 23402 /* Now get configuration data */ 23403 if (ISCD(un)) { 23404 *dki_media_type = DK_CDROM; 23405 23406 /* Allow SCMD_GET_CONFIGURATION to MMC devices only */ 23407 if (un->un_f_mmc_cap == TRUE) { 23408 rtn = sd_send_scsi_GET_CONFIGURATION(ssc, &com, rqbuf, 23409 SENSE_LENGTH, out_data, SD_PROFILE_HEADER_LEN, 23410 SD_PATH_STANDARD); 23411 23412 if (rtn) { 23413 /* 23414 * We ignore all failures for CD and need to 23415 * put the assessment before processing code 23416 * to avoid missing assessment for FMA. 23417 */ 23418 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 23419 /* 23420 * Failed for other than an illegal request 23421 * or command not supported 23422 */ 23423 if ((com.uscsi_status == STATUS_CHECK) && 23424 (com.uscsi_rqstatus == STATUS_GOOD)) { 23425 if ((rqbuf[2] != KEY_ILLEGAL_REQUEST) || 23426 (rqbuf[12] != 0x20)) { 23427 rval = EIO; 23428 goto no_assessment; 23429 } 23430 } 23431 } else { 23432 /* 23433 * The GET CONFIGURATION command succeeded 23434 * so set the media type according to the 23435 * returned data 23436 */ 23437 *dki_media_type = out_data[6]; 23438 *dki_media_type <<= 8; 23439 *dki_media_type |= out_data[7]; 23440 } 23441 } 23442 } else { 23443 /* 23444 * The profile list is not available, so we attempt to identify 23445 * the media type based on the inquiry data 23446 */ 23447 sinq = un->un_sd->sd_inq; 23448 if ((sinq->inq_dtype == DTYPE_DIRECT) || 23449 (sinq->inq_dtype == DTYPE_OPTICAL)) { 23450 /* This is a direct access device or optical disk */ 23451 *dki_media_type = DK_FIXED_DISK; 23452 23453 if ((bcmp(sinq->inq_vid, "IOMEGA", 6) == 0) || 23454 (bcmp(sinq->inq_vid, "iomega", 6) == 0)) { 23455 if ((bcmp(sinq->inq_pid, "ZIP", 3) == 0)) { 23456 *dki_media_type = DK_ZIP; 23457 } else if ( 23458 (bcmp(sinq->inq_pid, "jaz", 3) == 0)) { 23459 *dki_media_type = DK_JAZ; 23460 } 23461 } 23462 } else { 23463 /* 23464 * Not a CD, direct access or optical disk so return 23465 * unknown media 23466 */ 23467 *dki_media_type = DK_UNKNOWN; 23468 } 23469 } 23470 23471 /* 23472 * Now read the capacity so we can provide the lbasize, 23473 * pbsize and capacity. 23474 */ 23475 if (dki_pbsize && un->un_f_descr_format_supported) { 23476 rval = sd_send_scsi_READ_CAPACITY_16(ssc, &capacity, &lbasize, 23477 &pbsize, SD_PATH_DIRECT); 23478 23479 /* 23480 * Override the physical blocksize if the instance already 23481 * has a larger value. 23482 */ 23483 pbsize = MAX(pbsize, un->un_phy_blocksize); 23484 } 23485 23486 if (dki_pbsize == NULL || rval != 0 || 23487 !un->un_f_descr_format_supported) { 23488 rval = sd_send_scsi_READ_CAPACITY(ssc, &capacity, &lbasize, 23489 SD_PATH_DIRECT); 23490 23491 switch (rval) { 23492 case 0: 23493 if (un->un_f_enable_rmw && 23494 un->un_phy_blocksize != 0) { 23495 pbsize = un->un_phy_blocksize; 23496 } else { 23497 pbsize = lbasize; 23498 } 23499 media_capacity = capacity; 23500 23501 /* 23502 * sd_send_scsi_READ_CAPACITY() reports capacity in 23503 * un->un_sys_blocksize chunks. So we need to convert 23504 * it into cap.lbsize chunks. 23505 */ 23506 if (un->un_f_has_removable_media) { 23507 media_capacity *= un->un_sys_blocksize; 23508 media_capacity /= lbasize; 23509 } 23510 break; 23511 case EACCES: 23512 rval = EACCES; 23513 goto done; 23514 default: 23515 rval = EIO; 23516 goto done; 23517 } 23518 } else { 23519 if (un->un_f_enable_rmw && 23520 !ISP2(pbsize % DEV_BSIZE)) { 23521 pbsize = SSD_SECSIZE; 23522 } else if (!ISP2(lbasize % DEV_BSIZE) || 23523 !ISP2(pbsize % DEV_BSIZE)) { 23524 pbsize = lbasize = DEV_BSIZE; 23525 } 23526 media_capacity = capacity; 23527 } 23528 23529 /* 23530 * If lun is expanded dynamically, update the un structure. 23531 */ 23532 mutex_enter(SD_MUTEX(un)); 23533 if ((un->un_f_blockcount_is_valid == TRUE) && 23534 (un->un_f_tgt_blocksize_is_valid == TRUE) && 23535 (capacity > un->un_blockcount)) { 23536 un->un_f_expnevent = B_FALSE; 23537 sd_update_block_info(un, lbasize, capacity); 23538 } 23539 mutex_exit(SD_MUTEX(un)); 23540 23541 *dki_lbsize = lbasize; 23542 *dki_capacity = media_capacity; 23543 if (dki_pbsize) 23544 *dki_pbsize = pbsize; 23545 23546 done: 23547 if (rval != 0) { 23548 if (rval == EIO) 23549 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 23550 else 23551 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 23552 } 23553 no_assessment: 23554 sd_ssc_fini(ssc); 23555 kmem_free(out_data, SD_PROFILE_HEADER_LEN); 23556 kmem_free(rqbuf, SENSE_LENGTH); 23557 return (rval); 23558 } 23559 23560 /* 23561 * Function: sd_get_media_info 23562 * 23563 * Description: This routine is the driver entry point for handling ioctl 23564 * requests for the media type or command set profile used by the 23565 * drive to operate on the media (DKIOCGMEDIAINFO). 23566 * 23567 * Arguments: dev - the device number 23568 * arg - pointer to user provided dk_minfo structure 23569 * specifying the media type, logical block size and 23570 * drive capacity. 23571 * flag - this argument is a pass through to ddi_copyxxx() 23572 * directly from the mode argument of ioctl(). 23573 * 23574 * Return Code: returns the value from sd_get_media_info_com 23575 */ 23576 static int 23577 sd_get_media_info(dev_t dev, caddr_t arg, int flag) 23578 { 23579 struct dk_minfo mi; 23580 int rval; 23581 23582 rval = sd_get_media_info_com(dev, &mi.dki_media_type, 23583 &mi.dki_lbsize, &mi.dki_capacity, NULL); 23584 23585 if (rval) 23586 return (rval); 23587 if (ddi_copyout(&mi, arg, sizeof (struct dk_minfo), flag)) 23588 rval = EFAULT; 23589 return (rval); 23590 } 23591 23592 /* 23593 * Function: sd_get_media_info_ext 23594 * 23595 * Description: This routine is the driver entry point for handling ioctl 23596 * requests for the media type or command set profile used by the 23597 * drive to operate on the media (DKIOCGMEDIAINFOEXT). The 23598 * difference this ioctl and DKIOCGMEDIAINFO is the return value 23599 * of this ioctl contains both logical block size and physical 23600 * block size. 23601 * 23602 * 23603 * Arguments: dev - the device number 23604 * arg - pointer to user provided dk_minfo_ext structure 23605 * specifying the media type, logical block size, 23606 * physical block size and disk capacity. 23607 * flag - this argument is a pass through to ddi_copyxxx() 23608 * directly from the mode argument of ioctl(). 23609 * 23610 * Return Code: returns the value from sd_get_media_info_com 23611 */ 23612 static int 23613 sd_get_media_info_ext(dev_t dev, caddr_t arg, int flag) 23614 { 23615 struct dk_minfo_ext mie; 23616 int rval = 0; 23617 23618 rval = sd_get_media_info_com(dev, &mie.dki_media_type, 23619 &mie.dki_lbsize, &mie.dki_capacity, &mie.dki_pbsize); 23620 23621 if (rval) 23622 return (rval); 23623 if (ddi_copyout(&mie, arg, sizeof (struct dk_minfo_ext), flag)) 23624 rval = EFAULT; 23625 return (rval); 23626 23627 } 23628 23629 /* 23630 * Function: sd_watch_request_submit 23631 * 23632 * Description: Call scsi_watch_request_submit or scsi_mmc_watch_request_submit 23633 * depending on which is supported by device. 23634 */ 23635 static opaque_t 23636 sd_watch_request_submit(struct sd_lun *un) 23637 { 23638 dev_t dev; 23639 23640 /* All submissions are unified to use same device number */ 23641 dev = sd_make_device(SD_DEVINFO(un)); 23642 23643 if (un->un_f_mmc_cap && un->un_f_mmc_gesn_polling) { 23644 return (scsi_mmc_watch_request_submit(SD_SCSI_DEVP(un), 23645 sd_check_media_time, SENSE_LENGTH, sd_media_watch_cb, 23646 (caddr_t)dev)); 23647 } else { 23648 return (scsi_watch_request_submit(SD_SCSI_DEVP(un), 23649 sd_check_media_time, SENSE_LENGTH, sd_media_watch_cb, 23650 (caddr_t)dev)); 23651 } 23652 } 23653 23654 23655 /* 23656 * Function: sd_check_media 23657 * 23658 * Description: This utility routine implements the functionality for the 23659 * DKIOCSTATE ioctl. This ioctl blocks the user thread until the 23660 * driver state changes from that specified by the user 23661 * (inserted or ejected). For example, if the user specifies 23662 * DKIO_EJECTED and the current media state is inserted this 23663 * routine will immediately return DKIO_INSERTED. However, if the 23664 * current media state is not inserted the user thread will be 23665 * blocked until the drive state changes. If DKIO_NONE is specified 23666 * the user thread will block until a drive state change occurs. 23667 * 23668 * Arguments: dev - the device number 23669 * state - user pointer to a dkio_state, updated with the current 23670 * drive state at return. 23671 * 23672 * Return Code: ENXIO 23673 * EIO 23674 * EAGAIN 23675 * EINTR 23676 */ 23677 23678 static int 23679 sd_check_media(dev_t dev, enum dkio_state state) 23680 { 23681 struct sd_lun *un = NULL; 23682 enum dkio_state prev_state; 23683 opaque_t token = NULL; 23684 int rval = 0; 23685 sd_ssc_t *ssc; 23686 23687 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 23688 return (ENXIO); 23689 } 23690 23691 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: entry\n"); 23692 23693 ssc = sd_ssc_init(un); 23694 23695 mutex_enter(SD_MUTEX(un)); 23696 23697 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: " 23698 "state=%x, mediastate=%x\n", state, un->un_mediastate); 23699 23700 prev_state = un->un_mediastate; 23701 23702 /* is there anything to do? */ 23703 if (state == un->un_mediastate || un->un_mediastate == DKIO_NONE) { 23704 /* 23705 * submit the request to the scsi_watch service; 23706 * scsi_media_watch_cb() does the real work 23707 */ 23708 mutex_exit(SD_MUTEX(un)); 23709 23710 /* 23711 * This change handles the case where a scsi watch request is 23712 * added to a device that is powered down. To accomplish this 23713 * we power up the device before adding the scsi watch request, 23714 * since the scsi watch sends a TUR directly to the device 23715 * which the device cannot handle if it is powered down. 23716 */ 23717 if (sd_pm_entry(un) != DDI_SUCCESS) { 23718 mutex_enter(SD_MUTEX(un)); 23719 goto done; 23720 } 23721 23722 token = sd_watch_request_submit(un); 23723 23724 sd_pm_exit(un); 23725 23726 mutex_enter(SD_MUTEX(un)); 23727 if (token == NULL) { 23728 rval = EAGAIN; 23729 goto done; 23730 } 23731 23732 /* 23733 * This is a special case IOCTL that doesn't return 23734 * until the media state changes. Routine sdpower 23735 * knows about and handles this so don't count it 23736 * as an active cmd in the driver, which would 23737 * keep the device busy to the pm framework. 23738 * If the count isn't decremented the device can't 23739 * be powered down. 23740 */ 23741 un->un_ncmds_in_driver--; 23742 ASSERT(un->un_ncmds_in_driver >= 0); 23743 23744 /* 23745 * if a prior request had been made, this will be the same 23746 * token, as scsi_watch was designed that way. 23747 */ 23748 un->un_swr_token = token; 23749 un->un_specified_mediastate = state; 23750 23751 /* 23752 * now wait for media change 23753 * we will not be signalled unless mediastate == state but it is 23754 * still better to test for this condition, since there is a 23755 * 2 sec cv_broadcast delay when mediastate == DKIO_INSERTED 23756 */ 23757 SD_TRACE(SD_LOG_COMMON, un, 23758 "sd_check_media: waiting for media state change\n"); 23759 while (un->un_mediastate == state) { 23760 if (cv_wait_sig(&un->un_state_cv, SD_MUTEX(un)) == 0) { 23761 SD_TRACE(SD_LOG_COMMON, un, 23762 "sd_check_media: waiting for media state " 23763 "was interrupted\n"); 23764 un->un_ncmds_in_driver++; 23765 rval = EINTR; 23766 goto done; 23767 } 23768 SD_TRACE(SD_LOG_COMMON, un, 23769 "sd_check_media: received signal, state=%x\n", 23770 un->un_mediastate); 23771 } 23772 /* 23773 * Inc the counter to indicate the device once again 23774 * has an active outstanding cmd. 23775 */ 23776 un->un_ncmds_in_driver++; 23777 } 23778 23779 /* invalidate geometry */ 23780 if (prev_state == DKIO_INSERTED && un->un_mediastate == DKIO_EJECTED) { 23781 sr_ejected(un); 23782 } 23783 23784 if (un->un_mediastate == DKIO_INSERTED && prev_state != DKIO_INSERTED) { 23785 uint64_t capacity; 23786 uint_t lbasize; 23787 23788 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: media inserted\n"); 23789 mutex_exit(SD_MUTEX(un)); 23790 /* 23791 * Since the following routines use SD_PATH_DIRECT, we must 23792 * call PM directly before the upcoming disk accesses. This 23793 * may cause the disk to be power/spin up. 23794 */ 23795 23796 if (sd_pm_entry(un) == DDI_SUCCESS) { 23797 rval = sd_send_scsi_READ_CAPACITY(ssc, 23798 &capacity, &lbasize, SD_PATH_DIRECT); 23799 if (rval != 0) { 23800 sd_pm_exit(un); 23801 if (rval == EIO) 23802 sd_ssc_assessment(ssc, 23803 SD_FMT_STATUS_CHECK); 23804 else 23805 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 23806 mutex_enter(SD_MUTEX(un)); 23807 goto done; 23808 } 23809 } else { 23810 rval = EIO; 23811 mutex_enter(SD_MUTEX(un)); 23812 goto done; 23813 } 23814 mutex_enter(SD_MUTEX(un)); 23815 23816 sd_update_block_info(un, lbasize, capacity); 23817 23818 /* 23819 * Check if the media in the device is writable or not 23820 */ 23821 if (ISCD(un)) { 23822 sd_check_for_writable_cd(ssc, SD_PATH_DIRECT); 23823 } 23824 23825 mutex_exit(SD_MUTEX(un)); 23826 cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT); 23827 if ((cmlb_validate(un->un_cmlbhandle, 0, 23828 (void *)SD_PATH_DIRECT) == 0) && un->un_f_pkstats_enabled) { 23829 sd_set_pstats(un); 23830 SD_TRACE(SD_LOG_IO_PARTITION, un, 23831 "sd_check_media: un:0x%p pstats created and " 23832 "set\n", un); 23833 } 23834 23835 rval = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT, 23836 SD_PATH_DIRECT); 23837 23838 sd_pm_exit(un); 23839 23840 if (rval != 0) { 23841 if (rval == EIO) 23842 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 23843 else 23844 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 23845 } 23846 23847 mutex_enter(SD_MUTEX(un)); 23848 } 23849 done: 23850 sd_ssc_fini(ssc); 23851 un->un_f_watcht_stopped = FALSE; 23852 if (token != NULL && un->un_swr_token != NULL) { 23853 /* 23854 * Use of this local token and the mutex ensures that we avoid 23855 * some race conditions associated with terminating the 23856 * scsi watch. 23857 */ 23858 token = un->un_swr_token; 23859 mutex_exit(SD_MUTEX(un)); 23860 (void) scsi_watch_request_terminate(token, 23861 SCSI_WATCH_TERMINATE_WAIT); 23862 if (scsi_watch_get_ref_count(token) == 0) { 23863 mutex_enter(SD_MUTEX(un)); 23864 un->un_swr_token = (opaque_t)NULL; 23865 } else { 23866 mutex_enter(SD_MUTEX(un)); 23867 } 23868 } 23869 23870 /* 23871 * Update the capacity kstat value, if no media previously 23872 * (capacity kstat is 0) and a media has been inserted 23873 * (un_f_blockcount_is_valid == TRUE) 23874 */ 23875 if (un->un_errstats) { 23876 struct sd_errstats *stp = NULL; 23877 23878 stp = (struct sd_errstats *)un->un_errstats->ks_data; 23879 if ((stp->sd_capacity.value.ui64 == 0) && 23880 (un->un_f_blockcount_is_valid == TRUE)) { 23881 stp->sd_capacity.value.ui64 = 23882 (uint64_t)((uint64_t)un->un_blockcount * 23883 un->un_sys_blocksize); 23884 } 23885 } 23886 mutex_exit(SD_MUTEX(un)); 23887 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: done\n"); 23888 return (rval); 23889 } 23890 23891 23892 /* 23893 * Function: sd_delayed_cv_broadcast 23894 * 23895 * Description: Delayed cv_broadcast to allow for target to recover from media 23896 * insertion. 23897 * 23898 * Arguments: arg - driver soft state (unit) structure 23899 */ 23900 23901 static void 23902 sd_delayed_cv_broadcast(void *arg) 23903 { 23904 struct sd_lun *un = arg; 23905 23906 SD_TRACE(SD_LOG_COMMON, un, "sd_delayed_cv_broadcast\n"); 23907 23908 mutex_enter(SD_MUTEX(un)); 23909 un->un_dcvb_timeid = NULL; 23910 cv_broadcast(&un->un_state_cv); 23911 mutex_exit(SD_MUTEX(un)); 23912 } 23913 23914 23915 /* 23916 * Function: sd_media_watch_cb 23917 * 23918 * Description: Callback routine used for support of the DKIOCSTATE ioctl. This 23919 * routine processes the TUR sense data and updates the driver 23920 * state if a transition has occurred. The user thread 23921 * (sd_check_media) is then signalled. 23922 * 23923 * Arguments: arg - the device 'dev_t' is used for context to discriminate 23924 * among multiple watches that share this callback function 23925 * resultp - scsi watch facility result packet containing scsi 23926 * packet, status byte and sense data 23927 * 23928 * Return Code: 0 for success, -1 for failure 23929 */ 23930 23931 static int 23932 sd_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp) 23933 { 23934 struct sd_lun *un; 23935 struct scsi_status *statusp = resultp->statusp; 23936 uint8_t *sensep = (uint8_t *)resultp->sensep; 23937 enum dkio_state state = DKIO_NONE; 23938 dev_t dev = (dev_t)arg; 23939 uchar_t actual_sense_length; 23940 uint8_t skey, asc, ascq; 23941 23942 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 23943 return (-1); 23944 } 23945 actual_sense_length = resultp->actual_sense_length; 23946 23947 mutex_enter(SD_MUTEX(un)); 23948 SD_TRACE(SD_LOG_COMMON, un, 23949 "sd_media_watch_cb: status=%x, sensep=%p, len=%x\n", 23950 *((char *)statusp), (void *)sensep, actual_sense_length); 23951 23952 if (resultp->pkt->pkt_reason == CMD_DEV_GONE) { 23953 un->un_mediastate = DKIO_DEV_GONE; 23954 cv_broadcast(&un->un_state_cv); 23955 mutex_exit(SD_MUTEX(un)); 23956 23957 return (0); 23958 } 23959 23960 if (un->un_f_mmc_cap && un->un_f_mmc_gesn_polling) { 23961 if (sd_gesn_media_data_valid(resultp->mmc_data)) { 23962 if ((resultp->mmc_data[5] & 23963 SD_GESN_MEDIA_EVENT_STATUS_PRESENT) != 0) { 23964 state = DKIO_INSERTED; 23965 } else { 23966 state = DKIO_EJECTED; 23967 } 23968 if ((resultp->mmc_data[4] & SD_GESN_MEDIA_EVENT_CODE) == 23969 SD_GESN_MEDIA_EVENT_EJECTREQUEST) { 23970 sd_log_eject_request_event(un, KM_NOSLEEP); 23971 } 23972 } 23973 } else if (sensep != NULL) { 23974 /* 23975 * If there was a check condition then sensep points to valid 23976 * sense data. If status was not a check condition but a 23977 * reservation or busy status then the new state is DKIO_NONE. 23978 */ 23979 skey = scsi_sense_key(sensep); 23980 asc = scsi_sense_asc(sensep); 23981 ascq = scsi_sense_ascq(sensep); 23982 23983 SD_INFO(SD_LOG_COMMON, un, 23984 "sd_media_watch_cb: sense KEY=%x, ASC=%x, ASCQ=%x\n", 23985 skey, asc, ascq); 23986 /* This routine only uses up to 13 bytes of sense data. */ 23987 if (actual_sense_length >= 13) { 23988 if (skey == KEY_UNIT_ATTENTION) { 23989 if (asc == 0x28) { 23990 state = DKIO_INSERTED; 23991 } 23992 } else if (skey == KEY_NOT_READY) { 23993 /* 23994 * Sense data of 02/06/00 means that the 23995 * drive could not read the media (No 23996 * reference position found). In this case 23997 * to prevent a hang on the DKIOCSTATE IOCTL 23998 * we set the media state to DKIO_INSERTED. 23999 */ 24000 if (asc == 0x06 && ascq == 0x00) 24001 state = DKIO_INSERTED; 24002 24003 /* 24004 * if 02/04/02 means that the host 24005 * should send start command. Explicitly 24006 * leave the media state as is 24007 * (inserted) as the media is inserted 24008 * and host has stopped device for PM 24009 * reasons. Upon next true read/write 24010 * to this media will bring the 24011 * device to the right state good for 24012 * media access. 24013 */ 24014 if (asc == 0x3a) { 24015 state = DKIO_EJECTED; 24016 } else { 24017 /* 24018 * If the drive is busy with an 24019 * operation or long write, keep the 24020 * media in an inserted state. 24021 */ 24022 24023 if ((asc == 0x04) && 24024 ((ascq == 0x02) || 24025 (ascq == 0x07) || 24026 (ascq == 0x08))) { 24027 state = DKIO_INSERTED; 24028 } 24029 } 24030 } else if (skey == KEY_NO_SENSE) { 24031 if ((asc == 0x00) && (ascq == 0x00)) { 24032 /* 24033 * Sense Data 00/00/00 does not provide 24034 * any information about the state of 24035 * the media. Ignore it. 24036 */ 24037 mutex_exit(SD_MUTEX(un)); 24038 return (0); 24039 } 24040 } 24041 } 24042 } else if ((*((char *)statusp) == STATUS_GOOD) && 24043 (resultp->pkt->pkt_reason == CMD_CMPLT)) { 24044 state = DKIO_INSERTED; 24045 } 24046 24047 SD_TRACE(SD_LOG_COMMON, un, 24048 "sd_media_watch_cb: state=%x, specified=%x\n", 24049 state, un->un_specified_mediastate); 24050 24051 /* 24052 * now signal the waiting thread if this is *not* the specified state; 24053 * delay the signal if the state is DKIO_INSERTED to allow the target 24054 * to recover 24055 */ 24056 if (state != un->un_specified_mediastate) { 24057 un->un_mediastate = state; 24058 if (state == DKIO_INSERTED) { 24059 /* 24060 * delay the signal to give the drive a chance 24061 * to do what it apparently needs to do 24062 */ 24063 SD_TRACE(SD_LOG_COMMON, un, 24064 "sd_media_watch_cb: delayed cv_broadcast\n"); 24065 if (un->un_dcvb_timeid == NULL) { 24066 un->un_dcvb_timeid = 24067 timeout(sd_delayed_cv_broadcast, un, 24068 drv_usectohz((clock_t)MEDIA_ACCESS_DELAY)); 24069 } 24070 } else { 24071 SD_TRACE(SD_LOG_COMMON, un, 24072 "sd_media_watch_cb: immediate cv_broadcast\n"); 24073 cv_broadcast(&un->un_state_cv); 24074 } 24075 } 24076 mutex_exit(SD_MUTEX(un)); 24077 return (0); 24078 } 24079 24080 24081 /* 24082 * Function: sd_dkio_get_temp 24083 * 24084 * Description: This routine is the driver entry point for handling ioctl 24085 * requests to get the disk temperature. 24086 * 24087 * Arguments: dev - the device number 24088 * arg - pointer to user provided dk_temperature structure. 24089 * flag - this argument is a pass through to ddi_copyxxx() 24090 * directly from the mode argument of ioctl(). 24091 * 24092 * Return Code: 0 24093 * EFAULT 24094 * ENXIO 24095 * EAGAIN 24096 */ 24097 24098 static int 24099 sd_dkio_get_temp(dev_t dev, caddr_t arg, int flag) 24100 { 24101 struct sd_lun *un = NULL; 24102 struct dk_temperature *dktemp = NULL; 24103 uchar_t *temperature_page; 24104 int rval = 0; 24105 int path_flag = SD_PATH_STANDARD; 24106 sd_ssc_t *ssc; 24107 24108 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24109 return (ENXIO); 24110 } 24111 24112 ssc = sd_ssc_init(un); 24113 dktemp = kmem_zalloc(sizeof (struct dk_temperature), KM_SLEEP); 24114 24115 /* copyin the disk temp argument to get the user flags */ 24116 if (ddi_copyin((void *)arg, dktemp, 24117 sizeof (struct dk_temperature), flag) != 0) { 24118 rval = EFAULT; 24119 goto done; 24120 } 24121 24122 /* Initialize the temperature to invalid. */ 24123 dktemp->dkt_cur_temp = (short)DKT_INVALID_TEMP; 24124 dktemp->dkt_ref_temp = (short)DKT_INVALID_TEMP; 24125 24126 /* 24127 * Note: Investigate removing the "bypass pm" semantic. 24128 * Can we just bypass PM always? 24129 */ 24130 if (dktemp->dkt_flags & DKT_BYPASS_PM) { 24131 path_flag = SD_PATH_DIRECT; 24132 ASSERT(!mutex_owned(&un->un_pm_mutex)); 24133 mutex_enter(&un->un_pm_mutex); 24134 if (SD_DEVICE_IS_IN_LOW_POWER(un)) { 24135 /* 24136 * If DKT_BYPASS_PM is set, and the drive happens to be 24137 * in low power mode, we can not wake it up, Need to 24138 * return EAGAIN. 24139 */ 24140 mutex_exit(&un->un_pm_mutex); 24141 rval = EAGAIN; 24142 goto done; 24143 } else { 24144 /* 24145 * Indicate to PM the device is busy. This is required 24146 * to avoid a race - i.e. the ioctl is issuing a 24147 * command and the pm framework brings down the device 24148 * to low power mode (possible power cut-off on some 24149 * platforms). 24150 */ 24151 mutex_exit(&un->un_pm_mutex); 24152 if (sd_pm_entry(un) != DDI_SUCCESS) { 24153 rval = EAGAIN; 24154 goto done; 24155 } 24156 } 24157 } 24158 24159 temperature_page = kmem_zalloc(TEMPERATURE_PAGE_SIZE, KM_SLEEP); 24160 24161 rval = sd_send_scsi_LOG_SENSE(ssc, temperature_page, 24162 TEMPERATURE_PAGE_SIZE, TEMPERATURE_PAGE, 1, 0, path_flag); 24163 if (rval != 0) 24164 goto done2; 24165 24166 /* 24167 * For the current temperature verify that the parameter length is 0x02 24168 * and the parameter code is 0x00 24169 */ 24170 if ((temperature_page[7] == 0x02) && (temperature_page[4] == 0x00) && 24171 (temperature_page[5] == 0x00)) { 24172 if (temperature_page[9] == 0xFF) { 24173 dktemp->dkt_cur_temp = (short)DKT_INVALID_TEMP; 24174 } else { 24175 dktemp->dkt_cur_temp = (short)(temperature_page[9]); 24176 } 24177 } 24178 24179 /* 24180 * For the reference temperature verify that the parameter 24181 * length is 0x02 and the parameter code is 0x01 24182 */ 24183 if ((temperature_page[13] == 0x02) && (temperature_page[10] == 0x00) && 24184 (temperature_page[11] == 0x01)) { 24185 if (temperature_page[15] == 0xFF) { 24186 dktemp->dkt_ref_temp = (short)DKT_INVALID_TEMP; 24187 } else { 24188 dktemp->dkt_ref_temp = (short)(temperature_page[15]); 24189 } 24190 } 24191 24192 /* Do the copyout regardless of the temperature commands status. */ 24193 if (ddi_copyout(dktemp, (void *)arg, sizeof (struct dk_temperature), 24194 flag) != 0) { 24195 rval = EFAULT; 24196 goto done1; 24197 } 24198 24199 done2: 24200 if (rval != 0) { 24201 if (rval == EIO) 24202 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 24203 else 24204 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 24205 } 24206 done1: 24207 if (path_flag == SD_PATH_DIRECT) { 24208 sd_pm_exit(un); 24209 } 24210 24211 kmem_free(temperature_page, TEMPERATURE_PAGE_SIZE); 24212 done: 24213 sd_ssc_fini(ssc); 24214 if (dktemp != NULL) { 24215 kmem_free(dktemp, sizeof (struct dk_temperature)); 24216 } 24217 24218 return (rval); 24219 } 24220 24221 24222 /* 24223 * Function: sd_log_page_supported 24224 * 24225 * Description: This routine uses sd_send_scsi_LOG_SENSE to find the list of 24226 * supported log pages. 24227 * 24228 * Arguments: ssc - ssc contains pointer to driver soft state (unit) 24229 * structure for this target. 24230 * log_page - 24231 * 24232 * Return Code: -1 - on error (log sense is optional and may not be supported). 24233 * 0 - log page not found. 24234 * 1 - log page found. 24235 */ 24236 24237 static int 24238 sd_log_page_supported(sd_ssc_t *ssc, int log_page) 24239 { 24240 uchar_t *log_page_data; 24241 int i; 24242 int match = 0; 24243 int log_size; 24244 int status = 0; 24245 struct sd_lun *un; 24246 24247 ASSERT(ssc != NULL); 24248 un = ssc->ssc_un; 24249 ASSERT(un != NULL); 24250 24251 log_page_data = kmem_zalloc(0xFF, KM_SLEEP); 24252 24253 status = sd_send_scsi_LOG_SENSE(ssc, log_page_data, 0xFF, 0, 0x01, 0, 24254 SD_PATH_DIRECT); 24255 24256 if (status != 0) { 24257 if (status == EIO) { 24258 /* 24259 * Some disks do not support log sense, we 24260 * should ignore this kind of error(sense key is 24261 * 0x5 - illegal request). 24262 */ 24263 uint8_t *sensep; 24264 int senlen; 24265 24266 sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf; 24267 senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen - 24268 ssc->ssc_uscsi_cmd->uscsi_rqresid); 24269 24270 if (senlen > 0 && 24271 scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) { 24272 sd_ssc_assessment(ssc, 24273 SD_FMT_IGNORE_COMPROMISE); 24274 } else { 24275 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 24276 } 24277 } else { 24278 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 24279 } 24280 24281 SD_ERROR(SD_LOG_COMMON, un, 24282 "sd_log_page_supported: failed log page retrieval\n"); 24283 kmem_free(log_page_data, 0xFF); 24284 return (-1); 24285 } 24286 24287 log_size = log_page_data[3]; 24288 24289 /* 24290 * The list of supported log pages start from the fourth byte. Check 24291 * until we run out of log pages or a match is found. 24292 */ 24293 for (i = 4; (i < (log_size + 4)) && !match; i++) { 24294 if (log_page_data[i] == log_page) { 24295 match++; 24296 } 24297 } 24298 kmem_free(log_page_data, 0xFF); 24299 return (match); 24300 } 24301 24302 24303 /* 24304 * Function: sd_mhdioc_failfast 24305 * 24306 * Description: This routine is the driver entry point for handling ioctl 24307 * requests to enable/disable the multihost failfast option. 24308 * (MHIOCENFAILFAST) 24309 * 24310 * Arguments: dev - the device number 24311 * arg - user specified probing interval. 24312 * flag - this argument is a pass through to ddi_copyxxx() 24313 * directly from the mode argument of ioctl(). 24314 * 24315 * Return Code: 0 24316 * EFAULT 24317 * ENXIO 24318 */ 24319 24320 static int 24321 sd_mhdioc_failfast(dev_t dev, caddr_t arg, int flag) 24322 { 24323 struct sd_lun *un = NULL; 24324 int mh_time; 24325 int rval = 0; 24326 24327 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24328 return (ENXIO); 24329 } 24330 24331 if (ddi_copyin((void *)arg, &mh_time, sizeof (int), flag)) 24332 return (EFAULT); 24333 24334 if (mh_time) { 24335 mutex_enter(SD_MUTEX(un)); 24336 un->un_resvd_status |= SD_FAILFAST; 24337 mutex_exit(SD_MUTEX(un)); 24338 /* 24339 * If mh_time is INT_MAX, then this ioctl is being used for 24340 * SCSI-3 PGR purposes, and we don't need to spawn watch thread. 24341 */ 24342 if (mh_time != INT_MAX) { 24343 rval = sd_check_mhd(dev, mh_time); 24344 } 24345 } else { 24346 (void) sd_check_mhd(dev, 0); 24347 mutex_enter(SD_MUTEX(un)); 24348 un->un_resvd_status &= ~SD_FAILFAST; 24349 mutex_exit(SD_MUTEX(un)); 24350 } 24351 return (rval); 24352 } 24353 24354 24355 /* 24356 * Function: sd_mhdioc_takeown 24357 * 24358 * Description: This routine is the driver entry point for handling ioctl 24359 * requests to forcefully acquire exclusive access rights to the 24360 * multihost disk (MHIOCTKOWN). 24361 * 24362 * Arguments: dev - the device number 24363 * arg - user provided structure specifying the delay 24364 * parameters in milliseconds 24365 * flag - this argument is a pass through to ddi_copyxxx() 24366 * directly from the mode argument of ioctl(). 24367 * 24368 * Return Code: 0 24369 * EFAULT 24370 * ENXIO 24371 */ 24372 24373 static int 24374 sd_mhdioc_takeown(dev_t dev, caddr_t arg, int flag) 24375 { 24376 struct sd_lun *un = NULL; 24377 struct mhioctkown *tkown = NULL; 24378 int rval = 0; 24379 24380 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24381 return (ENXIO); 24382 } 24383 24384 if (arg != NULL) { 24385 tkown = (struct mhioctkown *) 24386 kmem_zalloc(sizeof (struct mhioctkown), KM_SLEEP); 24387 rval = ddi_copyin(arg, tkown, sizeof (struct mhioctkown), flag); 24388 if (rval != 0) { 24389 rval = EFAULT; 24390 goto error; 24391 } 24392 } 24393 24394 rval = sd_take_ownership(dev, tkown); 24395 mutex_enter(SD_MUTEX(un)); 24396 if (rval == 0) { 24397 un->un_resvd_status |= SD_RESERVE; 24398 if (tkown != NULL && tkown->reinstate_resv_delay != 0) { 24399 sd_reinstate_resv_delay = 24400 tkown->reinstate_resv_delay * 1000; 24401 } else { 24402 sd_reinstate_resv_delay = SD_REINSTATE_RESV_DELAY; 24403 } 24404 /* 24405 * Give the scsi_watch routine interval set by 24406 * the MHIOCENFAILFAST ioctl precedence here. 24407 */ 24408 if ((un->un_resvd_status & SD_FAILFAST) == 0) { 24409 mutex_exit(SD_MUTEX(un)); 24410 (void) sd_check_mhd(dev, sd_reinstate_resv_delay/1000); 24411 SD_TRACE(SD_LOG_IOCTL_MHD, un, 24412 "sd_mhdioc_takeown : %d\n", 24413 sd_reinstate_resv_delay); 24414 } else { 24415 mutex_exit(SD_MUTEX(un)); 24416 } 24417 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_NOTIFY, 24418 sd_mhd_reset_notify_cb, (caddr_t)un); 24419 } else { 24420 un->un_resvd_status &= ~SD_RESERVE; 24421 mutex_exit(SD_MUTEX(un)); 24422 } 24423 24424 error: 24425 if (tkown != NULL) { 24426 kmem_free(tkown, sizeof (struct mhioctkown)); 24427 } 24428 return (rval); 24429 } 24430 24431 24432 /* 24433 * Function: sd_mhdioc_release 24434 * 24435 * Description: This routine is the driver entry point for handling ioctl 24436 * requests to release exclusive access rights to the multihost 24437 * disk (MHIOCRELEASE). 24438 * 24439 * Arguments: dev - the device number 24440 * 24441 * Return Code: 0 24442 * ENXIO 24443 */ 24444 24445 static int 24446 sd_mhdioc_release(dev_t dev) 24447 { 24448 struct sd_lun *un = NULL; 24449 timeout_id_t resvd_timeid_save; 24450 int resvd_status_save; 24451 int rval = 0; 24452 24453 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24454 return (ENXIO); 24455 } 24456 24457 mutex_enter(SD_MUTEX(un)); 24458 resvd_status_save = un->un_resvd_status; 24459 un->un_resvd_status &= 24460 ~(SD_RESERVE | SD_LOST_RESERVE | SD_WANT_RESERVE); 24461 if (un->un_resvd_timeid) { 24462 resvd_timeid_save = un->un_resvd_timeid; 24463 un->un_resvd_timeid = NULL; 24464 mutex_exit(SD_MUTEX(un)); 24465 (void) untimeout(resvd_timeid_save); 24466 } else { 24467 mutex_exit(SD_MUTEX(un)); 24468 } 24469 24470 /* 24471 * destroy any pending timeout thread that may be attempting to 24472 * reinstate reservation on this device. 24473 */ 24474 sd_rmv_resv_reclaim_req(dev); 24475 24476 if ((rval = sd_reserve_release(dev, SD_RELEASE)) == 0) { 24477 mutex_enter(SD_MUTEX(un)); 24478 if ((un->un_mhd_token) && 24479 ((un->un_resvd_status & SD_FAILFAST) == 0)) { 24480 mutex_exit(SD_MUTEX(un)); 24481 (void) sd_check_mhd(dev, 0); 24482 } else { 24483 mutex_exit(SD_MUTEX(un)); 24484 } 24485 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_CANCEL, 24486 sd_mhd_reset_notify_cb, (caddr_t)un); 24487 } else { 24488 /* 24489 * sd_mhd_watch_cb will restart the resvd recover timeout thread 24490 */ 24491 mutex_enter(SD_MUTEX(un)); 24492 un->un_resvd_status = resvd_status_save; 24493 mutex_exit(SD_MUTEX(un)); 24494 } 24495 return (rval); 24496 } 24497 24498 24499 /* 24500 * Function: sd_mhdioc_register_devid 24501 * 24502 * Description: This routine is the driver entry point for handling ioctl 24503 * requests to register the device id (MHIOCREREGISTERDEVID). 24504 * 24505 * Note: The implementation for this ioctl has been updated to 24506 * be consistent with the original PSARC case (1999/357) 24507 * (4375899, 4241671, 4220005) 24508 * 24509 * Arguments: dev - the device number 24510 * 24511 * Return Code: 0 24512 * ENXIO 24513 */ 24514 24515 static int 24516 sd_mhdioc_register_devid(dev_t dev) 24517 { 24518 struct sd_lun *un = NULL; 24519 int rval = 0; 24520 sd_ssc_t *ssc; 24521 24522 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24523 return (ENXIO); 24524 } 24525 24526 ASSERT(!mutex_owned(SD_MUTEX(un))); 24527 24528 mutex_enter(SD_MUTEX(un)); 24529 24530 /* If a devid already exists, de-register it */ 24531 if (un->un_devid != NULL) { 24532 ddi_devid_unregister(SD_DEVINFO(un)); 24533 /* 24534 * After unregister devid, needs to free devid memory 24535 */ 24536 ddi_devid_free(un->un_devid); 24537 un->un_devid = NULL; 24538 } 24539 24540 /* Check for reservation conflict */ 24541 mutex_exit(SD_MUTEX(un)); 24542 ssc = sd_ssc_init(un); 24543 rval = sd_send_scsi_TEST_UNIT_READY(ssc, 0); 24544 mutex_enter(SD_MUTEX(un)); 24545 24546 switch (rval) { 24547 case 0: 24548 sd_register_devid(ssc, SD_DEVINFO(un), SD_TARGET_IS_UNRESERVED); 24549 break; 24550 case EACCES: 24551 break; 24552 default: 24553 rval = EIO; 24554 } 24555 24556 mutex_exit(SD_MUTEX(un)); 24557 if (rval != 0) { 24558 if (rval == EIO) 24559 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 24560 else 24561 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 24562 } 24563 sd_ssc_fini(ssc); 24564 return (rval); 24565 } 24566 24567 24568 /* 24569 * Function: sd_mhdioc_inkeys 24570 * 24571 * Description: This routine is the driver entry point for handling ioctl 24572 * requests to issue the SCSI-3 Persistent In Read Keys command 24573 * to the device (MHIOCGRP_INKEYS). 24574 * 24575 * Arguments: dev - the device number 24576 * arg - user provided in_keys structure 24577 * flag - this argument is a pass through to ddi_copyxxx() 24578 * directly from the mode argument of ioctl(). 24579 * 24580 * Return Code: code returned by sd_persistent_reservation_in_read_keys() 24581 * ENXIO 24582 * EFAULT 24583 */ 24584 24585 static int 24586 sd_mhdioc_inkeys(dev_t dev, caddr_t arg, int flag) 24587 { 24588 struct sd_lun *un; 24589 mhioc_inkeys_t inkeys; 24590 int rval = 0; 24591 24592 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24593 return (ENXIO); 24594 } 24595 24596 #ifdef _MULTI_DATAMODEL 24597 switch (ddi_model_convert_from(flag & FMODELS)) { 24598 case DDI_MODEL_ILP32: { 24599 struct mhioc_inkeys32 inkeys32; 24600 24601 if (ddi_copyin(arg, &inkeys32, 24602 sizeof (struct mhioc_inkeys32), flag) != 0) { 24603 return (EFAULT); 24604 } 24605 inkeys.li = (mhioc_key_list_t *)(uintptr_t)inkeys32.li; 24606 if ((rval = sd_persistent_reservation_in_read_keys(un, 24607 &inkeys, flag)) != 0) { 24608 return (rval); 24609 } 24610 inkeys32.generation = inkeys.generation; 24611 if (ddi_copyout(&inkeys32, arg, sizeof (struct mhioc_inkeys32), 24612 flag) != 0) { 24613 return (EFAULT); 24614 } 24615 break; 24616 } 24617 case DDI_MODEL_NONE: 24618 if (ddi_copyin(arg, &inkeys, sizeof (mhioc_inkeys_t), 24619 flag) != 0) { 24620 return (EFAULT); 24621 } 24622 if ((rval = sd_persistent_reservation_in_read_keys(un, 24623 &inkeys, flag)) != 0) { 24624 return (rval); 24625 } 24626 if (ddi_copyout(&inkeys, arg, sizeof (mhioc_inkeys_t), 24627 flag) != 0) { 24628 return (EFAULT); 24629 } 24630 break; 24631 } 24632 24633 #else /* ! _MULTI_DATAMODEL */ 24634 24635 if (ddi_copyin(arg, &inkeys, sizeof (mhioc_inkeys_t), flag) != 0) { 24636 return (EFAULT); 24637 } 24638 rval = sd_persistent_reservation_in_read_keys(un, &inkeys, flag); 24639 if (rval != 0) { 24640 return (rval); 24641 } 24642 if (ddi_copyout(&inkeys, arg, sizeof (mhioc_inkeys_t), flag) != 0) { 24643 return (EFAULT); 24644 } 24645 24646 #endif /* _MULTI_DATAMODEL */ 24647 24648 return (rval); 24649 } 24650 24651 24652 /* 24653 * Function: sd_mhdioc_inresv 24654 * 24655 * Description: This routine is the driver entry point for handling ioctl 24656 * requests to issue the SCSI-3 Persistent In Read Reservations 24657 * command to the device (MHIOCGRP_INKEYS). 24658 * 24659 * Arguments: dev - the device number 24660 * arg - user provided in_resv structure 24661 * flag - this argument is a pass through to ddi_copyxxx() 24662 * directly from the mode argument of ioctl(). 24663 * 24664 * Return Code: code returned by sd_persistent_reservation_in_read_resv() 24665 * ENXIO 24666 * EFAULT 24667 */ 24668 24669 static int 24670 sd_mhdioc_inresv(dev_t dev, caddr_t arg, int flag) 24671 { 24672 struct sd_lun *un; 24673 mhioc_inresvs_t inresvs; 24674 int rval = 0; 24675 24676 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24677 return (ENXIO); 24678 } 24679 24680 #ifdef _MULTI_DATAMODEL 24681 24682 switch (ddi_model_convert_from(flag & FMODELS)) { 24683 case DDI_MODEL_ILP32: { 24684 struct mhioc_inresvs32 inresvs32; 24685 24686 if (ddi_copyin(arg, &inresvs32, 24687 sizeof (struct mhioc_inresvs32), flag) != 0) { 24688 return (EFAULT); 24689 } 24690 inresvs.li = (mhioc_resv_desc_list_t *)(uintptr_t)inresvs32.li; 24691 if ((rval = sd_persistent_reservation_in_read_resv(un, 24692 &inresvs, flag)) != 0) { 24693 return (rval); 24694 } 24695 inresvs32.generation = inresvs.generation; 24696 if (ddi_copyout(&inresvs32, arg, 24697 sizeof (struct mhioc_inresvs32), flag) != 0) { 24698 return (EFAULT); 24699 } 24700 break; 24701 } 24702 case DDI_MODEL_NONE: 24703 if (ddi_copyin(arg, &inresvs, 24704 sizeof (mhioc_inresvs_t), flag) != 0) { 24705 return (EFAULT); 24706 } 24707 if ((rval = sd_persistent_reservation_in_read_resv(un, 24708 &inresvs, flag)) != 0) { 24709 return (rval); 24710 } 24711 if (ddi_copyout(&inresvs, arg, 24712 sizeof (mhioc_inresvs_t), flag) != 0) { 24713 return (EFAULT); 24714 } 24715 break; 24716 } 24717 24718 #else /* ! _MULTI_DATAMODEL */ 24719 24720 if (ddi_copyin(arg, &inresvs, sizeof (mhioc_inresvs_t), flag) != 0) { 24721 return (EFAULT); 24722 } 24723 rval = sd_persistent_reservation_in_read_resv(un, &inresvs, flag); 24724 if (rval != 0) { 24725 return (rval); 24726 } 24727 if (ddi_copyout(&inresvs, arg, sizeof (mhioc_inresvs_t), flag)) { 24728 return (EFAULT); 24729 } 24730 24731 #endif /* ! _MULTI_DATAMODEL */ 24732 24733 return (rval); 24734 } 24735 24736 24737 /* 24738 * The following routines support the clustering functionality described below 24739 * and implement lost reservation reclaim functionality. 24740 * 24741 * Clustering 24742 * ---------- 24743 * The clustering code uses two different, independent forms of SCSI 24744 * reservation. Traditional SCSI-2 Reserve/Release and the newer SCSI-3 24745 * Persistent Group Reservations. For any particular disk, it will use either 24746 * SCSI-2 or SCSI-3 PGR but never both at the same time for the same disk. 24747 * 24748 * SCSI-2 24749 * The cluster software takes ownership of a multi-hosted disk by issuing the 24750 * MHIOCTKOWN ioctl to the disk driver. It releases ownership by issuing the 24751 * MHIOCRELEASE ioctl. Closely related is the MHIOCENFAILFAST ioctl -- a 24752 * cluster, just after taking ownership of the disk with the MHIOCTKOWN ioctl 24753 * then issues the MHIOCENFAILFAST ioctl. This ioctl "enables failfast" in the 24754 * driver. The meaning of failfast is that if the driver (on this host) ever 24755 * encounters the scsi error return code RESERVATION_CONFLICT from the device, 24756 * it should immediately panic the host. The motivation for this ioctl is that 24757 * if this host does encounter reservation conflict, the underlying cause is 24758 * that some other host of the cluster has decided that this host is no longer 24759 * in the cluster and has seized control of the disks for itself. Since this 24760 * host is no longer in the cluster, it ought to panic itself. The 24761 * MHIOCENFAILFAST ioctl does two things: 24762 * (a) it sets a flag that will cause any returned RESERVATION_CONFLICT 24763 * error to panic the host 24764 * (b) it sets up a periodic timer to test whether this host still has 24765 * "access" (in that no other host has reserved the device): if the 24766 * periodic timer gets RESERVATION_CONFLICT, the host is panicked. The 24767 * purpose of that periodic timer is to handle scenarios where the host is 24768 * otherwise temporarily quiescent, temporarily doing no real i/o. 24769 * The MHIOCTKOWN ioctl will "break" a reservation that is held by another host, 24770 * by issuing a SCSI Bus Device Reset. It will then issue a SCSI Reserve for 24771 * the device itself. 24772 * 24773 * SCSI-3 PGR 24774 * A direct semantic implementation of the SCSI-3 Persistent Reservation 24775 * facility is supported through the shared multihost disk ioctls 24776 * (MHIOCGRP_INKEYS, MHIOCGRP_INRESV, MHIOCGRP_REGISTER, MHIOCGRP_RESERVE, 24777 * MHIOCGRP_PREEMPTANDABORT, MHIOCGRP_CLEAR) 24778 * 24779 * Reservation Reclaim: 24780 * -------------------- 24781 * To support the lost reservation reclaim operations this driver creates a 24782 * single thread to handle reinstating reservations on all devices that have 24783 * lost reservations sd_resv_reclaim_requests are logged for all devices that 24784 * have LOST RESERVATIONS when the scsi watch facility callsback sd_mhd_watch_cb 24785 * and the reservation reclaim thread loops through the requests to regain the 24786 * lost reservations. 24787 */ 24788 24789 /* 24790 * Function: sd_check_mhd() 24791 * 24792 * Description: This function sets up and submits a scsi watch request or 24793 * terminates an existing watch request. This routine is used in 24794 * support of reservation reclaim. 24795 * 24796 * Arguments: dev - the device 'dev_t' is used for context to discriminate 24797 * among multiple watches that share the callback function 24798 * interval - the number of microseconds specifying the watch 24799 * interval for issuing TEST UNIT READY commands. If 24800 * set to 0 the watch should be terminated. If the 24801 * interval is set to 0 and if the device is required 24802 * to hold reservation while disabling failfast, the 24803 * watch is restarted with an interval of 24804 * reinstate_resv_delay. 24805 * 24806 * Return Code: 0 - Successful submit/terminate of scsi watch request 24807 * ENXIO - Indicates an invalid device was specified 24808 * EAGAIN - Unable to submit the scsi watch request 24809 */ 24810 24811 static int 24812 sd_check_mhd(dev_t dev, int interval) 24813 { 24814 struct sd_lun *un; 24815 opaque_t token; 24816 24817 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24818 return (ENXIO); 24819 } 24820 24821 /* is this a watch termination request? */ 24822 if (interval == 0) { 24823 mutex_enter(SD_MUTEX(un)); 24824 /* if there is an existing watch task then terminate it */ 24825 if (un->un_mhd_token) { 24826 token = un->un_mhd_token; 24827 un->un_mhd_token = NULL; 24828 mutex_exit(SD_MUTEX(un)); 24829 (void) scsi_watch_request_terminate(token, 24830 SCSI_WATCH_TERMINATE_ALL_WAIT); 24831 mutex_enter(SD_MUTEX(un)); 24832 } else { 24833 mutex_exit(SD_MUTEX(un)); 24834 /* 24835 * Note: If we return here we don't check for the 24836 * failfast case. This is the original legacy 24837 * implementation but perhaps we should be checking 24838 * the failfast case. 24839 */ 24840 return (0); 24841 } 24842 /* 24843 * If the device is required to hold reservation while 24844 * disabling failfast, we need to restart the scsi_watch 24845 * routine with an interval of reinstate_resv_delay. 24846 */ 24847 if (un->un_resvd_status & SD_RESERVE) { 24848 interval = sd_reinstate_resv_delay/1000; 24849 } else { 24850 /* no failfast so bail */ 24851 mutex_exit(SD_MUTEX(un)); 24852 return (0); 24853 } 24854 mutex_exit(SD_MUTEX(un)); 24855 } 24856 24857 /* 24858 * adjust minimum time interval to 1 second, 24859 * and convert from msecs to usecs 24860 */ 24861 if (interval > 0 && interval < 1000) { 24862 interval = 1000; 24863 } 24864 interval *= 1000; 24865 24866 /* 24867 * submit the request to the scsi_watch service 24868 */ 24869 token = scsi_watch_request_submit(SD_SCSI_DEVP(un), interval, 24870 SENSE_LENGTH, sd_mhd_watch_cb, (caddr_t)dev); 24871 if (token == NULL) { 24872 return (EAGAIN); 24873 } 24874 24875 /* 24876 * save token for termination later on 24877 */ 24878 mutex_enter(SD_MUTEX(un)); 24879 un->un_mhd_token = token; 24880 mutex_exit(SD_MUTEX(un)); 24881 return (0); 24882 } 24883 24884 24885 /* 24886 * Function: sd_mhd_watch_cb() 24887 * 24888 * Description: This function is the call back function used by the scsi watch 24889 * facility. The scsi watch facility sends the "Test Unit Ready" 24890 * and processes the status. If applicable (i.e. a "Unit Attention" 24891 * status and automatic "Request Sense" not used) the scsi watch 24892 * facility will send a "Request Sense" and retrieve the sense data 24893 * to be passed to this callback function. In either case the 24894 * automatic "Request Sense" or the facility submitting one, this 24895 * callback is passed the status and sense data. 24896 * 24897 * Arguments: arg - the device 'dev_t' is used for context to discriminate 24898 * among multiple watches that share this callback function 24899 * resultp - scsi watch facility result packet containing scsi 24900 * packet, status byte and sense data 24901 * 24902 * Return Code: 0 - continue the watch task 24903 * non-zero - terminate the watch task 24904 */ 24905 24906 static int 24907 sd_mhd_watch_cb(caddr_t arg, struct scsi_watch_result *resultp) 24908 { 24909 struct sd_lun *un; 24910 struct scsi_status *statusp; 24911 uint8_t *sensep; 24912 struct scsi_pkt *pkt; 24913 uchar_t actual_sense_length; 24914 dev_t dev = (dev_t)arg; 24915 24916 ASSERT(resultp != NULL); 24917 statusp = resultp->statusp; 24918 sensep = (uint8_t *)resultp->sensep; 24919 pkt = resultp->pkt; 24920 actual_sense_length = resultp->actual_sense_length; 24921 24922 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 24923 return (ENXIO); 24924 } 24925 24926 SD_TRACE(SD_LOG_IOCTL_MHD, un, 24927 "sd_mhd_watch_cb: reason '%s', status '%s'\n", 24928 scsi_rname(pkt->pkt_reason), sd_sname(*((unsigned char *)statusp))); 24929 24930 /* Begin processing of the status and/or sense data */ 24931 if (pkt->pkt_reason != CMD_CMPLT) { 24932 /* Handle the incomplete packet */ 24933 sd_mhd_watch_incomplete(un, pkt); 24934 return (0); 24935 } else if (*((unsigned char *)statusp) != STATUS_GOOD) { 24936 if (*((unsigned char *)statusp) 24937 == STATUS_RESERVATION_CONFLICT) { 24938 /* 24939 * Handle a reservation conflict by panicking if 24940 * configured for failfast or by logging the conflict 24941 * and updating the reservation status 24942 */ 24943 mutex_enter(SD_MUTEX(un)); 24944 if ((un->un_resvd_status & SD_FAILFAST) && 24945 (sd_failfast_enable)) { 24946 sd_panic_for_res_conflict(un); 24947 /*NOTREACHED*/ 24948 } 24949 SD_INFO(SD_LOG_IOCTL_MHD, un, 24950 "sd_mhd_watch_cb: Reservation Conflict\n"); 24951 un->un_resvd_status |= SD_RESERVATION_CONFLICT; 24952 mutex_exit(SD_MUTEX(un)); 24953 } 24954 } 24955 24956 if (sensep != NULL) { 24957 if (actual_sense_length >= (SENSE_LENGTH - 2)) { 24958 mutex_enter(SD_MUTEX(un)); 24959 if ((scsi_sense_asc(sensep) == 24960 SD_SCSI_RESET_SENSE_CODE) && 24961 (un->un_resvd_status & SD_RESERVE)) { 24962 /* 24963 * The additional sense code indicates a power 24964 * on or bus device reset has occurred; update 24965 * the reservation status. 24966 */ 24967 un->un_resvd_status |= 24968 (SD_LOST_RESERVE | SD_WANT_RESERVE); 24969 SD_INFO(SD_LOG_IOCTL_MHD, un, 24970 "sd_mhd_watch_cb: Lost Reservation\n"); 24971 } 24972 } else { 24973 return (0); 24974 } 24975 } else { 24976 mutex_enter(SD_MUTEX(un)); 24977 } 24978 24979 if ((un->un_resvd_status & SD_RESERVE) && 24980 (un->un_resvd_status & SD_LOST_RESERVE)) { 24981 if (un->un_resvd_status & SD_WANT_RESERVE) { 24982 /* 24983 * A reset occurred in between the last probe and this 24984 * one so if a timeout is pending cancel it. 24985 */ 24986 if (un->un_resvd_timeid) { 24987 timeout_id_t temp_id = un->un_resvd_timeid; 24988 un->un_resvd_timeid = NULL; 24989 mutex_exit(SD_MUTEX(un)); 24990 (void) untimeout(temp_id); 24991 mutex_enter(SD_MUTEX(un)); 24992 } 24993 un->un_resvd_status &= ~SD_WANT_RESERVE; 24994 } 24995 if (un->un_resvd_timeid == 0) { 24996 /* Schedule a timeout to handle the lost reservation */ 24997 un->un_resvd_timeid = timeout(sd_mhd_resvd_recover, 24998 (void *)dev, 24999 drv_usectohz(sd_reinstate_resv_delay)); 25000 } 25001 } 25002 mutex_exit(SD_MUTEX(un)); 25003 return (0); 25004 } 25005 25006 25007 /* 25008 * Function: sd_mhd_watch_incomplete() 25009 * 25010 * Description: This function is used to find out why a scsi pkt sent by the 25011 * scsi watch facility was not completed. Under some scenarios this 25012 * routine will return. Otherwise it will send a bus reset to see 25013 * if the drive is still online. 25014 * 25015 * Arguments: un - driver soft state (unit) structure 25016 * pkt - incomplete scsi pkt 25017 */ 25018 25019 static void 25020 sd_mhd_watch_incomplete(struct sd_lun *un, struct scsi_pkt *pkt) 25021 { 25022 int be_chatty; 25023 int perr; 25024 25025 ASSERT(pkt != NULL); 25026 ASSERT(un != NULL); 25027 be_chatty = (!(pkt->pkt_flags & FLAG_SILENT)); 25028 perr = (pkt->pkt_statistics & STAT_PERR); 25029 25030 mutex_enter(SD_MUTEX(un)); 25031 if (un->un_state == SD_STATE_DUMPING) { 25032 mutex_exit(SD_MUTEX(un)); 25033 return; 25034 } 25035 25036 switch (pkt->pkt_reason) { 25037 case CMD_UNX_BUS_FREE: 25038 /* 25039 * If we had a parity error that caused the target to drop BSY*, 25040 * don't be chatty about it. 25041 */ 25042 if (perr && be_chatty) { 25043 be_chatty = 0; 25044 } 25045 break; 25046 case CMD_TAG_REJECT: 25047 /* 25048 * The SCSI-2 spec states that a tag reject will be sent by the 25049 * target if tagged queuing is not supported. A tag reject may 25050 * also be sent during certain initialization periods or to 25051 * control internal resources. For the latter case the target 25052 * may also return Queue Full. 25053 * 25054 * If this driver receives a tag reject from a target that is 25055 * going through an init period or controlling internal 25056 * resources tagged queuing will be disabled. This is a less 25057 * than optimal behavior but the driver is unable to determine 25058 * the target state and assumes tagged queueing is not supported 25059 */ 25060 pkt->pkt_flags = 0; 25061 un->un_tagflags = 0; 25062 25063 if (un->un_f_opt_queueing == TRUE) { 25064 un->un_throttle = min(un->un_throttle, 3); 25065 } else { 25066 un->un_throttle = 1; 25067 } 25068 mutex_exit(SD_MUTEX(un)); 25069 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1); 25070 mutex_enter(SD_MUTEX(un)); 25071 break; 25072 case CMD_INCOMPLETE: 25073 /* 25074 * The transport stopped with an abnormal state, fallthrough and 25075 * reset the target and/or bus unless selection did not complete 25076 * (indicated by STATE_GOT_BUS) in which case we don't want to 25077 * go through a target/bus reset 25078 */ 25079 if (pkt->pkt_state == STATE_GOT_BUS) { 25080 break; 25081 } 25082 /*FALLTHROUGH*/ 25083 25084 case CMD_TIMEOUT: 25085 default: 25086 /* 25087 * The lun may still be running the command, so a lun reset 25088 * should be attempted. If the lun reset fails or cannot be 25089 * issued, than try a target reset. Lastly try a bus reset. 25090 */ 25091 if ((pkt->pkt_statistics & 25092 (STAT_BUS_RESET|STAT_DEV_RESET|STAT_ABORTED)) == 0) { 25093 int reset_retval = 0; 25094 mutex_exit(SD_MUTEX(un)); 25095 if (un->un_f_allow_bus_device_reset == TRUE) { 25096 if (un->un_f_lun_reset_enabled == TRUE) { 25097 reset_retval = 25098 scsi_reset(SD_ADDRESS(un), 25099 RESET_LUN); 25100 } 25101 if (reset_retval == 0) { 25102 reset_retval = 25103 scsi_reset(SD_ADDRESS(un), 25104 RESET_TARGET); 25105 } 25106 } 25107 if (reset_retval == 0) { 25108 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL); 25109 } 25110 mutex_enter(SD_MUTEX(un)); 25111 } 25112 break; 25113 } 25114 25115 /* A device/bus reset has occurred; update the reservation status. */ 25116 if ((pkt->pkt_reason == CMD_RESET) || (pkt->pkt_statistics & 25117 (STAT_BUS_RESET | STAT_DEV_RESET))) { 25118 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) { 25119 un->un_resvd_status |= 25120 (SD_LOST_RESERVE | SD_WANT_RESERVE); 25121 SD_INFO(SD_LOG_IOCTL_MHD, un, 25122 "sd_mhd_watch_incomplete: Lost Reservation\n"); 25123 } 25124 } 25125 25126 /* 25127 * The disk has been turned off; Update the device state. 25128 * 25129 * Note: Should we be offlining the disk here? 25130 */ 25131 if (pkt->pkt_state == STATE_GOT_BUS) { 25132 SD_INFO(SD_LOG_IOCTL_MHD, un, "sd_mhd_watch_incomplete: " 25133 "Disk not responding to selection\n"); 25134 if (un->un_state != SD_STATE_OFFLINE) { 25135 New_state(un, SD_STATE_OFFLINE); 25136 } 25137 } else if (be_chatty) { 25138 /* 25139 * suppress messages if they are all the same pkt reason; 25140 * with TQ, many (up to 256) are returned with the same 25141 * pkt_reason 25142 */ 25143 if (pkt->pkt_reason != un->un_last_pkt_reason) { 25144 SD_ERROR(SD_LOG_IOCTL_MHD, un, 25145 "sd_mhd_watch_incomplete: " 25146 "SCSI transport failed: reason '%s'\n", 25147 scsi_rname(pkt->pkt_reason)); 25148 } 25149 } 25150 un->un_last_pkt_reason = pkt->pkt_reason; 25151 mutex_exit(SD_MUTEX(un)); 25152 } 25153 25154 25155 /* 25156 * Function: sd_sname() 25157 * 25158 * Description: This is a simple little routine to return a string containing 25159 * a printable description of command status byte for use in 25160 * logging. 25161 * 25162 * Arguments: status - pointer to a status byte 25163 * 25164 * Return Code: char * - string containing status description. 25165 */ 25166 25167 static char * 25168 sd_sname(uchar_t status) 25169 { 25170 switch (status & STATUS_MASK) { 25171 case STATUS_GOOD: 25172 return ("good status"); 25173 case STATUS_CHECK: 25174 return ("check condition"); 25175 case STATUS_MET: 25176 return ("condition met"); 25177 case STATUS_BUSY: 25178 return ("busy"); 25179 case STATUS_INTERMEDIATE: 25180 return ("intermediate"); 25181 case STATUS_INTERMEDIATE_MET: 25182 return ("intermediate - condition met"); 25183 case STATUS_RESERVATION_CONFLICT: 25184 return ("reservation_conflict"); 25185 case STATUS_TERMINATED: 25186 return ("command terminated"); 25187 case STATUS_QFULL: 25188 return ("queue full"); 25189 default: 25190 return ("<unknown status>"); 25191 } 25192 } 25193 25194 25195 /* 25196 * Function: sd_mhd_resvd_recover() 25197 * 25198 * Description: This function adds a reservation entry to the 25199 * sd_resv_reclaim_request list and signals the reservation 25200 * reclaim thread that there is work pending. If the reservation 25201 * reclaim thread has not been previously created this function 25202 * will kick it off. 25203 * 25204 * Arguments: arg - the device 'dev_t' is used for context to discriminate 25205 * among multiple watches that share this callback function 25206 * 25207 * Context: This routine is called by timeout() and is run in interrupt 25208 * context. It must not sleep or call other functions which may 25209 * sleep. 25210 */ 25211 25212 static void 25213 sd_mhd_resvd_recover(void *arg) 25214 { 25215 dev_t dev = (dev_t)arg; 25216 struct sd_lun *un; 25217 struct sd_thr_request *sd_treq = NULL; 25218 struct sd_thr_request *sd_cur = NULL; 25219 struct sd_thr_request *sd_prev = NULL; 25220 int already_there = 0; 25221 25222 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 25223 return; 25224 } 25225 25226 mutex_enter(SD_MUTEX(un)); 25227 un->un_resvd_timeid = NULL; 25228 if (un->un_resvd_status & SD_WANT_RESERVE) { 25229 /* 25230 * There was a reset so don't issue the reserve, allow the 25231 * sd_mhd_watch_cb callback function to notice this and 25232 * reschedule the timeout for reservation. 25233 */ 25234 mutex_exit(SD_MUTEX(un)); 25235 return; 25236 } 25237 mutex_exit(SD_MUTEX(un)); 25238 25239 /* 25240 * Add this device to the sd_resv_reclaim_request list and the 25241 * sd_resv_reclaim_thread should take care of the rest. 25242 * 25243 * Note: We can't sleep in this context so if the memory allocation 25244 * fails allow the sd_mhd_watch_cb callback function to notice this and 25245 * reschedule the timeout for reservation. (4378460) 25246 */ 25247 sd_treq = (struct sd_thr_request *) 25248 kmem_zalloc(sizeof (struct sd_thr_request), KM_NOSLEEP); 25249 if (sd_treq == NULL) { 25250 return; 25251 } 25252 25253 sd_treq->sd_thr_req_next = NULL; 25254 sd_treq->dev = dev; 25255 mutex_enter(&sd_tr.srq_resv_reclaim_mutex); 25256 if (sd_tr.srq_thr_req_head == NULL) { 25257 sd_tr.srq_thr_req_head = sd_treq; 25258 } else { 25259 sd_cur = sd_prev = sd_tr.srq_thr_req_head; 25260 for (; sd_cur != NULL; sd_cur = sd_cur->sd_thr_req_next) { 25261 if (sd_cur->dev == dev) { 25262 /* 25263 * already in Queue so don't log 25264 * another request for the device 25265 */ 25266 already_there = 1; 25267 break; 25268 } 25269 sd_prev = sd_cur; 25270 } 25271 if (!already_there) { 25272 SD_INFO(SD_LOG_IOCTL_MHD, un, "sd_mhd_resvd_recover: " 25273 "logging request for %lx\n", dev); 25274 sd_prev->sd_thr_req_next = sd_treq; 25275 } else { 25276 kmem_free(sd_treq, sizeof (struct sd_thr_request)); 25277 } 25278 } 25279 25280 /* 25281 * Create a kernel thread to do the reservation reclaim and free up this 25282 * thread. We cannot block this thread while we go away to do the 25283 * reservation reclaim 25284 */ 25285 if (sd_tr.srq_resv_reclaim_thread == NULL) 25286 sd_tr.srq_resv_reclaim_thread = thread_create(NULL, 0, 25287 sd_resv_reclaim_thread, NULL, 25288 0, &p0, TS_RUN, v.v_maxsyspri - 2); 25289 25290 /* Tell the reservation reclaim thread that it has work to do */ 25291 cv_signal(&sd_tr.srq_resv_reclaim_cv); 25292 mutex_exit(&sd_tr.srq_resv_reclaim_mutex); 25293 } 25294 25295 /* 25296 * Function: sd_resv_reclaim_thread() 25297 * 25298 * Description: This function implements the reservation reclaim operations 25299 * 25300 * Arguments: arg - the device 'dev_t' is used for context to discriminate 25301 * among multiple watches that share this callback function 25302 */ 25303 25304 static void 25305 sd_resv_reclaim_thread() 25306 { 25307 struct sd_lun *un; 25308 struct sd_thr_request *sd_mhreq; 25309 25310 /* Wait for work */ 25311 mutex_enter(&sd_tr.srq_resv_reclaim_mutex); 25312 if (sd_tr.srq_thr_req_head == NULL) { 25313 cv_wait(&sd_tr.srq_resv_reclaim_cv, 25314 &sd_tr.srq_resv_reclaim_mutex); 25315 } 25316 25317 /* Loop while we have work */ 25318 while ((sd_tr.srq_thr_cur_req = sd_tr.srq_thr_req_head) != NULL) { 25319 un = ddi_get_soft_state(sd_state, 25320 SDUNIT(sd_tr.srq_thr_cur_req->dev)); 25321 if (un == NULL) { 25322 /* 25323 * softstate structure is NULL so just 25324 * dequeue the request and continue 25325 */ 25326 sd_tr.srq_thr_req_head = 25327 sd_tr.srq_thr_cur_req->sd_thr_req_next; 25328 kmem_free(sd_tr.srq_thr_cur_req, 25329 sizeof (struct sd_thr_request)); 25330 continue; 25331 } 25332 25333 /* dequeue the request */ 25334 sd_mhreq = sd_tr.srq_thr_cur_req; 25335 sd_tr.srq_thr_req_head = 25336 sd_tr.srq_thr_cur_req->sd_thr_req_next; 25337 mutex_exit(&sd_tr.srq_resv_reclaim_mutex); 25338 25339 /* 25340 * Reclaim reservation only if SD_RESERVE is still set. There 25341 * may have been a call to MHIOCRELEASE before we got here. 25342 */ 25343 mutex_enter(SD_MUTEX(un)); 25344 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) { 25345 /* 25346 * Note: The SD_LOST_RESERVE flag is cleared before 25347 * reclaiming the reservation. If this is done after the 25348 * call to sd_reserve_release a reservation loss in the 25349 * window between pkt completion of reserve cmd and 25350 * mutex_enter below may not be recognized 25351 */ 25352 un->un_resvd_status &= ~SD_LOST_RESERVE; 25353 mutex_exit(SD_MUTEX(un)); 25354 25355 if (sd_reserve_release(sd_mhreq->dev, 25356 SD_RESERVE) == 0) { 25357 mutex_enter(SD_MUTEX(un)); 25358 un->un_resvd_status |= SD_RESERVE; 25359 mutex_exit(SD_MUTEX(un)); 25360 SD_INFO(SD_LOG_IOCTL_MHD, un, 25361 "sd_resv_reclaim_thread: " 25362 "Reservation Recovered\n"); 25363 } else { 25364 mutex_enter(SD_MUTEX(un)); 25365 un->un_resvd_status |= SD_LOST_RESERVE; 25366 mutex_exit(SD_MUTEX(un)); 25367 SD_INFO(SD_LOG_IOCTL_MHD, un, 25368 "sd_resv_reclaim_thread: Failed " 25369 "Reservation Recovery\n"); 25370 } 25371 } else { 25372 mutex_exit(SD_MUTEX(un)); 25373 } 25374 mutex_enter(&sd_tr.srq_resv_reclaim_mutex); 25375 ASSERT(sd_mhreq == sd_tr.srq_thr_cur_req); 25376 kmem_free(sd_mhreq, sizeof (struct sd_thr_request)); 25377 sd_mhreq = sd_tr.srq_thr_cur_req = NULL; 25378 /* 25379 * wakeup the destroy thread if anyone is waiting on 25380 * us to complete. 25381 */ 25382 cv_signal(&sd_tr.srq_inprocess_cv); 25383 SD_TRACE(SD_LOG_IOCTL_MHD, un, 25384 "sd_resv_reclaim_thread: cv_signalling current request \n"); 25385 } 25386 25387 /* 25388 * cleanup the sd_tr structure now that this thread will not exist 25389 */ 25390 ASSERT(sd_tr.srq_thr_req_head == NULL); 25391 ASSERT(sd_tr.srq_thr_cur_req == NULL); 25392 sd_tr.srq_resv_reclaim_thread = NULL; 25393 mutex_exit(&sd_tr.srq_resv_reclaim_mutex); 25394 thread_exit(); 25395 } 25396 25397 25398 /* 25399 * Function: sd_rmv_resv_reclaim_req() 25400 * 25401 * Description: This function removes any pending reservation reclaim requests 25402 * for the specified device. 25403 * 25404 * Arguments: dev - the device 'dev_t' 25405 */ 25406 25407 static void 25408 sd_rmv_resv_reclaim_req(dev_t dev) 25409 { 25410 struct sd_thr_request *sd_mhreq; 25411 struct sd_thr_request *sd_prev; 25412 25413 /* Remove a reservation reclaim request from the list */ 25414 mutex_enter(&sd_tr.srq_resv_reclaim_mutex); 25415 if (sd_tr.srq_thr_cur_req && sd_tr.srq_thr_cur_req->dev == dev) { 25416 /* 25417 * We are attempting to reinstate reservation for 25418 * this device. We wait for sd_reserve_release() 25419 * to return before we return. 25420 */ 25421 cv_wait(&sd_tr.srq_inprocess_cv, 25422 &sd_tr.srq_resv_reclaim_mutex); 25423 } else { 25424 sd_prev = sd_mhreq = sd_tr.srq_thr_req_head; 25425 if (sd_mhreq && sd_mhreq->dev == dev) { 25426 sd_tr.srq_thr_req_head = sd_mhreq->sd_thr_req_next; 25427 kmem_free(sd_mhreq, sizeof (struct sd_thr_request)); 25428 mutex_exit(&sd_tr.srq_resv_reclaim_mutex); 25429 return; 25430 } 25431 for (; sd_mhreq != NULL; sd_mhreq = sd_mhreq->sd_thr_req_next) { 25432 if (sd_mhreq && sd_mhreq->dev == dev) { 25433 break; 25434 } 25435 sd_prev = sd_mhreq; 25436 } 25437 if (sd_mhreq != NULL) { 25438 sd_prev->sd_thr_req_next = sd_mhreq->sd_thr_req_next; 25439 kmem_free(sd_mhreq, sizeof (struct sd_thr_request)); 25440 } 25441 } 25442 mutex_exit(&sd_tr.srq_resv_reclaim_mutex); 25443 } 25444 25445 25446 /* 25447 * Function: sd_mhd_reset_notify_cb() 25448 * 25449 * Description: This is a call back function for scsi_reset_notify. This 25450 * function updates the softstate reserved status and logs the 25451 * reset. The driver scsi watch facility callback function 25452 * (sd_mhd_watch_cb) and reservation reclaim thread functionality 25453 * will reclaim the reservation. 25454 * 25455 * Arguments: arg - driver soft state (unit) structure 25456 */ 25457 25458 static void 25459 sd_mhd_reset_notify_cb(caddr_t arg) 25460 { 25461 struct sd_lun *un = (struct sd_lun *)arg; 25462 25463 mutex_enter(SD_MUTEX(un)); 25464 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) { 25465 un->un_resvd_status |= (SD_LOST_RESERVE | SD_WANT_RESERVE); 25466 SD_INFO(SD_LOG_IOCTL_MHD, un, 25467 "sd_mhd_reset_notify_cb: Lost Reservation\n"); 25468 } 25469 mutex_exit(SD_MUTEX(un)); 25470 } 25471 25472 25473 /* 25474 * Function: sd_take_ownership() 25475 * 25476 * Description: This routine implements an algorithm to achieve a stable 25477 * reservation on disks which don't implement priority reserve, 25478 * and makes sure that other host lose re-reservation attempts. 25479 * This algorithm contains of a loop that keeps issuing the RESERVE 25480 * for some period of time (min_ownership_delay, default 6 seconds) 25481 * During that loop, it looks to see if there has been a bus device 25482 * reset or bus reset (both of which cause an existing reservation 25483 * to be lost). If the reservation is lost issue RESERVE until a 25484 * period of min_ownership_delay with no resets has gone by, or 25485 * until max_ownership_delay has expired. This loop ensures that 25486 * the host really did manage to reserve the device, in spite of 25487 * resets. The looping for min_ownership_delay (default six 25488 * seconds) is important to early generation clustering products, 25489 * Solstice HA 1.x and Sun Cluster 2.x. Those products use an 25490 * MHIOCENFAILFAST periodic timer of two seconds. By having 25491 * MHIOCTKOWN issue Reserves in a loop for six seconds, and having 25492 * MHIOCENFAILFAST poll every two seconds, the idea is that by the 25493 * time the MHIOCTKOWN ioctl returns, the other host (if any) will 25494 * have already noticed, via the MHIOCENFAILFAST polling, that it 25495 * no longer "owns" the disk and will have panicked itself. Thus, 25496 * the host issuing the MHIOCTKOWN is assured (with timing 25497 * dependencies) that by the time it actually starts to use the 25498 * disk for real work, the old owner is no longer accessing it. 25499 * 25500 * min_ownership_delay is the minimum amount of time for which the 25501 * disk must be reserved continuously devoid of resets before the 25502 * MHIOCTKOWN ioctl will return success. 25503 * 25504 * max_ownership_delay indicates the amount of time by which the 25505 * take ownership should succeed or timeout with an error. 25506 * 25507 * Arguments: dev - the device 'dev_t' 25508 * *p - struct containing timing info. 25509 * 25510 * Return Code: 0 for success or error code 25511 */ 25512 25513 static int 25514 sd_take_ownership(dev_t dev, struct mhioctkown *p) 25515 { 25516 struct sd_lun *un; 25517 int rval; 25518 int err; 25519 int reservation_count = 0; 25520 int min_ownership_delay = 6000000; /* in usec */ 25521 int max_ownership_delay = 30000000; /* in usec */ 25522 clock_t start_time; /* starting time of this algorithm */ 25523 clock_t end_time; /* time limit for giving up */ 25524 clock_t ownership_time; /* time limit for stable ownership */ 25525 clock_t current_time; 25526 clock_t previous_current_time; 25527 25528 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 25529 return (ENXIO); 25530 } 25531 25532 /* 25533 * Attempt a device reservation. A priority reservation is requested. 25534 */ 25535 if ((rval = sd_reserve_release(dev, SD_PRIORITY_RESERVE)) 25536 != SD_SUCCESS) { 25537 SD_ERROR(SD_LOG_IOCTL_MHD, un, 25538 "sd_take_ownership: return(1)=%d\n", rval); 25539 return (rval); 25540 } 25541 25542 /* Update the softstate reserved status to indicate the reservation */ 25543 mutex_enter(SD_MUTEX(un)); 25544 un->un_resvd_status |= SD_RESERVE; 25545 un->un_resvd_status &= 25546 ~(SD_LOST_RESERVE | SD_WANT_RESERVE | SD_RESERVATION_CONFLICT); 25547 mutex_exit(SD_MUTEX(un)); 25548 25549 if (p != NULL) { 25550 if (p->min_ownership_delay != 0) { 25551 min_ownership_delay = p->min_ownership_delay * 1000; 25552 } 25553 if (p->max_ownership_delay != 0) { 25554 max_ownership_delay = p->max_ownership_delay * 1000; 25555 } 25556 } 25557 SD_INFO(SD_LOG_IOCTL_MHD, un, 25558 "sd_take_ownership: min, max delays: %d, %d\n", 25559 min_ownership_delay, max_ownership_delay); 25560 25561 start_time = ddi_get_lbolt(); 25562 current_time = start_time; 25563 ownership_time = current_time + drv_usectohz(min_ownership_delay); 25564 end_time = start_time + drv_usectohz(max_ownership_delay); 25565 25566 while (current_time - end_time < 0) { 25567 delay(drv_usectohz(500000)); 25568 25569 if ((err = sd_reserve_release(dev, SD_RESERVE)) != 0) { 25570 if ((sd_reserve_release(dev, SD_RESERVE)) != 0) { 25571 mutex_enter(SD_MUTEX(un)); 25572 rval = (un->un_resvd_status & 25573 SD_RESERVATION_CONFLICT) ? EACCES : EIO; 25574 mutex_exit(SD_MUTEX(un)); 25575 break; 25576 } 25577 } 25578 previous_current_time = current_time; 25579 current_time = ddi_get_lbolt(); 25580 mutex_enter(SD_MUTEX(un)); 25581 if (err || (un->un_resvd_status & SD_LOST_RESERVE)) { 25582 ownership_time = ddi_get_lbolt() + 25583 drv_usectohz(min_ownership_delay); 25584 reservation_count = 0; 25585 } else { 25586 reservation_count++; 25587 } 25588 un->un_resvd_status |= SD_RESERVE; 25589 un->un_resvd_status &= ~(SD_LOST_RESERVE | SD_WANT_RESERVE); 25590 mutex_exit(SD_MUTEX(un)); 25591 25592 SD_INFO(SD_LOG_IOCTL_MHD, un, 25593 "sd_take_ownership: ticks for loop iteration=%ld, " 25594 "reservation=%s\n", (current_time - previous_current_time), 25595 reservation_count ? "ok" : "reclaimed"); 25596 25597 if (current_time - ownership_time >= 0 && 25598 reservation_count >= 4) { 25599 rval = 0; /* Achieved a stable ownership */ 25600 break; 25601 } 25602 if (current_time - end_time >= 0) { 25603 rval = EACCES; /* No ownership in max possible time */ 25604 break; 25605 } 25606 } 25607 SD_TRACE(SD_LOG_IOCTL_MHD, un, 25608 "sd_take_ownership: return(2)=%d\n", rval); 25609 return (rval); 25610 } 25611 25612 25613 /* 25614 * Function: sd_reserve_release() 25615 * 25616 * Description: This function builds and sends scsi RESERVE, RELEASE, and 25617 * PRIORITY RESERVE commands based on a user specified command type 25618 * 25619 * Arguments: dev - the device 'dev_t' 25620 * cmd - user specified command type; one of SD_PRIORITY_RESERVE, 25621 * SD_RESERVE, SD_RELEASE 25622 * 25623 * Return Code: 0 or Error Code 25624 */ 25625 25626 static int 25627 sd_reserve_release(dev_t dev, int cmd) 25628 { 25629 struct uscsi_cmd *com = NULL; 25630 struct sd_lun *un = NULL; 25631 char cdb[CDB_GROUP0]; 25632 int rval; 25633 25634 ASSERT((cmd == SD_RELEASE) || (cmd == SD_RESERVE) || 25635 (cmd == SD_PRIORITY_RESERVE)); 25636 25637 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 25638 return (ENXIO); 25639 } 25640 25641 /* instantiate and initialize the command and cdb */ 25642 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 25643 bzero(cdb, CDB_GROUP0); 25644 com->uscsi_flags = USCSI_SILENT; 25645 com->uscsi_timeout = un->un_reserve_release_time; 25646 com->uscsi_cdblen = CDB_GROUP0; 25647 com->uscsi_cdb = cdb; 25648 if (cmd == SD_RELEASE) { 25649 cdb[0] = SCMD_RELEASE; 25650 } else { 25651 cdb[0] = SCMD_RESERVE; 25652 } 25653 25654 /* Send the command. */ 25655 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 25656 SD_PATH_STANDARD); 25657 25658 /* 25659 * "break" a reservation that is held by another host, by issuing a 25660 * reset if priority reserve is desired, and we could not get the 25661 * device. 25662 */ 25663 if ((cmd == SD_PRIORITY_RESERVE) && 25664 (rval != 0) && (com->uscsi_status == STATUS_RESERVATION_CONFLICT)) { 25665 /* 25666 * First try to reset the LUN. If we cannot, then try a target 25667 * reset, followed by a bus reset if the target reset fails. 25668 */ 25669 int reset_retval = 0; 25670 if (un->un_f_lun_reset_enabled == TRUE) { 25671 reset_retval = scsi_reset(SD_ADDRESS(un), RESET_LUN); 25672 } 25673 if (reset_retval == 0) { 25674 /* The LUN reset either failed or was not issued */ 25675 reset_retval = scsi_reset(SD_ADDRESS(un), RESET_TARGET); 25676 } 25677 if ((reset_retval == 0) && 25678 (scsi_reset(SD_ADDRESS(un), RESET_ALL) == 0)) { 25679 rval = EIO; 25680 kmem_free(com, sizeof (*com)); 25681 return (rval); 25682 } 25683 25684 bzero(com, sizeof (struct uscsi_cmd)); 25685 com->uscsi_flags = USCSI_SILENT; 25686 com->uscsi_cdb = cdb; 25687 com->uscsi_cdblen = CDB_GROUP0; 25688 com->uscsi_timeout = 5; 25689 25690 /* 25691 * Reissue the last reserve command, this time without request 25692 * sense. Assume that it is just a regular reserve command. 25693 */ 25694 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 25695 SD_PATH_STANDARD); 25696 } 25697 25698 /* Return an error if still getting a reservation conflict. */ 25699 if ((rval != 0) && (com->uscsi_status == STATUS_RESERVATION_CONFLICT)) { 25700 rval = EACCES; 25701 } 25702 25703 kmem_free(com, sizeof (*com)); 25704 return (rval); 25705 } 25706 25707 25708 #define SD_NDUMP_RETRIES 12 25709 /* 25710 * System Crash Dump routine 25711 */ 25712 25713 static int 25714 sddump(dev_t dev, caddr_t addr, daddr_t blkno, int nblk) 25715 { 25716 int instance; 25717 int partition; 25718 int i; 25719 int err; 25720 struct sd_lun *un; 25721 struct scsi_pkt *wr_pktp; 25722 struct buf *wr_bp; 25723 struct buf wr_buf; 25724 daddr_t tgt_byte_offset; /* rmw - byte offset for target */ 25725 daddr_t tgt_blkno; /* rmw - blkno for target */ 25726 size_t tgt_byte_count; /* rmw - # of bytes to xfer */ 25727 size_t tgt_nblk; /* rmw - # of tgt blks to xfer */ 25728 size_t io_start_offset; 25729 int doing_rmw = FALSE; 25730 int rval; 25731 ssize_t dma_resid; 25732 daddr_t oblkno; 25733 diskaddr_t nblks = 0; 25734 diskaddr_t start_block; 25735 25736 instance = SDUNIT(dev); 25737 if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) || 25738 !SD_IS_VALID_LABEL(un) || ISCD(un)) { 25739 return (ENXIO); 25740 } 25741 25742 _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*un)) 25743 25744 SD_TRACE(SD_LOG_DUMP, un, "sddump: entry\n"); 25745 25746 partition = SDPART(dev); 25747 SD_INFO(SD_LOG_DUMP, un, "sddump: partition = %d\n", partition); 25748 25749 if (!(NOT_DEVBSIZE(un))) { 25750 int secmask = 0; 25751 int blknomask = 0; 25752 25753 blknomask = (un->un_tgt_blocksize / DEV_BSIZE) - 1; 25754 secmask = un->un_tgt_blocksize - 1; 25755 25756 if (blkno & blknomask) { 25757 SD_TRACE(SD_LOG_DUMP, un, 25758 "sddump: dump start block not modulo %d\n", 25759 un->un_tgt_blocksize); 25760 return (EINVAL); 25761 } 25762 25763 if ((nblk * DEV_BSIZE) & secmask) { 25764 SD_TRACE(SD_LOG_DUMP, un, 25765 "sddump: dump length not modulo %d\n", 25766 un->un_tgt_blocksize); 25767 return (EINVAL); 25768 } 25769 25770 } 25771 25772 /* Validate blocks to dump at against partition size. */ 25773 25774 (void) cmlb_partinfo(un->un_cmlbhandle, partition, 25775 &nblks, &start_block, NULL, NULL, (void *)SD_PATH_DIRECT); 25776 25777 if (NOT_DEVBSIZE(un)) { 25778 if ((blkno + nblk) > nblks) { 25779 SD_TRACE(SD_LOG_DUMP, un, 25780 "sddump: dump range larger than partition: " 25781 "blkno = 0x%x, nblk = 0x%x, dkl_nblk = 0x%x\n", 25782 blkno, nblk, nblks); 25783 return (EINVAL); 25784 } 25785 } else { 25786 if (((blkno / (un->un_tgt_blocksize / DEV_BSIZE)) + 25787 (nblk / (un->un_tgt_blocksize / DEV_BSIZE))) > nblks) { 25788 SD_TRACE(SD_LOG_DUMP, un, 25789 "sddump: dump range larger than partition: " 25790 "blkno = 0x%x, nblk = 0x%x, dkl_nblk = 0x%x\n", 25791 blkno, nblk, nblks); 25792 return (EINVAL); 25793 } 25794 } 25795 25796 mutex_enter(&un->un_pm_mutex); 25797 if (SD_DEVICE_IS_IN_LOW_POWER(un)) { 25798 struct scsi_pkt *start_pktp; 25799 25800 mutex_exit(&un->un_pm_mutex); 25801 25802 /* 25803 * use pm framework to power on HBA 1st 25804 */ 25805 (void) pm_raise_power(SD_DEVINFO(un), 0, 25806 SD_PM_STATE_ACTIVE(un)); 25807 25808 /* 25809 * Dump no long uses sdpower to power on a device, it's 25810 * in-line here so it can be done in polled mode. 25811 */ 25812 25813 SD_INFO(SD_LOG_DUMP, un, "sddump: starting device\n"); 25814 25815 start_pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, NULL, 25816 CDB_GROUP0, un->un_status_len, 0, 0, NULL_FUNC, NULL); 25817 25818 if (start_pktp == NULL) { 25819 /* We were not given a SCSI packet, fail. */ 25820 return (EIO); 25821 } 25822 bzero(start_pktp->pkt_cdbp, CDB_GROUP0); 25823 start_pktp->pkt_cdbp[0] = SCMD_START_STOP; 25824 start_pktp->pkt_cdbp[4] = SD_TARGET_START; 25825 start_pktp->pkt_flags = FLAG_NOINTR; 25826 25827 mutex_enter(SD_MUTEX(un)); 25828 SD_FILL_SCSI1_LUN(un, start_pktp); 25829 mutex_exit(SD_MUTEX(un)); 25830 /* 25831 * Scsi_poll returns 0 (success) if the command completes and 25832 * the status block is STATUS_GOOD. 25833 */ 25834 if (sd_scsi_poll(un, start_pktp) != 0) { 25835 scsi_destroy_pkt(start_pktp); 25836 return (EIO); 25837 } 25838 scsi_destroy_pkt(start_pktp); 25839 (void) sd_pm_state_change(un, SD_PM_STATE_ACTIVE(un), 25840 SD_PM_STATE_CHANGE); 25841 } else { 25842 mutex_exit(&un->un_pm_mutex); 25843 } 25844 25845 mutex_enter(SD_MUTEX(un)); 25846 un->un_throttle = 0; 25847 25848 /* 25849 * The first time through, reset the specific target device. 25850 * However, when cpr calls sddump we know that sd is in a 25851 * a good state so no bus reset is required. 25852 * Clear sense data via Request Sense cmd. 25853 * In sddump we don't care about allow_bus_device_reset anymore 25854 */ 25855 25856 if ((un->un_state != SD_STATE_SUSPENDED) && 25857 (un->un_state != SD_STATE_DUMPING)) { 25858 25859 New_state(un, SD_STATE_DUMPING); 25860 25861 if (un->un_f_is_fibre == FALSE) { 25862 mutex_exit(SD_MUTEX(un)); 25863 /* 25864 * Attempt a bus reset for parallel scsi. 25865 * 25866 * Note: A bus reset is required because on some host 25867 * systems (i.e. E420R) a bus device reset is 25868 * insufficient to reset the state of the target. 25869 * 25870 * Note: Don't issue the reset for fibre-channel, 25871 * because this tends to hang the bus (loop) for 25872 * too long while everyone is logging out and in 25873 * and the deadman timer for dumping will fire 25874 * before the dump is complete. 25875 */ 25876 if (scsi_reset(SD_ADDRESS(un), RESET_ALL) == 0) { 25877 mutex_enter(SD_MUTEX(un)); 25878 Restore_state(un); 25879 mutex_exit(SD_MUTEX(un)); 25880 return (EIO); 25881 } 25882 25883 /* Delay to give the device some recovery time. */ 25884 drv_usecwait(10000); 25885 25886 if (sd_send_polled_RQS(un) == SD_FAILURE) { 25887 SD_INFO(SD_LOG_DUMP, un, 25888 "sddump: sd_send_polled_RQS failed\n"); 25889 } 25890 mutex_enter(SD_MUTEX(un)); 25891 } 25892 } 25893 25894 /* 25895 * Convert the partition-relative block number to a 25896 * disk physical block number. 25897 */ 25898 if (NOT_DEVBSIZE(un)) { 25899 blkno += start_block; 25900 } else { 25901 blkno = blkno / (un->un_tgt_blocksize / DEV_BSIZE); 25902 blkno += start_block; 25903 } 25904 25905 SD_INFO(SD_LOG_DUMP, un, "sddump: disk blkno = 0x%x\n", blkno); 25906 25907 25908 /* 25909 * Check if the device has a non-512 block size. 25910 */ 25911 wr_bp = NULL; 25912 if (NOT_DEVBSIZE(un)) { 25913 tgt_byte_offset = blkno * un->un_sys_blocksize; 25914 tgt_byte_count = nblk * un->un_sys_blocksize; 25915 if ((tgt_byte_offset % un->un_tgt_blocksize) || 25916 (tgt_byte_count % un->un_tgt_blocksize)) { 25917 doing_rmw = TRUE; 25918 /* 25919 * Calculate the block number and number of block 25920 * in terms of the media block size. 25921 */ 25922 tgt_blkno = tgt_byte_offset / un->un_tgt_blocksize; 25923 tgt_nblk = 25924 ((tgt_byte_offset + tgt_byte_count + 25925 (un->un_tgt_blocksize - 1)) / 25926 un->un_tgt_blocksize) - tgt_blkno; 25927 25928 /* 25929 * Invoke the routine which is going to do read part 25930 * of read-modify-write. 25931 * Note that this routine returns a pointer to 25932 * a valid bp in wr_bp. 25933 */ 25934 err = sddump_do_read_of_rmw(un, tgt_blkno, tgt_nblk, 25935 &wr_bp); 25936 if (err) { 25937 mutex_exit(SD_MUTEX(un)); 25938 return (err); 25939 } 25940 /* 25941 * Offset is being calculated as - 25942 * (original block # * system block size) - 25943 * (new block # * target block size) 25944 */ 25945 io_start_offset = 25946 ((uint64_t)(blkno * un->un_sys_blocksize)) - 25947 ((uint64_t)(tgt_blkno * un->un_tgt_blocksize)); 25948 25949 ASSERT(io_start_offset < un->un_tgt_blocksize); 25950 /* 25951 * Do the modify portion of read modify write. 25952 */ 25953 bcopy(addr, &wr_bp->b_un.b_addr[io_start_offset], 25954 (size_t)nblk * un->un_sys_blocksize); 25955 } else { 25956 doing_rmw = FALSE; 25957 tgt_blkno = tgt_byte_offset / un->un_tgt_blocksize; 25958 tgt_nblk = tgt_byte_count / un->un_tgt_blocksize; 25959 } 25960 25961 /* Convert blkno and nblk to target blocks */ 25962 blkno = tgt_blkno; 25963 nblk = tgt_nblk; 25964 } else { 25965 wr_bp = &wr_buf; 25966 bzero(wr_bp, sizeof (struct buf)); 25967 wr_bp->b_flags = B_BUSY; 25968 wr_bp->b_un.b_addr = addr; 25969 wr_bp->b_bcount = nblk << DEV_BSHIFT; 25970 wr_bp->b_resid = 0; 25971 } 25972 25973 mutex_exit(SD_MUTEX(un)); 25974 25975 /* 25976 * Obtain a SCSI packet for the write command. 25977 * It should be safe to call the allocator here without 25978 * worrying about being locked for DVMA mapping because 25979 * the address we're passed is already a DVMA mapping 25980 * 25981 * We are also not going to worry about semaphore ownership 25982 * in the dump buffer. Dumping is single threaded at present. 25983 */ 25984 25985 wr_pktp = NULL; 25986 25987 dma_resid = wr_bp->b_bcount; 25988 oblkno = blkno; 25989 25990 if (!(NOT_DEVBSIZE(un))) { 25991 nblk = nblk / (un->un_tgt_blocksize / DEV_BSIZE); 25992 } 25993 25994 while (dma_resid != 0) { 25995 25996 for (i = 0; i < SD_NDUMP_RETRIES; i++) { 25997 wr_bp->b_flags &= ~B_ERROR; 25998 25999 if (un->un_partial_dma_supported == 1) { 26000 blkno = oblkno + 26001 ((wr_bp->b_bcount - dma_resid) / 26002 un->un_tgt_blocksize); 26003 nblk = dma_resid / un->un_tgt_blocksize; 26004 26005 if (wr_pktp) { 26006 /* 26007 * Partial DMA transfers after initial transfer 26008 */ 26009 rval = sd_setup_next_rw_pkt(un, wr_pktp, wr_bp, 26010 blkno, nblk); 26011 } else { 26012 /* Initial transfer */ 26013 rval = sd_setup_rw_pkt(un, &wr_pktp, wr_bp, 26014 un->un_pkt_flags, NULL_FUNC, NULL, 26015 blkno, nblk); 26016 } 26017 } else { 26018 rval = sd_setup_rw_pkt(un, &wr_pktp, wr_bp, 26019 0, NULL_FUNC, NULL, blkno, nblk); 26020 } 26021 26022 if (rval == 0) { 26023 /* We were given a SCSI packet, continue. */ 26024 break; 26025 } 26026 26027 if (i == 0) { 26028 if (wr_bp->b_flags & B_ERROR) { 26029 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26030 "no resources for dumping; " 26031 "error code: 0x%x, retrying", 26032 geterror(wr_bp)); 26033 } else { 26034 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26035 "no resources for dumping; retrying"); 26036 } 26037 } else if (i != (SD_NDUMP_RETRIES - 1)) { 26038 if (wr_bp->b_flags & B_ERROR) { 26039 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, 26040 "no resources for dumping; error code: " 26041 "0x%x, retrying\n", geterror(wr_bp)); 26042 } 26043 } else { 26044 if (wr_bp->b_flags & B_ERROR) { 26045 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, 26046 "no resources for dumping; " 26047 "error code: 0x%x, retries failed, " 26048 "giving up.\n", geterror(wr_bp)); 26049 } else { 26050 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, 26051 "no resources for dumping; " 26052 "retries failed, giving up.\n"); 26053 } 26054 mutex_enter(SD_MUTEX(un)); 26055 Restore_state(un); 26056 if (NOT_DEVBSIZE(un) && (doing_rmw == TRUE)) { 26057 mutex_exit(SD_MUTEX(un)); 26058 scsi_free_consistent_buf(wr_bp); 26059 } else { 26060 mutex_exit(SD_MUTEX(un)); 26061 } 26062 return (EIO); 26063 } 26064 drv_usecwait(10000); 26065 } 26066 26067 if (un->un_partial_dma_supported == 1) { 26068 /* 26069 * save the resid from PARTIAL_DMA 26070 */ 26071 dma_resid = wr_pktp->pkt_resid; 26072 if (dma_resid != 0) 26073 nblk -= SD_BYTES2TGTBLOCKS(un, dma_resid); 26074 wr_pktp->pkt_resid = 0; 26075 } else { 26076 dma_resid = 0; 26077 } 26078 26079 /* SunBug 1222170 */ 26080 wr_pktp->pkt_flags = FLAG_NOINTR; 26081 26082 err = EIO; 26083 for (i = 0; i < SD_NDUMP_RETRIES; i++) { 26084 26085 /* 26086 * Scsi_poll returns 0 (success) if the command completes and 26087 * the status block is STATUS_GOOD. We should only check 26088 * errors if this condition is not true. Even then we should 26089 * send our own request sense packet only if we have a check 26090 * condition and auto request sense has not been performed by 26091 * the hba. 26092 */ 26093 SD_TRACE(SD_LOG_DUMP, un, "sddump: sending write\n"); 26094 26095 if ((sd_scsi_poll(un, wr_pktp) == 0) && 26096 (wr_pktp->pkt_resid == 0)) { 26097 err = SD_SUCCESS; 26098 break; 26099 } 26100 26101 /* 26102 * Check CMD_DEV_GONE 1st, give up if device is gone. 26103 */ 26104 if (wr_pktp->pkt_reason == CMD_DEV_GONE) { 26105 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26106 "Error while dumping state...Device is gone\n"); 26107 break; 26108 } 26109 26110 if (SD_GET_PKT_STATUS(wr_pktp) == STATUS_CHECK) { 26111 SD_INFO(SD_LOG_DUMP, un, 26112 "sddump: write failed with CHECK, try # %d\n", i); 26113 if (((wr_pktp->pkt_state & STATE_ARQ_DONE) == 0)) { 26114 (void) sd_send_polled_RQS(un); 26115 } 26116 26117 continue; 26118 } 26119 26120 if (SD_GET_PKT_STATUS(wr_pktp) == STATUS_BUSY) { 26121 int reset_retval = 0; 26122 26123 SD_INFO(SD_LOG_DUMP, un, 26124 "sddump: write failed with BUSY, try # %d\n", i); 26125 26126 if (un->un_f_lun_reset_enabled == TRUE) { 26127 reset_retval = scsi_reset(SD_ADDRESS(un), 26128 RESET_LUN); 26129 } 26130 if (reset_retval == 0) { 26131 (void) scsi_reset(SD_ADDRESS(un), RESET_TARGET); 26132 } 26133 (void) sd_send_polled_RQS(un); 26134 26135 } else { 26136 SD_INFO(SD_LOG_DUMP, un, 26137 "sddump: write failed with 0x%x, try # %d\n", 26138 SD_GET_PKT_STATUS(wr_pktp), i); 26139 mutex_enter(SD_MUTEX(un)); 26140 sd_reset_target(un, wr_pktp); 26141 mutex_exit(SD_MUTEX(un)); 26142 } 26143 26144 /* 26145 * If we are not getting anywhere with lun/target resets, 26146 * let's reset the bus. 26147 */ 26148 if (i == SD_NDUMP_RETRIES/2) { 26149 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL); 26150 (void) sd_send_polled_RQS(un); 26151 } 26152 } 26153 } 26154 26155 scsi_destroy_pkt(wr_pktp); 26156 mutex_enter(SD_MUTEX(un)); 26157 if ((NOT_DEVBSIZE(un)) && (doing_rmw == TRUE)) { 26158 mutex_exit(SD_MUTEX(un)); 26159 scsi_free_consistent_buf(wr_bp); 26160 } else { 26161 mutex_exit(SD_MUTEX(un)); 26162 } 26163 SD_TRACE(SD_LOG_DUMP, un, "sddump: exit: err = %d\n", err); 26164 return (err); 26165 } 26166 26167 /* 26168 * Function: sd_scsi_poll() 26169 * 26170 * Description: This is a wrapper for the scsi_poll call. 26171 * 26172 * Arguments: sd_lun - The unit structure 26173 * scsi_pkt - The scsi packet being sent to the device. 26174 * 26175 * Return Code: 0 - Command completed successfully with good status 26176 * -1 - Command failed. This could indicate a check condition 26177 * or other status value requiring recovery action. 26178 * 26179 * NOTE: This code is only called off sddump(). 26180 */ 26181 26182 static int 26183 sd_scsi_poll(struct sd_lun *un, struct scsi_pkt *pktp) 26184 { 26185 int status; 26186 26187 ASSERT(un != NULL); 26188 ASSERT(!mutex_owned(SD_MUTEX(un))); 26189 ASSERT(pktp != NULL); 26190 26191 status = SD_SUCCESS; 26192 26193 if (scsi_ifgetcap(&pktp->pkt_address, "tagged-qing", 1) == 1) { 26194 pktp->pkt_flags |= un->un_tagflags; 26195 pktp->pkt_flags &= ~FLAG_NODISCON; 26196 } 26197 26198 status = sd_ddi_scsi_poll(pktp); 26199 /* 26200 * Scsi_poll returns 0 (success) if the command completes and the 26201 * status block is STATUS_GOOD. We should only check errors if this 26202 * condition is not true. Even then we should send our own request 26203 * sense packet only if we have a check condition and auto 26204 * request sense has not been performed by the hba. 26205 * Don't get RQS data if pkt_reason is CMD_DEV_GONE. 26206 */ 26207 if ((status != SD_SUCCESS) && 26208 (SD_GET_PKT_STATUS(pktp) == STATUS_CHECK) && 26209 (pktp->pkt_state & STATE_ARQ_DONE) == 0 && 26210 (pktp->pkt_reason != CMD_DEV_GONE)) 26211 (void) sd_send_polled_RQS(un); 26212 26213 return (status); 26214 } 26215 26216 /* 26217 * Function: sd_send_polled_RQS() 26218 * 26219 * Description: This sends the request sense command to a device. 26220 * 26221 * Arguments: sd_lun - The unit structure 26222 * 26223 * Return Code: 0 - Command completed successfully with good status 26224 * -1 - Command failed. 26225 * 26226 */ 26227 26228 static int 26229 sd_send_polled_RQS(struct sd_lun *un) 26230 { 26231 int ret_val; 26232 struct scsi_pkt *rqs_pktp; 26233 struct buf *rqs_bp; 26234 26235 ASSERT(un != NULL); 26236 ASSERT(!mutex_owned(SD_MUTEX(un))); 26237 26238 ret_val = SD_SUCCESS; 26239 26240 rqs_pktp = un->un_rqs_pktp; 26241 rqs_bp = un->un_rqs_bp; 26242 26243 mutex_enter(SD_MUTEX(un)); 26244 26245 if (un->un_sense_isbusy) { 26246 ret_val = SD_FAILURE; 26247 mutex_exit(SD_MUTEX(un)); 26248 return (ret_val); 26249 } 26250 26251 /* 26252 * If the request sense buffer (and packet) is not in use, 26253 * let's set the un_sense_isbusy and send our packet 26254 */ 26255 un->un_sense_isbusy = 1; 26256 rqs_pktp->pkt_resid = 0; 26257 rqs_pktp->pkt_reason = 0; 26258 rqs_pktp->pkt_flags |= FLAG_NOINTR; 26259 bzero(rqs_bp->b_un.b_addr, SENSE_LENGTH); 26260 26261 mutex_exit(SD_MUTEX(un)); 26262 26263 SD_INFO(SD_LOG_COMMON, un, "sd_send_polled_RQS: req sense buf at" 26264 " 0x%p\n", rqs_bp->b_un.b_addr); 26265 26266 /* 26267 * Can't send this to sd_scsi_poll, we wrap ourselves around the 26268 * axle - it has a call into us! 26269 */ 26270 if ((ret_val = sd_ddi_scsi_poll(rqs_pktp)) != 0) { 26271 SD_INFO(SD_LOG_COMMON, un, 26272 "sd_send_polled_RQS: RQS failed\n"); 26273 } 26274 26275 SD_DUMP_MEMORY(un, SD_LOG_COMMON, "sd_send_polled_RQS:", 26276 (uchar_t *)rqs_bp->b_un.b_addr, SENSE_LENGTH, SD_LOG_HEX); 26277 26278 mutex_enter(SD_MUTEX(un)); 26279 un->un_sense_isbusy = 0; 26280 mutex_exit(SD_MUTEX(un)); 26281 26282 return (ret_val); 26283 } 26284 26285 /* 26286 * Defines needed for localized version of the scsi_poll routine. 26287 */ 26288 #define CSEC 10000 /* usecs */ 26289 #define SEC_TO_CSEC (1000000/CSEC) 26290 26291 /* 26292 * Function: sd_ddi_scsi_poll() 26293 * 26294 * Description: Localized version of the scsi_poll routine. The purpose is to 26295 * send a scsi_pkt to a device as a polled command. This version 26296 * is to ensure more robust handling of transport errors. 26297 * Specifically this routine cures not ready, coming ready 26298 * transition for power up and reset of sonoma's. This can take 26299 * up to 45 seconds for power-on and 20 seconds for reset of a 26300 * sonoma lun. 26301 * 26302 * Arguments: scsi_pkt - The scsi_pkt being sent to a device 26303 * 26304 * Return Code: 0 - Command completed successfully with good status 26305 * -1 - Command failed. 26306 * 26307 * NOTE: This code is almost identical to scsi_poll, however before 6668774 can 26308 * be fixed (removing this code), we need to determine how to handle the 26309 * KEY_UNIT_ATTENTION condition below in conditions not as limited as sddump(). 26310 * 26311 * NOTE: This code is only called off sddump(). 26312 */ 26313 static int 26314 sd_ddi_scsi_poll(struct scsi_pkt *pkt) 26315 { 26316 int rval = -1; 26317 int savef; 26318 long savet; 26319 void (*savec)(); 26320 int timeout; 26321 int busy_count; 26322 int poll_delay; 26323 int rc; 26324 uint8_t *sensep; 26325 struct scsi_arq_status *arqstat; 26326 extern int do_polled_io; 26327 26328 ASSERT(pkt->pkt_scbp); 26329 26330 /* 26331 * save old flags.. 26332 */ 26333 savef = pkt->pkt_flags; 26334 savec = pkt->pkt_comp; 26335 savet = pkt->pkt_time; 26336 26337 pkt->pkt_flags |= FLAG_NOINTR; 26338 26339 /* 26340 * XXX there is nothing in the SCSA spec that states that we should not 26341 * do a callback for polled cmds; however, removing this will break sd 26342 * and probably other target drivers 26343 */ 26344 pkt->pkt_comp = NULL; 26345 26346 /* 26347 * we don't like a polled command without timeout. 26348 * 60 seconds seems long enough. 26349 */ 26350 if (pkt->pkt_time == 0) 26351 pkt->pkt_time = SCSI_POLL_TIMEOUT; 26352 26353 /* 26354 * Send polled cmd. 26355 * 26356 * We do some error recovery for various errors. Tran_busy, 26357 * queue full, and non-dispatched commands are retried every 10 msec. 26358 * as they are typically transient failures. Busy status and Not 26359 * Ready are retried every second as this status takes a while to 26360 * change. 26361 */ 26362 timeout = pkt->pkt_time * SEC_TO_CSEC; 26363 26364 for (busy_count = 0; busy_count < timeout; busy_count++) { 26365 /* 26366 * Initialize pkt status variables. 26367 */ 26368 *pkt->pkt_scbp = pkt->pkt_reason = pkt->pkt_state = 0; 26369 26370 if ((rc = scsi_transport(pkt)) != TRAN_ACCEPT) { 26371 if (rc != TRAN_BUSY) { 26372 /* Transport failed - give up. */ 26373 break; 26374 } else { 26375 /* Transport busy - try again. */ 26376 poll_delay = 1 * CSEC; /* 10 msec. */ 26377 } 26378 } else { 26379 /* 26380 * Transport accepted - check pkt status. 26381 */ 26382 rc = (*pkt->pkt_scbp) & STATUS_MASK; 26383 if ((pkt->pkt_reason == CMD_CMPLT) && 26384 (rc == STATUS_CHECK) && 26385 (pkt->pkt_state & STATE_ARQ_DONE)) { 26386 arqstat = 26387 (struct scsi_arq_status *)(pkt->pkt_scbp); 26388 sensep = (uint8_t *)&arqstat->sts_sensedata; 26389 } else { 26390 sensep = NULL; 26391 } 26392 26393 if ((pkt->pkt_reason == CMD_CMPLT) && 26394 (rc == STATUS_GOOD)) { 26395 /* No error - we're done */ 26396 rval = 0; 26397 break; 26398 26399 } else if (pkt->pkt_reason == CMD_DEV_GONE) { 26400 /* Lost connection - give up */ 26401 break; 26402 26403 } else if ((pkt->pkt_reason == CMD_INCOMPLETE) && 26404 (pkt->pkt_state == 0)) { 26405 /* Pkt not dispatched - try again. */ 26406 poll_delay = 1 * CSEC; /* 10 msec. */ 26407 26408 } else if ((pkt->pkt_reason == CMD_CMPLT) && 26409 (rc == STATUS_QFULL)) { 26410 /* Queue full - try again. */ 26411 poll_delay = 1 * CSEC; /* 10 msec. */ 26412 26413 } else if ((pkt->pkt_reason == CMD_CMPLT) && 26414 (rc == STATUS_BUSY)) { 26415 /* Busy - try again. */ 26416 poll_delay = 100 * CSEC; /* 1 sec. */ 26417 busy_count += (SEC_TO_CSEC - 1); 26418 26419 } else if ((sensep != NULL) && 26420 (scsi_sense_key(sensep) == KEY_UNIT_ATTENTION)) { 26421 /* 26422 * Unit Attention - try again. 26423 * Pretend it took 1 sec. 26424 * NOTE: 'continue' avoids poll_delay 26425 */ 26426 busy_count += (SEC_TO_CSEC - 1); 26427 continue; 26428 26429 } else if ((sensep != NULL) && 26430 (scsi_sense_key(sensep) == KEY_NOT_READY) && 26431 (scsi_sense_asc(sensep) == 0x04) && 26432 (scsi_sense_ascq(sensep) == 0x01)) { 26433 /* 26434 * Not ready -> ready - try again. 26435 * 04h/01h: LUN IS IN PROCESS OF BECOMING READY 26436 * ...same as STATUS_BUSY 26437 */ 26438 poll_delay = 100 * CSEC; /* 1 sec. */ 26439 busy_count += (SEC_TO_CSEC - 1); 26440 26441 } else { 26442 /* BAD status - give up. */ 26443 break; 26444 } 26445 } 26446 26447 if (((curthread->t_flag & T_INTR_THREAD) == 0) && 26448 !do_polled_io) { 26449 delay(drv_usectohz(poll_delay)); 26450 } else { 26451 /* we busy wait during cpr_dump or interrupt threads */ 26452 drv_usecwait(poll_delay); 26453 } 26454 } 26455 26456 pkt->pkt_flags = savef; 26457 pkt->pkt_comp = savec; 26458 pkt->pkt_time = savet; 26459 26460 /* return on error */ 26461 if (rval) 26462 return (rval); 26463 26464 /* 26465 * This is not a performance critical code path. 26466 * 26467 * As an accommodation for scsi_poll callers, to avoid ddi_dma_sync() 26468 * issues associated with looking at DMA memory prior to 26469 * scsi_pkt_destroy(), we scsi_sync_pkt() prior to return. 26470 */ 26471 scsi_sync_pkt(pkt); 26472 return (0); 26473 } 26474 26475 26476 26477 /* 26478 * Function: sd_persistent_reservation_in_read_keys 26479 * 26480 * Description: This routine is the driver entry point for handling CD-ROM 26481 * multi-host persistent reservation requests (MHIOCGRP_INKEYS) 26482 * by sending the SCSI-3 PRIN commands to the device. 26483 * Processes the read keys command response by copying the 26484 * reservation key information into the user provided buffer. 26485 * Support for the 32/64 bit _MULTI_DATAMODEL is implemented. 26486 * 26487 * Arguments: un - Pointer to soft state struct for the target. 26488 * usrp - user provided pointer to multihost Persistent In Read 26489 * Keys structure (mhioc_inkeys_t) 26490 * flag - this argument is a pass through to ddi_copyxxx() 26491 * directly from the mode argument of ioctl(). 26492 * 26493 * Return Code: 0 - Success 26494 * EACCES 26495 * ENOTSUP 26496 * errno return code from sd_send_scsi_cmd() 26497 * 26498 * Context: Can sleep. Does not return until command is completed. 26499 */ 26500 26501 static int 26502 sd_persistent_reservation_in_read_keys(struct sd_lun *un, 26503 mhioc_inkeys_t *usrp, int flag) 26504 { 26505 #ifdef _MULTI_DATAMODEL 26506 struct mhioc_key_list32 li32; 26507 #endif 26508 sd_prin_readkeys_t *in; 26509 mhioc_inkeys_t *ptr; 26510 mhioc_key_list_t li; 26511 uchar_t *data_bufp = NULL; 26512 int data_len = 0; 26513 int rval = 0; 26514 size_t copysz = 0; 26515 sd_ssc_t *ssc; 26516 26517 if ((ptr = (mhioc_inkeys_t *)usrp) == NULL) { 26518 return (EINVAL); 26519 } 26520 bzero(&li, sizeof (mhioc_key_list_t)); 26521 26522 ssc = sd_ssc_init(un); 26523 26524 /* 26525 * Get the listsize from user 26526 */ 26527 #ifdef _MULTI_DATAMODEL 26528 switch (ddi_model_convert_from(flag & FMODELS)) { 26529 case DDI_MODEL_ILP32: 26530 copysz = sizeof (struct mhioc_key_list32); 26531 if (ddi_copyin(ptr->li, &li32, copysz, flag)) { 26532 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26533 "sd_persistent_reservation_in_read_keys: " 26534 "failed ddi_copyin: mhioc_key_list32_t\n"); 26535 rval = EFAULT; 26536 goto done; 26537 } 26538 li.listsize = li32.listsize; 26539 li.list = (mhioc_resv_key_t *)(uintptr_t)li32.list; 26540 break; 26541 26542 case DDI_MODEL_NONE: 26543 copysz = sizeof (mhioc_key_list_t); 26544 if (ddi_copyin(ptr->li, &li, copysz, flag)) { 26545 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26546 "sd_persistent_reservation_in_read_keys: " 26547 "failed ddi_copyin: mhioc_key_list_t\n"); 26548 rval = EFAULT; 26549 goto done; 26550 } 26551 break; 26552 } 26553 26554 #else /* ! _MULTI_DATAMODEL */ 26555 copysz = sizeof (mhioc_key_list_t); 26556 if (ddi_copyin(ptr->li, &li, copysz, flag)) { 26557 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26558 "sd_persistent_reservation_in_read_keys: " 26559 "failed ddi_copyin: mhioc_key_list_t\n"); 26560 rval = EFAULT; 26561 goto done; 26562 } 26563 #endif 26564 26565 data_len = li.listsize * MHIOC_RESV_KEY_SIZE; 26566 data_len += (sizeof (sd_prin_readkeys_t) - sizeof (caddr_t)); 26567 data_bufp = kmem_zalloc(data_len, KM_SLEEP); 26568 26569 rval = sd_send_scsi_PERSISTENT_RESERVE_IN(ssc, SD_READ_KEYS, 26570 data_len, data_bufp); 26571 if (rval != 0) { 26572 if (rval == EIO) 26573 sd_ssc_assessment(ssc, SD_FMT_IGNORE_COMPROMISE); 26574 else 26575 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 26576 goto done; 26577 } 26578 in = (sd_prin_readkeys_t *)data_bufp; 26579 ptr->generation = BE_32(in->generation); 26580 li.listlen = BE_32(in->len) / MHIOC_RESV_KEY_SIZE; 26581 26582 /* 26583 * Return the min(listsize, listlen) keys 26584 */ 26585 #ifdef _MULTI_DATAMODEL 26586 26587 switch (ddi_model_convert_from(flag & FMODELS)) { 26588 case DDI_MODEL_ILP32: 26589 li32.listlen = li.listlen; 26590 if (ddi_copyout(&li32, ptr->li, copysz, flag)) { 26591 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26592 "sd_persistent_reservation_in_read_keys: " 26593 "failed ddi_copyout: mhioc_key_list32_t\n"); 26594 rval = EFAULT; 26595 goto done; 26596 } 26597 break; 26598 26599 case DDI_MODEL_NONE: 26600 if (ddi_copyout(&li, ptr->li, copysz, flag)) { 26601 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26602 "sd_persistent_reservation_in_read_keys: " 26603 "failed ddi_copyout: mhioc_key_list_t\n"); 26604 rval = EFAULT; 26605 goto done; 26606 } 26607 break; 26608 } 26609 26610 #else /* ! _MULTI_DATAMODEL */ 26611 26612 if (ddi_copyout(&li, ptr->li, copysz, flag)) { 26613 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26614 "sd_persistent_reservation_in_read_keys: " 26615 "failed ddi_copyout: mhioc_key_list_t\n"); 26616 rval = EFAULT; 26617 goto done; 26618 } 26619 26620 #endif /* _MULTI_DATAMODEL */ 26621 26622 copysz = min(li.listlen * MHIOC_RESV_KEY_SIZE, 26623 li.listsize * MHIOC_RESV_KEY_SIZE); 26624 if (ddi_copyout(&in->keylist, li.list, copysz, flag)) { 26625 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26626 "sd_persistent_reservation_in_read_keys: " 26627 "failed ddi_copyout: keylist\n"); 26628 rval = EFAULT; 26629 } 26630 done: 26631 sd_ssc_fini(ssc); 26632 kmem_free(data_bufp, data_len); 26633 return (rval); 26634 } 26635 26636 26637 /* 26638 * Function: sd_persistent_reservation_in_read_resv 26639 * 26640 * Description: This routine is the driver entry point for handling CD-ROM 26641 * multi-host persistent reservation requests (MHIOCGRP_INRESV) 26642 * by sending the SCSI-3 PRIN commands to the device. 26643 * Process the read persistent reservations command response by 26644 * copying the reservation information into the user provided 26645 * buffer. Support for the 32/64 _MULTI_DATAMODEL is implemented. 26646 * 26647 * Arguments: un - Pointer to soft state struct for the target. 26648 * usrp - user provided pointer to multihost Persistent In Read 26649 * Keys structure (mhioc_inkeys_t) 26650 * flag - this argument is a pass through to ddi_copyxxx() 26651 * directly from the mode argument of ioctl(). 26652 * 26653 * Return Code: 0 - Success 26654 * EACCES 26655 * ENOTSUP 26656 * errno return code from sd_send_scsi_cmd() 26657 * 26658 * Context: Can sleep. Does not return until command is completed. 26659 */ 26660 26661 static int 26662 sd_persistent_reservation_in_read_resv(struct sd_lun *un, 26663 mhioc_inresvs_t *usrp, int flag) 26664 { 26665 #ifdef _MULTI_DATAMODEL 26666 struct mhioc_resv_desc_list32 resvlist32; 26667 #endif 26668 sd_prin_readresv_t *in; 26669 mhioc_inresvs_t *ptr; 26670 sd_readresv_desc_t *readresv_ptr; 26671 mhioc_resv_desc_list_t resvlist; 26672 mhioc_resv_desc_t resvdesc; 26673 uchar_t *data_bufp = NULL; 26674 int data_len; 26675 int rval = 0; 26676 int i; 26677 size_t copysz = 0; 26678 mhioc_resv_desc_t *bufp; 26679 sd_ssc_t *ssc; 26680 26681 if ((ptr = usrp) == NULL) { 26682 return (EINVAL); 26683 } 26684 26685 ssc = sd_ssc_init(un); 26686 26687 /* 26688 * Get the listsize from user 26689 */ 26690 #ifdef _MULTI_DATAMODEL 26691 switch (ddi_model_convert_from(flag & FMODELS)) { 26692 case DDI_MODEL_ILP32: 26693 copysz = sizeof (struct mhioc_resv_desc_list32); 26694 if (ddi_copyin(ptr->li, &resvlist32, copysz, flag)) { 26695 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26696 "sd_persistent_reservation_in_read_resv: " 26697 "failed ddi_copyin: mhioc_resv_desc_list_t\n"); 26698 rval = EFAULT; 26699 goto done; 26700 } 26701 resvlist.listsize = resvlist32.listsize; 26702 resvlist.list = (mhioc_resv_desc_t *)(uintptr_t)resvlist32.list; 26703 break; 26704 26705 case DDI_MODEL_NONE: 26706 copysz = sizeof (mhioc_resv_desc_list_t); 26707 if (ddi_copyin(ptr->li, &resvlist, copysz, flag)) { 26708 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26709 "sd_persistent_reservation_in_read_resv: " 26710 "failed ddi_copyin: mhioc_resv_desc_list_t\n"); 26711 rval = EFAULT; 26712 goto done; 26713 } 26714 break; 26715 } 26716 #else /* ! _MULTI_DATAMODEL */ 26717 copysz = sizeof (mhioc_resv_desc_list_t); 26718 if (ddi_copyin(ptr->li, &resvlist, copysz, flag)) { 26719 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26720 "sd_persistent_reservation_in_read_resv: " 26721 "failed ddi_copyin: mhioc_resv_desc_list_t\n"); 26722 rval = EFAULT; 26723 goto done; 26724 } 26725 #endif /* ! _MULTI_DATAMODEL */ 26726 26727 data_len = resvlist.listsize * SCSI3_RESV_DESC_LEN; 26728 data_len += (sizeof (sd_prin_readresv_t) - sizeof (caddr_t)); 26729 data_bufp = kmem_zalloc(data_len, KM_SLEEP); 26730 26731 rval = sd_send_scsi_PERSISTENT_RESERVE_IN(ssc, SD_READ_RESV, 26732 data_len, data_bufp); 26733 if (rval != 0) { 26734 if (rval == EIO) 26735 sd_ssc_assessment(ssc, SD_FMT_IGNORE_COMPROMISE); 26736 else 26737 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 26738 goto done; 26739 } 26740 in = (sd_prin_readresv_t *)data_bufp; 26741 ptr->generation = BE_32(in->generation); 26742 resvlist.listlen = BE_32(in->len) / SCSI3_RESV_DESC_LEN; 26743 26744 /* 26745 * Return the min(listsize, listlen( keys 26746 */ 26747 #ifdef _MULTI_DATAMODEL 26748 26749 switch (ddi_model_convert_from(flag & FMODELS)) { 26750 case DDI_MODEL_ILP32: 26751 resvlist32.listlen = resvlist.listlen; 26752 if (ddi_copyout(&resvlist32, ptr->li, copysz, flag)) { 26753 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26754 "sd_persistent_reservation_in_read_resv: " 26755 "failed ddi_copyout: mhioc_resv_desc_list_t\n"); 26756 rval = EFAULT; 26757 goto done; 26758 } 26759 break; 26760 26761 case DDI_MODEL_NONE: 26762 if (ddi_copyout(&resvlist, ptr->li, copysz, flag)) { 26763 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26764 "sd_persistent_reservation_in_read_resv: " 26765 "failed ddi_copyout: mhioc_resv_desc_list_t\n"); 26766 rval = EFAULT; 26767 goto done; 26768 } 26769 break; 26770 } 26771 26772 #else /* ! _MULTI_DATAMODEL */ 26773 26774 if (ddi_copyout(&resvlist, ptr->li, copysz, flag)) { 26775 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26776 "sd_persistent_reservation_in_read_resv: " 26777 "failed ddi_copyout: mhioc_resv_desc_list_t\n"); 26778 rval = EFAULT; 26779 goto done; 26780 } 26781 26782 #endif /* ! _MULTI_DATAMODEL */ 26783 26784 readresv_ptr = (sd_readresv_desc_t *)&in->readresv_desc; 26785 bufp = resvlist.list; 26786 copysz = sizeof (mhioc_resv_desc_t); 26787 for (i = 0; i < min(resvlist.listlen, resvlist.listsize); 26788 i++, readresv_ptr++, bufp++) { 26789 26790 bcopy(&readresv_ptr->resvkey, &resvdesc.key, 26791 MHIOC_RESV_KEY_SIZE); 26792 resvdesc.type = readresv_ptr->type; 26793 resvdesc.scope = readresv_ptr->scope; 26794 resvdesc.scope_specific_addr = 26795 BE_32(readresv_ptr->scope_specific_addr); 26796 26797 if (ddi_copyout(&resvdesc, bufp, copysz, flag)) { 26798 SD_ERROR(SD_LOG_IOCTL_MHD, un, 26799 "sd_persistent_reservation_in_read_resv: " 26800 "failed ddi_copyout: resvlist\n"); 26801 rval = EFAULT; 26802 goto done; 26803 } 26804 } 26805 done: 26806 sd_ssc_fini(ssc); 26807 /* only if data_bufp is allocated, we need to free it */ 26808 if (data_bufp) { 26809 kmem_free(data_bufp, data_len); 26810 } 26811 return (rval); 26812 } 26813 26814 26815 /* 26816 * Function: sr_change_blkmode() 26817 * 26818 * Description: This routine is the driver entry point for handling CD-ROM 26819 * block mode ioctl requests. Support for returning and changing 26820 * the current block size in use by the device is implemented. The 26821 * LBA size is changed via a MODE SELECT Block Descriptor. 26822 * 26823 * This routine issues a mode sense with an allocation length of 26824 * 12 bytes for the mode page header and a single block descriptor. 26825 * 26826 * Arguments: dev - the device 'dev_t' 26827 * cmd - the request type; one of CDROMGBLKMODE (get) or 26828 * CDROMSBLKMODE (set) 26829 * data - current block size or requested block size 26830 * flag - this argument is a pass through to ddi_copyxxx() directly 26831 * from the mode argument of ioctl(). 26832 * 26833 * Return Code: the code returned by sd_send_scsi_cmd() 26834 * EINVAL if invalid arguments are provided 26835 * EFAULT if ddi_copyxxx() fails 26836 * ENXIO if fail ddi_get_soft_state 26837 * EIO if invalid mode sense block descriptor length 26838 * 26839 */ 26840 26841 static int 26842 sr_change_blkmode(dev_t dev, int cmd, intptr_t data, int flag) 26843 { 26844 struct sd_lun *un = NULL; 26845 struct mode_header *sense_mhp, *select_mhp; 26846 struct block_descriptor *sense_desc, *select_desc; 26847 int current_bsize; 26848 int rval = EINVAL; 26849 uchar_t *sense = NULL; 26850 uchar_t *select = NULL; 26851 sd_ssc_t *ssc; 26852 26853 ASSERT((cmd == CDROMGBLKMODE) || (cmd == CDROMSBLKMODE)); 26854 26855 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 26856 return (ENXIO); 26857 } 26858 26859 /* 26860 * The block length is changed via the Mode Select block descriptor, the 26861 * "Read/Write Error Recovery" mode page (0x1) contents are not actually 26862 * required as part of this routine. Therefore the mode sense allocation 26863 * length is specified to be the length of a mode page header and a 26864 * block descriptor. 26865 */ 26866 sense = kmem_zalloc(BUFLEN_CHG_BLK_MODE, KM_SLEEP); 26867 26868 ssc = sd_ssc_init(un); 26869 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense, 26870 BUFLEN_CHG_BLK_MODE, MODEPAGE_ERR_RECOV, SD_PATH_STANDARD); 26871 sd_ssc_fini(ssc); 26872 if (rval != 0) { 26873 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26874 "sr_change_blkmode: Mode Sense Failed\n"); 26875 kmem_free(sense, BUFLEN_CHG_BLK_MODE); 26876 return (rval); 26877 } 26878 26879 /* Check the block descriptor len to handle only 1 block descriptor */ 26880 sense_mhp = (struct mode_header *)sense; 26881 if ((sense_mhp->bdesc_length == 0) || 26882 (sense_mhp->bdesc_length > MODE_BLK_DESC_LENGTH)) { 26883 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26884 "sr_change_blkmode: Mode Sense returned invalid block" 26885 " descriptor length\n"); 26886 kmem_free(sense, BUFLEN_CHG_BLK_MODE); 26887 return (EIO); 26888 } 26889 sense_desc = (struct block_descriptor *)(sense + MODE_HEADER_LENGTH); 26890 current_bsize = ((sense_desc->blksize_hi << 16) | 26891 (sense_desc->blksize_mid << 8) | sense_desc->blksize_lo); 26892 26893 /* Process command */ 26894 switch (cmd) { 26895 case CDROMGBLKMODE: 26896 /* Return the block size obtained during the mode sense */ 26897 if (ddi_copyout(¤t_bsize, (void *)data, 26898 sizeof (int), flag) != 0) 26899 rval = EFAULT; 26900 break; 26901 case CDROMSBLKMODE: 26902 /* Validate the requested block size */ 26903 switch (data) { 26904 case CDROM_BLK_512: 26905 case CDROM_BLK_1024: 26906 case CDROM_BLK_2048: 26907 case CDROM_BLK_2056: 26908 case CDROM_BLK_2336: 26909 case CDROM_BLK_2340: 26910 case CDROM_BLK_2352: 26911 case CDROM_BLK_2368: 26912 case CDROM_BLK_2448: 26913 case CDROM_BLK_2646: 26914 case CDROM_BLK_2647: 26915 break; 26916 default: 26917 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26918 "sr_change_blkmode: " 26919 "Block Size '%ld' Not Supported\n", data); 26920 kmem_free(sense, BUFLEN_CHG_BLK_MODE); 26921 return (EINVAL); 26922 } 26923 26924 /* 26925 * The current block size matches the requested block size so 26926 * there is no need to send the mode select to change the size 26927 */ 26928 if (current_bsize == data) { 26929 break; 26930 } 26931 26932 /* Build the select data for the requested block size */ 26933 select = kmem_zalloc(BUFLEN_CHG_BLK_MODE, KM_SLEEP); 26934 select_mhp = (struct mode_header *)select; 26935 select_desc = 26936 (struct block_descriptor *)(select + MODE_HEADER_LENGTH); 26937 /* 26938 * The LBA size is changed via the block descriptor, so the 26939 * descriptor is built according to the user data 26940 */ 26941 select_mhp->bdesc_length = MODE_BLK_DESC_LENGTH; 26942 select_desc->blksize_hi = (char)(((data) & 0x00ff0000) >> 16); 26943 select_desc->blksize_mid = (char)(((data) & 0x0000ff00) >> 8); 26944 select_desc->blksize_lo = (char)((data) & 0x000000ff); 26945 26946 /* Send the mode select for the requested block size */ 26947 ssc = sd_ssc_init(un); 26948 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, 26949 select, BUFLEN_CHG_BLK_MODE, SD_DONTSAVE_PAGE, 26950 SD_PATH_STANDARD); 26951 sd_ssc_fini(ssc); 26952 if (rval != 0) { 26953 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26954 "sr_change_blkmode: Mode Select Failed\n"); 26955 /* 26956 * The mode select failed for the requested block size, 26957 * so reset the data for the original block size and 26958 * send it to the target. The error is indicated by the 26959 * return value for the failed mode select. 26960 */ 26961 select_desc->blksize_hi = sense_desc->blksize_hi; 26962 select_desc->blksize_mid = sense_desc->blksize_mid; 26963 select_desc->blksize_lo = sense_desc->blksize_lo; 26964 ssc = sd_ssc_init(un); 26965 (void) sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, 26966 select, BUFLEN_CHG_BLK_MODE, SD_DONTSAVE_PAGE, 26967 SD_PATH_STANDARD); 26968 sd_ssc_fini(ssc); 26969 } else { 26970 ASSERT(!mutex_owned(SD_MUTEX(un))); 26971 mutex_enter(SD_MUTEX(un)); 26972 sd_update_block_info(un, (uint32_t)data, 0); 26973 mutex_exit(SD_MUTEX(un)); 26974 } 26975 break; 26976 default: 26977 /* should not reach here, but check anyway */ 26978 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 26979 "sr_change_blkmode: Command '%x' Not Supported\n", cmd); 26980 rval = EINVAL; 26981 break; 26982 } 26983 26984 if (select) { 26985 kmem_free(select, BUFLEN_CHG_BLK_MODE); 26986 } 26987 if (sense) { 26988 kmem_free(sense, BUFLEN_CHG_BLK_MODE); 26989 } 26990 return (rval); 26991 } 26992 26993 26994 /* 26995 * Note: The following sr_change_speed() and sr_atapi_change_speed() routines 26996 * implement driver support for getting and setting the CD speed. The command 26997 * set used will be based on the device type. If the device has not been 26998 * identified as MMC the Toshiba vendor specific mode page will be used. If 26999 * the device is MMC but does not support the Real Time Streaming feature 27000 * the SET CD SPEED command will be used to set speed and mode page 0x2A will 27001 * be used to read the speed. 27002 */ 27003 27004 /* 27005 * Function: sr_change_speed() 27006 * 27007 * Description: This routine is the driver entry point for handling CD-ROM 27008 * drive speed ioctl requests for devices supporting the Toshiba 27009 * vendor specific drive speed mode page. Support for returning 27010 * and changing the current drive speed in use by the device is 27011 * implemented. 27012 * 27013 * Arguments: dev - the device 'dev_t' 27014 * cmd - the request type; one of CDROMGDRVSPEED (get) or 27015 * CDROMSDRVSPEED (set) 27016 * data - current drive speed or requested drive speed 27017 * flag - this argument is a pass through to ddi_copyxxx() directly 27018 * from the mode argument of ioctl(). 27019 * 27020 * Return Code: the code returned by sd_send_scsi_cmd() 27021 * EINVAL if invalid arguments are provided 27022 * EFAULT if ddi_copyxxx() fails 27023 * ENXIO if fail ddi_get_soft_state 27024 * EIO if invalid mode sense block descriptor length 27025 */ 27026 27027 static int 27028 sr_change_speed(dev_t dev, int cmd, intptr_t data, int flag) 27029 { 27030 struct sd_lun *un = NULL; 27031 struct mode_header *sense_mhp, *select_mhp; 27032 struct mode_speed *sense_page, *select_page; 27033 int current_speed; 27034 int rval = EINVAL; 27035 int bd_len; 27036 uchar_t *sense = NULL; 27037 uchar_t *select = NULL; 27038 sd_ssc_t *ssc; 27039 27040 ASSERT((cmd == CDROMGDRVSPEED) || (cmd == CDROMSDRVSPEED)); 27041 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 27042 return (ENXIO); 27043 } 27044 27045 /* 27046 * Note: The drive speed is being modified here according to a Toshiba 27047 * vendor specific mode page (0x31). 27048 */ 27049 sense = kmem_zalloc(BUFLEN_MODE_CDROM_SPEED, KM_SLEEP); 27050 27051 ssc = sd_ssc_init(un); 27052 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense, 27053 BUFLEN_MODE_CDROM_SPEED, CDROM_MODE_SPEED, 27054 SD_PATH_STANDARD); 27055 sd_ssc_fini(ssc); 27056 if (rval != 0) { 27057 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27058 "sr_change_speed: Mode Sense Failed\n"); 27059 kmem_free(sense, BUFLEN_MODE_CDROM_SPEED); 27060 return (rval); 27061 } 27062 sense_mhp = (struct mode_header *)sense; 27063 27064 /* Check the block descriptor len to handle only 1 block descriptor */ 27065 bd_len = sense_mhp->bdesc_length; 27066 if (bd_len > MODE_BLK_DESC_LENGTH) { 27067 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27068 "sr_change_speed: Mode Sense returned invalid block " 27069 "descriptor length\n"); 27070 kmem_free(sense, BUFLEN_MODE_CDROM_SPEED); 27071 return (EIO); 27072 } 27073 27074 sense_page = (struct mode_speed *) 27075 (sense + MODE_HEADER_LENGTH + sense_mhp->bdesc_length); 27076 current_speed = sense_page->speed; 27077 27078 /* Process command */ 27079 switch (cmd) { 27080 case CDROMGDRVSPEED: 27081 /* Return the drive speed obtained during the mode sense */ 27082 if (current_speed == 0x2) { 27083 current_speed = CDROM_TWELVE_SPEED; 27084 } 27085 if (ddi_copyout(¤t_speed, (void *)data, 27086 sizeof (int), flag) != 0) { 27087 rval = EFAULT; 27088 } 27089 break; 27090 case CDROMSDRVSPEED: 27091 /* Validate the requested drive speed */ 27092 switch ((uchar_t)data) { 27093 case CDROM_TWELVE_SPEED: 27094 data = 0x2; 27095 /*FALLTHROUGH*/ 27096 case CDROM_NORMAL_SPEED: 27097 case CDROM_DOUBLE_SPEED: 27098 case CDROM_QUAD_SPEED: 27099 case CDROM_MAXIMUM_SPEED: 27100 break; 27101 default: 27102 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27103 "sr_change_speed: " 27104 "Drive Speed '%d' Not Supported\n", (uchar_t)data); 27105 kmem_free(sense, BUFLEN_MODE_CDROM_SPEED); 27106 return (EINVAL); 27107 } 27108 27109 /* 27110 * The current drive speed matches the requested drive speed so 27111 * there is no need to send the mode select to change the speed 27112 */ 27113 if (current_speed == data) { 27114 break; 27115 } 27116 27117 /* Build the select data for the requested drive speed */ 27118 select = kmem_zalloc(BUFLEN_MODE_CDROM_SPEED, KM_SLEEP); 27119 select_mhp = (struct mode_header *)select; 27120 select_mhp->bdesc_length = 0; 27121 select_page = 27122 (struct mode_speed *)(select + MODE_HEADER_LENGTH); 27123 select_page = 27124 (struct mode_speed *)(select + MODE_HEADER_LENGTH); 27125 select_page->mode_page.code = CDROM_MODE_SPEED; 27126 select_page->mode_page.length = 2; 27127 select_page->speed = (uchar_t)data; 27128 27129 /* Send the mode select for the requested block size */ 27130 ssc = sd_ssc_init(un); 27131 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select, 27132 MODEPAGE_CDROM_SPEED_LEN + MODE_HEADER_LENGTH, 27133 SD_DONTSAVE_PAGE, SD_PATH_STANDARD); 27134 sd_ssc_fini(ssc); 27135 if (rval != 0) { 27136 /* 27137 * The mode select failed for the requested drive speed, 27138 * so reset the data for the original drive speed and 27139 * send it to the target. The error is indicated by the 27140 * return value for the failed mode select. 27141 */ 27142 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27143 "sr_drive_speed: Mode Select Failed\n"); 27144 select_page->speed = sense_page->speed; 27145 ssc = sd_ssc_init(un); 27146 (void) sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select, 27147 MODEPAGE_CDROM_SPEED_LEN + MODE_HEADER_LENGTH, 27148 SD_DONTSAVE_PAGE, SD_PATH_STANDARD); 27149 sd_ssc_fini(ssc); 27150 } 27151 break; 27152 default: 27153 /* should not reach here, but check anyway */ 27154 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27155 "sr_change_speed: Command '%x' Not Supported\n", cmd); 27156 rval = EINVAL; 27157 break; 27158 } 27159 27160 if (select) { 27161 kmem_free(select, BUFLEN_MODE_CDROM_SPEED); 27162 } 27163 if (sense) { 27164 kmem_free(sense, BUFLEN_MODE_CDROM_SPEED); 27165 } 27166 27167 return (rval); 27168 } 27169 27170 27171 /* 27172 * Function: sr_atapi_change_speed() 27173 * 27174 * Description: This routine is the driver entry point for handling CD-ROM 27175 * drive speed ioctl requests for MMC devices that do not support 27176 * the Real Time Streaming feature (0x107). 27177 * 27178 * Note: This routine will use the SET SPEED command which may not 27179 * be supported by all devices. 27180 * 27181 * Arguments: dev- the device 'dev_t' 27182 * cmd- the request type; one of CDROMGDRVSPEED (get) or 27183 * CDROMSDRVSPEED (set) 27184 * data- current drive speed or requested drive speed 27185 * flag- this argument is a pass through to ddi_copyxxx() directly 27186 * from the mode argument of ioctl(). 27187 * 27188 * Return Code: the code returned by sd_send_scsi_cmd() 27189 * EINVAL if invalid arguments are provided 27190 * EFAULT if ddi_copyxxx() fails 27191 * ENXIO if fail ddi_get_soft_state 27192 * EIO if invalid mode sense block descriptor length 27193 */ 27194 27195 static int 27196 sr_atapi_change_speed(dev_t dev, int cmd, intptr_t data, int flag) 27197 { 27198 struct sd_lun *un; 27199 struct uscsi_cmd *com = NULL; 27200 struct mode_header_grp2 *sense_mhp; 27201 uchar_t *sense_page; 27202 uchar_t *sense = NULL; 27203 char cdb[CDB_GROUP5]; 27204 int bd_len; 27205 int current_speed = 0; 27206 int max_speed = 0; 27207 int rval; 27208 sd_ssc_t *ssc; 27209 27210 ASSERT((cmd == CDROMGDRVSPEED) || (cmd == CDROMSDRVSPEED)); 27211 27212 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 27213 return (ENXIO); 27214 } 27215 27216 sense = kmem_zalloc(BUFLEN_MODE_CDROM_CAP, KM_SLEEP); 27217 27218 ssc = sd_ssc_init(un); 27219 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, sense, 27220 BUFLEN_MODE_CDROM_CAP, MODEPAGE_CDROM_CAP, 27221 SD_PATH_STANDARD); 27222 sd_ssc_fini(ssc); 27223 if (rval != 0) { 27224 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27225 "sr_atapi_change_speed: Mode Sense Failed\n"); 27226 kmem_free(sense, BUFLEN_MODE_CDROM_CAP); 27227 return (rval); 27228 } 27229 27230 /* Check the block descriptor len to handle only 1 block descriptor */ 27231 sense_mhp = (struct mode_header_grp2 *)sense; 27232 bd_len = (sense_mhp->bdesc_length_hi << 8) | sense_mhp->bdesc_length_lo; 27233 if (bd_len > MODE_BLK_DESC_LENGTH) { 27234 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27235 "sr_atapi_change_speed: Mode Sense returned invalid " 27236 "block descriptor length\n"); 27237 kmem_free(sense, BUFLEN_MODE_CDROM_CAP); 27238 return (EIO); 27239 } 27240 27241 /* Calculate the current and maximum drive speeds */ 27242 sense_page = (uchar_t *)(sense + MODE_HEADER_LENGTH_GRP2 + bd_len); 27243 current_speed = (sense_page[14] << 8) | sense_page[15]; 27244 max_speed = (sense_page[8] << 8) | sense_page[9]; 27245 27246 /* Process the command */ 27247 switch (cmd) { 27248 case CDROMGDRVSPEED: 27249 current_speed /= SD_SPEED_1X; 27250 if (ddi_copyout(¤t_speed, (void *)data, 27251 sizeof (int), flag) != 0) 27252 rval = EFAULT; 27253 break; 27254 case CDROMSDRVSPEED: 27255 /* Convert the speed code to KB/sec */ 27256 switch ((uchar_t)data) { 27257 case CDROM_NORMAL_SPEED: 27258 current_speed = SD_SPEED_1X; 27259 break; 27260 case CDROM_DOUBLE_SPEED: 27261 current_speed = 2 * SD_SPEED_1X; 27262 break; 27263 case CDROM_QUAD_SPEED: 27264 current_speed = 4 * SD_SPEED_1X; 27265 break; 27266 case CDROM_TWELVE_SPEED: 27267 current_speed = 12 * SD_SPEED_1X; 27268 break; 27269 case CDROM_MAXIMUM_SPEED: 27270 current_speed = 0xffff; 27271 break; 27272 default: 27273 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27274 "sr_atapi_change_speed: invalid drive speed %d\n", 27275 (uchar_t)data); 27276 kmem_free(sense, BUFLEN_MODE_CDROM_CAP); 27277 return (EINVAL); 27278 } 27279 27280 /* Check the request against the drive's max speed. */ 27281 if (current_speed != 0xffff) { 27282 if (current_speed > max_speed) { 27283 kmem_free(sense, BUFLEN_MODE_CDROM_CAP); 27284 return (EINVAL); 27285 } 27286 } 27287 27288 /* 27289 * Build and send the SET SPEED command 27290 * 27291 * Note: The SET SPEED (0xBB) command used in this routine is 27292 * obsolete per the SCSI MMC spec but still supported in the 27293 * MT FUJI vendor spec. Most equipment is adhereing to MT FUJI 27294 * therefore the command is still implemented in this routine. 27295 */ 27296 bzero(cdb, sizeof (cdb)); 27297 cdb[0] = (char)SCMD_SET_CDROM_SPEED; 27298 cdb[2] = (uchar_t)(current_speed >> 8); 27299 cdb[3] = (uchar_t)current_speed; 27300 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27301 com->uscsi_cdb = (caddr_t)cdb; 27302 com->uscsi_cdblen = CDB_GROUP5; 27303 com->uscsi_bufaddr = NULL; 27304 com->uscsi_buflen = 0; 27305 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT; 27306 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, 0, SD_PATH_STANDARD); 27307 break; 27308 default: 27309 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27310 "sr_atapi_change_speed: Command '%x' Not Supported\n", cmd); 27311 rval = EINVAL; 27312 } 27313 27314 if (sense) { 27315 kmem_free(sense, BUFLEN_MODE_CDROM_CAP); 27316 } 27317 if (com) { 27318 kmem_free(com, sizeof (*com)); 27319 } 27320 return (rval); 27321 } 27322 27323 27324 /* 27325 * Function: sr_pause_resume() 27326 * 27327 * Description: This routine is the driver entry point for handling CD-ROM 27328 * pause/resume ioctl requests. This only affects the audio play 27329 * operation. 27330 * 27331 * Arguments: dev - the device 'dev_t' 27332 * cmd - the request type; one of CDROMPAUSE or CDROMRESUME, used 27333 * for setting the resume bit of the cdb. 27334 * 27335 * Return Code: the code returned by sd_send_scsi_cmd() 27336 * EINVAL if invalid mode specified 27337 * 27338 */ 27339 27340 static int 27341 sr_pause_resume(dev_t dev, int cmd) 27342 { 27343 struct sd_lun *un; 27344 struct uscsi_cmd *com; 27345 char cdb[CDB_GROUP1]; 27346 int rval; 27347 27348 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 27349 return (ENXIO); 27350 } 27351 27352 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27353 bzero(cdb, CDB_GROUP1); 27354 cdb[0] = SCMD_PAUSE_RESUME; 27355 switch (cmd) { 27356 case CDROMRESUME: 27357 cdb[8] = 1; 27358 break; 27359 case CDROMPAUSE: 27360 cdb[8] = 0; 27361 break; 27362 default: 27363 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_pause_resume:" 27364 " Command '%x' Not Supported\n", cmd); 27365 rval = EINVAL; 27366 goto done; 27367 } 27368 27369 com->uscsi_cdb = cdb; 27370 com->uscsi_cdblen = CDB_GROUP1; 27371 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT; 27372 27373 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27374 SD_PATH_STANDARD); 27375 27376 done: 27377 kmem_free(com, sizeof (*com)); 27378 return (rval); 27379 } 27380 27381 27382 /* 27383 * Function: sr_play_msf() 27384 * 27385 * Description: This routine is the driver entry point for handling CD-ROM 27386 * ioctl requests to output the audio signals at the specified 27387 * starting address and continue the audio play until the specified 27388 * ending address (CDROMPLAYMSF) The address is in Minute Second 27389 * Frame (MSF) format. 27390 * 27391 * Arguments: dev - the device 'dev_t' 27392 * data - pointer to user provided audio msf structure, 27393 * specifying start/end addresses. 27394 * flag - this argument is a pass through to ddi_copyxxx() 27395 * directly from the mode argument of ioctl(). 27396 * 27397 * Return Code: the code returned by sd_send_scsi_cmd() 27398 * EFAULT if ddi_copyxxx() fails 27399 * ENXIO if fail ddi_get_soft_state 27400 * EINVAL if data pointer is NULL 27401 */ 27402 27403 static int 27404 sr_play_msf(dev_t dev, caddr_t data, int flag) 27405 { 27406 struct sd_lun *un; 27407 struct uscsi_cmd *com; 27408 struct cdrom_msf msf_struct; 27409 struct cdrom_msf *msf = &msf_struct; 27410 char cdb[CDB_GROUP1]; 27411 int rval; 27412 27413 if (data == NULL) { 27414 return (EINVAL); 27415 } 27416 27417 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 27418 return (ENXIO); 27419 } 27420 27421 if (ddi_copyin(data, msf, sizeof (struct cdrom_msf), flag)) { 27422 return (EFAULT); 27423 } 27424 27425 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27426 bzero(cdb, CDB_GROUP1); 27427 cdb[0] = SCMD_PLAYAUDIO_MSF; 27428 if (un->un_f_cfg_playmsf_bcd == TRUE) { 27429 cdb[3] = BYTE_TO_BCD(msf->cdmsf_min0); 27430 cdb[4] = BYTE_TO_BCD(msf->cdmsf_sec0); 27431 cdb[5] = BYTE_TO_BCD(msf->cdmsf_frame0); 27432 cdb[6] = BYTE_TO_BCD(msf->cdmsf_min1); 27433 cdb[7] = BYTE_TO_BCD(msf->cdmsf_sec1); 27434 cdb[8] = BYTE_TO_BCD(msf->cdmsf_frame1); 27435 } else { 27436 cdb[3] = msf->cdmsf_min0; 27437 cdb[4] = msf->cdmsf_sec0; 27438 cdb[5] = msf->cdmsf_frame0; 27439 cdb[6] = msf->cdmsf_min1; 27440 cdb[7] = msf->cdmsf_sec1; 27441 cdb[8] = msf->cdmsf_frame1; 27442 } 27443 com->uscsi_cdb = cdb; 27444 com->uscsi_cdblen = CDB_GROUP1; 27445 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT; 27446 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27447 SD_PATH_STANDARD); 27448 kmem_free(com, sizeof (*com)); 27449 return (rval); 27450 } 27451 27452 27453 /* 27454 * Function: sr_play_trkind() 27455 * 27456 * Description: This routine is the driver entry point for handling CD-ROM 27457 * ioctl requests to output the audio signals at the specified 27458 * starting address and continue the audio play until the specified 27459 * ending address (CDROMPLAYTRKIND). The address is in Track Index 27460 * format. 27461 * 27462 * Arguments: dev - the device 'dev_t' 27463 * data - pointer to user provided audio track/index structure, 27464 * specifying start/end addresses. 27465 * flag - this argument is a pass through to ddi_copyxxx() 27466 * directly from the mode argument of ioctl(). 27467 * 27468 * Return Code: the code returned by sd_send_scsi_cmd() 27469 * EFAULT if ddi_copyxxx() fails 27470 * ENXIO if fail ddi_get_soft_state 27471 * EINVAL if data pointer is NULL 27472 */ 27473 27474 static int 27475 sr_play_trkind(dev_t dev, caddr_t data, int flag) 27476 { 27477 struct cdrom_ti ti_struct; 27478 struct cdrom_ti *ti = &ti_struct; 27479 struct uscsi_cmd *com = NULL; 27480 char cdb[CDB_GROUP1]; 27481 int rval; 27482 27483 if (data == NULL) { 27484 return (EINVAL); 27485 } 27486 27487 if (ddi_copyin(data, ti, sizeof (struct cdrom_ti), flag)) { 27488 return (EFAULT); 27489 } 27490 27491 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27492 bzero(cdb, CDB_GROUP1); 27493 cdb[0] = SCMD_PLAYAUDIO_TI; 27494 cdb[4] = ti->cdti_trk0; 27495 cdb[5] = ti->cdti_ind0; 27496 cdb[7] = ti->cdti_trk1; 27497 cdb[8] = ti->cdti_ind1; 27498 com->uscsi_cdb = cdb; 27499 com->uscsi_cdblen = CDB_GROUP1; 27500 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT; 27501 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27502 SD_PATH_STANDARD); 27503 kmem_free(com, sizeof (*com)); 27504 return (rval); 27505 } 27506 27507 27508 /* 27509 * Function: sr_read_all_subcodes() 27510 * 27511 * Description: This routine is the driver entry point for handling CD-ROM 27512 * ioctl requests to return raw subcode data while the target is 27513 * playing audio (CDROMSUBCODE). 27514 * 27515 * Arguments: dev - the device 'dev_t' 27516 * data - pointer to user provided cdrom subcode structure, 27517 * specifying the transfer length and address. 27518 * flag - this argument is a pass through to ddi_copyxxx() 27519 * directly from the mode argument of ioctl(). 27520 * 27521 * Return Code: the code returned by sd_send_scsi_cmd() 27522 * EFAULT if ddi_copyxxx() fails 27523 * ENXIO if fail ddi_get_soft_state 27524 * EINVAL if data pointer is NULL 27525 */ 27526 27527 static int 27528 sr_read_all_subcodes(dev_t dev, caddr_t data, int flag) 27529 { 27530 struct sd_lun *un = NULL; 27531 struct uscsi_cmd *com = NULL; 27532 struct cdrom_subcode *subcode = NULL; 27533 int rval; 27534 size_t buflen; 27535 char cdb[CDB_GROUP5]; 27536 27537 #ifdef _MULTI_DATAMODEL 27538 /* To support ILP32 applications in an LP64 world */ 27539 struct cdrom_subcode32 cdrom_subcode32; 27540 struct cdrom_subcode32 *cdsc32 = &cdrom_subcode32; 27541 #endif 27542 if (data == NULL) { 27543 return (EINVAL); 27544 } 27545 27546 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 27547 return (ENXIO); 27548 } 27549 27550 subcode = kmem_zalloc(sizeof (struct cdrom_subcode), KM_SLEEP); 27551 27552 #ifdef _MULTI_DATAMODEL 27553 switch (ddi_model_convert_from(flag & FMODELS)) { 27554 case DDI_MODEL_ILP32: 27555 if (ddi_copyin(data, cdsc32, sizeof (*cdsc32), flag)) { 27556 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27557 "sr_read_all_subcodes: ddi_copyin Failed\n"); 27558 kmem_free(subcode, sizeof (struct cdrom_subcode)); 27559 return (EFAULT); 27560 } 27561 /* Convert the ILP32 uscsi data from the application to LP64 */ 27562 cdrom_subcode32tocdrom_subcode(cdsc32, subcode); 27563 break; 27564 case DDI_MODEL_NONE: 27565 if (ddi_copyin(data, subcode, 27566 sizeof (struct cdrom_subcode), flag)) { 27567 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27568 "sr_read_all_subcodes: ddi_copyin Failed\n"); 27569 kmem_free(subcode, sizeof (struct cdrom_subcode)); 27570 return (EFAULT); 27571 } 27572 break; 27573 } 27574 #else /* ! _MULTI_DATAMODEL */ 27575 if (ddi_copyin(data, subcode, sizeof (struct cdrom_subcode), flag)) { 27576 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27577 "sr_read_all_subcodes: ddi_copyin Failed\n"); 27578 kmem_free(subcode, sizeof (struct cdrom_subcode)); 27579 return (EFAULT); 27580 } 27581 #endif /* _MULTI_DATAMODEL */ 27582 27583 /* 27584 * Since MMC-2 expects max 3 bytes for length, check if the 27585 * length input is greater than 3 bytes 27586 */ 27587 if ((subcode->cdsc_length & 0xFF000000) != 0) { 27588 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 27589 "sr_read_all_subcodes: " 27590 "cdrom transfer length too large: %d (limit %d)\n", 27591 subcode->cdsc_length, 0xFFFFFF); 27592 kmem_free(subcode, sizeof (struct cdrom_subcode)); 27593 return (EINVAL); 27594 } 27595 27596 buflen = CDROM_BLK_SUBCODE * subcode->cdsc_length; 27597 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27598 bzero(cdb, CDB_GROUP5); 27599 27600 if (un->un_f_mmc_cap == TRUE) { 27601 cdb[0] = (char)SCMD_READ_CD; 27602 cdb[2] = (char)0xff; 27603 cdb[3] = (char)0xff; 27604 cdb[4] = (char)0xff; 27605 cdb[5] = (char)0xff; 27606 cdb[6] = (((subcode->cdsc_length) & 0x00ff0000) >> 16); 27607 cdb[7] = (((subcode->cdsc_length) & 0x0000ff00) >> 8); 27608 cdb[8] = ((subcode->cdsc_length) & 0x000000ff); 27609 cdb[10] = 1; 27610 } else { 27611 /* 27612 * Note: A vendor specific command (0xDF) is being used here to 27613 * request a read of all subcodes. 27614 */ 27615 cdb[0] = (char)SCMD_READ_ALL_SUBCODES; 27616 cdb[6] = (((subcode->cdsc_length) & 0xff000000) >> 24); 27617 cdb[7] = (((subcode->cdsc_length) & 0x00ff0000) >> 16); 27618 cdb[8] = (((subcode->cdsc_length) & 0x0000ff00) >> 8); 27619 cdb[9] = ((subcode->cdsc_length) & 0x000000ff); 27620 } 27621 com->uscsi_cdb = cdb; 27622 com->uscsi_cdblen = CDB_GROUP5; 27623 com->uscsi_bufaddr = (caddr_t)subcode->cdsc_addr; 27624 com->uscsi_buflen = buflen; 27625 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 27626 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE, 27627 SD_PATH_STANDARD); 27628 kmem_free(subcode, sizeof (struct cdrom_subcode)); 27629 kmem_free(com, sizeof (*com)); 27630 return (rval); 27631 } 27632 27633 27634 /* 27635 * Function: sr_read_subchannel() 27636 * 27637 * Description: This routine is the driver entry point for handling CD-ROM 27638 * ioctl requests to return the Q sub-channel data of the CD 27639 * current position block. (CDROMSUBCHNL) The data includes the 27640 * track number, index number, absolute CD-ROM address (LBA or MSF 27641 * format per the user) , track relative CD-ROM address (LBA or MSF 27642 * format per the user), control data and audio status. 27643 * 27644 * Arguments: dev - the device 'dev_t' 27645 * data - pointer to user provided cdrom sub-channel structure 27646 * flag - this argument is a pass through to ddi_copyxxx() 27647 * directly from the mode argument of ioctl(). 27648 * 27649 * Return Code: the code returned by sd_send_scsi_cmd() 27650 * EFAULT if ddi_copyxxx() fails 27651 * ENXIO if fail ddi_get_soft_state 27652 * EINVAL if data pointer is NULL 27653 */ 27654 27655 static int 27656 sr_read_subchannel(dev_t dev, caddr_t data, int flag) 27657 { 27658 struct sd_lun *un; 27659 struct uscsi_cmd *com; 27660 struct cdrom_subchnl subchanel; 27661 struct cdrom_subchnl *subchnl = &subchanel; 27662 char cdb[CDB_GROUP1]; 27663 caddr_t buffer; 27664 int rval; 27665 27666 if (data == NULL) { 27667 return (EINVAL); 27668 } 27669 27670 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 27671 (un->un_state == SD_STATE_OFFLINE)) { 27672 return (ENXIO); 27673 } 27674 27675 if (ddi_copyin(data, subchnl, sizeof (struct cdrom_subchnl), flag)) { 27676 return (EFAULT); 27677 } 27678 27679 buffer = kmem_zalloc((size_t)16, KM_SLEEP); 27680 bzero(cdb, CDB_GROUP1); 27681 cdb[0] = SCMD_READ_SUBCHANNEL; 27682 /* Set the MSF bit based on the user requested address format */ 27683 cdb[1] = (subchnl->cdsc_format & CDROM_LBA) ? 0 : 0x02; 27684 /* 27685 * Set the Q bit in byte 2 to indicate that Q sub-channel data be 27686 * returned 27687 */ 27688 cdb[2] = 0x40; 27689 /* 27690 * Set byte 3 to specify the return data format. A value of 0x01 27691 * indicates that the CD-ROM current position should be returned. 27692 */ 27693 cdb[3] = 0x01; 27694 cdb[8] = 0x10; 27695 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27696 com->uscsi_cdb = cdb; 27697 com->uscsi_cdblen = CDB_GROUP1; 27698 com->uscsi_bufaddr = buffer; 27699 com->uscsi_buflen = 16; 27700 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 27701 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27702 SD_PATH_STANDARD); 27703 if (rval != 0) { 27704 kmem_free(buffer, 16); 27705 kmem_free(com, sizeof (*com)); 27706 return (rval); 27707 } 27708 27709 /* Process the returned Q sub-channel data */ 27710 subchnl->cdsc_audiostatus = buffer[1]; 27711 subchnl->cdsc_adr = (buffer[5] & 0xF0) >> 4; 27712 subchnl->cdsc_ctrl = (buffer[5] & 0x0F); 27713 subchnl->cdsc_trk = buffer[6]; 27714 subchnl->cdsc_ind = buffer[7]; 27715 if (subchnl->cdsc_format & CDROM_LBA) { 27716 subchnl->cdsc_absaddr.lba = 27717 ((uchar_t)buffer[8] << 24) + ((uchar_t)buffer[9] << 16) + 27718 ((uchar_t)buffer[10] << 8) + ((uchar_t)buffer[11]); 27719 subchnl->cdsc_reladdr.lba = 27720 ((uchar_t)buffer[12] << 24) + ((uchar_t)buffer[13] << 16) + 27721 ((uchar_t)buffer[14] << 8) + ((uchar_t)buffer[15]); 27722 } else if (un->un_f_cfg_readsub_bcd == TRUE) { 27723 subchnl->cdsc_absaddr.msf.minute = BCD_TO_BYTE(buffer[9]); 27724 subchnl->cdsc_absaddr.msf.second = BCD_TO_BYTE(buffer[10]); 27725 subchnl->cdsc_absaddr.msf.frame = BCD_TO_BYTE(buffer[11]); 27726 subchnl->cdsc_reladdr.msf.minute = BCD_TO_BYTE(buffer[13]); 27727 subchnl->cdsc_reladdr.msf.second = BCD_TO_BYTE(buffer[14]); 27728 subchnl->cdsc_reladdr.msf.frame = BCD_TO_BYTE(buffer[15]); 27729 } else { 27730 subchnl->cdsc_absaddr.msf.minute = buffer[9]; 27731 subchnl->cdsc_absaddr.msf.second = buffer[10]; 27732 subchnl->cdsc_absaddr.msf.frame = buffer[11]; 27733 subchnl->cdsc_reladdr.msf.minute = buffer[13]; 27734 subchnl->cdsc_reladdr.msf.second = buffer[14]; 27735 subchnl->cdsc_reladdr.msf.frame = buffer[15]; 27736 } 27737 kmem_free(buffer, 16); 27738 kmem_free(com, sizeof (*com)); 27739 if (ddi_copyout(subchnl, data, sizeof (struct cdrom_subchnl), flag) 27740 != 0) { 27741 return (EFAULT); 27742 } 27743 return (rval); 27744 } 27745 27746 27747 /* 27748 * Function: sr_read_tocentry() 27749 * 27750 * Description: This routine is the driver entry point for handling CD-ROM 27751 * ioctl requests to read from the Table of Contents (TOC) 27752 * (CDROMREADTOCENTRY). This routine provides the ADR and CTRL 27753 * fields, the starting address (LBA or MSF format per the user) 27754 * and the data mode if the user specified track is a data track. 27755 * 27756 * Note: The READ HEADER (0x44) command used in this routine is 27757 * obsolete per the SCSI MMC spec but still supported in the 27758 * MT FUJI vendor spec. Most equipment is adhereing to MT FUJI 27759 * therefore the command is still implemented in this routine. 27760 * 27761 * Arguments: dev - the device 'dev_t' 27762 * data - pointer to user provided toc entry structure, 27763 * specifying the track # and the address format 27764 * (LBA or MSF). 27765 * flag - this argument is a pass through to ddi_copyxxx() 27766 * directly from the mode argument of ioctl(). 27767 * 27768 * Return Code: the code returned by sd_send_scsi_cmd() 27769 * EFAULT if ddi_copyxxx() fails 27770 * ENXIO if fail ddi_get_soft_state 27771 * EINVAL if data pointer is NULL 27772 */ 27773 27774 static int 27775 sr_read_tocentry(dev_t dev, caddr_t data, int flag) 27776 { 27777 struct sd_lun *un = NULL; 27778 struct uscsi_cmd *com; 27779 struct cdrom_tocentry toc_entry; 27780 struct cdrom_tocentry *entry = &toc_entry; 27781 caddr_t buffer; 27782 int rval; 27783 char cdb[CDB_GROUP1]; 27784 27785 if (data == NULL) { 27786 return (EINVAL); 27787 } 27788 27789 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 27790 (un->un_state == SD_STATE_OFFLINE)) { 27791 return (ENXIO); 27792 } 27793 27794 if (ddi_copyin(data, entry, sizeof (struct cdrom_tocentry), flag)) { 27795 return (EFAULT); 27796 } 27797 27798 /* Validate the requested track and address format */ 27799 if (!(entry->cdte_format & (CDROM_LBA | CDROM_MSF))) { 27800 return (EINVAL); 27801 } 27802 27803 if (entry->cdte_track == 0) { 27804 return (EINVAL); 27805 } 27806 27807 buffer = kmem_zalloc((size_t)12, KM_SLEEP); 27808 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27809 bzero(cdb, CDB_GROUP1); 27810 27811 cdb[0] = SCMD_READ_TOC; 27812 /* Set the MSF bit based on the user requested address format */ 27813 cdb[1] = ((entry->cdte_format & CDROM_LBA) ? 0 : 2); 27814 if (un->un_f_cfg_read_toc_trk_bcd == TRUE) { 27815 cdb[6] = BYTE_TO_BCD(entry->cdte_track); 27816 } else { 27817 cdb[6] = entry->cdte_track; 27818 } 27819 27820 /* 27821 * Bytes 7 & 8 are the 12 byte allocation length for a single entry. 27822 * (4 byte TOC response header + 8 byte track descriptor) 27823 */ 27824 cdb[8] = 12; 27825 com->uscsi_cdb = cdb; 27826 com->uscsi_cdblen = CDB_GROUP1; 27827 com->uscsi_bufaddr = buffer; 27828 com->uscsi_buflen = 0x0C; 27829 com->uscsi_flags = (USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ); 27830 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27831 SD_PATH_STANDARD); 27832 if (rval != 0) { 27833 kmem_free(buffer, 12); 27834 kmem_free(com, sizeof (*com)); 27835 return (rval); 27836 } 27837 27838 /* Process the toc entry */ 27839 entry->cdte_adr = (buffer[5] & 0xF0) >> 4; 27840 entry->cdte_ctrl = (buffer[5] & 0x0F); 27841 if (entry->cdte_format & CDROM_LBA) { 27842 entry->cdte_addr.lba = 27843 ((uchar_t)buffer[8] << 24) + ((uchar_t)buffer[9] << 16) + 27844 ((uchar_t)buffer[10] << 8) + ((uchar_t)buffer[11]); 27845 } else if (un->un_f_cfg_read_toc_addr_bcd == TRUE) { 27846 entry->cdte_addr.msf.minute = BCD_TO_BYTE(buffer[9]); 27847 entry->cdte_addr.msf.second = BCD_TO_BYTE(buffer[10]); 27848 entry->cdte_addr.msf.frame = BCD_TO_BYTE(buffer[11]); 27849 /* 27850 * Send a READ TOC command using the LBA address format to get 27851 * the LBA for the track requested so it can be used in the 27852 * READ HEADER request 27853 * 27854 * Note: The MSF bit of the READ HEADER command specifies the 27855 * output format. The block address specified in that command 27856 * must be in LBA format. 27857 */ 27858 cdb[1] = 0; 27859 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27860 SD_PATH_STANDARD); 27861 if (rval != 0) { 27862 kmem_free(buffer, 12); 27863 kmem_free(com, sizeof (*com)); 27864 return (rval); 27865 } 27866 } else { 27867 entry->cdte_addr.msf.minute = buffer[9]; 27868 entry->cdte_addr.msf.second = buffer[10]; 27869 entry->cdte_addr.msf.frame = buffer[11]; 27870 /* 27871 * Send a READ TOC command using the LBA address format to get 27872 * the LBA for the track requested so it can be used in the 27873 * READ HEADER request 27874 * 27875 * Note: The MSF bit of the READ HEADER command specifies the 27876 * output format. The block address specified in that command 27877 * must be in LBA format. 27878 */ 27879 cdb[1] = 0; 27880 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27881 SD_PATH_STANDARD); 27882 if (rval != 0) { 27883 kmem_free(buffer, 12); 27884 kmem_free(com, sizeof (*com)); 27885 return (rval); 27886 } 27887 } 27888 27889 /* 27890 * Build and send the READ HEADER command to determine the data mode of 27891 * the user specified track. 27892 */ 27893 if ((entry->cdte_ctrl & CDROM_DATA_TRACK) && 27894 (entry->cdte_track != CDROM_LEADOUT)) { 27895 bzero(cdb, CDB_GROUP1); 27896 cdb[0] = SCMD_READ_HEADER; 27897 cdb[2] = buffer[8]; 27898 cdb[3] = buffer[9]; 27899 cdb[4] = buffer[10]; 27900 cdb[5] = buffer[11]; 27901 cdb[8] = 0x08; 27902 com->uscsi_buflen = 0x08; 27903 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27904 SD_PATH_STANDARD); 27905 if (rval == 0) { 27906 entry->cdte_datamode = buffer[0]; 27907 } else { 27908 /* 27909 * READ HEADER command failed, since this is 27910 * obsoleted in one spec, its better to return 27911 * -1 for an invlid track so that we can still 27912 * receive the rest of the TOC data. 27913 */ 27914 entry->cdte_datamode = (uchar_t)-1; 27915 } 27916 } else { 27917 entry->cdte_datamode = (uchar_t)-1; 27918 } 27919 27920 kmem_free(buffer, 12); 27921 kmem_free(com, sizeof (*com)); 27922 if (ddi_copyout(entry, data, sizeof (struct cdrom_tocentry), flag) != 0) 27923 return (EFAULT); 27924 27925 return (rval); 27926 } 27927 27928 27929 /* 27930 * Function: sr_read_tochdr() 27931 * 27932 * Description: This routine is the driver entry point for handling CD-ROM 27933 * ioctl requests to read the Table of Contents (TOC) header 27934 * (CDROMREADTOHDR). The TOC header consists of the disk starting 27935 * and ending track numbers 27936 * 27937 * Arguments: dev - the device 'dev_t' 27938 * data - pointer to user provided toc header structure, 27939 * specifying the starting and ending track numbers. 27940 * flag - this argument is a pass through to ddi_copyxxx() 27941 * directly from the mode argument of ioctl(). 27942 * 27943 * Return Code: the code returned by sd_send_scsi_cmd() 27944 * EFAULT if ddi_copyxxx() fails 27945 * ENXIO if fail ddi_get_soft_state 27946 * EINVAL if data pointer is NULL 27947 */ 27948 27949 static int 27950 sr_read_tochdr(dev_t dev, caddr_t data, int flag) 27951 { 27952 struct sd_lun *un; 27953 struct uscsi_cmd *com; 27954 struct cdrom_tochdr toc_header; 27955 struct cdrom_tochdr *hdr = &toc_header; 27956 char cdb[CDB_GROUP1]; 27957 int rval; 27958 caddr_t buffer; 27959 27960 if (data == NULL) { 27961 return (EINVAL); 27962 } 27963 27964 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 27965 (un->un_state == SD_STATE_OFFLINE)) { 27966 return (ENXIO); 27967 } 27968 27969 buffer = kmem_zalloc(4, KM_SLEEP); 27970 bzero(cdb, CDB_GROUP1); 27971 cdb[0] = SCMD_READ_TOC; 27972 /* 27973 * Specifying a track number of 0x00 in the READ TOC command indicates 27974 * that the TOC header should be returned 27975 */ 27976 cdb[6] = 0x00; 27977 /* 27978 * Bytes 7 & 8 are the 4 byte allocation length for TOC header. 27979 * (2 byte data len + 1 byte starting track # + 1 byte ending track #) 27980 */ 27981 cdb[8] = 0x04; 27982 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 27983 com->uscsi_cdb = cdb; 27984 com->uscsi_cdblen = CDB_GROUP1; 27985 com->uscsi_bufaddr = buffer; 27986 com->uscsi_buflen = 0x04; 27987 com->uscsi_timeout = 300; 27988 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 27989 27990 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 27991 SD_PATH_STANDARD); 27992 if (un->un_f_cfg_read_toc_trk_bcd == TRUE) { 27993 hdr->cdth_trk0 = BCD_TO_BYTE(buffer[2]); 27994 hdr->cdth_trk1 = BCD_TO_BYTE(buffer[3]); 27995 } else { 27996 hdr->cdth_trk0 = buffer[2]; 27997 hdr->cdth_trk1 = buffer[3]; 27998 } 27999 kmem_free(buffer, 4); 28000 kmem_free(com, sizeof (*com)); 28001 if (ddi_copyout(hdr, data, sizeof (struct cdrom_tochdr), flag) != 0) { 28002 return (EFAULT); 28003 } 28004 return (rval); 28005 } 28006 28007 28008 /* 28009 * Note: The following sr_read_mode1(), sr_read_cd_mode2(), sr_read_mode2(), 28010 * sr_read_cdda(), sr_read_cdxa(), routines implement driver support for 28011 * handling CDROMREAD ioctl requests for mode 1 user data, mode 2 user data, 28012 * digital audio and extended architecture digital audio. These modes are 28013 * defined in the IEC908 (Red Book), ISO10149 (Yellow Book), and the SCSI3 28014 * MMC specs. 28015 * 28016 * In addition to support for the various data formats these routines also 28017 * include support for devices that implement only the direct access READ 28018 * commands (0x08, 0x28), devices that implement the READ_CD commands 28019 * (0xBE, 0xD4), and devices that implement the vendor unique READ CDDA and 28020 * READ CDXA commands (0xD8, 0xDB) 28021 */ 28022 28023 /* 28024 * Function: sr_read_mode1() 28025 * 28026 * Description: This routine is the driver entry point for handling CD-ROM 28027 * ioctl read mode1 requests (CDROMREADMODE1). 28028 * 28029 * Arguments: dev - the device 'dev_t' 28030 * data - pointer to user provided cd read structure specifying 28031 * the lba buffer address and length. 28032 * flag - this argument is a pass through to ddi_copyxxx() 28033 * directly from the mode argument of ioctl(). 28034 * 28035 * Return Code: the code returned by sd_send_scsi_cmd() 28036 * EFAULT if ddi_copyxxx() fails 28037 * ENXIO if fail ddi_get_soft_state 28038 * EINVAL if data pointer is NULL 28039 */ 28040 28041 static int 28042 sr_read_mode1(dev_t dev, caddr_t data, int flag) 28043 { 28044 struct sd_lun *un; 28045 struct cdrom_read mode1_struct; 28046 struct cdrom_read *mode1 = &mode1_struct; 28047 int rval; 28048 sd_ssc_t *ssc; 28049 28050 #ifdef _MULTI_DATAMODEL 28051 /* To support ILP32 applications in an LP64 world */ 28052 struct cdrom_read32 cdrom_read32; 28053 struct cdrom_read32 *cdrd32 = &cdrom_read32; 28054 #endif /* _MULTI_DATAMODEL */ 28055 28056 if (data == NULL) { 28057 return (EINVAL); 28058 } 28059 28060 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 28061 (un->un_state == SD_STATE_OFFLINE)) { 28062 return (ENXIO); 28063 } 28064 28065 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 28066 "sd_read_mode1: entry: un:0x%p\n", un); 28067 28068 #ifdef _MULTI_DATAMODEL 28069 switch (ddi_model_convert_from(flag & FMODELS)) { 28070 case DDI_MODEL_ILP32: 28071 if (ddi_copyin(data, cdrd32, sizeof (*cdrd32), flag) != 0) { 28072 return (EFAULT); 28073 } 28074 /* Convert the ILP32 uscsi data from the application to LP64 */ 28075 cdrom_read32tocdrom_read(cdrd32, mode1); 28076 break; 28077 case DDI_MODEL_NONE: 28078 if (ddi_copyin(data, mode1, sizeof (struct cdrom_read), flag)) { 28079 return (EFAULT); 28080 } 28081 } 28082 #else /* ! _MULTI_DATAMODEL */ 28083 if (ddi_copyin(data, mode1, sizeof (struct cdrom_read), flag)) { 28084 return (EFAULT); 28085 } 28086 #endif /* _MULTI_DATAMODEL */ 28087 28088 ssc = sd_ssc_init(un); 28089 rval = sd_send_scsi_READ(ssc, mode1->cdread_bufaddr, 28090 mode1->cdread_buflen, mode1->cdread_lba, SD_PATH_STANDARD); 28091 sd_ssc_fini(ssc); 28092 28093 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 28094 "sd_read_mode1: exit: un:0x%p\n", un); 28095 28096 return (rval); 28097 } 28098 28099 28100 /* 28101 * Function: sr_read_cd_mode2() 28102 * 28103 * Description: This routine is the driver entry point for handling CD-ROM 28104 * ioctl read mode2 requests (CDROMREADMODE2) for devices that 28105 * support the READ CD (0xBE) command or the 1st generation 28106 * READ CD (0xD4) command. 28107 * 28108 * Arguments: dev - the device 'dev_t' 28109 * data - pointer to user provided cd read structure specifying 28110 * the lba buffer address and length. 28111 * flag - this argument is a pass through to ddi_copyxxx() 28112 * directly from the mode argument of ioctl(). 28113 * 28114 * Return Code: the code returned by sd_send_scsi_cmd() 28115 * EFAULT if ddi_copyxxx() fails 28116 * ENXIO if fail ddi_get_soft_state 28117 * EINVAL if data pointer is NULL 28118 */ 28119 28120 static int 28121 sr_read_cd_mode2(dev_t dev, caddr_t data, int flag) 28122 { 28123 struct sd_lun *un; 28124 struct uscsi_cmd *com; 28125 struct cdrom_read mode2_struct; 28126 struct cdrom_read *mode2 = &mode2_struct; 28127 uchar_t cdb[CDB_GROUP5]; 28128 int nblocks; 28129 int rval; 28130 #ifdef _MULTI_DATAMODEL 28131 /* To support ILP32 applications in an LP64 world */ 28132 struct cdrom_read32 cdrom_read32; 28133 struct cdrom_read32 *cdrd32 = &cdrom_read32; 28134 #endif /* _MULTI_DATAMODEL */ 28135 28136 if (data == NULL) { 28137 return (EINVAL); 28138 } 28139 28140 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 28141 (un->un_state == SD_STATE_OFFLINE)) { 28142 return (ENXIO); 28143 } 28144 28145 #ifdef _MULTI_DATAMODEL 28146 switch (ddi_model_convert_from(flag & FMODELS)) { 28147 case DDI_MODEL_ILP32: 28148 if (ddi_copyin(data, cdrd32, sizeof (*cdrd32), flag) != 0) { 28149 return (EFAULT); 28150 } 28151 /* Convert the ILP32 uscsi data from the application to LP64 */ 28152 cdrom_read32tocdrom_read(cdrd32, mode2); 28153 break; 28154 case DDI_MODEL_NONE: 28155 if (ddi_copyin(data, mode2, sizeof (*mode2), flag) != 0) { 28156 return (EFAULT); 28157 } 28158 break; 28159 } 28160 28161 #else /* ! _MULTI_DATAMODEL */ 28162 if (ddi_copyin(data, mode2, sizeof (*mode2), flag) != 0) { 28163 return (EFAULT); 28164 } 28165 #endif /* _MULTI_DATAMODEL */ 28166 28167 bzero(cdb, sizeof (cdb)); 28168 if (un->un_f_cfg_read_cd_xd4 == TRUE) { 28169 /* Read command supported by 1st generation atapi drives */ 28170 cdb[0] = SCMD_READ_CDD4; 28171 } else { 28172 /* Universal CD Access Command */ 28173 cdb[0] = SCMD_READ_CD; 28174 } 28175 28176 /* 28177 * Set expected sector type to: 2336s byte, Mode 2 Yellow Book 28178 */ 28179 cdb[1] = CDROM_SECTOR_TYPE_MODE2; 28180 28181 /* set the start address */ 28182 cdb[2] = (uchar_t)((mode2->cdread_lba >> 24) & 0XFF); 28183 cdb[3] = (uchar_t)((mode2->cdread_lba >> 16) & 0XFF); 28184 cdb[4] = (uchar_t)((mode2->cdread_lba >> 8) & 0xFF); 28185 cdb[5] = (uchar_t)(mode2->cdread_lba & 0xFF); 28186 28187 /* set the transfer length */ 28188 nblocks = mode2->cdread_buflen / 2336; 28189 cdb[6] = (uchar_t)(nblocks >> 16); 28190 cdb[7] = (uchar_t)(nblocks >> 8); 28191 cdb[8] = (uchar_t)nblocks; 28192 28193 /* set the filter bits */ 28194 cdb[9] = CDROM_READ_CD_USERDATA; 28195 28196 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 28197 com->uscsi_cdb = (caddr_t)cdb; 28198 com->uscsi_cdblen = sizeof (cdb); 28199 com->uscsi_bufaddr = mode2->cdread_bufaddr; 28200 com->uscsi_buflen = mode2->cdread_buflen; 28201 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 28202 28203 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE, 28204 SD_PATH_STANDARD); 28205 kmem_free(com, sizeof (*com)); 28206 return (rval); 28207 } 28208 28209 28210 /* 28211 * Function: sr_read_mode2() 28212 * 28213 * Description: This routine is the driver entry point for handling CD-ROM 28214 * ioctl read mode2 requests (CDROMREADMODE2) for devices that 28215 * do not support the READ CD (0xBE) command. 28216 * 28217 * Arguments: dev - the device 'dev_t' 28218 * data - pointer to user provided cd read structure specifying 28219 * the lba buffer address and length. 28220 * flag - this argument is a pass through to ddi_copyxxx() 28221 * directly from the mode argument of ioctl(). 28222 * 28223 * Return Code: the code returned by sd_send_scsi_cmd() 28224 * EFAULT if ddi_copyxxx() fails 28225 * ENXIO if fail ddi_get_soft_state 28226 * EINVAL if data pointer is NULL 28227 * EIO if fail to reset block size 28228 * EAGAIN if commands are in progress in the driver 28229 */ 28230 28231 static int 28232 sr_read_mode2(dev_t dev, caddr_t data, int flag) 28233 { 28234 struct sd_lun *un; 28235 struct cdrom_read mode2_struct; 28236 struct cdrom_read *mode2 = &mode2_struct; 28237 int rval; 28238 uint32_t restore_blksize; 28239 struct uscsi_cmd *com; 28240 uchar_t cdb[CDB_GROUP0]; 28241 int nblocks; 28242 28243 #ifdef _MULTI_DATAMODEL 28244 /* To support ILP32 applications in an LP64 world */ 28245 struct cdrom_read32 cdrom_read32; 28246 struct cdrom_read32 *cdrd32 = &cdrom_read32; 28247 #endif /* _MULTI_DATAMODEL */ 28248 28249 if (data == NULL) { 28250 return (EINVAL); 28251 } 28252 28253 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 28254 (un->un_state == SD_STATE_OFFLINE)) { 28255 return (ENXIO); 28256 } 28257 28258 /* 28259 * Because this routine will update the device and driver block size 28260 * being used we want to make sure there are no commands in progress. 28261 * If commands are in progress the user will have to try again. 28262 * 28263 * We check for 1 instead of 0 because we increment un_ncmds_in_driver 28264 * in sdioctl to protect commands from sdioctl through to the top of 28265 * sd_uscsi_strategy. See sdioctl for details. 28266 */ 28267 mutex_enter(SD_MUTEX(un)); 28268 if (un->un_ncmds_in_driver != 1) { 28269 mutex_exit(SD_MUTEX(un)); 28270 return (EAGAIN); 28271 } 28272 mutex_exit(SD_MUTEX(un)); 28273 28274 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 28275 "sd_read_mode2: entry: un:0x%p\n", un); 28276 28277 #ifdef _MULTI_DATAMODEL 28278 switch (ddi_model_convert_from(flag & FMODELS)) { 28279 case DDI_MODEL_ILP32: 28280 if (ddi_copyin(data, cdrd32, sizeof (*cdrd32), flag) != 0) { 28281 return (EFAULT); 28282 } 28283 /* Convert the ILP32 uscsi data from the application to LP64 */ 28284 cdrom_read32tocdrom_read(cdrd32, mode2); 28285 break; 28286 case DDI_MODEL_NONE: 28287 if (ddi_copyin(data, mode2, sizeof (*mode2), flag) != 0) { 28288 return (EFAULT); 28289 } 28290 break; 28291 } 28292 #else /* ! _MULTI_DATAMODEL */ 28293 if (ddi_copyin(data, mode2, sizeof (*mode2), flag)) { 28294 return (EFAULT); 28295 } 28296 #endif /* _MULTI_DATAMODEL */ 28297 28298 /* Store the current target block size for restoration later */ 28299 restore_blksize = un->un_tgt_blocksize; 28300 28301 /* Change the device and soft state target block size to 2336 */ 28302 if (sr_sector_mode(dev, SD_MODE2_BLKSIZE) != 0) { 28303 rval = EIO; 28304 goto done; 28305 } 28306 28307 28308 bzero(cdb, sizeof (cdb)); 28309 28310 /* set READ operation */ 28311 cdb[0] = SCMD_READ; 28312 28313 /* adjust lba for 2kbyte blocks from 512 byte blocks */ 28314 mode2->cdread_lba >>= 2; 28315 28316 /* set the start address */ 28317 cdb[1] = (uchar_t)((mode2->cdread_lba >> 16) & 0X1F); 28318 cdb[2] = (uchar_t)((mode2->cdread_lba >> 8) & 0xFF); 28319 cdb[3] = (uchar_t)(mode2->cdread_lba & 0xFF); 28320 28321 /* set the transfer length */ 28322 nblocks = mode2->cdread_buflen / 2336; 28323 cdb[4] = (uchar_t)nblocks & 0xFF; 28324 28325 /* build command */ 28326 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 28327 com->uscsi_cdb = (caddr_t)cdb; 28328 com->uscsi_cdblen = sizeof (cdb); 28329 com->uscsi_bufaddr = mode2->cdread_bufaddr; 28330 com->uscsi_buflen = mode2->cdread_buflen; 28331 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 28332 28333 /* 28334 * Issue SCSI command with user space address for read buffer. 28335 * 28336 * This sends the command through main channel in the driver. 28337 * 28338 * Since this is accessed via an IOCTL call, we go through the 28339 * standard path, so that if the device was powered down, then 28340 * it would be 'awakened' to handle the command. 28341 */ 28342 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE, 28343 SD_PATH_STANDARD); 28344 28345 kmem_free(com, sizeof (*com)); 28346 28347 /* Restore the device and soft state target block size */ 28348 if (sr_sector_mode(dev, restore_blksize) != 0) { 28349 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 28350 "can't do switch back to mode 1\n"); 28351 /* 28352 * If sd_send_scsi_READ succeeded we still need to report 28353 * an error because we failed to reset the block size 28354 */ 28355 if (rval == 0) { 28356 rval = EIO; 28357 } 28358 } 28359 28360 done: 28361 SD_TRACE(SD_LOG_ATTACH_DETACH, un, 28362 "sd_read_mode2: exit: un:0x%p\n", un); 28363 28364 return (rval); 28365 } 28366 28367 28368 /* 28369 * Function: sr_sector_mode() 28370 * 28371 * Description: This utility function is used by sr_read_mode2 to set the target 28372 * block size based on the user specified size. This is a legacy 28373 * implementation based upon a vendor specific mode page 28374 * 28375 * Arguments: dev - the device 'dev_t' 28376 * data - flag indicating if block size is being set to 2336 or 28377 * 512. 28378 * 28379 * Return Code: the code returned by sd_send_scsi_cmd() 28380 * EFAULT if ddi_copyxxx() fails 28381 * ENXIO if fail ddi_get_soft_state 28382 * EINVAL if data pointer is NULL 28383 */ 28384 28385 static int 28386 sr_sector_mode(dev_t dev, uint32_t blksize) 28387 { 28388 struct sd_lun *un; 28389 uchar_t *sense; 28390 uchar_t *select; 28391 int rval; 28392 sd_ssc_t *ssc; 28393 28394 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 28395 (un->un_state == SD_STATE_OFFLINE)) { 28396 return (ENXIO); 28397 } 28398 28399 sense = kmem_zalloc(20, KM_SLEEP); 28400 28401 /* Note: This is a vendor specific mode page (0x81) */ 28402 ssc = sd_ssc_init(un); 28403 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense, 20, 0x81, 28404 SD_PATH_STANDARD); 28405 sd_ssc_fini(ssc); 28406 if (rval != 0) { 28407 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un, 28408 "sr_sector_mode: Mode Sense failed\n"); 28409 kmem_free(sense, 20); 28410 return (rval); 28411 } 28412 select = kmem_zalloc(20, KM_SLEEP); 28413 select[3] = 0x08; 28414 select[10] = ((blksize >> 8) & 0xff); 28415 select[11] = (blksize & 0xff); 28416 select[12] = 0x01; 28417 select[13] = 0x06; 28418 select[14] = sense[14]; 28419 select[15] = sense[15]; 28420 if (blksize == SD_MODE2_BLKSIZE) { 28421 select[14] |= 0x01; 28422 } 28423 28424 ssc = sd_ssc_init(un); 28425 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select, 20, 28426 SD_DONTSAVE_PAGE, SD_PATH_STANDARD); 28427 sd_ssc_fini(ssc); 28428 if (rval != 0) { 28429 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un, 28430 "sr_sector_mode: Mode Select failed\n"); 28431 } else { 28432 /* 28433 * Only update the softstate block size if we successfully 28434 * changed the device block mode. 28435 */ 28436 mutex_enter(SD_MUTEX(un)); 28437 sd_update_block_info(un, blksize, 0); 28438 mutex_exit(SD_MUTEX(un)); 28439 } 28440 kmem_free(sense, 20); 28441 kmem_free(select, 20); 28442 return (rval); 28443 } 28444 28445 28446 /* 28447 * Function: sr_read_cdda() 28448 * 28449 * Description: This routine is the driver entry point for handling CD-ROM 28450 * ioctl requests to return CD-DA or subcode data. (CDROMCDDA) If 28451 * the target supports CDDA these requests are handled via a vendor 28452 * specific command (0xD8) If the target does not support CDDA 28453 * these requests are handled via the READ CD command (0xBE). 28454 * 28455 * Arguments: dev - the device 'dev_t' 28456 * data - pointer to user provided CD-DA structure specifying 28457 * the track starting address, transfer length, and 28458 * subcode options. 28459 * flag - this argument is a pass through to ddi_copyxxx() 28460 * directly from the mode argument of ioctl(). 28461 * 28462 * Return Code: the code returned by sd_send_scsi_cmd() 28463 * EFAULT if ddi_copyxxx() fails 28464 * ENXIO if fail ddi_get_soft_state 28465 * EINVAL if invalid arguments are provided 28466 * ENOTTY 28467 */ 28468 28469 static int 28470 sr_read_cdda(dev_t dev, caddr_t data, int flag) 28471 { 28472 struct sd_lun *un; 28473 struct uscsi_cmd *com; 28474 struct cdrom_cdda *cdda; 28475 int rval; 28476 size_t buflen; 28477 char cdb[CDB_GROUP5]; 28478 28479 #ifdef _MULTI_DATAMODEL 28480 /* To support ILP32 applications in an LP64 world */ 28481 struct cdrom_cdda32 cdrom_cdda32; 28482 struct cdrom_cdda32 *cdda32 = &cdrom_cdda32; 28483 #endif /* _MULTI_DATAMODEL */ 28484 28485 if (data == NULL) { 28486 return (EINVAL); 28487 } 28488 28489 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 28490 return (ENXIO); 28491 } 28492 28493 cdda = kmem_zalloc(sizeof (struct cdrom_cdda), KM_SLEEP); 28494 28495 #ifdef _MULTI_DATAMODEL 28496 switch (ddi_model_convert_from(flag & FMODELS)) { 28497 case DDI_MODEL_ILP32: 28498 if (ddi_copyin(data, cdda32, sizeof (*cdda32), flag)) { 28499 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 28500 "sr_read_cdda: ddi_copyin Failed\n"); 28501 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28502 return (EFAULT); 28503 } 28504 /* Convert the ILP32 uscsi data from the application to LP64 */ 28505 cdrom_cdda32tocdrom_cdda(cdda32, cdda); 28506 break; 28507 case DDI_MODEL_NONE: 28508 if (ddi_copyin(data, cdda, sizeof (struct cdrom_cdda), flag)) { 28509 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 28510 "sr_read_cdda: ddi_copyin Failed\n"); 28511 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28512 return (EFAULT); 28513 } 28514 break; 28515 } 28516 #else /* ! _MULTI_DATAMODEL */ 28517 if (ddi_copyin(data, cdda, sizeof (struct cdrom_cdda), flag)) { 28518 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 28519 "sr_read_cdda: ddi_copyin Failed\n"); 28520 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28521 return (EFAULT); 28522 } 28523 #endif /* _MULTI_DATAMODEL */ 28524 28525 /* 28526 * Since MMC-2 expects max 3 bytes for length, check if the 28527 * length input is greater than 3 bytes 28528 */ 28529 if ((cdda->cdda_length & 0xFF000000) != 0) { 28530 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_read_cdda: " 28531 "cdrom transfer length too large: %d (limit %d)\n", 28532 cdda->cdda_length, 0xFFFFFF); 28533 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28534 return (EINVAL); 28535 } 28536 28537 switch (cdda->cdda_subcode) { 28538 case CDROM_DA_NO_SUBCODE: 28539 buflen = CDROM_BLK_2352 * cdda->cdda_length; 28540 break; 28541 case CDROM_DA_SUBQ: 28542 buflen = CDROM_BLK_2368 * cdda->cdda_length; 28543 break; 28544 case CDROM_DA_ALL_SUBCODE: 28545 buflen = CDROM_BLK_2448 * cdda->cdda_length; 28546 break; 28547 case CDROM_DA_SUBCODE_ONLY: 28548 buflen = CDROM_BLK_SUBCODE * cdda->cdda_length; 28549 break; 28550 default: 28551 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 28552 "sr_read_cdda: Subcode '0x%x' Not Supported\n", 28553 cdda->cdda_subcode); 28554 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28555 return (EINVAL); 28556 } 28557 28558 /* Build and send the command */ 28559 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 28560 bzero(cdb, CDB_GROUP5); 28561 28562 if (un->un_f_cfg_cdda == TRUE) { 28563 cdb[0] = (char)SCMD_READ_CD; 28564 cdb[1] = 0x04; 28565 cdb[2] = (((cdda->cdda_addr) & 0xff000000) >> 24); 28566 cdb[3] = (((cdda->cdda_addr) & 0x00ff0000) >> 16); 28567 cdb[4] = (((cdda->cdda_addr) & 0x0000ff00) >> 8); 28568 cdb[5] = ((cdda->cdda_addr) & 0x000000ff); 28569 cdb[6] = (((cdda->cdda_length) & 0x00ff0000) >> 16); 28570 cdb[7] = (((cdda->cdda_length) & 0x0000ff00) >> 8); 28571 cdb[8] = ((cdda->cdda_length) & 0x000000ff); 28572 cdb[9] = 0x10; 28573 switch (cdda->cdda_subcode) { 28574 case CDROM_DA_NO_SUBCODE : 28575 cdb[10] = 0x0; 28576 break; 28577 case CDROM_DA_SUBQ : 28578 cdb[10] = 0x2; 28579 break; 28580 case CDROM_DA_ALL_SUBCODE : 28581 cdb[10] = 0x1; 28582 break; 28583 case CDROM_DA_SUBCODE_ONLY : 28584 /* FALLTHROUGH */ 28585 default : 28586 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28587 kmem_free(com, sizeof (*com)); 28588 return (ENOTTY); 28589 } 28590 } else { 28591 cdb[0] = (char)SCMD_READ_CDDA; 28592 cdb[2] = (((cdda->cdda_addr) & 0xff000000) >> 24); 28593 cdb[3] = (((cdda->cdda_addr) & 0x00ff0000) >> 16); 28594 cdb[4] = (((cdda->cdda_addr) & 0x0000ff00) >> 8); 28595 cdb[5] = ((cdda->cdda_addr) & 0x000000ff); 28596 cdb[6] = (((cdda->cdda_length) & 0xff000000) >> 24); 28597 cdb[7] = (((cdda->cdda_length) & 0x00ff0000) >> 16); 28598 cdb[8] = (((cdda->cdda_length) & 0x0000ff00) >> 8); 28599 cdb[9] = ((cdda->cdda_length) & 0x000000ff); 28600 cdb[10] = cdda->cdda_subcode; 28601 } 28602 28603 com->uscsi_cdb = cdb; 28604 com->uscsi_cdblen = CDB_GROUP5; 28605 com->uscsi_bufaddr = (caddr_t)cdda->cdda_data; 28606 com->uscsi_buflen = buflen; 28607 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 28608 28609 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE, 28610 SD_PATH_STANDARD); 28611 28612 kmem_free(cdda, sizeof (struct cdrom_cdda)); 28613 kmem_free(com, sizeof (*com)); 28614 return (rval); 28615 } 28616 28617 28618 /* 28619 * Function: sr_read_cdxa() 28620 * 28621 * Description: This routine is the driver entry point for handling CD-ROM 28622 * ioctl requests to return CD-XA (Extended Architecture) data. 28623 * (CDROMCDXA). 28624 * 28625 * Arguments: dev - the device 'dev_t' 28626 * data - pointer to user provided CD-XA structure specifying 28627 * the data starting address, transfer length, and format 28628 * flag - this argument is a pass through to ddi_copyxxx() 28629 * directly from the mode argument of ioctl(). 28630 * 28631 * Return Code: the code returned by sd_send_scsi_cmd() 28632 * EFAULT if ddi_copyxxx() fails 28633 * ENXIO if fail ddi_get_soft_state 28634 * EINVAL if data pointer is NULL 28635 */ 28636 28637 static int 28638 sr_read_cdxa(dev_t dev, caddr_t data, int flag) 28639 { 28640 struct sd_lun *un; 28641 struct uscsi_cmd *com; 28642 struct cdrom_cdxa *cdxa; 28643 int rval; 28644 size_t buflen; 28645 char cdb[CDB_GROUP5]; 28646 uchar_t read_flags; 28647 28648 #ifdef _MULTI_DATAMODEL 28649 /* To support ILP32 applications in an LP64 world */ 28650 struct cdrom_cdxa32 cdrom_cdxa32; 28651 struct cdrom_cdxa32 *cdxa32 = &cdrom_cdxa32; 28652 #endif /* _MULTI_DATAMODEL */ 28653 28654 if (data == NULL) { 28655 return (EINVAL); 28656 } 28657 28658 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 28659 return (ENXIO); 28660 } 28661 28662 cdxa = kmem_zalloc(sizeof (struct cdrom_cdxa), KM_SLEEP); 28663 28664 #ifdef _MULTI_DATAMODEL 28665 switch (ddi_model_convert_from(flag & FMODELS)) { 28666 case DDI_MODEL_ILP32: 28667 if (ddi_copyin(data, cdxa32, sizeof (*cdxa32), flag)) { 28668 kmem_free(cdxa, sizeof (struct cdrom_cdxa)); 28669 return (EFAULT); 28670 } 28671 /* 28672 * Convert the ILP32 uscsi data from the 28673 * application to LP64 for internal use. 28674 */ 28675 cdrom_cdxa32tocdrom_cdxa(cdxa32, cdxa); 28676 break; 28677 case DDI_MODEL_NONE: 28678 if (ddi_copyin(data, cdxa, sizeof (struct cdrom_cdxa), flag)) { 28679 kmem_free(cdxa, sizeof (struct cdrom_cdxa)); 28680 return (EFAULT); 28681 } 28682 break; 28683 } 28684 #else /* ! _MULTI_DATAMODEL */ 28685 if (ddi_copyin(data, cdxa, sizeof (struct cdrom_cdxa), flag)) { 28686 kmem_free(cdxa, sizeof (struct cdrom_cdxa)); 28687 return (EFAULT); 28688 } 28689 #endif /* _MULTI_DATAMODEL */ 28690 28691 /* 28692 * Since MMC-2 expects max 3 bytes for length, check if the 28693 * length input is greater than 3 bytes 28694 */ 28695 if ((cdxa->cdxa_length & 0xFF000000) != 0) { 28696 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_read_cdxa: " 28697 "cdrom transfer length too large: %d (limit %d)\n", 28698 cdxa->cdxa_length, 0xFFFFFF); 28699 kmem_free(cdxa, sizeof (struct cdrom_cdxa)); 28700 return (EINVAL); 28701 } 28702 28703 switch (cdxa->cdxa_format) { 28704 case CDROM_XA_DATA: 28705 buflen = CDROM_BLK_2048 * cdxa->cdxa_length; 28706 read_flags = 0x10; 28707 break; 28708 case CDROM_XA_SECTOR_DATA: 28709 buflen = CDROM_BLK_2352 * cdxa->cdxa_length; 28710 read_flags = 0xf8; 28711 break; 28712 case CDROM_XA_DATA_W_ERROR: 28713 buflen = CDROM_BLK_2646 * cdxa->cdxa_length; 28714 read_flags = 0xfc; 28715 break; 28716 default: 28717 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 28718 "sr_read_cdxa: Format '0x%x' Not Supported\n", 28719 cdxa->cdxa_format); 28720 kmem_free(cdxa, sizeof (struct cdrom_cdxa)); 28721 return (EINVAL); 28722 } 28723 28724 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 28725 bzero(cdb, CDB_GROUP5); 28726 if (un->un_f_mmc_cap == TRUE) { 28727 cdb[0] = (char)SCMD_READ_CD; 28728 cdb[2] = (((cdxa->cdxa_addr) & 0xff000000) >> 24); 28729 cdb[3] = (((cdxa->cdxa_addr) & 0x00ff0000) >> 16); 28730 cdb[4] = (((cdxa->cdxa_addr) & 0x0000ff00) >> 8); 28731 cdb[5] = ((cdxa->cdxa_addr) & 0x000000ff); 28732 cdb[6] = (((cdxa->cdxa_length) & 0x00ff0000) >> 16); 28733 cdb[7] = (((cdxa->cdxa_length) & 0x0000ff00) >> 8); 28734 cdb[8] = ((cdxa->cdxa_length) & 0x000000ff); 28735 cdb[9] = (char)read_flags; 28736 } else { 28737 /* 28738 * Note: A vendor specific command (0xDB) is being used her to 28739 * request a read of all subcodes. 28740 */ 28741 cdb[0] = (char)SCMD_READ_CDXA; 28742 cdb[2] = (((cdxa->cdxa_addr) & 0xff000000) >> 24); 28743 cdb[3] = (((cdxa->cdxa_addr) & 0x00ff0000) >> 16); 28744 cdb[4] = (((cdxa->cdxa_addr) & 0x0000ff00) >> 8); 28745 cdb[5] = ((cdxa->cdxa_addr) & 0x000000ff); 28746 cdb[6] = (((cdxa->cdxa_length) & 0xff000000) >> 24); 28747 cdb[7] = (((cdxa->cdxa_length) & 0x00ff0000) >> 16); 28748 cdb[8] = (((cdxa->cdxa_length) & 0x0000ff00) >> 8); 28749 cdb[9] = ((cdxa->cdxa_length) & 0x000000ff); 28750 cdb[10] = cdxa->cdxa_format; 28751 } 28752 com->uscsi_cdb = cdb; 28753 com->uscsi_cdblen = CDB_GROUP5; 28754 com->uscsi_bufaddr = (caddr_t)cdxa->cdxa_data; 28755 com->uscsi_buflen = buflen; 28756 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 28757 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE, 28758 SD_PATH_STANDARD); 28759 kmem_free(cdxa, sizeof (struct cdrom_cdxa)); 28760 kmem_free(com, sizeof (*com)); 28761 return (rval); 28762 } 28763 28764 28765 /* 28766 * Function: sr_eject() 28767 * 28768 * Description: This routine is the driver entry point for handling CD-ROM 28769 * eject ioctl requests (FDEJECT, DKIOCEJECT, CDROMEJECT) 28770 * 28771 * Arguments: dev - the device 'dev_t' 28772 * 28773 * Return Code: the code returned by sd_send_scsi_cmd() 28774 */ 28775 28776 static int 28777 sr_eject(dev_t dev) 28778 { 28779 struct sd_lun *un; 28780 int rval; 28781 sd_ssc_t *ssc; 28782 28783 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 28784 (un->un_state == SD_STATE_OFFLINE)) { 28785 return (ENXIO); 28786 } 28787 28788 /* 28789 * To prevent race conditions with the eject 28790 * command, keep track of an eject command as 28791 * it progresses. If we are already handling 28792 * an eject command in the driver for the given 28793 * unit and another request to eject is received 28794 * immediately return EAGAIN so we don't lose 28795 * the command if the current eject command fails. 28796 */ 28797 mutex_enter(SD_MUTEX(un)); 28798 if (un->un_f_ejecting == TRUE) { 28799 mutex_exit(SD_MUTEX(un)); 28800 return (EAGAIN); 28801 } 28802 un->un_f_ejecting = TRUE; 28803 mutex_exit(SD_MUTEX(un)); 28804 28805 ssc = sd_ssc_init(un); 28806 rval = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_ALLOW, 28807 SD_PATH_STANDARD); 28808 sd_ssc_fini(ssc); 28809 28810 if (rval != 0) { 28811 mutex_enter(SD_MUTEX(un)); 28812 un->un_f_ejecting = FALSE; 28813 mutex_exit(SD_MUTEX(un)); 28814 return (rval); 28815 } 28816 28817 ssc = sd_ssc_init(un); 28818 rval = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP, 28819 SD_TARGET_EJECT, SD_PATH_STANDARD); 28820 sd_ssc_fini(ssc); 28821 28822 if (rval == 0) { 28823 mutex_enter(SD_MUTEX(un)); 28824 sr_ejected(un); 28825 un->un_mediastate = DKIO_EJECTED; 28826 un->un_f_ejecting = FALSE; 28827 cv_broadcast(&un->un_state_cv); 28828 mutex_exit(SD_MUTEX(un)); 28829 } else { 28830 mutex_enter(SD_MUTEX(un)); 28831 un->un_f_ejecting = FALSE; 28832 mutex_exit(SD_MUTEX(un)); 28833 } 28834 return (rval); 28835 } 28836 28837 28838 /* 28839 * Function: sr_ejected() 28840 * 28841 * Description: This routine updates the soft state structure to invalidate the 28842 * geometry information after the media has been ejected or a 28843 * media eject has been detected. 28844 * 28845 * Arguments: un - driver soft state (unit) structure 28846 */ 28847 28848 static void 28849 sr_ejected(struct sd_lun *un) 28850 { 28851 struct sd_errstats *stp; 28852 28853 ASSERT(un != NULL); 28854 ASSERT(mutex_owned(SD_MUTEX(un))); 28855 28856 un->un_f_blockcount_is_valid = FALSE; 28857 un->un_f_tgt_blocksize_is_valid = FALSE; 28858 mutex_exit(SD_MUTEX(un)); 28859 cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT_PRIORITY); 28860 mutex_enter(SD_MUTEX(un)); 28861 28862 if (un->un_errstats != NULL) { 28863 stp = (struct sd_errstats *)un->un_errstats->ks_data; 28864 stp->sd_capacity.value.ui64 = 0; 28865 } 28866 } 28867 28868 28869 /* 28870 * Function: sr_check_wp() 28871 * 28872 * Description: This routine checks the write protection of a removable 28873 * media disk and hotpluggable devices via the write protect bit of 28874 * the Mode Page Header device specific field. Some devices choke 28875 * on unsupported mode page. In order to workaround this issue, 28876 * this routine has been implemented to use 0x3f mode page(request 28877 * for all pages) for all device types. 28878 * 28879 * Arguments: dev - the device 'dev_t' 28880 * 28881 * Return Code: int indicating if the device is write protected (1) or not (0) 28882 * 28883 * Context: Kernel thread. 28884 * 28885 */ 28886 28887 static int 28888 sr_check_wp(dev_t dev) 28889 { 28890 struct sd_lun *un; 28891 uchar_t device_specific; 28892 uchar_t *sense; 28893 int hdrlen; 28894 int rval = FALSE; 28895 int status; 28896 sd_ssc_t *ssc; 28897 28898 /* 28899 * Note: The return codes for this routine should be reworked to 28900 * properly handle the case of a NULL softstate. 28901 */ 28902 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { 28903 return (FALSE); 28904 } 28905 28906 if (un->un_f_cfg_is_atapi == TRUE) { 28907 /* 28908 * The mode page contents are not required; set the allocation 28909 * length for the mode page header only 28910 */ 28911 hdrlen = MODE_HEADER_LENGTH_GRP2; 28912 sense = kmem_zalloc(hdrlen, KM_SLEEP); 28913 ssc = sd_ssc_init(un); 28914 status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, sense, hdrlen, 28915 MODEPAGE_ALLPAGES, SD_PATH_STANDARD); 28916 sd_ssc_fini(ssc); 28917 if (status != 0) 28918 goto err_exit; 28919 device_specific = 28920 ((struct mode_header_grp2 *)sense)->device_specific; 28921 } else { 28922 hdrlen = MODE_HEADER_LENGTH; 28923 sense = kmem_zalloc(hdrlen, KM_SLEEP); 28924 ssc = sd_ssc_init(un); 28925 status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense, hdrlen, 28926 MODEPAGE_ALLPAGES, SD_PATH_STANDARD); 28927 sd_ssc_fini(ssc); 28928 if (status != 0) 28929 goto err_exit; 28930 device_specific = 28931 ((struct mode_header *)sense)->device_specific; 28932 } 28933 28934 28935 /* 28936 * Write protect mode sense failed; not all disks 28937 * understand this query. Return FALSE assuming that 28938 * these devices are not writable. 28939 */ 28940 if (device_specific & WRITE_PROTECT) { 28941 rval = TRUE; 28942 } 28943 28944 err_exit: 28945 kmem_free(sense, hdrlen); 28946 return (rval); 28947 } 28948 28949 /* 28950 * Function: sr_volume_ctrl() 28951 * 28952 * Description: This routine is the driver entry point for handling CD-ROM 28953 * audio output volume ioctl requests. (CDROMVOLCTRL) 28954 * 28955 * Arguments: dev - the device 'dev_t' 28956 * data - pointer to user audio volume control structure 28957 * flag - this argument is a pass through to ddi_copyxxx() 28958 * directly from the mode argument of ioctl(). 28959 * 28960 * Return Code: the code returned by sd_send_scsi_cmd() 28961 * EFAULT if ddi_copyxxx() fails 28962 * ENXIO if fail ddi_get_soft_state 28963 * EINVAL if data pointer is NULL 28964 * 28965 */ 28966 28967 static int 28968 sr_volume_ctrl(dev_t dev, caddr_t data, int flag) 28969 { 28970 struct sd_lun *un; 28971 struct cdrom_volctrl volume; 28972 struct cdrom_volctrl *vol = &volume; 28973 uchar_t *sense_page; 28974 uchar_t *select_page; 28975 uchar_t *sense; 28976 uchar_t *select; 28977 int sense_buflen; 28978 int select_buflen; 28979 int rval; 28980 sd_ssc_t *ssc; 28981 28982 if (data == NULL) { 28983 return (EINVAL); 28984 } 28985 28986 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 28987 (un->un_state == SD_STATE_OFFLINE)) { 28988 return (ENXIO); 28989 } 28990 28991 if (ddi_copyin(data, vol, sizeof (struct cdrom_volctrl), flag)) { 28992 return (EFAULT); 28993 } 28994 28995 if ((un->un_f_cfg_is_atapi == TRUE) || (un->un_f_mmc_cap == TRUE)) { 28996 struct mode_header_grp2 *sense_mhp; 28997 struct mode_header_grp2 *select_mhp; 28998 int bd_len; 28999 29000 sense_buflen = MODE_PARAM_LENGTH_GRP2 + MODEPAGE_AUDIO_CTRL_LEN; 29001 select_buflen = MODE_HEADER_LENGTH_GRP2 + 29002 MODEPAGE_AUDIO_CTRL_LEN; 29003 sense = kmem_zalloc(sense_buflen, KM_SLEEP); 29004 select = kmem_zalloc(select_buflen, KM_SLEEP); 29005 ssc = sd_ssc_init(un); 29006 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, sense, 29007 sense_buflen, MODEPAGE_AUDIO_CTRL, 29008 SD_PATH_STANDARD); 29009 sd_ssc_fini(ssc); 29010 29011 if (rval != 0) { 29012 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un, 29013 "sr_volume_ctrl: Mode Sense Failed\n"); 29014 kmem_free(sense, sense_buflen); 29015 kmem_free(select, select_buflen); 29016 return (rval); 29017 } 29018 sense_mhp = (struct mode_header_grp2 *)sense; 29019 select_mhp = (struct mode_header_grp2 *)select; 29020 bd_len = (sense_mhp->bdesc_length_hi << 8) | 29021 sense_mhp->bdesc_length_lo; 29022 if (bd_len > MODE_BLK_DESC_LENGTH) { 29023 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 29024 "sr_volume_ctrl: Mode Sense returned invalid " 29025 "block descriptor length\n"); 29026 kmem_free(sense, sense_buflen); 29027 kmem_free(select, select_buflen); 29028 return (EIO); 29029 } 29030 sense_page = (uchar_t *) 29031 (sense + MODE_HEADER_LENGTH_GRP2 + bd_len); 29032 select_page = (uchar_t *)(select + MODE_HEADER_LENGTH_GRP2); 29033 select_mhp->length_msb = 0; 29034 select_mhp->length_lsb = 0; 29035 select_mhp->bdesc_length_hi = 0; 29036 select_mhp->bdesc_length_lo = 0; 29037 } else { 29038 struct mode_header *sense_mhp, *select_mhp; 29039 29040 sense_buflen = MODE_PARAM_LENGTH + MODEPAGE_AUDIO_CTRL_LEN; 29041 select_buflen = MODE_HEADER_LENGTH + MODEPAGE_AUDIO_CTRL_LEN; 29042 sense = kmem_zalloc(sense_buflen, KM_SLEEP); 29043 select = kmem_zalloc(select_buflen, KM_SLEEP); 29044 ssc = sd_ssc_init(un); 29045 rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense, 29046 sense_buflen, MODEPAGE_AUDIO_CTRL, 29047 SD_PATH_STANDARD); 29048 sd_ssc_fini(ssc); 29049 29050 if (rval != 0) { 29051 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 29052 "sr_volume_ctrl: Mode Sense Failed\n"); 29053 kmem_free(sense, sense_buflen); 29054 kmem_free(select, select_buflen); 29055 return (rval); 29056 } 29057 sense_mhp = (struct mode_header *)sense; 29058 select_mhp = (struct mode_header *)select; 29059 if (sense_mhp->bdesc_length > MODE_BLK_DESC_LENGTH) { 29060 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 29061 "sr_volume_ctrl: Mode Sense returned invalid " 29062 "block descriptor length\n"); 29063 kmem_free(sense, sense_buflen); 29064 kmem_free(select, select_buflen); 29065 return (EIO); 29066 } 29067 sense_page = (uchar_t *) 29068 (sense + MODE_HEADER_LENGTH + sense_mhp->bdesc_length); 29069 select_page = (uchar_t *)(select + MODE_HEADER_LENGTH); 29070 select_mhp->length = 0; 29071 select_mhp->bdesc_length = 0; 29072 } 29073 /* 29074 * Note: An audio control data structure could be created and overlayed 29075 * on the following in place of the array indexing method implemented. 29076 */ 29077 29078 /* Build the select data for the user volume data */ 29079 select_page[0] = MODEPAGE_AUDIO_CTRL; 29080 select_page[1] = 0xE; 29081 /* Set the immediate bit */ 29082 select_page[2] = 0x04; 29083 /* Zero out reserved fields */ 29084 select_page[3] = 0x00; 29085 select_page[4] = 0x00; 29086 /* Return sense data for fields not to be modified */ 29087 select_page[5] = sense_page[5]; 29088 select_page[6] = sense_page[6]; 29089 select_page[7] = sense_page[7]; 29090 /* Set the user specified volume levels for channel 0 and 1 */ 29091 select_page[8] = 0x01; 29092 select_page[9] = vol->channel0; 29093 select_page[10] = 0x02; 29094 select_page[11] = vol->channel1; 29095 /* Channel 2 and 3 are currently unsupported so return the sense data */ 29096 select_page[12] = sense_page[12]; 29097 select_page[13] = sense_page[13]; 29098 select_page[14] = sense_page[14]; 29099 select_page[15] = sense_page[15]; 29100 29101 ssc = sd_ssc_init(un); 29102 if ((un->un_f_cfg_is_atapi == TRUE) || (un->un_f_mmc_cap == TRUE)) { 29103 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP1, select, 29104 select_buflen, SD_DONTSAVE_PAGE, SD_PATH_STANDARD); 29105 } else { 29106 rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select, 29107 select_buflen, SD_DONTSAVE_PAGE, SD_PATH_STANDARD); 29108 } 29109 sd_ssc_fini(ssc); 29110 29111 kmem_free(sense, sense_buflen); 29112 kmem_free(select, select_buflen); 29113 return (rval); 29114 } 29115 29116 29117 /* 29118 * Function: sr_read_sony_session_offset() 29119 * 29120 * Description: This routine is the driver entry point for handling CD-ROM 29121 * ioctl requests for session offset information. (CDROMREADOFFSET) 29122 * The address of the first track in the last session of a 29123 * multi-session CD-ROM is returned 29124 * 29125 * Note: This routine uses a vendor specific key value in the 29126 * command control field without implementing any vendor check here 29127 * or in the ioctl routine. 29128 * 29129 * Arguments: dev - the device 'dev_t' 29130 * data - pointer to an int to hold the requested address 29131 * flag - this argument is a pass through to ddi_copyxxx() 29132 * directly from the mode argument of ioctl(). 29133 * 29134 * Return Code: the code returned by sd_send_scsi_cmd() 29135 * EFAULT if ddi_copyxxx() fails 29136 * ENXIO if fail ddi_get_soft_state 29137 * EINVAL if data pointer is NULL 29138 */ 29139 29140 static int 29141 sr_read_sony_session_offset(dev_t dev, caddr_t data, int flag) 29142 { 29143 struct sd_lun *un; 29144 struct uscsi_cmd *com; 29145 caddr_t buffer; 29146 char cdb[CDB_GROUP1]; 29147 int session_offset = 0; 29148 int rval; 29149 29150 if (data == NULL) { 29151 return (EINVAL); 29152 } 29153 29154 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL || 29155 (un->un_state == SD_STATE_OFFLINE)) { 29156 return (ENXIO); 29157 } 29158 29159 buffer = kmem_zalloc((size_t)SONY_SESSION_OFFSET_LEN, KM_SLEEP); 29160 bzero(cdb, CDB_GROUP1); 29161 cdb[0] = SCMD_READ_TOC; 29162 /* 29163 * Bytes 7 & 8 are the 12 byte allocation length for a single entry. 29164 * (4 byte TOC response header + 8 byte response data) 29165 */ 29166 cdb[8] = SONY_SESSION_OFFSET_LEN; 29167 /* Byte 9 is the control byte. A vendor specific value is used */ 29168 cdb[9] = SONY_SESSION_OFFSET_KEY; 29169 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 29170 com->uscsi_cdb = cdb; 29171 com->uscsi_cdblen = CDB_GROUP1; 29172 com->uscsi_bufaddr = buffer; 29173 com->uscsi_buflen = SONY_SESSION_OFFSET_LEN; 29174 com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ; 29175 29176 rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE, 29177 SD_PATH_STANDARD); 29178 if (rval != 0) { 29179 kmem_free(buffer, SONY_SESSION_OFFSET_LEN); 29180 kmem_free(com, sizeof (*com)); 29181 return (rval); 29182 } 29183 if (buffer[1] == SONY_SESSION_OFFSET_VALID) { 29184 session_offset = 29185 ((uchar_t)buffer[8] << 24) + ((uchar_t)buffer[9] << 16) + 29186 ((uchar_t)buffer[10] << 8) + ((uchar_t)buffer[11]); 29187 /* 29188 * Offset returned offset in current lbasize block's. Convert to 29189 * 2k block's to return to the user 29190 */ 29191 if (un->un_tgt_blocksize == CDROM_BLK_512) { 29192 session_offset >>= 2; 29193 } else if (un->un_tgt_blocksize == CDROM_BLK_1024) { 29194 session_offset >>= 1; 29195 } 29196 } 29197 29198 if (ddi_copyout(&session_offset, data, sizeof (int), flag) != 0) { 29199 rval = EFAULT; 29200 } 29201 29202 kmem_free(buffer, SONY_SESSION_OFFSET_LEN); 29203 kmem_free(com, sizeof (*com)); 29204 return (rval); 29205 } 29206 29207 29208 /* 29209 * Function: sd_wm_cache_constructor() 29210 * 29211 * Description: Cache Constructor for the wmap cache for the read/modify/write 29212 * devices. 29213 * 29214 * Arguments: wm - A pointer to the sd_w_map to be initialized. 29215 * un - sd_lun structure for the device. 29216 * flag - the km flags passed to constructor 29217 * 29218 * Return Code: 0 on success. 29219 * -1 on failure. 29220 */ 29221 29222 /*ARGSUSED*/ 29223 static int 29224 sd_wm_cache_constructor(void *wm, void *un, int flags) 29225 { 29226 bzero(wm, sizeof (struct sd_w_map)); 29227 cv_init(&((struct sd_w_map *)wm)->wm_avail, NULL, CV_DRIVER, NULL); 29228 return (0); 29229 } 29230 29231 29232 /* 29233 * Function: sd_wm_cache_destructor() 29234 * 29235 * Description: Cache destructor for the wmap cache for the read/modify/write 29236 * devices. 29237 * 29238 * Arguments: wm - A pointer to the sd_w_map to be initialized. 29239 * un - sd_lun structure for the device. 29240 */ 29241 /*ARGSUSED*/ 29242 static void 29243 sd_wm_cache_destructor(void *wm, void *un) 29244 { 29245 cv_destroy(&((struct sd_w_map *)wm)->wm_avail); 29246 } 29247 29248 29249 /* 29250 * Function: sd_range_lock() 29251 * 29252 * Description: Lock the range of blocks specified as parameter to ensure 29253 * that read, modify write is atomic and no other i/o writes 29254 * to the same location. The range is specified in terms 29255 * of start and end blocks. Block numbers are the actual 29256 * media block numbers and not system. 29257 * 29258 * Arguments: un - sd_lun structure for the device. 29259 * startb - The starting block number 29260 * endb - The end block number 29261 * typ - type of i/o - simple/read_modify_write 29262 * 29263 * Return Code: wm - pointer to the wmap structure. 29264 * 29265 * Context: This routine can sleep. 29266 */ 29267 29268 static struct sd_w_map * 29269 sd_range_lock(struct sd_lun *un, daddr_t startb, daddr_t endb, ushort_t typ) 29270 { 29271 struct sd_w_map *wmp = NULL; 29272 struct sd_w_map *sl_wmp = NULL; 29273 struct sd_w_map *tmp_wmp; 29274 wm_state state = SD_WM_CHK_LIST; 29275 29276 29277 ASSERT(un != NULL); 29278 ASSERT(!mutex_owned(SD_MUTEX(un))); 29279 29280 mutex_enter(SD_MUTEX(un)); 29281 29282 while (state != SD_WM_DONE) { 29283 29284 switch (state) { 29285 case SD_WM_CHK_LIST: 29286 /* 29287 * This is the starting state. Check the wmap list 29288 * to see if the range is currently available. 29289 */ 29290 if (!(typ & SD_WTYPE_RMW) && !(un->un_rmw_count)) { 29291 /* 29292 * If this is a simple write and no rmw 29293 * i/o is pending then try to lock the 29294 * range as the range should be available. 29295 */ 29296 state = SD_WM_LOCK_RANGE; 29297 } else { 29298 tmp_wmp = sd_get_range(un, startb, endb); 29299 if (tmp_wmp != NULL) { 29300 if ((wmp != NULL) && ONLIST(un, wmp)) { 29301 /* 29302 * Should not keep onlist wmps 29303 * while waiting this macro 29304 * will also do wmp = NULL; 29305 */ 29306 FREE_ONLIST_WMAP(un, wmp); 29307 } 29308 /* 29309 * sl_wmp is the wmap on which wait 29310 * is done, since the tmp_wmp points 29311 * to the inuse wmap, set sl_wmp to 29312 * tmp_wmp and change the state to sleep 29313 */ 29314 sl_wmp = tmp_wmp; 29315 state = SD_WM_WAIT_MAP; 29316 } else { 29317 state = SD_WM_LOCK_RANGE; 29318 } 29319 29320 } 29321 break; 29322 29323 case SD_WM_LOCK_RANGE: 29324 ASSERT(un->un_wm_cache); 29325 /* 29326 * The range need to be locked, try to get a wmap. 29327 * First attempt it with NO_SLEEP, want to avoid a sleep 29328 * if possible as we will have to release the sd mutex 29329 * if we have to sleep. 29330 */ 29331 if (wmp == NULL) 29332 wmp = kmem_cache_alloc(un->un_wm_cache, 29333 KM_NOSLEEP); 29334 if (wmp == NULL) { 29335 mutex_exit(SD_MUTEX(un)); 29336 _NOTE(DATA_READABLE_WITHOUT_LOCK 29337 (sd_lun::un_wm_cache)) 29338 wmp = kmem_cache_alloc(un->un_wm_cache, 29339 KM_SLEEP); 29340 mutex_enter(SD_MUTEX(un)); 29341 /* 29342 * we released the mutex so recheck and go to 29343 * check list state. 29344 */ 29345 state = SD_WM_CHK_LIST; 29346 } else { 29347 /* 29348 * We exit out of state machine since we 29349 * have the wmap. Do the housekeeping first. 29350 * place the wmap on the wmap list if it is not 29351 * on it already and then set the state to done. 29352 */ 29353 wmp->wm_start = startb; 29354 wmp->wm_end = endb; 29355 wmp->wm_flags = typ | SD_WM_BUSY; 29356 if (typ & SD_WTYPE_RMW) { 29357 un->un_rmw_count++; 29358 } 29359 /* 29360 * If not already on the list then link 29361 */ 29362 if (!ONLIST(un, wmp)) { 29363 wmp->wm_next = un->un_wm; 29364 wmp->wm_prev = NULL; 29365 if (wmp->wm_next) 29366 wmp->wm_next->wm_prev = wmp; 29367 un->un_wm = wmp; 29368 } 29369 state = SD_WM_DONE; 29370 } 29371 break; 29372 29373 case SD_WM_WAIT_MAP: 29374 ASSERT(sl_wmp->wm_flags & SD_WM_BUSY); 29375 /* 29376 * Wait is done on sl_wmp, which is set in the 29377 * check_list state. 29378 */ 29379 sl_wmp->wm_wanted_count++; 29380 cv_wait(&sl_wmp->wm_avail, SD_MUTEX(un)); 29381 sl_wmp->wm_wanted_count--; 29382 /* 29383 * We can reuse the memory from the completed sl_wmp 29384 * lock range for our new lock, but only if noone is 29385 * waiting for it. 29386 */ 29387 ASSERT(!(sl_wmp->wm_flags & SD_WM_BUSY)); 29388 if (sl_wmp->wm_wanted_count == 0) { 29389 if (wmp != NULL) { 29390 CHK_N_FREEWMP(un, wmp); 29391 } 29392 wmp = sl_wmp; 29393 } 29394 sl_wmp = NULL; 29395 /* 29396 * After waking up, need to recheck for availability of 29397 * range. 29398 */ 29399 state = SD_WM_CHK_LIST; 29400 break; 29401 29402 default: 29403 panic("sd_range_lock: " 29404 "Unknown state %d in sd_range_lock", state); 29405 /*NOTREACHED*/ 29406 } /* switch(state) */ 29407 29408 } /* while(state != SD_WM_DONE) */ 29409 29410 mutex_exit(SD_MUTEX(un)); 29411 29412 ASSERT(wmp != NULL); 29413 29414 return (wmp); 29415 } 29416 29417 29418 /* 29419 * Function: sd_get_range() 29420 * 29421 * Description: Find if there any overlapping I/O to this one 29422 * Returns the write-map of 1st such I/O, NULL otherwise. 29423 * 29424 * Arguments: un - sd_lun structure for the device. 29425 * startb - The starting block number 29426 * endb - The end block number 29427 * 29428 * Return Code: wm - pointer to the wmap structure. 29429 */ 29430 29431 static struct sd_w_map * 29432 sd_get_range(struct sd_lun *un, daddr_t startb, daddr_t endb) 29433 { 29434 struct sd_w_map *wmp; 29435 29436 ASSERT(un != NULL); 29437 29438 for (wmp = un->un_wm; wmp != NULL; wmp = wmp->wm_next) { 29439 if (!(wmp->wm_flags & SD_WM_BUSY)) { 29440 continue; 29441 } 29442 if ((startb >= wmp->wm_start) && (startb <= wmp->wm_end)) { 29443 break; 29444 } 29445 if ((endb >= wmp->wm_start) && (endb <= wmp->wm_end)) { 29446 break; 29447 } 29448 } 29449 29450 return (wmp); 29451 } 29452 29453 29454 /* 29455 * Function: sd_free_inlist_wmap() 29456 * 29457 * Description: Unlink and free a write map struct. 29458 * 29459 * Arguments: un - sd_lun structure for the device. 29460 * wmp - sd_w_map which needs to be unlinked. 29461 */ 29462 29463 static void 29464 sd_free_inlist_wmap(struct sd_lun *un, struct sd_w_map *wmp) 29465 { 29466 ASSERT(un != NULL); 29467 29468 if (un->un_wm == wmp) { 29469 un->un_wm = wmp->wm_next; 29470 } else { 29471 wmp->wm_prev->wm_next = wmp->wm_next; 29472 } 29473 29474 if (wmp->wm_next) { 29475 wmp->wm_next->wm_prev = wmp->wm_prev; 29476 } 29477 29478 wmp->wm_next = wmp->wm_prev = NULL; 29479 29480 kmem_cache_free(un->un_wm_cache, wmp); 29481 } 29482 29483 29484 /* 29485 * Function: sd_range_unlock() 29486 * 29487 * Description: Unlock the range locked by wm. 29488 * Free write map if nobody else is waiting on it. 29489 * 29490 * Arguments: un - sd_lun structure for the device. 29491 * wmp - sd_w_map which needs to be unlinked. 29492 */ 29493 29494 static void 29495 sd_range_unlock(struct sd_lun *un, struct sd_w_map *wm) 29496 { 29497 ASSERT(un != NULL); 29498 ASSERT(wm != NULL); 29499 ASSERT(!mutex_owned(SD_MUTEX(un))); 29500 29501 mutex_enter(SD_MUTEX(un)); 29502 29503 if (wm->wm_flags & SD_WTYPE_RMW) { 29504 un->un_rmw_count--; 29505 } 29506 29507 if (wm->wm_wanted_count) { 29508 wm->wm_flags = 0; 29509 /* 29510 * Broadcast that the wmap is available now. 29511 */ 29512 cv_broadcast(&wm->wm_avail); 29513 } else { 29514 /* 29515 * If no one is waiting on the map, it should be free'ed. 29516 */ 29517 sd_free_inlist_wmap(un, wm); 29518 } 29519 29520 mutex_exit(SD_MUTEX(un)); 29521 } 29522 29523 29524 /* 29525 * Function: sd_read_modify_write_task 29526 * 29527 * Description: Called from a taskq thread to initiate the write phase of 29528 * a read-modify-write request. This is used for targets where 29529 * un->un_sys_blocksize != un->un_tgt_blocksize. 29530 * 29531 * Arguments: arg - a pointer to the buf(9S) struct for the write command. 29532 * 29533 * Context: Called under taskq thread context. 29534 */ 29535 29536 static void 29537 sd_read_modify_write_task(void *arg) 29538 { 29539 struct sd_mapblocksize_info *bsp; 29540 struct buf *bp; 29541 struct sd_xbuf *xp; 29542 struct sd_lun *un; 29543 29544 bp = arg; /* The bp is given in arg */ 29545 ASSERT(bp != NULL); 29546 29547 /* Get the pointer to the layer-private data struct */ 29548 xp = SD_GET_XBUF(bp); 29549 ASSERT(xp != NULL); 29550 bsp = xp->xb_private; 29551 ASSERT(bsp != NULL); 29552 29553 un = SD_GET_UN(bp); 29554 ASSERT(un != NULL); 29555 ASSERT(!mutex_owned(SD_MUTEX(un))); 29556 29557 SD_TRACE(SD_LOG_IO_RMMEDIA, un, 29558 "sd_read_modify_write_task: entry: buf:0x%p\n", bp); 29559 29560 /* 29561 * This is the write phase of a read-modify-write request, called 29562 * under the context of a taskq thread in response to the completion 29563 * of the read portion of the rmw request completing under interrupt 29564 * context. The write request must be sent from here down the iostart 29565 * chain as if it were being sent from sd_mapblocksize_iostart(), so 29566 * we use the layer index saved in the layer-private data area. 29567 */ 29568 SD_NEXT_IOSTART(bsp->mbs_layer_index, un, bp); 29569 29570 SD_TRACE(SD_LOG_IO_RMMEDIA, un, 29571 "sd_read_modify_write_task: exit: buf:0x%p\n", bp); 29572 } 29573 29574 29575 /* 29576 * Function: sddump_do_read_of_rmw() 29577 * 29578 * Description: This routine will be called from sddump, If sddump is called 29579 * with an I/O which not aligned on device blocksize boundary 29580 * then the write has to be converted to read-modify-write. 29581 * Do the read part here in order to keep sddump simple. 29582 * Note - That the sd_mutex is held across the call to this 29583 * routine. 29584 * 29585 * Arguments: un - sd_lun 29586 * blkno - block number in terms of media block size. 29587 * nblk - number of blocks. 29588 * bpp - pointer to pointer to the buf structure. On return 29589 * from this function, *bpp points to the valid buffer 29590 * to which the write has to be done. 29591 * 29592 * Return Code: 0 for success or errno-type return code 29593 */ 29594 29595 static int 29596 sddump_do_read_of_rmw(struct sd_lun *un, uint64_t blkno, uint64_t nblk, 29597 struct buf **bpp) 29598 { 29599 int err; 29600 int i; 29601 int rval; 29602 struct buf *bp; 29603 struct scsi_pkt *pkt = NULL; 29604 uint32_t target_blocksize; 29605 29606 ASSERT(un != NULL); 29607 ASSERT(mutex_owned(SD_MUTEX(un))); 29608 29609 target_blocksize = un->un_tgt_blocksize; 29610 29611 mutex_exit(SD_MUTEX(un)); 29612 29613 bp = scsi_alloc_consistent_buf(SD_ADDRESS(un), (struct buf *)NULL, 29614 (size_t)(nblk * target_blocksize), B_READ, NULL_FUNC, NULL); 29615 if (bp == NULL) { 29616 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 29617 "no resources for dumping; giving up"); 29618 err = ENOMEM; 29619 goto done; 29620 } 29621 29622 rval = sd_setup_rw_pkt(un, &pkt, bp, 0, NULL_FUNC, NULL, 29623 blkno, nblk); 29624 if (rval != 0) { 29625 scsi_free_consistent_buf(bp); 29626 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 29627 "no resources for dumping; giving up"); 29628 err = ENOMEM; 29629 goto done; 29630 } 29631 29632 pkt->pkt_flags |= FLAG_NOINTR; 29633 29634 err = EIO; 29635 for (i = 0; i < SD_NDUMP_RETRIES; i++) { 29636 29637 /* 29638 * Scsi_poll returns 0 (success) if the command completes and 29639 * the status block is STATUS_GOOD. We should only check 29640 * errors if this condition is not true. Even then we should 29641 * send our own request sense packet only if we have a check 29642 * condition and auto request sense has not been performed by 29643 * the hba. 29644 */ 29645 SD_TRACE(SD_LOG_DUMP, un, "sddump: sending read\n"); 29646 29647 if ((sd_scsi_poll(un, pkt) == 0) && (pkt->pkt_resid == 0)) { 29648 err = 0; 29649 break; 29650 } 29651 29652 /* 29653 * Check CMD_DEV_GONE 1st, give up if device is gone, 29654 * no need to read RQS data. 29655 */ 29656 if (pkt->pkt_reason == CMD_DEV_GONE) { 29657 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 29658 "Error while dumping state with rmw..." 29659 "Device is gone\n"); 29660 break; 29661 } 29662 29663 if (SD_GET_PKT_STATUS(pkt) == STATUS_CHECK) { 29664 SD_INFO(SD_LOG_DUMP, un, 29665 "sddump: read failed with CHECK, try # %d\n", i); 29666 if (((pkt->pkt_state & STATE_ARQ_DONE) == 0)) { 29667 (void) sd_send_polled_RQS(un); 29668 } 29669 29670 continue; 29671 } 29672 29673 if (SD_GET_PKT_STATUS(pkt) == STATUS_BUSY) { 29674 int reset_retval = 0; 29675 29676 SD_INFO(SD_LOG_DUMP, un, 29677 "sddump: read failed with BUSY, try # %d\n", i); 29678 29679 if (un->un_f_lun_reset_enabled == TRUE) { 29680 reset_retval = scsi_reset(SD_ADDRESS(un), 29681 RESET_LUN); 29682 } 29683 if (reset_retval == 0) { 29684 (void) scsi_reset(SD_ADDRESS(un), RESET_TARGET); 29685 } 29686 (void) sd_send_polled_RQS(un); 29687 29688 } else { 29689 SD_INFO(SD_LOG_DUMP, un, 29690 "sddump: read failed with 0x%x, try # %d\n", 29691 SD_GET_PKT_STATUS(pkt), i); 29692 mutex_enter(SD_MUTEX(un)); 29693 sd_reset_target(un, pkt); 29694 mutex_exit(SD_MUTEX(un)); 29695 } 29696 29697 /* 29698 * If we are not getting anywhere with lun/target resets, 29699 * let's reset the bus. 29700 */ 29701 if (i > SD_NDUMP_RETRIES/2) { 29702 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL); 29703 (void) sd_send_polled_RQS(un); 29704 } 29705 29706 } 29707 scsi_destroy_pkt(pkt); 29708 29709 if (err != 0) { 29710 scsi_free_consistent_buf(bp); 29711 *bpp = NULL; 29712 } else { 29713 *bpp = bp; 29714 } 29715 29716 done: 29717 mutex_enter(SD_MUTEX(un)); 29718 return (err); 29719 } 29720 29721 29722 /* 29723 * Function: sd_failfast_flushq 29724 * 29725 * Description: Take all bp's on the wait queue that have B_FAILFAST set 29726 * in b_flags and move them onto the failfast queue, then kick 29727 * off a thread to return all bp's on the failfast queue to 29728 * their owners with an error set. 29729 * 29730 * Arguments: un - pointer to the soft state struct for the instance. 29731 * 29732 * Context: may execute in interrupt context. 29733 */ 29734 29735 static void 29736 sd_failfast_flushq(struct sd_lun *un) 29737 { 29738 struct buf *bp; 29739 struct buf *next_waitq_bp; 29740 struct buf *prev_waitq_bp = NULL; 29741 29742 ASSERT(un != NULL); 29743 ASSERT(mutex_owned(SD_MUTEX(un))); 29744 ASSERT(un->un_failfast_state == SD_FAILFAST_ACTIVE); 29745 ASSERT(un->un_failfast_bp == NULL); 29746 29747 SD_TRACE(SD_LOG_IO_FAILFAST, un, 29748 "sd_failfast_flushq: entry: un:0x%p\n", un); 29749 29750 /* 29751 * Check if we should flush all bufs when entering failfast state, or 29752 * just those with B_FAILFAST set. 29753 */ 29754 if (sd_failfast_flushctl & SD_FAILFAST_FLUSH_ALL_BUFS) { 29755 /* 29756 * Move *all* bp's on the wait queue to the failfast flush 29757 * queue, including those that do NOT have B_FAILFAST set. 29758 */ 29759 if (un->un_failfast_headp == NULL) { 29760 ASSERT(un->un_failfast_tailp == NULL); 29761 un->un_failfast_headp = un->un_waitq_headp; 29762 } else { 29763 ASSERT(un->un_failfast_tailp != NULL); 29764 un->un_failfast_tailp->av_forw = un->un_waitq_headp; 29765 } 29766 29767 un->un_failfast_tailp = un->un_waitq_tailp; 29768 29769 /* update kstat for each bp moved out of the waitq */ 29770 for (bp = un->un_waitq_headp; bp != NULL; bp = bp->av_forw) { 29771 SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp); 29772 } 29773 29774 /* empty the waitq */ 29775 un->un_waitq_headp = un->un_waitq_tailp = NULL; 29776 29777 } else { 29778 /* 29779 * Go thru the wait queue, pick off all entries with 29780 * B_FAILFAST set, and move these onto the failfast queue. 29781 */ 29782 for (bp = un->un_waitq_headp; bp != NULL; bp = next_waitq_bp) { 29783 /* 29784 * Save the pointer to the next bp on the wait queue, 29785 * so we get to it on the next iteration of this loop. 29786 */ 29787 next_waitq_bp = bp->av_forw; 29788 29789 /* 29790 * If this bp from the wait queue does NOT have 29791 * B_FAILFAST set, just move on to the next element 29792 * in the wait queue. Note, this is the only place 29793 * where it is correct to set prev_waitq_bp. 29794 */ 29795 if ((bp->b_flags & B_FAILFAST) == 0) { 29796 prev_waitq_bp = bp; 29797 continue; 29798 } 29799 29800 /* 29801 * Remove the bp from the wait queue. 29802 */ 29803 if (bp == un->un_waitq_headp) { 29804 /* The bp is the first element of the waitq. */ 29805 un->un_waitq_headp = next_waitq_bp; 29806 if (un->un_waitq_headp == NULL) { 29807 /* The wait queue is now empty */ 29808 un->un_waitq_tailp = NULL; 29809 } 29810 } else { 29811 /* 29812 * The bp is either somewhere in the middle 29813 * or at the end of the wait queue. 29814 */ 29815 ASSERT(un->un_waitq_headp != NULL); 29816 ASSERT(prev_waitq_bp != NULL); 29817 ASSERT((prev_waitq_bp->b_flags & B_FAILFAST) 29818 == 0); 29819 if (bp == un->un_waitq_tailp) { 29820 /* bp is the last entry on the waitq. */ 29821 ASSERT(next_waitq_bp == NULL); 29822 un->un_waitq_tailp = prev_waitq_bp; 29823 } 29824 prev_waitq_bp->av_forw = next_waitq_bp; 29825 } 29826 bp->av_forw = NULL; 29827 29828 /* 29829 * update kstat since the bp is moved out of 29830 * the waitq 29831 */ 29832 SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp); 29833 29834 /* 29835 * Now put the bp onto the failfast queue. 29836 */ 29837 if (un->un_failfast_headp == NULL) { 29838 /* failfast queue is currently empty */ 29839 ASSERT(un->un_failfast_tailp == NULL); 29840 un->un_failfast_headp = 29841 un->un_failfast_tailp = bp; 29842 } else { 29843 /* Add the bp to the end of the failfast q */ 29844 ASSERT(un->un_failfast_tailp != NULL); 29845 ASSERT(un->un_failfast_tailp->b_flags & 29846 B_FAILFAST); 29847 un->un_failfast_tailp->av_forw = bp; 29848 un->un_failfast_tailp = bp; 29849 } 29850 } 29851 } 29852 29853 /* 29854 * Now return all bp's on the failfast queue to their owners. 29855 */ 29856 while ((bp = un->un_failfast_headp) != NULL) { 29857 29858 un->un_failfast_headp = bp->av_forw; 29859 if (un->un_failfast_headp == NULL) { 29860 un->un_failfast_tailp = NULL; 29861 } 29862 29863 /* 29864 * We want to return the bp with a failure error code, but 29865 * we do not want a call to sd_start_cmds() to occur here, 29866 * so use sd_return_failed_command_no_restart() instead of 29867 * sd_return_failed_command(). 29868 */ 29869 sd_return_failed_command_no_restart(un, bp, EIO); 29870 } 29871 29872 /* Flush the xbuf queues if required. */ 29873 if (sd_failfast_flushctl & SD_FAILFAST_FLUSH_ALL_QUEUES) { 29874 ddi_xbuf_flushq(un->un_xbuf_attr, sd_failfast_flushq_callback); 29875 } 29876 29877 SD_TRACE(SD_LOG_IO_FAILFAST, un, 29878 "sd_failfast_flushq: exit: un:0x%p\n", un); 29879 } 29880 29881 29882 /* 29883 * Function: sd_failfast_flushq_callback 29884 * 29885 * Description: Return TRUE if the given bp meets the criteria for failfast 29886 * flushing. Used with ddi_xbuf_flushq(9F). 29887 * 29888 * Arguments: bp - ptr to buf struct to be examined. 29889 * 29890 * Context: Any 29891 */ 29892 29893 static int 29894 sd_failfast_flushq_callback(struct buf *bp) 29895 { 29896 /* 29897 * Return TRUE if (1) we want to flush ALL bufs when the failfast 29898 * state is entered; OR (2) the given bp has B_FAILFAST set. 29899 */ 29900 return (((sd_failfast_flushctl & SD_FAILFAST_FLUSH_ALL_BUFS) || 29901 (bp->b_flags & B_FAILFAST)) ? TRUE : FALSE); 29902 } 29903 29904 29905 29906 /* 29907 * Function: sd_setup_next_xfer 29908 * 29909 * Description: Prepare next I/O operation using DMA_PARTIAL 29910 * 29911 */ 29912 29913 static int 29914 sd_setup_next_xfer(struct sd_lun *un, struct buf *bp, 29915 struct scsi_pkt *pkt, struct sd_xbuf *xp) 29916 { 29917 ssize_t num_blks_not_xfered; 29918 daddr_t strt_blk_num; 29919 ssize_t bytes_not_xfered; 29920 int rval; 29921 29922 ASSERT(pkt->pkt_resid == 0); 29923 29924 /* 29925 * Calculate next block number and amount to be transferred. 29926 * 29927 * How much data NOT transfered to the HBA yet. 29928 */ 29929 bytes_not_xfered = xp->xb_dma_resid; 29930 29931 /* 29932 * figure how many blocks NOT transfered to the HBA yet. 29933 */ 29934 num_blks_not_xfered = SD_BYTES2TGTBLOCKS(un, bytes_not_xfered); 29935 29936 /* 29937 * set starting block number to the end of what WAS transfered. 29938 */ 29939 strt_blk_num = xp->xb_blkno + 29940 SD_BYTES2TGTBLOCKS(un, bp->b_bcount - bytes_not_xfered); 29941 29942 /* 29943 * Move pkt to the next portion of the xfer. sd_setup_next_rw_pkt 29944 * will call scsi_initpkt with NULL_FUNC so we do not have to release 29945 * the disk mutex here. 29946 */ 29947 rval = sd_setup_next_rw_pkt(un, pkt, bp, 29948 strt_blk_num, num_blks_not_xfered); 29949 29950 if (rval == 0) { 29951 29952 /* 29953 * Success. 29954 * 29955 * Adjust things if there are still more blocks to be 29956 * transfered. 29957 */ 29958 xp->xb_dma_resid = pkt->pkt_resid; 29959 pkt->pkt_resid = 0; 29960 29961 return (1); 29962 } 29963 29964 /* 29965 * There's really only one possible return value from 29966 * sd_setup_next_rw_pkt which occurs when scsi_init_pkt 29967 * returns NULL. 29968 */ 29969 ASSERT(rval == SD_PKT_ALLOC_FAILURE); 29970 29971 bp->b_resid = bp->b_bcount; 29972 bp->b_flags |= B_ERROR; 29973 29974 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 29975 "Error setting up next portion of DMA transfer\n"); 29976 29977 return (0); 29978 } 29979 29980 /* 29981 * Function: sd_panic_for_res_conflict 29982 * 29983 * Description: Call panic with a string formatted with "Reservation Conflict" 29984 * and a human readable identifier indicating the SD instance 29985 * that experienced the reservation conflict. 29986 * 29987 * Arguments: un - pointer to the soft state struct for the instance. 29988 * 29989 * Context: may execute in interrupt context. 29990 */ 29991 29992 #define SD_RESV_CONFLICT_FMT_LEN 40 29993 void 29994 sd_panic_for_res_conflict(struct sd_lun *un) 29995 { 29996 char panic_str[SD_RESV_CONFLICT_FMT_LEN+MAXPATHLEN]; 29997 char path_str[MAXPATHLEN]; 29998 29999 (void) snprintf(panic_str, sizeof (panic_str), 30000 "Reservation Conflict\nDisk: %s", 30001 ddi_pathname(SD_DEVINFO(un), path_str)); 30002 30003 panic(panic_str); 30004 } 30005 30006 /* 30007 * Note: The following sd_faultinjection_ioctl( ) routines implement 30008 * driver support for handling fault injection for error analysis 30009 * causing faults in multiple layers of the driver. 30010 * 30011 */ 30012 30013 #ifdef SD_FAULT_INJECTION 30014 static uint_t sd_fault_injection_on = 0; 30015 30016 /* 30017 * Function: sd_faultinjection_ioctl() 30018 * 30019 * Description: This routine is the driver entry point for handling 30020 * faultinjection ioctls to inject errors into the 30021 * layer model 30022 * 30023 * Arguments: cmd - the ioctl cmd received 30024 * arg - the arguments from user and returns 30025 */ 30026 30027 static void 30028 sd_faultinjection_ioctl(int cmd, intptr_t arg, struct sd_lun *un) 30029 { 30030 uint_t i = 0; 30031 uint_t rval; 30032 30033 SD_TRACE(SD_LOG_IOERR, un, "sd_faultinjection_ioctl: entry\n"); 30034 30035 mutex_enter(SD_MUTEX(un)); 30036 30037 switch (cmd) { 30038 case SDIOCRUN: 30039 /* Allow pushed faults to be injected */ 30040 SD_INFO(SD_LOG_SDTEST, un, 30041 "sd_faultinjection_ioctl: Injecting Fault Run\n"); 30042 30043 sd_fault_injection_on = 1; 30044 30045 SD_INFO(SD_LOG_IOERR, un, 30046 "sd_faultinjection_ioctl: run finished\n"); 30047 break; 30048 30049 case SDIOCSTART: 30050 /* Start Injection Session */ 30051 SD_INFO(SD_LOG_SDTEST, un, 30052 "sd_faultinjection_ioctl: Injecting Fault Start\n"); 30053 30054 sd_fault_injection_on = 0; 30055 un->sd_injection_mask = 0xFFFFFFFF; 30056 for (i = 0; i < SD_FI_MAX_ERROR; i++) { 30057 un->sd_fi_fifo_pkt[i] = NULL; 30058 un->sd_fi_fifo_xb[i] = NULL; 30059 un->sd_fi_fifo_un[i] = NULL; 30060 un->sd_fi_fifo_arq[i] = NULL; 30061 } 30062 un->sd_fi_fifo_start = 0; 30063 un->sd_fi_fifo_end = 0; 30064 30065 mutex_enter(&(un->un_fi_mutex)); 30066 un->sd_fi_log[0] = '\0'; 30067 un->sd_fi_buf_len = 0; 30068 mutex_exit(&(un->un_fi_mutex)); 30069 30070 SD_INFO(SD_LOG_IOERR, un, 30071 "sd_faultinjection_ioctl: start finished\n"); 30072 break; 30073 30074 case SDIOCSTOP: 30075 /* Stop Injection Session */ 30076 SD_INFO(SD_LOG_SDTEST, un, 30077 "sd_faultinjection_ioctl: Injecting Fault Stop\n"); 30078 sd_fault_injection_on = 0; 30079 un->sd_injection_mask = 0x0; 30080 30081 /* Empty stray or unuseds structs from fifo */ 30082 for (i = 0; i < SD_FI_MAX_ERROR; i++) { 30083 if (un->sd_fi_fifo_pkt[i] != NULL) { 30084 kmem_free(un->sd_fi_fifo_pkt[i], 30085 sizeof (struct sd_fi_pkt)); 30086 } 30087 if (un->sd_fi_fifo_xb[i] != NULL) { 30088 kmem_free(un->sd_fi_fifo_xb[i], 30089 sizeof (struct sd_fi_xb)); 30090 } 30091 if (un->sd_fi_fifo_un[i] != NULL) { 30092 kmem_free(un->sd_fi_fifo_un[i], 30093 sizeof (struct sd_fi_un)); 30094 } 30095 if (un->sd_fi_fifo_arq[i] != NULL) { 30096 kmem_free(un->sd_fi_fifo_arq[i], 30097 sizeof (struct sd_fi_arq)); 30098 } 30099 un->sd_fi_fifo_pkt[i] = NULL; 30100 un->sd_fi_fifo_un[i] = NULL; 30101 un->sd_fi_fifo_xb[i] = NULL; 30102 un->sd_fi_fifo_arq[i] = NULL; 30103 } 30104 un->sd_fi_fifo_start = 0; 30105 un->sd_fi_fifo_end = 0; 30106 30107 SD_INFO(SD_LOG_IOERR, un, 30108 "sd_faultinjection_ioctl: stop finished\n"); 30109 break; 30110 30111 case SDIOCINSERTPKT: 30112 /* Store a packet struct to be pushed onto fifo */ 30113 SD_INFO(SD_LOG_SDTEST, un, 30114 "sd_faultinjection_ioctl: Injecting Fault Insert Pkt\n"); 30115 30116 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR; 30117 30118 sd_fault_injection_on = 0; 30119 30120 /* No more that SD_FI_MAX_ERROR allowed in Queue */ 30121 if (un->sd_fi_fifo_pkt[i] != NULL) { 30122 kmem_free(un->sd_fi_fifo_pkt[i], 30123 sizeof (struct sd_fi_pkt)); 30124 } 30125 if (arg != NULL) { 30126 un->sd_fi_fifo_pkt[i] = 30127 kmem_alloc(sizeof (struct sd_fi_pkt), KM_NOSLEEP); 30128 if (un->sd_fi_fifo_pkt[i] == NULL) { 30129 /* Alloc failed don't store anything */ 30130 break; 30131 } 30132 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_pkt[i], 30133 sizeof (struct sd_fi_pkt), 0); 30134 if (rval == -1) { 30135 kmem_free(un->sd_fi_fifo_pkt[i], 30136 sizeof (struct sd_fi_pkt)); 30137 un->sd_fi_fifo_pkt[i] = NULL; 30138 } 30139 } else { 30140 SD_INFO(SD_LOG_IOERR, un, 30141 "sd_faultinjection_ioctl: pkt null\n"); 30142 } 30143 break; 30144 30145 case SDIOCINSERTXB: 30146 /* Store a xb struct to be pushed onto fifo */ 30147 SD_INFO(SD_LOG_SDTEST, un, 30148 "sd_faultinjection_ioctl: Injecting Fault Insert XB\n"); 30149 30150 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR; 30151 30152 sd_fault_injection_on = 0; 30153 30154 if (un->sd_fi_fifo_xb[i] != NULL) { 30155 kmem_free(un->sd_fi_fifo_xb[i], 30156 sizeof (struct sd_fi_xb)); 30157 un->sd_fi_fifo_xb[i] = NULL; 30158 } 30159 if (arg != NULL) { 30160 un->sd_fi_fifo_xb[i] = 30161 kmem_alloc(sizeof (struct sd_fi_xb), KM_NOSLEEP); 30162 if (un->sd_fi_fifo_xb[i] == NULL) { 30163 /* Alloc failed don't store anything */ 30164 break; 30165 } 30166 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_xb[i], 30167 sizeof (struct sd_fi_xb), 0); 30168 30169 if (rval == -1) { 30170 kmem_free(un->sd_fi_fifo_xb[i], 30171 sizeof (struct sd_fi_xb)); 30172 un->sd_fi_fifo_xb[i] = NULL; 30173 } 30174 } else { 30175 SD_INFO(SD_LOG_IOERR, un, 30176 "sd_faultinjection_ioctl: xb null\n"); 30177 } 30178 break; 30179 30180 case SDIOCINSERTUN: 30181 /* Store a un struct to be pushed onto fifo */ 30182 SD_INFO(SD_LOG_SDTEST, un, 30183 "sd_faultinjection_ioctl: Injecting Fault Insert UN\n"); 30184 30185 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR; 30186 30187 sd_fault_injection_on = 0; 30188 30189 if (un->sd_fi_fifo_un[i] != NULL) { 30190 kmem_free(un->sd_fi_fifo_un[i], 30191 sizeof (struct sd_fi_un)); 30192 un->sd_fi_fifo_un[i] = NULL; 30193 } 30194 if (arg != NULL) { 30195 un->sd_fi_fifo_un[i] = 30196 kmem_alloc(sizeof (struct sd_fi_un), KM_NOSLEEP); 30197 if (un->sd_fi_fifo_un[i] == NULL) { 30198 /* Alloc failed don't store anything */ 30199 break; 30200 } 30201 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_un[i], 30202 sizeof (struct sd_fi_un), 0); 30203 if (rval == -1) { 30204 kmem_free(un->sd_fi_fifo_un[i], 30205 sizeof (struct sd_fi_un)); 30206 un->sd_fi_fifo_un[i] = NULL; 30207 } 30208 30209 } else { 30210 SD_INFO(SD_LOG_IOERR, un, 30211 "sd_faultinjection_ioctl: un null\n"); 30212 } 30213 30214 break; 30215 30216 case SDIOCINSERTARQ: 30217 /* Store a arq struct to be pushed onto fifo */ 30218 SD_INFO(SD_LOG_SDTEST, un, 30219 "sd_faultinjection_ioctl: Injecting Fault Insert ARQ\n"); 30220 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR; 30221 30222 sd_fault_injection_on = 0; 30223 30224 if (un->sd_fi_fifo_arq[i] != NULL) { 30225 kmem_free(un->sd_fi_fifo_arq[i], 30226 sizeof (struct sd_fi_arq)); 30227 un->sd_fi_fifo_arq[i] = NULL; 30228 } 30229 if (arg != NULL) { 30230 un->sd_fi_fifo_arq[i] = 30231 kmem_alloc(sizeof (struct sd_fi_arq), KM_NOSLEEP); 30232 if (un->sd_fi_fifo_arq[i] == NULL) { 30233 /* Alloc failed don't store anything */ 30234 break; 30235 } 30236 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_arq[i], 30237 sizeof (struct sd_fi_arq), 0); 30238 if (rval == -1) { 30239 kmem_free(un->sd_fi_fifo_arq[i], 30240 sizeof (struct sd_fi_arq)); 30241 un->sd_fi_fifo_arq[i] = NULL; 30242 } 30243 30244 } else { 30245 SD_INFO(SD_LOG_IOERR, un, 30246 "sd_faultinjection_ioctl: arq null\n"); 30247 } 30248 30249 break; 30250 30251 case SDIOCPUSH: 30252 /* Push stored xb, pkt, un, and arq onto fifo */ 30253 sd_fault_injection_on = 0; 30254 30255 if (arg != NULL) { 30256 rval = ddi_copyin((void *)arg, &i, sizeof (uint_t), 0); 30257 if (rval != -1 && 30258 un->sd_fi_fifo_end + i < SD_FI_MAX_ERROR) { 30259 un->sd_fi_fifo_end += i; 30260 } 30261 } else { 30262 SD_INFO(SD_LOG_IOERR, un, 30263 "sd_faultinjection_ioctl: push arg null\n"); 30264 if (un->sd_fi_fifo_end + i < SD_FI_MAX_ERROR) { 30265 un->sd_fi_fifo_end++; 30266 } 30267 } 30268 SD_INFO(SD_LOG_IOERR, un, 30269 "sd_faultinjection_ioctl: push to end=%d\n", 30270 un->sd_fi_fifo_end); 30271 break; 30272 30273 case SDIOCRETRIEVE: 30274 /* Return buffer of log from Injection session */ 30275 SD_INFO(SD_LOG_SDTEST, un, 30276 "sd_faultinjection_ioctl: Injecting Fault Retreive"); 30277 30278 sd_fault_injection_on = 0; 30279 30280 mutex_enter(&(un->un_fi_mutex)); 30281 rval = ddi_copyout(un->sd_fi_log, (void *)arg, 30282 un->sd_fi_buf_len+1, 0); 30283 mutex_exit(&(un->un_fi_mutex)); 30284 30285 if (rval == -1) { 30286 /* 30287 * arg is possibly invalid setting 30288 * it to NULL for return 30289 */ 30290 arg = NULL; 30291 } 30292 break; 30293 } 30294 30295 mutex_exit(SD_MUTEX(un)); 30296 SD_TRACE(SD_LOG_IOERR, un, "sd_faultinjection_ioctl: exit\n"); 30297 } 30298 30299 30300 /* 30301 * Function: sd_injection_log() 30302 * 30303 * Description: This routine adds buff to the already existing injection log 30304 * for retrieval via faultinjection_ioctl for use in fault 30305 * detection and recovery 30306 * 30307 * Arguments: buf - the string to add to the log 30308 */ 30309 30310 static void 30311 sd_injection_log(char *buf, struct sd_lun *un) 30312 { 30313 uint_t len; 30314 30315 ASSERT(un != NULL); 30316 ASSERT(buf != NULL); 30317 30318 mutex_enter(&(un->un_fi_mutex)); 30319 30320 len = min(strlen(buf), 255); 30321 /* Add logged value to Injection log to be returned later */ 30322 if (len + un->sd_fi_buf_len < SD_FI_MAX_BUF) { 30323 uint_t offset = strlen((char *)un->sd_fi_log); 30324 char *destp = (char *)un->sd_fi_log + offset; 30325 int i; 30326 for (i = 0; i < len; i++) { 30327 *destp++ = *buf++; 30328 } 30329 un->sd_fi_buf_len += len; 30330 un->sd_fi_log[un->sd_fi_buf_len] = '\0'; 30331 } 30332 30333 mutex_exit(&(un->un_fi_mutex)); 30334 } 30335 30336 30337 /* 30338 * Function: sd_faultinjection() 30339 * 30340 * Description: This routine takes the pkt and changes its 30341 * content based on error injection scenerio. 30342 * 30343 * Arguments: pktp - packet to be changed 30344 */ 30345 30346 static void 30347 sd_faultinjection(struct scsi_pkt *pktp) 30348 { 30349 uint_t i; 30350 struct sd_fi_pkt *fi_pkt; 30351 struct sd_fi_xb *fi_xb; 30352 struct sd_fi_un *fi_un; 30353 struct sd_fi_arq *fi_arq; 30354 struct buf *bp; 30355 struct sd_xbuf *xb; 30356 struct sd_lun *un; 30357 30358 ASSERT(pktp != NULL); 30359 30360 /* pull bp xb and un from pktp */ 30361 bp = (struct buf *)pktp->pkt_private; 30362 xb = SD_GET_XBUF(bp); 30363 un = SD_GET_UN(bp); 30364 30365 ASSERT(un != NULL); 30366 30367 mutex_enter(SD_MUTEX(un)); 30368 30369 SD_TRACE(SD_LOG_SDTEST, un, 30370 "sd_faultinjection: entry Injection from sdintr\n"); 30371 30372 /* if injection is off return */ 30373 if (sd_fault_injection_on == 0 || 30374 un->sd_fi_fifo_start == un->sd_fi_fifo_end) { 30375 mutex_exit(SD_MUTEX(un)); 30376 return; 30377 } 30378 30379 SD_INFO(SD_LOG_SDTEST, un, 30380 "sd_faultinjection: is working for copying\n"); 30381 30382 /* take next set off fifo */ 30383 i = un->sd_fi_fifo_start % SD_FI_MAX_ERROR; 30384 30385 fi_pkt = un->sd_fi_fifo_pkt[i]; 30386 fi_xb = un->sd_fi_fifo_xb[i]; 30387 fi_un = un->sd_fi_fifo_un[i]; 30388 fi_arq = un->sd_fi_fifo_arq[i]; 30389 30390 30391 /* set variables accordingly */ 30392 /* set pkt if it was on fifo */ 30393 if (fi_pkt != NULL) { 30394 SD_CONDSET(pktp, pkt, pkt_flags, "pkt_flags"); 30395 SD_CONDSET(*pktp, pkt, pkt_scbp, "pkt_scbp"); 30396 if (fi_pkt->pkt_cdbp != 0xff) 30397 SD_CONDSET(*pktp, pkt, pkt_cdbp, "pkt_cdbp"); 30398 SD_CONDSET(pktp, pkt, pkt_state, "pkt_state"); 30399 SD_CONDSET(pktp, pkt, pkt_statistics, "pkt_statistics"); 30400 SD_CONDSET(pktp, pkt, pkt_reason, "pkt_reason"); 30401 30402 } 30403 /* set xb if it was on fifo */ 30404 if (fi_xb != NULL) { 30405 SD_CONDSET(xb, xb, xb_blkno, "xb_blkno"); 30406 SD_CONDSET(xb, xb, xb_dma_resid, "xb_dma_resid"); 30407 if (fi_xb->xb_retry_count != 0) 30408 SD_CONDSET(xb, xb, xb_retry_count, "xb_retry_count"); 30409 SD_CONDSET(xb, xb, xb_victim_retry_count, 30410 "xb_victim_retry_count"); 30411 SD_CONDSET(xb, xb, xb_sense_status, "xb_sense_status"); 30412 SD_CONDSET(xb, xb, xb_sense_state, "xb_sense_state"); 30413 SD_CONDSET(xb, xb, xb_sense_resid, "xb_sense_resid"); 30414 30415 /* copy in block data from sense */ 30416 /* 30417 * if (fi_xb->xb_sense_data[0] != -1) { 30418 * bcopy(fi_xb->xb_sense_data, xb->xb_sense_data, 30419 * SENSE_LENGTH); 30420 * } 30421 */ 30422 bcopy(fi_xb->xb_sense_data, xb->xb_sense_data, SENSE_LENGTH); 30423 30424 /* copy in extended sense codes */ 30425 SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data), 30426 xb, es_code, "es_code"); 30427 SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data), 30428 xb, es_key, "es_key"); 30429 SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data), 30430 xb, es_add_code, "es_add_code"); 30431 SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data), 30432 xb, es_qual_code, "es_qual_code"); 30433 struct scsi_extended_sense *esp; 30434 esp = (struct scsi_extended_sense *)xb->xb_sense_data; 30435 esp->es_class = CLASS_EXTENDED_SENSE; 30436 } 30437 30438 /* set un if it was on fifo */ 30439 if (fi_un != NULL) { 30440 SD_CONDSET(un->un_sd->sd_inq, un, inq_rmb, "inq_rmb"); 30441 SD_CONDSET(un, un, un_ctype, "un_ctype"); 30442 SD_CONDSET(un, un, un_reset_retry_count, 30443 "un_reset_retry_count"); 30444 SD_CONDSET(un, un, un_reservation_type, "un_reservation_type"); 30445 SD_CONDSET(un, un, un_resvd_status, "un_resvd_status"); 30446 SD_CONDSET(un, un, un_f_arq_enabled, "un_f_arq_enabled"); 30447 SD_CONDSET(un, un, un_f_allow_bus_device_reset, 30448 "un_f_allow_bus_device_reset"); 30449 SD_CONDSET(un, un, un_f_opt_queueing, "un_f_opt_queueing"); 30450 30451 } 30452 30453 /* copy in auto request sense if it was on fifo */ 30454 if (fi_arq != NULL) { 30455 bcopy(fi_arq, pktp->pkt_scbp, sizeof (struct sd_fi_arq)); 30456 } 30457 30458 /* free structs */ 30459 if (un->sd_fi_fifo_pkt[i] != NULL) { 30460 kmem_free(un->sd_fi_fifo_pkt[i], sizeof (struct sd_fi_pkt)); 30461 } 30462 if (un->sd_fi_fifo_xb[i] != NULL) { 30463 kmem_free(un->sd_fi_fifo_xb[i], sizeof (struct sd_fi_xb)); 30464 } 30465 if (un->sd_fi_fifo_un[i] != NULL) { 30466 kmem_free(un->sd_fi_fifo_un[i], sizeof (struct sd_fi_un)); 30467 } 30468 if (un->sd_fi_fifo_arq[i] != NULL) { 30469 kmem_free(un->sd_fi_fifo_arq[i], sizeof (struct sd_fi_arq)); 30470 } 30471 30472 /* 30473 * kmem_free does not gurantee to set to NULL 30474 * since we uses these to determine if we set 30475 * values or not lets confirm they are always 30476 * NULL after free 30477 */ 30478 un->sd_fi_fifo_pkt[i] = NULL; 30479 un->sd_fi_fifo_un[i] = NULL; 30480 un->sd_fi_fifo_xb[i] = NULL; 30481 un->sd_fi_fifo_arq[i] = NULL; 30482 30483 un->sd_fi_fifo_start++; 30484 30485 mutex_exit(SD_MUTEX(un)); 30486 30487 SD_INFO(SD_LOG_SDTEST, un, "sd_faultinjection: exit\n"); 30488 } 30489 30490 #endif /* SD_FAULT_INJECTION */ 30491 30492 /* 30493 * This routine is invoked in sd_unit_attach(). Before calling it, the 30494 * properties in conf file should be processed already, and "hotpluggable" 30495 * property was processed also. 30496 * 30497 * The sd driver distinguishes 3 different type of devices: removable media, 30498 * non-removable media, and hotpluggable. Below the differences are defined: 30499 * 30500 * 1. Device ID 30501 * 30502 * The device ID of a device is used to identify this device. Refer to 30503 * ddi_devid_register(9F). 30504 * 30505 * For a non-removable media disk device which can provide 0x80 or 0x83 30506 * VPD page (refer to INQUIRY command of SCSI SPC specification), a unique 30507 * device ID is created to identify this device. For other non-removable 30508 * media devices, a default device ID is created only if this device has 30509 * at least 2 alter cylinders. Otherwise, this device has no devid. 30510 * 30511 * ------------------------------------------------------- 30512 * removable media hotpluggable | Can Have Device ID 30513 * ------------------------------------------------------- 30514 * false false | Yes 30515 * false true | Yes 30516 * true x | No 30517 * ------------------------------------------------------ 30518 * 30519 * 30520 * 2. SCSI group 4 commands 30521 * 30522 * In SCSI specs, only some commands in group 4 command set can use 30523 * 8-byte addresses that can be used to access >2TB storage spaces. 30524 * Other commands have no such capability. Without supporting group4, 30525 * it is impossible to make full use of storage spaces of a disk with 30526 * capacity larger than 2TB. 30527 * 30528 * ----------------------------------------------- 30529 * removable media hotpluggable LP64 | Group 30530 * ----------------------------------------------- 30531 * false false false | 1 30532 * false false true | 4 30533 * false true false | 1 30534 * false true true | 4 30535 * true x x | 5 30536 * ----------------------------------------------- 30537 * 30538 * 30539 * 3. Check for VTOC Label 30540 * 30541 * If a direct-access disk has no EFI label, sd will check if it has a 30542 * valid VTOC label. Now, sd also does that check for removable media 30543 * and hotpluggable devices. 30544 * 30545 * -------------------------------------------------------------- 30546 * Direct-Access removable media hotpluggable | Check Label 30547 * ------------------------------------------------------------- 30548 * false false false | No 30549 * false false true | No 30550 * false true false | Yes 30551 * false true true | Yes 30552 * true x x | Yes 30553 * -------------------------------------------------------------- 30554 * 30555 * 30556 * 4. Building default VTOC label 30557 * 30558 * As section 3 says, sd checks if some kinds of devices have VTOC label. 30559 * If those devices have no valid VTOC label, sd(7d) will attempt to 30560 * create default VTOC for them. Currently sd creates default VTOC label 30561 * for all devices on x86 platform (VTOC_16), but only for removable 30562 * media devices on SPARC (VTOC_8). 30563 * 30564 * ----------------------------------------------------------- 30565 * removable media hotpluggable platform | Default Label 30566 * ----------------------------------------------------------- 30567 * false false sparc | No 30568 * false true x86 | Yes 30569 * false true sparc | Yes 30570 * true x x | Yes 30571 * ---------------------------------------------------------- 30572 * 30573 * 30574 * 5. Supported blocksizes of target devices 30575 * 30576 * Sd supports non-512-byte blocksize for removable media devices only. 30577 * For other devices, only 512-byte blocksize is supported. This may be 30578 * changed in near future because some RAID devices require non-512-byte 30579 * blocksize 30580 * 30581 * ----------------------------------------------------------- 30582 * removable media hotpluggable | non-512-byte blocksize 30583 * ----------------------------------------------------------- 30584 * false false | No 30585 * false true | No 30586 * true x | Yes 30587 * ----------------------------------------------------------- 30588 * 30589 * 30590 * 6. Automatic mount & unmount 30591 * 30592 * Sd(7d) driver provides DKIOCREMOVABLE ioctl. This ioctl is used to query 30593 * if a device is removable media device. It return 1 for removable media 30594 * devices, and 0 for others. 30595 * 30596 * The automatic mounting subsystem should distinguish between the types 30597 * of devices and apply automounting policies to each. 30598 * 30599 * 30600 * 7. fdisk partition management 30601 * 30602 * Fdisk is traditional partition method on x86 platform. Sd(7d) driver 30603 * just supports fdisk partitions on x86 platform. On sparc platform, sd 30604 * doesn't support fdisk partitions at all. Note: pcfs(7fs) can recognize 30605 * fdisk partitions on both x86 and SPARC platform. 30606 * 30607 * ----------------------------------------------------------- 30608 * platform removable media USB/1394 | fdisk supported 30609 * ----------------------------------------------------------- 30610 * x86 X X | true 30611 * ------------------------------------------------------------ 30612 * sparc X X | false 30613 * ------------------------------------------------------------ 30614 * 30615 * 30616 * 8. MBOOT/MBR 30617 * 30618 * Although sd(7d) doesn't support fdisk on SPARC platform, it does support 30619 * read/write mboot for removable media devices on sparc platform. 30620 * 30621 * ----------------------------------------------------------- 30622 * platform removable media USB/1394 | mboot supported 30623 * ----------------------------------------------------------- 30624 * x86 X X | true 30625 * ------------------------------------------------------------ 30626 * sparc false false | false 30627 * sparc false true | true 30628 * sparc true false | true 30629 * sparc true true | true 30630 * ------------------------------------------------------------ 30631 * 30632 * 30633 * 9. error handling during opening device 30634 * 30635 * If failed to open a disk device, an errno is returned. For some kinds 30636 * of errors, different errno is returned depending on if this device is 30637 * a removable media device. This brings USB/1394 hard disks in line with 30638 * expected hard disk behavior. It is not expected that this breaks any 30639 * application. 30640 * 30641 * ------------------------------------------------------ 30642 * removable media hotpluggable | errno 30643 * ------------------------------------------------------ 30644 * false false | EIO 30645 * false true | EIO 30646 * true x | ENXIO 30647 * ------------------------------------------------------ 30648 * 30649 * 30650 * 11. ioctls: DKIOCEJECT, CDROMEJECT 30651 * 30652 * These IOCTLs are applicable only to removable media devices. 30653 * 30654 * ----------------------------------------------------------- 30655 * removable media hotpluggable |DKIOCEJECT, CDROMEJECT 30656 * ----------------------------------------------------------- 30657 * false false | No 30658 * false true | No 30659 * true x | Yes 30660 * ----------------------------------------------------------- 30661 * 30662 * 30663 * 12. Kstats for partitions 30664 * 30665 * sd creates partition kstat for non-removable media devices. USB and 30666 * Firewire hard disks now have partition kstats 30667 * 30668 * ------------------------------------------------------ 30669 * removable media hotpluggable | kstat 30670 * ------------------------------------------------------ 30671 * false false | Yes 30672 * false true | Yes 30673 * true x | No 30674 * ------------------------------------------------------ 30675 * 30676 * 30677 * 13. Removable media & hotpluggable properties 30678 * 30679 * Sd driver creates a "removable-media" property for removable media 30680 * devices. Parent nexus drivers create a "hotpluggable" property if 30681 * it supports hotplugging. 30682 * 30683 * --------------------------------------------------------------------- 30684 * removable media hotpluggable | "removable-media" " hotpluggable" 30685 * --------------------------------------------------------------------- 30686 * false false | No No 30687 * false true | No Yes 30688 * true false | Yes No 30689 * true true | Yes Yes 30690 * --------------------------------------------------------------------- 30691 * 30692 * 30693 * 14. Power Management 30694 * 30695 * sd only power manages removable media devices or devices that support 30696 * LOG_SENSE or have a "pm-capable" property (PSARC/2002/250) 30697 * 30698 * A parent nexus that supports hotplugging can also set "pm-capable" 30699 * if the disk can be power managed. 30700 * 30701 * ------------------------------------------------------------ 30702 * removable media hotpluggable pm-capable | power manage 30703 * ------------------------------------------------------------ 30704 * false false false | No 30705 * false false true | Yes 30706 * false true false | No 30707 * false true true | Yes 30708 * true x x | Yes 30709 * ------------------------------------------------------------ 30710 * 30711 * USB and firewire hard disks can now be power managed independently 30712 * of the framebuffer 30713 * 30714 * 30715 * 15. Support for USB disks with capacity larger than 1TB 30716 * 30717 * Currently, sd doesn't permit a fixed disk device with capacity 30718 * larger than 1TB to be used in a 32-bit operating system environment. 30719 * However, sd doesn't do that for removable media devices. Instead, it 30720 * assumes that removable media devices cannot have a capacity larger 30721 * than 1TB. Therefore, using those devices on 32-bit system is partially 30722 * supported, which can cause some unexpected results. 30723 * 30724 * --------------------------------------------------------------------- 30725 * removable media USB/1394 | Capacity > 1TB | Used in 32-bit env 30726 * --------------------------------------------------------------------- 30727 * false false | true | no 30728 * false true | true | no 30729 * true false | true | Yes 30730 * true true | true | Yes 30731 * --------------------------------------------------------------------- 30732 * 30733 * 30734 * 16. Check write-protection at open time 30735 * 30736 * When a removable media device is being opened for writing without NDELAY 30737 * flag, sd will check if this device is writable. If attempting to open 30738 * without NDELAY flag a write-protected device, this operation will abort. 30739 * 30740 * ------------------------------------------------------------ 30741 * removable media USB/1394 | WP Check 30742 * ------------------------------------------------------------ 30743 * false false | No 30744 * false true | No 30745 * true false | Yes 30746 * true true | Yes 30747 * ------------------------------------------------------------ 30748 * 30749 * 30750 * 17. syslog when corrupted VTOC is encountered 30751 * 30752 * Currently, if an invalid VTOC is encountered, sd only print syslog 30753 * for fixed SCSI disks. 30754 * ------------------------------------------------------------ 30755 * removable media USB/1394 | print syslog 30756 * ------------------------------------------------------------ 30757 * false false | Yes 30758 * false true | No 30759 * true false | No 30760 * true true | No 30761 * ------------------------------------------------------------ 30762 */ 30763 static void 30764 sd_set_unit_attributes(struct sd_lun *un, dev_info_t *devi) 30765 { 30766 int pm_cap; 30767 30768 ASSERT(un->un_sd); 30769 ASSERT(un->un_sd->sd_inq); 30770 30771 /* 30772 * Enable SYNC CACHE support for all devices. 30773 */ 30774 un->un_f_sync_cache_supported = TRUE; 30775 30776 /* 30777 * Set the sync cache required flag to false. 30778 * This would ensure that there is no SYNC CACHE 30779 * sent when there are no writes 30780 */ 30781 un->un_f_sync_cache_required = FALSE; 30782 30783 if (un->un_sd->sd_inq->inq_rmb) { 30784 /* 30785 * The media of this device is removable. And for this kind 30786 * of devices, it is possible to change medium after opening 30787 * devices. Thus we should support this operation. 30788 */ 30789 un->un_f_has_removable_media = TRUE; 30790 30791 /* 30792 * support non-512-byte blocksize of removable media devices 30793 */ 30794 un->un_f_non_devbsize_supported = TRUE; 30795 30796 /* 30797 * Assume that all removable media devices support DOOR_LOCK 30798 */ 30799 un->un_f_doorlock_supported = TRUE; 30800 30801 /* 30802 * For a removable media device, it is possible to be opened 30803 * with NDELAY flag when there is no media in drive, in this 30804 * case we don't care if device is writable. But if without 30805 * NDELAY flag, we need to check if media is write-protected. 30806 */ 30807 un->un_f_chk_wp_open = TRUE; 30808 30809 /* 30810 * need to start a SCSI watch thread to monitor media state, 30811 * when media is being inserted or ejected, notify syseventd. 30812 */ 30813 un->un_f_monitor_media_state = TRUE; 30814 30815 /* 30816 * Some devices don't support START_STOP_UNIT command. 30817 * Therefore, we'd better check if a device supports it 30818 * before sending it. 30819 */ 30820 un->un_f_check_start_stop = TRUE; 30821 30822 /* 30823 * support eject media ioctl: 30824 * FDEJECT, DKIOCEJECT, CDROMEJECT 30825 */ 30826 un->un_f_eject_media_supported = TRUE; 30827 30828 /* 30829 * Because many removable-media devices don't support 30830 * LOG_SENSE, we couldn't use this command to check if 30831 * a removable media device support power-management. 30832 * We assume that they support power-management via 30833 * START_STOP_UNIT command and can be spun up and down 30834 * without limitations. 30835 */ 30836 un->un_f_pm_supported = TRUE; 30837 30838 /* 30839 * Need to create a zero length (Boolean) property 30840 * removable-media for the removable media devices. 30841 * Note that the return value of the property is not being 30842 * checked, since if unable to create the property 30843 * then do not want the attach to fail altogether. Consistent 30844 * with other property creation in attach. 30845 */ 30846 (void) ddi_prop_create(DDI_DEV_T_NONE, devi, 30847 DDI_PROP_CANSLEEP, "removable-media", NULL, 0); 30848 30849 } else { 30850 /* 30851 * create device ID for device 30852 */ 30853 un->un_f_devid_supported = TRUE; 30854 30855 /* 30856 * Spin up non-removable-media devices once it is attached 30857 */ 30858 un->un_f_attach_spinup = TRUE; 30859 30860 /* 30861 * According to SCSI specification, Sense data has two kinds of 30862 * format: fixed format, and descriptor format. At present, we 30863 * don't support descriptor format sense data for removable 30864 * media. 30865 */ 30866 if (SD_INQUIRY(un)->inq_dtype == DTYPE_DIRECT) { 30867 un->un_f_descr_format_supported = TRUE; 30868 } 30869 30870 /* 30871 * kstats are created only for non-removable media devices. 30872 * 30873 * Set this in sd.conf to 0 in order to disable kstats. The 30874 * default is 1, so they are enabled by default. 30875 */ 30876 un->un_f_pkstats_enabled = (ddi_prop_get_int(DDI_DEV_T_ANY, 30877 SD_DEVINFO(un), DDI_PROP_DONTPASS, 30878 "enable-partition-kstats", 1)); 30879 30880 /* 30881 * Check if HBA has set the "pm-capable" property. 30882 * If "pm-capable" exists and is non-zero then we can 30883 * power manage the device without checking the start/stop 30884 * cycle count log sense page. 30885 * 30886 * If "pm-capable" exists and is set to be false (0), 30887 * then we should not power manage the device. 30888 * 30889 * If "pm-capable" doesn't exist then pm_cap will 30890 * be set to SD_PM_CAPABLE_UNDEFINED (-1). In this case, 30891 * sd will check the start/stop cycle count log sense page 30892 * and power manage the device if the cycle count limit has 30893 * not been exceeded. 30894 */ 30895 pm_cap = ddi_prop_get_int(DDI_DEV_T_ANY, devi, 30896 DDI_PROP_DONTPASS, "pm-capable", SD_PM_CAPABLE_UNDEFINED); 30897 if (SD_PM_CAPABLE_IS_UNDEFINED(pm_cap)) { 30898 un->un_f_log_sense_supported = TRUE; 30899 if (!un->un_f_power_condition_disabled && 30900 SD_INQUIRY(un)->inq_ansi == 6) { 30901 un->un_f_power_condition_supported = TRUE; 30902 } 30903 } else { 30904 /* 30905 * pm-capable property exists. 30906 * 30907 * Convert "TRUE" values for pm_cap to 30908 * SD_PM_CAPABLE_IS_TRUE to make it easier to check 30909 * later. "TRUE" values are any values defined in 30910 * inquiry.h. 30911 */ 30912 if (SD_PM_CAPABLE_IS_FALSE(pm_cap)) { 30913 un->un_f_log_sense_supported = FALSE; 30914 } else { 30915 /* SD_PM_CAPABLE_IS_TRUE case */ 30916 un->un_f_pm_supported = TRUE; 30917 if (!un->un_f_power_condition_disabled && 30918 SD_PM_CAPABLE_IS_SPC_4(pm_cap)) { 30919 un->un_f_power_condition_supported = 30920 TRUE; 30921 } 30922 if (SD_PM_CAP_LOG_SUPPORTED(pm_cap)) { 30923 un->un_f_log_sense_supported = TRUE; 30924 un->un_f_pm_log_sense_smart = 30925 SD_PM_CAP_SMART_LOG(pm_cap); 30926 } 30927 } 30928 30929 SD_INFO(SD_LOG_ATTACH_DETACH, un, 30930 "sd_unit_attach: un:0x%p pm-capable " 30931 "property set to %d.\n", un, un->un_f_pm_supported); 30932 } 30933 } 30934 30935 if (un->un_f_is_hotpluggable) { 30936 30937 /* 30938 * Have to watch hotpluggable devices as well, since 30939 * that's the only way for userland applications to 30940 * detect hot removal while device is busy/mounted. 30941 */ 30942 un->un_f_monitor_media_state = TRUE; 30943 30944 un->un_f_check_start_stop = TRUE; 30945 30946 } 30947 } 30948 30949 /* 30950 * sd_tg_rdwr: 30951 * Provides rdwr access for cmlb via sd_tgops. The start_block is 30952 * in sys block size, req_length in bytes. 30953 * 30954 */ 30955 static int 30956 sd_tg_rdwr(dev_info_t *devi, uchar_t cmd, void *bufaddr, 30957 diskaddr_t start_block, size_t reqlength, void *tg_cookie) 30958 { 30959 struct sd_lun *un; 30960 int path_flag = (int)(uintptr_t)tg_cookie; 30961 char *dkl = NULL; 30962 diskaddr_t real_addr = start_block; 30963 diskaddr_t first_byte, end_block; 30964 30965 size_t buffer_size = reqlength; 30966 int rval = 0; 30967 diskaddr_t cap; 30968 uint32_t lbasize; 30969 sd_ssc_t *ssc; 30970 30971 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi)); 30972 if (un == NULL) 30973 return (ENXIO); 30974 30975 if (cmd != TG_READ && cmd != TG_WRITE) 30976 return (EINVAL); 30977 30978 ssc = sd_ssc_init(un); 30979 mutex_enter(SD_MUTEX(un)); 30980 if (un->un_f_tgt_blocksize_is_valid == FALSE) { 30981 mutex_exit(SD_MUTEX(un)); 30982 rval = sd_send_scsi_READ_CAPACITY(ssc, (uint64_t *)&cap, 30983 &lbasize, path_flag); 30984 if (rval != 0) 30985 goto done1; 30986 mutex_enter(SD_MUTEX(un)); 30987 sd_update_block_info(un, lbasize, cap); 30988 if ((un->un_f_tgt_blocksize_is_valid == FALSE)) { 30989 mutex_exit(SD_MUTEX(un)); 30990 rval = EIO; 30991 goto done; 30992 } 30993 } 30994 30995 if (NOT_DEVBSIZE(un)) { 30996 /* 30997 * sys_blocksize != tgt_blocksize, need to re-adjust 30998 * blkno and save the index to beginning of dk_label 30999 */ 31000 first_byte = SD_SYSBLOCKS2BYTES(start_block); 31001 real_addr = first_byte / un->un_tgt_blocksize; 31002 31003 end_block = (first_byte + reqlength + 31004 un->un_tgt_blocksize - 1) / un->un_tgt_blocksize; 31005 31006 /* round up buffer size to multiple of target block size */ 31007 buffer_size = (end_block - real_addr) * un->un_tgt_blocksize; 31008 31009 SD_TRACE(SD_LOG_IO_PARTITION, un, "sd_tg_rdwr", 31010 "label_addr: 0x%x allocation size: 0x%x\n", 31011 real_addr, buffer_size); 31012 31013 if (((first_byte % un->un_tgt_blocksize) != 0) || 31014 (reqlength % un->un_tgt_blocksize) != 0) 31015 /* the request is not aligned */ 31016 dkl = kmem_zalloc(buffer_size, KM_SLEEP); 31017 } 31018 31019 /* 31020 * The MMC standard allows READ CAPACITY to be 31021 * inaccurate by a bounded amount (in the interest of 31022 * response latency). As a result, failed READs are 31023 * commonplace (due to the reading of metadata and not 31024 * data). Depending on the per-Vendor/drive Sense data, 31025 * the failed READ can cause many (unnecessary) retries. 31026 */ 31027 31028 if (ISCD(un) && (cmd == TG_READ) && 31029 (un->un_f_blockcount_is_valid == TRUE) && 31030 ((start_block == (un->un_blockcount - 1))|| 31031 (start_block == (un->un_blockcount - 2)))) { 31032 path_flag = SD_PATH_DIRECT_PRIORITY; 31033 } 31034 31035 mutex_exit(SD_MUTEX(un)); 31036 if (cmd == TG_READ) { 31037 rval = sd_send_scsi_READ(ssc, (dkl != NULL)? dkl: bufaddr, 31038 buffer_size, real_addr, path_flag); 31039 if (dkl != NULL) 31040 bcopy(dkl + SD_TGTBYTEOFFSET(un, start_block, 31041 real_addr), bufaddr, reqlength); 31042 } else { 31043 if (dkl) { 31044 rval = sd_send_scsi_READ(ssc, dkl, buffer_size, 31045 real_addr, path_flag); 31046 if (rval) { 31047 goto done1; 31048 } 31049 bcopy(bufaddr, dkl + SD_TGTBYTEOFFSET(un, start_block, 31050 real_addr), reqlength); 31051 } 31052 rval = sd_send_scsi_WRITE(ssc, (dkl != NULL)? dkl: bufaddr, 31053 buffer_size, real_addr, path_flag); 31054 } 31055 31056 done1: 31057 if (dkl != NULL) 31058 kmem_free(dkl, buffer_size); 31059 31060 if (rval != 0) { 31061 if (rval == EIO) 31062 sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK); 31063 else 31064 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 31065 } 31066 done: 31067 sd_ssc_fini(ssc); 31068 return (rval); 31069 } 31070 31071 31072 static int 31073 sd_tg_getinfo(dev_info_t *devi, int cmd, void *arg, void *tg_cookie) 31074 { 31075 31076 struct sd_lun *un; 31077 diskaddr_t cap; 31078 uint32_t lbasize; 31079 int path_flag = (int)(uintptr_t)tg_cookie; 31080 int ret = 0; 31081 31082 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi)); 31083 if (un == NULL) 31084 return (ENXIO); 31085 31086 switch (cmd) { 31087 case TG_GETPHYGEOM: 31088 case TG_GETVIRTGEOM: 31089 case TG_GETCAPACITY: 31090 case TG_GETBLOCKSIZE: 31091 mutex_enter(SD_MUTEX(un)); 31092 31093 if ((un->un_f_blockcount_is_valid == TRUE) && 31094 (un->un_f_tgt_blocksize_is_valid == TRUE)) { 31095 cap = un->un_blockcount; 31096 lbasize = un->un_tgt_blocksize; 31097 mutex_exit(SD_MUTEX(un)); 31098 } else { 31099 sd_ssc_t *ssc; 31100 mutex_exit(SD_MUTEX(un)); 31101 ssc = sd_ssc_init(un); 31102 ret = sd_send_scsi_READ_CAPACITY(ssc, (uint64_t *)&cap, 31103 &lbasize, path_flag); 31104 if (ret != 0) { 31105 if (ret == EIO) 31106 sd_ssc_assessment(ssc, 31107 SD_FMT_STATUS_CHECK); 31108 else 31109 sd_ssc_assessment(ssc, 31110 SD_FMT_IGNORE); 31111 sd_ssc_fini(ssc); 31112 return (ret); 31113 } 31114 sd_ssc_fini(ssc); 31115 mutex_enter(SD_MUTEX(un)); 31116 sd_update_block_info(un, lbasize, cap); 31117 if ((un->un_f_blockcount_is_valid == FALSE) || 31118 (un->un_f_tgt_blocksize_is_valid == FALSE)) { 31119 mutex_exit(SD_MUTEX(un)); 31120 return (EIO); 31121 } 31122 mutex_exit(SD_MUTEX(un)); 31123 } 31124 31125 if (cmd == TG_GETCAPACITY) { 31126 *(diskaddr_t *)arg = cap; 31127 return (0); 31128 } 31129 31130 if (cmd == TG_GETBLOCKSIZE) { 31131 *(uint32_t *)arg = lbasize; 31132 return (0); 31133 } 31134 31135 if (cmd == TG_GETPHYGEOM) 31136 ret = sd_get_physical_geometry(un, (cmlb_geom_t *)arg, 31137 cap, lbasize, path_flag); 31138 else 31139 /* TG_GETVIRTGEOM */ 31140 ret = sd_get_virtual_geometry(un, 31141 (cmlb_geom_t *)arg, cap, lbasize); 31142 31143 return (ret); 31144 31145 case TG_GETATTR: 31146 mutex_enter(SD_MUTEX(un)); 31147 ((tg_attribute_t *)arg)->media_is_writable = 31148 un->un_f_mmc_writable_media; 31149 ((tg_attribute_t *)arg)->media_is_solid_state = 31150 un->un_f_is_solid_state; 31151 ((tg_attribute_t *)arg)->media_is_rotational = 31152 un->un_f_is_rotational; 31153 mutex_exit(SD_MUTEX(un)); 31154 return (0); 31155 default: 31156 return (ENOTTY); 31157 31158 } 31159 } 31160 31161 /* 31162 * Function: sd_ssc_ereport_post 31163 * 31164 * Description: Will be called when SD driver need to post an ereport. 31165 * 31166 * Context: Kernel thread or interrupt context. 31167 */ 31168 31169 #define DEVID_IF_KNOWN(d) "devid", DATA_TYPE_STRING, (d) ? (d) : "unknown" 31170 31171 static void 31172 sd_ssc_ereport_post(sd_ssc_t *ssc, enum sd_driver_assessment drv_assess) 31173 { 31174 int uscsi_path_instance = 0; 31175 uchar_t uscsi_pkt_reason; 31176 uint32_t uscsi_pkt_state; 31177 uint32_t uscsi_pkt_statistics; 31178 uint64_t uscsi_ena; 31179 uchar_t op_code; 31180 uint8_t *sensep; 31181 union scsi_cdb *cdbp; 31182 uint_t cdblen = 0; 31183 uint_t senlen = 0; 31184 struct sd_lun *un; 31185 dev_info_t *dip; 31186 char *devid; 31187 int ssc_invalid_flags = SSC_FLAGS_INVALID_PKT_REASON | 31188 SSC_FLAGS_INVALID_STATUS | 31189 SSC_FLAGS_INVALID_SENSE | 31190 SSC_FLAGS_INVALID_DATA; 31191 char assessment[16]; 31192 31193 ASSERT(ssc != NULL); 31194 ASSERT(ssc->ssc_uscsi_cmd != NULL); 31195 ASSERT(ssc->ssc_uscsi_info != NULL); 31196 31197 un = ssc->ssc_un; 31198 ASSERT(un != NULL); 31199 31200 dip = un->un_sd->sd_dev; 31201 31202 /* 31203 * Get the devid: 31204 * devid will only be passed to non-transport error reports. 31205 */ 31206 devid = DEVI(dip)->devi_devid_str; 31207 31208 /* 31209 * If we are syncing or dumping, the command will not be executed 31210 * so we bypass this situation. 31211 */ 31212 if (ddi_in_panic() || (un->un_state == SD_STATE_SUSPENDED) || 31213 (un->un_state == SD_STATE_DUMPING)) 31214 return; 31215 31216 uscsi_pkt_reason = ssc->ssc_uscsi_info->ui_pkt_reason; 31217 uscsi_path_instance = ssc->ssc_uscsi_cmd->uscsi_path_instance; 31218 uscsi_pkt_state = ssc->ssc_uscsi_info->ui_pkt_state; 31219 uscsi_pkt_statistics = ssc->ssc_uscsi_info->ui_pkt_statistics; 31220 uscsi_ena = ssc->ssc_uscsi_info->ui_ena; 31221 31222 sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf; 31223 cdbp = (union scsi_cdb *)ssc->ssc_uscsi_cmd->uscsi_cdb; 31224 31225 /* In rare cases, EG:DOORLOCK, the cdb could be NULL */ 31226 if (cdbp == NULL) { 31227 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, 31228 "sd_ssc_ereport_post meet empty cdb\n"); 31229 return; 31230 } 31231 31232 op_code = cdbp->scc_cmd; 31233 31234 cdblen = (int)ssc->ssc_uscsi_cmd->uscsi_cdblen; 31235 senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen - 31236 ssc->ssc_uscsi_cmd->uscsi_rqresid); 31237 31238 if (senlen > 0) 31239 ASSERT(sensep != NULL); 31240 31241 /* 31242 * Initialize drv_assess to corresponding values. 31243 * SD_FM_DRV_FATAL will be mapped to "fail" or "fatal" depending 31244 * on the sense-key returned back. 31245 */ 31246 switch (drv_assess) { 31247 case SD_FM_DRV_RECOVERY: 31248 (void) sprintf(assessment, "%s", "recovered"); 31249 break; 31250 case SD_FM_DRV_RETRY: 31251 (void) sprintf(assessment, "%s", "retry"); 31252 break; 31253 case SD_FM_DRV_NOTICE: 31254 (void) sprintf(assessment, "%s", "info"); 31255 break; 31256 case SD_FM_DRV_FATAL: 31257 default: 31258 (void) sprintf(assessment, "%s", "unknown"); 31259 } 31260 /* 31261 * If drv_assess == SD_FM_DRV_RECOVERY, this should be a recovered 31262 * command, we will post ereport.io.scsi.cmd.disk.recovered. 31263 * driver-assessment will always be "recovered" here. 31264 */ 31265 if (drv_assess == SD_FM_DRV_RECOVERY) { 31266 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, NULL, 31267 "cmd.disk.recovered", uscsi_ena, devid, NULL, 31268 DDI_NOSLEEP, NULL, 31269 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 31270 DEVID_IF_KNOWN(devid), 31271 "driver-assessment", DATA_TYPE_STRING, assessment, 31272 "op-code", DATA_TYPE_UINT8, op_code, 31273 "cdb", DATA_TYPE_UINT8_ARRAY, 31274 cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb, 31275 "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason, 31276 "pkt-state", DATA_TYPE_UINT32, uscsi_pkt_state, 31277 "pkt-stats", DATA_TYPE_UINT32, uscsi_pkt_statistics, 31278 NULL); 31279 return; 31280 } 31281 31282 /* 31283 * If there is un-expected/un-decodable data, we should post 31284 * ereport.io.scsi.cmd.disk.dev.uderr. 31285 * driver-assessment will be set based on parameter drv_assess. 31286 * SSC_FLAGS_INVALID_SENSE - invalid sense data sent back. 31287 * SSC_FLAGS_INVALID_PKT_REASON - invalid pkt-reason encountered. 31288 * SSC_FLAGS_INVALID_STATUS - invalid stat-code encountered. 31289 * SSC_FLAGS_INVALID_DATA - invalid data sent back. 31290 */ 31291 if (ssc->ssc_flags & ssc_invalid_flags) { 31292 if (ssc->ssc_flags & SSC_FLAGS_INVALID_SENSE) { 31293 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, 31294 NULL, "cmd.disk.dev.uderr", uscsi_ena, devid, 31295 NULL, DDI_NOSLEEP, NULL, 31296 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 31297 DEVID_IF_KNOWN(devid), 31298 "driver-assessment", DATA_TYPE_STRING, 31299 drv_assess == SD_FM_DRV_FATAL ? 31300 "fail" : assessment, 31301 "op-code", DATA_TYPE_UINT8, op_code, 31302 "cdb", DATA_TYPE_UINT8_ARRAY, 31303 cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb, 31304 "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason, 31305 "pkt-state", DATA_TYPE_UINT32, uscsi_pkt_state, 31306 "pkt-stats", DATA_TYPE_UINT32, 31307 uscsi_pkt_statistics, 31308 "stat-code", DATA_TYPE_UINT8, 31309 ssc->ssc_uscsi_cmd->uscsi_status, 31310 "un-decode-info", DATA_TYPE_STRING, 31311 ssc->ssc_info, 31312 "un-decode-value", DATA_TYPE_UINT8_ARRAY, 31313 senlen, sensep, 31314 NULL); 31315 } else { 31316 /* 31317 * For other type of invalid data, the 31318 * un-decode-value field would be empty because the 31319 * un-decodable content could be seen from upper 31320 * level payload or inside un-decode-info. 31321 */ 31322 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, 31323 NULL, 31324 "cmd.disk.dev.uderr", uscsi_ena, devid, 31325 NULL, DDI_NOSLEEP, NULL, 31326 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 31327 DEVID_IF_KNOWN(devid), 31328 "driver-assessment", DATA_TYPE_STRING, 31329 drv_assess == SD_FM_DRV_FATAL ? 31330 "fail" : assessment, 31331 "op-code", DATA_TYPE_UINT8, op_code, 31332 "cdb", DATA_TYPE_UINT8_ARRAY, 31333 cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb, 31334 "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason, 31335 "pkt-state", DATA_TYPE_UINT32, uscsi_pkt_state, 31336 "pkt-stats", DATA_TYPE_UINT32, 31337 uscsi_pkt_statistics, 31338 "stat-code", DATA_TYPE_UINT8, 31339 ssc->ssc_uscsi_cmd->uscsi_status, 31340 "un-decode-info", DATA_TYPE_STRING, 31341 ssc->ssc_info, 31342 "un-decode-value", DATA_TYPE_UINT8_ARRAY, 31343 0, NULL, 31344 NULL); 31345 } 31346 ssc->ssc_flags &= ~ssc_invalid_flags; 31347 return; 31348 } 31349 31350 if (uscsi_pkt_reason != CMD_CMPLT || 31351 (ssc->ssc_flags & SSC_FLAGS_TRAN_ABORT)) { 31352 /* 31353 * pkt-reason != CMD_CMPLT or SSC_FLAGS_TRAN_ABORT was 31354 * set inside sd_start_cmds due to errors(bad packet or 31355 * fatal transport error), we should take it as a 31356 * transport error, so we post ereport.io.scsi.cmd.disk.tran. 31357 * driver-assessment will be set based on drv_assess. 31358 * We will set devid to NULL because it is a transport 31359 * error. 31360 */ 31361 if (ssc->ssc_flags & SSC_FLAGS_TRAN_ABORT) 31362 ssc->ssc_flags &= ~SSC_FLAGS_TRAN_ABORT; 31363 31364 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, NULL, 31365 "cmd.disk.tran", uscsi_ena, NULL, NULL, DDI_NOSLEEP, NULL, 31366 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 31367 DEVID_IF_KNOWN(devid), 31368 "driver-assessment", DATA_TYPE_STRING, 31369 drv_assess == SD_FM_DRV_FATAL ? "fail" : assessment, 31370 "op-code", DATA_TYPE_UINT8, op_code, 31371 "cdb", DATA_TYPE_UINT8_ARRAY, 31372 cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb, 31373 "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason, 31374 "pkt-state", DATA_TYPE_UINT8, uscsi_pkt_state, 31375 "pkt-stats", DATA_TYPE_UINT32, uscsi_pkt_statistics, 31376 NULL); 31377 } else { 31378 /* 31379 * If we got here, we have a completed command, and we need 31380 * to further investigate the sense data to see what kind 31381 * of ereport we should post. 31382 * No ereport is needed if sense-key is KEY_RECOVERABLE_ERROR 31383 * and asc/ascq is "ATA PASS-THROUGH INFORMATION AVAILABLE". 31384 * Post ereport.io.scsi.cmd.disk.dev.rqs.merr if sense-key is 31385 * KEY_MEDIUM_ERROR. 31386 * Post ereport.io.scsi.cmd.disk.dev.rqs.derr otherwise. 31387 * driver-assessment will be set based on the parameter 31388 * drv_assess. 31389 */ 31390 if (senlen > 0) { 31391 /* 31392 * Here we have sense data available. 31393 */ 31394 uint8_t sense_key = scsi_sense_key(sensep); 31395 uint8_t sense_asc = scsi_sense_asc(sensep); 31396 uint8_t sense_ascq = scsi_sense_ascq(sensep); 31397 31398 if (sense_key == KEY_RECOVERABLE_ERROR && 31399 sense_asc == 0x00 && sense_ascq == 0x1d) 31400 return; 31401 31402 if (sense_key == KEY_MEDIUM_ERROR) { 31403 /* 31404 * driver-assessment should be "fatal" if 31405 * drv_assess is SD_FM_DRV_FATAL. 31406 */ 31407 scsi_fm_ereport_post(un->un_sd, 31408 uscsi_path_instance, NULL, 31409 "cmd.disk.dev.rqs.merr", 31410 uscsi_ena, devid, NULL, DDI_NOSLEEP, NULL, 31411 FM_VERSION, DATA_TYPE_UINT8, 31412 FM_EREPORT_VERS0, 31413 DEVID_IF_KNOWN(devid), 31414 "driver-assessment", 31415 DATA_TYPE_STRING, 31416 drv_assess == SD_FM_DRV_FATAL ? 31417 "fatal" : assessment, 31418 "op-code", 31419 DATA_TYPE_UINT8, op_code, 31420 "cdb", 31421 DATA_TYPE_UINT8_ARRAY, cdblen, 31422 ssc->ssc_uscsi_cmd->uscsi_cdb, 31423 "pkt-reason", 31424 DATA_TYPE_UINT8, uscsi_pkt_reason, 31425 "pkt-state", 31426 DATA_TYPE_UINT8, uscsi_pkt_state, 31427 "pkt-stats", 31428 DATA_TYPE_UINT32, 31429 uscsi_pkt_statistics, 31430 "stat-code", 31431 DATA_TYPE_UINT8, 31432 ssc->ssc_uscsi_cmd->uscsi_status, 31433 "key", 31434 DATA_TYPE_UINT8, 31435 scsi_sense_key(sensep), 31436 "asc", 31437 DATA_TYPE_UINT8, 31438 scsi_sense_asc(sensep), 31439 "ascq", 31440 DATA_TYPE_UINT8, 31441 scsi_sense_ascq(sensep), 31442 "sense-data", 31443 DATA_TYPE_UINT8_ARRAY, 31444 senlen, sensep, 31445 "lba", 31446 DATA_TYPE_UINT64, 31447 ssc->ssc_uscsi_info->ui_lba, 31448 NULL); 31449 } else { 31450 /* 31451 * if sense-key == 0x4(hardware 31452 * error), driver-assessment should 31453 * be "fatal" if drv_assess is 31454 * SD_FM_DRV_FATAL. 31455 */ 31456 scsi_fm_ereport_post(un->un_sd, 31457 uscsi_path_instance, NULL, 31458 "cmd.disk.dev.rqs.derr", 31459 uscsi_ena, devid, 31460 NULL, DDI_NOSLEEP, NULL, 31461 FM_VERSION, 31462 DATA_TYPE_UINT8, FM_EREPORT_VERS0, 31463 DEVID_IF_KNOWN(devid), 31464 "driver-assessment", 31465 DATA_TYPE_STRING, 31466 drv_assess == SD_FM_DRV_FATAL ? 31467 (sense_key == 0x4 ? 31468 "fatal" : "fail") : assessment, 31469 "op-code", 31470 DATA_TYPE_UINT8, op_code, 31471 "cdb", 31472 DATA_TYPE_UINT8_ARRAY, cdblen, 31473 ssc->ssc_uscsi_cmd->uscsi_cdb, 31474 "pkt-reason", 31475 DATA_TYPE_UINT8, uscsi_pkt_reason, 31476 "pkt-state", 31477 DATA_TYPE_UINT8, uscsi_pkt_state, 31478 "pkt-stats", 31479 DATA_TYPE_UINT32, 31480 uscsi_pkt_statistics, 31481 "stat-code", 31482 DATA_TYPE_UINT8, 31483 ssc->ssc_uscsi_cmd->uscsi_status, 31484 "key", 31485 DATA_TYPE_UINT8, 31486 scsi_sense_key(sensep), 31487 "asc", 31488 DATA_TYPE_UINT8, 31489 scsi_sense_asc(sensep), 31490 "ascq", 31491 DATA_TYPE_UINT8, 31492 scsi_sense_ascq(sensep), 31493 "sense-data", 31494 DATA_TYPE_UINT8_ARRAY, 31495 senlen, sensep, 31496 NULL); 31497 } 31498 } else { 31499 /* 31500 * For stat_code == STATUS_GOOD, this is not a 31501 * hardware error. 31502 */ 31503 if (ssc->ssc_uscsi_cmd->uscsi_status == STATUS_GOOD) 31504 return; 31505 31506 /* 31507 * Post ereport.io.scsi.cmd.disk.dev.serr if we got the 31508 * stat-code but with sense data unavailable. 31509 * driver-assessment will be set based on parameter 31510 * drv_assess. 31511 */ 31512 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, 31513 NULL, 31514 "cmd.disk.dev.serr", uscsi_ena, 31515 devid, NULL, DDI_NOSLEEP, NULL, 31516 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 31517 DEVID_IF_KNOWN(devid), 31518 "driver-assessment", DATA_TYPE_STRING, 31519 drv_assess == SD_FM_DRV_FATAL ? "fail" : assessment, 31520 "op-code", DATA_TYPE_UINT8, op_code, 31521 "cdb", 31522 DATA_TYPE_UINT8_ARRAY, 31523 cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb, 31524 "pkt-reason", 31525 DATA_TYPE_UINT8, uscsi_pkt_reason, 31526 "pkt-state", 31527 DATA_TYPE_UINT8, uscsi_pkt_state, 31528 "pkt-stats", 31529 DATA_TYPE_UINT32, uscsi_pkt_statistics, 31530 "stat-code", 31531 DATA_TYPE_UINT8, 31532 ssc->ssc_uscsi_cmd->uscsi_status, 31533 NULL); 31534 } 31535 } 31536 } 31537 31538 /* 31539 * Function: sd_ssc_extract_info 31540 * 31541 * Description: Extract information available to help generate ereport. 31542 * 31543 * Context: Kernel thread or interrupt context. 31544 */ 31545 static void 31546 sd_ssc_extract_info(sd_ssc_t *ssc, struct sd_lun *un, struct scsi_pkt *pktp, 31547 struct buf *bp, struct sd_xbuf *xp) 31548 { 31549 size_t senlen = 0; 31550 union scsi_cdb *cdbp; 31551 int path_instance; 31552 /* 31553 * Need scsi_cdb_size array to determine the cdb length. 31554 */ 31555 extern uchar_t scsi_cdb_size[]; 31556 31557 ASSERT(un != NULL); 31558 ASSERT(pktp != NULL); 31559 ASSERT(bp != NULL); 31560 ASSERT(xp != NULL); 31561 ASSERT(ssc != NULL); 31562 ASSERT(mutex_owned(SD_MUTEX(un))); 31563 31564 /* 31565 * Transfer the cdb buffer pointer here. 31566 */ 31567 cdbp = (union scsi_cdb *)pktp->pkt_cdbp; 31568 31569 ssc->ssc_uscsi_cmd->uscsi_cdblen = scsi_cdb_size[GETGROUP(cdbp)]; 31570 ssc->ssc_uscsi_cmd->uscsi_cdb = (caddr_t)cdbp; 31571 31572 /* 31573 * Transfer the sense data buffer pointer if sense data is available, 31574 * calculate the sense data length first. 31575 */ 31576 if ((xp->xb_sense_state & STATE_XARQ_DONE) || 31577 (xp->xb_sense_state & STATE_ARQ_DONE)) { 31578 /* 31579 * For arq case, we will enter here. 31580 */ 31581 if (xp->xb_sense_state & STATE_XARQ_DONE) { 31582 senlen = MAX_SENSE_LENGTH - xp->xb_sense_resid; 31583 } else { 31584 senlen = SENSE_LENGTH; 31585 } 31586 } else { 31587 /* 31588 * For non-arq case, we will enter this branch. 31589 */ 31590 if (SD_GET_PKT_STATUS(pktp) == STATUS_CHECK && 31591 (xp->xb_sense_state & STATE_XFERRED_DATA)) { 31592 senlen = SENSE_LENGTH - xp->xb_sense_resid; 31593 } 31594 31595 } 31596 31597 ssc->ssc_uscsi_cmd->uscsi_rqlen = (senlen & 0xff); 31598 ssc->ssc_uscsi_cmd->uscsi_rqresid = 0; 31599 ssc->ssc_uscsi_cmd->uscsi_rqbuf = (caddr_t)xp->xb_sense_data; 31600 31601 ssc->ssc_uscsi_cmd->uscsi_status = ((*(pktp)->pkt_scbp) & STATUS_MASK); 31602 31603 /* 31604 * Only transfer path_instance when scsi_pkt was properly allocated. 31605 */ 31606 path_instance = pktp->pkt_path_instance; 31607 if (scsi_pkt_allocated_correctly(pktp) && path_instance) 31608 ssc->ssc_uscsi_cmd->uscsi_path_instance = path_instance; 31609 else 31610 ssc->ssc_uscsi_cmd->uscsi_path_instance = 0; 31611 31612 /* 31613 * Copy in the other fields we may need when posting ereport. 31614 */ 31615 ssc->ssc_uscsi_info->ui_pkt_reason = pktp->pkt_reason; 31616 ssc->ssc_uscsi_info->ui_pkt_state = pktp->pkt_state; 31617 ssc->ssc_uscsi_info->ui_pkt_statistics = pktp->pkt_statistics; 31618 ssc->ssc_uscsi_info->ui_lba = (uint64_t)SD_GET_BLKNO(bp); 31619 31620 /* 31621 * For partially read/write command, we will not create ena 31622 * in case of a successful command be reconized as recovered. 31623 */ 31624 if ((pktp->pkt_reason == CMD_CMPLT) && 31625 (ssc->ssc_uscsi_cmd->uscsi_status == STATUS_GOOD) && 31626 (senlen == 0)) { 31627 return; 31628 } 31629 31630 /* 31631 * To associate ereports of a single command execution flow, we 31632 * need a shared ena for a specific command. 31633 */ 31634 if (xp->xb_ena == 0) 31635 xp->xb_ena = fm_ena_generate(0, FM_ENA_FMT1); 31636 ssc->ssc_uscsi_info->ui_ena = xp->xb_ena; 31637 } 31638 31639 31640 /* 31641 * Function: sd_check_bdc_vpd 31642 * 31643 * Description: Query the optional INQUIRY VPD page 0xb1. If the device 31644 * supports VPD page 0xb1, sd examines the MEDIUM ROTATION 31645 * RATE. 31646 * 31647 * Set the following based on RPM value: 31648 * = 0 device is not solid state, non-rotational 31649 * = 1 device is solid state, non-rotational 31650 * > 1 device is not solid state, rotational 31651 * 31652 * Context: Kernel thread or interrupt context. 31653 */ 31654 31655 static void 31656 sd_check_bdc_vpd(sd_ssc_t *ssc) 31657 { 31658 int rval = 0; 31659 uchar_t *inqb1 = NULL; 31660 size_t inqb1_len = MAX_INQUIRY_SIZE; 31661 size_t inqb1_resid = 0; 31662 struct sd_lun *un; 31663 31664 ASSERT(ssc != NULL); 31665 un = ssc->ssc_un; 31666 ASSERT(un != NULL); 31667 ASSERT(!mutex_owned(SD_MUTEX(un))); 31668 31669 mutex_enter(SD_MUTEX(un)); 31670 un->un_f_is_rotational = TRUE; 31671 un->un_f_is_solid_state = FALSE; 31672 31673 if (ISCD(un)) { 31674 mutex_exit(SD_MUTEX(un)); 31675 return; 31676 } 31677 31678 if (sd_check_vpd_page_support(ssc) == 0 && 31679 un->un_vpd_page_mask & SD_VPD_DEV_CHARACTER_PG) { 31680 mutex_exit(SD_MUTEX(un)); 31681 /* collect page b1 data */ 31682 inqb1 = kmem_zalloc(inqb1_len, KM_SLEEP); 31683 31684 rval = sd_send_scsi_INQUIRY(ssc, inqb1, inqb1_len, 31685 0x01, 0xB1, &inqb1_resid); 31686 31687 if (rval == 0 && (inqb1_len - inqb1_resid > 5)) { 31688 SD_TRACE(SD_LOG_COMMON, un, 31689 "sd_check_bdc_vpd: \ 31690 successfully get VPD page: %x \ 31691 PAGE LENGTH: %x BYTE 4: %x \ 31692 BYTE 5: %x", inqb1[1], inqb1[3], inqb1[4], 31693 inqb1[5]); 31694 31695 mutex_enter(SD_MUTEX(un)); 31696 /* 31697 * Check the MEDIUM ROTATION RATE. 31698 */ 31699 if (inqb1[4] == 0) { 31700 if (inqb1[5] == 0) { 31701 un->un_f_is_rotational = FALSE; 31702 } else if (inqb1[5] == 1) { 31703 un->un_f_is_rotational = FALSE; 31704 un->un_f_is_solid_state = TRUE; 31705 /* 31706 * Solid state drives don't need 31707 * disksort. 31708 */ 31709 un->un_f_disksort_disabled = TRUE; 31710 } 31711 } 31712 mutex_exit(SD_MUTEX(un)); 31713 } else if (rval != 0) { 31714 sd_ssc_assessment(ssc, SD_FMT_IGNORE); 31715 } 31716 31717 kmem_free(inqb1, inqb1_len); 31718 } else { 31719 mutex_exit(SD_MUTEX(un)); 31720 } 31721 } 31722 31723 /* 31724 * Function: sd_check_emulation_mode 31725 * 31726 * Description: Check whether the SSD is at emulation mode 31727 * by issuing READ_CAPACITY_16 to see whether 31728 * we can get physical block size of the drive. 31729 * 31730 * Context: Kernel thread or interrupt context. 31731 */ 31732 31733 static void 31734 sd_check_emulation_mode(sd_ssc_t *ssc) 31735 { 31736 int rval = 0; 31737 uint64_t capacity; 31738 uint_t lbasize; 31739 uint_t pbsize; 31740 int i; 31741 int devid_len; 31742 struct sd_lun *un; 31743 31744 ASSERT(ssc != NULL); 31745 un = ssc->ssc_un; 31746 ASSERT(un != NULL); 31747 ASSERT(!mutex_owned(SD_MUTEX(un))); 31748 31749 mutex_enter(SD_MUTEX(un)); 31750 if (ISCD(un)) { 31751 mutex_exit(SD_MUTEX(un)); 31752 return; 31753 } 31754 31755 if (un->un_f_descr_format_supported) { 31756 mutex_exit(SD_MUTEX(un)); 31757 rval = sd_send_scsi_READ_CAPACITY_16(ssc, &capacity, &lbasize, 31758 &pbsize, SD_PATH_DIRECT); 31759 mutex_enter(SD_MUTEX(un)); 31760 31761 if (rval != 0) { 31762 un->un_phy_blocksize = DEV_BSIZE; 31763 } else { 31764 if (!ISP2(pbsize % DEV_BSIZE) || pbsize == 0) { 31765 un->un_phy_blocksize = DEV_BSIZE; 31766 } else if (pbsize > un->un_phy_blocksize) { 31767 /* 31768 * Don't reset the physical blocksize 31769 * unless we've detected a larger value. 31770 */ 31771 un->un_phy_blocksize = pbsize; 31772 } 31773 } 31774 } 31775 31776 for (i = 0; i < sd_flash_dev_table_size; i++) { 31777 devid_len = (int)strlen(sd_flash_dev_table[i]); 31778 if (sd_sdconf_id_match(un, sd_flash_dev_table[i], devid_len) 31779 == SD_SUCCESS) { 31780 un->un_phy_blocksize = SSD_SECSIZE; 31781 if (un->un_f_is_solid_state && 31782 un->un_phy_blocksize != un->un_tgt_blocksize) 31783 un->un_f_enable_rmw = TRUE; 31784 } 31785 } 31786 31787 mutex_exit(SD_MUTEX(un)); 31788 }