XXXX don't fail device detach when it's physically removed
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 }
--- EOF ---