xref: /illumos-gate/usr/src/uts/common/io/scsi/targets/sd.c (revision c73799dd)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 /*
26  * Copyright (c) 2011 Bayard G. Bell.  All rights reserved.
27  * Copyright (c) 2012, 2016 by Delphix. All rights reserved.
28  * Copyright 2012 DEY Storage Systems, Inc.  All rights reserved.
29  * Copyright 2017 Nexenta Systems, Inc.
30  */
31 /*
32  * Copyright 2011 cyril.galibern@opensvc.com
33  */
34 
35 /*
36  * SCSI disk target driver.
37  */
38 #include <sys/scsi/scsi.h>
39 #include <sys/dkbad.h>
40 #include <sys/dklabel.h>
41 #include <sys/dkio.h>
42 #include <sys/fdio.h>
43 #include <sys/cdio.h>
44 #include <sys/mhd.h>
45 #include <sys/vtoc.h>
46 #include <sys/dktp/fdisk.h>
47 #include <sys/kstat.h>
48 #include <sys/vtrace.h>
49 #include <sys/note.h>
50 #include <sys/thread.h>
51 #include <sys/proc.h>
52 #include <sys/efi_partition.h>
53 #include <sys/var.h>
54 #include <sys/aio_req.h>
55 
56 #ifdef __lock_lint
57 #define	_LP64
58 #define	__amd64
59 #endif
60 
61 #if (defined(__fibre))
62 /* Note: is there a leadville version of the following? */
63 #include <sys/fc4/fcal_linkapp.h>
64 #endif
65 #include <sys/taskq.h>
66 #include <sys/uuid.h>
67 #include <sys/byteorder.h>
68 #include <sys/sdt.h>
69 
70 #include "sd_xbuf.h"
71 
72 #include <sys/scsi/targets/sddef.h>
73 #include <sys/cmlb.h>
74 #include <sys/sysevent/eventdefs.h>
75 #include <sys/sysevent/dev.h>
76 
77 #include <sys/fm/protocol.h>
78 
79 /*
80  * Loadable module info.
81  */
82 #if (defined(__fibre))
83 #define	SD_MODULE_NAME	"SCSI SSA/FCAL Disk Driver"
84 #else /* !__fibre */
85 #define	SD_MODULE_NAME	"SCSI Disk Driver"
86 #endif /* !__fibre */
87 
88 /*
89  * Define the interconnect type, to allow the driver to distinguish
90  * between parallel SCSI (sd) and fibre channel (ssd) behaviors.
91  *
92  * This is really for backward compatibility. In the future, the driver
93  * should actually check the "interconnect-type" property as reported by
94  * the HBA; however at present this property is not defined by all HBAs,
95  * so we will use this #define (1) to permit the driver to run in
96  * backward-compatibility mode; and (2) to print a notification message
97  * if an FC HBA does not support the "interconnect-type" property.  The
98  * behavior of the driver will be to assume parallel SCSI behaviors unless
99  * the "interconnect-type" property is defined by the HBA **AND** has a
100  * value of either INTERCONNECT_FIBRE, INTERCONNECT_SSA, or
101  * INTERCONNECT_FABRIC, in which case the driver will assume Fibre
102  * Channel behaviors (as per the old ssd).  (Note that the
103  * INTERCONNECT_1394 and INTERCONNECT_USB types are not supported and
104  * will result in the driver assuming parallel SCSI behaviors.)
105  *
106  * (see common/sys/scsi/impl/services.h)
107  *
108  * Note: For ssd semantics, don't use INTERCONNECT_FABRIC as the default
109  * since some FC HBAs may already support that, and there is some code in
110  * the driver that already looks for it.  Using INTERCONNECT_FABRIC as the
111  * default would confuse that code, and besides things should work fine
112  * anyways if the FC HBA already reports INTERCONNECT_FABRIC for the
113  * "interconnect_type" property.
114  *
115  */
116 #if (defined(__fibre))
117 #define	SD_DEFAULT_INTERCONNECT_TYPE	SD_INTERCONNECT_FIBRE
118 #else
119 #define	SD_DEFAULT_INTERCONNECT_TYPE	SD_INTERCONNECT_PARALLEL
120 #endif
121 
122 /*
123  * The name of the driver, established from the module name in _init.
124  */
125 static	char *sd_label			= NULL;
126 
127 /*
128  * Driver name is unfortunately prefixed on some driver.conf properties.
129  */
130 #if (defined(__fibre))
131 #define	sd_max_xfer_size		ssd_max_xfer_size
132 #define	sd_config_list			ssd_config_list
133 static	char *sd_max_xfer_size		= "ssd_max_xfer_size";
134 static	char *sd_config_list		= "ssd-config-list";
135 #else
136 static	char *sd_max_xfer_size		= "sd_max_xfer_size";
137 static	char *sd_config_list		= "sd-config-list";
138 #endif
139 
140 /*
141  * Driver global variables
142  */
143 
144 #if (defined(__fibre))
145 /*
146  * These #defines are to avoid namespace collisions that occur because this
147  * code is currently used to compile two separate driver modules: sd and ssd.
148  * All global variables need to be treated this way (even if declared static)
149  * in order to allow the debugger to resolve the names properly.
150  * It is anticipated that in the near future the ssd module will be obsoleted,
151  * at which time this namespace issue should go away.
152  */
153 #define	sd_state			ssd_state
154 #define	sd_io_time			ssd_io_time
155 #define	sd_failfast_enable		ssd_failfast_enable
156 #define	sd_ua_retry_count		ssd_ua_retry_count
157 #define	sd_report_pfa			ssd_report_pfa
158 #define	sd_max_throttle			ssd_max_throttle
159 #define	sd_min_throttle			ssd_min_throttle
160 #define	sd_rot_delay			ssd_rot_delay
161 
162 #define	sd_retry_on_reservation_conflict	\
163 					ssd_retry_on_reservation_conflict
164 #define	sd_reinstate_resv_delay		ssd_reinstate_resv_delay
165 #define	sd_resv_conflict_name		ssd_resv_conflict_name
166 
167 #define	sd_component_mask		ssd_component_mask
168 #define	sd_level_mask			ssd_level_mask
169 #define	sd_debug_un			ssd_debug_un
170 #define	sd_error_level			ssd_error_level
171 
172 #define	sd_xbuf_active_limit		ssd_xbuf_active_limit
173 #define	sd_xbuf_reserve_limit		ssd_xbuf_reserve_limit
174 
175 #define	sd_tr				ssd_tr
176 #define	sd_reset_throttle_timeout	ssd_reset_throttle_timeout
177 #define	sd_qfull_throttle_timeout	ssd_qfull_throttle_timeout
178 #define	sd_qfull_throttle_enable	ssd_qfull_throttle_enable
179 #define	sd_check_media_time		ssd_check_media_time
180 #define	sd_wait_cmds_complete		ssd_wait_cmds_complete
181 #define	sd_label_mutex			ssd_label_mutex
182 #define	sd_detach_mutex			ssd_detach_mutex
183 #define	sd_log_buf			ssd_log_buf
184 #define	sd_log_mutex			ssd_log_mutex
185 
186 #define	sd_disk_table			ssd_disk_table
187 #define	sd_disk_table_size		ssd_disk_table_size
188 #define	sd_sense_mutex			ssd_sense_mutex
189 #define	sd_cdbtab			ssd_cdbtab
190 
191 #define	sd_cb_ops			ssd_cb_ops
192 #define	sd_ops				ssd_ops
193 #define	sd_additional_codes		ssd_additional_codes
194 #define	sd_tgops			ssd_tgops
195 
196 #define	sd_minor_data			ssd_minor_data
197 #define	sd_minor_data_efi		ssd_minor_data_efi
198 
199 #define	sd_tq				ssd_tq
200 #define	sd_wmr_tq			ssd_wmr_tq
201 #define	sd_taskq_name			ssd_taskq_name
202 #define	sd_wmr_taskq_name		ssd_wmr_taskq_name
203 #define	sd_taskq_minalloc		ssd_taskq_minalloc
204 #define	sd_taskq_maxalloc		ssd_taskq_maxalloc
205 
206 #define	sd_dump_format_string		ssd_dump_format_string
207 
208 #define	sd_iostart_chain		ssd_iostart_chain
209 #define	sd_iodone_chain			ssd_iodone_chain
210 
211 #define	sd_pm_idletime			ssd_pm_idletime
212 
213 #define	sd_force_pm_supported		ssd_force_pm_supported
214 
215 #define	sd_dtype_optical_bind		ssd_dtype_optical_bind
216 
217 #define	sd_ssc_init			ssd_ssc_init
218 #define	sd_ssc_send			ssd_ssc_send
219 #define	sd_ssc_fini			ssd_ssc_fini
220 #define	sd_ssc_assessment		ssd_ssc_assessment
221 #define	sd_ssc_post			ssd_ssc_post
222 #define	sd_ssc_print			ssd_ssc_print
223 #define	sd_ssc_ereport_post		ssd_ssc_ereport_post
224 #define	sd_ssc_set_info			ssd_ssc_set_info
225 #define	sd_ssc_extract_info		ssd_ssc_extract_info
226 
227 #endif
228 
229 #ifdef	SDDEBUG
230 int	sd_force_pm_supported		= 0;
231 #endif	/* SDDEBUG */
232 
233 void *sd_state				= NULL;
234 int sd_io_time				= SD_IO_TIME;
235 int sd_failfast_enable			= 1;
236 int sd_ua_retry_count			= SD_UA_RETRY_COUNT;
237 int sd_report_pfa			= 1;
238 int sd_max_throttle			= SD_MAX_THROTTLE;
239 int sd_min_throttle			= SD_MIN_THROTTLE;
240 int sd_rot_delay			= 4; /* Default 4ms Rotation delay */
241 int sd_qfull_throttle_enable		= TRUE;
242 
243 int sd_retry_on_reservation_conflict	= 1;
244 int sd_reinstate_resv_delay		= SD_REINSTATE_RESV_DELAY;
245 _NOTE(SCHEME_PROTECTS_DATA("safe sharing", sd_reinstate_resv_delay))
246 
247 static int sd_dtype_optical_bind	= -1;
248 
249 /* Note: the following is not a bug, it really is "sd_" and not "ssd_" */
250 static	char *sd_resv_conflict_name	= "sd_retry_on_reservation_conflict";
251 
252 /*
253  * Global data for debug logging. To enable debug printing, sd_component_mask
254  * and sd_level_mask should be set to the desired bit patterns as outlined in
255  * sddef.h.
256  */
257 uint_t	sd_component_mask		= 0x0;
258 uint_t	sd_level_mask			= 0x0;
259 struct	sd_lun *sd_debug_un		= NULL;
260 uint_t	sd_error_level			= SCSI_ERR_RETRYABLE;
261 
262 /* Note: these may go away in the future... */
263 static uint32_t	sd_xbuf_active_limit	= 512;
264 static uint32_t sd_xbuf_reserve_limit	= 16;
265 
266 static struct sd_resv_reclaim_request	sd_tr = { NULL, NULL, NULL, 0, 0, 0 };
267 
268 /*
269  * Timer value used to reset the throttle after it has been reduced
270  * (typically in response to TRAN_BUSY or STATUS_QFULL)
271  */
272 static int sd_reset_throttle_timeout	= SD_RESET_THROTTLE_TIMEOUT;
273 static int sd_qfull_throttle_timeout	= SD_QFULL_THROTTLE_TIMEOUT;
274 
275 /*
276  * Interval value associated with the media change scsi watch.
277  */
278 static int sd_check_media_time		= 3000000;
279 
280 /*
281  * Wait value used for in progress operations during a DDI_SUSPEND
282  */
283 static int sd_wait_cmds_complete	= SD_WAIT_CMDS_COMPLETE;
284 
285 /*
286  * sd_label_mutex protects a static buffer used in the disk label
287  * component of the driver
288  */
289 static kmutex_t sd_label_mutex;
290 
291 /*
292  * sd_detach_mutex protects un_layer_count, un_detach_count, and
293  * un_opens_in_progress in the sd_lun structure.
294  */
295 static kmutex_t sd_detach_mutex;
296 
297 _NOTE(MUTEX_PROTECTS_DATA(sd_detach_mutex,
298 	sd_lun::{un_layer_count un_detach_count un_opens_in_progress}))
299 
300 /*
301  * Global buffer and mutex for debug logging
302  */
303 static char	sd_log_buf[1024];
304 static kmutex_t	sd_log_mutex;
305 
306 /*
307  * Structs and globals for recording attached lun information.
308  * This maintains a chain. Each node in the chain represents a SCSI controller.
309  * The structure records the number of luns attached to each target connected
310  * with the controller.
311  * For parallel scsi device only.
312  */
313 struct sd_scsi_hba_tgt_lun {
314 	struct sd_scsi_hba_tgt_lun	*next;
315 	dev_info_t			*pdip;
316 	int				nlun[NTARGETS_WIDE];
317 };
318 
319 /*
320  * Flag to indicate the lun is attached or detached
321  */
322 #define	SD_SCSI_LUN_ATTACH	0
323 #define	SD_SCSI_LUN_DETACH	1
324 
325 static kmutex_t	sd_scsi_target_lun_mutex;
326 static struct sd_scsi_hba_tgt_lun	*sd_scsi_target_lun_head = NULL;
327 
328 _NOTE(MUTEX_PROTECTS_DATA(sd_scsi_target_lun_mutex,
329     sd_scsi_hba_tgt_lun::next sd_scsi_hba_tgt_lun::pdip))
330 
331 _NOTE(MUTEX_PROTECTS_DATA(sd_scsi_target_lun_mutex,
332     sd_scsi_target_lun_head))
333 
334 /*
335  * "Smart" Probe Caching structs, globals, #defines, etc.
336  * For parallel scsi and non-self-identify device only.
337  */
338 
339 /*
340  * The following resources and routines are implemented to support
341  * "smart" probing, which caches the scsi_probe() results in an array,
342  * in order to help avoid long probe times.
343  */
344 struct sd_scsi_probe_cache {
345 	struct	sd_scsi_probe_cache	*next;
346 	dev_info_t	*pdip;
347 	int		cache[NTARGETS_WIDE];
348 };
349 
350 static kmutex_t	sd_scsi_probe_cache_mutex;
351 static struct	sd_scsi_probe_cache *sd_scsi_probe_cache_head = NULL;
352 
353 /*
354  * Really we only need protection on the head of the linked list, but
355  * better safe than sorry.
356  */
357 _NOTE(MUTEX_PROTECTS_DATA(sd_scsi_probe_cache_mutex,
358     sd_scsi_probe_cache::next sd_scsi_probe_cache::pdip))
359 
360 _NOTE(MUTEX_PROTECTS_DATA(sd_scsi_probe_cache_mutex,
361     sd_scsi_probe_cache_head))
362 
363 /*
364  * Power attribute table
365  */
366 static sd_power_attr_ss sd_pwr_ss = {
367 	{ "NAME=spindle-motor", "0=off", "1=on", NULL },
368 	{0, 100},
369 	{30, 0},
370 	{20000, 0}
371 };
372 
373 static sd_power_attr_pc sd_pwr_pc = {
374 	{ "NAME=spindle-motor", "0=stopped", "1=standby", "2=idle",
375 		"3=active", NULL },
376 	{0, 0, 0, 100},
377 	{90, 90, 20, 0},
378 	{15000, 15000, 1000, 0}
379 };
380 
381 /*
382  * Power level to power condition
383  */
384 static int sd_pl2pc[] = {
385 	SD_TARGET_START_VALID,
386 	SD_TARGET_STANDBY,
387 	SD_TARGET_IDLE,
388 	SD_TARGET_ACTIVE
389 };
390 
391 /*
392  * Vendor specific data name property declarations
393  */
394 
395 #if defined(__fibre) || defined(__i386) ||defined(__amd64)
396 
397 static sd_tunables seagate_properties = {
398 	SEAGATE_THROTTLE_VALUE,
399 	0,
400 	0,
401 	0,
402 	0,
403 	0,
404 	0,
405 	0,
406 	0
407 };
408 
409 
410 static sd_tunables fujitsu_properties = {
411 	FUJITSU_THROTTLE_VALUE,
412 	0,
413 	0,
414 	0,
415 	0,
416 	0,
417 	0,
418 	0,
419 	0
420 };
421 
422 static sd_tunables ibm_properties = {
423 	IBM_THROTTLE_VALUE,
424 	0,
425 	0,
426 	0,
427 	0,
428 	0,
429 	0,
430 	0,
431 	0
432 };
433 
434 static sd_tunables purple_properties = {
435 	PURPLE_THROTTLE_VALUE,
436 	0,
437 	0,
438 	PURPLE_BUSY_RETRIES,
439 	PURPLE_RESET_RETRY_COUNT,
440 	PURPLE_RESERVE_RELEASE_TIME,
441 	0,
442 	0,
443 	0
444 };
445 
446 static sd_tunables sve_properties = {
447 	SVE_THROTTLE_VALUE,
448 	0,
449 	0,
450 	SVE_BUSY_RETRIES,
451 	SVE_RESET_RETRY_COUNT,
452 	SVE_RESERVE_RELEASE_TIME,
453 	SVE_MIN_THROTTLE_VALUE,
454 	SVE_DISKSORT_DISABLED_FLAG,
455 	0
456 };
457 
458 static sd_tunables maserati_properties = {
459 	0,
460 	0,
461 	0,
462 	0,
463 	0,
464 	0,
465 	0,
466 	MASERATI_DISKSORT_DISABLED_FLAG,
467 	MASERATI_LUN_RESET_ENABLED_FLAG
468 };
469 
470 static sd_tunables pirus_properties = {
471 	PIRUS_THROTTLE_VALUE,
472 	0,
473 	PIRUS_NRR_COUNT,
474 	PIRUS_BUSY_RETRIES,
475 	PIRUS_RESET_RETRY_COUNT,
476 	0,
477 	PIRUS_MIN_THROTTLE_VALUE,
478 	PIRUS_DISKSORT_DISABLED_FLAG,
479 	PIRUS_LUN_RESET_ENABLED_FLAG
480 };
481 
482 #endif
483 
484 #if (defined(__sparc) && !defined(__fibre)) || \
485 	(defined(__i386) || defined(__amd64))
486 
487 
488 static sd_tunables elite_properties = {
489 	ELITE_THROTTLE_VALUE,
490 	0,
491 	0,
492 	0,
493 	0,
494 	0,
495 	0,
496 	0,
497 	0
498 };
499 
500 static sd_tunables st31200n_properties = {
501 	ST31200N_THROTTLE_VALUE,
502 	0,
503 	0,
504 	0,
505 	0,
506 	0,
507 	0,
508 	0,
509 	0
510 };
511 
512 #endif /* Fibre or not */
513 
514 static sd_tunables lsi_properties_scsi = {
515 	LSI_THROTTLE_VALUE,
516 	0,
517 	LSI_NOTREADY_RETRIES,
518 	0,
519 	0,
520 	0,
521 	0,
522 	0,
523 	0
524 };
525 
526 static sd_tunables symbios_properties = {
527 	SYMBIOS_THROTTLE_VALUE,
528 	0,
529 	SYMBIOS_NOTREADY_RETRIES,
530 	0,
531 	0,
532 	0,
533 	0,
534 	0,
535 	0
536 };
537 
538 static sd_tunables lsi_properties = {
539 	0,
540 	0,
541 	LSI_NOTREADY_RETRIES,
542 	0,
543 	0,
544 	0,
545 	0,
546 	0,
547 	0
548 };
549 
550 static sd_tunables lsi_oem_properties = {
551 	0,
552 	0,
553 	LSI_OEM_NOTREADY_RETRIES,
554 	0,
555 	0,
556 	0,
557 	0,
558 	0,
559 	0,
560 	1
561 };
562 
563 
564 
565 #if (defined(SD_PROP_TST))
566 
567 #define	SD_TST_CTYPE_VAL	CTYPE_CDROM
568 #define	SD_TST_THROTTLE_VAL	16
569 #define	SD_TST_NOTREADY_VAL	12
570 #define	SD_TST_BUSY_VAL		60
571 #define	SD_TST_RST_RETRY_VAL	36
572 #define	SD_TST_RSV_REL_TIME	60
573 
574 static sd_tunables tst_properties = {
575 	SD_TST_THROTTLE_VAL,
576 	SD_TST_CTYPE_VAL,
577 	SD_TST_NOTREADY_VAL,
578 	SD_TST_BUSY_VAL,
579 	SD_TST_RST_RETRY_VAL,
580 	SD_TST_RSV_REL_TIME,
581 	0,
582 	0,
583 	0
584 };
585 #endif
586 
587 /* This is similar to the ANSI toupper implementation */
588 #define	SD_TOUPPER(C)	(((C) >= 'a' && (C) <= 'z') ? (C) - 'a' + 'A' : (C))
589 
590 /*
591  * Static Driver Configuration Table
592  *
593  * This is the table of disks which need throttle adjustment (or, perhaps
594  * something else as defined by the flags at a future time.)  device_id
595  * is a string consisting of concatenated vid (vendor), pid (product/model)
596  * and revision strings as defined in the scsi_inquiry structure.  Offsets of
597  * the parts of the string are as defined by the sizes in the scsi_inquiry
598  * structure.  Device type is searched as far as the device_id string is
599  * defined.  Flags defines which values are to be set in the driver from the
600  * properties list.
601  *
602  * Entries below which begin and end with a "*" are a special case.
603  * These do not have a specific vendor, and the string which follows
604  * can appear anywhere in the 16 byte PID portion of the inquiry data.
605  *
606  * Entries below which begin and end with a " " (blank) are a special
607  * case. The comparison function will treat multiple consecutive blanks
608  * as equivalent to a single blank. For example, this causes a
609  * sd_disk_table entry of " NEC CDROM " to match a device's id string
610  * of  "NEC       CDROM".
611  *
612  * Note: The MD21 controller type has been obsoleted.
613  *	 ST318202F is a Legacy device
614  *	 MAM3182FC, MAM3364FC, MAM3738FC do not appear to have ever been
615  *	 made with an FC connection. The entries here are a legacy.
616  */
617 static sd_disk_config_t sd_disk_table[] = {
618 #if defined(__fibre) || defined(__i386) || defined(__amd64)
619 	{ "SEAGATE ST34371FC", SD_CONF_BSET_THROTTLE, &seagate_properties },
620 	{ "SEAGATE ST19171FC", SD_CONF_BSET_THROTTLE, &seagate_properties },
621 	{ "SEAGATE ST39102FC", SD_CONF_BSET_THROTTLE, &seagate_properties },
622 	{ "SEAGATE ST39103FC", SD_CONF_BSET_THROTTLE, &seagate_properties },
623 	{ "SEAGATE ST118273F", SD_CONF_BSET_THROTTLE, &seagate_properties },
624 	{ "SEAGATE ST318202F", SD_CONF_BSET_THROTTLE, &seagate_properties },
625 	{ "SEAGATE ST318203F", SD_CONF_BSET_THROTTLE, &seagate_properties },
626 	{ "SEAGATE ST136403F", SD_CONF_BSET_THROTTLE, &seagate_properties },
627 	{ "SEAGATE ST318304F", SD_CONF_BSET_THROTTLE, &seagate_properties },
628 	{ "SEAGATE ST336704F", SD_CONF_BSET_THROTTLE, &seagate_properties },
629 	{ "SEAGATE ST373405F", SD_CONF_BSET_THROTTLE, &seagate_properties },
630 	{ "SEAGATE ST336605F", SD_CONF_BSET_THROTTLE, &seagate_properties },
631 	{ "SEAGATE ST336752F", SD_CONF_BSET_THROTTLE, &seagate_properties },
632 	{ "SEAGATE ST318452F", SD_CONF_BSET_THROTTLE, &seagate_properties },
633 	{ "FUJITSU MAG3091F",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
634 	{ "FUJITSU MAG3182F",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
635 	{ "FUJITSU MAA3182F",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
636 	{ "FUJITSU MAF3364F",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
637 	{ "FUJITSU MAL3364F",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
638 	{ "FUJITSU MAL3738F",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
639 	{ "FUJITSU MAM3182FC",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
640 	{ "FUJITSU MAM3364FC",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
641 	{ "FUJITSU MAM3738FC",  SD_CONF_BSET_THROTTLE, &fujitsu_properties },
642 	{ "IBM     DDYFT1835",  SD_CONF_BSET_THROTTLE, &ibm_properties },
643 	{ "IBM     DDYFT3695",  SD_CONF_BSET_THROTTLE, &ibm_properties },
644 	{ "IBM     IC35LF2D2",  SD_CONF_BSET_THROTTLE, &ibm_properties },
645 	{ "IBM     IC35LF2PR",  SD_CONF_BSET_THROTTLE, &ibm_properties },
646 	{ "IBM     1724-100",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
647 	{ "IBM     1726-2xx",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
648 	{ "IBM     1726-22x",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
649 	{ "IBM     1726-4xx",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
650 	{ "IBM     1726-42x",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
651 	{ "IBM     1726-3xx",   SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
652 	{ "IBM     3526",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
653 	{ "IBM     3542",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
654 	{ "IBM     3552",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
655 	{ "IBM     1722",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
656 	{ "IBM     1742",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
657 	{ "IBM     1815",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
658 	{ "IBM     FAStT",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
659 	{ "IBM     1814",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
660 	{ "IBM     1814-200",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
661 	{ "IBM     1818",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
662 	{ "DELL    MD3000",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
663 	{ "DELL    MD3000i",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
664 	{ "LSI     INF",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
665 	{ "ENGENIO INF",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
666 	{ "SGI     TP",		SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
667 	{ "SGI     IS",		SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
668 	{ "*CSM100_*",		SD_CONF_BSET_NRR_COUNT |
669 			SD_CONF_BSET_CACHE_IS_NV, &lsi_oem_properties },
670 	{ "*CSM200_*",		SD_CONF_BSET_NRR_COUNT |
671 			SD_CONF_BSET_CACHE_IS_NV, &lsi_oem_properties },
672 	{ "Fujitsu SX300",	SD_CONF_BSET_THROTTLE,  &lsi_oem_properties },
673 	{ "LSI",		SD_CONF_BSET_NRR_COUNT, &lsi_properties },
674 	{ "SUN     T3", SD_CONF_BSET_THROTTLE |
675 			SD_CONF_BSET_BSY_RETRY_COUNT|
676 			SD_CONF_BSET_RST_RETRIES|
677 			SD_CONF_BSET_RSV_REL_TIME,
678 		&purple_properties },
679 	{ "SUN     SESS01", SD_CONF_BSET_THROTTLE |
680 		SD_CONF_BSET_BSY_RETRY_COUNT|
681 		SD_CONF_BSET_RST_RETRIES|
682 		SD_CONF_BSET_RSV_REL_TIME|
683 		SD_CONF_BSET_MIN_THROTTLE|
684 		SD_CONF_BSET_DISKSORT_DISABLED,
685 		&sve_properties },
686 	{ "SUN     T4", SD_CONF_BSET_THROTTLE |
687 			SD_CONF_BSET_BSY_RETRY_COUNT|
688 			SD_CONF_BSET_RST_RETRIES|
689 			SD_CONF_BSET_RSV_REL_TIME,
690 		&purple_properties },
691 	{ "SUN     SVE01", SD_CONF_BSET_DISKSORT_DISABLED |
692 		SD_CONF_BSET_LUN_RESET_ENABLED,
693 		&maserati_properties },
694 	{ "SUN     SE6920", SD_CONF_BSET_THROTTLE |
695 		SD_CONF_BSET_NRR_COUNT|
696 		SD_CONF_BSET_BSY_RETRY_COUNT|
697 		SD_CONF_BSET_RST_RETRIES|
698 		SD_CONF_BSET_MIN_THROTTLE|
699 		SD_CONF_BSET_DISKSORT_DISABLED|
700 		SD_CONF_BSET_LUN_RESET_ENABLED,
701 		&pirus_properties },
702 	{ "SUN     SE6940", SD_CONF_BSET_THROTTLE |
703 		SD_CONF_BSET_NRR_COUNT|
704 		SD_CONF_BSET_BSY_RETRY_COUNT|
705 		SD_CONF_BSET_RST_RETRIES|
706 		SD_CONF_BSET_MIN_THROTTLE|
707 		SD_CONF_BSET_DISKSORT_DISABLED|
708 		SD_CONF_BSET_LUN_RESET_ENABLED,
709 		&pirus_properties },
710 	{ "SUN     StorageTek 6920", SD_CONF_BSET_THROTTLE |
711 		SD_CONF_BSET_NRR_COUNT|
712 		SD_CONF_BSET_BSY_RETRY_COUNT|
713 		SD_CONF_BSET_RST_RETRIES|
714 		SD_CONF_BSET_MIN_THROTTLE|
715 		SD_CONF_BSET_DISKSORT_DISABLED|
716 		SD_CONF_BSET_LUN_RESET_ENABLED,
717 		&pirus_properties },
718 	{ "SUN     StorageTek 6940", SD_CONF_BSET_THROTTLE |
719 		SD_CONF_BSET_NRR_COUNT|
720 		SD_CONF_BSET_BSY_RETRY_COUNT|
721 		SD_CONF_BSET_RST_RETRIES|
722 		SD_CONF_BSET_MIN_THROTTLE|
723 		SD_CONF_BSET_DISKSORT_DISABLED|
724 		SD_CONF_BSET_LUN_RESET_ENABLED,
725 		&pirus_properties },
726 	{ "SUN     PSX1000", SD_CONF_BSET_THROTTLE |
727 		SD_CONF_BSET_NRR_COUNT|
728 		SD_CONF_BSET_BSY_RETRY_COUNT|
729 		SD_CONF_BSET_RST_RETRIES|
730 		SD_CONF_BSET_MIN_THROTTLE|
731 		SD_CONF_BSET_DISKSORT_DISABLED|
732 		SD_CONF_BSET_LUN_RESET_ENABLED,
733 		&pirus_properties },
734 	{ "SUN     SE6330", SD_CONF_BSET_THROTTLE |
735 		SD_CONF_BSET_NRR_COUNT|
736 		SD_CONF_BSET_BSY_RETRY_COUNT|
737 		SD_CONF_BSET_RST_RETRIES|
738 		SD_CONF_BSET_MIN_THROTTLE|
739 		SD_CONF_BSET_DISKSORT_DISABLED|
740 		SD_CONF_BSET_LUN_RESET_ENABLED,
741 		&pirus_properties },
742 	{ "SUN     STK6580_6780", SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
743 	{ "SUN     SUN_6180", SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
744 	{ "STK     OPENstorage", SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
745 	{ "STK     OpenStorage", SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
746 	{ "STK     BladeCtlr",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
747 	{ "STK     FLEXLINE",	SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties },
748 	{ "SYMBIOS", SD_CONF_BSET_NRR_COUNT, &symbios_properties },
749 #endif /* fibre or NON-sparc platforms */
750 #if ((defined(__sparc) && !defined(__fibre)) ||\
751 	(defined(__i386) || defined(__amd64)))
752 	{ "SEAGATE ST42400N", SD_CONF_BSET_THROTTLE, &elite_properties },
753 	{ "SEAGATE ST31200N", SD_CONF_BSET_THROTTLE, &st31200n_properties },
754 	{ "SEAGATE ST41600N", SD_CONF_BSET_TUR_CHECK, NULL },
755 	{ "CONNER  CP30540",  SD_CONF_BSET_NOCACHE,  NULL },
756 	{ "*SUN0104*", SD_CONF_BSET_FAB_DEVID, NULL },
757 	{ "*SUN0207*", SD_CONF_BSET_FAB_DEVID, NULL },
758 	{ "*SUN0327*", SD_CONF_BSET_FAB_DEVID, NULL },
759 	{ "*SUN0340*", SD_CONF_BSET_FAB_DEVID, NULL },
760 	{ "*SUN0424*", SD_CONF_BSET_FAB_DEVID, NULL },
761 	{ "*SUN0669*", SD_CONF_BSET_FAB_DEVID, NULL },
762 	{ "*SUN1.0G*", SD_CONF_BSET_FAB_DEVID, NULL },
763 	{ "SYMBIOS INF-01-00       ", SD_CONF_BSET_FAB_DEVID, NULL },
764 	{ "SYMBIOS", SD_CONF_BSET_THROTTLE|SD_CONF_BSET_NRR_COUNT,
765 	    &symbios_properties },
766 	{ "LSI", SD_CONF_BSET_THROTTLE | SD_CONF_BSET_NRR_COUNT,
767 	    &lsi_properties_scsi },
768 #if defined(__i386) || defined(__amd64)
769 	{ " NEC CD-ROM DRIVE:260 ", (SD_CONF_BSET_PLAYMSF_BCD
770 				    | SD_CONF_BSET_READSUB_BCD
771 				    | SD_CONF_BSET_READ_TOC_ADDR_BCD
772 				    | SD_CONF_BSET_NO_READ_HEADER
773 				    | SD_CONF_BSET_READ_CD_XD4), NULL },
774 
775 	{ " NEC CD-ROM DRIVE:270 ", (SD_CONF_BSET_PLAYMSF_BCD
776 				    | SD_CONF_BSET_READSUB_BCD
777 				    | SD_CONF_BSET_READ_TOC_ADDR_BCD
778 				    | SD_CONF_BSET_NO_READ_HEADER
779 				    | SD_CONF_BSET_READ_CD_XD4), NULL },
780 #endif /* __i386 || __amd64 */
781 #endif /* sparc NON-fibre or NON-sparc platforms */
782 
783 #if (defined(SD_PROP_TST))
784 	{ "VENDOR  PRODUCT ", (SD_CONF_BSET_THROTTLE
785 				| SD_CONF_BSET_CTYPE
786 				| SD_CONF_BSET_NRR_COUNT
787 				| SD_CONF_BSET_FAB_DEVID
788 				| SD_CONF_BSET_NOCACHE
789 				| SD_CONF_BSET_BSY_RETRY_COUNT
790 				| SD_CONF_BSET_PLAYMSF_BCD
791 				| SD_CONF_BSET_READSUB_BCD
792 				| SD_CONF_BSET_READ_TOC_TRK_BCD
793 				| SD_CONF_BSET_READ_TOC_ADDR_BCD
794 				| SD_CONF_BSET_NO_READ_HEADER
795 				| SD_CONF_BSET_READ_CD_XD4
796 				| SD_CONF_BSET_RST_RETRIES
797 				| SD_CONF_BSET_RSV_REL_TIME
798 				| SD_CONF_BSET_TUR_CHECK), &tst_properties},
799 #endif
800 };
801 
802 static const int sd_disk_table_size =
803 	sizeof (sd_disk_table)/ sizeof (sd_disk_config_t);
804 
805 /*
806  * Emulation mode disk drive VID/PID table
807  */
808 static char sd_flash_dev_table[][25] = {
809 	"ATA     MARVELL SD88SA02",
810 	"MARVELL SD88SA02",
811 	"TOSHIBA THNSNV05",
812 };
813 
814 static const int sd_flash_dev_table_size =
815 	sizeof (sd_flash_dev_table) / sizeof (sd_flash_dev_table[0]);
816 
817 #define	SD_INTERCONNECT_PARALLEL	0
818 #define	SD_INTERCONNECT_FABRIC		1
819 #define	SD_INTERCONNECT_FIBRE		2
820 #define	SD_INTERCONNECT_SSA		3
821 #define	SD_INTERCONNECT_SATA		4
822 #define	SD_INTERCONNECT_SAS		5
823 
824 #define	SD_IS_PARALLEL_SCSI(un)		\
825 	((un)->un_interconnect_type == SD_INTERCONNECT_PARALLEL)
826 #define	SD_IS_SERIAL(un)		\
827 	(((un)->un_interconnect_type == SD_INTERCONNECT_SATA) ||\
828 	((un)->un_interconnect_type == SD_INTERCONNECT_SAS))
829 
830 /*
831  * Definitions used by device id registration routines
832  */
833 #define	VPD_HEAD_OFFSET		3	/* size of head for vpd page */
834 #define	VPD_PAGE_LENGTH		3	/* offset for pge length data */
835 #define	VPD_MODE_PAGE		1	/* offset into vpd pg for "page code" */
836 
837 static kmutex_t sd_sense_mutex = {0};
838 
839 /*
840  * Macros for updates of the driver state
841  */
842 #define	New_state(un, s)        \
843 	(un)->un_last_state = (un)->un_state, (un)->un_state = (s)
844 #define	Restore_state(un)	\
845 	{ uchar_t tmp = (un)->un_last_state; New_state((un), tmp); }
846 
847 static struct sd_cdbinfo sd_cdbtab[] = {
848 	{ CDB_GROUP0, 0x00,	   0x1FFFFF,   0xFF,	    },
849 	{ CDB_GROUP1, SCMD_GROUP1, 0xFFFFFFFF, 0xFFFF,	    },
850 	{ CDB_GROUP5, SCMD_GROUP5, 0xFFFFFFFF, 0xFFFFFFFF,  },
851 	{ CDB_GROUP4, SCMD_GROUP4, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF, },
852 };
853 
854 /*
855  * Specifies the number of seconds that must have elapsed since the last
856  * cmd. has completed for a device to be declared idle to the PM framework.
857  */
858 static int sd_pm_idletime = 1;
859 
860 /*
861  * Internal function prototypes
862  */
863 
864 #if (defined(__fibre))
865 /*
866  * These #defines are to avoid namespace collisions that occur because this
867  * code is currently used to compile two separate driver modules: sd and ssd.
868  * All function names need to be treated this way (even if declared static)
869  * in order to allow the debugger to resolve the names properly.
870  * It is anticipated that in the near future the ssd module will be obsoleted,
871  * at which time this ugliness should go away.
872  */
873 #define	sd_log_trace			ssd_log_trace
874 #define	sd_log_info			ssd_log_info
875 #define	sd_log_err			ssd_log_err
876 #define	sdprobe				ssdprobe
877 #define	sdinfo				ssdinfo
878 #define	sd_prop_op			ssd_prop_op
879 #define	sd_scsi_probe_cache_init	ssd_scsi_probe_cache_init
880 #define	sd_scsi_probe_cache_fini	ssd_scsi_probe_cache_fini
881 #define	sd_scsi_clear_probe_cache	ssd_scsi_clear_probe_cache
882 #define	sd_scsi_probe_with_cache	ssd_scsi_probe_with_cache
883 #define	sd_scsi_target_lun_init		ssd_scsi_target_lun_init
884 #define	sd_scsi_target_lun_fini		ssd_scsi_target_lun_fini
885 #define	sd_scsi_get_target_lun_count	ssd_scsi_get_target_lun_count
886 #define	sd_scsi_update_lun_on_target	ssd_scsi_update_lun_on_target
887 #define	sd_spin_up_unit			ssd_spin_up_unit
888 #define	sd_enable_descr_sense		ssd_enable_descr_sense
889 #define	sd_reenable_dsense_task		ssd_reenable_dsense_task
890 #define	sd_set_mmc_caps			ssd_set_mmc_caps
891 #define	sd_read_unit_properties		ssd_read_unit_properties
892 #define	sd_process_sdconf_file		ssd_process_sdconf_file
893 #define	sd_process_sdconf_table		ssd_process_sdconf_table
894 #define	sd_sdconf_id_match		ssd_sdconf_id_match
895 #define	sd_blank_cmp			ssd_blank_cmp
896 #define	sd_chk_vers1_data		ssd_chk_vers1_data
897 #define	sd_set_vers1_properties		ssd_set_vers1_properties
898 #define	sd_check_bdc_vpd		ssd_check_bdc_vpd
899 #define	sd_check_emulation_mode		ssd_check_emulation_mode
900 
901 #define	sd_get_physical_geometry	ssd_get_physical_geometry
902 #define	sd_get_virtual_geometry		ssd_get_virtual_geometry
903 #define	sd_update_block_info		ssd_update_block_info
904 #define	sd_register_devid		ssd_register_devid
905 #define	sd_get_devid			ssd_get_devid
906 #define	sd_create_devid			ssd_create_devid
907 #define	sd_write_deviceid		ssd_write_deviceid
908 #define	sd_check_vpd_page_support	ssd_check_vpd_page_support
909 #define	sd_setup_pm			ssd_setup_pm
910 #define	sd_create_pm_components		ssd_create_pm_components
911 #define	sd_ddi_suspend			ssd_ddi_suspend
912 #define	sd_ddi_resume			ssd_ddi_resume
913 #define	sd_pm_state_change		ssd_pm_state_change
914 #define	sdpower				ssdpower
915 #define	sdattach			ssdattach
916 #define	sddetach			ssddetach
917 #define	sd_unit_attach			ssd_unit_attach
918 #define	sd_unit_detach			ssd_unit_detach
919 #define	sd_set_unit_attributes		ssd_set_unit_attributes
920 #define	sd_create_errstats		ssd_create_errstats
921 #define	sd_set_errstats			ssd_set_errstats
922 #define	sd_set_pstats			ssd_set_pstats
923 #define	sddump				ssddump
924 #define	sd_scsi_poll			ssd_scsi_poll
925 #define	sd_send_polled_RQS		ssd_send_polled_RQS
926 #define	sd_ddi_scsi_poll		ssd_ddi_scsi_poll
927 #define	sd_init_event_callbacks		ssd_init_event_callbacks
928 #define	sd_event_callback		ssd_event_callback
929 #define	sd_cache_control		ssd_cache_control
930 #define	sd_get_write_cache_enabled	ssd_get_write_cache_enabled
931 #define	sd_get_write_cache_changeable	ssd_get_write_cache_changeable
932 #define	sd_get_nv_sup			ssd_get_nv_sup
933 #define	sd_make_device			ssd_make_device
934 #define	sdopen				ssdopen
935 #define	sdclose				ssdclose
936 #define	sd_ready_and_valid		ssd_ready_and_valid
937 #define	sdmin				ssdmin
938 #define	sdread				ssdread
939 #define	sdwrite				ssdwrite
940 #define	sdaread				ssdaread
941 #define	sdawrite			ssdawrite
942 #define	sdstrategy			ssdstrategy
943 #define	sdioctl				ssdioctl
944 #define	sd_mapblockaddr_iostart		ssd_mapblockaddr_iostart
945 #define	sd_mapblocksize_iostart		ssd_mapblocksize_iostart
946 #define	sd_checksum_iostart		ssd_checksum_iostart
947 #define	sd_checksum_uscsi_iostart	ssd_checksum_uscsi_iostart
948 #define	sd_pm_iostart			ssd_pm_iostart
949 #define	sd_core_iostart			ssd_core_iostart
950 #define	sd_mapblockaddr_iodone		ssd_mapblockaddr_iodone
951 #define	sd_mapblocksize_iodone		ssd_mapblocksize_iodone
952 #define	sd_checksum_iodone		ssd_checksum_iodone
953 #define	sd_checksum_uscsi_iodone	ssd_checksum_uscsi_iodone
954 #define	sd_pm_iodone			ssd_pm_iodone
955 #define	sd_initpkt_for_buf		ssd_initpkt_for_buf
956 #define	sd_destroypkt_for_buf		ssd_destroypkt_for_buf
957 #define	sd_setup_rw_pkt			ssd_setup_rw_pkt
958 #define	sd_setup_next_rw_pkt		ssd_setup_next_rw_pkt
959 #define	sd_buf_iodone			ssd_buf_iodone
960 #define	sd_uscsi_strategy		ssd_uscsi_strategy
961 #define	sd_initpkt_for_uscsi		ssd_initpkt_for_uscsi
962 #define	sd_destroypkt_for_uscsi		ssd_destroypkt_for_uscsi
963 #define	sd_uscsi_iodone			ssd_uscsi_iodone
964 #define	sd_xbuf_strategy		ssd_xbuf_strategy
965 #define	sd_xbuf_init			ssd_xbuf_init
966 #define	sd_pm_entry			ssd_pm_entry
967 #define	sd_pm_exit			ssd_pm_exit
968 
969 #define	sd_pm_idletimeout_handler	ssd_pm_idletimeout_handler
970 #define	sd_pm_timeout_handler		ssd_pm_timeout_handler
971 
972 #define	sd_add_buf_to_waitq		ssd_add_buf_to_waitq
973 #define	sdintr				ssdintr
974 #define	sd_start_cmds			ssd_start_cmds
975 #define	sd_send_scsi_cmd		ssd_send_scsi_cmd
976 #define	sd_bioclone_alloc		ssd_bioclone_alloc
977 #define	sd_bioclone_free		ssd_bioclone_free
978 #define	sd_shadow_buf_alloc		ssd_shadow_buf_alloc
979 #define	sd_shadow_buf_free		ssd_shadow_buf_free
980 #define	sd_print_transport_rejected_message	\
981 					ssd_print_transport_rejected_message
982 #define	sd_retry_command		ssd_retry_command
983 #define	sd_set_retry_bp			ssd_set_retry_bp
984 #define	sd_send_request_sense_command	ssd_send_request_sense_command
985 #define	sd_start_retry_command		ssd_start_retry_command
986 #define	sd_start_direct_priority_command	\
987 					ssd_start_direct_priority_command
988 #define	sd_return_failed_command	ssd_return_failed_command
989 #define	sd_return_failed_command_no_restart	\
990 					ssd_return_failed_command_no_restart
991 #define	sd_return_command		ssd_return_command
992 #define	sd_sync_with_callback		ssd_sync_with_callback
993 #define	sdrunout			ssdrunout
994 #define	sd_mark_rqs_busy		ssd_mark_rqs_busy
995 #define	sd_mark_rqs_idle		ssd_mark_rqs_idle
996 #define	sd_reduce_throttle		ssd_reduce_throttle
997 #define	sd_restore_throttle		ssd_restore_throttle
998 #define	sd_print_incomplete_msg		ssd_print_incomplete_msg
999 #define	sd_init_cdb_limits		ssd_init_cdb_limits
1000 #define	sd_pkt_status_good		ssd_pkt_status_good
1001 #define	sd_pkt_status_check_condition	ssd_pkt_status_check_condition
1002 #define	sd_pkt_status_busy		ssd_pkt_status_busy
1003 #define	sd_pkt_status_reservation_conflict	\
1004 					ssd_pkt_status_reservation_conflict
1005 #define	sd_pkt_status_qfull		ssd_pkt_status_qfull
1006 #define	sd_handle_request_sense		ssd_handle_request_sense
1007 #define	sd_handle_auto_request_sense	ssd_handle_auto_request_sense
1008 #define	sd_print_sense_failed_msg	ssd_print_sense_failed_msg
1009 #define	sd_validate_sense_data		ssd_validate_sense_data
1010 #define	sd_decode_sense			ssd_decode_sense
1011 #define	sd_print_sense_msg		ssd_print_sense_msg
1012 #define	sd_sense_key_no_sense		ssd_sense_key_no_sense
1013 #define	sd_sense_key_recoverable_error	ssd_sense_key_recoverable_error
1014 #define	sd_sense_key_not_ready		ssd_sense_key_not_ready
1015 #define	sd_sense_key_medium_or_hardware_error	\
1016 					ssd_sense_key_medium_or_hardware_error
1017 #define	sd_sense_key_illegal_request	ssd_sense_key_illegal_request
1018 #define	sd_sense_key_unit_attention	ssd_sense_key_unit_attention
1019 #define	sd_sense_key_fail_command	ssd_sense_key_fail_command
1020 #define	sd_sense_key_blank_check	ssd_sense_key_blank_check
1021 #define	sd_sense_key_aborted_command	ssd_sense_key_aborted_command
1022 #define	sd_sense_key_default		ssd_sense_key_default
1023 #define	sd_print_retry_msg		ssd_print_retry_msg
1024 #define	sd_print_cmd_incomplete_msg	ssd_print_cmd_incomplete_msg
1025 #define	sd_pkt_reason_cmd_incomplete	ssd_pkt_reason_cmd_incomplete
1026 #define	sd_pkt_reason_cmd_tran_err	ssd_pkt_reason_cmd_tran_err
1027 #define	sd_pkt_reason_cmd_reset		ssd_pkt_reason_cmd_reset
1028 #define	sd_pkt_reason_cmd_aborted	ssd_pkt_reason_cmd_aborted
1029 #define	sd_pkt_reason_cmd_timeout	ssd_pkt_reason_cmd_timeout
1030 #define	sd_pkt_reason_cmd_unx_bus_free	ssd_pkt_reason_cmd_unx_bus_free
1031 #define	sd_pkt_reason_cmd_tag_reject	ssd_pkt_reason_cmd_tag_reject
1032 #define	sd_pkt_reason_default		ssd_pkt_reason_default
1033 #define	sd_reset_target			ssd_reset_target
1034 #define	sd_start_stop_unit_callback	ssd_start_stop_unit_callback
1035 #define	sd_start_stop_unit_task		ssd_start_stop_unit_task
1036 #define	sd_taskq_create			ssd_taskq_create
1037 #define	sd_taskq_delete			ssd_taskq_delete
1038 #define	sd_target_change_task		ssd_target_change_task
1039 #define	sd_log_dev_status_event		ssd_log_dev_status_event
1040 #define	sd_log_lun_expansion_event	ssd_log_lun_expansion_event
1041 #define	sd_log_eject_request_event	ssd_log_eject_request_event
1042 #define	sd_media_change_task		ssd_media_change_task
1043 #define	sd_handle_mchange		ssd_handle_mchange
1044 #define	sd_send_scsi_DOORLOCK		ssd_send_scsi_DOORLOCK
1045 #define	sd_send_scsi_READ_CAPACITY	ssd_send_scsi_READ_CAPACITY
1046 #define	sd_send_scsi_READ_CAPACITY_16	ssd_send_scsi_READ_CAPACITY_16
1047 #define	sd_send_scsi_GET_CONFIGURATION	ssd_send_scsi_GET_CONFIGURATION
1048 #define	sd_send_scsi_feature_GET_CONFIGURATION	\
1049 					sd_send_scsi_feature_GET_CONFIGURATION
1050 #define	sd_send_scsi_START_STOP_UNIT	ssd_send_scsi_START_STOP_UNIT
1051 #define	sd_send_scsi_INQUIRY		ssd_send_scsi_INQUIRY
1052 #define	sd_send_scsi_TEST_UNIT_READY	ssd_send_scsi_TEST_UNIT_READY
1053 #define	sd_send_scsi_PERSISTENT_RESERVE_IN	\
1054 					ssd_send_scsi_PERSISTENT_RESERVE_IN
1055 #define	sd_send_scsi_PERSISTENT_RESERVE_OUT	\
1056 					ssd_send_scsi_PERSISTENT_RESERVE_OUT
1057 #define	sd_send_scsi_SYNCHRONIZE_CACHE	ssd_send_scsi_SYNCHRONIZE_CACHE
1058 #define	sd_send_scsi_SYNCHRONIZE_CACHE_biodone	\
1059 					ssd_send_scsi_SYNCHRONIZE_CACHE_biodone
1060 #define	sd_send_scsi_MODE_SENSE		ssd_send_scsi_MODE_SENSE
1061 #define	sd_send_scsi_MODE_SELECT	ssd_send_scsi_MODE_SELECT
1062 #define	sd_send_scsi_RDWR		ssd_send_scsi_RDWR
1063 #define	sd_send_scsi_LOG_SENSE		ssd_send_scsi_LOG_SENSE
1064 #define	sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION	\
1065 				ssd_send_scsi_GET_EVENT_STATUS_NOTIFICATION
1066 #define	sd_gesn_media_data_valid	ssd_gesn_media_data_valid
1067 #define	sd_alloc_rqs			ssd_alloc_rqs
1068 #define	sd_free_rqs			ssd_free_rqs
1069 #define	sd_dump_memory			ssd_dump_memory
1070 #define	sd_get_media_info_com		ssd_get_media_info_com
1071 #define	sd_get_media_info		ssd_get_media_info
1072 #define	sd_get_media_info_ext		ssd_get_media_info_ext
1073 #define	sd_dkio_ctrl_info		ssd_dkio_ctrl_info
1074 #define	sd_nvpair_str_decode		ssd_nvpair_str_decode
1075 #define	sd_strtok_r			ssd_strtok_r
1076 #define	sd_set_properties		ssd_set_properties
1077 #define	sd_get_tunables_from_conf	ssd_get_tunables_from_conf
1078 #define	sd_setup_next_xfer		ssd_setup_next_xfer
1079 #define	sd_dkio_get_temp		ssd_dkio_get_temp
1080 #define	sd_check_mhd			ssd_check_mhd
1081 #define	sd_mhd_watch_cb			ssd_mhd_watch_cb
1082 #define	sd_mhd_watch_incomplete		ssd_mhd_watch_incomplete
1083 #define	sd_sname			ssd_sname
1084 #define	sd_mhd_resvd_recover		ssd_mhd_resvd_recover
1085 #define	sd_resv_reclaim_thread		ssd_resv_reclaim_thread
1086 #define	sd_take_ownership		ssd_take_ownership
1087 #define	sd_reserve_release		ssd_reserve_release
1088 #define	sd_rmv_resv_reclaim_req		ssd_rmv_resv_reclaim_req
1089 #define	sd_mhd_reset_notify_cb		ssd_mhd_reset_notify_cb
1090 #define	sd_persistent_reservation_in_read_keys	\
1091 					ssd_persistent_reservation_in_read_keys
1092 #define	sd_persistent_reservation_in_read_resv	\
1093 					ssd_persistent_reservation_in_read_resv
1094 #define	sd_mhdioc_takeown		ssd_mhdioc_takeown
1095 #define	sd_mhdioc_failfast		ssd_mhdioc_failfast
1096 #define	sd_mhdioc_release		ssd_mhdioc_release
1097 #define	sd_mhdioc_register_devid	ssd_mhdioc_register_devid
1098 #define	sd_mhdioc_inkeys		ssd_mhdioc_inkeys
1099 #define	sd_mhdioc_inresv		ssd_mhdioc_inresv
1100 #define	sr_change_blkmode		ssr_change_blkmode
1101 #define	sr_change_speed			ssr_change_speed
1102 #define	sr_atapi_change_speed		ssr_atapi_change_speed
1103 #define	sr_pause_resume			ssr_pause_resume
1104 #define	sr_play_msf			ssr_play_msf
1105 #define	sr_play_trkind			ssr_play_trkind
1106 #define	sr_read_all_subcodes		ssr_read_all_subcodes
1107 #define	sr_read_subchannel		ssr_read_subchannel
1108 #define	sr_read_tocentry		ssr_read_tocentry
1109 #define	sr_read_tochdr			ssr_read_tochdr
1110 #define	sr_read_cdda			ssr_read_cdda
1111 #define	sr_read_cdxa			ssr_read_cdxa
1112 #define	sr_read_mode1			ssr_read_mode1
1113 #define	sr_read_mode2			ssr_read_mode2
1114 #define	sr_read_cd_mode2		ssr_read_cd_mode2
1115 #define	sr_sector_mode			ssr_sector_mode
1116 #define	sr_eject			ssr_eject
1117 #define	sr_ejected			ssr_ejected
1118 #define	sr_check_wp			ssr_check_wp
1119 #define	sd_watch_request_submit		ssd_watch_request_submit
1120 #define	sd_check_media			ssd_check_media
1121 #define	sd_media_watch_cb		ssd_media_watch_cb
1122 #define	sd_delayed_cv_broadcast		ssd_delayed_cv_broadcast
1123 #define	sr_volume_ctrl			ssr_volume_ctrl
1124 #define	sr_read_sony_session_offset	ssr_read_sony_session_offset
1125 #define	sd_log_page_supported		ssd_log_page_supported
1126 #define	sd_check_for_writable_cd	ssd_check_for_writable_cd
1127 #define	sd_wm_cache_constructor		ssd_wm_cache_constructor
1128 #define	sd_wm_cache_destructor		ssd_wm_cache_destructor
1129 #define	sd_range_lock			ssd_range_lock
1130 #define	sd_get_range			ssd_get_range
1131 #define	sd_free_inlist_wmap		ssd_free_inlist_wmap
1132 #define	sd_range_unlock			ssd_range_unlock
1133 #define	sd_read_modify_write_task	ssd_read_modify_write_task
1134 #define	sddump_do_read_of_rmw		ssddump_do_read_of_rmw
1135 
1136 #define	sd_iostart_chain		ssd_iostart_chain
1137 #define	sd_iodone_chain			ssd_iodone_chain
1138 #define	sd_initpkt_map			ssd_initpkt_map
1139 #define	sd_destroypkt_map		ssd_destroypkt_map
1140 #define	sd_chain_type_map		ssd_chain_type_map
1141 #define	sd_chain_index_map		ssd_chain_index_map
1142 
1143 #define	sd_failfast_flushctl		ssd_failfast_flushctl
1144 #define	sd_failfast_flushq		ssd_failfast_flushq
1145 #define	sd_failfast_flushq_callback	ssd_failfast_flushq_callback
1146 
1147 #define	sd_is_lsi			ssd_is_lsi
1148 #define	sd_tg_rdwr			ssd_tg_rdwr
1149 #define	sd_tg_getinfo			ssd_tg_getinfo
1150 #define	sd_rmw_msg_print_handler	ssd_rmw_msg_print_handler
1151 
1152 #endif	/* #if (defined(__fibre)) */
1153 
1154 
1155 int _init(void);
1156 int _fini(void);
1157 int _info(struct modinfo *modinfop);
1158 
1159 /*PRINTFLIKE3*/
1160 static void sd_log_trace(uint_t comp, struct sd_lun *un, const char *fmt, ...);
1161 /*PRINTFLIKE3*/
1162 static void sd_log_info(uint_t comp, struct sd_lun *un, const char *fmt, ...);
1163 /*PRINTFLIKE3*/
1164 static void sd_log_err(uint_t comp, struct sd_lun *un, const char *fmt, ...);
1165 
1166 static int sdprobe(dev_info_t *devi);
1167 static int sdinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg,
1168     void **result);
1169 static int sd_prop_op(dev_t dev, dev_info_t *dip, ddi_prop_op_t prop_op,
1170     int mod_flags, char *name, caddr_t valuep, int *lengthp);
1171 
1172 /*
1173  * Smart probe for parallel scsi
1174  */
1175 static void sd_scsi_probe_cache_init(void);
1176 static void sd_scsi_probe_cache_fini(void);
1177 static void sd_scsi_clear_probe_cache(void);
1178 static int  sd_scsi_probe_with_cache(struct scsi_device *devp, int (*fn)());
1179 
1180 /*
1181  * Attached luns on target for parallel scsi
1182  */
1183 static void sd_scsi_target_lun_init(void);
1184 static void sd_scsi_target_lun_fini(void);
1185 static int  sd_scsi_get_target_lun_count(dev_info_t *dip, int target);
1186 static void sd_scsi_update_lun_on_target(dev_info_t *dip, int target, int flag);
1187 
1188 static int	sd_spin_up_unit(sd_ssc_t *ssc);
1189 
1190 /*
1191  * Using sd_ssc_init to establish sd_ssc_t struct
1192  * Using sd_ssc_send to send uscsi internal command
1193  * Using sd_ssc_fini to free sd_ssc_t struct
1194  */
1195 static sd_ssc_t *sd_ssc_init(struct sd_lun *un);
1196 static int sd_ssc_send(sd_ssc_t *ssc, struct uscsi_cmd *incmd,
1197     int flag, enum uio_seg dataspace, int path_flag);
1198 static void sd_ssc_fini(sd_ssc_t *ssc);
1199 
1200 /*
1201  * Using sd_ssc_assessment to set correct type-of-assessment
1202  * Using sd_ssc_post to post ereport & system log
1203  *       sd_ssc_post will call sd_ssc_print to print system log
1204  *       sd_ssc_post will call sd_ssd_ereport_post to post ereport
1205  */
1206 static void sd_ssc_assessment(sd_ssc_t *ssc,
1207     enum sd_type_assessment tp_assess);
1208 
1209 static void sd_ssc_post(sd_ssc_t *ssc, enum sd_driver_assessment sd_assess);
1210 static void sd_ssc_print(sd_ssc_t *ssc, int sd_severity);
1211 static void sd_ssc_ereport_post(sd_ssc_t *ssc,
1212     enum sd_driver_assessment drv_assess);
1213 
1214 /*
1215  * Using sd_ssc_set_info to mark an un-decodable-data error.
1216  * Using sd_ssc_extract_info to transfer information from internal
1217  *       data structures to sd_ssc_t.
1218  */
1219 static void sd_ssc_set_info(sd_ssc_t *ssc, int ssc_flags, uint_t comp,
1220     const char *fmt, ...);
1221 static void sd_ssc_extract_info(sd_ssc_t *ssc, struct sd_lun *un,
1222     struct scsi_pkt *pktp, struct buf *bp, struct sd_xbuf *xp);
1223 
1224 static int sd_send_scsi_cmd(dev_t dev, struct uscsi_cmd *incmd, int flag,
1225     enum uio_seg dataspace, int path_flag);
1226 
1227 #ifdef _LP64
1228 static void	sd_enable_descr_sense(sd_ssc_t *ssc);
1229 static void	sd_reenable_dsense_task(void *arg);
1230 #endif /* _LP64 */
1231 
1232 static void	sd_set_mmc_caps(sd_ssc_t *ssc);
1233 
1234 static void sd_read_unit_properties(struct sd_lun *un);
1235 static int  sd_process_sdconf_file(struct sd_lun *un);
1236 static void sd_nvpair_str_decode(struct sd_lun *un, char *nvpair_str);
1237 static char *sd_strtok_r(char *string, const char *sepset, char **lasts);
1238 static void sd_set_properties(struct sd_lun *un, char *name, char *value);
1239 static void sd_get_tunables_from_conf(struct sd_lun *un, int flags,
1240     int *data_list, sd_tunables *values);
1241 static void sd_process_sdconf_table(struct sd_lun *un);
1242 static int  sd_sdconf_id_match(struct sd_lun *un, char *id, int idlen);
1243 static int  sd_blank_cmp(struct sd_lun *un, char *id, int idlen);
1244 static int  sd_chk_vers1_data(struct sd_lun *un, int flags, int *prop_list,
1245 	int list_len, char *dataname_ptr);
1246 static void sd_set_vers1_properties(struct sd_lun *un, int flags,
1247     sd_tunables *prop_list);
1248 
1249 static void sd_register_devid(sd_ssc_t *ssc, dev_info_t *devi,
1250     int reservation_flag);
1251 static int  sd_get_devid(sd_ssc_t *ssc);
1252 static ddi_devid_t sd_create_devid(sd_ssc_t *ssc);
1253 static int  sd_write_deviceid(sd_ssc_t *ssc);
1254 static int  sd_check_vpd_page_support(sd_ssc_t *ssc);
1255 
1256 static void sd_setup_pm(sd_ssc_t *ssc, dev_info_t *devi);
1257 static void sd_create_pm_components(dev_info_t *devi, struct sd_lun *un);
1258 
1259 static int  sd_ddi_suspend(dev_info_t *devi);
1260 static int  sd_ddi_resume(dev_info_t *devi);
1261 static int  sd_pm_state_change(struct sd_lun *un, int level, int flag);
1262 static int  sdpower(dev_info_t *devi, int component, int level);
1263 
1264 static int  sdattach(dev_info_t *devi, ddi_attach_cmd_t cmd);
1265 static int  sddetach(dev_info_t *devi, ddi_detach_cmd_t cmd);
1266 static int  sd_unit_attach(dev_info_t *devi);
1267 static int  sd_unit_detach(dev_info_t *devi);
1268 
1269 static void sd_set_unit_attributes(struct sd_lun *un, dev_info_t *devi);
1270 static void sd_create_errstats(struct sd_lun *un, int instance);
1271 static void sd_set_errstats(struct sd_lun *un);
1272 static void sd_set_pstats(struct sd_lun *un);
1273 
1274 static int  sddump(dev_t dev, caddr_t addr, daddr_t blkno, int nblk);
1275 static int  sd_scsi_poll(struct sd_lun *un, struct scsi_pkt *pkt);
1276 static int  sd_send_polled_RQS(struct sd_lun *un);
1277 static int  sd_ddi_scsi_poll(struct scsi_pkt *pkt);
1278 
1279 #if (defined(__fibre))
1280 /*
1281  * Event callbacks (photon)
1282  */
1283 static void sd_init_event_callbacks(struct sd_lun *un);
1284 static void  sd_event_callback(dev_info_t *, ddi_eventcookie_t, void *, void *);
1285 #endif
1286 
1287 /*
1288  * Defines for sd_cache_control
1289  */
1290 
1291 #define	SD_CACHE_ENABLE		1
1292 #define	SD_CACHE_DISABLE	0
1293 #define	SD_CACHE_NOCHANGE	-1
1294 
1295 static int   sd_cache_control(sd_ssc_t *ssc, int rcd_flag, int wce_flag);
1296 static int   sd_get_write_cache_enabled(sd_ssc_t *ssc, int *is_enabled);
1297 static void  sd_get_write_cache_changeable(sd_ssc_t *ssc, int *is_changeable);
1298 static void  sd_get_nv_sup(sd_ssc_t *ssc);
1299 static dev_t sd_make_device(dev_info_t *devi);
1300 static void  sd_check_bdc_vpd(sd_ssc_t *ssc);
1301 static void  sd_check_emulation_mode(sd_ssc_t *ssc);
1302 static void  sd_update_block_info(struct sd_lun *un, uint32_t lbasize,
1303 	uint64_t capacity);
1304 
1305 /*
1306  * Driver entry point functions.
1307  */
1308 static int  sdopen(dev_t *dev_p, int flag, int otyp, cred_t *cred_p);
1309 static int  sdclose(dev_t dev, int flag, int otyp, cred_t *cred_p);
1310 static int  sd_ready_and_valid(sd_ssc_t *ssc, int part);
1311 
1312 static void sdmin(struct buf *bp);
1313 static int sdread(dev_t dev, struct uio *uio, cred_t *cred_p);
1314 static int sdwrite(dev_t dev, struct uio *uio, cred_t *cred_p);
1315 static int sdaread(dev_t dev, struct aio_req *aio, cred_t *cred_p);
1316 static int sdawrite(dev_t dev, struct aio_req *aio, cred_t *cred_p);
1317 
1318 static int sdstrategy(struct buf *bp);
1319 static int sdioctl(dev_t, int, intptr_t, int, cred_t *, int *);
1320 
1321 /*
1322  * Function prototypes for layering functions in the iostart chain.
1323  */
1324 static void sd_mapblockaddr_iostart(int index, struct sd_lun *un,
1325 	struct buf *bp);
1326 static void sd_mapblocksize_iostart(int index, struct sd_lun *un,
1327 	struct buf *bp);
1328 static void sd_checksum_iostart(int index, struct sd_lun *un, struct buf *bp);
1329 static void sd_checksum_uscsi_iostart(int index, struct sd_lun *un,
1330 	struct buf *bp);
1331 static void sd_pm_iostart(int index, struct sd_lun *un, struct buf *bp);
1332 static void sd_core_iostart(int index, struct sd_lun *un, struct buf *bp);
1333 
1334 /*
1335  * Function prototypes for layering functions in the iodone chain.
1336  */
1337 static void sd_buf_iodone(int index, struct sd_lun *un, struct buf *bp);
1338 static void sd_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp);
1339 static void sd_mapblockaddr_iodone(int index, struct sd_lun *un,
1340 	struct buf *bp);
1341 static void sd_mapblocksize_iodone(int index, struct sd_lun *un,
1342 	struct buf *bp);
1343 static void sd_checksum_iodone(int index, struct sd_lun *un, struct buf *bp);
1344 static void sd_checksum_uscsi_iodone(int index, struct sd_lun *un,
1345 	struct buf *bp);
1346 static void sd_pm_iodone(int index, struct sd_lun *un, struct buf *bp);
1347 
1348 /*
1349  * Prototypes for functions to support buf(9S) based IO.
1350  */
1351 static void sd_xbuf_strategy(struct buf *bp, ddi_xbuf_t xp, void *arg);
1352 static int sd_initpkt_for_buf(struct buf *, struct scsi_pkt **);
1353 static void sd_destroypkt_for_buf(struct buf *);
1354 static int sd_setup_rw_pkt(struct sd_lun *un, struct scsi_pkt **pktpp,
1355 	struct buf *bp, int flags,
1356 	int (*callback)(caddr_t), caddr_t callback_arg,
1357 	diskaddr_t lba, uint32_t blockcount);
1358 static int sd_setup_next_rw_pkt(struct sd_lun *un, struct scsi_pkt *pktp,
1359 	struct buf *bp, diskaddr_t lba, uint32_t blockcount);
1360 
1361 /*
1362  * Prototypes for functions to support USCSI IO.
1363  */
1364 static int sd_uscsi_strategy(struct buf *bp);
1365 static int sd_initpkt_for_uscsi(struct buf *, struct scsi_pkt **);
1366 static void sd_destroypkt_for_uscsi(struct buf *);
1367 
1368 static void sd_xbuf_init(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
1369 	uchar_t chain_type, void *pktinfop);
1370 
1371 static int  sd_pm_entry(struct sd_lun *un);
1372 static void sd_pm_exit(struct sd_lun *un);
1373 
1374 static void sd_pm_idletimeout_handler(void *arg);
1375 
1376 /*
1377  * sd_core internal functions (used at the sd_core_io layer).
1378  */
1379 static void sd_add_buf_to_waitq(struct sd_lun *un, struct buf *bp);
1380 static void sdintr(struct scsi_pkt *pktp);
1381 static void sd_start_cmds(struct sd_lun *un, struct buf *immed_bp);
1382 
1383 static int sd_send_scsi_cmd(dev_t dev, struct uscsi_cmd *incmd, int flag,
1384 	enum uio_seg dataspace, int path_flag);
1385 
1386 static struct buf *sd_bioclone_alloc(struct buf *bp, size_t datalen,
1387 	daddr_t blkno, int (*func)(struct buf *));
1388 static struct buf *sd_shadow_buf_alloc(struct buf *bp, size_t datalen,
1389 	uint_t bflags, daddr_t blkno, int (*func)(struct buf *));
1390 static void sd_bioclone_free(struct buf *bp);
1391 static void sd_shadow_buf_free(struct buf *bp);
1392 
1393 static void sd_print_transport_rejected_message(struct sd_lun *un,
1394 	struct sd_xbuf *xp, int code);
1395 static void sd_print_incomplete_msg(struct sd_lun *un, struct buf *bp,
1396     void *arg, int code);
1397 static void sd_print_sense_failed_msg(struct sd_lun *un, struct buf *bp,
1398     void *arg, int code);
1399 static void sd_print_cmd_incomplete_msg(struct sd_lun *un, struct buf *bp,
1400     void *arg, int code);
1401 
1402 static void sd_retry_command(struct sd_lun *un, struct buf *bp,
1403 	int retry_check_flag,
1404 	void (*user_funcp)(struct sd_lun *un, struct buf *bp, void *argp,
1405 		int c),
1406 	void *user_arg, int failure_code,  clock_t retry_delay,
1407 	void (*statp)(kstat_io_t *));
1408 
1409 static void sd_set_retry_bp(struct sd_lun *un, struct buf *bp,
1410 	clock_t retry_delay, void (*statp)(kstat_io_t *));
1411 
1412 static void sd_send_request_sense_command(struct sd_lun *un, struct buf *bp,
1413 	struct scsi_pkt *pktp);
1414 static void sd_start_retry_command(void *arg);
1415 static void sd_start_direct_priority_command(void *arg);
1416 static void sd_return_failed_command(struct sd_lun *un, struct buf *bp,
1417 	int errcode);
1418 static void sd_return_failed_command_no_restart(struct sd_lun *un,
1419 	struct buf *bp, int errcode);
1420 static void sd_return_command(struct sd_lun *un, struct buf *bp);
1421 static void sd_sync_with_callback(struct sd_lun *un);
1422 static int sdrunout(caddr_t arg);
1423 
1424 static void sd_mark_rqs_busy(struct sd_lun *un, struct buf *bp);
1425 static struct buf *sd_mark_rqs_idle(struct sd_lun *un, struct sd_xbuf *xp);
1426 
1427 static void sd_reduce_throttle(struct sd_lun *un, int throttle_type);
1428 static void sd_restore_throttle(void *arg);
1429 
1430 static void sd_init_cdb_limits(struct sd_lun *un);
1431 
1432 static void sd_pkt_status_good(struct sd_lun *un, struct buf *bp,
1433 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1434 
1435 /*
1436  * Error handling functions
1437  */
1438 static void sd_pkt_status_check_condition(struct sd_lun *un, struct buf *bp,
1439 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1440 static void sd_pkt_status_busy(struct sd_lun *un, struct buf *bp,
1441 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1442 static void sd_pkt_status_reservation_conflict(struct sd_lun *un,
1443 	struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp);
1444 static void sd_pkt_status_qfull(struct sd_lun *un, struct buf *bp,
1445 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1446 
1447 static void sd_handle_request_sense(struct sd_lun *un, struct buf *bp,
1448 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1449 static void sd_handle_auto_request_sense(struct sd_lun *un, struct buf *bp,
1450 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1451 static int sd_validate_sense_data(struct sd_lun *un, struct buf *bp,
1452 	struct sd_xbuf *xp, size_t actual_len);
1453 static void sd_decode_sense(struct sd_lun *un, struct buf *bp,
1454 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1455 
1456 static void sd_print_sense_msg(struct sd_lun *un, struct buf *bp,
1457 	void *arg, int code);
1458 
1459 static void sd_sense_key_no_sense(struct sd_lun *un, struct buf *bp,
1460 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1461 static void sd_sense_key_recoverable_error(struct sd_lun *un,
1462 	uint8_t *sense_datap,
1463 	struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp);
1464 static void sd_sense_key_not_ready(struct sd_lun *un,
1465 	uint8_t *sense_datap,
1466 	struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp);
1467 static void sd_sense_key_medium_or_hardware_error(struct sd_lun *un,
1468 	uint8_t *sense_datap,
1469 	struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp);
1470 static void sd_sense_key_illegal_request(struct sd_lun *un, struct buf *bp,
1471 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1472 static void sd_sense_key_unit_attention(struct sd_lun *un,
1473 	uint8_t *sense_datap,
1474 	struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp);
1475 static void sd_sense_key_fail_command(struct sd_lun *un, struct buf *bp,
1476 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1477 static void sd_sense_key_blank_check(struct sd_lun *un, struct buf *bp,
1478 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1479 static void sd_sense_key_aborted_command(struct sd_lun *un, struct buf *bp,
1480 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1481 static void sd_sense_key_default(struct sd_lun *un,
1482 	uint8_t *sense_datap,
1483 	struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp);
1484 
1485 static void sd_print_retry_msg(struct sd_lun *un, struct buf *bp,
1486 	void *arg, int flag);
1487 
1488 static void sd_pkt_reason_cmd_incomplete(struct sd_lun *un, struct buf *bp,
1489 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1490 static void sd_pkt_reason_cmd_tran_err(struct sd_lun *un, struct buf *bp,
1491 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1492 static void sd_pkt_reason_cmd_reset(struct sd_lun *un, struct buf *bp,
1493 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1494 static void sd_pkt_reason_cmd_aborted(struct sd_lun *un, struct buf *bp,
1495 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1496 static void sd_pkt_reason_cmd_timeout(struct sd_lun *un, struct buf *bp,
1497 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1498 static void sd_pkt_reason_cmd_unx_bus_free(struct sd_lun *un, struct buf *bp,
1499 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1500 static void sd_pkt_reason_cmd_tag_reject(struct sd_lun *un, struct buf *bp,
1501 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1502 static void sd_pkt_reason_default(struct sd_lun *un, struct buf *bp,
1503 	struct sd_xbuf *xp, struct scsi_pkt *pktp);
1504 
1505 static void sd_reset_target(struct sd_lun *un, struct scsi_pkt *pktp);
1506 
1507 static void sd_start_stop_unit_callback(void *arg);
1508 static void sd_start_stop_unit_task(void *arg);
1509 
1510 static void sd_taskq_create(void);
1511 static void sd_taskq_delete(void);
1512 static void sd_target_change_task(void *arg);
1513 static void sd_log_dev_status_event(struct sd_lun *un, char *esc, int km_flag);
1514 static void sd_log_lun_expansion_event(struct sd_lun *un, int km_flag);
1515 static void sd_log_eject_request_event(struct sd_lun *un, int km_flag);
1516 static void sd_media_change_task(void *arg);
1517 
1518 static int sd_handle_mchange(struct sd_lun *un);
1519 static int sd_send_scsi_DOORLOCK(sd_ssc_t *ssc, int flag, int path_flag);
1520 static int sd_send_scsi_READ_CAPACITY(sd_ssc_t *ssc, uint64_t *capp,
1521 	uint32_t *lbap, int path_flag);
1522 static int sd_send_scsi_READ_CAPACITY_16(sd_ssc_t *ssc, uint64_t *capp,
1523 	uint32_t *lbap, uint32_t *psp, int path_flag);
1524 static int sd_send_scsi_START_STOP_UNIT(sd_ssc_t *ssc, int pc_flag,
1525 	int flag, int path_flag);
1526 static int sd_send_scsi_INQUIRY(sd_ssc_t *ssc, uchar_t *bufaddr,
1527 	size_t buflen, uchar_t evpd, uchar_t page_code, size_t *residp);
1528 static int sd_send_scsi_TEST_UNIT_READY(sd_ssc_t *ssc, int flag);
1529 static int sd_send_scsi_PERSISTENT_RESERVE_IN(sd_ssc_t *ssc,
1530 	uchar_t usr_cmd, uint16_t data_len, uchar_t *data_bufp);
1531 static int sd_send_scsi_PERSISTENT_RESERVE_OUT(sd_ssc_t *ssc,
1532 	uchar_t usr_cmd, uchar_t *usr_bufp);
1533 static int sd_send_scsi_SYNCHRONIZE_CACHE(struct sd_lun *un,
1534 	struct dk_callback *dkc);
1535 static int sd_send_scsi_SYNCHRONIZE_CACHE_biodone(struct buf *bp);
1536 static int sd_send_scsi_GET_CONFIGURATION(sd_ssc_t *ssc,
1537 	struct uscsi_cmd *ucmdbuf, uchar_t *rqbuf, uint_t rqbuflen,
1538 	uchar_t *bufaddr, uint_t buflen, int path_flag);
1539 static int sd_send_scsi_feature_GET_CONFIGURATION(sd_ssc_t *ssc,
1540 	struct uscsi_cmd *ucmdbuf, uchar_t *rqbuf, uint_t rqbuflen,
1541 	uchar_t *bufaddr, uint_t buflen, char feature, int path_flag);
1542 static int sd_send_scsi_MODE_SENSE(sd_ssc_t *ssc, int cdbsize,
1543 	uchar_t *bufaddr, size_t buflen, uchar_t page_code, int path_flag);
1544 static int sd_send_scsi_MODE_SELECT(sd_ssc_t *ssc, int cdbsize,
1545 	uchar_t *bufaddr, size_t buflen, uchar_t save_page, int path_flag);
1546 static int sd_send_scsi_RDWR(sd_ssc_t *ssc, uchar_t cmd, void *bufaddr,
1547 	size_t buflen, daddr_t start_block, int path_flag);
1548 #define	sd_send_scsi_READ(ssc, bufaddr, buflen, start_block, path_flag)	\
1549 	sd_send_scsi_RDWR(ssc, SCMD_READ, bufaddr, buflen, start_block, \
1550 	path_flag)
1551 #define	sd_send_scsi_WRITE(ssc, bufaddr, buflen, start_block, path_flag)\
1552 	sd_send_scsi_RDWR(ssc, SCMD_WRITE, bufaddr, buflen, start_block,\
1553 	path_flag)
1554 
1555 static int sd_send_scsi_LOG_SENSE(sd_ssc_t *ssc, uchar_t *bufaddr,
1556 	uint16_t buflen, uchar_t page_code, uchar_t page_control,
1557 	uint16_t param_ptr, int path_flag);
1558 static int sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION(sd_ssc_t *ssc,
1559 	uchar_t *bufaddr, size_t buflen, uchar_t class_req);
1560 static boolean_t sd_gesn_media_data_valid(uchar_t *data);
1561 
1562 static int  sd_alloc_rqs(struct scsi_device *devp, struct sd_lun *un);
1563 static void sd_free_rqs(struct sd_lun *un);
1564 
1565 static void sd_dump_memory(struct sd_lun *un, uint_t comp, char *title,
1566 	uchar_t *data, int len, int fmt);
1567 static void sd_panic_for_res_conflict(struct sd_lun *un);
1568 
1569 /*
1570  * Disk Ioctl Function Prototypes
1571  */
1572 static int sd_get_media_info(dev_t dev, caddr_t arg, int flag);
1573 static int sd_get_media_info_ext(dev_t dev, caddr_t arg, int flag);
1574 static int sd_dkio_ctrl_info(dev_t dev, caddr_t arg, int flag);
1575 static int sd_dkio_get_temp(dev_t dev, caddr_t arg, int flag);
1576 
1577 /*
1578  * Multi-host Ioctl Prototypes
1579  */
1580 static int sd_check_mhd(dev_t dev, int interval);
1581 static int sd_mhd_watch_cb(caddr_t arg, struct scsi_watch_result *resultp);
1582 static void sd_mhd_watch_incomplete(struct sd_lun *un, struct scsi_pkt *pkt);
1583 static char *sd_sname(uchar_t status);
1584 static void sd_mhd_resvd_recover(void *arg);
1585 static void sd_resv_reclaim_thread();
1586 static int sd_take_ownership(dev_t dev, struct mhioctkown *p);
1587 static int sd_reserve_release(dev_t dev, int cmd);
1588 static void sd_rmv_resv_reclaim_req(dev_t dev);
1589 static void sd_mhd_reset_notify_cb(caddr_t arg);
1590 static int sd_persistent_reservation_in_read_keys(struct sd_lun *un,
1591 	mhioc_inkeys_t *usrp, int flag);
1592 static int sd_persistent_reservation_in_read_resv(struct sd_lun *un,
1593 	mhioc_inresvs_t *usrp, int flag);
1594 static int sd_mhdioc_takeown(dev_t dev, caddr_t arg, int flag);
1595 static int sd_mhdioc_failfast(dev_t dev, caddr_t arg, int flag);
1596 static int sd_mhdioc_release(dev_t dev);
1597 static int sd_mhdioc_register_devid(dev_t dev);
1598 static int sd_mhdioc_inkeys(dev_t dev, caddr_t arg, int flag);
1599 static int sd_mhdioc_inresv(dev_t dev, caddr_t arg, int flag);
1600 
1601 /*
1602  * SCSI removable prototypes
1603  */
1604 static int sr_change_blkmode(dev_t dev, int cmd, intptr_t data, int flag);
1605 static int sr_change_speed(dev_t dev, int cmd, intptr_t data, int flag);
1606 static int sr_atapi_change_speed(dev_t dev, int cmd, intptr_t data, int flag);
1607 static int sr_pause_resume(dev_t dev, int mode);
1608 static int sr_play_msf(dev_t dev, caddr_t data, int flag);
1609 static int sr_play_trkind(dev_t dev, caddr_t data, int flag);
1610 static int sr_read_all_subcodes(dev_t dev, caddr_t data, int flag);
1611 static int sr_read_subchannel(dev_t dev, caddr_t data, int flag);
1612 static int sr_read_tocentry(dev_t dev, caddr_t data, int flag);
1613 static int sr_read_tochdr(dev_t dev, caddr_t data, int flag);
1614 static int sr_read_cdda(dev_t dev, caddr_t data, int flag);
1615 static int sr_read_cdxa(dev_t dev, caddr_t data, int flag);
1616 static int sr_read_mode1(dev_t dev, caddr_t data, int flag);
1617 static int sr_read_mode2(dev_t dev, caddr_t data, int flag);
1618 static int sr_read_cd_mode2(dev_t dev, caddr_t data, int flag);
1619 static int sr_sector_mode(dev_t dev, uint32_t blksize);
1620 static int sr_eject(dev_t dev);
1621 static void sr_ejected(register struct sd_lun *un);
1622 static int sr_check_wp(dev_t dev);
1623 static opaque_t sd_watch_request_submit(struct sd_lun *un);
1624 static int sd_check_media(dev_t dev, enum dkio_state state);
1625 static int sd_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp);
1626 static void sd_delayed_cv_broadcast(void *arg);
1627 static int sr_volume_ctrl(dev_t dev, caddr_t data, int flag);
1628 static int sr_read_sony_session_offset(dev_t dev, caddr_t data, int flag);
1629 
1630 static int sd_log_page_supported(sd_ssc_t *ssc, int log_page);
1631 
1632 /*
1633  * Function Prototype for the non-512 support (DVDRAM, MO etc.) functions.
1634  */
1635 static void sd_check_for_writable_cd(sd_ssc_t *ssc, int path_flag);
1636 static int sd_wm_cache_constructor(void *wm, void *un, int flags);
1637 static void sd_wm_cache_destructor(void *wm, void *un);
1638 static struct sd_w_map *sd_range_lock(struct sd_lun *un, daddr_t startb,
1639     daddr_t endb, ushort_t typ);
1640 static struct sd_w_map *sd_get_range(struct sd_lun *un, daddr_t startb,
1641     daddr_t endb);
1642 static void sd_free_inlist_wmap(struct sd_lun *un, struct sd_w_map *wmp);
1643 static void sd_range_unlock(struct sd_lun *un, struct sd_w_map *wm);
1644 static void sd_read_modify_write_task(void * arg);
1645 static int
1646 sddump_do_read_of_rmw(struct sd_lun *un, uint64_t blkno, uint64_t nblk,
1647     struct buf **bpp);
1648 
1649 
1650 /*
1651  * Function prototypes for failfast support.
1652  */
1653 static void sd_failfast_flushq(struct sd_lun *un);
1654 static int sd_failfast_flushq_callback(struct buf *bp);
1655 
1656 /*
1657  * Function prototypes to check for lsi devices
1658  */
1659 static void sd_is_lsi(struct sd_lun *un);
1660 
1661 /*
1662  * Function prototypes for partial DMA support
1663  */
1664 static int sd_setup_next_xfer(struct sd_lun *un, struct buf *bp,
1665 		struct scsi_pkt *pkt, struct sd_xbuf *xp);
1666 
1667 
1668 /* Function prototypes for cmlb */
1669 static int sd_tg_rdwr(dev_info_t *devi, uchar_t cmd, void *bufaddr,
1670     diskaddr_t start_block, size_t reqlength, void *tg_cookie);
1671 
1672 static int sd_tg_getinfo(dev_info_t *devi, int cmd, void *arg, void *tg_cookie);
1673 
1674 /*
1675  * For printing RMW warning message timely
1676  */
1677 static void sd_rmw_msg_print_handler(void *arg);
1678 
1679 /*
1680  * Constants for failfast support:
1681  *
1682  * SD_FAILFAST_INACTIVE: Instance is currently in a normal state, with NO
1683  * failfast processing being performed.
1684  *
1685  * SD_FAILFAST_ACTIVE: Instance is in the failfast state and is performing
1686  * failfast processing on all bufs with B_FAILFAST set.
1687  */
1688 
1689 #define	SD_FAILFAST_INACTIVE		0
1690 #define	SD_FAILFAST_ACTIVE		1
1691 
1692 /*
1693  * Bitmask to control behavior of buf(9S) flushes when a transition to
1694  * the failfast state occurs. Optional bits include:
1695  *
1696  * SD_FAILFAST_FLUSH_ALL_BUFS: When set, flush ALL bufs including those that
1697  * do NOT have B_FAILFAST set. When clear, only bufs with B_FAILFAST will
1698  * be flushed.
1699  *
1700  * SD_FAILFAST_FLUSH_ALL_QUEUES: When set, flush any/all other queues in the
1701  * driver, in addition to the regular wait queue. This includes the xbuf
1702  * queues. When clear, only the driver's wait queue will be flushed.
1703  */
1704 #define	SD_FAILFAST_FLUSH_ALL_BUFS	0x01
1705 #define	SD_FAILFAST_FLUSH_ALL_QUEUES	0x02
1706 
1707 /*
1708  * The default behavior is to only flush bufs that have B_FAILFAST set, but
1709  * to flush all queues within the driver.
1710  */
1711 static int sd_failfast_flushctl = SD_FAILFAST_FLUSH_ALL_QUEUES;
1712 
1713 
1714 /*
1715  * SD Testing Fault Injection
1716  */
1717 #ifdef SD_FAULT_INJECTION
1718 static void sd_faultinjection_ioctl(int cmd, intptr_t arg, struct sd_lun *un);
1719 static void sd_faultinjection(struct scsi_pkt *pktp);
1720 static void sd_injection_log(char *buf, struct sd_lun *un);
1721 #endif
1722 
1723 /*
1724  * Device driver ops vector
1725  */
1726 static struct cb_ops sd_cb_ops = {
1727 	sdopen,			/* open */
1728 	sdclose,		/* close */
1729 	sdstrategy,		/* strategy */
1730 	nodev,			/* print */
1731 	sddump,			/* dump */
1732 	sdread,			/* read */
1733 	sdwrite,		/* write */
1734 	sdioctl,		/* ioctl */
1735 	nodev,			/* devmap */
1736 	nodev,			/* mmap */
1737 	nodev,			/* segmap */
1738 	nochpoll,		/* poll */
1739 	sd_prop_op,		/* cb_prop_op */
1740 	0,			/* streamtab  */
1741 	D_64BIT | D_MP | D_NEW | D_HOTPLUG, /* Driver compatibility flags */
1742 	CB_REV,			/* cb_rev */
1743 	sdaread, 		/* async I/O read entry point */
1744 	sdawrite		/* async I/O write entry point */
1745 };
1746 
1747 struct dev_ops sd_ops = {
1748 	DEVO_REV,		/* devo_rev, */
1749 	0,			/* refcnt  */
1750 	sdinfo,			/* info */
1751 	nulldev,		/* identify */
1752 	sdprobe,		/* probe */
1753 	sdattach,		/* attach */
1754 	sddetach,		/* detach */
1755 	nodev,			/* reset */
1756 	&sd_cb_ops,		/* driver operations */
1757 	NULL,			/* bus operations */
1758 	sdpower,		/* power */
1759 	ddi_quiesce_not_needed,		/* quiesce */
1760 };
1761 
1762 /*
1763  * This is the loadable module wrapper.
1764  */
1765 #include <sys/modctl.h>
1766 
1767 static struct modldrv modldrv = {
1768 	&mod_driverops,		/* Type of module. This one is a driver */
1769 	SD_MODULE_NAME,		/* Module name. */
1770 	&sd_ops			/* driver ops */
1771 };
1772 
1773 static struct modlinkage modlinkage = {
1774 	MODREV_1, &modldrv, NULL
1775 };
1776 
1777 static cmlb_tg_ops_t sd_tgops = {
1778 	TG_DK_OPS_VERSION_1,
1779 	sd_tg_rdwr,
1780 	sd_tg_getinfo
1781 };
1782 
1783 static struct scsi_asq_key_strings sd_additional_codes[] = {
1784 	0x81, 0, "Logical Unit is Reserved",
1785 	0x85, 0, "Audio Address Not Valid",
1786 	0xb6, 0, "Media Load Mechanism Failed",
1787 	0xB9, 0, "Audio Play Operation Aborted",
1788 	0xbf, 0, "Buffer Overflow for Read All Subcodes Command",
1789 	0x53, 2, "Medium removal prevented",
1790 	0x6f, 0, "Authentication failed during key exchange",
1791 	0x6f, 1, "Key not present",
1792 	0x6f, 2, "Key not established",
1793 	0x6f, 3, "Read without proper authentication",
1794 	0x6f, 4, "Mismatched region to this logical unit",
1795 	0x6f, 5, "Region reset count error",
1796 	0xffff, 0x0, NULL
1797 };
1798 
1799 
1800 /*
1801  * Struct for passing printing information for sense data messages
1802  */
1803 struct sd_sense_info {
1804 	int	ssi_severity;
1805 	int	ssi_pfa_flag;
1806 };
1807 
1808 /*
1809  * Table of function pointers for iostart-side routines. Separate "chains"
1810  * of layered function calls are formed by placing the function pointers
1811  * sequentially in the desired order. Functions are called according to an
1812  * incrementing table index ordering. The last function in each chain must
1813  * be sd_core_iostart(). The corresponding iodone-side routines are expected
1814  * in the sd_iodone_chain[] array.
1815  *
1816  * Note: It may seem more natural to organize both the iostart and iodone
1817  * functions together, into an array of structures (or some similar
1818  * organization) with a common index, rather than two separate arrays which
1819  * must be maintained in synchronization. The purpose of this division is
1820  * to achieve improved performance: individual arrays allows for more
1821  * effective cache line utilization on certain platforms.
1822  */
1823 
1824 typedef void (*sd_chain_t)(int index, struct sd_lun *un, struct buf *bp);
1825 
1826 
1827 static sd_chain_t sd_iostart_chain[] = {
1828 
1829 	/* Chain for buf IO for disk drive targets (PM enabled) */
1830 	sd_mapblockaddr_iostart,	/* Index: 0 */
1831 	sd_pm_iostart,			/* Index: 1 */
1832 	sd_core_iostart,		/* Index: 2 */
1833 
1834 	/* Chain for buf IO for disk drive targets (PM disabled) */
1835 	sd_mapblockaddr_iostart,	/* Index: 3 */
1836 	sd_core_iostart,		/* Index: 4 */
1837 
1838 	/*
1839 	 * Chain for buf IO for removable-media or large sector size
1840 	 * disk drive targets with RMW needed (PM enabled)
1841 	 */
1842 	sd_mapblockaddr_iostart,	/* Index: 5 */
1843 	sd_mapblocksize_iostart,	/* Index: 6 */
1844 	sd_pm_iostart,			/* Index: 7 */
1845 	sd_core_iostart,		/* Index: 8 */
1846 
1847 	/*
1848 	 * Chain for buf IO for removable-media or large sector size
1849 	 * disk drive targets with RMW needed (PM disabled)
1850 	 */
1851 	sd_mapblockaddr_iostart,	/* Index: 9 */
1852 	sd_mapblocksize_iostart,	/* Index: 10 */
1853 	sd_core_iostart,		/* Index: 11 */
1854 
1855 	/* Chain for buf IO for disk drives with checksumming (PM enabled) */
1856 	sd_mapblockaddr_iostart,	/* Index: 12 */
1857 	sd_checksum_iostart,		/* Index: 13 */
1858 	sd_pm_iostart,			/* Index: 14 */
1859 	sd_core_iostart,		/* Index: 15 */
1860 
1861 	/* Chain for buf IO for disk drives with checksumming (PM disabled) */
1862 	sd_mapblockaddr_iostart,	/* Index: 16 */
1863 	sd_checksum_iostart,		/* Index: 17 */
1864 	sd_core_iostart,		/* Index: 18 */
1865 
1866 	/* Chain for USCSI commands (all targets) */
1867 	sd_pm_iostart,			/* Index: 19 */
1868 	sd_core_iostart,		/* Index: 20 */
1869 
1870 	/* Chain for checksumming USCSI commands (all targets) */
1871 	sd_checksum_uscsi_iostart,	/* Index: 21 */
1872 	sd_pm_iostart,			/* Index: 22 */
1873 	sd_core_iostart,		/* Index: 23 */
1874 
1875 	/* Chain for "direct" USCSI commands (all targets) */
1876 	sd_core_iostart,		/* Index: 24 */
1877 
1878 	/* Chain for "direct priority" USCSI commands (all targets) */
1879 	sd_core_iostart,		/* Index: 25 */
1880 
1881 	/*
1882 	 * Chain for buf IO for large sector size disk drive targets
1883 	 * with RMW needed with checksumming (PM enabled)
1884 	 */
1885 	sd_mapblockaddr_iostart,	/* Index: 26 */
1886 	sd_mapblocksize_iostart,	/* Index: 27 */
1887 	sd_checksum_iostart,		/* Index: 28 */
1888 	sd_pm_iostart,			/* Index: 29 */
1889 	sd_core_iostart,		/* Index: 30 */
1890 
1891 	/*
1892 	 * Chain for buf IO for large sector size disk drive targets
1893 	 * with RMW needed with checksumming (PM disabled)
1894 	 */
1895 	sd_mapblockaddr_iostart,	/* Index: 31 */
1896 	sd_mapblocksize_iostart,	/* Index: 32 */
1897 	sd_checksum_iostart,		/* Index: 33 */
1898 	sd_core_iostart,		/* Index: 34 */
1899 
1900 };
1901 
1902 /*
1903  * Macros to locate the first function of each iostart chain in the
1904  * sd_iostart_chain[] array. These are located by the index in the array.
1905  */
1906 #define	SD_CHAIN_DISK_IOSTART			0
1907 #define	SD_CHAIN_DISK_IOSTART_NO_PM		3
1908 #define	SD_CHAIN_MSS_DISK_IOSTART		5
1909 #define	SD_CHAIN_RMMEDIA_IOSTART		5
1910 #define	SD_CHAIN_MSS_DISK_IOSTART_NO_PM		9
1911 #define	SD_CHAIN_RMMEDIA_IOSTART_NO_PM		9
1912 #define	SD_CHAIN_CHKSUM_IOSTART			12
1913 #define	SD_CHAIN_CHKSUM_IOSTART_NO_PM		16
1914 #define	SD_CHAIN_USCSI_CMD_IOSTART		19
1915 #define	SD_CHAIN_USCSI_CHKSUM_IOSTART		21
1916 #define	SD_CHAIN_DIRECT_CMD_IOSTART		24
1917 #define	SD_CHAIN_PRIORITY_CMD_IOSTART		25
1918 #define	SD_CHAIN_MSS_CHKSUM_IOSTART		26
1919 #define	SD_CHAIN_MSS_CHKSUM_IOSTART_NO_PM	31
1920 
1921 
1922 /*
1923  * Table of function pointers for the iodone-side routines for the driver-
1924  * internal layering mechanism.  The calling sequence for iodone routines
1925  * uses a decrementing table index, so the last routine called in a chain
1926  * must be at the lowest array index location for that chain.  The last
1927  * routine for each chain must be either sd_buf_iodone() (for buf(9S) IOs)
1928  * or sd_uscsi_iodone() (for uscsi IOs).  Other than this, the ordering
1929  * of the functions in an iodone side chain must correspond to the ordering
1930  * of the iostart routines for that chain.  Note that there is no iodone
1931  * side routine that corresponds to sd_core_iostart(), so there is no
1932  * entry in the table for this.
1933  */
1934 
1935 static sd_chain_t sd_iodone_chain[] = {
1936 
1937 	/* Chain for buf IO for disk drive targets (PM enabled) */
1938 	sd_buf_iodone,			/* Index: 0 */
1939 	sd_mapblockaddr_iodone,		/* Index: 1 */
1940 	sd_pm_iodone,			/* Index: 2 */
1941 
1942 	/* Chain for buf IO for disk drive targets (PM disabled) */
1943 	sd_buf_iodone,			/* Index: 3 */
1944 	sd_mapblockaddr_iodone,		/* Index: 4 */
1945 
1946 	/*
1947 	 * Chain for buf IO for removable-media or large sector size
1948 	 * disk drive targets with RMW needed (PM enabled)
1949 	 */
1950 	sd_buf_iodone,			/* Index: 5 */
1951 	sd_mapblockaddr_iodone,		/* Index: 6 */
1952 	sd_mapblocksize_iodone,		/* Index: 7 */
1953 	sd_pm_iodone,			/* Index: 8 */
1954 
1955 	/*
1956 	 * Chain for buf IO for removable-media or large sector size
1957 	 * disk drive targets with RMW needed (PM disabled)
1958 	 */
1959 	sd_buf_iodone,			/* Index: 9 */
1960 	sd_mapblockaddr_iodone,		/* Index: 10 */
1961 	sd_mapblocksize_iodone,		/* Index: 11 */
1962 
1963 	/* Chain for buf IO for disk drives with checksumming (PM enabled) */
1964 	sd_buf_iodone,			/* Index: 12 */
1965 	sd_mapblockaddr_iodone,		/* Index: 13 */
1966 	sd_checksum_iodone,		/* Index: 14 */
1967 	sd_pm_iodone,			/* Index: 15 */
1968 
1969 	/* Chain for buf IO for disk drives with checksumming (PM disabled) */
1970 	sd_buf_iodone,			/* Index: 16 */
1971 	sd_mapblockaddr_iodone,		/* Index: 17 */
1972 	sd_checksum_iodone,		/* Index: 18 */
1973 
1974 	/* Chain for USCSI commands (non-checksum targets) */
1975 	sd_uscsi_iodone,		/* Index: 19 */
1976 	sd_pm_iodone,			/* Index: 20 */
1977 
1978 	/* Chain for USCSI commands (checksum targets) */
1979 	sd_uscsi_iodone,		/* Index: 21 */
1980 	sd_checksum_uscsi_iodone,	/* Index: 22 */
1981 	sd_pm_iodone,			/* Index: 22 */
1982 
1983 	/* Chain for "direct" USCSI commands (all targets) */
1984 	sd_uscsi_iodone,		/* Index: 24 */
1985 
1986 	/* Chain for "direct priority" USCSI commands (all targets) */
1987 	sd_uscsi_iodone,		/* Index: 25 */
1988 
1989 	/*
1990 	 * Chain for buf IO for large sector size disk drive targets
1991 	 * with checksumming (PM enabled)
1992 	 */
1993 	sd_buf_iodone,			/* Index: 26 */
1994 	sd_mapblockaddr_iodone,		/* Index: 27 */
1995 	sd_mapblocksize_iodone,		/* Index: 28 */
1996 	sd_checksum_iodone,		/* Index: 29 */
1997 	sd_pm_iodone,			/* Index: 30 */
1998 
1999 	/*
2000 	 * Chain for buf IO for large sector size disk drive targets
2001 	 * with checksumming (PM disabled)
2002 	 */
2003 	sd_buf_iodone,			/* Index: 31 */
2004 	sd_mapblockaddr_iodone,		/* Index: 32 */
2005 	sd_mapblocksize_iodone,		/* Index: 33 */
2006 	sd_checksum_iodone,		/* Index: 34 */
2007 };
2008 
2009 
2010 /*
2011  * Macros to locate the "first" function in the sd_iodone_chain[] array for
2012  * each iodone-side chain. These are located by the array index, but as the
2013  * iodone side functions are called in a decrementing-index order, the
2014  * highest index number in each chain must be specified (as these correspond
2015  * to the first function in the iodone chain that will be called by the core
2016  * at IO completion time).
2017  */
2018 
2019 #define	SD_CHAIN_DISK_IODONE			2
2020 #define	SD_CHAIN_DISK_IODONE_NO_PM		4
2021 #define	SD_CHAIN_RMMEDIA_IODONE			8
2022 #define	SD_CHAIN_MSS_DISK_IODONE		8
2023 #define	SD_CHAIN_RMMEDIA_IODONE_NO_PM		11
2024 #define	SD_CHAIN_MSS_DISK_IODONE_NO_PM		11
2025 #define	SD_CHAIN_CHKSUM_IODONE			15
2026 #define	SD_CHAIN_CHKSUM_IODONE_NO_PM		18
2027 #define	SD_CHAIN_USCSI_CMD_IODONE		20
2028 #define	SD_CHAIN_USCSI_CHKSUM_IODONE		22
2029 #define	SD_CHAIN_DIRECT_CMD_IODONE		24
2030 #define	SD_CHAIN_PRIORITY_CMD_IODONE		25
2031 #define	SD_CHAIN_MSS_CHKSUM_IODONE		30
2032 #define	SD_CHAIN_MSS_CHKSUM_IODONE_NO_PM	34
2033 
2034 
2035 
2036 /*
2037  * Array to map a layering chain index to the appropriate initpkt routine.
2038  * The redundant entries are present so that the index used for accessing
2039  * the above sd_iostart_chain and sd_iodone_chain tables can be used directly
2040  * with this table as well.
2041  */
2042 typedef int (*sd_initpkt_t)(struct buf *, struct scsi_pkt **);
2043 
2044 static sd_initpkt_t	sd_initpkt_map[] = {
2045 
2046 	/* Chain for buf IO for disk drive targets (PM enabled) */
2047 	sd_initpkt_for_buf,		/* Index: 0 */
2048 	sd_initpkt_for_buf,		/* Index: 1 */
2049 	sd_initpkt_for_buf,		/* Index: 2 */
2050 
2051 	/* Chain for buf IO for disk drive targets (PM disabled) */
2052 	sd_initpkt_for_buf,		/* Index: 3 */
2053 	sd_initpkt_for_buf,		/* Index: 4 */
2054 
2055 	/*
2056 	 * Chain for buf IO for removable-media or large sector size
2057 	 * disk drive targets (PM enabled)
2058 	 */
2059 	sd_initpkt_for_buf,		/* Index: 5 */
2060 	sd_initpkt_for_buf,		/* Index: 6 */
2061 	sd_initpkt_for_buf,		/* Index: 7 */
2062 	sd_initpkt_for_buf,		/* Index: 8 */
2063 
2064 	/*
2065 	 * Chain for buf IO for removable-media or large sector size
2066 	 * disk drive targets (PM disabled)
2067 	 */
2068 	sd_initpkt_for_buf,		/* Index: 9 */
2069 	sd_initpkt_for_buf,		/* Index: 10 */
2070 	sd_initpkt_for_buf,		/* Index: 11 */
2071 
2072 	/* Chain for buf IO for disk drives with checksumming (PM enabled) */
2073 	sd_initpkt_for_buf,		/* Index: 12 */
2074 	sd_initpkt_for_buf,		/* Index: 13 */
2075 	sd_initpkt_for_buf,		/* Index: 14 */
2076 	sd_initpkt_for_buf,		/* Index: 15 */
2077 
2078 	/* Chain for buf IO for disk drives with checksumming (PM disabled) */
2079 	sd_initpkt_for_buf,		/* Index: 16 */
2080 	sd_initpkt_for_buf,		/* Index: 17 */
2081 	sd_initpkt_for_buf,		/* Index: 18 */
2082 
2083 	/* Chain for USCSI commands (non-checksum targets) */
2084 	sd_initpkt_for_uscsi,		/* Index: 19 */
2085 	sd_initpkt_for_uscsi,		/* Index: 20 */
2086 
2087 	/* Chain for USCSI commands (checksum targets) */
2088 	sd_initpkt_for_uscsi,		/* Index: 21 */
2089 	sd_initpkt_for_uscsi,		/* Index: 22 */
2090 	sd_initpkt_for_uscsi,		/* Index: 22 */
2091 
2092 	/* Chain for "direct" USCSI commands (all targets) */
2093 	sd_initpkt_for_uscsi,		/* Index: 24 */
2094 
2095 	/* Chain for "direct priority" USCSI commands (all targets) */
2096 	sd_initpkt_for_uscsi,		/* Index: 25 */
2097 
2098 	/*
2099 	 * Chain for buf IO for large sector size disk drive targets
2100 	 * with checksumming (PM enabled)
2101 	 */
2102 	sd_initpkt_for_buf,		/* Index: 26 */
2103 	sd_initpkt_for_buf,		/* Index: 27 */
2104 	sd_initpkt_for_buf,		/* Index: 28 */
2105 	sd_initpkt_for_buf,		/* Index: 29 */
2106 	sd_initpkt_for_buf,		/* Index: 30 */
2107 
2108 	/*
2109 	 * Chain for buf IO for large sector size disk drive targets
2110 	 * with checksumming (PM disabled)
2111 	 */
2112 	sd_initpkt_for_buf,		/* Index: 31 */
2113 	sd_initpkt_for_buf,		/* Index: 32 */
2114 	sd_initpkt_for_buf,		/* Index: 33 */
2115 	sd_initpkt_for_buf,		/* Index: 34 */
2116 };
2117 
2118 
2119 /*
2120  * Array to map a layering chain index to the appropriate destroypktpkt routine.
2121  * The redundant entries are present so that the index used for accessing
2122  * the above sd_iostart_chain and sd_iodone_chain tables can be used directly
2123  * with this table as well.
2124  */
2125 typedef void (*sd_destroypkt_t)(struct buf *);
2126 
2127 static sd_destroypkt_t	sd_destroypkt_map[] = {
2128 
2129 	/* Chain for buf IO for disk drive targets (PM enabled) */
2130 	sd_destroypkt_for_buf,		/* Index: 0 */
2131 	sd_destroypkt_for_buf,		/* Index: 1 */
2132 	sd_destroypkt_for_buf,		/* Index: 2 */
2133 
2134 	/* Chain for buf IO for disk drive targets (PM disabled) */
2135 	sd_destroypkt_for_buf,		/* Index: 3 */
2136 	sd_destroypkt_for_buf,		/* Index: 4 */
2137 
2138 	/*
2139 	 * Chain for buf IO for removable-media or large sector size
2140 	 * disk drive targets (PM enabled)
2141 	 */
2142 	sd_destroypkt_for_buf,		/* Index: 5 */
2143 	sd_destroypkt_for_buf,		/* Index: 6 */
2144 	sd_destroypkt_for_buf,		/* Index: 7 */
2145 	sd_destroypkt_for_buf,		/* Index: 8 */
2146 
2147 	/*
2148 	 * Chain for buf IO for removable-media or large sector size
2149 	 * disk drive targets (PM disabled)
2150 	 */
2151 	sd_destroypkt_for_buf,		/* Index: 9 */
2152 	sd_destroypkt_for_buf,		/* Index: 10 */
2153 	sd_destroypkt_for_buf,		/* Index: 11 */
2154 
2155 	/* Chain for buf IO for disk drives with checksumming (PM enabled) */
2156 	sd_destroypkt_for_buf,		/* Index: 12 */
2157 	sd_destroypkt_for_buf,		/* Index: 13 */
2158 	sd_destroypkt_for_buf,		/* Index: 14 */
2159 	sd_destroypkt_for_buf,		/* Index: 15 */
2160 
2161 	/* Chain for buf IO for disk drives with checksumming (PM disabled) */
2162 	sd_destroypkt_for_buf,		/* Index: 16 */
2163 	sd_destroypkt_for_buf,		/* Index: 17 */
2164 	sd_destroypkt_for_buf,		/* Index: 18 */
2165 
2166 	/* Chain for USCSI commands (non-checksum targets) */
2167 	sd_destroypkt_for_uscsi,	/* Index: 19 */
2168 	sd_destroypkt_for_uscsi,	/* Index: 20 */
2169 
2170 	/* Chain for USCSI commands (checksum targets) */
2171 	sd_destroypkt_for_uscsi,	/* Index: 21 */
2172 	sd_destroypkt_for_uscsi,	/* Index: 22 */
2173 	sd_destroypkt_for_uscsi,	/* Index: 22 */
2174 
2175 	/* Chain for "direct" USCSI commands (all targets) */
2176 	sd_destroypkt_for_uscsi,	/* Index: 24 */
2177 
2178 	/* Chain for "direct priority" USCSI commands (all targets) */
2179 	sd_destroypkt_for_uscsi,	/* Index: 25 */
2180 
2181 	/*
2182 	 * Chain for buf IO for large sector size disk drive targets
2183 	 * with checksumming (PM disabled)
2184 	 */
2185 	sd_destroypkt_for_buf,		/* Index: 26 */
2186 	sd_destroypkt_for_buf,		/* Index: 27 */
2187 	sd_destroypkt_for_buf,		/* Index: 28 */
2188 	sd_destroypkt_for_buf,		/* Index: 29 */
2189 	sd_destroypkt_for_buf,		/* Index: 30 */
2190 
2191 	/*
2192 	 * Chain for buf IO for large sector size disk drive targets
2193 	 * with checksumming (PM enabled)
2194 	 */
2195 	sd_destroypkt_for_buf,		/* Index: 31 */
2196 	sd_destroypkt_for_buf,		/* Index: 32 */
2197 	sd_destroypkt_for_buf,		/* Index: 33 */
2198 	sd_destroypkt_for_buf,		/* Index: 34 */
2199 };
2200 
2201 
2202 
2203 /*
2204  * Array to map a layering chain index to the appropriate chain "type".
2205  * The chain type indicates a specific property/usage of the chain.
2206  * The redundant entries are present so that the index used for accessing
2207  * the above sd_iostart_chain and sd_iodone_chain tables can be used directly
2208  * with this table as well.
2209  */
2210 
2211 #define	SD_CHAIN_NULL			0	/* for the special RQS cmd */
2212 #define	SD_CHAIN_BUFIO			1	/* regular buf IO */
2213 #define	SD_CHAIN_USCSI			2	/* regular USCSI commands */
2214 #define	SD_CHAIN_DIRECT			3	/* uscsi, w/ bypass power mgt */
2215 #define	SD_CHAIN_DIRECT_PRIORITY	4	/* uscsi, w/ bypass power mgt */
2216 						/* (for error recovery) */
2217 
2218 static int sd_chain_type_map[] = {
2219 
2220 	/* Chain for buf IO for disk drive targets (PM enabled) */
2221 	SD_CHAIN_BUFIO,			/* Index: 0 */
2222 	SD_CHAIN_BUFIO,			/* Index: 1 */
2223 	SD_CHAIN_BUFIO,			/* Index: 2 */
2224 
2225 	/* Chain for buf IO for disk drive targets (PM disabled) */
2226 	SD_CHAIN_BUFIO,			/* Index: 3 */
2227 	SD_CHAIN_BUFIO,			/* Index: 4 */
2228 
2229 	/*
2230 	 * Chain for buf IO for removable-media or large sector size
2231 	 * disk drive targets (PM enabled)
2232 	 */
2233 	SD_CHAIN_BUFIO,			/* Index: 5 */
2234 	SD_CHAIN_BUFIO,			/* Index: 6 */
2235 	SD_CHAIN_BUFIO,			/* Index: 7 */
2236 	SD_CHAIN_BUFIO,			/* Index: 8 */
2237 
2238 	/*
2239 	 * Chain for buf IO for removable-media or large sector size
2240 	 * disk drive targets (PM disabled)
2241 	 */
2242 	SD_CHAIN_BUFIO,			/* Index: 9 */
2243 	SD_CHAIN_BUFIO,			/* Index: 10 */
2244 	SD_CHAIN_BUFIO,			/* Index: 11 */
2245 
2246 	/* Chain for buf IO for disk drives with checksumming (PM enabled) */
2247 	SD_CHAIN_BUFIO,			/* Index: 12 */
2248 	SD_CHAIN_BUFIO,			/* Index: 13 */
2249 	SD_CHAIN_BUFIO,			/* Index: 14 */
2250 	SD_CHAIN_BUFIO,			/* Index: 15 */
2251 
2252 	/* Chain for buf IO for disk drives with checksumming (PM disabled) */
2253 	SD_CHAIN_BUFIO,			/* Index: 16 */
2254 	SD_CHAIN_BUFIO,			/* Index: 17 */
2255 	SD_CHAIN_BUFIO,			/* Index: 18 */
2256 
2257 	/* Chain for USCSI commands (non-checksum targets) */
2258 	SD_CHAIN_USCSI,			/* Index: 19 */
2259 	SD_CHAIN_USCSI,			/* Index: 20 */
2260 
2261 	/* Chain for USCSI commands (checksum targets) */
2262 	SD_CHAIN_USCSI,			/* Index: 21 */
2263 	SD_CHAIN_USCSI,			/* Index: 22 */
2264 	SD_CHAIN_USCSI,			/* Index: 23 */
2265 
2266 	/* Chain for "direct" USCSI commands (all targets) */
2267 	SD_CHAIN_DIRECT,		/* Index: 24 */
2268 
2269 	/* Chain for "direct priority" USCSI commands (all targets) */
2270 	SD_CHAIN_DIRECT_PRIORITY,	/* Index: 25 */
2271 
2272 	/*
2273 	 * Chain for buf IO for large sector size disk drive targets
2274 	 * with checksumming (PM enabled)
2275 	 */
2276 	SD_CHAIN_BUFIO,			/* Index: 26 */
2277 	SD_CHAIN_BUFIO,			/* Index: 27 */
2278 	SD_CHAIN_BUFIO,			/* Index: 28 */
2279 	SD_CHAIN_BUFIO,			/* Index: 29 */
2280 	SD_CHAIN_BUFIO,			/* Index: 30 */
2281 
2282 	/*
2283 	 * Chain for buf IO for large sector size disk drive targets
2284 	 * with checksumming (PM disabled)
2285 	 */
2286 	SD_CHAIN_BUFIO,			/* Index: 31 */
2287 	SD_CHAIN_BUFIO,			/* Index: 32 */
2288 	SD_CHAIN_BUFIO,			/* Index: 33 */
2289 	SD_CHAIN_BUFIO,			/* Index: 34 */
2290 };
2291 
2292 
2293 /* Macro to return TRUE if the IO has come from the sd_buf_iostart() chain. */
2294 #define	SD_IS_BUFIO(xp)			\
2295 	(sd_chain_type_map[(xp)->xb_chain_iostart] == SD_CHAIN_BUFIO)
2296 
2297 /* Macro to return TRUE if the IO has come from the "direct priority" chain. */
2298 #define	SD_IS_DIRECT_PRIORITY(xp)	\
2299 	(sd_chain_type_map[(xp)->xb_chain_iostart] == SD_CHAIN_DIRECT_PRIORITY)
2300 
2301 
2302 
2303 /*
2304  * Struct, array, and macros to map a specific chain to the appropriate
2305  * layering indexes in the sd_iostart_chain[] and sd_iodone_chain[] arrays.
2306  *
2307  * The sd_chain_index_map[] array is used at attach time to set the various
2308  * un_xxx_chain type members of the sd_lun softstate to the specific layering
2309  * chain to be used with the instance. This allows different instances to use
2310  * different chain for buf IO, uscsi IO, etc.. Also, since the xb_chain_iostart
2311  * and xb_chain_iodone index values in the sd_xbuf are initialized to these
2312  * values at sd_xbuf init time, this allows (1) layering chains may be changed
2313  * dynamically & without the use of locking; and (2) a layer may update the
2314  * xb_chain_io[start|done] member in a given xbuf with its current index value,
2315  * to allow for deferred processing of an IO within the same chain from a
2316  * different execution context.
2317  */
2318 
2319 struct sd_chain_index {
2320 	int	sci_iostart_index;
2321 	int	sci_iodone_index;
2322 };
2323 
2324 static struct sd_chain_index	sd_chain_index_map[] = {
2325 	{ SD_CHAIN_DISK_IOSTART,		SD_CHAIN_DISK_IODONE },
2326 	{ SD_CHAIN_DISK_IOSTART_NO_PM,		SD_CHAIN_DISK_IODONE_NO_PM },
2327 	{ SD_CHAIN_RMMEDIA_IOSTART,		SD_CHAIN_RMMEDIA_IODONE },
2328 	{ SD_CHAIN_RMMEDIA_IOSTART_NO_PM,	SD_CHAIN_RMMEDIA_IODONE_NO_PM },
2329 	{ SD_CHAIN_CHKSUM_IOSTART,		SD_CHAIN_CHKSUM_IODONE },
2330 	{ SD_CHAIN_CHKSUM_IOSTART_NO_PM,	SD_CHAIN_CHKSUM_IODONE_NO_PM },
2331 	{ SD_CHAIN_USCSI_CMD_IOSTART,		SD_CHAIN_USCSI_CMD_IODONE },
2332 	{ SD_CHAIN_USCSI_CHKSUM_IOSTART,	SD_CHAIN_USCSI_CHKSUM_IODONE },
2333 	{ SD_CHAIN_DIRECT_CMD_IOSTART,		SD_CHAIN_DIRECT_CMD_IODONE },
2334 	{ SD_CHAIN_PRIORITY_CMD_IOSTART,	SD_CHAIN_PRIORITY_CMD_IODONE },
2335 	{ SD_CHAIN_MSS_CHKSUM_IOSTART,		SD_CHAIN_MSS_CHKSUM_IODONE },
2336 	{ SD_CHAIN_MSS_CHKSUM_IOSTART_NO_PM, SD_CHAIN_MSS_CHKSUM_IODONE_NO_PM },
2337 
2338 };
2339 
2340 
2341 /*
2342  * The following are indexes into the sd_chain_index_map[] array.
2343  */
2344 
2345 /* un->un_buf_chain_type must be set to one of these */
2346 #define	SD_CHAIN_INFO_DISK		0
2347 #define	SD_CHAIN_INFO_DISK_NO_PM	1
2348 #define	SD_CHAIN_INFO_RMMEDIA		2
2349 #define	SD_CHAIN_INFO_MSS_DISK		2
2350 #define	SD_CHAIN_INFO_RMMEDIA_NO_PM	3
2351 #define	SD_CHAIN_INFO_MSS_DSK_NO_PM	3
2352 #define	SD_CHAIN_INFO_CHKSUM		4
2353 #define	SD_CHAIN_INFO_CHKSUM_NO_PM	5
2354 #define	SD_CHAIN_INFO_MSS_DISK_CHKSUM	10
2355 #define	SD_CHAIN_INFO_MSS_DISK_CHKSUM_NO_PM	11
2356 
2357 /* un->un_uscsi_chain_type must be set to one of these */
2358 #define	SD_CHAIN_INFO_USCSI_CMD		6
2359 /* USCSI with PM disabled is the same as DIRECT */
2360 #define	SD_CHAIN_INFO_USCSI_CMD_NO_PM	8
2361 #define	SD_CHAIN_INFO_USCSI_CHKSUM	7
2362 
2363 /* un->un_direct_chain_type must be set to one of these */
2364 #define	SD_CHAIN_INFO_DIRECT_CMD	8
2365 
2366 /* un->un_priority_chain_type must be set to one of these */
2367 #define	SD_CHAIN_INFO_PRIORITY_CMD	9
2368 
2369 /* size for devid inquiries */
2370 #define	MAX_INQUIRY_SIZE		0xF0
2371 
2372 /*
2373  * Macros used by functions to pass a given buf(9S) struct along to the
2374  * next function in the layering chain for further processing.
2375  *
2376  * In the following macros, passing more than three arguments to the called
2377  * routines causes the optimizer for the SPARC compiler to stop doing tail
2378  * call elimination which results in significant performance degradation.
2379  */
2380 #define	SD_BEGIN_IOSTART(index, un, bp)	\
2381 	((*(sd_iostart_chain[index]))(index, un, bp))
2382 
2383 #define	SD_BEGIN_IODONE(index, un, bp)	\
2384 	((*(sd_iodone_chain[index]))(index, un, bp))
2385 
2386 #define	SD_NEXT_IOSTART(index, un, bp)				\
2387 	((*(sd_iostart_chain[(index) + 1]))((index) + 1, un, bp))
2388 
2389 #define	SD_NEXT_IODONE(index, un, bp)				\
2390 	((*(sd_iodone_chain[(index) - 1]))((index) - 1, un, bp))
2391 
2392 /*
2393  *    Function: _init
2394  *
2395  * Description: This is the driver _init(9E) entry point.
2396  *
2397  * Return Code: Returns the value from mod_install(9F) or
2398  *		ddi_soft_state_init(9F) as appropriate.
2399  *
2400  *     Context: Called when driver module loaded.
2401  */
2402 
2403 int
2404 _init(void)
2405 {
2406 	int	err;
2407 
2408 	/* establish driver name from module name */
2409 	sd_label = (char *)mod_modname(&modlinkage);
2410 
2411 	err = ddi_soft_state_init(&sd_state, sizeof (struct sd_lun),
2412 	    SD_MAXUNIT);
2413 	if (err != 0) {
2414 		return (err);
2415 	}
2416 
2417 	mutex_init(&sd_detach_mutex, NULL, MUTEX_DRIVER, NULL);
2418 	mutex_init(&sd_log_mutex,    NULL, MUTEX_DRIVER, NULL);
2419 	mutex_init(&sd_label_mutex,  NULL, MUTEX_DRIVER, NULL);
2420 
2421 	mutex_init(&sd_tr.srq_resv_reclaim_mutex, NULL, MUTEX_DRIVER, NULL);
2422 	cv_init(&sd_tr.srq_resv_reclaim_cv, NULL, CV_DRIVER, NULL);
2423 	cv_init(&sd_tr.srq_inprocess_cv, NULL, CV_DRIVER, NULL);
2424 
2425 	/*
2426 	 * it's ok to init here even for fibre device
2427 	 */
2428 	sd_scsi_probe_cache_init();
2429 
2430 	sd_scsi_target_lun_init();
2431 
2432 	/*
2433 	 * Creating taskq before mod_install ensures that all callers (threads)
2434 	 * that enter the module after a successful mod_install encounter
2435 	 * a valid taskq.
2436 	 */
2437 	sd_taskq_create();
2438 
2439 	err = mod_install(&modlinkage);
2440 	if (err != 0) {
2441 		/* delete taskq if install fails */
2442 		sd_taskq_delete();
2443 
2444 		mutex_destroy(&sd_detach_mutex);
2445 		mutex_destroy(&sd_log_mutex);
2446 		mutex_destroy(&sd_label_mutex);
2447 
2448 		mutex_destroy(&sd_tr.srq_resv_reclaim_mutex);
2449 		cv_destroy(&sd_tr.srq_resv_reclaim_cv);
2450 		cv_destroy(&sd_tr.srq_inprocess_cv);
2451 
2452 		sd_scsi_probe_cache_fini();
2453 
2454 		sd_scsi_target_lun_fini();
2455 
2456 		ddi_soft_state_fini(&sd_state);
2457 
2458 		return (err);
2459 	}
2460 
2461 	return (err);
2462 }
2463 
2464 
2465 /*
2466  *    Function: _fini
2467  *
2468  * Description: This is the driver _fini(9E) entry point.
2469  *
2470  * Return Code: Returns the value from mod_remove(9F)
2471  *
2472  *     Context: Called when driver module is unloaded.
2473  */
2474 
2475 int
2476 _fini(void)
2477 {
2478 	int err;
2479 
2480 	if ((err = mod_remove(&modlinkage)) != 0) {
2481 		return (err);
2482 	}
2483 
2484 	sd_taskq_delete();
2485 
2486 	mutex_destroy(&sd_detach_mutex);
2487 	mutex_destroy(&sd_log_mutex);
2488 	mutex_destroy(&sd_label_mutex);
2489 	mutex_destroy(&sd_tr.srq_resv_reclaim_mutex);
2490 
2491 	sd_scsi_probe_cache_fini();
2492 
2493 	sd_scsi_target_lun_fini();
2494 
2495 	cv_destroy(&sd_tr.srq_resv_reclaim_cv);
2496 	cv_destroy(&sd_tr.srq_inprocess_cv);
2497 
2498 	ddi_soft_state_fini(&sd_state);
2499 
2500 	return (err);
2501 }
2502 
2503 
2504 /*
2505  *    Function: _info
2506  *
2507  * Description: This is the driver _info(9E) entry point.
2508  *
2509  *   Arguments: modinfop - pointer to the driver modinfo structure
2510  *
2511  * Return Code: Returns the value from mod_info(9F).
2512  *
2513  *     Context: Kernel thread context
2514  */
2515 
2516 int
2517 _info(struct modinfo *modinfop)
2518 {
2519 	return (mod_info(&modlinkage, modinfop));
2520 }
2521 
2522 
2523 /*
2524  * The following routines implement the driver message logging facility.
2525  * They provide component- and level- based debug output filtering.
2526  * Output may also be restricted to messages for a single instance by
2527  * specifying a soft state pointer in sd_debug_un. If sd_debug_un is set
2528  * to NULL, then messages for all instances are printed.
2529  *
2530  * These routines have been cloned from each other due to the language
2531  * constraints of macros and variable argument list processing.
2532  */
2533 
2534 
2535 /*
2536  *    Function: sd_log_err
2537  *
2538  * Description: This routine is called by the SD_ERROR macro for debug
2539  *		logging of error conditions.
2540  *
2541  *   Arguments: comp - driver component being logged
2542  *		dev  - pointer to driver info structure
2543  *		fmt  - error string and format to be logged
2544  */
2545 
2546 static void
2547 sd_log_err(uint_t comp, struct sd_lun *un, const char *fmt, ...)
2548 {
2549 	va_list		ap;
2550 	dev_info_t	*dev;
2551 
2552 	ASSERT(un != NULL);
2553 	dev = SD_DEVINFO(un);
2554 	ASSERT(dev != NULL);
2555 
2556 	/*
2557 	 * Filter messages based on the global component and level masks.
2558 	 * Also print if un matches the value of sd_debug_un, or if
2559 	 * sd_debug_un is set to NULL.
2560 	 */
2561 	if ((sd_component_mask & comp) && (sd_level_mask & SD_LOGMASK_ERROR) &&
2562 	    ((sd_debug_un == NULL) || (sd_debug_un == un))) {
2563 		mutex_enter(&sd_log_mutex);
2564 		va_start(ap, fmt);
2565 		(void) vsprintf(sd_log_buf, fmt, ap);
2566 		va_end(ap);
2567 		scsi_log(dev, sd_label, CE_CONT, "%s", sd_log_buf);
2568 		mutex_exit(&sd_log_mutex);
2569 	}
2570 #ifdef SD_FAULT_INJECTION
2571 	_NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::sd_injection_mask));
2572 	if (un->sd_injection_mask & comp) {
2573 		mutex_enter(&sd_log_mutex);
2574 		va_start(ap, fmt);
2575 		(void) vsprintf(sd_log_buf, fmt, ap);
2576 		va_end(ap);
2577 		sd_injection_log(sd_log_buf, un);
2578 		mutex_exit(&sd_log_mutex);
2579 	}
2580 #endif
2581 }
2582 
2583 
2584 /*
2585  *    Function: sd_log_info
2586  *
2587  * Description: This routine is called by the SD_INFO macro for debug
2588  *		logging of general purpose informational conditions.
2589  *
2590  *   Arguments: comp - driver component being logged
2591  *		dev  - pointer to driver info structure
2592  *		fmt  - info string and format to be logged
2593  */
2594 
2595 static void
2596 sd_log_info(uint_t component, struct sd_lun *un, const char *fmt, ...)
2597 {
2598 	va_list		ap;
2599 	dev_info_t	*dev;
2600 
2601 	ASSERT(un != NULL);
2602 	dev = SD_DEVINFO(un);
2603 	ASSERT(dev != NULL);
2604 
2605 	/*
2606 	 * Filter messages based on the global component and level masks.
2607 	 * Also print if un matches the value of sd_debug_un, or if
2608 	 * sd_debug_un is set to NULL.
2609 	 */
2610 	if ((sd_component_mask & component) &&
2611 	    (sd_level_mask & SD_LOGMASK_INFO) &&
2612 	    ((sd_debug_un == NULL) || (sd_debug_un == un))) {
2613 		mutex_enter(&sd_log_mutex);
2614 		va_start(ap, fmt);
2615 		(void) vsprintf(sd_log_buf, fmt, ap);
2616 		va_end(ap);
2617 		scsi_log(dev, sd_label, CE_CONT, "%s", sd_log_buf);
2618 		mutex_exit(&sd_log_mutex);
2619 	}
2620 #ifdef SD_FAULT_INJECTION
2621 	_NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::sd_injection_mask));
2622 	if (un->sd_injection_mask & component) {
2623 		mutex_enter(&sd_log_mutex);
2624 		va_start(ap, fmt);
2625 		(void) vsprintf(sd_log_buf, fmt, ap);
2626 		va_end(ap);
2627 		sd_injection_log(sd_log_buf, un);
2628 		mutex_exit(&sd_log_mutex);
2629 	}
2630 #endif
2631 }
2632 
2633 
2634 /*
2635  *    Function: sd_log_trace
2636  *
2637  * Description: This routine is called by the SD_TRACE macro for debug
2638  *		logging of trace conditions (i.e. function entry/exit).
2639  *
2640  *   Arguments: comp - driver component being logged
2641  *		dev  - pointer to driver info structure
2642  *		fmt  - trace string and format to be logged
2643  */
2644 
2645 static void
2646 sd_log_trace(uint_t component, struct sd_lun *un, const char *fmt, ...)
2647 {
2648 	va_list		ap;
2649 	dev_info_t	*dev;
2650 
2651 	ASSERT(un != NULL);
2652 	dev = SD_DEVINFO(un);
2653 	ASSERT(dev != NULL);
2654 
2655 	/*
2656 	 * Filter messages based on the global component and level masks.
2657 	 * Also print if un matches the value of sd_debug_un, or if
2658 	 * sd_debug_un is set to NULL.
2659 	 */
2660 	if ((sd_component_mask & component) &&
2661 	    (sd_level_mask & SD_LOGMASK_TRACE) &&
2662 	    ((sd_debug_un == NULL) || (sd_debug_un == un))) {
2663 		mutex_enter(&sd_log_mutex);
2664 		va_start(ap, fmt);
2665 		(void) vsprintf(sd_log_buf, fmt, ap);
2666 		va_end(ap);
2667 		scsi_log(dev, sd_label, CE_CONT, "%s", sd_log_buf);
2668 		mutex_exit(&sd_log_mutex);
2669 	}
2670 #ifdef SD_FAULT_INJECTION
2671 	_NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::sd_injection_mask));
2672 	if (un->sd_injection_mask & component) {
2673 		mutex_enter(&sd_log_mutex);
2674 		va_start(ap, fmt);
2675 		(void) vsprintf(sd_log_buf, fmt, ap);
2676 		va_end(ap);
2677 		sd_injection_log(sd_log_buf, un);
2678 		mutex_exit(&sd_log_mutex);
2679 	}
2680 #endif
2681 }
2682 
2683 
2684 /*
2685  *    Function: sdprobe
2686  *
2687  * Description: This is the driver probe(9e) entry point function.
2688  *
2689  *   Arguments: devi - opaque device info handle
2690  *
2691  * Return Code: DDI_PROBE_SUCCESS: If the probe was successful.
2692  *              DDI_PROBE_FAILURE: If the probe failed.
2693  *              DDI_PROBE_PARTIAL: If the instance is not present now,
2694  *				   but may be present in the future.
2695  */
2696 
2697 static int
2698 sdprobe(dev_info_t *devi)
2699 {
2700 	struct scsi_device	*devp;
2701 	int			rval;
2702 	int			instance = ddi_get_instance(devi);
2703 
2704 	/*
2705 	 * if it wasn't for pln, sdprobe could actually be nulldev
2706 	 * in the "__fibre" case.
2707 	 */
2708 	if (ddi_dev_is_sid(devi) == DDI_SUCCESS) {
2709 		return (DDI_PROBE_DONTCARE);
2710 	}
2711 
2712 	devp = ddi_get_driver_private(devi);
2713 
2714 	if (devp == NULL) {
2715 		/* Ooops... nexus driver is mis-configured... */
2716 		return (DDI_PROBE_FAILURE);
2717 	}
2718 
2719 	if (ddi_get_soft_state(sd_state, instance) != NULL) {
2720 		return (DDI_PROBE_PARTIAL);
2721 	}
2722 
2723 	/*
2724 	 * Call the SCSA utility probe routine to see if we actually
2725 	 * have a target at this SCSI nexus.
2726 	 */
2727 	switch (sd_scsi_probe_with_cache(devp, NULL_FUNC)) {
2728 	case SCSIPROBE_EXISTS:
2729 		switch (devp->sd_inq->inq_dtype) {
2730 		case DTYPE_DIRECT:
2731 			rval = DDI_PROBE_SUCCESS;
2732 			break;
2733 		case DTYPE_RODIRECT:
2734 			/* CDs etc. Can be removable media */
2735 			rval = DDI_PROBE_SUCCESS;
2736 			break;
2737 		case DTYPE_OPTICAL:
2738 			/*
2739 			 * Rewritable optical driver HP115AA
2740 			 * Can also be removable media
2741 			 */
2742 
2743 			/*
2744 			 * Do not attempt to bind to  DTYPE_OPTICAL if
2745 			 * pre solaris 9 sparc sd behavior is required
2746 			 *
2747 			 * If first time through and sd_dtype_optical_bind
2748 			 * has not been set in /etc/system check properties
2749 			 */
2750 
2751 			if (sd_dtype_optical_bind  < 0) {
2752 				sd_dtype_optical_bind = ddi_prop_get_int
2753 				    (DDI_DEV_T_ANY, devi, 0,
2754 				    "optical-device-bind", 1);
2755 			}
2756 
2757 			if (sd_dtype_optical_bind == 0) {
2758 				rval = DDI_PROBE_FAILURE;
2759 			} else {
2760 				rval = DDI_PROBE_SUCCESS;
2761 			}
2762 			break;
2763 
2764 		case DTYPE_NOTPRESENT:
2765 		default:
2766 			rval = DDI_PROBE_FAILURE;
2767 			break;
2768 		}
2769 		break;
2770 	default:
2771 		rval = DDI_PROBE_PARTIAL;
2772 		break;
2773 	}
2774 
2775 	/*
2776 	 * This routine checks for resource allocation prior to freeing,
2777 	 * so it will take care of the "smart probing" case where a
2778 	 * scsi_probe() may or may not have been issued and will *not*
2779 	 * free previously-freed resources.
2780 	 */
2781 	scsi_unprobe(devp);
2782 	return (rval);
2783 }
2784 
2785 
2786 /*
2787  *    Function: sdinfo
2788  *
2789  * Description: This is the driver getinfo(9e) entry point function.
2790  * 		Given the device number, return the devinfo pointer from
2791  *		the scsi_device structure or the instance number
2792  *		associated with the dev_t.
2793  *
2794  *   Arguments: dip     - pointer to device info structure
2795  *		infocmd - command argument (DDI_INFO_DEVT2DEVINFO,
2796  *			  DDI_INFO_DEVT2INSTANCE)
2797  *		arg     - driver dev_t
2798  *		resultp - user buffer for request response
2799  *
2800  * Return Code: DDI_SUCCESS
2801  *              DDI_FAILURE
2802  */
2803 /* ARGSUSED */
2804 static int
2805 sdinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
2806 {
2807 	struct sd_lun	*un;
2808 	dev_t		dev;
2809 	int		instance;
2810 	int		error;
2811 
2812 	switch (infocmd) {
2813 	case DDI_INFO_DEVT2DEVINFO:
2814 		dev = (dev_t)arg;
2815 		instance = SDUNIT(dev);
2816 		if ((un = ddi_get_soft_state(sd_state, instance)) == NULL) {
2817 			return (DDI_FAILURE);
2818 		}
2819 		*result = (void *) SD_DEVINFO(un);
2820 		error = DDI_SUCCESS;
2821 		break;
2822 	case DDI_INFO_DEVT2INSTANCE:
2823 		dev = (dev_t)arg;
2824 		instance = SDUNIT(dev);
2825 		*result = (void *)(uintptr_t)instance;
2826 		error = DDI_SUCCESS;
2827 		break;
2828 	default:
2829 		error = DDI_FAILURE;
2830 	}
2831 	return (error);
2832 }
2833 
2834 /*
2835  *    Function: sd_prop_op
2836  *
2837  * Description: This is the driver prop_op(9e) entry point function.
2838  *		Return the number of blocks for the partition in question
2839  *		or forward the request to the property facilities.
2840  *
2841  *   Arguments: dev       - device number
2842  *		dip       - pointer to device info structure
2843  *		prop_op   - property operator
2844  *		mod_flags - DDI_PROP_DONTPASS, don't pass to parent
2845  *		name      - pointer to property name
2846  *		valuep    - pointer or address of the user buffer
2847  *		lengthp   - property length
2848  *
2849  * Return Code: DDI_PROP_SUCCESS
2850  *              DDI_PROP_NOT_FOUND
2851  *              DDI_PROP_UNDEFINED
2852  *              DDI_PROP_NO_MEMORY
2853  *              DDI_PROP_BUF_TOO_SMALL
2854  */
2855 
2856 static int
2857 sd_prop_op(dev_t dev, dev_info_t *dip, ddi_prop_op_t prop_op, int mod_flags,
2858     char *name, caddr_t valuep, int *lengthp)
2859 {
2860 	struct sd_lun	*un;
2861 
2862 	if ((un = ddi_get_soft_state(sd_state, ddi_get_instance(dip))) == NULL)
2863 		return (ddi_prop_op(dev, dip, prop_op, mod_flags,
2864 		    name, valuep, lengthp));
2865 
2866 	return (cmlb_prop_op(un->un_cmlbhandle,
2867 	    dev, dip, prop_op, mod_flags, name, valuep, lengthp,
2868 	    SDPART(dev), (void *)SD_PATH_DIRECT));
2869 }
2870 
2871 /*
2872  * The following functions are for smart probing:
2873  * sd_scsi_probe_cache_init()
2874  * sd_scsi_probe_cache_fini()
2875  * sd_scsi_clear_probe_cache()
2876  * sd_scsi_probe_with_cache()
2877  */
2878 
2879 /*
2880  *    Function: sd_scsi_probe_cache_init
2881  *
2882  * Description: Initializes the probe response cache mutex and head pointer.
2883  *
2884  *     Context: Kernel thread context
2885  */
2886 
2887 static void
2888 sd_scsi_probe_cache_init(void)
2889 {
2890 	mutex_init(&sd_scsi_probe_cache_mutex, NULL, MUTEX_DRIVER, NULL);
2891 	sd_scsi_probe_cache_head = NULL;
2892 }
2893 
2894 
2895 /*
2896  *    Function: sd_scsi_probe_cache_fini
2897  *
2898  * Description: Frees all resources associated with the probe response cache.
2899  *
2900  *     Context: Kernel thread context
2901  */
2902 
2903 static void
2904 sd_scsi_probe_cache_fini(void)
2905 {
2906 	struct sd_scsi_probe_cache *cp;
2907 	struct sd_scsi_probe_cache *ncp;
2908 
2909 	/* Clean up our smart probing linked list */
2910 	for (cp = sd_scsi_probe_cache_head; cp != NULL; cp = ncp) {
2911 		ncp = cp->next;
2912 		kmem_free(cp, sizeof (struct sd_scsi_probe_cache));
2913 	}
2914 	sd_scsi_probe_cache_head = NULL;
2915 	mutex_destroy(&sd_scsi_probe_cache_mutex);
2916 }
2917 
2918 
2919 /*
2920  *    Function: sd_scsi_clear_probe_cache
2921  *
2922  * Description: This routine clears the probe response cache. This is
2923  *		done when open() returns ENXIO so that when deferred
2924  *		attach is attempted (possibly after a device has been
2925  *		turned on) we will retry the probe. Since we don't know
2926  *		which target we failed to open, we just clear the
2927  *		entire cache.
2928  *
2929  *     Context: Kernel thread context
2930  */
2931 
2932 static void
2933 sd_scsi_clear_probe_cache(void)
2934 {
2935 	struct sd_scsi_probe_cache	*cp;
2936 	int				i;
2937 
2938 	mutex_enter(&sd_scsi_probe_cache_mutex);
2939 	for (cp = sd_scsi_probe_cache_head; cp != NULL; cp = cp->next) {
2940 		/*
2941 		 * Reset all entries to SCSIPROBE_EXISTS.  This will
2942 		 * force probing to be performed the next time
2943 		 * sd_scsi_probe_with_cache is called.
2944 		 */
2945 		for (i = 0; i < NTARGETS_WIDE; i++) {
2946 			cp->cache[i] = SCSIPROBE_EXISTS;
2947 		}
2948 	}
2949 	mutex_exit(&sd_scsi_probe_cache_mutex);
2950 }
2951 
2952 
2953 /*
2954  *    Function: sd_scsi_probe_with_cache
2955  *
2956  * Description: This routine implements support for a scsi device probe
2957  *		with cache. The driver maintains a cache of the target
2958  *		responses to scsi probes. If we get no response from a
2959  *		target during a probe inquiry, we remember that, and we
2960  *		avoid additional calls to scsi_probe on non-zero LUNs
2961  *		on the same target until the cache is cleared. By doing
2962  *		so we avoid the 1/4 sec selection timeout for nonzero
2963  *		LUNs. lun0 of a target is always probed.
2964  *
2965  *   Arguments: devp     - Pointer to a scsi_device(9S) structure
2966  *              waitfunc - indicates what the allocator routines should
2967  *			   do when resources are not available. This value
2968  *			   is passed on to scsi_probe() when that routine
2969  *			   is called.
2970  *
2971  * Return Code: SCSIPROBE_NORESP if a NORESP in probe response cache;
2972  *		otherwise the value returned by scsi_probe(9F).
2973  *
2974  *     Context: Kernel thread context
2975  */
2976 
2977 static int
2978 sd_scsi_probe_with_cache(struct scsi_device *devp, int (*waitfn)())
2979 {
2980 	struct sd_scsi_probe_cache	*cp;
2981 	dev_info_t	*pdip = ddi_get_parent(devp->sd_dev);
2982 	int		lun, tgt;
2983 
2984 	lun = ddi_prop_get_int(DDI_DEV_T_ANY, devp->sd_dev, DDI_PROP_DONTPASS,
2985 	    SCSI_ADDR_PROP_LUN, 0);
2986 	tgt = ddi_prop_get_int(DDI_DEV_T_ANY, devp->sd_dev, DDI_PROP_DONTPASS,
2987 	    SCSI_ADDR_PROP_TARGET, -1);
2988 
2989 	/* Make sure caching enabled and target in range */
2990 	if ((tgt < 0) || (tgt >= NTARGETS_WIDE)) {
2991 		/* do it the old way (no cache) */
2992 		return (scsi_probe(devp, waitfn));
2993 	}
2994 
2995 	mutex_enter(&sd_scsi_probe_cache_mutex);
2996 
2997 	/* Find the cache for this scsi bus instance */
2998 	for (cp = sd_scsi_probe_cache_head; cp != NULL; cp = cp->next) {
2999 		if (cp->pdip == pdip) {
3000 			break;
3001 		}
3002 	}
3003 
3004 	/* If we can't find a cache for this pdip, create one */
3005 	if (cp == NULL) {
3006 		int i;
3007 
3008 		cp = kmem_zalloc(sizeof (struct sd_scsi_probe_cache),
3009 		    KM_SLEEP);
3010 		cp->pdip = pdip;
3011 		cp->next = sd_scsi_probe_cache_head;
3012 		sd_scsi_probe_cache_head = cp;
3013 		for (i = 0; i < NTARGETS_WIDE; i++) {
3014 			cp->cache[i] = SCSIPROBE_EXISTS;
3015 		}
3016 	}
3017 
3018 	mutex_exit(&sd_scsi_probe_cache_mutex);
3019 
3020 	/* Recompute the cache for this target if LUN zero */
3021 	if (lun == 0) {
3022 		cp->cache[tgt] = SCSIPROBE_EXISTS;
3023 	}
3024 
3025 	/* Don't probe if cache remembers a NORESP from a previous LUN. */
3026 	if (cp->cache[tgt] != SCSIPROBE_EXISTS) {
3027 		return (SCSIPROBE_NORESP);
3028 	}
3029 
3030 	/* Do the actual probe; save & return the result */
3031 	return (cp->cache[tgt] = scsi_probe(devp, waitfn));
3032 }
3033 
3034 
3035 /*
3036  *    Function: sd_scsi_target_lun_init
3037  *
3038  * Description: Initializes the attached lun chain mutex and head pointer.
3039  *
3040  *     Context: Kernel thread context
3041  */
3042 
3043 static void
3044 sd_scsi_target_lun_init(void)
3045 {
3046 	mutex_init(&sd_scsi_target_lun_mutex, NULL, MUTEX_DRIVER, NULL);
3047 	sd_scsi_target_lun_head = NULL;
3048 }
3049 
3050 
3051 /*
3052  *    Function: sd_scsi_target_lun_fini
3053  *
3054  * Description: Frees all resources associated with the attached lun
3055  *              chain
3056  *
3057  *     Context: Kernel thread context
3058  */
3059 
3060 static void
3061 sd_scsi_target_lun_fini(void)
3062 {
3063 	struct sd_scsi_hba_tgt_lun	*cp;
3064 	struct sd_scsi_hba_tgt_lun	*ncp;
3065 
3066 	for (cp = sd_scsi_target_lun_head; cp != NULL; cp = ncp) {
3067 		ncp = cp->next;
3068 		kmem_free(cp, sizeof (struct sd_scsi_hba_tgt_lun));
3069 	}
3070 	sd_scsi_target_lun_head = NULL;
3071 	mutex_destroy(&sd_scsi_target_lun_mutex);
3072 }
3073 
3074 
3075 /*
3076  *    Function: sd_scsi_get_target_lun_count
3077  *
3078  * Description: This routine will check in the attached lun chain to see
3079  * 		how many luns are attached on the required SCSI controller
3080  * 		and target. Currently, some capabilities like tagged queue
3081  *		are supported per target based by HBA. So all luns in a
3082  *		target have the same capabilities. Based on this assumption,
3083  * 		sd should only set these capabilities once per target. This
3084  *		function is called when sd needs to decide how many luns
3085  *		already attached on a target.
3086  *
3087  *   Arguments: dip	- Pointer to the system's dev_info_t for the SCSI
3088  *			  controller device.
3089  *              target	- The target ID on the controller's SCSI bus.
3090  *
3091  * Return Code: The number of luns attached on the required target and
3092  *		controller.
3093  *		-1 if target ID is not in parallel SCSI scope or the given
3094  * 		dip is not in the chain.
3095  *
3096  *     Context: Kernel thread context
3097  */
3098 
3099 static int
3100 sd_scsi_get_target_lun_count(dev_info_t *dip, int target)
3101 {
3102 	struct sd_scsi_hba_tgt_lun	*cp;
3103 
3104 	if ((target < 0) || (target >= NTARGETS_WIDE)) {
3105 		return (-1);
3106 	}
3107 
3108 	mutex_enter(&sd_scsi_target_lun_mutex);
3109 
3110 	for (cp = sd_scsi_target_lun_head; cp != NULL; cp = cp->next) {
3111 		if (cp->pdip == dip) {
3112 			break;
3113 		}
3114 	}
3115 
3116 	mutex_exit(&sd_scsi_target_lun_mutex);
3117 
3118 	if (cp == NULL) {
3119 		return (-1);
3120 	}
3121 
3122 	return (cp->nlun[target]);
3123 }
3124 
3125 
3126 /*
3127  *    Function: sd_scsi_update_lun_on_target
3128  *
3129  * Description: This routine is used to update the attached lun chain when a
3130  *		lun is attached or detached on a target.
3131  *
3132  *   Arguments: dip     - Pointer to the system's dev_info_t for the SCSI
3133  *                        controller device.
3134  *              target  - The target ID on the controller's SCSI bus.
3135  *		flag	- Indicate the lun is attached or detached.
3136  *
3137  *     Context: Kernel thread context
3138  */
3139 
3140 static void
3141 sd_scsi_update_lun_on_target(dev_info_t *dip, int target, int flag)
3142 {
3143 	struct sd_scsi_hba_tgt_lun	*cp;
3144 
3145 	mutex_enter(&sd_scsi_target_lun_mutex);
3146 
3147 	for (cp = sd_scsi_target_lun_head; cp != NULL; cp = cp->next) {
3148 		if (cp->pdip == dip) {
3149 			break;
3150 		}
3151 	}
3152 
3153 	if ((cp == NULL) && (flag == SD_SCSI_LUN_ATTACH)) {
3154 		cp = kmem_zalloc(sizeof (struct sd_scsi_hba_tgt_lun),
3155 		    KM_SLEEP);
3156 		cp->pdip = dip;
3157 		cp->next = sd_scsi_target_lun_head;
3158 		sd_scsi_target_lun_head = cp;
3159 	}
3160 
3161 	mutex_exit(&sd_scsi_target_lun_mutex);
3162 
3163 	if (cp != NULL) {
3164 		if (flag == SD_SCSI_LUN_ATTACH) {
3165 			cp->nlun[target] ++;
3166 		} else {
3167 			cp->nlun[target] --;
3168 		}
3169 	}
3170 }
3171 
3172 
3173 /*
3174  *    Function: sd_spin_up_unit
3175  *
3176  * Description: Issues the following commands to spin-up the device:
3177  *		START STOP UNIT, and INQUIRY.
3178  *
3179  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
3180  *                      structure for this target.
3181  *
3182  * Return Code: 0 - success
3183  *		EIO - failure
3184  *		EACCES - reservation conflict
3185  *
3186  *     Context: Kernel thread context
3187  */
3188 
3189 static int
3190 sd_spin_up_unit(sd_ssc_t *ssc)
3191 {
3192 	size_t	resid		= 0;
3193 	int	has_conflict	= FALSE;
3194 	uchar_t *bufaddr;
3195 	int 	status;
3196 	struct sd_lun	*un;
3197 
3198 	ASSERT(ssc != NULL);
3199 	un = ssc->ssc_un;
3200 	ASSERT(un != NULL);
3201 
3202 	/*
3203 	 * Send a throwaway START UNIT command.
3204 	 *
3205 	 * If we fail on this, we don't care presently what precisely
3206 	 * is wrong.  EMC's arrays will also fail this with a check
3207 	 * condition (0x2/0x4/0x3) if the device is "inactive," but
3208 	 * we don't want to fail the attach because it may become
3209 	 * "active" later.
3210 	 * We don't know if power condition is supported or not at
3211 	 * this stage, use START STOP bit.
3212 	 */
3213 	status = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
3214 	    SD_TARGET_START, SD_PATH_DIRECT);
3215 
3216 	if (status != 0) {
3217 		if (status == EACCES)
3218 			has_conflict = TRUE;
3219 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3220 	}
3221 
3222 	/*
3223 	 * Send another INQUIRY command to the target. This is necessary for
3224 	 * non-removable media direct access devices because their INQUIRY data
3225 	 * may not be fully qualified until they are spun up (perhaps via the
3226 	 * START command above).  Note: This seems to be needed for some
3227 	 * legacy devices only.) The INQUIRY command should succeed even if a
3228 	 * Reservation Conflict is present.
3229 	 */
3230 	bufaddr = kmem_zalloc(SUN_INQSIZE, KM_SLEEP);
3231 
3232 	if (sd_send_scsi_INQUIRY(ssc, bufaddr, SUN_INQSIZE, 0, 0, &resid)
3233 	    != 0) {
3234 		kmem_free(bufaddr, SUN_INQSIZE);
3235 		sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
3236 		return (EIO);
3237 	}
3238 
3239 	/*
3240 	 * If we got enough INQUIRY data, copy it over the old INQUIRY data.
3241 	 * Note that this routine does not return a failure here even if the
3242 	 * INQUIRY command did not return any data.  This is a legacy behavior.
3243 	 */
3244 	if ((SUN_INQSIZE - resid) >= SUN_MIN_INQLEN) {
3245 		bcopy(bufaddr, SD_INQUIRY(un), SUN_INQSIZE);
3246 	}
3247 
3248 	kmem_free(bufaddr, SUN_INQSIZE);
3249 
3250 	/* If we hit a reservation conflict above, tell the caller. */
3251 	if (has_conflict == TRUE) {
3252 		return (EACCES);
3253 	}
3254 
3255 	return (0);
3256 }
3257 
3258 #ifdef _LP64
3259 /*
3260  *    Function: sd_enable_descr_sense
3261  *
3262  * Description: This routine attempts to select descriptor sense format
3263  *		using the Control mode page.  Devices that support 64 bit
3264  *		LBAs (for >2TB luns) should also implement descriptor
3265  *		sense data so we will call this function whenever we see
3266  *		a lun larger than 2TB.  If for some reason the device
3267  *		supports 64 bit LBAs but doesn't support descriptor sense
3268  *		presumably the mode select will fail.  Everything will
3269  *		continue to work normally except that we will not get
3270  *		complete sense data for commands that fail with an LBA
3271  *		larger than 32 bits.
3272  *
3273  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
3274  *                      structure for this target.
3275  *
3276  *     Context: Kernel thread context only
3277  */
3278 
3279 static void
3280 sd_enable_descr_sense(sd_ssc_t *ssc)
3281 {
3282 	uchar_t			*header;
3283 	struct mode_control_scsi3 *ctrl_bufp;
3284 	size_t			buflen;
3285 	size_t			bd_len;
3286 	int			status;
3287 	struct sd_lun		*un;
3288 
3289 	ASSERT(ssc != NULL);
3290 	un = ssc->ssc_un;
3291 	ASSERT(un != NULL);
3292 
3293 	/*
3294 	 * Read MODE SENSE page 0xA, Control Mode Page
3295 	 */
3296 	buflen = MODE_HEADER_LENGTH + MODE_BLK_DESC_LENGTH +
3297 	    sizeof (struct mode_control_scsi3);
3298 	header = kmem_zalloc(buflen, KM_SLEEP);
3299 
3300 	status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, header, buflen,
3301 	    MODEPAGE_CTRL_MODE, SD_PATH_DIRECT);
3302 
3303 	if (status != 0) {
3304 		SD_ERROR(SD_LOG_COMMON, un,
3305 		    "sd_enable_descr_sense: mode sense ctrl page failed\n");
3306 		goto eds_exit;
3307 	}
3308 
3309 	/*
3310 	 * Determine size of Block Descriptors in order to locate
3311 	 * the mode page data. ATAPI devices return 0, SCSI devices
3312 	 * should return MODE_BLK_DESC_LENGTH.
3313 	 */
3314 	bd_len  = ((struct mode_header *)header)->bdesc_length;
3315 
3316 	/* Clear the mode data length field for MODE SELECT */
3317 	((struct mode_header *)header)->length = 0;
3318 
3319 	ctrl_bufp = (struct mode_control_scsi3 *)
3320 	    (header + MODE_HEADER_LENGTH + bd_len);
3321 
3322 	/*
3323 	 * If the page length is smaller than the expected value,
3324 	 * the target device doesn't support D_SENSE. Bail out here.
3325 	 */
3326 	if (ctrl_bufp->mode_page.length <
3327 	    sizeof (struct mode_control_scsi3) - 2) {
3328 		SD_ERROR(SD_LOG_COMMON, un,
3329 		    "sd_enable_descr_sense: enable D_SENSE failed\n");
3330 		goto eds_exit;
3331 	}
3332 
3333 	/*
3334 	 * Clear PS bit for MODE SELECT
3335 	 */
3336 	ctrl_bufp->mode_page.ps = 0;
3337 
3338 	/*
3339 	 * Set D_SENSE to enable descriptor sense format.
3340 	 */
3341 	ctrl_bufp->d_sense = 1;
3342 
3343 	sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3344 
3345 	/*
3346 	 * Use MODE SELECT to commit the change to the D_SENSE bit
3347 	 */
3348 	status = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, header,
3349 	    buflen, SD_DONTSAVE_PAGE, SD_PATH_DIRECT);
3350 
3351 	if (status != 0) {
3352 		SD_INFO(SD_LOG_COMMON, un,
3353 		    "sd_enable_descr_sense: mode select ctrl page failed\n");
3354 	} else {
3355 		kmem_free(header, buflen);
3356 		return;
3357 	}
3358 
3359 eds_exit:
3360 	sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3361 	kmem_free(header, buflen);
3362 }
3363 
3364 /*
3365  *    Function: sd_reenable_dsense_task
3366  *
3367  * Description: Re-enable descriptor sense after device or bus reset
3368  *
3369  *     Context: Executes in a taskq() thread context
3370  */
3371 static void
3372 sd_reenable_dsense_task(void *arg)
3373 {
3374 	struct	sd_lun	*un = arg;
3375 	sd_ssc_t	*ssc;
3376 
3377 	ASSERT(un != NULL);
3378 
3379 	ssc = sd_ssc_init(un);
3380 	sd_enable_descr_sense(ssc);
3381 	sd_ssc_fini(ssc);
3382 }
3383 #endif /* _LP64 */
3384 
3385 /*
3386  *    Function: sd_set_mmc_caps
3387  *
3388  * Description: This routine determines if the device is MMC compliant and if
3389  *		the device supports CDDA via a mode sense of the CDVD
3390  *		capabilities mode page. Also checks if the device is a
3391  *		dvdram writable device.
3392  *
3393  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
3394  *                      structure for this target.
3395  *
3396  *     Context: Kernel thread context only
3397  */
3398 
3399 static void
3400 sd_set_mmc_caps(sd_ssc_t *ssc)
3401 {
3402 	struct mode_header_grp2		*sense_mhp;
3403 	uchar_t				*sense_page;
3404 	caddr_t				buf;
3405 	int				bd_len;
3406 	int				status;
3407 	struct uscsi_cmd		com;
3408 	int				rtn;
3409 	uchar_t				*out_data_rw, *out_data_hd;
3410 	uchar_t				*rqbuf_rw, *rqbuf_hd;
3411 	uchar_t				*out_data_gesn;
3412 	int				gesn_len;
3413 	struct sd_lun			*un;
3414 
3415 	ASSERT(ssc != NULL);
3416 	un = ssc->ssc_un;
3417 	ASSERT(un != NULL);
3418 
3419 	/*
3420 	 * The flags which will be set in this function are - mmc compliant,
3421 	 * dvdram writable device, cdda support. Initialize them to FALSE
3422 	 * and if a capability is detected - it will be set to TRUE.
3423 	 */
3424 	un->un_f_mmc_cap = FALSE;
3425 	un->un_f_dvdram_writable_device = FALSE;
3426 	un->un_f_cfg_cdda = FALSE;
3427 
3428 	buf = kmem_zalloc(BUFLEN_MODE_CDROM_CAP, KM_SLEEP);
3429 	status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, (uchar_t *)buf,
3430 	    BUFLEN_MODE_CDROM_CAP, MODEPAGE_CDROM_CAP, SD_PATH_DIRECT);
3431 
3432 	sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3433 
3434 	if (status != 0) {
3435 		/* command failed; just return */
3436 		kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3437 		return;
3438 	}
3439 	/*
3440 	 * If the mode sense request for the CDROM CAPABILITIES
3441 	 * page (0x2A) succeeds the device is assumed to be MMC.
3442 	 */
3443 	un->un_f_mmc_cap = TRUE;
3444 
3445 	/* See if GET STATUS EVENT NOTIFICATION is supported */
3446 	if (un->un_f_mmc_gesn_polling) {
3447 		gesn_len = SD_GESN_HEADER_LEN + SD_GESN_MEDIA_DATA_LEN;
3448 		out_data_gesn = kmem_zalloc(gesn_len, KM_SLEEP);
3449 
3450 		rtn = sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION(ssc,
3451 		    out_data_gesn, gesn_len, 1 << SD_GESN_MEDIA_CLASS);
3452 
3453 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3454 
3455 		if ((rtn != 0) || !sd_gesn_media_data_valid(out_data_gesn)) {
3456 			un->un_f_mmc_gesn_polling = FALSE;
3457 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
3458 			    "sd_set_mmc_caps: gesn not supported "
3459 			    "%d %x %x %x %x\n", rtn,
3460 			    out_data_gesn[0], out_data_gesn[1],
3461 			    out_data_gesn[2], out_data_gesn[3]);
3462 		}
3463 
3464 		kmem_free(out_data_gesn, gesn_len);
3465 	}
3466 
3467 	/* Get to the page data */
3468 	sense_mhp = (struct mode_header_grp2 *)buf;
3469 	bd_len = (sense_mhp->bdesc_length_hi << 8) |
3470 	    sense_mhp->bdesc_length_lo;
3471 	if (bd_len > MODE_BLK_DESC_LENGTH) {
3472 		/*
3473 		 * We did not get back the expected block descriptor
3474 		 * length so we cannot determine if the device supports
3475 		 * CDDA. However, we still indicate the device is MMC
3476 		 * according to the successful response to the page
3477 		 * 0x2A mode sense request.
3478 		 */
3479 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
3480 		    "sd_set_mmc_caps: Mode Sense returned "
3481 		    "invalid block descriptor length\n");
3482 		kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3483 		return;
3484 	}
3485 
3486 	/* See if read CDDA is supported */
3487 	sense_page = (uchar_t *)(buf + MODE_HEADER_LENGTH_GRP2 +
3488 	    bd_len);
3489 	un->un_f_cfg_cdda = (sense_page[5] & 0x01) ? TRUE : FALSE;
3490 
3491 	/* See if writing DVD RAM is supported. */
3492 	un->un_f_dvdram_writable_device = (sense_page[3] & 0x20) ? TRUE : FALSE;
3493 	if (un->un_f_dvdram_writable_device == TRUE) {
3494 		kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3495 		return;
3496 	}
3497 
3498 	/*
3499 	 * If the device presents DVD or CD capabilities in the mode
3500 	 * page, we can return here since a RRD will not have
3501 	 * these capabilities.
3502 	 */
3503 	if ((sense_page[2] & 0x3f) || (sense_page[3] & 0x3f)) {
3504 		kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3505 		return;
3506 	}
3507 	kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3508 
3509 	/*
3510 	 * If un->un_f_dvdram_writable_device is still FALSE,
3511 	 * check for a Removable Rigid Disk (RRD).  A RRD
3512 	 * device is identified by the features RANDOM_WRITABLE and
3513 	 * HARDWARE_DEFECT_MANAGEMENT.
3514 	 */
3515 	out_data_rw = kmem_zalloc(SD_CURRENT_FEATURE_LEN, KM_SLEEP);
3516 	rqbuf_rw = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
3517 
3518 	rtn = sd_send_scsi_feature_GET_CONFIGURATION(ssc, &com, rqbuf_rw,
3519 	    SENSE_LENGTH, out_data_rw, SD_CURRENT_FEATURE_LEN,
3520 	    RANDOM_WRITABLE, SD_PATH_STANDARD);
3521 
3522 	sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3523 
3524 	if (rtn != 0) {
3525 		kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN);
3526 		kmem_free(rqbuf_rw, SENSE_LENGTH);
3527 		return;
3528 	}
3529 
3530 	out_data_hd = kmem_zalloc(SD_CURRENT_FEATURE_LEN, KM_SLEEP);
3531 	rqbuf_hd = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
3532 
3533 	rtn = sd_send_scsi_feature_GET_CONFIGURATION(ssc, &com, rqbuf_hd,
3534 	    SENSE_LENGTH, out_data_hd, SD_CURRENT_FEATURE_LEN,
3535 	    HARDWARE_DEFECT_MANAGEMENT, SD_PATH_STANDARD);
3536 
3537 	sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3538 
3539 	if (rtn == 0) {
3540 		/*
3541 		 * We have good information, check for random writable
3542 		 * and hardware defect features.
3543 		 */
3544 		if ((out_data_rw[9] & RANDOM_WRITABLE) &&
3545 		    (out_data_hd[9] & HARDWARE_DEFECT_MANAGEMENT)) {
3546 			un->un_f_dvdram_writable_device = TRUE;
3547 		}
3548 	}
3549 
3550 	kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN);
3551 	kmem_free(rqbuf_rw, SENSE_LENGTH);
3552 	kmem_free(out_data_hd, SD_CURRENT_FEATURE_LEN);
3553 	kmem_free(rqbuf_hd, SENSE_LENGTH);
3554 }
3555 
3556 /*
3557  *    Function: sd_check_for_writable_cd
3558  *
3559  * Description: This routine determines if the media in the device is
3560  *		writable or not. It uses the get configuration command (0x46)
3561  *		to determine if the media is writable
3562  *
3563  *   Arguments: un - driver soft state (unit) structure
3564  *              path_flag - SD_PATH_DIRECT to use the USCSI "direct"
3565  *                           chain and the normal command waitq, or
3566  *                           SD_PATH_DIRECT_PRIORITY to use the USCSI
3567  *                           "direct" chain and bypass the normal command
3568  *                           waitq.
3569  *
3570  *     Context: Never called at interrupt context.
3571  */
3572 
3573 static void
3574 sd_check_for_writable_cd(sd_ssc_t *ssc, int path_flag)
3575 {
3576 	struct uscsi_cmd		com;
3577 	uchar_t				*out_data;
3578 	uchar_t				*rqbuf;
3579 	int				rtn;
3580 	uchar_t				*out_data_rw, *out_data_hd;
3581 	uchar_t				*rqbuf_rw, *rqbuf_hd;
3582 	struct mode_header_grp2		*sense_mhp;
3583 	uchar_t				*sense_page;
3584 	caddr_t				buf;
3585 	int				bd_len;
3586 	int				status;
3587 	struct sd_lun			*un;
3588 
3589 	ASSERT(ssc != NULL);
3590 	un = ssc->ssc_un;
3591 	ASSERT(un != NULL);
3592 	ASSERT(mutex_owned(SD_MUTEX(un)));
3593 
3594 	/*
3595 	 * Initialize the writable media to false, if configuration info.
3596 	 * tells us otherwise then only we will set it.
3597 	 */
3598 	un->un_f_mmc_writable_media = FALSE;
3599 	mutex_exit(SD_MUTEX(un));
3600 
3601 	out_data = kmem_zalloc(SD_PROFILE_HEADER_LEN, KM_SLEEP);
3602 	rqbuf = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
3603 
3604 	rtn = sd_send_scsi_GET_CONFIGURATION(ssc, &com, rqbuf, SENSE_LENGTH,
3605 	    out_data, SD_PROFILE_HEADER_LEN, path_flag);
3606 
3607 	if (rtn != 0)
3608 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3609 
3610 	mutex_enter(SD_MUTEX(un));
3611 	if (rtn == 0) {
3612 		/*
3613 		 * We have good information, check for writable DVD.
3614 		 */
3615 		if ((out_data[6] == 0) && (out_data[7] == 0x12)) {
3616 			un->un_f_mmc_writable_media = TRUE;
3617 			kmem_free(out_data, SD_PROFILE_HEADER_LEN);
3618 			kmem_free(rqbuf, SENSE_LENGTH);
3619 			return;
3620 		}
3621 	}
3622 
3623 	kmem_free(out_data, SD_PROFILE_HEADER_LEN);
3624 	kmem_free(rqbuf, SENSE_LENGTH);
3625 
3626 	/*
3627 	 * Determine if this is a RRD type device.
3628 	 */
3629 	mutex_exit(SD_MUTEX(un));
3630 	buf = kmem_zalloc(BUFLEN_MODE_CDROM_CAP, KM_SLEEP);
3631 	status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, (uchar_t *)buf,
3632 	    BUFLEN_MODE_CDROM_CAP, MODEPAGE_CDROM_CAP, path_flag);
3633 
3634 	sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3635 
3636 	mutex_enter(SD_MUTEX(un));
3637 	if (status != 0) {
3638 		/* command failed; just return */
3639 		kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3640 		return;
3641 	}
3642 
3643 	/* Get to the page data */
3644 	sense_mhp = (struct mode_header_grp2 *)buf;
3645 	bd_len = (sense_mhp->bdesc_length_hi << 8) | sense_mhp->bdesc_length_lo;
3646 	if (bd_len > MODE_BLK_DESC_LENGTH) {
3647 		/*
3648 		 * We did not get back the expected block descriptor length so
3649 		 * we cannot check the mode page.
3650 		 */
3651 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
3652 		    "sd_check_for_writable_cd: Mode Sense returned "
3653 		    "invalid block descriptor length\n");
3654 		kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3655 		return;
3656 	}
3657 
3658 	/*
3659 	 * If the device presents DVD or CD capabilities in the mode
3660 	 * page, we can return here since a RRD device will not have
3661 	 * these capabilities.
3662 	 */
3663 	sense_page = (uchar_t *)(buf + MODE_HEADER_LENGTH_GRP2 + bd_len);
3664 	if ((sense_page[2] & 0x3f) || (sense_page[3] & 0x3f)) {
3665 		kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3666 		return;
3667 	}
3668 	kmem_free(buf, BUFLEN_MODE_CDROM_CAP);
3669 
3670 	/*
3671 	 * If un->un_f_mmc_writable_media is still FALSE,
3672 	 * check for RRD type media.  A RRD device is identified
3673 	 * by the features RANDOM_WRITABLE and HARDWARE_DEFECT_MANAGEMENT.
3674 	 */
3675 	mutex_exit(SD_MUTEX(un));
3676 	out_data_rw = kmem_zalloc(SD_CURRENT_FEATURE_LEN, KM_SLEEP);
3677 	rqbuf_rw = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
3678 
3679 	rtn = sd_send_scsi_feature_GET_CONFIGURATION(ssc, &com, rqbuf_rw,
3680 	    SENSE_LENGTH, out_data_rw, SD_CURRENT_FEATURE_LEN,
3681 	    RANDOM_WRITABLE, path_flag);
3682 
3683 	sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3684 	if (rtn != 0) {
3685 		kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN);
3686 		kmem_free(rqbuf_rw, SENSE_LENGTH);
3687 		mutex_enter(SD_MUTEX(un));
3688 		return;
3689 	}
3690 
3691 	out_data_hd = kmem_zalloc(SD_CURRENT_FEATURE_LEN, KM_SLEEP);
3692 	rqbuf_hd = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
3693 
3694 	rtn = sd_send_scsi_feature_GET_CONFIGURATION(ssc, &com, rqbuf_hd,
3695 	    SENSE_LENGTH, out_data_hd, SD_CURRENT_FEATURE_LEN,
3696 	    HARDWARE_DEFECT_MANAGEMENT, path_flag);
3697 
3698 	sd_ssc_assessment(ssc, SD_FMT_IGNORE);
3699 	mutex_enter(SD_MUTEX(un));
3700 	if (rtn == 0) {
3701 		/*
3702 		 * We have good information, check for random writable
3703 		 * and hardware defect features as current.
3704 		 */
3705 		if ((out_data_rw[9] & RANDOM_WRITABLE) &&
3706 		    (out_data_rw[10] & 0x1) &&
3707 		    (out_data_hd[9] & HARDWARE_DEFECT_MANAGEMENT) &&
3708 		    (out_data_hd[10] & 0x1)) {
3709 			un->un_f_mmc_writable_media = TRUE;
3710 		}
3711 	}
3712 
3713 	kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN);
3714 	kmem_free(rqbuf_rw, SENSE_LENGTH);
3715 	kmem_free(out_data_hd, SD_CURRENT_FEATURE_LEN);
3716 	kmem_free(rqbuf_hd, SENSE_LENGTH);
3717 }
3718 
3719 /*
3720  *    Function: sd_read_unit_properties
3721  *
3722  * Description: The following implements a property lookup mechanism.
3723  *		Properties for particular disks (keyed on vendor, model
3724  *		and rev numbers) are sought in the sd.conf file via
3725  *		sd_process_sdconf_file(), and if not found there, are
3726  *		looked for in a list hardcoded in this driver via
3727  *		sd_process_sdconf_table() Once located the properties
3728  *		are used to update the driver unit structure.
3729  *
3730  *   Arguments: un - driver soft state (unit) structure
3731  */
3732 
3733 static void
3734 sd_read_unit_properties(struct sd_lun *un)
3735 {
3736 	/*
3737 	 * sd_process_sdconf_file returns SD_FAILURE if it cannot find
3738 	 * the "sd-config-list" property (from the sd.conf file) or if
3739 	 * there was not a match for the inquiry vid/pid. If this event
3740 	 * occurs the static driver configuration table is searched for
3741 	 * a match.
3742 	 */
3743 	ASSERT(un != NULL);
3744 	if (sd_process_sdconf_file(un) == SD_FAILURE) {
3745 		sd_process_sdconf_table(un);
3746 	}
3747 
3748 	/* check for LSI device */
3749 	sd_is_lsi(un);
3750 
3751 
3752 }
3753 
3754 
3755 /*
3756  *    Function: sd_process_sdconf_file
3757  *
3758  * Description: Use ddi_prop_lookup(9F) to obtain the properties from the
3759  *		driver's config file (ie, sd.conf) and update the driver
3760  *		soft state structure accordingly.
3761  *
3762  *   Arguments: un - driver soft state (unit) structure
3763  *
3764  * Return Code: SD_SUCCESS - The properties were successfully set according
3765  *			     to the driver configuration file.
3766  *		SD_FAILURE - The driver config list was not obtained or
3767  *			     there was no vid/pid match. This indicates that
3768  *			     the static config table should be used.
3769  *
3770  * The config file has a property, "sd-config-list". Currently we support
3771  * two kinds of formats. For both formats, the value of this property
3772  * is a list of duplets:
3773  *
3774  *  sd-config-list=
3775  *	<duplet>,
3776  *	[,<duplet>]*;
3777  *
3778  * For the improved format, where
3779  *
3780  *     <duplet>:= "<vid+pid>","<tunable-list>"
3781  *
3782  * and
3783  *
3784  *     <tunable-list>:=   <tunable> [, <tunable> ]*;
3785  *     <tunable> =        <name> : <value>
3786  *
3787  * The <vid+pid> is the string that is returned by the target device on a
3788  * SCSI inquiry command, the <tunable-list> contains one or more tunables
3789  * to apply to all target devices with the specified <vid+pid>.
3790  *
3791  * Each <tunable> is a "<name> : <value>" pair.
3792  *
3793  * For the old format, the structure of each duplet is as follows:
3794  *
3795  *  <duplet>:= "<vid+pid>","<data-property-name_list>"
3796  *
3797  * The first entry of the duplet is the device ID string (the concatenated
3798  * vid & pid; not to be confused with a device_id).  This is defined in
3799  * the same way as in the sd_disk_table.
3800  *
3801  * The second part of the duplet is a string that identifies a
3802  * data-property-name-list. The data-property-name-list is defined as
3803  * follows:
3804  *
3805  *  <data-property-name-list>:=<data-property-name> [<data-property-name>]
3806  *
3807  * The syntax of <data-property-name> depends on the <version> field.
3808  *
3809  * If version = SD_CONF_VERSION_1 we have the following syntax:
3810  *
3811  * 	<data-property-name>:=<version>,<flags>,<prop0>,<prop1>,.....<propN>
3812  *
3813  * where the prop0 value will be used to set prop0 if bit0 set in the
3814  * flags, prop1 if bit1 set, etc. and N = SD_CONF_MAX_ITEMS -1
3815  *
3816  */
3817 
3818 static int
3819 sd_process_sdconf_file(struct sd_lun *un)
3820 {
3821 	char	**config_list = NULL;
3822 	uint_t	nelements;
3823 	char	*vidptr;
3824 	int	vidlen;
3825 	char	*dnlist_ptr;
3826 	char	*dataname_ptr;
3827 	char	*dataname_lasts;
3828 	int	*data_list = NULL;
3829 	uint_t	data_list_len;
3830 	int	rval = SD_FAILURE;
3831 	int	i;
3832 
3833 	ASSERT(un != NULL);
3834 
3835 	/* Obtain the configuration list associated with the .conf file */
3836 	if (ddi_prop_lookup_string_array(DDI_DEV_T_ANY, SD_DEVINFO(un),
3837 	    DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, sd_config_list,
3838 	    &config_list, &nelements) != DDI_PROP_SUCCESS) {
3839 		return (SD_FAILURE);
3840 	}
3841 
3842 	/*
3843 	 * Compare vids in each duplet to the inquiry vid - if a match is
3844 	 * made, get the data value and update the soft state structure
3845 	 * accordingly.
3846 	 *
3847 	 * Each duplet should show as a pair of strings, return SD_FAILURE
3848 	 * otherwise.
3849 	 */
3850 	if (nelements & 1) {
3851 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
3852 		    "sd-config-list should show as pairs of strings.\n");
3853 		if (config_list)
3854 			ddi_prop_free(config_list);
3855 		return (SD_FAILURE);
3856 	}
3857 
3858 	for (i = 0; i < nelements; i += 2) {
3859 		/*
3860 		 * Note: The assumption here is that each vid entry is on
3861 		 * a unique line from its associated duplet.
3862 		 */
3863 		vidptr = config_list[i];
3864 		vidlen = (int)strlen(vidptr);
3865 		if (sd_sdconf_id_match(un, vidptr, vidlen) != SD_SUCCESS) {
3866 			continue;
3867 		}
3868 
3869 		/*
3870 		 * dnlist contains 1 or more blank separated
3871 		 * data-property-name entries
3872 		 */
3873 		dnlist_ptr = config_list[i + 1];
3874 
3875 		if (strchr(dnlist_ptr, ':') != NULL) {
3876 			/*
3877 			 * Decode the improved format sd-config-list.
3878 			 */
3879 			sd_nvpair_str_decode(un, dnlist_ptr);
3880 		} else {
3881 			/*
3882 			 * The old format sd-config-list, loop through all
3883 			 * data-property-name entries in the
3884 			 * data-property-name-list
3885 			 * setting the properties for each.
3886 			 */
3887 			for (dataname_ptr = sd_strtok_r(dnlist_ptr, " \t",
3888 			    &dataname_lasts); dataname_ptr != NULL;
3889 			    dataname_ptr = sd_strtok_r(NULL, " \t",
3890 			    &dataname_lasts)) {
3891 				int version;
3892 
3893 				SD_INFO(SD_LOG_ATTACH_DETACH, un,
3894 				    "sd_process_sdconf_file: disk:%s, "
3895 				    "data:%s\n", vidptr, dataname_ptr);
3896 
3897 				/* Get the data list */
3898 				if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY,
3899 				    SD_DEVINFO(un), 0, dataname_ptr, &data_list,
3900 				    &data_list_len) != DDI_PROP_SUCCESS) {
3901 					SD_INFO(SD_LOG_ATTACH_DETACH, un,
3902 					    "sd_process_sdconf_file: data "
3903 					    "property (%s) has no value\n",
3904 					    dataname_ptr);
3905 					continue;
3906 				}
3907 
3908 				version = data_list[0];
3909 
3910 				if (version == SD_CONF_VERSION_1) {
3911 					sd_tunables values;
3912 
3913 					/* Set the properties */
3914 					if (sd_chk_vers1_data(un, data_list[1],
3915 					    &data_list[2], data_list_len,
3916 					    dataname_ptr) == SD_SUCCESS) {
3917 						sd_get_tunables_from_conf(un,
3918 						    data_list[1], &data_list[2],
3919 						    &values);
3920 						sd_set_vers1_properties(un,
3921 						    data_list[1], &values);
3922 						rval = SD_SUCCESS;
3923 					} else {
3924 						rval = SD_FAILURE;
3925 					}
3926 				} else {
3927 					scsi_log(SD_DEVINFO(un), sd_label,
3928 					    CE_WARN, "data property %s version "
3929 					    "0x%x is invalid.",
3930 					    dataname_ptr, version);
3931 					rval = SD_FAILURE;
3932 				}
3933 				if (data_list)
3934 					ddi_prop_free(data_list);
3935 			}
3936 		}
3937 	}
3938 
3939 	/* free up the memory allocated by ddi_prop_lookup_string_array(). */
3940 	if (config_list) {
3941 		ddi_prop_free(config_list);
3942 	}
3943 
3944 	return (rval);
3945 }
3946 
3947 /*
3948  *    Function: sd_nvpair_str_decode()
3949  *
3950  * Description: Parse the improved format sd-config-list to get
3951  *    each entry of tunable, which includes a name-value pair.
3952  *    Then call sd_set_properties() to set the property.
3953  *
3954  *   Arguments: un - driver soft state (unit) structure
3955  *    nvpair_str - the tunable list
3956  */
3957 static void
3958 sd_nvpair_str_decode(struct sd_lun *un, char *nvpair_str)
3959 {
3960 	char	*nv, *name, *value, *token;
3961 	char	*nv_lasts, *v_lasts, *x_lasts;
3962 
3963 	for (nv = sd_strtok_r(nvpair_str, ",", &nv_lasts); nv != NULL;
3964 	    nv = sd_strtok_r(NULL, ",", &nv_lasts)) {
3965 		token = sd_strtok_r(nv, ":", &v_lasts);
3966 		name  = sd_strtok_r(token, " \t", &x_lasts);
3967 		token = sd_strtok_r(NULL, ":", &v_lasts);
3968 		value = sd_strtok_r(token, " \t", &x_lasts);
3969 		if (name == NULL || value == NULL) {
3970 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
3971 			    "sd_nvpair_str_decode: "
3972 			    "name or value is not valid!\n");
3973 		} else {
3974 			sd_set_properties(un, name, value);
3975 		}
3976 	}
3977 }
3978 
3979 /*
3980  *    Function: sd_strtok_r()
3981  *
3982  * Description: This function uses strpbrk and strspn to break
3983  *    string into tokens on sequentially subsequent calls. Return
3984  *    NULL when no non-separator characters remain. The first
3985  *    argument is NULL for subsequent calls.
3986  */
3987 static char *
3988 sd_strtok_r(char *string, const char *sepset, char **lasts)
3989 {
3990 	char	*q, *r;
3991 
3992 	/* First or subsequent call */
3993 	if (string == NULL)
3994 		string = *lasts;
3995 
3996 	if (string == NULL)
3997 		return (NULL);
3998 
3999 	/* Skip leading separators */
4000 	q = string + strspn(string, sepset);
4001 
4002 	if (*q == '\0')
4003 		return (NULL);
4004 
4005 	if ((r = strpbrk(q, sepset)) == NULL)
4006 		*lasts = NULL;
4007 	else {
4008 		*r = '\0';
4009 		*lasts = r + 1;
4010 	}
4011 	return (q);
4012 }
4013 
4014 /*
4015  *    Function: sd_set_properties()
4016  *
4017  * Description: Set device properties based on the improved
4018  *    format sd-config-list.
4019  *
4020  *   Arguments: un - driver soft state (unit) structure
4021  *    name  - supported tunable name
4022  *    value - tunable value
4023  */
4024 static void
4025 sd_set_properties(struct sd_lun *un, char *name, char *value)
4026 {
4027 	char	*endptr = NULL;
4028 	long	val = 0;
4029 
4030 	if (strcasecmp(name, "cache-nonvolatile") == 0) {
4031 		if (strcasecmp(value, "true") == 0) {
4032 			un->un_f_suppress_cache_flush = TRUE;
4033 		} else if (strcasecmp(value, "false") == 0) {
4034 			un->un_f_suppress_cache_flush = FALSE;
4035 		} else {
4036 			goto value_invalid;
4037 		}
4038 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4039 		    "suppress_cache_flush flag set to %d\n",
4040 		    un->un_f_suppress_cache_flush);
4041 		return;
4042 	}
4043 
4044 	if (strcasecmp(name, "controller-type") == 0) {
4045 		if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4046 			un->un_ctype = val;
4047 		} else {
4048 			goto value_invalid;
4049 		}
4050 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4051 		    "ctype set to %d\n", un->un_ctype);
4052 		return;
4053 	}
4054 
4055 	if (strcasecmp(name, "delay-busy") == 0) {
4056 		if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4057 			un->un_busy_timeout = drv_usectohz(val / 1000);
4058 		} else {
4059 			goto value_invalid;
4060 		}
4061 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4062 		    "busy_timeout set to %d\n", un->un_busy_timeout);
4063 		return;
4064 	}
4065 
4066 	if (strcasecmp(name, "disksort") == 0) {
4067 		if (strcasecmp(value, "true") == 0) {
4068 			un->un_f_disksort_disabled = FALSE;
4069 		} else if (strcasecmp(value, "false") == 0) {
4070 			un->un_f_disksort_disabled = TRUE;
4071 		} else {
4072 			goto value_invalid;
4073 		}
4074 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4075 		    "disksort disabled flag set to %d\n",
4076 		    un->un_f_disksort_disabled);
4077 		return;
4078 	}
4079 
4080 	if (strcasecmp(name, "power-condition") == 0) {
4081 		if (strcasecmp(value, "true") == 0) {
4082 			un->un_f_power_condition_disabled = FALSE;
4083 		} else if (strcasecmp(value, "false") == 0) {
4084 			un->un_f_power_condition_disabled = TRUE;
4085 		} else {
4086 			goto value_invalid;
4087 		}
4088 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4089 		    "power condition disabled flag set to %d\n",
4090 		    un->un_f_power_condition_disabled);
4091 		return;
4092 	}
4093 
4094 	if (strcasecmp(name, "timeout-releasereservation") == 0) {
4095 		if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4096 			un->un_reserve_release_time = val;
4097 		} else {
4098 			goto value_invalid;
4099 		}
4100 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4101 		    "reservation release timeout set to %d\n",
4102 		    un->un_reserve_release_time);
4103 		return;
4104 	}
4105 
4106 	if (strcasecmp(name, "reset-lun") == 0) {
4107 		if (strcasecmp(value, "true") == 0) {
4108 			un->un_f_lun_reset_enabled = TRUE;
4109 		} else if (strcasecmp(value, "false") == 0) {
4110 			un->un_f_lun_reset_enabled = FALSE;
4111 		} else {
4112 			goto value_invalid;
4113 		}
4114 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4115 		    "lun reset enabled flag set to %d\n",
4116 		    un->un_f_lun_reset_enabled);
4117 		return;
4118 	}
4119 
4120 	if (strcasecmp(name, "retries-busy") == 0) {
4121 		if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4122 			un->un_busy_retry_count = val;
4123 		} else {
4124 			goto value_invalid;
4125 		}
4126 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4127 		    "busy retry count set to %d\n", un->un_busy_retry_count);
4128 		return;
4129 	}
4130 
4131 	if (strcasecmp(name, "retries-timeout") == 0) {
4132 		if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4133 			un->un_retry_count = val;
4134 		} else {
4135 			goto value_invalid;
4136 		}
4137 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4138 		    "timeout retry count set to %d\n", un->un_retry_count);
4139 		return;
4140 	}
4141 
4142 	if (strcasecmp(name, "retries-notready") == 0) {
4143 		if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4144 			un->un_notready_retry_count = val;
4145 		} else {
4146 			goto value_invalid;
4147 		}
4148 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4149 		    "notready retry count set to %d\n",
4150 		    un->un_notready_retry_count);
4151 		return;
4152 	}
4153 
4154 	if (strcasecmp(name, "retries-reset") == 0) {
4155 		if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4156 			un->un_reset_retry_count = val;
4157 		} else {
4158 			goto value_invalid;
4159 		}
4160 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4161 		    "reset retry count set to %d\n",
4162 		    un->un_reset_retry_count);
4163 		return;
4164 	}
4165 
4166 	if (strcasecmp(name, "throttle-max") == 0) {
4167 		if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4168 			un->un_saved_throttle = un->un_throttle = val;
4169 		} else {
4170 			goto value_invalid;
4171 		}
4172 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4173 		    "throttle set to %d\n", un->un_throttle);
4174 	}
4175 
4176 	if (strcasecmp(name, "throttle-min") == 0) {
4177 		if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4178 			un->un_min_throttle = val;
4179 		} else {
4180 			goto value_invalid;
4181 		}
4182 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4183 		    "min throttle set to %d\n", un->un_min_throttle);
4184 	}
4185 
4186 	if (strcasecmp(name, "rmw-type") == 0) {
4187 		if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4188 			un->un_f_rmw_type = val;
4189 		} else {
4190 			goto value_invalid;
4191 		}
4192 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4193 		    "RMW type set to %d\n", un->un_f_rmw_type);
4194 	}
4195 
4196 	if (strcasecmp(name, "physical-block-size") == 0) {
4197 		if (ddi_strtol(value, &endptr, 0, &val) == 0 &&
4198 		    ISP2(val) && val >= un->un_tgt_blocksize &&
4199 		    val >= un->un_sys_blocksize) {
4200 			un->un_phy_blocksize = val;
4201 		} else {
4202 			goto value_invalid;
4203 		}
4204 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4205 		    "physical block size set to %d\n", un->un_phy_blocksize);
4206 	}
4207 
4208 	if (strcasecmp(name, "retries-victim") == 0) {
4209 		if (ddi_strtol(value, &endptr, 0, &val) == 0) {
4210 			un->un_victim_retry_count = val;
4211 		} else {
4212 			goto value_invalid;
4213 		}
4214 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4215 		    "victim retry count set to %d\n",
4216 		    un->un_victim_retry_count);
4217 		return;
4218 	}
4219 
4220 	/*
4221 	 * Validate the throttle values.
4222 	 * If any of the numbers are invalid, set everything to defaults.
4223 	 */
4224 	if ((un->un_throttle < SD_LOWEST_VALID_THROTTLE) ||
4225 	    (un->un_min_throttle < SD_LOWEST_VALID_THROTTLE) ||
4226 	    (un->un_min_throttle > un->un_throttle)) {
4227 		un->un_saved_throttle = un->un_throttle = sd_max_throttle;
4228 		un->un_min_throttle = sd_min_throttle;
4229 	}
4230 
4231 	if (strcasecmp(name, "mmc-gesn-polling") == 0) {
4232 		if (strcasecmp(value, "true") == 0) {
4233 			un->un_f_mmc_gesn_polling = TRUE;
4234 		} else if (strcasecmp(value, "false") == 0) {
4235 			un->un_f_mmc_gesn_polling = FALSE;
4236 		} else {
4237 			goto value_invalid;
4238 		}
4239 		SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4240 		    "mmc-gesn-polling set to %d\n",
4241 		    un->un_f_mmc_gesn_polling);
4242 	}
4243 
4244 	return;
4245 
4246 value_invalid:
4247 	SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: "
4248 	    "value of prop %s is invalid\n", name);
4249 }
4250 
4251 /*
4252  *    Function: sd_get_tunables_from_conf()
4253  *
4254  *
4255  *    This function reads the data list from the sd.conf file and pulls
4256  *    the values that can have numeric values as arguments and places
4257  *    the values in the appropriate sd_tunables member.
4258  *    Since the order of the data list members varies across platforms
4259  *    This function reads them from the data list in a platform specific
4260  *    order and places them into the correct sd_tunable member that is
4261  *    consistent across all platforms.
4262  */
4263 static void
4264 sd_get_tunables_from_conf(struct sd_lun *un, int flags, int *data_list,
4265     sd_tunables *values)
4266 {
4267 	int i;
4268 	int mask;
4269 
4270 	bzero(values, sizeof (sd_tunables));
4271 
4272 	for (i = 0; i < SD_CONF_MAX_ITEMS; i++) {
4273 
4274 		mask = 1 << i;
4275 		if (mask > flags) {
4276 			break;
4277 		}
4278 
4279 		switch (mask & flags) {
4280 		case 0:	/* This mask bit not set in flags */
4281 			continue;
4282 		case SD_CONF_BSET_THROTTLE:
4283 			values->sdt_throttle = data_list[i];
4284 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4285 			    "sd_get_tunables_from_conf: throttle = %d\n",
4286 			    values->sdt_throttle);
4287 			break;
4288 		case SD_CONF_BSET_CTYPE:
4289 			values->sdt_ctype = data_list[i];
4290 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4291 			    "sd_get_tunables_from_conf: ctype = %d\n",
4292 			    values->sdt_ctype);
4293 			break;
4294 		case SD_CONF_BSET_NRR_COUNT:
4295 			values->sdt_not_rdy_retries = data_list[i];
4296 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4297 			    "sd_get_tunables_from_conf: not_rdy_retries = %d\n",
4298 			    values->sdt_not_rdy_retries);
4299 			break;
4300 		case SD_CONF_BSET_BSY_RETRY_COUNT:
4301 			values->sdt_busy_retries = data_list[i];
4302 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4303 			    "sd_get_tunables_from_conf: busy_retries = %d\n",
4304 			    values->sdt_busy_retries);
4305 			break;
4306 		case SD_CONF_BSET_RST_RETRIES:
4307 			values->sdt_reset_retries = data_list[i];
4308 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4309 			    "sd_get_tunables_from_conf: reset_retries = %d\n",
4310 			    values->sdt_reset_retries);
4311 			break;
4312 		case SD_CONF_BSET_RSV_REL_TIME:
4313 			values->sdt_reserv_rel_time = data_list[i];
4314 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4315 			    "sd_get_tunables_from_conf: reserv_rel_time = %d\n",
4316 			    values->sdt_reserv_rel_time);
4317 			break;
4318 		case SD_CONF_BSET_MIN_THROTTLE:
4319 			values->sdt_min_throttle = data_list[i];
4320 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4321 			    "sd_get_tunables_from_conf: min_throttle = %d\n",
4322 			    values->sdt_min_throttle);
4323 			break;
4324 		case SD_CONF_BSET_DISKSORT_DISABLED:
4325 			values->sdt_disk_sort_dis = data_list[i];
4326 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4327 			    "sd_get_tunables_from_conf: disk_sort_dis = %d\n",
4328 			    values->sdt_disk_sort_dis);
4329 			break;
4330 		case SD_CONF_BSET_LUN_RESET_ENABLED:
4331 			values->sdt_lun_reset_enable = data_list[i];
4332 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4333 			    "sd_get_tunables_from_conf: lun_reset_enable = %d"
4334 			    "\n", values->sdt_lun_reset_enable);
4335 			break;
4336 		case SD_CONF_BSET_CACHE_IS_NV:
4337 			values->sdt_suppress_cache_flush = data_list[i];
4338 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4339 			    "sd_get_tunables_from_conf: \
4340 			    suppress_cache_flush = %d"
4341 			    "\n", values->sdt_suppress_cache_flush);
4342 			break;
4343 		case SD_CONF_BSET_PC_DISABLED:
4344 			values->sdt_disk_sort_dis = data_list[i];
4345 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4346 			    "sd_get_tunables_from_conf: power_condition_dis = "
4347 			    "%d\n", values->sdt_power_condition_dis);
4348 			break;
4349 		}
4350 	}
4351 }
4352 
4353 /*
4354  *    Function: sd_process_sdconf_table
4355  *
4356  * Description: Search the static configuration table for a match on the
4357  *		inquiry vid/pid and update the driver soft state structure
4358  *		according to the table property values for the device.
4359  *
4360  *		The form of a configuration table entry is:
4361  *		  <vid+pid>,<flags>,<property-data>
4362  *		  "SEAGATE ST42400N",1,0x40000,
4363  *		  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1;
4364  *
4365  *   Arguments: un - driver soft state (unit) structure
4366  */
4367 
4368 static void
4369 sd_process_sdconf_table(struct sd_lun *un)
4370 {
4371 	char	*id = NULL;
4372 	int	table_index;
4373 	int	idlen;
4374 
4375 	ASSERT(un != NULL);
4376 	for (table_index = 0; table_index < sd_disk_table_size;
4377 	    table_index++) {
4378 		id = sd_disk_table[table_index].device_id;
4379 		idlen = strlen(id);
4380 
4381 		/*
4382 		 * The static configuration table currently does not
4383 		 * implement version 10 properties. Additionally,
4384 		 * multiple data-property-name entries are not
4385 		 * implemented in the static configuration table.
4386 		 */
4387 		if (sd_sdconf_id_match(un, id, idlen) == SD_SUCCESS) {
4388 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4389 			    "sd_process_sdconf_table: disk %s\n", id);
4390 			sd_set_vers1_properties(un,
4391 			    sd_disk_table[table_index].flags,
4392 			    sd_disk_table[table_index].properties);
4393 			break;
4394 		}
4395 	}
4396 }
4397 
4398 
4399 /*
4400  *    Function: sd_sdconf_id_match
4401  *
4402  * Description: This local function implements a case sensitive vid/pid
4403  *		comparison as well as the boundary cases of wild card and
4404  *		multiple blanks.
4405  *
4406  *		Note: An implicit assumption made here is that the scsi
4407  *		inquiry structure will always keep the vid, pid and
4408  *		revision strings in consecutive sequence, so they can be
4409  *		read as a single string. If this assumption is not the
4410  *		case, a separate string, to be used for the check, needs
4411  *		to be built with these strings concatenated.
4412  *
4413  *   Arguments: un - driver soft state (unit) structure
4414  *		id - table or config file vid/pid
4415  *		idlen  - length of the vid/pid (bytes)
4416  *
4417  * Return Code: SD_SUCCESS - Indicates a match with the inquiry vid/pid
4418  *		SD_FAILURE - Indicates no match with the inquiry vid/pid
4419  */
4420 
4421 static int
4422 sd_sdconf_id_match(struct sd_lun *un, char *id, int idlen)
4423 {
4424 	struct scsi_inquiry	*sd_inq;
4425 	int 			rval = SD_SUCCESS;
4426 
4427 	ASSERT(un != NULL);
4428 	sd_inq = un->un_sd->sd_inq;
4429 	ASSERT(id != NULL);
4430 
4431 	/*
4432 	 * We use the inq_vid as a pointer to a buffer containing the
4433 	 * vid and pid and use the entire vid/pid length of the table
4434 	 * entry for the comparison. This works because the inq_pid
4435 	 * data member follows inq_vid in the scsi_inquiry structure.
4436 	 */
4437 	if (strncasecmp(sd_inq->inq_vid, id, idlen) != 0) {
4438 		/*
4439 		 * The user id string is compared to the inquiry vid/pid
4440 		 * using a case insensitive comparison and ignoring
4441 		 * multiple spaces.
4442 		 */
4443 		rval = sd_blank_cmp(un, id, idlen);
4444 		if (rval != SD_SUCCESS) {
4445 			/*
4446 			 * User id strings that start and end with a "*"
4447 			 * are a special case. These do not have a
4448 			 * specific vendor, and the product string can
4449 			 * appear anywhere in the 16 byte PID portion of
4450 			 * the inquiry data. This is a simple strstr()
4451 			 * type search for the user id in the inquiry data.
4452 			 */
4453 			if ((id[0] == '*') && (id[idlen - 1] == '*')) {
4454 				char	*pidptr = &id[1];
4455 				int	i;
4456 				int	j;
4457 				int	pidstrlen = idlen - 2;
4458 				j = sizeof (SD_INQUIRY(un)->inq_pid) -
4459 				    pidstrlen;
4460 
4461 				if (j < 0) {
4462 					return (SD_FAILURE);
4463 				}
4464 				for (i = 0; i < j; i++) {
4465 					if (bcmp(&SD_INQUIRY(un)->inq_pid[i],
4466 					    pidptr, pidstrlen) == 0) {
4467 						rval = SD_SUCCESS;
4468 						break;
4469 					}
4470 				}
4471 			}
4472 		}
4473 	}
4474 	return (rval);
4475 }
4476 
4477 
4478 /*
4479  *    Function: sd_blank_cmp
4480  *
4481  * Description: If the id string starts and ends with a space, treat
4482  *		multiple consecutive spaces as equivalent to a single
4483  *		space. For example, this causes a sd_disk_table entry
4484  *		of " NEC CDROM " to match a device's id string of
4485  *		"NEC       CDROM".
4486  *
4487  *		Note: The success exit condition for this routine is if
4488  *		the pointer to the table entry is '\0' and the cnt of
4489  *		the inquiry length is zero. This will happen if the inquiry
4490  *		string returned by the device is padded with spaces to be
4491  *		exactly 24 bytes in length (8 byte vid + 16 byte pid). The
4492  *		SCSI spec states that the inquiry string is to be padded with
4493  *		spaces.
4494  *
4495  *   Arguments: un - driver soft state (unit) structure
4496  *		id - table or config file vid/pid
4497  *		idlen  - length of the vid/pid (bytes)
4498  *
4499  * Return Code: SD_SUCCESS - Indicates a match with the inquiry vid/pid
4500  *		SD_FAILURE - Indicates no match with the inquiry vid/pid
4501  */
4502 
4503 static int
4504 sd_blank_cmp(struct sd_lun *un, char *id, int idlen)
4505 {
4506 	char		*p1;
4507 	char		*p2;
4508 	int		cnt;
4509 	cnt = sizeof (SD_INQUIRY(un)->inq_vid) +
4510 	    sizeof (SD_INQUIRY(un)->inq_pid);
4511 
4512 	ASSERT(un != NULL);
4513 	p2 = un->un_sd->sd_inq->inq_vid;
4514 	ASSERT(id != NULL);
4515 	p1 = id;
4516 
4517 	if ((id[0] == ' ') && (id[idlen - 1] == ' ')) {
4518 		/*
4519 		 * Note: string p1 is terminated by a NUL but string p2
4520 		 * isn't.  The end of p2 is determined by cnt.
4521 		 */
4522 		for (;;) {
4523 			/* skip over any extra blanks in both strings */
4524 			while ((*p1 != '\0') && (*p1 == ' ')) {
4525 				p1++;
4526 			}
4527 			while ((cnt != 0) && (*p2 == ' ')) {
4528 				p2++;
4529 				cnt--;
4530 			}
4531 
4532 			/* compare the two strings */
4533 			if ((cnt == 0) ||
4534 			    (SD_TOUPPER(*p1) != SD_TOUPPER(*p2))) {
4535 				break;
4536 			}
4537 			while ((cnt > 0) &&
4538 			    (SD_TOUPPER(*p1) == SD_TOUPPER(*p2))) {
4539 				p1++;
4540 				p2++;
4541 				cnt--;
4542 			}
4543 		}
4544 	}
4545 
4546 	/* return SD_SUCCESS if both strings match */
4547 	return (((*p1 == '\0') && (cnt == 0)) ? SD_SUCCESS : SD_FAILURE);
4548 }
4549 
4550 
4551 /*
4552  *    Function: sd_chk_vers1_data
4553  *
4554  * Description: Verify the version 1 device properties provided by the
4555  *		user via the configuration file
4556  *
4557  *   Arguments: un	     - driver soft state (unit) structure
4558  *		flags	     - integer mask indicating properties to be set
4559  *		prop_list    - integer list of property values
4560  *		list_len     - number of the elements
4561  *
4562  * Return Code: SD_SUCCESS - Indicates the user provided data is valid
4563  *		SD_FAILURE - Indicates the user provided data is invalid
4564  */
4565 
4566 static int
4567 sd_chk_vers1_data(struct sd_lun *un, int flags, int *prop_list,
4568     int list_len, char *dataname_ptr)
4569 {
4570 	int i;
4571 	int mask = 1;
4572 	int index = 0;
4573 
4574 	ASSERT(un != NULL);
4575 
4576 	/* Check for a NULL property name and list */
4577 	if (dataname_ptr == NULL) {
4578 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
4579 		    "sd_chk_vers1_data: NULL data property name.");
4580 		return (SD_FAILURE);
4581 	}
4582 	if (prop_list == NULL) {
4583 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
4584 		    "sd_chk_vers1_data: %s NULL data property list.",
4585 		    dataname_ptr);
4586 		return (SD_FAILURE);
4587 	}
4588 
4589 	/* Display a warning if undefined bits are set in the flags */
4590 	if (flags & ~SD_CONF_BIT_MASK) {
4591 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
4592 		    "sd_chk_vers1_data: invalid bits 0x%x in data list %s. "
4593 		    "Properties not set.",
4594 		    (flags & ~SD_CONF_BIT_MASK), dataname_ptr);
4595 		return (SD_FAILURE);
4596 	}
4597 
4598 	/*
4599 	 * Verify the length of the list by identifying the highest bit set
4600 	 * in the flags and validating that the property list has a length
4601 	 * up to the index of this bit.
4602 	 */
4603 	for (i = 0; i < SD_CONF_MAX_ITEMS; i++) {
4604 		if (flags & mask) {
4605 			index++;
4606 		}
4607 		mask = 1 << i;
4608 	}
4609 	if (list_len < (index + 2)) {
4610 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
4611 		    "sd_chk_vers1_data: "
4612 		    "Data property list %s size is incorrect. "
4613 		    "Properties not set.", dataname_ptr);
4614 		scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, "Size expected: "
4615 		    "version + 1 flagword + %d properties", SD_CONF_MAX_ITEMS);
4616 		return (SD_FAILURE);
4617 	}
4618 	return (SD_SUCCESS);
4619 }
4620 
4621 
4622 /*
4623  *    Function: sd_set_vers1_properties
4624  *
4625  * Description: Set version 1 device properties based on a property list
4626  *		retrieved from the driver configuration file or static
4627  *		configuration table. Version 1 properties have the format:
4628  *
4629  * 	<data-property-name>:=<version>,<flags>,<prop0>,<prop1>,.....<propN>
4630  *
4631  *		where the prop0 value will be used to set prop0 if bit0
4632  *		is set in the flags
4633  *
4634  *   Arguments: un	     - driver soft state (unit) structure
4635  *		flags	     - integer mask indicating properties to be set
4636  *		prop_list    - integer list of property values
4637  */
4638 
4639 static void
4640 sd_set_vers1_properties(struct sd_lun *un, int flags, sd_tunables *prop_list)
4641 {
4642 	ASSERT(un != NULL);
4643 
4644 	/*
4645 	 * Set the flag to indicate cache is to be disabled. An attempt
4646 	 * to disable the cache via sd_cache_control() will be made
4647 	 * later during attach once the basic initialization is complete.
4648 	 */
4649 	if (flags & SD_CONF_BSET_NOCACHE) {
4650 		un->un_f_opt_disable_cache = TRUE;
4651 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4652 		    "sd_set_vers1_properties: caching disabled flag set\n");
4653 	}
4654 
4655 	/* CD-specific configuration parameters */
4656 	if (flags & SD_CONF_BSET_PLAYMSF_BCD) {
4657 		un->un_f_cfg_playmsf_bcd = TRUE;
4658 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4659 		    "sd_set_vers1_properties: playmsf_bcd set\n");
4660 	}
4661 	if (flags & SD_CONF_BSET_READSUB_BCD) {
4662 		un->un_f_cfg_readsub_bcd = TRUE;
4663 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4664 		    "sd_set_vers1_properties: readsub_bcd set\n");
4665 	}
4666 	if (flags & SD_CONF_BSET_READ_TOC_TRK_BCD) {
4667 		un->un_f_cfg_read_toc_trk_bcd = TRUE;
4668 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4669 		    "sd_set_vers1_properties: read_toc_trk_bcd set\n");
4670 	}
4671 	if (flags & SD_CONF_BSET_READ_TOC_ADDR_BCD) {
4672 		un->un_f_cfg_read_toc_addr_bcd = TRUE;
4673 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4674 		    "sd_set_vers1_properties: read_toc_addr_bcd set\n");
4675 	}
4676 	if (flags & SD_CONF_BSET_NO_READ_HEADER) {
4677 		un->un_f_cfg_no_read_header = TRUE;
4678 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4679 		    "sd_set_vers1_properties: no_read_header set\n");
4680 	}
4681 	if (flags & SD_CONF_BSET_READ_CD_XD4) {
4682 		un->un_f_cfg_read_cd_xd4 = TRUE;
4683 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4684 		    "sd_set_vers1_properties: read_cd_xd4 set\n");
4685 	}
4686 
4687 	/* Support for devices which do not have valid/unique serial numbers */
4688 	if (flags & SD_CONF_BSET_FAB_DEVID) {
4689 		un->un_f_opt_fab_devid = TRUE;
4690 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4691 		    "sd_set_vers1_properties: fab_devid bit set\n");
4692 	}
4693 
4694 	/* Support for user throttle configuration */
4695 	if (flags & SD_CONF_BSET_THROTTLE) {
4696 		ASSERT(prop_list != NULL);
4697 		un->un_saved_throttle = un->un_throttle =
4698 		    prop_list->sdt_throttle;
4699 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4700 		    "sd_set_vers1_properties: throttle set to %d\n",
4701 		    prop_list->sdt_throttle);
4702 	}
4703 
4704 	/* Set the per disk retry count according to the conf file or table. */
4705 	if (flags & SD_CONF_BSET_NRR_COUNT) {
4706 		ASSERT(prop_list != NULL);
4707 		if (prop_list->sdt_not_rdy_retries) {
4708 			un->un_notready_retry_count =
4709 			    prop_list->sdt_not_rdy_retries;
4710 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4711 			    "sd_set_vers1_properties: not ready retry count"
4712 			    " set to %d\n", un->un_notready_retry_count);
4713 		}
4714 	}
4715 
4716 	/* The controller type is reported for generic disk driver ioctls */
4717 	if (flags & SD_CONF_BSET_CTYPE) {
4718 		ASSERT(prop_list != NULL);
4719 		switch (prop_list->sdt_ctype) {
4720 		case CTYPE_CDROM:
4721 			un->un_ctype = prop_list->sdt_ctype;
4722 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4723 			    "sd_set_vers1_properties: ctype set to "
4724 			    "CTYPE_CDROM\n");
4725 			break;
4726 		case CTYPE_CCS:
4727 			un->un_ctype = prop_list->sdt_ctype;
4728 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4729 			    "sd_set_vers1_properties: ctype set to "
4730 			    "CTYPE_CCS\n");
4731 			break;
4732 		case CTYPE_ROD:		/* RW optical */
4733 			un->un_ctype = prop_list->sdt_ctype;
4734 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
4735 			    "sd_set_vers1_properties: ctype set to "
4736 			    "CTYPE_ROD\n");
4737 			break;
4738 		default:
4739 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
4740 			    "sd_set_vers1_properties: Could not set "
4741 			    "invalid ctype value (%d)",
4742 			    prop_list->sdt_ctype);
4743 		}
4744 	}
4745 
4746 	/* Purple failover timeout */
4747 	if (flags & SD_CONF_BSET_BSY_RETRY_COUNT) {
4748 		ASSERT(prop_list != NULL);
4749 		un->un_busy_retry_count =
4750 		    prop_list->sdt_busy_retries;
4751 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4752 		    "sd_set_vers1_properties: "
4753 		    "busy retry count set to %d\n",
4754 		    un->un_busy_retry_count);
4755 	}
4756 
4757 	/* Purple reset retry count */
4758 	if (flags & SD_CONF_BSET_RST_RETRIES) {
4759 		ASSERT(prop_list != NULL);
4760 		un->un_reset_retry_count =
4761 		    prop_list->sdt_reset_retries;
4762 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4763 		    "sd_set_vers1_properties: "
4764 		    "reset retry count set to %d\n",
4765 		    un->un_reset_retry_count);
4766 	}
4767 
4768 	/* Purple reservation release timeout */
4769 	if (flags & SD_CONF_BSET_RSV_REL_TIME) {
4770 		ASSERT(prop_list != NULL);
4771 		un->un_reserve_release_time =
4772 		    prop_list->sdt_reserv_rel_time;
4773 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4774 		    "sd_set_vers1_properties: "
4775 		    "reservation release timeout set to %d\n",
4776 		    un->un_reserve_release_time);
4777 	}
4778 
4779 	/*
4780 	 * Driver flag telling the driver to verify that no commands are pending
4781 	 * for a device before issuing a Test Unit Ready. This is a workaround
4782 	 * for a firmware bug in some Seagate eliteI drives.
4783 	 */
4784 	if (flags & SD_CONF_BSET_TUR_CHECK) {
4785 		un->un_f_cfg_tur_check = TRUE;
4786 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4787 		    "sd_set_vers1_properties: tur queue check set\n");
4788 	}
4789 
4790 	if (flags & SD_CONF_BSET_MIN_THROTTLE) {
4791 		un->un_min_throttle = prop_list->sdt_min_throttle;
4792 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4793 		    "sd_set_vers1_properties: min throttle set to %d\n",
4794 		    un->un_min_throttle);
4795 	}
4796 
4797 	if (flags & SD_CONF_BSET_DISKSORT_DISABLED) {
4798 		un->un_f_disksort_disabled =
4799 		    (prop_list->sdt_disk_sort_dis != 0) ?
4800 		    TRUE : FALSE;
4801 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4802 		    "sd_set_vers1_properties: disksort disabled "
4803 		    "flag set to %d\n",
4804 		    prop_list->sdt_disk_sort_dis);
4805 	}
4806 
4807 	if (flags & SD_CONF_BSET_LUN_RESET_ENABLED) {
4808 		un->un_f_lun_reset_enabled =
4809 		    (prop_list->sdt_lun_reset_enable != 0) ?
4810 		    TRUE : FALSE;
4811 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4812 		    "sd_set_vers1_properties: lun reset enabled "
4813 		    "flag set to %d\n",
4814 		    prop_list->sdt_lun_reset_enable);
4815 	}
4816 
4817 	if (flags & SD_CONF_BSET_CACHE_IS_NV) {
4818 		un->un_f_suppress_cache_flush =
4819 		    (prop_list->sdt_suppress_cache_flush != 0) ?
4820 		    TRUE : FALSE;
4821 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4822 		    "sd_set_vers1_properties: suppress_cache_flush "
4823 		    "flag set to %d\n",
4824 		    prop_list->sdt_suppress_cache_flush);
4825 	}
4826 
4827 	if (flags & SD_CONF_BSET_PC_DISABLED) {
4828 		un->un_f_power_condition_disabled =
4829 		    (prop_list->sdt_power_condition_dis != 0) ?
4830 		    TRUE : FALSE;
4831 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
4832 		    "sd_set_vers1_properties: power_condition_disabled "
4833 		    "flag set to %d\n",
4834 		    prop_list->sdt_power_condition_dis);
4835 	}
4836 
4837 	/*
4838 	 * Validate the throttle values.
4839 	 * If any of the numbers are invalid, set everything to defaults.
4840 	 */
4841 	if ((un->un_throttle < SD_LOWEST_VALID_THROTTLE) ||
4842 	    (un->un_min_throttle < SD_LOWEST_VALID_THROTTLE) ||
4843 	    (un->un_min_throttle > un->un_throttle)) {
4844 		un->un_saved_throttle = un->un_throttle = sd_max_throttle;
4845 		un->un_min_throttle = sd_min_throttle;
4846 	}
4847 }
4848 
4849 /*
4850  *   Function: sd_is_lsi()
4851  *
4852  *   Description: Check for lsi devices, step through the static device
4853  *	table to match vid/pid.
4854  *
4855  *   Args: un - ptr to sd_lun
4856  *
4857  *   Notes:  When creating new LSI property, need to add the new LSI property
4858  *		to this function.
4859  */
4860 static void
4861 sd_is_lsi(struct sd_lun *un)
4862 {
4863 	char	*id = NULL;
4864 	int	table_index;
4865 	int	idlen;
4866 	void	*prop;
4867 
4868 	ASSERT(un != NULL);
4869 	for (table_index = 0; table_index < sd_disk_table_size;
4870 	    table_index++) {
4871 		id = sd_disk_table[table_index].device_id;
4872 		idlen = strlen(id);
4873 		if (idlen == 0) {
4874 			continue;
4875 		}
4876 
4877 		if (sd_sdconf_id_match(un, id, idlen) == SD_SUCCESS) {
4878 			prop = sd_disk_table[table_index].properties;
4879 			if (prop == &lsi_properties ||
4880 			    prop == &lsi_oem_properties ||
4881 			    prop == &lsi_properties_scsi ||
4882 			    prop == &symbios_properties) {
4883 				un->un_f_cfg_is_lsi = TRUE;
4884 			}
4885 			break;
4886 		}
4887 	}
4888 }
4889 
4890 /*
4891  *    Function: sd_get_physical_geometry
4892  *
4893  * Description: Retrieve the MODE SENSE page 3 (Format Device Page) and
4894  *		MODE SENSE page 4 (Rigid Disk Drive Geometry Page) from the
4895  *		target, and use this information to initialize the physical
4896  *		geometry cache specified by pgeom_p.
4897  *
4898  *		MODE SENSE is an optional command, so failure in this case
4899  *		does not necessarily denote an error. We want to use the
4900  *		MODE SENSE commands to derive the physical geometry of the
4901  *		device, but if either command fails, the logical geometry is
4902  *		used as the fallback for disk label geometry in cmlb.
4903  *
4904  *		This requires that un->un_blockcount and un->un_tgt_blocksize
4905  *		have already been initialized for the current target and
4906  *		that the current values be passed as args so that we don't
4907  *		end up ever trying to use -1 as a valid value. This could
4908  *		happen if either value is reset while we're not holding
4909  *		the mutex.
4910  *
4911  *   Arguments: un - driver soft state (unit) structure
4912  *		path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
4913  *			the normal command waitq, or SD_PATH_DIRECT_PRIORITY
4914  *			to use the USCSI "direct" chain and bypass the normal
4915  *			command waitq.
4916  *
4917  *     Context: Kernel thread only (can sleep).
4918  */
4919 
4920 static int
4921 sd_get_physical_geometry(struct sd_lun *un, cmlb_geom_t *pgeom_p,
4922     diskaddr_t capacity, int lbasize, int path_flag)
4923 {
4924 	struct	mode_format	*page3p;
4925 	struct	mode_geometry	*page4p;
4926 	struct	mode_header	*headerp;
4927 	int	sector_size;
4928 	int	nsect;
4929 	int	nhead;
4930 	int	ncyl;
4931 	int	intrlv;
4932 	int	spc;
4933 	diskaddr_t	modesense_capacity;
4934 	int	rpm;
4935 	int	bd_len;
4936 	int	mode_header_length;
4937 	uchar_t	*p3bufp;
4938 	uchar_t	*p4bufp;
4939 	int	cdbsize;
4940 	int 	ret = EIO;
4941 	sd_ssc_t *ssc;
4942 	int	status;
4943 
4944 	ASSERT(un != NULL);
4945 
4946 	if (lbasize == 0) {
4947 		if (ISCD(un)) {
4948 			lbasize = 2048;
4949 		} else {
4950 			lbasize = un->un_sys_blocksize;
4951 		}
4952 	}
4953 	pgeom_p->g_secsize = (unsigned short)lbasize;
4954 
4955 	/*
4956 	 * If the unit is a cd/dvd drive MODE SENSE page three
4957 	 * and MODE SENSE page four are reserved (see SBC spec
4958 	 * and MMC spec). To prevent soft errors just return
4959 	 * using the default LBA size.
4960 	 *
4961 	 * Since SATA MODE SENSE function (sata_txlt_mode_sense()) does not
4962 	 * implement support for mode pages 3 and 4 return here to prevent
4963 	 * illegal requests on SATA drives.
4964 	 *
4965 	 * These pages are also reserved in SBC-2 and later.  We assume SBC-2
4966 	 * or later for a direct-attached block device if the SCSI version is
4967 	 * at least SPC-3.
4968 	 */
4969 
4970 	if (ISCD(un) ||
4971 	    un->un_interconnect_type == SD_INTERCONNECT_SATA ||
4972 	    (un->un_ctype == CTYPE_CCS && SD_INQUIRY(un)->inq_ansi >= 5))
4973 		return (ret);
4974 
4975 	cdbsize = (un->un_f_cfg_is_atapi == TRUE) ? CDB_GROUP2 : CDB_GROUP0;
4976 
4977 	/*
4978 	 * Retrieve MODE SENSE page 3 - Format Device Page
4979 	 */
4980 	p3bufp = kmem_zalloc(SD_MODE_SENSE_PAGE3_LENGTH, KM_SLEEP);
4981 	ssc = sd_ssc_init(un);
4982 	status = sd_send_scsi_MODE_SENSE(ssc, cdbsize, p3bufp,
4983 	    SD_MODE_SENSE_PAGE3_LENGTH, SD_MODE_SENSE_PAGE3_CODE, path_flag);
4984 	if (status != 0) {
4985 		SD_ERROR(SD_LOG_COMMON, un,
4986 		    "sd_get_physical_geometry: mode sense page 3 failed\n");
4987 		goto page3_exit;
4988 	}
4989 
4990 	/*
4991 	 * Determine size of Block Descriptors in order to locate the mode
4992 	 * page data.  ATAPI devices return 0, SCSI devices should return
4993 	 * MODE_BLK_DESC_LENGTH.
4994 	 */
4995 	headerp = (struct mode_header *)p3bufp;
4996 	if (un->un_f_cfg_is_atapi == TRUE) {
4997 		struct mode_header_grp2 *mhp =
4998 		    (struct mode_header_grp2 *)headerp;
4999 		mode_header_length = MODE_HEADER_LENGTH_GRP2;
5000 		bd_len = (mhp->bdesc_length_hi << 8) | mhp->bdesc_length_lo;
5001 	} else {
5002 		mode_header_length = MODE_HEADER_LENGTH;
5003 		bd_len = ((struct mode_header *)headerp)->bdesc_length;
5004 	}
5005 
5006 	if (bd_len > MODE_BLK_DESC_LENGTH) {
5007 		sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON,
5008 		    "sd_get_physical_geometry: received unexpected bd_len "
5009 		    "of %d, page3\n", bd_len);
5010 		status = EIO;
5011 		goto page3_exit;
5012 	}
5013 
5014 	page3p = (struct mode_format *)
5015 	    ((caddr_t)headerp + mode_header_length + bd_len);
5016 
5017 	if (page3p->mode_page.code != SD_MODE_SENSE_PAGE3_CODE) {
5018 		sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON,
5019 		    "sd_get_physical_geometry: mode sense pg3 code mismatch "
5020 		    "%d\n", page3p->mode_page.code);
5021 		status = EIO;
5022 		goto page3_exit;
5023 	}
5024 
5025 	/*
5026 	 * Use this physical geometry data only if BOTH MODE SENSE commands
5027 	 * complete successfully; otherwise, revert to the logical geometry.
5028 	 * So, we need to save everything in temporary variables.
5029 	 */
5030 	sector_size = BE_16(page3p->data_bytes_sect);
5031 
5032 	/*
5033 	 * 1243403: The NEC D38x7 drives do not support MODE SENSE sector size
5034 	 */
5035 	if (sector_size == 0) {
5036 		sector_size = un->un_sys_blocksize;
5037 	} else {
5038 		sector_size &= ~(un->un_sys_blocksize - 1);
5039 	}
5040 
5041 	nsect  = BE_16(page3p->sect_track);
5042 	intrlv = BE_16(page3p->interleave);
5043 
5044 	SD_INFO(SD_LOG_COMMON, un,
5045 	    "sd_get_physical_geometry: Format Parameters (page 3)\n");
5046 	SD_INFO(SD_LOG_COMMON, un,
5047 	    "   mode page: %d; nsect: %d; sector size: %d;\n",
5048 	    page3p->mode_page.code, nsect, sector_size);
5049 	SD_INFO(SD_LOG_COMMON, un,
5050 	    "   interleave: %d; track skew: %d; cylinder skew: %d;\n", intrlv,
5051 	    BE_16(page3p->track_skew),
5052 	    BE_16(page3p->cylinder_skew));
5053 
5054 	sd_ssc_assessment(ssc, SD_FMT_STANDARD);
5055 
5056 	/*
5057 	 * Retrieve MODE SENSE page 4 - Rigid Disk Drive Geometry Page
5058 	 */
5059 	p4bufp = kmem_zalloc(SD_MODE_SENSE_PAGE4_LENGTH, KM_SLEEP);
5060 	status = sd_send_scsi_MODE_SENSE(ssc, cdbsize, p4bufp,
5061 	    SD_MODE_SENSE_PAGE4_LENGTH, SD_MODE_SENSE_PAGE4_CODE, path_flag);
5062 	if (status != 0) {
5063 		SD_ERROR(SD_LOG_COMMON, un,
5064 		    "sd_get_physical_geometry: mode sense page 4 failed\n");
5065 		goto page4_exit;
5066 	}
5067 
5068 	/*
5069 	 * Determine size of Block Descriptors in order to locate the mode
5070 	 * page data.  ATAPI devices return 0, SCSI devices should return
5071 	 * MODE_BLK_DESC_LENGTH.
5072 	 */
5073 	headerp = (struct mode_header *)p4bufp;
5074 	if (un->un_f_cfg_is_atapi == TRUE) {
5075 		struct mode_header_grp2 *mhp =
5076 		    (struct mode_header_grp2 *)headerp;
5077 		bd_len = (mhp->bdesc_length_hi << 8) | mhp->bdesc_length_lo;
5078 	} else {
5079 		bd_len = ((struct mode_header *)headerp)->bdesc_length;
5080 	}
5081 
5082 	if (bd_len > MODE_BLK_DESC_LENGTH) {
5083 		sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON,
5084 		    "sd_get_physical_geometry: received unexpected bd_len of "
5085 		    "%d, page4\n", bd_len);
5086 		status = EIO;
5087 		goto page4_exit;
5088 	}
5089 
5090 	page4p = (struct mode_geometry *)
5091 	    ((caddr_t)headerp + mode_header_length + bd_len);
5092 
5093 	if (page4p->mode_page.code != SD_MODE_SENSE_PAGE4_CODE) {
5094 		sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON,
5095 		    "sd_get_physical_geometry: mode sense pg4 code mismatch "
5096 		    "%d\n", page4p->mode_page.code);
5097 		status = EIO;
5098 		goto page4_exit;
5099 	}
5100 
5101 	/*
5102 	 * Stash the data now, after we know that both commands completed.
5103 	 */
5104 
5105 
5106 	nhead = (int)page4p->heads;	/* uchar, so no conversion needed */
5107 	spc   = nhead * nsect;
5108 	ncyl  = (page4p->cyl_ub << 16) + (page4p->cyl_mb << 8) + page4p->cyl_lb;
5109 	rpm   = BE_16(page4p->rpm);
5110 
5111 	modesense_capacity = spc * ncyl;
5112 
5113 	SD_INFO(SD_LOG_COMMON, un,
5114 	    "sd_get_physical_geometry: Geometry Parameters (page 4)\n");
5115 	SD_INFO(SD_LOG_COMMON, un,
5116 	    "   cylinders: %d; heads: %d; rpm: %d;\n", ncyl, nhead, rpm);
5117 	SD_INFO(SD_LOG_COMMON, un,
5118 	    "   computed capacity(h*s*c): %d;\n", modesense_capacity);
5119 	SD_INFO(SD_LOG_COMMON, un, "   pgeom_p: %p; read cap: %d\n",
5120 	    (void *)pgeom_p, capacity);
5121 
5122 	/*
5123 	 * Compensate if the drive's geometry is not rectangular, i.e.,
5124 	 * the product of C * H * S returned by MODE SENSE >= that returned
5125 	 * by read capacity. This is an idiosyncrasy of the original x86
5126 	 * disk subsystem.
5127 	 */
5128 	if (modesense_capacity >= capacity) {
5129 		SD_INFO(SD_LOG_COMMON, un,
5130 		    "sd_get_physical_geometry: adjusting acyl; "
5131 		    "old: %d; new: %d\n", pgeom_p->g_acyl,
5132 		    (modesense_capacity - capacity + spc - 1) / spc);
5133 		if (sector_size != 0) {
5134 			/* 1243403: NEC D38x7 drives don't support sec size */
5135 			pgeom_p->g_secsize = (unsigned short)sector_size;
5136 		}
5137 		pgeom_p->g_nsect    = (unsigned short)nsect;
5138 		pgeom_p->g_nhead    = (unsigned short)nhead;
5139 		pgeom_p->g_capacity = capacity;
5140 		pgeom_p->g_acyl	    =
5141 		    (modesense_capacity - pgeom_p->g_capacity + spc - 1) / spc;
5142 		pgeom_p->g_ncyl	    = ncyl - pgeom_p->g_acyl;
5143 	}
5144 
5145 	pgeom_p->g_rpm    = (unsigned short)rpm;
5146 	pgeom_p->g_intrlv = (unsigned short)intrlv;
5147 	ret = 0;
5148 
5149 	SD_INFO(SD_LOG_COMMON, un,
5150 	    "sd_get_physical_geometry: mode sense geometry:\n");
5151 	SD_INFO(SD_LOG_COMMON, un,
5152 	    "   nsect: %d; sector size: %d; interlv: %d\n",
5153 	    nsect, sector_size, intrlv);
5154 	SD_INFO(SD_LOG_COMMON, un,
5155 	    "   nhead: %d; ncyl: %d; rpm: %d; capacity(ms): %d\n",
5156 	    nhead, ncyl, rpm, modesense_capacity);
5157 	SD_INFO(SD_LOG_COMMON, un,
5158 	    "sd_get_physical_geometry: (cached)\n");
5159 	SD_INFO(SD_LOG_COMMON, un,
5160 	    "   ncyl: %ld; acyl: %d; nhead: %d; nsect: %d\n",
5161 	    pgeom_p->g_ncyl,  pgeom_p->g_acyl,
5162 	    pgeom_p->g_nhead, pgeom_p->g_nsect);
5163 	SD_INFO(SD_LOG_COMMON, un,
5164 	    "   lbasize: %d; capacity: %ld; intrlv: %d; rpm: %d\n",
5165 	    pgeom_p->g_secsize, pgeom_p->g_capacity,
5166 	    pgeom_p->g_intrlv, pgeom_p->g_rpm);
5167 	sd_ssc_assessment(ssc, SD_FMT_STANDARD);
5168 
5169 page4_exit:
5170 	kmem_free(p4bufp, SD_MODE_SENSE_PAGE4_LENGTH);
5171 
5172 page3_exit:
5173 	kmem_free(p3bufp, SD_MODE_SENSE_PAGE3_LENGTH);
5174 
5175 	if (status != 0) {
5176 		if (status == EIO) {
5177 			/*
5178 			 * Some disks do not support mode sense(6), we
5179 			 * should ignore this kind of error(sense key is
5180 			 * 0x5 - illegal request).
5181 			 */
5182 			uint8_t *sensep;
5183 			int senlen;
5184 
5185 			sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf;
5186 			senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen -
5187 			    ssc->ssc_uscsi_cmd->uscsi_rqresid);
5188 
5189 			if (senlen > 0 &&
5190 			    scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) {
5191 				sd_ssc_assessment(ssc,
5192 				    SD_FMT_IGNORE_COMPROMISE);
5193 			} else {
5194 				sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
5195 			}
5196 		} else {
5197 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5198 		}
5199 	}
5200 	sd_ssc_fini(ssc);
5201 	return (ret);
5202 }
5203 
5204 /*
5205  *    Function: sd_get_virtual_geometry
5206  *
5207  * Description: Ask the controller to tell us about the target device.
5208  *
5209  *   Arguments: un - pointer to softstate
5210  *		capacity - disk capacity in #blocks
5211  *		lbasize - disk block size in bytes
5212  *
5213  *     Context: Kernel thread only
5214  */
5215 
5216 static int
5217 sd_get_virtual_geometry(struct sd_lun *un, cmlb_geom_t *lgeom_p,
5218     diskaddr_t capacity, int lbasize)
5219 {
5220 	uint_t	geombuf;
5221 	int	spc;
5222 
5223 	ASSERT(un != NULL);
5224 
5225 	/* Set sector size, and total number of sectors */
5226 	(void) scsi_ifsetcap(SD_ADDRESS(un), "sector-size",   lbasize,  1);
5227 	(void) scsi_ifsetcap(SD_ADDRESS(un), "total-sectors", capacity, 1);
5228 
5229 	/* Let the HBA tell us its geometry */
5230 	geombuf = (uint_t)scsi_ifgetcap(SD_ADDRESS(un), "geometry", 1);
5231 
5232 	/* A value of -1 indicates an undefined "geometry" property */
5233 	if (geombuf == (-1)) {
5234 		return (EINVAL);
5235 	}
5236 
5237 	/* Initialize the logical geometry cache. */
5238 	lgeom_p->g_nhead   = (geombuf >> 16) & 0xffff;
5239 	lgeom_p->g_nsect   = geombuf & 0xffff;
5240 	lgeom_p->g_secsize = un->un_sys_blocksize;
5241 
5242 	spc = lgeom_p->g_nhead * lgeom_p->g_nsect;
5243 
5244 	/*
5245 	 * Note: The driver originally converted the capacity value from
5246 	 * target blocks to system blocks. However, the capacity value passed
5247 	 * to this routine is already in terms of system blocks (this scaling
5248 	 * is done when the READ CAPACITY command is issued and processed).
5249 	 * This 'error' may have gone undetected because the usage of g_ncyl
5250 	 * (which is based upon g_capacity) is very limited within the driver
5251 	 */
5252 	lgeom_p->g_capacity = capacity;
5253 
5254 	/*
5255 	 * Set ncyl to zero if the hba returned a zero nhead or nsect value. The
5256 	 * hba may return zero values if the device has been removed.
5257 	 */
5258 	if (spc == 0) {
5259 		lgeom_p->g_ncyl = 0;
5260 	} else {
5261 		lgeom_p->g_ncyl = lgeom_p->g_capacity / spc;
5262 	}
5263 	lgeom_p->g_acyl = 0;
5264 
5265 	SD_INFO(SD_LOG_COMMON, un, "sd_get_virtual_geometry: (cached)\n");
5266 	return (0);
5267 
5268 }
5269 /*
5270  *    Function: sd_update_block_info
5271  *
5272  * Description: Calculate a byte count to sector count bitshift value
5273  *		from sector size.
5274  *
5275  *   Arguments: un: unit struct.
5276  *		lbasize: new target sector size
5277  *		capacity: new target capacity, ie. block count
5278  *
5279  *     Context: Kernel thread context
5280  */
5281 
5282 static void
5283 sd_update_block_info(struct sd_lun *un, uint32_t lbasize, uint64_t capacity)
5284 {
5285 	if (lbasize != 0) {
5286 		un->un_tgt_blocksize = lbasize;
5287 		un->un_f_tgt_blocksize_is_valid = TRUE;
5288 		if (!un->un_f_has_removable_media) {
5289 			un->un_sys_blocksize = lbasize;
5290 		}
5291 	}
5292 
5293 	if (capacity != 0) {
5294 		un->un_blockcount		= capacity;
5295 		un->un_f_blockcount_is_valid	= TRUE;
5296 
5297 		/*
5298 		 * The capacity has changed so update the errstats.
5299 		 */
5300 		if (un->un_errstats != NULL) {
5301 			struct sd_errstats *stp;
5302 
5303 			capacity *= un->un_sys_blocksize;
5304 			stp = (struct sd_errstats *)un->un_errstats->ks_data;
5305 			if (stp->sd_capacity.value.ui64 < capacity)
5306 				stp->sd_capacity.value.ui64 = capacity;
5307 		}
5308 	}
5309 }
5310 
5311 
5312 /*
5313  *    Function: sd_register_devid
5314  *
5315  * Description: This routine will obtain the device id information from the
5316  *		target, obtain the serial number, and register the device
5317  *		id with the ddi framework.
5318  *
5319  *   Arguments: devi - the system's dev_info_t for the device.
5320  *		un - driver soft state (unit) structure
5321  *		reservation_flag - indicates if a reservation conflict
5322  *		occurred during attach
5323  *
5324  *     Context: Kernel Thread
5325  */
5326 static void
5327 sd_register_devid(sd_ssc_t *ssc, dev_info_t *devi, int reservation_flag)
5328 {
5329 	int		rval		= 0;
5330 	uchar_t		*inq80		= NULL;
5331 	size_t		inq80_len	= MAX_INQUIRY_SIZE;
5332 	size_t		inq80_resid	= 0;
5333 	uchar_t		*inq83		= NULL;
5334 	size_t		inq83_len	= MAX_INQUIRY_SIZE;
5335 	size_t		inq83_resid	= 0;
5336 	int		dlen, len;
5337 	char		*sn;
5338 	struct sd_lun	*un;
5339 
5340 	ASSERT(ssc != NULL);
5341 	un = ssc->ssc_un;
5342 	ASSERT(un != NULL);
5343 	ASSERT(mutex_owned(SD_MUTEX(un)));
5344 	ASSERT((SD_DEVINFO(un)) == devi);
5345 
5346 
5347 	/*
5348 	 * We check the availability of the World Wide Name (0x83) and Unit
5349 	 * Serial Number (0x80) pages in sd_check_vpd_page_support(), and using
5350 	 * un_vpd_page_mask from them, we decide which way to get the WWN.  If
5351 	 * 0x83 is available, that is the best choice.  Our next choice is
5352 	 * 0x80.  If neither are available, we munge the devid from the device
5353 	 * vid/pid/serial # for Sun qualified disks, or use the ddi framework
5354 	 * to fabricate a devid for non-Sun qualified disks.
5355 	 */
5356 	if (sd_check_vpd_page_support(ssc) == 0) {
5357 		/* collect page 80 data if available */
5358 		if (un->un_vpd_page_mask & SD_VPD_UNIT_SERIAL_PG) {
5359 
5360 			mutex_exit(SD_MUTEX(un));
5361 			inq80 = kmem_zalloc(inq80_len, KM_SLEEP);
5362 
5363 			rval = sd_send_scsi_INQUIRY(ssc, inq80, inq80_len,
5364 			    0x01, 0x80, &inq80_resid);
5365 
5366 			if (rval != 0) {
5367 				sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5368 				kmem_free(inq80, inq80_len);
5369 				inq80 = NULL;
5370 				inq80_len = 0;
5371 			} else if (ddi_prop_exists(
5372 			    DDI_DEV_T_NONE, SD_DEVINFO(un),
5373 			    DDI_PROP_NOTPROM | DDI_PROP_DONTPASS,
5374 			    INQUIRY_SERIAL_NO) == 0) {
5375 				/*
5376 				 * If we don't already have a serial number
5377 				 * property, do quick verify of data returned
5378 				 * and define property.
5379 				 */
5380 				dlen = inq80_len - inq80_resid;
5381 				len = (size_t)inq80[3];
5382 				if ((dlen >= 4) && ((len + 4) <= dlen)) {
5383 					/*
5384 					 * Ensure sn termination, skip leading
5385 					 * blanks, and create property
5386 					 * 'inquiry-serial-no'.
5387 					 */
5388 					sn = (char *)&inq80[4];
5389 					sn[len] = 0;
5390 					while (*sn && (*sn == ' '))
5391 						sn++;
5392 					if (*sn) {
5393 						(void) ddi_prop_update_string(
5394 						    DDI_DEV_T_NONE,
5395 						    SD_DEVINFO(un),
5396 						    INQUIRY_SERIAL_NO, sn);
5397 					}
5398 				}
5399 			}
5400 			mutex_enter(SD_MUTEX(un));
5401 		}
5402 
5403 		/* collect page 83 data if available */
5404 		if (un->un_vpd_page_mask & SD_VPD_DEVID_WWN_PG) {
5405 			mutex_exit(SD_MUTEX(un));
5406 			inq83 = kmem_zalloc(inq83_len, KM_SLEEP);
5407 
5408 			rval = sd_send_scsi_INQUIRY(ssc, inq83, inq83_len,
5409 			    0x01, 0x83, &inq83_resid);
5410 
5411 			if (rval != 0) {
5412 				sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5413 				kmem_free(inq83, inq83_len);
5414 				inq83 = NULL;
5415 				inq83_len = 0;
5416 			}
5417 			mutex_enter(SD_MUTEX(un));
5418 		}
5419 	}
5420 
5421 	/*
5422 	 * If transport has already registered a devid for this target
5423 	 * then that takes precedence over the driver's determination
5424 	 * of the devid.
5425 	 *
5426 	 * NOTE: The reason this check is done here instead of at the beginning
5427 	 * of the function is to allow the code above to create the
5428 	 * 'inquiry-serial-no' property.
5429 	 */
5430 	if (ddi_devid_get(SD_DEVINFO(un), &un->un_devid) == DDI_SUCCESS) {
5431 		ASSERT(un->un_devid);
5432 		un->un_f_devid_transport_defined = TRUE;
5433 		goto cleanup; /* use devid registered by the transport */
5434 	}
5435 
5436 	/*
5437 	 * This is the case of antiquated Sun disk drives that have the
5438 	 * FAB_DEVID property set in the disk_table.  These drives
5439 	 * manage the devid's by storing them in last 2 available sectors
5440 	 * on the drive and have them fabricated by the ddi layer by calling
5441 	 * ddi_devid_init and passing the DEVID_FAB flag.
5442 	 */
5443 	if (un->un_f_opt_fab_devid == TRUE) {
5444 		/*
5445 		 * Depending on EINVAL isn't reliable, since a reserved disk
5446 		 * may result in invalid geometry, so check to make sure a
5447 		 * reservation conflict did not occur during attach.
5448 		 */
5449 		if ((sd_get_devid(ssc) == EINVAL) &&
5450 		    (reservation_flag != SD_TARGET_IS_RESERVED)) {
5451 			/*
5452 			 * The devid is invalid AND there is no reservation
5453 			 * conflict.  Fabricate a new devid.
5454 			 */
5455 			(void) sd_create_devid(ssc);
5456 		}
5457 
5458 		/* Register the devid if it exists */
5459 		if (un->un_devid != NULL) {
5460 			(void) ddi_devid_register(SD_DEVINFO(un),
5461 			    un->un_devid);
5462 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
5463 			    "sd_register_devid: Devid Fabricated\n");
5464 		}
5465 		goto cleanup;
5466 	}
5467 
5468 	/* encode best devid possible based on data available */
5469 	if (ddi_devid_scsi_encode(DEVID_SCSI_ENCODE_VERSION_LATEST,
5470 	    (char *)ddi_driver_name(SD_DEVINFO(un)),
5471 	    (uchar_t *)SD_INQUIRY(un), sizeof (*SD_INQUIRY(un)),
5472 	    inq80, inq80_len - inq80_resid, inq83, inq83_len -
5473 	    inq83_resid, &un->un_devid) == DDI_SUCCESS) {
5474 
5475 		/* devid successfully encoded, register devid */
5476 		(void) ddi_devid_register(SD_DEVINFO(un), un->un_devid);
5477 
5478 	} else {
5479 		/*
5480 		 * Unable to encode a devid based on data available.
5481 		 * This is not a Sun qualified disk.  Older Sun disk
5482 		 * drives that have the SD_FAB_DEVID property
5483 		 * set in the disk_table and non Sun qualified
5484 		 * disks are treated in the same manner.  These
5485 		 * drives manage the devid's by storing them in
5486 		 * last 2 available sectors on the drive and
5487 		 * have them fabricated by the ddi layer by
5488 		 * calling ddi_devid_init and passing the
5489 		 * DEVID_FAB flag.
5490 		 * Create a fabricate devid only if there's no
5491 		 * fabricate devid existed.
5492 		 */
5493 		if (sd_get_devid(ssc) == EINVAL) {
5494 			(void) sd_create_devid(ssc);
5495 		}
5496 		un->un_f_opt_fab_devid = TRUE;
5497 
5498 		/* Register the devid if it exists */
5499 		if (un->un_devid != NULL) {
5500 			(void) ddi_devid_register(SD_DEVINFO(un),
5501 			    un->un_devid);
5502 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
5503 			    "sd_register_devid: devid fabricated using "
5504 			    "ddi framework\n");
5505 		}
5506 	}
5507 
5508 cleanup:
5509 	/* clean up resources */
5510 	if (inq80 != NULL) {
5511 		kmem_free(inq80, inq80_len);
5512 	}
5513 	if (inq83 != NULL) {
5514 		kmem_free(inq83, inq83_len);
5515 	}
5516 }
5517 
5518 
5519 
5520 /*
5521  *    Function: sd_get_devid
5522  *
5523  * Description: This routine will return 0 if a valid device id has been
5524  *		obtained from the target and stored in the soft state. If a
5525  *		valid device id has not been previously read and stored, a
5526  *		read attempt will be made.
5527  *
5528  *   Arguments: un - driver soft state (unit) structure
5529  *
5530  * Return Code: 0 if we successfully get the device id
5531  *
5532  *     Context: Kernel Thread
5533  */
5534 
5535 static int
5536 sd_get_devid(sd_ssc_t *ssc)
5537 {
5538 	struct dk_devid		*dkdevid;
5539 	ddi_devid_t		tmpid;
5540 	uint_t			*ip;
5541 	size_t			sz;
5542 	diskaddr_t		blk;
5543 	int			status;
5544 	int			chksum;
5545 	int			i;
5546 	size_t			buffer_size;
5547 	struct sd_lun		*un;
5548 
5549 	ASSERT(ssc != NULL);
5550 	un = ssc->ssc_un;
5551 	ASSERT(un != NULL);
5552 	ASSERT(mutex_owned(SD_MUTEX(un)));
5553 
5554 	SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_get_devid: entry: un: 0x%p\n",
5555 	    un);
5556 
5557 	if (un->un_devid != NULL) {
5558 		return (0);
5559 	}
5560 
5561 	mutex_exit(SD_MUTEX(un));
5562 	if (cmlb_get_devid_block(un->un_cmlbhandle, &blk,
5563 	    (void *)SD_PATH_DIRECT) != 0) {
5564 		mutex_enter(SD_MUTEX(un));
5565 		return (EINVAL);
5566 	}
5567 
5568 	/*
5569 	 * Read and verify device id, stored in the reserved cylinders at the
5570 	 * end of the disk. Backup label is on the odd sectors of the last
5571 	 * track of the last cylinder. Device id will be on track of the next
5572 	 * to last cylinder.
5573 	 */
5574 	mutex_enter(SD_MUTEX(un));
5575 	buffer_size = SD_REQBYTES2TGTBYTES(un, sizeof (struct dk_devid));
5576 	mutex_exit(SD_MUTEX(un));
5577 	dkdevid = kmem_alloc(buffer_size, KM_SLEEP);
5578 	status = sd_send_scsi_READ(ssc, dkdevid, buffer_size, blk,
5579 	    SD_PATH_DIRECT);
5580 
5581 	if (status != 0) {
5582 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5583 		goto error;
5584 	}
5585 
5586 	/* Validate the revision */
5587 	if ((dkdevid->dkd_rev_hi != DK_DEVID_REV_MSB) ||
5588 	    (dkdevid->dkd_rev_lo != DK_DEVID_REV_LSB)) {
5589 		status = EINVAL;
5590 		goto error;
5591 	}
5592 
5593 	/* Calculate the checksum */
5594 	chksum = 0;
5595 	ip = (uint_t *)dkdevid;
5596 	for (i = 0; i < ((DEV_BSIZE - sizeof (int)) / sizeof (int));
5597 	    i++) {
5598 		chksum ^= ip[i];
5599 	}
5600 
5601 	/* Compare the checksums */
5602 	if (DKD_GETCHKSUM(dkdevid) != chksum) {
5603 		status = EINVAL;
5604 		goto error;
5605 	}
5606 
5607 	/* Validate the device id */
5608 	if (ddi_devid_valid((ddi_devid_t)&dkdevid->dkd_devid) != DDI_SUCCESS) {
5609 		status = EINVAL;
5610 		goto error;
5611 	}
5612 
5613 	/*
5614 	 * Store the device id in the driver soft state
5615 	 */
5616 	sz = ddi_devid_sizeof((ddi_devid_t)&dkdevid->dkd_devid);
5617 	tmpid = kmem_alloc(sz, KM_SLEEP);
5618 
5619 	mutex_enter(SD_MUTEX(un));
5620 
5621 	un->un_devid = tmpid;
5622 	bcopy(&dkdevid->dkd_devid, un->un_devid, sz);
5623 
5624 	kmem_free(dkdevid, buffer_size);
5625 
5626 	SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_get_devid: exit: un:0x%p\n", un);
5627 
5628 	return (status);
5629 error:
5630 	mutex_enter(SD_MUTEX(un));
5631 	kmem_free(dkdevid, buffer_size);
5632 	return (status);
5633 }
5634 
5635 
5636 /*
5637  *    Function: sd_create_devid
5638  *
5639  * Description: This routine will fabricate the device id and write it
5640  *		to the disk.
5641  *
5642  *   Arguments: un - driver soft state (unit) structure
5643  *
5644  * Return Code: value of the fabricated device id
5645  *
5646  *     Context: Kernel Thread
5647  */
5648 
5649 static ddi_devid_t
5650 sd_create_devid(sd_ssc_t *ssc)
5651 {
5652 	struct sd_lun	*un;
5653 
5654 	ASSERT(ssc != NULL);
5655 	un = ssc->ssc_un;
5656 	ASSERT(un != NULL);
5657 
5658 	/* Fabricate the devid */
5659 	if (ddi_devid_init(SD_DEVINFO(un), DEVID_FAB, 0, NULL, &un->un_devid)
5660 	    == DDI_FAILURE) {
5661 		return (NULL);
5662 	}
5663 
5664 	/* Write the devid to disk */
5665 	if (sd_write_deviceid(ssc) != 0) {
5666 		ddi_devid_free(un->un_devid);
5667 		un->un_devid = NULL;
5668 	}
5669 
5670 	return (un->un_devid);
5671 }
5672 
5673 
5674 /*
5675  *    Function: sd_write_deviceid
5676  *
5677  * Description: This routine will write the device id to the disk
5678  *		reserved sector.
5679  *
5680  *   Arguments: un - driver soft state (unit) structure
5681  *
5682  * Return Code: EINVAL
5683  *		value returned by sd_send_scsi_cmd
5684  *
5685  *     Context: Kernel Thread
5686  */
5687 
5688 static int
5689 sd_write_deviceid(sd_ssc_t *ssc)
5690 {
5691 	struct dk_devid		*dkdevid;
5692 	uchar_t			*buf;
5693 	diskaddr_t		blk;
5694 	uint_t			*ip, chksum;
5695 	int			status;
5696 	int			i;
5697 	struct sd_lun		*un;
5698 
5699 	ASSERT(ssc != NULL);
5700 	un = ssc->ssc_un;
5701 	ASSERT(un != NULL);
5702 	ASSERT(mutex_owned(SD_MUTEX(un)));
5703 
5704 	mutex_exit(SD_MUTEX(un));
5705 	if (cmlb_get_devid_block(un->un_cmlbhandle, &blk,
5706 	    (void *)SD_PATH_DIRECT) != 0) {
5707 		mutex_enter(SD_MUTEX(un));
5708 		return (-1);
5709 	}
5710 
5711 
5712 	/* Allocate the buffer */
5713 	buf = kmem_zalloc(un->un_sys_blocksize, KM_SLEEP);
5714 	dkdevid = (struct dk_devid *)buf;
5715 
5716 	/* Fill in the revision */
5717 	dkdevid->dkd_rev_hi = DK_DEVID_REV_MSB;
5718 	dkdevid->dkd_rev_lo = DK_DEVID_REV_LSB;
5719 
5720 	/* Copy in the device id */
5721 	mutex_enter(SD_MUTEX(un));
5722 	bcopy(un->un_devid, &dkdevid->dkd_devid,
5723 	    ddi_devid_sizeof(un->un_devid));
5724 	mutex_exit(SD_MUTEX(un));
5725 
5726 	/* Calculate the checksum */
5727 	chksum = 0;
5728 	ip = (uint_t *)dkdevid;
5729 	for (i = 0; i < ((DEV_BSIZE - sizeof (int)) / sizeof (int));
5730 	    i++) {
5731 		chksum ^= ip[i];
5732 	}
5733 
5734 	/* Fill-in checksum */
5735 	DKD_FORMCHKSUM(chksum, dkdevid);
5736 
5737 	/* Write the reserved sector */
5738 	status = sd_send_scsi_WRITE(ssc, buf, un->un_sys_blocksize, blk,
5739 	    SD_PATH_DIRECT);
5740 	if (status != 0)
5741 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5742 
5743 	kmem_free(buf, un->un_sys_blocksize);
5744 
5745 	mutex_enter(SD_MUTEX(un));
5746 	return (status);
5747 }
5748 
5749 
5750 /*
5751  *    Function: sd_check_vpd_page_support
5752  *
5753  * Description: This routine sends an inquiry command with the EVPD bit set and
5754  *		a page code of 0x00 to the device. It is used to determine which
5755  *		vital product pages are available to find the devid. We are
5756  *		looking for pages 0x83 0x80 or 0xB1.  If we return a negative 1,
5757  *		the device does not support that command.
5758  *
5759  *   Arguments: un  - driver soft state (unit) structure
5760  *
5761  * Return Code: 0 - success
5762  *		1 - check condition
5763  *
5764  *     Context: This routine can sleep.
5765  */
5766 
5767 static int
5768 sd_check_vpd_page_support(sd_ssc_t *ssc)
5769 {
5770 	uchar_t	*page_list	= NULL;
5771 	uchar_t	page_length	= 0xff;	/* Use max possible length */
5772 	uchar_t	evpd		= 0x01;	/* Set the EVPD bit */
5773 	uchar_t	page_code	= 0x00;	/* Supported VPD Pages */
5774 	int    	rval		= 0;
5775 	int	counter;
5776 	struct sd_lun		*un;
5777 
5778 	ASSERT(ssc != NULL);
5779 	un = ssc->ssc_un;
5780 	ASSERT(un != NULL);
5781 	ASSERT(mutex_owned(SD_MUTEX(un)));
5782 
5783 	mutex_exit(SD_MUTEX(un));
5784 
5785 	/*
5786 	 * We'll set the page length to the maximum to save figuring it out
5787 	 * with an additional call.
5788 	 */
5789 	page_list =  kmem_zalloc(page_length, KM_SLEEP);
5790 
5791 	rval = sd_send_scsi_INQUIRY(ssc, page_list, page_length, evpd,
5792 	    page_code, NULL);
5793 
5794 	if (rval != 0)
5795 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5796 
5797 	mutex_enter(SD_MUTEX(un));
5798 
5799 	/*
5800 	 * Now we must validate that the device accepted the command, as some
5801 	 * drives do not support it.  If the drive does support it, we will
5802 	 * return 0, and the supported pages will be in un_vpd_page_mask.  If
5803 	 * not, we return -1.
5804 	 */
5805 	if ((rval == 0) && (page_list[VPD_MODE_PAGE] == 0x00)) {
5806 		/* Loop to find one of the 2 pages we need */
5807 		counter = 4;  /* Supported pages start at byte 4, with 0x00 */
5808 
5809 		/*
5810 		 * Pages are returned in ascending order, and 0x83 is what we
5811 		 * are hoping for.
5812 		 */
5813 		while ((page_list[counter] <= 0xB1) &&
5814 		    (counter <= (page_list[VPD_PAGE_LENGTH] +
5815 		    VPD_HEAD_OFFSET))) {
5816 			/*
5817 			 * Add 3 because page_list[3] is the number of
5818 			 * pages minus 3
5819 			 */
5820 
5821 			switch (page_list[counter]) {
5822 			case 0x00:
5823 				un->un_vpd_page_mask |= SD_VPD_SUPPORTED_PG;
5824 				break;
5825 			case 0x80:
5826 				un->un_vpd_page_mask |= SD_VPD_UNIT_SERIAL_PG;
5827 				break;
5828 			case 0x81:
5829 				un->un_vpd_page_mask |= SD_VPD_OPERATING_PG;
5830 				break;
5831 			case 0x82:
5832 				un->un_vpd_page_mask |= SD_VPD_ASCII_OP_PG;
5833 				break;
5834 			case 0x83:
5835 				un->un_vpd_page_mask |= SD_VPD_DEVID_WWN_PG;
5836 				break;
5837 			case 0x86:
5838 				un->un_vpd_page_mask |= SD_VPD_EXTENDED_DATA_PG;
5839 				break;
5840 			case 0xB1:
5841 				un->un_vpd_page_mask |= SD_VPD_DEV_CHARACTER_PG;
5842 				break;
5843 			}
5844 			counter++;
5845 		}
5846 
5847 	} else {
5848 		rval = -1;
5849 
5850 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
5851 		    "sd_check_vpd_page_support: This drive does not implement "
5852 		    "VPD pages.\n");
5853 	}
5854 
5855 	kmem_free(page_list, page_length);
5856 
5857 	return (rval);
5858 }
5859 
5860 
5861 /*
5862  *    Function: sd_setup_pm
5863  *
5864  * Description: Initialize Power Management on the device
5865  *
5866  *     Context: Kernel Thread
5867  */
5868 
5869 static void
5870 sd_setup_pm(sd_ssc_t *ssc, dev_info_t *devi)
5871 {
5872 	uint_t		log_page_size;
5873 	uchar_t		*log_page_data;
5874 	int		rval = 0;
5875 	struct sd_lun	*un;
5876 
5877 	ASSERT(ssc != NULL);
5878 	un = ssc->ssc_un;
5879 	ASSERT(un != NULL);
5880 
5881 	/*
5882 	 * Since we are called from attach, holding a mutex for
5883 	 * un is unnecessary. Because some of the routines called
5884 	 * from here require SD_MUTEX to not be held, assert this
5885 	 * right up front.
5886 	 */
5887 	ASSERT(!mutex_owned(SD_MUTEX(un)));
5888 	/*
5889 	 * Since the sd device does not have the 'reg' property,
5890 	 * cpr will not call its DDI_SUSPEND/DDI_RESUME entries.
5891 	 * The following code is to tell cpr that this device
5892 	 * DOES need to be suspended and resumed.
5893 	 */
5894 	(void) ddi_prop_update_string(DDI_DEV_T_NONE, devi,
5895 	    "pm-hardware-state", "needs-suspend-resume");
5896 
5897 	/*
5898 	 * This complies with the new power management framework
5899 	 * for certain desktop machines. Create the pm_components
5900 	 * property as a string array property.
5901 	 * If un_f_pm_supported is TRUE, that means the disk
5902 	 * attached HBA has set the "pm-capable" property and
5903 	 * the value of this property is bigger than 0.
5904 	 */
5905 	if (un->un_f_pm_supported) {
5906 		/*
5907 		 * not all devices have a motor, try it first.
5908 		 * some devices may return ILLEGAL REQUEST, some
5909 		 * will hang
5910 		 * The following START_STOP_UNIT is used to check if target
5911 		 * device has a motor.
5912 		 */
5913 		un->un_f_start_stop_supported = TRUE;
5914 
5915 		if (un->un_f_power_condition_supported) {
5916 			rval = sd_send_scsi_START_STOP_UNIT(ssc,
5917 			    SD_POWER_CONDITION, SD_TARGET_ACTIVE,
5918 			    SD_PATH_DIRECT);
5919 			if (rval != 0) {
5920 				un->un_f_power_condition_supported = FALSE;
5921 			}
5922 		}
5923 		if (!un->un_f_power_condition_supported) {
5924 			rval = sd_send_scsi_START_STOP_UNIT(ssc,
5925 			    SD_START_STOP, SD_TARGET_START, SD_PATH_DIRECT);
5926 		}
5927 		if (rval != 0) {
5928 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
5929 			un->un_f_start_stop_supported = FALSE;
5930 		}
5931 
5932 		/*
5933 		 * create pm properties anyways otherwise the parent can't
5934 		 * go to sleep
5935 		 */
5936 		un->un_f_pm_is_enabled = TRUE;
5937 		(void) sd_create_pm_components(devi, un);
5938 
5939 		/*
5940 		 * If it claims that log sense is supported, check it out.
5941 		 */
5942 		if (un->un_f_log_sense_supported) {
5943 			rval = sd_log_page_supported(ssc,
5944 			    START_STOP_CYCLE_PAGE);
5945 			if (rval == 1) {
5946 				/* Page found, use it. */
5947 				un->un_start_stop_cycle_page =
5948 				    START_STOP_CYCLE_PAGE;
5949 			} else {
5950 				/*
5951 				 * Page not found or log sense is not
5952 				 * supported.
5953 				 * Notice we do not check the old style
5954 				 * START_STOP_CYCLE_VU_PAGE because this
5955 				 * code path does not apply to old disks.
5956 				 */
5957 				un->un_f_log_sense_supported = FALSE;
5958 				un->un_f_pm_log_sense_smart = FALSE;
5959 			}
5960 		}
5961 
5962 		return;
5963 	}
5964 
5965 	/*
5966 	 * For the disk whose attached HBA has not set the "pm-capable"
5967 	 * property, check if it supports the power management.
5968 	 */
5969 	if (!un->un_f_log_sense_supported) {
5970 		un->un_power_level = SD_SPINDLE_ON;
5971 		un->un_f_pm_is_enabled = FALSE;
5972 		return;
5973 	}
5974 
5975 	rval = sd_log_page_supported(ssc, START_STOP_CYCLE_PAGE);
5976 
5977 #ifdef	SDDEBUG
5978 	if (sd_force_pm_supported) {
5979 		/* Force a successful result */
5980 		rval = 1;
5981 	}
5982 #endif
5983 
5984 	/*
5985 	 * If the start-stop cycle counter log page is not supported
5986 	 * or if the pm-capable property is set to be false (0),
5987 	 * then we should not create the pm_components property.
5988 	 */
5989 	if (rval == -1) {
5990 		/*
5991 		 * Error.
5992 		 * Reading log sense failed, most likely this is
5993 		 * an older drive that does not support log sense.
5994 		 * If this fails auto-pm is not supported.
5995 		 */
5996 		un->un_power_level = SD_SPINDLE_ON;
5997 		un->un_f_pm_is_enabled = FALSE;
5998 
5999 	} else if (rval == 0) {
6000 		/*
6001 		 * Page not found.
6002 		 * The start stop cycle counter is implemented as page
6003 		 * START_STOP_CYCLE_PAGE_VU_PAGE (0x31) in older disks. For
6004 		 * newer disks it is implemented as START_STOP_CYCLE_PAGE (0xE).
6005 		 */
6006 		if (sd_log_page_supported(ssc, START_STOP_CYCLE_VU_PAGE) == 1) {
6007 			/*
6008 			 * Page found, use this one.
6009 			 */
6010 			un->un_start_stop_cycle_page = START_STOP_CYCLE_VU_PAGE;
6011 			un->un_f_pm_is_enabled = TRUE;
6012 		} else {
6013 			/*
6014 			 * Error or page not found.
6015 			 * auto-pm is not supported for this device.
6016 			 */
6017 			un->un_power_level = SD_SPINDLE_ON;
6018 			un->un_f_pm_is_enabled = FALSE;
6019 		}
6020 	} else {
6021 		/*
6022 		 * Page found, use it.
6023 		 */
6024 		un->un_start_stop_cycle_page = START_STOP_CYCLE_PAGE;
6025 		un->un_f_pm_is_enabled = TRUE;
6026 	}
6027 
6028 
6029 	if (un->un_f_pm_is_enabled == TRUE) {
6030 		log_page_size = START_STOP_CYCLE_COUNTER_PAGE_SIZE;
6031 		log_page_data = kmem_zalloc(log_page_size, KM_SLEEP);
6032 
6033 		rval = sd_send_scsi_LOG_SENSE(ssc, log_page_data,
6034 		    log_page_size, un->un_start_stop_cycle_page,
6035 		    0x01, 0, SD_PATH_DIRECT);
6036 
6037 		if (rval != 0) {
6038 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
6039 		}
6040 
6041 #ifdef	SDDEBUG
6042 		if (sd_force_pm_supported) {
6043 			/* Force a successful result */
6044 			rval = 0;
6045 		}
6046 #endif
6047 
6048 		/*
6049 		 * If the Log sense for Page( Start/stop cycle counter page)
6050 		 * succeeds, then power management is supported and we can
6051 		 * enable auto-pm.
6052 		 */
6053 		if (rval == 0)  {
6054 			(void) sd_create_pm_components(devi, un);
6055 		} else {
6056 			un->un_power_level = SD_SPINDLE_ON;
6057 			un->un_f_pm_is_enabled = FALSE;
6058 		}
6059 
6060 		kmem_free(log_page_data, log_page_size);
6061 	}
6062 }
6063 
6064 
6065 /*
6066  *    Function: sd_create_pm_components
6067  *
6068  * Description: Initialize PM property.
6069  *
6070  *     Context: Kernel thread context
6071  */
6072 
6073 static void
6074 sd_create_pm_components(dev_info_t *devi, struct sd_lun *un)
6075 {
6076 	ASSERT(!mutex_owned(SD_MUTEX(un)));
6077 
6078 	if (un->un_f_power_condition_supported) {
6079 		if (ddi_prop_update_string_array(DDI_DEV_T_NONE, devi,
6080 		    "pm-components", sd_pwr_pc.pm_comp, 5)
6081 		    != DDI_PROP_SUCCESS) {
6082 			un->un_power_level = SD_SPINDLE_ACTIVE;
6083 			un->un_f_pm_is_enabled = FALSE;
6084 			return;
6085 		}
6086 	} else {
6087 		if (ddi_prop_update_string_array(DDI_DEV_T_NONE, devi,
6088 		    "pm-components", sd_pwr_ss.pm_comp, 3)
6089 		    != DDI_PROP_SUCCESS) {
6090 			un->un_power_level = SD_SPINDLE_ON;
6091 			un->un_f_pm_is_enabled = FALSE;
6092 			return;
6093 		}
6094 	}
6095 	/*
6096 	 * When components are initially created they are idle,
6097 	 * power up any non-removables.
6098 	 * Note: the return value of pm_raise_power can't be used
6099 	 * for determining if PM should be enabled for this device.
6100 	 * Even if you check the return values and remove this
6101 	 * property created above, the PM framework will not honor the
6102 	 * change after the first call to pm_raise_power. Hence,
6103 	 * removal of that property does not help if pm_raise_power
6104 	 * fails. In the case of removable media, the start/stop
6105 	 * will fail if the media is not present.
6106 	 */
6107 	if (un->un_f_attach_spinup && (pm_raise_power(SD_DEVINFO(un), 0,
6108 	    SD_PM_STATE_ACTIVE(un)) == DDI_SUCCESS)) {
6109 		mutex_enter(SD_MUTEX(un));
6110 		un->un_power_level = SD_PM_STATE_ACTIVE(un);
6111 		mutex_enter(&un->un_pm_mutex);
6112 		/* Set to on and not busy. */
6113 		un->un_pm_count = 0;
6114 	} else {
6115 		mutex_enter(SD_MUTEX(un));
6116 		un->un_power_level = SD_PM_STATE_STOPPED(un);
6117 		mutex_enter(&un->un_pm_mutex);
6118 		/* Set to off. */
6119 		un->un_pm_count = -1;
6120 	}
6121 	mutex_exit(&un->un_pm_mutex);
6122 	mutex_exit(SD_MUTEX(un));
6123 }
6124 
6125 
6126 /*
6127  *    Function: sd_ddi_suspend
6128  *
6129  * Description: Performs system power-down operations. This includes
6130  *		setting the drive state to indicate its suspended so
6131  *		that no new commands will be accepted. Also, wait for
6132  *		all commands that are in transport or queued to a timer
6133  *		for retry to complete. All timeout threads are cancelled.
6134  *
6135  * Return Code: DDI_FAILURE or DDI_SUCCESS
6136  *
6137  *     Context: Kernel thread context
6138  */
6139 
6140 static int
6141 sd_ddi_suspend(dev_info_t *devi)
6142 {
6143 	struct	sd_lun	*un;
6144 	clock_t		wait_cmds_complete;
6145 
6146 	un = ddi_get_soft_state(sd_state, ddi_get_instance(devi));
6147 	if (un == NULL) {
6148 		return (DDI_FAILURE);
6149 	}
6150 
6151 	SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: entry\n");
6152 
6153 	mutex_enter(SD_MUTEX(un));
6154 
6155 	/* Return success if the device is already suspended. */
6156 	if (un->un_state == SD_STATE_SUSPENDED) {
6157 		mutex_exit(SD_MUTEX(un));
6158 		SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: "
6159 		    "device already suspended, exiting\n");
6160 		return (DDI_SUCCESS);
6161 	}
6162 
6163 	/* Return failure if the device is being used by HA */
6164 	if (un->un_resvd_status &
6165 	    (SD_RESERVE | SD_WANT_RESERVE | SD_LOST_RESERVE)) {
6166 		mutex_exit(SD_MUTEX(un));
6167 		SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: "
6168 		    "device in use by HA, exiting\n");
6169 		return (DDI_FAILURE);
6170 	}
6171 
6172 	/*
6173 	 * Return failure if the device is in a resource wait
6174 	 * or power changing state.
6175 	 */
6176 	if ((un->un_state == SD_STATE_RWAIT) ||
6177 	    (un->un_state == SD_STATE_PM_CHANGING)) {
6178 		mutex_exit(SD_MUTEX(un));
6179 		SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: "
6180 		    "device in resource wait state, exiting\n");
6181 		return (DDI_FAILURE);
6182 	}
6183 
6184 
6185 	un->un_save_state = un->un_last_state;
6186 	New_state(un, SD_STATE_SUSPENDED);
6187 
6188 	/*
6189 	 * Wait for all commands that are in transport or queued to a timer
6190 	 * for retry to complete.
6191 	 *
6192 	 * While waiting, no new commands will be accepted or sent because of
6193 	 * the new state we set above.
6194 	 *
6195 	 * Wait till current operation has completed. If we are in the resource
6196 	 * wait state (with an intr outstanding) then we need to wait till the
6197 	 * intr completes and starts the next cmd. We want to wait for
6198 	 * SD_WAIT_CMDS_COMPLETE seconds before failing the DDI_SUSPEND.
6199 	 */
6200 	wait_cmds_complete = ddi_get_lbolt() +
6201 	    (sd_wait_cmds_complete * drv_usectohz(1000000));
6202 
6203 	while (un->un_ncmds_in_transport != 0) {
6204 		/*
6205 		 * Fail if commands do not finish in the specified time.
6206 		 */
6207 		if (cv_timedwait(&un->un_disk_busy_cv, SD_MUTEX(un),
6208 		    wait_cmds_complete) == -1) {
6209 			/*
6210 			 * Undo the state changes made above. Everything
6211 			 * must go back to it's original value.
6212 			 */
6213 			Restore_state(un);
6214 			un->un_last_state = un->un_save_state;
6215 			/* Wake up any threads that might be waiting. */
6216 			cv_broadcast(&un->un_suspend_cv);
6217 			mutex_exit(SD_MUTEX(un));
6218 			SD_ERROR(SD_LOG_IO_PM, un,
6219 			    "sd_ddi_suspend: failed due to outstanding cmds\n");
6220 			SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: exiting\n");
6221 			return (DDI_FAILURE);
6222 		}
6223 	}
6224 
6225 	/*
6226 	 * Cancel SCSI watch thread and timeouts, if any are active
6227 	 */
6228 
6229 	if (SD_OK_TO_SUSPEND_SCSI_WATCHER(un)) {
6230 		opaque_t temp_token = un->un_swr_token;
6231 		mutex_exit(SD_MUTEX(un));
6232 		scsi_watch_suspend(temp_token);
6233 		mutex_enter(SD_MUTEX(un));
6234 	}
6235 
6236 	if (un->un_reset_throttle_timeid != NULL) {
6237 		timeout_id_t temp_id = un->un_reset_throttle_timeid;
6238 		un->un_reset_throttle_timeid = NULL;
6239 		mutex_exit(SD_MUTEX(un));
6240 		(void) untimeout(temp_id);
6241 		mutex_enter(SD_MUTEX(un));
6242 	}
6243 
6244 	if (un->un_dcvb_timeid != NULL) {
6245 		timeout_id_t temp_id = un->un_dcvb_timeid;
6246 		un->un_dcvb_timeid = NULL;
6247 		mutex_exit(SD_MUTEX(un));
6248 		(void) untimeout(temp_id);
6249 		mutex_enter(SD_MUTEX(un));
6250 	}
6251 
6252 	mutex_enter(&un->un_pm_mutex);
6253 	if (un->un_pm_timeid != NULL) {
6254 		timeout_id_t temp_id = un->un_pm_timeid;
6255 		un->un_pm_timeid = NULL;
6256 		mutex_exit(&un->un_pm_mutex);
6257 		mutex_exit(SD_MUTEX(un));
6258 		(void) untimeout(temp_id);
6259 		mutex_enter(SD_MUTEX(un));
6260 	} else {
6261 		mutex_exit(&un->un_pm_mutex);
6262 	}
6263 
6264 	if (un->un_rmw_msg_timeid != NULL) {
6265 		timeout_id_t temp_id = un->un_rmw_msg_timeid;
6266 		un->un_rmw_msg_timeid = NULL;
6267 		mutex_exit(SD_MUTEX(un));
6268 		(void) untimeout(temp_id);
6269 		mutex_enter(SD_MUTEX(un));
6270 	}
6271 
6272 	if (un->un_retry_timeid != NULL) {
6273 		timeout_id_t temp_id = un->un_retry_timeid;
6274 		un->un_retry_timeid = NULL;
6275 		mutex_exit(SD_MUTEX(un));
6276 		(void) untimeout(temp_id);
6277 		mutex_enter(SD_MUTEX(un));
6278 
6279 		if (un->un_retry_bp != NULL) {
6280 			un->un_retry_bp->av_forw = un->un_waitq_headp;
6281 			un->un_waitq_headp = un->un_retry_bp;
6282 			if (un->un_waitq_tailp == NULL) {
6283 				un->un_waitq_tailp = un->un_retry_bp;
6284 			}
6285 			un->un_retry_bp = NULL;
6286 			un->un_retry_statp = NULL;
6287 		}
6288 	}
6289 
6290 	if (un->un_direct_priority_timeid != NULL) {
6291 		timeout_id_t temp_id = un->un_direct_priority_timeid;
6292 		un->un_direct_priority_timeid = NULL;
6293 		mutex_exit(SD_MUTEX(un));
6294 		(void) untimeout(temp_id);
6295 		mutex_enter(SD_MUTEX(un));
6296 	}
6297 
6298 	if (un->un_f_is_fibre == TRUE) {
6299 		/*
6300 		 * Remove callbacks for insert and remove events
6301 		 */
6302 		if (un->un_insert_event != NULL) {
6303 			mutex_exit(SD_MUTEX(un));
6304 			(void) ddi_remove_event_handler(un->un_insert_cb_id);
6305 			mutex_enter(SD_MUTEX(un));
6306 			un->un_insert_event = NULL;
6307 		}
6308 
6309 		if (un->un_remove_event != NULL) {
6310 			mutex_exit(SD_MUTEX(un));
6311 			(void) ddi_remove_event_handler(un->un_remove_cb_id);
6312 			mutex_enter(SD_MUTEX(un));
6313 			un->un_remove_event = NULL;
6314 		}
6315 	}
6316 
6317 	mutex_exit(SD_MUTEX(un));
6318 
6319 	SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: exit\n");
6320 
6321 	return (DDI_SUCCESS);
6322 }
6323 
6324 
6325 /*
6326  *    Function: sd_ddi_resume
6327  *
6328  * Description: Performs system power-up operations..
6329  *
6330  * Return Code: DDI_SUCCESS
6331  *		DDI_FAILURE
6332  *
6333  *     Context: Kernel thread context
6334  */
6335 
6336 static int
6337 sd_ddi_resume(dev_info_t *devi)
6338 {
6339 	struct	sd_lun	*un;
6340 
6341 	un = ddi_get_soft_state(sd_state, ddi_get_instance(devi));
6342 	if (un == NULL) {
6343 		return (DDI_FAILURE);
6344 	}
6345 
6346 	SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_resume: entry\n");
6347 
6348 	mutex_enter(SD_MUTEX(un));
6349 	Restore_state(un);
6350 
6351 	/*
6352 	 * Restore the state which was saved to give the
6353 	 * the right state in un_last_state
6354 	 */
6355 	un->un_last_state = un->un_save_state;
6356 	/*
6357 	 * Note: throttle comes back at full.
6358 	 * Also note: this MUST be done before calling pm_raise_power
6359 	 * otherwise the system can get hung in biowait. The scenario where
6360 	 * this'll happen is under cpr suspend. Writing of the system
6361 	 * state goes through sddump, which writes 0 to un_throttle. If
6362 	 * writing the system state then fails, example if the partition is
6363 	 * too small, then cpr attempts a resume. If throttle isn't restored
6364 	 * from the saved value until after calling pm_raise_power then
6365 	 * cmds sent in sdpower are not transported and sd_send_scsi_cmd hangs
6366 	 * in biowait.
6367 	 */
6368 	un->un_throttle = un->un_saved_throttle;
6369 
6370 	/*
6371 	 * The chance of failure is very rare as the only command done in power
6372 	 * entry point is START command when you transition from 0->1 or
6373 	 * unknown->1. Put it to SPINDLE ON state irrespective of the state at
6374 	 * which suspend was done. Ignore the return value as the resume should
6375 	 * not be failed. In the case of removable media the media need not be
6376 	 * inserted and hence there is a chance that raise power will fail with
6377 	 * media not present.
6378 	 */
6379 	if (un->un_f_attach_spinup) {
6380 		mutex_exit(SD_MUTEX(un));
6381 		(void) pm_raise_power(SD_DEVINFO(un), 0,
6382 		    SD_PM_STATE_ACTIVE(un));
6383 		mutex_enter(SD_MUTEX(un));
6384 	}
6385 
6386 	/*
6387 	 * Don't broadcast to the suspend cv and therefore possibly
6388 	 * start I/O until after power has been restored.
6389 	 */
6390 	cv_broadcast(&un->un_suspend_cv);
6391 	cv_broadcast(&un->un_state_cv);
6392 
6393 	/* restart thread */
6394 	if (SD_OK_TO_RESUME_SCSI_WATCHER(un)) {
6395 		scsi_watch_resume(un->un_swr_token);
6396 	}
6397 
6398 #if (defined(__fibre))
6399 	if (un->un_f_is_fibre == TRUE) {
6400 		/*
6401 		 * Add callbacks for insert and remove events
6402 		 */
6403 		if (strcmp(un->un_node_type, DDI_NT_BLOCK_CHAN)) {
6404 			sd_init_event_callbacks(un);
6405 		}
6406 	}
6407 #endif
6408 
6409 	/*
6410 	 * Transport any pending commands to the target.
6411 	 *
6412 	 * If this is a low-activity device commands in queue will have to wait
6413 	 * until new commands come in, which may take awhile. Also, we
6414 	 * specifically don't check un_ncmds_in_transport because we know that
6415 	 * there really are no commands in progress after the unit was
6416 	 * suspended and we could have reached the throttle level, been
6417 	 * suspended, and have no new commands coming in for awhile. Highly
6418 	 * unlikely, but so is the low-activity disk scenario.
6419 	 */
6420 	ddi_xbuf_dispatch(un->un_xbuf_attr);
6421 
6422 	sd_start_cmds(un, NULL);
6423 	mutex_exit(SD_MUTEX(un));
6424 
6425 	SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_resume: exit\n");
6426 
6427 	return (DDI_SUCCESS);
6428 }
6429 
6430 
6431 /*
6432  *    Function: sd_pm_state_change
6433  *
6434  * Description: Change the driver power state.
6435  * 		Someone else is required to actually change the driver
6436  * 		power level.
6437  *
6438  *   Arguments: un - driver soft state (unit) structure
6439  *              level - the power level that is changed to
6440  *              flag - to decide how to change the power state
6441  *
6442  * Return Code: DDI_SUCCESS
6443  *
6444  *     Context: Kernel thread context
6445  */
6446 static int
6447 sd_pm_state_change(struct sd_lun *un, int level, int flag)
6448 {
6449 	ASSERT(un != NULL);
6450 	SD_TRACE(SD_LOG_POWER, un, "sd_pm_state_change: entry\n");
6451 
6452 	ASSERT(!mutex_owned(SD_MUTEX(un)));
6453 	mutex_enter(SD_MUTEX(un));
6454 
6455 	if (flag == SD_PM_STATE_ROLLBACK || SD_PM_IS_IO_CAPABLE(un, level)) {
6456 		un->un_power_level = level;
6457 		ASSERT(!mutex_owned(&un->un_pm_mutex));
6458 		mutex_enter(&un->un_pm_mutex);
6459 		if (SD_DEVICE_IS_IN_LOW_POWER(un)) {
6460 			un->un_pm_count++;
6461 			ASSERT(un->un_pm_count == 0);
6462 		}
6463 		mutex_exit(&un->un_pm_mutex);
6464 	} else {
6465 		/*
6466 		 * Exit if power management is not enabled for this device,
6467 		 * or if the device is being used by HA.
6468 		 */
6469 		if ((un->un_f_pm_is_enabled == FALSE) || (un->un_resvd_status &
6470 		    (SD_RESERVE | SD_WANT_RESERVE | SD_LOST_RESERVE))) {
6471 			mutex_exit(SD_MUTEX(un));
6472 			SD_TRACE(SD_LOG_POWER, un,
6473 			    "sd_pm_state_change: exiting\n");
6474 			return (DDI_FAILURE);
6475 		}
6476 
6477 		SD_INFO(SD_LOG_POWER, un, "sd_pm_state_change: "
6478 		    "un_ncmds_in_driver=%ld\n", un->un_ncmds_in_driver);
6479 
6480 		/*
6481 		 * See if the device is not busy, ie.:
6482 		 *    - we have no commands in the driver for this device
6483 		 *    - not waiting for resources
6484 		 */
6485 		if ((un->un_ncmds_in_driver == 0) &&
6486 		    (un->un_state != SD_STATE_RWAIT)) {
6487 			/*
6488 			 * The device is not busy, so it is OK to go to low
6489 			 * power state. Indicate low power, but rely on someone
6490 			 * else to actually change it.
6491 			 */
6492 			mutex_enter(&un->un_pm_mutex);
6493 			un->un_pm_count = -1;
6494 			mutex_exit(&un->un_pm_mutex);
6495 			un->un_power_level = level;
6496 		}
6497 	}
6498 
6499 	mutex_exit(SD_MUTEX(un));
6500 
6501 	SD_TRACE(SD_LOG_POWER, un, "sd_pm_state_change: exit\n");
6502 
6503 	return (DDI_SUCCESS);
6504 }
6505 
6506 
6507 /*
6508  *    Function: sd_pm_idletimeout_handler
6509  *
6510  * Description: A timer routine that's active only while a device is busy.
6511  *		The purpose is to extend slightly the pm framework's busy
6512  *		view of the device to prevent busy/idle thrashing for
6513  *		back-to-back commands. Do this by comparing the current time
6514  *		to the time at which the last command completed and when the
6515  *		difference is greater than sd_pm_idletime, call
6516  *		pm_idle_component. In addition to indicating idle to the pm
6517  *		framework, update the chain type to again use the internal pm
6518  *		layers of the driver.
6519  *
6520  *   Arguments: arg - driver soft state (unit) structure
6521  *
6522  *     Context: Executes in a timeout(9F) thread context
6523  */
6524 
6525 static void
6526 sd_pm_idletimeout_handler(void *arg)
6527 {
6528 	const hrtime_t idletime = sd_pm_idletime * NANOSEC;
6529 	struct sd_lun *un = arg;
6530 
6531 	mutex_enter(&sd_detach_mutex);
6532 	if (un->un_detach_count != 0) {
6533 		/* Abort if the instance is detaching */
6534 		mutex_exit(&sd_detach_mutex);
6535 		return;
6536 	}
6537 	mutex_exit(&sd_detach_mutex);
6538 
6539 	/*
6540 	 * Grab both mutexes, in the proper order, since we're accessing
6541 	 * both PM and softstate variables.
6542 	 */
6543 	mutex_enter(SD_MUTEX(un));
6544 	mutex_enter(&un->un_pm_mutex);
6545 	if (((gethrtime() - un->un_pm_idle_time) > idletime) &&
6546 	    (un->un_ncmds_in_driver == 0) && (un->un_pm_count == 0)) {
6547 		/*
6548 		 * Update the chain types.
6549 		 * This takes affect on the next new command received.
6550 		 */
6551 		if (un->un_f_non_devbsize_supported) {
6552 			un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA;
6553 		} else {
6554 			un->un_buf_chain_type = SD_CHAIN_INFO_DISK;
6555 		}
6556 		un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD;
6557 
6558 		SD_TRACE(SD_LOG_IO_PM, un,
6559 		    "sd_pm_idletimeout_handler: idling device\n");
6560 		(void) pm_idle_component(SD_DEVINFO(un), 0);
6561 		un->un_pm_idle_timeid = NULL;
6562 	} else {
6563 		un->un_pm_idle_timeid =
6564 		    timeout(sd_pm_idletimeout_handler, un,
6565 		    (drv_usectohz((clock_t)300000))); /* 300 ms. */
6566 	}
6567 	mutex_exit(&un->un_pm_mutex);
6568 	mutex_exit(SD_MUTEX(un));
6569 }
6570 
6571 
6572 /*
6573  *    Function: sd_pm_timeout_handler
6574  *
6575  * Description: Callback to tell framework we are idle.
6576  *
6577  *     Context: timeout(9f) thread context.
6578  */
6579 
6580 static void
6581 sd_pm_timeout_handler(void *arg)
6582 {
6583 	struct sd_lun *un = arg;
6584 
6585 	(void) pm_idle_component(SD_DEVINFO(un), 0);
6586 	mutex_enter(&un->un_pm_mutex);
6587 	un->un_pm_timeid = NULL;
6588 	mutex_exit(&un->un_pm_mutex);
6589 }
6590 
6591 
6592 /*
6593  *    Function: sdpower
6594  *
6595  * Description: PM entry point.
6596  *
6597  * Return Code: DDI_SUCCESS
6598  *		DDI_FAILURE
6599  *
6600  *     Context: Kernel thread context
6601  */
6602 
6603 static int
6604 sdpower(dev_info_t *devi, int component, int level)
6605 {
6606 	struct sd_lun	*un;
6607 	int		instance;
6608 	int		rval = DDI_SUCCESS;
6609 	uint_t		i, log_page_size, maxcycles, ncycles;
6610 	uchar_t		*log_page_data;
6611 	int		log_sense_page;
6612 	int		medium_present;
6613 	time_t		intvlp;
6614 	struct pm_trans_data	sd_pm_tran_data;
6615 	uchar_t		save_state = SD_STATE_NORMAL;
6616 	int		sval;
6617 	uchar_t		state_before_pm;
6618 	int		got_semaphore_here;
6619 	sd_ssc_t	*ssc;
6620 	int	last_power_level = SD_SPINDLE_UNINIT;
6621 
6622 	instance = ddi_get_instance(devi);
6623 
6624 	if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) ||
6625 	    !SD_PM_IS_LEVEL_VALID(un, level) || component != 0) {
6626 		return (DDI_FAILURE);
6627 	}
6628 
6629 	ssc = sd_ssc_init(un);
6630 
6631 	SD_TRACE(SD_LOG_IO_PM, un, "sdpower: entry, level = %d\n", level);
6632 
6633 	/*
6634 	 * Must synchronize power down with close.
6635 	 * Attempt to decrement/acquire the open/close semaphore,
6636 	 * but do NOT wait on it. If it's not greater than zero,
6637 	 * ie. it can't be decremented without waiting, then
6638 	 * someone else, either open or close, already has it
6639 	 * and the try returns 0. Use that knowledge here to determine
6640 	 * if it's OK to change the device power level.
6641 	 * Also, only increment it on exit if it was decremented, ie. gotten,
6642 	 * here.
6643 	 */
6644 	got_semaphore_here = sema_tryp(&un->un_semoclose);
6645 
6646 	mutex_enter(SD_MUTEX(un));
6647 
6648 	SD_INFO(SD_LOG_POWER, un, "sdpower: un_ncmds_in_driver = %ld\n",
6649 	    un->un_ncmds_in_driver);
6650 
6651 	/*
6652 	 * If un_ncmds_in_driver is non-zero it indicates commands are
6653 	 * already being processed in the driver, or if the semaphore was
6654 	 * not gotten here it indicates an open or close is being processed.
6655 	 * At the same time somebody is requesting to go to a lower power
6656 	 * that can't perform I/O, which can't happen, therefore we need to
6657 	 * return failure.
6658 	 */
6659 	if ((!SD_PM_IS_IO_CAPABLE(un, level)) &&
6660 	    ((un->un_ncmds_in_driver != 0) || (got_semaphore_here == 0))) {
6661 		mutex_exit(SD_MUTEX(un));
6662 
6663 		if (got_semaphore_here != 0) {
6664 			sema_v(&un->un_semoclose);
6665 		}
6666 		SD_TRACE(SD_LOG_IO_PM, un,
6667 		    "sdpower: exit, device has queued cmds.\n");
6668 
6669 		goto sdpower_failed;
6670 	}
6671 
6672 	/*
6673 	 * if it is OFFLINE that means the disk is completely dead
6674 	 * in our case we have to put the disk in on or off by sending commands
6675 	 * Of course that will fail anyway so return back here.
6676 	 *
6677 	 * Power changes to a device that's OFFLINE or SUSPENDED
6678 	 * are not allowed.
6679 	 */
6680 	if ((un->un_state == SD_STATE_OFFLINE) ||
6681 	    (un->un_state == SD_STATE_SUSPENDED)) {
6682 		mutex_exit(SD_MUTEX(un));
6683 
6684 		if (got_semaphore_here != 0) {
6685 			sema_v(&un->un_semoclose);
6686 		}
6687 		SD_TRACE(SD_LOG_IO_PM, un,
6688 		    "sdpower: exit, device is off-line.\n");
6689 
6690 		goto sdpower_failed;
6691 	}
6692 
6693 	/*
6694 	 * Change the device's state to indicate it's power level
6695 	 * is being changed. Do this to prevent a power off in the
6696 	 * middle of commands, which is especially bad on devices
6697 	 * that are really powered off instead of just spun down.
6698 	 */
6699 	state_before_pm = un->un_state;
6700 	un->un_state = SD_STATE_PM_CHANGING;
6701 
6702 	mutex_exit(SD_MUTEX(un));
6703 
6704 	/*
6705 	 * If log sense command is not supported, bypass the
6706 	 * following checking, otherwise, check the log sense
6707 	 * information for this device.
6708 	 */
6709 	if (SD_PM_STOP_MOTOR_NEEDED(un, level) &&
6710 	    un->un_f_log_sense_supported) {
6711 		/*
6712 		 * Get the log sense information to understand whether the
6713 		 * the powercycle counts have gone beyond the threshhold.
6714 		 */
6715 		log_page_size = START_STOP_CYCLE_COUNTER_PAGE_SIZE;
6716 		log_page_data = kmem_zalloc(log_page_size, KM_SLEEP);
6717 
6718 		mutex_enter(SD_MUTEX(un));
6719 		log_sense_page = un->un_start_stop_cycle_page;
6720 		mutex_exit(SD_MUTEX(un));
6721 
6722 		rval = sd_send_scsi_LOG_SENSE(ssc, log_page_data,
6723 		    log_page_size, log_sense_page, 0x01, 0, SD_PATH_DIRECT);
6724 
6725 		if (rval != 0) {
6726 			if (rval == EIO)
6727 				sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
6728 			else
6729 				sd_ssc_assessment(ssc, SD_FMT_IGNORE);
6730 		}
6731 
6732 #ifdef	SDDEBUG
6733 		if (sd_force_pm_supported) {
6734 			/* Force a successful result */
6735 			rval = 0;
6736 		}
6737 #endif
6738 		if (rval != 0) {
6739 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
6740 			    "Log Sense Failed\n");
6741 
6742 			kmem_free(log_page_data, log_page_size);
6743 			/* Cannot support power management on those drives */
6744 
6745 			if (got_semaphore_here != 0) {
6746 				sema_v(&un->un_semoclose);
6747 			}
6748 			/*
6749 			 * On exit put the state back to it's original value
6750 			 * and broadcast to anyone waiting for the power
6751 			 * change completion.
6752 			 */
6753 			mutex_enter(SD_MUTEX(un));
6754 			un->un_state = state_before_pm;
6755 			cv_broadcast(&un->un_suspend_cv);
6756 			mutex_exit(SD_MUTEX(un));
6757 			SD_TRACE(SD_LOG_IO_PM, un,
6758 			    "sdpower: exit, Log Sense Failed.\n");
6759 
6760 			goto sdpower_failed;
6761 		}
6762 
6763 		/*
6764 		 * From the page data - Convert the essential information to
6765 		 * pm_trans_data
6766 		 */
6767 		maxcycles =
6768 		    (log_page_data[0x1c] << 24) | (log_page_data[0x1d] << 16) |
6769 		    (log_page_data[0x1E] << 8)  | log_page_data[0x1F];
6770 
6771 		ncycles =
6772 		    (log_page_data[0x24] << 24) | (log_page_data[0x25] << 16) |
6773 		    (log_page_data[0x26] << 8)  | log_page_data[0x27];
6774 
6775 		if (un->un_f_pm_log_sense_smart) {
6776 			sd_pm_tran_data.un.smart_count.allowed = maxcycles;
6777 			sd_pm_tran_data.un.smart_count.consumed = ncycles;
6778 			sd_pm_tran_data.un.smart_count.flag = 0;
6779 			sd_pm_tran_data.format = DC_SMART_FORMAT;
6780 		} else {
6781 			sd_pm_tran_data.un.scsi_cycles.lifemax = maxcycles;
6782 			sd_pm_tran_data.un.scsi_cycles.ncycles = ncycles;
6783 			for (i = 0; i < DC_SCSI_MFR_LEN; i++) {
6784 				sd_pm_tran_data.un.scsi_cycles.svc_date[i] =
6785 				    log_page_data[8+i];
6786 			}
6787 			sd_pm_tran_data.un.scsi_cycles.flag = 0;
6788 			sd_pm_tran_data.format = DC_SCSI_FORMAT;
6789 		}
6790 
6791 		kmem_free(log_page_data, log_page_size);
6792 
6793 		/*
6794 		 * Call pm_trans_check routine to get the Ok from
6795 		 * the global policy
6796 		 */
6797 		rval = pm_trans_check(&sd_pm_tran_data, &intvlp);
6798 #ifdef	SDDEBUG
6799 		if (sd_force_pm_supported) {
6800 			/* Force a successful result */
6801 			rval = 1;
6802 		}
6803 #endif
6804 		switch (rval) {
6805 		case 0:
6806 			/*
6807 			 * Not Ok to Power cycle or error in parameters passed
6808 			 * Would have given the advised time to consider power
6809 			 * cycle. Based on the new intvlp parameter we are
6810 			 * supposed to pretend we are busy so that pm framework
6811 			 * will never call our power entry point. Because of
6812 			 * that install a timeout handler and wait for the
6813 			 * recommended time to elapse so that power management
6814 			 * can be effective again.
6815 			 *
6816 			 * To effect this behavior, call pm_busy_component to
6817 			 * indicate to the framework this device is busy.
6818 			 * By not adjusting un_pm_count the rest of PM in
6819 			 * the driver will function normally, and independent
6820 			 * of this but because the framework is told the device
6821 			 * is busy it won't attempt powering down until it gets
6822 			 * a matching idle. The timeout handler sends this.
6823 			 * Note: sd_pm_entry can't be called here to do this
6824 			 * because sdpower may have been called as a result
6825 			 * of a call to pm_raise_power from within sd_pm_entry.
6826 			 *
6827 			 * If a timeout handler is already active then
6828 			 * don't install another.
6829 			 */
6830 			mutex_enter(&un->un_pm_mutex);
6831 			if (un->un_pm_timeid == NULL) {
6832 				un->un_pm_timeid =
6833 				    timeout(sd_pm_timeout_handler,
6834 				    un, intvlp * drv_usectohz(1000000));
6835 				mutex_exit(&un->un_pm_mutex);
6836 				(void) pm_busy_component(SD_DEVINFO(un), 0);
6837 			} else {
6838 				mutex_exit(&un->un_pm_mutex);
6839 			}
6840 			if (got_semaphore_here != 0) {
6841 				sema_v(&un->un_semoclose);
6842 			}
6843 			/*
6844 			 * On exit put the state back to it's original value
6845 			 * and broadcast to anyone waiting for the power
6846 			 * change completion.
6847 			 */
6848 			mutex_enter(SD_MUTEX(un));
6849 			un->un_state = state_before_pm;
6850 			cv_broadcast(&un->un_suspend_cv);
6851 			mutex_exit(SD_MUTEX(un));
6852 
6853 			SD_TRACE(SD_LOG_IO_PM, un, "sdpower: exit, "
6854 			    "trans check Failed, not ok to power cycle.\n");
6855 
6856 			goto sdpower_failed;
6857 		case -1:
6858 			if (got_semaphore_here != 0) {
6859 				sema_v(&un->un_semoclose);
6860 			}
6861 			/*
6862 			 * On exit put the state back to it's original value
6863 			 * and broadcast to anyone waiting for the power
6864 			 * change completion.
6865 			 */
6866 			mutex_enter(SD_MUTEX(un));
6867 			un->un_state = state_before_pm;
6868 			cv_broadcast(&un->un_suspend_cv);
6869 			mutex_exit(SD_MUTEX(un));
6870 			SD_TRACE(SD_LOG_IO_PM, un,
6871 			    "sdpower: exit, trans check command Failed.\n");
6872 
6873 			goto sdpower_failed;
6874 		}
6875 	}
6876 
6877 	if (!SD_PM_IS_IO_CAPABLE(un, level)) {
6878 		/*
6879 		 * Save the last state... if the STOP FAILS we need it
6880 		 * for restoring
6881 		 */
6882 		mutex_enter(SD_MUTEX(un));
6883 		save_state = un->un_last_state;
6884 		last_power_level = un->un_power_level;
6885 		/*
6886 		 * There must not be any cmds. getting processed
6887 		 * in the driver when we get here. Power to the
6888 		 * device is potentially going off.
6889 		 */
6890 		ASSERT(un->un_ncmds_in_driver == 0);
6891 		mutex_exit(SD_MUTEX(un));
6892 
6893 		/*
6894 		 * For now PM suspend the device completely before spindle is
6895 		 * turned off
6896 		 */
6897 		if ((rval = sd_pm_state_change(un, level, SD_PM_STATE_CHANGE))
6898 		    == DDI_FAILURE) {
6899 			if (got_semaphore_here != 0) {
6900 				sema_v(&un->un_semoclose);
6901 			}
6902 			/*
6903 			 * On exit put the state back to it's original value
6904 			 * and broadcast to anyone waiting for the power
6905 			 * change completion.
6906 			 */
6907 			mutex_enter(SD_MUTEX(un));
6908 			un->un_state = state_before_pm;
6909 			un->un_power_level = last_power_level;
6910 			cv_broadcast(&un->un_suspend_cv);
6911 			mutex_exit(SD_MUTEX(un));
6912 			SD_TRACE(SD_LOG_IO_PM, un,
6913 			    "sdpower: exit, PM suspend Failed.\n");
6914 
6915 			goto sdpower_failed;
6916 		}
6917 	}
6918 
6919 	/*
6920 	 * The transition from SPINDLE_OFF to SPINDLE_ON can happen in open,
6921 	 * close, or strategy. Dump no long uses this routine, it uses it's
6922 	 * own code so it can be done in polled mode.
6923 	 */
6924 
6925 	medium_present = TRUE;
6926 
6927 	/*
6928 	 * When powering up, issue a TUR in case the device is at unit
6929 	 * attention.  Don't do retries. Bypass the PM layer, otherwise
6930 	 * a deadlock on un_pm_busy_cv will occur.
6931 	 */
6932 	if (SD_PM_IS_IO_CAPABLE(un, level)) {
6933 		sval = sd_send_scsi_TEST_UNIT_READY(ssc,
6934 		    SD_DONT_RETRY_TUR | SD_BYPASS_PM);
6935 		if (sval != 0)
6936 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
6937 	}
6938 
6939 	if (un->un_f_power_condition_supported) {
6940 		char *pm_condition_name[] = {"STOPPED", "STANDBY",
6941 		    "IDLE", "ACTIVE"};
6942 		SD_TRACE(SD_LOG_IO_PM, un,
6943 		    "sdpower: sending \'%s\' power condition",
6944 		    pm_condition_name[level]);
6945 		sval = sd_send_scsi_START_STOP_UNIT(ssc, SD_POWER_CONDITION,
6946 		    sd_pl2pc[level], SD_PATH_DIRECT);
6947 	} else {
6948 		SD_TRACE(SD_LOG_IO_PM, un, "sdpower: sending \'%s\' unit\n",
6949 		    ((level == SD_SPINDLE_ON) ? "START" : "STOP"));
6950 		sval = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
6951 		    ((level == SD_SPINDLE_ON) ? SD_TARGET_START :
6952 		    SD_TARGET_STOP), SD_PATH_DIRECT);
6953 	}
6954 	if (sval != 0) {
6955 		if (sval == EIO)
6956 			sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
6957 		else
6958 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
6959 	}
6960 
6961 	/* Command failed, check for media present. */
6962 	if ((sval == ENXIO) && un->un_f_has_removable_media) {
6963 		medium_present = FALSE;
6964 	}
6965 
6966 	/*
6967 	 * The conditions of interest here are:
6968 	 *   if a spindle off with media present fails,
6969 	 *	then restore the state and return an error.
6970 	 *   else if a spindle on fails,
6971 	 *	then return an error (there's no state to restore).
6972 	 * In all other cases we setup for the new state
6973 	 * and return success.
6974 	 */
6975 	if (!SD_PM_IS_IO_CAPABLE(un, level)) {
6976 		if ((medium_present == TRUE) && (sval != 0)) {
6977 			/* The stop command from above failed */
6978 			rval = DDI_FAILURE;
6979 			/*
6980 			 * The stop command failed, and we have media
6981 			 * present. Put the level back by calling the
6982 			 * sd_pm_resume() and set the state back to
6983 			 * it's previous value.
6984 			 */
6985 			(void) sd_pm_state_change(un, last_power_level,
6986 			    SD_PM_STATE_ROLLBACK);
6987 			mutex_enter(SD_MUTEX(un));
6988 			un->un_last_state = save_state;
6989 			mutex_exit(SD_MUTEX(un));
6990 		} else if (un->un_f_monitor_media_state) {
6991 			/*
6992 			 * The stop command from above succeeded.
6993 			 * Terminate watch thread in case of removable media
6994 			 * devices going into low power state. This is as per
6995 			 * the requirements of pm framework, otherwise commands
6996 			 * will be generated for the device (through watch
6997 			 * thread), even when the device is in low power state.
6998 			 */
6999 			mutex_enter(SD_MUTEX(un));
7000 			un->un_f_watcht_stopped = FALSE;
7001 			if (un->un_swr_token != NULL) {
7002 				opaque_t temp_token = un->un_swr_token;
7003 				un->un_f_watcht_stopped = TRUE;
7004 				un->un_swr_token = NULL;
7005 				mutex_exit(SD_MUTEX(un));
7006 				(void) scsi_watch_request_terminate(temp_token,
7007 				    SCSI_WATCH_TERMINATE_ALL_WAIT);
7008 			} else {
7009 				mutex_exit(SD_MUTEX(un));
7010 			}
7011 		}
7012 	} else {
7013 		/*
7014 		 * The level requested is I/O capable.
7015 		 * Legacy behavior: return success on a failed spinup
7016 		 * if there is no media in the drive.
7017 		 * Do this by looking at medium_present here.
7018 		 */
7019 		if ((sval != 0) && medium_present) {
7020 			/* The start command from above failed */
7021 			rval = DDI_FAILURE;
7022 		} else {
7023 			/*
7024 			 * The start command from above succeeded
7025 			 * PM resume the devices now that we have
7026 			 * started the disks
7027 			 */
7028 			(void) sd_pm_state_change(un, level,
7029 			    SD_PM_STATE_CHANGE);
7030 
7031 			/*
7032 			 * Resume the watch thread since it was suspended
7033 			 * when the device went into low power mode.
7034 			 */
7035 			if (un->un_f_monitor_media_state) {
7036 				mutex_enter(SD_MUTEX(un));
7037 				if (un->un_f_watcht_stopped == TRUE) {
7038 					opaque_t temp_token;
7039 
7040 					un->un_f_watcht_stopped = FALSE;
7041 					mutex_exit(SD_MUTEX(un));
7042 					temp_token =
7043 					    sd_watch_request_submit(un);
7044 					mutex_enter(SD_MUTEX(un));
7045 					un->un_swr_token = temp_token;
7046 				}
7047 				mutex_exit(SD_MUTEX(un));
7048 			}
7049 		}
7050 	}
7051 
7052 	if (got_semaphore_here != 0) {
7053 		sema_v(&un->un_semoclose);
7054 	}
7055 	/*
7056 	 * On exit put the state back to it's original value
7057 	 * and broadcast to anyone waiting for the power
7058 	 * change completion.
7059 	 */
7060 	mutex_enter(SD_MUTEX(un));
7061 	un->un_state = state_before_pm;
7062 	cv_broadcast(&un->un_suspend_cv);
7063 	mutex_exit(SD_MUTEX(un));
7064 
7065 	SD_TRACE(SD_LOG_IO_PM, un, "sdpower: exit, status = 0x%x\n", rval);
7066 
7067 	sd_ssc_fini(ssc);
7068 	return (rval);
7069 
7070 sdpower_failed:
7071 
7072 	sd_ssc_fini(ssc);
7073 	return (DDI_FAILURE);
7074 }
7075 
7076 
7077 
7078 /*
7079  *    Function: sdattach
7080  *
7081  * Description: Driver's attach(9e) entry point function.
7082  *
7083  *   Arguments: devi - opaque device info handle
7084  *		cmd  - attach  type
7085  *
7086  * Return Code: DDI_SUCCESS
7087  *		DDI_FAILURE
7088  *
7089  *     Context: Kernel thread context
7090  */
7091 
7092 static int
7093 sdattach(dev_info_t *devi, ddi_attach_cmd_t cmd)
7094 {
7095 	switch (cmd) {
7096 	case DDI_ATTACH:
7097 		return (sd_unit_attach(devi));
7098 	case DDI_RESUME:
7099 		return (sd_ddi_resume(devi));
7100 	default:
7101 		break;
7102 	}
7103 	return (DDI_FAILURE);
7104 }
7105 
7106 
7107 /*
7108  *    Function: sddetach
7109  *
7110  * Description: Driver's detach(9E) entry point function.
7111  *
7112  *   Arguments: devi - opaque device info handle
7113  *		cmd  - detach  type
7114  *
7115  * Return Code: DDI_SUCCESS
7116  *		DDI_FAILURE
7117  *
7118  *     Context: Kernel thread context
7119  */
7120 
7121 static int
7122 sddetach(dev_info_t *devi, ddi_detach_cmd_t cmd)
7123 {
7124 	switch (cmd) {
7125 	case DDI_DETACH:
7126 		return (sd_unit_detach(devi));
7127 	case DDI_SUSPEND:
7128 		return (sd_ddi_suspend(devi));
7129 	default:
7130 		break;
7131 	}
7132 	return (DDI_FAILURE);
7133 }
7134 
7135 
7136 /*
7137  *     Function: sd_sync_with_callback
7138  *
7139  *  Description: Prevents sd_unit_attach or sd_unit_detach from freeing the soft
7140  *		 state while the callback routine is active.
7141  *
7142  *    Arguments: un: softstate structure for the instance
7143  *
7144  *	Context: Kernel thread context
7145  */
7146 
7147 static void
7148 sd_sync_with_callback(struct sd_lun *un)
7149 {
7150 	ASSERT(un != NULL);
7151 
7152 	mutex_enter(SD_MUTEX(un));
7153 
7154 	ASSERT(un->un_in_callback >= 0);
7155 
7156 	while (un->un_in_callback > 0) {
7157 		mutex_exit(SD_MUTEX(un));
7158 		delay(2);
7159 		mutex_enter(SD_MUTEX(un));
7160 	}
7161 
7162 	mutex_exit(SD_MUTEX(un));
7163 }
7164 
7165 /*
7166  *    Function: sd_unit_attach
7167  *
7168  * Description: Performs DDI_ATTACH processing for sdattach(). Allocates
7169  *		the soft state structure for the device and performs
7170  *		all necessary structure and device initializations.
7171  *
7172  *   Arguments: devi: the system's dev_info_t for the device.
7173  *
7174  * Return Code: DDI_SUCCESS if attach is successful.
7175  *		DDI_FAILURE if any part of the attach fails.
7176  *
7177  *     Context: Called at attach(9e) time for the DDI_ATTACH flag.
7178  *		Kernel thread context only.  Can sleep.
7179  */
7180 
7181 static int
7182 sd_unit_attach(dev_info_t *devi)
7183 {
7184 	struct	scsi_device	*devp;
7185 	struct	sd_lun		*un;
7186 	char			*variantp;
7187 	char			name_str[48];
7188 	int	reservation_flag = SD_TARGET_IS_UNRESERVED;
7189 	int	instance;
7190 	int	rval;
7191 	int	wc_enabled;
7192 	int	wc_changeable;
7193 	int	tgt;
7194 	uint64_t	capacity;
7195 	uint_t		lbasize = 0;
7196 	dev_info_t	*pdip = ddi_get_parent(devi);
7197 	int		offbyone = 0;
7198 	int		geom_label_valid = 0;
7199 	sd_ssc_t	*ssc;
7200 	int		status;
7201 	struct sd_fm_internal	*sfip = NULL;
7202 	int		max_xfer_size;
7203 
7204 	/*
7205 	 * Retrieve the target driver's private data area. This was set
7206 	 * up by the HBA.
7207 	 */
7208 	devp = ddi_get_driver_private(devi);
7209 
7210 	/*
7211 	 * Retrieve the target ID of the device.
7212 	 */
7213 	tgt = ddi_prop_get_int(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS,
7214 	    SCSI_ADDR_PROP_TARGET, -1);
7215 
7216 	/*
7217 	 * Since we have no idea what state things were left in by the last
7218 	 * user of the device, set up some 'default' settings, ie. turn 'em
7219 	 * off. The scsi_ifsetcap calls force re-negotiations with the drive.
7220 	 * Do this before the scsi_probe, which sends an inquiry.
7221 	 * This is a fix for bug (4430280).
7222 	 * Of special importance is wide-xfer. The drive could have been left
7223 	 * in wide transfer mode by the last driver to communicate with it,
7224 	 * this includes us. If that's the case, and if the following is not
7225 	 * setup properly or we don't re-negotiate with the drive prior to
7226 	 * transferring data to/from the drive, it causes bus parity errors,
7227 	 * data overruns, and unexpected interrupts. This first occurred when
7228 	 * the fix for bug (4378686) was made.
7229 	 */
7230 	(void) scsi_ifsetcap(&devp->sd_address, "lun-reset", 0, 1);
7231 	(void) scsi_ifsetcap(&devp->sd_address, "wide-xfer", 0, 1);
7232 	(void) scsi_ifsetcap(&devp->sd_address, "auto-rqsense", 0, 1);
7233 
7234 	/*
7235 	 * Currently, scsi_ifsetcap sets tagged-qing capability for all LUNs
7236 	 * on a target. Setting it per lun instance actually sets the
7237 	 * capability of this target, which affects those luns already
7238 	 * attached on the same target. So during attach, we can only disable
7239 	 * this capability only when no other lun has been attached on this
7240 	 * target. By doing this, we assume a target has the same tagged-qing
7241 	 * capability for every lun. The condition can be removed when HBA
7242 	 * is changed to support per lun based tagged-qing capability.
7243 	 */
7244 	if (sd_scsi_get_target_lun_count(pdip, tgt) < 1) {
7245 		(void) scsi_ifsetcap(&devp->sd_address, "tagged-qing", 0, 1);
7246 	}
7247 
7248 	/*
7249 	 * Use scsi_probe() to issue an INQUIRY command to the device.
7250 	 * This call will allocate and fill in the scsi_inquiry structure
7251 	 * and point the sd_inq member of the scsi_device structure to it.
7252 	 * If the attach succeeds, then this memory will not be de-allocated
7253 	 * (via scsi_unprobe()) until the instance is detached.
7254 	 */
7255 	if (scsi_probe(devp, SLEEP_FUNC) != SCSIPROBE_EXISTS) {
7256 		goto probe_failed;
7257 	}
7258 
7259 	/*
7260 	 * Check the device type as specified in the inquiry data and
7261 	 * claim it if it is of a type that we support.
7262 	 */
7263 	switch (devp->sd_inq->inq_dtype) {
7264 	case DTYPE_DIRECT:
7265 		break;
7266 	case DTYPE_RODIRECT:
7267 		break;
7268 	case DTYPE_OPTICAL:
7269 		break;
7270 	case DTYPE_NOTPRESENT:
7271 	default:
7272 		/* Unsupported device type; fail the attach. */
7273 		goto probe_failed;
7274 	}
7275 
7276 	/*
7277 	 * Allocate the soft state structure for this unit.
7278 	 *
7279 	 * We rely upon this memory being set to all zeroes by
7280 	 * ddi_soft_state_zalloc().  We assume that any member of the
7281 	 * soft state structure that is not explicitly initialized by
7282 	 * this routine will have a value of zero.
7283 	 */
7284 	instance = ddi_get_instance(devp->sd_dev);
7285 	if (ddi_soft_state_zalloc(sd_state, instance) != DDI_SUCCESS) {
7286 		goto probe_failed;
7287 	}
7288 
7289 	/*
7290 	 * Retrieve a pointer to the newly-allocated soft state.
7291 	 *
7292 	 * This should NEVER fail if the ddi_soft_state_zalloc() call above
7293 	 * was successful, unless something has gone horribly wrong and the
7294 	 * ddi's soft state internals are corrupt (in which case it is
7295 	 * probably better to halt here than just fail the attach....)
7296 	 */
7297 	if ((un = ddi_get_soft_state(sd_state, instance)) == NULL) {
7298 		panic("sd_unit_attach: NULL soft state on instance:0x%x",
7299 		    instance);
7300 		/*NOTREACHED*/
7301 	}
7302 
7303 	/*
7304 	 * Link the back ptr of the driver soft state to the scsi_device
7305 	 * struct for this lun.
7306 	 * Save a pointer to the softstate in the driver-private area of
7307 	 * the scsi_device struct.
7308 	 * Note: We cannot call SD_INFO, SD_TRACE, SD_ERROR, or SD_DIAG until
7309 	 * we first set un->un_sd below.
7310 	 */
7311 	un->un_sd = devp;
7312 	devp->sd_private = (opaque_t)un;
7313 
7314 	/*
7315 	 * The following must be after devp is stored in the soft state struct.
7316 	 */
7317 #ifdef SDDEBUG
7318 	SD_TRACE(SD_LOG_ATTACH_DETACH, un,
7319 	    "%s_unit_attach: un:0x%p instance:%d\n",
7320 	    ddi_driver_name(devi), un, instance);
7321 #endif
7322 
7323 	/*
7324 	 * Set up the device type and node type (for the minor nodes).
7325 	 * By default we assume that the device can at least support the
7326 	 * Common Command Set. Call it a CD-ROM if it reports itself
7327 	 * as a RODIRECT device.
7328 	 */
7329 	switch (devp->sd_inq->inq_dtype) {
7330 	case DTYPE_RODIRECT:
7331 		un->un_node_type = DDI_NT_CD_CHAN;
7332 		un->un_ctype	 = CTYPE_CDROM;
7333 		break;
7334 	case DTYPE_OPTICAL:
7335 		un->un_node_type = DDI_NT_BLOCK_CHAN;
7336 		un->un_ctype	 = CTYPE_ROD;
7337 		break;
7338 	default:
7339 		un->un_node_type = DDI_NT_BLOCK_CHAN;
7340 		un->un_ctype	 = CTYPE_CCS;
7341 		break;
7342 	}
7343 
7344 	/*
7345 	 * Try to read the interconnect type from the HBA.
7346 	 *
7347 	 * Note: This driver is currently compiled as two binaries, a parallel
7348 	 * scsi version (sd) and a fibre channel version (ssd). All functional
7349 	 * differences are determined at compile time. In the future a single
7350 	 * binary will be provided and the interconnect type will be used to
7351 	 * differentiate between fibre and parallel scsi behaviors. At that time
7352 	 * it will be necessary for all fibre channel HBAs to support this
7353 	 * property.
7354 	 *
7355 	 * set un_f_is_fiber to TRUE ( default fiber )
7356 	 */
7357 	un->un_f_is_fibre = TRUE;
7358 	switch (scsi_ifgetcap(SD_ADDRESS(un), "interconnect-type", -1)) {
7359 	case INTERCONNECT_SSA:
7360 		un->un_interconnect_type = SD_INTERCONNECT_SSA;
7361 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
7362 		    "sd_unit_attach: un:0x%p SD_INTERCONNECT_SSA\n", un);
7363 		break;
7364 	case INTERCONNECT_PARALLEL:
7365 		un->un_f_is_fibre = FALSE;
7366 		un->un_interconnect_type = SD_INTERCONNECT_PARALLEL;
7367 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
7368 		    "sd_unit_attach: un:0x%p SD_INTERCONNECT_PARALLEL\n", un);
7369 		break;
7370 	case INTERCONNECT_SAS:
7371 		un->un_f_is_fibre = FALSE;
7372 		un->un_interconnect_type = SD_INTERCONNECT_SAS;
7373 		un->un_node_type = DDI_NT_BLOCK_SAS;
7374 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
7375 		    "sd_unit_attach: un:0x%p SD_INTERCONNECT_SAS\n", un);
7376 		break;
7377 	case INTERCONNECT_SATA:
7378 		un->un_f_is_fibre = FALSE;
7379 		un->un_interconnect_type = SD_INTERCONNECT_SATA;
7380 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
7381 		    "sd_unit_attach: un:0x%p SD_INTERCONNECT_SATA\n", un);
7382 		break;
7383 	case INTERCONNECT_FIBRE:
7384 		un->un_interconnect_type = SD_INTERCONNECT_FIBRE;
7385 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
7386 		    "sd_unit_attach: un:0x%p SD_INTERCONNECT_FIBRE\n", un);
7387 		break;
7388 	case INTERCONNECT_FABRIC:
7389 		un->un_interconnect_type = SD_INTERCONNECT_FABRIC;
7390 		un->un_node_type = DDI_NT_BLOCK_FABRIC;
7391 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
7392 		    "sd_unit_attach: un:0x%p SD_INTERCONNECT_FABRIC\n", un);
7393 		break;
7394 	default:
7395 #ifdef SD_DEFAULT_INTERCONNECT_TYPE
7396 		/*
7397 		 * The HBA does not support the "interconnect-type" property
7398 		 * (or did not provide a recognized type).
7399 		 *
7400 		 * Note: This will be obsoleted when a single fibre channel
7401 		 * and parallel scsi driver is delivered. In the meantime the
7402 		 * interconnect type will be set to the platform default.If that
7403 		 * type is not parallel SCSI, it means that we should be
7404 		 * assuming "ssd" semantics. However, here this also means that
7405 		 * the FC HBA is not supporting the "interconnect-type" property
7406 		 * like we expect it to, so log this occurrence.
7407 		 */
7408 		un->un_interconnect_type = SD_DEFAULT_INTERCONNECT_TYPE;
7409 		if (!SD_IS_PARALLEL_SCSI(un)) {
7410 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
7411 			    "sd_unit_attach: un:0x%p Assuming "
7412 			    "INTERCONNECT_FIBRE\n", un);
7413 		} else {
7414 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
7415 			    "sd_unit_attach: un:0x%p Assuming "
7416 			    "INTERCONNECT_PARALLEL\n", un);
7417 			un->un_f_is_fibre = FALSE;
7418 		}
7419 #else
7420 		/*
7421 		 * Note: This source will be implemented when a single fibre
7422 		 * channel and parallel scsi driver is delivered. The default
7423 		 * will be to assume that if a device does not support the
7424 		 * "interconnect-type" property it is a parallel SCSI HBA and
7425 		 * we will set the interconnect type for parallel scsi.
7426 		 */
7427 		un->un_interconnect_type = SD_INTERCONNECT_PARALLEL;
7428 		un->un_f_is_fibre = FALSE;
7429 #endif
7430 		break;
7431 	}
7432 
7433 	if (un->un_f_is_fibre == TRUE) {
7434 		if (scsi_ifgetcap(SD_ADDRESS(un), "scsi-version", 1) ==
7435 		    SCSI_VERSION_3) {
7436 			switch (un->un_interconnect_type) {
7437 			case SD_INTERCONNECT_FIBRE:
7438 			case SD_INTERCONNECT_SSA:
7439 				un->un_node_type = DDI_NT_BLOCK_WWN;
7440 				break;
7441 			default:
7442 				break;
7443 			}
7444 		}
7445 	}
7446 
7447 	/*
7448 	 * Initialize the Request Sense command for the target
7449 	 */
7450 	if (sd_alloc_rqs(devp, un) != DDI_SUCCESS) {
7451 		goto alloc_rqs_failed;
7452 	}
7453 
7454 	/*
7455 	 * Set un_retry_count with SD_RETRY_COUNT, this is ok for Sparc
7456 	 * with separate binary for sd and ssd.
7457 	 *
7458 	 * x86 has 1 binary, un_retry_count is set base on connection type.
7459 	 * The hardcoded values will go away when Sparc uses 1 binary
7460 	 * for sd and ssd.  This hardcoded values need to match
7461 	 * SD_RETRY_COUNT in sddef.h
7462 	 * The value used is base on interconnect type.
7463 	 * fibre = 3, parallel = 5
7464 	 */
7465 #if defined(__i386) || defined(__amd64)
7466 	un->un_retry_count = un->un_f_is_fibre ? 3 : 5;
7467 #else
7468 	un->un_retry_count = SD_RETRY_COUNT;
7469 #endif
7470 
7471 	/*
7472 	 * Set the per disk retry count to the default number of retries
7473 	 * for disks and CDROMs. This value can be overridden by the
7474 	 * disk property list or an entry in sd.conf.
7475 	 */
7476 	un->un_notready_retry_count =
7477 	    ISCD(un) ? CD_NOT_READY_RETRY_COUNT(un)
7478 	    : DISK_NOT_READY_RETRY_COUNT(un);
7479 
7480 	/*
7481 	 * Set the busy retry count to the default value of un_retry_count.
7482 	 * This can be overridden by entries in sd.conf or the device
7483 	 * config table.
7484 	 */
7485 	un->un_busy_retry_count = un->un_retry_count;
7486 
7487 	/*
7488 	 * Init the reset threshold for retries.  This number determines
7489 	 * how many retries must be performed before a reset can be issued
7490 	 * (for certain error conditions). This can be overridden by entries
7491 	 * in sd.conf or the device config table.
7492 	 */
7493 	un->un_reset_retry_count = (un->un_retry_count / 2);
7494 
7495 	/*
7496 	 * Set the victim_retry_count to the default un_retry_count
7497 	 */
7498 	un->un_victim_retry_count = (2 * un->un_retry_count);
7499 
7500 	/*
7501 	 * Set the reservation release timeout to the default value of
7502 	 * 5 seconds. This can be overridden by entries in ssd.conf or the
7503 	 * device config table.
7504 	 */
7505 	un->un_reserve_release_time = 5;
7506 
7507 	/*
7508 	 * Set up the default maximum transfer size. Note that this may
7509 	 * get updated later in the attach, when setting up default wide
7510 	 * operations for disks.
7511 	 */
7512 #if defined(__i386) || defined(__amd64)
7513 	un->un_max_xfer_size = (uint_t)SD_DEFAULT_MAX_XFER_SIZE;
7514 	un->un_partial_dma_supported = 1;
7515 #else
7516 	un->un_max_xfer_size = (uint_t)maxphys;
7517 #endif
7518 
7519 	/*
7520 	 * Get "allow bus device reset" property (defaults to "enabled" if
7521 	 * the property was not defined). This is to disable bus resets for
7522 	 * certain kinds of error recovery. Note: In the future when a run-time
7523 	 * fibre check is available the soft state flag should default to
7524 	 * enabled.
7525 	 */
7526 	if (un->un_f_is_fibre == TRUE) {
7527 		un->un_f_allow_bus_device_reset = TRUE;
7528 	} else {
7529 		if (ddi_getprop(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS,
7530 		    "allow-bus-device-reset", 1) != 0) {
7531 			un->un_f_allow_bus_device_reset = TRUE;
7532 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
7533 			    "sd_unit_attach: un:0x%p Bus device reset "
7534 			    "enabled\n", un);
7535 		} else {
7536 			un->un_f_allow_bus_device_reset = FALSE;
7537 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
7538 			    "sd_unit_attach: un:0x%p Bus device reset "
7539 			    "disabled\n", un);
7540 		}
7541 	}
7542 
7543 	/*
7544 	 * Check if this is an ATAPI device. ATAPI devices use Group 1
7545 	 * Read/Write commands and Group 2 Mode Sense/Select commands.
7546 	 *
7547 	 * Note: The "obsolete" way of doing this is to check for the "atapi"
7548 	 * property. The new "variant" property with a value of "atapi" has been
7549 	 * introduced so that future 'variants' of standard SCSI behavior (like
7550 	 * atapi) could be specified by the underlying HBA drivers by supplying
7551 	 * a new value for the "variant" property, instead of having to define a
7552 	 * new property.
7553 	 */
7554 	if (ddi_prop_get_int(DDI_DEV_T_ANY, devi, 0, "atapi", -1) != -1) {
7555 		un->un_f_cfg_is_atapi = TRUE;
7556 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
7557 		    "sd_unit_attach: un:0x%p Atapi device\n", un);
7558 	}
7559 	if (ddi_prop_lookup_string(DDI_DEV_T_ANY, devi, 0, "variant",
7560 	    &variantp) == DDI_PROP_SUCCESS) {
7561 		if (strcmp(variantp, "atapi") == 0) {
7562 			un->un_f_cfg_is_atapi = TRUE;
7563 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
7564 			    "sd_unit_attach: un:0x%p Atapi device\n", un);
7565 		}
7566 		ddi_prop_free(variantp);
7567 	}
7568 
7569 	un->un_cmd_timeout	= SD_IO_TIME;
7570 
7571 	un->un_busy_timeout  = SD_BSY_TIMEOUT;
7572 
7573 	/* Info on current states, statuses, etc. (Updated frequently) */
7574 	un->un_state		= SD_STATE_NORMAL;
7575 	un->un_last_state	= SD_STATE_NORMAL;
7576 
7577 	/* Control & status info for command throttling */
7578 	un->un_throttle		= sd_max_throttle;
7579 	un->un_saved_throttle	= sd_max_throttle;
7580 	un->un_min_throttle	= sd_min_throttle;
7581 
7582 	if (un->un_f_is_fibre == TRUE) {
7583 		un->un_f_use_adaptive_throttle = TRUE;
7584 	} else {
7585 		un->un_f_use_adaptive_throttle = FALSE;
7586 	}
7587 
7588 	/* Removable media support. */
7589 	cv_init(&un->un_state_cv, NULL, CV_DRIVER, NULL);
7590 	un->un_mediastate		= DKIO_NONE;
7591 	un->un_specified_mediastate	= DKIO_NONE;
7592 
7593 	/* CVs for suspend/resume (PM or DR) */
7594 	cv_init(&un->un_suspend_cv,   NULL, CV_DRIVER, NULL);
7595 	cv_init(&un->un_disk_busy_cv, NULL, CV_DRIVER, NULL);
7596 
7597 	/* Power management support. */
7598 	un->un_power_level = SD_SPINDLE_UNINIT;
7599 
7600 	cv_init(&un->un_wcc_cv,   NULL, CV_DRIVER, NULL);
7601 	un->un_f_wcc_inprog = 0;
7602 
7603 	/*
7604 	 * The open/close semaphore is used to serialize threads executing
7605 	 * in the driver's open & close entry point routines for a given
7606 	 * instance.
7607 	 */
7608 	(void) sema_init(&un->un_semoclose, 1, NULL, SEMA_DRIVER, NULL);
7609 
7610 	/*
7611 	 * The conf file entry and softstate variable is a forceful override,
7612 	 * meaning a non-zero value must be entered to change the default.
7613 	 */
7614 	un->un_f_disksort_disabled = FALSE;
7615 	un->un_f_rmw_type = SD_RMW_TYPE_DEFAULT;
7616 	un->un_f_enable_rmw = FALSE;
7617 
7618 	/*
7619 	 * GET EVENT STATUS NOTIFICATION media polling enabled by default, but
7620 	 * can be overridden via [s]sd-config-list "mmc-gesn-polling" property.
7621 	 */
7622 	un->un_f_mmc_gesn_polling = TRUE;
7623 
7624 	/*
7625 	 * physical sector size defaults to DEV_BSIZE currently. We can
7626 	 * override this value via the driver configuration file so we must
7627 	 * set it before calling sd_read_unit_properties().
7628 	 */
7629 	un->un_phy_blocksize = DEV_BSIZE;
7630 
7631 	/*
7632 	 * Retrieve the properties from the static driver table or the driver
7633 	 * configuration file (.conf) for this unit and update the soft state
7634 	 * for the device as needed for the indicated properties.
7635 	 * Note: the property configuration needs to occur here as some of the
7636 	 * following routines may have dependencies on soft state flags set
7637 	 * as part of the driver property configuration.
7638 	 */
7639 	sd_read_unit_properties(un);
7640 	SD_TRACE(SD_LOG_ATTACH_DETACH, un,
7641 	    "sd_unit_attach: un:0x%p property configuration complete.\n", un);
7642 
7643 	/*
7644 	 * Only if a device has "hotpluggable" property, it is
7645 	 * treated as hotpluggable device. Otherwise, it is
7646 	 * regarded as non-hotpluggable one.
7647 	 */
7648 	if (ddi_prop_get_int(DDI_DEV_T_ANY, devi, 0, "hotpluggable",
7649 	    -1) != -1) {
7650 		un->un_f_is_hotpluggable = TRUE;
7651 	}
7652 
7653 	/*
7654 	 * set unit's attributes(flags) according to "hotpluggable" and
7655 	 * RMB bit in INQUIRY data.
7656 	 */
7657 	sd_set_unit_attributes(un, devi);
7658 
7659 	/*
7660 	 * By default, we mark the capacity, lbasize, and geometry
7661 	 * as invalid. Only if we successfully read a valid capacity
7662 	 * will we update the un_blockcount and un_tgt_blocksize with the
7663 	 * valid values (the geometry will be validated later).
7664 	 */
7665 	un->un_f_blockcount_is_valid	= FALSE;
7666 	un->un_f_tgt_blocksize_is_valid	= FALSE;
7667 
7668 	/*
7669 	 * Use DEV_BSIZE and DEV_BSHIFT as defaults, until we can determine
7670 	 * otherwise.
7671 	 */
7672 	un->un_tgt_blocksize  = un->un_sys_blocksize  = DEV_BSIZE;
7673 	un->un_blockcount = 0;
7674 
7675 	/*
7676 	 * Set up the per-instance info needed to determine the correct
7677 	 * CDBs and other info for issuing commands to the target.
7678 	 */
7679 	sd_init_cdb_limits(un);
7680 
7681 	/*
7682 	 * Set up the IO chains to use, based upon the target type.
7683 	 */
7684 	if (un->un_f_non_devbsize_supported) {
7685 		un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA;
7686 	} else {
7687 		un->un_buf_chain_type = SD_CHAIN_INFO_DISK;
7688 	}
7689 	un->un_uscsi_chain_type  = SD_CHAIN_INFO_USCSI_CMD;
7690 	un->un_direct_chain_type = SD_CHAIN_INFO_DIRECT_CMD;
7691 	un->un_priority_chain_type = SD_CHAIN_INFO_PRIORITY_CMD;
7692 
7693 	un->un_xbuf_attr = ddi_xbuf_attr_create(sizeof (struct sd_xbuf),
7694 	    sd_xbuf_strategy, un, sd_xbuf_active_limit,  sd_xbuf_reserve_limit,
7695 	    ddi_driver_major(devi), DDI_XBUF_QTHREAD_DRIVER);
7696 	ddi_xbuf_attr_register_devinfo(un->un_xbuf_attr, devi);
7697 
7698 
7699 	if (ISCD(un)) {
7700 		un->un_additional_codes = sd_additional_codes;
7701 	} else {
7702 		un->un_additional_codes = NULL;
7703 	}
7704 
7705 	/*
7706 	 * Create the kstats here so they can be available for attach-time
7707 	 * routines that send commands to the unit (either polled or via
7708 	 * sd_send_scsi_cmd).
7709 	 *
7710 	 * Note: This is a critical sequence that needs to be maintained:
7711 	 *	1) Instantiate the kstats here, before any routines using the
7712 	 *	   iopath (i.e. sd_send_scsi_cmd).
7713 	 *	2) Instantiate and initialize the partition stats
7714 	 *	   (sd_set_pstats).
7715 	 *	3) Initialize the error stats (sd_set_errstats), following
7716 	 *	   sd_validate_geometry(),sd_register_devid(),
7717 	 *	   and sd_cache_control().
7718 	 */
7719 
7720 	un->un_stats = kstat_create(sd_label, instance,
7721 	    NULL, "disk", KSTAT_TYPE_IO, 1, KSTAT_FLAG_PERSISTENT);
7722 	if (un->un_stats != NULL) {
7723 		un->un_stats->ks_lock = SD_MUTEX(un);
7724 		kstat_install(un->un_stats);
7725 	}
7726 	SD_TRACE(SD_LOG_ATTACH_DETACH, un,
7727 	    "sd_unit_attach: un:0x%p un_stats created\n", un);
7728 
7729 	sd_create_errstats(un, instance);
7730 	if (un->un_errstats == NULL) {
7731 		goto create_errstats_failed;
7732 	}
7733 	SD_TRACE(SD_LOG_ATTACH_DETACH, un,
7734 	    "sd_unit_attach: un:0x%p errstats created\n", un);
7735 
7736 	/*
7737 	 * The following if/else code was relocated here from below as part
7738 	 * of the fix for bug (4430280). However with the default setup added
7739 	 * on entry to this routine, it's no longer absolutely necessary for
7740 	 * this to be before the call to sd_spin_up_unit.
7741 	 */
7742 	if (SD_IS_PARALLEL_SCSI(un) || SD_IS_SERIAL(un)) {
7743 		int tq_trigger_flag = (((devp->sd_inq->inq_ansi == 4) ||
7744 		    (devp->sd_inq->inq_ansi == 5)) &&
7745 		    devp->sd_inq->inq_bque) || devp->sd_inq->inq_cmdque;
7746 
7747 		/*
7748 		 * If tagged queueing is supported by the target
7749 		 * and by the host adapter then we will enable it
7750 		 */
7751 		un->un_tagflags = 0;
7752 		if ((devp->sd_inq->inq_rdf == RDF_SCSI2) && tq_trigger_flag &&
7753 		    (un->un_f_arq_enabled == TRUE)) {
7754 			if (scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing",
7755 			    1, 1) == 1) {
7756 				un->un_tagflags = FLAG_STAG;
7757 				SD_INFO(SD_LOG_ATTACH_DETACH, un,
7758 				    "sd_unit_attach: un:0x%p tag queueing "
7759 				    "enabled\n", un);
7760 			} else if (scsi_ifgetcap(SD_ADDRESS(un),
7761 			    "untagged-qing", 0) == 1) {
7762 				un->un_f_opt_queueing = TRUE;
7763 				un->un_saved_throttle = un->un_throttle =
7764 				    min(un->un_throttle, 3);
7765 			} else {
7766 				un->un_f_opt_queueing = FALSE;
7767 				un->un_saved_throttle = un->un_throttle = 1;
7768 			}
7769 		} else if ((scsi_ifgetcap(SD_ADDRESS(un), "untagged-qing", 0)
7770 		    == 1) && (un->un_f_arq_enabled == TRUE)) {
7771 			/* The Host Adapter supports internal queueing. */
7772 			un->un_f_opt_queueing = TRUE;
7773 			un->un_saved_throttle = un->un_throttle =
7774 			    min(un->un_throttle, 3);
7775 		} else {
7776 			un->un_f_opt_queueing = FALSE;
7777 			un->un_saved_throttle = un->un_throttle = 1;
7778 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
7779 			    "sd_unit_attach: un:0x%p no tag queueing\n", un);
7780 		}
7781 
7782 		/*
7783 		 * Enable large transfers for SATA/SAS drives
7784 		 */
7785 		if (SD_IS_SERIAL(un)) {
7786 			un->un_max_xfer_size =
7787 			    ddi_getprop(DDI_DEV_T_ANY, devi, 0,
7788 			    sd_max_xfer_size, SD_MAX_XFER_SIZE);
7789 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
7790 			    "sd_unit_attach: un:0x%p max transfer "
7791 			    "size=0x%x\n", un, un->un_max_xfer_size);
7792 
7793 		}
7794 
7795 		/* Setup or tear down default wide operations for disks */
7796 
7797 		/*
7798 		 * Note: Legacy: it may be possible for both "sd_max_xfer_size"
7799 		 * and "ssd_max_xfer_size" to exist simultaneously on the same
7800 		 * system and be set to different values. In the future this
7801 		 * code may need to be updated when the ssd module is
7802 		 * obsoleted and removed from the system. (4299588)
7803 		 */
7804 		if (SD_IS_PARALLEL_SCSI(un) &&
7805 		    (devp->sd_inq->inq_rdf == RDF_SCSI2) &&
7806 		    (devp->sd_inq->inq_wbus16 || devp->sd_inq->inq_wbus32)) {
7807 			if (scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer",
7808 			    1, 1) == 1) {
7809 				SD_INFO(SD_LOG_ATTACH_DETACH, un,
7810 				    "sd_unit_attach: un:0x%p Wide Transfer "
7811 				    "enabled\n", un);
7812 			}
7813 
7814 			/*
7815 			 * If tagged queuing has also been enabled, then
7816 			 * enable large xfers
7817 			 */
7818 			if (un->un_saved_throttle == sd_max_throttle) {
7819 				un->un_max_xfer_size =
7820 				    ddi_getprop(DDI_DEV_T_ANY, devi, 0,
7821 				    sd_max_xfer_size, SD_MAX_XFER_SIZE);
7822 				SD_INFO(SD_LOG_ATTACH_DETACH, un,
7823 				    "sd_unit_attach: un:0x%p max transfer "
7824 				    "size=0x%x\n", un, un->un_max_xfer_size);
7825 			}
7826 		} else {
7827 			if (scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer",
7828 			    0, 1) == 1) {
7829 				SD_INFO(SD_LOG_ATTACH_DETACH, un,
7830 				    "sd_unit_attach: un:0x%p "
7831 				    "Wide Transfer disabled\n", un);
7832 			}
7833 		}
7834 	} else {
7835 		un->un_tagflags = FLAG_STAG;
7836 		un->un_max_xfer_size = ddi_getprop(DDI_DEV_T_ANY,
7837 		    devi, 0, sd_max_xfer_size, SD_MAX_XFER_SIZE);
7838 	}
7839 
7840 	/*
7841 	 * If this target supports LUN reset, try to enable it.
7842 	 */
7843 	if (un->un_f_lun_reset_enabled) {
7844 		if (scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 1, 1) == 1) {
7845 			SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: "
7846 			    "un:0x%p lun_reset capability set\n", un);
7847 		} else {
7848 			SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: "
7849 			    "un:0x%p lun-reset capability not set\n", un);
7850 		}
7851 	}
7852 
7853 	/*
7854 	 * Adjust the maximum transfer size. This is to fix
7855 	 * the problem of partial DMA support on SPARC. Some
7856 	 * HBA driver, like aac, has very small dma_attr_maxxfer
7857 	 * size, which requires partial DMA support on SPARC.
7858 	 * In the future the SPARC pci nexus driver may solve
7859 	 * the problem instead of this fix.
7860 	 */
7861 	max_xfer_size = scsi_ifgetcap(SD_ADDRESS(un), "dma-max", 1);
7862 	if ((max_xfer_size > 0) && (max_xfer_size < un->un_max_xfer_size)) {
7863 		/* We need DMA partial even on sparc to ensure sddump() works */
7864 		un->un_max_xfer_size = max_xfer_size;
7865 		if (un->un_partial_dma_supported == 0)
7866 			un->un_partial_dma_supported = 1;
7867 	}
7868 	if (ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
7869 	    DDI_PROP_DONTPASS, "buf_break", 0) == 1) {
7870 		if (ddi_xbuf_attr_setup_brk(un->un_xbuf_attr,
7871 		    un->un_max_xfer_size) == 1) {
7872 			un->un_buf_breakup_supported = 1;
7873 			SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: "
7874 			    "un:0x%p Buf breakup enabled\n", un);
7875 		}
7876 	}
7877 
7878 	/*
7879 	 * Set PKT_DMA_PARTIAL flag.
7880 	 */
7881 	if (un->un_partial_dma_supported == 1) {
7882 		un->un_pkt_flags = PKT_DMA_PARTIAL;
7883 	} else {
7884 		un->un_pkt_flags = 0;
7885 	}
7886 
7887 	/* Initialize sd_ssc_t for internal uscsi commands */
7888 	ssc = sd_ssc_init(un);
7889 	scsi_fm_init(devp);
7890 
7891 	/*
7892 	 * Allocate memory for SCSI FMA stuffs.
7893 	 */
7894 	un->un_fm_private =
7895 	    kmem_zalloc(sizeof (struct sd_fm_internal), KM_SLEEP);
7896 	sfip = (struct sd_fm_internal *)un->un_fm_private;
7897 	sfip->fm_ssc.ssc_uscsi_cmd = &sfip->fm_ucmd;
7898 	sfip->fm_ssc.ssc_uscsi_info = &sfip->fm_uinfo;
7899 	sfip->fm_ssc.ssc_un = un;
7900 
7901 	if (ISCD(un) ||
7902 	    un->un_f_has_removable_media ||
7903 	    devp->sd_fm_capable == DDI_FM_NOT_CAPABLE) {
7904 		/*
7905 		 * We don't touch CDROM or the DDI_FM_NOT_CAPABLE device.
7906 		 * Their log are unchanged.
7907 		 */
7908 		sfip->fm_log_level = SD_FM_LOG_NSUP;
7909 	} else {
7910 		/*
7911 		 * If enter here, it should be non-CDROM and FM-capable
7912 		 * device, and it will not keep the old scsi_log as before
7913 		 * in /var/adm/messages. However, the property
7914 		 * "fm-scsi-log" will control whether the FM telemetry will
7915 		 * be logged in /var/adm/messages.
7916 		 */
7917 		int fm_scsi_log;
7918 		fm_scsi_log = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
7919 		    DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, "fm-scsi-log", 0);
7920 
7921 		if (fm_scsi_log)
7922 			sfip->fm_log_level = SD_FM_LOG_EREPORT;
7923 		else
7924 			sfip->fm_log_level = SD_FM_LOG_SILENT;
7925 	}
7926 
7927 	/*
7928 	 * At this point in the attach, we have enough info in the
7929 	 * soft state to be able to issue commands to the target.
7930 	 *
7931 	 * All command paths used below MUST issue their commands as
7932 	 * SD_PATH_DIRECT. This is important as intermediate layers
7933 	 * are not all initialized yet (such as PM).
7934 	 */
7935 
7936 	/*
7937 	 * Send a TEST UNIT READY command to the device. This should clear
7938 	 * any outstanding UNIT ATTENTION that may be present.
7939 	 *
7940 	 * Note: Don't check for success, just track if there is a reservation,
7941 	 * this is a throw away command to clear any unit attentions.
7942 	 *
7943 	 * Note: This MUST be the first command issued to the target during
7944 	 * attach to ensure power on UNIT ATTENTIONS are cleared.
7945 	 * Pass in flag SD_DONT_RETRY_TUR to prevent the long delays associated
7946 	 * with attempts at spinning up a device with no media.
7947 	 */
7948 	status = sd_send_scsi_TEST_UNIT_READY(ssc, SD_DONT_RETRY_TUR);
7949 	if (status != 0) {
7950 		if (status == EACCES)
7951 			reservation_flag = SD_TARGET_IS_RESERVED;
7952 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
7953 	}
7954 
7955 	/*
7956 	 * If the device is NOT a removable media device, attempt to spin
7957 	 * it up (using the START_STOP_UNIT command) and read its capacity
7958 	 * (using the READ CAPACITY command).  Note, however, that either
7959 	 * of these could fail and in some cases we would continue with
7960 	 * the attach despite the failure (see below).
7961 	 */
7962 	if (un->un_f_descr_format_supported) {
7963 
7964 		switch (sd_spin_up_unit(ssc)) {
7965 		case 0:
7966 			/*
7967 			 * Spin-up was successful; now try to read the
7968 			 * capacity.  If successful then save the results
7969 			 * and mark the capacity & lbasize as valid.
7970 			 */
7971 			SD_TRACE(SD_LOG_ATTACH_DETACH, un,
7972 			    "sd_unit_attach: un:0x%p spin-up successful\n", un);
7973 
7974 			status = sd_send_scsi_READ_CAPACITY(ssc, &capacity,
7975 			    &lbasize, SD_PATH_DIRECT);
7976 
7977 			switch (status) {
7978 			case 0: {
7979 				if (capacity > DK_MAX_BLOCKS) {
7980 #ifdef _LP64
7981 					if ((capacity + 1) >
7982 					    SD_GROUP1_MAX_ADDRESS) {
7983 						/*
7984 						 * Enable descriptor format
7985 						 * sense data so that we can
7986 						 * get 64 bit sense data
7987 						 * fields.
7988 						 */
7989 						sd_enable_descr_sense(ssc);
7990 					}
7991 #else
7992 					/* 32-bit kernels can't handle this */
7993 					scsi_log(SD_DEVINFO(un),
7994 					    sd_label, CE_WARN,
7995 					    "disk has %llu blocks, which "
7996 					    "is too large for a 32-bit "
7997 					    "kernel", capacity);
7998 
7999 #if defined(__i386) || defined(__amd64)
8000 					/*
8001 					 * 1TB disk was treated as (1T - 512)B
8002 					 * in the past, so that it might have
8003 					 * valid VTOC and solaris partitions,
8004 					 * we have to allow it to continue to
8005 					 * work.
8006 					 */
8007 					if (capacity -1 > DK_MAX_BLOCKS)
8008 #endif
8009 					goto spinup_failed;
8010 #endif
8011 				}
8012 
8013 				/*
8014 				 * Here it's not necessary to check the case:
8015 				 * the capacity of the device is bigger than
8016 				 * what the max hba cdb can support. Because
8017 				 * sd_send_scsi_READ_CAPACITY will retrieve
8018 				 * the capacity by sending USCSI command, which
8019 				 * is constrained by the max hba cdb. Actually,
8020 				 * sd_send_scsi_READ_CAPACITY will return
8021 				 * EINVAL when using bigger cdb than required
8022 				 * cdb length. Will handle this case in
8023 				 * "case EINVAL".
8024 				 */
8025 
8026 				/*
8027 				 * The following relies on
8028 				 * sd_send_scsi_READ_CAPACITY never
8029 				 * returning 0 for capacity and/or lbasize.
8030 				 */
8031 				sd_update_block_info(un, lbasize, capacity);
8032 
8033 				SD_INFO(SD_LOG_ATTACH_DETACH, un,
8034 				    "sd_unit_attach: un:0x%p capacity = %ld "
8035 				    "blocks; lbasize= %ld.\n", un,
8036 				    un->un_blockcount, un->un_tgt_blocksize);
8037 
8038 				break;
8039 			}
8040 			case EINVAL:
8041 				/*
8042 				 * In the case where the max-cdb-length property
8043 				 * is smaller than the required CDB length for
8044 				 * a SCSI device, a target driver can fail to
8045 				 * attach to that device.
8046 				 */
8047 				scsi_log(SD_DEVINFO(un),
8048 				    sd_label, CE_WARN,
8049 				    "disk capacity is too large "
8050 				    "for current cdb length");
8051 				sd_ssc_assessment(ssc, SD_FMT_IGNORE);
8052 
8053 				goto spinup_failed;
8054 			case EACCES:
8055 				/*
8056 				 * Should never get here if the spin-up
8057 				 * succeeded, but code it in anyway.
8058 				 * From here, just continue with the attach...
8059 				 */
8060 				SD_INFO(SD_LOG_ATTACH_DETACH, un,
8061 				    "sd_unit_attach: un:0x%p "
8062 				    "sd_send_scsi_READ_CAPACITY "
8063 				    "returned reservation conflict\n", un);
8064 				reservation_flag = SD_TARGET_IS_RESERVED;
8065 				sd_ssc_assessment(ssc, SD_FMT_IGNORE);
8066 				break;
8067 			default:
8068 				/*
8069 				 * Likewise, should never get here if the
8070 				 * spin-up succeeded. Just continue with
8071 				 * the attach...
8072 				 */
8073 				if (status == EIO)
8074 					sd_ssc_assessment(ssc,
8075 					    SD_FMT_STATUS_CHECK);
8076 				else
8077 					sd_ssc_assessment(ssc,
8078 					    SD_FMT_IGNORE);
8079 				break;
8080 			}
8081 			break;
8082 		case EACCES:
8083 			/*
8084 			 * Device is reserved by another host.  In this case
8085 			 * we could not spin it up or read the capacity, but
8086 			 * we continue with the attach anyway.
8087 			 */
8088 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
8089 			    "sd_unit_attach: un:0x%p spin-up reservation "
8090 			    "conflict.\n", un);
8091 			reservation_flag = SD_TARGET_IS_RESERVED;
8092 			break;
8093 		default:
8094 			/* Fail the attach if the spin-up failed. */
8095 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
8096 			    "sd_unit_attach: un:0x%p spin-up failed.", un);
8097 			goto spinup_failed;
8098 		}
8099 
8100 	}
8101 
8102 	/*
8103 	 * Check to see if this is a MMC drive
8104 	 */
8105 	if (ISCD(un)) {
8106 		sd_set_mmc_caps(ssc);
8107 	}
8108 
8109 	/*
8110 	 * Add a zero-length attribute to tell the world we support
8111 	 * kernel ioctls (for layered drivers)
8112 	 */
8113 	(void) ddi_prop_create(DDI_DEV_T_NONE, devi, DDI_PROP_CANSLEEP,
8114 	    DDI_KERNEL_IOCTL, NULL, 0);
8115 
8116 	/*
8117 	 * Add a boolean property to tell the world we support
8118 	 * the B_FAILFAST flag (for layered drivers)
8119 	 */
8120 	(void) ddi_prop_create(DDI_DEV_T_NONE, devi, DDI_PROP_CANSLEEP,
8121 	    "ddi-failfast-supported", NULL, 0);
8122 
8123 	/*
8124 	 * Initialize power management
8125 	 */
8126 	mutex_init(&un->un_pm_mutex, NULL, MUTEX_DRIVER, NULL);
8127 	cv_init(&un->un_pm_busy_cv, NULL, CV_DRIVER, NULL);
8128 	sd_setup_pm(ssc, devi);
8129 	if (un->un_f_pm_is_enabled == FALSE) {
8130 		/*
8131 		 * For performance, point to a jump table that does
8132 		 * not include pm.
8133 		 * The direct and priority chains don't change with PM.
8134 		 *
8135 		 * Note: this is currently done based on individual device
8136 		 * capabilities. When an interface for determining system
8137 		 * power enabled state becomes available, or when additional
8138 		 * layers are added to the command chain, these values will
8139 		 * have to be re-evaluated for correctness.
8140 		 */
8141 		if (un->un_f_non_devbsize_supported) {
8142 			un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA_NO_PM;
8143 		} else {
8144 			un->un_buf_chain_type = SD_CHAIN_INFO_DISK_NO_PM;
8145 		}
8146 		un->un_uscsi_chain_type  = SD_CHAIN_INFO_USCSI_CMD_NO_PM;
8147 	}
8148 
8149 	/*
8150 	 * This property is set to 0 by HA software to avoid retries
8151 	 * on a reserved disk. (The preferred property name is
8152 	 * "retry-on-reservation-conflict") (1189689)
8153 	 *
8154 	 * Note: The use of a global here can have unintended consequences. A
8155 	 * per instance variable is preferable to match the capabilities of
8156 	 * different underlying hba's (4402600)
8157 	 */
8158 	sd_retry_on_reservation_conflict = ddi_getprop(DDI_DEV_T_ANY, devi,
8159 	    DDI_PROP_DONTPASS, "retry-on-reservation-conflict",
8160 	    sd_retry_on_reservation_conflict);
8161 	if (sd_retry_on_reservation_conflict != 0) {
8162 		sd_retry_on_reservation_conflict = ddi_getprop(DDI_DEV_T_ANY,
8163 		    devi, DDI_PROP_DONTPASS, sd_resv_conflict_name,
8164 		    sd_retry_on_reservation_conflict);
8165 	}
8166 
8167 	/* Set up options for QFULL handling. */
8168 	if ((rval = ddi_getprop(DDI_DEV_T_ANY, devi, 0,
8169 	    "qfull-retries", -1)) != -1) {
8170 		(void) scsi_ifsetcap(SD_ADDRESS(un), "qfull-retries",
8171 		    rval, 1);
8172 	}
8173 	if ((rval = ddi_getprop(DDI_DEV_T_ANY, devi, 0,
8174 	    "qfull-retry-interval", -1)) != -1) {
8175 		(void) scsi_ifsetcap(SD_ADDRESS(un), "qfull-retry-interval",
8176 		    rval, 1);
8177 	}
8178 
8179 	/*
8180 	 * This just prints a message that announces the existence of the
8181 	 * device. The message is always printed in the system logfile, but
8182 	 * only appears on the console if the system is booted with the
8183 	 * -v (verbose) argument.
8184 	 */
8185 	ddi_report_dev(devi);
8186 
8187 	un->un_mediastate = DKIO_NONE;
8188 
8189 	/*
8190 	 * Check Block Device Characteristics VPD.
8191 	 */
8192 	sd_check_bdc_vpd(ssc);
8193 
8194 	/*
8195 	 * Check whether the drive is in emulation mode.
8196 	 */
8197 	sd_check_emulation_mode(ssc);
8198 
8199 	cmlb_alloc_handle(&un->un_cmlbhandle);
8200 
8201 #if defined(__i386) || defined(__amd64)
8202 	/*
8203 	 * On x86, compensate for off-by-1 legacy error
8204 	 */
8205 	if (!un->un_f_has_removable_media && !un->un_f_is_hotpluggable &&
8206 	    (lbasize == un->un_sys_blocksize))
8207 		offbyone = CMLB_OFF_BY_ONE;
8208 #endif
8209 
8210 	if (cmlb_attach(devi, &sd_tgops, (int)devp->sd_inq->inq_dtype,
8211 	    VOID2BOOLEAN(un->un_f_has_removable_media != 0),
8212 	    VOID2BOOLEAN(un->un_f_is_hotpluggable != 0),
8213 	    un->un_node_type, offbyone, un->un_cmlbhandle,
8214 	    (void *)SD_PATH_DIRECT) != 0) {
8215 		goto cmlb_attach_failed;
8216 	}
8217 
8218 
8219 	/*
8220 	 * Read and validate the device's geometry (ie, disk label)
8221 	 * A new unformatted drive will not have a valid geometry, but
8222 	 * the driver needs to successfully attach to this device so
8223 	 * the drive can be formatted via ioctls.
8224 	 */
8225 	geom_label_valid = (cmlb_validate(un->un_cmlbhandle, 0,
8226 	    (void *)SD_PATH_DIRECT) == 0) ? 1: 0;
8227 
8228 	mutex_enter(SD_MUTEX(un));
8229 
8230 	/*
8231 	 * Read and initialize the devid for the unit.
8232 	 */
8233 	if (un->un_f_devid_supported) {
8234 		sd_register_devid(ssc, devi, reservation_flag);
8235 	}
8236 	mutex_exit(SD_MUTEX(un));
8237 
8238 #if (defined(__fibre))
8239 	/*
8240 	 * Register callbacks for fibre only.  You can't do this solely
8241 	 * on the basis of the devid_type because this is hba specific.
8242 	 * We need to query our hba capabilities to find out whether to
8243 	 * register or not.
8244 	 */
8245 	if (un->un_f_is_fibre) {
8246 		if (strcmp(un->un_node_type, DDI_NT_BLOCK_CHAN)) {
8247 			sd_init_event_callbacks(un);
8248 			SD_TRACE(SD_LOG_ATTACH_DETACH, un,
8249 			    "sd_unit_attach: un:0x%p event callbacks inserted",
8250 			    un);
8251 		}
8252 	}
8253 #endif
8254 
8255 	if (un->un_f_opt_disable_cache == TRUE) {
8256 		/*
8257 		 * Disable both read cache and write cache.  This is
8258 		 * the historic behavior of the keywords in the config file.
8259 		 */
8260 		if (sd_cache_control(ssc, SD_CACHE_DISABLE, SD_CACHE_DISABLE) !=
8261 		    0) {
8262 			SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8263 			    "sd_unit_attach: un:0x%p Could not disable "
8264 			    "caching", un);
8265 			goto devid_failed;
8266 		}
8267 	}
8268 
8269 	/*
8270 	 * Check the value of the WCE bit and if it's allowed to be changed,
8271 	 * set un_f_write_cache_enabled and un_f_cache_mode_changeable
8272 	 * accordingly.
8273 	 */
8274 	(void) sd_get_write_cache_enabled(ssc, &wc_enabled);
8275 	sd_get_write_cache_changeable(ssc, &wc_changeable);
8276 	mutex_enter(SD_MUTEX(un));
8277 	un->un_f_write_cache_enabled = (wc_enabled != 0);
8278 	un->un_f_cache_mode_changeable = (wc_changeable != 0);
8279 	mutex_exit(SD_MUTEX(un));
8280 
8281 	if ((un->un_f_rmw_type != SD_RMW_TYPE_RETURN_ERROR &&
8282 	    un->un_tgt_blocksize != DEV_BSIZE) ||
8283 	    un->un_f_enable_rmw) {
8284 		if (!(un->un_wm_cache)) {
8285 			(void) snprintf(name_str, sizeof (name_str),
8286 			    "%s%d_cache",
8287 			    ddi_driver_name(SD_DEVINFO(un)),
8288 			    ddi_get_instance(SD_DEVINFO(un)));
8289 			un->un_wm_cache = kmem_cache_create(
8290 			    name_str, sizeof (struct sd_w_map),
8291 			    8, sd_wm_cache_constructor,
8292 			    sd_wm_cache_destructor, NULL,
8293 			    (void *)un, NULL, 0);
8294 			if (!(un->un_wm_cache)) {
8295 				goto wm_cache_failed;
8296 			}
8297 		}
8298 	}
8299 
8300 	/*
8301 	 * Check the value of the NV_SUP bit and set
8302 	 * un_f_suppress_cache_flush accordingly.
8303 	 */
8304 	sd_get_nv_sup(ssc);
8305 
8306 	/*
8307 	 * Find out what type of reservation this disk supports.
8308 	 */
8309 	status = sd_send_scsi_PERSISTENT_RESERVE_IN(ssc, SD_READ_KEYS, 0, NULL);
8310 
8311 	switch (status) {
8312 	case 0:
8313 		/*
8314 		 * SCSI-3 reservations are supported.
8315 		 */
8316 		un->un_reservation_type = SD_SCSI3_RESERVATION;
8317 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
8318 		    "sd_unit_attach: un:0x%p SCSI-3 reservations\n", un);
8319 		break;
8320 	case ENOTSUP:
8321 		/*
8322 		 * The PERSISTENT RESERVE IN command would not be recognized by
8323 		 * a SCSI-2 device, so assume the reservation type is SCSI-2.
8324 		 */
8325 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
8326 		    "sd_unit_attach: un:0x%p SCSI-2 reservations\n", un);
8327 		un->un_reservation_type = SD_SCSI2_RESERVATION;
8328 
8329 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
8330 		break;
8331 	default:
8332 		/*
8333 		 * default to SCSI-3 reservations
8334 		 */
8335 		SD_INFO(SD_LOG_ATTACH_DETACH, un,
8336 		    "sd_unit_attach: un:0x%p default SCSI3 reservations\n", un);
8337 		un->un_reservation_type = SD_SCSI3_RESERVATION;
8338 
8339 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
8340 		break;
8341 	}
8342 
8343 	/*
8344 	 * Set the pstat and error stat values here, so data obtained during the
8345 	 * previous attach-time routines is available.
8346 	 *
8347 	 * Note: This is a critical sequence that needs to be maintained:
8348 	 *	1) Instantiate the kstats before any routines using the iopath
8349 	 *	   (i.e. sd_send_scsi_cmd).
8350 	 *	2) Initialize the error stats (sd_set_errstats) and partition
8351 	 *	   stats (sd_set_pstats)here, following
8352 	 *	   cmlb_validate_geometry(), sd_register_devid(), and
8353 	 *	   sd_cache_control().
8354 	 */
8355 
8356 	if (un->un_f_pkstats_enabled && geom_label_valid) {
8357 		sd_set_pstats(un);
8358 		SD_TRACE(SD_LOG_IO_PARTITION, un,
8359 		    "sd_unit_attach: un:0x%p pstats created and set\n", un);
8360 	}
8361 
8362 	sd_set_errstats(un);
8363 	SD_TRACE(SD_LOG_ATTACH_DETACH, un,
8364 	    "sd_unit_attach: un:0x%p errstats set\n", un);
8365 
8366 
8367 	/*
8368 	 * After successfully attaching an instance, we record the information
8369 	 * of how many luns have been attached on the relative target and
8370 	 * controller for parallel SCSI. This information is used when sd tries
8371 	 * to set the tagged queuing capability in HBA.
8372 	 */
8373 	if (SD_IS_PARALLEL_SCSI(un) && (tgt >= 0) && (tgt < NTARGETS_WIDE)) {
8374 		sd_scsi_update_lun_on_target(pdip, tgt, SD_SCSI_LUN_ATTACH);
8375 	}
8376 
8377 	SD_TRACE(SD_LOG_ATTACH_DETACH, un,
8378 	    "sd_unit_attach: un:0x%p exit success\n", un);
8379 
8380 	/* Uninitialize sd_ssc_t pointer */
8381 	sd_ssc_fini(ssc);
8382 
8383 	return (DDI_SUCCESS);
8384 
8385 	/*
8386 	 * An error occurred during the attach; clean up & return failure.
8387 	 */
8388 wm_cache_failed:
8389 devid_failed:
8390 	ddi_remove_minor_node(devi, NULL);
8391 
8392 cmlb_attach_failed:
8393 	/*
8394 	 * Cleanup from the scsi_ifsetcap() calls (437868)
8395 	 */
8396 	(void) scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 0, 1);
8397 	(void) scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", 0, 1);
8398 
8399 	/*
8400 	 * Refer to the comments of setting tagged-qing in the beginning of
8401 	 * sd_unit_attach. We can only disable tagged queuing when there is
8402 	 * no lun attached on the target.
8403 	 */
8404 	if (sd_scsi_get_target_lun_count(pdip, tgt) < 1) {
8405 		(void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1);
8406 	}
8407 
8408 	if (un->un_f_is_fibre == FALSE) {
8409 		(void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 0, 1);
8410 	}
8411 
8412 spinup_failed:
8413 
8414 	/* Uninitialize sd_ssc_t pointer */
8415 	sd_ssc_fini(ssc);
8416 
8417 	mutex_enter(SD_MUTEX(un));
8418 
8419 	/* Deallocate SCSI FMA memory spaces */
8420 	kmem_free(un->un_fm_private, sizeof (struct sd_fm_internal));
8421 
8422 	/* Cancel callback for SD_PATH_DIRECT_PRIORITY cmd. restart */
8423 	if (un->un_direct_priority_timeid != NULL) {
8424 		timeout_id_t temp_id = un->un_direct_priority_timeid;
8425 		un->un_direct_priority_timeid = NULL;
8426 		mutex_exit(SD_MUTEX(un));
8427 		(void) untimeout(temp_id);
8428 		mutex_enter(SD_MUTEX(un));
8429 	}
8430 
8431 	/* Cancel any pending start/stop timeouts */
8432 	if (un->un_startstop_timeid != NULL) {
8433 		timeout_id_t temp_id = un->un_startstop_timeid;
8434 		un->un_startstop_timeid = NULL;
8435 		mutex_exit(SD_MUTEX(un));
8436 		(void) untimeout(temp_id);
8437 		mutex_enter(SD_MUTEX(un));
8438 	}
8439 
8440 	/* Cancel any pending reset-throttle timeouts */
8441 	if (un->un_reset_throttle_timeid != NULL) {
8442 		timeout_id_t temp_id = un->un_reset_throttle_timeid;
8443 		un->un_reset_throttle_timeid = NULL;
8444 		mutex_exit(SD_MUTEX(un));
8445 		(void) untimeout(temp_id);
8446 		mutex_enter(SD_MUTEX(un));
8447 	}
8448 
8449 	/* Cancel rmw warning message timeouts */
8450 	if (un->un_rmw_msg_timeid != NULL) {
8451 		timeout_id_t temp_id = un->un_rmw_msg_timeid;
8452 		un->un_rmw_msg_timeid = NULL;
8453 		mutex_exit(SD_MUTEX(un));
8454 		(void) untimeout(temp_id);
8455 		mutex_enter(SD_MUTEX(un));
8456 	}
8457 
8458 	/* Cancel any pending retry timeouts */
8459 	if (un->un_retry_timeid != NULL) {
8460 		timeout_id_t temp_id = un->un_retry_timeid;
8461 		un->un_retry_timeid = NULL;
8462 		mutex_exit(SD_MUTEX(un));
8463 		(void) untimeout(temp_id);
8464 		mutex_enter(SD_MUTEX(un));
8465 	}
8466 
8467 	/* Cancel any pending delayed cv broadcast timeouts */
8468 	if (un->un_dcvb_timeid != NULL) {
8469 		timeout_id_t temp_id = un->un_dcvb_timeid;
8470 		un->un_dcvb_timeid = NULL;
8471 		mutex_exit(SD_MUTEX(un));
8472 		(void) untimeout(temp_id);
8473 		mutex_enter(SD_MUTEX(un));
8474 	}
8475 
8476 	mutex_exit(SD_MUTEX(un));
8477 
8478 	/* There should not be any in-progress I/O so ASSERT this check */
8479 	ASSERT(un->un_ncmds_in_transport == 0);
8480 	ASSERT(un->un_ncmds_in_driver == 0);
8481 
8482 	/* Do not free the softstate if the callback routine is active */
8483 	sd_sync_with_callback(un);
8484 
8485 	/*
8486 	 * Partition stats apparently are not used with removables. These would
8487 	 * not have been created during attach, so no need to clean them up...
8488 	 */
8489 	if (un->un_errstats != NULL) {
8490 		kstat_delete(un->un_errstats);
8491 		un->un_errstats = NULL;
8492 	}
8493 
8494 create_errstats_failed:
8495 
8496 	if (un->un_stats != NULL) {
8497 		kstat_delete(un->un_stats);
8498 		un->un_stats = NULL;
8499 	}
8500 
8501 	ddi_xbuf_attr_unregister_devinfo(un->un_xbuf_attr, devi);
8502 	ddi_xbuf_attr_destroy(un->un_xbuf_attr);
8503 
8504 	ddi_prop_remove_all(devi);
8505 	sema_destroy(&un->un_semoclose);
8506 	cv_destroy(&un->un_state_cv);
8507 
8508 	sd_free_rqs(un);
8509 
8510 alloc_rqs_failed:
8511 
8512 	devp->sd_private = NULL;
8513 	bzero(un, sizeof (struct sd_lun));	/* Clear any stale data! */
8514 
8515 	/*
8516 	 * Note: the man pages are unclear as to whether or not doing a
8517 	 * ddi_soft_state_free(sd_state, instance) is the right way to
8518 	 * clean up after the ddi_soft_state_zalloc() if the subsequent
8519 	 * ddi_get_soft_state() fails.  The implication seems to be
8520 	 * that the get_soft_state cannot fail if the zalloc succeeds.
8521 	 */
8522 #ifndef XPV_HVM_DRIVER
8523 	ddi_soft_state_free(sd_state, instance);
8524 #endif /* !XPV_HVM_DRIVER */
8525 
8526 probe_failed:
8527 	scsi_unprobe(devp);
8528 
8529 	return (DDI_FAILURE);
8530 }
8531 
8532 
8533 /*
8534  *    Function: sd_unit_detach
8535  *
8536  * Description: Performs DDI_DETACH processing for sddetach().
8537  *
8538  * Return Code: DDI_SUCCESS
8539  *		DDI_FAILURE
8540  *
8541  *     Context: Kernel thread context
8542  */
8543 
8544 static int
8545 sd_unit_detach(dev_info_t *devi)
8546 {
8547 	struct scsi_device	*devp;
8548 	struct sd_lun		*un;
8549 	int			i;
8550 	int			tgt;
8551 	dev_t			dev;
8552 	dev_info_t		*pdip = ddi_get_parent(devi);
8553 	int			instance = ddi_get_instance(devi);
8554 
8555 	mutex_enter(&sd_detach_mutex);
8556 
8557 	/*
8558 	 * Fail the detach for any of the following:
8559 	 *  - Unable to get the sd_lun struct for the instance
8560 	 *  - A layered driver has an outstanding open on the instance
8561 	 *  - Another thread is already detaching this instance
8562 	 *  - Another thread is currently performing an open
8563 	 */
8564 	devp = ddi_get_driver_private(devi);
8565 	if ((devp == NULL) ||
8566 	    ((un = (struct sd_lun *)devp->sd_private) == NULL) ||
8567 	    (un->un_ncmds_in_driver != 0) || (un->un_layer_count != 0) ||
8568 	    (un->un_detach_count != 0) || (un->un_opens_in_progress != 0)) {
8569 		mutex_exit(&sd_detach_mutex);
8570 		return (DDI_FAILURE);
8571 	}
8572 
8573 	SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_unit_detach: entry 0x%p\n", un);
8574 
8575 	/*
8576 	 * Mark this instance as currently in a detach, to inhibit any
8577 	 * opens from a layered driver.
8578 	 */
8579 	un->un_detach_count++;
8580 	mutex_exit(&sd_detach_mutex);
8581 
8582 	tgt = ddi_prop_get_int(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS,
8583 	    SCSI_ADDR_PROP_TARGET, -1);
8584 
8585 	dev = sd_make_device(SD_DEVINFO(un));
8586 
8587 #ifndef lint
8588 	_NOTE(COMPETING_THREADS_NOW);
8589 #endif
8590 
8591 	mutex_enter(SD_MUTEX(un));
8592 
8593 	/*
8594 	 * Fail the detach if there are any outstanding layered
8595 	 * opens on this device.
8596 	 */
8597 	for (i = 0; i < NDKMAP; i++) {
8598 		if (un->un_ocmap.lyropen[i] != 0) {
8599 			goto err_notclosed;
8600 		}
8601 	}
8602 
8603 	/*
8604 	 * Verify there are NO outstanding commands issued to this device.
8605 	 * ie, un_ncmds_in_transport == 0.
8606 	 * It's possible to have outstanding commands through the physio
8607 	 * code path, even though everything's closed.
8608 	 */
8609 	if ((un->un_ncmds_in_transport != 0) || (un->un_retry_timeid != NULL) ||
8610 	    (un->un_direct_priority_timeid != NULL) ||
8611 	    (un->un_state == SD_STATE_RWAIT)) {
8612 		mutex_exit(SD_MUTEX(un));
8613 		SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8614 		    "sd_dr_detach: Detach failure due to outstanding cmds\n");
8615 		goto err_stillbusy;
8616 	}
8617 
8618 	/*
8619 	 * If we have the device reserved, release the reservation.
8620 	 */
8621 	if ((un->un_resvd_status & SD_RESERVE) &&
8622 	    !(un->un_resvd_status & SD_LOST_RESERVE)) {
8623 		mutex_exit(SD_MUTEX(un));
8624 		/*
8625 		 * Note: sd_reserve_release sends a command to the device
8626 		 * via the sd_ioctlcmd() path, and can sleep.
8627 		 */
8628 		if (sd_reserve_release(dev, SD_RELEASE) != 0) {
8629 			SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8630 			    "sd_dr_detach: Cannot release reservation \n");
8631 		}
8632 	} else {
8633 		mutex_exit(SD_MUTEX(un));
8634 	}
8635 
8636 	/*
8637 	 * Untimeout any reserve recover, throttle reset, restart unit
8638 	 * and delayed broadcast timeout threads. Protect the timeout pointer
8639 	 * from getting nulled by their callback functions.
8640 	 */
8641 	mutex_enter(SD_MUTEX(un));
8642 	if (un->un_resvd_timeid != NULL) {
8643 		timeout_id_t temp_id = un->un_resvd_timeid;
8644 		un->un_resvd_timeid = NULL;
8645 		mutex_exit(SD_MUTEX(un));
8646 		(void) untimeout(temp_id);
8647 		mutex_enter(SD_MUTEX(un));
8648 	}
8649 
8650 	if (un->un_reset_throttle_timeid != NULL) {
8651 		timeout_id_t temp_id = un->un_reset_throttle_timeid;
8652 		un->un_reset_throttle_timeid = NULL;
8653 		mutex_exit(SD_MUTEX(un));
8654 		(void) untimeout(temp_id);
8655 		mutex_enter(SD_MUTEX(un));
8656 	}
8657 
8658 	if (un->un_startstop_timeid != NULL) {
8659 		timeout_id_t temp_id = un->un_startstop_timeid;
8660 		un->un_startstop_timeid = NULL;
8661 		mutex_exit(SD_MUTEX(un));
8662 		(void) untimeout(temp_id);
8663 		mutex_enter(SD_MUTEX(un));
8664 	}
8665 
8666 	if (un->un_rmw_msg_timeid != NULL) {
8667 		timeout_id_t temp_id = un->un_rmw_msg_timeid;
8668 		un->un_rmw_msg_timeid = NULL;
8669 		mutex_exit(SD_MUTEX(un));
8670 		(void) untimeout(temp_id);
8671 		mutex_enter(SD_MUTEX(un));
8672 	}
8673 
8674 	if (un->un_dcvb_timeid != NULL) {
8675 		timeout_id_t temp_id = un->un_dcvb_timeid;
8676 		un->un_dcvb_timeid = NULL;
8677 		mutex_exit(SD_MUTEX(un));
8678 		(void) untimeout(temp_id);
8679 	} else {
8680 		mutex_exit(SD_MUTEX(un));
8681 	}
8682 
8683 	/* Remove any pending reservation reclaim requests for this device */
8684 	sd_rmv_resv_reclaim_req(dev);
8685 
8686 	mutex_enter(SD_MUTEX(un));
8687 
8688 	/* Cancel any pending callbacks for SD_PATH_DIRECT_PRIORITY cmd. */
8689 	if (un->un_direct_priority_timeid != NULL) {
8690 		timeout_id_t temp_id = un->un_direct_priority_timeid;
8691 		un->un_direct_priority_timeid = NULL;
8692 		mutex_exit(SD_MUTEX(un));
8693 		(void) untimeout(temp_id);
8694 		mutex_enter(SD_MUTEX(un));
8695 	}
8696 
8697 	/* Cancel any active multi-host disk watch thread requests */
8698 	if (un->un_mhd_token != NULL) {
8699 		mutex_exit(SD_MUTEX(un));
8700 		 _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_mhd_token));
8701 		if (scsi_watch_request_terminate(un->un_mhd_token,
8702 		    SCSI_WATCH_TERMINATE_NOWAIT)) {
8703 			SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8704 			    "sd_dr_detach: Cannot cancel mhd watch request\n");
8705 			/*
8706 			 * Note: We are returning here after having removed
8707 			 * some driver timeouts above. This is consistent with
8708 			 * the legacy implementation but perhaps the watch
8709 			 * terminate call should be made with the wait flag set.
8710 			 */
8711 			goto err_stillbusy;
8712 		}
8713 		mutex_enter(SD_MUTEX(un));
8714 		un->un_mhd_token = NULL;
8715 	}
8716 
8717 	if (un->un_swr_token != NULL) {
8718 		mutex_exit(SD_MUTEX(un));
8719 		_NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_swr_token));
8720 		if (scsi_watch_request_terminate(un->un_swr_token,
8721 		    SCSI_WATCH_TERMINATE_NOWAIT)) {
8722 			SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8723 			    "sd_dr_detach: Cannot cancel swr watch request\n");
8724 			/*
8725 			 * Note: We are returning here after having removed
8726 			 * some driver timeouts above. This is consistent with
8727 			 * the legacy implementation but perhaps the watch
8728 			 * terminate call should be made with the wait flag set.
8729 			 */
8730 			goto err_stillbusy;
8731 		}
8732 		mutex_enter(SD_MUTEX(un));
8733 		un->un_swr_token = NULL;
8734 	}
8735 
8736 	mutex_exit(SD_MUTEX(un));
8737 
8738 	/*
8739 	 * Clear any scsi_reset_notifies. We clear the reset notifies
8740 	 * if we have not registered one.
8741 	 * Note: The sd_mhd_reset_notify_cb() fn tries to acquire SD_MUTEX!
8742 	 */
8743 	(void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_CANCEL,
8744 	    sd_mhd_reset_notify_cb, (caddr_t)un);
8745 
8746 	/*
8747 	 * protect the timeout pointers from getting nulled by
8748 	 * their callback functions during the cancellation process.
8749 	 * In such a scenario untimeout can be invoked with a null value.
8750 	 */
8751 	_NOTE(NO_COMPETING_THREADS_NOW);
8752 
8753 	mutex_enter(&un->un_pm_mutex);
8754 	if (un->un_pm_idle_timeid != NULL) {
8755 		timeout_id_t temp_id = un->un_pm_idle_timeid;
8756 		un->un_pm_idle_timeid = NULL;
8757 		mutex_exit(&un->un_pm_mutex);
8758 
8759 		/*
8760 		 * Timeout is active; cancel it.
8761 		 * Note that it'll never be active on a device
8762 		 * that does not support PM therefore we don't
8763 		 * have to check before calling pm_idle_component.
8764 		 */
8765 		(void) untimeout(temp_id);
8766 		(void) pm_idle_component(SD_DEVINFO(un), 0);
8767 		mutex_enter(&un->un_pm_mutex);
8768 	}
8769 
8770 	/*
8771 	 * Check whether there is already a timeout scheduled for power
8772 	 * management. If yes then don't lower the power here, that's.
8773 	 * the timeout handler's job.
8774 	 */
8775 	if (un->un_pm_timeid != NULL) {
8776 		timeout_id_t temp_id = un->un_pm_timeid;
8777 		un->un_pm_timeid = NULL;
8778 		mutex_exit(&un->un_pm_mutex);
8779 		/*
8780 		 * Timeout is active; cancel it.
8781 		 * Note that it'll never be active on a device
8782 		 * that does not support PM therefore we don't
8783 		 * have to check before calling pm_idle_component.
8784 		 */
8785 		(void) untimeout(temp_id);
8786 		(void) pm_idle_component(SD_DEVINFO(un), 0);
8787 
8788 	} else {
8789 		mutex_exit(&un->un_pm_mutex);
8790 		if ((un->un_f_pm_is_enabled == TRUE) &&
8791 		    (pm_lower_power(SD_DEVINFO(un), 0, SD_PM_STATE_STOPPED(un))
8792 		    != DDI_SUCCESS)) {
8793 			SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8794 		    "sd_dr_detach: Lower power request failed, ignoring.\n");
8795 			/*
8796 			 * Fix for bug: 4297749, item # 13
8797 			 * The above test now includes a check to see if PM is
8798 			 * supported by this device before call
8799 			 * pm_lower_power().
8800 			 * Note, the following is not dead code. The call to
8801 			 * pm_lower_power above will generate a call back into
8802 			 * our sdpower routine which might result in a timeout
8803 			 * handler getting activated. Therefore the following
8804 			 * code is valid and necessary.
8805 			 */
8806 			mutex_enter(&un->un_pm_mutex);
8807 			if (un->un_pm_timeid != NULL) {
8808 				timeout_id_t temp_id = un->un_pm_timeid;
8809 				un->un_pm_timeid = NULL;
8810 				mutex_exit(&un->un_pm_mutex);
8811 				(void) untimeout(temp_id);
8812 				(void) pm_idle_component(SD_DEVINFO(un), 0);
8813 			} else {
8814 				mutex_exit(&un->un_pm_mutex);
8815 			}
8816 		}
8817 	}
8818 
8819 	/*
8820 	 * Cleanup from the scsi_ifsetcap() calls (437868)
8821 	 * Relocated here from above to be after the call to
8822 	 * pm_lower_power, which was getting errors.
8823 	 */
8824 	(void) scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 0, 1);
8825 	(void) scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", 0, 1);
8826 
8827 	/*
8828 	 * Currently, tagged queuing is supported per target based by HBA.
8829 	 * Setting this per lun instance actually sets the capability of this
8830 	 * target in HBA, which affects those luns already attached on the
8831 	 * same target. So during detach, we can only disable this capability
8832 	 * only when this is the only lun left on this target. By doing
8833 	 * this, we assume a target has the same tagged queuing capability
8834 	 * for every lun. The condition can be removed when HBA is changed to
8835 	 * support per lun based tagged queuing capability.
8836 	 */
8837 	if (sd_scsi_get_target_lun_count(pdip, tgt) <= 1) {
8838 		(void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1);
8839 	}
8840 
8841 	if (un->un_f_is_fibre == FALSE) {
8842 		(void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 0, 1);
8843 	}
8844 
8845 	/*
8846 	 * Remove any event callbacks, fibre only
8847 	 */
8848 	if (un->un_f_is_fibre == TRUE) {
8849 		if ((un->un_insert_event != NULL) &&
8850 		    (ddi_remove_event_handler(un->un_insert_cb_id) !=
8851 		    DDI_SUCCESS)) {
8852 			/*
8853 			 * Note: We are returning here after having done
8854 			 * substantial cleanup above. This is consistent
8855 			 * with the legacy implementation but this may not
8856 			 * be the right thing to do.
8857 			 */
8858 			SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8859 			    "sd_dr_detach: Cannot cancel insert event\n");
8860 			goto err_remove_event;
8861 		}
8862 		un->un_insert_event = NULL;
8863 
8864 		if ((un->un_remove_event != NULL) &&
8865 		    (ddi_remove_event_handler(un->un_remove_cb_id) !=
8866 		    DDI_SUCCESS)) {
8867 			/*
8868 			 * Note: We are returning here after having done
8869 			 * substantial cleanup above. This is consistent
8870 			 * with the legacy implementation but this may not
8871 			 * be the right thing to do.
8872 			 */
8873 			SD_ERROR(SD_LOG_ATTACH_DETACH, un,
8874 			    "sd_dr_detach: Cannot cancel remove event\n");
8875 			goto err_remove_event;
8876 		}
8877 		un->un_remove_event = NULL;
8878 	}
8879 
8880 	/* Do not free the softstate if the callback routine is active */
8881 	sd_sync_with_callback(un);
8882 
8883 	cmlb_detach(un->un_cmlbhandle, (void *)SD_PATH_DIRECT);
8884 	cmlb_free_handle(&un->un_cmlbhandle);
8885 
8886 	/*
8887 	 * Hold the detach mutex here, to make sure that no other threads ever
8888 	 * can access a (partially) freed soft state structure.
8889 	 */
8890 	mutex_enter(&sd_detach_mutex);
8891 
8892 	/*
8893 	 * Clean up the soft state struct.
8894 	 * Cleanup is done in reverse order of allocs/inits.
8895 	 * At this point there should be no competing threads anymore.
8896 	 */
8897 
8898 	scsi_fm_fini(devp);
8899 
8900 	/*
8901 	 * Deallocate memory for SCSI FMA.
8902 	 */
8903 	kmem_free(un->un_fm_private, sizeof (struct sd_fm_internal));
8904 
8905 	/*
8906 	 * Unregister and free device id if it was not registered
8907 	 * by the transport.
8908 	 */
8909 	if (un->un_f_devid_transport_defined == FALSE)
8910 		ddi_devid_unregister(devi);
8911 
8912 	/*
8913 	 * free the devid structure if allocated before (by ddi_devid_init()
8914 	 * or ddi_devid_get()).
8915 	 */
8916 	if (un->un_devid) {
8917 		ddi_devid_free(un->un_devid);
8918 		un->un_devid = NULL;
8919 	}
8920 
8921 	/*
8922 	 * Destroy wmap cache if it exists.
8923 	 */
8924 	if (un->un_wm_cache != NULL) {
8925 		kmem_cache_destroy(un->un_wm_cache);
8926 		un->un_wm_cache = NULL;
8927 	}
8928 
8929 	/*
8930 	 * kstat cleanup is done in detach for all device types (4363169).
8931 	 * We do not want to fail detach if the device kstats are not deleted
8932 	 * since there is a confusion about the devo_refcnt for the device.
8933 	 * We just delete the kstats and let detach complete successfully.
8934 	 */
8935 	if (un->un_stats != NULL) {
8936 		kstat_delete(un->un_stats);
8937 		un->un_stats = NULL;
8938 	}
8939 	if (un->un_errstats != NULL) {
8940 		kstat_delete(un->un_errstats);
8941 		un->un_errstats = NULL;
8942 	}
8943 
8944 	/* Remove partition stats */
8945 	if (un->un_f_pkstats_enabled) {
8946 		for (i = 0; i < NSDMAP; i++) {
8947 			if (un->un_pstats[i] != NULL) {
8948 				kstat_delete(un->un_pstats[i]);
8949 				un->un_pstats[i] = NULL;
8950 			}
8951 		}
8952 	}
8953 
8954 	/* Remove xbuf registration */
8955 	ddi_xbuf_attr_unregister_devinfo(un->un_xbuf_attr, devi);
8956 	ddi_xbuf_attr_destroy(un->un_xbuf_attr);
8957 
8958 	/* Remove driver properties */
8959 	ddi_prop_remove_all(devi);
8960 
8961 	mutex_destroy(&un->un_pm_mutex);
8962 	cv_destroy(&un->un_pm_busy_cv);
8963 
8964 	cv_destroy(&un->un_wcc_cv);
8965 
8966 	/* Open/close semaphore */
8967 	sema_destroy(&un->un_semoclose);
8968 
8969 	/* Removable media condvar. */
8970 	cv_destroy(&un->un_state_cv);
8971 
8972 	/* Suspend/resume condvar. */
8973 	cv_destroy(&un->un_suspend_cv);
8974 	cv_destroy(&un->un_disk_busy_cv);
8975 
8976 	sd_free_rqs(un);
8977 
8978 	/* Free up soft state */
8979 	devp->sd_private = NULL;
8980 
8981 	bzero(un, sizeof (struct sd_lun));
8982 
8983 	ddi_soft_state_free(sd_state, instance);
8984 
8985 	mutex_exit(&sd_detach_mutex);
8986 
8987 	/* This frees up the INQUIRY data associated with the device. */
8988 	scsi_unprobe(devp);
8989 
8990 	/*
8991 	 * After successfully detaching an instance, we update the information
8992 	 * of how many luns have been attached in the relative target and
8993 	 * controller for parallel SCSI. This information is used when sd tries
8994 	 * to set the tagged queuing capability in HBA.
8995 	 * Since un has been released, we can't use SD_IS_PARALLEL_SCSI(un) to
8996 	 * check if the device is parallel SCSI. However, we don't need to
8997 	 * check here because we've already checked during attach. No device
8998 	 * that is not parallel SCSI is in the chain.
8999 	 */
9000 	if ((tgt >= 0) && (tgt < NTARGETS_WIDE)) {
9001 		sd_scsi_update_lun_on_target(pdip, tgt, SD_SCSI_LUN_DETACH);
9002 	}
9003 
9004 	return (DDI_SUCCESS);
9005 
9006 err_notclosed:
9007 	mutex_exit(SD_MUTEX(un));
9008 
9009 err_stillbusy:
9010 	_NOTE(NO_COMPETING_THREADS_NOW);
9011 
9012 err_remove_event:
9013 	mutex_enter(&sd_detach_mutex);
9014 	un->un_detach_count--;
9015 	mutex_exit(&sd_detach_mutex);
9016 
9017 	SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_unit_detach: exit failure\n");
9018 	return (DDI_FAILURE);
9019 }
9020 
9021 
9022 /*
9023  *    Function: sd_create_errstats
9024  *
9025  * Description: This routine instantiates the device error stats.
9026  *
9027  *		Note: During attach the stats are instantiated first so they are
9028  *		available for attach-time routines that utilize the driver
9029  *		iopath to send commands to the device. The stats are initialized
9030  *		separately so data obtained during some attach-time routines is
9031  *		available. (4362483)
9032  *
9033  *   Arguments: un - driver soft state (unit) structure
9034  *		instance - driver instance
9035  *
9036  *     Context: Kernel thread context
9037  */
9038 
9039 static void
9040 sd_create_errstats(struct sd_lun *un, int instance)
9041 {
9042 	struct	sd_errstats	*stp;
9043 	char	kstatmodule_err[KSTAT_STRLEN];
9044 	char	kstatname[KSTAT_STRLEN];
9045 	int	ndata = (sizeof (struct sd_errstats) / sizeof (kstat_named_t));
9046 
9047 	ASSERT(un != NULL);
9048 
9049 	if (un->un_errstats != NULL) {
9050 		return;
9051 	}
9052 
9053 	(void) snprintf(kstatmodule_err, sizeof (kstatmodule_err),
9054 	    "%serr", sd_label);
9055 	(void) snprintf(kstatname, sizeof (kstatname),
9056 	    "%s%d,err", sd_label, instance);
9057 
9058 	un->un_errstats = kstat_create(kstatmodule_err, instance, kstatname,
9059 	    "device_error", KSTAT_TYPE_NAMED, ndata, KSTAT_FLAG_PERSISTENT);
9060 
9061 	if (un->un_errstats == NULL) {
9062 		SD_ERROR(SD_LOG_ATTACH_DETACH, un,
9063 		    "sd_create_errstats: Failed kstat_create\n");
9064 		return;
9065 	}
9066 
9067 	stp = (struct sd_errstats *)un->un_errstats->ks_data;
9068 	kstat_named_init(&stp->sd_softerrs,	"Soft Errors",
9069 	    KSTAT_DATA_UINT32);
9070 	kstat_named_init(&stp->sd_harderrs,	"Hard Errors",
9071 	    KSTAT_DATA_UINT32);
9072 	kstat_named_init(&stp->sd_transerrs,	"Transport Errors",
9073 	    KSTAT_DATA_UINT32);
9074 	kstat_named_init(&stp->sd_vid,		"Vendor",
9075 	    KSTAT_DATA_CHAR);
9076 	kstat_named_init(&stp->sd_pid,		"Product",
9077 	    KSTAT_DATA_CHAR);
9078 	kstat_named_init(&stp->sd_revision,	"Revision",
9079 	    KSTAT_DATA_CHAR);
9080 	kstat_named_init(&stp->sd_serial,	"Serial No",
9081 	    KSTAT_DATA_CHAR);
9082 	kstat_named_init(&stp->sd_capacity,	"Size",
9083 	    KSTAT_DATA_ULONGLONG);
9084 	kstat_named_init(&stp->sd_rq_media_err,	"Media Error",
9085 	    KSTAT_DATA_UINT32);
9086 	kstat_named_init(&stp->sd_rq_ntrdy_err,	"Device Not Ready",
9087 	    KSTAT_DATA_UINT32);
9088 	kstat_named_init(&stp->sd_rq_nodev_err,	"No Device",
9089 	    KSTAT_DATA_UINT32);
9090 	kstat_named_init(&stp->sd_rq_recov_err,	"Recoverable",
9091 	    KSTAT_DATA_UINT32);
9092 	kstat_named_init(&stp->sd_rq_illrq_err,	"Illegal Request",
9093 	    KSTAT_DATA_UINT32);
9094 	kstat_named_init(&stp->sd_rq_pfa_err,	"Predictive Failure Analysis",
9095 	    KSTAT_DATA_UINT32);
9096 
9097 	un->un_errstats->ks_private = un;
9098 	un->un_errstats->ks_update  = nulldev;
9099 
9100 	kstat_install(un->un_errstats);
9101 }
9102 
9103 
9104 /*
9105  *    Function: sd_set_errstats
9106  *
9107  * Description: This routine sets the value of the vendor id, product id,
9108  *		revision, serial number, and capacity device error stats.
9109  *
9110  *		Note: During attach the stats are instantiated first so they are
9111  *		available for attach-time routines that utilize the driver
9112  *		iopath to send commands to the device. The stats are initialized
9113  *		separately so data obtained during some attach-time routines is
9114  *		available. (4362483)
9115  *
9116  *   Arguments: un - driver soft state (unit) structure
9117  *
9118  *     Context: Kernel thread context
9119  */
9120 
9121 static void
9122 sd_set_errstats(struct sd_lun *un)
9123 {
9124 	struct	sd_errstats	*stp;
9125 	char 			*sn;
9126 
9127 	ASSERT(un != NULL);
9128 	ASSERT(un->un_errstats != NULL);
9129 	stp = (struct sd_errstats *)un->un_errstats->ks_data;
9130 	ASSERT(stp != NULL);
9131 	(void) strncpy(stp->sd_vid.value.c, un->un_sd->sd_inq->inq_vid, 8);
9132 	(void) strncpy(stp->sd_pid.value.c, un->un_sd->sd_inq->inq_pid, 16);
9133 	(void) strncpy(stp->sd_revision.value.c,
9134 	    un->un_sd->sd_inq->inq_revision, 4);
9135 
9136 	/*
9137 	 * All the errstats are persistent across detach/attach,
9138 	 * so reset all the errstats here in case of the hot
9139 	 * replacement of disk drives, except for not changed
9140 	 * Sun qualified drives.
9141 	 */
9142 	if ((bcmp(&SD_INQUIRY(un)->inq_pid[9], "SUN", 3) != 0) ||
9143 	    (bcmp(&SD_INQUIRY(un)->inq_serial, stp->sd_serial.value.c,
9144 	    sizeof (SD_INQUIRY(un)->inq_serial)) != 0)) {
9145 		stp->sd_softerrs.value.ui32 = 0;
9146 		stp->sd_harderrs.value.ui32 = 0;
9147 		stp->sd_transerrs.value.ui32 = 0;
9148 		stp->sd_rq_media_err.value.ui32 = 0;
9149 		stp->sd_rq_ntrdy_err.value.ui32 = 0;
9150 		stp->sd_rq_nodev_err.value.ui32 = 0;
9151 		stp->sd_rq_recov_err.value.ui32 = 0;
9152 		stp->sd_rq_illrq_err.value.ui32 = 0;
9153 		stp->sd_rq_pfa_err.value.ui32 = 0;
9154 	}
9155 
9156 	/*
9157 	 * Set the "Serial No" kstat for Sun qualified drives (indicated by
9158 	 * "SUN" in bytes 25-27 of the inquiry data (bytes 9-11 of the pid)
9159 	 * (4376302))
9160 	 */
9161 	if (bcmp(&SD_INQUIRY(un)->inq_pid[9], "SUN", 3) == 0) {
9162 		bcopy(&SD_INQUIRY(un)->inq_serial, stp->sd_serial.value.c,
9163 		    sizeof (SD_INQUIRY(un)->inq_serial));
9164 	} else {
9165 		/*
9166 		 * Set the "Serial No" kstat for non-Sun qualified drives
9167 		 */
9168 		if (ddi_prop_lookup_string(DDI_DEV_T_ANY, SD_DEVINFO(un),
9169 		    DDI_PROP_NOTPROM | DDI_PROP_DONTPASS,
9170 		    INQUIRY_SERIAL_NO, &sn) == DDI_SUCCESS) {
9171 			(void) strlcpy(stp->sd_serial.value.c, sn,
9172 			    sizeof (stp->sd_serial.value.c));
9173 			ddi_prop_free(sn);
9174 		}
9175 	}
9176 
9177 	if (un->un_f_blockcount_is_valid != TRUE) {
9178 		/*
9179 		 * Set capacity error stat to 0 for no media. This ensures
9180 		 * a valid capacity is displayed in response to 'iostat -E'
9181 		 * when no media is present in the device.
9182 		 */
9183 		stp->sd_capacity.value.ui64 = 0;
9184 	} else {
9185 		/*
9186 		 * Multiply un_blockcount by un->un_sys_blocksize to get
9187 		 * capacity.
9188 		 *
9189 		 * Note: for non-512 blocksize devices "un_blockcount" has been
9190 		 * "scaled" in sd_send_scsi_READ_CAPACITY by multiplying by
9191 		 * (un_tgt_blocksize / un->un_sys_blocksize).
9192 		 */
9193 		stp->sd_capacity.value.ui64 = (uint64_t)
9194 		    ((uint64_t)un->un_blockcount * un->un_sys_blocksize);
9195 	}
9196 }
9197 
9198 
9199 /*
9200  *    Function: sd_set_pstats
9201  *
9202  * Description: This routine instantiates and initializes the partition
9203  *              stats for each partition with more than zero blocks.
9204  *		(4363169)
9205  *
9206  *   Arguments: un - driver soft state (unit) structure
9207  *
9208  *     Context: Kernel thread context
9209  */
9210 
9211 static void
9212 sd_set_pstats(struct sd_lun *un)
9213 {
9214 	char	kstatname[KSTAT_STRLEN];
9215 	int	instance;
9216 	int	i;
9217 	diskaddr_t	nblks = 0;
9218 	char	*partname = NULL;
9219 
9220 	ASSERT(un != NULL);
9221 
9222 	instance = ddi_get_instance(SD_DEVINFO(un));
9223 
9224 	/* Note:x86: is this a VTOC8/VTOC16 difference? */
9225 	for (i = 0; i < NSDMAP; i++) {
9226 
9227 		if (cmlb_partinfo(un->un_cmlbhandle, i,
9228 		    &nblks, NULL, &partname, NULL, (void *)SD_PATH_DIRECT) != 0)
9229 			continue;
9230 		mutex_enter(SD_MUTEX(un));
9231 
9232 		if ((un->un_pstats[i] == NULL) &&
9233 		    (nblks != 0)) {
9234 
9235 			(void) snprintf(kstatname, sizeof (kstatname),
9236 			    "%s%d,%s", sd_label, instance,
9237 			    partname);
9238 
9239 			un->un_pstats[i] = kstat_create(sd_label,
9240 			    instance, kstatname, "partition", KSTAT_TYPE_IO,
9241 			    1, KSTAT_FLAG_PERSISTENT);
9242 			if (un->un_pstats[i] != NULL) {
9243 				un->un_pstats[i]->ks_lock = SD_MUTEX(un);
9244 				kstat_install(un->un_pstats[i]);
9245 			}
9246 		}
9247 		mutex_exit(SD_MUTEX(un));
9248 	}
9249 }
9250 
9251 
9252 #if (defined(__fibre))
9253 /*
9254  *    Function: sd_init_event_callbacks
9255  *
9256  * Description: This routine initializes the insertion and removal event
9257  *		callbacks. (fibre only)
9258  *
9259  *   Arguments: un - driver soft state (unit) structure
9260  *
9261  *     Context: Kernel thread context
9262  */
9263 
9264 static void
9265 sd_init_event_callbacks(struct sd_lun *un)
9266 {
9267 	ASSERT(un != NULL);
9268 
9269 	if ((un->un_insert_event == NULL) &&
9270 	    (ddi_get_eventcookie(SD_DEVINFO(un), FCAL_INSERT_EVENT,
9271 	    &un->un_insert_event) == DDI_SUCCESS)) {
9272 		/*
9273 		 * Add the callback for an insertion event
9274 		 */
9275 		(void) ddi_add_event_handler(SD_DEVINFO(un),
9276 		    un->un_insert_event, sd_event_callback, (void *)un,
9277 		    &(un->un_insert_cb_id));
9278 	}
9279 
9280 	if ((un->un_remove_event == NULL) &&
9281 	    (ddi_get_eventcookie(SD_DEVINFO(un), FCAL_REMOVE_EVENT,
9282 	    &un->un_remove_event) == DDI_SUCCESS)) {
9283 		/*
9284 		 * Add the callback for a removal event
9285 		 */
9286 		(void) ddi_add_event_handler(SD_DEVINFO(un),
9287 		    un->un_remove_event, sd_event_callback, (void *)un,
9288 		    &(un->un_remove_cb_id));
9289 	}
9290 }
9291 
9292 
9293 /*
9294  *    Function: sd_event_callback
9295  *
9296  * Description: This routine handles insert/remove events (photon). The
9297  *		state is changed to OFFLINE which can be used to supress
9298  *		error msgs. (fibre only)
9299  *
9300  *   Arguments: un - driver soft state (unit) structure
9301  *
9302  *     Context: Callout thread context
9303  */
9304 /* ARGSUSED */
9305 static void
9306 sd_event_callback(dev_info_t *dip, ddi_eventcookie_t event, void *arg,
9307     void *bus_impldata)
9308 {
9309 	struct sd_lun *un = (struct sd_lun *)arg;
9310 
9311 	_NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_insert_event));
9312 	if (event == un->un_insert_event) {
9313 		SD_TRACE(SD_LOG_COMMON, un, "sd_event_callback: insert event");
9314 		mutex_enter(SD_MUTEX(un));
9315 		if (un->un_state == SD_STATE_OFFLINE) {
9316 			if (un->un_last_state != SD_STATE_SUSPENDED) {
9317 				un->un_state = un->un_last_state;
9318 			} else {
9319 				/*
9320 				 * We have gone through SUSPEND/RESUME while
9321 				 * we were offline. Restore the last state
9322 				 */
9323 				un->un_state = un->un_save_state;
9324 			}
9325 		}
9326 		mutex_exit(SD_MUTEX(un));
9327 
9328 	_NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_remove_event));
9329 	} else if (event == un->un_remove_event) {
9330 		SD_TRACE(SD_LOG_COMMON, un, "sd_event_callback: remove event");
9331 		mutex_enter(SD_MUTEX(un));
9332 		/*
9333 		 * We need to handle an event callback that occurs during
9334 		 * the suspend operation, since we don't prevent it.
9335 		 */
9336 		if (un->un_state != SD_STATE_OFFLINE) {
9337 			if (un->un_state != SD_STATE_SUSPENDED) {
9338 				New_state(un, SD_STATE_OFFLINE);
9339 			} else {
9340 				un->un_last_state = SD_STATE_OFFLINE;
9341 			}
9342 		}
9343 		mutex_exit(SD_MUTEX(un));
9344 	} else {
9345 		scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE,
9346 		    "!Unknown event\n");
9347 	}
9348 
9349 }
9350 #endif
9351 
9352 /*
9353  * Values related to caching mode page depending on whether the unit is ATAPI.
9354  */
9355 #define	SDC_CDB_GROUP(un) ((un->un_f_cfg_is_atapi == TRUE) ? \
9356 	CDB_GROUP1 : CDB_GROUP0)
9357 #define	SDC_HDRLEN(un) ((un->un_f_cfg_is_atapi == TRUE) ? \
9358 	MODE_HEADER_LENGTH_GRP2 : MODE_HEADER_LENGTH)
9359 /*
9360  * Use mode_cache_scsi3 to ensure we get all of the mode sense data, otherwise
9361  * the mode select will fail (mode_cache_scsi3 is a superset of mode_caching).
9362  */
9363 #define	SDC_BUFLEN(un) (SDC_HDRLEN(un) + MODE_BLK_DESC_LENGTH + \
9364 	sizeof (struct mode_cache_scsi3))
9365 
9366 static int
9367 sd_get_caching_mode_page(sd_ssc_t *ssc, uchar_t page_control, uchar_t **header,
9368     int *bdlen)
9369 {
9370 	struct sd_lun	*un = ssc->ssc_un;
9371 	struct mode_caching *mode_caching_page;
9372 	size_t		buflen = SDC_BUFLEN(un);
9373 	int		hdrlen = SDC_HDRLEN(un);
9374 	int		rval;
9375 
9376 	/*
9377 	 * Do a test unit ready, otherwise a mode sense may not work if this
9378 	 * is the first command sent to the device after boot.
9379 	 */
9380 	if (sd_send_scsi_TEST_UNIT_READY(ssc, 0) != 0)
9381 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9382 
9383 	/*
9384 	 * Allocate memory for the retrieved mode page and its headers.  Set
9385 	 * a pointer to the page itself.
9386 	 */
9387 	*header = kmem_zalloc(buflen, KM_SLEEP);
9388 
9389 	/* Get the information from the device */
9390 	rval = sd_send_scsi_MODE_SENSE(ssc, SDC_CDB_GROUP(un), *header, buflen,
9391 	    page_control | MODEPAGE_CACHING, SD_PATH_DIRECT);
9392 	if (rval != 0) {
9393 		SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un, "%s: Mode Sense Failed\n",
9394 		    __func__);
9395 		goto mode_sense_failed;
9396 	}
9397 
9398 	/*
9399 	 * Determine size of Block Descriptors in order to locate
9400 	 * the mode page data. ATAPI devices return 0, SCSI devices
9401 	 * should return MODE_BLK_DESC_LENGTH.
9402 	 */
9403 	if (un->un_f_cfg_is_atapi == TRUE) {
9404 		struct mode_header_grp2 *mhp =
9405 		    (struct mode_header_grp2 *)(*header);
9406 		*bdlen = (mhp->bdesc_length_hi << 8) | mhp->bdesc_length_lo;
9407 	} else {
9408 		*bdlen = ((struct mode_header *)(*header))->bdesc_length;
9409 	}
9410 
9411 	if (*bdlen > MODE_BLK_DESC_LENGTH) {
9412 		sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, 0,
9413 		    "%s: Mode Sense returned invalid block descriptor length\n",
9414 		    __func__);
9415 		rval = EIO;
9416 		goto mode_sense_failed;
9417 	}
9418 
9419 	mode_caching_page = (struct mode_caching *)(*header + hdrlen + *bdlen);
9420 	if (mode_caching_page->mode_page.code != MODEPAGE_CACHING) {
9421 		sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, SD_LOG_COMMON,
9422 		    "%s: Mode Sense caching page code mismatch %d\n",
9423 		    __func__, mode_caching_page->mode_page.code);
9424 		rval = EIO;
9425 	}
9426 
9427 mode_sense_failed:
9428 	if (rval != 0) {
9429 		kmem_free(*header, buflen);
9430 		*header = NULL;
9431 		*bdlen = 0;
9432 	}
9433 	return (rval);
9434 }
9435 
9436 /*
9437  *    Function: sd_cache_control()
9438  *
9439  * Description: This routine is the driver entry point for setting
9440  *		read and write caching by modifying the WCE (write cache
9441  *		enable) and RCD (read cache disable) bits of mode
9442  *		page 8 (MODEPAGE_CACHING).
9443  *
9444  *   Arguments: ssc		- ssc contains pointer to driver soft state
9445  *				  (unit) structure for this target.
9446  *		rcd_flag	- flag for controlling the read cache
9447  *		wce_flag	- flag for controlling the write cache
9448  *
9449  * Return Code: EIO
9450  *		code returned by sd_send_scsi_MODE_SENSE and
9451  *		sd_send_scsi_MODE_SELECT
9452  *
9453  *     Context: Kernel Thread
9454  */
9455 
9456 static int
9457 sd_cache_control(sd_ssc_t *ssc, int rcd_flag, int wce_flag)
9458 {
9459 	struct sd_lun	*un = ssc->ssc_un;
9460 	struct mode_caching *mode_caching_page;
9461 	uchar_t		*header;
9462 	size_t		buflen = SDC_BUFLEN(un);
9463 	int		hdrlen = SDC_HDRLEN(un);
9464 	int		bdlen;
9465 	int		rval;
9466 
9467 	rval = sd_get_caching_mode_page(ssc, MODEPAGE_CURRENT, &header, &bdlen);
9468 	switch (rval) {
9469 	case 0:
9470 		/* Check the relevant bits on successful mode sense */
9471 		mode_caching_page = (struct mode_caching *)(header + hdrlen +
9472 		    bdlen);
9473 		if ((mode_caching_page->rcd && rcd_flag == SD_CACHE_ENABLE) ||
9474 		    (!mode_caching_page->rcd && rcd_flag == SD_CACHE_DISABLE) ||
9475 		    (mode_caching_page->wce && wce_flag == SD_CACHE_DISABLE) ||
9476 		    (!mode_caching_page->wce && wce_flag == SD_CACHE_ENABLE)) {
9477 			size_t sbuflen;
9478 			uchar_t save_pg;
9479 
9480 			/*
9481 			 * Construct select buffer length based on the
9482 			 * length of the sense data returned.
9483 			 */
9484 			sbuflen = hdrlen + bdlen + sizeof (struct mode_page) +
9485 			    (int)mode_caching_page->mode_page.length;
9486 
9487 			/* Set the caching bits as requested */
9488 			if (rcd_flag == SD_CACHE_ENABLE)
9489 				mode_caching_page->rcd = 0;
9490 			else if (rcd_flag == SD_CACHE_DISABLE)
9491 				mode_caching_page->rcd = 1;
9492 
9493 			if (wce_flag == SD_CACHE_ENABLE)
9494 				mode_caching_page->wce = 1;
9495 			else if (wce_flag == SD_CACHE_DISABLE)
9496 				mode_caching_page->wce = 0;
9497 
9498 			/*
9499 			 * Save the page if the mode sense says the
9500 			 * drive supports it.
9501 			 */
9502 			save_pg = mode_caching_page->mode_page.ps ?
9503 			    SD_SAVE_PAGE : SD_DONTSAVE_PAGE;
9504 
9505 			/* Clear reserved bits before mode select */
9506 			mode_caching_page->mode_page.ps = 0;
9507 
9508 			/*
9509 			 * Clear out mode header for mode select.
9510 			 * The rest of the retrieved page will be reused.
9511 			 */
9512 			bzero(header, hdrlen);
9513 
9514 			if (un->un_f_cfg_is_atapi == TRUE) {
9515 				struct mode_header_grp2 *mhp =
9516 				    (struct mode_header_grp2 *)header;
9517 				mhp->bdesc_length_hi = bdlen >> 8;
9518 				mhp->bdesc_length_lo = (uchar_t)bdlen & 0xff;
9519 			} else {
9520 				((struct mode_header *)header)->bdesc_length =
9521 				    bdlen;
9522 			}
9523 
9524 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9525 
9526 			/* Issue mode select to change the cache settings */
9527 			rval = sd_send_scsi_MODE_SELECT(ssc, SDC_CDB_GROUP(un),
9528 			    header, sbuflen, save_pg, SD_PATH_DIRECT);
9529 		}
9530 		kmem_free(header, buflen);
9531 		break;
9532 	case EIO:
9533 		sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
9534 		break;
9535 	default:
9536 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9537 		break;
9538 	}
9539 
9540 	return (rval);
9541 }
9542 
9543 
9544 /*
9545  *    Function: sd_get_write_cache_enabled()
9546  *
9547  * Description: This routine is the driver entry point for determining if write
9548  *		caching is enabled.  It examines the WCE (write cache enable)
9549  *		bits of mode page 8 (MODEPAGE_CACHING) with Page Control field
9550  *		bits set to MODEPAGE_CURRENT.
9551  *
9552  *   Arguments: ssc		- ssc contains pointer to driver soft state
9553  *				  (unit) structure for this target.
9554  *		is_enabled	- pointer to int where write cache enabled state
9555  *				  is returned (non-zero -> write cache enabled)
9556  *
9557  * Return Code: EIO
9558  *		code returned by sd_send_scsi_MODE_SENSE
9559  *
9560  *     Context: Kernel Thread
9561  *
9562  * NOTE: If ioctl is added to disable write cache, this sequence should
9563  * be followed so that no locking is required for accesses to
9564  * un->un_f_write_cache_enabled:
9565  * 	do mode select to clear wce
9566  * 	do synchronize cache to flush cache
9567  * 	set un->un_f_write_cache_enabled = FALSE
9568  *
9569  * Conversely, an ioctl to enable the write cache should be done
9570  * in this order:
9571  * 	set un->un_f_write_cache_enabled = TRUE
9572  * 	do mode select to set wce
9573  */
9574 
9575 static int
9576 sd_get_write_cache_enabled(sd_ssc_t *ssc, int *is_enabled)
9577 {
9578 	struct sd_lun	*un = ssc->ssc_un;
9579 	struct mode_caching *mode_caching_page;
9580 	uchar_t		*header;
9581 	size_t		buflen = SDC_BUFLEN(un);
9582 	int		hdrlen = SDC_HDRLEN(un);
9583 	int		bdlen;
9584 	int		rval;
9585 
9586 	/* In case of error, flag as enabled */
9587 	*is_enabled = TRUE;
9588 
9589 	rval = sd_get_caching_mode_page(ssc, MODEPAGE_CURRENT, &header, &bdlen);
9590 	switch (rval) {
9591 	case 0:
9592 		mode_caching_page = (struct mode_caching *)(header + hdrlen +
9593 		    bdlen);
9594 		*is_enabled = mode_caching_page->wce;
9595 		sd_ssc_assessment(ssc, SD_FMT_STANDARD);
9596 		kmem_free(header, buflen);
9597 		break;
9598 	case EIO: {
9599 		/*
9600 		 * Some disks do not support Mode Sense(6), we
9601 		 * should ignore this kind of error (sense key is
9602 		 * 0x5 - illegal request).
9603 		 */
9604 		uint8_t *sensep;
9605 		int senlen;
9606 
9607 		sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf;
9608 		senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen -
9609 		    ssc->ssc_uscsi_cmd->uscsi_rqresid);
9610 
9611 		if (senlen > 0 &&
9612 		    scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) {
9613 			sd_ssc_assessment(ssc, SD_FMT_IGNORE_COMPROMISE);
9614 		} else {
9615 			sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
9616 		}
9617 		break;
9618 	}
9619 	default:
9620 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9621 		break;
9622 	}
9623 
9624 	return (rval);
9625 }
9626 
9627 /*
9628  *    Function: sd_get_write_cache_changeable()
9629  *
9630  * Description: This routine is the driver entry point for determining if write
9631  *		caching is changeable.  It examines the WCE (write cache enable)
9632  *		bits of mode page 8 (MODEPAGE_CACHING) with Page Control field
9633  *		bits set to MODEPAGE_CHANGEABLE.
9634  *
9635  *   Arguments: ssc		- ssc contains pointer to driver soft state
9636  *				  (unit) structure for this target.
9637  *		is_changeable	- pointer to int where write cache changeable
9638  *				  state is returned (non-zero -> write cache
9639  *				  changeable)
9640  *
9641  *     Context: Kernel Thread
9642  */
9643 
9644 static void
9645 sd_get_write_cache_changeable(sd_ssc_t *ssc, int *is_changeable)
9646 {
9647 	struct sd_lun	*un = ssc->ssc_un;
9648 	struct mode_caching *mode_caching_page;
9649 	uchar_t		*header;
9650 	size_t		buflen = SDC_BUFLEN(un);
9651 	int		hdrlen = SDC_HDRLEN(un);
9652 	int		bdlen;
9653 	int		rval;
9654 
9655 	/* In case of error, flag as enabled */
9656 	*is_changeable = TRUE;
9657 
9658 	rval = sd_get_caching_mode_page(ssc, MODEPAGE_CHANGEABLE, &header,
9659 	    &bdlen);
9660 	switch (rval) {
9661 	case 0:
9662 		mode_caching_page = (struct mode_caching *)(header + hdrlen +
9663 		    bdlen);
9664 		*is_changeable = mode_caching_page->wce;
9665 		kmem_free(header, buflen);
9666 		sd_ssc_assessment(ssc, SD_FMT_STANDARD);
9667 		break;
9668 	case EIO:
9669 		sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
9670 		break;
9671 	default:
9672 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9673 		break;
9674 	}
9675 }
9676 
9677 /*
9678  *    Function: sd_get_nv_sup()
9679  *
9680  * Description: This routine is the driver entry point for
9681  * determining whether non-volatile cache is supported. This
9682  * determination process works as follows:
9683  *
9684  * 1. sd first queries sd.conf on whether
9685  * suppress_cache_flush bit is set for this device.
9686  *
9687  * 2. if not there, then queries the internal disk table.
9688  *
9689  * 3. if either sd.conf or internal disk table specifies
9690  * cache flush be suppressed, we don't bother checking
9691  * NV_SUP bit.
9692  *
9693  * If SUPPRESS_CACHE_FLUSH bit is not set to 1, sd queries
9694  * the optional INQUIRY VPD page 0x86. If the device
9695  * supports VPD page 0x86, sd examines the NV_SUP
9696  * (non-volatile cache support) bit in the INQUIRY VPD page
9697  * 0x86:
9698  *   o If NV_SUP bit is set, sd assumes the device has a
9699  *   non-volatile cache and set the
9700  *   un_f_sync_nv_supported to TRUE.
9701  *   o Otherwise cache is not non-volatile,
9702  *   un_f_sync_nv_supported is set to FALSE.
9703  *
9704  * Arguments: un - driver soft state (unit) structure
9705  *
9706  * Return Code:
9707  *
9708  *     Context: Kernel Thread
9709  */
9710 
9711 static void
9712 sd_get_nv_sup(sd_ssc_t *ssc)
9713 {
9714 	int		rval		= 0;
9715 	uchar_t		*inq86		= NULL;
9716 	size_t		inq86_len	= MAX_INQUIRY_SIZE;
9717 	size_t		inq86_resid	= 0;
9718 	struct		dk_callback *dkc;
9719 	struct sd_lun	*un;
9720 
9721 	ASSERT(ssc != NULL);
9722 	un = ssc->ssc_un;
9723 	ASSERT(un != NULL);
9724 
9725 	mutex_enter(SD_MUTEX(un));
9726 
9727 	/*
9728 	 * Be conservative on the device's support of
9729 	 * SYNC_NV bit: un_f_sync_nv_supported is
9730 	 * initialized to be false.
9731 	 */
9732 	un->un_f_sync_nv_supported = FALSE;
9733 
9734 	/*
9735 	 * If either sd.conf or internal disk table
9736 	 * specifies cache flush be suppressed, then
9737 	 * we don't bother checking NV_SUP bit.
9738 	 */
9739 	if (un->un_f_suppress_cache_flush == TRUE) {
9740 		mutex_exit(SD_MUTEX(un));
9741 		return;
9742 	}
9743 
9744 	if (sd_check_vpd_page_support(ssc) == 0 &&
9745 	    un->un_vpd_page_mask & SD_VPD_EXTENDED_DATA_PG) {
9746 		mutex_exit(SD_MUTEX(un));
9747 		/* collect page 86 data if available */
9748 		inq86 = kmem_zalloc(inq86_len, KM_SLEEP);
9749 
9750 		rval = sd_send_scsi_INQUIRY(ssc, inq86, inq86_len,
9751 		    0x01, 0x86, &inq86_resid);
9752 
9753 		if (rval == 0 && (inq86_len - inq86_resid > 6)) {
9754 			SD_TRACE(SD_LOG_COMMON, un,
9755 			    "sd_get_nv_sup: \
9756 			    successfully get VPD page: %x \
9757 			    PAGE LENGTH: %x BYTE 6: %x\n",
9758 			    inq86[1], inq86[3], inq86[6]);
9759 
9760 			mutex_enter(SD_MUTEX(un));
9761 			/*
9762 			 * check the value of NV_SUP bit: only if the device
9763 			 * reports NV_SUP bit to be 1, the
9764 			 * un_f_sync_nv_supported bit will be set to true.
9765 			 */
9766 			if (inq86[6] & SD_VPD_NV_SUP) {
9767 				un->un_f_sync_nv_supported = TRUE;
9768 			}
9769 			mutex_exit(SD_MUTEX(un));
9770 		} else if (rval != 0) {
9771 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9772 		}
9773 
9774 		kmem_free(inq86, inq86_len);
9775 	} else {
9776 		mutex_exit(SD_MUTEX(un));
9777 	}
9778 
9779 	/*
9780 	 * Send a SYNC CACHE command to check whether
9781 	 * SYNC_NV bit is supported. This command should have
9782 	 * un_f_sync_nv_supported set to correct value.
9783 	 */
9784 	mutex_enter(SD_MUTEX(un));
9785 	if (un->un_f_sync_nv_supported) {
9786 		mutex_exit(SD_MUTEX(un));
9787 		dkc = kmem_zalloc(sizeof (struct dk_callback), KM_SLEEP);
9788 		dkc->dkc_flag = FLUSH_VOLATILE;
9789 		(void) sd_send_scsi_SYNCHRONIZE_CACHE(un, dkc);
9790 
9791 		/*
9792 		 * Send a TEST UNIT READY command to the device. This should
9793 		 * clear any outstanding UNIT ATTENTION that may be present.
9794 		 */
9795 		rval = sd_send_scsi_TEST_UNIT_READY(ssc, SD_DONT_RETRY_TUR);
9796 		if (rval != 0)
9797 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
9798 
9799 		kmem_free(dkc, sizeof (struct dk_callback));
9800 	} else {
9801 		mutex_exit(SD_MUTEX(un));
9802 	}
9803 
9804 	SD_TRACE(SD_LOG_COMMON, un, "sd_get_nv_sup: \
9805 	    un_f_suppress_cache_flush is set to %d\n",
9806 	    un->un_f_suppress_cache_flush);
9807 }
9808 
9809 /*
9810  *    Function: sd_make_device
9811  *
9812  * Description: Utility routine to return the Solaris device number from
9813  *		the data in the device's dev_info structure.
9814  *
9815  * Return Code: The Solaris device number
9816  *
9817  *     Context: Any
9818  */
9819 
9820 static dev_t
9821 sd_make_device(dev_info_t *devi)
9822 {
9823 	return (makedevice(ddi_driver_major(devi),
9824 	    ddi_get_instance(devi) << SDUNIT_SHIFT));
9825 }
9826 
9827 
9828 /*
9829  *    Function: sd_pm_entry
9830  *
9831  * Description: Called at the start of a new command to manage power
9832  *		and busy status of a device. This includes determining whether
9833  *		the current power state of the device is sufficient for
9834  *		performing the command or whether it must be changed.
9835  *		The PM framework is notified appropriately.
9836  *		Only with a return status of DDI_SUCCESS will the
9837  *		component be busy to the framework.
9838  *
9839  *		All callers of sd_pm_entry must check the return status
9840  *		and only call sd_pm_exit it it was DDI_SUCCESS. A status
9841  *		of DDI_FAILURE indicates the device failed to power up.
9842  *		In this case un_pm_count has been adjusted so the result
9843  *		on exit is still powered down, ie. count is less than 0.
9844  *		Calling sd_pm_exit with this count value hits an ASSERT.
9845  *
9846  * Return Code: DDI_SUCCESS or DDI_FAILURE
9847  *
9848  *     Context: Kernel thread context.
9849  */
9850 
9851 static int
9852 sd_pm_entry(struct sd_lun *un)
9853 {
9854 	int return_status = DDI_SUCCESS;
9855 
9856 	ASSERT(!mutex_owned(SD_MUTEX(un)));
9857 	ASSERT(!mutex_owned(&un->un_pm_mutex));
9858 
9859 	SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_entry: entry\n");
9860 
9861 	if (un->un_f_pm_is_enabled == FALSE) {
9862 		SD_TRACE(SD_LOG_IO_PM, un,
9863 		    "sd_pm_entry: exiting, PM not enabled\n");
9864 		return (return_status);
9865 	}
9866 
9867 	/*
9868 	 * Just increment a counter if PM is enabled. On the transition from
9869 	 * 0 ==> 1, mark the device as busy.  The iodone side will decrement
9870 	 * the count with each IO and mark the device as idle when the count
9871 	 * hits 0.
9872 	 *
9873 	 * If the count is less than 0 the device is powered down. If a powered
9874 	 * down device is successfully powered up then the count must be
9875 	 * incremented to reflect the power up. Note that it'll get incremented
9876 	 * a second time to become busy.
9877 	 *
9878 	 * Because the following has the potential to change the device state
9879 	 * and must release the un_pm_mutex to do so, only one thread can be
9880 	 * allowed through at a time.
9881 	 */
9882 
9883 	mutex_enter(&un->un_pm_mutex);
9884 	while (un->un_pm_busy == TRUE) {
9885 		cv_wait(&un->un_pm_busy_cv, &un->un_pm_mutex);
9886 	}
9887 	un->un_pm_busy = TRUE;
9888 
9889 	if (un->un_pm_count < 1) {
9890 
9891 		SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_entry: busy component\n");
9892 
9893 		/*
9894 		 * Indicate we are now busy so the framework won't attempt to
9895 		 * power down the device. This call will only fail if either
9896 		 * we passed a bad component number or the device has no
9897 		 * components. Neither of these should ever happen.
9898 		 */
9899 		mutex_exit(&un->un_pm_mutex);
9900 		return_status = pm_busy_component(SD_DEVINFO(un), 0);
9901 		ASSERT(return_status == DDI_SUCCESS);
9902 
9903 		mutex_enter(&un->un_pm_mutex);
9904 
9905 		if (un->un_pm_count < 0) {
9906 			mutex_exit(&un->un_pm_mutex);
9907 
9908 			SD_TRACE(SD_LOG_IO_PM, un,
9909 			    "sd_pm_entry: power up component\n");
9910 
9911 			/*
9912 			 * pm_raise_power will cause sdpower to be called
9913 			 * which brings the device power level to the
9914 			 * desired state, If successful, un_pm_count and
9915 			 * un_power_level will be updated appropriately.
9916 			 */
9917 			return_status = pm_raise_power(SD_DEVINFO(un), 0,
9918 			    SD_PM_STATE_ACTIVE(un));
9919 
9920 			mutex_enter(&un->un_pm_mutex);
9921 
9922 			if (return_status != DDI_SUCCESS) {
9923 				/*
9924 				 * Power up failed.
9925 				 * Idle the device and adjust the count
9926 				 * so the result on exit is that we're
9927 				 * still powered down, ie. count is less than 0.
9928 				 */
9929 				SD_TRACE(SD_LOG_IO_PM, un,
9930 				    "sd_pm_entry: power up failed,"
9931 				    " idle the component\n");
9932 
9933 				(void) pm_idle_component(SD_DEVINFO(un), 0);
9934 				un->un_pm_count--;
9935 			} else {
9936 				/*
9937 				 * Device is powered up, verify the
9938 				 * count is non-negative.
9939 				 * This is debug only.
9940 				 */
9941 				ASSERT(un->un_pm_count == 0);
9942 			}
9943 		}
9944 
9945 		if (return_status == DDI_SUCCESS) {
9946 			/*
9947 			 * For performance, now that the device has been tagged
9948 			 * as busy, and it's known to be powered up, update the
9949 			 * chain types to use jump tables that do not include
9950 			 * pm. This significantly lowers the overhead and
9951 			 * therefore improves performance.
9952 			 */
9953 
9954 			mutex_exit(&un->un_pm_mutex);
9955 			mutex_enter(SD_MUTEX(un));
9956 			SD_TRACE(SD_LOG_IO_PM, un,
9957 			    "sd_pm_entry: changing uscsi_chain_type from %d\n",
9958 			    un->un_uscsi_chain_type);
9959 
9960 			if (un->un_f_non_devbsize_supported) {
9961 				un->un_buf_chain_type =
9962 				    SD_CHAIN_INFO_RMMEDIA_NO_PM;
9963 			} else {
9964 				un->un_buf_chain_type =
9965 				    SD_CHAIN_INFO_DISK_NO_PM;
9966 			}
9967 			un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD_NO_PM;
9968 
9969 			SD_TRACE(SD_LOG_IO_PM, un,
9970 			    "             changed  uscsi_chain_type to   %d\n",
9971 			    un->un_uscsi_chain_type);
9972 			mutex_exit(SD_MUTEX(un));
9973 			mutex_enter(&un->un_pm_mutex);
9974 
9975 			if (un->un_pm_idle_timeid == NULL) {
9976 				/* 300 ms. */
9977 				un->un_pm_idle_timeid =
9978 				    timeout(sd_pm_idletimeout_handler, un,
9979 				    (drv_usectohz((clock_t)300000)));
9980 				/*
9981 				 * Include an extra call to busy which keeps the
9982 				 * device busy with-respect-to the PM layer
9983 				 * until the timer fires, at which time it'll
9984 				 * get the extra idle call.
9985 				 */
9986 				(void) pm_busy_component(SD_DEVINFO(un), 0);
9987 			}
9988 		}
9989 	}
9990 	un->un_pm_busy = FALSE;
9991 	/* Next... */
9992 	cv_signal(&un->un_pm_busy_cv);
9993 
9994 	un->un_pm_count++;
9995 
9996 	SD_TRACE(SD_LOG_IO_PM, un,
9997 	    "sd_pm_entry: exiting, un_pm_count = %d\n", un->un_pm_count);
9998 
9999 	mutex_exit(&un->un_pm_mutex);
10000 
10001 	return (return_status);
10002 }
10003 
10004 
10005 /*
10006  *    Function: sd_pm_exit
10007  *
10008  * Description: Called at the completion of a command to manage busy
10009  *		status for the device. If the device becomes idle the
10010  *		PM framework is notified.
10011  *
10012  *     Context: Kernel thread context
10013  */
10014 
10015 static void
10016 sd_pm_exit(struct sd_lun *un)
10017 {
10018 	ASSERT(!mutex_owned(SD_MUTEX(un)));
10019 	ASSERT(!mutex_owned(&un->un_pm_mutex));
10020 
10021 	SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_exit: entry\n");
10022 
10023 	/*
10024 	 * After attach the following flag is only read, so don't
10025 	 * take the penalty of acquiring a mutex for it.
10026 	 */
10027 	if (un->un_f_pm_is_enabled == TRUE) {
10028 
10029 		mutex_enter(&un->un_pm_mutex);
10030 		un->un_pm_count--;
10031 
10032 		SD_TRACE(SD_LOG_IO_PM, un,
10033 		    "sd_pm_exit: un_pm_count = %d\n", un->un_pm_count);
10034 
10035 		ASSERT(un->un_pm_count >= 0);
10036 		if (un->un_pm_count == 0) {
10037 			mutex_exit(&un->un_pm_mutex);
10038 
10039 			SD_TRACE(SD_LOG_IO_PM, un,
10040 			    "sd_pm_exit: idle component\n");
10041 
10042 			(void) pm_idle_component(SD_DEVINFO(un), 0);
10043 
10044 		} else {
10045 			mutex_exit(&un->un_pm_mutex);
10046 		}
10047 	}
10048 
10049 	SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_exit: exiting\n");
10050 }
10051 
10052 
10053 /*
10054  *    Function: sdopen
10055  *
10056  * Description: Driver's open(9e) entry point function.
10057  *
10058  *   Arguments: dev_i   - pointer to device number
10059  *		flag    - how to open file (FEXCL, FNDELAY, FREAD, FWRITE)
10060  *		otyp    - open type (OTYP_BLK, OTYP_CHR, OTYP_LYR)
10061  *		cred_p  - user credential pointer
10062  *
10063  * Return Code: EINVAL
10064  *		ENXIO
10065  *		EIO
10066  *		EROFS
10067  *		EBUSY
10068  *
10069  *     Context: Kernel thread context
10070  */
10071 /* ARGSUSED */
10072 static int
10073 sdopen(dev_t *dev_p, int flag, int otyp, cred_t *cred_p)
10074 {
10075 	struct sd_lun	*un;
10076 	int		nodelay;
10077 	int		part;
10078 	uint64_t	partmask;
10079 	int		instance;
10080 	dev_t		dev;
10081 	int		rval = EIO;
10082 	diskaddr_t	nblks = 0;
10083 	diskaddr_t	label_cap;
10084 
10085 	/* Validate the open type */
10086 	if (otyp >= OTYPCNT) {
10087 		return (EINVAL);
10088 	}
10089 
10090 	dev = *dev_p;
10091 	instance = SDUNIT(dev);
10092 	mutex_enter(&sd_detach_mutex);
10093 
10094 	/*
10095 	 * Fail the open if there is no softstate for the instance, or
10096 	 * if another thread somewhere is trying to detach the instance.
10097 	 */
10098 	if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) ||
10099 	    (un->un_detach_count != 0)) {
10100 		mutex_exit(&sd_detach_mutex);
10101 		/*
10102 		 * The probe cache only needs to be cleared when open (9e) fails
10103 		 * with ENXIO (4238046).
10104 		 */
10105 		/*
10106 		 * un-conditionally clearing probe cache is ok with
10107 		 * separate sd/ssd binaries
10108 		 * x86 platform can be an issue with both parallel
10109 		 * and fibre in 1 binary
10110 		 */
10111 		sd_scsi_clear_probe_cache();
10112 		return (ENXIO);
10113 	}
10114 
10115 	/*
10116 	 * The un_layer_count is to prevent another thread in specfs from
10117 	 * trying to detach the instance, which can happen when we are
10118 	 * called from a higher-layer driver instead of thru specfs.
10119 	 * This will not be needed when DDI provides a layered driver
10120 	 * interface that allows specfs to know that an instance is in
10121 	 * use by a layered driver & should not be detached.
10122 	 *
10123 	 * Note: the semantics for layered driver opens are exactly one
10124 	 * close for every open.
10125 	 */
10126 	if (otyp == OTYP_LYR) {
10127 		un->un_layer_count++;
10128 	}
10129 
10130 	/*
10131 	 * Keep a count of the current # of opens in progress. This is because
10132 	 * some layered drivers try to call us as a regular open. This can
10133 	 * cause problems that we cannot prevent, however by keeping this count
10134 	 * we can at least keep our open and detach routines from racing against
10135 	 * each other under such conditions.
10136 	 */
10137 	un->un_opens_in_progress++;
10138 	mutex_exit(&sd_detach_mutex);
10139 
10140 	nodelay  = (flag & (FNDELAY | FNONBLOCK));
10141 	part	 = SDPART(dev);
10142 	partmask = 1 << part;
10143 
10144 	/*
10145 	 * We use a semaphore here in order to serialize
10146 	 * open and close requests on the device.
10147 	 */
10148 	sema_p(&un->un_semoclose);
10149 
10150 	mutex_enter(SD_MUTEX(un));
10151 
10152 	/*
10153 	 * All device accesses go thru sdstrategy() where we check
10154 	 * on suspend status but there could be a scsi_poll command,
10155 	 * which bypasses sdstrategy(), so we need to check pm
10156 	 * status.
10157 	 */
10158 
10159 	if (!nodelay) {
10160 		while ((un->un_state == SD_STATE_SUSPENDED) ||
10161 		    (un->un_state == SD_STATE_PM_CHANGING)) {
10162 			cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
10163 		}
10164 
10165 		mutex_exit(SD_MUTEX(un));
10166 		if (sd_pm_entry(un) != DDI_SUCCESS) {
10167 			rval = EIO;
10168 			SD_ERROR(SD_LOG_OPEN_CLOSE, un,
10169 			    "sdopen: sd_pm_entry failed\n");
10170 			goto open_failed_with_pm;
10171 		}
10172 		mutex_enter(SD_MUTEX(un));
10173 	}
10174 
10175 	/* check for previous exclusive open */
10176 	SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: un=%p\n", (void *)un);
10177 	SD_TRACE(SD_LOG_OPEN_CLOSE, un,
10178 	    "sdopen: exclopen=%x, flag=%x, regopen=%x\n",
10179 	    un->un_exclopen, flag, un->un_ocmap.regopen[otyp]);
10180 
10181 	if (un->un_exclopen & (partmask)) {
10182 		goto excl_open_fail;
10183 	}
10184 
10185 	if (flag & FEXCL) {
10186 		int i;
10187 		if (un->un_ocmap.lyropen[part]) {
10188 			goto excl_open_fail;
10189 		}
10190 		for (i = 0; i < (OTYPCNT - 1); i++) {
10191 			if (un->un_ocmap.regopen[i] & (partmask)) {
10192 				goto excl_open_fail;
10193 			}
10194 		}
10195 	}
10196 
10197 	/*
10198 	 * Check the write permission if this is a removable media device,
10199 	 * NDELAY has not been set, and writable permission is requested.
10200 	 *
10201 	 * Note: If NDELAY was set and this is write-protected media the WRITE
10202 	 * attempt will fail with EIO as part of the I/O processing. This is a
10203 	 * more permissive implementation that allows the open to succeed and
10204 	 * WRITE attempts to fail when appropriate.
10205 	 */
10206 	if (un->un_f_chk_wp_open) {
10207 		if ((flag & FWRITE) && (!nodelay)) {
10208 			mutex_exit(SD_MUTEX(un));
10209 			/*
10210 			 * Defer the check for write permission on writable
10211 			 * DVD drive till sdstrategy and will not fail open even
10212 			 * if FWRITE is set as the device can be writable
10213 			 * depending upon the media and the media can change
10214 			 * after the call to open().
10215 			 */
10216 			if (un->un_f_dvdram_writable_device == FALSE) {
10217 				if (ISCD(un) || sr_check_wp(dev)) {
10218 				rval = EROFS;
10219 				mutex_enter(SD_MUTEX(un));
10220 				SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: "
10221 				    "write to cd or write protected media\n");
10222 				goto open_fail;
10223 				}
10224 			}
10225 			mutex_enter(SD_MUTEX(un));
10226 		}
10227 	}
10228 
10229 	/*
10230 	 * If opening in NDELAY/NONBLOCK mode, just return.
10231 	 * Check if disk is ready and has a valid geometry later.
10232 	 */
10233 	if (!nodelay) {
10234 		sd_ssc_t	*ssc;
10235 
10236 		mutex_exit(SD_MUTEX(un));
10237 		ssc = sd_ssc_init(un);
10238 		rval = sd_ready_and_valid(ssc, part);
10239 		sd_ssc_fini(ssc);
10240 		mutex_enter(SD_MUTEX(un));
10241 		/*
10242 		 * Fail if device is not ready or if the number of disk
10243 		 * blocks is zero or negative for non CD devices.
10244 		 */
10245 
10246 		nblks = 0;
10247 
10248 		if (rval == SD_READY_VALID && (!ISCD(un))) {
10249 			/* if cmlb_partinfo fails, nblks remains 0 */
10250 			mutex_exit(SD_MUTEX(un));
10251 			(void) cmlb_partinfo(un->un_cmlbhandle, part, &nblks,
10252 			    NULL, NULL, NULL, (void *)SD_PATH_DIRECT);
10253 			mutex_enter(SD_MUTEX(un));
10254 		}
10255 
10256 		if ((rval != SD_READY_VALID) ||
10257 		    (!ISCD(un) && nblks <= 0)) {
10258 			rval = un->un_f_has_removable_media ? ENXIO : EIO;
10259 			SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: "
10260 			    "device not ready or invalid disk block value\n");
10261 			goto open_fail;
10262 		}
10263 #if defined(__i386) || defined(__amd64)
10264 	} else {
10265 		uchar_t *cp;
10266 		/*
10267 		 * x86 requires special nodelay handling, so that p0 is
10268 		 * always defined and accessible.
10269 		 * Invalidate geometry only if device is not already open.
10270 		 */
10271 		cp = &un->un_ocmap.chkd[0];
10272 		while (cp < &un->un_ocmap.chkd[OCSIZE]) {
10273 			if (*cp != (uchar_t)0) {
10274 				break;
10275 			}
10276 			cp++;
10277 		}
10278 		if (cp == &un->un_ocmap.chkd[OCSIZE]) {
10279 			mutex_exit(SD_MUTEX(un));
10280 			cmlb_invalidate(un->un_cmlbhandle,
10281 			    (void *)SD_PATH_DIRECT);
10282 			mutex_enter(SD_MUTEX(un));
10283 		}
10284 
10285 #endif
10286 	}
10287 
10288 	if (otyp == OTYP_LYR) {
10289 		un->un_ocmap.lyropen[part]++;
10290 	} else {
10291 		un->un_ocmap.regopen[otyp] |= partmask;
10292 	}
10293 
10294 	/* Set up open and exclusive open flags */
10295 	if (flag & FEXCL) {
10296 		un->un_exclopen |= (partmask);
10297 	}
10298 
10299 	/*
10300 	 * If the lun is EFI labeled and lun capacity is greater than the
10301 	 * capacity contained in the label, log a sys-event to notify the
10302 	 * interested module.
10303 	 * To avoid an infinite loop of logging sys-event, we only log the
10304 	 * event when the lun is not opened in NDELAY mode. The event handler
10305 	 * should open the lun in NDELAY mode.
10306 	 */
10307 	if (!nodelay) {
10308 		mutex_exit(SD_MUTEX(un));
10309 		if (cmlb_efi_label_capacity(un->un_cmlbhandle, &label_cap,
10310 		    (void*)SD_PATH_DIRECT) == 0) {
10311 			mutex_enter(SD_MUTEX(un));
10312 			if (un->un_f_blockcount_is_valid &&
10313 			    un->un_blockcount > label_cap &&
10314 			    un->un_f_expnevent == B_FALSE) {
10315 				un->un_f_expnevent = B_TRUE;
10316 				mutex_exit(SD_MUTEX(un));
10317 				sd_log_lun_expansion_event(un,
10318 				    (nodelay ? KM_NOSLEEP : KM_SLEEP));
10319 				mutex_enter(SD_MUTEX(un));
10320 			}
10321 		} else {
10322 			mutex_enter(SD_MUTEX(un));
10323 		}
10324 	}
10325 
10326 	SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: "
10327 	    "open of part %d type %d\n", part, otyp);
10328 
10329 	mutex_exit(SD_MUTEX(un));
10330 	if (!nodelay) {
10331 		sd_pm_exit(un);
10332 	}
10333 
10334 	sema_v(&un->un_semoclose);
10335 
10336 	mutex_enter(&sd_detach_mutex);
10337 	un->un_opens_in_progress--;
10338 	mutex_exit(&sd_detach_mutex);
10339 
10340 	SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: exit success\n");
10341 	return (DDI_SUCCESS);
10342 
10343 excl_open_fail:
10344 	SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: fail exclusive open\n");
10345 	rval = EBUSY;
10346 
10347 open_fail:
10348 	mutex_exit(SD_MUTEX(un));
10349 
10350 	/*
10351 	 * On a failed open we must exit the pm management.
10352 	 */
10353 	if (!nodelay) {
10354 		sd_pm_exit(un);
10355 	}
10356 open_failed_with_pm:
10357 	sema_v(&un->un_semoclose);
10358 
10359 	mutex_enter(&sd_detach_mutex);
10360 	un->un_opens_in_progress--;
10361 	if (otyp == OTYP_LYR) {
10362 		un->un_layer_count--;
10363 	}
10364 	mutex_exit(&sd_detach_mutex);
10365 
10366 	return (rval);
10367 }
10368 
10369 
10370 /*
10371  *    Function: sdclose
10372  *
10373  * Description: Driver's close(9e) entry point function.
10374  *
10375  *   Arguments: dev    - device number
10376  *		flag   - file status flag, informational only
10377  *		otyp   - close type (OTYP_BLK, OTYP_CHR, OTYP_LYR)
10378  *		cred_p - user credential pointer
10379  *
10380  * Return Code: ENXIO
10381  *
10382  *     Context: Kernel thread context
10383  */
10384 /* ARGSUSED */
10385 static int
10386 sdclose(dev_t dev, int flag, int otyp, cred_t *cred_p)
10387 {
10388 	struct sd_lun	*un;
10389 	uchar_t		*cp;
10390 	int		part;
10391 	int		nodelay;
10392 	int		rval = 0;
10393 
10394 	/* Validate the open type */
10395 	if (otyp >= OTYPCNT) {
10396 		return (ENXIO);
10397 	}
10398 
10399 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
10400 		return (ENXIO);
10401 	}
10402 
10403 	part = SDPART(dev);
10404 	nodelay = flag & (FNDELAY | FNONBLOCK);
10405 
10406 	SD_TRACE(SD_LOG_OPEN_CLOSE, un,
10407 	    "sdclose: close of part %d type %d\n", part, otyp);
10408 
10409 	/*
10410 	 * We use a semaphore here in order to serialize
10411 	 * open and close requests on the device.
10412 	 */
10413 	sema_p(&un->un_semoclose);
10414 
10415 	mutex_enter(SD_MUTEX(un));
10416 
10417 	/* Don't proceed if power is being changed. */
10418 	while (un->un_state == SD_STATE_PM_CHANGING) {
10419 		cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
10420 	}
10421 
10422 	if (un->un_exclopen & (1 << part)) {
10423 		un->un_exclopen &= ~(1 << part);
10424 	}
10425 
10426 	/* Update the open partition map */
10427 	if (otyp == OTYP_LYR) {
10428 		un->un_ocmap.lyropen[part] -= 1;
10429 	} else {
10430 		un->un_ocmap.regopen[otyp] &= ~(1 << part);
10431 	}
10432 
10433 	cp = &un->un_ocmap.chkd[0];
10434 	while (cp < &un->un_ocmap.chkd[OCSIZE]) {
10435 		if (*cp != NULL) {
10436 			break;
10437 		}
10438 		cp++;
10439 	}
10440 
10441 	if (cp == &un->un_ocmap.chkd[OCSIZE]) {
10442 		SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdclose: last close\n");
10443 
10444 		/*
10445 		 * We avoid persistance upon the last close, and set
10446 		 * the throttle back to the maximum.
10447 		 */
10448 		un->un_throttle = un->un_saved_throttle;
10449 
10450 		if (un->un_state == SD_STATE_OFFLINE) {
10451 			if (un->un_f_is_fibre == FALSE) {
10452 				scsi_log(SD_DEVINFO(un), sd_label,
10453 				    CE_WARN, "offline\n");
10454 			}
10455 			mutex_exit(SD_MUTEX(un));
10456 			cmlb_invalidate(un->un_cmlbhandle,
10457 			    (void *)SD_PATH_DIRECT);
10458 			mutex_enter(SD_MUTEX(un));
10459 
10460 		} else {
10461 			/*
10462 			 * Flush any outstanding writes in NVRAM cache.
10463 			 * Note: SYNCHRONIZE CACHE is an optional SCSI-2
10464 			 * cmd, it may not work for non-Pluto devices.
10465 			 * SYNCHRONIZE CACHE is not required for removables,
10466 			 * except DVD-RAM drives.
10467 			 *
10468 			 * Also note: because SYNCHRONIZE CACHE is currently
10469 			 * the only command issued here that requires the
10470 			 * drive be powered up, only do the power up before
10471 			 * sending the Sync Cache command. If additional
10472 			 * commands are added which require a powered up
10473 			 * drive, the following sequence may have to change.
10474 			 *
10475 			 * And finally, note that parallel SCSI on SPARC
10476 			 * only issues a Sync Cache to DVD-RAM, a newly
10477 			 * supported device.
10478 			 */
10479 #if defined(__i386) || defined(__amd64)
10480 			if ((un->un_f_sync_cache_supported &&
10481 			    un->un_f_sync_cache_required) ||
10482 			    un->un_f_dvdram_writable_device == TRUE) {
10483 #else
10484 			if (un->un_f_dvdram_writable_device == TRUE) {
10485 #endif
10486 				mutex_exit(SD_MUTEX(un));
10487 				if (sd_pm_entry(un) == DDI_SUCCESS) {
10488 					rval =
10489 					    sd_send_scsi_SYNCHRONIZE_CACHE(un,
10490 					    NULL);
10491 					/* ignore error if not supported */
10492 					if (rval == ENOTSUP) {
10493 						rval = 0;
10494 					} else if (rval != 0) {
10495 						rval = EIO;
10496 					}
10497 					sd_pm_exit(un);
10498 				} else {
10499 					rval = EIO;
10500 				}
10501 				mutex_enter(SD_MUTEX(un));
10502 			}
10503 
10504 			/*
10505 			 * For devices which supports DOOR_LOCK, send an ALLOW
10506 			 * MEDIA REMOVAL command, but don't get upset if it
10507 			 * fails. We need to raise the power of the drive before
10508 			 * we can call sd_send_scsi_DOORLOCK()
10509 			 */
10510 			if (un->un_f_doorlock_supported) {
10511 				mutex_exit(SD_MUTEX(un));
10512 				if (sd_pm_entry(un) == DDI_SUCCESS) {
10513 					sd_ssc_t	*ssc;
10514 
10515 					ssc = sd_ssc_init(un);
10516 					rval = sd_send_scsi_DOORLOCK(ssc,
10517 					    SD_REMOVAL_ALLOW, SD_PATH_DIRECT);
10518 					if (rval != 0)
10519 						sd_ssc_assessment(ssc,
10520 						    SD_FMT_IGNORE);
10521 					sd_ssc_fini(ssc);
10522 
10523 					sd_pm_exit(un);
10524 					if (ISCD(un) && (rval != 0) &&
10525 					    (nodelay != 0)) {
10526 						rval = ENXIO;
10527 					}
10528 				} else {
10529 					rval = EIO;
10530 				}
10531 				mutex_enter(SD_MUTEX(un));
10532 			}
10533 
10534 			/*
10535 			 * If a device has removable media, invalidate all
10536 			 * parameters related to media, such as geometry,
10537 			 * blocksize, and blockcount.
10538 			 */
10539 			if (un->un_f_has_removable_media) {
10540 				sr_ejected(un);
10541 			}
10542 
10543 			/*
10544 			 * Destroy the cache (if it exists) which was
10545 			 * allocated for the write maps since this is
10546 			 * the last close for this media.
10547 			 */
10548 			if (un->un_wm_cache) {
10549 				/*
10550 				 * Check if there are pending commands.
10551 				 * and if there are give a warning and
10552 				 * do not destroy the cache.
10553 				 */
10554 				if (un->un_ncmds_in_driver > 0) {
10555 					scsi_log(SD_DEVINFO(un),
10556 					    sd_label, CE_WARN,
10557 					    "Unable to clean up memory "
10558 					    "because of pending I/O\n");
10559 				} else {
10560 					kmem_cache_destroy(
10561 					    un->un_wm_cache);
10562 					un->un_wm_cache = NULL;
10563 				}
10564 			}
10565 		}
10566 	}
10567 
10568 	mutex_exit(SD_MUTEX(un));
10569 	sema_v(&un->un_semoclose);
10570 
10571 	if (otyp == OTYP_LYR) {
10572 		mutex_enter(&sd_detach_mutex);
10573 		/*
10574 		 * The detach routine may run when the layer count
10575 		 * drops to zero.
10576 		 */
10577 		un->un_layer_count--;
10578 		mutex_exit(&sd_detach_mutex);
10579 	}
10580 
10581 	return (rval);
10582 }
10583 
10584 
10585 /*
10586  *    Function: sd_ready_and_valid
10587  *
10588  * Description: Test if device is ready and has a valid geometry.
10589  *
10590  *   Arguments: ssc - sd_ssc_t will contain un
10591  *		un  - driver soft state (unit) structure
10592  *
10593  * Return Code: SD_READY_VALID		ready and valid label
10594  *		SD_NOT_READY_VALID	not ready, no label
10595  *		SD_RESERVED_BY_OTHERS	reservation conflict
10596  *
10597  *     Context: Never called at interrupt context.
10598  */
10599 
10600 static int
10601 sd_ready_and_valid(sd_ssc_t *ssc, int part)
10602 {
10603 	struct sd_errstats	*stp;
10604 	uint64_t		capacity;
10605 	uint_t			lbasize;
10606 	int			rval = SD_READY_VALID;
10607 	char			name_str[48];
10608 	boolean_t		is_valid;
10609 	struct sd_lun		*un;
10610 	int			status;
10611 
10612 	ASSERT(ssc != NULL);
10613 	un = ssc->ssc_un;
10614 	ASSERT(un != NULL);
10615 	ASSERT(!mutex_owned(SD_MUTEX(un)));
10616 
10617 	mutex_enter(SD_MUTEX(un));
10618 	/*
10619 	 * If a device has removable media, we must check if media is
10620 	 * ready when checking if this device is ready and valid.
10621 	 */
10622 	if (un->un_f_has_removable_media) {
10623 		mutex_exit(SD_MUTEX(un));
10624 		status = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
10625 
10626 		if (status != 0) {
10627 			rval = SD_NOT_READY_VALID;
10628 			mutex_enter(SD_MUTEX(un));
10629 
10630 			/* Ignore all failed status for removalbe media */
10631 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
10632 
10633 			goto done;
10634 		}
10635 
10636 		is_valid = SD_IS_VALID_LABEL(un);
10637 		mutex_enter(SD_MUTEX(un));
10638 		if (!is_valid ||
10639 		    (un->un_f_blockcount_is_valid == FALSE) ||
10640 		    (un->un_f_tgt_blocksize_is_valid == FALSE)) {
10641 
10642 			/* capacity has to be read every open. */
10643 			mutex_exit(SD_MUTEX(un));
10644 			status = sd_send_scsi_READ_CAPACITY(ssc, &capacity,
10645 			    &lbasize, SD_PATH_DIRECT);
10646 
10647 			if (status != 0) {
10648 				sd_ssc_assessment(ssc, SD_FMT_IGNORE);
10649 
10650 				cmlb_invalidate(un->un_cmlbhandle,
10651 				    (void *)SD_PATH_DIRECT);
10652 				mutex_enter(SD_MUTEX(un));
10653 				rval = SD_NOT_READY_VALID;
10654 
10655 				goto done;
10656 			} else {
10657 				mutex_enter(SD_MUTEX(un));
10658 				sd_update_block_info(un, lbasize, capacity);
10659 			}
10660 		}
10661 
10662 		/*
10663 		 * Check if the media in the device is writable or not.
10664 		 */
10665 		if (!is_valid && ISCD(un)) {
10666 			sd_check_for_writable_cd(ssc, SD_PATH_DIRECT);
10667 		}
10668 
10669 	} else {
10670 		/*
10671 		 * Do a test unit ready to clear any unit attention from non-cd
10672 		 * devices.
10673 		 */
10674 		mutex_exit(SD_MUTEX(un));
10675 
10676 		status = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
10677 		if (status != 0) {
10678 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
10679 		}
10680 
10681 		mutex_enter(SD_MUTEX(un));
10682 	}
10683 
10684 
10685 	/*
10686 	 * If this is a non 512 block device, allocate space for
10687 	 * the wmap cache. This is being done here since every time
10688 	 * a media is changed this routine will be called and the
10689 	 * block size is a function of media rather than device.
10690 	 */
10691 	if (((un->un_f_rmw_type != SD_RMW_TYPE_RETURN_ERROR ||
10692 	    un->un_f_non_devbsize_supported) &&
10693 	    un->un_tgt_blocksize != DEV_BSIZE) ||
10694 	    un->un_f_enable_rmw) {
10695 		if (!(un->un_wm_cache)) {
10696 			(void) snprintf(name_str, sizeof (name_str),
10697 			    "%s%d_cache",
10698 			    ddi_driver_name(SD_DEVINFO(un)),
10699 			    ddi_get_instance(SD_DEVINFO(un)));
10700 			un->un_wm_cache = kmem_cache_create(
10701 			    name_str, sizeof (struct sd_w_map),
10702 			    8, sd_wm_cache_constructor,
10703 			    sd_wm_cache_destructor, NULL,
10704 			    (void *)un, NULL, 0);
10705 			if (!(un->un_wm_cache)) {
10706 				rval = ENOMEM;
10707 				goto done;
10708 			}
10709 		}
10710 	}
10711 
10712 	if (un->un_state == SD_STATE_NORMAL) {
10713 		/*
10714 		 * If the target is not yet ready here (defined by a TUR
10715 		 * failure), invalidate the geometry and print an 'offline'
10716 		 * message. This is a legacy message, as the state of the
10717 		 * target is not actually changed to SD_STATE_OFFLINE.
10718 		 *
10719 		 * If the TUR fails for EACCES (Reservation Conflict),
10720 		 * SD_RESERVED_BY_OTHERS will be returned to indicate
10721 		 * reservation conflict. If the TUR fails for other
10722 		 * reasons, SD_NOT_READY_VALID will be returned.
10723 		 */
10724 		int err;
10725 
10726 		mutex_exit(SD_MUTEX(un));
10727 		err = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
10728 		mutex_enter(SD_MUTEX(un));
10729 
10730 		if (err != 0) {
10731 			mutex_exit(SD_MUTEX(un));
10732 			cmlb_invalidate(un->un_cmlbhandle,
10733 			    (void *)SD_PATH_DIRECT);
10734 			mutex_enter(SD_MUTEX(un));
10735 			if (err == EACCES) {
10736 				scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
10737 				    "reservation conflict\n");
10738 				rval = SD_RESERVED_BY_OTHERS;
10739 				sd_ssc_assessment(ssc, SD_FMT_IGNORE);
10740 			} else {
10741 				scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
10742 				    "drive offline\n");
10743 				rval = SD_NOT_READY_VALID;
10744 				sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
10745 			}
10746 			goto done;
10747 		}
10748 	}
10749 
10750 	if (un->un_f_format_in_progress == FALSE) {
10751 		mutex_exit(SD_MUTEX(un));
10752 
10753 		(void) cmlb_validate(un->un_cmlbhandle, 0,
10754 		    (void *)SD_PATH_DIRECT);
10755 		if (cmlb_partinfo(un->un_cmlbhandle, part, NULL, NULL, NULL,
10756 		    NULL, (void *) SD_PATH_DIRECT) != 0) {
10757 			rval = SD_NOT_READY_VALID;
10758 			mutex_enter(SD_MUTEX(un));
10759 
10760 			goto done;
10761 		}
10762 		if (un->un_f_pkstats_enabled) {
10763 			sd_set_pstats(un);
10764 			SD_TRACE(SD_LOG_IO_PARTITION, un,
10765 			    "sd_ready_and_valid: un:0x%p pstats created and "
10766 			    "set\n", un);
10767 		}
10768 		mutex_enter(SD_MUTEX(un));
10769 	}
10770 
10771 	/*
10772 	 * If this device supports DOOR_LOCK command, try and send
10773 	 * this command to PREVENT MEDIA REMOVAL, but don't get upset
10774 	 * if it fails. For a CD, however, it is an error
10775 	 */
10776 	if (un->un_f_doorlock_supported) {
10777 		mutex_exit(SD_MUTEX(un));
10778 		status = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT,
10779 		    SD_PATH_DIRECT);
10780 
10781 		if ((status != 0) && ISCD(un)) {
10782 			rval = SD_NOT_READY_VALID;
10783 			mutex_enter(SD_MUTEX(un));
10784 
10785 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
10786 
10787 			goto done;
10788 		} else if (status != 0)
10789 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
10790 		mutex_enter(SD_MUTEX(un));
10791 	}
10792 
10793 	/* The state has changed, inform the media watch routines */
10794 	un->un_mediastate = DKIO_INSERTED;
10795 	cv_broadcast(&un->un_state_cv);
10796 	rval = SD_READY_VALID;
10797 
10798 done:
10799 
10800 	/*
10801 	 * Initialize the capacity kstat value, if no media previously
10802 	 * (capacity kstat is 0) and a media has been inserted
10803 	 * (un_blockcount > 0).
10804 	 */
10805 	if (un->un_errstats != NULL) {
10806 		stp = (struct sd_errstats *)un->un_errstats->ks_data;
10807 		if ((stp->sd_capacity.value.ui64 == 0) &&
10808 		    (un->un_f_blockcount_is_valid == TRUE)) {
10809 			stp->sd_capacity.value.ui64 =
10810 			    (uint64_t)((uint64_t)un->un_blockcount *
10811 			    un->un_sys_blocksize);
10812 		}
10813 	}
10814 
10815 	mutex_exit(SD_MUTEX(un));
10816 	return (rval);
10817 }
10818 
10819 
10820 /*
10821  *    Function: sdmin
10822  *
10823  * Description: Routine to limit the size of a data transfer. Used in
10824  *		conjunction with physio(9F).
10825  *
10826  *   Arguments: bp - pointer to the indicated buf(9S) struct.
10827  *
10828  *     Context: Kernel thread context.
10829  */
10830 
10831 static void
10832 sdmin(struct buf *bp)
10833 {
10834 	struct sd_lun	*un;
10835 	int		instance;
10836 
10837 	instance = SDUNIT(bp->b_edev);
10838 
10839 	un = ddi_get_soft_state(sd_state, instance);
10840 	ASSERT(un != NULL);
10841 
10842 	/*
10843 	 * We depend on buf breakup to restrict
10844 	 * IO size if it is enabled.
10845 	 */
10846 	if (un->un_buf_breakup_supported) {
10847 		return;
10848 	}
10849 
10850 	if (bp->b_bcount > un->un_max_xfer_size) {
10851 		bp->b_bcount = un->un_max_xfer_size;
10852 	}
10853 }
10854 
10855 
10856 /*
10857  *    Function: sdread
10858  *
10859  * Description: Driver's read(9e) entry point function.
10860  *
10861  *   Arguments: dev   - device number
10862  *		uio   - structure pointer describing where data is to be stored
10863  *			in user's space
10864  *		cred_p  - user credential pointer
10865  *
10866  * Return Code: ENXIO
10867  *		EIO
10868  *		EINVAL
10869  *		value returned by physio
10870  *
10871  *     Context: Kernel thread context.
10872  */
10873 /* ARGSUSED */
10874 static int
10875 sdread(dev_t dev, struct uio *uio, cred_t *cred_p)
10876 {
10877 	struct sd_lun	*un = NULL;
10878 	int		secmask;
10879 	int		err = 0;
10880 	sd_ssc_t	*ssc;
10881 
10882 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
10883 		return (ENXIO);
10884 	}
10885 
10886 	ASSERT(!mutex_owned(SD_MUTEX(un)));
10887 
10888 
10889 	if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) {
10890 		mutex_enter(SD_MUTEX(un));
10891 		/*
10892 		 * Because the call to sd_ready_and_valid will issue I/O we
10893 		 * must wait here if either the device is suspended or
10894 		 * if it's power level is changing.
10895 		 */
10896 		while ((un->un_state == SD_STATE_SUSPENDED) ||
10897 		    (un->un_state == SD_STATE_PM_CHANGING)) {
10898 			cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
10899 		}
10900 		un->un_ncmds_in_driver++;
10901 		mutex_exit(SD_MUTEX(un));
10902 
10903 		/* Initialize sd_ssc_t for internal uscsi commands */
10904 		ssc = sd_ssc_init(un);
10905 		if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) {
10906 			err = EIO;
10907 		} else {
10908 			err = 0;
10909 		}
10910 		sd_ssc_fini(ssc);
10911 
10912 		mutex_enter(SD_MUTEX(un));
10913 		un->un_ncmds_in_driver--;
10914 		ASSERT(un->un_ncmds_in_driver >= 0);
10915 		mutex_exit(SD_MUTEX(un));
10916 		if (err != 0)
10917 			return (err);
10918 	}
10919 
10920 	/*
10921 	 * Read requests are restricted to multiples of the system block size.
10922 	 */
10923 	if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR &&
10924 	    !un->un_f_enable_rmw)
10925 		secmask = un->un_tgt_blocksize - 1;
10926 	else
10927 		secmask = DEV_BSIZE - 1;
10928 
10929 	if (uio->uio_loffset & ((offset_t)(secmask))) {
10930 		SD_ERROR(SD_LOG_READ_WRITE, un,
10931 		    "sdread: file offset not modulo %d\n",
10932 		    secmask + 1);
10933 		err = EINVAL;
10934 	} else if (uio->uio_iov->iov_len & (secmask)) {
10935 		SD_ERROR(SD_LOG_READ_WRITE, un,
10936 		    "sdread: transfer length not modulo %d\n",
10937 		    secmask + 1);
10938 		err = EINVAL;
10939 	} else {
10940 		err = physio(sdstrategy, NULL, dev, B_READ, sdmin, uio);
10941 	}
10942 
10943 	return (err);
10944 }
10945 
10946 
10947 /*
10948  *    Function: sdwrite
10949  *
10950  * Description: Driver's write(9e) entry point function.
10951  *
10952  *   Arguments: dev   - device number
10953  *		uio   - structure pointer describing where data is stored in
10954  *			user's space
10955  *		cred_p  - user credential pointer
10956  *
10957  * Return Code: ENXIO
10958  *		EIO
10959  *		EINVAL
10960  *		value returned by physio
10961  *
10962  *     Context: Kernel thread context.
10963  */
10964 /* ARGSUSED */
10965 static int
10966 sdwrite(dev_t dev, struct uio *uio, cred_t *cred_p)
10967 {
10968 	struct sd_lun	*un = NULL;
10969 	int		secmask;
10970 	int		err = 0;
10971 	sd_ssc_t	*ssc;
10972 
10973 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
10974 		return (ENXIO);
10975 	}
10976 
10977 	ASSERT(!mutex_owned(SD_MUTEX(un)));
10978 
10979 	if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) {
10980 		mutex_enter(SD_MUTEX(un));
10981 		/*
10982 		 * Because the call to sd_ready_and_valid will issue I/O we
10983 		 * must wait here if either the device is suspended or
10984 		 * if it's power level is changing.
10985 		 */
10986 		while ((un->un_state == SD_STATE_SUSPENDED) ||
10987 		    (un->un_state == SD_STATE_PM_CHANGING)) {
10988 			cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
10989 		}
10990 		un->un_ncmds_in_driver++;
10991 		mutex_exit(SD_MUTEX(un));
10992 
10993 		/* Initialize sd_ssc_t for internal uscsi commands */
10994 		ssc = sd_ssc_init(un);
10995 		if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) {
10996 			err = EIO;
10997 		} else {
10998 			err = 0;
10999 		}
11000 		sd_ssc_fini(ssc);
11001 
11002 		mutex_enter(SD_MUTEX(un));
11003 		un->un_ncmds_in_driver--;
11004 		ASSERT(un->un_ncmds_in_driver >= 0);
11005 		mutex_exit(SD_MUTEX(un));
11006 		if (err != 0)
11007 			return (err);
11008 	}
11009 
11010 	/*
11011 	 * Write requests are restricted to multiples of the system block size.
11012 	 */
11013 	if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR &&
11014 	    !un->un_f_enable_rmw)
11015 		secmask = un->un_tgt_blocksize - 1;
11016 	else
11017 		secmask = DEV_BSIZE - 1;
11018 
11019 	if (uio->uio_loffset & ((offset_t)(secmask))) {
11020 		SD_ERROR(SD_LOG_READ_WRITE, un,
11021 		    "sdwrite: file offset not modulo %d\n",
11022 		    secmask + 1);
11023 		err = EINVAL;
11024 	} else if (uio->uio_iov->iov_len & (secmask)) {
11025 		SD_ERROR(SD_LOG_READ_WRITE, un,
11026 		    "sdwrite: transfer length not modulo %d\n",
11027 		    secmask + 1);
11028 		err = EINVAL;
11029 	} else {
11030 		err = physio(sdstrategy, NULL, dev, B_WRITE, sdmin, uio);
11031 	}
11032 
11033 	return (err);
11034 }
11035 
11036 
11037 /*
11038  *    Function: sdaread
11039  *
11040  * Description: Driver's aread(9e) entry point function.
11041  *
11042  *   Arguments: dev   - device number
11043  *		aio   - structure pointer describing where data is to be stored
11044  *		cred_p  - user credential pointer
11045  *
11046  * Return Code: ENXIO
11047  *		EIO
11048  *		EINVAL
11049  *		value returned by aphysio
11050  *
11051  *     Context: Kernel thread context.
11052  */
11053 /* ARGSUSED */
11054 static int
11055 sdaread(dev_t dev, struct aio_req *aio, cred_t *cred_p)
11056 {
11057 	struct sd_lun	*un = NULL;
11058 	struct uio	*uio = aio->aio_uio;
11059 	int		secmask;
11060 	int		err = 0;
11061 	sd_ssc_t	*ssc;
11062 
11063 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
11064 		return (ENXIO);
11065 	}
11066 
11067 	ASSERT(!mutex_owned(SD_MUTEX(un)));
11068 
11069 	if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) {
11070 		mutex_enter(SD_MUTEX(un));
11071 		/*
11072 		 * Because the call to sd_ready_and_valid will issue I/O we
11073 		 * must wait here if either the device is suspended or
11074 		 * if it's power level is changing.
11075 		 */
11076 		while ((un->un_state == SD_STATE_SUSPENDED) ||
11077 		    (un->un_state == SD_STATE_PM_CHANGING)) {
11078 			cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
11079 		}
11080 		un->un_ncmds_in_driver++;
11081 		mutex_exit(SD_MUTEX(un));
11082 
11083 		/* Initialize sd_ssc_t for internal uscsi commands */
11084 		ssc = sd_ssc_init(un);
11085 		if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) {
11086 			err = EIO;
11087 		} else {
11088 			err = 0;
11089 		}
11090 		sd_ssc_fini(ssc);
11091 
11092 		mutex_enter(SD_MUTEX(un));
11093 		un->un_ncmds_in_driver--;
11094 		ASSERT(un->un_ncmds_in_driver >= 0);
11095 		mutex_exit(SD_MUTEX(un));
11096 		if (err != 0)
11097 			return (err);
11098 	}
11099 
11100 	/*
11101 	 * Read requests are restricted to multiples of the system block size.
11102 	 */
11103 	if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR &&
11104 	    !un->un_f_enable_rmw)
11105 		secmask = un->un_tgt_blocksize - 1;
11106 	else
11107 		secmask = DEV_BSIZE - 1;
11108 
11109 	if (uio->uio_loffset & ((offset_t)(secmask))) {
11110 		SD_ERROR(SD_LOG_READ_WRITE, un,
11111 		    "sdaread: file offset not modulo %d\n",
11112 		    secmask + 1);
11113 		err = EINVAL;
11114 	} else if (uio->uio_iov->iov_len & (secmask)) {
11115 		SD_ERROR(SD_LOG_READ_WRITE, un,
11116 		    "sdaread: transfer length not modulo %d\n",
11117 		    secmask + 1);
11118 		err = EINVAL;
11119 	} else {
11120 		err = aphysio(sdstrategy, anocancel, dev, B_READ, sdmin, aio);
11121 	}
11122 
11123 	return (err);
11124 }
11125 
11126 
11127 /*
11128  *    Function: sdawrite
11129  *
11130  * Description: Driver's awrite(9e) entry point function.
11131  *
11132  *   Arguments: dev   - device number
11133  *		aio   - structure pointer describing where data is stored
11134  *		cred_p  - user credential pointer
11135  *
11136  * Return Code: ENXIO
11137  *		EIO
11138  *		EINVAL
11139  *		value returned by aphysio
11140  *
11141  *     Context: Kernel thread context.
11142  */
11143 /* ARGSUSED */
11144 static int
11145 sdawrite(dev_t dev, struct aio_req *aio, cred_t *cred_p)
11146 {
11147 	struct sd_lun	*un = NULL;
11148 	struct uio	*uio = aio->aio_uio;
11149 	int		secmask;
11150 	int		err = 0;
11151 	sd_ssc_t	*ssc;
11152 
11153 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
11154 		return (ENXIO);
11155 	}
11156 
11157 	ASSERT(!mutex_owned(SD_MUTEX(un)));
11158 
11159 	if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) {
11160 		mutex_enter(SD_MUTEX(un));
11161 		/*
11162 		 * Because the call to sd_ready_and_valid will issue I/O we
11163 		 * must wait here if either the device is suspended or
11164 		 * if it's power level is changing.
11165 		 */
11166 		while ((un->un_state == SD_STATE_SUSPENDED) ||
11167 		    (un->un_state == SD_STATE_PM_CHANGING)) {
11168 			cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
11169 		}
11170 		un->un_ncmds_in_driver++;
11171 		mutex_exit(SD_MUTEX(un));
11172 
11173 		/* Initialize sd_ssc_t for internal uscsi commands */
11174 		ssc = sd_ssc_init(un);
11175 		if ((sd_ready_and_valid(ssc, SDPART(dev))) != SD_READY_VALID) {
11176 			err = EIO;
11177 		} else {
11178 			err = 0;
11179 		}
11180 		sd_ssc_fini(ssc);
11181 
11182 		mutex_enter(SD_MUTEX(un));
11183 		un->un_ncmds_in_driver--;
11184 		ASSERT(un->un_ncmds_in_driver >= 0);
11185 		mutex_exit(SD_MUTEX(un));
11186 		if (err != 0)
11187 			return (err);
11188 	}
11189 
11190 	/*
11191 	 * Write requests are restricted to multiples of the system block size.
11192 	 */
11193 	if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR &&
11194 	    !un->un_f_enable_rmw)
11195 		secmask = un->un_tgt_blocksize - 1;
11196 	else
11197 		secmask = DEV_BSIZE - 1;
11198 
11199 	if (uio->uio_loffset & ((offset_t)(secmask))) {
11200 		SD_ERROR(SD_LOG_READ_WRITE, un,
11201 		    "sdawrite: file offset not modulo %d\n",
11202 		    secmask + 1);
11203 		err = EINVAL;
11204 	} else if (uio->uio_iov->iov_len & (secmask)) {
11205 		SD_ERROR(SD_LOG_READ_WRITE, un,
11206 		    "sdawrite: transfer length not modulo %d\n",
11207 		    secmask + 1);
11208 		err = EINVAL;
11209 	} else {
11210 		err = aphysio(sdstrategy, anocancel, dev, B_WRITE, sdmin, aio);
11211 	}
11212 
11213 	return (err);
11214 }
11215 
11216 
11217 
11218 
11219 
11220 /*
11221  * Driver IO processing follows the following sequence:
11222  *
11223  *     sdioctl(9E)     sdstrategy(9E)         biodone(9F)
11224  *         |                |                     ^
11225  *         v                v                     |
11226  * sd_send_scsi_cmd()  ddi_xbuf_qstrategy()       +-------------------+
11227  *         |                |                     |                   |
11228  *         v                |                     |                   |
11229  * sd_uscsi_strategy() sd_xbuf_strategy()   sd_buf_iodone()   sd_uscsi_iodone()
11230  *         |                |                     ^                   ^
11231  *         v                v                     |                   |
11232  * SD_BEGIN_IOSTART()  SD_BEGIN_IOSTART()         |                   |
11233  *         |                |                     |                   |
11234  *     +---+                |                     +------------+      +-------+
11235  *     |                    |                                  |              |
11236  *     |   SD_NEXT_IOSTART()|                  SD_NEXT_IODONE()|              |
11237  *     |                    v                                  |              |
11238  *     |         sd_mapblockaddr_iostart()           sd_mapblockaddr_iodone() |
11239  *     |                    |                                  ^              |
11240  *     |   SD_NEXT_IOSTART()|                  SD_NEXT_IODONE()|              |
11241  *     |                    v                                  |              |
11242  *     |         sd_mapblocksize_iostart()           sd_mapblocksize_iodone() |
11243  *     |                    |                                  ^              |
11244  *     |   SD_NEXT_IOSTART()|                  SD_NEXT_IODONE()|              |
11245  *     |                    v                                  |              |
11246  *     |           sd_checksum_iostart()               sd_checksum_iodone()   |
11247  *     |                    |                                  ^              |
11248  *     +-> SD_NEXT_IOSTART()|                  SD_NEXT_IODONE()+------------->+
11249  *     |                    v                                  |              |
11250  *     |              sd_pm_iostart()                     sd_pm_iodone()      |
11251  *     |                    |                                  ^              |
11252  *     |                    |                                  |              |
11253  *     +-> SD_NEXT_IOSTART()|               SD_BEGIN_IODONE()--+--------------+
11254  *                          |                           ^
11255  *                          v                           |
11256  *                   sd_core_iostart()                  |
11257  *                          |                           |
11258  *                          |                           +------>(*destroypkt)()
11259  *                          +-> sd_start_cmds() <-+     |           |
11260  *                          |                     |     |           v
11261  *                          |                     |     |  scsi_destroy_pkt(9F)
11262  *                          |                     |     |
11263  *                          +->(*initpkt)()       +- sdintr()
11264  *                          |  |                        |  |
11265  *                          |  +-> scsi_init_pkt(9F)    |  +-> sd_handle_xxx()
11266  *                          |  +-> scsi_setup_cdb(9F)   |
11267  *                          |                           |
11268  *                          +--> scsi_transport(9F)     |
11269  *                                     |                |
11270  *                                     +----> SCSA ---->+
11271  *
11272  *
11273  * This code is based upon the following presumptions:
11274  *
11275  *   - iostart and iodone functions operate on buf(9S) structures. These
11276  *     functions perform the necessary operations on the buf(9S) and pass
11277  *     them along to the next function in the chain by using the macros
11278  *     SD_NEXT_IOSTART() (for iostart side functions) and SD_NEXT_IODONE()
11279  *     (for iodone side functions).
11280  *
11281  *   - The iostart side functions may sleep. The iodone side functions
11282  *     are called under interrupt context and may NOT sleep. Therefore
11283  *     iodone side functions also may not call iostart side functions.
11284  *     (NOTE: iostart side functions should NOT sleep for memory, as
11285  *     this could result in deadlock.)
11286  *
11287  *   - An iostart side function may call its corresponding iodone side
11288  *     function directly (if necessary).
11289  *
11290  *   - In the event of an error, an iostart side function can return a buf(9S)
11291  *     to its caller by calling SD_BEGIN_IODONE() (after setting B_ERROR and
11292  *     b_error in the usual way of course).
11293  *
11294  *   - The taskq mechanism may be used by the iodone side functions to dispatch
11295  *     requests to the iostart side functions.  The iostart side functions in
11296  *     this case would be called under the context of a taskq thread, so it's
11297  *     OK for them to block/sleep/spin in this case.
11298  *
11299  *   - iostart side functions may allocate "shadow" buf(9S) structs and
11300  *     pass them along to the next function in the chain.  The corresponding
11301  *     iodone side functions must coalesce the "shadow" bufs and return
11302  *     the "original" buf to the next higher layer.
11303  *
11304  *   - The b_private field of the buf(9S) struct holds a pointer to
11305  *     an sd_xbuf struct, which contains information needed to
11306  *     construct the scsi_pkt for the command.
11307  *
11308  *   - The SD_MUTEX(un) is NOT held across calls to the next layer. Each
11309  *     layer must acquire & release the SD_MUTEX(un) as needed.
11310  */
11311 
11312 
11313 /*
11314  * Create taskq for all targets in the system. This is created at
11315  * _init(9E) and destroyed at _fini(9E).
11316  *
11317  * Note: here we set the minalloc to a reasonably high number to ensure that
11318  * we will have an adequate supply of task entries available at interrupt time.
11319  * This is used in conjunction with the TASKQ_PREPOPULATE flag in
11320  * sd_create_taskq().  Since we do not want to sleep for allocations at
11321  * interrupt time, set maxalloc equal to minalloc. That way we will just fail
11322  * the command if we ever try to dispatch more than SD_TASKQ_MAXALLOC taskq
11323  * requests any one instant in time.
11324  */
11325 #define	SD_TASKQ_NUMTHREADS	8
11326 #define	SD_TASKQ_MINALLOC	256
11327 #define	SD_TASKQ_MAXALLOC	256
11328 
11329 static taskq_t	*sd_tq = NULL;
11330 _NOTE(SCHEME_PROTECTS_DATA("stable data", sd_tq))
11331 
11332 static int	sd_taskq_minalloc = SD_TASKQ_MINALLOC;
11333 static int	sd_taskq_maxalloc = SD_TASKQ_MAXALLOC;
11334 
11335 /*
11336  * The following task queue is being created for the write part of
11337  * read-modify-write of non-512 block size devices.
11338  * Limit the number of threads to 1 for now. This number has been chosen
11339  * considering the fact that it applies only to dvd ram drives/MO drives
11340  * currently. Performance for which is not main criteria at this stage.
11341  * Note: It needs to be explored if we can use a single taskq in future
11342  */
11343 #define	SD_WMR_TASKQ_NUMTHREADS	1
11344 static taskq_t	*sd_wmr_tq = NULL;
11345 _NOTE(SCHEME_PROTECTS_DATA("stable data", sd_wmr_tq))
11346 
11347 /*
11348  *    Function: sd_taskq_create
11349  *
11350  * Description: Create taskq thread(s) and preallocate task entries
11351  *
11352  * Return Code: Returns a pointer to the allocated taskq_t.
11353  *
11354  *     Context: Can sleep. Requires blockable context.
11355  *
11356  *       Notes: - The taskq() facility currently is NOT part of the DDI.
11357  *		  (definitely NOT recommeded for 3rd-party drivers!) :-)
11358  *		- taskq_create() will block for memory, also it will panic
11359  *		  if it cannot create the requested number of threads.
11360  *		- Currently taskq_create() creates threads that cannot be
11361  *		  swapped.
11362  *		- We use TASKQ_PREPOPULATE to ensure we have an adequate
11363  *		  supply of taskq entries at interrupt time (ie, so that we
11364  *		  do not have to sleep for memory)
11365  */
11366 
11367 static void
11368 sd_taskq_create(void)
11369 {
11370 	char	taskq_name[TASKQ_NAMELEN];
11371 
11372 	ASSERT(sd_tq == NULL);
11373 	ASSERT(sd_wmr_tq == NULL);
11374 
11375 	(void) snprintf(taskq_name, sizeof (taskq_name),
11376 	    "%s_drv_taskq", sd_label);
11377 	sd_tq = (taskq_create(taskq_name, SD_TASKQ_NUMTHREADS,
11378 	    (v.v_maxsyspri - 2), sd_taskq_minalloc, sd_taskq_maxalloc,
11379 	    TASKQ_PREPOPULATE));
11380 
11381 	(void) snprintf(taskq_name, sizeof (taskq_name),
11382 	    "%s_rmw_taskq", sd_label);
11383 	sd_wmr_tq = (taskq_create(taskq_name, SD_WMR_TASKQ_NUMTHREADS,
11384 	    (v.v_maxsyspri - 2), sd_taskq_minalloc, sd_taskq_maxalloc,
11385 	    TASKQ_PREPOPULATE));
11386 }
11387 
11388 
11389 /*
11390  *    Function: sd_taskq_delete
11391  *
11392  * Description: Complementary cleanup routine for sd_taskq_create().
11393  *
11394  *     Context: Kernel thread context.
11395  */
11396 
11397 static void
11398 sd_taskq_delete(void)
11399 {
11400 	ASSERT(sd_tq != NULL);
11401 	ASSERT(sd_wmr_tq != NULL);
11402 	taskq_destroy(sd_tq);
11403 	taskq_destroy(sd_wmr_tq);
11404 	sd_tq = NULL;
11405 	sd_wmr_tq = NULL;
11406 }
11407 
11408 
11409 /*
11410  *    Function: sdstrategy
11411  *
11412  * Description: Driver's strategy (9E) entry point function.
11413  *
11414  *   Arguments: bp - pointer to buf(9S)
11415  *
11416  * Return Code: Always returns zero
11417  *
11418  *     Context: Kernel thread context.
11419  */
11420 
11421 static int
11422 sdstrategy(struct buf *bp)
11423 {
11424 	struct sd_lun *un;
11425 
11426 	un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp));
11427 	if (un == NULL) {
11428 		bioerror(bp, EIO);
11429 		bp->b_resid = bp->b_bcount;
11430 		biodone(bp);
11431 		return (0);
11432 	}
11433 
11434 	/* As was done in the past, fail new cmds. if state is dumping. */
11435 	if (un->un_state == SD_STATE_DUMPING) {
11436 		bioerror(bp, ENXIO);
11437 		bp->b_resid = bp->b_bcount;
11438 		biodone(bp);
11439 		return (0);
11440 	}
11441 
11442 	ASSERT(!mutex_owned(SD_MUTEX(un)));
11443 
11444 	/*
11445 	 * Commands may sneak in while we released the mutex in
11446 	 * DDI_SUSPEND, we should block new commands. However, old
11447 	 * commands that are still in the driver at this point should
11448 	 * still be allowed to drain.
11449 	 */
11450 	mutex_enter(SD_MUTEX(un));
11451 	/*
11452 	 * Must wait here if either the device is suspended or
11453 	 * if it's power level is changing.
11454 	 */
11455 	while ((un->un_state == SD_STATE_SUSPENDED) ||
11456 	    (un->un_state == SD_STATE_PM_CHANGING)) {
11457 		cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
11458 	}
11459 
11460 	un->un_ncmds_in_driver++;
11461 
11462 	/*
11463 	 * atapi: Since we are running the CD for now in PIO mode we need to
11464 	 * call bp_mapin here to avoid bp_mapin called interrupt context under
11465 	 * the HBA's init_pkt routine.
11466 	 */
11467 	if (un->un_f_cfg_is_atapi == TRUE) {
11468 		mutex_exit(SD_MUTEX(un));
11469 		bp_mapin(bp);
11470 		mutex_enter(SD_MUTEX(un));
11471 	}
11472 	SD_INFO(SD_LOG_IO, un, "sdstrategy: un_ncmds_in_driver = %ld\n",
11473 	    un->un_ncmds_in_driver);
11474 
11475 	if (bp->b_flags & B_WRITE)
11476 		un->un_f_sync_cache_required = TRUE;
11477 
11478 	mutex_exit(SD_MUTEX(un));
11479 
11480 	/*
11481 	 * This will (eventually) allocate the sd_xbuf area and
11482 	 * call sd_xbuf_strategy().  We just want to return the
11483 	 * result of ddi_xbuf_qstrategy so that we have an opt-
11484 	 * imized tail call which saves us a stack frame.
11485 	 */
11486 	return (ddi_xbuf_qstrategy(bp, un->un_xbuf_attr));
11487 }
11488 
11489 
11490 /*
11491  *    Function: sd_xbuf_strategy
11492  *
11493  * Description: Function for initiating IO operations via the
11494  *		ddi_xbuf_qstrategy() mechanism.
11495  *
11496  *     Context: Kernel thread context.
11497  */
11498 
11499 static void
11500 sd_xbuf_strategy(struct buf *bp, ddi_xbuf_t xp, void *arg)
11501 {
11502 	struct sd_lun *un = arg;
11503 
11504 	ASSERT(bp != NULL);
11505 	ASSERT(xp != NULL);
11506 	ASSERT(un != NULL);
11507 	ASSERT(!mutex_owned(SD_MUTEX(un)));
11508 
11509 	/*
11510 	 * Initialize the fields in the xbuf and save a pointer to the
11511 	 * xbuf in bp->b_private.
11512 	 */
11513 	sd_xbuf_init(un, bp, xp, SD_CHAIN_BUFIO, NULL);
11514 
11515 	/* Send the buf down the iostart chain */
11516 	SD_BEGIN_IOSTART(((struct sd_xbuf *)xp)->xb_chain_iostart, un, bp);
11517 }
11518 
11519 
11520 /*
11521  *    Function: sd_xbuf_init
11522  *
11523  * Description: Prepare the given sd_xbuf struct for use.
11524  *
11525  *   Arguments: un - ptr to softstate
11526  *		bp - ptr to associated buf(9S)
11527  *		xp - ptr to associated sd_xbuf
11528  *		chain_type - IO chain type to use:
11529  *			SD_CHAIN_NULL
11530  *			SD_CHAIN_BUFIO
11531  *			SD_CHAIN_USCSI
11532  *			SD_CHAIN_DIRECT
11533  *			SD_CHAIN_DIRECT_PRIORITY
11534  *		pktinfop - ptr to private data struct for scsi_pkt(9S)
11535  *			initialization; may be NULL if none.
11536  *
11537  *     Context: Kernel thread context
11538  */
11539 
11540 static void
11541 sd_xbuf_init(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
11542     uchar_t chain_type, void *pktinfop)
11543 {
11544 	int index;
11545 
11546 	ASSERT(un != NULL);
11547 	ASSERT(bp != NULL);
11548 	ASSERT(xp != NULL);
11549 
11550 	SD_INFO(SD_LOG_IO, un, "sd_xbuf_init: buf:0x%p chain type:0x%x\n",
11551 	    bp, chain_type);
11552 
11553 	xp->xb_un	= un;
11554 	xp->xb_pktp	= NULL;
11555 	xp->xb_pktinfo	= pktinfop;
11556 	xp->xb_private	= bp->b_private;
11557 	xp->xb_blkno	= (daddr_t)bp->b_blkno;
11558 
11559 	/*
11560 	 * Set up the iostart and iodone chain indexes in the xbuf, based
11561 	 * upon the specified chain type to use.
11562 	 */
11563 	switch (chain_type) {
11564 	case SD_CHAIN_NULL:
11565 		/*
11566 		 * Fall thru to just use the values for the buf type, even
11567 		 * tho for the NULL chain these values will never be used.
11568 		 */
11569 		/* FALLTHRU */
11570 	case SD_CHAIN_BUFIO:
11571 		index = un->un_buf_chain_type;
11572 		if ((!un->un_f_has_removable_media) &&
11573 		    (un->un_tgt_blocksize != 0) &&
11574 		    (un->un_tgt_blocksize != DEV_BSIZE ||
11575 		    un->un_f_enable_rmw)) {
11576 			int secmask = 0, blknomask = 0;
11577 			if (un->un_f_enable_rmw) {
11578 				blknomask =
11579 				    (un->un_phy_blocksize / DEV_BSIZE) - 1;
11580 				secmask = un->un_phy_blocksize - 1;
11581 			} else {
11582 				blknomask =
11583 				    (un->un_tgt_blocksize / DEV_BSIZE) - 1;
11584 				secmask = un->un_tgt_blocksize - 1;
11585 			}
11586 
11587 			if ((bp->b_lblkno & (blknomask)) ||
11588 			    (bp->b_bcount & (secmask))) {
11589 				if ((un->un_f_rmw_type !=
11590 				    SD_RMW_TYPE_RETURN_ERROR) ||
11591 				    un->un_f_enable_rmw) {
11592 					if (un->un_f_pm_is_enabled == FALSE)
11593 						index =
11594 						    SD_CHAIN_INFO_MSS_DSK_NO_PM;
11595 					else
11596 						index =
11597 						    SD_CHAIN_INFO_MSS_DISK;
11598 				}
11599 			}
11600 		}
11601 		break;
11602 	case SD_CHAIN_USCSI:
11603 		index = un->un_uscsi_chain_type;
11604 		break;
11605 	case SD_CHAIN_DIRECT:
11606 		index = un->un_direct_chain_type;
11607 		break;
11608 	case SD_CHAIN_DIRECT_PRIORITY:
11609 		index = un->un_priority_chain_type;
11610 		break;
11611 	default:
11612 		/* We're really broken if we ever get here... */
11613 		panic("sd_xbuf_init: illegal chain type!");
11614 		/*NOTREACHED*/
11615 	}
11616 
11617 	xp->xb_chain_iostart = sd_chain_index_map[index].sci_iostart_index;
11618 	xp->xb_chain_iodone = sd_chain_index_map[index].sci_iodone_index;
11619 
11620 	/*
11621 	 * It might be a bit easier to simply bzero the entire xbuf above,
11622 	 * but it turns out that since we init a fair number of members anyway,
11623 	 * we save a fair number cycles by doing explicit assignment of zero.
11624 	 */
11625 	xp->xb_pkt_flags	= 0;
11626 	xp->xb_dma_resid	= 0;
11627 	xp->xb_retry_count	= 0;
11628 	xp->xb_victim_retry_count = 0;
11629 	xp->xb_ua_retry_count	= 0;
11630 	xp->xb_nr_retry_count	= 0;
11631 	xp->xb_sense_bp		= NULL;
11632 	xp->xb_sense_status	= 0;
11633 	xp->xb_sense_state	= 0;
11634 	xp->xb_sense_resid	= 0;
11635 	xp->xb_ena		= 0;
11636 
11637 	bp->b_private	= xp;
11638 	bp->b_flags	&= ~(B_DONE | B_ERROR);
11639 	bp->b_resid	= 0;
11640 	bp->av_forw	= NULL;
11641 	bp->av_back	= NULL;
11642 	bioerror(bp, 0);
11643 
11644 	SD_INFO(SD_LOG_IO, un, "sd_xbuf_init: done.\n");
11645 }
11646 
11647 
11648 /*
11649  *    Function: sd_uscsi_strategy
11650  *
11651  * Description: Wrapper for calling into the USCSI chain via physio(9F)
11652  *
11653  *   Arguments: bp - buf struct ptr
11654  *
11655  * Return Code: Always returns 0
11656  *
11657  *     Context: Kernel thread context
11658  */
11659 
11660 static int
11661 sd_uscsi_strategy(struct buf *bp)
11662 {
11663 	struct sd_lun		*un;
11664 	struct sd_uscsi_info	*uip;
11665 	struct sd_xbuf		*xp;
11666 	uchar_t			chain_type;
11667 	uchar_t			cmd;
11668 
11669 	ASSERT(bp != NULL);
11670 
11671 	un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp));
11672 	if (un == NULL) {
11673 		bioerror(bp, EIO);
11674 		bp->b_resid = bp->b_bcount;
11675 		biodone(bp);
11676 		return (0);
11677 	}
11678 
11679 	ASSERT(!mutex_owned(SD_MUTEX(un)));
11680 
11681 	SD_TRACE(SD_LOG_IO, un, "sd_uscsi_strategy: entry: buf:0x%p\n", bp);
11682 
11683 	/*
11684 	 * A pointer to a struct sd_uscsi_info is expected in bp->b_private
11685 	 */
11686 	ASSERT(bp->b_private != NULL);
11687 	uip = (struct sd_uscsi_info *)bp->b_private;
11688 	cmd = ((struct uscsi_cmd *)(uip->ui_cmdp))->uscsi_cdb[0];
11689 
11690 	mutex_enter(SD_MUTEX(un));
11691 	/*
11692 	 * atapi: Since we are running the CD for now in PIO mode we need to
11693 	 * call bp_mapin here to avoid bp_mapin called interrupt context under
11694 	 * the HBA's init_pkt routine.
11695 	 */
11696 	if (un->un_f_cfg_is_atapi == TRUE) {
11697 		mutex_exit(SD_MUTEX(un));
11698 		bp_mapin(bp);
11699 		mutex_enter(SD_MUTEX(un));
11700 	}
11701 	un->un_ncmds_in_driver++;
11702 	SD_INFO(SD_LOG_IO, un, "sd_uscsi_strategy: un_ncmds_in_driver = %ld\n",
11703 	    un->un_ncmds_in_driver);
11704 
11705 	if ((bp->b_flags & B_WRITE) && (bp->b_bcount != 0) &&
11706 	    (cmd != SCMD_MODE_SELECT) && (cmd != SCMD_MODE_SELECT_G1))
11707 		un->un_f_sync_cache_required = TRUE;
11708 
11709 	mutex_exit(SD_MUTEX(un));
11710 
11711 	switch (uip->ui_flags) {
11712 	case SD_PATH_DIRECT:
11713 		chain_type = SD_CHAIN_DIRECT;
11714 		break;
11715 	case SD_PATH_DIRECT_PRIORITY:
11716 		chain_type = SD_CHAIN_DIRECT_PRIORITY;
11717 		break;
11718 	default:
11719 		chain_type = SD_CHAIN_USCSI;
11720 		break;
11721 	}
11722 
11723 	/*
11724 	 * We may allocate extra buf for external USCSI commands. If the
11725 	 * application asks for bigger than 20-byte sense data via USCSI,
11726 	 * SCSA layer will allocate 252 bytes sense buf for that command.
11727 	 */
11728 	if (((struct uscsi_cmd *)(uip->ui_cmdp))->uscsi_rqlen >
11729 	    SENSE_LENGTH) {
11730 		xp = kmem_zalloc(sizeof (struct sd_xbuf) - SENSE_LENGTH +
11731 		    MAX_SENSE_LENGTH, KM_SLEEP);
11732 	} else {
11733 		xp = kmem_zalloc(sizeof (struct sd_xbuf), KM_SLEEP);
11734 	}
11735 
11736 	sd_xbuf_init(un, bp, xp, chain_type, uip->ui_cmdp);
11737 
11738 	/* Use the index obtained within xbuf_init */
11739 	SD_BEGIN_IOSTART(xp->xb_chain_iostart, un, bp);
11740 
11741 	SD_TRACE(SD_LOG_IO, un, "sd_uscsi_strategy: exit: buf:0x%p\n", bp);
11742 
11743 	return (0);
11744 }
11745 
11746 /*
11747  *    Function: sd_send_scsi_cmd
11748  *
11749  * Description: Runs a USCSI command for user (when called thru sdioctl),
11750  *		or for the driver
11751  *
11752  *   Arguments: dev - the dev_t for the device
11753  *		incmd - ptr to a valid uscsi_cmd struct
11754  *		flag - bit flag, indicating open settings, 32/64 bit type
11755  *		dataspace - UIO_USERSPACE or UIO_SYSSPACE
11756  *		path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
11757  *			the normal command waitq, or SD_PATH_DIRECT_PRIORITY
11758  *			to use the USCSI "direct" chain and bypass the normal
11759  *			command waitq.
11760  *
11761  * Return Code: 0 -  successful completion of the given command
11762  *		EIO - scsi_uscsi_handle_command() failed
11763  *		ENXIO  - soft state not found for specified dev
11764  *		EINVAL
11765  *		EFAULT - copyin/copyout error
11766  *		return code of scsi_uscsi_handle_command():
11767  *			EIO
11768  *			ENXIO
11769  *			EACCES
11770  *
11771  *     Context: Waits for command to complete. Can sleep.
11772  */
11773 
11774 static int
11775 sd_send_scsi_cmd(dev_t dev, struct uscsi_cmd *incmd, int flag,
11776     enum uio_seg dataspace, int path_flag)
11777 {
11778 	struct sd_lun	*un;
11779 	sd_ssc_t	*ssc;
11780 	int		rval;
11781 
11782 	un = ddi_get_soft_state(sd_state, SDUNIT(dev));
11783 	if (un == NULL) {
11784 		return (ENXIO);
11785 	}
11786 
11787 	/*
11788 	 * Using sd_ssc_send to handle uscsi cmd
11789 	 */
11790 	ssc = sd_ssc_init(un);
11791 	rval = sd_ssc_send(ssc, incmd, flag, dataspace, path_flag);
11792 	sd_ssc_fini(ssc);
11793 
11794 	return (rval);
11795 }
11796 
11797 /*
11798  *    Function: sd_ssc_init
11799  *
11800  * Description: Uscsi end-user call this function to initialize necessary
11801  *              fields, such as uscsi_cmd and sd_uscsi_info struct.
11802  *
11803  *              The return value of sd_send_scsi_cmd will be treated as a
11804  *              fault in various conditions. Even it is not Zero, some
11805  *              callers may ignore the return value. That is to say, we can
11806  *              not make an accurate assessment in sdintr, since if a
11807  *              command is failed in sdintr it does not mean the caller of
11808  *              sd_send_scsi_cmd will treat it as a real failure.
11809  *
11810  *              To avoid printing too many error logs for a failed uscsi
11811  *              packet that the caller may not treat it as a failure, the
11812  *              sd will keep silent for handling all uscsi commands.
11813  *
11814  *              During detach->attach and attach-open, for some types of
11815  *              problems, the driver should be providing information about
11816  *              the problem encountered. Device use USCSI_SILENT, which
11817  *              suppresses all driver information. The result is that no
11818  *              information about the problem is available. Being
11819  *              completely silent during this time is inappropriate. The
11820  *              driver needs a more selective filter than USCSI_SILENT, so
11821  *              that information related to faults is provided.
11822  *
11823  *              To make the accurate accessment, the caller  of
11824  *              sd_send_scsi_USCSI_CMD should take the ownership and
11825  *              get necessary information to print error messages.
11826  *
11827  *              If we want to print necessary info of uscsi command, we need to
11828  *              keep the uscsi_cmd and sd_uscsi_info till we can make the
11829  *              assessment. We use sd_ssc_init to alloc necessary
11830  *              structs for sending an uscsi command and we are also
11831  *              responsible for free the memory by calling
11832  *              sd_ssc_fini.
11833  *
11834  *              The calling secquences will look like:
11835  *              sd_ssc_init->
11836  *
11837  *                  ...
11838  *
11839  *                  sd_send_scsi_USCSI_CMD->
11840  *                      sd_ssc_send-> - - - sdintr
11841  *                  ...
11842  *
11843  *                  if we think the return value should be treated as a
11844  *                  failure, we make the accessment here and print out
11845  *                  necessary by retrieving uscsi_cmd and sd_uscsi_info'
11846  *
11847  *                  ...
11848  *
11849  *              sd_ssc_fini
11850  *
11851  *
11852  *   Arguments: un - pointer to driver soft state (unit) structure for this
11853  *                   target.
11854  *
11855  * Return code: sd_ssc_t - pointer to allocated sd_ssc_t struct, it contains
11856  *                         uscsi_cmd and sd_uscsi_info.
11857  *                  NULL - if can not alloc memory for sd_ssc_t struct
11858  *
11859  *     Context: Kernel Thread.
11860  */
11861 static sd_ssc_t *
11862 sd_ssc_init(struct sd_lun *un)
11863 {
11864 	sd_ssc_t		*ssc;
11865 	struct uscsi_cmd	*ucmdp;
11866 	struct sd_uscsi_info	*uip;
11867 
11868 	ASSERT(un != NULL);
11869 	ASSERT(!mutex_owned(SD_MUTEX(un)));
11870 
11871 	/*
11872 	 * Allocate sd_ssc_t structure
11873 	 */
11874 	ssc = kmem_zalloc(sizeof (sd_ssc_t), KM_SLEEP);
11875 
11876 	/*
11877 	 * Allocate uscsi_cmd by calling scsi_uscsi_alloc common routine
11878 	 */
11879 	ucmdp = scsi_uscsi_alloc();
11880 
11881 	/*
11882 	 * Allocate sd_uscsi_info structure
11883 	 */
11884 	uip = kmem_zalloc(sizeof (struct sd_uscsi_info), KM_SLEEP);
11885 
11886 	ssc->ssc_uscsi_cmd = ucmdp;
11887 	ssc->ssc_uscsi_info = uip;
11888 	ssc->ssc_un = un;
11889 
11890 	return (ssc);
11891 }
11892 
11893 /*
11894  * Function: sd_ssc_fini
11895  *
11896  * Description: To free sd_ssc_t and it's hanging off
11897  *
11898  * Arguments: ssc - struct pointer of sd_ssc_t.
11899  */
11900 static void
11901 sd_ssc_fini(sd_ssc_t *ssc)
11902 {
11903 	scsi_uscsi_free(ssc->ssc_uscsi_cmd);
11904 
11905 	if (ssc->ssc_uscsi_info != NULL) {
11906 		kmem_free(ssc->ssc_uscsi_info, sizeof (struct sd_uscsi_info));
11907 		ssc->ssc_uscsi_info = NULL;
11908 	}
11909 
11910 	kmem_free(ssc, sizeof (sd_ssc_t));
11911 	ssc = NULL;
11912 }
11913 
11914 /*
11915  * Function: sd_ssc_send
11916  *
11917  * Description: Runs a USCSI command for user when called through sdioctl,
11918  *              or for the driver.
11919  *
11920  *   Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and
11921  *                    sd_uscsi_info in.
11922  *		incmd - ptr to a valid uscsi_cmd struct
11923  *		flag - bit flag, indicating open settings, 32/64 bit type
11924  *		dataspace - UIO_USERSPACE or UIO_SYSSPACE
11925  *		path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
11926  *			the normal command waitq, or SD_PATH_DIRECT_PRIORITY
11927  *			to use the USCSI "direct" chain and bypass the normal
11928  *			command waitq.
11929  *
11930  * Return Code: 0 -  successful completion of the given command
11931  *		EIO - scsi_uscsi_handle_command() failed
11932  *		ENXIO  - soft state not found for specified dev
11933  *		ECANCELED - command cancelled due to low power
11934  *		EINVAL
11935  *		EFAULT - copyin/copyout error
11936  *		return code of scsi_uscsi_handle_command():
11937  *			EIO
11938  *			ENXIO
11939  *			EACCES
11940  *
11941  *     Context: Kernel Thread;
11942  *              Waits for command to complete. Can sleep.
11943  */
11944 static int
11945 sd_ssc_send(sd_ssc_t *ssc, struct uscsi_cmd *incmd, int flag,
11946     enum uio_seg dataspace, int path_flag)
11947 {
11948 	struct sd_uscsi_info	*uip;
11949 	struct uscsi_cmd	*uscmd;
11950 	struct sd_lun		*un;
11951 	dev_t			dev;
11952 
11953 	int	format = 0;
11954 	int	rval;
11955 
11956 	ASSERT(ssc != NULL);
11957 	un = ssc->ssc_un;
11958 	ASSERT(un != NULL);
11959 	uscmd = ssc->ssc_uscsi_cmd;
11960 	ASSERT(uscmd != NULL);
11961 	ASSERT(!mutex_owned(SD_MUTEX(un)));
11962 	if (ssc->ssc_flags & SSC_FLAGS_NEED_ASSESSMENT) {
11963 		/*
11964 		 * If enter here, it indicates that the previous uscsi
11965 		 * command has not been processed by sd_ssc_assessment.
11966 		 * This is violating our rules of FMA telemetry processing.
11967 		 * We should print out this message and the last undisposed
11968 		 * uscsi command.
11969 		 */
11970 		if (uscmd->uscsi_cdb != NULL) {
11971 			SD_INFO(SD_LOG_SDTEST, un,
11972 			    "sd_ssc_send is missing the alternative "
11973 			    "sd_ssc_assessment when running command 0x%x.\n",
11974 			    uscmd->uscsi_cdb[0]);
11975 		}
11976 		/*
11977 		 * Set the ssc_flags to SSC_FLAGS_UNKNOWN, which should be
11978 		 * the initial status.
11979 		 */
11980 		ssc->ssc_flags = SSC_FLAGS_UNKNOWN;
11981 	}
11982 
11983 	/*
11984 	 * We need to make sure sd_ssc_send will have sd_ssc_assessment
11985 	 * followed to avoid missing FMA telemetries.
11986 	 */
11987 	ssc->ssc_flags |= SSC_FLAGS_NEED_ASSESSMENT;
11988 
11989 	/*
11990 	 * if USCSI_PMFAILFAST is set and un is in low power, fail the
11991 	 * command immediately.
11992 	 */
11993 	mutex_enter(SD_MUTEX(un));
11994 	mutex_enter(&un->un_pm_mutex);
11995 	if ((uscmd->uscsi_flags & USCSI_PMFAILFAST) &&
11996 	    SD_DEVICE_IS_IN_LOW_POWER(un)) {
11997 		SD_TRACE(SD_LOG_IO, un, "sd_ssc_send:"
11998 		    "un:0x%p is in low power\n", un);
11999 		mutex_exit(&un->un_pm_mutex);
12000 		mutex_exit(SD_MUTEX(un));
12001 		return (ECANCELED);
12002 	}
12003 	mutex_exit(&un->un_pm_mutex);
12004 	mutex_exit(SD_MUTEX(un));
12005 
12006 #ifdef SDDEBUG
12007 	switch (dataspace) {
12008 	case UIO_USERSPACE:
12009 		SD_TRACE(SD_LOG_IO, un,
12010 		    "sd_ssc_send: entry: un:0x%p UIO_USERSPACE\n", un);
12011 		break;
12012 	case UIO_SYSSPACE:
12013 		SD_TRACE(SD_LOG_IO, un,
12014 		    "sd_ssc_send: entry: un:0x%p UIO_SYSSPACE\n", un);
12015 		break;
12016 	default:
12017 		SD_TRACE(SD_LOG_IO, un,
12018 		    "sd_ssc_send: entry: un:0x%p UNEXPECTED SPACE\n", un);
12019 		break;
12020 	}
12021 #endif
12022 
12023 	rval = scsi_uscsi_copyin((intptr_t)incmd, flag,
12024 	    SD_ADDRESS(un), &uscmd);
12025 	if (rval != 0) {
12026 		SD_TRACE(SD_LOG_IO, un, "sd_sense_scsi_cmd: "
12027 		    "scsi_uscsi_alloc_and_copyin failed\n", un);
12028 		return (rval);
12029 	}
12030 
12031 	if ((uscmd->uscsi_cdb != NULL) &&
12032 	    (uscmd->uscsi_cdb[0] == SCMD_FORMAT)) {
12033 		mutex_enter(SD_MUTEX(un));
12034 		un->un_f_format_in_progress = TRUE;
12035 		mutex_exit(SD_MUTEX(un));
12036 		format = 1;
12037 	}
12038 
12039 	/*
12040 	 * Allocate an sd_uscsi_info struct and fill it with the info
12041 	 * needed by sd_initpkt_for_uscsi().  Then put the pointer into
12042 	 * b_private in the buf for sd_initpkt_for_uscsi().  Note that
12043 	 * since we allocate the buf here in this function, we do not
12044 	 * need to preserve the prior contents of b_private.
12045 	 * The sd_uscsi_info struct is also used by sd_uscsi_strategy()
12046 	 */
12047 	uip = ssc->ssc_uscsi_info;
12048 	uip->ui_flags = path_flag;
12049 	uip->ui_cmdp = uscmd;
12050 
12051 	/*
12052 	 * Commands sent with priority are intended for error recovery
12053 	 * situations, and do not have retries performed.
12054 	 */
12055 	if (path_flag == SD_PATH_DIRECT_PRIORITY) {
12056 		uscmd->uscsi_flags |= USCSI_DIAGNOSE;
12057 	}
12058 	uscmd->uscsi_flags &= ~USCSI_NOINTR;
12059 
12060 	dev = SD_GET_DEV(un);
12061 	rval = scsi_uscsi_handle_cmd(dev, dataspace, uscmd,
12062 	    sd_uscsi_strategy, NULL, uip);
12063 
12064 	/*
12065 	 * mark ssc_flags right after handle_cmd to make sure
12066 	 * the uscsi has been sent
12067 	 */
12068 	ssc->ssc_flags |= SSC_FLAGS_CMD_ISSUED;
12069 
12070 #ifdef SDDEBUG
12071 	SD_INFO(SD_LOG_IO, un, "sd_ssc_send: "
12072 	    "uscsi_status: 0x%02x  uscsi_resid:0x%x\n",
12073 	    uscmd->uscsi_status, uscmd->uscsi_resid);
12074 	if (uscmd->uscsi_bufaddr != NULL) {
12075 		SD_INFO(SD_LOG_IO, un, "sd_ssc_send: "
12076 		    "uscmd->uscsi_bufaddr: 0x%p  uscmd->uscsi_buflen:%d\n",
12077 		    uscmd->uscsi_bufaddr, uscmd->uscsi_buflen);
12078 		if (dataspace == UIO_SYSSPACE) {
12079 			SD_DUMP_MEMORY(un, SD_LOG_IO,
12080 			    "data", (uchar_t *)uscmd->uscsi_bufaddr,
12081 			    uscmd->uscsi_buflen, SD_LOG_HEX);
12082 		}
12083 	}
12084 #endif
12085 
12086 	if (format == 1) {
12087 		mutex_enter(SD_MUTEX(un));
12088 		un->un_f_format_in_progress = FALSE;
12089 		mutex_exit(SD_MUTEX(un));
12090 	}
12091 
12092 	(void) scsi_uscsi_copyout((intptr_t)incmd, uscmd);
12093 
12094 	return (rval);
12095 }
12096 
12097 /*
12098  *     Function: sd_ssc_print
12099  *
12100  * Description: Print information available to the console.
12101  *
12102  * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and
12103  *                    sd_uscsi_info in.
12104  *            sd_severity - log level.
12105  *     Context: Kernel thread or interrupt context.
12106  */
12107 static void
12108 sd_ssc_print(sd_ssc_t *ssc, int sd_severity)
12109 {
12110 	struct uscsi_cmd	*ucmdp;
12111 	struct scsi_device	*devp;
12112 	dev_info_t 		*devinfo;
12113 	uchar_t			*sensep;
12114 	int			senlen;
12115 	union scsi_cdb		*cdbp;
12116 	uchar_t			com;
12117 	extern struct scsi_key_strings scsi_cmds[];
12118 
12119 	ASSERT(ssc != NULL);
12120 	ASSERT(ssc->ssc_un != NULL);
12121 
12122 	if (SD_FM_LOG(ssc->ssc_un) != SD_FM_LOG_EREPORT)
12123 		return;
12124 	ucmdp = ssc->ssc_uscsi_cmd;
12125 	devp = SD_SCSI_DEVP(ssc->ssc_un);
12126 	devinfo = SD_DEVINFO(ssc->ssc_un);
12127 	ASSERT(ucmdp != NULL);
12128 	ASSERT(devp != NULL);
12129 	ASSERT(devinfo != NULL);
12130 	sensep = (uint8_t *)ucmdp->uscsi_rqbuf;
12131 	senlen = ucmdp->uscsi_rqlen - ucmdp->uscsi_rqresid;
12132 	cdbp = (union scsi_cdb *)ucmdp->uscsi_cdb;
12133 
12134 	/* In certain case (like DOORLOCK), the cdb could be NULL. */
12135 	if (cdbp == NULL)
12136 		return;
12137 	/* We don't print log if no sense data available. */
12138 	if (senlen == 0)
12139 		sensep = NULL;
12140 	com = cdbp->scc_cmd;
12141 	scsi_generic_errmsg(devp, sd_label, sd_severity, 0, 0, com,
12142 	    scsi_cmds, sensep, ssc->ssc_un->un_additional_codes, NULL);
12143 }
12144 
12145 /*
12146  *     Function: sd_ssc_assessment
12147  *
12148  * Description: We use this function to make an assessment at the point
12149  *              where SD driver may encounter a potential error.
12150  *
12151  * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and
12152  *                  sd_uscsi_info in.
12153  *            tp_assess - a hint of strategy for ereport posting.
12154  *            Possible values of tp_assess include:
12155  *                SD_FMT_IGNORE - we don't post any ereport because we're
12156  *                sure that it is ok to ignore the underlying problems.
12157  *                SD_FMT_IGNORE_COMPROMISE - we don't post any ereport for now
12158  *                but it might be not correct to ignore the underlying hardware
12159  *                error.
12160  *                SD_FMT_STATUS_CHECK - we will post an ereport with the
12161  *                payload driver-assessment of value "fail" or
12162  *                "fatal"(depending on what information we have here). This
12163  *                assessment value is usually set when SD driver think there
12164  *                is a potential error occurred(Typically, when return value
12165  *                of the SCSI command is EIO).
12166  *                SD_FMT_STANDARD - we will post an ereport with the payload
12167  *                driver-assessment of value "info". This assessment value is
12168  *                set when the SCSI command returned successfully and with
12169  *                sense data sent back.
12170  *
12171  *     Context: Kernel thread.
12172  */
12173 static void
12174 sd_ssc_assessment(sd_ssc_t *ssc, enum sd_type_assessment tp_assess)
12175 {
12176 	int senlen = 0;
12177 	struct uscsi_cmd *ucmdp = NULL;
12178 	struct sd_lun *un;
12179 
12180 	ASSERT(ssc != NULL);
12181 	un = ssc->ssc_un;
12182 	ASSERT(un != NULL);
12183 	ucmdp = ssc->ssc_uscsi_cmd;
12184 	ASSERT(ucmdp != NULL);
12185 
12186 	if (ssc->ssc_flags & SSC_FLAGS_NEED_ASSESSMENT) {
12187 		ssc->ssc_flags &= ~SSC_FLAGS_NEED_ASSESSMENT;
12188 	} else {
12189 		/*
12190 		 * If enter here, it indicates that we have a wrong
12191 		 * calling sequence of sd_ssc_send and sd_ssc_assessment,
12192 		 * both of which should be called in a pair in case of
12193 		 * loss of FMA telemetries.
12194 		 */
12195 		if (ucmdp->uscsi_cdb != NULL) {
12196 			SD_INFO(SD_LOG_SDTEST, un,
12197 			    "sd_ssc_assessment is missing the "
12198 			    "alternative sd_ssc_send when running 0x%x, "
12199 			    "or there are superfluous sd_ssc_assessment for "
12200 			    "the same sd_ssc_send.\n",
12201 			    ucmdp->uscsi_cdb[0]);
12202 		}
12203 		/*
12204 		 * Set the ssc_flags to the initial value to avoid passing
12205 		 * down dirty flags to the following sd_ssc_send function.
12206 		 */
12207 		ssc->ssc_flags = SSC_FLAGS_UNKNOWN;
12208 		return;
12209 	}
12210 
12211 	/*
12212 	 * Only handle an issued command which is waiting for assessment.
12213 	 * A command which is not issued will not have
12214 	 * SSC_FLAGS_INVALID_DATA set, so it'ok we just return here.
12215 	 */
12216 	if (!(ssc->ssc_flags & SSC_FLAGS_CMD_ISSUED)) {
12217 		sd_ssc_print(ssc, SCSI_ERR_INFO);
12218 		return;
12219 	} else {
12220 		/*
12221 		 * For an issued command, we should clear this flag in
12222 		 * order to make the sd_ssc_t structure be used off
12223 		 * multiple uscsi commands.
12224 		 */
12225 		ssc->ssc_flags &= ~SSC_FLAGS_CMD_ISSUED;
12226 	}
12227 
12228 	/*
12229 	 * We will not deal with non-retryable(flag USCSI_DIAGNOSE set)
12230 	 * commands here. And we should clear the ssc_flags before return.
12231 	 */
12232 	if (ucmdp->uscsi_flags & USCSI_DIAGNOSE) {
12233 		ssc->ssc_flags = SSC_FLAGS_UNKNOWN;
12234 		return;
12235 	}
12236 
12237 	switch (tp_assess) {
12238 	case SD_FMT_IGNORE:
12239 	case SD_FMT_IGNORE_COMPROMISE:
12240 		break;
12241 	case SD_FMT_STATUS_CHECK:
12242 		/*
12243 		 * For a failed command(including the succeeded command
12244 		 * with invalid data sent back).
12245 		 */
12246 		sd_ssc_post(ssc, SD_FM_DRV_FATAL);
12247 		break;
12248 	case SD_FMT_STANDARD:
12249 		/*
12250 		 * Always for the succeeded commands probably with sense
12251 		 * data sent back.
12252 		 * Limitation:
12253 		 *	We can only handle a succeeded command with sense
12254 		 *	data sent back when auto-request-sense is enabled.
12255 		 */
12256 		senlen = ssc->ssc_uscsi_cmd->uscsi_rqlen -
12257 		    ssc->ssc_uscsi_cmd->uscsi_rqresid;
12258 		if ((ssc->ssc_uscsi_info->ui_pkt_state & STATE_ARQ_DONE) &&
12259 		    (un->un_f_arq_enabled == TRUE) &&
12260 		    senlen > 0 &&
12261 		    ssc->ssc_uscsi_cmd->uscsi_rqbuf != NULL) {
12262 			sd_ssc_post(ssc, SD_FM_DRV_NOTICE);
12263 		}
12264 		break;
12265 	default:
12266 		/*
12267 		 * Should not have other type of assessment.
12268 		 */
12269 		scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
12270 		    "sd_ssc_assessment got wrong "
12271 		    "sd_type_assessment %d.\n", tp_assess);
12272 		break;
12273 	}
12274 	/*
12275 	 * Clear up the ssc_flags before return.
12276 	 */
12277 	ssc->ssc_flags = SSC_FLAGS_UNKNOWN;
12278 }
12279 
12280 /*
12281  *    Function: sd_ssc_post
12282  *
12283  * Description: 1. read the driver property to get fm-scsi-log flag.
12284  *              2. print log if fm_log_capable is non-zero.
12285  *              3. call sd_ssc_ereport_post to post ereport if possible.
12286  *
12287  *    Context: May be called from kernel thread or interrupt context.
12288  */
12289 static void
12290 sd_ssc_post(sd_ssc_t *ssc, enum sd_driver_assessment sd_assess)
12291 {
12292 	struct sd_lun	*un;
12293 	int		sd_severity;
12294 
12295 	ASSERT(ssc != NULL);
12296 	un = ssc->ssc_un;
12297 	ASSERT(un != NULL);
12298 
12299 	/*
12300 	 * We may enter here from sd_ssc_assessment(for USCSI command) or
12301 	 * by directly called from sdintr context.
12302 	 * We don't handle a non-disk drive(CD-ROM, removable media).
12303 	 * Clear the ssc_flags before return in case we've set
12304 	 * SSC_FLAGS_INVALID_XXX which should be skipped for a non-disk
12305 	 * driver.
12306 	 */
12307 	if (ISCD(un) || un->un_f_has_removable_media) {
12308 		ssc->ssc_flags = SSC_FLAGS_UNKNOWN;
12309 		return;
12310 	}
12311 
12312 	switch (sd_assess) {
12313 		case SD_FM_DRV_FATAL:
12314 			sd_severity = SCSI_ERR_FATAL;
12315 			break;
12316 		case SD_FM_DRV_RECOVERY:
12317 			sd_severity = SCSI_ERR_RECOVERED;
12318 			break;
12319 		case SD_FM_DRV_RETRY:
12320 			sd_severity = SCSI_ERR_RETRYABLE;
12321 			break;
12322 		case SD_FM_DRV_NOTICE:
12323 			sd_severity = SCSI_ERR_INFO;
12324 			break;
12325 		default:
12326 			sd_severity = SCSI_ERR_UNKNOWN;
12327 	}
12328 	/* print log */
12329 	sd_ssc_print(ssc, sd_severity);
12330 
12331 	/* always post ereport */
12332 	sd_ssc_ereport_post(ssc, sd_assess);
12333 }
12334 
12335 /*
12336  *    Function: sd_ssc_set_info
12337  *
12338  * Description: Mark ssc_flags and set ssc_info which would be the
12339  *              payload of uderr ereport. This function will cause
12340  *              sd_ssc_ereport_post to post uderr ereport only.
12341  *              Besides, when ssc_flags == SSC_FLAGS_INVALID_DATA(USCSI),
12342  *              the function will also call SD_ERROR or scsi_log for a
12343  *              CDROM/removable-media/DDI_FM_NOT_CAPABLE device.
12344  *
12345  * Arguments: ssc - the struct of sd_ssc_t will bring uscsi_cmd and
12346  *                  sd_uscsi_info in.
12347  *            ssc_flags - indicate the sub-category of a uderr.
12348  *            comp - this argument is meaningful only when
12349  *                   ssc_flags == SSC_FLAGS_INVALID_DATA, and its possible
12350  *                   values include:
12351  *                   > 0, SD_ERROR is used with comp as the driver logging
12352  *                   component;
12353  *                   = 0, scsi-log is used to log error telemetries;
12354  *                   < 0, no log available for this telemetry.
12355  *
12356  *    Context: Kernel thread or interrupt context
12357  */
12358 static void
12359 sd_ssc_set_info(sd_ssc_t *ssc, int ssc_flags, uint_t comp, const char *fmt, ...)
12360 {
12361 	va_list	ap;
12362 
12363 	ASSERT(ssc != NULL);
12364 	ASSERT(ssc->ssc_un != NULL);
12365 
12366 	ssc->ssc_flags |= ssc_flags;
12367 	va_start(ap, fmt);
12368 	(void) vsnprintf(ssc->ssc_info, sizeof (ssc->ssc_info), fmt, ap);
12369 	va_end(ap);
12370 
12371 	/*
12372 	 * If SSC_FLAGS_INVALID_DATA is set, it should be a uscsi command
12373 	 * with invalid data sent back. For non-uscsi command, the
12374 	 * following code will be bypassed.
12375 	 */
12376 	if (ssc_flags & SSC_FLAGS_INVALID_DATA) {
12377 		if (SD_FM_LOG(ssc->ssc_un) == SD_FM_LOG_NSUP) {
12378 			/*
12379 			 * If the error belong to certain component and we
12380 			 * do not want it to show up on the console, we
12381 			 * will use SD_ERROR, otherwise scsi_log is
12382 			 * preferred.
12383 			 */
12384 			if (comp > 0) {
12385 				SD_ERROR(comp, ssc->ssc_un, ssc->ssc_info);
12386 			} else if (comp == 0) {
12387 				scsi_log(SD_DEVINFO(ssc->ssc_un), sd_label,
12388 				    CE_WARN, ssc->ssc_info);
12389 			}
12390 		}
12391 	}
12392 }
12393 
12394 /*
12395  *    Function: sd_buf_iodone
12396  *
12397  * Description: Frees the sd_xbuf & returns the buf to its originator.
12398  *
12399  *     Context: May be called from interrupt context.
12400  */
12401 /* ARGSUSED */
12402 static void
12403 sd_buf_iodone(int index, struct sd_lun *un, struct buf *bp)
12404 {
12405 	struct sd_xbuf *xp;
12406 
12407 	ASSERT(un != NULL);
12408 	ASSERT(bp != NULL);
12409 	ASSERT(!mutex_owned(SD_MUTEX(un)));
12410 
12411 	SD_TRACE(SD_LOG_IO_CORE, un, "sd_buf_iodone: entry.\n");
12412 
12413 	xp = SD_GET_XBUF(bp);
12414 	ASSERT(xp != NULL);
12415 
12416 	/* xbuf is gone after this */
12417 	if (ddi_xbuf_done(bp, un->un_xbuf_attr)) {
12418 		mutex_enter(SD_MUTEX(un));
12419 
12420 		/*
12421 		 * Grab time when the cmd completed.
12422 		 * This is used for determining if the system has been
12423 		 * idle long enough to make it idle to the PM framework.
12424 		 * This is for lowering the overhead, and therefore improving
12425 		 * performance per I/O operation.
12426 		 */
12427 		un->un_pm_idle_time = gethrtime();
12428 
12429 		un->un_ncmds_in_driver--;
12430 		ASSERT(un->un_ncmds_in_driver >= 0);
12431 		SD_INFO(SD_LOG_IO, un,
12432 		    "sd_buf_iodone: un_ncmds_in_driver = %ld\n",
12433 		    un->un_ncmds_in_driver);
12434 
12435 		mutex_exit(SD_MUTEX(un));
12436 	}
12437 
12438 	biodone(bp);				/* bp is gone after this */
12439 
12440 	SD_TRACE(SD_LOG_IO_CORE, un, "sd_buf_iodone: exit.\n");
12441 }
12442 
12443 
12444 /*
12445  *    Function: sd_uscsi_iodone
12446  *
12447  * Description: Frees the sd_xbuf & returns the buf to its originator.
12448  *
12449  *     Context: May be called from interrupt context.
12450  */
12451 /* ARGSUSED */
12452 static void
12453 sd_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp)
12454 {
12455 	struct sd_xbuf *xp;
12456 
12457 	ASSERT(un != NULL);
12458 	ASSERT(bp != NULL);
12459 
12460 	xp = SD_GET_XBUF(bp);
12461 	ASSERT(xp != NULL);
12462 	ASSERT(!mutex_owned(SD_MUTEX(un)));
12463 
12464 	SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: entry.\n");
12465 
12466 	bp->b_private = xp->xb_private;
12467 
12468 	mutex_enter(SD_MUTEX(un));
12469 
12470 	/*
12471 	 * Grab time when the cmd completed.
12472 	 * This is used for determining if the system has been
12473 	 * idle long enough to make it idle to the PM framework.
12474 	 * This is for lowering the overhead, and therefore improving
12475 	 * performance per I/O operation.
12476 	 */
12477 	un->un_pm_idle_time = gethrtime();
12478 
12479 	un->un_ncmds_in_driver--;
12480 	ASSERT(un->un_ncmds_in_driver >= 0);
12481 	SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: un_ncmds_in_driver = %ld\n",
12482 	    un->un_ncmds_in_driver);
12483 
12484 	mutex_exit(SD_MUTEX(un));
12485 
12486 	if (((struct uscsi_cmd *)(xp->xb_pktinfo))->uscsi_rqlen >
12487 	    SENSE_LENGTH) {
12488 		kmem_free(xp, sizeof (struct sd_xbuf) - SENSE_LENGTH +
12489 		    MAX_SENSE_LENGTH);
12490 	} else {
12491 		kmem_free(xp, sizeof (struct sd_xbuf));
12492 	}
12493 
12494 	biodone(bp);
12495 
12496 	SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: exit.\n");
12497 }
12498 
12499 
12500 /*
12501  *    Function: sd_mapblockaddr_iostart
12502  *
12503  * Description: Verify request lies within the partition limits for
12504  *		the indicated minor device.  Issue "overrun" buf if
12505  *		request would exceed partition range.  Converts
12506  *		partition-relative block address to absolute.
12507  *
12508  *              Upon exit of this function:
12509  *              1.I/O is aligned
12510  *                 xp->xb_blkno represents the absolute sector address
12511  *              2.I/O is misaligned
12512  *                 xp->xb_blkno represents the absolute logical block address
12513  *                 based on DEV_BSIZE. The logical block address will be
12514  *                 converted to physical sector address in sd_mapblocksize_\
12515  *                 iostart.
12516  *              3.I/O is misaligned but is aligned in "overrun" buf
12517  *                 xp->xb_blkno represents the absolute logical block address
12518  *                 based on DEV_BSIZE. The logical block address will be
12519  *                 converted to physical sector address in sd_mapblocksize_\
12520  *                 iostart. But no RMW will be issued in this case.
12521  *
12522  *     Context: Can sleep
12523  *
12524  *      Issues: This follows what the old code did, in terms of accessing
12525  *		some of the partition info in the unit struct without holding
12526  *		the mutext.  This is a general issue, if the partition info
12527  *		can be altered while IO is in progress... as soon as we send
12528  *		a buf, its partitioning can be invalid before it gets to the
12529  *		device.  Probably the right fix is to move partitioning out
12530  *		of the driver entirely.
12531  */
12532 
12533 static void
12534 sd_mapblockaddr_iostart(int index, struct sd_lun *un, struct buf *bp)
12535 {
12536 	diskaddr_t	nblocks;	/* #blocks in the given partition */
12537 	daddr_t	blocknum;	/* Block number specified by the buf */
12538 	size_t	requested_nblocks;
12539 	size_t	available_nblocks;
12540 	int	partition;
12541 	diskaddr_t	partition_offset;
12542 	struct sd_xbuf *xp;
12543 	int secmask = 0, blknomask = 0;
12544 	ushort_t is_aligned = TRUE;
12545 
12546 	ASSERT(un != NULL);
12547 	ASSERT(bp != NULL);
12548 	ASSERT(!mutex_owned(SD_MUTEX(un)));
12549 
12550 	SD_TRACE(SD_LOG_IO_PARTITION, un,
12551 	    "sd_mapblockaddr_iostart: entry: buf:0x%p\n", bp);
12552 
12553 	xp = SD_GET_XBUF(bp);
12554 	ASSERT(xp != NULL);
12555 
12556 	/*
12557 	 * If the geometry is not indicated as valid, attempt to access
12558 	 * the unit & verify the geometry/label. This can be the case for
12559 	 * removable-media devices, of if the device was opened in
12560 	 * NDELAY/NONBLOCK mode.
12561 	 */
12562 	partition = SDPART(bp->b_edev);
12563 
12564 	if (!SD_IS_VALID_LABEL(un)) {
12565 		sd_ssc_t *ssc;
12566 		/*
12567 		 * Initialize sd_ssc_t for internal uscsi commands
12568 		 * In case of potential porformance issue, we need
12569 		 * to alloc memory only if there is invalid label
12570 		 */
12571 		ssc = sd_ssc_init(un);
12572 
12573 		if (sd_ready_and_valid(ssc, partition) != SD_READY_VALID) {
12574 			/*
12575 			 * For removable devices it is possible to start an
12576 			 * I/O without a media by opening the device in nodelay
12577 			 * mode. Also for writable CDs there can be many
12578 			 * scenarios where there is no geometry yet but volume
12579 			 * manager is trying to issue a read() just because
12580 			 * it can see TOC on the CD. So do not print a message
12581 			 * for removables.
12582 			 */
12583 			if (!un->un_f_has_removable_media) {
12584 				scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
12585 				    "i/o to invalid geometry\n");
12586 			}
12587 			bioerror(bp, EIO);
12588 			bp->b_resid = bp->b_bcount;
12589 			SD_BEGIN_IODONE(index, un, bp);
12590 
12591 			sd_ssc_fini(ssc);
12592 			return;
12593 		}
12594 		sd_ssc_fini(ssc);
12595 	}
12596 
12597 	nblocks = 0;
12598 	(void) cmlb_partinfo(un->un_cmlbhandle, partition,
12599 	    &nblocks, &partition_offset, NULL, NULL, (void *)SD_PATH_DIRECT);
12600 
12601 	if (un->un_f_enable_rmw) {
12602 		blknomask = (un->un_phy_blocksize / DEV_BSIZE) - 1;
12603 		secmask = un->un_phy_blocksize - 1;
12604 	} else {
12605 		blknomask = (un->un_tgt_blocksize / DEV_BSIZE) - 1;
12606 		secmask = un->un_tgt_blocksize - 1;
12607 	}
12608 
12609 	if ((bp->b_lblkno & (blknomask)) || (bp->b_bcount & (secmask))) {
12610 		is_aligned = FALSE;
12611 	}
12612 
12613 	if (!(NOT_DEVBSIZE(un)) || un->un_f_enable_rmw) {
12614 		/*
12615 		 * If I/O is aligned, no need to involve RMW(Read Modify Write)
12616 		 * Convert the logical block number to target's physical sector
12617 		 * number.
12618 		 */
12619 		if (is_aligned) {
12620 			xp->xb_blkno = SD_SYS2TGTBLOCK(un, xp->xb_blkno);
12621 		} else {
12622 			/*
12623 			 * There is no RMW if we're just reading, so don't
12624 			 * warn or error out because of it.
12625 			 */
12626 			if (bp->b_flags & B_READ) {
12627 				/*EMPTY*/
12628 			} else if (!un->un_f_enable_rmw &&
12629 			    un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR) {
12630 				bp->b_flags |= B_ERROR;
12631 				goto error_exit;
12632 			} else if (un->un_f_rmw_type == SD_RMW_TYPE_DEFAULT) {
12633 				mutex_enter(SD_MUTEX(un));
12634 				if (!un->un_f_enable_rmw &&
12635 				    un->un_rmw_msg_timeid == NULL) {
12636 					scsi_log(SD_DEVINFO(un), sd_label,
12637 					    CE_WARN, "I/O request is not "
12638 					    "aligned with %d disk sector size. "
12639 					    "It is handled through Read Modify "
12640 					    "Write but the performance is "
12641 					    "very low.\n",
12642 					    un->un_tgt_blocksize);
12643 					un->un_rmw_msg_timeid =
12644 					    timeout(sd_rmw_msg_print_handler,
12645 					    un, SD_RMW_MSG_PRINT_TIMEOUT);
12646 				} else {
12647 					un->un_rmw_incre_count ++;
12648 				}
12649 				mutex_exit(SD_MUTEX(un));
12650 			}
12651 
12652 			nblocks = SD_TGT2SYSBLOCK(un, nblocks);
12653 			partition_offset = SD_TGT2SYSBLOCK(un,
12654 			    partition_offset);
12655 		}
12656 	}
12657 
12658 	/*
12659 	 * blocknum is the starting block number of the request. At this
12660 	 * point it is still relative to the start of the minor device.
12661 	 */
12662 	blocknum = xp->xb_blkno;
12663 
12664 	/*
12665 	 * Legacy: If the starting block number is one past the last block
12666 	 * in the partition, do not set B_ERROR in the buf.
12667 	 */
12668 	if (blocknum == nblocks)  {
12669 		goto error_exit;
12670 	}
12671 
12672 	/*
12673 	 * Confirm that the first block of the request lies within the
12674 	 * partition limits. Also the requested number of bytes must be
12675 	 * a multiple of the system block size.
12676 	 */
12677 	if ((blocknum < 0) || (blocknum >= nblocks) ||
12678 	    ((bp->b_bcount & (DEV_BSIZE - 1)) != 0)) {
12679 		bp->b_flags |= B_ERROR;
12680 		goto error_exit;
12681 	}
12682 
12683 	/*
12684 	 * If the requsted # blocks exceeds the available # blocks, that
12685 	 * is an overrun of the partition.
12686 	 */
12687 	if ((!NOT_DEVBSIZE(un)) && is_aligned) {
12688 		requested_nblocks = SD_BYTES2TGTBLOCKS(un, bp->b_bcount);
12689 	} else {
12690 		requested_nblocks = SD_BYTES2SYSBLOCKS(bp->b_bcount);
12691 	}
12692 
12693 	available_nblocks = (size_t)(nblocks - blocknum);
12694 	ASSERT(nblocks >= blocknum);
12695 
12696 	if (requested_nblocks > available_nblocks) {
12697 		size_t resid;
12698 
12699 		/*
12700 		 * Allocate an "overrun" buf to allow the request to proceed
12701 		 * for the amount of space available in the partition. The
12702 		 * amount not transferred will be added into the b_resid
12703 		 * when the operation is complete. The overrun buf
12704 		 * replaces the original buf here, and the original buf
12705 		 * is saved inside the overrun buf, for later use.
12706 		 */
12707 		if ((!NOT_DEVBSIZE(un)) && is_aligned) {
12708 			resid = SD_TGTBLOCKS2BYTES(un,
12709 			    (offset_t)(requested_nblocks - available_nblocks));
12710 		} else {
12711 			resid = SD_SYSBLOCKS2BYTES(
12712 			    (offset_t)(requested_nblocks - available_nblocks));
12713 		}
12714 
12715 		size_t count = bp->b_bcount - resid;
12716 		/*
12717 		 * Note: count is an unsigned entity thus it'll NEVER
12718 		 * be less than 0 so ASSERT the original values are
12719 		 * correct.
12720 		 */
12721 		ASSERT(bp->b_bcount >= resid);
12722 
12723 		bp = sd_bioclone_alloc(bp, count, blocknum,
12724 		    (int (*)(struct buf *)) sd_mapblockaddr_iodone);
12725 		xp = SD_GET_XBUF(bp); /* Update for 'new' bp! */
12726 		ASSERT(xp != NULL);
12727 	}
12728 
12729 	/* At this point there should be no residual for this buf. */
12730 	ASSERT(bp->b_resid == 0);
12731 
12732 	/* Convert the block number to an absolute address. */
12733 	xp->xb_blkno += partition_offset;
12734 
12735 	SD_NEXT_IOSTART(index, un, bp);
12736 
12737 	SD_TRACE(SD_LOG_IO_PARTITION, un,
12738 	    "sd_mapblockaddr_iostart: exit 0: buf:0x%p\n", bp);
12739 
12740 	return;
12741 
12742 error_exit:
12743 	bp->b_resid = bp->b_bcount;
12744 	SD_BEGIN_IODONE(index, un, bp);
12745 	SD_TRACE(SD_LOG_IO_PARTITION, un,
12746 	    "sd_mapblockaddr_iostart: exit 1: buf:0x%p\n", bp);
12747 }
12748 
12749 
12750 /*
12751  *    Function: sd_mapblockaddr_iodone
12752  *
12753  * Description: Completion-side processing for partition management.
12754  *
12755  *     Context: May be called under interrupt context
12756  */
12757 
12758 static void
12759 sd_mapblockaddr_iodone(int index, struct sd_lun *un, struct buf *bp)
12760 {
12761 	/* int	partition; */	/* Not used, see below. */
12762 	ASSERT(un != NULL);
12763 	ASSERT(bp != NULL);
12764 	ASSERT(!mutex_owned(SD_MUTEX(un)));
12765 
12766 	SD_TRACE(SD_LOG_IO_PARTITION, un,
12767 	    "sd_mapblockaddr_iodone: entry: buf:0x%p\n", bp);
12768 
12769 	if (bp->b_iodone == (int (*)(struct buf *)) sd_mapblockaddr_iodone) {
12770 		/*
12771 		 * We have an "overrun" buf to deal with...
12772 		 */
12773 		struct sd_xbuf	*xp;
12774 		struct buf	*obp;	/* ptr to the original buf */
12775 
12776 		xp = SD_GET_XBUF(bp);
12777 		ASSERT(xp != NULL);
12778 
12779 		/* Retrieve the pointer to the original buf */
12780 		obp = (struct buf *)xp->xb_private;
12781 		ASSERT(obp != NULL);
12782 
12783 		obp->b_resid = obp->b_bcount - (bp->b_bcount - bp->b_resid);
12784 		bioerror(obp, bp->b_error);
12785 
12786 		sd_bioclone_free(bp);
12787 
12788 		/*
12789 		 * Get back the original buf.
12790 		 * Note that since the restoration of xb_blkno below
12791 		 * was removed, the sd_xbuf is not needed.
12792 		 */
12793 		bp = obp;
12794 		/*
12795 		 * xp = SD_GET_XBUF(bp);
12796 		 * ASSERT(xp != NULL);
12797 		 */
12798 	}
12799 
12800 	/*
12801 	 * Convert sd->xb_blkno back to a minor-device relative value.
12802 	 * Note: this has been commented out, as it is not needed in the
12803 	 * current implementation of the driver (ie, since this function
12804 	 * is at the top of the layering chains, so the info will be
12805 	 * discarded) and it is in the "hot" IO path.
12806 	 *
12807 	 * partition = getminor(bp->b_edev) & SDPART_MASK;
12808 	 * xp->xb_blkno -= un->un_offset[partition];
12809 	 */
12810 
12811 	SD_NEXT_IODONE(index, un, bp);
12812 
12813 	SD_TRACE(SD_LOG_IO_PARTITION, un,
12814 	    "sd_mapblockaddr_iodone: exit: buf:0x%p\n", bp);
12815 }
12816 
12817 
12818 /*
12819  *    Function: sd_mapblocksize_iostart
12820  *
12821  * Description: Convert between system block size (un->un_sys_blocksize)
12822  *		and target block size (un->un_tgt_blocksize).
12823  *
12824  *     Context: Can sleep to allocate resources.
12825  *
12826  * Assumptions: A higher layer has already performed any partition validation,
12827  *		and converted the xp->xb_blkno to an absolute value relative
12828  *		to the start of the device.
12829  *
12830  *		It is also assumed that the higher layer has implemented
12831  *		an "overrun" mechanism for the case where the request would
12832  *		read/write beyond the end of a partition.  In this case we
12833  *		assume (and ASSERT) that bp->b_resid == 0.
12834  *
12835  *		Note: The implementation for this routine assumes the target
12836  *		block size remains constant between allocation and transport.
12837  */
12838 
12839 static void
12840 sd_mapblocksize_iostart(int index, struct sd_lun *un, struct buf *bp)
12841 {
12842 	struct sd_mapblocksize_info	*bsp;
12843 	struct sd_xbuf			*xp;
12844 	offset_t first_byte;
12845 	daddr_t	start_block, end_block;
12846 	daddr_t	request_bytes;
12847 	ushort_t is_aligned = FALSE;
12848 
12849 	ASSERT(un != NULL);
12850 	ASSERT(bp != NULL);
12851 	ASSERT(!mutex_owned(SD_MUTEX(un)));
12852 	ASSERT(bp->b_resid == 0);
12853 
12854 	SD_TRACE(SD_LOG_IO_RMMEDIA, un,
12855 	    "sd_mapblocksize_iostart: entry: buf:0x%p\n", bp);
12856 
12857 	/*
12858 	 * For a non-writable CD, a write request is an error
12859 	 */
12860 	if (ISCD(un) && ((bp->b_flags & B_READ) == 0) &&
12861 	    (un->un_f_mmc_writable_media == FALSE)) {
12862 		bioerror(bp, EIO);
12863 		bp->b_resid = bp->b_bcount;
12864 		SD_BEGIN_IODONE(index, un, bp);
12865 		return;
12866 	}
12867 
12868 	/*
12869 	 * We do not need a shadow buf if the device is using
12870 	 * un->un_sys_blocksize as its block size or if bcount == 0.
12871 	 * In this case there is no layer-private data block allocated.
12872 	 */
12873 	if ((un->un_tgt_blocksize == DEV_BSIZE && !un->un_f_enable_rmw) ||
12874 	    (bp->b_bcount == 0)) {
12875 		goto done;
12876 	}
12877 
12878 #if defined(__i386) || defined(__amd64)
12879 	/* We do not support non-block-aligned transfers for ROD devices */
12880 	ASSERT(!ISROD(un));
12881 #endif
12882 
12883 	xp = SD_GET_XBUF(bp);
12884 	ASSERT(xp != NULL);
12885 
12886 	SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: "
12887 	    "tgt_blocksize:0x%x sys_blocksize: 0x%x\n",
12888 	    un->un_tgt_blocksize, DEV_BSIZE);
12889 	SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: "
12890 	    "request start block:0x%x\n", xp->xb_blkno);
12891 	SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: "
12892 	    "request len:0x%x\n", bp->b_bcount);
12893 
12894 	/*
12895 	 * Allocate the layer-private data area for the mapblocksize layer.
12896 	 * Layers are allowed to use the xp_private member of the sd_xbuf
12897 	 * struct to store the pointer to their layer-private data block, but
12898 	 * each layer also has the responsibility of restoring the prior
12899 	 * contents of xb_private before returning the buf/xbuf to the
12900 	 * higher layer that sent it.
12901 	 *
12902 	 * Here we save the prior contents of xp->xb_private into the
12903 	 * bsp->mbs_oprivate field of our layer-private data area. This value
12904 	 * is restored by sd_mapblocksize_iodone() just prior to freeing up
12905 	 * the layer-private area and returning the buf/xbuf to the layer
12906 	 * that sent it.
12907 	 *
12908 	 * Note that here we use kmem_zalloc for the allocation as there are
12909 	 * parts of the mapblocksize code that expect certain fields to be
12910 	 * zero unless explicitly set to a required value.
12911 	 */
12912 	bsp = kmem_zalloc(sizeof (struct sd_mapblocksize_info), KM_SLEEP);
12913 	bsp->mbs_oprivate = xp->xb_private;
12914 	xp->xb_private = bsp;
12915 
12916 	/*
12917 	 * This treats the data on the disk (target) as an array of bytes.
12918 	 * first_byte is the byte offset, from the beginning of the device,
12919 	 * to the location of the request. This is converted from a
12920 	 * un->un_sys_blocksize block address to a byte offset, and then back
12921 	 * to a block address based upon a un->un_tgt_blocksize block size.
12922 	 *
12923 	 * xp->xb_blkno should be absolute upon entry into this function,
12924 	 * but, but it is based upon partitions that use the "system"
12925 	 * block size. It must be adjusted to reflect the block size of
12926 	 * the target.
12927 	 *
12928 	 * Note that end_block is actually the block that follows the last
12929 	 * block of the request, but that's what is needed for the computation.
12930 	 */
12931 	first_byte  = SD_SYSBLOCKS2BYTES((offset_t)xp->xb_blkno);
12932 	if (un->un_f_enable_rmw) {
12933 		start_block = xp->xb_blkno =
12934 		    (first_byte / un->un_phy_blocksize) *
12935 		    (un->un_phy_blocksize / DEV_BSIZE);
12936 		end_block   = ((first_byte + bp->b_bcount +
12937 		    un->un_phy_blocksize - 1) / un->un_phy_blocksize) *
12938 		    (un->un_phy_blocksize / DEV_BSIZE);
12939 	} else {
12940 		start_block = xp->xb_blkno = first_byte / un->un_tgt_blocksize;
12941 		end_block   = (first_byte + bp->b_bcount +
12942 		    un->un_tgt_blocksize - 1) / un->un_tgt_blocksize;
12943 	}
12944 
12945 	/* request_bytes is rounded up to a multiple of the target block size */
12946 	request_bytes = (end_block - start_block) * un->un_tgt_blocksize;
12947 
12948 	/*
12949 	 * See if the starting address of the request and the request
12950 	 * length are aligned on a un->un_tgt_blocksize boundary. If aligned
12951 	 * then we do not need to allocate a shadow buf to handle the request.
12952 	 */
12953 	if (un->un_f_enable_rmw) {
12954 		if (((first_byte % un->un_phy_blocksize) == 0) &&
12955 		    ((bp->b_bcount % un->un_phy_blocksize) == 0)) {
12956 			is_aligned = TRUE;
12957 		}
12958 	} else {
12959 		if (((first_byte % un->un_tgt_blocksize) == 0) &&
12960 		    ((bp->b_bcount % un->un_tgt_blocksize) == 0)) {
12961 			is_aligned = TRUE;
12962 		}
12963 	}
12964 
12965 	if ((bp->b_flags & B_READ) == 0) {
12966 		/*
12967 		 * Lock the range for a write operation. An aligned request is
12968 		 * considered a simple write; otherwise the request must be a
12969 		 * read-modify-write.
12970 		 */
12971 		bsp->mbs_wmp = sd_range_lock(un, start_block, end_block - 1,
12972 		    (is_aligned == TRUE) ? SD_WTYPE_SIMPLE : SD_WTYPE_RMW);
12973 	}
12974 
12975 	/*
12976 	 * Alloc a shadow buf if the request is not aligned. Also, this is
12977 	 * where the READ command is generated for a read-modify-write. (The
12978 	 * write phase is deferred until after the read completes.)
12979 	 */
12980 	if (is_aligned == FALSE) {
12981 
12982 		struct sd_mapblocksize_info	*shadow_bsp;
12983 		struct sd_xbuf	*shadow_xp;
12984 		struct buf	*shadow_bp;
12985 
12986 		/*
12987 		 * Allocate the shadow buf and it associated xbuf. Note that
12988 		 * after this call the xb_blkno value in both the original
12989 		 * buf's sd_xbuf _and_ the shadow buf's sd_xbuf will be the
12990 		 * same: absolute relative to the start of the device, and
12991 		 * adjusted for the target block size. The b_blkno in the
12992 		 * shadow buf will also be set to this value. We should never
12993 		 * change b_blkno in the original bp however.
12994 		 *
12995 		 * Note also that the shadow buf will always need to be a
12996 		 * READ command, regardless of whether the incoming command
12997 		 * is a READ or a WRITE.
12998 		 */
12999 		shadow_bp = sd_shadow_buf_alloc(bp, request_bytes, B_READ,
13000 		    xp->xb_blkno,
13001 		    (int (*)(struct buf *)) sd_mapblocksize_iodone);
13002 
13003 		shadow_xp = SD_GET_XBUF(shadow_bp);
13004 
13005 		/*
13006 		 * Allocate the layer-private data for the shadow buf.
13007 		 * (No need to preserve xb_private in the shadow xbuf.)
13008 		 */
13009 		shadow_xp->xb_private = shadow_bsp =
13010 		    kmem_zalloc(sizeof (struct sd_mapblocksize_info), KM_SLEEP);
13011 
13012 		/*
13013 		 * bsp->mbs_copy_offset is used later by sd_mapblocksize_iodone
13014 		 * to figure out where the start of the user data is (based upon
13015 		 * the system block size) in the data returned by the READ
13016 		 * command (which will be based upon the target blocksize). Note
13017 		 * that this is only really used if the request is unaligned.
13018 		 */
13019 		if (un->un_f_enable_rmw) {
13020 			bsp->mbs_copy_offset = (ssize_t)(first_byte -
13021 			    ((offset_t)xp->xb_blkno * un->un_sys_blocksize));
13022 			ASSERT((bsp->mbs_copy_offset >= 0) &&
13023 			    (bsp->mbs_copy_offset < un->un_phy_blocksize));
13024 		} else {
13025 			bsp->mbs_copy_offset = (ssize_t)(first_byte -
13026 			    ((offset_t)xp->xb_blkno * un->un_tgt_blocksize));
13027 			ASSERT((bsp->mbs_copy_offset >= 0) &&
13028 			    (bsp->mbs_copy_offset < un->un_tgt_blocksize));
13029 		}
13030 
13031 		shadow_bsp->mbs_copy_offset = bsp->mbs_copy_offset;
13032 
13033 		shadow_bsp->mbs_layer_index = bsp->mbs_layer_index = index;
13034 
13035 		/* Transfer the wmap (if any) to the shadow buf */
13036 		shadow_bsp->mbs_wmp = bsp->mbs_wmp;
13037 		bsp->mbs_wmp = NULL;
13038 
13039 		/*
13040 		 * The shadow buf goes on from here in place of the
13041 		 * original buf.
13042 		 */
13043 		shadow_bsp->mbs_orig_bp = bp;
13044 		bp = shadow_bp;
13045 	}
13046 
13047 	SD_INFO(SD_LOG_IO_RMMEDIA, un,
13048 	    "sd_mapblocksize_iostart: tgt start block:0x%x\n", xp->xb_blkno);
13049 	SD_INFO(SD_LOG_IO_RMMEDIA, un,
13050 	    "sd_mapblocksize_iostart: tgt request len:0x%x\n",
13051 	    request_bytes);
13052 	SD_INFO(SD_LOG_IO_RMMEDIA, un,
13053 	    "sd_mapblocksize_iostart: shadow buf:0x%x\n", bp);
13054 
13055 done:
13056 	SD_NEXT_IOSTART(index, un, bp);
13057 
13058 	SD_TRACE(SD_LOG_IO_RMMEDIA, un,
13059 	    "sd_mapblocksize_iostart: exit: buf:0x%p\n", bp);
13060 }
13061 
13062 
13063 /*
13064  *    Function: sd_mapblocksize_iodone
13065  *
13066  * Description: Completion side processing for block-size mapping.
13067  *
13068  *     Context: May be called under interrupt context
13069  */
13070 
13071 static void
13072 sd_mapblocksize_iodone(int index, struct sd_lun *un, struct buf *bp)
13073 {
13074 	struct sd_mapblocksize_info	*bsp;
13075 	struct sd_xbuf	*xp;
13076 	struct sd_xbuf	*orig_xp;	/* sd_xbuf for the original buf */
13077 	struct buf	*orig_bp;	/* ptr to the original buf */
13078 	offset_t	shadow_end;
13079 	offset_t	request_end;
13080 	offset_t	shadow_start;
13081 	ssize_t		copy_offset;
13082 	size_t		copy_length;
13083 	size_t		shortfall;
13084 	uint_t		is_write;	/* TRUE if this bp is a WRITE */
13085 	uint_t		has_wmap;	/* TRUE is this bp has a wmap */
13086 
13087 	ASSERT(un != NULL);
13088 	ASSERT(bp != NULL);
13089 
13090 	SD_TRACE(SD_LOG_IO_RMMEDIA, un,
13091 	    "sd_mapblocksize_iodone: entry: buf:0x%p\n", bp);
13092 
13093 	/*
13094 	 * There is no shadow buf or layer-private data if the target is
13095 	 * using un->un_sys_blocksize as its block size or if bcount == 0.
13096 	 */
13097 	if ((un->un_tgt_blocksize == DEV_BSIZE && !un->un_f_enable_rmw) ||
13098 	    (bp->b_bcount == 0)) {
13099 		goto exit;
13100 	}
13101 
13102 	xp = SD_GET_XBUF(bp);
13103 	ASSERT(xp != NULL);
13104 
13105 	/* Retrieve the pointer to the layer-private data area from the xbuf. */
13106 	bsp = xp->xb_private;
13107 
13108 	is_write = ((bp->b_flags & B_READ) == 0) ? TRUE : FALSE;
13109 	has_wmap = (bsp->mbs_wmp != NULL) ? TRUE : FALSE;
13110 
13111 	if (is_write) {
13112 		/*
13113 		 * For a WRITE request we must free up the block range that
13114 		 * we have locked up.  This holds regardless of whether this is
13115 		 * an aligned write request or a read-modify-write request.
13116 		 */
13117 		sd_range_unlock(un, bsp->mbs_wmp);
13118 		bsp->mbs_wmp = NULL;
13119 	}
13120 
13121 	if ((bp->b_iodone != (int(*)(struct buf *))sd_mapblocksize_iodone)) {
13122 		/*
13123 		 * An aligned read or write command will have no shadow buf;
13124 		 * there is not much else to do with it.
13125 		 */
13126 		goto done;
13127 	}
13128 
13129 	orig_bp = bsp->mbs_orig_bp;
13130 	ASSERT(orig_bp != NULL);
13131 	orig_xp = SD_GET_XBUF(orig_bp);
13132 	ASSERT(orig_xp != NULL);
13133 	ASSERT(!mutex_owned(SD_MUTEX(un)));
13134 
13135 	if (!is_write && has_wmap) {
13136 		/*
13137 		 * A READ with a wmap means this is the READ phase of a
13138 		 * read-modify-write. If an error occurred on the READ then
13139 		 * we do not proceed with the WRITE phase or copy any data.
13140 		 * Just release the write maps and return with an error.
13141 		 */
13142 		if ((bp->b_resid != 0) || (bp->b_error != 0)) {
13143 			orig_bp->b_resid = orig_bp->b_bcount;
13144 			bioerror(orig_bp, bp->b_error);
13145 			sd_range_unlock(un, bsp->mbs_wmp);
13146 			goto freebuf_done;
13147 		}
13148 	}
13149 
13150 	/*
13151 	 * Here is where we set up to copy the data from the shadow buf
13152 	 * into the space associated with the original buf.
13153 	 *
13154 	 * To deal with the conversion between block sizes, these
13155 	 * computations treat the data as an array of bytes, with the
13156 	 * first byte (byte 0) corresponding to the first byte in the
13157 	 * first block on the disk.
13158 	 */
13159 
13160 	/*
13161 	 * shadow_start and shadow_len indicate the location and size of
13162 	 * the data returned with the shadow IO request.
13163 	 */
13164 	if (un->un_f_enable_rmw) {
13165 		shadow_start  = SD_SYSBLOCKS2BYTES((offset_t)xp->xb_blkno);
13166 	} else {
13167 		shadow_start  = SD_TGTBLOCKS2BYTES(un, (offset_t)xp->xb_blkno);
13168 	}
13169 	shadow_end    = shadow_start + bp->b_bcount - bp->b_resid;
13170 
13171 	/*
13172 	 * copy_offset gives the offset (in bytes) from the start of the first
13173 	 * block of the READ request to the beginning of the data.  We retrieve
13174 	 * this value from xb_pktp in the ORIGINAL xbuf, as it has been saved
13175 	 * there by sd_mapblockize_iostart(). copy_length gives the amount of
13176 	 * data to be copied (in bytes).
13177 	 */
13178 	copy_offset  = bsp->mbs_copy_offset;
13179 	if (un->un_f_enable_rmw) {
13180 		ASSERT((copy_offset >= 0) &&
13181 		    (copy_offset < un->un_phy_blocksize));
13182 	} else {
13183 		ASSERT((copy_offset >= 0) &&
13184 		    (copy_offset < un->un_tgt_blocksize));
13185 	}
13186 
13187 	copy_length  = orig_bp->b_bcount;
13188 	request_end  = shadow_start + copy_offset + orig_bp->b_bcount;
13189 
13190 	/*
13191 	 * Set up the resid and error fields of orig_bp as appropriate.
13192 	 */
13193 	if (shadow_end >= request_end) {
13194 		/* We got all the requested data; set resid to zero */
13195 		orig_bp->b_resid = 0;
13196 	} else {
13197 		/*
13198 		 * We failed to get enough data to fully satisfy the original
13199 		 * request. Just copy back whatever data we got and set
13200 		 * up the residual and error code as required.
13201 		 *
13202 		 * 'shortfall' is the amount by which the data received with the
13203 		 * shadow buf has "fallen short" of the requested amount.
13204 		 */
13205 		shortfall = (size_t)(request_end - shadow_end);
13206 
13207 		if (shortfall > orig_bp->b_bcount) {
13208 			/*
13209 			 * We did not get enough data to even partially
13210 			 * fulfill the original request.  The residual is
13211 			 * equal to the amount requested.
13212 			 */
13213 			orig_bp->b_resid = orig_bp->b_bcount;
13214 		} else {
13215 			/*
13216 			 * We did not get all the data that we requested
13217 			 * from the device, but we will try to return what
13218 			 * portion we did get.
13219 			 */
13220 			orig_bp->b_resid = shortfall;
13221 		}
13222 		ASSERT(copy_length >= orig_bp->b_resid);
13223 		copy_length  -= orig_bp->b_resid;
13224 	}
13225 
13226 	/* Propagate the error code from the shadow buf to the original buf */
13227 	bioerror(orig_bp, bp->b_error);
13228 
13229 	if (is_write) {
13230 		goto freebuf_done;	/* No data copying for a WRITE */
13231 	}
13232 
13233 	if (has_wmap) {
13234 		/*
13235 		 * This is a READ command from the READ phase of a
13236 		 * read-modify-write request. We have to copy the data given
13237 		 * by the user OVER the data returned by the READ command,
13238 		 * then convert the command from a READ to a WRITE and send
13239 		 * it back to the target.
13240 		 */
13241 		bcopy(orig_bp->b_un.b_addr, bp->b_un.b_addr + copy_offset,
13242 		    copy_length);
13243 
13244 		bp->b_flags &= ~((int)B_READ);	/* Convert to a WRITE */
13245 
13246 		/*
13247 		 * Dispatch the WRITE command to the taskq thread, which
13248 		 * will in turn send the command to the target. When the
13249 		 * WRITE command completes, we (sd_mapblocksize_iodone())
13250 		 * will get called again as part of the iodone chain
13251 		 * processing for it. Note that we will still be dealing
13252 		 * with the shadow buf at that point.
13253 		 */
13254 		if (taskq_dispatch(sd_wmr_tq, sd_read_modify_write_task, bp,
13255 		    KM_NOSLEEP) != 0) {
13256 			/*
13257 			 * Dispatch was successful so we are done. Return
13258 			 * without going any higher up the iodone chain. Do
13259 			 * not free up any layer-private data until after the
13260 			 * WRITE completes.
13261 			 */
13262 			return;
13263 		}
13264 
13265 		/*
13266 		 * Dispatch of the WRITE command failed; set up the error
13267 		 * condition and send this IO back up the iodone chain.
13268 		 */
13269 		bioerror(orig_bp, EIO);
13270 		orig_bp->b_resid = orig_bp->b_bcount;
13271 
13272 	} else {
13273 		/*
13274 		 * This is a regular READ request (ie, not a RMW). Copy the
13275 		 * data from the shadow buf into the original buf. The
13276 		 * copy_offset compensates for any "misalignment" between the
13277 		 * shadow buf (with its un->un_tgt_blocksize blocks) and the
13278 		 * original buf (with its un->un_sys_blocksize blocks).
13279 		 */
13280 		bcopy(bp->b_un.b_addr + copy_offset, orig_bp->b_un.b_addr,
13281 		    copy_length);
13282 	}
13283 
13284 freebuf_done:
13285 
13286 	/*
13287 	 * At this point we still have both the shadow buf AND the original
13288 	 * buf to deal with, as well as the layer-private data area in each.
13289 	 * Local variables are as follows:
13290 	 *
13291 	 * bp -- points to shadow buf
13292 	 * xp -- points to xbuf of shadow buf
13293 	 * bsp -- points to layer-private data area of shadow buf
13294 	 * orig_bp -- points to original buf
13295 	 *
13296 	 * First free the shadow buf and its associated xbuf, then free the
13297 	 * layer-private data area from the shadow buf. There is no need to
13298 	 * restore xb_private in the shadow xbuf.
13299 	 */
13300 	sd_shadow_buf_free(bp);
13301 	kmem_free(bsp, sizeof (struct sd_mapblocksize_info));
13302 
13303 	/*
13304 	 * Now update the local variables to point to the original buf, xbuf,
13305 	 * and layer-private area.
13306 	 */
13307 	bp = orig_bp;
13308 	xp = SD_GET_XBUF(bp);
13309 	ASSERT(xp != NULL);
13310 	ASSERT(xp == orig_xp);
13311 	bsp = xp->xb_private;
13312 	ASSERT(bsp != NULL);
13313 
13314 done:
13315 	/*
13316 	 * Restore xb_private to whatever it was set to by the next higher
13317 	 * layer in the chain, then free the layer-private data area.
13318 	 */
13319 	xp->xb_private = bsp->mbs_oprivate;
13320 	kmem_free(bsp, sizeof (struct sd_mapblocksize_info));
13321 
13322 exit:
13323 	SD_TRACE(SD_LOG_IO_RMMEDIA, SD_GET_UN(bp),
13324 	    "sd_mapblocksize_iodone: calling SD_NEXT_IODONE: buf:0x%p\n", bp);
13325 
13326 	SD_NEXT_IODONE(index, un, bp);
13327 }
13328 
13329 
13330 /*
13331  *    Function: sd_checksum_iostart
13332  *
13333  * Description: A stub function for a layer that's currently not used.
13334  *		For now just a placeholder.
13335  *
13336  *     Context: Kernel thread context
13337  */
13338 
13339 static void
13340 sd_checksum_iostart(int index, struct sd_lun *un, struct buf *bp)
13341 {
13342 	ASSERT(un != NULL);
13343 	ASSERT(bp != NULL);
13344 	ASSERT(!mutex_owned(SD_MUTEX(un)));
13345 	SD_NEXT_IOSTART(index, un, bp);
13346 }
13347 
13348 
13349 /*
13350  *    Function: sd_checksum_iodone
13351  *
13352  * Description: A stub function for a layer that's currently not used.
13353  *		For now just a placeholder.
13354  *
13355  *     Context: May be called under interrupt context
13356  */
13357 
13358 static void
13359 sd_checksum_iodone(int index, struct sd_lun *un, struct buf *bp)
13360 {
13361 	ASSERT(un != NULL);
13362 	ASSERT(bp != NULL);
13363 	ASSERT(!mutex_owned(SD_MUTEX(un)));
13364 	SD_NEXT_IODONE(index, un, bp);
13365 }
13366 
13367 
13368 /*
13369  *    Function: sd_checksum_uscsi_iostart
13370  *
13371  * Description: A stub function for a layer that's currently not used.
13372  *		For now just a placeholder.
13373  *
13374  *     Context: Kernel thread context
13375  */
13376 
13377 static void
13378 sd_checksum_uscsi_iostart(int index, struct sd_lun *un, struct buf *bp)
13379 {
13380 	ASSERT(un != NULL);
13381 	ASSERT(bp != NULL);
13382 	ASSERT(!mutex_owned(SD_MUTEX(un)));
13383 	SD_NEXT_IOSTART(index, un, bp);
13384 }
13385 
13386 
13387 /*
13388  *    Function: sd_checksum_uscsi_iodone
13389  *
13390  * Description: A stub function for a layer that's currently not used.
13391  *		For now just a placeholder.
13392  *
13393  *     Context: May be called under interrupt context
13394  */
13395 
13396 static void
13397 sd_checksum_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp)
13398 {
13399 	ASSERT(un != NULL);
13400 	ASSERT(bp != NULL);
13401 	ASSERT(!mutex_owned(SD_MUTEX(un)));
13402 	SD_NEXT_IODONE(index, un, bp);
13403 }
13404 
13405 
13406 /*
13407  *    Function: sd_pm_iostart
13408  *
13409  * Description: iostart-side routine for Power mangement.
13410  *
13411  *     Context: Kernel thread context
13412  */
13413 
13414 static void
13415 sd_pm_iostart(int index, struct sd_lun *un, struct buf *bp)
13416 {
13417 	ASSERT(un != NULL);
13418 	ASSERT(bp != NULL);
13419 	ASSERT(!mutex_owned(SD_MUTEX(un)));
13420 	ASSERT(!mutex_owned(&un->un_pm_mutex));
13421 
13422 	SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: entry\n");
13423 
13424 	if (sd_pm_entry(un) != DDI_SUCCESS) {
13425 		/*
13426 		 * Set up to return the failed buf back up the 'iodone'
13427 		 * side of the calling chain.
13428 		 */
13429 		bioerror(bp, EIO);
13430 		bp->b_resid = bp->b_bcount;
13431 
13432 		SD_BEGIN_IODONE(index, un, bp);
13433 
13434 		SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: exit\n");
13435 		return;
13436 	}
13437 
13438 	SD_NEXT_IOSTART(index, un, bp);
13439 
13440 	SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: exit\n");
13441 }
13442 
13443 
13444 /*
13445  *    Function: sd_pm_iodone
13446  *
13447  * Description: iodone-side routine for power mangement.
13448  *
13449  *     Context: may be called from interrupt context
13450  */
13451 
13452 static void
13453 sd_pm_iodone(int index, struct sd_lun *un, struct buf *bp)
13454 {
13455 	ASSERT(un != NULL);
13456 	ASSERT(bp != NULL);
13457 	ASSERT(!mutex_owned(&un->un_pm_mutex));
13458 
13459 	SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iodone: entry\n");
13460 
13461 	/*
13462 	 * After attach the following flag is only read, so don't
13463 	 * take the penalty of acquiring a mutex for it.
13464 	 */
13465 	if (un->un_f_pm_is_enabled == TRUE) {
13466 		sd_pm_exit(un);
13467 	}
13468 
13469 	SD_NEXT_IODONE(index, un, bp);
13470 
13471 	SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iodone: exit\n");
13472 }
13473 
13474 
13475 /*
13476  *    Function: sd_core_iostart
13477  *
13478  * Description: Primary driver function for enqueuing buf(9S) structs from
13479  *		the system and initiating IO to the target device
13480  *
13481  *     Context: Kernel thread context. Can sleep.
13482  *
13483  * Assumptions:  - The given xp->xb_blkno is absolute
13484  *		   (ie, relative to the start of the device).
13485  *		 - The IO is to be done using the native blocksize of
13486  *		   the device, as specified in un->un_tgt_blocksize.
13487  */
13488 /* ARGSUSED */
13489 static void
13490 sd_core_iostart(int index, struct sd_lun *un, struct buf *bp)
13491 {
13492 	struct sd_xbuf *xp;
13493 
13494 	ASSERT(un != NULL);
13495 	ASSERT(bp != NULL);
13496 	ASSERT(!mutex_owned(SD_MUTEX(un)));
13497 	ASSERT(bp->b_resid == 0);
13498 
13499 	SD_TRACE(SD_LOG_IO_CORE, un, "sd_core_iostart: entry: bp:0x%p\n", bp);
13500 
13501 	xp = SD_GET_XBUF(bp);
13502 	ASSERT(xp != NULL);
13503 
13504 	mutex_enter(SD_MUTEX(un));
13505 
13506 	/*
13507 	 * If we are currently in the failfast state, fail any new IO
13508 	 * that has B_FAILFAST set, then return.
13509 	 */
13510 	if ((bp->b_flags & B_FAILFAST) &&
13511 	    (un->un_failfast_state == SD_FAILFAST_ACTIVE)) {
13512 		mutex_exit(SD_MUTEX(un));
13513 		bioerror(bp, EIO);
13514 		bp->b_resid = bp->b_bcount;
13515 		SD_BEGIN_IODONE(index, un, bp);
13516 		return;
13517 	}
13518 
13519 	if (SD_IS_DIRECT_PRIORITY(xp)) {
13520 		/*
13521 		 * Priority command -- transport it immediately.
13522 		 *
13523 		 * Note: We may want to assert that USCSI_DIAGNOSE is set,
13524 		 * because all direct priority commands should be associated
13525 		 * with error recovery actions which we don't want to retry.
13526 		 */
13527 		sd_start_cmds(un, bp);
13528 	} else {
13529 		/*
13530 		 * Normal command -- add it to the wait queue, then start
13531 		 * transporting commands from the wait queue.
13532 		 */
13533 		sd_add_buf_to_waitq(un, bp);
13534 		SD_UPDATE_KSTATS(un, kstat_waitq_enter, bp);
13535 		sd_start_cmds(un, NULL);
13536 	}
13537 
13538 	mutex_exit(SD_MUTEX(un));
13539 
13540 	SD_TRACE(SD_LOG_IO_CORE, un, "sd_core_iostart: exit: bp:0x%p\n", bp);
13541 }
13542 
13543 
13544 /*
13545  *    Function: sd_init_cdb_limits
13546  *
13547  * Description: This is to handle scsi_pkt initialization differences
13548  *		between the driver platforms.
13549  *
13550  *		Legacy behaviors:
13551  *
13552  *		If the block number or the sector count exceeds the
13553  *		capabilities of a Group 0 command, shift over to a
13554  *		Group 1 command. We don't blindly use Group 1
13555  *		commands because a) some drives (CDC Wren IVs) get a
13556  *		bit confused, and b) there is probably a fair amount
13557  *		of speed difference for a target to receive and decode
13558  *		a 10 byte command instead of a 6 byte command.
13559  *
13560  *		The xfer time difference of 6 vs 10 byte CDBs is
13561  *		still significant so this code is still worthwhile.
13562  *		10 byte CDBs are very inefficient with the fas HBA driver
13563  *		and older disks. Each CDB byte took 1 usec with some
13564  *		popular disks.
13565  *
13566  *     Context: Must be called at attach time
13567  */
13568 
13569 static void
13570 sd_init_cdb_limits(struct sd_lun *un)
13571 {
13572 	int hba_cdb_limit;
13573 
13574 	/*
13575 	 * Use CDB_GROUP1 commands for most devices except for
13576 	 * parallel SCSI fixed drives in which case we get better
13577 	 * performance using CDB_GROUP0 commands (where applicable).
13578 	 */
13579 	un->un_mincdb = SD_CDB_GROUP1;
13580 #if !defined(__fibre)
13581 	if (!un->un_f_is_fibre && !un->un_f_cfg_is_atapi && !ISROD(un) &&
13582 	    !un->un_f_has_removable_media) {
13583 		un->un_mincdb = SD_CDB_GROUP0;
13584 	}
13585 #endif
13586 
13587 	/*
13588 	 * Try to read the max-cdb-length supported by HBA.
13589 	 */
13590 	un->un_max_hba_cdb = scsi_ifgetcap(SD_ADDRESS(un), "max-cdb-length", 1);
13591 	if (0 >= un->un_max_hba_cdb) {
13592 		un->un_max_hba_cdb = CDB_GROUP4;
13593 		hba_cdb_limit = SD_CDB_GROUP4;
13594 	} else if (0 < un->un_max_hba_cdb &&
13595 	    un->un_max_hba_cdb < CDB_GROUP1) {
13596 		hba_cdb_limit = SD_CDB_GROUP0;
13597 	} else if (CDB_GROUP1 <= un->un_max_hba_cdb &&
13598 	    un->un_max_hba_cdb < CDB_GROUP5) {
13599 		hba_cdb_limit = SD_CDB_GROUP1;
13600 	} else if (CDB_GROUP5 <= un->un_max_hba_cdb &&
13601 	    un->un_max_hba_cdb < CDB_GROUP4) {
13602 		hba_cdb_limit = SD_CDB_GROUP5;
13603 	} else {
13604 		hba_cdb_limit = SD_CDB_GROUP4;
13605 	}
13606 
13607 	/*
13608 	 * Use CDB_GROUP5 commands for removable devices.  Use CDB_GROUP4
13609 	 * commands for fixed disks unless we are building for a 32 bit
13610 	 * kernel.
13611 	 */
13612 #ifdef _LP64
13613 	un->un_maxcdb = (un->un_f_has_removable_media) ? SD_CDB_GROUP5 :
13614 	    min(hba_cdb_limit, SD_CDB_GROUP4);
13615 #else
13616 	un->un_maxcdb = (un->un_f_has_removable_media) ? SD_CDB_GROUP5 :
13617 	    min(hba_cdb_limit, SD_CDB_GROUP1);
13618 #endif
13619 
13620 	un->un_status_len = (int)((un->un_f_arq_enabled == TRUE)
13621 	    ? sizeof (struct scsi_arq_status) : 1);
13622 	if (!ISCD(un))
13623 		un->un_cmd_timeout = (ushort_t)sd_io_time;
13624 	un->un_uscsi_timeout = ((ISCD(un)) ? 2 : 1) * un->un_cmd_timeout;
13625 }
13626 
13627 
13628 /*
13629  *    Function: sd_initpkt_for_buf
13630  *
13631  * Description: Allocate and initialize for transport a scsi_pkt struct,
13632  *		based upon the info specified in the given buf struct.
13633  *
13634  *		Assumes the xb_blkno in the request is absolute (ie,
13635  *		relative to the start of the device (NOT partition!).
13636  *		Also assumes that the request is using the native block
13637  *		size of the device (as returned by the READ CAPACITY
13638  *		command).
13639  *
13640  * Return Code: SD_PKT_ALLOC_SUCCESS
13641  *		SD_PKT_ALLOC_FAILURE
13642  *		SD_PKT_ALLOC_FAILURE_NO_DMA
13643  *		SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL
13644  *
13645  *     Context: Kernel thread and may be called from software interrupt context
13646  *		as part of a sdrunout callback. This function may not block or
13647  *		call routines that block
13648  */
13649 
13650 static int
13651 sd_initpkt_for_buf(struct buf *bp, struct scsi_pkt **pktpp)
13652 {
13653 	struct sd_xbuf	*xp;
13654 	struct scsi_pkt *pktp = NULL;
13655 	struct sd_lun	*un;
13656 	size_t		blockcount;
13657 	daddr_t		startblock;
13658 	int		rval;
13659 	int		cmd_flags;
13660 
13661 	ASSERT(bp != NULL);
13662 	ASSERT(pktpp != NULL);
13663 	xp = SD_GET_XBUF(bp);
13664 	ASSERT(xp != NULL);
13665 	un = SD_GET_UN(bp);
13666 	ASSERT(un != NULL);
13667 	ASSERT(mutex_owned(SD_MUTEX(un)));
13668 	ASSERT(bp->b_resid == 0);
13669 
13670 	SD_TRACE(SD_LOG_IO_CORE, un,
13671 	    "sd_initpkt_for_buf: entry: buf:0x%p\n", bp);
13672 
13673 	mutex_exit(SD_MUTEX(un));
13674 
13675 #if defined(__i386) || defined(__amd64)	/* DMAFREE for x86 only */
13676 	if (xp->xb_pkt_flags & SD_XB_DMA_FREED) {
13677 		/*
13678 		 * Already have a scsi_pkt -- just need DMA resources.
13679 		 * We must recompute the CDB in case the mapping returns
13680 		 * a nonzero pkt_resid.
13681 		 * Note: if this is a portion of a PKT_DMA_PARTIAL transfer
13682 		 * that is being retried, the unmap/remap of the DMA resouces
13683 		 * will result in the entire transfer starting over again
13684 		 * from the very first block.
13685 		 */
13686 		ASSERT(xp->xb_pktp != NULL);
13687 		pktp = xp->xb_pktp;
13688 	} else {
13689 		pktp = NULL;
13690 	}
13691 #endif /* __i386 || __amd64 */
13692 
13693 	startblock = xp->xb_blkno;	/* Absolute block num. */
13694 	blockcount = SD_BYTES2TGTBLOCKS(un, bp->b_bcount);
13695 
13696 	cmd_flags = un->un_pkt_flags | (xp->xb_pkt_flags & SD_XB_INITPKT_MASK);
13697 
13698 	/*
13699 	 * sd_setup_rw_pkt will determine the appropriate CDB group to use,
13700 	 * call scsi_init_pkt, and build the CDB.
13701 	 */
13702 	rval = sd_setup_rw_pkt(un, &pktp, bp,
13703 	    cmd_flags, sdrunout, (caddr_t)un,
13704 	    startblock, blockcount);
13705 
13706 	if (rval == 0) {
13707 		/*
13708 		 * Success.
13709 		 *
13710 		 * If partial DMA is being used and required for this transfer.
13711 		 * set it up here.
13712 		 */
13713 		if ((un->un_pkt_flags & PKT_DMA_PARTIAL) != 0 &&
13714 		    (pktp->pkt_resid != 0)) {
13715 
13716 			/*
13717 			 * Save the CDB length and pkt_resid for the
13718 			 * next xfer
13719 			 */
13720 			xp->xb_dma_resid = pktp->pkt_resid;
13721 
13722 			/* rezero resid */
13723 			pktp->pkt_resid = 0;
13724 
13725 		} else {
13726 			xp->xb_dma_resid = 0;
13727 		}
13728 
13729 		pktp->pkt_flags = un->un_tagflags;
13730 		pktp->pkt_time  = un->un_cmd_timeout;
13731 		pktp->pkt_comp  = sdintr;
13732 
13733 		pktp->pkt_private = bp;
13734 		*pktpp = pktp;
13735 
13736 		SD_TRACE(SD_LOG_IO_CORE, un,
13737 		    "sd_initpkt_for_buf: exit: buf:0x%p\n", bp);
13738 
13739 #if defined(__i386) || defined(__amd64)	/* DMAFREE for x86 only */
13740 		xp->xb_pkt_flags &= ~SD_XB_DMA_FREED;
13741 #endif
13742 
13743 		mutex_enter(SD_MUTEX(un));
13744 		return (SD_PKT_ALLOC_SUCCESS);
13745 
13746 	}
13747 
13748 	/*
13749 	 * SD_PKT_ALLOC_FAILURE is the only expected failure code
13750 	 * from sd_setup_rw_pkt.
13751 	 */
13752 	ASSERT(rval == SD_PKT_ALLOC_FAILURE);
13753 
13754 	if (rval == SD_PKT_ALLOC_FAILURE) {
13755 		*pktpp = NULL;
13756 		/*
13757 		 * Set the driver state to RWAIT to indicate the driver
13758 		 * is waiting on resource allocations. The driver will not
13759 		 * suspend, pm_suspend, or detatch while the state is RWAIT.
13760 		 */
13761 		mutex_enter(SD_MUTEX(un));
13762 		New_state(un, SD_STATE_RWAIT);
13763 
13764 		SD_ERROR(SD_LOG_IO_CORE, un,
13765 		    "sd_initpkt_for_buf: No pktp. exit bp:0x%p\n", bp);
13766 
13767 		if ((bp->b_flags & B_ERROR) != 0) {
13768 			return (SD_PKT_ALLOC_FAILURE_NO_DMA);
13769 		}
13770 		return (SD_PKT_ALLOC_FAILURE);
13771 	} else {
13772 		/*
13773 		 * PKT_ALLOC_FAILURE_CDB_TOO_SMALL
13774 		 *
13775 		 * This should never happen.  Maybe someone messed with the
13776 		 * kernel's minphys?
13777 		 */
13778 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
13779 		    "Request rejected: too large for CDB: "
13780 		    "lba:0x%08lx  len:0x%08lx\n", startblock, blockcount);
13781 		SD_ERROR(SD_LOG_IO_CORE, un,
13782 		    "sd_initpkt_for_buf: No cp. exit bp:0x%p\n", bp);
13783 		mutex_enter(SD_MUTEX(un));
13784 		return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL);
13785 
13786 	}
13787 }
13788 
13789 
13790 /*
13791  *    Function: sd_destroypkt_for_buf
13792  *
13793  * Description: Free the scsi_pkt(9S) for the given bp (buf IO processing).
13794  *
13795  *     Context: Kernel thread or interrupt context
13796  */
13797 
13798 static void
13799 sd_destroypkt_for_buf(struct buf *bp)
13800 {
13801 	ASSERT(bp != NULL);
13802 	ASSERT(SD_GET_UN(bp) != NULL);
13803 
13804 	SD_TRACE(SD_LOG_IO_CORE, SD_GET_UN(bp),
13805 	    "sd_destroypkt_for_buf: entry: buf:0x%p\n", bp);
13806 
13807 	ASSERT(SD_GET_PKTP(bp) != NULL);
13808 	scsi_destroy_pkt(SD_GET_PKTP(bp));
13809 
13810 	SD_TRACE(SD_LOG_IO_CORE, SD_GET_UN(bp),
13811 	    "sd_destroypkt_for_buf: exit: buf:0x%p\n", bp);
13812 }
13813 
13814 /*
13815  *    Function: sd_setup_rw_pkt
13816  *
13817  * Description: Determines appropriate CDB group for the requested LBA
13818  *		and transfer length, calls scsi_init_pkt, and builds
13819  *		the CDB.  Do not use for partial DMA transfers except
13820  *		for the initial transfer since the CDB size must
13821  *		remain constant.
13822  *
13823  *     Context: Kernel thread and may be called from software interrupt
13824  *		context as part of a sdrunout callback. This function may not
13825  *		block or call routines that block
13826  */
13827 
13828 
13829 int
13830 sd_setup_rw_pkt(struct sd_lun *un,
13831     struct scsi_pkt **pktpp, struct buf *bp, int flags,
13832     int (*callback)(caddr_t), caddr_t callback_arg,
13833     diskaddr_t lba, uint32_t blockcount)
13834 {
13835 	struct scsi_pkt *return_pktp;
13836 	union scsi_cdb *cdbp;
13837 	struct sd_cdbinfo *cp = NULL;
13838 	int i;
13839 
13840 	/*
13841 	 * See which size CDB to use, based upon the request.
13842 	 */
13843 	for (i = un->un_mincdb; i <= un->un_maxcdb; i++) {
13844 
13845 		/*
13846 		 * Check lba and block count against sd_cdbtab limits.
13847 		 * In the partial DMA case, we have to use the same size
13848 		 * CDB for all the transfers.  Check lba + blockcount
13849 		 * against the max LBA so we know that segment of the
13850 		 * transfer can use the CDB we select.
13851 		 */
13852 		if ((lba + blockcount - 1 <= sd_cdbtab[i].sc_maxlba) &&
13853 		    (blockcount <= sd_cdbtab[i].sc_maxlen)) {
13854 
13855 			/*
13856 			 * The command will fit into the CDB type
13857 			 * specified by sd_cdbtab[i].
13858 			 */
13859 			cp = sd_cdbtab + i;
13860 
13861 			/*
13862 			 * Call scsi_init_pkt so we can fill in the
13863 			 * CDB.
13864 			 */
13865 			return_pktp = scsi_init_pkt(SD_ADDRESS(un), *pktpp,
13866 			    bp, cp->sc_grpcode, un->un_status_len, 0,
13867 			    flags, callback, callback_arg);
13868 
13869 			if (return_pktp != NULL) {
13870 
13871 				/*
13872 				 * Return new value of pkt
13873 				 */
13874 				*pktpp = return_pktp;
13875 
13876 				/*
13877 				 * To be safe, zero the CDB insuring there is
13878 				 * no leftover data from a previous command.
13879 				 */
13880 				bzero(return_pktp->pkt_cdbp, cp->sc_grpcode);
13881 
13882 				/*
13883 				 * Handle partial DMA mapping
13884 				 */
13885 				if (return_pktp->pkt_resid != 0) {
13886 
13887 					/*
13888 					 * Not going to xfer as many blocks as
13889 					 * originally expected
13890 					 */
13891 					blockcount -=
13892 					    SD_BYTES2TGTBLOCKS(un,
13893 					    return_pktp->pkt_resid);
13894 				}
13895 
13896 				cdbp = (union scsi_cdb *)return_pktp->pkt_cdbp;
13897 
13898 				/*
13899 				 * Set command byte based on the CDB
13900 				 * type we matched.
13901 				 */
13902 				cdbp->scc_cmd = cp->sc_grpmask |
13903 				    ((bp->b_flags & B_READ) ?
13904 				    SCMD_READ : SCMD_WRITE);
13905 
13906 				SD_FILL_SCSI1_LUN(un, return_pktp);
13907 
13908 				/*
13909 				 * Fill in LBA and length
13910 				 */
13911 				ASSERT((cp->sc_grpcode == CDB_GROUP1) ||
13912 				    (cp->sc_grpcode == CDB_GROUP4) ||
13913 				    (cp->sc_grpcode == CDB_GROUP0) ||
13914 				    (cp->sc_grpcode == CDB_GROUP5));
13915 
13916 				if (cp->sc_grpcode == CDB_GROUP1) {
13917 					FORMG1ADDR(cdbp, lba);
13918 					FORMG1COUNT(cdbp, blockcount);
13919 					return (0);
13920 				} else if (cp->sc_grpcode == CDB_GROUP4) {
13921 					FORMG4LONGADDR(cdbp, lba);
13922 					FORMG4COUNT(cdbp, blockcount);
13923 					return (0);
13924 				} else if (cp->sc_grpcode == CDB_GROUP0) {
13925 					FORMG0ADDR(cdbp, lba);
13926 					FORMG0COUNT(cdbp, blockcount);
13927 					return (0);
13928 				} else if (cp->sc_grpcode == CDB_GROUP5) {
13929 					FORMG5ADDR(cdbp, lba);
13930 					FORMG5COUNT(cdbp, blockcount);
13931 					return (0);
13932 				}
13933 
13934 				/*
13935 				 * It should be impossible to not match one
13936 				 * of the CDB types above, so we should never
13937 				 * reach this point.  Set the CDB command byte
13938 				 * to test-unit-ready to avoid writing
13939 				 * to somewhere we don't intend.
13940 				 */
13941 				cdbp->scc_cmd = SCMD_TEST_UNIT_READY;
13942 				return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL);
13943 			} else {
13944 				/*
13945 				 * Couldn't get scsi_pkt
13946 				 */
13947 				return (SD_PKT_ALLOC_FAILURE);
13948 			}
13949 		}
13950 	}
13951 
13952 	/*
13953 	 * None of the available CDB types were suitable.  This really
13954 	 * should never happen:  on a 64 bit system we support
13955 	 * READ16/WRITE16 which will hold an entire 64 bit disk address
13956 	 * and on a 32 bit system we will refuse to bind to a device
13957 	 * larger than 2TB so addresses will never be larger than 32 bits.
13958 	 */
13959 	return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL);
13960 }
13961 
13962 /*
13963  *    Function: sd_setup_next_rw_pkt
13964  *
13965  * Description: Setup packet for partial DMA transfers, except for the
13966  * 		initial transfer.  sd_setup_rw_pkt should be used for
13967  *		the initial transfer.
13968  *
13969  *     Context: Kernel thread and may be called from interrupt context.
13970  */
13971 
13972 int
13973 sd_setup_next_rw_pkt(struct sd_lun *un,
13974     struct scsi_pkt *pktp, struct buf *bp,
13975     diskaddr_t lba, uint32_t blockcount)
13976 {
13977 	uchar_t com;
13978 	union scsi_cdb *cdbp;
13979 	uchar_t cdb_group_id;
13980 
13981 	ASSERT(pktp != NULL);
13982 	ASSERT(pktp->pkt_cdbp != NULL);
13983 
13984 	cdbp = (union scsi_cdb *)pktp->pkt_cdbp;
13985 	com = cdbp->scc_cmd;
13986 	cdb_group_id = CDB_GROUPID(com);
13987 
13988 	ASSERT((cdb_group_id == CDB_GROUPID_0) ||
13989 	    (cdb_group_id == CDB_GROUPID_1) ||
13990 	    (cdb_group_id == CDB_GROUPID_4) ||
13991 	    (cdb_group_id == CDB_GROUPID_5));
13992 
13993 	/*
13994 	 * Move pkt to the next portion of the xfer.
13995 	 * func is NULL_FUNC so we do not have to release
13996 	 * the disk mutex here.
13997 	 */
13998 	if (scsi_init_pkt(SD_ADDRESS(un), pktp, bp, 0, 0, 0, 0,
13999 	    NULL_FUNC, NULL) == pktp) {
14000 		/* Success.  Handle partial DMA */
14001 		if (pktp->pkt_resid != 0) {
14002 			blockcount -=
14003 			    SD_BYTES2TGTBLOCKS(un, pktp->pkt_resid);
14004 		}
14005 
14006 		cdbp->scc_cmd = com;
14007 		SD_FILL_SCSI1_LUN(un, pktp);
14008 		if (cdb_group_id == CDB_GROUPID_1) {
14009 			FORMG1ADDR(cdbp, lba);
14010 			FORMG1COUNT(cdbp, blockcount);
14011 			return (0);
14012 		} else if (cdb_group_id == CDB_GROUPID_4) {
14013 			FORMG4LONGADDR(cdbp, lba);
14014 			FORMG4COUNT(cdbp, blockcount);
14015 			return (0);
14016 		} else if (cdb_group_id == CDB_GROUPID_0) {
14017 			FORMG0ADDR(cdbp, lba);
14018 			FORMG0COUNT(cdbp, blockcount);
14019 			return (0);
14020 		} else if (cdb_group_id == CDB_GROUPID_5) {
14021 			FORMG5ADDR(cdbp, lba);
14022 			FORMG5COUNT(cdbp, blockcount);
14023 			return (0);
14024 		}
14025 
14026 		/* Unreachable */
14027 		return (SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL);
14028 	}
14029 
14030 	/*
14031 	 * Error setting up next portion of cmd transfer.
14032 	 * Something is definitely very wrong and this
14033 	 * should not happen.
14034 	 */
14035 	return (SD_PKT_ALLOC_FAILURE);
14036 }
14037 
14038 /*
14039  *    Function: sd_initpkt_for_uscsi
14040  *
14041  * Description: Allocate and initialize for transport a scsi_pkt struct,
14042  *		based upon the info specified in the given uscsi_cmd struct.
14043  *
14044  * Return Code: SD_PKT_ALLOC_SUCCESS
14045  *		SD_PKT_ALLOC_FAILURE
14046  *		SD_PKT_ALLOC_FAILURE_NO_DMA
14047  *		SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL
14048  *
14049  *     Context: Kernel thread and may be called from software interrupt context
14050  *		as part of a sdrunout callback. This function may not block or
14051  *		call routines that block
14052  */
14053 
14054 static int
14055 sd_initpkt_for_uscsi(struct buf *bp, struct scsi_pkt **pktpp)
14056 {
14057 	struct uscsi_cmd *uscmd;
14058 	struct sd_xbuf	*xp;
14059 	struct scsi_pkt	*pktp;
14060 	struct sd_lun	*un;
14061 	uint32_t	flags = 0;
14062 
14063 	ASSERT(bp != NULL);
14064 	ASSERT(pktpp != NULL);
14065 	xp = SD_GET_XBUF(bp);
14066 	ASSERT(xp != NULL);
14067 	un = SD_GET_UN(bp);
14068 	ASSERT(un != NULL);
14069 	ASSERT(mutex_owned(SD_MUTEX(un)));
14070 
14071 	/* The pointer to the uscsi_cmd struct is expected in xb_pktinfo */
14072 	uscmd = (struct uscsi_cmd *)xp->xb_pktinfo;
14073 	ASSERT(uscmd != NULL);
14074 
14075 	SD_TRACE(SD_LOG_IO_CORE, un,
14076 	    "sd_initpkt_for_uscsi: entry: buf:0x%p\n", bp);
14077 
14078 	/*
14079 	 * Allocate the scsi_pkt for the command.
14080 	 * Note: If PKT_DMA_PARTIAL flag is set, scsi_vhci binds a path
14081 	 *	 during scsi_init_pkt time and will continue to use the
14082 	 *	 same path as long as the same scsi_pkt is used without
14083 	 *	 intervening scsi_dma_free(). Since uscsi command does
14084 	 *	 not call scsi_dmafree() before retry failed command, it
14085 	 *	 is necessary to make sure PKT_DMA_PARTIAL flag is NOT
14086 	 *	 set such that scsi_vhci can use other available path for
14087 	 *	 retry. Besides, ucsci command does not allow DMA breakup,
14088 	 *	 so there is no need to set PKT_DMA_PARTIAL flag.
14089 	 */
14090 	if (uscmd->uscsi_rqlen > SENSE_LENGTH) {
14091 		pktp = scsi_init_pkt(SD_ADDRESS(un), NULL,
14092 		    ((bp->b_bcount != 0) ? bp : NULL), uscmd->uscsi_cdblen,
14093 		    ((int)(uscmd->uscsi_rqlen) + sizeof (struct scsi_arq_status)
14094 		    - sizeof (struct scsi_extended_sense)), 0,
14095 		    (un->un_pkt_flags & ~PKT_DMA_PARTIAL) | PKT_XARQ,
14096 		    sdrunout, (caddr_t)un);
14097 	} else {
14098 		pktp = scsi_init_pkt(SD_ADDRESS(un), NULL,
14099 		    ((bp->b_bcount != 0) ? bp : NULL), uscmd->uscsi_cdblen,
14100 		    sizeof (struct scsi_arq_status), 0,
14101 		    (un->un_pkt_flags & ~PKT_DMA_PARTIAL),
14102 		    sdrunout, (caddr_t)un);
14103 	}
14104 
14105 	if (pktp == NULL) {
14106 		*pktpp = NULL;
14107 		/*
14108 		 * Set the driver state to RWAIT to indicate the driver
14109 		 * is waiting on resource allocations. The driver will not
14110 		 * suspend, pm_suspend, or detatch while the state is RWAIT.
14111 		 */
14112 		New_state(un, SD_STATE_RWAIT);
14113 
14114 		SD_ERROR(SD_LOG_IO_CORE, un,
14115 		    "sd_initpkt_for_uscsi: No pktp. exit bp:0x%p\n", bp);
14116 
14117 		if ((bp->b_flags & B_ERROR) != 0) {
14118 			return (SD_PKT_ALLOC_FAILURE_NO_DMA);
14119 		}
14120 		return (SD_PKT_ALLOC_FAILURE);
14121 	}
14122 
14123 	/*
14124 	 * We do not do DMA breakup for USCSI commands, so return failure
14125 	 * here if all the needed DMA resources were not allocated.
14126 	 */
14127 	if ((un->un_pkt_flags & PKT_DMA_PARTIAL) &&
14128 	    (bp->b_bcount != 0) && (pktp->pkt_resid != 0)) {
14129 		scsi_destroy_pkt(pktp);
14130 		SD_ERROR(SD_LOG_IO_CORE, un, "sd_initpkt_for_uscsi: "
14131 		    "No partial DMA for USCSI. exit: buf:0x%p\n", bp);
14132 		return (SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL);
14133 	}
14134 
14135 	/* Init the cdb from the given uscsi struct */
14136 	(void) scsi_setup_cdb((union scsi_cdb *)pktp->pkt_cdbp,
14137 	    uscmd->uscsi_cdb[0], 0, 0, 0);
14138 
14139 	SD_FILL_SCSI1_LUN(un, pktp);
14140 
14141 	/*
14142 	 * Set up the optional USCSI flags. See the uscsi (7I) man page
14143 	 * for listing of the supported flags.
14144 	 */
14145 
14146 	if (uscmd->uscsi_flags & USCSI_SILENT) {
14147 		flags |= FLAG_SILENT;
14148 	}
14149 
14150 	if (uscmd->uscsi_flags & USCSI_DIAGNOSE) {
14151 		flags |= FLAG_DIAGNOSE;
14152 	}
14153 
14154 	if (uscmd->uscsi_flags & USCSI_ISOLATE) {
14155 		flags |= FLAG_ISOLATE;
14156 	}
14157 
14158 	if (un->un_f_is_fibre == FALSE) {
14159 		if (uscmd->uscsi_flags & USCSI_RENEGOT) {
14160 			flags |= FLAG_RENEGOTIATE_WIDE_SYNC;
14161 		}
14162 	}
14163 
14164 	/*
14165 	 * Set the pkt flags here so we save time later.
14166 	 * Note: These flags are NOT in the uscsi man page!!!
14167 	 */
14168 	if (uscmd->uscsi_flags & USCSI_HEAD) {
14169 		flags |= FLAG_HEAD;
14170 	}
14171 
14172 	if (uscmd->uscsi_flags & USCSI_NOINTR) {
14173 		flags |= FLAG_NOINTR;
14174 	}
14175 
14176 	/*
14177 	 * For tagged queueing, things get a bit complicated.
14178 	 * Check first for head of queue and last for ordered queue.
14179 	 * If neither head nor order, use the default driver tag flags.
14180 	 */
14181 	if ((uscmd->uscsi_flags & USCSI_NOTAG) == 0) {
14182 		if (uscmd->uscsi_flags & USCSI_HTAG) {
14183 			flags |= FLAG_HTAG;
14184 		} else if (uscmd->uscsi_flags & USCSI_OTAG) {
14185 			flags |= FLAG_OTAG;
14186 		} else {
14187 			flags |= un->un_tagflags & FLAG_TAGMASK;
14188 		}
14189 	}
14190 
14191 	if (uscmd->uscsi_flags & USCSI_NODISCON) {
14192 		flags = (flags & ~FLAG_TAGMASK) | FLAG_NODISCON;
14193 	}
14194 
14195 	pktp->pkt_flags = flags;
14196 
14197 	/* Transfer uscsi information to scsi_pkt */
14198 	(void) scsi_uscsi_pktinit(uscmd, pktp);
14199 
14200 	/* Copy the caller's CDB into the pkt... */
14201 	bcopy(uscmd->uscsi_cdb, pktp->pkt_cdbp, uscmd->uscsi_cdblen);
14202 
14203 	if (uscmd->uscsi_timeout == 0) {
14204 		pktp->pkt_time = un->un_uscsi_timeout;
14205 	} else {
14206 		pktp->pkt_time = uscmd->uscsi_timeout;
14207 	}
14208 
14209 	/* need it later to identify USCSI request in sdintr */
14210 	xp->xb_pkt_flags |= SD_XB_USCSICMD;
14211 
14212 	xp->xb_sense_resid = uscmd->uscsi_rqresid;
14213 
14214 	pktp->pkt_private = bp;
14215 	pktp->pkt_comp = sdintr;
14216 	*pktpp = pktp;
14217 
14218 	SD_TRACE(SD_LOG_IO_CORE, un,
14219 	    "sd_initpkt_for_uscsi: exit: buf:0x%p\n", bp);
14220 
14221 	return (SD_PKT_ALLOC_SUCCESS);
14222 }
14223 
14224 
14225 /*
14226  *    Function: sd_destroypkt_for_uscsi
14227  *
14228  * Description: Free the scsi_pkt(9S) struct for the given bp, for uscsi
14229  *		IOs.. Also saves relevant info into the associated uscsi_cmd
14230  *		struct.
14231  *
14232  *     Context: May be called under interrupt context
14233  */
14234 
14235 static void
14236 sd_destroypkt_for_uscsi(struct buf *bp)
14237 {
14238 	struct uscsi_cmd *uscmd;
14239 	struct sd_xbuf	*xp;
14240 	struct scsi_pkt	*pktp;
14241 	struct sd_lun	*un;
14242 	struct sd_uscsi_info *suip;
14243 
14244 	ASSERT(bp != NULL);
14245 	xp = SD_GET_XBUF(bp);
14246 	ASSERT(xp != NULL);
14247 	un = SD_GET_UN(bp);
14248 	ASSERT(un != NULL);
14249 	ASSERT(!mutex_owned(SD_MUTEX(un)));
14250 	pktp = SD_GET_PKTP(bp);
14251 	ASSERT(pktp != NULL);
14252 
14253 	SD_TRACE(SD_LOG_IO_CORE, un,
14254 	    "sd_destroypkt_for_uscsi: entry: buf:0x%p\n", bp);
14255 
14256 	/* The pointer to the uscsi_cmd struct is expected in xb_pktinfo */
14257 	uscmd = (struct uscsi_cmd *)xp->xb_pktinfo;
14258 	ASSERT(uscmd != NULL);
14259 
14260 	/* Save the status and the residual into the uscsi_cmd struct */
14261 	uscmd->uscsi_status = ((*(pktp)->pkt_scbp) & STATUS_MASK);
14262 	uscmd->uscsi_resid  = bp->b_resid;
14263 
14264 	/* Transfer scsi_pkt information to uscsi */
14265 	(void) scsi_uscsi_pktfini(pktp, uscmd);
14266 
14267 	/*
14268 	 * If enabled, copy any saved sense data into the area specified
14269 	 * by the uscsi command.
14270 	 */
14271 	if (((uscmd->uscsi_flags & USCSI_RQENABLE) != 0) &&
14272 	    (uscmd->uscsi_rqlen != 0) && (uscmd->uscsi_rqbuf != NULL)) {
14273 		/*
14274 		 * Note: uscmd->uscsi_rqbuf should always point to a buffer
14275 		 * at least SENSE_LENGTH bytes in size (see sd_send_scsi_cmd())
14276 		 */
14277 		uscmd->uscsi_rqstatus = xp->xb_sense_status;
14278 		uscmd->uscsi_rqresid  = xp->xb_sense_resid;
14279 		if (uscmd->uscsi_rqlen > SENSE_LENGTH) {
14280 			bcopy(xp->xb_sense_data, uscmd->uscsi_rqbuf,
14281 			    MAX_SENSE_LENGTH);
14282 		} else {
14283 			bcopy(xp->xb_sense_data, uscmd->uscsi_rqbuf,
14284 			    SENSE_LENGTH);
14285 		}
14286 	}
14287 	/*
14288 	 * The following assignments are for SCSI FMA.
14289 	 */
14290 	ASSERT(xp->xb_private != NULL);
14291 	suip = (struct sd_uscsi_info *)xp->xb_private;
14292 	suip->ui_pkt_reason = pktp->pkt_reason;
14293 	suip->ui_pkt_state = pktp->pkt_state;
14294 	suip->ui_pkt_statistics = pktp->pkt_statistics;
14295 	suip->ui_lba = (uint64_t)SD_GET_BLKNO(bp);
14296 
14297 	/* We are done with the scsi_pkt; free it now */
14298 	ASSERT(SD_GET_PKTP(bp) != NULL);
14299 	scsi_destroy_pkt(SD_GET_PKTP(bp));
14300 
14301 	SD_TRACE(SD_LOG_IO_CORE, un,
14302 	    "sd_destroypkt_for_uscsi: exit: buf:0x%p\n", bp);
14303 }
14304 
14305 
14306 /*
14307  *    Function: sd_bioclone_alloc
14308  *
14309  * Description: Allocate a buf(9S) and init it as per the given buf
14310  *		and the various arguments.  The associated sd_xbuf
14311  *		struct is (nearly) duplicated.  The struct buf *bp
14312  *		argument is saved in new_xp->xb_private.
14313  *
14314  *   Arguments: bp - ptr the the buf(9S) to be "shadowed"
14315  *		datalen - size of data area for the shadow bp
14316  *		blkno - starting LBA
14317  *		func - function pointer for b_iodone in the shadow buf. (May
14318  *			be NULL if none.)
14319  *
14320  * Return Code: Pointer to allocates buf(9S) struct
14321  *
14322  *     Context: Can sleep.
14323  */
14324 
14325 static struct buf *
14326 sd_bioclone_alloc(struct buf *bp, size_t datalen, daddr_t blkno,
14327     int (*func)(struct buf *))
14328 {
14329 	struct	sd_lun	*un;
14330 	struct	sd_xbuf	*xp;
14331 	struct	sd_xbuf	*new_xp;
14332 	struct	buf	*new_bp;
14333 
14334 	ASSERT(bp != NULL);
14335 	xp = SD_GET_XBUF(bp);
14336 	ASSERT(xp != NULL);
14337 	un = SD_GET_UN(bp);
14338 	ASSERT(un != NULL);
14339 	ASSERT(!mutex_owned(SD_MUTEX(un)));
14340 
14341 	new_bp = bioclone(bp, 0, datalen, SD_GET_DEV(un), blkno, func,
14342 	    NULL, KM_SLEEP);
14343 
14344 	new_bp->b_lblkno	= blkno;
14345 
14346 	/*
14347 	 * Allocate an xbuf for the shadow bp and copy the contents of the
14348 	 * original xbuf into it.
14349 	 */
14350 	new_xp = kmem_alloc(sizeof (struct sd_xbuf), KM_SLEEP);
14351 	bcopy(xp, new_xp, sizeof (struct sd_xbuf));
14352 
14353 	/*
14354 	 * The given bp is automatically saved in the xb_private member
14355 	 * of the new xbuf.  Callers are allowed to depend on this.
14356 	 */
14357 	new_xp->xb_private = bp;
14358 
14359 	new_bp->b_private  = new_xp;
14360 
14361 	return (new_bp);
14362 }
14363 
14364 /*
14365  *    Function: sd_shadow_buf_alloc
14366  *
14367  * Description: Allocate a buf(9S) and init it as per the given buf
14368  *		and the various arguments.  The associated sd_xbuf
14369  *		struct is (nearly) duplicated.  The struct buf *bp
14370  *		argument is saved in new_xp->xb_private.
14371  *
14372  *   Arguments: bp - ptr the the buf(9S) to be "shadowed"
14373  *		datalen - size of data area for the shadow bp
14374  *		bflags - B_READ or B_WRITE (pseudo flag)
14375  *		blkno - starting LBA
14376  *		func - function pointer for b_iodone in the shadow buf. (May
14377  *			be NULL if none.)
14378  *
14379  * Return Code: Pointer to allocates buf(9S) struct
14380  *
14381  *     Context: Can sleep.
14382  */
14383 
14384 static struct buf *
14385 sd_shadow_buf_alloc(struct buf *bp, size_t datalen, uint_t bflags,
14386     daddr_t blkno, int (*func)(struct buf *))
14387 {
14388 	struct	sd_lun	*un;
14389 	struct	sd_xbuf	*xp;
14390 	struct	sd_xbuf	*new_xp;
14391 	struct	buf	*new_bp;
14392 
14393 	ASSERT(bp != NULL);
14394 	xp = SD_GET_XBUF(bp);
14395 	ASSERT(xp != NULL);
14396 	un = SD_GET_UN(bp);
14397 	ASSERT(un != NULL);
14398 	ASSERT(!mutex_owned(SD_MUTEX(un)));
14399 
14400 	if (bp->b_flags & (B_PAGEIO | B_PHYS)) {
14401 		bp_mapin(bp);
14402 	}
14403 
14404 	bflags &= (B_READ | B_WRITE);
14405 #if defined(__i386) || defined(__amd64)
14406 	new_bp = getrbuf(KM_SLEEP);
14407 	new_bp->b_un.b_addr = kmem_zalloc(datalen, KM_SLEEP);
14408 	new_bp->b_bcount = datalen;
14409 	new_bp->b_flags = bflags |
14410 	    (bp->b_flags & ~(B_PAGEIO | B_PHYS | B_REMAPPED | B_SHADOW));
14411 #else
14412 	new_bp = scsi_alloc_consistent_buf(SD_ADDRESS(un), NULL,
14413 	    datalen, bflags, SLEEP_FUNC, NULL);
14414 #endif
14415 	new_bp->av_forw	= NULL;
14416 	new_bp->av_back	= NULL;
14417 	new_bp->b_dev	= bp->b_dev;
14418 	new_bp->b_blkno	= blkno;
14419 	new_bp->b_iodone = func;
14420 	new_bp->b_edev	= bp->b_edev;
14421 	new_bp->b_resid	= 0;
14422 
14423 	/* We need to preserve the B_FAILFAST flag */
14424 	if (bp->b_flags & B_FAILFAST) {
14425 		new_bp->b_flags |= B_FAILFAST;
14426 	}
14427 
14428 	/*
14429 	 * Allocate an xbuf for the shadow bp and copy the contents of the
14430 	 * original xbuf into it.
14431 	 */
14432 	new_xp = kmem_alloc(sizeof (struct sd_xbuf), KM_SLEEP);
14433 	bcopy(xp, new_xp, sizeof (struct sd_xbuf));
14434 
14435 	/* Need later to copy data between the shadow buf & original buf! */
14436 	new_xp->xb_pkt_flags |= PKT_CONSISTENT;
14437 
14438 	/*
14439 	 * The given bp is automatically saved in the xb_private member
14440 	 * of the new xbuf.  Callers are allowed to depend on this.
14441 	 */
14442 	new_xp->xb_private = bp;
14443 
14444 	new_bp->b_private  = new_xp;
14445 
14446 	return (new_bp);
14447 }
14448 
14449 /*
14450  *    Function: sd_bioclone_free
14451  *
14452  * Description: Deallocate a buf(9S) that was used for 'shadow' IO operations
14453  *		in the larger than partition operation.
14454  *
14455  *     Context: May be called under interrupt context
14456  */
14457 
14458 static void
14459 sd_bioclone_free(struct buf *bp)
14460 {
14461 	struct sd_xbuf	*xp;
14462 
14463 	ASSERT(bp != NULL);
14464 	xp = SD_GET_XBUF(bp);
14465 	ASSERT(xp != NULL);
14466 
14467 	/*
14468 	 * Call bp_mapout() before freeing the buf,  in case a lower
14469 	 * layer or HBA  had done a bp_mapin().  we must do this here
14470 	 * as we are the "originator" of the shadow buf.
14471 	 */
14472 	bp_mapout(bp);
14473 
14474 	/*
14475 	 * Null out b_iodone before freeing the bp, to ensure that the driver
14476 	 * never gets confused by a stale value in this field. (Just a little
14477 	 * extra defensiveness here.)
14478 	 */
14479 	bp->b_iodone = NULL;
14480 
14481 	freerbuf(bp);
14482 
14483 	kmem_free(xp, sizeof (struct sd_xbuf));
14484 }
14485 
14486 /*
14487  *    Function: sd_shadow_buf_free
14488  *
14489  * Description: Deallocate a buf(9S) that was used for 'shadow' IO operations.
14490  *
14491  *     Context: May be called under interrupt context
14492  */
14493 
14494 static void
14495 sd_shadow_buf_free(struct buf *bp)
14496 {
14497 	struct sd_xbuf	*xp;
14498 
14499 	ASSERT(bp != NULL);
14500 	xp = SD_GET_XBUF(bp);
14501 	ASSERT(xp != NULL);
14502 
14503 #if defined(__sparc)
14504 	/*
14505 	 * Call bp_mapout() before freeing the buf,  in case a lower
14506 	 * layer or HBA  had done a bp_mapin().  we must do this here
14507 	 * as we are the "originator" of the shadow buf.
14508 	 */
14509 	bp_mapout(bp);
14510 #endif
14511 
14512 	/*
14513 	 * Null out b_iodone before freeing the bp, to ensure that the driver
14514 	 * never gets confused by a stale value in this field. (Just a little
14515 	 * extra defensiveness here.)
14516 	 */
14517 	bp->b_iodone = NULL;
14518 
14519 #if defined(__i386) || defined(__amd64)
14520 	kmem_free(bp->b_un.b_addr, bp->b_bcount);
14521 	freerbuf(bp);
14522 #else
14523 	scsi_free_consistent_buf(bp);
14524 #endif
14525 
14526 	kmem_free(xp, sizeof (struct sd_xbuf));
14527 }
14528 
14529 
14530 /*
14531  *    Function: sd_print_transport_rejected_message
14532  *
14533  * Description: This implements the ludicrously complex rules for printing
14534  *		a "transport rejected" message.  This is to address the
14535  *		specific problem of having a flood of this error message
14536  *		produced when a failover occurs.
14537  *
14538  *     Context: Any.
14539  */
14540 
14541 static void
14542 sd_print_transport_rejected_message(struct sd_lun *un, struct sd_xbuf *xp,
14543     int code)
14544 {
14545 	ASSERT(un != NULL);
14546 	ASSERT(mutex_owned(SD_MUTEX(un)));
14547 	ASSERT(xp != NULL);
14548 
14549 	/*
14550 	 * Print the "transport rejected" message under the following
14551 	 * conditions:
14552 	 *
14553 	 * - Whenever the SD_LOGMASK_DIAG bit of sd_level_mask is set
14554 	 * - The error code from scsi_transport() is NOT a TRAN_FATAL_ERROR.
14555 	 * - If the error code IS a TRAN_FATAL_ERROR, then the message is
14556 	 *   printed the FIRST time a TRAN_FATAL_ERROR is returned from
14557 	 *   scsi_transport(9F) (which indicates that the target might have
14558 	 *   gone off-line).  This uses the un->un_tran_fatal_count
14559 	 *   count, which is incremented whenever a TRAN_FATAL_ERROR is
14560 	 *   received, and reset to zero whenver a TRAN_ACCEPT is returned
14561 	 *   from scsi_transport().
14562 	 *
14563 	 * The FLAG_SILENT in the scsi_pkt must be CLEARED in ALL of
14564 	 * the preceeding cases in order for the message to be printed.
14565 	 */
14566 	if (((xp->xb_pktp->pkt_flags & FLAG_SILENT) == 0) &&
14567 	    (SD_FM_LOG(un) == SD_FM_LOG_NSUP)) {
14568 		if ((sd_level_mask & SD_LOGMASK_DIAG) ||
14569 		    (code != TRAN_FATAL_ERROR) ||
14570 		    (un->un_tran_fatal_count == 1)) {
14571 			switch (code) {
14572 			case TRAN_BADPKT:
14573 				scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
14574 				    "transport rejected bad packet\n");
14575 				break;
14576 			case TRAN_FATAL_ERROR:
14577 				scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
14578 				    "transport rejected fatal error\n");
14579 				break;
14580 			default:
14581 				scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
14582 				    "transport rejected (%d)\n", code);
14583 				break;
14584 			}
14585 		}
14586 	}
14587 }
14588 
14589 
14590 /*
14591  *    Function: sd_add_buf_to_waitq
14592  *
14593  * Description: Add the given buf(9S) struct to the wait queue for the
14594  *		instance.  If sorting is enabled, then the buf is added
14595  *		to the queue via an elevator sort algorithm (a la
14596  *		disksort(9F)).  The SD_GET_BLKNO(bp) is used as the sort key.
14597  *		If sorting is not enabled, then the buf is just added
14598  *		to the end of the wait queue.
14599  *
14600  * Return Code: void
14601  *
14602  *     Context: Does not sleep/block, therefore technically can be called
14603  *		from any context.  However if sorting is enabled then the
14604  *		execution time is indeterminate, and may take long if
14605  *		the wait queue grows large.
14606  */
14607 
14608 static void
14609 sd_add_buf_to_waitq(struct sd_lun *un, struct buf *bp)
14610 {
14611 	struct buf *ap;
14612 
14613 	ASSERT(bp != NULL);
14614 	ASSERT(un != NULL);
14615 	ASSERT(mutex_owned(SD_MUTEX(un)));
14616 
14617 	/* If the queue is empty, add the buf as the only entry & return. */
14618 	if (un->un_waitq_headp == NULL) {
14619 		ASSERT(un->un_waitq_tailp == NULL);
14620 		un->un_waitq_headp = un->un_waitq_tailp = bp;
14621 		bp->av_forw = NULL;
14622 		return;
14623 	}
14624 
14625 	ASSERT(un->un_waitq_tailp != NULL);
14626 
14627 	/*
14628 	 * If sorting is disabled, just add the buf to the tail end of
14629 	 * the wait queue and return.
14630 	 */
14631 	if (un->un_f_disksort_disabled || un->un_f_enable_rmw) {
14632 		un->un_waitq_tailp->av_forw = bp;
14633 		un->un_waitq_tailp = bp;
14634 		bp->av_forw = NULL;
14635 		return;
14636 	}
14637 
14638 	/*
14639 	 * Sort thru the list of requests currently on the wait queue
14640 	 * and add the new buf request at the appropriate position.
14641 	 *
14642 	 * The un->un_waitq_headp is an activity chain pointer on which
14643 	 * we keep two queues, sorted in ascending SD_GET_BLKNO() order. The
14644 	 * first queue holds those requests which are positioned after
14645 	 * the current SD_GET_BLKNO() (in the first request); the second holds
14646 	 * requests which came in after their SD_GET_BLKNO() number was passed.
14647 	 * Thus we implement a one way scan, retracting after reaching
14648 	 * the end of the drive to the first request on the second
14649 	 * queue, at which time it becomes the first queue.
14650 	 * A one-way scan is natural because of the way UNIX read-ahead
14651 	 * blocks are allocated.
14652 	 *
14653 	 * If we lie after the first request, then we must locate the
14654 	 * second request list and add ourselves to it.
14655 	 */
14656 	ap = un->un_waitq_headp;
14657 	if (SD_GET_BLKNO(bp) < SD_GET_BLKNO(ap)) {
14658 		while (ap->av_forw != NULL) {
14659 			/*
14660 			 * Look for an "inversion" in the (normally
14661 			 * ascending) block numbers. This indicates
14662 			 * the start of the second request list.
14663 			 */
14664 			if (SD_GET_BLKNO(ap->av_forw) < SD_GET_BLKNO(ap)) {
14665 				/*
14666 				 * Search the second request list for the
14667 				 * first request at a larger block number.
14668 				 * We go before that; however if there is
14669 				 * no such request, we go at the end.
14670 				 */
14671 				do {
14672 					if (SD_GET_BLKNO(bp) <
14673 					    SD_GET_BLKNO(ap->av_forw)) {
14674 						goto insert;
14675 					}
14676 					ap = ap->av_forw;
14677 				} while (ap->av_forw != NULL);
14678 				goto insert;		/* after last */
14679 			}
14680 			ap = ap->av_forw;
14681 		}
14682 
14683 		/*
14684 		 * No inversions... we will go after the last, and
14685 		 * be the first request in the second request list.
14686 		 */
14687 		goto insert;
14688 	}
14689 
14690 	/*
14691 	 * Request is at/after the current request...
14692 	 * sort in the first request list.
14693 	 */
14694 	while (ap->av_forw != NULL) {
14695 		/*
14696 		 * We want to go after the current request (1) if
14697 		 * there is an inversion after it (i.e. it is the end
14698 		 * of the first request list), or (2) if the next
14699 		 * request is a larger block no. than our request.
14700 		 */
14701 		if ((SD_GET_BLKNO(ap->av_forw) < SD_GET_BLKNO(ap)) ||
14702 		    (SD_GET_BLKNO(bp) < SD_GET_BLKNO(ap->av_forw))) {
14703 			goto insert;
14704 		}
14705 		ap = ap->av_forw;
14706 	}
14707 
14708 	/*
14709 	 * Neither a second list nor a larger request, therefore
14710 	 * we go at the end of the first list (which is the same
14711 	 * as the end of the whole schebang).
14712 	 */
14713 insert:
14714 	bp->av_forw = ap->av_forw;
14715 	ap->av_forw = bp;
14716 
14717 	/*
14718 	 * If we inserted onto the tail end of the waitq, make sure the
14719 	 * tail pointer is updated.
14720 	 */
14721 	if (ap == un->un_waitq_tailp) {
14722 		un->un_waitq_tailp = bp;
14723 	}
14724 }
14725 
14726 
14727 /*
14728  *    Function: sd_start_cmds
14729  *
14730  * Description: Remove and transport cmds from the driver queues.
14731  *
14732  *   Arguments: un - pointer to the unit (soft state) struct for the target.
14733  *
14734  *		immed_bp - ptr to a buf to be transported immediately. Only
14735  *		the immed_bp is transported; bufs on the waitq are not
14736  *		processed and the un_retry_bp is not checked.  If immed_bp is
14737  *		NULL, then normal queue processing is performed.
14738  *
14739  *     Context: May be called from kernel thread context, interrupt context,
14740  *		or runout callback context. This function may not block or
14741  *		call routines that block.
14742  */
14743 
14744 static void
14745 sd_start_cmds(struct sd_lun *un, struct buf *immed_bp)
14746 {
14747 	struct	sd_xbuf	*xp;
14748 	struct	buf	*bp;
14749 	void	(*statp)(kstat_io_t *);
14750 #if defined(__i386) || defined(__amd64)	/* DMAFREE for x86 only */
14751 	void	(*saved_statp)(kstat_io_t *);
14752 #endif
14753 	int	rval;
14754 	struct sd_fm_internal *sfip = NULL;
14755 
14756 	ASSERT(un != NULL);
14757 	ASSERT(mutex_owned(SD_MUTEX(un)));
14758 	ASSERT(un->un_ncmds_in_transport >= 0);
14759 	ASSERT(un->un_throttle >= 0);
14760 
14761 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_start_cmds: entry\n");
14762 
14763 	do {
14764 #if defined(__i386) || defined(__amd64)	/* DMAFREE for x86 only */
14765 		saved_statp = NULL;
14766 #endif
14767 
14768 		/*
14769 		 * If we are syncing or dumping, fail the command to
14770 		 * avoid recursively calling back into scsi_transport().
14771 		 * The dump I/O itself uses a separate code path so this
14772 		 * only prevents non-dump I/O from being sent while dumping.
14773 		 * File system sync takes place before dumping begins.
14774 		 * During panic, filesystem I/O is allowed provided
14775 		 * un_in_callback is <= 1.  This is to prevent recursion
14776 		 * such as sd_start_cmds -> scsi_transport -> sdintr ->
14777 		 * sd_start_cmds and so on.  See panic.c for more information
14778 		 * about the states the system can be in during panic.
14779 		 */
14780 		if ((un->un_state == SD_STATE_DUMPING) ||
14781 		    (ddi_in_panic() && (un->un_in_callback > 1))) {
14782 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14783 			    "sd_start_cmds: panicking\n");
14784 			goto exit;
14785 		}
14786 
14787 		if ((bp = immed_bp) != NULL) {
14788 			/*
14789 			 * We have a bp that must be transported immediately.
14790 			 * It's OK to transport the immed_bp here without doing
14791 			 * the throttle limit check because the immed_bp is
14792 			 * always used in a retry/recovery case. This means
14793 			 * that we know we are not at the throttle limit by
14794 			 * virtue of the fact that to get here we must have
14795 			 * already gotten a command back via sdintr(). This also
14796 			 * relies on (1) the command on un_retry_bp preventing
14797 			 * further commands from the waitq from being issued;
14798 			 * and (2) the code in sd_retry_command checking the
14799 			 * throttle limit before issuing a delayed or immediate
14800 			 * retry. This holds even if the throttle limit is
14801 			 * currently ratcheted down from its maximum value.
14802 			 */
14803 			statp = kstat_runq_enter;
14804 			if (bp == un->un_retry_bp) {
14805 				ASSERT((un->un_retry_statp == NULL) ||
14806 				    (un->un_retry_statp == kstat_waitq_enter) ||
14807 				    (un->un_retry_statp ==
14808 				    kstat_runq_back_to_waitq));
14809 				/*
14810 				 * If the waitq kstat was incremented when
14811 				 * sd_set_retry_bp() queued this bp for a retry,
14812 				 * then we must set up statp so that the waitq
14813 				 * count will get decremented correctly below.
14814 				 * Also we must clear un->un_retry_statp to
14815 				 * ensure that we do not act on a stale value
14816 				 * in this field.
14817 				 */
14818 				if ((un->un_retry_statp == kstat_waitq_enter) ||
14819 				    (un->un_retry_statp ==
14820 				    kstat_runq_back_to_waitq)) {
14821 					statp = kstat_waitq_to_runq;
14822 				}
14823 #if defined(__i386) || defined(__amd64)	/* DMAFREE for x86 only */
14824 				saved_statp = un->un_retry_statp;
14825 #endif
14826 				un->un_retry_statp = NULL;
14827 
14828 				SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
14829 				    "sd_start_cmds: un:0x%p: GOT retry_bp:0x%p "
14830 				    "un_throttle:%d un_ncmds_in_transport:%d\n",
14831 				    un, un->un_retry_bp, un->un_throttle,
14832 				    un->un_ncmds_in_transport);
14833 			} else {
14834 				SD_TRACE(SD_LOG_IO_CORE, un, "sd_start_cmds: "
14835 				    "processing priority bp:0x%p\n", bp);
14836 			}
14837 
14838 		} else if ((bp = un->un_waitq_headp) != NULL) {
14839 			/*
14840 			 * A command on the waitq is ready to go, but do not
14841 			 * send it if:
14842 			 *
14843 			 * (1) the throttle limit has been reached, or
14844 			 * (2) a retry is pending, or
14845 			 * (3) a START_STOP_UNIT callback pending, or
14846 			 * (4) a callback for a SD_PATH_DIRECT_PRIORITY
14847 			 *	command is pending.
14848 			 *
14849 			 * For all of these conditions, IO processing will
14850 			 * restart after the condition is cleared.
14851 			 */
14852 			if (un->un_ncmds_in_transport >= un->un_throttle) {
14853 				SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14854 				    "sd_start_cmds: exiting, "
14855 				    "throttle limit reached!\n");
14856 				goto exit;
14857 			}
14858 			if (un->un_retry_bp != NULL) {
14859 				SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14860 				    "sd_start_cmds: exiting, retry pending!\n");
14861 				goto exit;
14862 			}
14863 			if (un->un_startstop_timeid != NULL) {
14864 				SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14865 				    "sd_start_cmds: exiting, "
14866 				    "START_STOP pending!\n");
14867 				goto exit;
14868 			}
14869 			if (un->un_direct_priority_timeid != NULL) {
14870 				SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14871 				    "sd_start_cmds: exiting, "
14872 				    "SD_PATH_DIRECT_PRIORITY cmd. pending!\n");
14873 				goto exit;
14874 			}
14875 
14876 			/* Dequeue the command */
14877 			un->un_waitq_headp = bp->av_forw;
14878 			if (un->un_waitq_headp == NULL) {
14879 				un->un_waitq_tailp = NULL;
14880 			}
14881 			bp->av_forw = NULL;
14882 			statp = kstat_waitq_to_runq;
14883 			SD_TRACE(SD_LOG_IO_CORE, un,
14884 			    "sd_start_cmds: processing waitq bp:0x%p\n", bp);
14885 
14886 		} else {
14887 			/* No work to do so bail out now */
14888 			SD_TRACE(SD_LOG_IO_CORE, un,
14889 			    "sd_start_cmds: no more work, exiting!\n");
14890 			goto exit;
14891 		}
14892 
14893 		/*
14894 		 * Reset the state to normal. This is the mechanism by which
14895 		 * the state transitions from either SD_STATE_RWAIT or
14896 		 * SD_STATE_OFFLINE to SD_STATE_NORMAL.
14897 		 * If state is SD_STATE_PM_CHANGING then this command is
14898 		 * part of the device power control and the state must
14899 		 * not be put back to normal. Doing so would would
14900 		 * allow new commands to proceed when they shouldn't,
14901 		 * the device may be going off.
14902 		 */
14903 		if ((un->un_state != SD_STATE_SUSPENDED) &&
14904 		    (un->un_state != SD_STATE_PM_CHANGING)) {
14905 			New_state(un, SD_STATE_NORMAL);
14906 		}
14907 
14908 		xp = SD_GET_XBUF(bp);
14909 		ASSERT(xp != NULL);
14910 
14911 #if defined(__i386) || defined(__amd64)	/* DMAFREE for x86 only */
14912 		/*
14913 		 * Allocate the scsi_pkt if we need one, or attach DMA
14914 		 * resources if we have a scsi_pkt that needs them. The
14915 		 * latter should only occur for commands that are being
14916 		 * retried.
14917 		 */
14918 		if ((xp->xb_pktp == NULL) ||
14919 		    ((xp->xb_pkt_flags & SD_XB_DMA_FREED) != 0)) {
14920 #else
14921 		if (xp->xb_pktp == NULL) {
14922 #endif
14923 			/*
14924 			 * There is no scsi_pkt allocated for this buf. Call
14925 			 * the initpkt function to allocate & init one.
14926 			 *
14927 			 * The scsi_init_pkt runout callback functionality is
14928 			 * implemented as follows:
14929 			 *
14930 			 * 1) The initpkt function always calls
14931 			 *    scsi_init_pkt(9F) with sdrunout specified as the
14932 			 *    callback routine.
14933 			 * 2) A successful packet allocation is initialized and
14934 			 *    the I/O is transported.
14935 			 * 3) The I/O associated with an allocation resource
14936 			 *    failure is left on its queue to be retried via
14937 			 *    runout or the next I/O.
14938 			 * 4) The I/O associated with a DMA error is removed
14939 			 *    from the queue and failed with EIO. Processing of
14940 			 *    the transport queues is also halted to be
14941 			 *    restarted via runout or the next I/O.
14942 			 * 5) The I/O associated with a CDB size or packet
14943 			 *    size error is removed from the queue and failed
14944 			 *    with EIO. Processing of the transport queues is
14945 			 *    continued.
14946 			 *
14947 			 * Note: there is no interface for canceling a runout
14948 			 * callback. To prevent the driver from detaching or
14949 			 * suspending while a runout is pending the driver
14950 			 * state is set to SD_STATE_RWAIT
14951 			 *
14952 			 * Note: using the scsi_init_pkt callback facility can
14953 			 * result in an I/O request persisting at the head of
14954 			 * the list which cannot be satisfied even after
14955 			 * multiple retries. In the future the driver may
14956 			 * implement some kind of maximum runout count before
14957 			 * failing an I/O.
14958 			 *
14959 			 * Note: the use of funcp below may seem superfluous,
14960 			 * but it helps warlock figure out the correct
14961 			 * initpkt function calls (see [s]sd.wlcmd).
14962 			 */
14963 			struct scsi_pkt	*pktp;
14964 			int (*funcp)(struct buf *bp, struct scsi_pkt **pktp);
14965 
14966 			ASSERT(bp != un->un_rqs_bp);
14967 
14968 			funcp = sd_initpkt_map[xp->xb_chain_iostart];
14969 			switch ((*funcp)(bp, &pktp)) {
14970 			case  SD_PKT_ALLOC_SUCCESS:
14971 				xp->xb_pktp = pktp;
14972 				SD_TRACE(SD_LOG_IO_CORE, un,
14973 				    "sd_start_cmd: SD_PKT_ALLOC_SUCCESS 0x%p\n",
14974 				    pktp);
14975 				goto got_pkt;
14976 
14977 			case SD_PKT_ALLOC_FAILURE:
14978 				/*
14979 				 * Temporary (hopefully) resource depletion.
14980 				 * Since retries and RQS commands always have a
14981 				 * scsi_pkt allocated, these cases should never
14982 				 * get here. So the only cases this needs to
14983 				 * handle is a bp from the waitq (which we put
14984 				 * back onto the waitq for sdrunout), or a bp
14985 				 * sent as an immed_bp (which we just fail).
14986 				 */
14987 				SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14988 				    "sd_start_cmds: SD_PKT_ALLOC_FAILURE\n");
14989 
14990 #if defined(__i386) || defined(__amd64)	/* DMAFREE for x86 only */
14991 
14992 				if (bp == immed_bp) {
14993 					/*
14994 					 * If SD_XB_DMA_FREED is clear, then
14995 					 * this is a failure to allocate a
14996 					 * scsi_pkt, and we must fail the
14997 					 * command.
14998 					 */
14999 					if ((xp->xb_pkt_flags &
15000 					    SD_XB_DMA_FREED) == 0) {
15001 						break;
15002 					}
15003 
15004 					/*
15005 					 * If this immediate command is NOT our
15006 					 * un_retry_bp, then we must fail it.
15007 					 */
15008 					if (bp != un->un_retry_bp) {
15009 						break;
15010 					}
15011 
15012 					/*
15013 					 * We get here if this cmd is our
15014 					 * un_retry_bp that was DMAFREED, but
15015 					 * scsi_init_pkt() failed to reallocate
15016 					 * DMA resources when we attempted to
15017 					 * retry it. This can happen when an
15018 					 * mpxio failover is in progress, but
15019 					 * we don't want to just fail the
15020 					 * command in this case.
15021 					 *
15022 					 * Use timeout(9F) to restart it after
15023 					 * a 100ms delay.  We don't want to
15024 					 * let sdrunout() restart it, because
15025 					 * sdrunout() is just supposed to start
15026 					 * commands that are sitting on the
15027 					 * wait queue.  The un_retry_bp stays
15028 					 * set until the command completes, but
15029 					 * sdrunout can be called many times
15030 					 * before that happens.  Since sdrunout
15031 					 * cannot tell if the un_retry_bp is
15032 					 * already in the transport, it could
15033 					 * end up calling scsi_transport() for
15034 					 * the un_retry_bp multiple times.
15035 					 *
15036 					 * Also: don't schedule the callback
15037 					 * if some other callback is already
15038 					 * pending.
15039 					 */
15040 					if (un->un_retry_statp == NULL) {
15041 						/*
15042 						 * restore the kstat pointer to
15043 						 * keep kstat counts coherent
15044 						 * when we do retry the command.
15045 						 */
15046 						un->un_retry_statp =
15047 						    saved_statp;
15048 					}
15049 
15050 					if ((un->un_startstop_timeid == NULL) &&
15051 					    (un->un_retry_timeid == NULL) &&
15052 					    (un->un_direct_priority_timeid ==
15053 					    NULL)) {
15054 
15055 						un->un_retry_timeid =
15056 						    timeout(
15057 						    sd_start_retry_command,
15058 						    un, SD_RESTART_TIMEOUT);
15059 					}
15060 					goto exit;
15061 				}
15062 
15063 #else
15064 				if (bp == immed_bp) {
15065 					break;	/* Just fail the command */
15066 				}
15067 #endif
15068 
15069 				/* Add the buf back to the head of the waitq */
15070 				bp->av_forw = un->un_waitq_headp;
15071 				un->un_waitq_headp = bp;
15072 				if (un->un_waitq_tailp == NULL) {
15073 					un->un_waitq_tailp = bp;
15074 				}
15075 				goto exit;
15076 
15077 			case SD_PKT_ALLOC_FAILURE_NO_DMA:
15078 				/*
15079 				 * HBA DMA resource failure. Fail the command
15080 				 * and continue processing of the queues.
15081 				 */
15082 				SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15083 				    "sd_start_cmds: "
15084 				    "SD_PKT_ALLOC_FAILURE_NO_DMA\n");
15085 				break;
15086 
15087 			case SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL:
15088 				/*
15089 				 * Note:x86: Partial DMA mapping not supported
15090 				 * for USCSI commands, and all the needed DMA
15091 				 * resources were not allocated.
15092 				 */
15093 				SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15094 				    "sd_start_cmds: "
15095 				    "SD_PKT_ALLOC_FAILURE_PKT_TOO_SMALL\n");
15096 				break;
15097 
15098 			case SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL:
15099 				/*
15100 				 * Note:x86: Request cannot fit into CDB based
15101 				 * on lba and len.
15102 				 */
15103 				SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15104 				    "sd_start_cmds: "
15105 				    "SD_PKT_ALLOC_FAILURE_CDB_TOO_SMALL\n");
15106 				break;
15107 
15108 			default:
15109 				/* Should NEVER get here! */
15110 				panic("scsi_initpkt error");
15111 				/*NOTREACHED*/
15112 			}
15113 
15114 			/*
15115 			 * Fatal error in allocating a scsi_pkt for this buf.
15116 			 * Update kstats & return the buf with an error code.
15117 			 * We must use sd_return_failed_command_no_restart() to
15118 			 * avoid a recursive call back into sd_start_cmds().
15119 			 * However this also means that we must keep processing
15120 			 * the waitq here in order to avoid stalling.
15121 			 */
15122 			if (statp == kstat_waitq_to_runq) {
15123 				SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp);
15124 			}
15125 			sd_return_failed_command_no_restart(un, bp, EIO);
15126 			if (bp == immed_bp) {
15127 				/* immed_bp is gone by now, so clear this */
15128 				immed_bp = NULL;
15129 			}
15130 			continue;
15131 		}
15132 got_pkt:
15133 		if (bp == immed_bp) {
15134 			/* goto the head of the class.... */
15135 			xp->xb_pktp->pkt_flags |= FLAG_HEAD;
15136 		}
15137 
15138 		un->un_ncmds_in_transport++;
15139 		SD_UPDATE_KSTATS(un, statp, bp);
15140 
15141 		/*
15142 		 * Call scsi_transport() to send the command to the target.
15143 		 * According to SCSA architecture, we must drop the mutex here
15144 		 * before calling scsi_transport() in order to avoid deadlock.
15145 		 * Note that the scsi_pkt's completion routine can be executed
15146 		 * (from interrupt context) even before the call to
15147 		 * scsi_transport() returns.
15148 		 */
15149 		SD_TRACE(SD_LOG_IO_CORE, un,
15150 		    "sd_start_cmds: calling scsi_transport()\n");
15151 		DTRACE_PROBE1(scsi__transport__dispatch, struct buf *, bp);
15152 
15153 		mutex_exit(SD_MUTEX(un));
15154 		rval = scsi_transport(xp->xb_pktp);
15155 		mutex_enter(SD_MUTEX(un));
15156 
15157 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15158 		    "sd_start_cmds: scsi_transport() returned %d\n", rval);
15159 
15160 		switch (rval) {
15161 		case TRAN_ACCEPT:
15162 			/* Clear this with every pkt accepted by the HBA */
15163 			un->un_tran_fatal_count = 0;
15164 			break;	/* Success; try the next cmd (if any) */
15165 
15166 		case TRAN_BUSY:
15167 			un->un_ncmds_in_transport--;
15168 			ASSERT(un->un_ncmds_in_transport >= 0);
15169 
15170 			/*
15171 			 * Don't retry request sense, the sense data
15172 			 * is lost when another request is sent.
15173 			 * Free up the rqs buf and retry
15174 			 * the original failed cmd.  Update kstat.
15175 			 */
15176 			if (bp == un->un_rqs_bp) {
15177 				SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
15178 				bp = sd_mark_rqs_idle(un, xp);
15179 				sd_retry_command(un, bp, SD_RETRIES_STANDARD,
15180 				    NULL, NULL, EIO, un->un_busy_timeout / 500,
15181 				    kstat_waitq_enter);
15182 				goto exit;
15183 			}
15184 
15185 #if defined(__i386) || defined(__amd64)	/* DMAFREE for x86 only */
15186 			/*
15187 			 * Free the DMA resources for the  scsi_pkt. This will
15188 			 * allow mpxio to select another path the next time
15189 			 * we call scsi_transport() with this scsi_pkt.
15190 			 * See sdintr() for the rationalization behind this.
15191 			 */
15192 			if ((un->un_f_is_fibre == TRUE) &&
15193 			    ((xp->xb_pkt_flags & SD_XB_USCSICMD) == 0) &&
15194 			    ((xp->xb_pktp->pkt_flags & FLAG_SENSING) == 0)) {
15195 				scsi_dmafree(xp->xb_pktp);
15196 				xp->xb_pkt_flags |= SD_XB_DMA_FREED;
15197 			}
15198 #endif
15199 
15200 			if (SD_IS_DIRECT_PRIORITY(SD_GET_XBUF(bp))) {
15201 				/*
15202 				 * Commands that are SD_PATH_DIRECT_PRIORITY
15203 				 * are for error recovery situations. These do
15204 				 * not use the normal command waitq, so if they
15205 				 * get a TRAN_BUSY we cannot put them back onto
15206 				 * the waitq for later retry. One possible
15207 				 * problem is that there could already be some
15208 				 * other command on un_retry_bp that is waiting
15209 				 * for this one to complete, so we would be
15210 				 * deadlocked if we put this command back onto
15211 				 * the waitq for later retry (since un_retry_bp
15212 				 * must complete before the driver gets back to
15213 				 * commands on the waitq).
15214 				 *
15215 				 * To avoid deadlock we must schedule a callback
15216 				 * that will restart this command after a set
15217 				 * interval.  This should keep retrying for as
15218 				 * long as the underlying transport keeps
15219 				 * returning TRAN_BUSY (just like for other
15220 				 * commands).  Use the same timeout interval as
15221 				 * for the ordinary TRAN_BUSY retry.
15222 				 */
15223 				SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15224 				    "sd_start_cmds: scsi_transport() returned "
15225 				    "TRAN_BUSY for DIRECT_PRIORITY cmd!\n");
15226 
15227 				SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
15228 				un->un_direct_priority_timeid =
15229 				    timeout(sd_start_direct_priority_command,
15230 				    bp, un->un_busy_timeout / 500);
15231 
15232 				goto exit;
15233 			}
15234 
15235 			/*
15236 			 * For TRAN_BUSY, we want to reduce the throttle value,
15237 			 * unless we are retrying a command.
15238 			 */
15239 			if (bp != un->un_retry_bp) {
15240 				sd_reduce_throttle(un, SD_THROTTLE_TRAN_BUSY);
15241 			}
15242 
15243 			/*
15244 			 * Set up the bp to be tried again 10 ms later.
15245 			 * Note:x86: Is there a timeout value in the sd_lun
15246 			 * for this condition?
15247 			 */
15248 			sd_set_retry_bp(un, bp, un->un_busy_timeout / 500,
15249 			    kstat_runq_back_to_waitq);
15250 			goto exit;
15251 
15252 		case TRAN_FATAL_ERROR:
15253 			un->un_tran_fatal_count++;
15254 			/* FALLTHRU */
15255 
15256 		case TRAN_BADPKT:
15257 		default:
15258 			un->un_ncmds_in_transport--;
15259 			ASSERT(un->un_ncmds_in_transport >= 0);
15260 
15261 			/*
15262 			 * If this is our REQUEST SENSE command with a
15263 			 * transport error, we must get back the pointers
15264 			 * to the original buf, and mark the REQUEST
15265 			 * SENSE command as "available".
15266 			 */
15267 			if (bp == un->un_rqs_bp) {
15268 				bp = sd_mark_rqs_idle(un, xp);
15269 				xp = SD_GET_XBUF(bp);
15270 			} else {
15271 				/*
15272 				 * Legacy behavior: do not update transport
15273 				 * error count for request sense commands.
15274 				 */
15275 				SD_UPDATE_ERRSTATS(un, sd_transerrs);
15276 			}
15277 
15278 			SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
15279 			sd_print_transport_rejected_message(un, xp, rval);
15280 
15281 			/*
15282 			 * This command will be terminated by SD driver due
15283 			 * to a fatal transport error. We should post
15284 			 * ereport.io.scsi.cmd.disk.tran with driver-assessment
15285 			 * of "fail" for any command to indicate this
15286 			 * situation.
15287 			 */
15288 			if (xp->xb_ena > 0) {
15289 				ASSERT(un->un_fm_private != NULL);
15290 				sfip = un->un_fm_private;
15291 				sfip->fm_ssc.ssc_flags |= SSC_FLAGS_TRAN_ABORT;
15292 				sd_ssc_extract_info(&sfip->fm_ssc, un,
15293 				    xp->xb_pktp, bp, xp);
15294 				sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_FATAL);
15295 			}
15296 
15297 			/*
15298 			 * We must use sd_return_failed_command_no_restart() to
15299 			 * avoid a recursive call back into sd_start_cmds().
15300 			 * However this also means that we must keep processing
15301 			 * the waitq here in order to avoid stalling.
15302 			 */
15303 			sd_return_failed_command_no_restart(un, bp, EIO);
15304 
15305 			/*
15306 			 * Notify any threads waiting in sd_ddi_suspend() that
15307 			 * a command completion has occurred.
15308 			 */
15309 			if (un->un_state == SD_STATE_SUSPENDED) {
15310 				cv_broadcast(&un->un_disk_busy_cv);
15311 			}
15312 
15313 			if (bp == immed_bp) {
15314 				/* immed_bp is gone by now, so clear this */
15315 				immed_bp = NULL;
15316 			}
15317 			break;
15318 		}
15319 
15320 	} while (immed_bp == NULL);
15321 
15322 exit:
15323 	ASSERT(mutex_owned(SD_MUTEX(un)));
15324 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_start_cmds: exit\n");
15325 }
15326 
15327 
15328 /*
15329  *    Function: sd_return_command
15330  *
15331  * Description: Returns a command to its originator (with or without an
15332  *		error).  Also starts commands waiting to be transported
15333  *		to the target.
15334  *
15335  *     Context: May be called from interrupt, kernel, or timeout context
15336  */
15337 
15338 static void
15339 sd_return_command(struct sd_lun *un, struct buf *bp)
15340 {
15341 	struct sd_xbuf *xp;
15342 	struct scsi_pkt *pktp;
15343 	struct sd_fm_internal *sfip;
15344 
15345 	ASSERT(bp != NULL);
15346 	ASSERT(un != NULL);
15347 	ASSERT(mutex_owned(SD_MUTEX(un)));
15348 	ASSERT(bp != un->un_rqs_bp);
15349 	xp = SD_GET_XBUF(bp);
15350 	ASSERT(xp != NULL);
15351 
15352 	pktp = SD_GET_PKTP(bp);
15353 	sfip = (struct sd_fm_internal *)un->un_fm_private;
15354 	ASSERT(sfip != NULL);
15355 
15356 	SD_TRACE(SD_LOG_IO_CORE, un, "sd_return_command: entry\n");
15357 
15358 	/*
15359 	 * Note: check for the "sdrestart failed" case.
15360 	 */
15361 	if ((un->un_partial_dma_supported == 1) &&
15362 	    ((xp->xb_pkt_flags & SD_XB_USCSICMD) != SD_XB_USCSICMD) &&
15363 	    (geterror(bp) == 0) && (xp->xb_dma_resid != 0) &&
15364 	    (xp->xb_pktp->pkt_resid == 0)) {
15365 
15366 		if (sd_setup_next_xfer(un, bp, pktp, xp) != 0) {
15367 			/*
15368 			 * Successfully set up next portion of cmd
15369 			 * transfer, try sending it
15370 			 */
15371 			sd_retry_command(un, bp, SD_RETRIES_NOCHECK,
15372 			    NULL, NULL, 0, (clock_t)0, NULL);
15373 			sd_start_cmds(un, NULL);
15374 			return;	/* Note:x86: need a return here? */
15375 		}
15376 	}
15377 
15378 	/*
15379 	 * If this is the failfast bp, clear it from un_failfast_bp. This
15380 	 * can happen if upon being re-tried the failfast bp either
15381 	 * succeeded or encountered another error (possibly even a different
15382 	 * error than the one that precipitated the failfast state, but in
15383 	 * that case it would have had to exhaust retries as well). Regardless,
15384 	 * this should not occur whenever the instance is in the active
15385 	 * failfast state.
15386 	 */
15387 	if (bp == un->un_failfast_bp) {
15388 		ASSERT(un->un_failfast_state == SD_FAILFAST_INACTIVE);
15389 		un->un_failfast_bp = NULL;
15390 	}
15391 
15392 	/*
15393 	 * Clear the failfast state upon successful completion of ANY cmd.
15394 	 */
15395 	if (bp->b_error == 0) {
15396 		un->un_failfast_state = SD_FAILFAST_INACTIVE;
15397 		/*
15398 		 * If this is a successful command, but used to be retried,
15399 		 * we will take it as a recovered command and post an
15400 		 * ereport with driver-assessment of "recovered".
15401 		 */
15402 		if (xp->xb_ena > 0) {
15403 			sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp);
15404 			sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_RECOVERY);
15405 		}
15406 	} else {
15407 		/*
15408 		 * If this is a failed non-USCSI command we will post an
15409 		 * ereport with driver-assessment set accordingly("fail" or
15410 		 * "fatal").
15411 		 */
15412 		if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
15413 			sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp);
15414 			sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_FATAL);
15415 		}
15416 	}
15417 
15418 	/*
15419 	 * This is used if the command was retried one or more times. Show that
15420 	 * we are done with it, and allow processing of the waitq to resume.
15421 	 */
15422 	if (bp == un->un_retry_bp) {
15423 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15424 		    "sd_return_command: un:0x%p: "
15425 		    "RETURNING retry_bp:0x%p\n", un, un->un_retry_bp);
15426 		un->un_retry_bp = NULL;
15427 		un->un_retry_statp = NULL;
15428 	}
15429 
15430 	SD_UPDATE_RDWR_STATS(un, bp);
15431 	SD_UPDATE_PARTITION_STATS(un, bp);
15432 
15433 	switch (un->un_state) {
15434 	case SD_STATE_SUSPENDED:
15435 		/*
15436 		 * Notify any threads waiting in sd_ddi_suspend() that
15437 		 * a command completion has occurred.
15438 		 */
15439 		cv_broadcast(&un->un_disk_busy_cv);
15440 		break;
15441 	default:
15442 		sd_start_cmds(un, NULL);
15443 		break;
15444 	}
15445 
15446 	/* Return this command up the iodone chain to its originator. */
15447 	mutex_exit(SD_MUTEX(un));
15448 
15449 	(*(sd_destroypkt_map[xp->xb_chain_iodone]))(bp);
15450 	xp->xb_pktp = NULL;
15451 
15452 	SD_BEGIN_IODONE(xp->xb_chain_iodone, un, bp);
15453 
15454 	ASSERT(!mutex_owned(SD_MUTEX(un)));
15455 	mutex_enter(SD_MUTEX(un));
15456 
15457 	SD_TRACE(SD_LOG_IO_CORE, un, "sd_return_command: exit\n");
15458 }
15459 
15460 
15461 /*
15462  *    Function: sd_return_failed_command
15463  *
15464  * Description: Command completion when an error occurred.
15465  *
15466  *     Context: May be called from interrupt context
15467  */
15468 
15469 static void
15470 sd_return_failed_command(struct sd_lun *un, struct buf *bp, int errcode)
15471 {
15472 	ASSERT(bp != NULL);
15473 	ASSERT(un != NULL);
15474 	ASSERT(mutex_owned(SD_MUTEX(un)));
15475 
15476 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15477 	    "sd_return_failed_command: entry\n");
15478 
15479 	/*
15480 	 * b_resid could already be nonzero due to a partial data
15481 	 * transfer, so do not change it here.
15482 	 */
15483 	SD_BIOERROR(bp, errcode);
15484 
15485 	sd_return_command(un, bp);
15486 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15487 	    "sd_return_failed_command: exit\n");
15488 }
15489 
15490 
15491 /*
15492  *    Function: sd_return_failed_command_no_restart
15493  *
15494  * Description: Same as sd_return_failed_command, but ensures that no
15495  *		call back into sd_start_cmds will be issued.
15496  *
15497  *     Context: May be called from interrupt context
15498  */
15499 
15500 static void
15501 sd_return_failed_command_no_restart(struct sd_lun *un, struct buf *bp,
15502     int errcode)
15503 {
15504 	struct sd_xbuf *xp;
15505 
15506 	ASSERT(bp != NULL);
15507 	ASSERT(un != NULL);
15508 	ASSERT(mutex_owned(SD_MUTEX(un)));
15509 	xp = SD_GET_XBUF(bp);
15510 	ASSERT(xp != NULL);
15511 	ASSERT(errcode != 0);
15512 
15513 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15514 	    "sd_return_failed_command_no_restart: entry\n");
15515 
15516 	/*
15517 	 * b_resid could already be nonzero due to a partial data
15518 	 * transfer, so do not change it here.
15519 	 */
15520 	SD_BIOERROR(bp, errcode);
15521 
15522 	/*
15523 	 * If this is the failfast bp, clear it. This can happen if the
15524 	 * failfast bp encounterd a fatal error when we attempted to
15525 	 * re-try it (such as a scsi_transport(9F) failure).  However
15526 	 * we should NOT be in an active failfast state if the failfast
15527 	 * bp is not NULL.
15528 	 */
15529 	if (bp == un->un_failfast_bp) {
15530 		ASSERT(un->un_failfast_state == SD_FAILFAST_INACTIVE);
15531 		un->un_failfast_bp = NULL;
15532 	}
15533 
15534 	if (bp == un->un_retry_bp) {
15535 		/*
15536 		 * This command was retried one or more times. Show that we are
15537 		 * done with it, and allow processing of the waitq to resume.
15538 		 */
15539 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15540 		    "sd_return_failed_command_no_restart: "
15541 		    " un:0x%p: RETURNING retry_bp:0x%p\n", un, un->un_retry_bp);
15542 		un->un_retry_bp = NULL;
15543 		un->un_retry_statp = NULL;
15544 	}
15545 
15546 	SD_UPDATE_RDWR_STATS(un, bp);
15547 	SD_UPDATE_PARTITION_STATS(un, bp);
15548 
15549 	mutex_exit(SD_MUTEX(un));
15550 
15551 	if (xp->xb_pktp != NULL) {
15552 		(*(sd_destroypkt_map[xp->xb_chain_iodone]))(bp);
15553 		xp->xb_pktp = NULL;
15554 	}
15555 
15556 	SD_BEGIN_IODONE(xp->xb_chain_iodone, un, bp);
15557 
15558 	mutex_enter(SD_MUTEX(un));
15559 
15560 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15561 	    "sd_return_failed_command_no_restart: exit\n");
15562 }
15563 
15564 
15565 /*
15566  *    Function: sd_retry_command
15567  *
15568  * Description: queue up a command for retry, or (optionally) fail it
15569  *		if retry counts are exhausted.
15570  *
15571  *   Arguments: un - Pointer to the sd_lun struct for the target.
15572  *
15573  *		bp - Pointer to the buf for the command to be retried.
15574  *
15575  *		retry_check_flag - Flag to see which (if any) of the retry
15576  *		   counts should be decremented/checked. If the indicated
15577  *		   retry count is exhausted, then the command will not be
15578  *		   retried; it will be failed instead. This should use a
15579  *		   value equal to one of the following:
15580  *
15581  *			SD_RETRIES_NOCHECK
15582  *			SD_RESD_RETRIES_STANDARD
15583  *			SD_RETRIES_VICTIM
15584  *
15585  *		   Optionally may be bitwise-OR'ed with SD_RETRIES_ISOLATE
15586  *		   if the check should be made to see of FLAG_ISOLATE is set
15587  *		   in the pkt. If FLAG_ISOLATE is set, then the command is
15588  *		   not retried, it is simply failed.
15589  *
15590  *		user_funcp - Ptr to function to call before dispatching the
15591  *		   command. May be NULL if no action needs to be performed.
15592  *		   (Primarily intended for printing messages.)
15593  *
15594  *		user_arg - Optional argument to be passed along to
15595  *		   the user_funcp call.
15596  *
15597  *		failure_code - errno return code to set in the bp if the
15598  *		   command is going to be failed.
15599  *
15600  *		retry_delay - Retry delay interval in (clock_t) units. May
15601  *		   be zero which indicates that the retry should be retried
15602  *		   immediately (ie, without an intervening delay).
15603  *
15604  *		statp - Ptr to kstat function to be updated if the command
15605  *		   is queued for a delayed retry. May be NULL if no kstat
15606  *		   update is desired.
15607  *
15608  *     Context: May be called from interrupt context.
15609  */
15610 
15611 static void
15612 sd_retry_command(struct sd_lun *un, struct buf *bp, int retry_check_flag,
15613     void (*user_funcp)(struct sd_lun *un, struct buf *bp, void *argp, int code),
15614     void *user_arg, int failure_code, clock_t retry_delay,
15615     void (*statp)(kstat_io_t *))
15616 {
15617 	struct sd_xbuf	*xp;
15618 	struct scsi_pkt	*pktp;
15619 	struct sd_fm_internal *sfip;
15620 
15621 	ASSERT(un != NULL);
15622 	ASSERT(mutex_owned(SD_MUTEX(un)));
15623 	ASSERT(bp != NULL);
15624 	xp = SD_GET_XBUF(bp);
15625 	ASSERT(xp != NULL);
15626 	pktp = SD_GET_PKTP(bp);
15627 	ASSERT(pktp != NULL);
15628 
15629 	sfip = (struct sd_fm_internal *)un->un_fm_private;
15630 	ASSERT(sfip != NULL);
15631 
15632 	SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
15633 	    "sd_retry_command: entry: bp:0x%p xp:0x%p\n", bp, xp);
15634 
15635 	/*
15636 	 * If we are syncing or dumping, fail the command to avoid
15637 	 * recursively calling back into scsi_transport().
15638 	 */
15639 	if (ddi_in_panic()) {
15640 		goto fail_command_no_log;
15641 	}
15642 
15643 	/*
15644 	 * We should never be be retrying a command with FLAG_DIAGNOSE set, so
15645 	 * log an error and fail the command.
15646 	 */
15647 	if ((pktp->pkt_flags & FLAG_DIAGNOSE) != 0) {
15648 		scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE,
15649 		    "ERROR, retrying FLAG_DIAGNOSE command.\n");
15650 		sd_dump_memory(un, SD_LOG_IO, "CDB",
15651 		    (uchar_t *)pktp->pkt_cdbp, CDB_SIZE, SD_LOG_HEX);
15652 		sd_dump_memory(un, SD_LOG_IO, "Sense Data",
15653 		    (uchar_t *)xp->xb_sense_data, SENSE_LENGTH, SD_LOG_HEX);
15654 		goto fail_command;
15655 	}
15656 
15657 	/*
15658 	 * If we are suspended, then put the command onto head of the
15659 	 * wait queue since we don't want to start more commands, and
15660 	 * clear the un_retry_bp. Next time when we are resumed, will
15661 	 * handle the command in the wait queue.
15662 	 */
15663 	switch (un->un_state) {
15664 	case SD_STATE_SUSPENDED:
15665 	case SD_STATE_DUMPING:
15666 		bp->av_forw = un->un_waitq_headp;
15667 		un->un_waitq_headp = bp;
15668 		if (un->un_waitq_tailp == NULL) {
15669 			un->un_waitq_tailp = bp;
15670 		}
15671 		if (bp == un->un_retry_bp) {
15672 			un->un_retry_bp = NULL;
15673 			un->un_retry_statp = NULL;
15674 		}
15675 		SD_UPDATE_KSTATS(un, kstat_waitq_enter, bp);
15676 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: "
15677 		    "exiting; cmd bp:0x%p requeued for SUSPEND/DUMP\n", bp);
15678 		return;
15679 	default:
15680 		break;
15681 	}
15682 
15683 	/*
15684 	 * If the caller wants us to check FLAG_ISOLATE, then see if that
15685 	 * is set; if it is then we do not want to retry the command.
15686 	 * Normally, FLAG_ISOLATE is only used with USCSI cmds.
15687 	 */
15688 	if ((retry_check_flag & SD_RETRIES_ISOLATE) != 0) {
15689 		if ((pktp->pkt_flags & FLAG_ISOLATE) != 0) {
15690 			goto fail_command;
15691 		}
15692 	}
15693 
15694 
15695 	/*
15696 	 * If SD_RETRIES_FAILFAST is set, it indicates that either a
15697 	 * command timeout or a selection timeout has occurred. This means
15698 	 * that we were unable to establish an kind of communication with
15699 	 * the target, and subsequent retries and/or commands are likely
15700 	 * to encounter similar results and take a long time to complete.
15701 	 *
15702 	 * If this is a failfast error condition, we need to update the
15703 	 * failfast state, even if this bp does not have B_FAILFAST set.
15704 	 */
15705 	if (retry_check_flag & SD_RETRIES_FAILFAST) {
15706 		if (un->un_failfast_state == SD_FAILFAST_ACTIVE) {
15707 			ASSERT(un->un_failfast_bp == NULL);
15708 			/*
15709 			 * If we are already in the active failfast state, and
15710 			 * another failfast error condition has been detected,
15711 			 * then fail this command if it has B_FAILFAST set.
15712 			 * If B_FAILFAST is clear, then maintain the legacy
15713 			 * behavior of retrying heroically, even tho this will
15714 			 * take a lot more time to fail the command.
15715 			 */
15716 			if (bp->b_flags & B_FAILFAST) {
15717 				goto fail_command;
15718 			}
15719 		} else {
15720 			/*
15721 			 * We're not in the active failfast state, but we
15722 			 * have a failfast error condition, so we must begin
15723 			 * transition to the next state. We do this regardless
15724 			 * of whether or not this bp has B_FAILFAST set.
15725 			 */
15726 			if (un->un_failfast_bp == NULL) {
15727 				/*
15728 				 * This is the first bp to meet a failfast
15729 				 * condition so save it on un_failfast_bp &
15730 				 * do normal retry processing. Do not enter
15731 				 * active failfast state yet. This marks
15732 				 * entry into the "failfast pending" state.
15733 				 */
15734 				un->un_failfast_bp = bp;
15735 
15736 			} else if (un->un_failfast_bp == bp) {
15737 				/*
15738 				 * This is the second time *this* bp has
15739 				 * encountered a failfast error condition,
15740 				 * so enter active failfast state & flush
15741 				 * queues as appropriate.
15742 				 */
15743 				un->un_failfast_state = SD_FAILFAST_ACTIVE;
15744 				un->un_failfast_bp = NULL;
15745 				sd_failfast_flushq(un);
15746 
15747 				/*
15748 				 * Fail this bp now if B_FAILFAST set;
15749 				 * otherwise continue with retries. (It would
15750 				 * be pretty ironic if this bp succeeded on a
15751 				 * subsequent retry after we just flushed all
15752 				 * the queues).
15753 				 */
15754 				if (bp->b_flags & B_FAILFAST) {
15755 					goto fail_command;
15756 				}
15757 
15758 #if !defined(lint) && !defined(__lint)
15759 			} else {
15760 				/*
15761 				 * If neither of the preceeding conditionals
15762 				 * was true, it means that there is some
15763 				 * *other* bp that has met an inital failfast
15764 				 * condition and is currently either being
15765 				 * retried or is waiting to be retried. In
15766 				 * that case we should perform normal retry
15767 				 * processing on *this* bp, since there is a
15768 				 * chance that the current failfast condition
15769 				 * is transient and recoverable. If that does
15770 				 * not turn out to be the case, then retries
15771 				 * will be cleared when the wait queue is
15772 				 * flushed anyway.
15773 				 */
15774 #endif
15775 			}
15776 		}
15777 	} else {
15778 		/*
15779 		 * SD_RETRIES_FAILFAST is clear, which indicates that we
15780 		 * likely were able to at least establish some level of
15781 		 * communication with the target and subsequent commands
15782 		 * and/or retries are likely to get through to the target,
15783 		 * In this case we want to be aggressive about clearing
15784 		 * the failfast state. Note that this does not affect
15785 		 * the "failfast pending" condition.
15786 		 */
15787 		un->un_failfast_state = SD_FAILFAST_INACTIVE;
15788 	}
15789 
15790 
15791 	/*
15792 	 * Check the specified retry count to see if we can still do
15793 	 * any retries with this pkt before we should fail it.
15794 	 */
15795 	switch (retry_check_flag & SD_RETRIES_MASK) {
15796 	case SD_RETRIES_VICTIM:
15797 		/*
15798 		 * Check the victim retry count. If exhausted, then fall
15799 		 * thru & check against the standard retry count.
15800 		 */
15801 		if (xp->xb_victim_retry_count < un->un_victim_retry_count) {
15802 			/* Increment count & proceed with the retry */
15803 			xp->xb_victim_retry_count++;
15804 			break;
15805 		}
15806 		/* Victim retries exhausted, fall back to std. retries... */
15807 		/* FALLTHRU */
15808 
15809 	case SD_RETRIES_STANDARD:
15810 		if (xp->xb_retry_count >= un->un_retry_count) {
15811 			/* Retries exhausted, fail the command */
15812 			SD_TRACE(SD_LOG_IO_CORE, un,
15813 			    "sd_retry_command: retries exhausted!\n");
15814 			/*
15815 			 * update b_resid for failed SCMD_READ & SCMD_WRITE
15816 			 * commands with nonzero pkt_resid.
15817 			 */
15818 			if ((pktp->pkt_reason == CMD_CMPLT) &&
15819 			    (SD_GET_PKT_STATUS(pktp) == STATUS_GOOD) &&
15820 			    (pktp->pkt_resid != 0)) {
15821 				uchar_t op = SD_GET_PKT_OPCODE(pktp) & 0x1F;
15822 				if ((op == SCMD_READ) || (op == SCMD_WRITE)) {
15823 					SD_UPDATE_B_RESID(bp, pktp);
15824 				}
15825 			}
15826 			goto fail_command;
15827 		}
15828 		xp->xb_retry_count++;
15829 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15830 		    "sd_retry_command: retry count:%d\n", xp->xb_retry_count);
15831 		break;
15832 
15833 	case SD_RETRIES_UA:
15834 		if (xp->xb_ua_retry_count >= sd_ua_retry_count) {
15835 			/* Retries exhausted, fail the command */
15836 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
15837 			    "Unit Attention retries exhausted. "
15838 			    "Check the target.\n");
15839 			goto fail_command;
15840 		}
15841 		xp->xb_ua_retry_count++;
15842 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15843 		    "sd_retry_command: retry count:%d\n",
15844 		    xp->xb_ua_retry_count);
15845 		break;
15846 
15847 	case SD_RETRIES_BUSY:
15848 		if (xp->xb_retry_count >= un->un_busy_retry_count) {
15849 			/* Retries exhausted, fail the command */
15850 			SD_TRACE(SD_LOG_IO_CORE, un,
15851 			    "sd_retry_command: retries exhausted!\n");
15852 			goto fail_command;
15853 		}
15854 		xp->xb_retry_count++;
15855 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15856 		    "sd_retry_command: retry count:%d\n", xp->xb_retry_count);
15857 		break;
15858 
15859 	case SD_RETRIES_NOCHECK:
15860 	default:
15861 		/* No retry count to check. Just proceed with the retry */
15862 		break;
15863 	}
15864 
15865 	xp->xb_pktp->pkt_flags |= FLAG_HEAD;
15866 
15867 	/*
15868 	 * If this is a non-USCSI command being retried
15869 	 * during execution last time, we should post an ereport with
15870 	 * driver-assessment of the value "retry".
15871 	 * For partial DMA, request sense and STATUS_QFULL, there are no
15872 	 * hardware errors, we bypass ereport posting.
15873 	 */
15874 	if (failure_code != 0) {
15875 		if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
15876 			sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp);
15877 			sd_ssc_post(&sfip->fm_ssc, SD_FM_DRV_RETRY);
15878 		}
15879 	}
15880 
15881 	/*
15882 	 * If we were given a zero timeout, we must attempt to retry the
15883 	 * command immediately (ie, without a delay).
15884 	 */
15885 	if (retry_delay == 0) {
15886 		/*
15887 		 * Check some limiting conditions to see if we can actually
15888 		 * do the immediate retry.  If we cannot, then we must
15889 		 * fall back to queueing up a delayed retry.
15890 		 */
15891 		if (un->un_ncmds_in_transport >= un->un_throttle) {
15892 			/*
15893 			 * We are at the throttle limit for the target,
15894 			 * fall back to delayed retry.
15895 			 */
15896 			retry_delay = un->un_busy_timeout;
15897 			statp = kstat_waitq_enter;
15898 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15899 			    "sd_retry_command: immed. retry hit "
15900 			    "throttle!\n");
15901 		} else {
15902 			/*
15903 			 * We're clear to proceed with the immediate retry.
15904 			 * First call the user-provided function (if any)
15905 			 */
15906 			if (user_funcp != NULL) {
15907 				(*user_funcp)(un, bp, user_arg,
15908 				    SD_IMMEDIATE_RETRY_ISSUED);
15909 #ifdef __lock_lint
15910 				sd_print_incomplete_msg(un, bp, user_arg,
15911 				    SD_IMMEDIATE_RETRY_ISSUED);
15912 				sd_print_cmd_incomplete_msg(un, bp, user_arg,
15913 				    SD_IMMEDIATE_RETRY_ISSUED);
15914 				sd_print_sense_failed_msg(un, bp, user_arg,
15915 				    SD_IMMEDIATE_RETRY_ISSUED);
15916 #endif
15917 			}
15918 
15919 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15920 			    "sd_retry_command: issuing immediate retry\n");
15921 
15922 			/*
15923 			 * Call sd_start_cmds() to transport the command to
15924 			 * the target.
15925 			 */
15926 			sd_start_cmds(un, bp);
15927 
15928 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15929 			    "sd_retry_command exit\n");
15930 			return;
15931 		}
15932 	}
15933 
15934 	/*
15935 	 * Set up to retry the command after a delay.
15936 	 * First call the user-provided function (if any)
15937 	 */
15938 	if (user_funcp != NULL) {
15939 		(*user_funcp)(un, bp, user_arg, SD_DELAYED_RETRY_ISSUED);
15940 	}
15941 
15942 	sd_set_retry_bp(un, bp, retry_delay, statp);
15943 
15944 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: exit\n");
15945 	return;
15946 
15947 fail_command:
15948 
15949 	if (user_funcp != NULL) {
15950 		(*user_funcp)(un, bp, user_arg, SD_NO_RETRY_ISSUED);
15951 	}
15952 
15953 fail_command_no_log:
15954 
15955 	SD_INFO(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15956 	    "sd_retry_command: returning failed command\n");
15957 
15958 	sd_return_failed_command(un, bp, failure_code);
15959 
15960 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: exit\n");
15961 }
15962 
15963 
15964 /*
15965  *    Function: sd_set_retry_bp
15966  *
15967  * Description: Set up the given bp for retry.
15968  *
15969  *   Arguments: un - ptr to associated softstate
15970  *		bp - ptr to buf(9S) for the command
15971  *		retry_delay - time interval before issuing retry (may be 0)
15972  *		statp - optional pointer to kstat function
15973  *
15974  *     Context: May be called under interrupt context
15975  */
15976 
15977 static void
15978 sd_set_retry_bp(struct sd_lun *un, struct buf *bp, clock_t retry_delay,
15979     void (*statp)(kstat_io_t *))
15980 {
15981 	ASSERT(un != NULL);
15982 	ASSERT(mutex_owned(SD_MUTEX(un)));
15983 	ASSERT(bp != NULL);
15984 
15985 	SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
15986 	    "sd_set_retry_bp: entry: un:0x%p bp:0x%p\n", un, bp);
15987 
15988 	/*
15989 	 * Indicate that the command is being retried. This will not allow any
15990 	 * other commands on the wait queue to be transported to the target
15991 	 * until this command has been completed (success or failure). The
15992 	 * "retry command" is not transported to the target until the given
15993 	 * time delay expires, unless the user specified a 0 retry_delay.
15994 	 *
15995 	 * Note: the timeout(9F) callback routine is what actually calls
15996 	 * sd_start_cmds() to transport the command, with the exception of a
15997 	 * zero retry_delay. The only current implementor of a zero retry delay
15998 	 * is the case where a START_STOP_UNIT is sent to spin-up a device.
15999 	 */
16000 	if (un->un_retry_bp == NULL) {
16001 		ASSERT(un->un_retry_statp == NULL);
16002 		un->un_retry_bp = bp;
16003 
16004 		/*
16005 		 * If the user has not specified a delay the command should
16006 		 * be queued and no timeout should be scheduled.
16007 		 */
16008 		if (retry_delay == 0) {
16009 			/*
16010 			 * Save the kstat pointer that will be used in the
16011 			 * call to SD_UPDATE_KSTATS() below, so that
16012 			 * sd_start_cmds() can correctly decrement the waitq
16013 			 * count when it is time to transport this command.
16014 			 */
16015 			un->un_retry_statp = statp;
16016 			goto done;
16017 		}
16018 	}
16019 
16020 	if (un->un_retry_bp == bp) {
16021 		/*
16022 		 * Save the kstat pointer that will be used in the call to
16023 		 * SD_UPDATE_KSTATS() below, so that sd_start_cmds() can
16024 		 * correctly decrement the waitq count when it is time to
16025 		 * transport this command.
16026 		 */
16027 		un->un_retry_statp = statp;
16028 
16029 		/*
16030 		 * Schedule a timeout if:
16031 		 *   1) The user has specified a delay.
16032 		 *   2) There is not a START_STOP_UNIT callback pending.
16033 		 *
16034 		 * If no delay has been specified, then it is up to the caller
16035 		 * to ensure that IO processing continues without stalling.
16036 		 * Effectively, this means that the caller will issue the
16037 		 * required call to sd_start_cmds(). The START_STOP_UNIT
16038 		 * callback does this after the START STOP UNIT command has
16039 		 * completed. In either of these cases we should not schedule
16040 		 * a timeout callback here.  Also don't schedule the timeout if
16041 		 * an SD_PATH_DIRECT_PRIORITY command is waiting to restart.
16042 		 */
16043 		if ((retry_delay != 0) && (un->un_startstop_timeid == NULL) &&
16044 		    (un->un_direct_priority_timeid == NULL)) {
16045 			un->un_retry_timeid =
16046 			    timeout(sd_start_retry_command, un, retry_delay);
16047 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16048 			    "sd_set_retry_bp: setting timeout: un: 0x%p"
16049 			    " bp:0x%p un_retry_timeid:0x%p\n",
16050 			    un, bp, un->un_retry_timeid);
16051 		}
16052 	} else {
16053 		/*
16054 		 * We only get in here if there is already another command
16055 		 * waiting to be retried.  In this case, we just put the
16056 		 * given command onto the wait queue, so it can be transported
16057 		 * after the current retry command has completed.
16058 		 *
16059 		 * Also we have to make sure that if the command at the head
16060 		 * of the wait queue is the un_failfast_bp, that we do not
16061 		 * put ahead of it any other commands that are to be retried.
16062 		 */
16063 		if ((un->un_failfast_bp != NULL) &&
16064 		    (un->un_failfast_bp == un->un_waitq_headp)) {
16065 			/*
16066 			 * Enqueue this command AFTER the first command on
16067 			 * the wait queue (which is also un_failfast_bp).
16068 			 */
16069 			bp->av_forw = un->un_waitq_headp->av_forw;
16070 			un->un_waitq_headp->av_forw = bp;
16071 			if (un->un_waitq_headp == un->un_waitq_tailp) {
16072 				un->un_waitq_tailp = bp;
16073 			}
16074 		} else {
16075 			/* Enqueue this command at the head of the waitq. */
16076 			bp->av_forw = un->un_waitq_headp;
16077 			un->un_waitq_headp = bp;
16078 			if (un->un_waitq_tailp == NULL) {
16079 				un->un_waitq_tailp = bp;
16080 			}
16081 		}
16082 
16083 		if (statp == NULL) {
16084 			statp = kstat_waitq_enter;
16085 		}
16086 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16087 		    "sd_set_retry_bp: un:0x%p already delayed retry\n", un);
16088 	}
16089 
16090 done:
16091 	if (statp != NULL) {
16092 		SD_UPDATE_KSTATS(un, statp, bp);
16093 	}
16094 
16095 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16096 	    "sd_set_retry_bp: exit un:0x%p\n", un);
16097 }
16098 
16099 
16100 /*
16101  *    Function: sd_start_retry_command
16102  *
16103  * Description: Start the command that has been waiting on the target's
16104  *		retry queue.  Called from timeout(9F) context after the
16105  *		retry delay interval has expired.
16106  *
16107  *   Arguments: arg - pointer to associated softstate for the device.
16108  *
16109  *     Context: timeout(9F) thread context.  May not sleep.
16110  */
16111 
16112 static void
16113 sd_start_retry_command(void *arg)
16114 {
16115 	struct sd_lun *un = arg;
16116 
16117 	ASSERT(un != NULL);
16118 	ASSERT(!mutex_owned(SD_MUTEX(un)));
16119 
16120 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16121 	    "sd_start_retry_command: entry\n");
16122 
16123 	mutex_enter(SD_MUTEX(un));
16124 
16125 	un->un_retry_timeid = NULL;
16126 
16127 	if (un->un_retry_bp != NULL) {
16128 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16129 		    "sd_start_retry_command: un:0x%p STARTING bp:0x%p\n",
16130 		    un, un->un_retry_bp);
16131 		sd_start_cmds(un, un->un_retry_bp);
16132 	}
16133 
16134 	mutex_exit(SD_MUTEX(un));
16135 
16136 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16137 	    "sd_start_retry_command: exit\n");
16138 }
16139 
16140 /*
16141  *    Function: sd_rmw_msg_print_handler
16142  *
16143  * Description: If RMW mode is enabled and warning message is triggered
16144  *              print I/O count during a fixed interval.
16145  *
16146  *   Arguments: arg - pointer to associated softstate for the device.
16147  *
16148  *     Context: timeout(9F) thread context. May not sleep.
16149  */
16150 static void
16151 sd_rmw_msg_print_handler(void *arg)
16152 {
16153 	struct sd_lun *un = arg;
16154 
16155 	ASSERT(un != NULL);
16156 	ASSERT(!mutex_owned(SD_MUTEX(un)));
16157 
16158 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16159 	    "sd_rmw_msg_print_handler: entry\n");
16160 
16161 	mutex_enter(SD_MUTEX(un));
16162 
16163 	if (un->un_rmw_incre_count > 0) {
16164 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16165 		    "%"PRIu64" I/O requests are not aligned with %d disk "
16166 		    "sector size in %ld seconds. They are handled through "
16167 		    "Read Modify Write but the performance is very low!\n",
16168 		    un->un_rmw_incre_count, un->un_tgt_blocksize,
16169 		    drv_hztousec(SD_RMW_MSG_PRINT_TIMEOUT) / 1000000);
16170 		un->un_rmw_incre_count = 0;
16171 		un->un_rmw_msg_timeid = timeout(sd_rmw_msg_print_handler,
16172 		    un, SD_RMW_MSG_PRINT_TIMEOUT);
16173 	} else {
16174 		un->un_rmw_msg_timeid = NULL;
16175 	}
16176 
16177 	mutex_exit(SD_MUTEX(un));
16178 
16179 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16180 	    "sd_rmw_msg_print_handler: exit\n");
16181 }
16182 
16183 /*
16184  *    Function: sd_start_direct_priority_command
16185  *
16186  * Description: Used to re-start an SD_PATH_DIRECT_PRIORITY command that had
16187  *		received TRAN_BUSY when we called scsi_transport() to send it
16188  *		to the underlying HBA. This function is called from timeout(9F)
16189  *		context after the delay interval has expired.
16190  *
16191  *   Arguments: arg - pointer to associated buf(9S) to be restarted.
16192  *
16193  *     Context: timeout(9F) thread context.  May not sleep.
16194  */
16195 
16196 static void
16197 sd_start_direct_priority_command(void *arg)
16198 {
16199 	struct buf	*priority_bp = arg;
16200 	struct sd_lun	*un;
16201 
16202 	ASSERT(priority_bp != NULL);
16203 	un = SD_GET_UN(priority_bp);
16204 	ASSERT(un != NULL);
16205 	ASSERT(!mutex_owned(SD_MUTEX(un)));
16206 
16207 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16208 	    "sd_start_direct_priority_command: entry\n");
16209 
16210 	mutex_enter(SD_MUTEX(un));
16211 	un->un_direct_priority_timeid = NULL;
16212 	sd_start_cmds(un, priority_bp);
16213 	mutex_exit(SD_MUTEX(un));
16214 
16215 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16216 	    "sd_start_direct_priority_command: exit\n");
16217 }
16218 
16219 
16220 /*
16221  *    Function: sd_send_request_sense_command
16222  *
16223  * Description: Sends a REQUEST SENSE command to the target
16224  *
16225  *     Context: May be called from interrupt context.
16226  */
16227 
16228 static void
16229 sd_send_request_sense_command(struct sd_lun *un, struct buf *bp,
16230     struct scsi_pkt *pktp)
16231 {
16232 	ASSERT(bp != NULL);
16233 	ASSERT(un != NULL);
16234 	ASSERT(mutex_owned(SD_MUTEX(un)));
16235 
16236 	SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_send_request_sense_command: "
16237 	    "entry: buf:0x%p\n", bp);
16238 
16239 	/*
16240 	 * If we are syncing or dumping, then fail the command to avoid a
16241 	 * recursive callback into scsi_transport(). Also fail the command
16242 	 * if we are suspended (legacy behavior).
16243 	 */
16244 	if (ddi_in_panic() || (un->un_state == SD_STATE_SUSPENDED) ||
16245 	    (un->un_state == SD_STATE_DUMPING)) {
16246 		sd_return_failed_command(un, bp, EIO);
16247 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16248 		    "sd_send_request_sense_command: syncing/dumping, exit\n");
16249 		return;
16250 	}
16251 
16252 	/*
16253 	 * Retry the failed command and don't issue the request sense if:
16254 	 *    1) the sense buf is busy
16255 	 *    2) we have 1 or more outstanding commands on the target
16256 	 *    (the sense data will be cleared or invalidated any way)
16257 	 *
16258 	 * Note: There could be an issue with not checking a retry limit here,
16259 	 * the problem is determining which retry limit to check.
16260 	 */
16261 	if ((un->un_sense_isbusy != 0) || (un->un_ncmds_in_transport > 0)) {
16262 		/* Don't retry if the command is flagged as non-retryable */
16263 		if ((pktp->pkt_flags & FLAG_DIAGNOSE) == 0) {
16264 			sd_retry_command(un, bp, SD_RETRIES_NOCHECK,
16265 			    NULL, NULL, 0, un->un_busy_timeout,
16266 			    kstat_waitq_enter);
16267 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16268 			    "sd_send_request_sense_command: "
16269 			    "at full throttle, retrying exit\n");
16270 		} else {
16271 			sd_return_failed_command(un, bp, EIO);
16272 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16273 			    "sd_send_request_sense_command: "
16274 			    "at full throttle, non-retryable exit\n");
16275 		}
16276 		return;
16277 	}
16278 
16279 	sd_mark_rqs_busy(un, bp);
16280 	sd_start_cmds(un, un->un_rqs_bp);
16281 
16282 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16283 	    "sd_send_request_sense_command: exit\n");
16284 }
16285 
16286 
16287 /*
16288  *    Function: sd_mark_rqs_busy
16289  *
16290  * Description: Indicate that the request sense bp for this instance is
16291  *		in use.
16292  *
16293  *     Context: May be called under interrupt context
16294  */
16295 
16296 static void
16297 sd_mark_rqs_busy(struct sd_lun *un, struct buf *bp)
16298 {
16299 	struct sd_xbuf	*sense_xp;
16300 
16301 	ASSERT(un != NULL);
16302 	ASSERT(bp != NULL);
16303 	ASSERT(mutex_owned(SD_MUTEX(un)));
16304 	ASSERT(un->un_sense_isbusy == 0);
16305 
16306 	SD_TRACE(SD_LOG_IO_CORE, un, "sd_mark_rqs_busy: entry: "
16307 	    "buf:0x%p xp:0x%p un:0x%p\n", bp, SD_GET_XBUF(bp), un);
16308 
16309 	sense_xp = SD_GET_XBUF(un->un_rqs_bp);
16310 	ASSERT(sense_xp != NULL);
16311 
16312 	SD_INFO(SD_LOG_IO, un,
16313 	    "sd_mark_rqs_busy: entry: sense_xp:0x%p\n", sense_xp);
16314 
16315 	ASSERT(sense_xp->xb_pktp != NULL);
16316 	ASSERT((sense_xp->xb_pktp->pkt_flags & (FLAG_SENSING | FLAG_HEAD))
16317 	    == (FLAG_SENSING | FLAG_HEAD));
16318 
16319 	un->un_sense_isbusy = 1;
16320 	un->un_rqs_bp->b_resid = 0;
16321 	sense_xp->xb_pktp->pkt_resid  = 0;
16322 	sense_xp->xb_pktp->pkt_reason = 0;
16323 
16324 	/* So we can get back the bp at interrupt time! */
16325 	sense_xp->xb_sense_bp = bp;
16326 
16327 	bzero(un->un_rqs_bp->b_un.b_addr, SENSE_LENGTH);
16328 
16329 	/*
16330 	 * Mark this buf as awaiting sense data. (This is already set in
16331 	 * the pkt_flags for the RQS packet.)
16332 	 */
16333 	((SD_GET_XBUF(bp))->xb_pktp)->pkt_flags |= FLAG_SENSING;
16334 
16335 	/* Request sense down same path */
16336 	if (scsi_pkt_allocated_correctly((SD_GET_XBUF(bp))->xb_pktp) &&
16337 	    ((SD_GET_XBUF(bp))->xb_pktp)->pkt_path_instance)
16338 		sense_xp->xb_pktp->pkt_path_instance =
16339 		    ((SD_GET_XBUF(bp))->xb_pktp)->pkt_path_instance;
16340 
16341 	sense_xp->xb_retry_count	= 0;
16342 	sense_xp->xb_victim_retry_count = 0;
16343 	sense_xp->xb_ua_retry_count	= 0;
16344 	sense_xp->xb_nr_retry_count 	= 0;
16345 	sense_xp->xb_dma_resid  = 0;
16346 
16347 	/* Clean up the fields for auto-request sense */
16348 	sense_xp->xb_sense_status = 0;
16349 	sense_xp->xb_sense_state  = 0;
16350 	sense_xp->xb_sense_resid  = 0;
16351 	bzero(sense_xp->xb_sense_data, sizeof (sense_xp->xb_sense_data));
16352 
16353 	SD_TRACE(SD_LOG_IO_CORE, un, "sd_mark_rqs_busy: exit\n");
16354 }
16355 
16356 
16357 /*
16358  *    Function: sd_mark_rqs_idle
16359  *
16360  * Description: SD_MUTEX must be held continuously through this routine
16361  *		to prevent reuse of the rqs struct before the caller can
16362  *		complete it's processing.
16363  *
16364  * Return Code: Pointer to the RQS buf
16365  *
16366  *     Context: May be called under interrupt context
16367  */
16368 
16369 static struct buf *
16370 sd_mark_rqs_idle(struct sd_lun *un, struct sd_xbuf *sense_xp)
16371 {
16372 	struct buf *bp;
16373 	ASSERT(un != NULL);
16374 	ASSERT(sense_xp != NULL);
16375 	ASSERT(mutex_owned(SD_MUTEX(un)));
16376 	ASSERT(un->un_sense_isbusy != 0);
16377 
16378 	un->un_sense_isbusy = 0;
16379 	bp = sense_xp->xb_sense_bp;
16380 	sense_xp->xb_sense_bp = NULL;
16381 
16382 	/* This pkt is no longer interested in getting sense data */
16383 	((SD_GET_XBUF(bp))->xb_pktp)->pkt_flags &= ~FLAG_SENSING;
16384 
16385 	return (bp);
16386 }
16387 
16388 
16389 
16390 /*
16391  *    Function: sd_alloc_rqs
16392  *
16393  * Description: Set up the unit to receive auto request sense data
16394  *
16395  * Return Code: DDI_SUCCESS or DDI_FAILURE
16396  *
16397  *     Context: Called under attach(9E) context
16398  */
16399 
16400 static int
16401 sd_alloc_rqs(struct scsi_device *devp, struct sd_lun *un)
16402 {
16403 	struct sd_xbuf *xp;
16404 
16405 	ASSERT(un != NULL);
16406 	ASSERT(!mutex_owned(SD_MUTEX(un)));
16407 	ASSERT(un->un_rqs_bp == NULL);
16408 	ASSERT(un->un_rqs_pktp == NULL);
16409 
16410 	/*
16411 	 * First allocate the required buf and scsi_pkt structs, then set up
16412 	 * the CDB in the scsi_pkt for a REQUEST SENSE command.
16413 	 */
16414 	un->un_rqs_bp = scsi_alloc_consistent_buf(&devp->sd_address, NULL,
16415 	    MAX_SENSE_LENGTH, B_READ, SLEEP_FUNC, NULL);
16416 	if (un->un_rqs_bp == NULL) {
16417 		return (DDI_FAILURE);
16418 	}
16419 
16420 	un->un_rqs_pktp = scsi_init_pkt(&devp->sd_address, NULL, un->un_rqs_bp,
16421 	    CDB_GROUP0, 1, 0, PKT_CONSISTENT, SLEEP_FUNC, NULL);
16422 
16423 	if (un->un_rqs_pktp == NULL) {
16424 		sd_free_rqs(un);
16425 		return (DDI_FAILURE);
16426 	}
16427 
16428 	/* Set up the CDB in the scsi_pkt for a REQUEST SENSE command. */
16429 	(void) scsi_setup_cdb((union scsi_cdb *)un->un_rqs_pktp->pkt_cdbp,
16430 	    SCMD_REQUEST_SENSE, 0, MAX_SENSE_LENGTH, 0);
16431 
16432 	SD_FILL_SCSI1_LUN(un, un->un_rqs_pktp);
16433 
16434 	/* Set up the other needed members in the ARQ scsi_pkt. */
16435 	un->un_rqs_pktp->pkt_comp   = sdintr;
16436 	un->un_rqs_pktp->pkt_time   = sd_io_time;
16437 	un->un_rqs_pktp->pkt_flags |=
16438 	    (FLAG_SENSING | FLAG_HEAD);	/* (1222170) */
16439 
16440 	/*
16441 	 * Allocate  & init the sd_xbuf struct for the RQS command. Do not
16442 	 * provide any intpkt, destroypkt routines as we take care of
16443 	 * scsi_pkt allocation/freeing here and in sd_free_rqs().
16444 	 */
16445 	xp = kmem_alloc(sizeof (struct sd_xbuf), KM_SLEEP);
16446 	sd_xbuf_init(un, un->un_rqs_bp, xp, SD_CHAIN_NULL, NULL);
16447 	xp->xb_pktp = un->un_rqs_pktp;
16448 	SD_INFO(SD_LOG_ATTACH_DETACH, un,
16449 	    "sd_alloc_rqs: un 0x%p, rqs  xp 0x%p,  pkt 0x%p,  buf 0x%p\n",
16450 	    un, xp, un->un_rqs_pktp, un->un_rqs_bp);
16451 
16452 	/*
16453 	 * Save the pointer to the request sense private bp so it can
16454 	 * be retrieved in sdintr.
16455 	 */
16456 	un->un_rqs_pktp->pkt_private = un->un_rqs_bp;
16457 	ASSERT(un->un_rqs_bp->b_private == xp);
16458 
16459 	/*
16460 	 * See if the HBA supports auto-request sense for the specified
16461 	 * target/lun. If it does, then try to enable it (if not already
16462 	 * enabled).
16463 	 *
16464 	 * Note: For some HBAs (ifp & sf), scsi_ifsetcap will always return
16465 	 * failure, while for other HBAs (pln) scsi_ifsetcap will always
16466 	 * return success.  However, in both of these cases ARQ is always
16467 	 * enabled and scsi_ifgetcap will always return true. The best approach
16468 	 * is to issue the scsi_ifgetcap() first, then try the scsi_ifsetcap().
16469 	 *
16470 	 * The 3rd case is the HBA (adp) always return enabled on
16471 	 * scsi_ifgetgetcap even when it's not enable, the best approach
16472 	 * is issue a scsi_ifsetcap then a scsi_ifgetcap
16473 	 * Note: this case is to circumvent the Adaptec bug. (x86 only)
16474 	 */
16475 
16476 	if (un->un_f_is_fibre == TRUE) {
16477 		un->un_f_arq_enabled = TRUE;
16478 	} else {
16479 #if defined(__i386) || defined(__amd64)
16480 		/*
16481 		 * Circumvent the Adaptec bug, remove this code when
16482 		 * the bug is fixed
16483 		 */
16484 		(void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 1, 1);
16485 #endif
16486 		switch (scsi_ifgetcap(SD_ADDRESS(un), "auto-rqsense", 1)) {
16487 		case 0:
16488 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
16489 			    "sd_alloc_rqs: HBA supports ARQ\n");
16490 			/*
16491 			 * ARQ is supported by this HBA but currently is not
16492 			 * enabled. Attempt to enable it and if successful then
16493 			 * mark this instance as ARQ enabled.
16494 			 */
16495 			if (scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 1, 1)
16496 			    == 1) {
16497 				/* Successfully enabled ARQ in the HBA */
16498 				SD_INFO(SD_LOG_ATTACH_DETACH, un,
16499 				    "sd_alloc_rqs: ARQ enabled\n");
16500 				un->un_f_arq_enabled = TRUE;
16501 			} else {
16502 				/* Could not enable ARQ in the HBA */
16503 				SD_INFO(SD_LOG_ATTACH_DETACH, un,
16504 				    "sd_alloc_rqs: failed ARQ enable\n");
16505 				un->un_f_arq_enabled = FALSE;
16506 			}
16507 			break;
16508 		case 1:
16509 			/*
16510 			 * ARQ is supported by this HBA and is already enabled.
16511 			 * Just mark ARQ as enabled for this instance.
16512 			 */
16513 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
16514 			    "sd_alloc_rqs: ARQ already enabled\n");
16515 			un->un_f_arq_enabled = TRUE;
16516 			break;
16517 		default:
16518 			/*
16519 			 * ARQ is not supported by this HBA; disable it for this
16520 			 * instance.
16521 			 */
16522 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
16523 			    "sd_alloc_rqs: HBA does not support ARQ\n");
16524 			un->un_f_arq_enabled = FALSE;
16525 			break;
16526 		}
16527 	}
16528 
16529 	return (DDI_SUCCESS);
16530 }
16531 
16532 
16533 /*
16534  *    Function: sd_free_rqs
16535  *
16536  * Description: Cleanup for the pre-instance RQS command.
16537  *
16538  *     Context: Kernel thread context
16539  */
16540 
16541 static void
16542 sd_free_rqs(struct sd_lun *un)
16543 {
16544 	ASSERT(un != NULL);
16545 
16546 	SD_TRACE(SD_LOG_IO_CORE, un, "sd_free_rqs: entry\n");
16547 
16548 	/*
16549 	 * If consistent memory is bound to a scsi_pkt, the pkt
16550 	 * has to be destroyed *before* freeing the consistent memory.
16551 	 * Don't change the sequence of this operations.
16552 	 * scsi_destroy_pkt() might access memory, which isn't allowed,
16553 	 * after it was freed in scsi_free_consistent_buf().
16554 	 */
16555 	if (un->un_rqs_pktp != NULL) {
16556 		scsi_destroy_pkt(un->un_rqs_pktp);
16557 		un->un_rqs_pktp = NULL;
16558 	}
16559 
16560 	if (un->un_rqs_bp != NULL) {
16561 		struct sd_xbuf *xp = SD_GET_XBUF(un->un_rqs_bp);
16562 		if (xp != NULL) {
16563 			kmem_free(xp, sizeof (struct sd_xbuf));
16564 		}
16565 		scsi_free_consistent_buf(un->un_rqs_bp);
16566 		un->un_rqs_bp = NULL;
16567 	}
16568 	SD_TRACE(SD_LOG_IO_CORE, un, "sd_free_rqs: exit\n");
16569 }
16570 
16571 
16572 
16573 /*
16574  *    Function: sd_reduce_throttle
16575  *
16576  * Description: Reduces the maximum # of outstanding commands on a
16577  *		target to the current number of outstanding commands.
16578  *		Queues a tiemout(9F) callback to restore the limit
16579  *		after a specified interval has elapsed.
16580  *		Typically used when we get a TRAN_BUSY return code
16581  *		back from scsi_transport().
16582  *
16583  *   Arguments: un - ptr to the sd_lun softstate struct
16584  *		throttle_type: SD_THROTTLE_TRAN_BUSY or SD_THROTTLE_QFULL
16585  *
16586  *     Context: May be called from interrupt context
16587  */
16588 
16589 static void
16590 sd_reduce_throttle(struct sd_lun *un, int throttle_type)
16591 {
16592 	ASSERT(un != NULL);
16593 	ASSERT(mutex_owned(SD_MUTEX(un)));
16594 	ASSERT(un->un_ncmds_in_transport >= 0);
16595 
16596 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reduce_throttle: "
16597 	    "entry: un:0x%p un_throttle:%d un_ncmds_in_transport:%d\n",
16598 	    un, un->un_throttle, un->un_ncmds_in_transport);
16599 
16600 	if (un->un_throttle > 1) {
16601 		if (un->un_f_use_adaptive_throttle == TRUE) {
16602 			switch (throttle_type) {
16603 			case SD_THROTTLE_TRAN_BUSY:
16604 				if (un->un_busy_throttle == 0) {
16605 					un->un_busy_throttle = un->un_throttle;
16606 				}
16607 				break;
16608 			case SD_THROTTLE_QFULL:
16609 				un->un_busy_throttle = 0;
16610 				break;
16611 			default:
16612 				ASSERT(FALSE);
16613 			}
16614 
16615 			if (un->un_ncmds_in_transport > 0) {
16616 				un->un_throttle = un->un_ncmds_in_transport;
16617 			}
16618 
16619 		} else {
16620 			if (un->un_ncmds_in_transport == 0) {
16621 				un->un_throttle = 1;
16622 			} else {
16623 				un->un_throttle = un->un_ncmds_in_transport;
16624 			}
16625 		}
16626 	}
16627 
16628 	/* Reschedule the timeout if none is currently active */
16629 	if (un->un_reset_throttle_timeid == NULL) {
16630 		un->un_reset_throttle_timeid = timeout(sd_restore_throttle,
16631 		    un, SD_THROTTLE_RESET_INTERVAL);
16632 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16633 		    "sd_reduce_throttle: timeout scheduled!\n");
16634 	}
16635 
16636 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reduce_throttle: "
16637 	    "exit: un:0x%p un_throttle:%d\n", un, un->un_throttle);
16638 }
16639 
16640 
16641 
16642 /*
16643  *    Function: sd_restore_throttle
16644  *
16645  * Description: Callback function for timeout(9F).  Resets the current
16646  *		value of un->un_throttle to its default.
16647  *
16648  *   Arguments: arg - pointer to associated softstate for the device.
16649  *
16650  *     Context: May be called from interrupt context
16651  */
16652 
16653 static void
16654 sd_restore_throttle(void *arg)
16655 {
16656 	struct sd_lun	*un = arg;
16657 
16658 	ASSERT(un != NULL);
16659 	ASSERT(!mutex_owned(SD_MUTEX(un)));
16660 
16661 	mutex_enter(SD_MUTEX(un));
16662 
16663 	SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: "
16664 	    "entry: un:0x%p un_throttle:%d\n", un, un->un_throttle);
16665 
16666 	un->un_reset_throttle_timeid = NULL;
16667 
16668 	if (un->un_f_use_adaptive_throttle == TRUE) {
16669 		/*
16670 		 * If un_busy_throttle is nonzero, then it contains the
16671 		 * value that un_throttle was when we got a TRAN_BUSY back
16672 		 * from scsi_transport(). We want to revert back to this
16673 		 * value.
16674 		 *
16675 		 * In the QFULL case, the throttle limit will incrementally
16676 		 * increase until it reaches max throttle.
16677 		 */
16678 		if (un->un_busy_throttle > 0) {
16679 			un->un_throttle = un->un_busy_throttle;
16680 			un->un_busy_throttle = 0;
16681 		} else {
16682 			/*
16683 			 * increase throttle by 10% open gate slowly, schedule
16684 			 * another restore if saved throttle has not been
16685 			 * reached
16686 			 */
16687 			short throttle;
16688 			if (sd_qfull_throttle_enable) {
16689 				throttle = un->un_throttle +
16690 				    max((un->un_throttle / 10), 1);
16691 				un->un_throttle =
16692 				    (throttle < un->un_saved_throttle) ?
16693 				    throttle : un->un_saved_throttle;
16694 				if (un->un_throttle < un->un_saved_throttle) {
16695 					un->un_reset_throttle_timeid =
16696 					    timeout(sd_restore_throttle,
16697 					    un,
16698 					    SD_QFULL_THROTTLE_RESET_INTERVAL);
16699 				}
16700 			}
16701 		}
16702 
16703 		/*
16704 		 * If un_throttle has fallen below the low-water mark, we
16705 		 * restore the maximum value here (and allow it to ratchet
16706 		 * down again if necessary).
16707 		 */
16708 		if (un->un_throttle < un->un_min_throttle) {
16709 			un->un_throttle = un->un_saved_throttle;
16710 		}
16711 	} else {
16712 		SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: "
16713 		    "restoring limit from 0x%x to 0x%x\n",
16714 		    un->un_throttle, un->un_saved_throttle);
16715 		un->un_throttle = un->un_saved_throttle;
16716 	}
16717 
16718 	SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
16719 	    "sd_restore_throttle: calling sd_start_cmds!\n");
16720 
16721 	sd_start_cmds(un, NULL);
16722 
16723 	SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
16724 	    "sd_restore_throttle: exit: un:0x%p un_throttle:%d\n",
16725 	    un, un->un_throttle);
16726 
16727 	mutex_exit(SD_MUTEX(un));
16728 
16729 	SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: exit\n");
16730 }
16731 
16732 /*
16733  *    Function: sdrunout
16734  *
16735  * Description: Callback routine for scsi_init_pkt when a resource allocation
16736  *		fails.
16737  *
16738  *   Arguments: arg - a pointer to the sd_lun unit struct for the particular
16739  *		soft state instance.
16740  *
16741  * Return Code: The scsi_init_pkt routine allows for the callback function to
16742  *		return a 0 indicating the callback should be rescheduled or a 1
16743  *		indicating not to reschedule. This routine always returns 1
16744  *		because the driver always provides a callback function to
16745  *		scsi_init_pkt. This results in a callback always being scheduled
16746  *		(via the scsi_init_pkt callback implementation) if a resource
16747  *		failure occurs.
16748  *
16749  *     Context: This callback function may not block or call routines that block
16750  *
16751  *        Note: Using the scsi_init_pkt callback facility can result in an I/O
16752  *		request persisting at the head of the list which cannot be
16753  *		satisfied even after multiple retries. In the future the driver
16754  *		may implement some time of maximum runout count before failing
16755  *		an I/O.
16756  */
16757 
16758 static int
16759 sdrunout(caddr_t arg)
16760 {
16761 	struct sd_lun	*un = (struct sd_lun *)arg;
16762 
16763 	ASSERT(un != NULL);
16764 	ASSERT(!mutex_owned(SD_MUTEX(un)));
16765 
16766 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdrunout: entry\n");
16767 
16768 	mutex_enter(SD_MUTEX(un));
16769 	sd_start_cmds(un, NULL);
16770 	mutex_exit(SD_MUTEX(un));
16771 	/*
16772 	 * This callback routine always returns 1 (i.e. do not reschedule)
16773 	 * because we always specify sdrunout as the callback handler for
16774 	 * scsi_init_pkt inside the call to sd_start_cmds.
16775 	 */
16776 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdrunout: exit\n");
16777 	return (1);
16778 }
16779 
16780 
16781 /*
16782  *    Function: sdintr
16783  *
16784  * Description: Completion callback routine for scsi_pkt(9S) structs
16785  *		sent to the HBA driver via scsi_transport(9F).
16786  *
16787  *     Context: Interrupt context
16788  */
16789 
16790 static void
16791 sdintr(struct scsi_pkt *pktp)
16792 {
16793 	struct buf	*bp;
16794 	struct sd_xbuf	*xp;
16795 	struct sd_lun	*un;
16796 	size_t		actual_len;
16797 	sd_ssc_t	*sscp;
16798 
16799 	ASSERT(pktp != NULL);
16800 	bp = (struct buf *)pktp->pkt_private;
16801 	ASSERT(bp != NULL);
16802 	xp = SD_GET_XBUF(bp);
16803 	ASSERT(xp != NULL);
16804 	ASSERT(xp->xb_pktp != NULL);
16805 	un = SD_GET_UN(bp);
16806 	ASSERT(un != NULL);
16807 	ASSERT(!mutex_owned(SD_MUTEX(un)));
16808 
16809 #ifdef SD_FAULT_INJECTION
16810 
16811 	SD_INFO(SD_LOG_IOERR, un, "sdintr: sdintr calling Fault injection\n");
16812 	/* SD FaultInjection */
16813 	sd_faultinjection(pktp);
16814 
16815 #endif /* SD_FAULT_INJECTION */
16816 
16817 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdintr: entry: buf:0x%p,"
16818 	    " xp:0x%p, un:0x%p\n", bp, xp, un);
16819 
16820 	mutex_enter(SD_MUTEX(un));
16821 
16822 	ASSERT(un->un_fm_private != NULL);
16823 	sscp = &((struct sd_fm_internal *)(un->un_fm_private))->fm_ssc;
16824 	ASSERT(sscp != NULL);
16825 
16826 	/* Reduce the count of the #commands currently in transport */
16827 	un->un_ncmds_in_transport--;
16828 	ASSERT(un->un_ncmds_in_transport >= 0);
16829 
16830 	/* Increment counter to indicate that the callback routine is active */
16831 	un->un_in_callback++;
16832 
16833 	SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
16834 
16835 #ifdef	SDDEBUG
16836 	if (bp == un->un_retry_bp) {
16837 		SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sdintr: "
16838 		    "un:0x%p: GOT retry_bp:0x%p un_ncmds_in_transport:%d\n",
16839 		    un, un->un_retry_bp, un->un_ncmds_in_transport);
16840 	}
16841 #endif
16842 
16843 	/*
16844 	 * If pkt_reason is CMD_DEV_GONE, fail the command, and update the media
16845 	 * state if needed.
16846 	 */
16847 	if (pktp->pkt_reason == CMD_DEV_GONE) {
16848 		/* Prevent multiple console messages for the same failure. */
16849 		if (un->un_last_pkt_reason != CMD_DEV_GONE) {
16850 			un->un_last_pkt_reason = CMD_DEV_GONE;
16851 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16852 			    "Command failed to complete...Device is gone\n");
16853 		}
16854 		if (un->un_mediastate != DKIO_DEV_GONE) {
16855 			un->un_mediastate = DKIO_DEV_GONE;
16856 			cv_broadcast(&un->un_state_cv);
16857 		}
16858 		/*
16859 		 * If the command happens to be the REQUEST SENSE command,
16860 		 * free up the rqs buf and fail the original command.
16861 		 */
16862 		if (bp == un->un_rqs_bp) {
16863 			bp = sd_mark_rqs_idle(un, xp);
16864 		}
16865 		sd_return_failed_command(un, bp, EIO);
16866 		goto exit;
16867 	}
16868 
16869 	if (pktp->pkt_state & STATE_XARQ_DONE) {
16870 		SD_TRACE(SD_LOG_COMMON, un,
16871 		    "sdintr: extra sense data received. pkt=%p\n", pktp);
16872 	}
16873 
16874 	/*
16875 	 * First see if the pkt has auto-request sense data with it....
16876 	 * Look at the packet state first so we don't take a performance
16877 	 * hit looking at the arq enabled flag unless absolutely necessary.
16878 	 */
16879 	if ((pktp->pkt_state & STATE_ARQ_DONE) &&
16880 	    (un->un_f_arq_enabled == TRUE)) {
16881 		/*
16882 		 * The HBA did an auto request sense for this command so check
16883 		 * for FLAG_DIAGNOSE. If set this indicates a uscsi or internal
16884 		 * driver command that should not be retried.
16885 		 */
16886 		if ((pktp->pkt_flags & FLAG_DIAGNOSE) != 0) {
16887 			/*
16888 			 * Save the relevant sense info into the xp for the
16889 			 * original cmd.
16890 			 */
16891 			struct scsi_arq_status *asp;
16892 			asp = (struct scsi_arq_status *)(pktp->pkt_scbp);
16893 			xp->xb_sense_status =
16894 			    *((uchar_t *)(&(asp->sts_rqpkt_status)));
16895 			xp->xb_sense_state  = asp->sts_rqpkt_state;
16896 			xp->xb_sense_resid  = asp->sts_rqpkt_resid;
16897 			if (pktp->pkt_state & STATE_XARQ_DONE) {
16898 				actual_len = MAX_SENSE_LENGTH -
16899 				    xp->xb_sense_resid;
16900 				bcopy(&asp->sts_sensedata, xp->xb_sense_data,
16901 				    MAX_SENSE_LENGTH);
16902 			} else {
16903 				if (xp->xb_sense_resid > SENSE_LENGTH) {
16904 					actual_len = MAX_SENSE_LENGTH -
16905 					    xp->xb_sense_resid;
16906 				} else {
16907 					actual_len = SENSE_LENGTH -
16908 					    xp->xb_sense_resid;
16909 				}
16910 				if (xp->xb_pkt_flags & SD_XB_USCSICMD) {
16911 					if ((((struct uscsi_cmd *)
16912 					    (xp->xb_pktinfo))->uscsi_rqlen) >
16913 					    actual_len) {
16914 						xp->xb_sense_resid =
16915 						    (((struct uscsi_cmd *)
16916 						    (xp->xb_pktinfo))->
16917 						    uscsi_rqlen) - actual_len;
16918 					} else {
16919 						xp->xb_sense_resid = 0;
16920 					}
16921 				}
16922 				bcopy(&asp->sts_sensedata, xp->xb_sense_data,
16923 				    SENSE_LENGTH);
16924 			}
16925 
16926 			/* fail the command */
16927 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16928 			    "sdintr: arq done and FLAG_DIAGNOSE set\n");
16929 			sd_return_failed_command(un, bp, EIO);
16930 			goto exit;
16931 		}
16932 
16933 #if (defined(__i386) || defined(__amd64))	/* DMAFREE for x86 only */
16934 		/*
16935 		 * We want to either retry or fail this command, so free
16936 		 * the DMA resources here.  If we retry the command then
16937 		 * the DMA resources will be reallocated in sd_start_cmds().
16938 		 * Note that when PKT_DMA_PARTIAL is used, this reallocation
16939 		 * causes the *entire* transfer to start over again from the
16940 		 * beginning of the request, even for PARTIAL chunks that
16941 		 * have already transferred successfully.
16942 		 */
16943 		if ((un->un_f_is_fibre == TRUE) &&
16944 		    ((xp->xb_pkt_flags & SD_XB_USCSICMD) == 0) &&
16945 		    ((pktp->pkt_flags & FLAG_SENSING) == 0))  {
16946 			scsi_dmafree(pktp);
16947 			xp->xb_pkt_flags |= SD_XB_DMA_FREED;
16948 		}
16949 #endif
16950 
16951 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16952 		    "sdintr: arq done, sd_handle_auto_request_sense\n");
16953 
16954 		sd_handle_auto_request_sense(un, bp, xp, pktp);
16955 		goto exit;
16956 	}
16957 
16958 	/* Next see if this is the REQUEST SENSE pkt for the instance */
16959 	if (pktp->pkt_flags & FLAG_SENSING)  {
16960 		/* This pktp is from the unit's REQUEST_SENSE command */
16961 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16962 		    "sdintr: sd_handle_request_sense\n");
16963 		sd_handle_request_sense(un, bp, xp, pktp);
16964 		goto exit;
16965 	}
16966 
16967 	/*
16968 	 * Check to see if the command successfully completed as requested;
16969 	 * this is the most common case (and also the hot performance path).
16970 	 *
16971 	 * Requirements for successful completion are:
16972 	 * pkt_reason is CMD_CMPLT and packet status is status good.
16973 	 * In addition:
16974 	 * - A residual of zero indicates successful completion no matter what
16975 	 *   the command is.
16976 	 * - If the residual is not zero and the command is not a read or
16977 	 *   write, then it's still defined as successful completion. In other
16978 	 *   words, if the command is a read or write the residual must be
16979 	 *   zero for successful completion.
16980 	 * - If the residual is not zero and the command is a read or
16981 	 *   write, and it's a USCSICMD, then it's still defined as
16982 	 *   successful completion.
16983 	 */
16984 	if ((pktp->pkt_reason == CMD_CMPLT) &&
16985 	    (SD_GET_PKT_STATUS(pktp) == STATUS_GOOD)) {
16986 
16987 		/*
16988 		 * Since this command is returned with a good status, we
16989 		 * can reset the count for Sonoma failover.
16990 		 */
16991 		un->un_sonoma_failure_count = 0;
16992 
16993 		/*
16994 		 * Return all USCSI commands on good status
16995 		 */
16996 		if (pktp->pkt_resid == 0) {
16997 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16998 			    "sdintr: returning command for resid == 0\n");
16999 		} else if (((SD_GET_PKT_OPCODE(pktp) & 0x1F) != SCMD_READ) &&
17000 		    ((SD_GET_PKT_OPCODE(pktp) & 0x1F) != SCMD_WRITE)) {
17001 			SD_UPDATE_B_RESID(bp, pktp);
17002 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17003 			    "sdintr: returning command for resid != 0\n");
17004 		} else if (xp->xb_pkt_flags & SD_XB_USCSICMD) {
17005 			SD_UPDATE_B_RESID(bp, pktp);
17006 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17007 			    "sdintr: returning uscsi command\n");
17008 		} else {
17009 			goto not_successful;
17010 		}
17011 		sd_return_command(un, bp);
17012 
17013 		/*
17014 		 * Decrement counter to indicate that the callback routine
17015 		 * is done.
17016 		 */
17017 		un->un_in_callback--;
17018 		ASSERT(un->un_in_callback >= 0);
17019 		mutex_exit(SD_MUTEX(un));
17020 
17021 		return;
17022 	}
17023 
17024 not_successful:
17025 
17026 #if (defined(__i386) || defined(__amd64))	/* DMAFREE for x86 only */
17027 	/*
17028 	 * The following is based upon knowledge of the underlying transport
17029 	 * and its use of DMA resources.  This code should be removed when
17030 	 * PKT_DMA_PARTIAL support is taken out of the disk driver in favor
17031 	 * of the new PKT_CMD_BREAKUP protocol. See also sd_initpkt_for_buf()
17032 	 * and sd_start_cmds().
17033 	 *
17034 	 * Free any DMA resources associated with this command if there
17035 	 * is a chance it could be retried or enqueued for later retry.
17036 	 * If we keep the DMA binding then mpxio cannot reissue the
17037 	 * command on another path whenever a path failure occurs.
17038 	 *
17039 	 * Note that when PKT_DMA_PARTIAL is used, free/reallocation
17040 	 * causes the *entire* transfer to start over again from the
17041 	 * beginning of the request, even for PARTIAL chunks that
17042 	 * have already transferred successfully.
17043 	 *
17044 	 * This is only done for non-uscsi commands (and also skipped for the
17045 	 * driver's internal RQS command). Also just do this for Fibre Channel
17046 	 * devices as these are the only ones that support mpxio.
17047 	 */
17048 	if ((un->un_f_is_fibre == TRUE) &&
17049 	    ((xp->xb_pkt_flags & SD_XB_USCSICMD) == 0) &&
17050 	    ((pktp->pkt_flags & FLAG_SENSING) == 0))  {
17051 		scsi_dmafree(pktp);
17052 		xp->xb_pkt_flags |= SD_XB_DMA_FREED;
17053 	}
17054 #endif
17055 
17056 	/*
17057 	 * The command did not successfully complete as requested so check
17058 	 * for FLAG_DIAGNOSE. If set this indicates a uscsi or internal
17059 	 * driver command that should not be retried so just return. If
17060 	 * FLAG_DIAGNOSE is not set the error will be processed below.
17061 	 */
17062 	if ((pktp->pkt_flags & FLAG_DIAGNOSE) != 0) {
17063 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17064 		    "sdintr: FLAG_DIAGNOSE: sd_return_failed_command\n");
17065 		/*
17066 		 * Issue a request sense if a check condition caused the error
17067 		 * (we handle the auto request sense case above), otherwise
17068 		 * just fail the command.
17069 		 */
17070 		if ((pktp->pkt_reason == CMD_CMPLT) &&
17071 		    (SD_GET_PKT_STATUS(pktp) == STATUS_CHECK)) {
17072 			sd_send_request_sense_command(un, bp, pktp);
17073 		} else {
17074 			sd_return_failed_command(un, bp, EIO);
17075 		}
17076 		goto exit;
17077 	}
17078 
17079 	/*
17080 	 * The command did not successfully complete as requested so process
17081 	 * the error, retry, and/or attempt recovery.
17082 	 */
17083 	switch (pktp->pkt_reason) {
17084 	case CMD_CMPLT:
17085 		switch (SD_GET_PKT_STATUS(pktp)) {
17086 		case STATUS_GOOD:
17087 			/*
17088 			 * The command completed successfully with a non-zero
17089 			 * residual
17090 			 */
17091 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17092 			    "sdintr: STATUS_GOOD \n");
17093 			sd_pkt_status_good(un, bp, xp, pktp);
17094 			break;
17095 
17096 		case STATUS_CHECK:
17097 		case STATUS_TERMINATED:
17098 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17099 			    "sdintr: STATUS_TERMINATED | STATUS_CHECK\n");
17100 			sd_pkt_status_check_condition(un, bp, xp, pktp);
17101 			break;
17102 
17103 		case STATUS_BUSY:
17104 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17105 			    "sdintr: STATUS_BUSY\n");
17106 			sd_pkt_status_busy(un, bp, xp, pktp);
17107 			break;
17108 
17109 		case STATUS_RESERVATION_CONFLICT:
17110 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17111 			    "sdintr: STATUS_RESERVATION_CONFLICT\n");
17112 			sd_pkt_status_reservation_conflict(un, bp, xp, pktp);
17113 			break;
17114 
17115 		case STATUS_QFULL:
17116 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17117 			    "sdintr: STATUS_QFULL\n");
17118 			sd_pkt_status_qfull(un, bp, xp, pktp);
17119 			break;
17120 
17121 		case STATUS_MET:
17122 		case STATUS_INTERMEDIATE:
17123 		case STATUS_SCSI2:
17124 		case STATUS_INTERMEDIATE_MET:
17125 		case STATUS_ACA_ACTIVE:
17126 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17127 			    "Unexpected SCSI status received: 0x%x\n",
17128 			    SD_GET_PKT_STATUS(pktp));
17129 			/*
17130 			 * Mark the ssc_flags when detected invalid status
17131 			 * code for non-USCSI command.
17132 			 */
17133 			if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
17134 				sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_STATUS,
17135 				    0, "stat-code");
17136 			}
17137 			sd_return_failed_command(un, bp, EIO);
17138 			break;
17139 
17140 		default:
17141 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17142 			    "Invalid SCSI status received: 0x%x\n",
17143 			    SD_GET_PKT_STATUS(pktp));
17144 			if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
17145 				sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_STATUS,
17146 				    0, "stat-code");
17147 			}
17148 			sd_return_failed_command(un, bp, EIO);
17149 			break;
17150 
17151 		}
17152 		break;
17153 
17154 	case CMD_INCOMPLETE:
17155 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17156 		    "sdintr:  CMD_INCOMPLETE\n");
17157 		sd_pkt_reason_cmd_incomplete(un, bp, xp, pktp);
17158 		break;
17159 	case CMD_TRAN_ERR:
17160 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17161 		    "sdintr: CMD_TRAN_ERR\n");
17162 		sd_pkt_reason_cmd_tran_err(un, bp, xp, pktp);
17163 		break;
17164 	case CMD_RESET:
17165 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17166 		    "sdintr: CMD_RESET \n");
17167 		sd_pkt_reason_cmd_reset(un, bp, xp, pktp);
17168 		break;
17169 	case CMD_ABORTED:
17170 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17171 		    "sdintr: CMD_ABORTED \n");
17172 		sd_pkt_reason_cmd_aborted(un, bp, xp, pktp);
17173 		break;
17174 	case CMD_TIMEOUT:
17175 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17176 		    "sdintr: CMD_TIMEOUT\n");
17177 		sd_pkt_reason_cmd_timeout(un, bp, xp, pktp);
17178 		break;
17179 	case CMD_UNX_BUS_FREE:
17180 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17181 		    "sdintr: CMD_UNX_BUS_FREE \n");
17182 		sd_pkt_reason_cmd_unx_bus_free(un, bp, xp, pktp);
17183 		break;
17184 	case CMD_TAG_REJECT:
17185 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17186 		    "sdintr: CMD_TAG_REJECT\n");
17187 		sd_pkt_reason_cmd_tag_reject(un, bp, xp, pktp);
17188 		break;
17189 	default:
17190 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
17191 		    "sdintr: default\n");
17192 		/*
17193 		 * Mark the ssc_flags for detecting invliad pkt_reason.
17194 		 */
17195 		if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
17196 			sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_PKT_REASON,
17197 			    0, "pkt-reason");
17198 		}
17199 		sd_pkt_reason_default(un, bp, xp, pktp);
17200 		break;
17201 	}
17202 
17203 exit:
17204 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdintr: exit\n");
17205 
17206 	/* Decrement counter to indicate that the callback routine is done. */
17207 	un->un_in_callback--;
17208 	ASSERT(un->un_in_callback >= 0);
17209 
17210 	/*
17211 	 * At this point, the pkt has been dispatched, ie, it is either
17212 	 * being re-tried or has been returned to its caller and should
17213 	 * not be referenced.
17214 	 */
17215 
17216 	mutex_exit(SD_MUTEX(un));
17217 }
17218 
17219 
17220 /*
17221  *    Function: sd_print_incomplete_msg
17222  *
17223  * Description: Prints the error message for a CMD_INCOMPLETE error.
17224  *
17225  *   Arguments: un - ptr to associated softstate for the device.
17226  *		bp - ptr to the buf(9S) for the command.
17227  *		arg - message string ptr
17228  *		code - SD_DELAYED_RETRY_ISSUED, SD_IMMEDIATE_RETRY_ISSUED,
17229  *			or SD_NO_RETRY_ISSUED.
17230  *
17231  *     Context: May be called under interrupt context
17232  */
17233 
17234 static void
17235 sd_print_incomplete_msg(struct sd_lun *un, struct buf *bp, void *arg, int code)
17236 {
17237 	struct scsi_pkt	*pktp;
17238 	char	*msgp;
17239 	char	*cmdp = arg;
17240 
17241 	ASSERT(un != NULL);
17242 	ASSERT(mutex_owned(SD_MUTEX(un)));
17243 	ASSERT(bp != NULL);
17244 	ASSERT(arg != NULL);
17245 	pktp = SD_GET_PKTP(bp);
17246 	ASSERT(pktp != NULL);
17247 
17248 	switch (code) {
17249 	case SD_DELAYED_RETRY_ISSUED:
17250 	case SD_IMMEDIATE_RETRY_ISSUED:
17251 		msgp = "retrying";
17252 		break;
17253 	case SD_NO_RETRY_ISSUED:
17254 	default:
17255 		msgp = "giving up";
17256 		break;
17257 	}
17258 
17259 	if ((pktp->pkt_flags & FLAG_SILENT) == 0) {
17260 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17261 		    "incomplete %s- %s\n", cmdp, msgp);
17262 	}
17263 }
17264 
17265 
17266 
17267 /*
17268  *    Function: sd_pkt_status_good
17269  *
17270  * Description: Processing for a STATUS_GOOD code in pkt_status.
17271  *
17272  *     Context: May be called under interrupt context
17273  */
17274 
17275 static void
17276 sd_pkt_status_good(struct sd_lun *un, struct buf *bp,
17277     struct sd_xbuf *xp, struct scsi_pkt *pktp)
17278 {
17279 	char	*cmdp;
17280 
17281 	ASSERT(un != NULL);
17282 	ASSERT(mutex_owned(SD_MUTEX(un)));
17283 	ASSERT(bp != NULL);
17284 	ASSERT(xp != NULL);
17285 	ASSERT(pktp != NULL);
17286 	ASSERT(pktp->pkt_reason == CMD_CMPLT);
17287 	ASSERT(SD_GET_PKT_STATUS(pktp) == STATUS_GOOD);
17288 	ASSERT(pktp->pkt_resid != 0);
17289 
17290 	SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: entry\n");
17291 
17292 	SD_UPDATE_ERRSTATS(un, sd_harderrs);
17293 	switch (SD_GET_PKT_OPCODE(pktp) & 0x1F) {
17294 	case SCMD_READ:
17295 		cmdp = "read";
17296 		break;
17297 	case SCMD_WRITE:
17298 		cmdp = "write";
17299 		break;
17300 	default:
17301 		SD_UPDATE_B_RESID(bp, pktp);
17302 		sd_return_command(un, bp);
17303 		SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: exit\n");
17304 		return;
17305 	}
17306 
17307 	/*
17308 	 * See if we can retry the read/write, preferrably immediately.
17309 	 * If retries are exhaused, then sd_retry_command() will update
17310 	 * the b_resid count.
17311 	 */
17312 	sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_incomplete_msg,
17313 	    cmdp, EIO, (clock_t)0, NULL);
17314 
17315 	SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: exit\n");
17316 }
17317 
17318 
17319 
17320 
17321 
17322 /*
17323  *    Function: sd_handle_request_sense
17324  *
17325  * Description: Processing for non-auto Request Sense command.
17326  *
17327  *   Arguments: un - ptr to associated softstate
17328  *		sense_bp - ptr to buf(9S) for the RQS command
17329  *		sense_xp - ptr to the sd_xbuf for the RQS command
17330  *		sense_pktp - ptr to the scsi_pkt(9S) for the RQS command
17331  *
17332  *     Context: May be called under interrupt context
17333  */
17334 
17335 static void
17336 sd_handle_request_sense(struct sd_lun *un, struct buf *sense_bp,
17337     struct sd_xbuf *sense_xp, struct scsi_pkt *sense_pktp)
17338 {
17339 	struct buf	*cmd_bp;	/* buf for the original command */
17340 	struct sd_xbuf	*cmd_xp;	/* sd_xbuf for the original command */
17341 	struct scsi_pkt *cmd_pktp;	/* pkt for the original command */
17342 	size_t		actual_len;	/* actual sense data length */
17343 
17344 	ASSERT(un != NULL);
17345 	ASSERT(mutex_owned(SD_MUTEX(un)));
17346 	ASSERT(sense_bp != NULL);
17347 	ASSERT(sense_xp != NULL);
17348 	ASSERT(sense_pktp != NULL);
17349 
17350 	/*
17351 	 * Note the sense_bp, sense_xp, and sense_pktp here are for the
17352 	 * RQS command and not the original command.
17353 	 */
17354 	ASSERT(sense_pktp == un->un_rqs_pktp);
17355 	ASSERT(sense_bp   == un->un_rqs_bp);
17356 	ASSERT((sense_pktp->pkt_flags & (FLAG_SENSING | FLAG_HEAD)) ==
17357 	    (FLAG_SENSING | FLAG_HEAD));
17358 	ASSERT((((SD_GET_XBUF(sense_xp->xb_sense_bp))->xb_pktp->pkt_flags) &
17359 	    FLAG_SENSING) == FLAG_SENSING);
17360 
17361 	/* These are the bp, xp, and pktp for the original command */
17362 	cmd_bp = sense_xp->xb_sense_bp;
17363 	cmd_xp = SD_GET_XBUF(cmd_bp);
17364 	cmd_pktp = SD_GET_PKTP(cmd_bp);
17365 
17366 	if (sense_pktp->pkt_reason != CMD_CMPLT) {
17367 		/*
17368 		 * The REQUEST SENSE command failed.  Release the REQUEST
17369 		 * SENSE command for re-use, get back the bp for the original
17370 		 * command, and attempt to re-try the original command if
17371 		 * FLAG_DIAGNOSE is not set in the original packet.
17372 		 */
17373 		SD_UPDATE_ERRSTATS(un, sd_harderrs);
17374 		if ((cmd_pktp->pkt_flags & FLAG_DIAGNOSE) == 0) {
17375 			cmd_bp = sd_mark_rqs_idle(un, sense_xp);
17376 			sd_retry_command(un, cmd_bp, SD_RETRIES_STANDARD,
17377 			    NULL, NULL, EIO, (clock_t)0, NULL);
17378 			return;
17379 		}
17380 	}
17381 
17382 	/*
17383 	 * Save the relevant sense info into the xp for the original cmd.
17384 	 *
17385 	 * Note: if the request sense failed the state info will be zero
17386 	 * as set in sd_mark_rqs_busy()
17387 	 */
17388 	cmd_xp->xb_sense_status = *(sense_pktp->pkt_scbp);
17389 	cmd_xp->xb_sense_state  = sense_pktp->pkt_state;
17390 	actual_len = MAX_SENSE_LENGTH - sense_pktp->pkt_resid;
17391 	if ((cmd_xp->xb_pkt_flags & SD_XB_USCSICMD) &&
17392 	    (((struct uscsi_cmd *)cmd_xp->xb_pktinfo)->uscsi_rqlen >
17393 	    SENSE_LENGTH)) {
17394 		bcopy(sense_bp->b_un.b_addr, cmd_xp->xb_sense_data,
17395 		    MAX_SENSE_LENGTH);
17396 		cmd_xp->xb_sense_resid = sense_pktp->pkt_resid;
17397 	} else {
17398 		bcopy(sense_bp->b_un.b_addr, cmd_xp->xb_sense_data,
17399 		    SENSE_LENGTH);
17400 		if (actual_len < SENSE_LENGTH) {
17401 			cmd_xp->xb_sense_resid = SENSE_LENGTH - actual_len;
17402 		} else {
17403 			cmd_xp->xb_sense_resid = 0;
17404 		}
17405 	}
17406 
17407 	/*
17408 	 *  Free up the RQS command....
17409 	 *  NOTE:
17410 	 *	Must do this BEFORE calling sd_validate_sense_data!
17411 	 *	sd_validate_sense_data may return the original command in
17412 	 *	which case the pkt will be freed and the flags can no
17413 	 *	longer be touched.
17414 	 *	SD_MUTEX is held through this process until the command
17415 	 *	is dispatched based upon the sense data, so there are
17416 	 *	no race conditions.
17417 	 */
17418 	(void) sd_mark_rqs_idle(un, sense_xp);
17419 
17420 	/*
17421 	 * For a retryable command see if we have valid sense data, if so then
17422 	 * turn it over to sd_decode_sense() to figure out the right course of
17423 	 * action. Just fail a non-retryable command.
17424 	 */
17425 	if ((cmd_pktp->pkt_flags & FLAG_DIAGNOSE) == 0) {
17426 		if (sd_validate_sense_data(un, cmd_bp, cmd_xp, actual_len) ==
17427 		    SD_SENSE_DATA_IS_VALID) {
17428 			sd_decode_sense(un, cmd_bp, cmd_xp, cmd_pktp);
17429 		}
17430 	} else {
17431 		SD_DUMP_MEMORY(un, SD_LOG_IO_CORE, "Failed CDB",
17432 		    (uchar_t *)cmd_pktp->pkt_cdbp, CDB_SIZE, SD_LOG_HEX);
17433 		SD_DUMP_MEMORY(un, SD_LOG_IO_CORE, "Sense Data",
17434 		    (uchar_t *)cmd_xp->xb_sense_data, SENSE_LENGTH, SD_LOG_HEX);
17435 		sd_return_failed_command(un, cmd_bp, EIO);
17436 	}
17437 }
17438 
17439 
17440 
17441 
17442 /*
17443  *    Function: sd_handle_auto_request_sense
17444  *
17445  * Description: Processing for auto-request sense information.
17446  *
17447  *   Arguments: un - ptr to associated softstate
17448  *		bp - ptr to buf(9S) for the command
17449  *		xp - ptr to the sd_xbuf for the command
17450  *		pktp - ptr to the scsi_pkt(9S) for the command
17451  *
17452  *     Context: May be called under interrupt context
17453  */
17454 
17455 static void
17456 sd_handle_auto_request_sense(struct sd_lun *un, struct buf *bp,
17457     struct sd_xbuf *xp, struct scsi_pkt *pktp)
17458 {
17459 	struct scsi_arq_status *asp;
17460 	size_t actual_len;
17461 
17462 	ASSERT(un != NULL);
17463 	ASSERT(mutex_owned(SD_MUTEX(un)));
17464 	ASSERT(bp != NULL);
17465 	ASSERT(xp != NULL);
17466 	ASSERT(pktp != NULL);
17467 	ASSERT(pktp != un->un_rqs_pktp);
17468 	ASSERT(bp   != un->un_rqs_bp);
17469 
17470 	/*
17471 	 * For auto-request sense, we get a scsi_arq_status back from
17472 	 * the HBA, with the sense data in the sts_sensedata member.
17473 	 * The pkt_scbp of the packet points to this scsi_arq_status.
17474 	 */
17475 	asp = (struct scsi_arq_status *)(pktp->pkt_scbp);
17476 
17477 	if (asp->sts_rqpkt_reason != CMD_CMPLT) {
17478 		/*
17479 		 * The auto REQUEST SENSE failed; see if we can re-try
17480 		 * the original command.
17481 		 */
17482 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17483 		    "auto request sense failed (reason=%s)\n",
17484 		    scsi_rname(asp->sts_rqpkt_reason));
17485 
17486 		sd_reset_target(un, pktp);
17487 
17488 		sd_retry_command(un, bp, SD_RETRIES_STANDARD,
17489 		    NULL, NULL, EIO, (clock_t)0, NULL);
17490 		return;
17491 	}
17492 
17493 	/* Save the relevant sense info into the xp for the original cmd. */
17494 	xp->xb_sense_status = *((uchar_t *)(&(asp->sts_rqpkt_status)));
17495 	xp->xb_sense_state  = asp->sts_rqpkt_state;
17496 	xp->xb_sense_resid  = asp->sts_rqpkt_resid;
17497 	if (xp->xb_sense_state & STATE_XARQ_DONE) {
17498 		actual_len = MAX_SENSE_LENGTH - xp->xb_sense_resid;
17499 		bcopy(&asp->sts_sensedata, xp->xb_sense_data,
17500 		    MAX_SENSE_LENGTH);
17501 	} else {
17502 		if (xp->xb_sense_resid > SENSE_LENGTH) {
17503 			actual_len = MAX_SENSE_LENGTH - xp->xb_sense_resid;
17504 		} else {
17505 			actual_len = SENSE_LENGTH - xp->xb_sense_resid;
17506 		}
17507 		if (xp->xb_pkt_flags & SD_XB_USCSICMD) {
17508 			if ((((struct uscsi_cmd *)
17509 			    (xp->xb_pktinfo))->uscsi_rqlen) > actual_len) {
17510 				xp->xb_sense_resid = (((struct uscsi_cmd *)
17511 				    (xp->xb_pktinfo))->uscsi_rqlen) -
17512 				    actual_len;
17513 			} else {
17514 				xp->xb_sense_resid = 0;
17515 			}
17516 		}
17517 		bcopy(&asp->sts_sensedata, xp->xb_sense_data, SENSE_LENGTH);
17518 	}
17519 
17520 	/*
17521 	 * See if we have valid sense data, if so then turn it over to
17522 	 * sd_decode_sense() to figure out the right course of action.
17523 	 */
17524 	if (sd_validate_sense_data(un, bp, xp, actual_len) ==
17525 	    SD_SENSE_DATA_IS_VALID) {
17526 		sd_decode_sense(un, bp, xp, pktp);
17527 	}
17528 }
17529 
17530 
17531 /*
17532  *    Function: sd_print_sense_failed_msg
17533  *
17534  * Description: Print log message when RQS has failed.
17535  *
17536  *   Arguments: un - ptr to associated softstate
17537  *		bp - ptr to buf(9S) for the command
17538  *		arg - generic message string ptr
17539  *		code - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED,
17540  *			or SD_NO_RETRY_ISSUED
17541  *
17542  *     Context: May be called from interrupt context
17543  */
17544 
17545 static void
17546 sd_print_sense_failed_msg(struct sd_lun *un, struct buf *bp, void *arg,
17547     int code)
17548 {
17549 	char	*msgp = arg;
17550 
17551 	ASSERT(un != NULL);
17552 	ASSERT(mutex_owned(SD_MUTEX(un)));
17553 	ASSERT(bp != NULL);
17554 
17555 	if ((code == SD_NO_RETRY_ISSUED) && (msgp != NULL)) {
17556 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, msgp);
17557 	}
17558 }
17559 
17560 
17561 /*
17562  *    Function: sd_validate_sense_data
17563  *
17564  * Description: Check the given sense data for validity.
17565  *		If the sense data is not valid, the command will
17566  *		be either failed or retried!
17567  *
17568  * Return Code: SD_SENSE_DATA_IS_INVALID
17569  *		SD_SENSE_DATA_IS_VALID
17570  *
17571  *     Context: May be called from interrupt context
17572  */
17573 
17574 static int
17575 sd_validate_sense_data(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
17576     size_t actual_len)
17577 {
17578 	struct scsi_extended_sense *esp;
17579 	struct	scsi_pkt *pktp;
17580 	char	*msgp = NULL;
17581 	sd_ssc_t *sscp;
17582 
17583 	ASSERT(un != NULL);
17584 	ASSERT(mutex_owned(SD_MUTEX(un)));
17585 	ASSERT(bp != NULL);
17586 	ASSERT(bp != un->un_rqs_bp);
17587 	ASSERT(xp != NULL);
17588 	ASSERT(un->un_fm_private != NULL);
17589 
17590 	pktp = SD_GET_PKTP(bp);
17591 	ASSERT(pktp != NULL);
17592 
17593 	sscp = &((struct sd_fm_internal *)(un->un_fm_private))->fm_ssc;
17594 	ASSERT(sscp != NULL);
17595 
17596 	/*
17597 	 * Check the status of the RQS command (auto or manual).
17598 	 */
17599 	switch (xp->xb_sense_status & STATUS_MASK) {
17600 	case STATUS_GOOD:
17601 		break;
17602 
17603 	case STATUS_RESERVATION_CONFLICT:
17604 		sd_pkt_status_reservation_conflict(un, bp, xp, pktp);
17605 		return (SD_SENSE_DATA_IS_INVALID);
17606 
17607 	case STATUS_BUSY:
17608 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17609 		    "Busy Status on REQUEST SENSE\n");
17610 		sd_retry_command(un, bp, SD_RETRIES_BUSY, NULL,
17611 		    NULL, EIO, un->un_busy_timeout / 500, kstat_waitq_enter);
17612 		return (SD_SENSE_DATA_IS_INVALID);
17613 
17614 	case STATUS_QFULL:
17615 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17616 		    "QFULL Status on REQUEST SENSE\n");
17617 		sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL,
17618 		    NULL, EIO, un->un_busy_timeout / 500, kstat_waitq_enter);
17619 		return (SD_SENSE_DATA_IS_INVALID);
17620 
17621 	case STATUS_CHECK:
17622 	case STATUS_TERMINATED:
17623 		msgp = "Check Condition on REQUEST SENSE\n";
17624 		goto sense_failed;
17625 
17626 	default:
17627 		msgp = "Not STATUS_GOOD on REQUEST_SENSE\n";
17628 		goto sense_failed;
17629 	}
17630 
17631 	/*
17632 	 * See if we got the minimum required amount of sense data.
17633 	 * Note: We are assuming the returned sense data is SENSE_LENGTH bytes
17634 	 * or less.
17635 	 */
17636 	if (((xp->xb_sense_state & STATE_XFERRED_DATA) == 0) ||
17637 	    (actual_len == 0)) {
17638 		msgp = "Request Sense couldn't get sense data\n";
17639 		goto sense_failed;
17640 	}
17641 
17642 	if (actual_len < SUN_MIN_SENSE_LENGTH) {
17643 		msgp = "Not enough sense information\n";
17644 		/* Mark the ssc_flags for detecting invalid sense data */
17645 		if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
17646 			sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_SENSE, 0,
17647 			    "sense-data");
17648 		}
17649 		goto sense_failed;
17650 	}
17651 
17652 	/*
17653 	 * We require the extended sense data
17654 	 */
17655 	esp = (struct scsi_extended_sense *)xp->xb_sense_data;
17656 	if (esp->es_class != CLASS_EXTENDED_SENSE) {
17657 		if ((pktp->pkt_flags & FLAG_SILENT) == 0) {
17658 			static char tmp[8];
17659 			static char buf[148];
17660 			char *p = (char *)(xp->xb_sense_data);
17661 			int i;
17662 
17663 			mutex_enter(&sd_sense_mutex);
17664 			(void) strcpy(buf, "undecodable sense information:");
17665 			for (i = 0; i < actual_len; i++) {
17666 				(void) sprintf(tmp, " 0x%x", *(p++)&0xff);
17667 				(void) strcpy(&buf[strlen(buf)], tmp);
17668 			}
17669 			i = strlen(buf);
17670 			(void) strcpy(&buf[i], "-(assumed fatal)\n");
17671 
17672 			if (SD_FM_LOG(un) == SD_FM_LOG_NSUP) {
17673 				scsi_log(SD_DEVINFO(un), sd_label,
17674 				    CE_WARN, buf);
17675 			}
17676 			mutex_exit(&sd_sense_mutex);
17677 		}
17678 
17679 		/* Mark the ssc_flags for detecting invalid sense data */
17680 		if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
17681 			sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_SENSE, 0,
17682 			    "sense-data");
17683 		}
17684 
17685 		/* Note: Legacy behavior, fail the command with no retry */
17686 		sd_return_failed_command(un, bp, EIO);
17687 		return (SD_SENSE_DATA_IS_INVALID);
17688 	}
17689 
17690 	/*
17691 	 * Check that es_code is valid (es_class concatenated with es_code
17692 	 * make up the "response code" field.  es_class will always be 7, so
17693 	 * make sure es_code is 0, 1, 2, 3 or 0xf.  es_code will indicate the
17694 	 * format.
17695 	 */
17696 	if ((esp->es_code != CODE_FMT_FIXED_CURRENT) &&
17697 	    (esp->es_code != CODE_FMT_FIXED_DEFERRED) &&
17698 	    (esp->es_code != CODE_FMT_DESCR_CURRENT) &&
17699 	    (esp->es_code != CODE_FMT_DESCR_DEFERRED) &&
17700 	    (esp->es_code != CODE_FMT_VENDOR_SPECIFIC)) {
17701 		/* Mark the ssc_flags for detecting invalid sense data */
17702 		if (!(xp->xb_pkt_flags & SD_XB_USCSICMD)) {
17703 			sd_ssc_set_info(sscp, SSC_FLAGS_INVALID_SENSE, 0,
17704 			    "sense-data");
17705 		}
17706 		goto sense_failed;
17707 	}
17708 
17709 	return (SD_SENSE_DATA_IS_VALID);
17710 
17711 sense_failed:
17712 	/*
17713 	 * If the request sense failed (for whatever reason), attempt
17714 	 * to retry the original command.
17715 	 */
17716 #if defined(__i386) || defined(__amd64)
17717 	/*
17718 	 * SD_RETRY_DELAY is conditionally compile (#if fibre) in
17719 	 * sddef.h for Sparc platform, and x86 uses 1 binary
17720 	 * for both SCSI/FC.
17721 	 * The SD_RETRY_DELAY value need to be adjusted here
17722 	 * when SD_RETRY_DELAY change in sddef.h
17723 	 */
17724 	sd_retry_command(un, bp, SD_RETRIES_STANDARD,
17725 	    sd_print_sense_failed_msg, msgp, EIO,
17726 	    un->un_f_is_fibre?drv_usectohz(100000):(clock_t)0, NULL);
17727 #else
17728 	sd_retry_command(un, bp, SD_RETRIES_STANDARD,
17729 	    sd_print_sense_failed_msg, msgp, EIO, SD_RETRY_DELAY, NULL);
17730 #endif
17731 
17732 	return (SD_SENSE_DATA_IS_INVALID);
17733 }
17734 
17735 /*
17736  *    Function: sd_decode_sense
17737  *
17738  * Description: Take recovery action(s) when SCSI Sense Data is received.
17739  *
17740  *     Context: Interrupt context.
17741  */
17742 
17743 static void
17744 sd_decode_sense(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
17745     struct scsi_pkt *pktp)
17746 {
17747 	uint8_t sense_key;
17748 
17749 	ASSERT(un != NULL);
17750 	ASSERT(mutex_owned(SD_MUTEX(un)));
17751 	ASSERT(bp != NULL);
17752 	ASSERT(bp != un->un_rqs_bp);
17753 	ASSERT(xp != NULL);
17754 	ASSERT(pktp != NULL);
17755 
17756 	sense_key = scsi_sense_key(xp->xb_sense_data);
17757 
17758 	switch (sense_key) {
17759 	case KEY_NO_SENSE:
17760 		sd_sense_key_no_sense(un, bp, xp, pktp);
17761 		break;
17762 	case KEY_RECOVERABLE_ERROR:
17763 		sd_sense_key_recoverable_error(un, xp->xb_sense_data,
17764 		    bp, xp, pktp);
17765 		break;
17766 	case KEY_NOT_READY:
17767 		sd_sense_key_not_ready(un, xp->xb_sense_data,
17768 		    bp, xp, pktp);
17769 		break;
17770 	case KEY_MEDIUM_ERROR:
17771 	case KEY_HARDWARE_ERROR:
17772 		sd_sense_key_medium_or_hardware_error(un,
17773 		    xp->xb_sense_data, bp, xp, pktp);
17774 		break;
17775 	case KEY_ILLEGAL_REQUEST:
17776 		sd_sense_key_illegal_request(un, bp, xp, pktp);
17777 		break;
17778 	case KEY_UNIT_ATTENTION:
17779 		sd_sense_key_unit_attention(un, xp->xb_sense_data,
17780 		    bp, xp, pktp);
17781 		break;
17782 	case KEY_WRITE_PROTECT:
17783 	case KEY_VOLUME_OVERFLOW:
17784 	case KEY_MISCOMPARE:
17785 		sd_sense_key_fail_command(un, bp, xp, pktp);
17786 		break;
17787 	case KEY_BLANK_CHECK:
17788 		sd_sense_key_blank_check(un, bp, xp, pktp);
17789 		break;
17790 	case KEY_ABORTED_COMMAND:
17791 		sd_sense_key_aborted_command(un, bp, xp, pktp);
17792 		break;
17793 	case KEY_VENDOR_UNIQUE:
17794 	case KEY_COPY_ABORTED:
17795 	case KEY_EQUAL:
17796 	case KEY_RESERVED:
17797 	default:
17798 		sd_sense_key_default(un, xp->xb_sense_data,
17799 		    bp, xp, pktp);
17800 		break;
17801 	}
17802 }
17803 
17804 
17805 /*
17806  *    Function: sd_dump_memory
17807  *
17808  * Description: Debug logging routine to print the contents of a user provided
17809  *		buffer. The output of the buffer is broken up into 256 byte
17810  *		segments due to a size constraint of the scsi_log.
17811  *		implementation.
17812  *
17813  *   Arguments: un - ptr to softstate
17814  *		comp - component mask
17815  *		title - "title" string to preceed data when printed
17816  *		data - ptr to data block to be printed
17817  *		len - size of data block to be printed
17818  *		fmt - SD_LOG_HEX (use 0x%02x format) or SD_LOG_CHAR (use %c)
17819  *
17820  *     Context: May be called from interrupt context
17821  */
17822 
17823 #define	SD_DUMP_MEMORY_BUF_SIZE	256
17824 
17825 static char *sd_dump_format_string[] = {
17826 		" 0x%02x",
17827 		" %c"
17828 };
17829 
17830 static void
17831 sd_dump_memory(struct sd_lun *un, uint_t comp, char *title, uchar_t *data,
17832     int len, int fmt)
17833 {
17834 	int	i, j;
17835 	int	avail_count;
17836 	int	start_offset;
17837 	int	end_offset;
17838 	size_t	entry_len;
17839 	char	*bufp;
17840 	char	*local_buf;
17841 	char	*format_string;
17842 
17843 	ASSERT((fmt == SD_LOG_HEX) || (fmt == SD_LOG_CHAR));
17844 
17845 	/*
17846 	 * In the debug version of the driver, this function is called from a
17847 	 * number of places which are NOPs in the release driver.
17848 	 * The debug driver therefore has additional methods of filtering
17849 	 * debug output.
17850 	 */
17851 #ifdef SDDEBUG
17852 	/*
17853 	 * In the debug version of the driver we can reduce the amount of debug
17854 	 * messages by setting sd_error_level to something other than
17855 	 * SCSI_ERR_ALL and clearing bits in sd_level_mask and
17856 	 * sd_component_mask.
17857 	 */
17858 	if (((sd_level_mask & (SD_LOGMASK_DUMP_MEM | SD_LOGMASK_DIAG)) == 0) ||
17859 	    (sd_error_level != SCSI_ERR_ALL)) {
17860 		return;
17861 	}
17862 	if (((sd_component_mask & comp) == 0) ||
17863 	    (sd_error_level != SCSI_ERR_ALL)) {
17864 		return;
17865 	}
17866 #else
17867 	if (sd_error_level != SCSI_ERR_ALL) {
17868 		return;
17869 	}
17870 #endif
17871 
17872 	local_buf = kmem_zalloc(SD_DUMP_MEMORY_BUF_SIZE, KM_SLEEP);
17873 	bufp = local_buf;
17874 	/*
17875 	 * Available length is the length of local_buf[], minus the
17876 	 * length of the title string, minus one for the ":", minus
17877 	 * one for the newline, minus one for the NULL terminator.
17878 	 * This gives the #bytes available for holding the printed
17879 	 * values from the given data buffer.
17880 	 */
17881 	if (fmt == SD_LOG_HEX) {
17882 		format_string = sd_dump_format_string[0];
17883 	} else /* SD_LOG_CHAR */ {
17884 		format_string = sd_dump_format_string[1];
17885 	}
17886 	/*
17887 	 * Available count is the number of elements from the given
17888 	 * data buffer that we can fit into the available length.
17889 	 * This is based upon the size of the format string used.
17890 	 * Make one entry and find it's size.
17891 	 */
17892 	(void) sprintf(bufp, format_string, data[0]);
17893 	entry_len = strlen(bufp);
17894 	avail_count = (SD_DUMP_MEMORY_BUF_SIZE - strlen(title) - 3) / entry_len;
17895 
17896 	j = 0;
17897 	while (j < len) {
17898 		bufp = local_buf;
17899 		bzero(bufp, SD_DUMP_MEMORY_BUF_SIZE);
17900 		start_offset = j;
17901 
17902 		end_offset = start_offset + avail_count;
17903 
17904 		(void) sprintf(bufp, "%s:", title);
17905 		bufp += strlen(bufp);
17906 		for (i = start_offset; ((i < end_offset) && (j < len));
17907 		    i++, j++) {
17908 			(void) sprintf(bufp, format_string, data[i]);
17909 			bufp += entry_len;
17910 		}
17911 		(void) sprintf(bufp, "\n");
17912 
17913 		scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE, "%s", local_buf);
17914 	}
17915 	kmem_free(local_buf, SD_DUMP_MEMORY_BUF_SIZE);
17916 }
17917 
17918 /*
17919  *    Function: sd_print_sense_msg
17920  *
17921  * Description: Log a message based upon the given sense data.
17922  *
17923  *   Arguments: un - ptr to associated softstate
17924  *		bp - ptr to buf(9S) for the command
17925  *		arg - ptr to associate sd_sense_info struct
17926  *		code - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED,
17927  *			or SD_NO_RETRY_ISSUED
17928  *
17929  *     Context: May be called from interrupt context
17930  */
17931 
17932 static void
17933 sd_print_sense_msg(struct sd_lun *un, struct buf *bp, void *arg, int code)
17934 {
17935 	struct sd_xbuf	*xp;
17936 	struct scsi_pkt	*pktp;
17937 	uint8_t *sensep;
17938 	daddr_t request_blkno;
17939 	diskaddr_t err_blkno;
17940 	int severity;
17941 	int pfa_flag;
17942 	extern struct scsi_key_strings scsi_cmds[];
17943 
17944 	ASSERT(un != NULL);
17945 	ASSERT(mutex_owned(SD_MUTEX(un)));
17946 	ASSERT(bp != NULL);
17947 	xp = SD_GET_XBUF(bp);
17948 	ASSERT(xp != NULL);
17949 	pktp = SD_GET_PKTP(bp);
17950 	ASSERT(pktp != NULL);
17951 	ASSERT(arg != NULL);
17952 
17953 	severity = ((struct sd_sense_info *)(arg))->ssi_severity;
17954 	pfa_flag = ((struct sd_sense_info *)(arg))->ssi_pfa_flag;
17955 
17956 	if ((code == SD_DELAYED_RETRY_ISSUED) ||
17957 	    (code == SD_IMMEDIATE_RETRY_ISSUED)) {
17958 		severity = SCSI_ERR_RETRYABLE;
17959 	}
17960 
17961 	/* Use absolute block number for the request block number */
17962 	request_blkno = xp->xb_blkno;
17963 
17964 	/*
17965 	 * Now try to get the error block number from the sense data
17966 	 */
17967 	sensep = xp->xb_sense_data;
17968 
17969 	if (scsi_sense_info_uint64(sensep, SENSE_LENGTH,
17970 	    (uint64_t *)&err_blkno)) {
17971 		/*
17972 		 * We retrieved the error block number from the information
17973 		 * portion of the sense data.
17974 		 *
17975 		 * For USCSI commands we are better off using the error
17976 		 * block no. as the requested block no. (This is the best
17977 		 * we can estimate.)
17978 		 */
17979 		if ((SD_IS_BUFIO(xp) == FALSE) &&
17980 		    ((pktp->pkt_flags & FLAG_SILENT) == 0)) {
17981 			request_blkno = err_blkno;
17982 		}
17983 	} else {
17984 		/*
17985 		 * Without the es_valid bit set (for fixed format) or an
17986 		 * information descriptor (for descriptor format) we cannot
17987 		 * be certain of the error blkno, so just use the
17988 		 * request_blkno.
17989 		 */
17990 		err_blkno = (diskaddr_t)request_blkno;
17991 	}
17992 
17993 	/*
17994 	 * The following will log the buffer contents for the release driver
17995 	 * if the SD_LOGMASK_DIAG bit of sd_level_mask is set, or the error
17996 	 * level is set to verbose.
17997 	 */
17998 	sd_dump_memory(un, SD_LOG_IO, "Failed CDB",
17999 	    (uchar_t *)pktp->pkt_cdbp, CDB_SIZE, SD_LOG_HEX);
18000 	sd_dump_memory(un, SD_LOG_IO, "Sense Data",
18001 	    (uchar_t *)sensep, SENSE_LENGTH, SD_LOG_HEX);
18002 
18003 	if (pfa_flag == FALSE) {
18004 		/* This is normally only set for USCSI */
18005 		if ((pktp->pkt_flags & FLAG_SILENT) != 0) {
18006 			return;
18007 		}
18008 
18009 		if ((SD_IS_BUFIO(xp) == TRUE) &&
18010 		    (((sd_level_mask & SD_LOGMASK_DIAG) == 0) &&
18011 		    (severity < sd_error_level))) {
18012 			return;
18013 		}
18014 	}
18015 	/*
18016 	 * Check for Sonoma Failover and keep a count of how many failed I/O's
18017 	 */
18018 	if ((SD_IS_LSI(un)) &&
18019 	    (scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) &&
18020 	    (scsi_sense_asc(sensep) == 0x94) &&
18021 	    (scsi_sense_ascq(sensep) == 0x01)) {
18022 		un->un_sonoma_failure_count++;
18023 		if (un->un_sonoma_failure_count > 1) {
18024 			return;
18025 		}
18026 	}
18027 
18028 	if (SD_FM_LOG(un) == SD_FM_LOG_NSUP ||
18029 	    ((scsi_sense_key(sensep) == KEY_RECOVERABLE_ERROR) &&
18030 	    (pktp->pkt_resid == 0))) {
18031 		scsi_vu_errmsg(SD_SCSI_DEVP(un), pktp, sd_label, severity,
18032 		    request_blkno, err_blkno, scsi_cmds,
18033 		    (struct scsi_extended_sense *)sensep,
18034 		    un->un_additional_codes, NULL);
18035 	}
18036 }
18037 
18038 /*
18039  *    Function: sd_sense_key_no_sense
18040  *
18041  * Description: Recovery action when sense data was not received.
18042  *
18043  *     Context: May be called from interrupt context
18044  */
18045 
18046 static void
18047 sd_sense_key_no_sense(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
18048     struct scsi_pkt *pktp)
18049 {
18050 	struct sd_sense_info	si;
18051 
18052 	ASSERT(un != NULL);
18053 	ASSERT(mutex_owned(SD_MUTEX(un)));
18054 	ASSERT(bp != NULL);
18055 	ASSERT(xp != NULL);
18056 	ASSERT(pktp != NULL);
18057 
18058 	si.ssi_severity = SCSI_ERR_FATAL;
18059 	si.ssi_pfa_flag = FALSE;
18060 
18061 	SD_UPDATE_ERRSTATS(un, sd_softerrs);
18062 
18063 	sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
18064 	    &si, EIO, (clock_t)0, NULL);
18065 }
18066 
18067 
18068 /*
18069  *    Function: sd_sense_key_recoverable_error
18070  *
18071  * Description: Recovery actions for a SCSI "Recovered Error" sense key.
18072  *
18073  *     Context: May be called from interrupt context
18074  */
18075 
18076 static void
18077 sd_sense_key_recoverable_error(struct sd_lun *un, uint8_t *sense_datap,
18078     struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp)
18079 {
18080 	struct sd_sense_info	si;
18081 	uint8_t asc = scsi_sense_asc(sense_datap);
18082 	uint8_t ascq = scsi_sense_ascq(sense_datap);
18083 
18084 	ASSERT(un != NULL);
18085 	ASSERT(mutex_owned(SD_MUTEX(un)));
18086 	ASSERT(bp != NULL);
18087 	ASSERT(xp != NULL);
18088 	ASSERT(pktp != NULL);
18089 
18090 	/*
18091 	 * 0x00, 0x1D: ATA PASSTHROUGH INFORMATION AVAILABLE
18092 	 */
18093 	if (asc == 0x00 && ascq == 0x1D) {
18094 		sd_return_command(un, bp);
18095 		return;
18096 	}
18097 
18098 	/*
18099 	 * 0x5D: FAILURE PREDICTION THRESHOLD EXCEEDED
18100 	 */
18101 	if ((asc == 0x5D) && (sd_report_pfa != 0)) {
18102 		SD_UPDATE_ERRSTATS(un, sd_rq_pfa_err);
18103 		si.ssi_severity = SCSI_ERR_INFO;
18104 		si.ssi_pfa_flag = TRUE;
18105 	} else {
18106 		SD_UPDATE_ERRSTATS(un, sd_softerrs);
18107 		SD_UPDATE_ERRSTATS(un, sd_rq_recov_err);
18108 		si.ssi_severity = SCSI_ERR_RECOVERED;
18109 		si.ssi_pfa_flag = FALSE;
18110 	}
18111 
18112 	if (pktp->pkt_resid == 0) {
18113 		sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18114 		sd_return_command(un, bp);
18115 		return;
18116 	}
18117 
18118 	sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
18119 	    &si, EIO, (clock_t)0, NULL);
18120 }
18121 
18122 
18123 
18124 
18125 /*
18126  *    Function: sd_sense_key_not_ready
18127  *
18128  * Description: Recovery actions for a SCSI "Not Ready" sense key.
18129  *
18130  *     Context: May be called from interrupt context
18131  */
18132 
18133 static void
18134 sd_sense_key_not_ready(struct sd_lun *un, uint8_t *sense_datap, struct buf *bp,
18135     struct sd_xbuf *xp, struct scsi_pkt *pktp)
18136 {
18137 	struct sd_sense_info	si;
18138 	uint8_t asc = scsi_sense_asc(sense_datap);
18139 	uint8_t ascq = scsi_sense_ascq(sense_datap);
18140 
18141 	ASSERT(un != NULL);
18142 	ASSERT(mutex_owned(SD_MUTEX(un)));
18143 	ASSERT(bp != NULL);
18144 	ASSERT(xp != NULL);
18145 	ASSERT(pktp != NULL);
18146 
18147 	si.ssi_severity = SCSI_ERR_FATAL;
18148 	si.ssi_pfa_flag = FALSE;
18149 
18150 	/*
18151 	 * Update error stats after first NOT READY error. Disks may have
18152 	 * been powered down and may need to be restarted.  For CDROMs,
18153 	 * report NOT READY errors only if media is present.
18154 	 */
18155 	if ((ISCD(un) && (asc == 0x3A)) ||
18156 	    (xp->xb_nr_retry_count > 0)) {
18157 		SD_UPDATE_ERRSTATS(un, sd_harderrs);
18158 		SD_UPDATE_ERRSTATS(un, sd_rq_ntrdy_err);
18159 	}
18160 
18161 	/*
18162 	 * Just fail if the "not ready" retry limit has been reached.
18163 	 */
18164 	if (xp->xb_nr_retry_count >= un->un_notready_retry_count) {
18165 		/* Special check for error message printing for removables. */
18166 		if (un->un_f_has_removable_media && (asc == 0x04) &&
18167 		    (ascq >= 0x04)) {
18168 			si.ssi_severity = SCSI_ERR_ALL;
18169 		}
18170 		goto fail_command;
18171 	}
18172 
18173 	/*
18174 	 * Check the ASC and ASCQ in the sense data as needed, to determine
18175 	 * what to do.
18176 	 */
18177 	switch (asc) {
18178 	case 0x04:	/* LOGICAL UNIT NOT READY */
18179 		/*
18180 		 * disk drives that don't spin up result in a very long delay
18181 		 * in format without warning messages. We will log a message
18182 		 * if the error level is set to verbose.
18183 		 */
18184 		if (sd_error_level < SCSI_ERR_RETRYABLE) {
18185 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18186 			    "logical unit not ready, resetting disk\n");
18187 		}
18188 
18189 		/*
18190 		 * There are different requirements for CDROMs and disks for
18191 		 * the number of retries.  If a CD-ROM is giving this, it is
18192 		 * probably reading TOC and is in the process of getting
18193 		 * ready, so we should keep on trying for a long time to make
18194 		 * sure that all types of media are taken in account (for
18195 		 * some media the drive takes a long time to read TOC).  For
18196 		 * disks we do not want to retry this too many times as this
18197 		 * can cause a long hang in format when the drive refuses to
18198 		 * spin up (a very common failure).
18199 		 */
18200 		switch (ascq) {
18201 		case 0x00:  /* LUN NOT READY, CAUSE NOT REPORTABLE */
18202 			/*
18203 			 * Disk drives frequently refuse to spin up which
18204 			 * results in a very long hang in format without
18205 			 * warning messages.
18206 			 *
18207 			 * Note: This code preserves the legacy behavior of
18208 			 * comparing xb_nr_retry_count against zero for fibre
18209 			 * channel targets instead of comparing against the
18210 			 * un_reset_retry_count value.  The reason for this
18211 			 * discrepancy has been so utterly lost beneath the
18212 			 * Sands of Time that even Indiana Jones could not
18213 			 * find it.
18214 			 */
18215 			if (un->un_f_is_fibre == TRUE) {
18216 				if (((sd_level_mask & SD_LOGMASK_DIAG) ||
18217 				    (xp->xb_nr_retry_count > 0)) &&
18218 				    (un->un_startstop_timeid == NULL)) {
18219 					scsi_log(SD_DEVINFO(un), sd_label,
18220 					    CE_WARN, "logical unit not ready, "
18221 					    "resetting disk\n");
18222 					sd_reset_target(un, pktp);
18223 				}
18224 			} else {
18225 				if (((sd_level_mask & SD_LOGMASK_DIAG) ||
18226 				    (xp->xb_nr_retry_count >
18227 				    un->un_reset_retry_count)) &&
18228 				    (un->un_startstop_timeid == NULL)) {
18229 					scsi_log(SD_DEVINFO(un), sd_label,
18230 					    CE_WARN, "logical unit not ready, "
18231 					    "resetting disk\n");
18232 					sd_reset_target(un, pktp);
18233 				}
18234 			}
18235 			break;
18236 
18237 		case 0x01:  /* LUN IS IN PROCESS OF BECOMING READY */
18238 			/*
18239 			 * If the target is in the process of becoming
18240 			 * ready, just proceed with the retry. This can
18241 			 * happen with CD-ROMs that take a long time to
18242 			 * read TOC after a power cycle or reset.
18243 			 */
18244 			goto do_retry;
18245 
18246 		case 0x02:  /* LUN NOT READY, INITITIALIZING CMD REQUIRED */
18247 			break;
18248 
18249 		case 0x03:  /* LUN NOT READY, MANUAL INTERVENTION REQUIRED */
18250 			/*
18251 			 * Retries cannot help here so just fail right away.
18252 			 */
18253 			goto fail_command;
18254 
18255 		case 0x88:
18256 			/*
18257 			 * Vendor-unique code for T3/T4: it indicates a
18258 			 * path problem in a mutipathed config, but as far as
18259 			 * the target driver is concerned it equates to a fatal
18260 			 * error, so we should just fail the command right away
18261 			 * (without printing anything to the console). If this
18262 			 * is not a T3/T4, fall thru to the default recovery
18263 			 * action.
18264 			 * T3/T4 is FC only, don't need to check is_fibre
18265 			 */
18266 			if (SD_IS_T3(un) || SD_IS_T4(un)) {
18267 				sd_return_failed_command(un, bp, EIO);
18268 				return;
18269 			}
18270 			/* FALLTHRU */
18271 
18272 		case 0x04:  /* LUN NOT READY, FORMAT IN PROGRESS */
18273 		case 0x05:  /* LUN NOT READY, REBUILD IN PROGRESS */
18274 		case 0x06:  /* LUN NOT READY, RECALCULATION IN PROGRESS */
18275 		case 0x07:  /* LUN NOT READY, OPERATION IN PROGRESS */
18276 		case 0x08:  /* LUN NOT READY, LONG WRITE IN PROGRESS */
18277 		default:    /* Possible future codes in SCSI spec? */
18278 			/*
18279 			 * For removable-media devices, do not retry if
18280 			 * ASCQ > 2 as these result mostly from USCSI commands
18281 			 * on MMC devices issued to check status of an
18282 			 * operation initiated in immediate mode.  Also for
18283 			 * ASCQ >= 4 do not print console messages as these
18284 			 * mainly represent a user-initiated operation
18285 			 * instead of a system failure.
18286 			 */
18287 			if (un->un_f_has_removable_media) {
18288 				si.ssi_severity = SCSI_ERR_ALL;
18289 				goto fail_command;
18290 			}
18291 			break;
18292 		}
18293 
18294 		/*
18295 		 * As part of our recovery attempt for the NOT READY
18296 		 * condition, we issue a START STOP UNIT command. However
18297 		 * we want to wait for a short delay before attempting this
18298 		 * as there may still be more commands coming back from the
18299 		 * target with the check condition. To do this we use
18300 		 * timeout(9F) to call sd_start_stop_unit_callback() after
18301 		 * the delay interval expires. (sd_start_stop_unit_callback()
18302 		 * dispatches sd_start_stop_unit_task(), which will issue
18303 		 * the actual START STOP UNIT command. The delay interval
18304 		 * is one-half of the delay that we will use to retry the
18305 		 * command that generated the NOT READY condition.
18306 		 *
18307 		 * Note that we could just dispatch sd_start_stop_unit_task()
18308 		 * from here and allow it to sleep for the delay interval,
18309 		 * but then we would be tying up the taskq thread
18310 		 * uncesessarily for the duration of the delay.
18311 		 *
18312 		 * Do not issue the START STOP UNIT if the current command
18313 		 * is already a START STOP UNIT.
18314 		 */
18315 		if (pktp->pkt_cdbp[0] == SCMD_START_STOP) {
18316 			break;
18317 		}
18318 
18319 		/*
18320 		 * Do not schedule the timeout if one is already pending.
18321 		 */
18322 		if (un->un_startstop_timeid != NULL) {
18323 			SD_INFO(SD_LOG_ERROR, un,
18324 			    "sd_sense_key_not_ready: restart already issued to"
18325 			    " %s%d\n", ddi_driver_name(SD_DEVINFO(un)),
18326 			    ddi_get_instance(SD_DEVINFO(un)));
18327 			break;
18328 		}
18329 
18330 		/*
18331 		 * Schedule the START STOP UNIT command, then queue the command
18332 		 * for a retry.
18333 		 *
18334 		 * Note: A timeout is not scheduled for this retry because we
18335 		 * want the retry to be serial with the START_STOP_UNIT. The
18336 		 * retry will be started when the START_STOP_UNIT is completed
18337 		 * in sd_start_stop_unit_task.
18338 		 */
18339 		un->un_startstop_timeid = timeout(sd_start_stop_unit_callback,
18340 		    un, un->un_busy_timeout / 2);
18341 		xp->xb_nr_retry_count++;
18342 		sd_set_retry_bp(un, bp, 0, kstat_waitq_enter);
18343 		return;
18344 
18345 	case 0x05:	/* LOGICAL UNIT DOES NOT RESPOND TO SELECTION */
18346 		if (sd_error_level < SCSI_ERR_RETRYABLE) {
18347 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18348 			    "unit does not respond to selection\n");
18349 		}
18350 		break;
18351 
18352 	case 0x3A:	/* MEDIUM NOT PRESENT */
18353 		if (sd_error_level >= SCSI_ERR_FATAL) {
18354 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18355 			    "Caddy not inserted in drive\n");
18356 		}
18357 
18358 		sr_ejected(un);
18359 		un->un_mediastate = DKIO_EJECTED;
18360 		/* The state has changed, inform the media watch routines */
18361 		cv_broadcast(&un->un_state_cv);
18362 		/* Just fail if no media is present in the drive. */
18363 		goto fail_command;
18364 
18365 	default:
18366 		if (sd_error_level < SCSI_ERR_RETRYABLE) {
18367 			scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE,
18368 			    "Unit not Ready. Additional sense code 0x%x\n",
18369 			    asc);
18370 		}
18371 		break;
18372 	}
18373 
18374 do_retry:
18375 
18376 	/*
18377 	 * Retry the command, as some targets may report NOT READY for
18378 	 * several seconds after being reset.
18379 	 */
18380 	xp->xb_nr_retry_count++;
18381 	si.ssi_severity = SCSI_ERR_RETRYABLE;
18382 	sd_retry_command(un, bp, SD_RETRIES_NOCHECK, sd_print_sense_msg,
18383 	    &si, EIO, un->un_busy_timeout, NULL);
18384 
18385 	return;
18386 
18387 fail_command:
18388 	sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18389 	sd_return_failed_command(un, bp, EIO);
18390 }
18391 
18392 
18393 
18394 /*
18395  *    Function: sd_sense_key_medium_or_hardware_error
18396  *
18397  * Description: Recovery actions for a SCSI "Medium Error" or "Hardware Error"
18398  *		sense key.
18399  *
18400  *     Context: May be called from interrupt context
18401  */
18402 
18403 static void
18404 sd_sense_key_medium_or_hardware_error(struct sd_lun *un, uint8_t *sense_datap,
18405     struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp)
18406 {
18407 	struct sd_sense_info	si;
18408 	uint8_t sense_key = scsi_sense_key(sense_datap);
18409 	uint8_t asc = scsi_sense_asc(sense_datap);
18410 
18411 	ASSERT(un != NULL);
18412 	ASSERT(mutex_owned(SD_MUTEX(un)));
18413 	ASSERT(bp != NULL);
18414 	ASSERT(xp != NULL);
18415 	ASSERT(pktp != NULL);
18416 
18417 	si.ssi_severity = SCSI_ERR_FATAL;
18418 	si.ssi_pfa_flag = FALSE;
18419 
18420 	if (sense_key == KEY_MEDIUM_ERROR) {
18421 		SD_UPDATE_ERRSTATS(un, sd_rq_media_err);
18422 	}
18423 
18424 	SD_UPDATE_ERRSTATS(un, sd_harderrs);
18425 
18426 	if ((un->un_reset_retry_count != 0) &&
18427 	    (xp->xb_retry_count == un->un_reset_retry_count)) {
18428 		mutex_exit(SD_MUTEX(un));
18429 		/* Do NOT do a RESET_ALL here: too intrusive. (4112858) */
18430 		if (un->un_f_allow_bus_device_reset == TRUE) {
18431 
18432 			boolean_t try_resetting_target = B_TRUE;
18433 
18434 			/*
18435 			 * We need to be able to handle specific ASC when we are
18436 			 * handling a KEY_HARDWARE_ERROR. In particular
18437 			 * taking the default action of resetting the target may
18438 			 * not be the appropriate way to attempt recovery.
18439 			 * Resetting a target because of a single LUN failure
18440 			 * victimizes all LUNs on that target.
18441 			 *
18442 			 * This is true for the LSI arrays, if an LSI
18443 			 * array controller returns an ASC of 0x84 (LUN Dead) we
18444 			 * should trust it.
18445 			 */
18446 
18447 			if (sense_key == KEY_HARDWARE_ERROR) {
18448 				switch (asc) {
18449 				case 0x84:
18450 					if (SD_IS_LSI(un)) {
18451 						try_resetting_target = B_FALSE;
18452 					}
18453 					break;
18454 				default:
18455 					break;
18456 				}
18457 			}
18458 
18459 			if (try_resetting_target == B_TRUE) {
18460 				int reset_retval = 0;
18461 				if (un->un_f_lun_reset_enabled == TRUE) {
18462 					SD_TRACE(SD_LOG_IO_CORE, un,
18463 					    "sd_sense_key_medium_or_hardware_"
18464 					    "error: issuing RESET_LUN\n");
18465 					reset_retval =
18466 					    scsi_reset(SD_ADDRESS(un),
18467 					    RESET_LUN);
18468 				}
18469 				if (reset_retval == 0) {
18470 					SD_TRACE(SD_LOG_IO_CORE, un,
18471 					    "sd_sense_key_medium_or_hardware_"
18472 					    "error: issuing RESET_TARGET\n");
18473 					(void) scsi_reset(SD_ADDRESS(un),
18474 					    RESET_TARGET);
18475 				}
18476 			}
18477 		}
18478 		mutex_enter(SD_MUTEX(un));
18479 	}
18480 
18481 	/*
18482 	 * This really ought to be a fatal error, but we will retry anyway
18483 	 * as some drives report this as a spurious error.
18484 	 */
18485 	sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
18486 	    &si, EIO, (clock_t)0, NULL);
18487 }
18488 
18489 
18490 
18491 /*
18492  *    Function: sd_sense_key_illegal_request
18493  *
18494  * Description: Recovery actions for a SCSI "Illegal Request" sense key.
18495  *
18496  *     Context: May be called from interrupt context
18497  */
18498 
18499 static void
18500 sd_sense_key_illegal_request(struct sd_lun *un, struct buf *bp,
18501     struct sd_xbuf *xp, struct scsi_pkt *pktp)
18502 {
18503 	struct sd_sense_info	si;
18504 
18505 	ASSERT(un != NULL);
18506 	ASSERT(mutex_owned(SD_MUTEX(un)));
18507 	ASSERT(bp != NULL);
18508 	ASSERT(xp != NULL);
18509 	ASSERT(pktp != NULL);
18510 
18511 	SD_UPDATE_ERRSTATS(un, sd_rq_illrq_err);
18512 
18513 	si.ssi_severity = SCSI_ERR_INFO;
18514 	si.ssi_pfa_flag = FALSE;
18515 
18516 	/* Pointless to retry if the target thinks it's an illegal request */
18517 	sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18518 	sd_return_failed_command(un, bp, EIO);
18519 }
18520 
18521 
18522 
18523 
18524 /*
18525  *    Function: sd_sense_key_unit_attention
18526  *
18527  * Description: Recovery actions for a SCSI "Unit Attention" sense key.
18528  *
18529  *     Context: May be called from interrupt context
18530  */
18531 
18532 static void
18533 sd_sense_key_unit_attention(struct sd_lun *un, 	uint8_t *sense_datap,
18534     struct buf *bp, struct sd_xbuf *xp, struct scsi_pkt *pktp)
18535 {
18536 	/*
18537 	 * For UNIT ATTENTION we allow retries for one minute. Devices
18538 	 * like Sonoma can return UNIT ATTENTION close to a minute
18539 	 * under certain conditions.
18540 	 */
18541 	int	retry_check_flag = SD_RETRIES_UA;
18542 	boolean_t	kstat_updated = B_FALSE;
18543 	struct	sd_sense_info		si;
18544 	uint8_t asc = scsi_sense_asc(sense_datap);
18545 	uint8_t	ascq = scsi_sense_ascq(sense_datap);
18546 
18547 	ASSERT(un != NULL);
18548 	ASSERT(mutex_owned(SD_MUTEX(un)));
18549 	ASSERT(bp != NULL);
18550 	ASSERT(xp != NULL);
18551 	ASSERT(pktp != NULL);
18552 
18553 	si.ssi_severity = SCSI_ERR_INFO;
18554 	si.ssi_pfa_flag = FALSE;
18555 
18556 
18557 	switch (asc) {
18558 	case 0x5D:  /* FAILURE PREDICTION THRESHOLD EXCEEDED */
18559 		if (sd_report_pfa != 0) {
18560 			SD_UPDATE_ERRSTATS(un, sd_rq_pfa_err);
18561 			si.ssi_pfa_flag = TRUE;
18562 			retry_check_flag = SD_RETRIES_STANDARD;
18563 			goto do_retry;
18564 		}
18565 
18566 		break;
18567 
18568 	case 0x29:  /* POWER ON, RESET, OR BUS DEVICE RESET OCCURRED */
18569 		if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
18570 			un->un_resvd_status |=
18571 			    (SD_LOST_RESERVE | SD_WANT_RESERVE);
18572 		}
18573 #ifdef _LP64
18574 		if (un->un_blockcount + 1 > SD_GROUP1_MAX_ADDRESS) {
18575 			if (taskq_dispatch(sd_tq, sd_reenable_dsense_task,
18576 			    un, KM_NOSLEEP) == 0) {
18577 				/*
18578 				 * If we can't dispatch the task we'll just
18579 				 * live without descriptor sense.  We can
18580 				 * try again on the next "unit attention"
18581 				 */
18582 				SD_ERROR(SD_LOG_ERROR, un,
18583 				    "sd_sense_key_unit_attention: "
18584 				    "Could not dispatch "
18585 				    "sd_reenable_dsense_task\n");
18586 			}
18587 		}
18588 #endif /* _LP64 */
18589 		/* FALLTHRU */
18590 
18591 	case 0x28: /* NOT READY TO READY CHANGE, MEDIUM MAY HAVE CHANGED */
18592 		if (!un->un_f_has_removable_media) {
18593 			break;
18594 		}
18595 
18596 		/*
18597 		 * When we get a unit attention from a removable-media device,
18598 		 * it may be in a state that will take a long time to recover
18599 		 * (e.g., from a reset).  Since we are executing in interrupt
18600 		 * context here, we cannot wait around for the device to come
18601 		 * back. So hand this command off to sd_media_change_task()
18602 		 * for deferred processing under taskq thread context. (Note
18603 		 * that the command still may be failed if a problem is
18604 		 * encountered at a later time.)
18605 		 */
18606 		if (taskq_dispatch(sd_tq, sd_media_change_task, pktp,
18607 		    KM_NOSLEEP) == 0) {
18608 			/*
18609 			 * Cannot dispatch the request so fail the command.
18610 			 */
18611 			SD_UPDATE_ERRSTATS(un, sd_harderrs);
18612 			SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err);
18613 			si.ssi_severity = SCSI_ERR_FATAL;
18614 			sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18615 			sd_return_failed_command(un, bp, EIO);
18616 		}
18617 
18618 		/*
18619 		 * If failed to dispatch sd_media_change_task(), we already
18620 		 * updated kstat. If succeed to dispatch sd_media_change_task(),
18621 		 * we should update kstat later if it encounters an error. So,
18622 		 * we update kstat_updated flag here.
18623 		 */
18624 		kstat_updated = B_TRUE;
18625 
18626 		/*
18627 		 * Either the command has been successfully dispatched to a
18628 		 * task Q for retrying, or the dispatch failed. In either case
18629 		 * do NOT retry again by calling sd_retry_command. This sets up
18630 		 * two retries of the same command and when one completes and
18631 		 * frees the resources the other will access freed memory,
18632 		 * a bad thing.
18633 		 */
18634 		return;
18635 
18636 	default:
18637 		break;
18638 	}
18639 
18640 	/*
18641 	 * ASC  ASCQ
18642 	 *  2A   09	Capacity data has changed
18643 	 *  2A   01	Mode parameters changed
18644 	 *  3F   0E	Reported luns data has changed
18645 	 * Arrays that support logical unit expansion should report
18646 	 * capacity changes(2Ah/09). Mode parameters changed and
18647 	 * reported luns data has changed are the approximation.
18648 	 */
18649 	if (((asc == 0x2a) && (ascq == 0x09)) ||
18650 	    ((asc == 0x2a) && (ascq == 0x01)) ||
18651 	    ((asc == 0x3f) && (ascq == 0x0e))) {
18652 		if (taskq_dispatch(sd_tq, sd_target_change_task, un,
18653 		    KM_NOSLEEP) == 0) {
18654 			SD_ERROR(SD_LOG_ERROR, un,
18655 			    "sd_sense_key_unit_attention: "
18656 			    "Could not dispatch sd_target_change_task\n");
18657 		}
18658 	}
18659 
18660 	/*
18661 	 * Update kstat if we haven't done that.
18662 	 */
18663 	if (!kstat_updated) {
18664 		SD_UPDATE_ERRSTATS(un, sd_harderrs);
18665 		SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err);
18666 	}
18667 
18668 do_retry:
18669 	sd_retry_command(un, bp, retry_check_flag, sd_print_sense_msg, &si,
18670 	    EIO, SD_UA_RETRY_DELAY, NULL);
18671 }
18672 
18673 
18674 
18675 /*
18676  *    Function: sd_sense_key_fail_command
18677  *
18678  * Description: Use to fail a command when we don't like the sense key that
18679  *		was returned.
18680  *
18681  *     Context: May be called from interrupt context
18682  */
18683 
18684 static void
18685 sd_sense_key_fail_command(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
18686     struct scsi_pkt *pktp)
18687 {
18688 	struct sd_sense_info	si;
18689 
18690 	ASSERT(un != NULL);
18691 	ASSERT(mutex_owned(SD_MUTEX(un)));
18692 	ASSERT(bp != NULL);
18693 	ASSERT(xp != NULL);
18694 	ASSERT(pktp != NULL);
18695 
18696 	si.ssi_severity = SCSI_ERR_FATAL;
18697 	si.ssi_pfa_flag = FALSE;
18698 
18699 	sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18700 	sd_return_failed_command(un, bp, EIO);
18701 }
18702 
18703 
18704 
18705 /*
18706  *    Function: sd_sense_key_blank_check
18707  *
18708  * Description: Recovery actions for a SCSI "Blank Check" sense key.
18709  *		Has no monetary connotation.
18710  *
18711  *     Context: May be called from interrupt context
18712  */
18713 
18714 static void
18715 sd_sense_key_blank_check(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
18716     struct scsi_pkt *pktp)
18717 {
18718 	struct sd_sense_info	si;
18719 
18720 	ASSERT(un != NULL);
18721 	ASSERT(mutex_owned(SD_MUTEX(un)));
18722 	ASSERT(bp != NULL);
18723 	ASSERT(xp != NULL);
18724 	ASSERT(pktp != NULL);
18725 
18726 	/*
18727 	 * Blank check is not fatal for removable devices, therefore
18728 	 * it does not require a console message.
18729 	 */
18730 	si.ssi_severity = (un->un_f_has_removable_media) ? SCSI_ERR_ALL :
18731 	    SCSI_ERR_FATAL;
18732 	si.ssi_pfa_flag = FALSE;
18733 
18734 	sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18735 	sd_return_failed_command(un, bp, EIO);
18736 }
18737 
18738 
18739 
18740 
18741 /*
18742  *    Function: sd_sense_key_aborted_command
18743  *
18744  * Description: Recovery actions for a SCSI "Aborted Command" sense key.
18745  *
18746  *     Context: May be called from interrupt context
18747  */
18748 
18749 static void
18750 sd_sense_key_aborted_command(struct sd_lun *un, struct buf *bp,
18751     struct sd_xbuf *xp, struct scsi_pkt *pktp)
18752 {
18753 	struct sd_sense_info	si;
18754 
18755 	ASSERT(un != NULL);
18756 	ASSERT(mutex_owned(SD_MUTEX(un)));
18757 	ASSERT(bp != NULL);
18758 	ASSERT(xp != NULL);
18759 	ASSERT(pktp != NULL);
18760 
18761 	si.ssi_severity = SCSI_ERR_FATAL;
18762 	si.ssi_pfa_flag = FALSE;
18763 
18764 	SD_UPDATE_ERRSTATS(un, sd_harderrs);
18765 
18766 	/*
18767 	 * This really ought to be a fatal error, but we will retry anyway
18768 	 * as some drives report this as a spurious error.
18769 	 */
18770 	sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
18771 	    &si, EIO, drv_usectohz(100000), NULL);
18772 }
18773 
18774 
18775 
18776 /*
18777  *    Function: sd_sense_key_default
18778  *
18779  * Description: Default recovery action for several SCSI sense keys (basically
18780  *		attempts a retry).
18781  *
18782  *     Context: May be called from interrupt context
18783  */
18784 
18785 static void
18786 sd_sense_key_default(struct sd_lun *un, uint8_t *sense_datap, struct buf *bp,
18787     struct sd_xbuf *xp, struct scsi_pkt *pktp)
18788 {
18789 	struct sd_sense_info	si;
18790 	uint8_t sense_key = scsi_sense_key(sense_datap);
18791 
18792 	ASSERT(un != NULL);
18793 	ASSERT(mutex_owned(SD_MUTEX(un)));
18794 	ASSERT(bp != NULL);
18795 	ASSERT(xp != NULL);
18796 	ASSERT(pktp != NULL);
18797 
18798 	SD_UPDATE_ERRSTATS(un, sd_harderrs);
18799 
18800 	/*
18801 	 * Undecoded sense key.	Attempt retries and hope that will fix
18802 	 * the problem.  Otherwise, we're dead.
18803 	 */
18804 	if ((pktp->pkt_flags & FLAG_SILENT) == 0) {
18805 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18806 		    "Unhandled Sense Key '%s'\n", sense_keys[sense_key]);
18807 	}
18808 
18809 	si.ssi_severity = SCSI_ERR_FATAL;
18810 	si.ssi_pfa_flag = FALSE;
18811 
18812 	sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
18813 	    &si, EIO, (clock_t)0, NULL);
18814 }
18815 
18816 
18817 
18818 /*
18819  *    Function: sd_print_retry_msg
18820  *
18821  * Description: Print a message indicating the retry action being taken.
18822  *
18823  *   Arguments: un - ptr to associated softstate
18824  *		bp - ptr to buf(9S) for the command
18825  *		arg - not used.
18826  *		flag - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED,
18827  *			or SD_NO_RETRY_ISSUED
18828  *
18829  *     Context: May be called from interrupt context
18830  */
18831 /* ARGSUSED */
18832 static void
18833 sd_print_retry_msg(struct sd_lun *un, struct buf *bp, void *arg, int flag)
18834 {
18835 	struct sd_xbuf	*xp;
18836 	struct scsi_pkt *pktp;
18837 	char *reasonp;
18838 	char *msgp;
18839 
18840 	ASSERT(un != NULL);
18841 	ASSERT(mutex_owned(SD_MUTEX(un)));
18842 	ASSERT(bp != NULL);
18843 	pktp = SD_GET_PKTP(bp);
18844 	ASSERT(pktp != NULL);
18845 	xp = SD_GET_XBUF(bp);
18846 	ASSERT(xp != NULL);
18847 
18848 	ASSERT(!mutex_owned(&un->un_pm_mutex));
18849 	mutex_enter(&un->un_pm_mutex);
18850 	if ((un->un_state == SD_STATE_SUSPENDED) ||
18851 	    (SD_DEVICE_IS_IN_LOW_POWER(un)) ||
18852 	    (pktp->pkt_flags & FLAG_SILENT)) {
18853 		mutex_exit(&un->un_pm_mutex);
18854 		goto update_pkt_reason;
18855 	}
18856 	mutex_exit(&un->un_pm_mutex);
18857 
18858 	/*
18859 	 * Suppress messages if they are all the same pkt_reason; with
18860 	 * TQ, many (up to 256) are returned with the same pkt_reason.
18861 	 * If we are in panic, then suppress the retry messages.
18862 	 */
18863 	switch (flag) {
18864 	case SD_NO_RETRY_ISSUED:
18865 		msgp = "giving up";
18866 		break;
18867 	case SD_IMMEDIATE_RETRY_ISSUED:
18868 	case SD_DELAYED_RETRY_ISSUED:
18869 		if (ddi_in_panic() || (un->un_state == SD_STATE_OFFLINE) ||
18870 		    ((pktp->pkt_reason == un->un_last_pkt_reason) &&
18871 		    (sd_error_level != SCSI_ERR_ALL))) {
18872 			return;
18873 		}
18874 		msgp = "retrying command";
18875 		break;
18876 	default:
18877 		goto update_pkt_reason;
18878 	}
18879 
18880 	reasonp = (((pktp->pkt_statistics & STAT_PERR) != 0) ? "parity error" :
18881 	    scsi_rname(pktp->pkt_reason));
18882 
18883 	if (SD_FM_LOG(un) == SD_FM_LOG_NSUP) {
18884 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18885 		    "SCSI transport failed: reason '%s': %s\n", reasonp, msgp);
18886 	}
18887 
18888 update_pkt_reason:
18889 	/*
18890 	 * Update un->un_last_pkt_reason with the value in pktp->pkt_reason.
18891 	 * This is to prevent multiple console messages for the same failure
18892 	 * condition.  Note that un->un_last_pkt_reason is NOT restored if &
18893 	 * when the command is retried successfully because there still may be
18894 	 * more commands coming back with the same value of pktp->pkt_reason.
18895 	 */
18896 	if ((pktp->pkt_reason != CMD_CMPLT) || (xp->xb_retry_count == 0)) {
18897 		un->un_last_pkt_reason = pktp->pkt_reason;
18898 	}
18899 }
18900 
18901 
18902 /*
18903  *    Function: sd_print_cmd_incomplete_msg
18904  *
18905  * Description: Message logging fn. for a SCSA "CMD_INCOMPLETE" pkt_reason.
18906  *
18907  *   Arguments: un - ptr to associated softstate
18908  *		bp - ptr to buf(9S) for the command
18909  *		arg - passed to sd_print_retry_msg()
18910  *		code - SD_IMMEDIATE_RETRY_ISSUED, SD_DELAYED_RETRY_ISSUED,
18911  *			or SD_NO_RETRY_ISSUED
18912  *
18913  *     Context: May be called from interrupt context
18914  */
18915 
18916 static void
18917 sd_print_cmd_incomplete_msg(struct sd_lun *un, struct buf *bp, void *arg,
18918     int code)
18919 {
18920 	dev_info_t	*dip;
18921 
18922 	ASSERT(un != NULL);
18923 	ASSERT(mutex_owned(SD_MUTEX(un)));
18924 	ASSERT(bp != NULL);
18925 
18926 	switch (code) {
18927 	case SD_NO_RETRY_ISSUED:
18928 		/* Command was failed. Someone turned off this target? */
18929 		if (un->un_state != SD_STATE_OFFLINE) {
18930 			/*
18931 			 * Suppress message if we are detaching and
18932 			 * device has been disconnected
18933 			 * Note that DEVI_IS_DEVICE_REMOVED is a consolidation
18934 			 * private interface and not part of the DDI
18935 			 */
18936 			dip = un->un_sd->sd_dev;
18937 			if (!(DEVI_IS_DETACHING(dip) &&
18938 			    DEVI_IS_DEVICE_REMOVED(dip))) {
18939 				scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18940 				"disk not responding to selection\n");
18941 			}
18942 			New_state(un, SD_STATE_OFFLINE);
18943 		}
18944 		break;
18945 
18946 	case SD_DELAYED_RETRY_ISSUED:
18947 	case SD_IMMEDIATE_RETRY_ISSUED:
18948 	default:
18949 		/* Command was successfully queued for retry */
18950 		sd_print_retry_msg(un, bp, arg, code);
18951 		break;
18952 	}
18953 }
18954 
18955 
18956 /*
18957  *    Function: sd_pkt_reason_cmd_incomplete
18958  *
18959  * Description: Recovery actions for a SCSA "CMD_INCOMPLETE" pkt_reason.
18960  *
18961  *     Context: May be called from interrupt context
18962  */
18963 
18964 static void
18965 sd_pkt_reason_cmd_incomplete(struct sd_lun *un, struct buf *bp,
18966     struct sd_xbuf *xp, struct scsi_pkt *pktp)
18967 {
18968 	int flag = SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE;
18969 
18970 	ASSERT(un != NULL);
18971 	ASSERT(mutex_owned(SD_MUTEX(un)));
18972 	ASSERT(bp != NULL);
18973 	ASSERT(xp != NULL);
18974 	ASSERT(pktp != NULL);
18975 
18976 	/* Do not do a reset if selection did not complete */
18977 	/* Note: Should this not just check the bit? */
18978 	if (pktp->pkt_state != STATE_GOT_BUS) {
18979 		SD_UPDATE_ERRSTATS(un, sd_transerrs);
18980 		sd_reset_target(un, pktp);
18981 	}
18982 
18983 	/*
18984 	 * If the target was not successfully selected, then set
18985 	 * SD_RETRIES_FAILFAST to indicate that we lost communication
18986 	 * with the target, and further retries and/or commands are
18987 	 * likely to take a long time.
18988 	 */
18989 	if ((pktp->pkt_state & STATE_GOT_TARGET) == 0) {
18990 		flag |= SD_RETRIES_FAILFAST;
18991 	}
18992 
18993 	SD_UPDATE_RESERVATION_STATUS(un, pktp);
18994 
18995 	sd_retry_command(un, bp, flag,
18996 	    sd_print_cmd_incomplete_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
18997 }
18998 
18999 
19000 
19001 /*
19002  *    Function: sd_pkt_reason_cmd_tran_err
19003  *
19004  * Description: Recovery actions for a SCSA "CMD_TRAN_ERR" pkt_reason.
19005  *
19006  *     Context: May be called from interrupt context
19007  */
19008 
19009 static void
19010 sd_pkt_reason_cmd_tran_err(struct sd_lun *un, struct buf *bp,
19011     struct sd_xbuf *xp, struct scsi_pkt *pktp)
19012 {
19013 	ASSERT(un != NULL);
19014 	ASSERT(mutex_owned(SD_MUTEX(un)));
19015 	ASSERT(bp != NULL);
19016 	ASSERT(xp != NULL);
19017 	ASSERT(pktp != NULL);
19018 
19019 	/*
19020 	 * Do not reset if we got a parity error, or if
19021 	 * selection did not complete.
19022 	 */
19023 	SD_UPDATE_ERRSTATS(un, sd_harderrs);
19024 	/* Note: Should this not just check the bit for pkt_state? */
19025 	if (((pktp->pkt_statistics & STAT_PERR) == 0) &&
19026 	    (pktp->pkt_state != STATE_GOT_BUS)) {
19027 		SD_UPDATE_ERRSTATS(un, sd_transerrs);
19028 		sd_reset_target(un, pktp);
19029 	}
19030 
19031 	SD_UPDATE_RESERVATION_STATUS(un, pktp);
19032 
19033 	sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE),
19034 	    sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19035 }
19036 
19037 
19038 
19039 /*
19040  *    Function: sd_pkt_reason_cmd_reset
19041  *
19042  * Description: Recovery actions for a SCSA "CMD_RESET" pkt_reason.
19043  *
19044  *     Context: May be called from interrupt context
19045  */
19046 
19047 static void
19048 sd_pkt_reason_cmd_reset(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
19049     struct scsi_pkt *pktp)
19050 {
19051 	ASSERT(un != NULL);
19052 	ASSERT(mutex_owned(SD_MUTEX(un)));
19053 	ASSERT(bp != NULL);
19054 	ASSERT(xp != NULL);
19055 	ASSERT(pktp != NULL);
19056 
19057 	/* The target may still be running the command, so try to reset. */
19058 	SD_UPDATE_ERRSTATS(un, sd_transerrs);
19059 	sd_reset_target(un, pktp);
19060 
19061 	SD_UPDATE_RESERVATION_STATUS(un, pktp);
19062 
19063 	/*
19064 	 * If pkt_reason is CMD_RESET chances are that this pkt got
19065 	 * reset because another target on this bus caused it. The target
19066 	 * that caused it should get CMD_TIMEOUT with pkt_statistics
19067 	 * of STAT_TIMEOUT/STAT_DEV_RESET.
19068 	 */
19069 
19070 	sd_retry_command(un, bp, (SD_RETRIES_VICTIM | SD_RETRIES_ISOLATE),
19071 	    sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19072 }
19073 
19074 
19075 
19076 
19077 /*
19078  *    Function: sd_pkt_reason_cmd_aborted
19079  *
19080  * Description: Recovery actions for a SCSA "CMD_ABORTED" pkt_reason.
19081  *
19082  *     Context: May be called from interrupt context
19083  */
19084 
19085 static void
19086 sd_pkt_reason_cmd_aborted(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
19087     struct scsi_pkt *pktp)
19088 {
19089 	ASSERT(un != NULL);
19090 	ASSERT(mutex_owned(SD_MUTEX(un)));
19091 	ASSERT(bp != NULL);
19092 	ASSERT(xp != NULL);
19093 	ASSERT(pktp != NULL);
19094 
19095 	/* The target may still be running the command, so try to reset. */
19096 	SD_UPDATE_ERRSTATS(un, sd_transerrs);
19097 	sd_reset_target(un, pktp);
19098 
19099 	SD_UPDATE_RESERVATION_STATUS(un, pktp);
19100 
19101 	/*
19102 	 * If pkt_reason is CMD_ABORTED chances are that this pkt got
19103 	 * aborted because another target on this bus caused it. The target
19104 	 * that caused it should get CMD_TIMEOUT with pkt_statistics
19105 	 * of STAT_TIMEOUT/STAT_DEV_RESET.
19106 	 */
19107 
19108 	sd_retry_command(un, bp, (SD_RETRIES_VICTIM | SD_RETRIES_ISOLATE),
19109 	    sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19110 }
19111 
19112 
19113 
19114 /*
19115  *    Function: sd_pkt_reason_cmd_timeout
19116  *
19117  * Description: Recovery actions for a SCSA "CMD_TIMEOUT" pkt_reason.
19118  *
19119  *     Context: May be called from interrupt context
19120  */
19121 
19122 static void
19123 sd_pkt_reason_cmd_timeout(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
19124     struct scsi_pkt *pktp)
19125 {
19126 	ASSERT(un != NULL);
19127 	ASSERT(mutex_owned(SD_MUTEX(un)));
19128 	ASSERT(bp != NULL);
19129 	ASSERT(xp != NULL);
19130 	ASSERT(pktp != NULL);
19131 
19132 
19133 	SD_UPDATE_ERRSTATS(un, sd_transerrs);
19134 	sd_reset_target(un, pktp);
19135 
19136 	SD_UPDATE_RESERVATION_STATUS(un, pktp);
19137 
19138 	/*
19139 	 * A command timeout indicates that we could not establish
19140 	 * communication with the target, so set SD_RETRIES_FAILFAST
19141 	 * as further retries/commands are likely to take a long time.
19142 	 */
19143 	sd_retry_command(un, bp,
19144 	    (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE | SD_RETRIES_FAILFAST),
19145 	    sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19146 }
19147 
19148 
19149 
19150 /*
19151  *    Function: sd_pkt_reason_cmd_unx_bus_free
19152  *
19153  * Description: Recovery actions for a SCSA "CMD_UNX_BUS_FREE" pkt_reason.
19154  *
19155  *     Context: May be called from interrupt context
19156  */
19157 
19158 static void
19159 sd_pkt_reason_cmd_unx_bus_free(struct sd_lun *un, struct buf *bp,
19160     struct sd_xbuf *xp, struct scsi_pkt *pktp)
19161 {
19162 	void (*funcp)(struct sd_lun *un, struct buf *bp, void *arg, int code);
19163 
19164 	ASSERT(un != NULL);
19165 	ASSERT(mutex_owned(SD_MUTEX(un)));
19166 	ASSERT(bp != NULL);
19167 	ASSERT(xp != NULL);
19168 	ASSERT(pktp != NULL);
19169 
19170 	SD_UPDATE_ERRSTATS(un, sd_harderrs);
19171 	SD_UPDATE_RESERVATION_STATUS(un, pktp);
19172 
19173 	funcp = ((pktp->pkt_statistics & STAT_PERR) == 0) ?
19174 	    sd_print_retry_msg : NULL;
19175 
19176 	sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE),
19177 	    funcp, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19178 }
19179 
19180 
19181 /*
19182  *    Function: sd_pkt_reason_cmd_tag_reject
19183  *
19184  * Description: Recovery actions for a SCSA "CMD_TAG_REJECT" pkt_reason.
19185  *
19186  *     Context: May be called from interrupt context
19187  */
19188 
19189 static void
19190 sd_pkt_reason_cmd_tag_reject(struct sd_lun *un, struct buf *bp,
19191     struct sd_xbuf *xp, struct scsi_pkt *pktp)
19192 {
19193 	ASSERT(un != NULL);
19194 	ASSERT(mutex_owned(SD_MUTEX(un)));
19195 	ASSERT(bp != NULL);
19196 	ASSERT(xp != NULL);
19197 	ASSERT(pktp != NULL);
19198 
19199 	SD_UPDATE_ERRSTATS(un, sd_harderrs);
19200 	pktp->pkt_flags = 0;
19201 	un->un_tagflags = 0;
19202 	if (un->un_f_opt_queueing == TRUE) {
19203 		un->un_throttle = min(un->un_throttle, 3);
19204 	} else {
19205 		un->un_throttle = 1;
19206 	}
19207 	mutex_exit(SD_MUTEX(un));
19208 	(void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1);
19209 	mutex_enter(SD_MUTEX(un));
19210 
19211 	SD_UPDATE_RESERVATION_STATUS(un, pktp);
19212 
19213 	/* Legacy behavior not to check retry counts here. */
19214 	sd_retry_command(un, bp, (SD_RETRIES_NOCHECK | SD_RETRIES_ISOLATE),
19215 	    sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19216 }
19217 
19218 
19219 /*
19220  *    Function: sd_pkt_reason_default
19221  *
19222  * Description: Default recovery actions for SCSA pkt_reason values that
19223  *		do not have more explicit recovery actions.
19224  *
19225  *     Context: May be called from interrupt context
19226  */
19227 
19228 static void
19229 sd_pkt_reason_default(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
19230     struct scsi_pkt *pktp)
19231 {
19232 	ASSERT(un != NULL);
19233 	ASSERT(mutex_owned(SD_MUTEX(un)));
19234 	ASSERT(bp != NULL);
19235 	ASSERT(xp != NULL);
19236 	ASSERT(pktp != NULL);
19237 
19238 	SD_UPDATE_ERRSTATS(un, sd_transerrs);
19239 	sd_reset_target(un, pktp);
19240 
19241 	SD_UPDATE_RESERVATION_STATUS(un, pktp);
19242 
19243 	sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE),
19244 	    sd_print_retry_msg, NULL, EIO, SD_RESTART_TIMEOUT, NULL);
19245 }
19246 
19247 
19248 
19249 /*
19250  *    Function: sd_pkt_status_check_condition
19251  *
19252  * Description: Recovery actions for a "STATUS_CHECK" SCSI command status.
19253  *
19254  *     Context: May be called from interrupt context
19255  */
19256 
19257 static void
19258 sd_pkt_status_check_condition(struct sd_lun *un, struct buf *bp,
19259     struct sd_xbuf *xp, struct scsi_pkt *pktp)
19260 {
19261 	ASSERT(un != NULL);
19262 	ASSERT(mutex_owned(SD_MUTEX(un)));
19263 	ASSERT(bp != NULL);
19264 	ASSERT(xp != NULL);
19265 	ASSERT(pktp != NULL);
19266 
19267 	SD_TRACE(SD_LOG_IO, un, "sd_pkt_status_check_condition: "
19268 	    "entry: buf:0x%p xp:0x%p\n", bp, xp);
19269 
19270 	/*
19271 	 * If ARQ is NOT enabled, then issue a REQUEST SENSE command (the
19272 	 * command will be retried after the request sense). Otherwise, retry
19273 	 * the command. Note: we are issuing the request sense even though the
19274 	 * retry limit may have been reached for the failed command.
19275 	 */
19276 	if (un->un_f_arq_enabled == FALSE) {
19277 		SD_INFO(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: "
19278 		    "no ARQ, sending request sense command\n");
19279 		sd_send_request_sense_command(un, bp, pktp);
19280 	} else {
19281 		SD_INFO(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: "
19282 		    "ARQ,retrying request sense command\n");
19283 #if defined(__i386) || defined(__amd64)
19284 		/*
19285 		 * The SD_RETRY_DELAY value need to be adjusted here
19286 		 * when SD_RETRY_DELAY change in sddef.h
19287 		 */
19288 		sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, EIO,
19289 		    un->un_f_is_fibre?drv_usectohz(100000):(clock_t)0,
19290 		    NULL);
19291 #else
19292 		sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL,
19293 		    EIO, SD_RETRY_DELAY, NULL);
19294 #endif
19295 	}
19296 
19297 	SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: exit\n");
19298 }
19299 
19300 
19301 /*
19302  *    Function: sd_pkt_status_busy
19303  *
19304  * Description: Recovery actions for a "STATUS_BUSY" SCSI command status.
19305  *
19306  *     Context: May be called from interrupt context
19307  */
19308 
19309 static void
19310 sd_pkt_status_busy(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
19311     struct scsi_pkt *pktp)
19312 {
19313 	ASSERT(un != NULL);
19314 	ASSERT(mutex_owned(SD_MUTEX(un)));
19315 	ASSERT(bp != NULL);
19316 	ASSERT(xp != NULL);
19317 	ASSERT(pktp != NULL);
19318 
19319 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19320 	    "sd_pkt_status_busy: entry\n");
19321 
19322 	/* If retries are exhausted, just fail the command. */
19323 	if (xp->xb_retry_count >= un->un_busy_retry_count) {
19324 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
19325 		    "device busy too long\n");
19326 		sd_return_failed_command(un, bp, EIO);
19327 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19328 		    "sd_pkt_status_busy: exit\n");
19329 		return;
19330 	}
19331 	xp->xb_retry_count++;
19332 
19333 	/*
19334 	 * Try to reset the target. However, we do not want to perform
19335 	 * more than one reset if the device continues to fail. The reset
19336 	 * will be performed when the retry count reaches the reset
19337 	 * threshold.  This threshold should be set such that at least
19338 	 * one retry is issued before the reset is performed.
19339 	 */
19340 	if (xp->xb_retry_count ==
19341 	    ((un->un_reset_retry_count < 2) ? 2 : un->un_reset_retry_count)) {
19342 		int rval = 0;
19343 		mutex_exit(SD_MUTEX(un));
19344 		if (un->un_f_allow_bus_device_reset == TRUE) {
19345 			/*
19346 			 * First try to reset the LUN; if we cannot then
19347 			 * try to reset the target.
19348 			 */
19349 			if (un->un_f_lun_reset_enabled == TRUE) {
19350 				SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19351 				    "sd_pkt_status_busy: RESET_LUN\n");
19352 				rval = scsi_reset(SD_ADDRESS(un), RESET_LUN);
19353 			}
19354 			if (rval == 0) {
19355 				SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19356 				    "sd_pkt_status_busy: RESET_TARGET\n");
19357 				rval = scsi_reset(SD_ADDRESS(un), RESET_TARGET);
19358 			}
19359 		}
19360 		if (rval == 0) {
19361 			/*
19362 			 * If the RESET_LUN and/or RESET_TARGET failed,
19363 			 * try RESET_ALL
19364 			 */
19365 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19366 			    "sd_pkt_status_busy: RESET_ALL\n");
19367 			rval = scsi_reset(SD_ADDRESS(un), RESET_ALL);
19368 		}
19369 		mutex_enter(SD_MUTEX(un));
19370 		if (rval == 0) {
19371 			/*
19372 			 * The RESET_LUN, RESET_TARGET, and/or RESET_ALL failed.
19373 			 * At this point we give up & fail the command.
19374 			 */
19375 			sd_return_failed_command(un, bp, EIO);
19376 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19377 			    "sd_pkt_status_busy: exit (failed cmd)\n");
19378 			return;
19379 		}
19380 	}
19381 
19382 	/*
19383 	 * Retry the command. Be sure to specify SD_RETRIES_NOCHECK as
19384 	 * we have already checked the retry counts above.
19385 	 */
19386 	sd_retry_command(un, bp, SD_RETRIES_NOCHECK, NULL, NULL,
19387 	    EIO, un->un_busy_timeout, NULL);
19388 
19389 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19390 	    "sd_pkt_status_busy: exit\n");
19391 }
19392 
19393 
19394 /*
19395  *    Function: sd_pkt_status_reservation_conflict
19396  *
19397  * Description: Recovery actions for a "STATUS_RESERVATION_CONFLICT" SCSI
19398  *		command status.
19399  *
19400  *     Context: May be called from interrupt context
19401  */
19402 
19403 static void
19404 sd_pkt_status_reservation_conflict(struct sd_lun *un, struct buf *bp,
19405     struct sd_xbuf *xp, struct scsi_pkt *pktp)
19406 {
19407 	ASSERT(un != NULL);
19408 	ASSERT(mutex_owned(SD_MUTEX(un)));
19409 	ASSERT(bp != NULL);
19410 	ASSERT(xp != NULL);
19411 	ASSERT(pktp != NULL);
19412 
19413 	/*
19414 	 * If the command was PERSISTENT_RESERVATION_[IN|OUT] then reservation
19415 	 * conflict could be due to various reasons like incorrect keys, not
19416 	 * registered or not reserved etc. So, we return EACCES to the caller.
19417 	 */
19418 	if (un->un_reservation_type == SD_SCSI3_RESERVATION) {
19419 		int cmd = SD_GET_PKT_OPCODE(pktp);
19420 		if ((cmd == SCMD_PERSISTENT_RESERVE_IN) ||
19421 		    (cmd == SCMD_PERSISTENT_RESERVE_OUT)) {
19422 			sd_return_failed_command(un, bp, EACCES);
19423 			return;
19424 		}
19425 	}
19426 
19427 	un->un_resvd_status |= SD_RESERVATION_CONFLICT;
19428 
19429 	if ((un->un_resvd_status & SD_FAILFAST) != 0) {
19430 		if (sd_failfast_enable != 0) {
19431 			/* By definition, we must panic here.... */
19432 			sd_panic_for_res_conflict(un);
19433 			/*NOTREACHED*/
19434 		}
19435 		SD_ERROR(SD_LOG_IO, un,
19436 		    "sd_handle_resv_conflict: Disk Reserved\n");
19437 		sd_return_failed_command(un, bp, EACCES);
19438 		return;
19439 	}
19440 
19441 	/*
19442 	 * 1147670: retry only if sd_retry_on_reservation_conflict
19443 	 * property is set (default is 1). Retries will not succeed
19444 	 * on a disk reserved by another initiator. HA systems
19445 	 * may reset this via sd.conf to avoid these retries.
19446 	 *
19447 	 * Note: The legacy return code for this failure is EIO, however EACCES
19448 	 * seems more appropriate for a reservation conflict.
19449 	 */
19450 	if (sd_retry_on_reservation_conflict == 0) {
19451 		SD_ERROR(SD_LOG_IO, un,
19452 		    "sd_handle_resv_conflict: Device Reserved\n");
19453 		sd_return_failed_command(un, bp, EIO);
19454 		return;
19455 	}
19456 
19457 	/*
19458 	 * Retry the command if we can.
19459 	 *
19460 	 * Note: The legacy return code for this failure is EIO, however EACCES
19461 	 * seems more appropriate for a reservation conflict.
19462 	 */
19463 	sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, EIO,
19464 	    (clock_t)2, NULL);
19465 }
19466 
19467 
19468 
19469 /*
19470  *    Function: sd_pkt_status_qfull
19471  *
19472  * Description: Handle a QUEUE FULL condition from the target.  This can
19473  *		occur if the HBA does not handle the queue full condition.
19474  *		(Basically this means third-party HBAs as Sun HBAs will
19475  *		handle the queue full condition.)  Note that if there are
19476  *		some commands already in the transport, then the queue full
19477  *		has occurred because the queue for this nexus is actually
19478  *		full. If there are no commands in the transport, then the
19479  *		queue full is resulting from some other initiator or lun
19480  *		consuming all the resources at the target.
19481  *
19482  *     Context: May be called from interrupt context
19483  */
19484 
19485 static void
19486 sd_pkt_status_qfull(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
19487     struct scsi_pkt *pktp)
19488 {
19489 	ASSERT(un != NULL);
19490 	ASSERT(mutex_owned(SD_MUTEX(un)));
19491 	ASSERT(bp != NULL);
19492 	ASSERT(xp != NULL);
19493 	ASSERT(pktp != NULL);
19494 
19495 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19496 	    "sd_pkt_status_qfull: entry\n");
19497 
19498 	/*
19499 	 * Just lower the QFULL throttle and retry the command.  Note that
19500 	 * we do not limit the number of retries here.
19501 	 */
19502 	sd_reduce_throttle(un, SD_THROTTLE_QFULL);
19503 	sd_retry_command(un, bp, SD_RETRIES_NOCHECK, NULL, NULL, 0,
19504 	    SD_RESTART_TIMEOUT, NULL);
19505 
19506 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19507 	    "sd_pkt_status_qfull: exit\n");
19508 }
19509 
19510 
19511 /*
19512  *    Function: sd_reset_target
19513  *
19514  * Description: Issue a scsi_reset(9F), with either RESET_LUN,
19515  *		RESET_TARGET, or RESET_ALL.
19516  *
19517  *     Context: May be called under interrupt context.
19518  */
19519 
19520 static void
19521 sd_reset_target(struct sd_lun *un, struct scsi_pkt *pktp)
19522 {
19523 	int rval = 0;
19524 
19525 	ASSERT(un != NULL);
19526 	ASSERT(mutex_owned(SD_MUTEX(un)));
19527 	ASSERT(pktp != NULL);
19528 
19529 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reset_target: entry\n");
19530 
19531 	/*
19532 	 * No need to reset if the transport layer has already done so.
19533 	 */
19534 	if ((pktp->pkt_statistics &
19535 	    (STAT_BUS_RESET | STAT_DEV_RESET | STAT_ABORTED)) != 0) {
19536 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19537 		    "sd_reset_target: no reset\n");
19538 		return;
19539 	}
19540 
19541 	mutex_exit(SD_MUTEX(un));
19542 
19543 	if (un->un_f_allow_bus_device_reset == TRUE) {
19544 		if (un->un_f_lun_reset_enabled == TRUE) {
19545 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19546 			    "sd_reset_target: RESET_LUN\n");
19547 			rval = scsi_reset(SD_ADDRESS(un), RESET_LUN);
19548 		}
19549 		if (rval == 0) {
19550 			SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19551 			    "sd_reset_target: RESET_TARGET\n");
19552 			rval = scsi_reset(SD_ADDRESS(un), RESET_TARGET);
19553 		}
19554 	}
19555 
19556 	if (rval == 0) {
19557 		SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19558 		    "sd_reset_target: RESET_ALL\n");
19559 		(void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
19560 	}
19561 
19562 	mutex_enter(SD_MUTEX(un));
19563 
19564 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reset_target: exit\n");
19565 }
19566 
19567 /*
19568  *    Function: sd_target_change_task
19569  *
19570  * Description: Handle dynamic target change
19571  *
19572  *     Context: Executes in a taskq() thread context
19573  */
19574 static void
19575 sd_target_change_task(void *arg)
19576 {
19577 	struct sd_lun		*un = arg;
19578 	uint64_t		capacity;
19579 	diskaddr_t		label_cap;
19580 	uint_t			lbasize;
19581 	sd_ssc_t		*ssc;
19582 
19583 	ASSERT(un != NULL);
19584 	ASSERT(!mutex_owned(SD_MUTEX(un)));
19585 
19586 	if ((un->un_f_blockcount_is_valid == FALSE) ||
19587 	    (un->un_f_tgt_blocksize_is_valid == FALSE)) {
19588 		return;
19589 	}
19590 
19591 	ssc = sd_ssc_init(un);
19592 
19593 	if (sd_send_scsi_READ_CAPACITY(ssc, &capacity,
19594 	    &lbasize, SD_PATH_DIRECT) != 0) {
19595 		SD_ERROR(SD_LOG_ERROR, un,
19596 		    "sd_target_change_task: fail to read capacity\n");
19597 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
19598 		goto task_exit;
19599 	}
19600 
19601 	mutex_enter(SD_MUTEX(un));
19602 	if (capacity <= un->un_blockcount) {
19603 		mutex_exit(SD_MUTEX(un));
19604 		goto task_exit;
19605 	}
19606 
19607 	sd_update_block_info(un, lbasize, capacity);
19608 	mutex_exit(SD_MUTEX(un));
19609 
19610 	/*
19611 	 * If lun is EFI labeled and lun capacity is greater than the
19612 	 * capacity contained in the label, log a sys event.
19613 	 */
19614 	if (cmlb_efi_label_capacity(un->un_cmlbhandle, &label_cap,
19615 	    (void*)SD_PATH_DIRECT) == 0) {
19616 		mutex_enter(SD_MUTEX(un));
19617 		if (un->un_f_blockcount_is_valid &&
19618 		    un->un_blockcount > label_cap) {
19619 			mutex_exit(SD_MUTEX(un));
19620 			sd_log_lun_expansion_event(un, KM_SLEEP);
19621 		} else {
19622 			mutex_exit(SD_MUTEX(un));
19623 		}
19624 	}
19625 
19626 task_exit:
19627 	sd_ssc_fini(ssc);
19628 }
19629 
19630 
19631 /*
19632  *    Function: sd_log_dev_status_event
19633  *
19634  * Description: Log EC_dev_status sysevent
19635  *
19636  *     Context: Never called from interrupt context
19637  */
19638 static void
19639 sd_log_dev_status_event(struct sd_lun *un, char *esc, int km_flag)
19640 {
19641 	int err;
19642 	char			*path;
19643 	nvlist_t		*attr_list;
19644 
19645 	/* Allocate and build sysevent attribute list */
19646 	err = nvlist_alloc(&attr_list, NV_UNIQUE_NAME_TYPE, km_flag);
19647 	if (err != 0) {
19648 		SD_ERROR(SD_LOG_ERROR, un,
19649 		    "sd_log_dev_status_event: fail to allocate space\n");
19650 		return;
19651 	}
19652 
19653 	path = kmem_alloc(MAXPATHLEN, km_flag);
19654 	if (path == NULL) {
19655 		nvlist_free(attr_list);
19656 		SD_ERROR(SD_LOG_ERROR, un,
19657 		    "sd_log_dev_status_event: fail to allocate space\n");
19658 		return;
19659 	}
19660 	/*
19661 	 * Add path attribute to identify the lun.
19662 	 * We are using minor node 'a' as the sysevent attribute.
19663 	 */
19664 	(void) snprintf(path, MAXPATHLEN, "/devices");
19665 	(void) ddi_pathname(SD_DEVINFO(un), path + strlen(path));
19666 	(void) snprintf(path + strlen(path), MAXPATHLEN - strlen(path),
19667 	    ":a");
19668 
19669 	err = nvlist_add_string(attr_list, DEV_PHYS_PATH, path);
19670 	if (err != 0) {
19671 		nvlist_free(attr_list);
19672 		kmem_free(path, MAXPATHLEN);
19673 		SD_ERROR(SD_LOG_ERROR, un,
19674 		    "sd_log_dev_status_event: fail to add attribute\n");
19675 		return;
19676 	}
19677 
19678 	/* Log dynamic lun expansion sysevent */
19679 	err = ddi_log_sysevent(SD_DEVINFO(un), SUNW_VENDOR, EC_DEV_STATUS,
19680 	    esc, attr_list, NULL, km_flag);
19681 	if (err != DDI_SUCCESS) {
19682 		SD_ERROR(SD_LOG_ERROR, un,
19683 		    "sd_log_dev_status_event: fail to log sysevent\n");
19684 	}
19685 
19686 	nvlist_free(attr_list);
19687 	kmem_free(path, MAXPATHLEN);
19688 }
19689 
19690 
19691 /*
19692  *    Function: sd_log_lun_expansion_event
19693  *
19694  * Description: Log lun expansion sys event
19695  *
19696  *     Context: Never called from interrupt context
19697  */
19698 static void
19699 sd_log_lun_expansion_event(struct sd_lun *un, int km_flag)
19700 {
19701 	sd_log_dev_status_event(un, ESC_DEV_DLE, km_flag);
19702 }
19703 
19704 
19705 /*
19706  *    Function: sd_log_eject_request_event
19707  *
19708  * Description: Log eject request sysevent
19709  *
19710  *     Context: Never called from interrupt context
19711  */
19712 static void
19713 sd_log_eject_request_event(struct sd_lun *un, int km_flag)
19714 {
19715 	sd_log_dev_status_event(un, ESC_DEV_EJECT_REQUEST, km_flag);
19716 }
19717 
19718 
19719 /*
19720  *    Function: sd_media_change_task
19721  *
19722  * Description: Recovery action for CDROM to become available.
19723  *
19724  *     Context: Executes in a taskq() thread context
19725  */
19726 
19727 static void
19728 sd_media_change_task(void *arg)
19729 {
19730 	struct	scsi_pkt	*pktp = arg;
19731 	struct	sd_lun		*un;
19732 	struct	buf		*bp;
19733 	struct	sd_xbuf		*xp;
19734 	int	err		= 0;
19735 	int	retry_count	= 0;
19736 	int	retry_limit	= SD_UNIT_ATTENTION_RETRY/10;
19737 	struct	sd_sense_info	si;
19738 
19739 	ASSERT(pktp != NULL);
19740 	bp = (struct buf *)pktp->pkt_private;
19741 	ASSERT(bp != NULL);
19742 	xp = SD_GET_XBUF(bp);
19743 	ASSERT(xp != NULL);
19744 	un = SD_GET_UN(bp);
19745 	ASSERT(un != NULL);
19746 	ASSERT(!mutex_owned(SD_MUTEX(un)));
19747 	ASSERT(un->un_f_monitor_media_state);
19748 
19749 	si.ssi_severity = SCSI_ERR_INFO;
19750 	si.ssi_pfa_flag = FALSE;
19751 
19752 	/*
19753 	 * When a reset is issued on a CDROM, it takes a long time to
19754 	 * recover. First few attempts to read capacity and other things
19755 	 * related to handling unit attention fail (with a ASC 0x4 and
19756 	 * ASCQ 0x1). In that case we want to do enough retries and we want
19757 	 * to limit the retries in other cases of genuine failures like
19758 	 * no media in drive.
19759 	 */
19760 	while (retry_count++ < retry_limit) {
19761 		if ((err = sd_handle_mchange(un)) == 0) {
19762 			break;
19763 		}
19764 		if (err == EAGAIN) {
19765 			retry_limit = SD_UNIT_ATTENTION_RETRY;
19766 		}
19767 		/* Sleep for 0.5 sec. & try again */
19768 		delay(drv_usectohz(500000));
19769 	}
19770 
19771 	/*
19772 	 * Dispatch (retry or fail) the original command here,
19773 	 * along with appropriate console messages....
19774 	 *
19775 	 * Must grab the mutex before calling sd_retry_command,
19776 	 * sd_print_sense_msg and sd_return_failed_command.
19777 	 */
19778 	mutex_enter(SD_MUTEX(un));
19779 	if (err != SD_CMD_SUCCESS) {
19780 		SD_UPDATE_ERRSTATS(un, sd_harderrs);
19781 		SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err);
19782 		si.ssi_severity = SCSI_ERR_FATAL;
19783 		sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
19784 		sd_return_failed_command(un, bp, EIO);
19785 	} else {
19786 		sd_retry_command(un, bp, SD_RETRIES_UA, sd_print_sense_msg,
19787 		    &si, EIO, (clock_t)0, NULL);
19788 	}
19789 	mutex_exit(SD_MUTEX(un));
19790 }
19791 
19792 
19793 
19794 /*
19795  *    Function: sd_handle_mchange
19796  *
19797  * Description: Perform geometry validation & other recovery when CDROM
19798  *		has been removed from drive.
19799  *
19800  * Return Code: 0 for success
19801  *		errno-type return code of either sd_send_scsi_DOORLOCK() or
19802  *		sd_send_scsi_READ_CAPACITY()
19803  *
19804  *     Context: Executes in a taskq() thread context
19805  */
19806 
19807 static int
19808 sd_handle_mchange(struct sd_lun *un)
19809 {
19810 	uint64_t	capacity;
19811 	uint32_t	lbasize;
19812 	int		rval;
19813 	sd_ssc_t	*ssc;
19814 
19815 	ASSERT(!mutex_owned(SD_MUTEX(un)));
19816 	ASSERT(un->un_f_monitor_media_state);
19817 
19818 	ssc = sd_ssc_init(un);
19819 	rval = sd_send_scsi_READ_CAPACITY(ssc, &capacity, &lbasize,
19820 	    SD_PATH_DIRECT_PRIORITY);
19821 
19822 	if (rval != 0)
19823 		goto failed;
19824 
19825 	mutex_enter(SD_MUTEX(un));
19826 	sd_update_block_info(un, lbasize, capacity);
19827 
19828 	if (un->un_errstats != NULL) {
19829 		struct	sd_errstats *stp =
19830 		    (struct sd_errstats *)un->un_errstats->ks_data;
19831 		stp->sd_capacity.value.ui64 = (uint64_t)
19832 		    ((uint64_t)un->un_blockcount *
19833 		    (uint64_t)un->un_tgt_blocksize);
19834 	}
19835 
19836 	/*
19837 	 * Check if the media in the device is writable or not
19838 	 */
19839 	if (ISCD(un)) {
19840 		sd_check_for_writable_cd(ssc, SD_PATH_DIRECT_PRIORITY);
19841 	}
19842 
19843 	/*
19844 	 * Note: Maybe let the strategy/partitioning chain worry about getting
19845 	 * valid geometry.
19846 	 */
19847 	mutex_exit(SD_MUTEX(un));
19848 	cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT_PRIORITY);
19849 
19850 
19851 	if (cmlb_validate(un->un_cmlbhandle, 0,
19852 	    (void *)SD_PATH_DIRECT_PRIORITY) != 0) {
19853 		sd_ssc_fini(ssc);
19854 		return (EIO);
19855 	} else {
19856 		if (un->un_f_pkstats_enabled) {
19857 			sd_set_pstats(un);
19858 			SD_TRACE(SD_LOG_IO_PARTITION, un,
19859 			    "sd_handle_mchange: un:0x%p pstats created and "
19860 			    "set\n", un);
19861 		}
19862 	}
19863 
19864 	/*
19865 	 * Try to lock the door
19866 	 */
19867 	rval = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT,
19868 	    SD_PATH_DIRECT_PRIORITY);
19869 failed:
19870 	if (rval != 0)
19871 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
19872 	sd_ssc_fini(ssc);
19873 	return (rval);
19874 }
19875 
19876 
19877 /*
19878  *    Function: sd_send_scsi_DOORLOCK
19879  *
19880  * Description: Issue the scsi DOOR LOCK command
19881  *
19882  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
19883  *                      structure for this target.
19884  *		flag  - SD_REMOVAL_ALLOW
19885  *			SD_REMOVAL_PREVENT
19886  *		path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
19887  *			the normal command waitq, or SD_PATH_DIRECT_PRIORITY
19888  *			to use the USCSI "direct" chain and bypass the normal
19889  *			command waitq. SD_PATH_DIRECT_PRIORITY is used when this
19890  *			command is issued as part of an error recovery action.
19891  *
19892  * Return Code: 0   - Success
19893  *		errno return code from sd_ssc_send()
19894  *
19895  *     Context: Can sleep.
19896  */
19897 
19898 static int
19899 sd_send_scsi_DOORLOCK(sd_ssc_t *ssc, int flag, int path_flag)
19900 {
19901 	struct scsi_extended_sense	sense_buf;
19902 	union scsi_cdb		cdb;
19903 	struct uscsi_cmd	ucmd_buf;
19904 	int			status;
19905 	struct sd_lun		*un;
19906 
19907 	ASSERT(ssc != NULL);
19908 	un = ssc->ssc_un;
19909 	ASSERT(un != NULL);
19910 	ASSERT(!mutex_owned(SD_MUTEX(un)));
19911 
19912 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_DOORLOCK: entry: un:0x%p\n", un);
19913 
19914 	/* already determined doorlock is not supported, fake success */
19915 	if (un->un_f_doorlock_supported == FALSE) {
19916 		return (0);
19917 	}
19918 
19919 	/*
19920 	 * If we are ejecting and see an SD_REMOVAL_PREVENT
19921 	 * ignore the command so we can complete the eject
19922 	 * operation.
19923 	 */
19924 	if (flag == SD_REMOVAL_PREVENT) {
19925 		mutex_enter(SD_MUTEX(un));
19926 		if (un->un_f_ejecting == TRUE) {
19927 			mutex_exit(SD_MUTEX(un));
19928 			return (EAGAIN);
19929 		}
19930 		mutex_exit(SD_MUTEX(un));
19931 	}
19932 
19933 	bzero(&cdb, sizeof (cdb));
19934 	bzero(&ucmd_buf, sizeof (ucmd_buf));
19935 
19936 	cdb.scc_cmd = SCMD_DOORLOCK;
19937 	cdb.cdb_opaque[4] = (uchar_t)flag;
19938 
19939 	ucmd_buf.uscsi_cdb	= (char *)&cdb;
19940 	ucmd_buf.uscsi_cdblen	= CDB_GROUP0;
19941 	ucmd_buf.uscsi_bufaddr	= NULL;
19942 	ucmd_buf.uscsi_buflen	= 0;
19943 	ucmd_buf.uscsi_rqbuf	= (caddr_t)&sense_buf;
19944 	ucmd_buf.uscsi_rqlen	= sizeof (sense_buf);
19945 	ucmd_buf.uscsi_flags	= USCSI_RQENABLE | USCSI_SILENT;
19946 	ucmd_buf.uscsi_timeout	= 15;
19947 
19948 	SD_TRACE(SD_LOG_IO, un,
19949 	    "sd_send_scsi_DOORLOCK: returning sd_ssc_send\n");
19950 
19951 	status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
19952 	    UIO_SYSSPACE, path_flag);
19953 
19954 	if (status == 0)
19955 		sd_ssc_assessment(ssc, SD_FMT_STANDARD);
19956 
19957 	if ((status == EIO) && (ucmd_buf.uscsi_status == STATUS_CHECK) &&
19958 	    (ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
19959 	    (scsi_sense_key((uint8_t *)&sense_buf) == KEY_ILLEGAL_REQUEST)) {
19960 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
19961 
19962 		/* fake success and skip subsequent doorlock commands */
19963 		un->un_f_doorlock_supported = FALSE;
19964 		return (0);
19965 	}
19966 
19967 	return (status);
19968 }
19969 
19970 /*
19971  *    Function: sd_send_scsi_READ_CAPACITY
19972  *
19973  * Description: This routine uses the scsi READ CAPACITY command to determine
19974  *		the device capacity in number of blocks and the device native
19975  *		block size. If this function returns a failure, then the
19976  *		values in *capp and *lbap are undefined.  If the capacity
19977  *		returned is 0xffffffff then the lun is too large for a
19978  *		normal READ CAPACITY command and the results of a
19979  *		READ CAPACITY 16 will be used instead.
19980  *
19981  *   Arguments: ssc   - ssc contains ptr to soft state struct for the target
19982  *		capp - ptr to unsigned 64-bit variable to receive the
19983  *			capacity value from the command.
19984  *		lbap - ptr to unsigned 32-bit varaible to receive the
19985  *			block size value from the command
19986  *		path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
19987  *			the normal command waitq, or SD_PATH_DIRECT_PRIORITY
19988  *			to use the USCSI "direct" chain and bypass the normal
19989  *			command waitq. SD_PATH_DIRECT_PRIORITY is used when this
19990  *			command is issued as part of an error recovery action.
19991  *
19992  * Return Code: 0   - Success
19993  *		EIO - IO error
19994  *		EACCES - Reservation conflict detected
19995  *		EAGAIN - Device is becoming ready
19996  *		errno return code from sd_ssc_send()
19997  *
19998  *     Context: Can sleep.  Blocks until command completes.
19999  */
20000 
20001 #define	SD_CAPACITY_SIZE	sizeof (struct scsi_capacity)
20002 
20003 static int
20004 sd_send_scsi_READ_CAPACITY(sd_ssc_t *ssc, uint64_t *capp, uint32_t *lbap,
20005     int path_flag)
20006 {
20007 	struct	scsi_extended_sense	sense_buf;
20008 	struct	uscsi_cmd	ucmd_buf;
20009 	union	scsi_cdb	cdb;
20010 	uint32_t		*capacity_buf;
20011 	uint64_t		capacity;
20012 	uint32_t		lbasize;
20013 	uint32_t		pbsize;
20014 	int			status;
20015 	struct sd_lun		*un;
20016 
20017 	ASSERT(ssc != NULL);
20018 
20019 	un = ssc->ssc_un;
20020 	ASSERT(un != NULL);
20021 	ASSERT(!mutex_owned(SD_MUTEX(un)));
20022 	ASSERT(capp != NULL);
20023 	ASSERT(lbap != NULL);
20024 
20025 	SD_TRACE(SD_LOG_IO, un,
20026 	    "sd_send_scsi_READ_CAPACITY: entry: un:0x%p\n", un);
20027 
20028 	/*
20029 	 * First send a READ_CAPACITY command to the target.
20030 	 * (This command is mandatory under SCSI-2.)
20031 	 *
20032 	 * Set up the CDB for the READ_CAPACITY command.  The Partial
20033 	 * Medium Indicator bit is cleared.  The address field must be
20034 	 * zero if the PMI bit is zero.
20035 	 */
20036 	bzero(&cdb, sizeof (cdb));
20037 	bzero(&ucmd_buf, sizeof (ucmd_buf));
20038 
20039 	capacity_buf = kmem_zalloc(SD_CAPACITY_SIZE, KM_SLEEP);
20040 
20041 	cdb.scc_cmd = SCMD_READ_CAPACITY;
20042 
20043 	ucmd_buf.uscsi_cdb	= (char *)&cdb;
20044 	ucmd_buf.uscsi_cdblen	= CDB_GROUP1;
20045 	ucmd_buf.uscsi_bufaddr	= (caddr_t)capacity_buf;
20046 	ucmd_buf.uscsi_buflen	= SD_CAPACITY_SIZE;
20047 	ucmd_buf.uscsi_rqbuf	= (caddr_t)&sense_buf;
20048 	ucmd_buf.uscsi_rqlen	= sizeof (sense_buf);
20049 	ucmd_buf.uscsi_flags	= USCSI_RQENABLE | USCSI_READ | USCSI_SILENT;
20050 	ucmd_buf.uscsi_timeout	= 60;
20051 
20052 	status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
20053 	    UIO_SYSSPACE, path_flag);
20054 
20055 	switch (status) {
20056 	case 0:
20057 		/* Return failure if we did not get valid capacity data. */
20058 		if (ucmd_buf.uscsi_resid != 0) {
20059 			sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1,
20060 			    "sd_send_scsi_READ_CAPACITY received invalid "
20061 			    "capacity data");
20062 			kmem_free(capacity_buf, SD_CAPACITY_SIZE);
20063 			return (EIO);
20064 		}
20065 		/*
20066 		 * Read capacity and block size from the READ CAPACITY 10 data.
20067 		 * This data may be adjusted later due to device specific
20068 		 * issues.
20069 		 *
20070 		 * According to the SCSI spec, the READ CAPACITY 10
20071 		 * command returns the following:
20072 		 *
20073 		 *  bytes 0-3: Maximum logical block address available.
20074 		 *		(MSB in byte:0 & LSB in byte:3)
20075 		 *
20076 		 *  bytes 4-7: Block length in bytes
20077 		 *		(MSB in byte:4 & LSB in byte:7)
20078 		 *
20079 		 */
20080 		capacity = BE_32(capacity_buf[0]);
20081 		lbasize = BE_32(capacity_buf[1]);
20082 
20083 		/*
20084 		 * Done with capacity_buf
20085 		 */
20086 		kmem_free(capacity_buf, SD_CAPACITY_SIZE);
20087 
20088 		/*
20089 		 * if the reported capacity is set to all 0xf's, then
20090 		 * this disk is too large and requires SBC-2 commands.
20091 		 * Reissue the request using READ CAPACITY 16.
20092 		 */
20093 		if (capacity == 0xffffffff) {
20094 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
20095 			status = sd_send_scsi_READ_CAPACITY_16(ssc, &capacity,
20096 			    &lbasize, &pbsize, path_flag);
20097 			if (status != 0) {
20098 				return (status);
20099 			} else {
20100 				goto rc16_done;
20101 			}
20102 		}
20103 		break;	/* Success! */
20104 	case EIO:
20105 		switch (ucmd_buf.uscsi_status) {
20106 		case STATUS_RESERVATION_CONFLICT:
20107 			status = EACCES;
20108 			break;
20109 		case STATUS_CHECK:
20110 			/*
20111 			 * Check condition; look for ASC/ASCQ of 0x04/0x01
20112 			 * (LOGICAL UNIT IS IN PROCESS OF BECOMING READY)
20113 			 */
20114 			if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
20115 			    (scsi_sense_asc((uint8_t *)&sense_buf) == 0x04) &&
20116 			    (scsi_sense_ascq((uint8_t *)&sense_buf) == 0x01)) {
20117 				kmem_free(capacity_buf, SD_CAPACITY_SIZE);
20118 				return (EAGAIN);
20119 			}
20120 			break;
20121 		default:
20122 			break;
20123 		}
20124 		/* FALLTHRU */
20125 	default:
20126 		kmem_free(capacity_buf, SD_CAPACITY_SIZE);
20127 		return (status);
20128 	}
20129 
20130 	/*
20131 	 * Some ATAPI CD-ROM drives report inaccurate LBA size values
20132 	 * (2352 and 0 are common) so for these devices always force the value
20133 	 * to 2048 as required by the ATAPI specs.
20134 	 */
20135 	if ((un->un_f_cfg_is_atapi == TRUE) && (ISCD(un))) {
20136 		lbasize = 2048;
20137 	}
20138 
20139 	/*
20140 	 * Get the maximum LBA value from the READ CAPACITY data.
20141 	 * Here we assume that the Partial Medium Indicator (PMI) bit
20142 	 * was cleared when issuing the command. This means that the LBA
20143 	 * returned from the device is the LBA of the last logical block
20144 	 * on the logical unit.  The actual logical block count will be
20145 	 * this value plus one.
20146 	 */
20147 	capacity += 1;
20148 
20149 	/*
20150 	 * Currently, for removable media, the capacity is saved in terms
20151 	 * of un->un_sys_blocksize, so scale the capacity value to reflect this.
20152 	 */
20153 	if (un->un_f_has_removable_media)
20154 		capacity *= (lbasize / un->un_sys_blocksize);
20155 
20156 rc16_done:
20157 
20158 	/*
20159 	 * Copy the values from the READ CAPACITY command into the space
20160 	 * provided by the caller.
20161 	 */
20162 	*capp = capacity;
20163 	*lbap = lbasize;
20164 
20165 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_READ_CAPACITY: "
20166 	    "capacity:0x%llx  lbasize:0x%x\n", capacity, lbasize);
20167 
20168 	/*
20169 	 * Both the lbasize and capacity from the device must be nonzero,
20170 	 * otherwise we assume that the values are not valid and return
20171 	 * failure to the caller. (4203735)
20172 	 */
20173 	if ((capacity == 0) || (lbasize == 0)) {
20174 		sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1,
20175 		    "sd_send_scsi_READ_CAPACITY received invalid value "
20176 		    "capacity %llu lbasize %d", capacity, lbasize);
20177 		return (EIO);
20178 	}
20179 	sd_ssc_assessment(ssc, SD_FMT_STANDARD);
20180 	return (0);
20181 }
20182 
20183 /*
20184  *    Function: sd_send_scsi_READ_CAPACITY_16
20185  *
20186  * Description: This routine uses the scsi READ CAPACITY 16 command to
20187  *		determine the device capacity in number of blocks and the
20188  *		device native block size.  If this function returns a failure,
20189  *		then the values in *capp and *lbap are undefined.
20190  *		This routine should be called by sd_send_scsi_READ_CAPACITY
20191  *              which will apply any device specific adjustments to capacity
20192  *              and lbasize. One exception is it is also called by
20193  *              sd_get_media_info_ext. In that function, there is no need to
20194  *              adjust the capacity and lbasize.
20195  *
20196  *   Arguments: ssc   - ssc contains ptr to soft state struct for the target
20197  *		capp - ptr to unsigned 64-bit variable to receive the
20198  *			capacity value from the command.
20199  *		lbap - ptr to unsigned 32-bit varaible to receive the
20200  *			block size value from the command
20201  *              psp  - ptr to unsigned 32-bit variable to receive the
20202  *                      physical block size value from the command
20203  *		path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
20204  *			the normal command waitq, or SD_PATH_DIRECT_PRIORITY
20205  *			to use the USCSI "direct" chain and bypass the normal
20206  *			command waitq. SD_PATH_DIRECT_PRIORITY is used when
20207  *			this command is issued as part of an error recovery
20208  *			action.
20209  *
20210  * Return Code: 0   - Success
20211  *		EIO - IO error
20212  *		EACCES - Reservation conflict detected
20213  *		EAGAIN - Device is becoming ready
20214  *		errno return code from sd_ssc_send()
20215  *
20216  *     Context: Can sleep.  Blocks until command completes.
20217  */
20218 
20219 #define	SD_CAPACITY_16_SIZE	sizeof (struct scsi_capacity_16)
20220 
20221 static int
20222 sd_send_scsi_READ_CAPACITY_16(sd_ssc_t *ssc, uint64_t *capp, uint32_t *lbap,
20223     uint32_t *psp, int path_flag)
20224 {
20225 	struct	scsi_extended_sense	sense_buf;
20226 	struct	uscsi_cmd	ucmd_buf;
20227 	union	scsi_cdb	cdb;
20228 	uint64_t		*capacity16_buf;
20229 	uint64_t		capacity;
20230 	uint32_t		lbasize;
20231 	uint32_t		pbsize;
20232 	uint32_t		lbpb_exp;
20233 	int			status;
20234 	struct sd_lun		*un;
20235 
20236 	ASSERT(ssc != NULL);
20237 
20238 	un = ssc->ssc_un;
20239 	ASSERT(un != NULL);
20240 	ASSERT(!mutex_owned(SD_MUTEX(un)));
20241 	ASSERT(capp != NULL);
20242 	ASSERT(lbap != NULL);
20243 
20244 	SD_TRACE(SD_LOG_IO, un,
20245 	    "sd_send_scsi_READ_CAPACITY: entry: un:0x%p\n", un);
20246 
20247 	/*
20248 	 * First send a READ_CAPACITY_16 command to the target.
20249 	 *
20250 	 * Set up the CDB for the READ_CAPACITY_16 command.  The Partial
20251 	 * Medium Indicator bit is cleared.  The address field must be
20252 	 * zero if the PMI bit is zero.
20253 	 */
20254 	bzero(&cdb, sizeof (cdb));
20255 	bzero(&ucmd_buf, sizeof (ucmd_buf));
20256 
20257 	capacity16_buf = kmem_zalloc(SD_CAPACITY_16_SIZE, KM_SLEEP);
20258 
20259 	ucmd_buf.uscsi_cdb	= (char *)&cdb;
20260 	ucmd_buf.uscsi_cdblen	= CDB_GROUP4;
20261 	ucmd_buf.uscsi_bufaddr	= (caddr_t)capacity16_buf;
20262 	ucmd_buf.uscsi_buflen	= SD_CAPACITY_16_SIZE;
20263 	ucmd_buf.uscsi_rqbuf	= (caddr_t)&sense_buf;
20264 	ucmd_buf.uscsi_rqlen	= sizeof (sense_buf);
20265 	ucmd_buf.uscsi_flags	= USCSI_RQENABLE | USCSI_READ | USCSI_SILENT;
20266 	ucmd_buf.uscsi_timeout	= 60;
20267 
20268 	/*
20269 	 * Read Capacity (16) is a Service Action In command.  One
20270 	 * command byte (0x9E) is overloaded for multiple operations,
20271 	 * with the second CDB byte specifying the desired operation
20272 	 */
20273 	cdb.scc_cmd = SCMD_SVC_ACTION_IN_G4;
20274 	cdb.cdb_opaque[1] = SSVC_ACTION_READ_CAPACITY_G4;
20275 
20276 	/*
20277 	 * Fill in allocation length field
20278 	 */
20279 	FORMG4COUNT(&cdb, ucmd_buf.uscsi_buflen);
20280 
20281 	status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
20282 	    UIO_SYSSPACE, path_flag);
20283 
20284 	switch (status) {
20285 	case 0:
20286 		/* Return failure if we did not get valid capacity data. */
20287 		if (ucmd_buf.uscsi_resid > 20) {
20288 			sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1,
20289 			    "sd_send_scsi_READ_CAPACITY_16 received invalid "
20290 			    "capacity data");
20291 			kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE);
20292 			return (EIO);
20293 		}
20294 
20295 		/*
20296 		 * Read capacity and block size from the READ CAPACITY 16 data.
20297 		 * This data may be adjusted later due to device specific
20298 		 * issues.
20299 		 *
20300 		 * According to the SCSI spec, the READ CAPACITY 16
20301 		 * command returns the following:
20302 		 *
20303 		 *  bytes 0-7: Maximum logical block address available.
20304 		 *		(MSB in byte:0 & LSB in byte:7)
20305 		 *
20306 		 *  bytes 8-11: Block length in bytes
20307 		 *		(MSB in byte:8 & LSB in byte:11)
20308 		 *
20309 		 *  byte 13: LOGICAL BLOCKS PER PHYSICAL BLOCK EXPONENT
20310 		 */
20311 		capacity = BE_64(capacity16_buf[0]);
20312 		lbasize = BE_32(*(uint32_t *)&capacity16_buf[1]);
20313 		lbpb_exp = (BE_64(capacity16_buf[1]) >> 16) & 0x0f;
20314 
20315 		pbsize = lbasize << lbpb_exp;
20316 
20317 		/*
20318 		 * Done with capacity16_buf
20319 		 */
20320 		kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE);
20321 
20322 		/*
20323 		 * if the reported capacity is set to all 0xf's, then
20324 		 * this disk is too large.  This could only happen with
20325 		 * a device that supports LBAs larger than 64 bits which
20326 		 * are not defined by any current T10 standards.
20327 		 */
20328 		if (capacity == 0xffffffffffffffff) {
20329 			sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1,
20330 			    "disk is too large");
20331 			return (EIO);
20332 		}
20333 		break;	/* Success! */
20334 	case EIO:
20335 		switch (ucmd_buf.uscsi_status) {
20336 		case STATUS_RESERVATION_CONFLICT:
20337 			status = EACCES;
20338 			break;
20339 		case STATUS_CHECK:
20340 			/*
20341 			 * Check condition; look for ASC/ASCQ of 0x04/0x01
20342 			 * (LOGICAL UNIT IS IN PROCESS OF BECOMING READY)
20343 			 */
20344 			if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
20345 			    (scsi_sense_asc((uint8_t *)&sense_buf) == 0x04) &&
20346 			    (scsi_sense_ascq((uint8_t *)&sense_buf) == 0x01)) {
20347 				kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE);
20348 				return (EAGAIN);
20349 			}
20350 			break;
20351 		default:
20352 			break;
20353 		}
20354 		/* FALLTHRU */
20355 	default:
20356 		kmem_free(capacity16_buf, SD_CAPACITY_16_SIZE);
20357 		return (status);
20358 	}
20359 
20360 	/*
20361 	 * Some ATAPI CD-ROM drives report inaccurate LBA size values
20362 	 * (2352 and 0 are common) so for these devices always force the value
20363 	 * to 2048 as required by the ATAPI specs.
20364 	 */
20365 	if ((un->un_f_cfg_is_atapi == TRUE) && (ISCD(un))) {
20366 		lbasize = 2048;
20367 	}
20368 
20369 	/*
20370 	 * Get the maximum LBA value from the READ CAPACITY 16 data.
20371 	 * Here we assume that the Partial Medium Indicator (PMI) bit
20372 	 * was cleared when issuing the command. This means that the LBA
20373 	 * returned from the device is the LBA of the last logical block
20374 	 * on the logical unit.  The actual logical block count will be
20375 	 * this value plus one.
20376 	 */
20377 	capacity += 1;
20378 
20379 	/*
20380 	 * Currently, for removable media, the capacity is saved in terms
20381 	 * of un->un_sys_blocksize, so scale the capacity value to reflect this.
20382 	 */
20383 	if (un->un_f_has_removable_media)
20384 		capacity *= (lbasize / un->un_sys_blocksize);
20385 
20386 	*capp = capacity;
20387 	*lbap = lbasize;
20388 	*psp = pbsize;
20389 
20390 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_READ_CAPACITY_16: "
20391 	    "capacity:0x%llx  lbasize:0x%x, pbsize: 0x%x\n",
20392 	    capacity, lbasize, pbsize);
20393 
20394 	if ((capacity == 0) || (lbasize == 0) || (pbsize == 0)) {
20395 		sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1,
20396 		    "sd_send_scsi_READ_CAPACITY_16 received invalid value "
20397 		    "capacity %llu lbasize %d pbsize %d", capacity, lbasize);
20398 		return (EIO);
20399 	}
20400 
20401 	sd_ssc_assessment(ssc, SD_FMT_STANDARD);
20402 	return (0);
20403 }
20404 
20405 
20406 /*
20407  *    Function: sd_send_scsi_START_STOP_UNIT
20408  *
20409  * Description: Issue a scsi START STOP UNIT command to the target.
20410  *
20411  *   Arguments: ssc    - ssc contatins pointer to driver soft state (unit)
20412  *                       structure for this target.
20413  *      pc_flag - SD_POWER_CONDITION
20414  *                SD_START_STOP
20415  *		flag  - SD_TARGET_START
20416  *			SD_TARGET_STOP
20417  *			SD_TARGET_EJECT
20418  *			SD_TARGET_CLOSE
20419  *		path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
20420  *			the normal command waitq, or SD_PATH_DIRECT_PRIORITY
20421  *			to use the USCSI "direct" chain and bypass the normal
20422  *			command waitq. SD_PATH_DIRECT_PRIORITY is used when this
20423  *			command is issued as part of an error recovery action.
20424  *
20425  * Return Code: 0   - Success
20426  *		EIO - IO error
20427  *		EACCES - Reservation conflict detected
20428  *		ENXIO  - Not Ready, medium not present
20429  *		errno return code from sd_ssc_send()
20430  *
20431  *     Context: Can sleep.
20432  */
20433 
20434 static int
20435 sd_send_scsi_START_STOP_UNIT(sd_ssc_t *ssc, int pc_flag, int flag,
20436     int path_flag)
20437 {
20438 	struct	scsi_extended_sense	sense_buf;
20439 	union scsi_cdb		cdb;
20440 	struct uscsi_cmd	ucmd_buf;
20441 	int			status;
20442 	struct sd_lun		*un;
20443 
20444 	ASSERT(ssc != NULL);
20445 	un = ssc->ssc_un;
20446 	ASSERT(un != NULL);
20447 	ASSERT(!mutex_owned(SD_MUTEX(un)));
20448 
20449 	SD_TRACE(SD_LOG_IO, un,
20450 	    "sd_send_scsi_START_STOP_UNIT: entry: un:0x%p\n", un);
20451 
20452 	if (un->un_f_check_start_stop &&
20453 	    (pc_flag == SD_START_STOP) &&
20454 	    ((flag == SD_TARGET_START) || (flag == SD_TARGET_STOP)) &&
20455 	    (un->un_f_start_stop_supported != TRUE)) {
20456 		return (0);
20457 	}
20458 
20459 	/*
20460 	 * If we are performing an eject operation and
20461 	 * we receive any command other than SD_TARGET_EJECT
20462 	 * we should immediately return.
20463 	 */
20464 	if (flag != SD_TARGET_EJECT) {
20465 		mutex_enter(SD_MUTEX(un));
20466 		if (un->un_f_ejecting == TRUE) {
20467 			mutex_exit(SD_MUTEX(un));
20468 			return (EAGAIN);
20469 		}
20470 		mutex_exit(SD_MUTEX(un));
20471 	}
20472 
20473 	bzero(&cdb, sizeof (cdb));
20474 	bzero(&ucmd_buf, sizeof (ucmd_buf));
20475 	bzero(&sense_buf, sizeof (struct scsi_extended_sense));
20476 
20477 	cdb.scc_cmd = SCMD_START_STOP;
20478 	cdb.cdb_opaque[4] = (pc_flag == SD_POWER_CONDITION) ?
20479 	    (uchar_t)(flag << 4) : (uchar_t)flag;
20480 
20481 	ucmd_buf.uscsi_cdb	= (char *)&cdb;
20482 	ucmd_buf.uscsi_cdblen	= CDB_GROUP0;
20483 	ucmd_buf.uscsi_bufaddr	= NULL;
20484 	ucmd_buf.uscsi_buflen	= 0;
20485 	ucmd_buf.uscsi_rqbuf	= (caddr_t)&sense_buf;
20486 	ucmd_buf.uscsi_rqlen	= sizeof (struct scsi_extended_sense);
20487 	ucmd_buf.uscsi_flags	= USCSI_RQENABLE | USCSI_SILENT;
20488 	ucmd_buf.uscsi_timeout	= 200;
20489 
20490 	status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
20491 	    UIO_SYSSPACE, path_flag);
20492 
20493 	switch (status) {
20494 	case 0:
20495 		sd_ssc_assessment(ssc, SD_FMT_STANDARD);
20496 		break;	/* Success! */
20497 	case EIO:
20498 		switch (ucmd_buf.uscsi_status) {
20499 		case STATUS_RESERVATION_CONFLICT:
20500 			status = EACCES;
20501 			break;
20502 		case STATUS_CHECK:
20503 			if (ucmd_buf.uscsi_rqstatus == STATUS_GOOD) {
20504 				switch (scsi_sense_key(
20505 				    (uint8_t *)&sense_buf)) {
20506 				case KEY_ILLEGAL_REQUEST:
20507 					status = ENOTSUP;
20508 					break;
20509 				case KEY_NOT_READY:
20510 					if (scsi_sense_asc(
20511 					    (uint8_t *)&sense_buf)
20512 					    == 0x3A) {
20513 						status = ENXIO;
20514 					}
20515 					break;
20516 				default:
20517 					break;
20518 				}
20519 			}
20520 			break;
20521 		default:
20522 			break;
20523 		}
20524 		break;
20525 	default:
20526 		break;
20527 	}
20528 
20529 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_START_STOP_UNIT: exit\n");
20530 
20531 	return (status);
20532 }
20533 
20534 
20535 /*
20536  *    Function: sd_start_stop_unit_callback
20537  *
20538  * Description: timeout(9F) callback to begin recovery process for a
20539  *		device that has spun down.
20540  *
20541  *   Arguments: arg - pointer to associated softstate struct.
20542  *
20543  *     Context: Executes in a timeout(9F) thread context
20544  */
20545 
20546 static void
20547 sd_start_stop_unit_callback(void *arg)
20548 {
20549 	struct sd_lun	*un = arg;
20550 	ASSERT(un != NULL);
20551 	ASSERT(!mutex_owned(SD_MUTEX(un)));
20552 
20553 	SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_callback: entry\n");
20554 
20555 	(void) taskq_dispatch(sd_tq, sd_start_stop_unit_task, un, KM_NOSLEEP);
20556 }
20557 
20558 
20559 /*
20560  *    Function: sd_start_stop_unit_task
20561  *
20562  * Description: Recovery procedure when a drive is spun down.
20563  *
20564  *   Arguments: arg - pointer to associated softstate struct.
20565  *
20566  *     Context: Executes in a taskq() thread context
20567  */
20568 
20569 static void
20570 sd_start_stop_unit_task(void *arg)
20571 {
20572 	struct sd_lun	*un = arg;
20573 	sd_ssc_t	*ssc;
20574 	int		power_level;
20575 	int		rval;
20576 
20577 	ASSERT(un != NULL);
20578 	ASSERT(!mutex_owned(SD_MUTEX(un)));
20579 
20580 	SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_task: entry\n");
20581 
20582 	/*
20583 	 * Some unformatted drives report not ready error, no need to
20584 	 * restart if format has been initiated.
20585 	 */
20586 	mutex_enter(SD_MUTEX(un));
20587 	if (un->un_f_format_in_progress == TRUE) {
20588 		mutex_exit(SD_MUTEX(un));
20589 		return;
20590 	}
20591 	mutex_exit(SD_MUTEX(un));
20592 
20593 	ssc = sd_ssc_init(un);
20594 	/*
20595 	 * When a START STOP command is issued from here, it is part of a
20596 	 * failure recovery operation and must be issued before any other
20597 	 * commands, including any pending retries. Thus it must be sent
20598 	 * using SD_PATH_DIRECT_PRIORITY. It doesn't matter if the spin up
20599 	 * succeeds or not, we will start I/O after the attempt.
20600 	 * If power condition is supported and the current power level
20601 	 * is capable of performing I/O, we should set the power condition
20602 	 * to that level. Otherwise, set the power condition to ACTIVE.
20603 	 */
20604 	if (un->un_f_power_condition_supported) {
20605 		mutex_enter(SD_MUTEX(un));
20606 		ASSERT(SD_PM_IS_LEVEL_VALID(un, un->un_power_level));
20607 		power_level = sd_pwr_pc.ran_perf[un->un_power_level]
20608 		    > 0 ? un->un_power_level : SD_SPINDLE_ACTIVE;
20609 		mutex_exit(SD_MUTEX(un));
20610 		rval = sd_send_scsi_START_STOP_UNIT(ssc, SD_POWER_CONDITION,
20611 		    sd_pl2pc[power_level], SD_PATH_DIRECT_PRIORITY);
20612 	} else {
20613 		rval = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
20614 		    SD_TARGET_START, SD_PATH_DIRECT_PRIORITY);
20615 	}
20616 
20617 	if (rval != 0)
20618 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
20619 	sd_ssc_fini(ssc);
20620 	/*
20621 	 * The above call blocks until the START_STOP_UNIT command completes.
20622 	 * Now that it has completed, we must re-try the original IO that
20623 	 * received the NOT READY condition in the first place. There are
20624 	 * three possible conditions here:
20625 	 *
20626 	 *  (1) The original IO is on un_retry_bp.
20627 	 *  (2) The original IO is on the regular wait queue, and un_retry_bp
20628 	 *	is NULL.
20629 	 *  (3) The original IO is on the regular wait queue, and un_retry_bp
20630 	 *	points to some other, unrelated bp.
20631 	 *
20632 	 * For each case, we must call sd_start_cmds() with un_retry_bp
20633 	 * as the argument. If un_retry_bp is NULL, this will initiate
20634 	 * processing of the regular wait queue.  If un_retry_bp is not NULL,
20635 	 * then this will process the bp on un_retry_bp. That may or may not
20636 	 * be the original IO, but that does not matter: the important thing
20637 	 * is to keep the IO processing going at this point.
20638 	 *
20639 	 * Note: This is a very specific error recovery sequence associated
20640 	 * with a drive that is not spun up. We attempt a START_STOP_UNIT and
20641 	 * serialize the I/O with completion of the spin-up.
20642 	 */
20643 	mutex_enter(SD_MUTEX(un));
20644 	SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
20645 	    "sd_start_stop_unit_task: un:0x%p starting bp:0x%p\n",
20646 	    un, un->un_retry_bp);
20647 	un->un_startstop_timeid = NULL;	/* Timeout is no longer pending */
20648 	sd_start_cmds(un, un->un_retry_bp);
20649 	mutex_exit(SD_MUTEX(un));
20650 
20651 	SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_task: exit\n");
20652 }
20653 
20654 
20655 /*
20656  *    Function: sd_send_scsi_INQUIRY
20657  *
20658  * Description: Issue the scsi INQUIRY command.
20659  *
20660  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
20661  *                      structure for this target.
20662  *		bufaddr
20663  *		buflen
20664  *		evpd
20665  *		page_code
20666  *		page_length
20667  *
20668  * Return Code: 0   - Success
20669  *		errno return code from sd_ssc_send()
20670  *
20671  *     Context: Can sleep. Does not return until command is completed.
20672  */
20673 
20674 static int
20675 sd_send_scsi_INQUIRY(sd_ssc_t *ssc, uchar_t *bufaddr, size_t buflen,
20676     uchar_t evpd, uchar_t page_code, size_t *residp)
20677 {
20678 	union scsi_cdb		cdb;
20679 	struct uscsi_cmd	ucmd_buf;
20680 	int			status;
20681 	struct sd_lun		*un;
20682 
20683 	ASSERT(ssc != NULL);
20684 	un = ssc->ssc_un;
20685 	ASSERT(un != NULL);
20686 	ASSERT(!mutex_owned(SD_MUTEX(un)));
20687 	ASSERT(bufaddr != NULL);
20688 
20689 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_INQUIRY: entry: un:0x%p\n", un);
20690 
20691 	bzero(&cdb, sizeof (cdb));
20692 	bzero(&ucmd_buf, sizeof (ucmd_buf));
20693 	bzero(bufaddr, buflen);
20694 
20695 	cdb.scc_cmd = SCMD_INQUIRY;
20696 	cdb.cdb_opaque[1] = evpd;
20697 	cdb.cdb_opaque[2] = page_code;
20698 	FORMG0COUNT(&cdb, buflen);
20699 
20700 	ucmd_buf.uscsi_cdb	= (char *)&cdb;
20701 	ucmd_buf.uscsi_cdblen	= CDB_GROUP0;
20702 	ucmd_buf.uscsi_bufaddr	= (caddr_t)bufaddr;
20703 	ucmd_buf.uscsi_buflen	= buflen;
20704 	ucmd_buf.uscsi_rqbuf	= NULL;
20705 	ucmd_buf.uscsi_rqlen	= 0;
20706 	ucmd_buf.uscsi_flags	= USCSI_READ | USCSI_SILENT;
20707 	ucmd_buf.uscsi_timeout	= 200;	/* Excessive legacy value */
20708 
20709 	status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
20710 	    UIO_SYSSPACE, SD_PATH_DIRECT);
20711 
20712 	/*
20713 	 * Only handle status == 0, the upper-level caller
20714 	 * will put different assessment based on the context.
20715 	 */
20716 	if (status == 0)
20717 		sd_ssc_assessment(ssc, SD_FMT_STANDARD);
20718 
20719 	if ((status == 0) && (residp != NULL)) {
20720 		*residp = ucmd_buf.uscsi_resid;
20721 	}
20722 
20723 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_INQUIRY: exit\n");
20724 
20725 	return (status);
20726 }
20727 
20728 
20729 /*
20730  *    Function: sd_send_scsi_TEST_UNIT_READY
20731  *
20732  * Description: Issue the scsi TEST UNIT READY command.
20733  *		This routine can be told to set the flag USCSI_DIAGNOSE to
20734  *		prevent retrying failed commands. Use this when the intent
20735  *		is either to check for device readiness, to clear a Unit
20736  *		Attention, or to clear any outstanding sense data.
20737  *		However under specific conditions the expected behavior
20738  *		is for retries to bring a device ready, so use the flag
20739  *		with caution.
20740  *
20741  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
20742  *                      structure for this target.
20743  *		flag:   SD_CHECK_FOR_MEDIA: return ENXIO if no media present
20744  *			SD_DONT_RETRY_TUR: include uscsi flag USCSI_DIAGNOSE.
20745  *			0: dont check for media present, do retries on cmd.
20746  *
20747  * Return Code: 0   - Success
20748  *		EIO - IO error
20749  *		EACCES - Reservation conflict detected
20750  *		ENXIO  - Not Ready, medium not present
20751  *		errno return code from sd_ssc_send()
20752  *
20753  *     Context: Can sleep. Does not return until command is completed.
20754  */
20755 
20756 static int
20757 sd_send_scsi_TEST_UNIT_READY(sd_ssc_t *ssc, int flag)
20758 {
20759 	struct	scsi_extended_sense	sense_buf;
20760 	union scsi_cdb		cdb;
20761 	struct uscsi_cmd	ucmd_buf;
20762 	int			status;
20763 	struct sd_lun		*un;
20764 
20765 	ASSERT(ssc != NULL);
20766 	un = ssc->ssc_un;
20767 	ASSERT(un != NULL);
20768 	ASSERT(!mutex_owned(SD_MUTEX(un)));
20769 
20770 	SD_TRACE(SD_LOG_IO, un,
20771 	    "sd_send_scsi_TEST_UNIT_READY: entry: un:0x%p\n", un);
20772 
20773 	/*
20774 	 * Some Seagate elite1 TQ devices get hung with disconnect/reconnect
20775 	 * timeouts when they receive a TUR and the queue is not empty. Check
20776 	 * the configuration flag set during attach (indicating the drive has
20777 	 * this firmware bug) and un_ncmds_in_transport before issuing the
20778 	 * TUR. If there are
20779 	 * pending commands return success, this is a bit arbitrary but is ok
20780 	 * for non-removables (i.e. the eliteI disks) and non-clustering
20781 	 * configurations.
20782 	 */
20783 	if (un->un_f_cfg_tur_check == TRUE) {
20784 		mutex_enter(SD_MUTEX(un));
20785 		if (un->un_ncmds_in_transport != 0) {
20786 			mutex_exit(SD_MUTEX(un));
20787 			return (0);
20788 		}
20789 		mutex_exit(SD_MUTEX(un));
20790 	}
20791 
20792 	bzero(&cdb, sizeof (cdb));
20793 	bzero(&ucmd_buf, sizeof (ucmd_buf));
20794 	bzero(&sense_buf, sizeof (struct scsi_extended_sense));
20795 
20796 	cdb.scc_cmd = SCMD_TEST_UNIT_READY;
20797 
20798 	ucmd_buf.uscsi_cdb	= (char *)&cdb;
20799 	ucmd_buf.uscsi_cdblen	= CDB_GROUP0;
20800 	ucmd_buf.uscsi_bufaddr	= NULL;
20801 	ucmd_buf.uscsi_buflen	= 0;
20802 	ucmd_buf.uscsi_rqbuf	= (caddr_t)&sense_buf;
20803 	ucmd_buf.uscsi_rqlen	= sizeof (struct scsi_extended_sense);
20804 	ucmd_buf.uscsi_flags	= USCSI_RQENABLE | USCSI_SILENT;
20805 
20806 	/* Use flag USCSI_DIAGNOSE to prevent retries if it fails. */
20807 	if ((flag & SD_DONT_RETRY_TUR) != 0) {
20808 		ucmd_buf.uscsi_flags |= USCSI_DIAGNOSE;
20809 	}
20810 	ucmd_buf.uscsi_timeout	= 60;
20811 
20812 	status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
20813 	    UIO_SYSSPACE, ((flag & SD_BYPASS_PM) ? SD_PATH_DIRECT :
20814 	    SD_PATH_STANDARD));
20815 
20816 	switch (status) {
20817 	case 0:
20818 		sd_ssc_assessment(ssc, SD_FMT_STANDARD);
20819 		break;	/* Success! */
20820 	case EIO:
20821 		switch (ucmd_buf.uscsi_status) {
20822 		case STATUS_RESERVATION_CONFLICT:
20823 			status = EACCES;
20824 			break;
20825 		case STATUS_CHECK:
20826 			if ((flag & SD_CHECK_FOR_MEDIA) == 0) {
20827 				break;
20828 			}
20829 			if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
20830 			    (scsi_sense_key((uint8_t *)&sense_buf) ==
20831 			    KEY_NOT_READY) &&
20832 			    (scsi_sense_asc((uint8_t *)&sense_buf) == 0x3A)) {
20833 				status = ENXIO;
20834 			}
20835 			break;
20836 		default:
20837 			break;
20838 		}
20839 		break;
20840 	default:
20841 		break;
20842 	}
20843 
20844 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_TEST_UNIT_READY: exit\n");
20845 
20846 	return (status);
20847 }
20848 
20849 /*
20850  *    Function: sd_send_scsi_PERSISTENT_RESERVE_IN
20851  *
20852  * Description: Issue the scsi PERSISTENT RESERVE IN command.
20853  *
20854  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
20855  *                      structure for this target.
20856  *
20857  * Return Code: 0   - Success
20858  *		EACCES
20859  *		ENOTSUP
20860  *		errno return code from sd_ssc_send()
20861  *
20862  *     Context: Can sleep. Does not return until command is completed.
20863  */
20864 
20865 static int
20866 sd_send_scsi_PERSISTENT_RESERVE_IN(sd_ssc_t *ssc, uchar_t usr_cmd,
20867     uint16_t data_len, uchar_t *data_bufp)
20868 {
20869 	struct scsi_extended_sense	sense_buf;
20870 	union scsi_cdb		cdb;
20871 	struct uscsi_cmd	ucmd_buf;
20872 	int			status;
20873 	int			no_caller_buf = FALSE;
20874 	struct sd_lun		*un;
20875 
20876 	ASSERT(ssc != NULL);
20877 	un = ssc->ssc_un;
20878 	ASSERT(un != NULL);
20879 	ASSERT(!mutex_owned(SD_MUTEX(un)));
20880 	ASSERT((usr_cmd == SD_READ_KEYS) || (usr_cmd == SD_READ_RESV));
20881 
20882 	SD_TRACE(SD_LOG_IO, un,
20883 	    "sd_send_scsi_PERSISTENT_RESERVE_IN: entry: un:0x%p\n", un);
20884 
20885 	bzero(&cdb, sizeof (cdb));
20886 	bzero(&ucmd_buf, sizeof (ucmd_buf));
20887 	bzero(&sense_buf, sizeof (struct scsi_extended_sense));
20888 	if (data_bufp == NULL) {
20889 		/* Allocate a default buf if the caller did not give one */
20890 		ASSERT(data_len == 0);
20891 		data_len  = MHIOC_RESV_KEY_SIZE;
20892 		data_bufp = kmem_zalloc(MHIOC_RESV_KEY_SIZE, KM_SLEEP);
20893 		no_caller_buf = TRUE;
20894 	}
20895 
20896 	cdb.scc_cmd = SCMD_PERSISTENT_RESERVE_IN;
20897 	cdb.cdb_opaque[1] = usr_cmd;
20898 	FORMG1COUNT(&cdb, data_len);
20899 
20900 	ucmd_buf.uscsi_cdb	= (char *)&cdb;
20901 	ucmd_buf.uscsi_cdblen	= CDB_GROUP1;
20902 	ucmd_buf.uscsi_bufaddr	= (caddr_t)data_bufp;
20903 	ucmd_buf.uscsi_buflen	= data_len;
20904 	ucmd_buf.uscsi_rqbuf	= (caddr_t)&sense_buf;
20905 	ucmd_buf.uscsi_rqlen	= sizeof (struct scsi_extended_sense);
20906 	ucmd_buf.uscsi_flags	= USCSI_RQENABLE | USCSI_READ | USCSI_SILENT;
20907 	ucmd_buf.uscsi_timeout	= 60;
20908 
20909 	status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
20910 	    UIO_SYSSPACE, SD_PATH_STANDARD);
20911 
20912 	switch (status) {
20913 	case 0:
20914 		sd_ssc_assessment(ssc, SD_FMT_STANDARD);
20915 
20916 		break;	/* Success! */
20917 	case EIO:
20918 		switch (ucmd_buf.uscsi_status) {
20919 		case STATUS_RESERVATION_CONFLICT:
20920 			status = EACCES;
20921 			break;
20922 		case STATUS_CHECK:
20923 			if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
20924 			    (scsi_sense_key((uint8_t *)&sense_buf) ==
20925 			    KEY_ILLEGAL_REQUEST)) {
20926 				status = ENOTSUP;
20927 			}
20928 			break;
20929 		default:
20930 			break;
20931 		}
20932 		break;
20933 	default:
20934 		break;
20935 	}
20936 
20937 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_PERSISTENT_RESERVE_IN: exit\n");
20938 
20939 	if (no_caller_buf == TRUE) {
20940 		kmem_free(data_bufp, data_len);
20941 	}
20942 
20943 	return (status);
20944 }
20945 
20946 
20947 /*
20948  *    Function: sd_send_scsi_PERSISTENT_RESERVE_OUT
20949  *
20950  * Description: This routine is the driver entry point for handling CD-ROM
20951  *		multi-host persistent reservation requests (MHIOCGRP_INKEYS,
20952  *		MHIOCGRP_INRESV) by sending the SCSI-3 PROUT commands to the
20953  *		device.
20954  *
20955  *   Arguments: ssc  -  ssc contains un - pointer to soft state struct
20956  *                      for the target.
20957  *		usr_cmd SCSI-3 reservation facility command (one of
20958  *			SD_SCSI3_REGISTER, SD_SCSI3_RESERVE, SD_SCSI3_RELEASE,
20959  *			SD_SCSI3_PREEMPTANDABORT, SD_SCSI3_CLEAR)
20960  *		usr_bufp - user provided pointer register, reserve descriptor or
20961  *			preempt and abort structure (mhioc_register_t,
20962  *                      mhioc_resv_desc_t, mhioc_preemptandabort_t)
20963  *
20964  * Return Code: 0   - Success
20965  *		EACCES
20966  *		ENOTSUP
20967  *		errno return code from sd_ssc_send()
20968  *
20969  *     Context: Can sleep. Does not return until command is completed.
20970  */
20971 
20972 static int
20973 sd_send_scsi_PERSISTENT_RESERVE_OUT(sd_ssc_t *ssc, uchar_t usr_cmd,
20974     uchar_t *usr_bufp)
20975 {
20976 	struct scsi_extended_sense	sense_buf;
20977 	union scsi_cdb		cdb;
20978 	struct uscsi_cmd	ucmd_buf;
20979 	int			status;
20980 	uchar_t			data_len = sizeof (sd_prout_t);
20981 	sd_prout_t		*prp;
20982 	struct sd_lun		*un;
20983 
20984 	ASSERT(ssc != NULL);
20985 	un = ssc->ssc_un;
20986 	ASSERT(un != NULL);
20987 	ASSERT(!mutex_owned(SD_MUTEX(un)));
20988 	ASSERT(data_len == 24);	/* required by scsi spec */
20989 
20990 	SD_TRACE(SD_LOG_IO, un,
20991 	    "sd_send_scsi_PERSISTENT_RESERVE_OUT: entry: un:0x%p\n", un);
20992 
20993 	if (usr_bufp == NULL) {
20994 		return (EINVAL);
20995 	}
20996 
20997 	bzero(&cdb, sizeof (cdb));
20998 	bzero(&ucmd_buf, sizeof (ucmd_buf));
20999 	bzero(&sense_buf, sizeof (struct scsi_extended_sense));
21000 	prp = kmem_zalloc(data_len, KM_SLEEP);
21001 
21002 	cdb.scc_cmd = SCMD_PERSISTENT_RESERVE_OUT;
21003 	cdb.cdb_opaque[1] = usr_cmd;
21004 	FORMG1COUNT(&cdb, data_len);
21005 
21006 	ucmd_buf.uscsi_cdb	= (char *)&cdb;
21007 	ucmd_buf.uscsi_cdblen	= CDB_GROUP1;
21008 	ucmd_buf.uscsi_bufaddr	= (caddr_t)prp;
21009 	ucmd_buf.uscsi_buflen	= data_len;
21010 	ucmd_buf.uscsi_rqbuf	= (caddr_t)&sense_buf;
21011 	ucmd_buf.uscsi_rqlen	= sizeof (struct scsi_extended_sense);
21012 	ucmd_buf.uscsi_flags	= USCSI_RQENABLE | USCSI_WRITE | USCSI_SILENT;
21013 	ucmd_buf.uscsi_timeout	= 60;
21014 
21015 	switch (usr_cmd) {
21016 	case SD_SCSI3_REGISTER: {
21017 		mhioc_register_t *ptr = (mhioc_register_t *)usr_bufp;
21018 
21019 		bcopy(ptr->oldkey.key, prp->res_key, MHIOC_RESV_KEY_SIZE);
21020 		bcopy(ptr->newkey.key, prp->service_key,
21021 		    MHIOC_RESV_KEY_SIZE);
21022 		prp->aptpl = ptr->aptpl;
21023 		break;
21024 	}
21025 	case SD_SCSI3_CLEAR: {
21026 		mhioc_resv_desc_t *ptr = (mhioc_resv_desc_t *)usr_bufp;
21027 
21028 		bcopy(ptr->key.key, prp->res_key, MHIOC_RESV_KEY_SIZE);
21029 		break;
21030 	}
21031 	case SD_SCSI3_RESERVE:
21032 	case SD_SCSI3_RELEASE: {
21033 		mhioc_resv_desc_t *ptr = (mhioc_resv_desc_t *)usr_bufp;
21034 
21035 		bcopy(ptr->key.key, prp->res_key, MHIOC_RESV_KEY_SIZE);
21036 		prp->scope_address = BE_32(ptr->scope_specific_addr);
21037 		cdb.cdb_opaque[2] = ptr->type;
21038 		break;
21039 	}
21040 	case SD_SCSI3_PREEMPTANDABORT: {
21041 		mhioc_preemptandabort_t *ptr =
21042 		    (mhioc_preemptandabort_t *)usr_bufp;
21043 
21044 		bcopy(ptr->resvdesc.key.key, prp->res_key, MHIOC_RESV_KEY_SIZE);
21045 		bcopy(ptr->victim_key.key, prp->service_key,
21046 		    MHIOC_RESV_KEY_SIZE);
21047 		prp->scope_address = BE_32(ptr->resvdesc.scope_specific_addr);
21048 		cdb.cdb_opaque[2] = ptr->resvdesc.type;
21049 		ucmd_buf.uscsi_flags |= USCSI_HEAD;
21050 		break;
21051 	}
21052 	case SD_SCSI3_REGISTERANDIGNOREKEY:
21053 	{
21054 		mhioc_registerandignorekey_t *ptr;
21055 		ptr = (mhioc_registerandignorekey_t *)usr_bufp;
21056 		bcopy(ptr->newkey.key,
21057 		    prp->service_key, MHIOC_RESV_KEY_SIZE);
21058 		prp->aptpl = ptr->aptpl;
21059 		break;
21060 	}
21061 	default:
21062 		ASSERT(FALSE);
21063 		break;
21064 	}
21065 
21066 	status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
21067 	    UIO_SYSSPACE, SD_PATH_STANDARD);
21068 
21069 	switch (status) {
21070 	case 0:
21071 		sd_ssc_assessment(ssc, SD_FMT_STANDARD);
21072 		break;	/* Success! */
21073 	case EIO:
21074 		switch (ucmd_buf.uscsi_status) {
21075 		case STATUS_RESERVATION_CONFLICT:
21076 			status = EACCES;
21077 			break;
21078 		case STATUS_CHECK:
21079 			if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
21080 			    (scsi_sense_key((uint8_t *)&sense_buf) ==
21081 			    KEY_ILLEGAL_REQUEST)) {
21082 				status = ENOTSUP;
21083 			}
21084 			break;
21085 		default:
21086 			break;
21087 		}
21088 		break;
21089 	default:
21090 		break;
21091 	}
21092 
21093 	kmem_free(prp, data_len);
21094 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_PERSISTENT_RESERVE_OUT: exit\n");
21095 	return (status);
21096 }
21097 
21098 
21099 /*
21100  *    Function: sd_send_scsi_SYNCHRONIZE_CACHE
21101  *
21102  * Description: Issues a scsi SYNCHRONIZE CACHE command to the target
21103  *
21104  *   Arguments: un - pointer to the target's soft state struct
21105  *              dkc - pointer to the callback structure
21106  *
21107  * Return Code: 0 - success
21108  *		errno-type error code
21109  *
21110  *     Context: kernel thread context only.
21111  *
21112  *  _______________________________________________________________
21113  * | dkc_flag &   | dkc_callback | DKIOCFLUSHWRITECACHE            |
21114  * |FLUSH_VOLATILE|              | operation                       |
21115  * |______________|______________|_________________________________|
21116  * | 0            | NULL         | Synchronous flush on both       |
21117  * |              |              | volatile and non-volatile cache |
21118  * |______________|______________|_________________________________|
21119  * | 1            | NULL         | Synchronous flush on volatile   |
21120  * |              |              | cache; disk drivers may suppress|
21121  * |              |              | flush if disk table indicates   |
21122  * |              |              | non-volatile cache              |
21123  * |______________|______________|_________________________________|
21124  * | 0            | !NULL        | Asynchronous flush on both      |
21125  * |              |              | volatile and non-volatile cache;|
21126  * |______________|______________|_________________________________|
21127  * | 1            | !NULL        | Asynchronous flush on volatile  |
21128  * |              |              | cache; disk drivers may suppress|
21129  * |              |              | flush if disk table indicates   |
21130  * |              |              | non-volatile cache              |
21131  * |______________|______________|_________________________________|
21132  *
21133  */
21134 
21135 static int
21136 sd_send_scsi_SYNCHRONIZE_CACHE(struct sd_lun *un, struct dk_callback *dkc)
21137 {
21138 	struct sd_uscsi_info	*uip;
21139 	struct uscsi_cmd	*uscmd;
21140 	union scsi_cdb		*cdb;
21141 	struct buf		*bp;
21142 	int			rval = 0;
21143 	int			is_async;
21144 
21145 	SD_TRACE(SD_LOG_IO, un,
21146 	    "sd_send_scsi_SYNCHRONIZE_CACHE: entry: un:0x%p\n", un);
21147 
21148 	ASSERT(un != NULL);
21149 	ASSERT(!mutex_owned(SD_MUTEX(un)));
21150 
21151 	if (dkc == NULL || dkc->dkc_callback == NULL) {
21152 		is_async = FALSE;
21153 	} else {
21154 		is_async = TRUE;
21155 	}
21156 
21157 	mutex_enter(SD_MUTEX(un));
21158 	/* check whether cache flush should be suppressed */
21159 	if (un->un_f_suppress_cache_flush == TRUE) {
21160 		mutex_exit(SD_MUTEX(un));
21161 		/*
21162 		 * suppress the cache flush if the device is told to do
21163 		 * so by sd.conf or disk table
21164 		 */
21165 		SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_SYNCHRONIZE_CACHE: \
21166 		    skip the cache flush since suppress_cache_flush is %d!\n",
21167 		    un->un_f_suppress_cache_flush);
21168 
21169 		if (is_async == TRUE) {
21170 			/* invoke callback for asynchronous flush */
21171 			(*dkc->dkc_callback)(dkc->dkc_cookie, 0);
21172 		}
21173 		return (rval);
21174 	}
21175 	mutex_exit(SD_MUTEX(un));
21176 
21177 	/*
21178 	 * check dkc_flag & FLUSH_VOLATILE so SYNC_NV bit can be
21179 	 * set properly
21180 	 */
21181 	cdb = kmem_zalloc(CDB_GROUP1, KM_SLEEP);
21182 	cdb->scc_cmd = SCMD_SYNCHRONIZE_CACHE;
21183 
21184 	mutex_enter(SD_MUTEX(un));
21185 	if (dkc != NULL && un->un_f_sync_nv_supported &&
21186 	    (dkc->dkc_flag & FLUSH_VOLATILE)) {
21187 		/*
21188 		 * if the device supports SYNC_NV bit, turn on
21189 		 * the SYNC_NV bit to only flush volatile cache
21190 		 */
21191 		cdb->cdb_un.tag |= SD_SYNC_NV_BIT;
21192 	}
21193 	mutex_exit(SD_MUTEX(un));
21194 
21195 	/*
21196 	 * First get some memory for the uscsi_cmd struct and cdb
21197 	 * and initialize for SYNCHRONIZE_CACHE cmd.
21198 	 */
21199 	uscmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
21200 	uscmd->uscsi_cdblen = CDB_GROUP1;
21201 	uscmd->uscsi_cdb = (caddr_t)cdb;
21202 	uscmd->uscsi_bufaddr = NULL;
21203 	uscmd->uscsi_buflen = 0;
21204 	uscmd->uscsi_rqbuf = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
21205 	uscmd->uscsi_rqlen = SENSE_LENGTH;
21206 	uscmd->uscsi_rqresid = SENSE_LENGTH;
21207 	uscmd->uscsi_flags = USCSI_RQENABLE | USCSI_SILENT;
21208 	uscmd->uscsi_timeout = sd_io_time;
21209 
21210 	/*
21211 	 * Allocate an sd_uscsi_info struct and fill it with the info
21212 	 * needed by sd_initpkt_for_uscsi().  Then put the pointer into
21213 	 * b_private in the buf for sd_initpkt_for_uscsi().  Note that
21214 	 * since we allocate the buf here in this function, we do not
21215 	 * need to preserve the prior contents of b_private.
21216 	 * The sd_uscsi_info struct is also used by sd_uscsi_strategy()
21217 	 */
21218 	uip = kmem_zalloc(sizeof (struct sd_uscsi_info), KM_SLEEP);
21219 	uip->ui_flags = SD_PATH_DIRECT;
21220 	uip->ui_cmdp  = uscmd;
21221 
21222 	bp = getrbuf(KM_SLEEP);
21223 	bp->b_private = uip;
21224 
21225 	/*
21226 	 * Setup buffer to carry uscsi request.
21227 	 */
21228 	bp->b_flags  = B_BUSY;
21229 	bp->b_bcount = 0;
21230 	bp->b_blkno  = 0;
21231 
21232 	if (is_async == TRUE) {
21233 		bp->b_iodone = sd_send_scsi_SYNCHRONIZE_CACHE_biodone;
21234 		uip->ui_dkc = *dkc;
21235 	}
21236 
21237 	bp->b_edev = SD_GET_DEV(un);
21238 	bp->b_dev = cmpdev(bp->b_edev);	/* maybe unnecessary? */
21239 
21240 	/*
21241 	 * Unset un_f_sync_cache_required flag
21242 	 */
21243 	mutex_enter(SD_MUTEX(un));
21244 	un->un_f_sync_cache_required = FALSE;
21245 	mutex_exit(SD_MUTEX(un));
21246 
21247 	(void) sd_uscsi_strategy(bp);
21248 
21249 	/*
21250 	 * If synchronous request, wait for completion
21251 	 * If async just return and let b_iodone callback
21252 	 * cleanup.
21253 	 * NOTE: On return, u_ncmds_in_driver will be decremented,
21254 	 * but it was also incremented in sd_uscsi_strategy(), so
21255 	 * we should be ok.
21256 	 */
21257 	if (is_async == FALSE) {
21258 		(void) biowait(bp);
21259 		rval = sd_send_scsi_SYNCHRONIZE_CACHE_biodone(bp);
21260 	}
21261 
21262 	return (rval);
21263 }
21264 
21265 
21266 static int
21267 sd_send_scsi_SYNCHRONIZE_CACHE_biodone(struct buf *bp)
21268 {
21269 	struct sd_uscsi_info *uip;
21270 	struct uscsi_cmd *uscmd;
21271 	uint8_t *sense_buf;
21272 	struct sd_lun *un;
21273 	int status;
21274 	union scsi_cdb *cdb;
21275 
21276 	uip = (struct sd_uscsi_info *)(bp->b_private);
21277 	ASSERT(uip != NULL);
21278 
21279 	uscmd = uip->ui_cmdp;
21280 	ASSERT(uscmd != NULL);
21281 
21282 	sense_buf = (uint8_t *)uscmd->uscsi_rqbuf;
21283 	ASSERT(sense_buf != NULL);
21284 
21285 	un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp));
21286 	ASSERT(un != NULL);
21287 
21288 	cdb = (union scsi_cdb *)uscmd->uscsi_cdb;
21289 
21290 	status = geterror(bp);
21291 	switch (status) {
21292 	case 0:
21293 		break;	/* Success! */
21294 	case EIO:
21295 		switch (uscmd->uscsi_status) {
21296 		case STATUS_RESERVATION_CONFLICT:
21297 			/* Ignore reservation conflict */
21298 			status = 0;
21299 			goto done;
21300 
21301 		case STATUS_CHECK:
21302 			if ((uscmd->uscsi_rqstatus == STATUS_GOOD) &&
21303 			    (scsi_sense_key(sense_buf) ==
21304 			    KEY_ILLEGAL_REQUEST)) {
21305 				/* Ignore Illegal Request error */
21306 				if (cdb->cdb_un.tag&SD_SYNC_NV_BIT) {
21307 					mutex_enter(SD_MUTEX(un));
21308 					un->un_f_sync_nv_supported = FALSE;
21309 					mutex_exit(SD_MUTEX(un));
21310 					status = 0;
21311 					SD_TRACE(SD_LOG_IO, un,
21312 					    "un_f_sync_nv_supported \
21313 					    is set to false.\n");
21314 					goto done;
21315 				}
21316 
21317 				mutex_enter(SD_MUTEX(un));
21318 				un->un_f_sync_cache_supported = FALSE;
21319 				mutex_exit(SD_MUTEX(un));
21320 				SD_TRACE(SD_LOG_IO, un,
21321 				    "sd_send_scsi_SYNCHRONIZE_CACHE_biodone: \
21322 				    un_f_sync_cache_supported set to false \
21323 				    with asc = %x, ascq = %x\n",
21324 				    scsi_sense_asc(sense_buf),
21325 				    scsi_sense_ascq(sense_buf));
21326 				status = ENOTSUP;
21327 				goto done;
21328 			}
21329 			break;
21330 		default:
21331 			break;
21332 		}
21333 		/* FALLTHRU */
21334 	default:
21335 		/*
21336 		 * Turn on the un_f_sync_cache_required flag
21337 		 * since the SYNC CACHE command failed
21338 		 */
21339 		mutex_enter(SD_MUTEX(un));
21340 		un->un_f_sync_cache_required = TRUE;
21341 		mutex_exit(SD_MUTEX(un));
21342 
21343 		/*
21344 		 * Don't log an error message if this device
21345 		 * has removable media.
21346 		 */
21347 		if (!un->un_f_has_removable_media) {
21348 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
21349 			    "SYNCHRONIZE CACHE command failed (%d)\n", status);
21350 		}
21351 		break;
21352 	}
21353 
21354 done:
21355 	if (uip->ui_dkc.dkc_callback != NULL) {
21356 		(*uip->ui_dkc.dkc_callback)(uip->ui_dkc.dkc_cookie, status);
21357 	}
21358 
21359 	ASSERT((bp->b_flags & B_REMAPPED) == 0);
21360 	freerbuf(bp);
21361 	kmem_free(uip, sizeof (struct sd_uscsi_info));
21362 	kmem_free(uscmd->uscsi_rqbuf, SENSE_LENGTH);
21363 	kmem_free(uscmd->uscsi_cdb, (size_t)uscmd->uscsi_cdblen);
21364 	kmem_free(uscmd, sizeof (struct uscsi_cmd));
21365 
21366 	return (status);
21367 }
21368 
21369 
21370 /*
21371  *    Function: sd_send_scsi_GET_CONFIGURATION
21372  *
21373  * Description: Issues the get configuration command to the device.
21374  *		Called from sd_check_for_writable_cd & sd_get_media_info
21375  *		caller needs to ensure that buflen = SD_PROFILE_HEADER_LEN
21376  *   Arguments: ssc
21377  *		ucmdbuf
21378  *		rqbuf
21379  *		rqbuflen
21380  *		bufaddr
21381  *		buflen
21382  *		path_flag
21383  *
21384  * Return Code: 0   - Success
21385  *		errno return code from sd_ssc_send()
21386  *
21387  *     Context: Can sleep. Does not return until command is completed.
21388  *
21389  */
21390 
21391 static int
21392 sd_send_scsi_GET_CONFIGURATION(sd_ssc_t *ssc, struct uscsi_cmd *ucmdbuf,
21393     uchar_t *rqbuf, uint_t rqbuflen, uchar_t *bufaddr, uint_t buflen,
21394     int path_flag)
21395 {
21396 	char	cdb[CDB_GROUP1];
21397 	int	status;
21398 	struct sd_lun	*un;
21399 
21400 	ASSERT(ssc != NULL);
21401 	un = ssc->ssc_un;
21402 	ASSERT(un != NULL);
21403 	ASSERT(!mutex_owned(SD_MUTEX(un)));
21404 	ASSERT(bufaddr != NULL);
21405 	ASSERT(ucmdbuf != NULL);
21406 	ASSERT(rqbuf != NULL);
21407 
21408 	SD_TRACE(SD_LOG_IO, un,
21409 	    "sd_send_scsi_GET_CONFIGURATION: entry: un:0x%p\n", un);
21410 
21411 	bzero(cdb, sizeof (cdb));
21412 	bzero(ucmdbuf, sizeof (struct uscsi_cmd));
21413 	bzero(rqbuf, rqbuflen);
21414 	bzero(bufaddr, buflen);
21415 
21416 	/*
21417 	 * Set up cdb field for the get configuration command.
21418 	 */
21419 	cdb[0] = SCMD_GET_CONFIGURATION;
21420 	cdb[1] = 0x02;  /* Requested Type */
21421 	cdb[8] = SD_PROFILE_HEADER_LEN;
21422 	ucmdbuf->uscsi_cdb = cdb;
21423 	ucmdbuf->uscsi_cdblen = CDB_GROUP1;
21424 	ucmdbuf->uscsi_bufaddr = (caddr_t)bufaddr;
21425 	ucmdbuf->uscsi_buflen = buflen;
21426 	ucmdbuf->uscsi_timeout = sd_io_time;
21427 	ucmdbuf->uscsi_rqbuf = (caddr_t)rqbuf;
21428 	ucmdbuf->uscsi_rqlen = rqbuflen;
21429 	ucmdbuf->uscsi_flags = USCSI_RQENABLE|USCSI_SILENT|USCSI_READ;
21430 
21431 	status = sd_ssc_send(ssc, ucmdbuf, FKIOCTL,
21432 	    UIO_SYSSPACE, path_flag);
21433 
21434 	switch (status) {
21435 	case 0:
21436 		sd_ssc_assessment(ssc, SD_FMT_STANDARD);
21437 		break;  /* Success! */
21438 	case EIO:
21439 		switch (ucmdbuf->uscsi_status) {
21440 		case STATUS_RESERVATION_CONFLICT:
21441 			status = EACCES;
21442 			break;
21443 		default:
21444 			break;
21445 		}
21446 		break;
21447 	default:
21448 		break;
21449 	}
21450 
21451 	if (status == 0) {
21452 		SD_DUMP_MEMORY(un, SD_LOG_IO,
21453 		    "sd_send_scsi_GET_CONFIGURATION: data",
21454 		    (uchar_t *)bufaddr, SD_PROFILE_HEADER_LEN, SD_LOG_HEX);
21455 	}
21456 
21457 	SD_TRACE(SD_LOG_IO, un,
21458 	    "sd_send_scsi_GET_CONFIGURATION: exit\n");
21459 
21460 	return (status);
21461 }
21462 
21463 /*
21464  *    Function: sd_send_scsi_feature_GET_CONFIGURATION
21465  *
21466  * Description: Issues the get configuration command to the device to
21467  *              retrieve a specific feature. Called from
21468  *		sd_check_for_writable_cd & sd_set_mmc_caps.
21469  *   Arguments: ssc
21470  *              ucmdbuf
21471  *              rqbuf
21472  *              rqbuflen
21473  *              bufaddr
21474  *              buflen
21475  *		feature
21476  *
21477  * Return Code: 0   - Success
21478  *              errno return code from sd_ssc_send()
21479  *
21480  *     Context: Can sleep. Does not return until command is completed.
21481  *
21482  */
21483 static int
21484 sd_send_scsi_feature_GET_CONFIGURATION(sd_ssc_t *ssc, struct uscsi_cmd *ucmdbuf,
21485     uchar_t *rqbuf, uint_t rqbuflen, uchar_t *bufaddr, uint_t buflen,
21486     char feature, int path_flag)
21487 {
21488 	char    cdb[CDB_GROUP1];
21489 	int	status;
21490 	struct sd_lun	*un;
21491 
21492 	ASSERT(ssc != NULL);
21493 	un = ssc->ssc_un;
21494 	ASSERT(un != NULL);
21495 	ASSERT(!mutex_owned(SD_MUTEX(un)));
21496 	ASSERT(bufaddr != NULL);
21497 	ASSERT(ucmdbuf != NULL);
21498 	ASSERT(rqbuf != NULL);
21499 
21500 	SD_TRACE(SD_LOG_IO, un,
21501 	    "sd_send_scsi_feature_GET_CONFIGURATION: entry: un:0x%p\n", un);
21502 
21503 	bzero(cdb, sizeof (cdb));
21504 	bzero(ucmdbuf, sizeof (struct uscsi_cmd));
21505 	bzero(rqbuf, rqbuflen);
21506 	bzero(bufaddr, buflen);
21507 
21508 	/*
21509 	 * Set up cdb field for the get configuration command.
21510 	 */
21511 	cdb[0] = SCMD_GET_CONFIGURATION;
21512 	cdb[1] = 0x02;  /* Requested Type */
21513 	cdb[3] = feature;
21514 	cdb[8] = buflen;
21515 	ucmdbuf->uscsi_cdb = cdb;
21516 	ucmdbuf->uscsi_cdblen = CDB_GROUP1;
21517 	ucmdbuf->uscsi_bufaddr = (caddr_t)bufaddr;
21518 	ucmdbuf->uscsi_buflen = buflen;
21519 	ucmdbuf->uscsi_timeout = sd_io_time;
21520 	ucmdbuf->uscsi_rqbuf = (caddr_t)rqbuf;
21521 	ucmdbuf->uscsi_rqlen = rqbuflen;
21522 	ucmdbuf->uscsi_flags = USCSI_RQENABLE|USCSI_SILENT|USCSI_READ;
21523 
21524 	status = sd_ssc_send(ssc, ucmdbuf, FKIOCTL,
21525 	    UIO_SYSSPACE, path_flag);
21526 
21527 	switch (status) {
21528 	case 0:
21529 
21530 		break;  /* Success! */
21531 	case EIO:
21532 		switch (ucmdbuf->uscsi_status) {
21533 		case STATUS_RESERVATION_CONFLICT:
21534 			status = EACCES;
21535 			break;
21536 		default:
21537 			break;
21538 		}
21539 		break;
21540 	default:
21541 		break;
21542 	}
21543 
21544 	if (status == 0) {
21545 		SD_DUMP_MEMORY(un, SD_LOG_IO,
21546 		    "sd_send_scsi_feature_GET_CONFIGURATION: data",
21547 		    (uchar_t *)bufaddr, SD_PROFILE_HEADER_LEN, SD_LOG_HEX);
21548 	}
21549 
21550 	SD_TRACE(SD_LOG_IO, un,
21551 	    "sd_send_scsi_feature_GET_CONFIGURATION: exit\n");
21552 
21553 	return (status);
21554 }
21555 
21556 
21557 /*
21558  *    Function: sd_send_scsi_MODE_SENSE
21559  *
21560  * Description: Utility function for issuing a scsi MODE SENSE command.
21561  *		Note: This routine uses a consistent implementation for Group0,
21562  *		Group1, and Group2 commands across all platforms. ATAPI devices
21563  *		use Group 1 Read/Write commands and Group 2 Mode Sense/Select
21564  *
21565  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
21566  *                      structure for this target.
21567  *		cdbsize - size CDB to be used (CDB_GROUP0 (6 byte), or
21568  *			  CDB_GROUP[1|2] (10 byte).
21569  *		bufaddr - buffer for page data retrieved from the target.
21570  *		buflen - size of page to be retrieved.
21571  *		page_code - page code of data to be retrieved from the target.
21572  *		path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
21573  *			the normal command waitq, or SD_PATH_DIRECT_PRIORITY
21574  *			to use the USCSI "direct" chain and bypass the normal
21575  *			command waitq.
21576  *
21577  * Return Code: 0   - Success
21578  *		errno return code from sd_ssc_send()
21579  *
21580  *     Context: Can sleep. Does not return until command is completed.
21581  */
21582 
21583 static int
21584 sd_send_scsi_MODE_SENSE(sd_ssc_t *ssc, int cdbsize, uchar_t *bufaddr,
21585     size_t buflen,  uchar_t page_code, int path_flag)
21586 {
21587 	struct	scsi_extended_sense	sense_buf;
21588 	union scsi_cdb		cdb;
21589 	struct uscsi_cmd	ucmd_buf;
21590 	int			status;
21591 	int			headlen;
21592 	struct sd_lun		*un;
21593 
21594 	ASSERT(ssc != NULL);
21595 	un = ssc->ssc_un;
21596 	ASSERT(un != NULL);
21597 	ASSERT(!mutex_owned(SD_MUTEX(un)));
21598 	ASSERT(bufaddr != NULL);
21599 	ASSERT((cdbsize == CDB_GROUP0) || (cdbsize == CDB_GROUP1) ||
21600 	    (cdbsize == CDB_GROUP2));
21601 
21602 	SD_TRACE(SD_LOG_IO, un,
21603 	    "sd_send_scsi_MODE_SENSE: entry: un:0x%p\n", un);
21604 
21605 	bzero(&cdb, sizeof (cdb));
21606 	bzero(&ucmd_buf, sizeof (ucmd_buf));
21607 	bzero(&sense_buf, sizeof (struct scsi_extended_sense));
21608 	bzero(bufaddr, buflen);
21609 
21610 	if (cdbsize == CDB_GROUP0) {
21611 		cdb.scc_cmd = SCMD_MODE_SENSE;
21612 		cdb.cdb_opaque[2] = page_code;
21613 		FORMG0COUNT(&cdb, buflen);
21614 		headlen = MODE_HEADER_LENGTH;
21615 	} else {
21616 		cdb.scc_cmd = SCMD_MODE_SENSE_G1;
21617 		cdb.cdb_opaque[2] = page_code;
21618 		FORMG1COUNT(&cdb, buflen);
21619 		headlen = MODE_HEADER_LENGTH_GRP2;
21620 	}
21621 
21622 	ASSERT(headlen <= buflen);
21623 	SD_FILL_SCSI1_LUN_CDB(un, &cdb);
21624 
21625 	ucmd_buf.uscsi_cdb	= (char *)&cdb;
21626 	ucmd_buf.uscsi_cdblen	= (uchar_t)cdbsize;
21627 	ucmd_buf.uscsi_bufaddr	= (caddr_t)bufaddr;
21628 	ucmd_buf.uscsi_buflen	= buflen;
21629 	ucmd_buf.uscsi_rqbuf	= (caddr_t)&sense_buf;
21630 	ucmd_buf.uscsi_rqlen	= sizeof (struct scsi_extended_sense);
21631 	ucmd_buf.uscsi_flags	= USCSI_RQENABLE | USCSI_READ | USCSI_SILENT;
21632 	ucmd_buf.uscsi_timeout	= 60;
21633 
21634 	status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
21635 	    UIO_SYSSPACE, path_flag);
21636 
21637 	switch (status) {
21638 	case 0:
21639 		/*
21640 		 * sr_check_wp() uses 0x3f page code and check the header of
21641 		 * mode page to determine if target device is write-protected.
21642 		 * But some USB devices return 0 bytes for 0x3f page code. For
21643 		 * this case, make sure that mode page header is returned at
21644 		 * least.
21645 		 */
21646 		if (buflen - ucmd_buf.uscsi_resid <  headlen) {
21647 			status = EIO;
21648 			sd_ssc_set_info(ssc, SSC_FLAGS_INVALID_DATA, -1,
21649 			    "mode page header is not returned");
21650 		}
21651 		break;	/* Success! */
21652 	case EIO:
21653 		switch (ucmd_buf.uscsi_status) {
21654 		case STATUS_RESERVATION_CONFLICT:
21655 			status = EACCES;
21656 			break;
21657 		default:
21658 			break;
21659 		}
21660 		break;
21661 	default:
21662 		break;
21663 	}
21664 
21665 	if (status == 0) {
21666 		SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_MODE_SENSE: data",
21667 		    (uchar_t *)bufaddr, buflen, SD_LOG_HEX);
21668 	}
21669 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_MODE_SENSE: exit\n");
21670 
21671 	return (status);
21672 }
21673 
21674 
21675 /*
21676  *    Function: sd_send_scsi_MODE_SELECT
21677  *
21678  * Description: Utility function for issuing a scsi MODE SELECT command.
21679  *		Note: This routine uses a consistent implementation for Group0,
21680  *		Group1, and Group2 commands across all platforms. ATAPI devices
21681  *		use Group 1 Read/Write commands and Group 2 Mode Sense/Select
21682  *
21683  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
21684  *                      structure for this target.
21685  *		cdbsize - size CDB to be used (CDB_GROUP0 (6 byte), or
21686  *			  CDB_GROUP[1|2] (10 byte).
21687  *		bufaddr - buffer for page data retrieved from the target.
21688  *		buflen - size of page to be retrieved.
21689  *		save_page - boolean to determin if SP bit should be set.
21690  *		path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
21691  *			the normal command waitq, or SD_PATH_DIRECT_PRIORITY
21692  *			to use the USCSI "direct" chain and bypass the normal
21693  *			command waitq.
21694  *
21695  * Return Code: 0   - Success
21696  *		errno return code from sd_ssc_send()
21697  *
21698  *     Context: Can sleep. Does not return until command is completed.
21699  */
21700 
21701 static int
21702 sd_send_scsi_MODE_SELECT(sd_ssc_t *ssc, int cdbsize, uchar_t *bufaddr,
21703     size_t buflen,  uchar_t save_page, int path_flag)
21704 {
21705 	struct	scsi_extended_sense	sense_buf;
21706 	union scsi_cdb		cdb;
21707 	struct uscsi_cmd	ucmd_buf;
21708 	int			status;
21709 	struct sd_lun		*un;
21710 
21711 	ASSERT(ssc != NULL);
21712 	un = ssc->ssc_un;
21713 	ASSERT(un != NULL);
21714 	ASSERT(!mutex_owned(SD_MUTEX(un)));
21715 	ASSERT(bufaddr != NULL);
21716 	ASSERT((cdbsize == CDB_GROUP0) || (cdbsize == CDB_GROUP1) ||
21717 	    (cdbsize == CDB_GROUP2));
21718 
21719 	SD_TRACE(SD_LOG_IO, un,
21720 	    "sd_send_scsi_MODE_SELECT: entry: un:0x%p\n", un);
21721 
21722 	bzero(&cdb, sizeof (cdb));
21723 	bzero(&ucmd_buf, sizeof (ucmd_buf));
21724 	bzero(&sense_buf, sizeof (struct scsi_extended_sense));
21725 
21726 	/* Set the PF bit for many third party drives */
21727 	cdb.cdb_opaque[1] = 0x10;
21728 
21729 	/* Set the savepage(SP) bit if given */
21730 	if (save_page == SD_SAVE_PAGE) {
21731 		cdb.cdb_opaque[1] |= 0x01;
21732 	}
21733 
21734 	if (cdbsize == CDB_GROUP0) {
21735 		cdb.scc_cmd = SCMD_MODE_SELECT;
21736 		FORMG0COUNT(&cdb, buflen);
21737 	} else {
21738 		cdb.scc_cmd = SCMD_MODE_SELECT_G1;
21739 		FORMG1COUNT(&cdb, buflen);
21740 	}
21741 
21742 	SD_FILL_SCSI1_LUN_CDB(un, &cdb);
21743 
21744 	ucmd_buf.uscsi_cdb	= (char *)&cdb;
21745 	ucmd_buf.uscsi_cdblen	= (uchar_t)cdbsize;
21746 	ucmd_buf.uscsi_bufaddr	= (caddr_t)bufaddr;
21747 	ucmd_buf.uscsi_buflen	= buflen;
21748 	ucmd_buf.uscsi_rqbuf	= (caddr_t)&sense_buf;
21749 	ucmd_buf.uscsi_rqlen	= sizeof (struct scsi_extended_sense);
21750 	ucmd_buf.uscsi_flags	= USCSI_RQENABLE | USCSI_WRITE | USCSI_SILENT;
21751 	ucmd_buf.uscsi_timeout	= 60;
21752 
21753 	status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
21754 	    UIO_SYSSPACE, path_flag);
21755 
21756 	switch (status) {
21757 	case 0:
21758 		sd_ssc_assessment(ssc, SD_FMT_STANDARD);
21759 		break;	/* Success! */
21760 	case EIO:
21761 		switch (ucmd_buf.uscsi_status) {
21762 		case STATUS_RESERVATION_CONFLICT:
21763 			status = EACCES;
21764 			break;
21765 		default:
21766 			break;
21767 		}
21768 		break;
21769 	default:
21770 		break;
21771 	}
21772 
21773 	if (status == 0) {
21774 		SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_MODE_SELECT: data",
21775 		    (uchar_t *)bufaddr, buflen, SD_LOG_HEX);
21776 	}
21777 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_MODE_SELECT: exit\n");
21778 
21779 	return (status);
21780 }
21781 
21782 
21783 /*
21784  *    Function: sd_send_scsi_RDWR
21785  *
21786  * Description: Issue a scsi READ or WRITE command with the given parameters.
21787  *
21788  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
21789  *                      structure for this target.
21790  *		cmd:	 SCMD_READ or SCMD_WRITE
21791  *		bufaddr: Address of caller's buffer to receive the RDWR data
21792  *		buflen:  Length of caller's buffer receive the RDWR data.
21793  *		start_block: Block number for the start of the RDWR operation.
21794  *			 (Assumes target-native block size.)
21795  *		residp:  Pointer to variable to receive the redisual of the
21796  *			 RDWR operation (may be NULL of no residual requested).
21797  *		path_flag - SD_PATH_DIRECT to use the USCSI "direct" chain and
21798  *			the normal command waitq, or SD_PATH_DIRECT_PRIORITY
21799  *			to use the USCSI "direct" chain and bypass the normal
21800  *			command waitq.
21801  *
21802  * Return Code: 0   - Success
21803  *		errno return code from sd_ssc_send()
21804  *
21805  *     Context: Can sleep. Does not return until command is completed.
21806  */
21807 
21808 static int
21809 sd_send_scsi_RDWR(sd_ssc_t *ssc, uchar_t cmd, void *bufaddr,
21810     size_t buflen, daddr_t start_block, int path_flag)
21811 {
21812 	struct	scsi_extended_sense	sense_buf;
21813 	union scsi_cdb		cdb;
21814 	struct uscsi_cmd	ucmd_buf;
21815 	uint32_t		block_count;
21816 	int			status;
21817 	int			cdbsize;
21818 	uchar_t			flag;
21819 	struct sd_lun		*un;
21820 
21821 	ASSERT(ssc != NULL);
21822 	un = ssc->ssc_un;
21823 	ASSERT(un != NULL);
21824 	ASSERT(!mutex_owned(SD_MUTEX(un)));
21825 	ASSERT(bufaddr != NULL);
21826 	ASSERT((cmd == SCMD_READ) || (cmd == SCMD_WRITE));
21827 
21828 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_RDWR: entry: un:0x%p\n", un);
21829 
21830 	if (un->un_f_tgt_blocksize_is_valid != TRUE) {
21831 		return (EINVAL);
21832 	}
21833 
21834 	mutex_enter(SD_MUTEX(un));
21835 	block_count = SD_BYTES2TGTBLOCKS(un, buflen);
21836 	mutex_exit(SD_MUTEX(un));
21837 
21838 	flag = (cmd == SCMD_READ) ? USCSI_READ : USCSI_WRITE;
21839 
21840 	SD_INFO(SD_LOG_IO, un, "sd_send_scsi_RDWR: "
21841 	    "bufaddr:0x%p buflen:0x%x start_block:0x%p block_count:0x%x\n",
21842 	    bufaddr, buflen, start_block, block_count);
21843 
21844 	bzero(&cdb, sizeof (cdb));
21845 	bzero(&ucmd_buf, sizeof (ucmd_buf));
21846 	bzero(&sense_buf, sizeof (struct scsi_extended_sense));
21847 
21848 	/* Compute CDB size to use */
21849 	if (start_block > 0xffffffff)
21850 		cdbsize = CDB_GROUP4;
21851 	else if ((start_block & 0xFFE00000) ||
21852 	    (un->un_f_cfg_is_atapi == TRUE))
21853 		cdbsize = CDB_GROUP1;
21854 	else
21855 		cdbsize = CDB_GROUP0;
21856 
21857 	switch (cdbsize) {
21858 	case CDB_GROUP0:	/* 6-byte CDBs */
21859 		cdb.scc_cmd = cmd;
21860 		FORMG0ADDR(&cdb, start_block);
21861 		FORMG0COUNT(&cdb, block_count);
21862 		break;
21863 	case CDB_GROUP1:	/* 10-byte CDBs */
21864 		cdb.scc_cmd = cmd | SCMD_GROUP1;
21865 		FORMG1ADDR(&cdb, start_block);
21866 		FORMG1COUNT(&cdb, block_count);
21867 		break;
21868 	case CDB_GROUP4:	/* 16-byte CDBs */
21869 		cdb.scc_cmd = cmd | SCMD_GROUP4;
21870 		FORMG4LONGADDR(&cdb, (uint64_t)start_block);
21871 		FORMG4COUNT(&cdb, block_count);
21872 		break;
21873 	case CDB_GROUP5:	/* 12-byte CDBs (currently unsupported) */
21874 	default:
21875 		/* All others reserved */
21876 		return (EINVAL);
21877 	}
21878 
21879 	/* Set LUN bit(s) in CDB if this is a SCSI-1 device */
21880 	SD_FILL_SCSI1_LUN_CDB(un, &cdb);
21881 
21882 	ucmd_buf.uscsi_cdb	= (char *)&cdb;
21883 	ucmd_buf.uscsi_cdblen	= (uchar_t)cdbsize;
21884 	ucmd_buf.uscsi_bufaddr	= bufaddr;
21885 	ucmd_buf.uscsi_buflen	= buflen;
21886 	ucmd_buf.uscsi_rqbuf	= (caddr_t)&sense_buf;
21887 	ucmd_buf.uscsi_rqlen	= sizeof (struct scsi_extended_sense);
21888 	ucmd_buf.uscsi_flags	= flag | USCSI_RQENABLE | USCSI_SILENT;
21889 	ucmd_buf.uscsi_timeout	= 60;
21890 	status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
21891 	    UIO_SYSSPACE, path_flag);
21892 
21893 	switch (status) {
21894 	case 0:
21895 		sd_ssc_assessment(ssc, SD_FMT_STANDARD);
21896 		break;	/* Success! */
21897 	case EIO:
21898 		switch (ucmd_buf.uscsi_status) {
21899 		case STATUS_RESERVATION_CONFLICT:
21900 			status = EACCES;
21901 			break;
21902 		default:
21903 			break;
21904 		}
21905 		break;
21906 	default:
21907 		break;
21908 	}
21909 
21910 	if (status == 0) {
21911 		SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_RDWR: data",
21912 		    (uchar_t *)bufaddr, buflen, SD_LOG_HEX);
21913 	}
21914 
21915 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_RDWR: exit\n");
21916 
21917 	return (status);
21918 }
21919 
21920 
21921 /*
21922  *    Function: sd_send_scsi_LOG_SENSE
21923  *
21924  * Description: Issue a scsi LOG_SENSE command with the given parameters.
21925  *
21926  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
21927  *                      structure for this target.
21928  *
21929  * Return Code: 0   - Success
21930  *		errno return code from sd_ssc_send()
21931  *
21932  *     Context: Can sleep. Does not return until command is completed.
21933  */
21934 
21935 static int
21936 sd_send_scsi_LOG_SENSE(sd_ssc_t *ssc, uchar_t *bufaddr, uint16_t buflen,
21937     uchar_t page_code, uchar_t page_control, uint16_t param_ptr, int path_flag)
21938 {
21939 	struct scsi_extended_sense	sense_buf;
21940 	union scsi_cdb		cdb;
21941 	struct uscsi_cmd	ucmd_buf;
21942 	int			status;
21943 	struct sd_lun		*un;
21944 
21945 	ASSERT(ssc != NULL);
21946 	un = ssc->ssc_un;
21947 	ASSERT(un != NULL);
21948 	ASSERT(!mutex_owned(SD_MUTEX(un)));
21949 
21950 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_LOG_SENSE: entry: un:0x%p\n", un);
21951 
21952 	bzero(&cdb, sizeof (cdb));
21953 	bzero(&ucmd_buf, sizeof (ucmd_buf));
21954 	bzero(&sense_buf, sizeof (struct scsi_extended_sense));
21955 
21956 	cdb.scc_cmd = SCMD_LOG_SENSE_G1;
21957 	cdb.cdb_opaque[2] = (page_control << 6) | page_code;
21958 	cdb.cdb_opaque[5] = (uchar_t)((param_ptr & 0xFF00) >> 8);
21959 	cdb.cdb_opaque[6] = (uchar_t)(param_ptr  & 0x00FF);
21960 	FORMG1COUNT(&cdb, buflen);
21961 
21962 	ucmd_buf.uscsi_cdb	= (char *)&cdb;
21963 	ucmd_buf.uscsi_cdblen	= CDB_GROUP1;
21964 	ucmd_buf.uscsi_bufaddr	= (caddr_t)bufaddr;
21965 	ucmd_buf.uscsi_buflen	= buflen;
21966 	ucmd_buf.uscsi_rqbuf	= (caddr_t)&sense_buf;
21967 	ucmd_buf.uscsi_rqlen	= sizeof (struct scsi_extended_sense);
21968 	ucmd_buf.uscsi_flags	= USCSI_RQENABLE | USCSI_READ | USCSI_SILENT;
21969 	ucmd_buf.uscsi_timeout	= 60;
21970 
21971 	status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
21972 	    UIO_SYSSPACE, path_flag);
21973 
21974 	switch (status) {
21975 	case 0:
21976 		break;
21977 	case EIO:
21978 		switch (ucmd_buf.uscsi_status) {
21979 		case STATUS_RESERVATION_CONFLICT:
21980 			status = EACCES;
21981 			break;
21982 		case STATUS_CHECK:
21983 			if ((ucmd_buf.uscsi_rqstatus == STATUS_GOOD) &&
21984 			    (scsi_sense_key((uint8_t *)&sense_buf) ==
21985 			    KEY_ILLEGAL_REQUEST) &&
21986 			    (scsi_sense_asc((uint8_t *)&sense_buf) == 0x24)) {
21987 				/*
21988 				 * ASC 0x24: INVALID FIELD IN CDB
21989 				 */
21990 				switch (page_code) {
21991 				case START_STOP_CYCLE_PAGE:
21992 					/*
21993 					 * The start stop cycle counter is
21994 					 * implemented as page 0x31 in earlier
21995 					 * generation disks. In new generation
21996 					 * disks the start stop cycle counter is
21997 					 * implemented as page 0xE. To properly
21998 					 * handle this case if an attempt for
21999 					 * log page 0xE is made and fails we
22000 					 * will try again using page 0x31.
22001 					 *
22002 					 * Network storage BU committed to
22003 					 * maintain the page 0x31 for this
22004 					 * purpose and will not have any other
22005 					 * page implemented with page code 0x31
22006 					 * until all disks transition to the
22007 					 * standard page.
22008 					 */
22009 					mutex_enter(SD_MUTEX(un));
22010 					un->un_start_stop_cycle_page =
22011 					    START_STOP_CYCLE_VU_PAGE;
22012 					cdb.cdb_opaque[2] =
22013 					    (char)(page_control << 6) |
22014 					    un->un_start_stop_cycle_page;
22015 					mutex_exit(SD_MUTEX(un));
22016 					sd_ssc_assessment(ssc, SD_FMT_IGNORE);
22017 					status = sd_ssc_send(
22018 					    ssc, &ucmd_buf, FKIOCTL,
22019 					    UIO_SYSSPACE, path_flag);
22020 
22021 					break;
22022 				case TEMPERATURE_PAGE:
22023 					status = ENOTTY;
22024 					break;
22025 				default:
22026 					break;
22027 				}
22028 			}
22029 			break;
22030 		default:
22031 			break;
22032 		}
22033 		break;
22034 	default:
22035 		break;
22036 	}
22037 
22038 	if (status == 0) {
22039 		sd_ssc_assessment(ssc, SD_FMT_STANDARD);
22040 		SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_LOG_SENSE: data",
22041 		    (uchar_t *)bufaddr, buflen, SD_LOG_HEX);
22042 	}
22043 
22044 	SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_LOG_SENSE: exit\n");
22045 
22046 	return (status);
22047 }
22048 
22049 
22050 /*
22051  *    Function: sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION
22052  *
22053  * Description: Issue the scsi GET EVENT STATUS NOTIFICATION command.
22054  *
22055  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
22056  *                      structure for this target.
22057  *		bufaddr
22058  *		buflen
22059  *		class_req
22060  *
22061  * Return Code: 0   - Success
22062  *		errno return code from sd_ssc_send()
22063  *
22064  *     Context: Can sleep. Does not return until command is completed.
22065  */
22066 
22067 static int
22068 sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION(sd_ssc_t *ssc, uchar_t *bufaddr,
22069     size_t buflen, uchar_t class_req)
22070 {
22071 	union scsi_cdb		cdb;
22072 	struct uscsi_cmd	ucmd_buf;
22073 	int			status;
22074 	struct sd_lun		*un;
22075 
22076 	ASSERT(ssc != NULL);
22077 	un = ssc->ssc_un;
22078 	ASSERT(un != NULL);
22079 	ASSERT(!mutex_owned(SD_MUTEX(un)));
22080 	ASSERT(bufaddr != NULL);
22081 
22082 	SD_TRACE(SD_LOG_IO, un,
22083 	    "sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION: entry: un:0x%p\n", un);
22084 
22085 	bzero(&cdb, sizeof (cdb));
22086 	bzero(&ucmd_buf, sizeof (ucmd_buf));
22087 	bzero(bufaddr, buflen);
22088 
22089 	cdb.scc_cmd = SCMD_GET_EVENT_STATUS_NOTIFICATION;
22090 	cdb.cdb_opaque[1] = 1; /* polled */
22091 	cdb.cdb_opaque[4] = class_req;
22092 	FORMG1COUNT(&cdb, buflen);
22093 
22094 	ucmd_buf.uscsi_cdb	= (char *)&cdb;
22095 	ucmd_buf.uscsi_cdblen	= CDB_GROUP1;
22096 	ucmd_buf.uscsi_bufaddr	= (caddr_t)bufaddr;
22097 	ucmd_buf.uscsi_buflen	= buflen;
22098 	ucmd_buf.uscsi_rqbuf	= NULL;
22099 	ucmd_buf.uscsi_rqlen	= 0;
22100 	ucmd_buf.uscsi_flags	= USCSI_READ | USCSI_SILENT;
22101 	ucmd_buf.uscsi_timeout	= 60;
22102 
22103 	status = sd_ssc_send(ssc, &ucmd_buf, FKIOCTL,
22104 	    UIO_SYSSPACE, SD_PATH_DIRECT);
22105 
22106 	/*
22107 	 * Only handle status == 0, the upper-level caller
22108 	 * will put different assessment based on the context.
22109 	 */
22110 	if (status == 0) {
22111 		sd_ssc_assessment(ssc, SD_FMT_STANDARD);
22112 
22113 		if (ucmd_buf.uscsi_resid != 0) {
22114 			status = EIO;
22115 		}
22116 	}
22117 
22118 	SD_TRACE(SD_LOG_IO, un,
22119 	    "sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION: exit\n");
22120 
22121 	return (status);
22122 }
22123 
22124 
22125 static boolean_t
22126 sd_gesn_media_data_valid(uchar_t *data)
22127 {
22128 	uint16_t			len;
22129 
22130 	len = (data[1] << 8) | data[0];
22131 	return ((len >= 6) &&
22132 	    ((data[2] & SD_GESN_HEADER_NEA) == 0) &&
22133 	    ((data[2] & SD_GESN_HEADER_CLASS) == SD_GESN_MEDIA_CLASS) &&
22134 	    ((data[3] & (1 << SD_GESN_MEDIA_CLASS)) != 0));
22135 }
22136 
22137 
22138 /*
22139  *    Function: sdioctl
22140  *
22141  * Description: Driver's ioctl(9e) entry point function.
22142  *
22143  *   Arguments: dev     - device number
22144  *		cmd     - ioctl operation to be performed
22145  *		arg     - user argument, contains data to be set or reference
22146  *			  parameter for get
22147  *		flag    - bit flag, indicating open settings, 32/64 bit type
22148  *		cred_p  - user credential pointer
22149  *		rval_p  - calling process return value (OPT)
22150  *
22151  * Return Code: EINVAL
22152  *		ENOTTY
22153  *		ENXIO
22154  *		EIO
22155  *		EFAULT
22156  *		ENOTSUP
22157  *		EPERM
22158  *
22159  *     Context: Called from the device switch at normal priority.
22160  */
22161 
22162 static int
22163 sdioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cred_p, int *rval_p)
22164 {
22165 	struct sd_lun	*un = NULL;
22166 	int		err = 0;
22167 	int		i = 0;
22168 	cred_t		*cr;
22169 	int		tmprval = EINVAL;
22170 	boolean_t	is_valid;
22171 	sd_ssc_t	*ssc;
22172 
22173 	/*
22174 	 * All device accesses go thru sdstrategy where we check on suspend
22175 	 * status
22176 	 */
22177 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
22178 		return (ENXIO);
22179 	}
22180 
22181 	ASSERT(!mutex_owned(SD_MUTEX(un)));
22182 
22183 	/* Initialize sd_ssc_t for internal uscsi commands */
22184 	ssc = sd_ssc_init(un);
22185 
22186 	is_valid = SD_IS_VALID_LABEL(un);
22187 
22188 	/*
22189 	 * Moved this wait from sd_uscsi_strategy to here for
22190 	 * reasons of deadlock prevention. Internal driver commands,
22191 	 * specifically those to change a devices power level, result
22192 	 * in a call to sd_uscsi_strategy.
22193 	 */
22194 	mutex_enter(SD_MUTEX(un));
22195 	while ((un->un_state == SD_STATE_SUSPENDED) ||
22196 	    (un->un_state == SD_STATE_PM_CHANGING)) {
22197 		cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
22198 	}
22199 	/*
22200 	 * Twiddling the counter here protects commands from now
22201 	 * through to the top of sd_uscsi_strategy. Without the
22202 	 * counter inc. a power down, for example, could get in
22203 	 * after the above check for state is made and before
22204 	 * execution gets to the top of sd_uscsi_strategy.
22205 	 * That would cause problems.
22206 	 */
22207 	un->un_ncmds_in_driver++;
22208 
22209 	if (!is_valid &&
22210 	    (flag & (FNDELAY | FNONBLOCK))) {
22211 		switch (cmd) {
22212 		case DKIOCGGEOM:	/* SD_PATH_DIRECT */
22213 		case DKIOCGVTOC:
22214 		case DKIOCGEXTVTOC:
22215 		case DKIOCGAPART:
22216 		case DKIOCPARTINFO:
22217 		case DKIOCEXTPARTINFO:
22218 		case DKIOCSGEOM:
22219 		case DKIOCSAPART:
22220 		case DKIOCGETEFI:
22221 		case DKIOCPARTITION:
22222 		case DKIOCSVTOC:
22223 		case DKIOCSEXTVTOC:
22224 		case DKIOCSETEFI:
22225 		case DKIOCGMBOOT:
22226 		case DKIOCSMBOOT:
22227 		case DKIOCG_PHYGEOM:
22228 		case DKIOCG_VIRTGEOM:
22229 #if defined(__i386) || defined(__amd64)
22230 		case DKIOCSETEXTPART:
22231 #endif
22232 			/* let cmlb handle it */
22233 			goto skip_ready_valid;
22234 
22235 		case CDROMPAUSE:
22236 		case CDROMRESUME:
22237 		case CDROMPLAYMSF:
22238 		case CDROMPLAYTRKIND:
22239 		case CDROMREADTOCHDR:
22240 		case CDROMREADTOCENTRY:
22241 		case CDROMSTOP:
22242 		case CDROMSTART:
22243 		case CDROMVOLCTRL:
22244 		case CDROMSUBCHNL:
22245 		case CDROMREADMODE2:
22246 		case CDROMREADMODE1:
22247 		case CDROMREADOFFSET:
22248 		case CDROMSBLKMODE:
22249 		case CDROMGBLKMODE:
22250 		case CDROMGDRVSPEED:
22251 		case CDROMSDRVSPEED:
22252 		case CDROMCDDA:
22253 		case CDROMCDXA:
22254 		case CDROMSUBCODE:
22255 			if (!ISCD(un)) {
22256 				un->un_ncmds_in_driver--;
22257 				ASSERT(un->un_ncmds_in_driver >= 0);
22258 				mutex_exit(SD_MUTEX(un));
22259 				err = ENOTTY;
22260 				goto done_without_assess;
22261 			}
22262 			break;
22263 		case FDEJECT:
22264 		case DKIOCEJECT:
22265 		case CDROMEJECT:
22266 			if (!un->un_f_eject_media_supported) {
22267 				un->un_ncmds_in_driver--;
22268 				ASSERT(un->un_ncmds_in_driver >= 0);
22269 				mutex_exit(SD_MUTEX(un));
22270 				err = ENOTTY;
22271 				goto done_without_assess;
22272 			}
22273 			break;
22274 		case DKIOCFLUSHWRITECACHE:
22275 			mutex_exit(SD_MUTEX(un));
22276 			err = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
22277 			if (err != 0) {
22278 				mutex_enter(SD_MUTEX(un));
22279 				un->un_ncmds_in_driver--;
22280 				ASSERT(un->un_ncmds_in_driver >= 0);
22281 				mutex_exit(SD_MUTEX(un));
22282 				err = EIO;
22283 				goto done_quick_assess;
22284 			}
22285 			mutex_enter(SD_MUTEX(un));
22286 			/* FALLTHROUGH */
22287 		case DKIOCREMOVABLE:
22288 		case DKIOCHOTPLUGGABLE:
22289 		case DKIOCINFO:
22290 		case DKIOCGMEDIAINFO:
22291 		case DKIOCGMEDIAINFOEXT:
22292 		case DKIOCSOLIDSTATE:
22293 		case MHIOCENFAILFAST:
22294 		case MHIOCSTATUS:
22295 		case MHIOCTKOWN:
22296 		case MHIOCRELEASE:
22297 		case MHIOCGRP_INKEYS:
22298 		case MHIOCGRP_INRESV:
22299 		case MHIOCGRP_REGISTER:
22300 		case MHIOCGRP_CLEAR:
22301 		case MHIOCGRP_RESERVE:
22302 		case MHIOCGRP_PREEMPTANDABORT:
22303 		case MHIOCGRP_REGISTERANDIGNOREKEY:
22304 		case CDROMCLOSETRAY:
22305 		case USCSICMD:
22306 			goto skip_ready_valid;
22307 		default:
22308 			break;
22309 		}
22310 
22311 		mutex_exit(SD_MUTEX(un));
22312 		err = sd_ready_and_valid(ssc, SDPART(dev));
22313 		mutex_enter(SD_MUTEX(un));
22314 
22315 		if (err != SD_READY_VALID) {
22316 			switch (cmd) {
22317 			case DKIOCSTATE:
22318 			case CDROMGDRVSPEED:
22319 			case CDROMSDRVSPEED:
22320 			case FDEJECT:	/* for eject command */
22321 			case DKIOCEJECT:
22322 			case CDROMEJECT:
22323 			case DKIOCREMOVABLE:
22324 			case DKIOCHOTPLUGGABLE:
22325 				break;
22326 			default:
22327 				if (un->un_f_has_removable_media) {
22328 					err = ENXIO;
22329 				} else {
22330 				/* Do not map SD_RESERVED_BY_OTHERS to EIO */
22331 					if (err == SD_RESERVED_BY_OTHERS) {
22332 						err = EACCES;
22333 					} else {
22334 						err = EIO;
22335 					}
22336 				}
22337 				un->un_ncmds_in_driver--;
22338 				ASSERT(un->un_ncmds_in_driver >= 0);
22339 				mutex_exit(SD_MUTEX(un));
22340 
22341 				goto done_without_assess;
22342 			}
22343 		}
22344 	}
22345 
22346 skip_ready_valid:
22347 	mutex_exit(SD_MUTEX(un));
22348 
22349 	switch (cmd) {
22350 	case DKIOCINFO:
22351 		SD_TRACE(SD_LOG_IOCTL, un, "DKIOCINFO\n");
22352 		err = sd_dkio_ctrl_info(dev, (caddr_t)arg, flag);
22353 		break;
22354 
22355 	case DKIOCGMEDIAINFO:
22356 		SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGMEDIAINFO\n");
22357 		err = sd_get_media_info(dev, (caddr_t)arg, flag);
22358 		break;
22359 
22360 	case DKIOCGMEDIAINFOEXT:
22361 		SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGMEDIAINFOEXT\n");
22362 		err = sd_get_media_info_ext(dev, (caddr_t)arg, flag);
22363 		break;
22364 
22365 	case DKIOCGGEOM:
22366 	case DKIOCGVTOC:
22367 	case DKIOCGEXTVTOC:
22368 	case DKIOCGAPART:
22369 	case DKIOCPARTINFO:
22370 	case DKIOCEXTPARTINFO:
22371 	case DKIOCSGEOM:
22372 	case DKIOCSAPART:
22373 	case DKIOCGETEFI:
22374 	case DKIOCPARTITION:
22375 	case DKIOCSVTOC:
22376 	case DKIOCSEXTVTOC:
22377 	case DKIOCSETEFI:
22378 	case DKIOCGMBOOT:
22379 	case DKIOCSMBOOT:
22380 	case DKIOCG_PHYGEOM:
22381 	case DKIOCG_VIRTGEOM:
22382 #if defined(__i386) || defined(__amd64)
22383 	case DKIOCSETEXTPART:
22384 #endif
22385 		SD_TRACE(SD_LOG_IOCTL, un, "DKIOC %d\n", cmd);
22386 
22387 		/* TUR should spin up */
22388 
22389 		if (un->un_f_has_removable_media)
22390 			err = sd_send_scsi_TEST_UNIT_READY(ssc,
22391 			    SD_CHECK_FOR_MEDIA);
22392 
22393 		else
22394 			err = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
22395 
22396 		if (err != 0)
22397 			goto done_with_assess;
22398 
22399 		err = cmlb_ioctl(un->un_cmlbhandle, dev,
22400 		    cmd, arg, flag, cred_p, rval_p, (void *)SD_PATH_DIRECT);
22401 
22402 		if ((err == 0) &&
22403 		    ((cmd == DKIOCSETEFI) ||
22404 		    ((un->un_f_pkstats_enabled) &&
22405 		    (cmd == DKIOCSAPART || cmd == DKIOCSVTOC ||
22406 		    cmd == DKIOCSEXTVTOC)))) {
22407 
22408 			tmprval = cmlb_validate(un->un_cmlbhandle, CMLB_SILENT,
22409 			    (void *)SD_PATH_DIRECT);
22410 			if ((tmprval == 0) && un->un_f_pkstats_enabled) {
22411 				sd_set_pstats(un);
22412 				SD_TRACE(SD_LOG_IO_PARTITION, un,
22413 				    "sd_ioctl: un:0x%p pstats created and "
22414 				    "set\n", un);
22415 			}
22416 		}
22417 
22418 		if ((cmd == DKIOCSVTOC || cmd == DKIOCSEXTVTOC) ||
22419 		    ((cmd == DKIOCSETEFI) && (tmprval == 0))) {
22420 
22421 			mutex_enter(SD_MUTEX(un));
22422 			if (un->un_f_devid_supported &&
22423 			    (un->un_f_opt_fab_devid == TRUE)) {
22424 				if (un->un_devid == NULL) {
22425 					sd_register_devid(ssc, SD_DEVINFO(un),
22426 					    SD_TARGET_IS_UNRESERVED);
22427 				} else {
22428 					/*
22429 					 * The device id for this disk
22430 					 * has been fabricated. The
22431 					 * device id must be preserved
22432 					 * by writing it back out to
22433 					 * disk.
22434 					 */
22435 					if (sd_write_deviceid(ssc) != 0) {
22436 						ddi_devid_free(un->un_devid);
22437 						un->un_devid = NULL;
22438 					}
22439 				}
22440 			}
22441 			mutex_exit(SD_MUTEX(un));
22442 		}
22443 
22444 		break;
22445 
22446 	case DKIOCLOCK:
22447 		SD_TRACE(SD_LOG_IOCTL, un, "DKIOCLOCK\n");
22448 		err = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT,
22449 		    SD_PATH_STANDARD);
22450 		goto done_with_assess;
22451 
22452 	case DKIOCUNLOCK:
22453 		SD_TRACE(SD_LOG_IOCTL, un, "DKIOCUNLOCK\n");
22454 		err = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_ALLOW,
22455 		    SD_PATH_STANDARD);
22456 		goto done_with_assess;
22457 
22458 	case DKIOCSTATE: {
22459 		enum dkio_state		state;
22460 		SD_TRACE(SD_LOG_IOCTL, un, "DKIOCSTATE\n");
22461 
22462 		if (ddi_copyin((void *)arg, &state, sizeof (int), flag) != 0) {
22463 			err = EFAULT;
22464 		} else {
22465 			err = sd_check_media(dev, state);
22466 			if (err == 0) {
22467 				if (ddi_copyout(&un->un_mediastate, (void *)arg,
22468 				    sizeof (int), flag) != 0)
22469 					err = EFAULT;
22470 			}
22471 		}
22472 		break;
22473 	}
22474 
22475 	case DKIOCREMOVABLE:
22476 		SD_TRACE(SD_LOG_IOCTL, un, "DKIOCREMOVABLE\n");
22477 		i = un->un_f_has_removable_media ? 1 : 0;
22478 		if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) {
22479 			err = EFAULT;
22480 		} else {
22481 			err = 0;
22482 		}
22483 		break;
22484 
22485 	case DKIOCSOLIDSTATE:
22486 		SD_TRACE(SD_LOG_IOCTL, un, "DKIOCSOLIDSTATE\n");
22487 		i = un->un_f_is_solid_state ? 1 : 0;
22488 		if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) {
22489 			err = EFAULT;
22490 		} else {
22491 			err = 0;
22492 		}
22493 		break;
22494 
22495 	case DKIOCHOTPLUGGABLE:
22496 		SD_TRACE(SD_LOG_IOCTL, un, "DKIOCHOTPLUGGABLE\n");
22497 		i = un->un_f_is_hotpluggable ? 1 : 0;
22498 		if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) {
22499 			err = EFAULT;
22500 		} else {
22501 			err = 0;
22502 		}
22503 		break;
22504 
22505 	case DKIOCREADONLY:
22506 		SD_TRACE(SD_LOG_IOCTL, un, "DKIOCREADONLY\n");
22507 		i = 0;
22508 		if ((ISCD(un) && !un->un_f_mmc_writable_media) ||
22509 		    (sr_check_wp(dev) != 0)) {
22510 			i = 1;
22511 		}
22512 		if (ddi_copyout(&i, (void *)arg, sizeof (int), flag) != 0) {
22513 			err = EFAULT;
22514 		} else {
22515 			err = 0;
22516 		}
22517 		break;
22518 
22519 	case DKIOCGTEMPERATURE:
22520 		SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGTEMPERATURE\n");
22521 		err = sd_dkio_get_temp(dev, (caddr_t)arg, flag);
22522 		break;
22523 
22524 	case MHIOCENFAILFAST:
22525 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCENFAILFAST\n");
22526 		if ((err = drv_priv(cred_p)) == 0) {
22527 			err = sd_mhdioc_failfast(dev, (caddr_t)arg, flag);
22528 		}
22529 		break;
22530 
22531 	case MHIOCTKOWN:
22532 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCTKOWN\n");
22533 		if ((err = drv_priv(cred_p)) == 0) {
22534 			err = sd_mhdioc_takeown(dev, (caddr_t)arg, flag);
22535 		}
22536 		break;
22537 
22538 	case MHIOCRELEASE:
22539 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCRELEASE\n");
22540 		if ((err = drv_priv(cred_p)) == 0) {
22541 			err = sd_mhdioc_release(dev);
22542 		}
22543 		break;
22544 
22545 	case MHIOCSTATUS:
22546 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCSTATUS\n");
22547 		if ((err = drv_priv(cred_p)) == 0) {
22548 			switch (sd_send_scsi_TEST_UNIT_READY(ssc, 0)) {
22549 			case 0:
22550 				err = 0;
22551 				break;
22552 			case EACCES:
22553 				*rval_p = 1;
22554 				err = 0;
22555 				sd_ssc_assessment(ssc, SD_FMT_IGNORE);
22556 				break;
22557 			default:
22558 				err = EIO;
22559 				goto done_with_assess;
22560 			}
22561 		}
22562 		break;
22563 
22564 	case MHIOCQRESERVE:
22565 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCQRESERVE\n");
22566 		if ((err = drv_priv(cred_p)) == 0) {
22567 			err = sd_reserve_release(dev, SD_RESERVE);
22568 		}
22569 		break;
22570 
22571 	case MHIOCREREGISTERDEVID:
22572 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCREREGISTERDEVID\n");
22573 		if (drv_priv(cred_p) == EPERM) {
22574 			err = EPERM;
22575 		} else if (!un->un_f_devid_supported) {
22576 			err = ENOTTY;
22577 		} else {
22578 			err = sd_mhdioc_register_devid(dev);
22579 		}
22580 		break;
22581 
22582 	case MHIOCGRP_INKEYS:
22583 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_INKEYS\n");
22584 		if (((err = drv_priv(cred_p)) != EPERM) && arg != NULL) {
22585 			if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22586 				err = ENOTSUP;
22587 			} else {
22588 				err = sd_mhdioc_inkeys(dev, (caddr_t)arg,
22589 				    flag);
22590 			}
22591 		}
22592 		break;
22593 
22594 	case MHIOCGRP_INRESV:
22595 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_INRESV\n");
22596 		if (((err = drv_priv(cred_p)) != EPERM) && arg != NULL) {
22597 			if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22598 				err = ENOTSUP;
22599 			} else {
22600 				err = sd_mhdioc_inresv(dev, (caddr_t)arg, flag);
22601 			}
22602 		}
22603 		break;
22604 
22605 	case MHIOCGRP_REGISTER:
22606 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_REGISTER\n");
22607 		if ((err = drv_priv(cred_p)) != EPERM) {
22608 			if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22609 				err = ENOTSUP;
22610 			} else if (arg != NULL) {
22611 				mhioc_register_t reg;
22612 				if (ddi_copyin((void *)arg, &reg,
22613 				    sizeof (mhioc_register_t), flag) != 0) {
22614 					err = EFAULT;
22615 				} else {
22616 					err =
22617 					    sd_send_scsi_PERSISTENT_RESERVE_OUT(
22618 					    ssc, SD_SCSI3_REGISTER,
22619 					    (uchar_t *)&reg);
22620 					if (err != 0)
22621 						goto done_with_assess;
22622 				}
22623 			}
22624 		}
22625 		break;
22626 
22627 	case MHIOCGRP_CLEAR:
22628 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_CLEAR\n");
22629 		if ((err = drv_priv(cred_p)) != EPERM) {
22630 			if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22631 				err = ENOTSUP;
22632 			} else if (arg != NULL) {
22633 				mhioc_register_t reg;
22634 				if (ddi_copyin((void *)arg, &reg,
22635 				    sizeof (mhioc_register_t), flag) != 0) {
22636 					err = EFAULT;
22637 				} else {
22638 					err =
22639 					    sd_send_scsi_PERSISTENT_RESERVE_OUT(
22640 					    ssc, SD_SCSI3_CLEAR,
22641 					    (uchar_t *)&reg);
22642 					if (err != 0)
22643 						goto done_with_assess;
22644 				}
22645 			}
22646 		}
22647 		break;
22648 
22649 	case MHIOCGRP_RESERVE:
22650 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_RESERVE\n");
22651 		if ((err = drv_priv(cred_p)) != EPERM) {
22652 			if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22653 				err = ENOTSUP;
22654 			} else if (arg != NULL) {
22655 				mhioc_resv_desc_t resv_desc;
22656 				if (ddi_copyin((void *)arg, &resv_desc,
22657 				    sizeof (mhioc_resv_desc_t), flag) != 0) {
22658 					err = EFAULT;
22659 				} else {
22660 					err =
22661 					    sd_send_scsi_PERSISTENT_RESERVE_OUT(
22662 					    ssc, SD_SCSI3_RESERVE,
22663 					    (uchar_t *)&resv_desc);
22664 					if (err != 0)
22665 						goto done_with_assess;
22666 				}
22667 			}
22668 		}
22669 		break;
22670 
22671 	case MHIOCGRP_PREEMPTANDABORT:
22672 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_PREEMPTANDABORT\n");
22673 		if ((err = drv_priv(cred_p)) != EPERM) {
22674 			if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22675 				err = ENOTSUP;
22676 			} else if (arg != NULL) {
22677 				mhioc_preemptandabort_t preempt_abort;
22678 				if (ddi_copyin((void *)arg, &preempt_abort,
22679 				    sizeof (mhioc_preemptandabort_t),
22680 				    flag) != 0) {
22681 					err = EFAULT;
22682 				} else {
22683 					err =
22684 					    sd_send_scsi_PERSISTENT_RESERVE_OUT(
22685 					    ssc, SD_SCSI3_PREEMPTANDABORT,
22686 					    (uchar_t *)&preempt_abort);
22687 					if (err != 0)
22688 						goto done_with_assess;
22689 				}
22690 			}
22691 		}
22692 		break;
22693 
22694 	case MHIOCGRP_REGISTERANDIGNOREKEY:
22695 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_REGISTERANDIGNOREKEY\n");
22696 		if ((err = drv_priv(cred_p)) != EPERM) {
22697 			if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22698 				err = ENOTSUP;
22699 			} else if (arg != NULL) {
22700 				mhioc_registerandignorekey_t r_and_i;
22701 				if (ddi_copyin((void *)arg, (void *)&r_and_i,
22702 				    sizeof (mhioc_registerandignorekey_t),
22703 				    flag) != 0) {
22704 					err = EFAULT;
22705 				} else {
22706 					err =
22707 					    sd_send_scsi_PERSISTENT_RESERVE_OUT(
22708 					    ssc, SD_SCSI3_REGISTERANDIGNOREKEY,
22709 					    (uchar_t *)&r_and_i);
22710 					if (err != 0)
22711 						goto done_with_assess;
22712 				}
22713 			}
22714 		}
22715 		break;
22716 
22717 	case USCSICMD:
22718 		SD_TRACE(SD_LOG_IOCTL, un, "USCSICMD\n");
22719 		cr = ddi_get_cred();
22720 		if ((drv_priv(cred_p) != 0) && (drv_priv(cr) != 0)) {
22721 			err = EPERM;
22722 		} else {
22723 			enum uio_seg	uioseg;
22724 
22725 			uioseg = (flag & FKIOCTL) ? UIO_SYSSPACE :
22726 			    UIO_USERSPACE;
22727 			if (un->un_f_format_in_progress == TRUE) {
22728 				err = EAGAIN;
22729 				break;
22730 			}
22731 
22732 			err = sd_ssc_send(ssc,
22733 			    (struct uscsi_cmd *)arg,
22734 			    flag, uioseg, SD_PATH_STANDARD);
22735 			if (err != 0)
22736 				goto done_with_assess;
22737 			else
22738 				sd_ssc_assessment(ssc, SD_FMT_STANDARD);
22739 		}
22740 		break;
22741 
22742 	case CDROMPAUSE:
22743 	case CDROMRESUME:
22744 		SD_TRACE(SD_LOG_IOCTL, un, "PAUSE-RESUME\n");
22745 		if (!ISCD(un)) {
22746 			err = ENOTTY;
22747 		} else {
22748 			err = sr_pause_resume(dev, cmd);
22749 		}
22750 		break;
22751 
22752 	case CDROMPLAYMSF:
22753 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMPLAYMSF\n");
22754 		if (!ISCD(un)) {
22755 			err = ENOTTY;
22756 		} else {
22757 			err = sr_play_msf(dev, (caddr_t)arg, flag);
22758 		}
22759 		break;
22760 
22761 	case CDROMPLAYTRKIND:
22762 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMPLAYTRKIND\n");
22763 #if defined(__i386) || defined(__amd64)
22764 		/*
22765 		 * not supported on ATAPI CD drives, use CDROMPLAYMSF instead
22766 		 */
22767 		if (!ISCD(un) || (un->un_f_cfg_is_atapi == TRUE)) {
22768 #else
22769 		if (!ISCD(un)) {
22770 #endif
22771 			err = ENOTTY;
22772 		} else {
22773 			err = sr_play_trkind(dev, (caddr_t)arg, flag);
22774 		}
22775 		break;
22776 
22777 	case CDROMREADTOCHDR:
22778 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADTOCHDR\n");
22779 		if (!ISCD(un)) {
22780 			err = ENOTTY;
22781 		} else {
22782 			err = sr_read_tochdr(dev, (caddr_t)arg, flag);
22783 		}
22784 		break;
22785 
22786 	case CDROMREADTOCENTRY:
22787 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADTOCENTRY\n");
22788 		if (!ISCD(un)) {
22789 			err = ENOTTY;
22790 		} else {
22791 			err = sr_read_tocentry(dev, (caddr_t)arg, flag);
22792 		}
22793 		break;
22794 
22795 	case CDROMSTOP:
22796 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMSTOP\n");
22797 		if (!ISCD(un)) {
22798 			err = ENOTTY;
22799 		} else {
22800 			err = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
22801 			    SD_TARGET_STOP, SD_PATH_STANDARD);
22802 			goto done_with_assess;
22803 		}
22804 		break;
22805 
22806 	case CDROMSTART:
22807 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMSTART\n");
22808 		if (!ISCD(un)) {
22809 			err = ENOTTY;
22810 		} else {
22811 			err = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
22812 			    SD_TARGET_START, SD_PATH_STANDARD);
22813 			goto done_with_assess;
22814 		}
22815 		break;
22816 
22817 	case CDROMCLOSETRAY:
22818 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMCLOSETRAY\n");
22819 		if (!ISCD(un)) {
22820 			err = ENOTTY;
22821 		} else {
22822 			err = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
22823 			    SD_TARGET_CLOSE, SD_PATH_STANDARD);
22824 			goto done_with_assess;
22825 		}
22826 		break;
22827 
22828 	case FDEJECT:	/* for eject command */
22829 	case DKIOCEJECT:
22830 	case CDROMEJECT:
22831 		SD_TRACE(SD_LOG_IOCTL, un, "EJECT\n");
22832 		if (!un->un_f_eject_media_supported) {
22833 			err = ENOTTY;
22834 		} else {
22835 			err = sr_eject(dev);
22836 		}
22837 		break;
22838 
22839 	case CDROMVOLCTRL:
22840 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMVOLCTRL\n");
22841 		if (!ISCD(un)) {
22842 			err = ENOTTY;
22843 		} else {
22844 			err = sr_volume_ctrl(dev, (caddr_t)arg, flag);
22845 		}
22846 		break;
22847 
22848 	case CDROMSUBCHNL:
22849 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMSUBCHNL\n");
22850 		if (!ISCD(un)) {
22851 			err = ENOTTY;
22852 		} else {
22853 			err = sr_read_subchannel(dev, (caddr_t)arg, flag);
22854 		}
22855 		break;
22856 
22857 	case CDROMREADMODE2:
22858 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADMODE2\n");
22859 		if (!ISCD(un)) {
22860 			err = ENOTTY;
22861 		} else if (un->un_f_cfg_is_atapi == TRUE) {
22862 			/*
22863 			 * If the drive supports READ CD, use that instead of
22864 			 * switching the LBA size via a MODE SELECT
22865 			 * Block Descriptor
22866 			 */
22867 			err = sr_read_cd_mode2(dev, (caddr_t)arg, flag);
22868 		} else {
22869 			err = sr_read_mode2(dev, (caddr_t)arg, flag);
22870 		}
22871 		break;
22872 
22873 	case CDROMREADMODE1:
22874 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADMODE1\n");
22875 		if (!ISCD(un)) {
22876 			err = ENOTTY;
22877 		} else {
22878 			err = sr_read_mode1(dev, (caddr_t)arg, flag);
22879 		}
22880 		break;
22881 
22882 	case CDROMREADOFFSET:
22883 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADOFFSET\n");
22884 		if (!ISCD(un)) {
22885 			err = ENOTTY;
22886 		} else {
22887 			err = sr_read_sony_session_offset(dev, (caddr_t)arg,
22888 			    flag);
22889 		}
22890 		break;
22891 
22892 	case CDROMSBLKMODE:
22893 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMSBLKMODE\n");
22894 		/*
22895 		 * There is no means of changing block size in case of atapi
22896 		 * drives, thus return ENOTTY if drive type is atapi
22897 		 */
22898 		if (!ISCD(un) || (un->un_f_cfg_is_atapi == TRUE)) {
22899 			err = ENOTTY;
22900 		} else if (un->un_f_mmc_cap == TRUE) {
22901 
22902 			/*
22903 			 * MMC Devices do not support changing the
22904 			 * logical block size
22905 			 *
22906 			 * Note: EINVAL is being returned instead of ENOTTY to
22907 			 * maintain consistancy with the original mmc
22908 			 * driver update.
22909 			 */
22910 			err = EINVAL;
22911 		} else {
22912 			mutex_enter(SD_MUTEX(un));
22913 			if ((!(un->un_exclopen & (1<<SDPART(dev)))) ||
22914 			    (un->un_ncmds_in_transport > 0)) {
22915 				mutex_exit(SD_MUTEX(un));
22916 				err = EINVAL;
22917 			} else {
22918 				mutex_exit(SD_MUTEX(un));
22919 				err = sr_change_blkmode(dev, cmd, arg, flag);
22920 			}
22921 		}
22922 		break;
22923 
22924 	case CDROMGBLKMODE:
22925 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMGBLKMODE\n");
22926 		if (!ISCD(un)) {
22927 			err = ENOTTY;
22928 		} else if ((un->un_f_cfg_is_atapi != FALSE) &&
22929 		    (un->un_f_blockcount_is_valid != FALSE)) {
22930 			/*
22931 			 * Drive is an ATAPI drive so return target block
22932 			 * size for ATAPI drives since we cannot change the
22933 			 * blocksize on ATAPI drives. Used primarily to detect
22934 			 * if an ATAPI cdrom is present.
22935 			 */
22936 			if (ddi_copyout(&un->un_tgt_blocksize, (void *)arg,
22937 			    sizeof (int), flag) != 0) {
22938 				err = EFAULT;
22939 			} else {
22940 				err = 0;
22941 			}
22942 
22943 		} else {
22944 			/*
22945 			 * Drive supports changing block sizes via a Mode
22946 			 * Select.
22947 			 */
22948 			err = sr_change_blkmode(dev, cmd, arg, flag);
22949 		}
22950 		break;
22951 
22952 	case CDROMGDRVSPEED:
22953 	case CDROMSDRVSPEED:
22954 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMXDRVSPEED\n");
22955 		if (!ISCD(un)) {
22956 			err = ENOTTY;
22957 		} else if (un->un_f_mmc_cap == TRUE) {
22958 			/*
22959 			 * Note: In the future the driver implementation
22960 			 * for getting and
22961 			 * setting cd speed should entail:
22962 			 * 1) If non-mmc try the Toshiba mode page
22963 			 *    (sr_change_speed)
22964 			 * 2) If mmc but no support for Real Time Streaming try
22965 			 *    the SET CD SPEED (0xBB) command
22966 			 *   (sr_atapi_change_speed)
22967 			 * 3) If mmc and support for Real Time Streaming
22968 			 *    try the GET PERFORMANCE and SET STREAMING
22969 			 *    commands (not yet implemented, 4380808)
22970 			 */
22971 			/*
22972 			 * As per recent MMC spec, CD-ROM speed is variable
22973 			 * and changes with LBA. Since there is no such
22974 			 * things as drive speed now, fail this ioctl.
22975 			 *
22976 			 * Note: EINVAL is returned for consistancy of original
22977 			 * implementation which included support for getting
22978 			 * the drive speed of mmc devices but not setting
22979 			 * the drive speed. Thus EINVAL would be returned
22980 			 * if a set request was made for an mmc device.
22981 			 * We no longer support get or set speed for
22982 			 * mmc but need to remain consistent with regard
22983 			 * to the error code returned.
22984 			 */
22985 			err = EINVAL;
22986 		} else if (un->un_f_cfg_is_atapi == TRUE) {
22987 			err = sr_atapi_change_speed(dev, cmd, arg, flag);
22988 		} else {
22989 			err = sr_change_speed(dev, cmd, arg, flag);
22990 		}
22991 		break;
22992 
22993 	case CDROMCDDA:
22994 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMCDDA\n");
22995 		if (!ISCD(un)) {
22996 			err = ENOTTY;
22997 		} else {
22998 			err = sr_read_cdda(dev, (void *)arg, flag);
22999 		}
23000 		break;
23001 
23002 	case CDROMCDXA:
23003 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMCDXA\n");
23004 		if (!ISCD(un)) {
23005 			err = ENOTTY;
23006 		} else {
23007 			err = sr_read_cdxa(dev, (caddr_t)arg, flag);
23008 		}
23009 		break;
23010 
23011 	case CDROMSUBCODE:
23012 		SD_TRACE(SD_LOG_IOCTL, un, "CDROMSUBCODE\n");
23013 		if (!ISCD(un)) {
23014 			err = ENOTTY;
23015 		} else {
23016 			err = sr_read_all_subcodes(dev, (caddr_t)arg, flag);
23017 		}
23018 		break;
23019 
23020 
23021 #ifdef SDDEBUG
23022 /* RESET/ABORTS testing ioctls */
23023 	case DKIOCRESET: {
23024 		int	reset_level;
23025 
23026 		if (ddi_copyin((void *)arg, &reset_level, sizeof (int), flag)) {
23027 			err = EFAULT;
23028 		} else {
23029 			SD_INFO(SD_LOG_IOCTL, un, "sdioctl: DKIOCRESET: "
23030 			    "reset_level = 0x%lx\n", reset_level);
23031 			if (scsi_reset(SD_ADDRESS(un), reset_level)) {
23032 				err = 0;
23033 			} else {
23034 				err = EIO;
23035 			}
23036 		}
23037 		break;
23038 	}
23039 
23040 	case DKIOCABORT:
23041 		SD_INFO(SD_LOG_IOCTL, un, "sdioctl: DKIOCABORT:\n");
23042 		if (scsi_abort(SD_ADDRESS(un), NULL)) {
23043 			err = 0;
23044 		} else {
23045 			err = EIO;
23046 		}
23047 		break;
23048 #endif
23049 
23050 #ifdef SD_FAULT_INJECTION
23051 /* SDIOC FaultInjection testing ioctls */
23052 	case SDIOCSTART:
23053 	case SDIOCSTOP:
23054 	case SDIOCINSERTPKT:
23055 	case SDIOCINSERTXB:
23056 	case SDIOCINSERTUN:
23057 	case SDIOCINSERTARQ:
23058 	case SDIOCPUSH:
23059 	case SDIOCRETRIEVE:
23060 	case SDIOCRUN:
23061 		SD_INFO(SD_LOG_SDTEST, un, "sdioctl:"
23062 		    "SDIOC detected cmd:0x%X:\n", cmd);
23063 		/* call error generator */
23064 		sd_faultinjection_ioctl(cmd, arg, un);
23065 		err = 0;
23066 		break;
23067 
23068 #endif /* SD_FAULT_INJECTION */
23069 
23070 	case DKIOCFLUSHWRITECACHE:
23071 		{
23072 			struct dk_callback *dkc = (struct dk_callback *)arg;
23073 
23074 			mutex_enter(SD_MUTEX(un));
23075 			if (!un->un_f_sync_cache_supported ||
23076 			    !un->un_f_write_cache_enabled) {
23077 				err = un->un_f_sync_cache_supported ?
23078 				    0 : ENOTSUP;
23079 				mutex_exit(SD_MUTEX(un));
23080 				if ((flag & FKIOCTL) && dkc != NULL &&
23081 				    dkc->dkc_callback != NULL) {
23082 					(*dkc->dkc_callback)(dkc->dkc_cookie,
23083 					    err);
23084 					/*
23085 					 * Did callback and reported error.
23086 					 * Since we did a callback, ioctl
23087 					 * should return 0.
23088 					 */
23089 					err = 0;
23090 				}
23091 				break;
23092 			}
23093 			mutex_exit(SD_MUTEX(un));
23094 
23095 			if ((flag & FKIOCTL) && dkc != NULL &&
23096 			    dkc->dkc_callback != NULL) {
23097 				/* async SYNC CACHE request */
23098 				err = sd_send_scsi_SYNCHRONIZE_CACHE(un, dkc);
23099 			} else {
23100 				/* synchronous SYNC CACHE request */
23101 				err = sd_send_scsi_SYNCHRONIZE_CACHE(un, NULL);
23102 			}
23103 		}
23104 		break;
23105 
23106 	case DKIOCGETWCE: {
23107 
23108 		int wce;
23109 
23110 		if ((err = sd_get_write_cache_enabled(ssc, &wce)) != 0) {
23111 			break;
23112 		}
23113 
23114 		if (ddi_copyout(&wce, (void *)arg, sizeof (wce), flag)) {
23115 			err = EFAULT;
23116 		}
23117 		break;
23118 	}
23119 
23120 	case DKIOCSETWCE: {
23121 
23122 		int wce, sync_supported;
23123 		int cur_wce = 0;
23124 
23125 		if (!un->un_f_cache_mode_changeable) {
23126 			err = EINVAL;
23127 			break;
23128 		}
23129 
23130 		if (ddi_copyin((void *)arg, &wce, sizeof (wce), flag)) {
23131 			err = EFAULT;
23132 			break;
23133 		}
23134 
23135 		/*
23136 		 * Synchronize multiple threads trying to enable
23137 		 * or disable the cache via the un_f_wcc_cv
23138 		 * condition variable.
23139 		 */
23140 		mutex_enter(SD_MUTEX(un));
23141 
23142 		/*
23143 		 * Don't allow the cache to be enabled if the
23144 		 * config file has it disabled.
23145 		 */
23146 		if (un->un_f_opt_disable_cache && wce) {
23147 			mutex_exit(SD_MUTEX(un));
23148 			err = EINVAL;
23149 			break;
23150 		}
23151 
23152 		/*
23153 		 * Wait for write cache change in progress
23154 		 * bit to be clear before proceeding.
23155 		 */
23156 		while (un->un_f_wcc_inprog)
23157 			cv_wait(&un->un_wcc_cv, SD_MUTEX(un));
23158 
23159 		un->un_f_wcc_inprog = 1;
23160 
23161 		mutex_exit(SD_MUTEX(un));
23162 
23163 		/*
23164 		 * Get the current write cache state
23165 		 */
23166 		if ((err = sd_get_write_cache_enabled(ssc, &cur_wce)) != 0) {
23167 			mutex_enter(SD_MUTEX(un));
23168 			un->un_f_wcc_inprog = 0;
23169 			cv_broadcast(&un->un_wcc_cv);
23170 			mutex_exit(SD_MUTEX(un));
23171 			break;
23172 		}
23173 
23174 		mutex_enter(SD_MUTEX(un));
23175 		un->un_f_write_cache_enabled = (cur_wce != 0);
23176 
23177 		if (un->un_f_write_cache_enabled && wce == 0) {
23178 			/*
23179 			 * Disable the write cache.  Don't clear
23180 			 * un_f_write_cache_enabled until after
23181 			 * the mode select and flush are complete.
23182 			 */
23183 			sync_supported = un->un_f_sync_cache_supported;
23184 
23185 			/*
23186 			 * If cache flush is suppressed, we assume that the
23187 			 * controller firmware will take care of managing the
23188 			 * write cache for us: no need to explicitly
23189 			 * disable it.
23190 			 */
23191 			if (!un->un_f_suppress_cache_flush) {
23192 				mutex_exit(SD_MUTEX(un));
23193 				if ((err = sd_cache_control(ssc,
23194 				    SD_CACHE_NOCHANGE,
23195 				    SD_CACHE_DISABLE)) == 0 &&
23196 				    sync_supported) {
23197 					err = sd_send_scsi_SYNCHRONIZE_CACHE(un,
23198 					    NULL);
23199 				}
23200 			} else {
23201 				mutex_exit(SD_MUTEX(un));
23202 			}
23203 
23204 			mutex_enter(SD_MUTEX(un));
23205 			if (err == 0) {
23206 				un->un_f_write_cache_enabled = 0;
23207 			}
23208 
23209 		} else if (!un->un_f_write_cache_enabled && wce != 0) {
23210 			/*
23211 			 * Set un_f_write_cache_enabled first, so there is
23212 			 * no window where the cache is enabled, but the
23213 			 * bit says it isn't.
23214 			 */
23215 			un->un_f_write_cache_enabled = 1;
23216 
23217 			/*
23218 			 * If cache flush is suppressed, we assume that the
23219 			 * controller firmware will take care of managing the
23220 			 * write cache for us: no need to explicitly
23221 			 * enable it.
23222 			 */
23223 			if (!un->un_f_suppress_cache_flush) {
23224 				mutex_exit(SD_MUTEX(un));
23225 				err = sd_cache_control(ssc, SD_CACHE_NOCHANGE,
23226 				    SD_CACHE_ENABLE);
23227 			} else {
23228 				mutex_exit(SD_MUTEX(un));
23229 			}
23230 
23231 			mutex_enter(SD_MUTEX(un));
23232 
23233 			if (err) {
23234 				un->un_f_write_cache_enabled = 0;
23235 			}
23236 		}
23237 
23238 		un->un_f_wcc_inprog = 0;
23239 		cv_broadcast(&un->un_wcc_cv);
23240 		mutex_exit(SD_MUTEX(un));
23241 		break;
23242 	}
23243 
23244 	default:
23245 		err = ENOTTY;
23246 		break;
23247 	}
23248 	mutex_enter(SD_MUTEX(un));
23249 	un->un_ncmds_in_driver--;
23250 	ASSERT(un->un_ncmds_in_driver >= 0);
23251 	mutex_exit(SD_MUTEX(un));
23252 
23253 
23254 done_without_assess:
23255 	sd_ssc_fini(ssc);
23256 
23257 	SD_TRACE(SD_LOG_IOCTL, un, "sdioctl: exit: %d\n", err);
23258 	return (err);
23259 
23260 done_with_assess:
23261 	mutex_enter(SD_MUTEX(un));
23262 	un->un_ncmds_in_driver--;
23263 	ASSERT(un->un_ncmds_in_driver >= 0);
23264 	mutex_exit(SD_MUTEX(un));
23265 
23266 done_quick_assess:
23267 	if (err != 0)
23268 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
23269 	/* Uninitialize sd_ssc_t pointer */
23270 	sd_ssc_fini(ssc);
23271 
23272 	SD_TRACE(SD_LOG_IOCTL, un, "sdioctl: exit: %d\n", err);
23273 	return (err);
23274 }
23275 
23276 
23277 /*
23278  *    Function: sd_dkio_ctrl_info
23279  *
23280  * Description: This routine is the driver entry point for handling controller
23281  *		information ioctl requests (DKIOCINFO).
23282  *
23283  *   Arguments: dev  - the device number
23284  *		arg  - pointer to user provided dk_cinfo structure
23285  *		       specifying the controller type and attributes.
23286  *		flag - this argument is a pass through to ddi_copyxxx()
23287  *		       directly from the mode argument of ioctl().
23288  *
23289  * Return Code: 0
23290  *		EFAULT
23291  *		ENXIO
23292  */
23293 
23294 static int
23295 sd_dkio_ctrl_info(dev_t dev, caddr_t arg, int flag)
23296 {
23297 	struct sd_lun	*un = NULL;
23298 	struct dk_cinfo	*info;
23299 	dev_info_t	*pdip;
23300 	int		lun, tgt;
23301 
23302 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23303 		return (ENXIO);
23304 	}
23305 
23306 	info = (struct dk_cinfo *)
23307 	    kmem_zalloc(sizeof (struct dk_cinfo), KM_SLEEP);
23308 
23309 	switch (un->un_ctype) {
23310 	case CTYPE_CDROM:
23311 		info->dki_ctype = DKC_CDROM;
23312 		break;
23313 	default:
23314 		info->dki_ctype = DKC_SCSI_CCS;
23315 		break;
23316 	}
23317 	pdip = ddi_get_parent(SD_DEVINFO(un));
23318 	info->dki_cnum = ddi_get_instance(pdip);
23319 	if (strlen(ddi_get_name(pdip)) < DK_DEVLEN) {
23320 		(void) strcpy(info->dki_cname, ddi_get_name(pdip));
23321 	} else {
23322 		(void) strncpy(info->dki_cname, ddi_node_name(pdip),
23323 		    DK_DEVLEN - 1);
23324 	}
23325 
23326 	lun = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
23327 	    DDI_PROP_DONTPASS, SCSI_ADDR_PROP_LUN, 0);
23328 	tgt = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
23329 	    DDI_PROP_DONTPASS, SCSI_ADDR_PROP_TARGET, 0);
23330 
23331 	/* Unit Information */
23332 	info->dki_unit = ddi_get_instance(SD_DEVINFO(un));
23333 	info->dki_slave = ((tgt << 3) | lun);
23334 	(void) strncpy(info->dki_dname, ddi_driver_name(SD_DEVINFO(un)),
23335 	    DK_DEVLEN - 1);
23336 	info->dki_flags = DKI_FMTVOL;
23337 	info->dki_partition = SDPART(dev);
23338 
23339 	/* Max Transfer size of this device in blocks */
23340 	info->dki_maxtransfer = un->un_max_xfer_size / un->un_sys_blocksize;
23341 	info->dki_addr = 0;
23342 	info->dki_space = 0;
23343 	info->dki_prio = 0;
23344 	info->dki_vec = 0;
23345 
23346 	if (ddi_copyout(info, arg, sizeof (struct dk_cinfo), flag) != 0) {
23347 		kmem_free(info, sizeof (struct dk_cinfo));
23348 		return (EFAULT);
23349 	} else {
23350 		kmem_free(info, sizeof (struct dk_cinfo));
23351 		return (0);
23352 	}
23353 }
23354 
23355 /*
23356  *    Function: sd_get_media_info_com
23357  *
23358  * Description: This routine returns the information required to populate
23359  *		the fields for the dk_minfo/dk_minfo_ext structures.
23360  *
23361  *   Arguments: dev		- the device number
23362  *		dki_media_type	- media_type
23363  *		dki_lbsize	- logical block size
23364  *		dki_capacity	- capacity in blocks
23365  *		dki_pbsize	- physical block size (if requested)
23366  *
23367  * Return Code: 0
23368  *		EACCESS
23369  *		EFAULT
23370  *		ENXIO
23371  *		EIO
23372  */
23373 static int
23374 sd_get_media_info_com(dev_t dev, uint_t *dki_media_type, uint_t *dki_lbsize,
23375     diskaddr_t *dki_capacity, uint_t *dki_pbsize)
23376 {
23377 	struct sd_lun		*un = NULL;
23378 	struct uscsi_cmd	com;
23379 	struct scsi_inquiry	*sinq;
23380 	u_longlong_t		media_capacity;
23381 	uint64_t		capacity;
23382 	uint_t			lbasize;
23383 	uint_t			pbsize;
23384 	uchar_t			*out_data;
23385 	uchar_t			*rqbuf;
23386 	int			rval = 0;
23387 	int			rtn;
23388 	sd_ssc_t		*ssc;
23389 
23390 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
23391 	    (un->un_state == SD_STATE_OFFLINE)) {
23392 		return (ENXIO);
23393 	}
23394 
23395 	SD_TRACE(SD_LOG_IOCTL_DKIO, un, "sd_get_media_info_com: entry\n");
23396 
23397 	out_data = kmem_zalloc(SD_PROFILE_HEADER_LEN, KM_SLEEP);
23398 	rqbuf = kmem_zalloc(SENSE_LENGTH, KM_SLEEP);
23399 	ssc = sd_ssc_init(un);
23400 
23401 	/* Issue a TUR to determine if the drive is ready with media present */
23402 	rval = sd_send_scsi_TEST_UNIT_READY(ssc, SD_CHECK_FOR_MEDIA);
23403 	if (rval == ENXIO) {
23404 		goto done;
23405 	} else if (rval != 0) {
23406 		sd_ssc_assessment(ssc, SD_FMT_IGNORE);
23407 	}
23408 
23409 	/* Now get configuration data */
23410 	if (ISCD(un)) {
23411 		*dki_media_type = DK_CDROM;
23412 
23413 		/* Allow SCMD_GET_CONFIGURATION to MMC devices only */
23414 		if (un->un_f_mmc_cap == TRUE) {
23415 			rtn = sd_send_scsi_GET_CONFIGURATION(ssc, &com, rqbuf,
23416 			    SENSE_LENGTH, out_data, SD_PROFILE_HEADER_LEN,
23417 			    SD_PATH_STANDARD);
23418 
23419 			if (rtn) {
23420 				/*
23421 				 * We ignore all failures for CD and need to
23422 				 * put the assessment before processing code
23423 				 * to avoid missing assessment for FMA.
23424 				 */
23425 				sd_ssc_assessment(ssc, SD_FMT_IGNORE);
23426 				/*
23427 				 * Failed for other than an illegal request
23428 				 * or command not supported
23429 				 */
23430 				if ((com.uscsi_status == STATUS_CHECK) &&
23431 				    (com.uscsi_rqstatus == STATUS_GOOD)) {
23432 					if ((rqbuf[2] != KEY_ILLEGAL_REQUEST) ||
23433 					    (rqbuf[12] != 0x20)) {
23434 						rval = EIO;
23435 						goto no_assessment;
23436 					}
23437 				}
23438 			} else {
23439 				/*
23440 				 * The GET CONFIGURATION command succeeded
23441 				 * so set the media type according to the
23442 				 * returned data
23443 				 */
23444 				*dki_media_type = out_data[6];
23445 				*dki_media_type <<= 8;
23446 				*dki_media_type |= out_data[7];
23447 			}
23448 		}
23449 	} else {
23450 		/*
23451 		 * The profile list is not available, so we attempt to identify
23452 		 * the media type based on the inquiry data
23453 		 */
23454 		sinq = un->un_sd->sd_inq;
23455 		if ((sinq->inq_dtype == DTYPE_DIRECT) ||
23456 		    (sinq->inq_dtype == DTYPE_OPTICAL)) {
23457 			/* This is a direct access device  or optical disk */
23458 			*dki_media_type = DK_FIXED_DISK;
23459 
23460 			if ((bcmp(sinq->inq_vid, "IOMEGA", 6) == 0) ||
23461 			    (bcmp(sinq->inq_vid, "iomega", 6) == 0)) {
23462 				if ((bcmp(sinq->inq_pid, "ZIP", 3) == 0)) {
23463 					*dki_media_type = DK_ZIP;
23464 				} else if (
23465 				    (bcmp(sinq->inq_pid, "jaz", 3) == 0)) {
23466 					*dki_media_type = DK_JAZ;
23467 				}
23468 			}
23469 		} else {
23470 			/*
23471 			 * Not a CD, direct access or optical disk so return
23472 			 * unknown media
23473 			 */
23474 			*dki_media_type = DK_UNKNOWN;
23475 		}
23476 	}
23477 
23478 	/*
23479 	 * Now read the capacity so we can provide the lbasize,
23480 	 * pbsize and capacity.
23481 	 */
23482 	if (dki_pbsize && un->un_f_descr_format_supported) {
23483 		rval = sd_send_scsi_READ_CAPACITY_16(ssc, &capacity, &lbasize,
23484 		    &pbsize, SD_PATH_DIRECT);
23485 
23486 		/*
23487 		 * Override the physical blocksize if the instance already
23488 		 * has a larger value.
23489 		 */
23490 		pbsize = MAX(pbsize, un->un_phy_blocksize);
23491 	}
23492 
23493 	if (dki_pbsize == NULL || rval != 0 ||
23494 	    !un->un_f_descr_format_supported) {
23495 		rval = sd_send_scsi_READ_CAPACITY(ssc, &capacity, &lbasize,
23496 		    SD_PATH_DIRECT);
23497 
23498 		switch (rval) {
23499 		case 0:
23500 			if (un->un_f_enable_rmw &&
23501 			    un->un_phy_blocksize != 0) {
23502 				pbsize = un->un_phy_blocksize;
23503 			} else {
23504 				pbsize = lbasize;
23505 			}
23506 			media_capacity = capacity;
23507 
23508 			/*
23509 			 * sd_send_scsi_READ_CAPACITY() reports capacity in
23510 			 * un->un_sys_blocksize chunks. So we need to convert
23511 			 * it into cap.lbsize chunks.
23512 			 */
23513 			if (un->un_f_has_removable_media) {
23514 				media_capacity *= un->un_sys_blocksize;
23515 				media_capacity /= lbasize;
23516 			}
23517 			break;
23518 		case EACCES:
23519 			rval = EACCES;
23520 			goto done;
23521 		default:
23522 			rval = EIO;
23523 			goto done;
23524 		}
23525 	} else {
23526 		if (un->un_f_enable_rmw &&
23527 		    !ISP2(pbsize % DEV_BSIZE)) {
23528 			pbsize = SSD_SECSIZE;
23529 		} else if (!ISP2(lbasize % DEV_BSIZE) ||
23530 		    !ISP2(pbsize % DEV_BSIZE)) {
23531 			pbsize = lbasize = DEV_BSIZE;
23532 		}
23533 		media_capacity = capacity;
23534 	}
23535 
23536 	/*
23537 	 * If lun is expanded dynamically, update the un structure.
23538 	 */
23539 	mutex_enter(SD_MUTEX(un));
23540 	if ((un->un_f_blockcount_is_valid == TRUE) &&
23541 	    (un->un_f_tgt_blocksize_is_valid == TRUE) &&
23542 	    (capacity > un->un_blockcount)) {
23543 		un->un_f_expnevent = B_FALSE;
23544 		sd_update_block_info(un, lbasize, capacity);
23545 	}
23546 	mutex_exit(SD_MUTEX(un));
23547 
23548 	*dki_lbsize = lbasize;
23549 	*dki_capacity = media_capacity;
23550 	if (dki_pbsize)
23551 		*dki_pbsize = pbsize;
23552 
23553 done:
23554 	if (rval != 0) {
23555 		if (rval == EIO)
23556 			sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
23557 		else
23558 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
23559 	}
23560 no_assessment:
23561 	sd_ssc_fini(ssc);
23562 	kmem_free(out_data, SD_PROFILE_HEADER_LEN);
23563 	kmem_free(rqbuf, SENSE_LENGTH);
23564 	return (rval);
23565 }
23566 
23567 /*
23568  *    Function: sd_get_media_info
23569  *
23570  * Description: This routine is the driver entry point for handling ioctl
23571  *		requests for the media type or command set profile used by the
23572  *		drive to operate on the media (DKIOCGMEDIAINFO).
23573  *
23574  *   Arguments: dev	- the device number
23575  *		arg	- pointer to user provided dk_minfo structure
23576  *			  specifying the media type, logical block size and
23577  *			  drive capacity.
23578  *		flag	- this argument is a pass through to ddi_copyxxx()
23579  *			  directly from the mode argument of ioctl().
23580  *
23581  * Return Code: returns the value from sd_get_media_info_com
23582  */
23583 static int
23584 sd_get_media_info(dev_t dev, caddr_t arg, int flag)
23585 {
23586 	struct dk_minfo		mi;
23587 	int			rval;
23588 
23589 	rval = sd_get_media_info_com(dev, &mi.dki_media_type,
23590 	    &mi.dki_lbsize, &mi.dki_capacity, NULL);
23591 
23592 	if (rval)
23593 		return (rval);
23594 	if (ddi_copyout(&mi, arg, sizeof (struct dk_minfo), flag))
23595 		rval = EFAULT;
23596 	return (rval);
23597 }
23598 
23599 /*
23600  *    Function: sd_get_media_info_ext
23601  *
23602  * Description: This routine is the driver entry point for handling ioctl
23603  *		requests for the media type or command set profile used by the
23604  *		drive to operate on the media (DKIOCGMEDIAINFOEXT). The
23605  *		difference this ioctl and DKIOCGMEDIAINFO is the return value
23606  *		of this ioctl contains both logical block size and physical
23607  *		block size.
23608  *
23609  *
23610  *   Arguments: dev	- the device number
23611  *		arg	- pointer to user provided dk_minfo_ext structure
23612  *			  specifying the media type, logical block size,
23613  *			  physical block size and disk capacity.
23614  *		flag	- this argument is a pass through to ddi_copyxxx()
23615  *			  directly from the mode argument of ioctl().
23616  *
23617  * Return Code: returns the value from sd_get_media_info_com
23618  */
23619 static int
23620 sd_get_media_info_ext(dev_t dev, caddr_t arg, int flag)
23621 {
23622 	struct dk_minfo_ext	mie;
23623 	int			rval = 0;
23624 
23625 	rval = sd_get_media_info_com(dev, &mie.dki_media_type,
23626 	    &mie.dki_lbsize, &mie.dki_capacity, &mie.dki_pbsize);
23627 
23628 	if (rval)
23629 		return (rval);
23630 	if (ddi_copyout(&mie, arg, sizeof (struct dk_minfo_ext), flag))
23631 		rval = EFAULT;
23632 	return (rval);
23633 
23634 }
23635 
23636 /*
23637  *    Function: sd_watch_request_submit
23638  *
23639  * Description: Call scsi_watch_request_submit or scsi_mmc_watch_request_submit
23640  *		depending on which is supported by device.
23641  */
23642 static opaque_t
23643 sd_watch_request_submit(struct sd_lun *un)
23644 {
23645 	dev_t			dev;
23646 
23647 	/* All submissions are unified to use same device number */
23648 	dev = sd_make_device(SD_DEVINFO(un));
23649 
23650 	if (un->un_f_mmc_cap && un->un_f_mmc_gesn_polling) {
23651 		return (scsi_mmc_watch_request_submit(SD_SCSI_DEVP(un),
23652 		    sd_check_media_time, SENSE_LENGTH, sd_media_watch_cb,
23653 		    (caddr_t)dev));
23654 	} else {
23655 		return (scsi_watch_request_submit(SD_SCSI_DEVP(un),
23656 		    sd_check_media_time, SENSE_LENGTH, sd_media_watch_cb,
23657 		    (caddr_t)dev));
23658 	}
23659 }
23660 
23661 
23662 /*
23663  *    Function: sd_check_media
23664  *
23665  * Description: This utility routine implements the functionality for the
23666  *		DKIOCSTATE ioctl. This ioctl blocks the user thread until the
23667  *		driver state changes from that specified by the user
23668  *		(inserted or ejected). For example, if the user specifies
23669  *		DKIO_EJECTED and the current media state is inserted this
23670  *		routine will immediately return DKIO_INSERTED. However, if the
23671  *		current media state is not inserted the user thread will be
23672  *		blocked until the drive state changes. If DKIO_NONE is specified
23673  *		the user thread will block until a drive state change occurs.
23674  *
23675  *   Arguments: dev  - the device number
23676  *		state  - user pointer to a dkio_state, updated with the current
23677  *			drive state at return.
23678  *
23679  * Return Code: ENXIO
23680  *		EIO
23681  *		EAGAIN
23682  *		EINTR
23683  */
23684 
23685 static int
23686 sd_check_media(dev_t dev, enum dkio_state state)
23687 {
23688 	struct sd_lun		*un = NULL;
23689 	enum dkio_state		prev_state;
23690 	opaque_t		token = NULL;
23691 	int			rval = 0;
23692 	sd_ssc_t		*ssc;
23693 
23694 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23695 		return (ENXIO);
23696 	}
23697 
23698 	SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: entry\n");
23699 
23700 	ssc = sd_ssc_init(un);
23701 
23702 	mutex_enter(SD_MUTEX(un));
23703 
23704 	SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: "
23705 	    "state=%x, mediastate=%x\n", state, un->un_mediastate);
23706 
23707 	prev_state = un->un_mediastate;
23708 
23709 	/* is there anything to do? */
23710 	if (state == un->un_mediastate || un->un_mediastate == DKIO_NONE) {
23711 		/*
23712 		 * submit the request to the scsi_watch service;
23713 		 * scsi_media_watch_cb() does the real work
23714 		 */
23715 		mutex_exit(SD_MUTEX(un));
23716 
23717 		/*
23718 		 * This change handles the case where a scsi watch request is
23719 		 * added to a device that is powered down. To accomplish this
23720 		 * we power up the device before adding the scsi watch request,
23721 		 * since the scsi watch sends a TUR directly to the device
23722 		 * which the device cannot handle if it is powered down.
23723 		 */
23724 		if (sd_pm_entry(un) != DDI_SUCCESS) {
23725 			mutex_enter(SD_MUTEX(un));
23726 			goto done;
23727 		}
23728 
23729 		token = sd_watch_request_submit(un);
23730 
23731 		sd_pm_exit(un);
23732 
23733 		mutex_enter(SD_MUTEX(un));
23734 		if (token == NULL) {
23735 			rval = EAGAIN;
23736 			goto done;
23737 		}
23738 
23739 		/*
23740 		 * This is a special case IOCTL that doesn't return
23741 		 * until the media state changes. Routine sdpower
23742 		 * knows about and handles this so don't count it
23743 		 * as an active cmd in the driver, which would
23744 		 * keep the device busy to the pm framework.
23745 		 * If the count isn't decremented the device can't
23746 		 * be powered down.
23747 		 */
23748 		un->un_ncmds_in_driver--;
23749 		ASSERT(un->un_ncmds_in_driver >= 0);
23750 
23751 		/*
23752 		 * if a prior request had been made, this will be the same
23753 		 * token, as scsi_watch was designed that way.
23754 		 */
23755 		un->un_swr_token = token;
23756 		un->un_specified_mediastate = state;
23757 
23758 		/*
23759 		 * now wait for media change
23760 		 * we will not be signalled unless mediastate == state but it is
23761 		 * still better to test for this condition, since there is a
23762 		 * 2 sec cv_broadcast delay when mediastate == DKIO_INSERTED
23763 		 */
23764 		SD_TRACE(SD_LOG_COMMON, un,
23765 		    "sd_check_media: waiting for media state change\n");
23766 		while (un->un_mediastate == state) {
23767 			if (cv_wait_sig(&un->un_state_cv, SD_MUTEX(un)) == 0) {
23768 				SD_TRACE(SD_LOG_COMMON, un,
23769 				    "sd_check_media: waiting for media state "
23770 				    "was interrupted\n");
23771 				un->un_ncmds_in_driver++;
23772 				rval = EINTR;
23773 				goto done;
23774 			}
23775 			SD_TRACE(SD_LOG_COMMON, un,
23776 			    "sd_check_media: received signal, state=%x\n",
23777 			    un->un_mediastate);
23778 		}
23779 		/*
23780 		 * Inc the counter to indicate the device once again
23781 		 * has an active outstanding cmd.
23782 		 */
23783 		un->un_ncmds_in_driver++;
23784 	}
23785 
23786 	/* invalidate geometry */
23787 	if (prev_state == DKIO_INSERTED && un->un_mediastate == DKIO_EJECTED) {
23788 		sr_ejected(un);
23789 	}
23790 
23791 	if (un->un_mediastate == DKIO_INSERTED && prev_state != DKIO_INSERTED) {
23792 		uint64_t	capacity;
23793 		uint_t		lbasize;
23794 
23795 		SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: media inserted\n");
23796 		mutex_exit(SD_MUTEX(un));
23797 		/*
23798 		 * Since the following routines use SD_PATH_DIRECT, we must
23799 		 * call PM directly before the upcoming disk accesses. This
23800 		 * may cause the disk to be power/spin up.
23801 		 */
23802 
23803 		if (sd_pm_entry(un) == DDI_SUCCESS) {
23804 			rval = sd_send_scsi_READ_CAPACITY(ssc,
23805 			    &capacity, &lbasize, SD_PATH_DIRECT);
23806 			if (rval != 0) {
23807 				sd_pm_exit(un);
23808 				if (rval == EIO)
23809 					sd_ssc_assessment(ssc,
23810 					    SD_FMT_STATUS_CHECK);
23811 				else
23812 					sd_ssc_assessment(ssc, SD_FMT_IGNORE);
23813 				mutex_enter(SD_MUTEX(un));
23814 				goto done;
23815 			}
23816 		} else {
23817 			rval = EIO;
23818 			mutex_enter(SD_MUTEX(un));
23819 			goto done;
23820 		}
23821 		mutex_enter(SD_MUTEX(un));
23822 
23823 		sd_update_block_info(un, lbasize, capacity);
23824 
23825 		/*
23826 		 *  Check if the media in the device is writable or not
23827 		 */
23828 		if (ISCD(un)) {
23829 			sd_check_for_writable_cd(ssc, SD_PATH_DIRECT);
23830 		}
23831 
23832 		mutex_exit(SD_MUTEX(un));
23833 		cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT);
23834 		if ((cmlb_validate(un->un_cmlbhandle, 0,
23835 		    (void *)SD_PATH_DIRECT) == 0) && un->un_f_pkstats_enabled) {
23836 			sd_set_pstats(un);
23837 			SD_TRACE(SD_LOG_IO_PARTITION, un,
23838 			    "sd_check_media: un:0x%p pstats created and "
23839 			    "set\n", un);
23840 		}
23841 
23842 		rval = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_PREVENT,
23843 		    SD_PATH_DIRECT);
23844 
23845 		sd_pm_exit(un);
23846 
23847 		if (rval != 0) {
23848 			if (rval == EIO)
23849 				sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
23850 			else
23851 				sd_ssc_assessment(ssc, SD_FMT_IGNORE);
23852 		}
23853 
23854 		mutex_enter(SD_MUTEX(un));
23855 	}
23856 done:
23857 	sd_ssc_fini(ssc);
23858 	un->un_f_watcht_stopped = FALSE;
23859 	if (token != NULL && un->un_swr_token != NULL) {
23860 		/*
23861 		 * Use of this local token and the mutex ensures that we avoid
23862 		 * some race conditions associated with terminating the
23863 		 * scsi watch.
23864 		 */
23865 		token = un->un_swr_token;
23866 		mutex_exit(SD_MUTEX(un));
23867 		(void) scsi_watch_request_terminate(token,
23868 		    SCSI_WATCH_TERMINATE_WAIT);
23869 		if (scsi_watch_get_ref_count(token) == 0) {
23870 			mutex_enter(SD_MUTEX(un));
23871 			un->un_swr_token = (opaque_t)NULL;
23872 		} else {
23873 			mutex_enter(SD_MUTEX(un));
23874 		}
23875 	}
23876 
23877 	/*
23878 	 * Update the capacity kstat value, if no media previously
23879 	 * (capacity kstat is 0) and a media has been inserted
23880 	 * (un_f_blockcount_is_valid == TRUE)
23881 	 */
23882 	if (un->un_errstats) {
23883 		struct sd_errstats	*stp = NULL;
23884 
23885 		stp = (struct sd_errstats *)un->un_errstats->ks_data;
23886 		if ((stp->sd_capacity.value.ui64 == 0) &&
23887 		    (un->un_f_blockcount_is_valid == TRUE)) {
23888 			stp->sd_capacity.value.ui64 =
23889 			    (uint64_t)((uint64_t)un->un_blockcount *
23890 			    un->un_sys_blocksize);
23891 		}
23892 	}
23893 	mutex_exit(SD_MUTEX(un));
23894 	SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: done\n");
23895 	return (rval);
23896 }
23897 
23898 
23899 /*
23900  *    Function: sd_delayed_cv_broadcast
23901  *
23902  * Description: Delayed cv_broadcast to allow for target to recover from media
23903  *		insertion.
23904  *
23905  *   Arguments: arg - driver soft state (unit) structure
23906  */
23907 
23908 static void
23909 sd_delayed_cv_broadcast(void *arg)
23910 {
23911 	struct sd_lun *un = arg;
23912 
23913 	SD_TRACE(SD_LOG_COMMON, un, "sd_delayed_cv_broadcast\n");
23914 
23915 	mutex_enter(SD_MUTEX(un));
23916 	un->un_dcvb_timeid = NULL;
23917 	cv_broadcast(&un->un_state_cv);
23918 	mutex_exit(SD_MUTEX(un));
23919 }
23920 
23921 
23922 /*
23923  *    Function: sd_media_watch_cb
23924  *
23925  * Description: Callback routine used for support of the DKIOCSTATE ioctl. This
23926  *		routine processes the TUR sense data and updates the driver
23927  *		state if a transition has occurred. The user thread
23928  *		(sd_check_media) is then signalled.
23929  *
23930  *   Arguments: arg -   the device 'dev_t' is used for context to discriminate
23931  *			among multiple watches that share this callback function
23932  *		resultp - scsi watch facility result packet containing scsi
23933  *			  packet, status byte and sense data
23934  *
23935  * Return Code: 0 for success, -1 for failure
23936  */
23937 
23938 static int
23939 sd_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp)
23940 {
23941 	struct sd_lun			*un;
23942 	struct scsi_status		*statusp = resultp->statusp;
23943 	uint8_t				*sensep = (uint8_t *)resultp->sensep;
23944 	enum dkio_state			state = DKIO_NONE;
23945 	dev_t				dev = (dev_t)arg;
23946 	uchar_t				actual_sense_length;
23947 	uint8_t				skey, asc, ascq;
23948 
23949 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23950 		return (-1);
23951 	}
23952 	actual_sense_length = resultp->actual_sense_length;
23953 
23954 	mutex_enter(SD_MUTEX(un));
23955 	SD_TRACE(SD_LOG_COMMON, un,
23956 	    "sd_media_watch_cb: status=%x, sensep=%p, len=%x\n",
23957 	    *((char *)statusp), (void *)sensep, actual_sense_length);
23958 
23959 	if (resultp->pkt->pkt_reason == CMD_DEV_GONE) {
23960 		un->un_mediastate = DKIO_DEV_GONE;
23961 		cv_broadcast(&un->un_state_cv);
23962 		mutex_exit(SD_MUTEX(un));
23963 
23964 		return (0);
23965 	}
23966 
23967 	if (un->un_f_mmc_cap && un->un_f_mmc_gesn_polling) {
23968 		if (sd_gesn_media_data_valid(resultp->mmc_data)) {
23969 			if ((resultp->mmc_data[5] &
23970 			    SD_GESN_MEDIA_EVENT_STATUS_PRESENT) != 0) {
23971 				state = DKIO_INSERTED;
23972 			} else {
23973 				state = DKIO_EJECTED;
23974 			}
23975 			if ((resultp->mmc_data[4] & SD_GESN_MEDIA_EVENT_CODE) ==
23976 			    SD_GESN_MEDIA_EVENT_EJECTREQUEST) {
23977 				sd_log_eject_request_event(un, KM_NOSLEEP);
23978 			}
23979 		}
23980 	} else if (sensep != NULL) {
23981 		/*
23982 		 * If there was a check condition then sensep points to valid
23983 		 * sense data. If status was not a check condition but a
23984 		 * reservation or busy status then the new state is DKIO_NONE.
23985 		 */
23986 		skey = scsi_sense_key(sensep);
23987 		asc = scsi_sense_asc(sensep);
23988 		ascq = scsi_sense_ascq(sensep);
23989 
23990 		SD_INFO(SD_LOG_COMMON, un,
23991 		    "sd_media_watch_cb: sense KEY=%x, ASC=%x, ASCQ=%x\n",
23992 		    skey, asc, ascq);
23993 		/* This routine only uses up to 13 bytes of sense data. */
23994 		if (actual_sense_length >= 13) {
23995 			if (skey == KEY_UNIT_ATTENTION) {
23996 				if (asc == 0x28) {
23997 					state = DKIO_INSERTED;
23998 				}
23999 			} else if (skey == KEY_NOT_READY) {
24000 				/*
24001 				 * Sense data of 02/06/00 means that the
24002 				 * drive could not read the media (No
24003 				 * reference position found). In this case
24004 				 * to prevent a hang on the DKIOCSTATE IOCTL
24005 				 * we set the media state to DKIO_INSERTED.
24006 				 */
24007 				if (asc == 0x06 && ascq == 0x00)
24008 					state = DKIO_INSERTED;
24009 
24010 				/*
24011 				 * if 02/04/02  means that the host
24012 				 * should send start command. Explicitly
24013 				 * leave the media state as is
24014 				 * (inserted) as the media is inserted
24015 				 * and host has stopped device for PM
24016 				 * reasons. Upon next true read/write
24017 				 * to this media will bring the
24018 				 * device to the right state good for
24019 				 * media access.
24020 				 */
24021 				if (asc == 0x3a) {
24022 					state = DKIO_EJECTED;
24023 				} else {
24024 					/*
24025 					 * If the drive is busy with an
24026 					 * operation or long write, keep the
24027 					 * media in an inserted state.
24028 					 */
24029 
24030 					if ((asc == 0x04) &&
24031 					    ((ascq == 0x02) ||
24032 					    (ascq == 0x07) ||
24033 					    (ascq == 0x08))) {
24034 						state = DKIO_INSERTED;
24035 					}
24036 				}
24037 			} else if (skey == KEY_NO_SENSE) {
24038 				if ((asc == 0x00) && (ascq == 0x00)) {
24039 					/*
24040 					 * Sense Data 00/00/00 does not provide
24041 					 * any information about the state of
24042 					 * the media. Ignore it.
24043 					 */
24044 					mutex_exit(SD_MUTEX(un));
24045 					return (0);
24046 				}
24047 			}
24048 		}
24049 	} else if ((*((char *)statusp) == STATUS_GOOD) &&
24050 	    (resultp->pkt->pkt_reason == CMD_CMPLT)) {
24051 		state = DKIO_INSERTED;
24052 	}
24053 
24054 	SD_TRACE(SD_LOG_COMMON, un,
24055 	    "sd_media_watch_cb: state=%x, specified=%x\n",
24056 	    state, un->un_specified_mediastate);
24057 
24058 	/*
24059 	 * now signal the waiting thread if this is *not* the specified state;
24060 	 * delay the signal if the state is DKIO_INSERTED to allow the target
24061 	 * to recover
24062 	 */
24063 	if (state != un->un_specified_mediastate) {
24064 		un->un_mediastate = state;
24065 		if (state == DKIO_INSERTED) {
24066 			/*
24067 			 * delay the signal to give the drive a chance
24068 			 * to do what it apparently needs to do
24069 			 */
24070 			SD_TRACE(SD_LOG_COMMON, un,
24071 			    "sd_media_watch_cb: delayed cv_broadcast\n");
24072 			if (un->un_dcvb_timeid == NULL) {
24073 				un->un_dcvb_timeid =
24074 				    timeout(sd_delayed_cv_broadcast, un,
24075 				    drv_usectohz((clock_t)MEDIA_ACCESS_DELAY));
24076 			}
24077 		} else {
24078 			SD_TRACE(SD_LOG_COMMON, un,
24079 			    "sd_media_watch_cb: immediate cv_broadcast\n");
24080 			cv_broadcast(&un->un_state_cv);
24081 		}
24082 	}
24083 	mutex_exit(SD_MUTEX(un));
24084 	return (0);
24085 }
24086 
24087 
24088 /*
24089  *    Function: sd_dkio_get_temp
24090  *
24091  * Description: This routine is the driver entry point for handling ioctl
24092  *		requests to get the disk temperature.
24093  *
24094  *   Arguments: dev  - the device number
24095  *		arg  - pointer to user provided dk_temperature structure.
24096  *		flag - this argument is a pass through to ddi_copyxxx()
24097  *		       directly from the mode argument of ioctl().
24098  *
24099  * Return Code: 0
24100  *		EFAULT
24101  *		ENXIO
24102  *		EAGAIN
24103  */
24104 
24105 static int
24106 sd_dkio_get_temp(dev_t dev, caddr_t arg, int flag)
24107 {
24108 	struct sd_lun		*un = NULL;
24109 	struct dk_temperature	*dktemp = NULL;
24110 	uchar_t			*temperature_page;
24111 	int			rval = 0;
24112 	int			path_flag = SD_PATH_STANDARD;
24113 	sd_ssc_t		*ssc;
24114 
24115 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24116 		return (ENXIO);
24117 	}
24118 
24119 	ssc = sd_ssc_init(un);
24120 	dktemp = kmem_zalloc(sizeof (struct dk_temperature), KM_SLEEP);
24121 
24122 	/* copyin the disk temp argument to get the user flags */
24123 	if (ddi_copyin((void *)arg, dktemp,
24124 	    sizeof (struct dk_temperature), flag) != 0) {
24125 		rval = EFAULT;
24126 		goto done;
24127 	}
24128 
24129 	/* Initialize the temperature to invalid. */
24130 	dktemp->dkt_cur_temp = (short)DKT_INVALID_TEMP;
24131 	dktemp->dkt_ref_temp = (short)DKT_INVALID_TEMP;
24132 
24133 	/*
24134 	 * Note: Investigate removing the "bypass pm" semantic.
24135 	 * Can we just bypass PM always?
24136 	 */
24137 	if (dktemp->dkt_flags & DKT_BYPASS_PM) {
24138 		path_flag = SD_PATH_DIRECT;
24139 		ASSERT(!mutex_owned(&un->un_pm_mutex));
24140 		mutex_enter(&un->un_pm_mutex);
24141 		if (SD_DEVICE_IS_IN_LOW_POWER(un)) {
24142 			/*
24143 			 * If DKT_BYPASS_PM is set, and the drive happens to be
24144 			 * in low power mode, we can not wake it up, Need to
24145 			 * return EAGAIN.
24146 			 */
24147 			mutex_exit(&un->un_pm_mutex);
24148 			rval = EAGAIN;
24149 			goto done;
24150 		} else {
24151 			/*
24152 			 * Indicate to PM the device is busy. This is required
24153 			 * to avoid a race - i.e. the ioctl is issuing a
24154 			 * command and the pm framework brings down the device
24155 			 * to low power mode (possible power cut-off on some
24156 			 * platforms).
24157 			 */
24158 			mutex_exit(&un->un_pm_mutex);
24159 			if (sd_pm_entry(un) != DDI_SUCCESS) {
24160 				rval = EAGAIN;
24161 				goto done;
24162 			}
24163 		}
24164 	}
24165 
24166 	temperature_page = kmem_zalloc(TEMPERATURE_PAGE_SIZE, KM_SLEEP);
24167 
24168 	rval = sd_send_scsi_LOG_SENSE(ssc, temperature_page,
24169 	    TEMPERATURE_PAGE_SIZE, TEMPERATURE_PAGE, 1, 0, path_flag);
24170 	if (rval != 0)
24171 		goto done2;
24172 
24173 	/*
24174 	 * For the current temperature verify that the parameter length is 0x02
24175 	 * and the parameter code is 0x00
24176 	 */
24177 	if ((temperature_page[7] == 0x02) && (temperature_page[4] == 0x00) &&
24178 	    (temperature_page[5] == 0x00)) {
24179 		if (temperature_page[9] == 0xFF) {
24180 			dktemp->dkt_cur_temp = (short)DKT_INVALID_TEMP;
24181 		} else {
24182 			dktemp->dkt_cur_temp = (short)(temperature_page[9]);
24183 		}
24184 	}
24185 
24186 	/*
24187 	 * For the reference temperature verify that the parameter
24188 	 * length is 0x02 and the parameter code is 0x01
24189 	 */
24190 	if ((temperature_page[13] == 0x02) && (temperature_page[10] == 0x00) &&
24191 	    (temperature_page[11] == 0x01)) {
24192 		if (temperature_page[15] == 0xFF) {
24193 			dktemp->dkt_ref_temp = (short)DKT_INVALID_TEMP;
24194 		} else {
24195 			dktemp->dkt_ref_temp = (short)(temperature_page[15]);
24196 		}
24197 	}
24198 
24199 	/* Do the copyout regardless of the temperature commands status. */
24200 	if (ddi_copyout(dktemp, (void *)arg, sizeof (struct dk_temperature),
24201 	    flag) != 0) {
24202 		rval = EFAULT;
24203 		goto done1;
24204 	}
24205 
24206 done2:
24207 	if (rval != 0) {
24208 		if (rval == EIO)
24209 			sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
24210 		else
24211 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
24212 	}
24213 done1:
24214 	if (path_flag == SD_PATH_DIRECT) {
24215 		sd_pm_exit(un);
24216 	}
24217 
24218 	kmem_free(temperature_page, TEMPERATURE_PAGE_SIZE);
24219 done:
24220 	sd_ssc_fini(ssc);
24221 	if (dktemp != NULL) {
24222 		kmem_free(dktemp, sizeof (struct dk_temperature));
24223 	}
24224 
24225 	return (rval);
24226 }
24227 
24228 
24229 /*
24230  *    Function: sd_log_page_supported
24231  *
24232  * Description: This routine uses sd_send_scsi_LOG_SENSE to find the list of
24233  *		supported log pages.
24234  *
24235  *   Arguments: ssc   - ssc contains pointer to driver soft state (unit)
24236  *                      structure for this target.
24237  *		log_page -
24238  *
24239  * Return Code: -1 - on error (log sense is optional and may not be supported).
24240  *		0  - log page not found.
24241  *  		1  - log page found.
24242  */
24243 
24244 static int
24245 sd_log_page_supported(sd_ssc_t *ssc, int log_page)
24246 {
24247 	uchar_t *log_page_data;
24248 	int	i;
24249 	int	match = 0;
24250 	int	log_size;
24251 	int	status = 0;
24252 	struct sd_lun	*un;
24253 
24254 	ASSERT(ssc != NULL);
24255 	un = ssc->ssc_un;
24256 	ASSERT(un != NULL);
24257 
24258 	log_page_data = kmem_zalloc(0xFF, KM_SLEEP);
24259 
24260 	status = sd_send_scsi_LOG_SENSE(ssc, log_page_data, 0xFF, 0, 0x01, 0,
24261 	    SD_PATH_DIRECT);
24262 
24263 	if (status != 0) {
24264 		if (status == EIO) {
24265 			/*
24266 			 * Some disks do not support log sense, we
24267 			 * should ignore this kind of error(sense key is
24268 			 * 0x5 - illegal request).
24269 			 */
24270 			uint8_t *sensep;
24271 			int senlen;
24272 
24273 			sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf;
24274 			senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen -
24275 			    ssc->ssc_uscsi_cmd->uscsi_rqresid);
24276 
24277 			if (senlen > 0 &&
24278 			    scsi_sense_key(sensep) == KEY_ILLEGAL_REQUEST) {
24279 				sd_ssc_assessment(ssc,
24280 				    SD_FMT_IGNORE_COMPROMISE);
24281 			} else {
24282 				sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
24283 			}
24284 		} else {
24285 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
24286 		}
24287 
24288 		SD_ERROR(SD_LOG_COMMON, un,
24289 		    "sd_log_page_supported: failed log page retrieval\n");
24290 		kmem_free(log_page_data, 0xFF);
24291 		return (-1);
24292 	}
24293 
24294 	log_size = log_page_data[3];
24295 
24296 	/*
24297 	 * The list of supported log pages start from the fourth byte. Check
24298 	 * until we run out of log pages or a match is found.
24299 	 */
24300 	for (i = 4; (i < (log_size + 4)) && !match; i++) {
24301 		if (log_page_data[i] == log_page) {
24302 			match++;
24303 		}
24304 	}
24305 	kmem_free(log_page_data, 0xFF);
24306 	return (match);
24307 }
24308 
24309 
24310 /*
24311  *    Function: sd_mhdioc_failfast
24312  *
24313  * Description: This routine is the driver entry point for handling ioctl
24314  *		requests to enable/disable the multihost failfast option.
24315  *		(MHIOCENFAILFAST)
24316  *
24317  *   Arguments: dev	- the device number
24318  *		arg	- user specified probing interval.
24319  *		flag	- this argument is a pass through to ddi_copyxxx()
24320  *			  directly from the mode argument of ioctl().
24321  *
24322  * Return Code: 0
24323  *		EFAULT
24324  *		ENXIO
24325  */
24326 
24327 static int
24328 sd_mhdioc_failfast(dev_t dev, caddr_t arg, int flag)
24329 {
24330 	struct sd_lun	*un = NULL;
24331 	int		mh_time;
24332 	int		rval = 0;
24333 
24334 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24335 		return (ENXIO);
24336 	}
24337 
24338 	if (ddi_copyin((void *)arg, &mh_time, sizeof (int), flag))
24339 		return (EFAULT);
24340 
24341 	if (mh_time) {
24342 		mutex_enter(SD_MUTEX(un));
24343 		un->un_resvd_status |= SD_FAILFAST;
24344 		mutex_exit(SD_MUTEX(un));
24345 		/*
24346 		 * If mh_time is INT_MAX, then this ioctl is being used for
24347 		 * SCSI-3 PGR purposes, and we don't need to spawn watch thread.
24348 		 */
24349 		if (mh_time != INT_MAX) {
24350 			rval = sd_check_mhd(dev, mh_time);
24351 		}
24352 	} else {
24353 		(void) sd_check_mhd(dev, 0);
24354 		mutex_enter(SD_MUTEX(un));
24355 		un->un_resvd_status &= ~SD_FAILFAST;
24356 		mutex_exit(SD_MUTEX(un));
24357 	}
24358 	return (rval);
24359 }
24360 
24361 
24362 /*
24363  *    Function: sd_mhdioc_takeown
24364  *
24365  * Description: This routine is the driver entry point for handling ioctl
24366  *		requests to forcefully acquire exclusive access rights to the
24367  *		multihost disk (MHIOCTKOWN).
24368  *
24369  *   Arguments: dev	- the device number
24370  *		arg	- user provided structure specifying the delay
24371  *			  parameters in milliseconds
24372  *		flag	- this argument is a pass through to ddi_copyxxx()
24373  *			  directly from the mode argument of ioctl().
24374  *
24375  * Return Code: 0
24376  *		EFAULT
24377  *		ENXIO
24378  */
24379 
24380 static int
24381 sd_mhdioc_takeown(dev_t dev, caddr_t arg, int flag)
24382 {
24383 	struct sd_lun		*un = NULL;
24384 	struct mhioctkown	*tkown = NULL;
24385 	int			rval = 0;
24386 
24387 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24388 		return (ENXIO);
24389 	}
24390 
24391 	if (arg != NULL) {
24392 		tkown = (struct mhioctkown *)
24393 		    kmem_zalloc(sizeof (struct mhioctkown), KM_SLEEP);
24394 		rval = ddi_copyin(arg, tkown, sizeof (struct mhioctkown), flag);
24395 		if (rval != 0) {
24396 			rval = EFAULT;
24397 			goto error;
24398 		}
24399 	}
24400 
24401 	rval = sd_take_ownership(dev, tkown);
24402 	mutex_enter(SD_MUTEX(un));
24403 	if (rval == 0) {
24404 		un->un_resvd_status |= SD_RESERVE;
24405 		if (tkown != NULL && tkown->reinstate_resv_delay != 0) {
24406 			sd_reinstate_resv_delay =
24407 			    tkown->reinstate_resv_delay * 1000;
24408 		} else {
24409 			sd_reinstate_resv_delay = SD_REINSTATE_RESV_DELAY;
24410 		}
24411 		/*
24412 		 * Give the scsi_watch routine interval set by
24413 		 * the MHIOCENFAILFAST ioctl precedence here.
24414 		 */
24415 		if ((un->un_resvd_status & SD_FAILFAST) == 0) {
24416 			mutex_exit(SD_MUTEX(un));
24417 			(void) sd_check_mhd(dev, sd_reinstate_resv_delay/1000);
24418 			SD_TRACE(SD_LOG_IOCTL_MHD, un,
24419 			    "sd_mhdioc_takeown : %d\n",
24420 			    sd_reinstate_resv_delay);
24421 		} else {
24422 			mutex_exit(SD_MUTEX(un));
24423 		}
24424 		(void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_NOTIFY,
24425 		    sd_mhd_reset_notify_cb, (caddr_t)un);
24426 	} else {
24427 		un->un_resvd_status &= ~SD_RESERVE;
24428 		mutex_exit(SD_MUTEX(un));
24429 	}
24430 
24431 error:
24432 	if (tkown != NULL) {
24433 		kmem_free(tkown, sizeof (struct mhioctkown));
24434 	}
24435 	return (rval);
24436 }
24437 
24438 
24439 /*
24440  *    Function: sd_mhdioc_release
24441  *
24442  * Description: This routine is the driver entry point for handling ioctl
24443  *		requests to release exclusive access rights to the multihost
24444  *		disk (MHIOCRELEASE).
24445  *
24446  *   Arguments: dev	- the device number
24447  *
24448  * Return Code: 0
24449  *		ENXIO
24450  */
24451 
24452 static int
24453 sd_mhdioc_release(dev_t dev)
24454 {
24455 	struct sd_lun		*un = NULL;
24456 	timeout_id_t		resvd_timeid_save;
24457 	int			resvd_status_save;
24458 	int			rval = 0;
24459 
24460 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24461 		return (ENXIO);
24462 	}
24463 
24464 	mutex_enter(SD_MUTEX(un));
24465 	resvd_status_save = un->un_resvd_status;
24466 	un->un_resvd_status &=
24467 	    ~(SD_RESERVE | SD_LOST_RESERVE | SD_WANT_RESERVE);
24468 	if (un->un_resvd_timeid) {
24469 		resvd_timeid_save = un->un_resvd_timeid;
24470 		un->un_resvd_timeid = NULL;
24471 		mutex_exit(SD_MUTEX(un));
24472 		(void) untimeout(resvd_timeid_save);
24473 	} else {
24474 		mutex_exit(SD_MUTEX(un));
24475 	}
24476 
24477 	/*
24478 	 * destroy any pending timeout thread that may be attempting to
24479 	 * reinstate reservation on this device.
24480 	 */
24481 	sd_rmv_resv_reclaim_req(dev);
24482 
24483 	if ((rval = sd_reserve_release(dev, SD_RELEASE)) == 0) {
24484 		mutex_enter(SD_MUTEX(un));
24485 		if ((un->un_mhd_token) &&
24486 		    ((un->un_resvd_status & SD_FAILFAST) == 0)) {
24487 			mutex_exit(SD_MUTEX(un));
24488 			(void) sd_check_mhd(dev, 0);
24489 		} else {
24490 			mutex_exit(SD_MUTEX(un));
24491 		}
24492 		(void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_CANCEL,
24493 		    sd_mhd_reset_notify_cb, (caddr_t)un);
24494 	} else {
24495 		/*
24496 		 * sd_mhd_watch_cb will restart the resvd recover timeout thread
24497 		 */
24498 		mutex_enter(SD_MUTEX(un));
24499 		un->un_resvd_status = resvd_status_save;
24500 		mutex_exit(SD_MUTEX(un));
24501 	}
24502 	return (rval);
24503 }
24504 
24505 
24506 /*
24507  *    Function: sd_mhdioc_register_devid
24508  *
24509  * Description: This routine is the driver entry point for handling ioctl
24510  *		requests to register the device id (MHIOCREREGISTERDEVID).
24511  *
24512  *		Note: The implementation for this ioctl has been updated to
24513  *		be consistent with the original PSARC case (1999/357)
24514  *		(4375899, 4241671, 4220005)
24515  *
24516  *   Arguments: dev	- the device number
24517  *
24518  * Return Code: 0
24519  *		ENXIO
24520  */
24521 
24522 static int
24523 sd_mhdioc_register_devid(dev_t dev)
24524 {
24525 	struct sd_lun	*un = NULL;
24526 	int		rval = 0;
24527 	sd_ssc_t	*ssc;
24528 
24529 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24530 		return (ENXIO);
24531 	}
24532 
24533 	ASSERT(!mutex_owned(SD_MUTEX(un)));
24534 
24535 	mutex_enter(SD_MUTEX(un));
24536 
24537 	/* If a devid already exists, de-register it */
24538 	if (un->un_devid != NULL) {
24539 		ddi_devid_unregister(SD_DEVINFO(un));
24540 		/*
24541 		 * After unregister devid, needs to free devid memory
24542 		 */
24543 		ddi_devid_free(un->un_devid);
24544 		un->un_devid = NULL;
24545 	}
24546 
24547 	/* Check for reservation conflict */
24548 	mutex_exit(SD_MUTEX(un));
24549 	ssc = sd_ssc_init(un);
24550 	rval = sd_send_scsi_TEST_UNIT_READY(ssc, 0);
24551 	mutex_enter(SD_MUTEX(un));
24552 
24553 	switch (rval) {
24554 	case 0:
24555 		sd_register_devid(ssc, SD_DEVINFO(un), SD_TARGET_IS_UNRESERVED);
24556 		break;
24557 	case EACCES:
24558 		break;
24559 	default:
24560 		rval = EIO;
24561 	}
24562 
24563 	mutex_exit(SD_MUTEX(un));
24564 	if (rval != 0) {
24565 		if (rval == EIO)
24566 			sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
24567 		else
24568 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
24569 	}
24570 	sd_ssc_fini(ssc);
24571 	return (rval);
24572 }
24573 
24574 
24575 /*
24576  *    Function: sd_mhdioc_inkeys
24577  *
24578  * Description: This routine is the driver entry point for handling ioctl
24579  *		requests to issue the SCSI-3 Persistent In Read Keys command
24580  *		to the device (MHIOCGRP_INKEYS).
24581  *
24582  *   Arguments: dev	- the device number
24583  *		arg	- user provided in_keys structure
24584  *		flag	- this argument is a pass through to ddi_copyxxx()
24585  *			  directly from the mode argument of ioctl().
24586  *
24587  * Return Code: code returned by sd_persistent_reservation_in_read_keys()
24588  *		ENXIO
24589  *		EFAULT
24590  */
24591 
24592 static int
24593 sd_mhdioc_inkeys(dev_t dev, caddr_t arg, int flag)
24594 {
24595 	struct sd_lun		*un;
24596 	mhioc_inkeys_t		inkeys;
24597 	int			rval = 0;
24598 
24599 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24600 		return (ENXIO);
24601 	}
24602 
24603 #ifdef _MULTI_DATAMODEL
24604 	switch (ddi_model_convert_from(flag & FMODELS)) {
24605 	case DDI_MODEL_ILP32: {
24606 		struct mhioc_inkeys32	inkeys32;
24607 
24608 		if (ddi_copyin(arg, &inkeys32,
24609 		    sizeof (struct mhioc_inkeys32), flag) != 0) {
24610 			return (EFAULT);
24611 		}
24612 		inkeys.li = (mhioc_key_list_t *)(uintptr_t)inkeys32.li;
24613 		if ((rval = sd_persistent_reservation_in_read_keys(un,
24614 		    &inkeys, flag)) != 0) {
24615 			return (rval);
24616 		}
24617 		inkeys32.generation = inkeys.generation;
24618 		if (ddi_copyout(&inkeys32, arg, sizeof (struct mhioc_inkeys32),
24619 		    flag) != 0) {
24620 			return (EFAULT);
24621 		}
24622 		break;
24623 	}
24624 	case DDI_MODEL_NONE:
24625 		if (ddi_copyin(arg, &inkeys, sizeof (mhioc_inkeys_t),
24626 		    flag) != 0) {
24627 			return (EFAULT);
24628 		}
24629 		if ((rval = sd_persistent_reservation_in_read_keys(un,
24630 		    &inkeys, flag)) != 0) {
24631 			return (rval);
24632 		}
24633 		if (ddi_copyout(&inkeys, arg, sizeof (mhioc_inkeys_t),
24634 		    flag) != 0) {
24635 			return (EFAULT);
24636 		}
24637 		break;
24638 	}
24639 
24640 #else /* ! _MULTI_DATAMODEL */
24641 
24642 	if (ddi_copyin(arg, &inkeys, sizeof (mhioc_inkeys_t), flag) != 0) {
24643 		return (EFAULT);
24644 	}
24645 	rval = sd_persistent_reservation_in_read_keys(un, &inkeys, flag);
24646 	if (rval != 0) {
24647 		return (rval);
24648 	}
24649 	if (ddi_copyout(&inkeys, arg, sizeof (mhioc_inkeys_t), flag) != 0) {
24650 		return (EFAULT);
24651 	}
24652 
24653 #endif /* _MULTI_DATAMODEL */
24654 
24655 	return (rval);
24656 }
24657 
24658 
24659 /*
24660  *    Function: sd_mhdioc_inresv
24661  *
24662  * Description: This routine is the driver entry point for handling ioctl
24663  *		requests to issue the SCSI-3 Persistent In Read Reservations
24664  *		command to the device (MHIOCGRP_INKEYS).
24665  *
24666  *   Arguments: dev	- the device number
24667  *		arg	- user provided in_resv structure
24668  *		flag	- this argument is a pass through to ddi_copyxxx()
24669  *			  directly from the mode argument of ioctl().
24670  *
24671  * Return Code: code returned by sd_persistent_reservation_in_read_resv()
24672  *		ENXIO
24673  *		EFAULT
24674  */
24675 
24676 static int
24677 sd_mhdioc_inresv(dev_t dev, caddr_t arg, int flag)
24678 {
24679 	struct sd_lun		*un;
24680 	mhioc_inresvs_t		inresvs;
24681 	int			rval = 0;
24682 
24683 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24684 		return (ENXIO);
24685 	}
24686 
24687 #ifdef _MULTI_DATAMODEL
24688 
24689 	switch (ddi_model_convert_from(flag & FMODELS)) {
24690 	case DDI_MODEL_ILP32: {
24691 		struct mhioc_inresvs32	inresvs32;
24692 
24693 		if (ddi_copyin(arg, &inresvs32,
24694 		    sizeof (struct mhioc_inresvs32), flag) != 0) {
24695 			return (EFAULT);
24696 		}
24697 		inresvs.li = (mhioc_resv_desc_list_t *)(uintptr_t)inresvs32.li;
24698 		if ((rval = sd_persistent_reservation_in_read_resv(un,
24699 		    &inresvs, flag)) != 0) {
24700 			return (rval);
24701 		}
24702 		inresvs32.generation = inresvs.generation;
24703 		if (ddi_copyout(&inresvs32, arg,
24704 		    sizeof (struct mhioc_inresvs32), flag) != 0) {
24705 			return (EFAULT);
24706 		}
24707 		break;
24708 	}
24709 	case DDI_MODEL_NONE:
24710 		if (ddi_copyin(arg, &inresvs,
24711 		    sizeof (mhioc_inresvs_t), flag) != 0) {
24712 			return (EFAULT);
24713 		}
24714 		if ((rval = sd_persistent_reservation_in_read_resv(un,
24715 		    &inresvs, flag)) != 0) {
24716 			return (rval);
24717 		}
24718 		if (ddi_copyout(&inresvs, arg,
24719 		    sizeof (mhioc_inresvs_t), flag) != 0) {
24720 			return (EFAULT);
24721 		}
24722 		break;
24723 	}
24724 
24725 #else /* ! _MULTI_DATAMODEL */
24726 
24727 	if (ddi_copyin(arg, &inresvs, sizeof (mhioc_inresvs_t), flag) != 0) {
24728 		return (EFAULT);
24729 	}
24730 	rval = sd_persistent_reservation_in_read_resv(un, &inresvs, flag);
24731 	if (rval != 0) {
24732 		return (rval);
24733 	}
24734 	if (ddi_copyout(&inresvs, arg, sizeof (mhioc_inresvs_t), flag)) {
24735 		return (EFAULT);
24736 	}
24737 
24738 #endif /* ! _MULTI_DATAMODEL */
24739 
24740 	return (rval);
24741 }
24742 
24743 
24744 /*
24745  * The following routines support the clustering functionality described below
24746  * and implement lost reservation reclaim functionality.
24747  *
24748  * Clustering
24749  * ----------
24750  * The clustering code uses two different, independent forms of SCSI
24751  * reservation. Traditional SCSI-2 Reserve/Release and the newer SCSI-3
24752  * Persistent Group Reservations. For any particular disk, it will use either
24753  * SCSI-2 or SCSI-3 PGR but never both at the same time for the same disk.
24754  *
24755  * SCSI-2
24756  * The cluster software takes ownership of a multi-hosted disk by issuing the
24757  * MHIOCTKOWN ioctl to the disk driver. It releases ownership by issuing the
24758  * MHIOCRELEASE ioctl.  Closely related is the MHIOCENFAILFAST ioctl -- a
24759  * cluster, just after taking ownership of the disk with the MHIOCTKOWN ioctl
24760  * then issues the MHIOCENFAILFAST ioctl.  This ioctl "enables failfast" in the
24761  * driver. The meaning of failfast is that if the driver (on this host) ever
24762  * encounters the scsi error return code RESERVATION_CONFLICT from the device,
24763  * it should immediately panic the host. The motivation for this ioctl is that
24764  * if this host does encounter reservation conflict, the underlying cause is
24765  * that some other host of the cluster has decided that this host is no longer
24766  * in the cluster and has seized control of the disks for itself. Since this
24767  * host is no longer in the cluster, it ought to panic itself. The
24768  * MHIOCENFAILFAST ioctl does two things:
24769  *	(a) it sets a flag that will cause any returned RESERVATION_CONFLICT
24770  *      error to panic the host
24771  *      (b) it sets up a periodic timer to test whether this host still has
24772  *      "access" (in that no other host has reserved the device):  if the
24773  *      periodic timer gets RESERVATION_CONFLICT, the host is panicked. The
24774  *      purpose of that periodic timer is to handle scenarios where the host is
24775  *      otherwise temporarily quiescent, temporarily doing no real i/o.
24776  * The MHIOCTKOWN ioctl will "break" a reservation that is held by another host,
24777  * by issuing a SCSI Bus Device Reset.  It will then issue a SCSI Reserve for
24778  * the device itself.
24779  *
24780  * SCSI-3 PGR
24781  * A direct semantic implementation of the SCSI-3 Persistent Reservation
24782  * facility is supported through the shared multihost disk ioctls
24783  * (MHIOCGRP_INKEYS, MHIOCGRP_INRESV, MHIOCGRP_REGISTER, MHIOCGRP_RESERVE,
24784  * MHIOCGRP_PREEMPTANDABORT, MHIOCGRP_CLEAR)
24785  *
24786  * Reservation Reclaim:
24787  * --------------------
24788  * To support the lost reservation reclaim operations this driver creates a
24789  * single thread to handle reinstating reservations on all devices that have
24790  * lost reservations sd_resv_reclaim_requests are logged for all devices that
24791  * have LOST RESERVATIONS when the scsi watch facility callsback sd_mhd_watch_cb
24792  * and the reservation reclaim thread loops through the requests to regain the
24793  * lost reservations.
24794  */
24795 
24796 /*
24797  *    Function: sd_check_mhd()
24798  *
24799  * Description: This function sets up and submits a scsi watch request or
24800  *		terminates an existing watch request. This routine is used in
24801  *		support of reservation reclaim.
24802  *
24803  *   Arguments: dev    - the device 'dev_t' is used for context to discriminate
24804  *			 among multiple watches that share the callback function
24805  *		interval - the number of microseconds specifying the watch
24806  *			   interval for issuing TEST UNIT READY commands. If
24807  *			   set to 0 the watch should be terminated. If the
24808  *			   interval is set to 0 and if the device is required
24809  *			   to hold reservation while disabling failfast, the
24810  *			   watch is restarted with an interval of
24811  *			   reinstate_resv_delay.
24812  *
24813  * Return Code: 0	   - Successful submit/terminate of scsi watch request
24814  *		ENXIO      - Indicates an invalid device was specified
24815  *		EAGAIN     - Unable to submit the scsi watch request
24816  */
24817 
24818 static int
24819 sd_check_mhd(dev_t dev, int interval)
24820 {
24821 	struct sd_lun	*un;
24822 	opaque_t	token;
24823 
24824 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24825 		return (ENXIO);
24826 	}
24827 
24828 	/* is this a watch termination request? */
24829 	if (interval == 0) {
24830 		mutex_enter(SD_MUTEX(un));
24831 		/* if there is an existing watch task then terminate it */
24832 		if (un->un_mhd_token) {
24833 			token = un->un_mhd_token;
24834 			un->un_mhd_token = NULL;
24835 			mutex_exit(SD_MUTEX(un));
24836 			(void) scsi_watch_request_terminate(token,
24837 			    SCSI_WATCH_TERMINATE_ALL_WAIT);
24838 			mutex_enter(SD_MUTEX(un));
24839 		} else {
24840 			mutex_exit(SD_MUTEX(un));
24841 			/*
24842 			 * Note: If we return here we don't check for the
24843 			 * failfast case. This is the original legacy
24844 			 * implementation but perhaps we should be checking
24845 			 * the failfast case.
24846 			 */
24847 			return (0);
24848 		}
24849 		/*
24850 		 * If the device is required to hold reservation while
24851 		 * disabling failfast, we need to restart the scsi_watch
24852 		 * routine with an interval of reinstate_resv_delay.
24853 		 */
24854 		if (un->un_resvd_status & SD_RESERVE) {
24855 			interval = sd_reinstate_resv_delay/1000;
24856 		} else {
24857 			/* no failfast so bail */
24858 			mutex_exit(SD_MUTEX(un));
24859 			return (0);
24860 		}
24861 		mutex_exit(SD_MUTEX(un));
24862 	}
24863 
24864 	/*
24865 	 * adjust minimum time interval to 1 second,
24866 	 * and convert from msecs to usecs
24867 	 */
24868 	if (interval > 0 && interval < 1000) {
24869 		interval = 1000;
24870 	}
24871 	interval *= 1000;
24872 
24873 	/*
24874 	 * submit the request to the scsi_watch service
24875 	 */
24876 	token = scsi_watch_request_submit(SD_SCSI_DEVP(un), interval,
24877 	    SENSE_LENGTH, sd_mhd_watch_cb, (caddr_t)dev);
24878 	if (token == NULL) {
24879 		return (EAGAIN);
24880 	}
24881 
24882 	/*
24883 	 * save token for termination later on
24884 	 */
24885 	mutex_enter(SD_MUTEX(un));
24886 	un->un_mhd_token = token;
24887 	mutex_exit(SD_MUTEX(un));
24888 	return (0);
24889 }
24890 
24891 
24892 /*
24893  *    Function: sd_mhd_watch_cb()
24894  *
24895  * Description: This function is the call back function used by the scsi watch
24896  *		facility. The scsi watch facility sends the "Test Unit Ready"
24897  *		and processes the status. If applicable (i.e. a "Unit Attention"
24898  *		status and automatic "Request Sense" not used) the scsi watch
24899  *		facility will send a "Request Sense" and retrieve the sense data
24900  *		to be passed to this callback function. In either case the
24901  *		automatic "Request Sense" or the facility submitting one, this
24902  *		callback is passed the status and sense data.
24903  *
24904  *   Arguments: arg -   the device 'dev_t' is used for context to discriminate
24905  *			among multiple watches that share this callback function
24906  *		resultp - scsi watch facility result packet containing scsi
24907  *			  packet, status byte and sense data
24908  *
24909  * Return Code: 0 - continue the watch task
24910  *		non-zero - terminate the watch task
24911  */
24912 
24913 static int
24914 sd_mhd_watch_cb(caddr_t arg, struct scsi_watch_result *resultp)
24915 {
24916 	struct sd_lun			*un;
24917 	struct scsi_status		*statusp;
24918 	uint8_t				*sensep;
24919 	struct scsi_pkt			*pkt;
24920 	uchar_t				actual_sense_length;
24921 	dev_t  				dev = (dev_t)arg;
24922 
24923 	ASSERT(resultp != NULL);
24924 	statusp			= resultp->statusp;
24925 	sensep			= (uint8_t *)resultp->sensep;
24926 	pkt			= resultp->pkt;
24927 	actual_sense_length	= resultp->actual_sense_length;
24928 
24929 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24930 		return (ENXIO);
24931 	}
24932 
24933 	SD_TRACE(SD_LOG_IOCTL_MHD, un,
24934 	    "sd_mhd_watch_cb: reason '%s', status '%s'\n",
24935 	    scsi_rname(pkt->pkt_reason), sd_sname(*((unsigned char *)statusp)));
24936 
24937 	/* Begin processing of the status and/or sense data */
24938 	if (pkt->pkt_reason != CMD_CMPLT) {
24939 		/* Handle the incomplete packet */
24940 		sd_mhd_watch_incomplete(un, pkt);
24941 		return (0);
24942 	} else if (*((unsigned char *)statusp) != STATUS_GOOD) {
24943 		if (*((unsigned char *)statusp)
24944 		    == STATUS_RESERVATION_CONFLICT) {
24945 			/*
24946 			 * Handle a reservation conflict by panicking if
24947 			 * configured for failfast or by logging the conflict
24948 			 * and updating the reservation status
24949 			 */
24950 			mutex_enter(SD_MUTEX(un));
24951 			if ((un->un_resvd_status & SD_FAILFAST) &&
24952 			    (sd_failfast_enable)) {
24953 				sd_panic_for_res_conflict(un);
24954 				/*NOTREACHED*/
24955 			}
24956 			SD_INFO(SD_LOG_IOCTL_MHD, un,
24957 			    "sd_mhd_watch_cb: Reservation Conflict\n");
24958 			un->un_resvd_status |= SD_RESERVATION_CONFLICT;
24959 			mutex_exit(SD_MUTEX(un));
24960 		}
24961 	}
24962 
24963 	if (sensep != NULL) {
24964 		if (actual_sense_length >= (SENSE_LENGTH - 2)) {
24965 			mutex_enter(SD_MUTEX(un));
24966 			if ((scsi_sense_asc(sensep) ==
24967 			    SD_SCSI_RESET_SENSE_CODE) &&
24968 			    (un->un_resvd_status & SD_RESERVE)) {
24969 				/*
24970 				 * The additional sense code indicates a power
24971 				 * on or bus device reset has occurred; update
24972 				 * the reservation status.
24973 				 */
24974 				un->un_resvd_status |=
24975 				    (SD_LOST_RESERVE | SD_WANT_RESERVE);
24976 				SD_INFO(SD_LOG_IOCTL_MHD, un,
24977 				    "sd_mhd_watch_cb: Lost Reservation\n");
24978 			}
24979 		} else {
24980 			return (0);
24981 		}
24982 	} else {
24983 		mutex_enter(SD_MUTEX(un));
24984 	}
24985 
24986 	if ((un->un_resvd_status & SD_RESERVE) &&
24987 	    (un->un_resvd_status & SD_LOST_RESERVE)) {
24988 		if (un->un_resvd_status & SD_WANT_RESERVE) {
24989 			/*
24990 			 * A reset occurred in between the last probe and this
24991 			 * one so if a timeout is pending cancel it.
24992 			 */
24993 			if (un->un_resvd_timeid) {
24994 				timeout_id_t temp_id = un->un_resvd_timeid;
24995 				un->un_resvd_timeid = NULL;
24996 				mutex_exit(SD_MUTEX(un));
24997 				(void) untimeout(temp_id);
24998 				mutex_enter(SD_MUTEX(un));
24999 			}
25000 			un->un_resvd_status &= ~SD_WANT_RESERVE;
25001 		}
25002 		if (un->un_resvd_timeid == 0) {
25003 			/* Schedule a timeout to handle the lost reservation */
25004 			un->un_resvd_timeid = timeout(sd_mhd_resvd_recover,
25005 			    (void *)dev,
25006 			    drv_usectohz(sd_reinstate_resv_delay));
25007 		}
25008 	}
25009 	mutex_exit(SD_MUTEX(un));
25010 	return (0);
25011 }
25012 
25013 
25014 /*
25015  *    Function: sd_mhd_watch_incomplete()
25016  *
25017  * Description: This function is used to find out why a scsi pkt sent by the
25018  *		scsi watch facility was not completed. Under some scenarios this
25019  *		routine will return. Otherwise it will send a bus reset to see
25020  *		if the drive is still online.
25021  *
25022  *   Arguments: un  - driver soft state (unit) structure
25023  *		pkt - incomplete scsi pkt
25024  */
25025 
25026 static void
25027 sd_mhd_watch_incomplete(struct sd_lun *un, struct scsi_pkt *pkt)
25028 {
25029 	int	be_chatty;
25030 	int	perr;
25031 
25032 	ASSERT(pkt != NULL);
25033 	ASSERT(un != NULL);
25034 	be_chatty	= (!(pkt->pkt_flags & FLAG_SILENT));
25035 	perr		= (pkt->pkt_statistics & STAT_PERR);
25036 
25037 	mutex_enter(SD_MUTEX(un));
25038 	if (un->un_state == SD_STATE_DUMPING) {
25039 		mutex_exit(SD_MUTEX(un));
25040 		return;
25041 	}
25042 
25043 	switch (pkt->pkt_reason) {
25044 	case CMD_UNX_BUS_FREE:
25045 		/*
25046 		 * If we had a parity error that caused the target to drop BSY*,
25047 		 * don't be chatty about it.
25048 		 */
25049 		if (perr && be_chatty) {
25050 			be_chatty = 0;
25051 		}
25052 		break;
25053 	case CMD_TAG_REJECT:
25054 		/*
25055 		 * The SCSI-2 spec states that a tag reject will be sent by the
25056 		 * target if tagged queuing is not supported. A tag reject may
25057 		 * also be sent during certain initialization periods or to
25058 		 * control internal resources. For the latter case the target
25059 		 * may also return Queue Full.
25060 		 *
25061 		 * If this driver receives a tag reject from a target that is
25062 		 * going through an init period or controlling internal
25063 		 * resources tagged queuing will be disabled. This is a less
25064 		 * than optimal behavior but the driver is unable to determine
25065 		 * the target state and assumes tagged queueing is not supported
25066 		 */
25067 		pkt->pkt_flags = 0;
25068 		un->un_tagflags = 0;
25069 
25070 		if (un->un_f_opt_queueing == TRUE) {
25071 			un->un_throttle = min(un->un_throttle, 3);
25072 		} else {
25073 			un->un_throttle = 1;
25074 		}
25075 		mutex_exit(SD_MUTEX(un));
25076 		(void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1);
25077 		mutex_enter(SD_MUTEX(un));
25078 		break;
25079 	case CMD_INCOMPLETE:
25080 		/*
25081 		 * The transport stopped with an abnormal state, fallthrough and
25082 		 * reset the target and/or bus unless selection did not complete
25083 		 * (indicated by STATE_GOT_BUS) in which case we don't want to
25084 		 * go through a target/bus reset
25085 		 */
25086 		if (pkt->pkt_state == STATE_GOT_BUS) {
25087 			break;
25088 		}
25089 		/*FALLTHROUGH*/
25090 
25091 	case CMD_TIMEOUT:
25092 	default:
25093 		/*
25094 		 * The lun may still be running the command, so a lun reset
25095 		 * should be attempted. If the lun reset fails or cannot be
25096 		 * issued, than try a target reset. Lastly try a bus reset.
25097 		 */
25098 		if ((pkt->pkt_statistics &
25099 		    (STAT_BUS_RESET|STAT_DEV_RESET|STAT_ABORTED)) == 0) {
25100 			int reset_retval = 0;
25101 			mutex_exit(SD_MUTEX(un));
25102 			if (un->un_f_allow_bus_device_reset == TRUE) {
25103 				if (un->un_f_lun_reset_enabled == TRUE) {
25104 					reset_retval =
25105 					    scsi_reset(SD_ADDRESS(un),
25106 					    RESET_LUN);
25107 				}
25108 				if (reset_retval == 0) {
25109 					reset_retval =
25110 					    scsi_reset(SD_ADDRESS(un),
25111 					    RESET_TARGET);
25112 				}
25113 			}
25114 			if (reset_retval == 0) {
25115 				(void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
25116 			}
25117 			mutex_enter(SD_MUTEX(un));
25118 		}
25119 		break;
25120 	}
25121 
25122 	/* A device/bus reset has occurred; update the reservation status. */
25123 	if ((pkt->pkt_reason == CMD_RESET) || (pkt->pkt_statistics &
25124 	    (STAT_BUS_RESET | STAT_DEV_RESET))) {
25125 		if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
25126 			un->un_resvd_status |=
25127 			    (SD_LOST_RESERVE | SD_WANT_RESERVE);
25128 			SD_INFO(SD_LOG_IOCTL_MHD, un,
25129 			    "sd_mhd_watch_incomplete: Lost Reservation\n");
25130 		}
25131 	}
25132 
25133 	/*
25134 	 * The disk has been turned off; Update the device state.
25135 	 *
25136 	 * Note: Should we be offlining the disk here?
25137 	 */
25138 	if (pkt->pkt_state == STATE_GOT_BUS) {
25139 		SD_INFO(SD_LOG_IOCTL_MHD, un, "sd_mhd_watch_incomplete: "
25140 		    "Disk not responding to selection\n");
25141 		if (un->un_state != SD_STATE_OFFLINE) {
25142 			New_state(un, SD_STATE_OFFLINE);
25143 		}
25144 	} else if (be_chatty) {
25145 		/*
25146 		 * suppress messages if they are all the same pkt reason;
25147 		 * with TQ, many (up to 256) are returned with the same
25148 		 * pkt_reason
25149 		 */
25150 		if (pkt->pkt_reason != un->un_last_pkt_reason) {
25151 			SD_ERROR(SD_LOG_IOCTL_MHD, un,
25152 			    "sd_mhd_watch_incomplete: "
25153 			    "SCSI transport failed: reason '%s'\n",
25154 			    scsi_rname(pkt->pkt_reason));
25155 		}
25156 	}
25157 	un->un_last_pkt_reason = pkt->pkt_reason;
25158 	mutex_exit(SD_MUTEX(un));
25159 }
25160 
25161 
25162 /*
25163  *    Function: sd_sname()
25164  *
25165  * Description: This is a simple little routine to return a string containing
25166  *		a printable description of command status byte for use in
25167  *		logging.
25168  *
25169  *   Arguments: status - pointer to a status byte
25170  *
25171  * Return Code: char * - string containing status description.
25172  */
25173 
25174 static char *
25175 sd_sname(uchar_t status)
25176 {
25177 	switch (status & STATUS_MASK) {
25178 	case STATUS_GOOD:
25179 		return ("good status");
25180 	case STATUS_CHECK:
25181 		return ("check condition");
25182 	case STATUS_MET:
25183 		return ("condition met");
25184 	case STATUS_BUSY:
25185 		return ("busy");
25186 	case STATUS_INTERMEDIATE:
25187 		return ("intermediate");
25188 	case STATUS_INTERMEDIATE_MET:
25189 		return ("intermediate - condition met");
25190 	case STATUS_RESERVATION_CONFLICT:
25191 		return ("reservation_conflict");
25192 	case STATUS_TERMINATED:
25193 		return ("command terminated");
25194 	case STATUS_QFULL:
25195 		return ("queue full");
25196 	default:
25197 		return ("<unknown status>");
25198 	}
25199 }
25200 
25201 
25202 /*
25203  *    Function: sd_mhd_resvd_recover()
25204  *
25205  * Description: This function adds a reservation entry to the
25206  *		sd_resv_reclaim_request list and signals the reservation
25207  *		reclaim thread that there is work pending. If the reservation
25208  *		reclaim thread has not been previously created this function
25209  *		will kick it off.
25210  *
25211  *   Arguments: arg -   the device 'dev_t' is used for context to discriminate
25212  *			among multiple watches that share this callback function
25213  *
25214  *     Context: This routine is called by timeout() and is run in interrupt
25215  *		context. It must not sleep or call other functions which may
25216  *		sleep.
25217  */
25218 
25219 static void
25220 sd_mhd_resvd_recover(void *arg)
25221 {
25222 	dev_t			dev = (dev_t)arg;
25223 	struct sd_lun		*un;
25224 	struct sd_thr_request	*sd_treq = NULL;
25225 	struct sd_thr_request	*sd_cur = NULL;
25226 	struct sd_thr_request	*sd_prev = NULL;
25227 	int			already_there = 0;
25228 
25229 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
25230 		return;
25231 	}
25232 
25233 	mutex_enter(SD_MUTEX(un));
25234 	un->un_resvd_timeid = NULL;
25235 	if (un->un_resvd_status & SD_WANT_RESERVE) {
25236 		/*
25237 		 * There was a reset so don't issue the reserve, allow the
25238 		 * sd_mhd_watch_cb callback function to notice this and
25239 		 * reschedule the timeout for reservation.
25240 		 */
25241 		mutex_exit(SD_MUTEX(un));
25242 		return;
25243 	}
25244 	mutex_exit(SD_MUTEX(un));
25245 
25246 	/*
25247 	 * Add this device to the sd_resv_reclaim_request list and the
25248 	 * sd_resv_reclaim_thread should take care of the rest.
25249 	 *
25250 	 * Note: We can't sleep in this context so if the memory allocation
25251 	 * fails allow the sd_mhd_watch_cb callback function to notice this and
25252 	 * reschedule the timeout for reservation.  (4378460)
25253 	 */
25254 	sd_treq = (struct sd_thr_request *)
25255 	    kmem_zalloc(sizeof (struct sd_thr_request), KM_NOSLEEP);
25256 	if (sd_treq == NULL) {
25257 		return;
25258 	}
25259 
25260 	sd_treq->sd_thr_req_next = NULL;
25261 	sd_treq->dev = dev;
25262 	mutex_enter(&sd_tr.srq_resv_reclaim_mutex);
25263 	if (sd_tr.srq_thr_req_head == NULL) {
25264 		sd_tr.srq_thr_req_head = sd_treq;
25265 	} else {
25266 		sd_cur = sd_prev = sd_tr.srq_thr_req_head;
25267 		for (; sd_cur != NULL; sd_cur = sd_cur->sd_thr_req_next) {
25268 			if (sd_cur->dev == dev) {
25269 				/*
25270 				 * already in Queue so don't log
25271 				 * another request for the device
25272 				 */
25273 				already_there = 1;
25274 				break;
25275 			}
25276 			sd_prev = sd_cur;
25277 		}
25278 		if (!already_there) {
25279 			SD_INFO(SD_LOG_IOCTL_MHD, un, "sd_mhd_resvd_recover: "
25280 			    "logging request for %lx\n", dev);
25281 			sd_prev->sd_thr_req_next = sd_treq;
25282 		} else {
25283 			kmem_free(sd_treq, sizeof (struct sd_thr_request));
25284 		}
25285 	}
25286 
25287 	/*
25288 	 * Create a kernel thread to do the reservation reclaim and free up this
25289 	 * thread. We cannot block this thread while we go away to do the
25290 	 * reservation reclaim
25291 	 */
25292 	if (sd_tr.srq_resv_reclaim_thread == NULL)
25293 		sd_tr.srq_resv_reclaim_thread = thread_create(NULL, 0,
25294 		    sd_resv_reclaim_thread, NULL,
25295 		    0, &p0, TS_RUN, v.v_maxsyspri - 2);
25296 
25297 	/* Tell the reservation reclaim thread that it has work to do */
25298 	cv_signal(&sd_tr.srq_resv_reclaim_cv);
25299 	mutex_exit(&sd_tr.srq_resv_reclaim_mutex);
25300 }
25301 
25302 /*
25303  *    Function: sd_resv_reclaim_thread()
25304  *
25305  * Description: This function implements the reservation reclaim operations
25306  *
25307  *   Arguments: arg - the device 'dev_t' is used for context to discriminate
25308  *		      among multiple watches that share this callback function
25309  */
25310 
25311 static void
25312 sd_resv_reclaim_thread()
25313 {
25314 	struct sd_lun		*un;
25315 	struct sd_thr_request	*sd_mhreq;
25316 
25317 	/* Wait for work */
25318 	mutex_enter(&sd_tr.srq_resv_reclaim_mutex);
25319 	if (sd_tr.srq_thr_req_head == NULL) {
25320 		cv_wait(&sd_tr.srq_resv_reclaim_cv,
25321 		    &sd_tr.srq_resv_reclaim_mutex);
25322 	}
25323 
25324 	/* Loop while we have work */
25325 	while ((sd_tr.srq_thr_cur_req = sd_tr.srq_thr_req_head) != NULL) {
25326 		un = ddi_get_soft_state(sd_state,
25327 		    SDUNIT(sd_tr.srq_thr_cur_req->dev));
25328 		if (un == NULL) {
25329 			/*
25330 			 * softstate structure is NULL so just
25331 			 * dequeue the request and continue
25332 			 */
25333 			sd_tr.srq_thr_req_head =
25334 			    sd_tr.srq_thr_cur_req->sd_thr_req_next;
25335 			kmem_free(sd_tr.srq_thr_cur_req,
25336 			    sizeof (struct sd_thr_request));
25337 			continue;
25338 		}
25339 
25340 		/* dequeue the request */
25341 		sd_mhreq = sd_tr.srq_thr_cur_req;
25342 		sd_tr.srq_thr_req_head =
25343 		    sd_tr.srq_thr_cur_req->sd_thr_req_next;
25344 		mutex_exit(&sd_tr.srq_resv_reclaim_mutex);
25345 
25346 		/*
25347 		 * Reclaim reservation only if SD_RESERVE is still set. There
25348 		 * may have been a call to MHIOCRELEASE before we got here.
25349 		 */
25350 		mutex_enter(SD_MUTEX(un));
25351 		if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
25352 			/*
25353 			 * Note: The SD_LOST_RESERVE flag is cleared before
25354 			 * reclaiming the reservation. If this is done after the
25355 			 * call to sd_reserve_release a reservation loss in the
25356 			 * window between pkt completion of reserve cmd and
25357 			 * mutex_enter below may not be recognized
25358 			 */
25359 			un->un_resvd_status &= ~SD_LOST_RESERVE;
25360 			mutex_exit(SD_MUTEX(un));
25361 
25362 			if (sd_reserve_release(sd_mhreq->dev,
25363 			    SD_RESERVE) == 0) {
25364 				mutex_enter(SD_MUTEX(un));
25365 				un->un_resvd_status |= SD_RESERVE;
25366 				mutex_exit(SD_MUTEX(un));
25367 				SD_INFO(SD_LOG_IOCTL_MHD, un,
25368 				    "sd_resv_reclaim_thread: "
25369 				    "Reservation Recovered\n");
25370 			} else {
25371 				mutex_enter(SD_MUTEX(un));
25372 				un->un_resvd_status |= SD_LOST_RESERVE;
25373 				mutex_exit(SD_MUTEX(un));
25374 				SD_INFO(SD_LOG_IOCTL_MHD, un,
25375 				    "sd_resv_reclaim_thread: Failed "
25376 				    "Reservation Recovery\n");
25377 			}
25378 		} else {
25379 			mutex_exit(SD_MUTEX(un));
25380 		}
25381 		mutex_enter(&sd_tr.srq_resv_reclaim_mutex);
25382 		ASSERT(sd_mhreq == sd_tr.srq_thr_cur_req);
25383 		kmem_free(sd_mhreq, sizeof (struct sd_thr_request));
25384 		sd_mhreq = sd_tr.srq_thr_cur_req = NULL;
25385 		/*
25386 		 * wakeup the destroy thread if anyone is waiting on
25387 		 * us to complete.
25388 		 */
25389 		cv_signal(&sd_tr.srq_inprocess_cv);
25390 		SD_TRACE(SD_LOG_IOCTL_MHD, un,
25391 		    "sd_resv_reclaim_thread: cv_signalling current request \n");
25392 	}
25393 
25394 	/*
25395 	 * cleanup the sd_tr structure now that this thread will not exist
25396 	 */
25397 	ASSERT(sd_tr.srq_thr_req_head == NULL);
25398 	ASSERT(sd_tr.srq_thr_cur_req == NULL);
25399 	sd_tr.srq_resv_reclaim_thread = NULL;
25400 	mutex_exit(&sd_tr.srq_resv_reclaim_mutex);
25401 	thread_exit();
25402 }
25403 
25404 
25405 /*
25406  *    Function: sd_rmv_resv_reclaim_req()
25407  *
25408  * Description: This function removes any pending reservation reclaim requests
25409  *		for the specified device.
25410  *
25411  *   Arguments: dev - the device 'dev_t'
25412  */
25413 
25414 static void
25415 sd_rmv_resv_reclaim_req(dev_t dev)
25416 {
25417 	struct sd_thr_request *sd_mhreq;
25418 	struct sd_thr_request *sd_prev;
25419 
25420 	/* Remove a reservation reclaim request from the list */
25421 	mutex_enter(&sd_tr.srq_resv_reclaim_mutex);
25422 	if (sd_tr.srq_thr_cur_req && sd_tr.srq_thr_cur_req->dev == dev) {
25423 		/*
25424 		 * We are attempting to reinstate reservation for
25425 		 * this device. We wait for sd_reserve_release()
25426 		 * to return before we return.
25427 		 */
25428 		cv_wait(&sd_tr.srq_inprocess_cv,
25429 		    &sd_tr.srq_resv_reclaim_mutex);
25430 	} else {
25431 		sd_prev = sd_mhreq = sd_tr.srq_thr_req_head;
25432 		if (sd_mhreq && sd_mhreq->dev == dev) {
25433 			sd_tr.srq_thr_req_head = sd_mhreq->sd_thr_req_next;
25434 			kmem_free(sd_mhreq, sizeof (struct sd_thr_request));
25435 			mutex_exit(&sd_tr.srq_resv_reclaim_mutex);
25436 			return;
25437 		}
25438 		for (; sd_mhreq != NULL; sd_mhreq = sd_mhreq->sd_thr_req_next) {
25439 			if (sd_mhreq && sd_mhreq->dev == dev) {
25440 				break;
25441 			}
25442 			sd_prev = sd_mhreq;
25443 		}
25444 		if (sd_mhreq != NULL) {
25445 			sd_prev->sd_thr_req_next = sd_mhreq->sd_thr_req_next;
25446 			kmem_free(sd_mhreq, sizeof (struct sd_thr_request));
25447 		}
25448 	}
25449 	mutex_exit(&sd_tr.srq_resv_reclaim_mutex);
25450 }
25451 
25452 
25453 /*
25454  *    Function: sd_mhd_reset_notify_cb()
25455  *
25456  * Description: This is a call back function for scsi_reset_notify. This
25457  *		function updates the softstate reserved status and logs the
25458  *		reset. The driver scsi watch facility callback function
25459  *		(sd_mhd_watch_cb) and reservation reclaim thread functionality
25460  *		will reclaim the reservation.
25461  *
25462  *   Arguments: arg  - driver soft state (unit) structure
25463  */
25464 
25465 static void
25466 sd_mhd_reset_notify_cb(caddr_t arg)
25467 {
25468 	struct sd_lun *un = (struct sd_lun *)arg;
25469 
25470 	mutex_enter(SD_MUTEX(un));
25471 	if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
25472 		un->un_resvd_status |= (SD_LOST_RESERVE | SD_WANT_RESERVE);
25473 		SD_INFO(SD_LOG_IOCTL_MHD, un,
25474 		    "sd_mhd_reset_notify_cb: Lost Reservation\n");
25475 	}
25476 	mutex_exit(SD_MUTEX(un));
25477 }
25478 
25479 
25480 /*
25481  *    Function: sd_take_ownership()
25482  *
25483  * Description: This routine implements an algorithm to achieve a stable
25484  *		reservation on disks which don't implement priority reserve,
25485  *		and makes sure that other host lose re-reservation attempts.
25486  *		This algorithm contains of a loop that keeps issuing the RESERVE
25487  *		for some period of time (min_ownership_delay, default 6 seconds)
25488  *		During that loop, it looks to see if there has been a bus device
25489  *		reset or bus reset (both of which cause an existing reservation
25490  *		to be lost). If the reservation is lost issue RESERVE until a
25491  *		period of min_ownership_delay with no resets has gone by, or
25492  *		until max_ownership_delay has expired. This loop ensures that
25493  *		the host really did manage to reserve the device, in spite of
25494  *		resets. The looping for min_ownership_delay (default six
25495  *		seconds) is important to early generation clustering products,
25496  *		Solstice HA 1.x and Sun Cluster 2.x. Those products use an
25497  *		MHIOCENFAILFAST periodic timer of two seconds. By having
25498  *		MHIOCTKOWN issue Reserves in a loop for six seconds, and having
25499  *		MHIOCENFAILFAST poll every two seconds, the idea is that by the
25500  *		time the MHIOCTKOWN ioctl returns, the other host (if any) will
25501  *		have already noticed, via the MHIOCENFAILFAST polling, that it
25502  *		no longer "owns" the disk and will have panicked itself.  Thus,
25503  *		the host issuing the MHIOCTKOWN is assured (with timing
25504  *		dependencies) that by the time it actually starts to use the
25505  *		disk for real work, the old owner is no longer accessing it.
25506  *
25507  *		min_ownership_delay is the minimum amount of time for which the
25508  *		disk must be reserved continuously devoid of resets before the
25509  *		MHIOCTKOWN ioctl will return success.
25510  *
25511  *		max_ownership_delay indicates the amount of time by which the
25512  *		take ownership should succeed or timeout with an error.
25513  *
25514  *   Arguments: dev - the device 'dev_t'
25515  *		*p  - struct containing timing info.
25516  *
25517  * Return Code: 0 for success or error code
25518  */
25519 
25520 static int
25521 sd_take_ownership(dev_t dev, struct mhioctkown *p)
25522 {
25523 	struct sd_lun	*un;
25524 	int		rval;
25525 	int		err;
25526 	int		reservation_count   = 0;
25527 	int		min_ownership_delay =  6000000; /* in usec */
25528 	int		max_ownership_delay = 30000000; /* in usec */
25529 	clock_t		start_time;	/* starting time of this algorithm */
25530 	clock_t		end_time;	/* time limit for giving up */
25531 	clock_t		ownership_time;	/* time limit for stable ownership */
25532 	clock_t		current_time;
25533 	clock_t		previous_current_time;
25534 
25535 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
25536 		return (ENXIO);
25537 	}
25538 
25539 	/*
25540 	 * Attempt a device reservation. A priority reservation is requested.
25541 	 */
25542 	if ((rval = sd_reserve_release(dev, SD_PRIORITY_RESERVE))
25543 	    != SD_SUCCESS) {
25544 		SD_ERROR(SD_LOG_IOCTL_MHD, un,
25545 		    "sd_take_ownership: return(1)=%d\n", rval);
25546 		return (rval);
25547 	}
25548 
25549 	/* Update the softstate reserved status to indicate the reservation */
25550 	mutex_enter(SD_MUTEX(un));
25551 	un->un_resvd_status |= SD_RESERVE;
25552 	un->un_resvd_status &=
25553 	    ~(SD_LOST_RESERVE | SD_WANT_RESERVE | SD_RESERVATION_CONFLICT);
25554 	mutex_exit(SD_MUTEX(un));
25555 
25556 	if (p != NULL) {
25557 		if (p->min_ownership_delay != 0) {
25558 			min_ownership_delay = p->min_ownership_delay * 1000;
25559 		}
25560 		if (p->max_ownership_delay != 0) {
25561 			max_ownership_delay = p->max_ownership_delay * 1000;
25562 		}
25563 	}
25564 	SD_INFO(SD_LOG_IOCTL_MHD, un,
25565 	    "sd_take_ownership: min, max delays: %d, %d\n",
25566 	    min_ownership_delay, max_ownership_delay);
25567 
25568 	start_time = ddi_get_lbolt();
25569 	current_time	= start_time;
25570 	ownership_time	= current_time + drv_usectohz(min_ownership_delay);
25571 	end_time	= start_time + drv_usectohz(max_ownership_delay);
25572 
25573 	while (current_time - end_time < 0) {
25574 		delay(drv_usectohz(500000));
25575 
25576 		if ((err = sd_reserve_release(dev, SD_RESERVE)) != 0) {
25577 			if ((sd_reserve_release(dev, SD_RESERVE)) != 0) {
25578 				mutex_enter(SD_MUTEX(un));
25579 				rval = (un->un_resvd_status &
25580 				    SD_RESERVATION_CONFLICT) ? EACCES : EIO;
25581 				mutex_exit(SD_MUTEX(un));
25582 				break;
25583 			}
25584 		}
25585 		previous_current_time = current_time;
25586 		current_time = ddi_get_lbolt();
25587 		mutex_enter(SD_MUTEX(un));
25588 		if (err || (un->un_resvd_status & SD_LOST_RESERVE)) {
25589 			ownership_time = ddi_get_lbolt() +
25590 			    drv_usectohz(min_ownership_delay);
25591 			reservation_count = 0;
25592 		} else {
25593 			reservation_count++;
25594 		}
25595 		un->un_resvd_status |= SD_RESERVE;
25596 		un->un_resvd_status &= ~(SD_LOST_RESERVE | SD_WANT_RESERVE);
25597 		mutex_exit(SD_MUTEX(un));
25598 
25599 		SD_INFO(SD_LOG_IOCTL_MHD, un,
25600 		    "sd_take_ownership: ticks for loop iteration=%ld, "
25601 		    "reservation=%s\n", (current_time - previous_current_time),
25602 		    reservation_count ? "ok" : "reclaimed");
25603 
25604 		if (current_time - ownership_time >= 0 &&
25605 		    reservation_count >= 4) {
25606 			rval = 0; /* Achieved a stable ownership */
25607 			break;
25608 		}
25609 		if (current_time - end_time >= 0) {
25610 			rval = EACCES; /* No ownership in max possible time */
25611 			break;
25612 		}
25613 	}
25614 	SD_TRACE(SD_LOG_IOCTL_MHD, un,
25615 	    "sd_take_ownership: return(2)=%d\n", rval);
25616 	return (rval);
25617 }
25618 
25619 
25620 /*
25621  *    Function: sd_reserve_release()
25622  *
25623  * Description: This function builds and sends scsi RESERVE, RELEASE, and
25624  *		PRIORITY RESERVE commands based on a user specified command type
25625  *
25626  *   Arguments: dev - the device 'dev_t'
25627  *		cmd - user specified command type; one of SD_PRIORITY_RESERVE,
25628  *		      SD_RESERVE, SD_RELEASE
25629  *
25630  * Return Code: 0 or Error Code
25631  */
25632 
25633 static int
25634 sd_reserve_release(dev_t dev, int cmd)
25635 {
25636 	struct uscsi_cmd	*com = NULL;
25637 	struct sd_lun		*un = NULL;
25638 	char			cdb[CDB_GROUP0];
25639 	int			rval;
25640 
25641 	ASSERT((cmd == SD_RELEASE) || (cmd == SD_RESERVE) ||
25642 	    (cmd == SD_PRIORITY_RESERVE));
25643 
25644 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
25645 		return (ENXIO);
25646 	}
25647 
25648 	/* instantiate and initialize the command and cdb */
25649 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
25650 	bzero(cdb, CDB_GROUP0);
25651 	com->uscsi_flags   = USCSI_SILENT;
25652 	com->uscsi_timeout = un->un_reserve_release_time;
25653 	com->uscsi_cdblen  = CDB_GROUP0;
25654 	com->uscsi_cdb	   = cdb;
25655 	if (cmd == SD_RELEASE) {
25656 		cdb[0] = SCMD_RELEASE;
25657 	} else {
25658 		cdb[0] = SCMD_RESERVE;
25659 	}
25660 
25661 	/* Send the command. */
25662 	rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
25663 	    SD_PATH_STANDARD);
25664 
25665 	/*
25666 	 * "break" a reservation that is held by another host, by issuing a
25667 	 * reset if priority reserve is desired, and we could not get the
25668 	 * device.
25669 	 */
25670 	if ((cmd == SD_PRIORITY_RESERVE) &&
25671 	    (rval != 0) && (com->uscsi_status == STATUS_RESERVATION_CONFLICT)) {
25672 		/*
25673 		 * First try to reset the LUN. If we cannot, then try a target
25674 		 * reset, followed by a bus reset if the target reset fails.
25675 		 */
25676 		int reset_retval = 0;
25677 		if (un->un_f_lun_reset_enabled == TRUE) {
25678 			reset_retval = scsi_reset(SD_ADDRESS(un), RESET_LUN);
25679 		}
25680 		if (reset_retval == 0) {
25681 			/* The LUN reset either failed or was not issued */
25682 			reset_retval = scsi_reset(SD_ADDRESS(un), RESET_TARGET);
25683 		}
25684 		if ((reset_retval == 0) &&
25685 		    (scsi_reset(SD_ADDRESS(un), RESET_ALL) == 0)) {
25686 			rval = EIO;
25687 			kmem_free(com, sizeof (*com));
25688 			return (rval);
25689 		}
25690 
25691 		bzero(com, sizeof (struct uscsi_cmd));
25692 		com->uscsi_flags   = USCSI_SILENT;
25693 		com->uscsi_cdb	   = cdb;
25694 		com->uscsi_cdblen  = CDB_GROUP0;
25695 		com->uscsi_timeout = 5;
25696 
25697 		/*
25698 		 * Reissue the last reserve command, this time without request
25699 		 * sense.  Assume that it is just a regular reserve command.
25700 		 */
25701 		rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
25702 		    SD_PATH_STANDARD);
25703 	}
25704 
25705 	/* Return an error if still getting a reservation conflict. */
25706 	if ((rval != 0) && (com->uscsi_status == STATUS_RESERVATION_CONFLICT)) {
25707 		rval = EACCES;
25708 	}
25709 
25710 	kmem_free(com, sizeof (*com));
25711 	return (rval);
25712 }
25713 
25714 
25715 #define	SD_NDUMP_RETRIES	12
25716 /*
25717  *	System Crash Dump routine
25718  */
25719 
25720 static int
25721 sddump(dev_t dev, caddr_t addr, daddr_t blkno, int nblk)
25722 {
25723 	int		instance;
25724 	int		partition;
25725 	int		i;
25726 	int		err;
25727 	struct sd_lun	*un;
25728 	struct scsi_pkt *wr_pktp;
25729 	struct buf	*wr_bp;
25730 	struct buf	wr_buf;
25731 	daddr_t		tgt_byte_offset; /* rmw - byte offset for target */
25732 	daddr_t		tgt_blkno;	/* rmw - blkno for target */
25733 	size_t		tgt_byte_count; /* rmw -  # of bytes to xfer */
25734 	size_t		tgt_nblk; /* rmw -  # of tgt blks to xfer */
25735 	size_t		io_start_offset;
25736 	int		doing_rmw = FALSE;
25737 	int		rval;
25738 	ssize_t		dma_resid;
25739 	daddr_t		oblkno;
25740 	diskaddr_t	nblks = 0;
25741 	diskaddr_t	start_block;
25742 
25743 	instance = SDUNIT(dev);
25744 	if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) ||
25745 	    !SD_IS_VALID_LABEL(un) || ISCD(un)) {
25746 		return (ENXIO);
25747 	}
25748 
25749 	_NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*un))
25750 
25751 	SD_TRACE(SD_LOG_DUMP, un, "sddump: entry\n");
25752 
25753 	partition = SDPART(dev);
25754 	SD_INFO(SD_LOG_DUMP, un, "sddump: partition = %d\n", partition);
25755 
25756 	if (!(NOT_DEVBSIZE(un))) {
25757 		int secmask = 0;
25758 		int blknomask = 0;
25759 
25760 		blknomask = (un->un_tgt_blocksize / DEV_BSIZE) - 1;
25761 		secmask = un->un_tgt_blocksize - 1;
25762 
25763 		if (blkno & blknomask) {
25764 			SD_TRACE(SD_LOG_DUMP, un,
25765 			    "sddump: dump start block not modulo %d\n",
25766 			    un->un_tgt_blocksize);
25767 			return (EINVAL);
25768 		}
25769 
25770 		if ((nblk * DEV_BSIZE) & secmask) {
25771 			SD_TRACE(SD_LOG_DUMP, un,
25772 			    "sddump: dump length not modulo %d\n",
25773 			    un->un_tgt_blocksize);
25774 			return (EINVAL);
25775 		}
25776 
25777 	}
25778 
25779 	/* Validate blocks to dump at against partition size. */
25780 
25781 	(void) cmlb_partinfo(un->un_cmlbhandle, partition,
25782 	    &nblks, &start_block, NULL, NULL, (void *)SD_PATH_DIRECT);
25783 
25784 	if (NOT_DEVBSIZE(un)) {
25785 		if ((blkno + nblk) > nblks) {
25786 			SD_TRACE(SD_LOG_DUMP, un,
25787 			    "sddump: dump range larger than partition: "
25788 			    "blkno = 0x%x, nblk = 0x%x, dkl_nblk = 0x%x\n",
25789 			    blkno, nblk, nblks);
25790 			return (EINVAL);
25791 		}
25792 	} else {
25793 		if (((blkno / (un->un_tgt_blocksize / DEV_BSIZE)) +
25794 		    (nblk / (un->un_tgt_blocksize / DEV_BSIZE))) > nblks) {
25795 			SD_TRACE(SD_LOG_DUMP, un,
25796 			    "sddump: dump range larger than partition: "
25797 			    "blkno = 0x%x, nblk = 0x%x, dkl_nblk = 0x%x\n",
25798 			    blkno, nblk, nblks);
25799 			return (EINVAL);
25800 		}
25801 	}
25802 
25803 	mutex_enter(&un->un_pm_mutex);
25804 	if (SD_DEVICE_IS_IN_LOW_POWER(un)) {
25805 		struct scsi_pkt *start_pktp;
25806 
25807 		mutex_exit(&un->un_pm_mutex);
25808 
25809 		/*
25810 		 * use pm framework to power on HBA 1st
25811 		 */
25812 		(void) pm_raise_power(SD_DEVINFO(un), 0,
25813 		    SD_PM_STATE_ACTIVE(un));
25814 
25815 		/*
25816 		 * Dump no long uses sdpower to power on a device, it's
25817 		 * in-line here so it can be done in polled mode.
25818 		 */
25819 
25820 		SD_INFO(SD_LOG_DUMP, un, "sddump: starting device\n");
25821 
25822 		start_pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, NULL,
25823 		    CDB_GROUP0, un->un_status_len, 0, 0, NULL_FUNC, NULL);
25824 
25825 		if (start_pktp == NULL) {
25826 			/* We were not given a SCSI packet, fail. */
25827 			return (EIO);
25828 		}
25829 		bzero(start_pktp->pkt_cdbp, CDB_GROUP0);
25830 		start_pktp->pkt_cdbp[0] = SCMD_START_STOP;
25831 		start_pktp->pkt_cdbp[4] = SD_TARGET_START;
25832 		start_pktp->pkt_flags = FLAG_NOINTR;
25833 
25834 		mutex_enter(SD_MUTEX(un));
25835 		SD_FILL_SCSI1_LUN(un, start_pktp);
25836 		mutex_exit(SD_MUTEX(un));
25837 		/*
25838 		 * Scsi_poll returns 0 (success) if the command completes and
25839 		 * the status block is STATUS_GOOD.
25840 		 */
25841 		if (sd_scsi_poll(un, start_pktp) != 0) {
25842 			scsi_destroy_pkt(start_pktp);
25843 			return (EIO);
25844 		}
25845 		scsi_destroy_pkt(start_pktp);
25846 		(void) sd_pm_state_change(un, SD_PM_STATE_ACTIVE(un),
25847 		    SD_PM_STATE_CHANGE);
25848 	} else {
25849 		mutex_exit(&un->un_pm_mutex);
25850 	}
25851 
25852 	mutex_enter(SD_MUTEX(un));
25853 	un->un_throttle = 0;
25854 
25855 	/*
25856 	 * The first time through, reset the specific target device.
25857 	 * However, when cpr calls sddump we know that sd is in a
25858 	 * a good state so no bus reset is required.
25859 	 * Clear sense data via Request Sense cmd.
25860 	 * In sddump we don't care about allow_bus_device_reset anymore
25861 	 */
25862 
25863 	if ((un->un_state != SD_STATE_SUSPENDED) &&
25864 	    (un->un_state != SD_STATE_DUMPING)) {
25865 
25866 		New_state(un, SD_STATE_DUMPING);
25867 
25868 		if (un->un_f_is_fibre == FALSE) {
25869 			mutex_exit(SD_MUTEX(un));
25870 			/*
25871 			 * Attempt a bus reset for parallel scsi.
25872 			 *
25873 			 * Note: A bus reset is required because on some host
25874 			 * systems (i.e. E420R) a bus device reset is
25875 			 * insufficient to reset the state of the target.
25876 			 *
25877 			 * Note: Don't issue the reset for fibre-channel,
25878 			 * because this tends to hang the bus (loop) for
25879 			 * too long while everyone is logging out and in
25880 			 * and the deadman timer for dumping will fire
25881 			 * before the dump is complete.
25882 			 */
25883 			if (scsi_reset(SD_ADDRESS(un), RESET_ALL) == 0) {
25884 				mutex_enter(SD_MUTEX(un));
25885 				Restore_state(un);
25886 				mutex_exit(SD_MUTEX(un));
25887 				return (EIO);
25888 			}
25889 
25890 			/* Delay to give the device some recovery time. */
25891 			drv_usecwait(10000);
25892 
25893 			if (sd_send_polled_RQS(un) == SD_FAILURE) {
25894 				SD_INFO(SD_LOG_DUMP, un,
25895 				    "sddump: sd_send_polled_RQS failed\n");
25896 			}
25897 			mutex_enter(SD_MUTEX(un));
25898 		}
25899 	}
25900 
25901 	/*
25902 	 * Convert the partition-relative block number to a
25903 	 * disk physical block number.
25904 	 */
25905 	if (NOT_DEVBSIZE(un)) {
25906 		blkno += start_block;
25907 	} else {
25908 		blkno = blkno / (un->un_tgt_blocksize / DEV_BSIZE);
25909 		blkno += start_block;
25910 	}
25911 
25912 	SD_INFO(SD_LOG_DUMP, un, "sddump: disk blkno = 0x%x\n", blkno);
25913 
25914 
25915 	/*
25916 	 * Check if the device has a non-512 block size.
25917 	 */
25918 	wr_bp = NULL;
25919 	if (NOT_DEVBSIZE(un)) {
25920 		tgt_byte_offset = blkno * un->un_sys_blocksize;
25921 		tgt_byte_count = nblk * un->un_sys_blocksize;
25922 		if ((tgt_byte_offset % un->un_tgt_blocksize) ||
25923 		    (tgt_byte_count % un->un_tgt_blocksize)) {
25924 			doing_rmw = TRUE;
25925 			/*
25926 			 * Calculate the block number and number of block
25927 			 * in terms of the media block size.
25928 			 */
25929 			tgt_blkno = tgt_byte_offset / un->un_tgt_blocksize;
25930 			tgt_nblk =
25931 			    ((tgt_byte_offset + tgt_byte_count +
25932 			    (un->un_tgt_blocksize - 1)) /
25933 			    un->un_tgt_blocksize) - tgt_blkno;
25934 
25935 			/*
25936 			 * Invoke the routine which is going to do read part
25937 			 * of read-modify-write.
25938 			 * Note that this routine returns a pointer to
25939 			 * a valid bp in wr_bp.
25940 			 */
25941 			err = sddump_do_read_of_rmw(un, tgt_blkno, tgt_nblk,
25942 			    &wr_bp);
25943 			if (err) {
25944 				mutex_exit(SD_MUTEX(un));
25945 				return (err);
25946 			}
25947 			/*
25948 			 * Offset is being calculated as -
25949 			 * (original block # * system block size) -
25950 			 * (new block # * target block size)
25951 			 */
25952 			io_start_offset =
25953 			    ((uint64_t)(blkno * un->un_sys_blocksize)) -
25954 			    ((uint64_t)(tgt_blkno * un->un_tgt_blocksize));
25955 
25956 			ASSERT(io_start_offset < un->un_tgt_blocksize);
25957 			/*
25958 			 * Do the modify portion of read modify write.
25959 			 */
25960 			bcopy(addr, &wr_bp->b_un.b_addr[io_start_offset],
25961 			    (size_t)nblk * un->un_sys_blocksize);
25962 		} else {
25963 			doing_rmw = FALSE;
25964 			tgt_blkno = tgt_byte_offset / un->un_tgt_blocksize;
25965 			tgt_nblk = tgt_byte_count / un->un_tgt_blocksize;
25966 		}
25967 
25968 		/* Convert blkno and nblk to target blocks */
25969 		blkno = tgt_blkno;
25970 		nblk = tgt_nblk;
25971 	} else {
25972 		wr_bp = &wr_buf;
25973 		bzero(wr_bp, sizeof (struct buf));
25974 		wr_bp->b_flags		= B_BUSY;
25975 		wr_bp->b_un.b_addr	= addr;
25976 		wr_bp->b_bcount		= nblk << DEV_BSHIFT;
25977 		wr_bp->b_resid		= 0;
25978 	}
25979 
25980 	mutex_exit(SD_MUTEX(un));
25981 
25982 	/*
25983 	 * Obtain a SCSI packet for the write command.
25984 	 * It should be safe to call the allocator here without
25985 	 * worrying about being locked for DVMA mapping because
25986 	 * the address we're passed is already a DVMA mapping
25987 	 *
25988 	 * We are also not going to worry about semaphore ownership
25989 	 * in the dump buffer. Dumping is single threaded at present.
25990 	 */
25991 
25992 	wr_pktp = NULL;
25993 
25994 	dma_resid = wr_bp->b_bcount;
25995 	oblkno = blkno;
25996 
25997 	if (!(NOT_DEVBSIZE(un))) {
25998 		nblk = nblk / (un->un_tgt_blocksize / DEV_BSIZE);
25999 	}
26000 
26001 	while (dma_resid != 0) {
26002 
26003 	for (i = 0; i < SD_NDUMP_RETRIES; i++) {
26004 		wr_bp->b_flags &= ~B_ERROR;
26005 
26006 		if (un->un_partial_dma_supported == 1) {
26007 			blkno = oblkno +
26008 			    ((wr_bp->b_bcount - dma_resid) /
26009 			    un->un_tgt_blocksize);
26010 			nblk = dma_resid / un->un_tgt_blocksize;
26011 
26012 			if (wr_pktp) {
26013 				/*
26014 				 * Partial DMA transfers after initial transfer
26015 				 */
26016 				rval = sd_setup_next_rw_pkt(un, wr_pktp, wr_bp,
26017 				    blkno, nblk);
26018 			} else {
26019 				/* Initial transfer */
26020 				rval = sd_setup_rw_pkt(un, &wr_pktp, wr_bp,
26021 				    un->un_pkt_flags, NULL_FUNC, NULL,
26022 				    blkno, nblk);
26023 			}
26024 		} else {
26025 			rval = sd_setup_rw_pkt(un, &wr_pktp, wr_bp,
26026 			    0, NULL_FUNC, NULL, blkno, nblk);
26027 		}
26028 
26029 		if (rval == 0) {
26030 			/* We were given a SCSI packet, continue. */
26031 			break;
26032 		}
26033 
26034 		if (i == 0) {
26035 			if (wr_bp->b_flags & B_ERROR) {
26036 				scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26037 				    "no resources for dumping; "
26038 				    "error code: 0x%x, retrying",
26039 				    geterror(wr_bp));
26040 			} else {
26041 				scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26042 				    "no resources for dumping; retrying");
26043 			}
26044 		} else if (i != (SD_NDUMP_RETRIES - 1)) {
26045 			if (wr_bp->b_flags & B_ERROR) {
26046 				scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
26047 				    "no resources for dumping; error code: "
26048 				    "0x%x, retrying\n", geterror(wr_bp));
26049 			}
26050 		} else {
26051 			if (wr_bp->b_flags & B_ERROR) {
26052 				scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
26053 				    "no resources for dumping; "
26054 				    "error code: 0x%x, retries failed, "
26055 				    "giving up.\n", geterror(wr_bp));
26056 			} else {
26057 				scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
26058 				    "no resources for dumping; "
26059 				    "retries failed, giving up.\n");
26060 			}
26061 			mutex_enter(SD_MUTEX(un));
26062 			Restore_state(un);
26063 			if (NOT_DEVBSIZE(un) && (doing_rmw == TRUE)) {
26064 				mutex_exit(SD_MUTEX(un));
26065 				scsi_free_consistent_buf(wr_bp);
26066 			} else {
26067 				mutex_exit(SD_MUTEX(un));
26068 			}
26069 			return (EIO);
26070 		}
26071 		drv_usecwait(10000);
26072 	}
26073 
26074 	if (un->un_partial_dma_supported == 1) {
26075 		/*
26076 		 * save the resid from PARTIAL_DMA
26077 		 */
26078 		dma_resid = wr_pktp->pkt_resid;
26079 		if (dma_resid != 0)
26080 			nblk -= SD_BYTES2TGTBLOCKS(un, dma_resid);
26081 		wr_pktp->pkt_resid = 0;
26082 	} else {
26083 		dma_resid = 0;
26084 	}
26085 
26086 	/* SunBug 1222170 */
26087 	wr_pktp->pkt_flags = FLAG_NOINTR;
26088 
26089 	err = EIO;
26090 	for (i = 0; i < SD_NDUMP_RETRIES; i++) {
26091 
26092 		/*
26093 		 * Scsi_poll returns 0 (success) if the command completes and
26094 		 * the status block is STATUS_GOOD.  We should only check
26095 		 * errors if this condition is not true.  Even then we should
26096 		 * send our own request sense packet only if we have a check
26097 		 * condition and auto request sense has not been performed by
26098 		 * the hba.
26099 		 */
26100 		SD_TRACE(SD_LOG_DUMP, un, "sddump: sending write\n");
26101 
26102 		if ((sd_scsi_poll(un, wr_pktp) == 0) &&
26103 		    (wr_pktp->pkt_resid == 0)) {
26104 			err = SD_SUCCESS;
26105 			break;
26106 		}
26107 
26108 		/*
26109 		 * Check CMD_DEV_GONE 1st, give up if device is gone.
26110 		 */
26111 		if (wr_pktp->pkt_reason == CMD_DEV_GONE) {
26112 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26113 			    "Error while dumping state...Device is gone\n");
26114 			break;
26115 		}
26116 
26117 		if (SD_GET_PKT_STATUS(wr_pktp) == STATUS_CHECK) {
26118 			SD_INFO(SD_LOG_DUMP, un,
26119 			    "sddump: write failed with CHECK, try # %d\n", i);
26120 			if (((wr_pktp->pkt_state & STATE_ARQ_DONE) == 0)) {
26121 				(void) sd_send_polled_RQS(un);
26122 			}
26123 
26124 			continue;
26125 		}
26126 
26127 		if (SD_GET_PKT_STATUS(wr_pktp) == STATUS_BUSY) {
26128 			int reset_retval = 0;
26129 
26130 			SD_INFO(SD_LOG_DUMP, un,
26131 			    "sddump: write failed with BUSY, try # %d\n", i);
26132 
26133 			if (un->un_f_lun_reset_enabled == TRUE) {
26134 				reset_retval = scsi_reset(SD_ADDRESS(un),
26135 				    RESET_LUN);
26136 			}
26137 			if (reset_retval == 0) {
26138 				(void) scsi_reset(SD_ADDRESS(un), RESET_TARGET);
26139 			}
26140 			(void) sd_send_polled_RQS(un);
26141 
26142 		} else {
26143 			SD_INFO(SD_LOG_DUMP, un,
26144 			    "sddump: write failed with 0x%x, try # %d\n",
26145 			    SD_GET_PKT_STATUS(wr_pktp), i);
26146 			mutex_enter(SD_MUTEX(un));
26147 			sd_reset_target(un, wr_pktp);
26148 			mutex_exit(SD_MUTEX(un));
26149 		}
26150 
26151 		/*
26152 		 * If we are not getting anywhere with lun/target resets,
26153 		 * let's reset the bus.
26154 		 */
26155 		if (i == SD_NDUMP_RETRIES/2) {
26156 			(void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
26157 			(void) sd_send_polled_RQS(un);
26158 		}
26159 	}
26160 	}
26161 
26162 	scsi_destroy_pkt(wr_pktp);
26163 	mutex_enter(SD_MUTEX(un));
26164 	if ((NOT_DEVBSIZE(un)) && (doing_rmw == TRUE)) {
26165 		mutex_exit(SD_MUTEX(un));
26166 		scsi_free_consistent_buf(wr_bp);
26167 	} else {
26168 		mutex_exit(SD_MUTEX(un));
26169 	}
26170 	SD_TRACE(SD_LOG_DUMP, un, "sddump: exit: err = %d\n", err);
26171 	return (err);
26172 }
26173 
26174 /*
26175  *    Function: sd_scsi_poll()
26176  *
26177  * Description: This is a wrapper for the scsi_poll call.
26178  *
26179  *   Arguments: sd_lun - The unit structure
26180  *              scsi_pkt - The scsi packet being sent to the device.
26181  *
26182  * Return Code: 0 - Command completed successfully with good status
26183  *             -1 - Command failed.  This could indicate a check condition
26184  *                  or other status value requiring recovery action.
26185  *
26186  * NOTE: This code is only called off sddump().
26187  */
26188 
26189 static int
26190 sd_scsi_poll(struct sd_lun *un, struct scsi_pkt *pktp)
26191 {
26192 	int status;
26193 
26194 	ASSERT(un != NULL);
26195 	ASSERT(!mutex_owned(SD_MUTEX(un)));
26196 	ASSERT(pktp != NULL);
26197 
26198 	status = SD_SUCCESS;
26199 
26200 	if (scsi_ifgetcap(&pktp->pkt_address, "tagged-qing", 1) == 1) {
26201 		pktp->pkt_flags |= un->un_tagflags;
26202 		pktp->pkt_flags &= ~FLAG_NODISCON;
26203 	}
26204 
26205 	status = sd_ddi_scsi_poll(pktp);
26206 	/*
26207 	 * Scsi_poll returns 0 (success) if the command completes and the
26208 	 * status block is STATUS_GOOD.  We should only check errors if this
26209 	 * condition is not true.  Even then we should send our own request
26210 	 * sense packet only if we have a check condition and auto
26211 	 * request sense has not been performed by the hba.
26212 	 * Don't get RQS data if pkt_reason is CMD_DEV_GONE.
26213 	 */
26214 	if ((status != SD_SUCCESS) &&
26215 	    (SD_GET_PKT_STATUS(pktp) == STATUS_CHECK) &&
26216 	    (pktp->pkt_state & STATE_ARQ_DONE) == 0 &&
26217 	    (pktp->pkt_reason != CMD_DEV_GONE))
26218 		(void) sd_send_polled_RQS(un);
26219 
26220 	return (status);
26221 }
26222 
26223 /*
26224  *    Function: sd_send_polled_RQS()
26225  *
26226  * Description: This sends the request sense command to a device.
26227  *
26228  *   Arguments: sd_lun - The unit structure
26229  *
26230  * Return Code: 0 - Command completed successfully with good status
26231  *             -1 - Command failed.
26232  *
26233  */
26234 
26235 static int
26236 sd_send_polled_RQS(struct sd_lun *un)
26237 {
26238 	int	ret_val;
26239 	struct	scsi_pkt	*rqs_pktp;
26240 	struct	buf		*rqs_bp;
26241 
26242 	ASSERT(un != NULL);
26243 	ASSERT(!mutex_owned(SD_MUTEX(un)));
26244 
26245 	ret_val = SD_SUCCESS;
26246 
26247 	rqs_pktp = un->un_rqs_pktp;
26248 	rqs_bp	 = un->un_rqs_bp;
26249 
26250 	mutex_enter(SD_MUTEX(un));
26251 
26252 	if (un->un_sense_isbusy) {
26253 		ret_val = SD_FAILURE;
26254 		mutex_exit(SD_MUTEX(un));
26255 		return (ret_val);
26256 	}
26257 
26258 	/*
26259 	 * If the request sense buffer (and packet) is not in use,
26260 	 * let's set the un_sense_isbusy and send our packet
26261 	 */
26262 	un->un_sense_isbusy 	= 1;
26263 	rqs_pktp->pkt_resid  	= 0;
26264 	rqs_pktp->pkt_reason 	= 0;
26265 	rqs_pktp->pkt_flags |= FLAG_NOINTR;
26266 	bzero(rqs_bp->b_un.b_addr, SENSE_LENGTH);
26267 
26268 	mutex_exit(SD_MUTEX(un));
26269 
26270 	SD_INFO(SD_LOG_COMMON, un, "sd_send_polled_RQS: req sense buf at"
26271 	    " 0x%p\n", rqs_bp->b_un.b_addr);
26272 
26273 	/*
26274 	 * Can't send this to sd_scsi_poll, we wrap ourselves around the
26275 	 * axle - it has a call into us!
26276 	 */
26277 	if ((ret_val = sd_ddi_scsi_poll(rqs_pktp)) != 0) {
26278 		SD_INFO(SD_LOG_COMMON, un,
26279 		    "sd_send_polled_RQS: RQS failed\n");
26280 	}
26281 
26282 	SD_DUMP_MEMORY(un, SD_LOG_COMMON, "sd_send_polled_RQS:",
26283 	    (uchar_t *)rqs_bp->b_un.b_addr, SENSE_LENGTH, SD_LOG_HEX);
26284 
26285 	mutex_enter(SD_MUTEX(un));
26286 	un->un_sense_isbusy = 0;
26287 	mutex_exit(SD_MUTEX(un));
26288 
26289 	return (ret_val);
26290 }
26291 
26292 /*
26293  * Defines needed for localized version of the scsi_poll routine.
26294  */
26295 #define	CSEC		10000			/* usecs */
26296 #define	SEC_TO_CSEC	(1000000/CSEC)
26297 
26298 /*
26299  *    Function: sd_ddi_scsi_poll()
26300  *
26301  * Description: Localized version of the scsi_poll routine.  The purpose is to
26302  *		send a scsi_pkt to a device as a polled command.  This version
26303  *		is to ensure more robust handling of transport errors.
26304  *		Specifically this routine cures not ready, coming ready
26305  *		transition for power up and reset of sonoma's.  This can take
26306  *		up to 45 seconds for power-on and 20 seconds for reset of a
26307  * 		sonoma lun.
26308  *
26309  *   Arguments: scsi_pkt - The scsi_pkt being sent to a device
26310  *
26311  * Return Code: 0 - Command completed successfully with good status
26312  *             -1 - Command failed.
26313  *
26314  * NOTE: This code is almost identical to scsi_poll, however before 6668774 can
26315  * be fixed (removing this code), we need to determine how to handle the
26316  * KEY_UNIT_ATTENTION condition below in conditions not as limited as sddump().
26317  *
26318  * NOTE: This code is only called off sddump().
26319  */
26320 static int
26321 sd_ddi_scsi_poll(struct scsi_pkt *pkt)
26322 {
26323 	int			rval = -1;
26324 	int			savef;
26325 	long			savet;
26326 	void			(*savec)();
26327 	int			timeout;
26328 	int			busy_count;
26329 	int			poll_delay;
26330 	int			rc;
26331 	uint8_t			*sensep;
26332 	struct scsi_arq_status	*arqstat;
26333 	extern int		do_polled_io;
26334 
26335 	ASSERT(pkt->pkt_scbp);
26336 
26337 	/*
26338 	 * save old flags..
26339 	 */
26340 	savef = pkt->pkt_flags;
26341 	savec = pkt->pkt_comp;
26342 	savet = pkt->pkt_time;
26343 
26344 	pkt->pkt_flags |= FLAG_NOINTR;
26345 
26346 	/*
26347 	 * XXX there is nothing in the SCSA spec that states that we should not
26348 	 * do a callback for polled cmds; however, removing this will break sd
26349 	 * and probably other target drivers
26350 	 */
26351 	pkt->pkt_comp = NULL;
26352 
26353 	/*
26354 	 * we don't like a polled command without timeout.
26355 	 * 60 seconds seems long enough.
26356 	 */
26357 	if (pkt->pkt_time == 0)
26358 		pkt->pkt_time = SCSI_POLL_TIMEOUT;
26359 
26360 	/*
26361 	 * Send polled cmd.
26362 	 *
26363 	 * We do some error recovery for various errors.  Tran_busy,
26364 	 * queue full, and non-dispatched commands are retried every 10 msec.
26365 	 * as they are typically transient failures.  Busy status and Not
26366 	 * Ready are retried every second as this status takes a while to
26367 	 * change.
26368 	 */
26369 	timeout = pkt->pkt_time * SEC_TO_CSEC;
26370 
26371 	for (busy_count = 0; busy_count < timeout; busy_count++) {
26372 		/*
26373 		 * Initialize pkt status variables.
26374 		 */
26375 		*pkt->pkt_scbp = pkt->pkt_reason = pkt->pkt_state = 0;
26376 
26377 		if ((rc = scsi_transport(pkt)) != TRAN_ACCEPT) {
26378 			if (rc != TRAN_BUSY) {
26379 				/* Transport failed - give up. */
26380 				break;
26381 			} else {
26382 				/* Transport busy - try again. */
26383 				poll_delay = 1 * CSEC;		/* 10 msec. */
26384 			}
26385 		} else {
26386 			/*
26387 			 * Transport accepted - check pkt status.
26388 			 */
26389 			rc = (*pkt->pkt_scbp) & STATUS_MASK;
26390 			if ((pkt->pkt_reason == CMD_CMPLT) &&
26391 			    (rc == STATUS_CHECK) &&
26392 			    (pkt->pkt_state & STATE_ARQ_DONE)) {
26393 				arqstat =
26394 				    (struct scsi_arq_status *)(pkt->pkt_scbp);
26395 				sensep = (uint8_t *)&arqstat->sts_sensedata;
26396 			} else {
26397 				sensep = NULL;
26398 			}
26399 
26400 			if ((pkt->pkt_reason == CMD_CMPLT) &&
26401 			    (rc == STATUS_GOOD)) {
26402 				/* No error - we're done */
26403 				rval = 0;
26404 				break;
26405 
26406 			} else if (pkt->pkt_reason == CMD_DEV_GONE) {
26407 				/* Lost connection - give up */
26408 				break;
26409 
26410 			} else if ((pkt->pkt_reason == CMD_INCOMPLETE) &&
26411 			    (pkt->pkt_state == 0)) {
26412 				/* Pkt not dispatched - try again. */
26413 				poll_delay = 1 * CSEC;		/* 10 msec. */
26414 
26415 			} else if ((pkt->pkt_reason == CMD_CMPLT) &&
26416 			    (rc == STATUS_QFULL)) {
26417 				/* Queue full - try again. */
26418 				poll_delay = 1 * CSEC;		/* 10 msec. */
26419 
26420 			} else if ((pkt->pkt_reason == CMD_CMPLT) &&
26421 			    (rc == STATUS_BUSY)) {
26422 				/* Busy - try again. */
26423 				poll_delay = 100 * CSEC;	/* 1 sec. */
26424 				busy_count += (SEC_TO_CSEC - 1);
26425 
26426 			} else if ((sensep != NULL) &&
26427 			    (scsi_sense_key(sensep) == KEY_UNIT_ATTENTION)) {
26428 				/*
26429 				 * Unit Attention - try again.
26430 				 * Pretend it took 1 sec.
26431 				 * NOTE: 'continue' avoids poll_delay
26432 				 */
26433 				busy_count += (SEC_TO_CSEC - 1);
26434 				continue;
26435 
26436 			} else if ((sensep != NULL) &&
26437 			    (scsi_sense_key(sensep) == KEY_NOT_READY) &&
26438 			    (scsi_sense_asc(sensep) == 0x04) &&
26439 			    (scsi_sense_ascq(sensep) == 0x01)) {
26440 				/*
26441 				 * Not ready -> ready - try again.
26442 				 * 04h/01h: LUN IS IN PROCESS OF BECOMING READY
26443 				 * ...same as STATUS_BUSY
26444 				 */
26445 				poll_delay = 100 * CSEC;	/* 1 sec. */
26446 				busy_count += (SEC_TO_CSEC - 1);
26447 
26448 			} else {
26449 				/* BAD status - give up. */
26450 				break;
26451 			}
26452 		}
26453 
26454 		if (((curthread->t_flag & T_INTR_THREAD) == 0) &&
26455 		    !do_polled_io) {
26456 			delay(drv_usectohz(poll_delay));
26457 		} else {
26458 			/* we busy wait during cpr_dump or interrupt threads */
26459 			drv_usecwait(poll_delay);
26460 		}
26461 	}
26462 
26463 	pkt->pkt_flags = savef;
26464 	pkt->pkt_comp = savec;
26465 	pkt->pkt_time = savet;
26466 
26467 	/* return on error */
26468 	if (rval)
26469 		return (rval);
26470 
26471 	/*
26472 	 * This is not a performance critical code path.
26473 	 *
26474 	 * As an accommodation for scsi_poll callers, to avoid ddi_dma_sync()
26475 	 * issues associated with looking at DMA memory prior to
26476 	 * scsi_pkt_destroy(), we scsi_sync_pkt() prior to return.
26477 	 */
26478 	scsi_sync_pkt(pkt);
26479 	return (0);
26480 }
26481 
26482 
26483 
26484 /*
26485  *    Function: sd_persistent_reservation_in_read_keys
26486  *
26487  * Description: This routine is the driver entry point for handling CD-ROM
26488  *		multi-host persistent reservation requests (MHIOCGRP_INKEYS)
26489  *		by sending the SCSI-3 PRIN commands to the device.
26490  *		Processes the read keys command response by copying the
26491  *		reservation key information into the user provided buffer.
26492  *		Support for the 32/64 bit _MULTI_DATAMODEL is implemented.
26493  *
26494  *   Arguments: un   -  Pointer to soft state struct for the target.
26495  *		usrp -	user provided pointer to multihost Persistent In Read
26496  *			Keys structure (mhioc_inkeys_t)
26497  *		flag -	this argument is a pass through to ddi_copyxxx()
26498  *			directly from the mode argument of ioctl().
26499  *
26500  * Return Code: 0   - Success
26501  *		EACCES
26502  *		ENOTSUP
26503  *		errno return code from sd_send_scsi_cmd()
26504  *
26505  *     Context: Can sleep. Does not return until command is completed.
26506  */
26507 
26508 static int
26509 sd_persistent_reservation_in_read_keys(struct sd_lun *un,
26510     mhioc_inkeys_t *usrp, int flag)
26511 {
26512 #ifdef _MULTI_DATAMODEL
26513 	struct mhioc_key_list32	li32;
26514 #endif
26515 	sd_prin_readkeys_t	*in;
26516 	mhioc_inkeys_t		*ptr;
26517 	mhioc_key_list_t	li;
26518 	uchar_t			*data_bufp = NULL;
26519 	int 			data_len = 0;
26520 	int			rval = 0;
26521 	size_t			copysz = 0;
26522 	sd_ssc_t		*ssc;
26523 
26524 	if ((ptr = (mhioc_inkeys_t *)usrp) == NULL) {
26525 		return (EINVAL);
26526 	}
26527 	bzero(&li, sizeof (mhioc_key_list_t));
26528 
26529 	ssc = sd_ssc_init(un);
26530 
26531 	/*
26532 	 * Get the listsize from user
26533 	 */
26534 #ifdef _MULTI_DATAMODEL
26535 	switch (ddi_model_convert_from(flag & FMODELS)) {
26536 	case DDI_MODEL_ILP32:
26537 		copysz = sizeof (struct mhioc_key_list32);
26538 		if (ddi_copyin(ptr->li, &li32, copysz, flag)) {
26539 			SD_ERROR(SD_LOG_IOCTL_MHD, un,
26540 			    "sd_persistent_reservation_in_read_keys: "
26541 			    "failed ddi_copyin: mhioc_key_list32_t\n");
26542 			rval = EFAULT;
26543 			goto done;
26544 		}
26545 		li.listsize = li32.listsize;
26546 		li.list = (mhioc_resv_key_t *)(uintptr_t)li32.list;
26547 		break;
26548 
26549 	case DDI_MODEL_NONE:
26550 		copysz = sizeof (mhioc_key_list_t);
26551 		if (ddi_copyin(ptr->li, &li, copysz, flag)) {
26552 			SD_ERROR(SD_LOG_IOCTL_MHD, un,
26553 			    "sd_persistent_reservation_in_read_keys: "
26554 			    "failed ddi_copyin: mhioc_key_list_t\n");
26555 			rval = EFAULT;
26556 			goto done;
26557 		}
26558 		break;
26559 	}
26560 
26561 #else /* ! _MULTI_DATAMODEL */
26562 	copysz = sizeof (mhioc_key_list_t);
26563 	if (ddi_copyin(ptr->li, &li, copysz, flag)) {
26564 		SD_ERROR(SD_LOG_IOCTL_MHD, un,
26565 		    "sd_persistent_reservation_in_read_keys: "
26566 		    "failed ddi_copyin: mhioc_key_list_t\n");
26567 		rval = EFAULT;
26568 		goto done;
26569 	}
26570 #endif
26571 
26572 	data_len  = li.listsize * MHIOC_RESV_KEY_SIZE;
26573 	data_len += (sizeof (sd_prin_readkeys_t) - sizeof (caddr_t));
26574 	data_bufp = kmem_zalloc(data_len, KM_SLEEP);
26575 
26576 	rval = sd_send_scsi_PERSISTENT_RESERVE_IN(ssc, SD_READ_KEYS,
26577 	    data_len, data_bufp);
26578 	if (rval != 0) {
26579 		if (rval == EIO)
26580 			sd_ssc_assessment(ssc, SD_FMT_IGNORE_COMPROMISE);
26581 		else
26582 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
26583 		goto done;
26584 	}
26585 	in = (sd_prin_readkeys_t *)data_bufp;
26586 	ptr->generation = BE_32(in->generation);
26587 	li.listlen = BE_32(in->len) / MHIOC_RESV_KEY_SIZE;
26588 
26589 	/*
26590 	 * Return the min(listsize, listlen) keys
26591 	 */
26592 #ifdef _MULTI_DATAMODEL
26593 
26594 	switch (ddi_model_convert_from(flag & FMODELS)) {
26595 	case DDI_MODEL_ILP32:
26596 		li32.listlen = li.listlen;
26597 		if (ddi_copyout(&li32, ptr->li, copysz, flag)) {
26598 			SD_ERROR(SD_LOG_IOCTL_MHD, un,
26599 			    "sd_persistent_reservation_in_read_keys: "
26600 			    "failed ddi_copyout: mhioc_key_list32_t\n");
26601 			rval = EFAULT;
26602 			goto done;
26603 		}
26604 		break;
26605 
26606 	case DDI_MODEL_NONE:
26607 		if (ddi_copyout(&li, ptr->li, copysz, flag)) {
26608 			SD_ERROR(SD_LOG_IOCTL_MHD, un,
26609 			    "sd_persistent_reservation_in_read_keys: "
26610 			    "failed ddi_copyout: mhioc_key_list_t\n");
26611 			rval = EFAULT;
26612 			goto done;
26613 		}
26614 		break;
26615 	}
26616 
26617 #else /* ! _MULTI_DATAMODEL */
26618 
26619 	if (ddi_copyout(&li, ptr->li, copysz, flag)) {
26620 		SD_ERROR(SD_LOG_IOCTL_MHD, un,
26621 		    "sd_persistent_reservation_in_read_keys: "
26622 		    "failed ddi_copyout: mhioc_key_list_t\n");
26623 		rval = EFAULT;
26624 		goto done;
26625 	}
26626 
26627 #endif /* _MULTI_DATAMODEL */
26628 
26629 	copysz = min(li.listlen * MHIOC_RESV_KEY_SIZE,
26630 	    li.listsize * MHIOC_RESV_KEY_SIZE);
26631 	if (ddi_copyout(&in->keylist, li.list, copysz, flag)) {
26632 		SD_ERROR(SD_LOG_IOCTL_MHD, un,
26633 		    "sd_persistent_reservation_in_read_keys: "
26634 		    "failed ddi_copyout: keylist\n");
26635 		rval = EFAULT;
26636 	}
26637 done:
26638 	sd_ssc_fini(ssc);
26639 	kmem_free(data_bufp, data_len);
26640 	return (rval);
26641 }
26642 
26643 
26644 /*
26645  *    Function: sd_persistent_reservation_in_read_resv
26646  *
26647  * Description: This routine is the driver entry point for handling CD-ROM
26648  *		multi-host persistent reservation requests (MHIOCGRP_INRESV)
26649  *		by sending the SCSI-3 PRIN commands to the device.
26650  *		Process the read persistent reservations command response by
26651  *		copying the reservation information into the user provided
26652  *		buffer. Support for the 32/64 _MULTI_DATAMODEL is implemented.
26653  *
26654  *   Arguments: un   -  Pointer to soft state struct for the target.
26655  *		usrp -	user provided pointer to multihost Persistent In Read
26656  *			Keys structure (mhioc_inkeys_t)
26657  *		flag -	this argument is a pass through to ddi_copyxxx()
26658  *			directly from the mode argument of ioctl().
26659  *
26660  * Return Code: 0   - Success
26661  *		EACCES
26662  *		ENOTSUP
26663  *		errno return code from sd_send_scsi_cmd()
26664  *
26665  *     Context: Can sleep. Does not return until command is completed.
26666  */
26667 
26668 static int
26669 sd_persistent_reservation_in_read_resv(struct sd_lun *un,
26670     mhioc_inresvs_t *usrp, int flag)
26671 {
26672 #ifdef _MULTI_DATAMODEL
26673 	struct mhioc_resv_desc_list32 resvlist32;
26674 #endif
26675 	sd_prin_readresv_t	*in;
26676 	mhioc_inresvs_t		*ptr;
26677 	sd_readresv_desc_t	*readresv_ptr;
26678 	mhioc_resv_desc_list_t	resvlist;
26679 	mhioc_resv_desc_t 	resvdesc;
26680 	uchar_t			*data_bufp = NULL;
26681 	int 			data_len;
26682 	int			rval = 0;
26683 	int			i;
26684 	size_t			copysz = 0;
26685 	mhioc_resv_desc_t	*bufp;
26686 	sd_ssc_t		*ssc;
26687 
26688 	if ((ptr = usrp) == NULL) {
26689 		return (EINVAL);
26690 	}
26691 
26692 	ssc = sd_ssc_init(un);
26693 
26694 	/*
26695 	 * Get the listsize from user
26696 	 */
26697 #ifdef _MULTI_DATAMODEL
26698 	switch (ddi_model_convert_from(flag & FMODELS)) {
26699 	case DDI_MODEL_ILP32:
26700 		copysz = sizeof (struct mhioc_resv_desc_list32);
26701 		if (ddi_copyin(ptr->li, &resvlist32, copysz, flag)) {
26702 			SD_ERROR(SD_LOG_IOCTL_MHD, un,
26703 			    "sd_persistent_reservation_in_read_resv: "
26704 			    "failed ddi_copyin: mhioc_resv_desc_list_t\n");
26705 			rval = EFAULT;
26706 			goto done;
26707 		}
26708 		resvlist.listsize = resvlist32.listsize;
26709 		resvlist.list = (mhioc_resv_desc_t *)(uintptr_t)resvlist32.list;
26710 		break;
26711 
26712 	case DDI_MODEL_NONE:
26713 		copysz = sizeof (mhioc_resv_desc_list_t);
26714 		if (ddi_copyin(ptr->li, &resvlist, copysz, flag)) {
26715 			SD_ERROR(SD_LOG_IOCTL_MHD, un,
26716 			    "sd_persistent_reservation_in_read_resv: "
26717 			    "failed ddi_copyin: mhioc_resv_desc_list_t\n");
26718 			rval = EFAULT;
26719 			goto done;
26720 		}
26721 		break;
26722 	}
26723 #else /* ! _MULTI_DATAMODEL */
26724 	copysz = sizeof (mhioc_resv_desc_list_t);
26725 	if (ddi_copyin(ptr->li, &resvlist, copysz, flag)) {
26726 		SD_ERROR(SD_LOG_IOCTL_MHD, un,
26727 		    "sd_persistent_reservation_in_read_resv: "
26728 		    "failed ddi_copyin: mhioc_resv_desc_list_t\n");
26729 		rval = EFAULT;
26730 		goto done;
26731 	}
26732 #endif /* ! _MULTI_DATAMODEL */
26733 
26734 	data_len  = resvlist.listsize * SCSI3_RESV_DESC_LEN;
26735 	data_len += (sizeof (sd_prin_readresv_t) - sizeof (caddr_t));
26736 	data_bufp = kmem_zalloc(data_len, KM_SLEEP);
26737 
26738 	rval = sd_send_scsi_PERSISTENT_RESERVE_IN(ssc, SD_READ_RESV,
26739 	    data_len, data_bufp);
26740 	if (rval != 0) {
26741 		if (rval == EIO)
26742 			sd_ssc_assessment(ssc, SD_FMT_IGNORE_COMPROMISE);
26743 		else
26744 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
26745 		goto done;
26746 	}
26747 	in = (sd_prin_readresv_t *)data_bufp;
26748 	ptr->generation = BE_32(in->generation);
26749 	resvlist.listlen = BE_32(in->len) / SCSI3_RESV_DESC_LEN;
26750 
26751 	/*
26752 	 * Return the min(listsize, listlen( keys
26753 	 */
26754 #ifdef _MULTI_DATAMODEL
26755 
26756 	switch (ddi_model_convert_from(flag & FMODELS)) {
26757 	case DDI_MODEL_ILP32:
26758 		resvlist32.listlen = resvlist.listlen;
26759 		if (ddi_copyout(&resvlist32, ptr->li, copysz, flag)) {
26760 			SD_ERROR(SD_LOG_IOCTL_MHD, un,
26761 			    "sd_persistent_reservation_in_read_resv: "
26762 			    "failed ddi_copyout: mhioc_resv_desc_list_t\n");
26763 			rval = EFAULT;
26764 			goto done;
26765 		}
26766 		break;
26767 
26768 	case DDI_MODEL_NONE:
26769 		if (ddi_copyout(&resvlist, ptr->li, copysz, flag)) {
26770 			SD_ERROR(SD_LOG_IOCTL_MHD, un,
26771 			    "sd_persistent_reservation_in_read_resv: "
26772 			    "failed ddi_copyout: mhioc_resv_desc_list_t\n");
26773 			rval = EFAULT;
26774 			goto done;
26775 		}
26776 		break;
26777 	}
26778 
26779 #else /* ! _MULTI_DATAMODEL */
26780 
26781 	if (ddi_copyout(&resvlist, ptr->li, copysz, flag)) {
26782 		SD_ERROR(SD_LOG_IOCTL_MHD, un,
26783 		    "sd_persistent_reservation_in_read_resv: "
26784 		    "failed ddi_copyout: mhioc_resv_desc_list_t\n");
26785 		rval = EFAULT;
26786 		goto done;
26787 	}
26788 
26789 #endif /* ! _MULTI_DATAMODEL */
26790 
26791 	readresv_ptr = (sd_readresv_desc_t *)&in->readresv_desc;
26792 	bufp = resvlist.list;
26793 	copysz = sizeof (mhioc_resv_desc_t);
26794 	for (i = 0; i < min(resvlist.listlen, resvlist.listsize);
26795 	    i++, readresv_ptr++, bufp++) {
26796 
26797 		bcopy(&readresv_ptr->resvkey, &resvdesc.key,
26798 		    MHIOC_RESV_KEY_SIZE);
26799 		resvdesc.type  = readresv_ptr->type;
26800 		resvdesc.scope = readresv_ptr->scope;
26801 		resvdesc.scope_specific_addr =
26802 		    BE_32(readresv_ptr->scope_specific_addr);
26803 
26804 		if (ddi_copyout(&resvdesc, bufp, copysz, flag)) {
26805 			SD_ERROR(SD_LOG_IOCTL_MHD, un,
26806 			    "sd_persistent_reservation_in_read_resv: "
26807 			    "failed ddi_copyout: resvlist\n");
26808 			rval = EFAULT;
26809 			goto done;
26810 		}
26811 	}
26812 done:
26813 	sd_ssc_fini(ssc);
26814 	/* only if data_bufp is allocated, we need to free it */
26815 	if (data_bufp) {
26816 		kmem_free(data_bufp, data_len);
26817 	}
26818 	return (rval);
26819 }
26820 
26821 
26822 /*
26823  *    Function: sr_change_blkmode()
26824  *
26825  * Description: This routine is the driver entry point for handling CD-ROM
26826  *		block mode ioctl requests. Support for returning and changing
26827  *		the current block size in use by the device is implemented. The
26828  *		LBA size is changed via a MODE SELECT Block Descriptor.
26829  *
26830  *		This routine issues a mode sense with an allocation length of
26831  *		12 bytes for the mode page header and a single block descriptor.
26832  *
26833  *   Arguments: dev - the device 'dev_t'
26834  *		cmd - the request type; one of CDROMGBLKMODE (get) or
26835  *		      CDROMSBLKMODE (set)
26836  *		data - current block size or requested block size
26837  *		flag - this argument is a pass through to ddi_copyxxx() directly
26838  *		       from the mode argument of ioctl().
26839  *
26840  * Return Code: the code returned by sd_send_scsi_cmd()
26841  *		EINVAL if invalid arguments are provided
26842  *		EFAULT if ddi_copyxxx() fails
26843  *		ENXIO if fail ddi_get_soft_state
26844  *		EIO if invalid mode sense block descriptor length
26845  *
26846  */
26847 
26848 static int
26849 sr_change_blkmode(dev_t dev, int cmd, intptr_t data, int flag)
26850 {
26851 	struct sd_lun			*un = NULL;
26852 	struct mode_header		*sense_mhp, *select_mhp;
26853 	struct block_descriptor		*sense_desc, *select_desc;
26854 	int				current_bsize;
26855 	int				rval = EINVAL;
26856 	uchar_t				*sense = NULL;
26857 	uchar_t				*select = NULL;
26858 	sd_ssc_t			*ssc;
26859 
26860 	ASSERT((cmd == CDROMGBLKMODE) || (cmd == CDROMSBLKMODE));
26861 
26862 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
26863 		return (ENXIO);
26864 	}
26865 
26866 	/*
26867 	 * The block length is changed via the Mode Select block descriptor, the
26868 	 * "Read/Write Error Recovery" mode page (0x1) contents are not actually
26869 	 * required as part of this routine. Therefore the mode sense allocation
26870 	 * length is specified to be the length of a mode page header and a
26871 	 * block descriptor.
26872 	 */
26873 	sense = kmem_zalloc(BUFLEN_CHG_BLK_MODE, KM_SLEEP);
26874 
26875 	ssc = sd_ssc_init(un);
26876 	rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense,
26877 	    BUFLEN_CHG_BLK_MODE, MODEPAGE_ERR_RECOV, SD_PATH_STANDARD);
26878 	sd_ssc_fini(ssc);
26879 	if (rval != 0) {
26880 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26881 		    "sr_change_blkmode: Mode Sense Failed\n");
26882 		kmem_free(sense, BUFLEN_CHG_BLK_MODE);
26883 		return (rval);
26884 	}
26885 
26886 	/* Check the block descriptor len to handle only 1 block descriptor */
26887 	sense_mhp = (struct mode_header *)sense;
26888 	if ((sense_mhp->bdesc_length == 0) ||
26889 	    (sense_mhp->bdesc_length > MODE_BLK_DESC_LENGTH)) {
26890 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26891 		    "sr_change_blkmode: Mode Sense returned invalid block"
26892 		    " descriptor length\n");
26893 		kmem_free(sense, BUFLEN_CHG_BLK_MODE);
26894 		return (EIO);
26895 	}
26896 	sense_desc = (struct block_descriptor *)(sense + MODE_HEADER_LENGTH);
26897 	current_bsize = ((sense_desc->blksize_hi << 16) |
26898 	    (sense_desc->blksize_mid << 8) | sense_desc->blksize_lo);
26899 
26900 	/* Process command */
26901 	switch (cmd) {
26902 	case CDROMGBLKMODE:
26903 		/* Return the block size obtained during the mode sense */
26904 		if (ddi_copyout(&current_bsize, (void *)data,
26905 		    sizeof (int), flag) != 0)
26906 			rval = EFAULT;
26907 		break;
26908 	case CDROMSBLKMODE:
26909 		/* Validate the requested block size */
26910 		switch (data) {
26911 		case CDROM_BLK_512:
26912 		case CDROM_BLK_1024:
26913 		case CDROM_BLK_2048:
26914 		case CDROM_BLK_2056:
26915 		case CDROM_BLK_2336:
26916 		case CDROM_BLK_2340:
26917 		case CDROM_BLK_2352:
26918 		case CDROM_BLK_2368:
26919 		case CDROM_BLK_2448:
26920 		case CDROM_BLK_2646:
26921 		case CDROM_BLK_2647:
26922 			break;
26923 		default:
26924 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26925 			    "sr_change_blkmode: "
26926 			    "Block Size '%ld' Not Supported\n", data);
26927 			kmem_free(sense, BUFLEN_CHG_BLK_MODE);
26928 			return (EINVAL);
26929 		}
26930 
26931 		/*
26932 		 * The current block size matches the requested block size so
26933 		 * there is no need to send the mode select to change the size
26934 		 */
26935 		if (current_bsize == data) {
26936 			break;
26937 		}
26938 
26939 		/* Build the select data for the requested block size */
26940 		select = kmem_zalloc(BUFLEN_CHG_BLK_MODE, KM_SLEEP);
26941 		select_mhp = (struct mode_header *)select;
26942 		select_desc =
26943 		    (struct block_descriptor *)(select + MODE_HEADER_LENGTH);
26944 		/*
26945 		 * The LBA size is changed via the block descriptor, so the
26946 		 * descriptor is built according to the user data
26947 		 */
26948 		select_mhp->bdesc_length = MODE_BLK_DESC_LENGTH;
26949 		select_desc->blksize_hi  = (char)(((data) & 0x00ff0000) >> 16);
26950 		select_desc->blksize_mid = (char)(((data) & 0x0000ff00) >> 8);
26951 		select_desc->blksize_lo  = (char)((data) & 0x000000ff);
26952 
26953 		/* Send the mode select for the requested block size */
26954 		ssc = sd_ssc_init(un);
26955 		rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0,
26956 		    select, BUFLEN_CHG_BLK_MODE, SD_DONTSAVE_PAGE,
26957 		    SD_PATH_STANDARD);
26958 		sd_ssc_fini(ssc);
26959 		if (rval != 0) {
26960 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26961 			    "sr_change_blkmode: Mode Select Failed\n");
26962 			/*
26963 			 * The mode select failed for the requested block size,
26964 			 * so reset the data for the original block size and
26965 			 * send it to the target. The error is indicated by the
26966 			 * return value for the failed mode select.
26967 			 */
26968 			select_desc->blksize_hi  = sense_desc->blksize_hi;
26969 			select_desc->blksize_mid = sense_desc->blksize_mid;
26970 			select_desc->blksize_lo  = sense_desc->blksize_lo;
26971 			ssc = sd_ssc_init(un);
26972 			(void) sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0,
26973 			    select, BUFLEN_CHG_BLK_MODE, SD_DONTSAVE_PAGE,
26974 			    SD_PATH_STANDARD);
26975 			sd_ssc_fini(ssc);
26976 		} else {
26977 			ASSERT(!mutex_owned(SD_MUTEX(un)));
26978 			mutex_enter(SD_MUTEX(un));
26979 			sd_update_block_info(un, (uint32_t)data, 0);
26980 			mutex_exit(SD_MUTEX(un));
26981 		}
26982 		break;
26983 	default:
26984 		/* should not reach here, but check anyway */
26985 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26986 		    "sr_change_blkmode: Command '%x' Not Supported\n", cmd);
26987 		rval = EINVAL;
26988 		break;
26989 	}
26990 
26991 	if (select) {
26992 		kmem_free(select, BUFLEN_CHG_BLK_MODE);
26993 	}
26994 	if (sense) {
26995 		kmem_free(sense, BUFLEN_CHG_BLK_MODE);
26996 	}
26997 	return (rval);
26998 }
26999 
27000 
27001 /*
27002  * Note: The following sr_change_speed() and sr_atapi_change_speed() routines
27003  * implement driver support for getting and setting the CD speed. The command
27004  * set used will be based on the device type. If the device has not been
27005  * identified as MMC the Toshiba vendor specific mode page will be used. If
27006  * the device is MMC but does not support the Real Time Streaming feature
27007  * the SET CD SPEED command will be used to set speed and mode page 0x2A will
27008  * be used to read the speed.
27009  */
27010 
27011 /*
27012  *    Function: sr_change_speed()
27013  *
27014  * Description: This routine is the driver entry point for handling CD-ROM
27015  *		drive speed ioctl requests for devices supporting the Toshiba
27016  *		vendor specific drive speed mode page. Support for returning
27017  *		and changing the current drive speed in use by the device is
27018  *		implemented.
27019  *
27020  *   Arguments: dev - the device 'dev_t'
27021  *		cmd - the request type; one of CDROMGDRVSPEED (get) or
27022  *		      CDROMSDRVSPEED (set)
27023  *		data - current drive speed or requested drive speed
27024  *		flag - this argument is a pass through to ddi_copyxxx() directly
27025  *		       from the mode argument of ioctl().
27026  *
27027  * Return Code: the code returned by sd_send_scsi_cmd()
27028  *		EINVAL if invalid arguments are provided
27029  *		EFAULT if ddi_copyxxx() fails
27030  *		ENXIO if fail ddi_get_soft_state
27031  *		EIO if invalid mode sense block descriptor length
27032  */
27033 
27034 static int
27035 sr_change_speed(dev_t dev, int cmd, intptr_t data, int flag)
27036 {
27037 	struct sd_lun			*un = NULL;
27038 	struct mode_header		*sense_mhp, *select_mhp;
27039 	struct mode_speed		*sense_page, *select_page;
27040 	int				current_speed;
27041 	int				rval = EINVAL;
27042 	int				bd_len;
27043 	uchar_t				*sense = NULL;
27044 	uchar_t				*select = NULL;
27045 	sd_ssc_t			*ssc;
27046 
27047 	ASSERT((cmd == CDROMGDRVSPEED) || (cmd == CDROMSDRVSPEED));
27048 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27049 		return (ENXIO);
27050 	}
27051 
27052 	/*
27053 	 * Note: The drive speed is being modified here according to a Toshiba
27054 	 * vendor specific mode page (0x31).
27055 	 */
27056 	sense = kmem_zalloc(BUFLEN_MODE_CDROM_SPEED, KM_SLEEP);
27057 
27058 	ssc = sd_ssc_init(un);
27059 	rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense,
27060 	    BUFLEN_MODE_CDROM_SPEED, CDROM_MODE_SPEED,
27061 	    SD_PATH_STANDARD);
27062 	sd_ssc_fini(ssc);
27063 	if (rval != 0) {
27064 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27065 		    "sr_change_speed: Mode Sense Failed\n");
27066 		kmem_free(sense, BUFLEN_MODE_CDROM_SPEED);
27067 		return (rval);
27068 	}
27069 	sense_mhp  = (struct mode_header *)sense;
27070 
27071 	/* Check the block descriptor len to handle only 1 block descriptor */
27072 	bd_len = sense_mhp->bdesc_length;
27073 	if (bd_len > MODE_BLK_DESC_LENGTH) {
27074 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27075 		    "sr_change_speed: Mode Sense returned invalid block "
27076 		    "descriptor length\n");
27077 		kmem_free(sense, BUFLEN_MODE_CDROM_SPEED);
27078 		return (EIO);
27079 	}
27080 
27081 	sense_page = (struct mode_speed *)
27082 	    (sense + MODE_HEADER_LENGTH + sense_mhp->bdesc_length);
27083 	current_speed = sense_page->speed;
27084 
27085 	/* Process command */
27086 	switch (cmd) {
27087 	case CDROMGDRVSPEED:
27088 		/* Return the drive speed obtained during the mode sense */
27089 		if (current_speed == 0x2) {
27090 			current_speed = CDROM_TWELVE_SPEED;
27091 		}
27092 		if (ddi_copyout(&current_speed, (void *)data,
27093 		    sizeof (int), flag) != 0) {
27094 			rval = EFAULT;
27095 		}
27096 		break;
27097 	case CDROMSDRVSPEED:
27098 		/* Validate the requested drive speed */
27099 		switch ((uchar_t)data) {
27100 		case CDROM_TWELVE_SPEED:
27101 			data = 0x2;
27102 			/*FALLTHROUGH*/
27103 		case CDROM_NORMAL_SPEED:
27104 		case CDROM_DOUBLE_SPEED:
27105 		case CDROM_QUAD_SPEED:
27106 		case CDROM_MAXIMUM_SPEED:
27107 			break;
27108 		default:
27109 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27110 			    "sr_change_speed: "
27111 			    "Drive Speed '%d' Not Supported\n", (uchar_t)data);
27112 			kmem_free(sense, BUFLEN_MODE_CDROM_SPEED);
27113 			return (EINVAL);
27114 		}
27115 
27116 		/*
27117 		 * The current drive speed matches the requested drive speed so
27118 		 * there is no need to send the mode select to change the speed
27119 		 */
27120 		if (current_speed == data) {
27121 			break;
27122 		}
27123 
27124 		/* Build the select data for the requested drive speed */
27125 		select = kmem_zalloc(BUFLEN_MODE_CDROM_SPEED, KM_SLEEP);
27126 		select_mhp = (struct mode_header *)select;
27127 		select_mhp->bdesc_length = 0;
27128 		select_page =
27129 		    (struct mode_speed *)(select + MODE_HEADER_LENGTH);
27130 		select_page =
27131 		    (struct mode_speed *)(select + MODE_HEADER_LENGTH);
27132 		select_page->mode_page.code = CDROM_MODE_SPEED;
27133 		select_page->mode_page.length = 2;
27134 		select_page->speed = (uchar_t)data;
27135 
27136 		/* Send the mode select for the requested block size */
27137 		ssc = sd_ssc_init(un);
27138 		rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select,
27139 		    MODEPAGE_CDROM_SPEED_LEN + MODE_HEADER_LENGTH,
27140 		    SD_DONTSAVE_PAGE, SD_PATH_STANDARD);
27141 		sd_ssc_fini(ssc);
27142 		if (rval != 0) {
27143 			/*
27144 			 * The mode select failed for the requested drive speed,
27145 			 * so reset the data for the original drive speed and
27146 			 * send it to the target. The error is indicated by the
27147 			 * return value for the failed mode select.
27148 			 */
27149 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27150 			    "sr_drive_speed: Mode Select Failed\n");
27151 			select_page->speed = sense_page->speed;
27152 			ssc = sd_ssc_init(un);
27153 			(void) sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select,
27154 			    MODEPAGE_CDROM_SPEED_LEN + MODE_HEADER_LENGTH,
27155 			    SD_DONTSAVE_PAGE, SD_PATH_STANDARD);
27156 			sd_ssc_fini(ssc);
27157 		}
27158 		break;
27159 	default:
27160 		/* should not reach here, but check anyway */
27161 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27162 		    "sr_change_speed: Command '%x' Not Supported\n", cmd);
27163 		rval = EINVAL;
27164 		break;
27165 	}
27166 
27167 	if (select) {
27168 		kmem_free(select, BUFLEN_MODE_CDROM_SPEED);
27169 	}
27170 	if (sense) {
27171 		kmem_free(sense, BUFLEN_MODE_CDROM_SPEED);
27172 	}
27173 
27174 	return (rval);
27175 }
27176 
27177 
27178 /*
27179  *    Function: sr_atapi_change_speed()
27180  *
27181  * Description: This routine is the driver entry point for handling CD-ROM
27182  *		drive speed ioctl requests for MMC devices that do not support
27183  *		the Real Time Streaming feature (0x107).
27184  *
27185  *		Note: This routine will use the SET SPEED command which may not
27186  *		be supported by all devices.
27187  *
27188  *   Arguments: dev- the device 'dev_t'
27189  *		cmd- the request type; one of CDROMGDRVSPEED (get) or
27190  *		     CDROMSDRVSPEED (set)
27191  *		data- current drive speed or requested drive speed
27192  *		flag- this argument is a pass through to ddi_copyxxx() directly
27193  *		      from the mode argument of ioctl().
27194  *
27195  * Return Code: the code returned by sd_send_scsi_cmd()
27196  *		EINVAL if invalid arguments are provided
27197  *		EFAULT if ddi_copyxxx() fails
27198  *		ENXIO if fail ddi_get_soft_state
27199  *		EIO if invalid mode sense block descriptor length
27200  */
27201 
27202 static int
27203 sr_atapi_change_speed(dev_t dev, int cmd, intptr_t data, int flag)
27204 {
27205 	struct sd_lun			*un;
27206 	struct uscsi_cmd		*com = NULL;
27207 	struct mode_header_grp2		*sense_mhp;
27208 	uchar_t				*sense_page;
27209 	uchar_t				*sense = NULL;
27210 	char				cdb[CDB_GROUP5];
27211 	int				bd_len;
27212 	int				current_speed = 0;
27213 	int				max_speed = 0;
27214 	int				rval;
27215 	sd_ssc_t			*ssc;
27216 
27217 	ASSERT((cmd == CDROMGDRVSPEED) || (cmd == CDROMSDRVSPEED));
27218 
27219 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27220 		return (ENXIO);
27221 	}
27222 
27223 	sense = kmem_zalloc(BUFLEN_MODE_CDROM_CAP, KM_SLEEP);
27224 
27225 	ssc = sd_ssc_init(un);
27226 	rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, sense,
27227 	    BUFLEN_MODE_CDROM_CAP, MODEPAGE_CDROM_CAP,
27228 	    SD_PATH_STANDARD);
27229 	sd_ssc_fini(ssc);
27230 	if (rval != 0) {
27231 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27232 		    "sr_atapi_change_speed: Mode Sense Failed\n");
27233 		kmem_free(sense, BUFLEN_MODE_CDROM_CAP);
27234 		return (rval);
27235 	}
27236 
27237 	/* Check the block descriptor len to handle only 1 block descriptor */
27238 	sense_mhp = (struct mode_header_grp2 *)sense;
27239 	bd_len = (sense_mhp->bdesc_length_hi << 8) | sense_mhp->bdesc_length_lo;
27240 	if (bd_len > MODE_BLK_DESC_LENGTH) {
27241 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27242 		    "sr_atapi_change_speed: Mode Sense returned invalid "
27243 		    "block descriptor length\n");
27244 		kmem_free(sense, BUFLEN_MODE_CDROM_CAP);
27245 		return (EIO);
27246 	}
27247 
27248 	/* Calculate the current and maximum drive speeds */
27249 	sense_page = (uchar_t *)(sense + MODE_HEADER_LENGTH_GRP2 + bd_len);
27250 	current_speed = (sense_page[14] << 8) | sense_page[15];
27251 	max_speed = (sense_page[8] << 8) | sense_page[9];
27252 
27253 	/* Process the command */
27254 	switch (cmd) {
27255 	case CDROMGDRVSPEED:
27256 		current_speed /= SD_SPEED_1X;
27257 		if (ddi_copyout(&current_speed, (void *)data,
27258 		    sizeof (int), flag) != 0)
27259 			rval = EFAULT;
27260 		break;
27261 	case CDROMSDRVSPEED:
27262 		/* Convert the speed code to KB/sec */
27263 		switch ((uchar_t)data) {
27264 		case CDROM_NORMAL_SPEED:
27265 			current_speed = SD_SPEED_1X;
27266 			break;
27267 		case CDROM_DOUBLE_SPEED:
27268 			current_speed = 2 * SD_SPEED_1X;
27269 			break;
27270 		case CDROM_QUAD_SPEED:
27271 			current_speed = 4 * SD_SPEED_1X;
27272 			break;
27273 		case CDROM_TWELVE_SPEED:
27274 			current_speed = 12 * SD_SPEED_1X;
27275 			break;
27276 		case CDROM_MAXIMUM_SPEED:
27277 			current_speed = 0xffff;
27278 			break;
27279 		default:
27280 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27281 			    "sr_atapi_change_speed: invalid drive speed %d\n",
27282 			    (uchar_t)data);
27283 			kmem_free(sense, BUFLEN_MODE_CDROM_CAP);
27284 			return (EINVAL);
27285 		}
27286 
27287 		/* Check the request against the drive's max speed. */
27288 		if (current_speed != 0xffff) {
27289 			if (current_speed > max_speed) {
27290 				kmem_free(sense, BUFLEN_MODE_CDROM_CAP);
27291 				return (EINVAL);
27292 			}
27293 		}
27294 
27295 		/*
27296 		 * Build and send the SET SPEED command
27297 		 *
27298 		 * Note: The SET SPEED (0xBB) command used in this routine is
27299 		 * obsolete per the SCSI MMC spec but still supported in the
27300 		 * MT FUJI vendor spec. Most equipment is adhereing to MT FUJI
27301 		 * therefore the command is still implemented in this routine.
27302 		 */
27303 		bzero(cdb, sizeof (cdb));
27304 		cdb[0] = (char)SCMD_SET_CDROM_SPEED;
27305 		cdb[2] = (uchar_t)(current_speed >> 8);
27306 		cdb[3] = (uchar_t)current_speed;
27307 		com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27308 		com->uscsi_cdb	   = (caddr_t)cdb;
27309 		com->uscsi_cdblen  = CDB_GROUP5;
27310 		com->uscsi_bufaddr = NULL;
27311 		com->uscsi_buflen  = 0;
27312 		com->uscsi_flags   = USCSI_DIAGNOSE|USCSI_SILENT;
27313 		rval = sd_send_scsi_cmd(dev, com, FKIOCTL, 0, SD_PATH_STANDARD);
27314 		break;
27315 	default:
27316 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27317 		    "sr_atapi_change_speed: Command '%x' Not Supported\n", cmd);
27318 		rval = EINVAL;
27319 	}
27320 
27321 	if (sense) {
27322 		kmem_free(sense, BUFLEN_MODE_CDROM_CAP);
27323 	}
27324 	if (com) {
27325 		kmem_free(com, sizeof (*com));
27326 	}
27327 	return (rval);
27328 }
27329 
27330 
27331 /*
27332  *    Function: sr_pause_resume()
27333  *
27334  * Description: This routine is the driver entry point for handling CD-ROM
27335  *		pause/resume ioctl requests. This only affects the audio play
27336  *		operation.
27337  *
27338  *   Arguments: dev - the device 'dev_t'
27339  *		cmd - the request type; one of CDROMPAUSE or CDROMRESUME, used
27340  *		      for setting the resume bit of the cdb.
27341  *
27342  * Return Code: the code returned by sd_send_scsi_cmd()
27343  *		EINVAL if invalid mode specified
27344  *
27345  */
27346 
27347 static int
27348 sr_pause_resume(dev_t dev, int cmd)
27349 {
27350 	struct sd_lun		*un;
27351 	struct uscsi_cmd	*com;
27352 	char			cdb[CDB_GROUP1];
27353 	int			rval;
27354 
27355 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27356 		return (ENXIO);
27357 	}
27358 
27359 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27360 	bzero(cdb, CDB_GROUP1);
27361 	cdb[0] = SCMD_PAUSE_RESUME;
27362 	switch (cmd) {
27363 	case CDROMRESUME:
27364 		cdb[8] = 1;
27365 		break;
27366 	case CDROMPAUSE:
27367 		cdb[8] = 0;
27368 		break;
27369 	default:
27370 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_pause_resume:"
27371 		    " Command '%x' Not Supported\n", cmd);
27372 		rval = EINVAL;
27373 		goto done;
27374 	}
27375 
27376 	com->uscsi_cdb    = cdb;
27377 	com->uscsi_cdblen = CDB_GROUP1;
27378 	com->uscsi_flags  = USCSI_DIAGNOSE|USCSI_SILENT;
27379 
27380 	rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27381 	    SD_PATH_STANDARD);
27382 
27383 done:
27384 	kmem_free(com, sizeof (*com));
27385 	return (rval);
27386 }
27387 
27388 
27389 /*
27390  *    Function: sr_play_msf()
27391  *
27392  * Description: This routine is the driver entry point for handling CD-ROM
27393  *		ioctl requests to output the audio signals at the specified
27394  *		starting address and continue the audio play until the specified
27395  *		ending address (CDROMPLAYMSF) The address is in Minute Second
27396  *		Frame (MSF) format.
27397  *
27398  *   Arguments: dev	- the device 'dev_t'
27399  *		data	- pointer to user provided audio msf structure,
27400  *		          specifying start/end addresses.
27401  *		flag	- this argument is a pass through to ddi_copyxxx()
27402  *		          directly from the mode argument of ioctl().
27403  *
27404  * Return Code: the code returned by sd_send_scsi_cmd()
27405  *		EFAULT if ddi_copyxxx() fails
27406  *		ENXIO if fail ddi_get_soft_state
27407  *		EINVAL if data pointer is NULL
27408  */
27409 
27410 static int
27411 sr_play_msf(dev_t dev, caddr_t data, int flag)
27412 {
27413 	struct sd_lun		*un;
27414 	struct uscsi_cmd	*com;
27415 	struct cdrom_msf	msf_struct;
27416 	struct cdrom_msf	*msf = &msf_struct;
27417 	char			cdb[CDB_GROUP1];
27418 	int			rval;
27419 
27420 	if (data == NULL) {
27421 		return (EINVAL);
27422 	}
27423 
27424 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27425 		return (ENXIO);
27426 	}
27427 
27428 	if (ddi_copyin(data, msf, sizeof (struct cdrom_msf), flag)) {
27429 		return (EFAULT);
27430 	}
27431 
27432 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27433 	bzero(cdb, CDB_GROUP1);
27434 	cdb[0] = SCMD_PLAYAUDIO_MSF;
27435 	if (un->un_f_cfg_playmsf_bcd == TRUE) {
27436 		cdb[3] = BYTE_TO_BCD(msf->cdmsf_min0);
27437 		cdb[4] = BYTE_TO_BCD(msf->cdmsf_sec0);
27438 		cdb[5] = BYTE_TO_BCD(msf->cdmsf_frame0);
27439 		cdb[6] = BYTE_TO_BCD(msf->cdmsf_min1);
27440 		cdb[7] = BYTE_TO_BCD(msf->cdmsf_sec1);
27441 		cdb[8] = BYTE_TO_BCD(msf->cdmsf_frame1);
27442 	} else {
27443 		cdb[3] = msf->cdmsf_min0;
27444 		cdb[4] = msf->cdmsf_sec0;
27445 		cdb[5] = msf->cdmsf_frame0;
27446 		cdb[6] = msf->cdmsf_min1;
27447 		cdb[7] = msf->cdmsf_sec1;
27448 		cdb[8] = msf->cdmsf_frame1;
27449 	}
27450 	com->uscsi_cdb    = cdb;
27451 	com->uscsi_cdblen = CDB_GROUP1;
27452 	com->uscsi_flags  = USCSI_DIAGNOSE|USCSI_SILENT;
27453 	rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27454 	    SD_PATH_STANDARD);
27455 	kmem_free(com, sizeof (*com));
27456 	return (rval);
27457 }
27458 
27459 
27460 /*
27461  *    Function: sr_play_trkind()
27462  *
27463  * Description: This routine is the driver entry point for handling CD-ROM
27464  *		ioctl requests to output the audio signals at the specified
27465  *		starting address and continue the audio play until the specified
27466  *		ending address (CDROMPLAYTRKIND). The address is in Track Index
27467  *		format.
27468  *
27469  *   Arguments: dev	- the device 'dev_t'
27470  *		data	- pointer to user provided audio track/index structure,
27471  *		          specifying start/end addresses.
27472  *		flag	- this argument is a pass through to ddi_copyxxx()
27473  *		          directly from the mode argument of ioctl().
27474  *
27475  * Return Code: the code returned by sd_send_scsi_cmd()
27476  *		EFAULT if ddi_copyxxx() fails
27477  *		ENXIO if fail ddi_get_soft_state
27478  *		EINVAL if data pointer is NULL
27479  */
27480 
27481 static int
27482 sr_play_trkind(dev_t dev, caddr_t data, int flag)
27483 {
27484 	struct cdrom_ti		ti_struct;
27485 	struct cdrom_ti		*ti = &ti_struct;
27486 	struct uscsi_cmd	*com = NULL;
27487 	char			cdb[CDB_GROUP1];
27488 	int			rval;
27489 
27490 	if (data == NULL) {
27491 		return (EINVAL);
27492 	}
27493 
27494 	if (ddi_copyin(data, ti, sizeof (struct cdrom_ti), flag)) {
27495 		return (EFAULT);
27496 	}
27497 
27498 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27499 	bzero(cdb, CDB_GROUP1);
27500 	cdb[0] = SCMD_PLAYAUDIO_TI;
27501 	cdb[4] = ti->cdti_trk0;
27502 	cdb[5] = ti->cdti_ind0;
27503 	cdb[7] = ti->cdti_trk1;
27504 	cdb[8] = ti->cdti_ind1;
27505 	com->uscsi_cdb    = cdb;
27506 	com->uscsi_cdblen = CDB_GROUP1;
27507 	com->uscsi_flags  = USCSI_DIAGNOSE|USCSI_SILENT;
27508 	rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27509 	    SD_PATH_STANDARD);
27510 	kmem_free(com, sizeof (*com));
27511 	return (rval);
27512 }
27513 
27514 
27515 /*
27516  *    Function: sr_read_all_subcodes()
27517  *
27518  * Description: This routine is the driver entry point for handling CD-ROM
27519  *		ioctl requests to return raw subcode data while the target is
27520  *		playing audio (CDROMSUBCODE).
27521  *
27522  *   Arguments: dev	- the device 'dev_t'
27523  *		data	- pointer to user provided cdrom subcode structure,
27524  *		          specifying the transfer length and address.
27525  *		flag	- this argument is a pass through to ddi_copyxxx()
27526  *		          directly from the mode argument of ioctl().
27527  *
27528  * Return Code: the code returned by sd_send_scsi_cmd()
27529  *		EFAULT if ddi_copyxxx() fails
27530  *		ENXIO if fail ddi_get_soft_state
27531  *		EINVAL if data pointer is NULL
27532  */
27533 
27534 static int
27535 sr_read_all_subcodes(dev_t dev, caddr_t data, int flag)
27536 {
27537 	struct sd_lun		*un = NULL;
27538 	struct uscsi_cmd	*com = NULL;
27539 	struct cdrom_subcode	*subcode = NULL;
27540 	int			rval;
27541 	size_t			buflen;
27542 	char			cdb[CDB_GROUP5];
27543 
27544 #ifdef _MULTI_DATAMODEL
27545 	/* To support ILP32 applications in an LP64 world */
27546 	struct cdrom_subcode32		cdrom_subcode32;
27547 	struct cdrom_subcode32		*cdsc32 = &cdrom_subcode32;
27548 #endif
27549 	if (data == NULL) {
27550 		return (EINVAL);
27551 	}
27552 
27553 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27554 		return (ENXIO);
27555 	}
27556 
27557 	subcode = kmem_zalloc(sizeof (struct cdrom_subcode), KM_SLEEP);
27558 
27559 #ifdef _MULTI_DATAMODEL
27560 	switch (ddi_model_convert_from(flag & FMODELS)) {
27561 	case DDI_MODEL_ILP32:
27562 		if (ddi_copyin(data, cdsc32, sizeof (*cdsc32), flag)) {
27563 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27564 			    "sr_read_all_subcodes: ddi_copyin Failed\n");
27565 			kmem_free(subcode, sizeof (struct cdrom_subcode));
27566 			return (EFAULT);
27567 		}
27568 		/* Convert the ILP32 uscsi data from the application to LP64 */
27569 		cdrom_subcode32tocdrom_subcode(cdsc32, subcode);
27570 		break;
27571 	case DDI_MODEL_NONE:
27572 		if (ddi_copyin(data, subcode,
27573 		    sizeof (struct cdrom_subcode), flag)) {
27574 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27575 			    "sr_read_all_subcodes: ddi_copyin Failed\n");
27576 			kmem_free(subcode, sizeof (struct cdrom_subcode));
27577 			return (EFAULT);
27578 		}
27579 		break;
27580 	}
27581 #else /* ! _MULTI_DATAMODEL */
27582 	if (ddi_copyin(data, subcode, sizeof (struct cdrom_subcode), flag)) {
27583 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27584 		    "sr_read_all_subcodes: ddi_copyin Failed\n");
27585 		kmem_free(subcode, sizeof (struct cdrom_subcode));
27586 		return (EFAULT);
27587 	}
27588 #endif /* _MULTI_DATAMODEL */
27589 
27590 	/*
27591 	 * Since MMC-2 expects max 3 bytes for length, check if the
27592 	 * length input is greater than 3 bytes
27593 	 */
27594 	if ((subcode->cdsc_length & 0xFF000000) != 0) {
27595 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27596 		    "sr_read_all_subcodes: "
27597 		    "cdrom transfer length too large: %d (limit %d)\n",
27598 		    subcode->cdsc_length, 0xFFFFFF);
27599 		kmem_free(subcode, sizeof (struct cdrom_subcode));
27600 		return (EINVAL);
27601 	}
27602 
27603 	buflen = CDROM_BLK_SUBCODE * subcode->cdsc_length;
27604 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27605 	bzero(cdb, CDB_GROUP5);
27606 
27607 	if (un->un_f_mmc_cap == TRUE) {
27608 		cdb[0] = (char)SCMD_READ_CD;
27609 		cdb[2] = (char)0xff;
27610 		cdb[3] = (char)0xff;
27611 		cdb[4] = (char)0xff;
27612 		cdb[5] = (char)0xff;
27613 		cdb[6] = (((subcode->cdsc_length) & 0x00ff0000) >> 16);
27614 		cdb[7] = (((subcode->cdsc_length) & 0x0000ff00) >> 8);
27615 		cdb[8] = ((subcode->cdsc_length) & 0x000000ff);
27616 		cdb[10] = 1;
27617 	} else {
27618 		/*
27619 		 * Note: A vendor specific command (0xDF) is being used here to
27620 		 * request a read of all subcodes.
27621 		 */
27622 		cdb[0] = (char)SCMD_READ_ALL_SUBCODES;
27623 		cdb[6] = (((subcode->cdsc_length) & 0xff000000) >> 24);
27624 		cdb[7] = (((subcode->cdsc_length) & 0x00ff0000) >> 16);
27625 		cdb[8] = (((subcode->cdsc_length) & 0x0000ff00) >> 8);
27626 		cdb[9] = ((subcode->cdsc_length) & 0x000000ff);
27627 	}
27628 	com->uscsi_cdb	   = cdb;
27629 	com->uscsi_cdblen  = CDB_GROUP5;
27630 	com->uscsi_bufaddr = (caddr_t)subcode->cdsc_addr;
27631 	com->uscsi_buflen  = buflen;
27632 	com->uscsi_flags   = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
27633 	rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE,
27634 	    SD_PATH_STANDARD);
27635 	kmem_free(subcode, sizeof (struct cdrom_subcode));
27636 	kmem_free(com, sizeof (*com));
27637 	return (rval);
27638 }
27639 
27640 
27641 /*
27642  *    Function: sr_read_subchannel()
27643  *
27644  * Description: This routine is the driver entry point for handling CD-ROM
27645  *		ioctl requests to return the Q sub-channel data of the CD
27646  *		current position block. (CDROMSUBCHNL) The data includes the
27647  *		track number, index number, absolute CD-ROM address (LBA or MSF
27648  *		format per the user) , track relative CD-ROM address (LBA or MSF
27649  *		format per the user), control data and audio status.
27650  *
27651  *   Arguments: dev	- the device 'dev_t'
27652  *		data	- pointer to user provided cdrom sub-channel structure
27653  *		flag	- this argument is a pass through to ddi_copyxxx()
27654  *		          directly from the mode argument of ioctl().
27655  *
27656  * Return Code: the code returned by sd_send_scsi_cmd()
27657  *		EFAULT if ddi_copyxxx() fails
27658  *		ENXIO if fail ddi_get_soft_state
27659  *		EINVAL if data pointer is NULL
27660  */
27661 
27662 static int
27663 sr_read_subchannel(dev_t dev, caddr_t data, int flag)
27664 {
27665 	struct sd_lun		*un;
27666 	struct uscsi_cmd	*com;
27667 	struct cdrom_subchnl	subchanel;
27668 	struct cdrom_subchnl	*subchnl = &subchanel;
27669 	char			cdb[CDB_GROUP1];
27670 	caddr_t			buffer;
27671 	int			rval;
27672 
27673 	if (data == NULL) {
27674 		return (EINVAL);
27675 	}
27676 
27677 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27678 	    (un->un_state == SD_STATE_OFFLINE)) {
27679 		return (ENXIO);
27680 	}
27681 
27682 	if (ddi_copyin(data, subchnl, sizeof (struct cdrom_subchnl), flag)) {
27683 		return (EFAULT);
27684 	}
27685 
27686 	buffer = kmem_zalloc((size_t)16, KM_SLEEP);
27687 	bzero(cdb, CDB_GROUP1);
27688 	cdb[0] = SCMD_READ_SUBCHANNEL;
27689 	/* Set the MSF bit based on the user requested address format */
27690 	cdb[1] = (subchnl->cdsc_format & CDROM_LBA) ? 0 : 0x02;
27691 	/*
27692 	 * Set the Q bit in byte 2 to indicate that Q sub-channel data be
27693 	 * returned
27694 	 */
27695 	cdb[2] = 0x40;
27696 	/*
27697 	 * Set byte 3 to specify the return data format. A value of 0x01
27698 	 * indicates that the CD-ROM current position should be returned.
27699 	 */
27700 	cdb[3] = 0x01;
27701 	cdb[8] = 0x10;
27702 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27703 	com->uscsi_cdb	   = cdb;
27704 	com->uscsi_cdblen  = CDB_GROUP1;
27705 	com->uscsi_bufaddr = buffer;
27706 	com->uscsi_buflen  = 16;
27707 	com->uscsi_flags   = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
27708 	rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27709 	    SD_PATH_STANDARD);
27710 	if (rval != 0) {
27711 		kmem_free(buffer, 16);
27712 		kmem_free(com, sizeof (*com));
27713 		return (rval);
27714 	}
27715 
27716 	/* Process the returned Q sub-channel data */
27717 	subchnl->cdsc_audiostatus = buffer[1];
27718 	subchnl->cdsc_adr	= (buffer[5] & 0xF0) >> 4;
27719 	subchnl->cdsc_ctrl	= (buffer[5] & 0x0F);
27720 	subchnl->cdsc_trk	= buffer[6];
27721 	subchnl->cdsc_ind	= buffer[7];
27722 	if (subchnl->cdsc_format & CDROM_LBA) {
27723 		subchnl->cdsc_absaddr.lba =
27724 		    ((uchar_t)buffer[8] << 24) + ((uchar_t)buffer[9] << 16) +
27725 		    ((uchar_t)buffer[10] << 8) + ((uchar_t)buffer[11]);
27726 		subchnl->cdsc_reladdr.lba =
27727 		    ((uchar_t)buffer[12] << 24) + ((uchar_t)buffer[13] << 16) +
27728 		    ((uchar_t)buffer[14] << 8) + ((uchar_t)buffer[15]);
27729 	} else if (un->un_f_cfg_readsub_bcd == TRUE) {
27730 		subchnl->cdsc_absaddr.msf.minute = BCD_TO_BYTE(buffer[9]);
27731 		subchnl->cdsc_absaddr.msf.second = BCD_TO_BYTE(buffer[10]);
27732 		subchnl->cdsc_absaddr.msf.frame  = BCD_TO_BYTE(buffer[11]);
27733 		subchnl->cdsc_reladdr.msf.minute = BCD_TO_BYTE(buffer[13]);
27734 		subchnl->cdsc_reladdr.msf.second = BCD_TO_BYTE(buffer[14]);
27735 		subchnl->cdsc_reladdr.msf.frame  = BCD_TO_BYTE(buffer[15]);
27736 	} else {
27737 		subchnl->cdsc_absaddr.msf.minute = buffer[9];
27738 		subchnl->cdsc_absaddr.msf.second = buffer[10];
27739 		subchnl->cdsc_absaddr.msf.frame  = buffer[11];
27740 		subchnl->cdsc_reladdr.msf.minute = buffer[13];
27741 		subchnl->cdsc_reladdr.msf.second = buffer[14];
27742 		subchnl->cdsc_reladdr.msf.frame  = buffer[15];
27743 	}
27744 	kmem_free(buffer, 16);
27745 	kmem_free(com, sizeof (*com));
27746 	if (ddi_copyout(subchnl, data, sizeof (struct cdrom_subchnl), flag)
27747 	    != 0) {
27748 		return (EFAULT);
27749 	}
27750 	return (rval);
27751 }
27752 
27753 
27754 /*
27755  *    Function: sr_read_tocentry()
27756  *
27757  * Description: This routine is the driver entry point for handling CD-ROM
27758  *		ioctl requests to read from the Table of Contents (TOC)
27759  *		(CDROMREADTOCENTRY). This routine provides the ADR and CTRL
27760  *		fields, the starting address (LBA or MSF format per the user)
27761  *		and the data mode if the user specified track is a data track.
27762  *
27763  *		Note: The READ HEADER (0x44) command used in this routine is
27764  *		obsolete per the SCSI MMC spec but still supported in the
27765  *		MT FUJI vendor spec. Most equipment is adhereing to MT FUJI
27766  *		therefore the command is still implemented in this routine.
27767  *
27768  *   Arguments: dev	- the device 'dev_t'
27769  *		data	- pointer to user provided toc entry structure,
27770  *			  specifying the track # and the address format
27771  *			  (LBA or MSF).
27772  *		flag	- this argument is a pass through to ddi_copyxxx()
27773  *		          directly from the mode argument of ioctl().
27774  *
27775  * Return Code: the code returned by sd_send_scsi_cmd()
27776  *		EFAULT if ddi_copyxxx() fails
27777  *		ENXIO if fail ddi_get_soft_state
27778  *		EINVAL if data pointer is NULL
27779  */
27780 
27781 static int
27782 sr_read_tocentry(dev_t dev, caddr_t data, int flag)
27783 {
27784 	struct sd_lun		*un = NULL;
27785 	struct uscsi_cmd	*com;
27786 	struct cdrom_tocentry	toc_entry;
27787 	struct cdrom_tocentry	*entry = &toc_entry;
27788 	caddr_t			buffer;
27789 	int			rval;
27790 	char			cdb[CDB_GROUP1];
27791 
27792 	if (data == NULL) {
27793 		return (EINVAL);
27794 	}
27795 
27796 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27797 	    (un->un_state == SD_STATE_OFFLINE)) {
27798 		return (ENXIO);
27799 	}
27800 
27801 	if (ddi_copyin(data, entry, sizeof (struct cdrom_tocentry), flag)) {
27802 		return (EFAULT);
27803 	}
27804 
27805 	/* Validate the requested track and address format */
27806 	if (!(entry->cdte_format & (CDROM_LBA | CDROM_MSF))) {
27807 		return (EINVAL);
27808 	}
27809 
27810 	if (entry->cdte_track == 0) {
27811 		return (EINVAL);
27812 	}
27813 
27814 	buffer = kmem_zalloc((size_t)12, KM_SLEEP);
27815 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27816 	bzero(cdb, CDB_GROUP1);
27817 
27818 	cdb[0] = SCMD_READ_TOC;
27819 	/* Set the MSF bit based on the user requested address format  */
27820 	cdb[1] = ((entry->cdte_format & CDROM_LBA) ? 0 : 2);
27821 	if (un->un_f_cfg_read_toc_trk_bcd == TRUE) {
27822 		cdb[6] = BYTE_TO_BCD(entry->cdte_track);
27823 	} else {
27824 		cdb[6] = entry->cdte_track;
27825 	}
27826 
27827 	/*
27828 	 * Bytes 7 & 8 are the 12 byte allocation length for a single entry.
27829 	 * (4 byte TOC response header + 8 byte track descriptor)
27830 	 */
27831 	cdb[8] = 12;
27832 	com->uscsi_cdb	   = cdb;
27833 	com->uscsi_cdblen  = CDB_GROUP1;
27834 	com->uscsi_bufaddr = buffer;
27835 	com->uscsi_buflen  = 0x0C;
27836 	com->uscsi_flags   = (USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ);
27837 	rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27838 	    SD_PATH_STANDARD);
27839 	if (rval != 0) {
27840 		kmem_free(buffer, 12);
27841 		kmem_free(com, sizeof (*com));
27842 		return (rval);
27843 	}
27844 
27845 	/* Process the toc entry */
27846 	entry->cdte_adr		= (buffer[5] & 0xF0) >> 4;
27847 	entry->cdte_ctrl	= (buffer[5] & 0x0F);
27848 	if (entry->cdte_format & CDROM_LBA) {
27849 		entry->cdte_addr.lba =
27850 		    ((uchar_t)buffer[8] << 24) + ((uchar_t)buffer[9] << 16) +
27851 		    ((uchar_t)buffer[10] << 8) + ((uchar_t)buffer[11]);
27852 	} else if (un->un_f_cfg_read_toc_addr_bcd == TRUE) {
27853 		entry->cdte_addr.msf.minute	= BCD_TO_BYTE(buffer[9]);
27854 		entry->cdte_addr.msf.second	= BCD_TO_BYTE(buffer[10]);
27855 		entry->cdte_addr.msf.frame	= BCD_TO_BYTE(buffer[11]);
27856 		/*
27857 		 * Send a READ TOC command using the LBA address format to get
27858 		 * the LBA for the track requested so it can be used in the
27859 		 * READ HEADER request
27860 		 *
27861 		 * Note: The MSF bit of the READ HEADER command specifies the
27862 		 * output format. The block address specified in that command
27863 		 * must be in LBA format.
27864 		 */
27865 		cdb[1] = 0;
27866 		rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27867 		    SD_PATH_STANDARD);
27868 		if (rval != 0) {
27869 			kmem_free(buffer, 12);
27870 			kmem_free(com, sizeof (*com));
27871 			return (rval);
27872 		}
27873 	} else {
27874 		entry->cdte_addr.msf.minute	= buffer[9];
27875 		entry->cdte_addr.msf.second	= buffer[10];
27876 		entry->cdte_addr.msf.frame	= buffer[11];
27877 		/*
27878 		 * Send a READ TOC command using the LBA address format to get
27879 		 * the LBA for the track requested so it can be used in the
27880 		 * READ HEADER request
27881 		 *
27882 		 * Note: The MSF bit of the READ HEADER command specifies the
27883 		 * output format. The block address specified in that command
27884 		 * must be in LBA format.
27885 		 */
27886 		cdb[1] = 0;
27887 		rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27888 		    SD_PATH_STANDARD);
27889 		if (rval != 0) {
27890 			kmem_free(buffer, 12);
27891 			kmem_free(com, sizeof (*com));
27892 			return (rval);
27893 		}
27894 	}
27895 
27896 	/*
27897 	 * Build and send the READ HEADER command to determine the data mode of
27898 	 * the user specified track.
27899 	 */
27900 	if ((entry->cdte_ctrl & CDROM_DATA_TRACK) &&
27901 	    (entry->cdte_track != CDROM_LEADOUT)) {
27902 		bzero(cdb, CDB_GROUP1);
27903 		cdb[0] = SCMD_READ_HEADER;
27904 		cdb[2] = buffer[8];
27905 		cdb[3] = buffer[9];
27906 		cdb[4] = buffer[10];
27907 		cdb[5] = buffer[11];
27908 		cdb[8] = 0x08;
27909 		com->uscsi_buflen = 0x08;
27910 		rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27911 		    SD_PATH_STANDARD);
27912 		if (rval == 0) {
27913 			entry->cdte_datamode = buffer[0];
27914 		} else {
27915 			/*
27916 			 * READ HEADER command failed, since this is
27917 			 * obsoleted in one spec, its better to return
27918 			 * -1 for an invlid track so that we can still
27919 			 * receive the rest of the TOC data.
27920 			 */
27921 			entry->cdte_datamode = (uchar_t)-1;
27922 		}
27923 	} else {
27924 		entry->cdte_datamode = (uchar_t)-1;
27925 	}
27926 
27927 	kmem_free(buffer, 12);
27928 	kmem_free(com, sizeof (*com));
27929 	if (ddi_copyout(entry, data, sizeof (struct cdrom_tocentry), flag) != 0)
27930 		return (EFAULT);
27931 
27932 	return (rval);
27933 }
27934 
27935 
27936 /*
27937  *    Function: sr_read_tochdr()
27938  *
27939  * Description: This routine is the driver entry point for handling CD-ROM
27940  * 		ioctl requests to read the Table of Contents (TOC) header
27941  *		(CDROMREADTOHDR). The TOC header consists of the disk starting
27942  *		and ending track numbers
27943  *
27944  *   Arguments: dev	- the device 'dev_t'
27945  *		data	- pointer to user provided toc header structure,
27946  *			  specifying the starting and ending track numbers.
27947  *		flag	- this argument is a pass through to ddi_copyxxx()
27948  *			  directly from the mode argument of ioctl().
27949  *
27950  * Return Code: the code returned by sd_send_scsi_cmd()
27951  *		EFAULT if ddi_copyxxx() fails
27952  *		ENXIO if fail ddi_get_soft_state
27953  *		EINVAL if data pointer is NULL
27954  */
27955 
27956 static int
27957 sr_read_tochdr(dev_t dev, caddr_t data, int flag)
27958 {
27959 	struct sd_lun		*un;
27960 	struct uscsi_cmd	*com;
27961 	struct cdrom_tochdr	toc_header;
27962 	struct cdrom_tochdr	*hdr = &toc_header;
27963 	char			cdb[CDB_GROUP1];
27964 	int			rval;
27965 	caddr_t			buffer;
27966 
27967 	if (data == NULL) {
27968 		return (EINVAL);
27969 	}
27970 
27971 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27972 	    (un->un_state == SD_STATE_OFFLINE)) {
27973 		return (ENXIO);
27974 	}
27975 
27976 	buffer = kmem_zalloc(4, KM_SLEEP);
27977 	bzero(cdb, CDB_GROUP1);
27978 	cdb[0] = SCMD_READ_TOC;
27979 	/*
27980 	 * Specifying a track number of 0x00 in the READ TOC command indicates
27981 	 * that the TOC header should be returned
27982 	 */
27983 	cdb[6] = 0x00;
27984 	/*
27985 	 * Bytes 7 & 8 are the 4 byte allocation length for TOC header.
27986 	 * (2 byte data len + 1 byte starting track # + 1 byte ending track #)
27987 	 */
27988 	cdb[8] = 0x04;
27989 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
27990 	com->uscsi_cdb	   = cdb;
27991 	com->uscsi_cdblen  = CDB_GROUP1;
27992 	com->uscsi_bufaddr = buffer;
27993 	com->uscsi_buflen  = 0x04;
27994 	com->uscsi_timeout = 300;
27995 	com->uscsi_flags   = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
27996 
27997 	rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
27998 	    SD_PATH_STANDARD);
27999 	if (un->un_f_cfg_read_toc_trk_bcd == TRUE) {
28000 		hdr->cdth_trk0 = BCD_TO_BYTE(buffer[2]);
28001 		hdr->cdth_trk1 = BCD_TO_BYTE(buffer[3]);
28002 	} else {
28003 		hdr->cdth_trk0 = buffer[2];
28004 		hdr->cdth_trk1 = buffer[3];
28005 	}
28006 	kmem_free(buffer, 4);
28007 	kmem_free(com, sizeof (*com));
28008 	if (ddi_copyout(hdr, data, sizeof (struct cdrom_tochdr), flag) != 0) {
28009 		return (EFAULT);
28010 	}
28011 	return (rval);
28012 }
28013 
28014 
28015 /*
28016  * Note: The following sr_read_mode1(), sr_read_cd_mode2(), sr_read_mode2(),
28017  * sr_read_cdda(), sr_read_cdxa(), routines implement driver support for
28018  * handling CDROMREAD ioctl requests for mode 1 user data, mode 2 user data,
28019  * digital audio and extended architecture digital audio. These modes are
28020  * defined in the IEC908 (Red Book), ISO10149 (Yellow Book), and the SCSI3
28021  * MMC specs.
28022  *
28023  * In addition to support for the various data formats these routines also
28024  * include support for devices that implement only the direct access READ
28025  * commands (0x08, 0x28), devices that implement the READ_CD commands
28026  * (0xBE, 0xD4), and devices that implement the vendor unique READ CDDA and
28027  * READ CDXA commands (0xD8, 0xDB)
28028  */
28029 
28030 /*
28031  *    Function: sr_read_mode1()
28032  *
28033  * Description: This routine is the driver entry point for handling CD-ROM
28034  *		ioctl read mode1 requests (CDROMREADMODE1).
28035  *
28036  *   Arguments: dev	- the device 'dev_t'
28037  *		data	- pointer to user provided cd read structure specifying
28038  *			  the lba buffer address and length.
28039  *		flag	- this argument is a pass through to ddi_copyxxx()
28040  *			  directly from the mode argument of ioctl().
28041  *
28042  * Return Code: the code returned by sd_send_scsi_cmd()
28043  *		EFAULT if ddi_copyxxx() fails
28044  *		ENXIO if fail ddi_get_soft_state
28045  *		EINVAL if data pointer is NULL
28046  */
28047 
28048 static int
28049 sr_read_mode1(dev_t dev, caddr_t data, int flag)
28050 {
28051 	struct sd_lun		*un;
28052 	struct cdrom_read	mode1_struct;
28053 	struct cdrom_read	*mode1 = &mode1_struct;
28054 	int			rval;
28055 	sd_ssc_t		*ssc;
28056 
28057 #ifdef _MULTI_DATAMODEL
28058 	/* To support ILP32 applications in an LP64 world */
28059 	struct cdrom_read32	cdrom_read32;
28060 	struct cdrom_read32	*cdrd32 = &cdrom_read32;
28061 #endif /* _MULTI_DATAMODEL */
28062 
28063 	if (data == NULL) {
28064 		return (EINVAL);
28065 	}
28066 
28067 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28068 	    (un->un_state == SD_STATE_OFFLINE)) {
28069 		return (ENXIO);
28070 	}
28071 
28072 	SD_TRACE(SD_LOG_ATTACH_DETACH, un,
28073 	    "sd_read_mode1: entry: un:0x%p\n", un);
28074 
28075 #ifdef _MULTI_DATAMODEL
28076 	switch (ddi_model_convert_from(flag & FMODELS)) {
28077 	case DDI_MODEL_ILP32:
28078 		if (ddi_copyin(data, cdrd32, sizeof (*cdrd32), flag) != 0) {
28079 			return (EFAULT);
28080 		}
28081 		/* Convert the ILP32 uscsi data from the application to LP64 */
28082 		cdrom_read32tocdrom_read(cdrd32, mode1);
28083 		break;
28084 	case DDI_MODEL_NONE:
28085 		if (ddi_copyin(data, mode1, sizeof (struct cdrom_read), flag)) {
28086 			return (EFAULT);
28087 		}
28088 	}
28089 #else /* ! _MULTI_DATAMODEL */
28090 	if (ddi_copyin(data, mode1, sizeof (struct cdrom_read), flag)) {
28091 		return (EFAULT);
28092 	}
28093 #endif /* _MULTI_DATAMODEL */
28094 
28095 	ssc = sd_ssc_init(un);
28096 	rval = sd_send_scsi_READ(ssc, mode1->cdread_bufaddr,
28097 	    mode1->cdread_buflen, mode1->cdread_lba, SD_PATH_STANDARD);
28098 	sd_ssc_fini(ssc);
28099 
28100 	SD_TRACE(SD_LOG_ATTACH_DETACH, un,
28101 	    "sd_read_mode1: exit: un:0x%p\n", un);
28102 
28103 	return (rval);
28104 }
28105 
28106 
28107 /*
28108  *    Function: sr_read_cd_mode2()
28109  *
28110  * Description: This routine is the driver entry point for handling CD-ROM
28111  *		ioctl read mode2 requests (CDROMREADMODE2) for devices that
28112  *		support the READ CD (0xBE) command or the 1st generation
28113  *		READ CD (0xD4) command.
28114  *
28115  *   Arguments: dev	- the device 'dev_t'
28116  *		data	- pointer to user provided cd read structure specifying
28117  *			  the lba buffer address and length.
28118  *		flag	- this argument is a pass through to ddi_copyxxx()
28119  *			  directly from the mode argument of ioctl().
28120  *
28121  * Return Code: the code returned by sd_send_scsi_cmd()
28122  *		EFAULT if ddi_copyxxx() fails
28123  *		ENXIO if fail ddi_get_soft_state
28124  *		EINVAL if data pointer is NULL
28125  */
28126 
28127 static int
28128 sr_read_cd_mode2(dev_t dev, caddr_t data, int flag)
28129 {
28130 	struct sd_lun		*un;
28131 	struct uscsi_cmd	*com;
28132 	struct cdrom_read	mode2_struct;
28133 	struct cdrom_read	*mode2 = &mode2_struct;
28134 	uchar_t			cdb[CDB_GROUP5];
28135 	int			nblocks;
28136 	int			rval;
28137 #ifdef _MULTI_DATAMODEL
28138 	/*  To support ILP32 applications in an LP64 world */
28139 	struct cdrom_read32	cdrom_read32;
28140 	struct cdrom_read32	*cdrd32 = &cdrom_read32;
28141 #endif /* _MULTI_DATAMODEL */
28142 
28143 	if (data == NULL) {
28144 		return (EINVAL);
28145 	}
28146 
28147 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28148 	    (un->un_state == SD_STATE_OFFLINE)) {
28149 		return (ENXIO);
28150 	}
28151 
28152 #ifdef _MULTI_DATAMODEL
28153 	switch (ddi_model_convert_from(flag & FMODELS)) {
28154 	case DDI_MODEL_ILP32:
28155 		if (ddi_copyin(data, cdrd32, sizeof (*cdrd32), flag) != 0) {
28156 			return (EFAULT);
28157 		}
28158 		/* Convert the ILP32 uscsi data from the application to LP64 */
28159 		cdrom_read32tocdrom_read(cdrd32, mode2);
28160 		break;
28161 	case DDI_MODEL_NONE:
28162 		if (ddi_copyin(data, mode2, sizeof (*mode2), flag) != 0) {
28163 			return (EFAULT);
28164 		}
28165 		break;
28166 	}
28167 
28168 #else /* ! _MULTI_DATAMODEL */
28169 	if (ddi_copyin(data, mode2, sizeof (*mode2), flag) != 0) {
28170 		return (EFAULT);
28171 	}
28172 #endif /* _MULTI_DATAMODEL */
28173 
28174 	bzero(cdb, sizeof (cdb));
28175 	if (un->un_f_cfg_read_cd_xd4 == TRUE) {
28176 		/* Read command supported by 1st generation atapi drives */
28177 		cdb[0] = SCMD_READ_CDD4;
28178 	} else {
28179 		/* Universal CD Access Command */
28180 		cdb[0] = SCMD_READ_CD;
28181 	}
28182 
28183 	/*
28184 	 * Set expected sector type to: 2336s byte, Mode 2 Yellow Book
28185 	 */
28186 	cdb[1] = CDROM_SECTOR_TYPE_MODE2;
28187 
28188 	/* set the start address */
28189 	cdb[2] = (uchar_t)((mode2->cdread_lba >> 24) & 0XFF);
28190 	cdb[3] = (uchar_t)((mode2->cdread_lba >> 16) & 0XFF);
28191 	cdb[4] = (uchar_t)((mode2->cdread_lba >> 8) & 0xFF);
28192 	cdb[5] = (uchar_t)(mode2->cdread_lba & 0xFF);
28193 
28194 	/* set the transfer length */
28195 	nblocks = mode2->cdread_buflen / 2336;
28196 	cdb[6] = (uchar_t)(nblocks >> 16);
28197 	cdb[7] = (uchar_t)(nblocks >> 8);
28198 	cdb[8] = (uchar_t)nblocks;
28199 
28200 	/* set the filter bits */
28201 	cdb[9] = CDROM_READ_CD_USERDATA;
28202 
28203 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
28204 	com->uscsi_cdb = (caddr_t)cdb;
28205 	com->uscsi_cdblen = sizeof (cdb);
28206 	com->uscsi_bufaddr = mode2->cdread_bufaddr;
28207 	com->uscsi_buflen = mode2->cdread_buflen;
28208 	com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
28209 
28210 	rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE,
28211 	    SD_PATH_STANDARD);
28212 	kmem_free(com, sizeof (*com));
28213 	return (rval);
28214 }
28215 
28216 
28217 /*
28218  *    Function: sr_read_mode2()
28219  *
28220  * Description: This routine is the driver entry point for handling CD-ROM
28221  *		ioctl read mode2 requests (CDROMREADMODE2) for devices that
28222  *		do not support the READ CD (0xBE) command.
28223  *
28224  *   Arguments: dev	- the device 'dev_t'
28225  *		data	- pointer to user provided cd read structure specifying
28226  *			  the lba buffer address and length.
28227  *		flag	- this argument is a pass through to ddi_copyxxx()
28228  *			  directly from the mode argument of ioctl().
28229  *
28230  * Return Code: the code returned by sd_send_scsi_cmd()
28231  *		EFAULT if ddi_copyxxx() fails
28232  *		ENXIO if fail ddi_get_soft_state
28233  *		EINVAL if data pointer is NULL
28234  *		EIO if fail to reset block size
28235  *		EAGAIN if commands are in progress in the driver
28236  */
28237 
28238 static int
28239 sr_read_mode2(dev_t dev, caddr_t data, int flag)
28240 {
28241 	struct sd_lun		*un;
28242 	struct cdrom_read	mode2_struct;
28243 	struct cdrom_read	*mode2 = &mode2_struct;
28244 	int			rval;
28245 	uint32_t		restore_blksize;
28246 	struct uscsi_cmd	*com;
28247 	uchar_t			cdb[CDB_GROUP0];
28248 	int			nblocks;
28249 
28250 #ifdef _MULTI_DATAMODEL
28251 	/* To support ILP32 applications in an LP64 world */
28252 	struct cdrom_read32	cdrom_read32;
28253 	struct cdrom_read32	*cdrd32 = &cdrom_read32;
28254 #endif /* _MULTI_DATAMODEL */
28255 
28256 	if (data == NULL) {
28257 		return (EINVAL);
28258 	}
28259 
28260 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28261 	    (un->un_state == SD_STATE_OFFLINE)) {
28262 		return (ENXIO);
28263 	}
28264 
28265 	/*
28266 	 * Because this routine will update the device and driver block size
28267 	 * being used we want to make sure there are no commands in progress.
28268 	 * If commands are in progress the user will have to try again.
28269 	 *
28270 	 * We check for 1 instead of 0 because we increment un_ncmds_in_driver
28271 	 * in sdioctl to protect commands from sdioctl through to the top of
28272 	 * sd_uscsi_strategy. See sdioctl for details.
28273 	 */
28274 	mutex_enter(SD_MUTEX(un));
28275 	if (un->un_ncmds_in_driver != 1) {
28276 		mutex_exit(SD_MUTEX(un));
28277 		return (EAGAIN);
28278 	}
28279 	mutex_exit(SD_MUTEX(un));
28280 
28281 	SD_TRACE(SD_LOG_ATTACH_DETACH, un,
28282 	    "sd_read_mode2: entry: un:0x%p\n", un);
28283 
28284 #ifdef _MULTI_DATAMODEL
28285 	switch (ddi_model_convert_from(flag & FMODELS)) {
28286 	case DDI_MODEL_ILP32:
28287 		if (ddi_copyin(data, cdrd32, sizeof (*cdrd32), flag) != 0) {
28288 			return (EFAULT);
28289 		}
28290 		/* Convert the ILP32 uscsi data from the application to LP64 */
28291 		cdrom_read32tocdrom_read(cdrd32, mode2);
28292 		break;
28293 	case DDI_MODEL_NONE:
28294 		if (ddi_copyin(data, mode2, sizeof (*mode2), flag) != 0) {
28295 			return (EFAULT);
28296 		}
28297 		break;
28298 	}
28299 #else /* ! _MULTI_DATAMODEL */
28300 	if (ddi_copyin(data, mode2, sizeof (*mode2), flag)) {
28301 		return (EFAULT);
28302 	}
28303 #endif /* _MULTI_DATAMODEL */
28304 
28305 	/* Store the current target block size for restoration later */
28306 	restore_blksize = un->un_tgt_blocksize;
28307 
28308 	/* Change the device and soft state target block size to 2336 */
28309 	if (sr_sector_mode(dev, SD_MODE2_BLKSIZE) != 0) {
28310 		rval = EIO;
28311 		goto done;
28312 	}
28313 
28314 
28315 	bzero(cdb, sizeof (cdb));
28316 
28317 	/* set READ operation */
28318 	cdb[0] = SCMD_READ;
28319 
28320 	/* adjust lba for 2kbyte blocks from 512 byte blocks */
28321 	mode2->cdread_lba >>= 2;
28322 
28323 	/* set the start address */
28324 	cdb[1] = (uchar_t)((mode2->cdread_lba >> 16) & 0X1F);
28325 	cdb[2] = (uchar_t)((mode2->cdread_lba >> 8) & 0xFF);
28326 	cdb[3] = (uchar_t)(mode2->cdread_lba & 0xFF);
28327 
28328 	/* set the transfer length */
28329 	nblocks = mode2->cdread_buflen / 2336;
28330 	cdb[4] = (uchar_t)nblocks & 0xFF;
28331 
28332 	/* build command */
28333 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
28334 	com->uscsi_cdb = (caddr_t)cdb;
28335 	com->uscsi_cdblen = sizeof (cdb);
28336 	com->uscsi_bufaddr = mode2->cdread_bufaddr;
28337 	com->uscsi_buflen = mode2->cdread_buflen;
28338 	com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
28339 
28340 	/*
28341 	 * Issue SCSI command with user space address for read buffer.
28342 	 *
28343 	 * This sends the command through main channel in the driver.
28344 	 *
28345 	 * Since this is accessed via an IOCTL call, we go through the
28346 	 * standard path, so that if the device was powered down, then
28347 	 * it would be 'awakened' to handle the command.
28348 	 */
28349 	rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE,
28350 	    SD_PATH_STANDARD);
28351 
28352 	kmem_free(com, sizeof (*com));
28353 
28354 	/* Restore the device and soft state target block size */
28355 	if (sr_sector_mode(dev, restore_blksize) != 0) {
28356 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28357 		    "can't do switch back to mode 1\n");
28358 		/*
28359 		 * If sd_send_scsi_READ succeeded we still need to report
28360 		 * an error because we failed to reset the block size
28361 		 */
28362 		if (rval == 0) {
28363 			rval = EIO;
28364 		}
28365 	}
28366 
28367 done:
28368 	SD_TRACE(SD_LOG_ATTACH_DETACH, un,
28369 	    "sd_read_mode2: exit: un:0x%p\n", un);
28370 
28371 	return (rval);
28372 }
28373 
28374 
28375 /*
28376  *    Function: sr_sector_mode()
28377  *
28378  * Description: This utility function is used by sr_read_mode2 to set the target
28379  *		block size based on the user specified size. This is a legacy
28380  *		implementation based upon a vendor specific mode page
28381  *
28382  *   Arguments: dev	- the device 'dev_t'
28383  *		data	- flag indicating if block size is being set to 2336 or
28384  *			  512.
28385  *
28386  * Return Code: the code returned by sd_send_scsi_cmd()
28387  *		EFAULT if ddi_copyxxx() fails
28388  *		ENXIO if fail ddi_get_soft_state
28389  *		EINVAL if data pointer is NULL
28390  */
28391 
28392 static int
28393 sr_sector_mode(dev_t dev, uint32_t blksize)
28394 {
28395 	struct sd_lun	*un;
28396 	uchar_t		*sense;
28397 	uchar_t		*select;
28398 	int		rval;
28399 	sd_ssc_t	*ssc;
28400 
28401 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28402 	    (un->un_state == SD_STATE_OFFLINE)) {
28403 		return (ENXIO);
28404 	}
28405 
28406 	sense = kmem_zalloc(20, KM_SLEEP);
28407 
28408 	/* Note: This is a vendor specific mode page (0x81) */
28409 	ssc = sd_ssc_init(un);
28410 	rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense, 20, 0x81,
28411 	    SD_PATH_STANDARD);
28412 	sd_ssc_fini(ssc);
28413 	if (rval != 0) {
28414 		SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
28415 		    "sr_sector_mode: Mode Sense failed\n");
28416 		kmem_free(sense, 20);
28417 		return (rval);
28418 	}
28419 	select = kmem_zalloc(20, KM_SLEEP);
28420 	select[3] = 0x08;
28421 	select[10] = ((blksize >> 8) & 0xff);
28422 	select[11] = (blksize & 0xff);
28423 	select[12] = 0x01;
28424 	select[13] = 0x06;
28425 	select[14] = sense[14];
28426 	select[15] = sense[15];
28427 	if (blksize == SD_MODE2_BLKSIZE) {
28428 		select[14] |= 0x01;
28429 	}
28430 
28431 	ssc = sd_ssc_init(un);
28432 	rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select, 20,
28433 	    SD_DONTSAVE_PAGE, SD_PATH_STANDARD);
28434 	sd_ssc_fini(ssc);
28435 	if (rval != 0) {
28436 		SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
28437 		    "sr_sector_mode: Mode Select failed\n");
28438 	} else {
28439 		/*
28440 		 * Only update the softstate block size if we successfully
28441 		 * changed the device block mode.
28442 		 */
28443 		mutex_enter(SD_MUTEX(un));
28444 		sd_update_block_info(un, blksize, 0);
28445 		mutex_exit(SD_MUTEX(un));
28446 	}
28447 	kmem_free(sense, 20);
28448 	kmem_free(select, 20);
28449 	return (rval);
28450 }
28451 
28452 
28453 /*
28454  *    Function: sr_read_cdda()
28455  *
28456  * Description: This routine is the driver entry point for handling CD-ROM
28457  *		ioctl requests to return CD-DA or subcode data. (CDROMCDDA) If
28458  *		the target supports CDDA these requests are handled via a vendor
28459  *		specific command (0xD8) If the target does not support CDDA
28460  *		these requests are handled via the READ CD command (0xBE).
28461  *
28462  *   Arguments: dev	- the device 'dev_t'
28463  *		data	- pointer to user provided CD-DA structure specifying
28464  *			  the track starting address, transfer length, and
28465  *			  subcode options.
28466  *		flag	- this argument is a pass through to ddi_copyxxx()
28467  *			  directly from the mode argument of ioctl().
28468  *
28469  * Return Code: the code returned by sd_send_scsi_cmd()
28470  *		EFAULT if ddi_copyxxx() fails
28471  *		ENXIO if fail ddi_get_soft_state
28472  *		EINVAL if invalid arguments are provided
28473  *		ENOTTY
28474  */
28475 
28476 static int
28477 sr_read_cdda(dev_t dev, caddr_t data, int flag)
28478 {
28479 	struct sd_lun			*un;
28480 	struct uscsi_cmd		*com;
28481 	struct cdrom_cdda		*cdda;
28482 	int				rval;
28483 	size_t				buflen;
28484 	char				cdb[CDB_GROUP5];
28485 
28486 #ifdef _MULTI_DATAMODEL
28487 	/* To support ILP32 applications in an LP64 world */
28488 	struct cdrom_cdda32	cdrom_cdda32;
28489 	struct cdrom_cdda32	*cdda32 = &cdrom_cdda32;
28490 #endif /* _MULTI_DATAMODEL */
28491 
28492 	if (data == NULL) {
28493 		return (EINVAL);
28494 	}
28495 
28496 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
28497 		return (ENXIO);
28498 	}
28499 
28500 	cdda = kmem_zalloc(sizeof (struct cdrom_cdda), KM_SLEEP);
28501 
28502 #ifdef _MULTI_DATAMODEL
28503 	switch (ddi_model_convert_from(flag & FMODELS)) {
28504 	case DDI_MODEL_ILP32:
28505 		if (ddi_copyin(data, cdda32, sizeof (*cdda32), flag)) {
28506 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28507 			    "sr_read_cdda: ddi_copyin Failed\n");
28508 			kmem_free(cdda, sizeof (struct cdrom_cdda));
28509 			return (EFAULT);
28510 		}
28511 		/* Convert the ILP32 uscsi data from the application to LP64 */
28512 		cdrom_cdda32tocdrom_cdda(cdda32, cdda);
28513 		break;
28514 	case DDI_MODEL_NONE:
28515 		if (ddi_copyin(data, cdda, sizeof (struct cdrom_cdda), flag)) {
28516 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28517 			    "sr_read_cdda: ddi_copyin Failed\n");
28518 			kmem_free(cdda, sizeof (struct cdrom_cdda));
28519 			return (EFAULT);
28520 		}
28521 		break;
28522 	}
28523 #else /* ! _MULTI_DATAMODEL */
28524 	if (ddi_copyin(data, cdda, sizeof (struct cdrom_cdda), flag)) {
28525 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28526 		    "sr_read_cdda: ddi_copyin Failed\n");
28527 		kmem_free(cdda, sizeof (struct cdrom_cdda));
28528 		return (EFAULT);
28529 	}
28530 #endif /* _MULTI_DATAMODEL */
28531 
28532 	/*
28533 	 * Since MMC-2 expects max 3 bytes for length, check if the
28534 	 * length input is greater than 3 bytes
28535 	 */
28536 	if ((cdda->cdda_length & 0xFF000000) != 0) {
28537 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_read_cdda: "
28538 		    "cdrom transfer length too large: %d (limit %d)\n",
28539 		    cdda->cdda_length, 0xFFFFFF);
28540 		kmem_free(cdda, sizeof (struct cdrom_cdda));
28541 		return (EINVAL);
28542 	}
28543 
28544 	switch (cdda->cdda_subcode) {
28545 	case CDROM_DA_NO_SUBCODE:
28546 		buflen = CDROM_BLK_2352 * cdda->cdda_length;
28547 		break;
28548 	case CDROM_DA_SUBQ:
28549 		buflen = CDROM_BLK_2368 * cdda->cdda_length;
28550 		break;
28551 	case CDROM_DA_ALL_SUBCODE:
28552 		buflen = CDROM_BLK_2448 * cdda->cdda_length;
28553 		break;
28554 	case CDROM_DA_SUBCODE_ONLY:
28555 		buflen = CDROM_BLK_SUBCODE * cdda->cdda_length;
28556 		break;
28557 	default:
28558 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28559 		    "sr_read_cdda: Subcode '0x%x' Not Supported\n",
28560 		    cdda->cdda_subcode);
28561 		kmem_free(cdda, sizeof (struct cdrom_cdda));
28562 		return (EINVAL);
28563 	}
28564 
28565 	/* Build and send the command */
28566 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
28567 	bzero(cdb, CDB_GROUP5);
28568 
28569 	if (un->un_f_cfg_cdda == TRUE) {
28570 		cdb[0] = (char)SCMD_READ_CD;
28571 		cdb[1] = 0x04;
28572 		cdb[2] = (((cdda->cdda_addr) & 0xff000000) >> 24);
28573 		cdb[3] = (((cdda->cdda_addr) & 0x00ff0000) >> 16);
28574 		cdb[4] = (((cdda->cdda_addr) & 0x0000ff00) >> 8);
28575 		cdb[5] = ((cdda->cdda_addr) & 0x000000ff);
28576 		cdb[6] = (((cdda->cdda_length) & 0x00ff0000) >> 16);
28577 		cdb[7] = (((cdda->cdda_length) & 0x0000ff00) >> 8);
28578 		cdb[8] = ((cdda->cdda_length) & 0x000000ff);
28579 		cdb[9] = 0x10;
28580 		switch (cdda->cdda_subcode) {
28581 		case CDROM_DA_NO_SUBCODE :
28582 			cdb[10] = 0x0;
28583 			break;
28584 		case CDROM_DA_SUBQ :
28585 			cdb[10] = 0x2;
28586 			break;
28587 		case CDROM_DA_ALL_SUBCODE :
28588 			cdb[10] = 0x1;
28589 			break;
28590 		case CDROM_DA_SUBCODE_ONLY :
28591 			/* FALLTHROUGH */
28592 		default :
28593 			kmem_free(cdda, sizeof (struct cdrom_cdda));
28594 			kmem_free(com, sizeof (*com));
28595 			return (ENOTTY);
28596 		}
28597 	} else {
28598 		cdb[0] = (char)SCMD_READ_CDDA;
28599 		cdb[2] = (((cdda->cdda_addr) & 0xff000000) >> 24);
28600 		cdb[3] = (((cdda->cdda_addr) & 0x00ff0000) >> 16);
28601 		cdb[4] = (((cdda->cdda_addr) & 0x0000ff00) >> 8);
28602 		cdb[5] = ((cdda->cdda_addr) & 0x000000ff);
28603 		cdb[6] = (((cdda->cdda_length) & 0xff000000) >> 24);
28604 		cdb[7] = (((cdda->cdda_length) & 0x00ff0000) >> 16);
28605 		cdb[8] = (((cdda->cdda_length) & 0x0000ff00) >> 8);
28606 		cdb[9] = ((cdda->cdda_length) & 0x000000ff);
28607 		cdb[10] = cdda->cdda_subcode;
28608 	}
28609 
28610 	com->uscsi_cdb = cdb;
28611 	com->uscsi_cdblen = CDB_GROUP5;
28612 	com->uscsi_bufaddr = (caddr_t)cdda->cdda_data;
28613 	com->uscsi_buflen = buflen;
28614 	com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
28615 
28616 	rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE,
28617 	    SD_PATH_STANDARD);
28618 
28619 	kmem_free(cdda, sizeof (struct cdrom_cdda));
28620 	kmem_free(com, sizeof (*com));
28621 	return (rval);
28622 }
28623 
28624 
28625 /*
28626  *    Function: sr_read_cdxa()
28627  *
28628  * Description: This routine is the driver entry point for handling CD-ROM
28629  *		ioctl requests to return CD-XA (Extended Architecture) data.
28630  *		(CDROMCDXA).
28631  *
28632  *   Arguments: dev	- the device 'dev_t'
28633  *		data	- pointer to user provided CD-XA structure specifying
28634  *			  the data starting address, transfer length, and format
28635  *		flag	- this argument is a pass through to ddi_copyxxx()
28636  *			  directly from the mode argument of ioctl().
28637  *
28638  * Return Code: the code returned by sd_send_scsi_cmd()
28639  *		EFAULT if ddi_copyxxx() fails
28640  *		ENXIO if fail ddi_get_soft_state
28641  *		EINVAL if data pointer is NULL
28642  */
28643 
28644 static int
28645 sr_read_cdxa(dev_t dev, caddr_t data, int flag)
28646 {
28647 	struct sd_lun		*un;
28648 	struct uscsi_cmd	*com;
28649 	struct cdrom_cdxa	*cdxa;
28650 	int			rval;
28651 	size_t			buflen;
28652 	char			cdb[CDB_GROUP5];
28653 	uchar_t			read_flags;
28654 
28655 #ifdef _MULTI_DATAMODEL
28656 	/* To support ILP32 applications in an LP64 world */
28657 	struct cdrom_cdxa32		cdrom_cdxa32;
28658 	struct cdrom_cdxa32		*cdxa32 = &cdrom_cdxa32;
28659 #endif /* _MULTI_DATAMODEL */
28660 
28661 	if (data == NULL) {
28662 		return (EINVAL);
28663 	}
28664 
28665 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
28666 		return (ENXIO);
28667 	}
28668 
28669 	cdxa = kmem_zalloc(sizeof (struct cdrom_cdxa), KM_SLEEP);
28670 
28671 #ifdef _MULTI_DATAMODEL
28672 	switch (ddi_model_convert_from(flag & FMODELS)) {
28673 	case DDI_MODEL_ILP32:
28674 		if (ddi_copyin(data, cdxa32, sizeof (*cdxa32), flag)) {
28675 			kmem_free(cdxa, sizeof (struct cdrom_cdxa));
28676 			return (EFAULT);
28677 		}
28678 		/*
28679 		 * Convert the ILP32 uscsi data from the
28680 		 * application to LP64 for internal use.
28681 		 */
28682 		cdrom_cdxa32tocdrom_cdxa(cdxa32, cdxa);
28683 		break;
28684 	case DDI_MODEL_NONE:
28685 		if (ddi_copyin(data, cdxa, sizeof (struct cdrom_cdxa), flag)) {
28686 			kmem_free(cdxa, sizeof (struct cdrom_cdxa));
28687 			return (EFAULT);
28688 		}
28689 		break;
28690 	}
28691 #else /* ! _MULTI_DATAMODEL */
28692 	if (ddi_copyin(data, cdxa, sizeof (struct cdrom_cdxa), flag)) {
28693 		kmem_free(cdxa, sizeof (struct cdrom_cdxa));
28694 		return (EFAULT);
28695 	}
28696 #endif /* _MULTI_DATAMODEL */
28697 
28698 	/*
28699 	 * Since MMC-2 expects max 3 bytes for length, check if the
28700 	 * length input is greater than 3 bytes
28701 	 */
28702 	if ((cdxa->cdxa_length & 0xFF000000) != 0) {
28703 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_read_cdxa: "
28704 		    "cdrom transfer length too large: %d (limit %d)\n",
28705 		    cdxa->cdxa_length, 0xFFFFFF);
28706 		kmem_free(cdxa, sizeof (struct cdrom_cdxa));
28707 		return (EINVAL);
28708 	}
28709 
28710 	switch (cdxa->cdxa_format) {
28711 	case CDROM_XA_DATA:
28712 		buflen = CDROM_BLK_2048 * cdxa->cdxa_length;
28713 		read_flags = 0x10;
28714 		break;
28715 	case CDROM_XA_SECTOR_DATA:
28716 		buflen = CDROM_BLK_2352 * cdxa->cdxa_length;
28717 		read_flags = 0xf8;
28718 		break;
28719 	case CDROM_XA_DATA_W_ERROR:
28720 		buflen = CDROM_BLK_2646 * cdxa->cdxa_length;
28721 		read_flags = 0xfc;
28722 		break;
28723 	default:
28724 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28725 		    "sr_read_cdxa: Format '0x%x' Not Supported\n",
28726 		    cdxa->cdxa_format);
28727 		kmem_free(cdxa, sizeof (struct cdrom_cdxa));
28728 		return (EINVAL);
28729 	}
28730 
28731 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
28732 	bzero(cdb, CDB_GROUP5);
28733 	if (un->un_f_mmc_cap == TRUE) {
28734 		cdb[0] = (char)SCMD_READ_CD;
28735 		cdb[2] = (((cdxa->cdxa_addr) & 0xff000000) >> 24);
28736 		cdb[3] = (((cdxa->cdxa_addr) & 0x00ff0000) >> 16);
28737 		cdb[4] = (((cdxa->cdxa_addr) & 0x0000ff00) >> 8);
28738 		cdb[5] = ((cdxa->cdxa_addr) & 0x000000ff);
28739 		cdb[6] = (((cdxa->cdxa_length) & 0x00ff0000) >> 16);
28740 		cdb[7] = (((cdxa->cdxa_length) & 0x0000ff00) >> 8);
28741 		cdb[8] = ((cdxa->cdxa_length) & 0x000000ff);
28742 		cdb[9] = (char)read_flags;
28743 	} else {
28744 		/*
28745 		 * Note: A vendor specific command (0xDB) is being used her to
28746 		 * request a read of all subcodes.
28747 		 */
28748 		cdb[0] = (char)SCMD_READ_CDXA;
28749 		cdb[2] = (((cdxa->cdxa_addr) & 0xff000000) >> 24);
28750 		cdb[3] = (((cdxa->cdxa_addr) & 0x00ff0000) >> 16);
28751 		cdb[4] = (((cdxa->cdxa_addr) & 0x0000ff00) >> 8);
28752 		cdb[5] = ((cdxa->cdxa_addr) & 0x000000ff);
28753 		cdb[6] = (((cdxa->cdxa_length) & 0xff000000) >> 24);
28754 		cdb[7] = (((cdxa->cdxa_length) & 0x00ff0000) >> 16);
28755 		cdb[8] = (((cdxa->cdxa_length) & 0x0000ff00) >> 8);
28756 		cdb[9] = ((cdxa->cdxa_length) & 0x000000ff);
28757 		cdb[10] = cdxa->cdxa_format;
28758 	}
28759 	com->uscsi_cdb	   = cdb;
28760 	com->uscsi_cdblen  = CDB_GROUP5;
28761 	com->uscsi_bufaddr = (caddr_t)cdxa->cdxa_data;
28762 	com->uscsi_buflen  = buflen;
28763 	com->uscsi_flags   = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
28764 	rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_USERSPACE,
28765 	    SD_PATH_STANDARD);
28766 	kmem_free(cdxa, sizeof (struct cdrom_cdxa));
28767 	kmem_free(com, sizeof (*com));
28768 	return (rval);
28769 }
28770 
28771 
28772 /*
28773  *    Function: sr_eject()
28774  *
28775  * Description: This routine is the driver entry point for handling CD-ROM
28776  *		eject ioctl requests (FDEJECT, DKIOCEJECT, CDROMEJECT)
28777  *
28778  *   Arguments: dev	- the device 'dev_t'
28779  *
28780  * Return Code: the code returned by sd_send_scsi_cmd()
28781  */
28782 
28783 static int
28784 sr_eject(dev_t dev)
28785 {
28786 	struct sd_lun	*un;
28787 	int		rval;
28788 	sd_ssc_t	*ssc;
28789 
28790 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28791 	    (un->un_state == SD_STATE_OFFLINE)) {
28792 		return (ENXIO);
28793 	}
28794 
28795 	/*
28796 	 * To prevent race conditions with the eject
28797 	 * command, keep track of an eject command as
28798 	 * it progresses. If we are already handling
28799 	 * an eject command in the driver for the given
28800 	 * unit and another request to eject is received
28801 	 * immediately return EAGAIN so we don't lose
28802 	 * the command if the current eject command fails.
28803 	 */
28804 	mutex_enter(SD_MUTEX(un));
28805 	if (un->un_f_ejecting == TRUE) {
28806 		mutex_exit(SD_MUTEX(un));
28807 		return (EAGAIN);
28808 	}
28809 	un->un_f_ejecting = TRUE;
28810 	mutex_exit(SD_MUTEX(un));
28811 
28812 	ssc = sd_ssc_init(un);
28813 	rval = sd_send_scsi_DOORLOCK(ssc, SD_REMOVAL_ALLOW,
28814 	    SD_PATH_STANDARD);
28815 	sd_ssc_fini(ssc);
28816 
28817 	if (rval != 0) {
28818 		mutex_enter(SD_MUTEX(un));
28819 		un->un_f_ejecting = FALSE;
28820 		mutex_exit(SD_MUTEX(un));
28821 		return (rval);
28822 	}
28823 
28824 	ssc = sd_ssc_init(un);
28825 	rval = sd_send_scsi_START_STOP_UNIT(ssc, SD_START_STOP,
28826 	    SD_TARGET_EJECT, SD_PATH_STANDARD);
28827 	sd_ssc_fini(ssc);
28828 
28829 	if (rval == 0) {
28830 		mutex_enter(SD_MUTEX(un));
28831 		sr_ejected(un);
28832 		un->un_mediastate = DKIO_EJECTED;
28833 		un->un_f_ejecting = FALSE;
28834 		cv_broadcast(&un->un_state_cv);
28835 		mutex_exit(SD_MUTEX(un));
28836 	} else {
28837 		mutex_enter(SD_MUTEX(un));
28838 		un->un_f_ejecting = FALSE;
28839 		mutex_exit(SD_MUTEX(un));
28840 	}
28841 	return (rval);
28842 }
28843 
28844 
28845 /*
28846  *    Function: sr_ejected()
28847  *
28848  * Description: This routine updates the soft state structure to invalidate the
28849  *		geometry information after the media has been ejected or a
28850  *		media eject has been detected.
28851  *
28852  *   Arguments: un - driver soft state (unit) structure
28853  */
28854 
28855 static void
28856 sr_ejected(struct sd_lun *un)
28857 {
28858 	struct sd_errstats *stp;
28859 
28860 	ASSERT(un != NULL);
28861 	ASSERT(mutex_owned(SD_MUTEX(un)));
28862 
28863 	un->un_f_blockcount_is_valid	= FALSE;
28864 	un->un_f_tgt_blocksize_is_valid	= FALSE;
28865 	mutex_exit(SD_MUTEX(un));
28866 	cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT_PRIORITY);
28867 	mutex_enter(SD_MUTEX(un));
28868 
28869 	if (un->un_errstats != NULL) {
28870 		stp = (struct sd_errstats *)un->un_errstats->ks_data;
28871 		stp->sd_capacity.value.ui64 = 0;
28872 	}
28873 }
28874 
28875 
28876 /*
28877  *    Function: sr_check_wp()
28878  *
28879  * Description: This routine checks the write protection of a removable
28880  *      media disk and hotpluggable devices via the write protect bit of
28881  *      the Mode Page Header device specific field. Some devices choke
28882  *      on unsupported mode page. In order to workaround this issue,
28883  *      this routine has been implemented to use 0x3f mode page(request
28884  *      for all pages) for all device types.
28885  *
28886  *   Arguments: dev             - the device 'dev_t'
28887  *
28888  * Return Code: int indicating if the device is write protected (1) or not (0)
28889  *
28890  *     Context: Kernel thread.
28891  *
28892  */
28893 
28894 static int
28895 sr_check_wp(dev_t dev)
28896 {
28897 	struct sd_lun	*un;
28898 	uchar_t		device_specific;
28899 	uchar_t		*sense;
28900 	int		hdrlen;
28901 	int		rval = FALSE;
28902 	int		status;
28903 	sd_ssc_t	*ssc;
28904 
28905 	/*
28906 	 * Note: The return codes for this routine should be reworked to
28907 	 * properly handle the case of a NULL softstate.
28908 	 */
28909 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
28910 		return (FALSE);
28911 	}
28912 
28913 	if (un->un_f_cfg_is_atapi == TRUE) {
28914 		/*
28915 		 * The mode page contents are not required; set the allocation
28916 		 * length for the mode page header only
28917 		 */
28918 		hdrlen = MODE_HEADER_LENGTH_GRP2;
28919 		sense = kmem_zalloc(hdrlen, KM_SLEEP);
28920 		ssc = sd_ssc_init(un);
28921 		status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, sense, hdrlen,
28922 		    MODEPAGE_ALLPAGES, SD_PATH_STANDARD);
28923 		sd_ssc_fini(ssc);
28924 		if (status != 0)
28925 			goto err_exit;
28926 		device_specific =
28927 		    ((struct mode_header_grp2 *)sense)->device_specific;
28928 	} else {
28929 		hdrlen = MODE_HEADER_LENGTH;
28930 		sense = kmem_zalloc(hdrlen, KM_SLEEP);
28931 		ssc = sd_ssc_init(un);
28932 		status = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense, hdrlen,
28933 		    MODEPAGE_ALLPAGES, SD_PATH_STANDARD);
28934 		sd_ssc_fini(ssc);
28935 		if (status != 0)
28936 			goto err_exit;
28937 		device_specific =
28938 		    ((struct mode_header *)sense)->device_specific;
28939 	}
28940 
28941 
28942 	/*
28943 	 * Write protect mode sense failed; not all disks
28944 	 * understand this query. Return FALSE assuming that
28945 	 * these devices are not writable.
28946 	 */
28947 	if (device_specific & WRITE_PROTECT) {
28948 		rval = TRUE;
28949 	}
28950 
28951 err_exit:
28952 	kmem_free(sense, hdrlen);
28953 	return (rval);
28954 }
28955 
28956 /*
28957  *    Function: sr_volume_ctrl()
28958  *
28959  * Description: This routine is the driver entry point for handling CD-ROM
28960  *		audio output volume ioctl requests. (CDROMVOLCTRL)
28961  *
28962  *   Arguments: dev	- the device 'dev_t'
28963  *		data	- pointer to user audio volume control structure
28964  *		flag	- this argument is a pass through to ddi_copyxxx()
28965  *			  directly from the mode argument of ioctl().
28966  *
28967  * Return Code: the code returned by sd_send_scsi_cmd()
28968  *		EFAULT if ddi_copyxxx() fails
28969  *		ENXIO if fail ddi_get_soft_state
28970  *		EINVAL if data pointer is NULL
28971  *
28972  */
28973 
28974 static int
28975 sr_volume_ctrl(dev_t dev, caddr_t data, int flag)
28976 {
28977 	struct sd_lun		*un;
28978 	struct cdrom_volctrl    volume;
28979 	struct cdrom_volctrl    *vol = &volume;
28980 	uchar_t			*sense_page;
28981 	uchar_t			*select_page;
28982 	uchar_t			*sense;
28983 	uchar_t			*select;
28984 	int			sense_buflen;
28985 	int			select_buflen;
28986 	int			rval;
28987 	sd_ssc_t		*ssc;
28988 
28989 	if (data == NULL) {
28990 		return (EINVAL);
28991 	}
28992 
28993 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28994 	    (un->un_state == SD_STATE_OFFLINE)) {
28995 		return (ENXIO);
28996 	}
28997 
28998 	if (ddi_copyin(data, vol, sizeof (struct cdrom_volctrl), flag)) {
28999 		return (EFAULT);
29000 	}
29001 
29002 	if ((un->un_f_cfg_is_atapi == TRUE) || (un->un_f_mmc_cap == TRUE)) {
29003 		struct mode_header_grp2		*sense_mhp;
29004 		struct mode_header_grp2		*select_mhp;
29005 		int				bd_len;
29006 
29007 		sense_buflen = MODE_PARAM_LENGTH_GRP2 + MODEPAGE_AUDIO_CTRL_LEN;
29008 		select_buflen = MODE_HEADER_LENGTH_GRP2 +
29009 		    MODEPAGE_AUDIO_CTRL_LEN;
29010 		sense  = kmem_zalloc(sense_buflen, KM_SLEEP);
29011 		select = kmem_zalloc(select_buflen, KM_SLEEP);
29012 		ssc = sd_ssc_init(un);
29013 		rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP1, sense,
29014 		    sense_buflen, MODEPAGE_AUDIO_CTRL,
29015 		    SD_PATH_STANDARD);
29016 		sd_ssc_fini(ssc);
29017 
29018 		if (rval != 0) {
29019 			SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
29020 			    "sr_volume_ctrl: Mode Sense Failed\n");
29021 			kmem_free(sense, sense_buflen);
29022 			kmem_free(select, select_buflen);
29023 			return (rval);
29024 		}
29025 		sense_mhp = (struct mode_header_grp2 *)sense;
29026 		select_mhp = (struct mode_header_grp2 *)select;
29027 		bd_len = (sense_mhp->bdesc_length_hi << 8) |
29028 		    sense_mhp->bdesc_length_lo;
29029 		if (bd_len > MODE_BLK_DESC_LENGTH) {
29030 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29031 			    "sr_volume_ctrl: Mode Sense returned invalid "
29032 			    "block descriptor length\n");
29033 			kmem_free(sense, sense_buflen);
29034 			kmem_free(select, select_buflen);
29035 			return (EIO);
29036 		}
29037 		sense_page = (uchar_t *)
29038 		    (sense + MODE_HEADER_LENGTH_GRP2 + bd_len);
29039 		select_page = (uchar_t *)(select + MODE_HEADER_LENGTH_GRP2);
29040 		select_mhp->length_msb = 0;
29041 		select_mhp->length_lsb = 0;
29042 		select_mhp->bdesc_length_hi = 0;
29043 		select_mhp->bdesc_length_lo = 0;
29044 	} else {
29045 		struct mode_header		*sense_mhp, *select_mhp;
29046 
29047 		sense_buflen = MODE_PARAM_LENGTH + MODEPAGE_AUDIO_CTRL_LEN;
29048 		select_buflen = MODE_HEADER_LENGTH + MODEPAGE_AUDIO_CTRL_LEN;
29049 		sense  = kmem_zalloc(sense_buflen, KM_SLEEP);
29050 		select = kmem_zalloc(select_buflen, KM_SLEEP);
29051 		ssc = sd_ssc_init(un);
29052 		rval = sd_send_scsi_MODE_SENSE(ssc, CDB_GROUP0, sense,
29053 		    sense_buflen, MODEPAGE_AUDIO_CTRL,
29054 		    SD_PATH_STANDARD);
29055 		sd_ssc_fini(ssc);
29056 
29057 		if (rval != 0) {
29058 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29059 			    "sr_volume_ctrl: Mode Sense Failed\n");
29060 			kmem_free(sense, sense_buflen);
29061 			kmem_free(select, select_buflen);
29062 			return (rval);
29063 		}
29064 		sense_mhp  = (struct mode_header *)sense;
29065 		select_mhp = (struct mode_header *)select;
29066 		if (sense_mhp->bdesc_length > MODE_BLK_DESC_LENGTH) {
29067 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29068 			    "sr_volume_ctrl: Mode Sense returned invalid "
29069 			    "block descriptor length\n");
29070 			kmem_free(sense, sense_buflen);
29071 			kmem_free(select, select_buflen);
29072 			return (EIO);
29073 		}
29074 		sense_page = (uchar_t *)
29075 		    (sense + MODE_HEADER_LENGTH + sense_mhp->bdesc_length);
29076 		select_page = (uchar_t *)(select + MODE_HEADER_LENGTH);
29077 		select_mhp->length = 0;
29078 		select_mhp->bdesc_length = 0;
29079 	}
29080 	/*
29081 	 * Note: An audio control data structure could be created and overlayed
29082 	 * on the following in place of the array indexing method implemented.
29083 	 */
29084 
29085 	/* Build the select data for the user volume data */
29086 	select_page[0] = MODEPAGE_AUDIO_CTRL;
29087 	select_page[1] = 0xE;
29088 	/* Set the immediate bit */
29089 	select_page[2] = 0x04;
29090 	/* Zero out reserved fields */
29091 	select_page[3] = 0x00;
29092 	select_page[4] = 0x00;
29093 	/* Return sense data for fields not to be modified */
29094 	select_page[5] = sense_page[5];
29095 	select_page[6] = sense_page[6];
29096 	select_page[7] = sense_page[7];
29097 	/* Set the user specified volume levels for channel 0 and 1 */
29098 	select_page[8] = 0x01;
29099 	select_page[9] = vol->channel0;
29100 	select_page[10] = 0x02;
29101 	select_page[11] = vol->channel1;
29102 	/* Channel 2 and 3 are currently unsupported so return the sense data */
29103 	select_page[12] = sense_page[12];
29104 	select_page[13] = sense_page[13];
29105 	select_page[14] = sense_page[14];
29106 	select_page[15] = sense_page[15];
29107 
29108 	ssc = sd_ssc_init(un);
29109 	if ((un->un_f_cfg_is_atapi == TRUE) || (un->un_f_mmc_cap == TRUE)) {
29110 		rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP1, select,
29111 		    select_buflen, SD_DONTSAVE_PAGE, SD_PATH_STANDARD);
29112 	} else {
29113 		rval = sd_send_scsi_MODE_SELECT(ssc, CDB_GROUP0, select,
29114 		    select_buflen, SD_DONTSAVE_PAGE, SD_PATH_STANDARD);
29115 	}
29116 	sd_ssc_fini(ssc);
29117 
29118 	kmem_free(sense, sense_buflen);
29119 	kmem_free(select, select_buflen);
29120 	return (rval);
29121 }
29122 
29123 
29124 /*
29125  *    Function: sr_read_sony_session_offset()
29126  *
29127  * Description: This routine is the driver entry point for handling CD-ROM
29128  *		ioctl requests for session offset information. (CDROMREADOFFSET)
29129  *		The address of the first track in the last session of a
29130  *		multi-session CD-ROM is returned
29131  *
29132  *		Note: This routine uses a vendor specific key value in the
29133  *		command control field without implementing any vendor check here
29134  *		or in the ioctl routine.
29135  *
29136  *   Arguments: dev	- the device 'dev_t'
29137  *		data	- pointer to an int to hold the requested address
29138  *		flag	- this argument is a pass through to ddi_copyxxx()
29139  *			  directly from the mode argument of ioctl().
29140  *
29141  * Return Code: the code returned by sd_send_scsi_cmd()
29142  *		EFAULT if ddi_copyxxx() fails
29143  *		ENXIO if fail ddi_get_soft_state
29144  *		EINVAL if data pointer is NULL
29145  */
29146 
29147 static int
29148 sr_read_sony_session_offset(dev_t dev, caddr_t data, int flag)
29149 {
29150 	struct sd_lun		*un;
29151 	struct uscsi_cmd	*com;
29152 	caddr_t			buffer;
29153 	char			cdb[CDB_GROUP1];
29154 	int			session_offset = 0;
29155 	int			rval;
29156 
29157 	if (data == NULL) {
29158 		return (EINVAL);
29159 	}
29160 
29161 	if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
29162 	    (un->un_state == SD_STATE_OFFLINE)) {
29163 		return (ENXIO);
29164 	}
29165 
29166 	buffer = kmem_zalloc((size_t)SONY_SESSION_OFFSET_LEN, KM_SLEEP);
29167 	bzero(cdb, CDB_GROUP1);
29168 	cdb[0] = SCMD_READ_TOC;
29169 	/*
29170 	 * Bytes 7 & 8 are the 12 byte allocation length for a single entry.
29171 	 * (4 byte TOC response header + 8 byte response data)
29172 	 */
29173 	cdb[8] = SONY_SESSION_OFFSET_LEN;
29174 	/* Byte 9 is the control byte. A vendor specific value is used */
29175 	cdb[9] = SONY_SESSION_OFFSET_KEY;
29176 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
29177 	com->uscsi_cdb = cdb;
29178 	com->uscsi_cdblen = CDB_GROUP1;
29179 	com->uscsi_bufaddr = buffer;
29180 	com->uscsi_buflen = SONY_SESSION_OFFSET_LEN;
29181 	com->uscsi_flags = USCSI_DIAGNOSE|USCSI_SILENT|USCSI_READ;
29182 
29183 	rval = sd_send_scsi_cmd(dev, com, FKIOCTL, UIO_SYSSPACE,
29184 	    SD_PATH_STANDARD);
29185 	if (rval != 0) {
29186 		kmem_free(buffer, SONY_SESSION_OFFSET_LEN);
29187 		kmem_free(com, sizeof (*com));
29188 		return (rval);
29189 	}
29190 	if (buffer[1] == SONY_SESSION_OFFSET_VALID) {
29191 		session_offset =
29192 		    ((uchar_t)buffer[8] << 24) + ((uchar_t)buffer[9] << 16) +
29193 		    ((uchar_t)buffer[10] << 8) + ((uchar_t)buffer[11]);
29194 		/*
29195 		 * Offset returned offset in current lbasize block's. Convert to
29196 		 * 2k block's to return to the user
29197 		 */
29198 		if (un->un_tgt_blocksize == CDROM_BLK_512) {
29199 			session_offset >>= 2;
29200 		} else if (un->un_tgt_blocksize == CDROM_BLK_1024) {
29201 			session_offset >>= 1;
29202 		}
29203 	}
29204 
29205 	if (ddi_copyout(&session_offset, data, sizeof (int), flag) != 0) {
29206 		rval = EFAULT;
29207 	}
29208 
29209 	kmem_free(buffer, SONY_SESSION_OFFSET_LEN);
29210 	kmem_free(com, sizeof (*com));
29211 	return (rval);
29212 }
29213 
29214 
29215 /*
29216  *    Function: sd_wm_cache_constructor()
29217  *
29218  * Description: Cache Constructor for the wmap cache for the read/modify/write
29219  * 		devices.
29220  *
29221  *   Arguments: wm      - A pointer to the sd_w_map to be initialized.
29222  *		un	- sd_lun structure for the device.
29223  *		flag	- the km flags passed to constructor
29224  *
29225  * Return Code: 0 on success.
29226  *		-1 on failure.
29227  */
29228 
29229 /*ARGSUSED*/
29230 static int
29231 sd_wm_cache_constructor(void *wm, void *un, int flags)
29232 {
29233 	bzero(wm, sizeof (struct sd_w_map));
29234 	cv_init(&((struct sd_w_map *)wm)->wm_avail, NULL, CV_DRIVER, NULL);
29235 	return (0);
29236 }
29237 
29238 
29239 /*
29240  *    Function: sd_wm_cache_destructor()
29241  *
29242  * Description: Cache destructor for the wmap cache for the read/modify/write
29243  * 		devices.
29244  *
29245  *   Arguments: wm      - A pointer to the sd_w_map to be initialized.
29246  *		un	- sd_lun structure for the device.
29247  */
29248 /*ARGSUSED*/
29249 static void
29250 sd_wm_cache_destructor(void *wm, void *un)
29251 {
29252 	cv_destroy(&((struct sd_w_map *)wm)->wm_avail);
29253 }
29254 
29255 
29256 /*
29257  *    Function: sd_range_lock()
29258  *
29259  * Description: Lock the range of blocks specified as parameter to ensure
29260  *		that read, modify write is atomic and no other i/o writes
29261  *		to the same location. The range is specified in terms
29262  *		of start and end blocks. Block numbers are the actual
29263  *		media block numbers and not system.
29264  *
29265  *   Arguments: un	- sd_lun structure for the device.
29266  *		startb - The starting block number
29267  *		endb - The end block number
29268  *		typ - type of i/o - simple/read_modify_write
29269  *
29270  * Return Code: wm  - pointer to the wmap structure.
29271  *
29272  *     Context: This routine can sleep.
29273  */
29274 
29275 static struct sd_w_map *
29276 sd_range_lock(struct sd_lun *un, daddr_t startb, daddr_t endb, ushort_t typ)
29277 {
29278 	struct sd_w_map *wmp = NULL;
29279 	struct sd_w_map *sl_wmp = NULL;
29280 	struct sd_w_map *tmp_wmp;
29281 	wm_state state = SD_WM_CHK_LIST;
29282 
29283 
29284 	ASSERT(un != NULL);
29285 	ASSERT(!mutex_owned(SD_MUTEX(un)));
29286 
29287 	mutex_enter(SD_MUTEX(un));
29288 
29289 	while (state != SD_WM_DONE) {
29290 
29291 		switch (state) {
29292 		case SD_WM_CHK_LIST:
29293 			/*
29294 			 * This is the starting state. Check the wmap list
29295 			 * to see if the range is currently available.
29296 			 */
29297 			if (!(typ & SD_WTYPE_RMW) && !(un->un_rmw_count)) {
29298 				/*
29299 				 * If this is a simple write and no rmw
29300 				 * i/o is pending then try to lock the
29301 				 * range as the range should be available.
29302 				 */
29303 				state = SD_WM_LOCK_RANGE;
29304 			} else {
29305 				tmp_wmp = sd_get_range(un, startb, endb);
29306 				if (tmp_wmp != NULL) {
29307 					if ((wmp != NULL) && ONLIST(un, wmp)) {
29308 						/*
29309 						 * Should not keep onlist wmps
29310 						 * while waiting this macro
29311 						 * will also do wmp = NULL;
29312 						 */
29313 						FREE_ONLIST_WMAP(un, wmp);
29314 					}
29315 					/*
29316 					 * sl_wmp is the wmap on which wait
29317 					 * is done, since the tmp_wmp points
29318 					 * to the inuse wmap, set sl_wmp to
29319 					 * tmp_wmp and change the state to sleep
29320 					 */
29321 					sl_wmp = tmp_wmp;
29322 					state = SD_WM_WAIT_MAP;
29323 				} else {
29324 					state = SD_WM_LOCK_RANGE;
29325 				}
29326 
29327 			}
29328 			break;
29329 
29330 		case SD_WM_LOCK_RANGE:
29331 			ASSERT(un->un_wm_cache);
29332 			/*
29333 			 * The range need to be locked, try to get a wmap.
29334 			 * First attempt it with NO_SLEEP, want to avoid a sleep
29335 			 * if possible as we will have to release the sd mutex
29336 			 * if we have to sleep.
29337 			 */
29338 			if (wmp == NULL)
29339 				wmp = kmem_cache_alloc(un->un_wm_cache,
29340 				    KM_NOSLEEP);
29341 			if (wmp == NULL) {
29342 				mutex_exit(SD_MUTEX(un));
29343 				_NOTE(DATA_READABLE_WITHOUT_LOCK
29344 				    (sd_lun::un_wm_cache))
29345 				wmp = kmem_cache_alloc(un->un_wm_cache,
29346 				    KM_SLEEP);
29347 				mutex_enter(SD_MUTEX(un));
29348 				/*
29349 				 * we released the mutex so recheck and go to
29350 				 * check list state.
29351 				 */
29352 				state = SD_WM_CHK_LIST;
29353 			} else {
29354 				/*
29355 				 * We exit out of state machine since we
29356 				 * have the wmap. Do the housekeeping first.
29357 				 * place the wmap on the wmap list if it is not
29358 				 * on it already and then set the state to done.
29359 				 */
29360 				wmp->wm_start = startb;
29361 				wmp->wm_end = endb;
29362 				wmp->wm_flags = typ | SD_WM_BUSY;
29363 				if (typ & SD_WTYPE_RMW) {
29364 					un->un_rmw_count++;
29365 				}
29366 				/*
29367 				 * If not already on the list then link
29368 				 */
29369 				if (!ONLIST(un, wmp)) {
29370 					wmp->wm_next = un->un_wm;
29371 					wmp->wm_prev = NULL;
29372 					if (wmp->wm_next)
29373 						wmp->wm_next->wm_prev = wmp;
29374 					un->un_wm = wmp;
29375 				}
29376 				state = SD_WM_DONE;
29377 			}
29378 			break;
29379 
29380 		case SD_WM_WAIT_MAP:
29381 			ASSERT(sl_wmp->wm_flags & SD_WM_BUSY);
29382 			/*
29383 			 * Wait is done on sl_wmp, which is set in the
29384 			 * check_list state.
29385 			 */
29386 			sl_wmp->wm_wanted_count++;
29387 			cv_wait(&sl_wmp->wm_avail, SD_MUTEX(un));
29388 			sl_wmp->wm_wanted_count--;
29389 			/*
29390 			 * We can reuse the memory from the completed sl_wmp
29391 			 * lock range for our new lock, but only if noone is
29392 			 * waiting for it.
29393 			 */
29394 			ASSERT(!(sl_wmp->wm_flags & SD_WM_BUSY));
29395 			if (sl_wmp->wm_wanted_count == 0) {
29396 				if (wmp != NULL) {
29397 					CHK_N_FREEWMP(un, wmp);
29398 				}
29399 				wmp = sl_wmp;
29400 			}
29401 			sl_wmp = NULL;
29402 			/*
29403 			 * After waking up, need to recheck for availability of
29404 			 * range.
29405 			 */
29406 			state = SD_WM_CHK_LIST;
29407 			break;
29408 
29409 		default:
29410 			panic("sd_range_lock: "
29411 			    "Unknown state %d in sd_range_lock", state);
29412 			/*NOTREACHED*/
29413 		} /* switch(state) */
29414 
29415 	} /* while(state != SD_WM_DONE) */
29416 
29417 	mutex_exit(SD_MUTEX(un));
29418 
29419 	ASSERT(wmp != NULL);
29420 
29421 	return (wmp);
29422 }
29423 
29424 
29425 /*
29426  *    Function: sd_get_range()
29427  *
29428  * Description: Find if there any overlapping I/O to this one
29429  *		Returns the write-map of 1st such I/O, NULL otherwise.
29430  *
29431  *   Arguments: un	- sd_lun structure for the device.
29432  *		startb - The starting block number
29433  *		endb - The end block number
29434  *
29435  * Return Code: wm  - pointer to the wmap structure.
29436  */
29437 
29438 static struct sd_w_map *
29439 sd_get_range(struct sd_lun *un, daddr_t startb, daddr_t endb)
29440 {
29441 	struct sd_w_map *wmp;
29442 
29443 	ASSERT(un != NULL);
29444 
29445 	for (wmp = un->un_wm; wmp != NULL; wmp = wmp->wm_next) {
29446 		if (!(wmp->wm_flags & SD_WM_BUSY)) {
29447 			continue;
29448 		}
29449 		if ((startb >= wmp->wm_start) && (startb <= wmp->wm_end)) {
29450 			break;
29451 		}
29452 		if ((endb >= wmp->wm_start) && (endb <= wmp->wm_end)) {
29453 			break;
29454 		}
29455 	}
29456 
29457 	return (wmp);
29458 }
29459 
29460 
29461 /*
29462  *    Function: sd_free_inlist_wmap()
29463  *
29464  * Description: Unlink and free a write map struct.
29465  *
29466  *   Arguments: un      - sd_lun structure for the device.
29467  *		wmp	- sd_w_map which needs to be unlinked.
29468  */
29469 
29470 static void
29471 sd_free_inlist_wmap(struct sd_lun *un, struct sd_w_map *wmp)
29472 {
29473 	ASSERT(un != NULL);
29474 
29475 	if (un->un_wm == wmp) {
29476 		un->un_wm = wmp->wm_next;
29477 	} else {
29478 		wmp->wm_prev->wm_next = wmp->wm_next;
29479 	}
29480 
29481 	if (wmp->wm_next) {
29482 		wmp->wm_next->wm_prev = wmp->wm_prev;
29483 	}
29484 
29485 	wmp->wm_next = wmp->wm_prev = NULL;
29486 
29487 	kmem_cache_free(un->un_wm_cache, wmp);
29488 }
29489 
29490 
29491 /*
29492  *    Function: sd_range_unlock()
29493  *
29494  * Description: Unlock the range locked by wm.
29495  *		Free write map if nobody else is waiting on it.
29496  *
29497  *   Arguments: un      - sd_lun structure for the device.
29498  *              wmp     - sd_w_map which needs to be unlinked.
29499  */
29500 
29501 static void
29502 sd_range_unlock(struct sd_lun *un, struct sd_w_map *wm)
29503 {
29504 	ASSERT(un != NULL);
29505 	ASSERT(wm != NULL);
29506 	ASSERT(!mutex_owned(SD_MUTEX(un)));
29507 
29508 	mutex_enter(SD_MUTEX(un));
29509 
29510 	if (wm->wm_flags & SD_WTYPE_RMW) {
29511 		un->un_rmw_count--;
29512 	}
29513 
29514 	if (wm->wm_wanted_count) {
29515 		wm->wm_flags = 0;
29516 		/*
29517 		 * Broadcast that the wmap is available now.
29518 		 */
29519 		cv_broadcast(&wm->wm_avail);
29520 	} else {
29521 		/*
29522 		 * If no one is waiting on the map, it should be free'ed.
29523 		 */
29524 		sd_free_inlist_wmap(un, wm);
29525 	}
29526 
29527 	mutex_exit(SD_MUTEX(un));
29528 }
29529 
29530 
29531 /*
29532  *    Function: sd_read_modify_write_task
29533  *
29534  * Description: Called from a taskq thread to initiate the write phase of
29535  *		a read-modify-write request.  This is used for targets where
29536  *		un->un_sys_blocksize != un->un_tgt_blocksize.
29537  *
29538  *   Arguments: arg - a pointer to the buf(9S) struct for the write command.
29539  *
29540  *     Context: Called under taskq thread context.
29541  */
29542 
29543 static void
29544 sd_read_modify_write_task(void *arg)
29545 {
29546 	struct sd_mapblocksize_info	*bsp;
29547 	struct buf	*bp;
29548 	struct sd_xbuf	*xp;
29549 	struct sd_lun	*un;
29550 
29551 	bp = arg;	/* The bp is given in arg */
29552 	ASSERT(bp != NULL);
29553 
29554 	/* Get the pointer to the layer-private data struct */
29555 	xp = SD_GET_XBUF(bp);
29556 	ASSERT(xp != NULL);
29557 	bsp = xp->xb_private;
29558 	ASSERT(bsp != NULL);
29559 
29560 	un = SD_GET_UN(bp);
29561 	ASSERT(un != NULL);
29562 	ASSERT(!mutex_owned(SD_MUTEX(un)));
29563 
29564 	SD_TRACE(SD_LOG_IO_RMMEDIA, un,
29565 	    "sd_read_modify_write_task: entry: buf:0x%p\n", bp);
29566 
29567 	/*
29568 	 * This is the write phase of a read-modify-write request, called
29569 	 * under the context of a taskq thread in response to the completion
29570 	 * of the read portion of the rmw request completing under interrupt
29571 	 * context. The write request must be sent from here down the iostart
29572 	 * chain as if it were being sent from sd_mapblocksize_iostart(), so
29573 	 * we use the layer index saved in the layer-private data area.
29574 	 */
29575 	SD_NEXT_IOSTART(bsp->mbs_layer_index, un, bp);
29576 
29577 	SD_TRACE(SD_LOG_IO_RMMEDIA, un,
29578 	    "sd_read_modify_write_task: exit: buf:0x%p\n", bp);
29579 }
29580 
29581 
29582 /*
29583  *    Function: sddump_do_read_of_rmw()
29584  *
29585  * Description: This routine will be called from sddump, If sddump is called
29586  *		with an I/O which not aligned on device blocksize boundary
29587  *		then the write has to be converted to read-modify-write.
29588  *		Do the read part here in order to keep sddump simple.
29589  *		Note - That the sd_mutex is held across the call to this
29590  *		routine.
29591  *
29592  *   Arguments: un	- sd_lun
29593  *		blkno	- block number in terms of media block size.
29594  *		nblk	- number of blocks.
29595  *		bpp	- pointer to pointer to the buf structure. On return
29596  *			from this function, *bpp points to the valid buffer
29597  *			to which the write has to be done.
29598  *
29599  * Return Code: 0 for success or errno-type return code
29600  */
29601 
29602 static int
29603 sddump_do_read_of_rmw(struct sd_lun *un, uint64_t blkno, uint64_t nblk,
29604     struct buf **bpp)
29605 {
29606 	int err;
29607 	int i;
29608 	int rval;
29609 	struct buf *bp;
29610 	struct scsi_pkt *pkt = NULL;
29611 	uint32_t target_blocksize;
29612 
29613 	ASSERT(un != NULL);
29614 	ASSERT(mutex_owned(SD_MUTEX(un)));
29615 
29616 	target_blocksize = un->un_tgt_blocksize;
29617 
29618 	mutex_exit(SD_MUTEX(un));
29619 
29620 	bp = scsi_alloc_consistent_buf(SD_ADDRESS(un), (struct buf *)NULL,
29621 	    (size_t)(nblk * target_blocksize), B_READ, NULL_FUNC, NULL);
29622 	if (bp == NULL) {
29623 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29624 		    "no resources for dumping; giving up");
29625 		err = ENOMEM;
29626 		goto done;
29627 	}
29628 
29629 	rval = sd_setup_rw_pkt(un, &pkt, bp, 0, NULL_FUNC, NULL,
29630 	    blkno, nblk);
29631 	if (rval != 0) {
29632 		scsi_free_consistent_buf(bp);
29633 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29634 		    "no resources for dumping; giving up");
29635 		err = ENOMEM;
29636 		goto done;
29637 	}
29638 
29639 	pkt->pkt_flags |= FLAG_NOINTR;
29640 
29641 	err = EIO;
29642 	for (i = 0; i < SD_NDUMP_RETRIES; i++) {
29643 
29644 		/*
29645 		 * Scsi_poll returns 0 (success) if the command completes and
29646 		 * the status block is STATUS_GOOD.  We should only check
29647 		 * errors if this condition is not true.  Even then we should
29648 		 * send our own request sense packet only if we have a check
29649 		 * condition and auto request sense has not been performed by
29650 		 * the hba.
29651 		 */
29652 		SD_TRACE(SD_LOG_DUMP, un, "sddump: sending read\n");
29653 
29654 		if ((sd_scsi_poll(un, pkt) == 0) && (pkt->pkt_resid == 0)) {
29655 			err = 0;
29656 			break;
29657 		}
29658 
29659 		/*
29660 		 * Check CMD_DEV_GONE 1st, give up if device is gone,
29661 		 * no need to read RQS data.
29662 		 */
29663 		if (pkt->pkt_reason == CMD_DEV_GONE) {
29664 			scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29665 			    "Error while dumping state with rmw..."
29666 			    "Device is gone\n");
29667 			break;
29668 		}
29669 
29670 		if (SD_GET_PKT_STATUS(pkt) == STATUS_CHECK) {
29671 			SD_INFO(SD_LOG_DUMP, un,
29672 			    "sddump: read failed with CHECK, try # %d\n", i);
29673 			if (((pkt->pkt_state & STATE_ARQ_DONE) == 0)) {
29674 				(void) sd_send_polled_RQS(un);
29675 			}
29676 
29677 			continue;
29678 		}
29679 
29680 		if (SD_GET_PKT_STATUS(pkt) == STATUS_BUSY) {
29681 			int reset_retval = 0;
29682 
29683 			SD_INFO(SD_LOG_DUMP, un,
29684 			    "sddump: read failed with BUSY, try # %d\n", i);
29685 
29686 			if (un->un_f_lun_reset_enabled == TRUE) {
29687 				reset_retval = scsi_reset(SD_ADDRESS(un),
29688 				    RESET_LUN);
29689 			}
29690 			if (reset_retval == 0) {
29691 				(void) scsi_reset(SD_ADDRESS(un), RESET_TARGET);
29692 			}
29693 			(void) sd_send_polled_RQS(un);
29694 
29695 		} else {
29696 			SD_INFO(SD_LOG_DUMP, un,
29697 			    "sddump: read failed with 0x%x, try # %d\n",
29698 			    SD_GET_PKT_STATUS(pkt), i);
29699 			mutex_enter(SD_MUTEX(un));
29700 			sd_reset_target(un, pkt);
29701 			mutex_exit(SD_MUTEX(un));
29702 		}
29703 
29704 		/*
29705 		 * If we are not getting anywhere with lun/target resets,
29706 		 * let's reset the bus.
29707 		 */
29708 		if (i > SD_NDUMP_RETRIES/2) {
29709 			(void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
29710 			(void) sd_send_polled_RQS(un);
29711 		}
29712 
29713 	}
29714 	scsi_destroy_pkt(pkt);
29715 
29716 	if (err != 0) {
29717 		scsi_free_consistent_buf(bp);
29718 		*bpp = NULL;
29719 	} else {
29720 		*bpp = bp;
29721 	}
29722 
29723 done:
29724 	mutex_enter(SD_MUTEX(un));
29725 	return (err);
29726 }
29727 
29728 
29729 /*
29730  *    Function: sd_failfast_flushq
29731  *
29732  * Description: Take all bp's on the wait queue that have B_FAILFAST set
29733  *		in b_flags and move them onto the failfast queue, then kick
29734  *		off a thread to return all bp's on the failfast queue to
29735  *		their owners with an error set.
29736  *
29737  *   Arguments: un - pointer to the soft state struct for the instance.
29738  *
29739  *     Context: may execute in interrupt context.
29740  */
29741 
29742 static void
29743 sd_failfast_flushq(struct sd_lun *un)
29744 {
29745 	struct buf *bp;
29746 	struct buf *next_waitq_bp;
29747 	struct buf *prev_waitq_bp = NULL;
29748 
29749 	ASSERT(un != NULL);
29750 	ASSERT(mutex_owned(SD_MUTEX(un)));
29751 	ASSERT(un->un_failfast_state == SD_FAILFAST_ACTIVE);
29752 	ASSERT(un->un_failfast_bp == NULL);
29753 
29754 	SD_TRACE(SD_LOG_IO_FAILFAST, un,
29755 	    "sd_failfast_flushq: entry: un:0x%p\n", un);
29756 
29757 	/*
29758 	 * Check if we should flush all bufs when entering failfast state, or
29759 	 * just those with B_FAILFAST set.
29760 	 */
29761 	if (sd_failfast_flushctl & SD_FAILFAST_FLUSH_ALL_BUFS) {
29762 		/*
29763 		 * Move *all* bp's on the wait queue to the failfast flush
29764 		 * queue, including those that do NOT have B_FAILFAST set.
29765 		 */
29766 		if (un->un_failfast_headp == NULL) {
29767 			ASSERT(un->un_failfast_tailp == NULL);
29768 			un->un_failfast_headp = un->un_waitq_headp;
29769 		} else {
29770 			ASSERT(un->un_failfast_tailp != NULL);
29771 			un->un_failfast_tailp->av_forw = un->un_waitq_headp;
29772 		}
29773 
29774 		un->un_failfast_tailp = un->un_waitq_tailp;
29775 
29776 		/* update kstat for each bp moved out of the waitq */
29777 		for (bp = un->un_waitq_headp; bp != NULL; bp = bp->av_forw) {
29778 			SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp);
29779 		}
29780 
29781 		/* empty the waitq */
29782 		un->un_waitq_headp = un->un_waitq_tailp = NULL;
29783 
29784 	} else {
29785 		/*
29786 		 * Go thru the wait queue, pick off all entries with
29787 		 * B_FAILFAST set, and move these onto the failfast queue.
29788 		 */
29789 		for (bp = un->un_waitq_headp; bp != NULL; bp = next_waitq_bp) {
29790 			/*
29791 			 * Save the pointer to the next bp on the wait queue,
29792 			 * so we get to it on the next iteration of this loop.
29793 			 */
29794 			next_waitq_bp = bp->av_forw;
29795 
29796 			/*
29797 			 * If this bp from the wait queue does NOT have
29798 			 * B_FAILFAST set, just move on to the next element
29799 			 * in the wait queue. Note, this is the only place
29800 			 * where it is correct to set prev_waitq_bp.
29801 			 */
29802 			if ((bp->b_flags & B_FAILFAST) == 0) {
29803 				prev_waitq_bp = bp;
29804 				continue;
29805 			}
29806 
29807 			/*
29808 			 * Remove the bp from the wait queue.
29809 			 */
29810 			if (bp == un->un_waitq_headp) {
29811 				/* The bp is the first element of the waitq. */
29812 				un->un_waitq_headp = next_waitq_bp;
29813 				if (un->un_waitq_headp == NULL) {
29814 					/* The wait queue is now empty */
29815 					un->un_waitq_tailp = NULL;
29816 				}
29817 			} else {
29818 				/*
29819 				 * The bp is either somewhere in the middle
29820 				 * or at the end of the wait queue.
29821 				 */
29822 				ASSERT(un->un_waitq_headp != NULL);
29823 				ASSERT(prev_waitq_bp != NULL);
29824 				ASSERT((prev_waitq_bp->b_flags & B_FAILFAST)
29825 				    == 0);
29826 				if (bp == un->un_waitq_tailp) {
29827 					/* bp is the last entry on the waitq. */
29828 					ASSERT(next_waitq_bp == NULL);
29829 					un->un_waitq_tailp = prev_waitq_bp;
29830 				}
29831 				prev_waitq_bp->av_forw = next_waitq_bp;
29832 			}
29833 			bp->av_forw = NULL;
29834 
29835 			/*
29836 			 * update kstat since the bp is moved out of
29837 			 * the waitq
29838 			 */
29839 			SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp);
29840 
29841 			/*
29842 			 * Now put the bp onto the failfast queue.
29843 			 */
29844 			if (un->un_failfast_headp == NULL) {
29845 				/* failfast queue is currently empty */
29846 				ASSERT(un->un_failfast_tailp == NULL);
29847 				un->un_failfast_headp =
29848 				    un->un_failfast_tailp = bp;
29849 			} else {
29850 				/* Add the bp to the end of the failfast q */
29851 				ASSERT(un->un_failfast_tailp != NULL);
29852 				ASSERT(un->un_failfast_tailp->b_flags &
29853 				    B_FAILFAST);
29854 				un->un_failfast_tailp->av_forw = bp;
29855 				un->un_failfast_tailp = bp;
29856 			}
29857 		}
29858 	}
29859 
29860 	/*
29861 	 * Now return all bp's on the failfast queue to their owners.
29862 	 */
29863 	while ((bp = un->un_failfast_headp) != NULL) {
29864 
29865 		un->un_failfast_headp = bp->av_forw;
29866 		if (un->un_failfast_headp == NULL) {
29867 			un->un_failfast_tailp = NULL;
29868 		}
29869 
29870 		/*
29871 		 * We want to return the bp with a failure error code, but
29872 		 * we do not want a call to sd_start_cmds() to occur here,
29873 		 * so use sd_return_failed_command_no_restart() instead of
29874 		 * sd_return_failed_command().
29875 		 */
29876 		sd_return_failed_command_no_restart(un, bp, EIO);
29877 	}
29878 
29879 	/* Flush the xbuf queues if required. */
29880 	if (sd_failfast_flushctl & SD_FAILFAST_FLUSH_ALL_QUEUES) {
29881 		ddi_xbuf_flushq(un->un_xbuf_attr, sd_failfast_flushq_callback);
29882 	}
29883 
29884 	SD_TRACE(SD_LOG_IO_FAILFAST, un,
29885 	    "sd_failfast_flushq: exit: un:0x%p\n", un);
29886 }
29887 
29888 
29889 /*
29890  *    Function: sd_failfast_flushq_callback
29891  *
29892  * Description: Return TRUE if the given bp meets the criteria for failfast
29893  *		flushing. Used with ddi_xbuf_flushq(9F).
29894  *
29895  *   Arguments: bp - ptr to buf struct to be examined.
29896  *
29897  *     Context: Any
29898  */
29899 
29900 static int
29901 sd_failfast_flushq_callback(struct buf *bp)
29902 {
29903 	/*
29904 	 * Return TRUE if (1) we want to flush ALL bufs when the failfast
29905 	 * state is entered; OR (2) the given bp has B_FAILFAST set.
29906 	 */
29907 	return (((sd_failfast_flushctl & SD_FAILFAST_FLUSH_ALL_BUFS) ||
29908 	    (bp->b_flags & B_FAILFAST)) ? TRUE : FALSE);
29909 }
29910 
29911 
29912 
29913 /*
29914  * Function: sd_setup_next_xfer
29915  *
29916  * Description: Prepare next I/O operation using DMA_PARTIAL
29917  *
29918  */
29919 
29920 static int
29921 sd_setup_next_xfer(struct sd_lun *un, struct buf *bp,
29922     struct scsi_pkt *pkt, struct sd_xbuf *xp)
29923 {
29924 	ssize_t	num_blks_not_xfered;
29925 	daddr_t	strt_blk_num;
29926 	ssize_t	bytes_not_xfered;
29927 	int	rval;
29928 
29929 	ASSERT(pkt->pkt_resid == 0);
29930 
29931 	/*
29932 	 * Calculate next block number and amount to be transferred.
29933 	 *
29934 	 * How much data NOT transfered to the HBA yet.
29935 	 */
29936 	bytes_not_xfered = xp->xb_dma_resid;
29937 
29938 	/*
29939 	 * figure how many blocks NOT transfered to the HBA yet.
29940 	 */
29941 	num_blks_not_xfered = SD_BYTES2TGTBLOCKS(un, bytes_not_xfered);
29942 
29943 	/*
29944 	 * set starting block number to the end of what WAS transfered.
29945 	 */
29946 	strt_blk_num = xp->xb_blkno +
29947 	    SD_BYTES2TGTBLOCKS(un, bp->b_bcount - bytes_not_xfered);
29948 
29949 	/*
29950 	 * Move pkt to the next portion of the xfer.  sd_setup_next_rw_pkt
29951 	 * will call scsi_initpkt with NULL_FUNC so we do not have to release
29952 	 * the disk mutex here.
29953 	 */
29954 	rval = sd_setup_next_rw_pkt(un, pkt, bp,
29955 	    strt_blk_num, num_blks_not_xfered);
29956 
29957 	if (rval == 0) {
29958 
29959 		/*
29960 		 * Success.
29961 		 *
29962 		 * Adjust things if there are still more blocks to be
29963 		 * transfered.
29964 		 */
29965 		xp->xb_dma_resid = pkt->pkt_resid;
29966 		pkt->pkt_resid = 0;
29967 
29968 		return (1);
29969 	}
29970 
29971 	/*
29972 	 * There's really only one possible return value from
29973 	 * sd_setup_next_rw_pkt which occurs when scsi_init_pkt
29974 	 * returns NULL.
29975 	 */
29976 	ASSERT(rval == SD_PKT_ALLOC_FAILURE);
29977 
29978 	bp->b_resid = bp->b_bcount;
29979 	bp->b_flags |= B_ERROR;
29980 
29981 	scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29982 	    "Error setting up next portion of DMA transfer\n");
29983 
29984 	return (0);
29985 }
29986 
29987 /*
29988  *    Function: sd_panic_for_res_conflict
29989  *
29990  * Description: Call panic with a string formatted with "Reservation Conflict"
29991  *		and a human readable identifier indicating the SD instance
29992  *		that experienced the reservation conflict.
29993  *
29994  *   Arguments: un - pointer to the soft state struct for the instance.
29995  *
29996  *     Context: may execute in interrupt context.
29997  */
29998 
29999 #define	SD_RESV_CONFLICT_FMT_LEN 40
30000 void
30001 sd_panic_for_res_conflict(struct sd_lun *un)
30002 {
30003 	char panic_str[SD_RESV_CONFLICT_FMT_LEN+MAXPATHLEN];
30004 	char path_str[MAXPATHLEN];
30005 
30006 	(void) snprintf(panic_str, sizeof (panic_str),
30007 	    "Reservation Conflict\nDisk: %s",
30008 	    ddi_pathname(SD_DEVINFO(un), path_str));
30009 
30010 	panic(panic_str);
30011 }
30012 
30013 /*
30014  * Note: The following sd_faultinjection_ioctl( ) routines implement
30015  * driver support for handling fault injection for error analysis
30016  * causing faults in multiple layers of the driver.
30017  *
30018  */
30019 
30020 #ifdef SD_FAULT_INJECTION
30021 static uint_t   sd_fault_injection_on = 0;
30022 
30023 /*
30024  *    Function: sd_faultinjection_ioctl()
30025  *
30026  * Description: This routine is the driver entry point for handling
30027  *              faultinjection ioctls to inject errors into the
30028  *              layer model
30029  *
30030  *   Arguments: cmd	- the ioctl cmd received
30031  *		arg	- the arguments from user and returns
30032  */
30033 
30034 static void
30035 sd_faultinjection_ioctl(int cmd, intptr_t arg,  struct sd_lun *un)
30036 {
30037 	uint_t i = 0;
30038 	uint_t rval;
30039 
30040 	SD_TRACE(SD_LOG_IOERR, un, "sd_faultinjection_ioctl: entry\n");
30041 
30042 	mutex_enter(SD_MUTEX(un));
30043 
30044 	switch (cmd) {
30045 	case SDIOCRUN:
30046 		/* Allow pushed faults to be injected */
30047 		SD_INFO(SD_LOG_SDTEST, un,
30048 		    "sd_faultinjection_ioctl: Injecting Fault Run\n");
30049 
30050 		sd_fault_injection_on = 1;
30051 
30052 		SD_INFO(SD_LOG_IOERR, un,
30053 		    "sd_faultinjection_ioctl: run finished\n");
30054 		break;
30055 
30056 	case SDIOCSTART:
30057 		/* Start Injection Session */
30058 		SD_INFO(SD_LOG_SDTEST, un,
30059 		    "sd_faultinjection_ioctl: Injecting Fault Start\n");
30060 
30061 		sd_fault_injection_on = 0;
30062 		un->sd_injection_mask = 0xFFFFFFFF;
30063 		for (i = 0; i < SD_FI_MAX_ERROR; i++) {
30064 			un->sd_fi_fifo_pkt[i] = NULL;
30065 			un->sd_fi_fifo_xb[i] = NULL;
30066 			un->sd_fi_fifo_un[i] = NULL;
30067 			un->sd_fi_fifo_arq[i] = NULL;
30068 		}
30069 		un->sd_fi_fifo_start = 0;
30070 		un->sd_fi_fifo_end = 0;
30071 
30072 		mutex_enter(&(un->un_fi_mutex));
30073 		un->sd_fi_log[0] = '\0';
30074 		un->sd_fi_buf_len = 0;
30075 		mutex_exit(&(un->un_fi_mutex));
30076 
30077 		SD_INFO(SD_LOG_IOERR, un,
30078 		    "sd_faultinjection_ioctl: start finished\n");
30079 		break;
30080 
30081 	case SDIOCSTOP:
30082 		/* Stop Injection Session */
30083 		SD_INFO(SD_LOG_SDTEST, un,
30084 		    "sd_faultinjection_ioctl: Injecting Fault Stop\n");
30085 		sd_fault_injection_on = 0;
30086 		un->sd_injection_mask = 0x0;
30087 
30088 		/* Empty stray or unuseds structs from fifo */
30089 		for (i = 0; i < SD_FI_MAX_ERROR; i++) {
30090 			if (un->sd_fi_fifo_pkt[i] != NULL) {
30091 				kmem_free(un->sd_fi_fifo_pkt[i],
30092 				    sizeof (struct sd_fi_pkt));
30093 			}
30094 			if (un->sd_fi_fifo_xb[i] != NULL) {
30095 				kmem_free(un->sd_fi_fifo_xb[i],
30096 				    sizeof (struct sd_fi_xb));
30097 			}
30098 			if (un->sd_fi_fifo_un[i] != NULL) {
30099 				kmem_free(un->sd_fi_fifo_un[i],
30100 				    sizeof (struct sd_fi_un));
30101 			}
30102 			if (un->sd_fi_fifo_arq[i] != NULL) {
30103 				kmem_free(un->sd_fi_fifo_arq[i],
30104 				    sizeof (struct sd_fi_arq));
30105 			}
30106 			un->sd_fi_fifo_pkt[i] = NULL;
30107 			un->sd_fi_fifo_un[i] = NULL;
30108 			un->sd_fi_fifo_xb[i] = NULL;
30109 			un->sd_fi_fifo_arq[i] = NULL;
30110 		}
30111 		un->sd_fi_fifo_start = 0;
30112 		un->sd_fi_fifo_end = 0;
30113 
30114 		SD_INFO(SD_LOG_IOERR, un,
30115 		    "sd_faultinjection_ioctl: stop finished\n");
30116 		break;
30117 
30118 	case SDIOCINSERTPKT:
30119 		/* Store a packet struct to be pushed onto fifo */
30120 		SD_INFO(SD_LOG_SDTEST, un,
30121 		    "sd_faultinjection_ioctl: Injecting Fault Insert Pkt\n");
30122 
30123 		i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
30124 
30125 		sd_fault_injection_on = 0;
30126 
30127 		/* No more that SD_FI_MAX_ERROR allowed in Queue */
30128 		if (un->sd_fi_fifo_pkt[i] != NULL) {
30129 			kmem_free(un->sd_fi_fifo_pkt[i],
30130 			    sizeof (struct sd_fi_pkt));
30131 		}
30132 		if (arg != NULL) {
30133 			un->sd_fi_fifo_pkt[i] =
30134 			    kmem_alloc(sizeof (struct sd_fi_pkt), KM_NOSLEEP);
30135 			if (un->sd_fi_fifo_pkt[i] == NULL) {
30136 				/* Alloc failed don't store anything */
30137 				break;
30138 			}
30139 			rval = ddi_copyin((void *)arg, un->sd_fi_fifo_pkt[i],
30140 			    sizeof (struct sd_fi_pkt), 0);
30141 			if (rval == -1) {
30142 				kmem_free(un->sd_fi_fifo_pkt[i],
30143 				    sizeof (struct sd_fi_pkt));
30144 				un->sd_fi_fifo_pkt[i] = NULL;
30145 			}
30146 		} else {
30147 			SD_INFO(SD_LOG_IOERR, un,
30148 			    "sd_faultinjection_ioctl: pkt null\n");
30149 		}
30150 		break;
30151 
30152 	case SDIOCINSERTXB:
30153 		/* Store a xb struct to be pushed onto fifo */
30154 		SD_INFO(SD_LOG_SDTEST, un,
30155 		    "sd_faultinjection_ioctl: Injecting Fault Insert XB\n");
30156 
30157 		i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
30158 
30159 		sd_fault_injection_on = 0;
30160 
30161 		if (un->sd_fi_fifo_xb[i] != NULL) {
30162 			kmem_free(un->sd_fi_fifo_xb[i],
30163 			    sizeof (struct sd_fi_xb));
30164 			un->sd_fi_fifo_xb[i] = NULL;
30165 		}
30166 		if (arg != NULL) {
30167 			un->sd_fi_fifo_xb[i] =
30168 			    kmem_alloc(sizeof (struct sd_fi_xb), KM_NOSLEEP);
30169 			if (un->sd_fi_fifo_xb[i] == NULL) {
30170 				/* Alloc failed don't store anything */
30171 				break;
30172 			}
30173 			rval = ddi_copyin((void *)arg, un->sd_fi_fifo_xb[i],
30174 			    sizeof (struct sd_fi_xb), 0);
30175 
30176 			if (rval == -1) {
30177 				kmem_free(un->sd_fi_fifo_xb[i],
30178 				    sizeof (struct sd_fi_xb));
30179 				un->sd_fi_fifo_xb[i] = NULL;
30180 			}
30181 		} else {
30182 			SD_INFO(SD_LOG_IOERR, un,
30183 			    "sd_faultinjection_ioctl: xb null\n");
30184 		}
30185 		break;
30186 
30187 	case SDIOCINSERTUN:
30188 		/* Store a un struct to be pushed onto fifo */
30189 		SD_INFO(SD_LOG_SDTEST, un,
30190 		    "sd_faultinjection_ioctl: Injecting Fault Insert UN\n");
30191 
30192 		i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
30193 
30194 		sd_fault_injection_on = 0;
30195 
30196 		if (un->sd_fi_fifo_un[i] != NULL) {
30197 			kmem_free(un->sd_fi_fifo_un[i],
30198 			    sizeof (struct sd_fi_un));
30199 			un->sd_fi_fifo_un[i] = NULL;
30200 		}
30201 		if (arg != NULL) {
30202 			un->sd_fi_fifo_un[i] =
30203 			    kmem_alloc(sizeof (struct sd_fi_un), KM_NOSLEEP);
30204 			if (un->sd_fi_fifo_un[i] == NULL) {
30205 				/* Alloc failed don't store anything */
30206 				break;
30207 			}
30208 			rval = ddi_copyin((void *)arg, un->sd_fi_fifo_un[i],
30209 			    sizeof (struct sd_fi_un), 0);
30210 			if (rval == -1) {
30211 				kmem_free(un->sd_fi_fifo_un[i],
30212 				    sizeof (struct sd_fi_un));
30213 				un->sd_fi_fifo_un[i] = NULL;
30214 			}
30215 
30216 		} else {
30217 			SD_INFO(SD_LOG_IOERR, un,
30218 			    "sd_faultinjection_ioctl: un null\n");
30219 		}
30220 
30221 		break;
30222 
30223 	case SDIOCINSERTARQ:
30224 		/* Store a arq struct to be pushed onto fifo */
30225 		SD_INFO(SD_LOG_SDTEST, un,
30226 		    "sd_faultinjection_ioctl: Injecting Fault Insert ARQ\n");
30227 		i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
30228 
30229 		sd_fault_injection_on = 0;
30230 
30231 		if (un->sd_fi_fifo_arq[i] != NULL) {
30232 			kmem_free(un->sd_fi_fifo_arq[i],
30233 			    sizeof (struct sd_fi_arq));
30234 			un->sd_fi_fifo_arq[i] = NULL;
30235 		}
30236 		if (arg != NULL) {
30237 			un->sd_fi_fifo_arq[i] =
30238 			    kmem_alloc(sizeof (struct sd_fi_arq), KM_NOSLEEP);
30239 			if (un->sd_fi_fifo_arq[i] == NULL) {
30240 				/* Alloc failed don't store anything */
30241 				break;
30242 			}
30243 			rval = ddi_copyin((void *)arg, un->sd_fi_fifo_arq[i],
30244 			    sizeof (struct sd_fi_arq), 0);
30245 			if (rval == -1) {
30246 				kmem_free(un->sd_fi_fifo_arq[i],
30247 				    sizeof (struct sd_fi_arq));
30248 				un->sd_fi_fifo_arq[i] = NULL;
30249 			}
30250 
30251 		} else {
30252 			SD_INFO(SD_LOG_IOERR, un,
30253 			    "sd_faultinjection_ioctl: arq null\n");
30254 		}
30255 
30256 		break;
30257 
30258 	case SDIOCPUSH:
30259 		/* Push stored xb, pkt, un, and arq onto fifo */
30260 		sd_fault_injection_on = 0;
30261 
30262 		if (arg != NULL) {
30263 			rval = ddi_copyin((void *)arg, &i, sizeof (uint_t), 0);
30264 			if (rval != -1 &&
30265 			    un->sd_fi_fifo_end + i < SD_FI_MAX_ERROR) {
30266 				un->sd_fi_fifo_end += i;
30267 			}
30268 		} else {
30269 			SD_INFO(SD_LOG_IOERR, un,
30270 			    "sd_faultinjection_ioctl: push arg null\n");
30271 			if (un->sd_fi_fifo_end + i < SD_FI_MAX_ERROR) {
30272 				un->sd_fi_fifo_end++;
30273 			}
30274 		}
30275 		SD_INFO(SD_LOG_IOERR, un,
30276 		    "sd_faultinjection_ioctl: push to end=%d\n",
30277 		    un->sd_fi_fifo_end);
30278 		break;
30279 
30280 	case SDIOCRETRIEVE:
30281 		/* Return buffer of log from Injection session */
30282 		SD_INFO(SD_LOG_SDTEST, un,
30283 		    "sd_faultinjection_ioctl: Injecting Fault Retreive");
30284 
30285 		sd_fault_injection_on = 0;
30286 
30287 		mutex_enter(&(un->un_fi_mutex));
30288 		rval = ddi_copyout(un->sd_fi_log, (void *)arg,
30289 		    un->sd_fi_buf_len+1, 0);
30290 		mutex_exit(&(un->un_fi_mutex));
30291 
30292 		if (rval == -1) {
30293 			/*
30294 			 * arg is possibly invalid setting
30295 			 * it to NULL for return
30296 			 */
30297 			arg = NULL;
30298 		}
30299 		break;
30300 	}
30301 
30302 	mutex_exit(SD_MUTEX(un));
30303 	SD_TRACE(SD_LOG_IOERR, un, "sd_faultinjection_ioctl: exit\n");
30304 }
30305 
30306 
30307 /*
30308  *    Function: sd_injection_log()
30309  *
30310  * Description: This routine adds buff to the already existing injection log
30311  *              for retrieval via faultinjection_ioctl for use in fault
30312  *              detection and recovery
30313  *
30314  *   Arguments: buf - the string to add to the log
30315  */
30316 
30317 static void
30318 sd_injection_log(char *buf, struct sd_lun *un)
30319 {
30320 	uint_t len;
30321 
30322 	ASSERT(un != NULL);
30323 	ASSERT(buf != NULL);
30324 
30325 	mutex_enter(&(un->un_fi_mutex));
30326 
30327 	len = min(strlen(buf), 255);
30328 	/* Add logged value to Injection log to be returned later */
30329 	if (len + un->sd_fi_buf_len < SD_FI_MAX_BUF) {
30330 		uint_t	offset = strlen((char *)un->sd_fi_log);
30331 		char *destp = (char *)un->sd_fi_log + offset;
30332 		int i;
30333 		for (i = 0; i < len; i++) {
30334 			*destp++ = *buf++;
30335 		}
30336 		un->sd_fi_buf_len += len;
30337 		un->sd_fi_log[un->sd_fi_buf_len] = '\0';
30338 	}
30339 
30340 	mutex_exit(&(un->un_fi_mutex));
30341 }
30342 
30343 
30344 /*
30345  *    Function: sd_faultinjection()
30346  *
30347  * Description: This routine takes the pkt and changes its
30348  *		content based on error injection scenerio.
30349  *
30350  *   Arguments: pktp	- packet to be changed
30351  */
30352 
30353 static void
30354 sd_faultinjection(struct scsi_pkt *pktp)
30355 {
30356 	uint_t i;
30357 	struct sd_fi_pkt *fi_pkt;
30358 	struct sd_fi_xb *fi_xb;
30359 	struct sd_fi_un *fi_un;
30360 	struct sd_fi_arq *fi_arq;
30361 	struct buf *bp;
30362 	struct sd_xbuf *xb;
30363 	struct sd_lun *un;
30364 
30365 	ASSERT(pktp != NULL);
30366 
30367 	/* pull bp xb and un from pktp */
30368 	bp = (struct buf *)pktp->pkt_private;
30369 	xb = SD_GET_XBUF(bp);
30370 	un = SD_GET_UN(bp);
30371 
30372 	ASSERT(un != NULL);
30373 
30374 	mutex_enter(SD_MUTEX(un));
30375 
30376 	SD_TRACE(SD_LOG_SDTEST, un,
30377 	    "sd_faultinjection: entry Injection from sdintr\n");
30378 
30379 	/* if injection is off return */
30380 	if (sd_fault_injection_on == 0 ||
30381 	    un->sd_fi_fifo_start == un->sd_fi_fifo_end) {
30382 		mutex_exit(SD_MUTEX(un));
30383 		return;
30384 	}
30385 
30386 	SD_INFO(SD_LOG_SDTEST, un,
30387 	    "sd_faultinjection: is working for copying\n");
30388 
30389 	/* take next set off fifo */
30390 	i = un->sd_fi_fifo_start % SD_FI_MAX_ERROR;
30391 
30392 	fi_pkt = un->sd_fi_fifo_pkt[i];
30393 	fi_xb = un->sd_fi_fifo_xb[i];
30394 	fi_un = un->sd_fi_fifo_un[i];
30395 	fi_arq = un->sd_fi_fifo_arq[i];
30396 
30397 
30398 	/* set variables accordingly */
30399 	/* set pkt if it was on fifo */
30400 	if (fi_pkt != NULL) {
30401 		SD_CONDSET(pktp, pkt, pkt_flags, "pkt_flags");
30402 		SD_CONDSET(*pktp, pkt, pkt_scbp, "pkt_scbp");
30403 		if (fi_pkt->pkt_cdbp != 0xff)
30404 			SD_CONDSET(*pktp, pkt, pkt_cdbp, "pkt_cdbp");
30405 		SD_CONDSET(pktp, pkt, pkt_state, "pkt_state");
30406 		SD_CONDSET(pktp, pkt, pkt_statistics, "pkt_statistics");
30407 		SD_CONDSET(pktp, pkt, pkt_reason, "pkt_reason");
30408 
30409 	}
30410 	/* set xb if it was on fifo */
30411 	if (fi_xb != NULL) {
30412 		SD_CONDSET(xb, xb, xb_blkno, "xb_blkno");
30413 		SD_CONDSET(xb, xb, xb_dma_resid, "xb_dma_resid");
30414 		if (fi_xb->xb_retry_count != 0)
30415 			SD_CONDSET(xb, xb, xb_retry_count, "xb_retry_count");
30416 		SD_CONDSET(xb, xb, xb_victim_retry_count,
30417 		    "xb_victim_retry_count");
30418 		SD_CONDSET(xb, xb, xb_sense_status, "xb_sense_status");
30419 		SD_CONDSET(xb, xb, xb_sense_state, "xb_sense_state");
30420 		SD_CONDSET(xb, xb, xb_sense_resid, "xb_sense_resid");
30421 
30422 		/* copy in block data from sense */
30423 		/*
30424 		 * if (fi_xb->xb_sense_data[0] != -1) {
30425 		 *	bcopy(fi_xb->xb_sense_data, xb->xb_sense_data,
30426 		 *	SENSE_LENGTH);
30427 		 * }
30428 		 */
30429 		bcopy(fi_xb->xb_sense_data, xb->xb_sense_data, SENSE_LENGTH);
30430 
30431 		/* copy in extended sense codes */
30432 		SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data),
30433 		    xb, es_code, "es_code");
30434 		SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data),
30435 		    xb, es_key, "es_key");
30436 		SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data),
30437 		    xb, es_add_code, "es_add_code");
30438 		SD_CONDSET(((struct scsi_extended_sense *)xb->xb_sense_data),
30439 		    xb, es_qual_code, "es_qual_code");
30440 		struct scsi_extended_sense *esp;
30441 		esp = (struct scsi_extended_sense *)xb->xb_sense_data;
30442 		esp->es_class = CLASS_EXTENDED_SENSE;
30443 	}
30444 
30445 	/* set un if it was on fifo */
30446 	if (fi_un != NULL) {
30447 		SD_CONDSET(un->un_sd->sd_inq, un, inq_rmb, "inq_rmb");
30448 		SD_CONDSET(un, un, un_ctype, "un_ctype");
30449 		SD_CONDSET(un, un, un_reset_retry_count,
30450 		    "un_reset_retry_count");
30451 		SD_CONDSET(un, un, un_reservation_type, "un_reservation_type");
30452 		SD_CONDSET(un, un, un_resvd_status, "un_resvd_status");
30453 		SD_CONDSET(un, un, un_f_arq_enabled, "un_f_arq_enabled");
30454 		SD_CONDSET(un, un, un_f_allow_bus_device_reset,
30455 		    "un_f_allow_bus_device_reset");
30456 		SD_CONDSET(un, un, un_f_opt_queueing, "un_f_opt_queueing");
30457 
30458 	}
30459 
30460 	/* copy in auto request sense if it was on fifo */
30461 	if (fi_arq != NULL) {
30462 		bcopy(fi_arq, pktp->pkt_scbp, sizeof (struct sd_fi_arq));
30463 	}
30464 
30465 	/* free structs */
30466 	if (un->sd_fi_fifo_pkt[i] != NULL) {
30467 		kmem_free(un->sd_fi_fifo_pkt[i], sizeof (struct sd_fi_pkt));
30468 	}
30469 	if (un->sd_fi_fifo_xb[i] != NULL) {
30470 		kmem_free(un->sd_fi_fifo_xb[i], sizeof (struct sd_fi_xb));
30471 	}
30472 	if (un->sd_fi_fifo_un[i] != NULL) {
30473 		kmem_free(un->sd_fi_fifo_un[i], sizeof (struct sd_fi_un));
30474 	}
30475 	if (un->sd_fi_fifo_arq[i] != NULL) {
30476 		kmem_free(un->sd_fi_fifo_arq[i], sizeof (struct sd_fi_arq));
30477 	}
30478 
30479 	/*
30480 	 * kmem_free does not gurantee to set to NULL
30481 	 * since we uses these to determine if we set
30482 	 * values or not lets confirm they are always
30483 	 * NULL after free
30484 	 */
30485 	un->sd_fi_fifo_pkt[i] = NULL;
30486 	un->sd_fi_fifo_un[i] = NULL;
30487 	un->sd_fi_fifo_xb[i] = NULL;
30488 	un->sd_fi_fifo_arq[i] = NULL;
30489 
30490 	un->sd_fi_fifo_start++;
30491 
30492 	mutex_exit(SD_MUTEX(un));
30493 
30494 	SD_INFO(SD_LOG_SDTEST, un, "sd_faultinjection: exit\n");
30495 }
30496 
30497 #endif /* SD_FAULT_INJECTION */
30498 
30499 /*
30500  * This routine is invoked in sd_unit_attach(). Before calling it, the
30501  * properties in conf file should be processed already, and "hotpluggable"
30502  * property was processed also.
30503  *
30504  * The sd driver distinguishes 3 different type of devices: removable media,
30505  * non-removable media, and hotpluggable. Below the differences are defined:
30506  *
30507  * 1. Device ID
30508  *
30509  *     The device ID of a device is used to identify this device. Refer to
30510  *     ddi_devid_register(9F).
30511  *
30512  *     For a non-removable media disk device which can provide 0x80 or 0x83
30513  *     VPD page (refer to INQUIRY command of SCSI SPC specification), a unique
30514  *     device ID is created to identify this device. For other non-removable
30515  *     media devices, a default device ID is created only if this device has
30516  *     at least 2 alter cylinders. Otherwise, this device has no devid.
30517  *
30518  *     -------------------------------------------------------
30519  *     removable media   hotpluggable  | Can Have Device ID
30520  *     -------------------------------------------------------
30521  *         false             false     |     Yes
30522  *         false             true      |     Yes
30523  *         true                x       |     No
30524  *     ------------------------------------------------------
30525  *
30526  *
30527  * 2. SCSI group 4 commands
30528  *
30529  *     In SCSI specs, only some commands in group 4 command set can use
30530  *     8-byte addresses that can be used to access >2TB storage spaces.
30531  *     Other commands have no such capability. Without supporting group4,
30532  *     it is impossible to make full use of storage spaces of a disk with
30533  *     capacity larger than 2TB.
30534  *
30535  *     -----------------------------------------------
30536  *     removable media   hotpluggable   LP64  |  Group
30537  *     -----------------------------------------------
30538  *           false          false       false |   1
30539  *           false          false       true  |   4
30540  *           false          true        false |   1
30541  *           false          true        true  |   4
30542  *           true             x           x   |   5
30543  *     -----------------------------------------------
30544  *
30545  *
30546  * 3. Check for VTOC Label
30547  *
30548  *     If a direct-access disk has no EFI label, sd will check if it has a
30549  *     valid VTOC label. Now, sd also does that check for removable media
30550  *     and hotpluggable devices.
30551  *
30552  *     --------------------------------------------------------------
30553  *     Direct-Access   removable media    hotpluggable |  Check Label
30554  *     -------------------------------------------------------------
30555  *         false          false           false        |   No
30556  *         false          false           true         |   No
30557  *         false          true            false        |   Yes
30558  *         false          true            true         |   Yes
30559  *         true            x                x          |   Yes
30560  *     --------------------------------------------------------------
30561  *
30562  *
30563  * 4. Building default VTOC label
30564  *
30565  *     As section 3 says, sd checks if some kinds of devices have VTOC label.
30566  *     If those devices have no valid VTOC label, sd(7d) will attempt to
30567  *     create default VTOC for them. Currently sd creates default VTOC label
30568  *     for all devices on x86 platform (VTOC_16), but only for removable
30569  *     media devices on SPARC (VTOC_8).
30570  *
30571  *     -----------------------------------------------------------
30572  *       removable media hotpluggable platform   |   Default Label
30573  *     -----------------------------------------------------------
30574  *             false          false    sparc     |     No
30575  *             false          true      x86      |     Yes
30576  *             false          true     sparc     |     Yes
30577  *             true             x        x       |     Yes
30578  *     ----------------------------------------------------------
30579  *
30580  *
30581  * 5. Supported blocksizes of target devices
30582  *
30583  *     Sd supports non-512-byte blocksize for removable media devices only.
30584  *     For other devices, only 512-byte blocksize is supported. This may be
30585  *     changed in near future because some RAID devices require non-512-byte
30586  *     blocksize
30587  *
30588  *     -----------------------------------------------------------
30589  *     removable media    hotpluggable    | non-512-byte blocksize
30590  *     -----------------------------------------------------------
30591  *           false          false         |   No
30592  *           false          true          |   No
30593  *           true             x           |   Yes
30594  *     -----------------------------------------------------------
30595  *
30596  *
30597  * 6. Automatic mount & unmount
30598  *
30599  *     Sd(7d) driver provides DKIOCREMOVABLE ioctl. This ioctl is used to query
30600  *     if a device is removable media device. It return 1 for removable media
30601  *     devices, and 0 for others.
30602  *
30603  *     The automatic mounting subsystem should distinguish between the types
30604  *     of devices and apply automounting policies to each.
30605  *
30606  *
30607  * 7. fdisk partition management
30608  *
30609  *     Fdisk is traditional partition method on x86 platform. Sd(7d) driver
30610  *     just supports fdisk partitions on x86 platform. On sparc platform, sd
30611  *     doesn't support fdisk partitions at all. Note: pcfs(7fs) can recognize
30612  *     fdisk partitions on both x86 and SPARC platform.
30613  *
30614  *     -----------------------------------------------------------
30615  *       platform   removable media  USB/1394  |  fdisk supported
30616  *     -----------------------------------------------------------
30617  *        x86         X               X        |       true
30618  *     ------------------------------------------------------------
30619  *        sparc       X               X        |       false
30620  *     ------------------------------------------------------------
30621  *
30622  *
30623  * 8. MBOOT/MBR
30624  *
30625  *     Although sd(7d) doesn't support fdisk on SPARC platform, it does support
30626  *     read/write mboot for removable media devices on sparc platform.
30627  *
30628  *     -----------------------------------------------------------
30629  *       platform   removable media  USB/1394  |  mboot supported
30630  *     -----------------------------------------------------------
30631  *        x86         X               X        |       true
30632  *     ------------------------------------------------------------
30633  *        sparc      false           false     |       false
30634  *        sparc      false           true      |       true
30635  *        sparc      true            false     |       true
30636  *        sparc      true            true      |       true
30637  *     ------------------------------------------------------------
30638  *
30639  *
30640  * 9.  error handling during opening device
30641  *
30642  *     If failed to open a disk device, an errno is returned. For some kinds
30643  *     of errors, different errno is returned depending on if this device is
30644  *     a removable media device. This brings USB/1394 hard disks in line with
30645  *     expected hard disk behavior. It is not expected that this breaks any
30646  *     application.
30647  *
30648  *     ------------------------------------------------------
30649  *       removable media    hotpluggable   |  errno
30650  *     ------------------------------------------------------
30651  *             false          false        |   EIO
30652  *             false          true         |   EIO
30653  *             true             x          |   ENXIO
30654  *     ------------------------------------------------------
30655  *
30656  *
30657  * 11. ioctls: DKIOCEJECT, CDROMEJECT
30658  *
30659  *     These IOCTLs are applicable only to removable media devices.
30660  *
30661  *     -----------------------------------------------------------
30662  *       removable media    hotpluggable   |DKIOCEJECT, CDROMEJECT
30663  *     -----------------------------------------------------------
30664  *             false          false        |     No
30665  *             false          true         |     No
30666  *             true            x           |     Yes
30667  *     -----------------------------------------------------------
30668  *
30669  *
30670  * 12. Kstats for partitions
30671  *
30672  *     sd creates partition kstat for non-removable media devices. USB and
30673  *     Firewire hard disks now have partition kstats
30674  *
30675  *      ------------------------------------------------------
30676  *       removable media    hotpluggable   |   kstat
30677  *      ------------------------------------------------------
30678  *             false          false        |    Yes
30679  *             false          true         |    Yes
30680  *             true             x          |    No
30681  *       ------------------------------------------------------
30682  *
30683  *
30684  * 13. Removable media & hotpluggable properties
30685  *
30686  *     Sd driver creates a "removable-media" property for removable media
30687  *     devices. Parent nexus drivers create a "hotpluggable" property if
30688  *     it supports hotplugging.
30689  *
30690  *     ---------------------------------------------------------------------
30691  *     removable media   hotpluggable |  "removable-media"   " hotpluggable"
30692  *     ---------------------------------------------------------------------
30693  *       false            false       |    No                   No
30694  *       false            true        |    No                   Yes
30695  *       true             false       |    Yes                  No
30696  *       true             true        |    Yes                  Yes
30697  *     ---------------------------------------------------------------------
30698  *
30699  *
30700  * 14. Power Management
30701  *
30702  *     sd only power manages removable media devices or devices that support
30703  *     LOG_SENSE or have a "pm-capable" property  (PSARC/2002/250)
30704  *
30705  *     A parent nexus that supports hotplugging can also set "pm-capable"
30706  *     if the disk can be power managed.
30707  *
30708  *     ------------------------------------------------------------
30709  *       removable media hotpluggable pm-capable  |   power manage
30710  *     ------------------------------------------------------------
30711  *             false          false     false     |     No
30712  *             false          false     true      |     Yes
30713  *             false          true      false     |     No
30714  *             false          true      true      |     Yes
30715  *             true             x        x        |     Yes
30716  *     ------------------------------------------------------------
30717  *
30718  *      USB and firewire hard disks can now be power managed independently
30719  *      of the framebuffer
30720  *
30721  *
30722  * 15. Support for USB disks with capacity larger than 1TB
30723  *
30724  *     Currently, sd doesn't permit a fixed disk device with capacity
30725  *     larger than 1TB to be used in a 32-bit operating system environment.
30726  *     However, sd doesn't do that for removable media devices. Instead, it
30727  *     assumes that removable media devices cannot have a capacity larger
30728  *     than 1TB. Therefore, using those devices on 32-bit system is partially
30729  *     supported, which can cause some unexpected results.
30730  *
30731  *     ---------------------------------------------------------------------
30732  *       removable media    USB/1394 | Capacity > 1TB |   Used in 32-bit env
30733  *     ---------------------------------------------------------------------
30734  *             false          false  |   true         |     no
30735  *             false          true   |   true         |     no
30736  *             true           false  |   true         |     Yes
30737  *             true           true   |   true         |     Yes
30738  *     ---------------------------------------------------------------------
30739  *
30740  *
30741  * 16. Check write-protection at open time
30742  *
30743  *     When a removable media device is being opened for writing without NDELAY
30744  *     flag, sd will check if this device is writable. If attempting to open
30745  *     without NDELAY flag a write-protected device, this operation will abort.
30746  *
30747  *     ------------------------------------------------------------
30748  *       removable media    USB/1394   |   WP Check
30749  *     ------------------------------------------------------------
30750  *             false          false    |     No
30751  *             false          true     |     No
30752  *             true           false    |     Yes
30753  *             true           true     |     Yes
30754  *     ------------------------------------------------------------
30755  *
30756  *
30757  * 17. syslog when corrupted VTOC is encountered
30758  *
30759  *      Currently, if an invalid VTOC is encountered, sd only print syslog
30760  *      for fixed SCSI disks.
30761  *     ------------------------------------------------------------
30762  *       removable media    USB/1394   |   print syslog
30763  *     ------------------------------------------------------------
30764  *             false          false    |     Yes
30765  *             false          true     |     No
30766  *             true           false    |     No
30767  *             true           true     |     No
30768  *     ------------------------------------------------------------
30769  */
30770 static void
30771 sd_set_unit_attributes(struct sd_lun *un, dev_info_t *devi)
30772 {
30773 	int	pm_cap;
30774 
30775 	ASSERT(un->un_sd);
30776 	ASSERT(un->un_sd->sd_inq);
30777 
30778 	/*
30779 	 * Enable SYNC CACHE support for all devices.
30780 	 */
30781 	un->un_f_sync_cache_supported = TRUE;
30782 
30783 	/*
30784 	 * Set the sync cache required flag to false.
30785 	 * This would ensure that there is no SYNC CACHE
30786 	 * sent when there are no writes
30787 	 */
30788 	un->un_f_sync_cache_required = FALSE;
30789 
30790 	if (un->un_sd->sd_inq->inq_rmb) {
30791 		/*
30792 		 * The media of this device is removable. And for this kind
30793 		 * of devices, it is possible to change medium after opening
30794 		 * devices. Thus we should support this operation.
30795 		 */
30796 		un->un_f_has_removable_media = TRUE;
30797 
30798 		/*
30799 		 * support non-512-byte blocksize of removable media devices
30800 		 */
30801 		un->un_f_non_devbsize_supported = TRUE;
30802 
30803 		/*
30804 		 * Assume that all removable media devices support DOOR_LOCK
30805 		 */
30806 		un->un_f_doorlock_supported = TRUE;
30807 
30808 		/*
30809 		 * For a removable media device, it is possible to be opened
30810 		 * with NDELAY flag when there is no media in drive, in this
30811 		 * case we don't care if device is writable. But if without
30812 		 * NDELAY flag, we need to check if media is write-protected.
30813 		 */
30814 		un->un_f_chk_wp_open = TRUE;
30815 
30816 		/*
30817 		 * need to start a SCSI watch thread to monitor media state,
30818 		 * when media is being inserted or ejected, notify syseventd.
30819 		 */
30820 		un->un_f_monitor_media_state = TRUE;
30821 
30822 		/*
30823 		 * Some devices don't support START_STOP_UNIT command.
30824 		 * Therefore, we'd better check if a device supports it
30825 		 * before sending it.
30826 		 */
30827 		un->un_f_check_start_stop = TRUE;
30828 
30829 		/*
30830 		 * support eject media ioctl:
30831 		 *		FDEJECT, DKIOCEJECT, CDROMEJECT
30832 		 */
30833 		un->un_f_eject_media_supported = TRUE;
30834 
30835 		/*
30836 		 * Because many removable-media devices don't support
30837 		 * LOG_SENSE, we couldn't use this command to check if
30838 		 * a removable media device support power-management.
30839 		 * We assume that they support power-management via
30840 		 * START_STOP_UNIT command and can be spun up and down
30841 		 * without limitations.
30842 		 */
30843 		un->un_f_pm_supported = TRUE;
30844 
30845 		/*
30846 		 * Need to create a zero length (Boolean) property
30847 		 * removable-media for the removable media devices.
30848 		 * Note that the return value of the property is not being
30849 		 * checked, since if unable to create the property
30850 		 * then do not want the attach to fail altogether. Consistent
30851 		 * with other property creation in attach.
30852 		 */
30853 		(void) ddi_prop_create(DDI_DEV_T_NONE, devi,
30854 		    DDI_PROP_CANSLEEP, "removable-media", NULL, 0);
30855 
30856 	} else {
30857 		/*
30858 		 * create device ID for device
30859 		 */
30860 		un->un_f_devid_supported = TRUE;
30861 
30862 		/*
30863 		 * Spin up non-removable-media devices once it is attached
30864 		 */
30865 		un->un_f_attach_spinup = TRUE;
30866 
30867 		/*
30868 		 * According to SCSI specification, Sense data has two kinds of
30869 		 * format: fixed format, and descriptor format. At present, we
30870 		 * don't support descriptor format sense data for removable
30871 		 * media.
30872 		 */
30873 		if (SD_INQUIRY(un)->inq_dtype == DTYPE_DIRECT) {
30874 			un->un_f_descr_format_supported = TRUE;
30875 		}
30876 
30877 		/*
30878 		 * kstats are created only for non-removable media devices.
30879 		 *
30880 		 * Set this in sd.conf to 0 in order to disable kstats.  The
30881 		 * default is 1, so they are enabled by default.
30882 		 */
30883 		un->un_f_pkstats_enabled = (ddi_prop_get_int(DDI_DEV_T_ANY,
30884 		    SD_DEVINFO(un), DDI_PROP_DONTPASS,
30885 		    "enable-partition-kstats", 1));
30886 
30887 		/*
30888 		 * Check if HBA has set the "pm-capable" property.
30889 		 * If "pm-capable" exists and is non-zero then we can
30890 		 * power manage the device without checking the start/stop
30891 		 * cycle count log sense page.
30892 		 *
30893 		 * If "pm-capable" exists and is set to be false (0),
30894 		 * then we should not power manage the device.
30895 		 *
30896 		 * If "pm-capable" doesn't exist then pm_cap will
30897 		 * be set to SD_PM_CAPABLE_UNDEFINED (-1).  In this case,
30898 		 * sd will check the start/stop cycle count log sense page
30899 		 * and power manage the device if the cycle count limit has
30900 		 * not been exceeded.
30901 		 */
30902 		pm_cap = ddi_prop_get_int(DDI_DEV_T_ANY, devi,
30903 		    DDI_PROP_DONTPASS, "pm-capable", SD_PM_CAPABLE_UNDEFINED);
30904 		if (SD_PM_CAPABLE_IS_UNDEFINED(pm_cap)) {
30905 			un->un_f_log_sense_supported = TRUE;
30906 			if (!un->un_f_power_condition_disabled &&
30907 			    SD_INQUIRY(un)->inq_ansi == 6) {
30908 				un->un_f_power_condition_supported = TRUE;
30909 			}
30910 		} else {
30911 			/*
30912 			 * pm-capable property exists.
30913 			 *
30914 			 * Convert "TRUE" values for pm_cap to
30915 			 * SD_PM_CAPABLE_IS_TRUE to make it easier to check
30916 			 * later. "TRUE" values are any values defined in
30917 			 * inquiry.h.
30918 			 */
30919 			if (SD_PM_CAPABLE_IS_FALSE(pm_cap)) {
30920 				un->un_f_log_sense_supported = FALSE;
30921 			} else {
30922 				/* SD_PM_CAPABLE_IS_TRUE case */
30923 				un->un_f_pm_supported = TRUE;
30924 				if (!un->un_f_power_condition_disabled &&
30925 				    SD_PM_CAPABLE_IS_SPC_4(pm_cap)) {
30926 					un->un_f_power_condition_supported =
30927 					    TRUE;
30928 				}
30929 				if (SD_PM_CAP_LOG_SUPPORTED(pm_cap)) {
30930 					un->un_f_log_sense_supported = TRUE;
30931 					un->un_f_pm_log_sense_smart =
30932 					    SD_PM_CAP_SMART_LOG(pm_cap);
30933 				}
30934 			}
30935 
30936 			SD_INFO(SD_LOG_ATTACH_DETACH, un,
30937 			    "sd_unit_attach: un:0x%p pm-capable "
30938 			    "property set to %d.\n", un, un->un_f_pm_supported);
30939 		}
30940 	}
30941 
30942 	if (un->un_f_is_hotpluggable) {
30943 
30944 		/*
30945 		 * Have to watch hotpluggable devices as well, since
30946 		 * that's the only way for userland applications to
30947 		 * detect hot removal while device is busy/mounted.
30948 		 */
30949 		un->un_f_monitor_media_state = TRUE;
30950 
30951 		un->un_f_check_start_stop = TRUE;
30952 
30953 	}
30954 }
30955 
30956 /*
30957  * sd_tg_rdwr:
30958  * Provides rdwr access for cmlb via sd_tgops. The start_block is
30959  * in sys block size, req_length in bytes.
30960  *
30961  */
30962 static int
30963 sd_tg_rdwr(dev_info_t *devi, uchar_t cmd, void *bufaddr,
30964     diskaddr_t start_block, size_t reqlength, void *tg_cookie)
30965 {
30966 	struct sd_lun *un;
30967 	int path_flag = (int)(uintptr_t)tg_cookie;
30968 	char *dkl = NULL;
30969 	diskaddr_t real_addr = start_block;
30970 	diskaddr_t first_byte, end_block;
30971 
30972 	size_t	buffer_size = reqlength;
30973 	int rval = 0;
30974 	diskaddr_t	cap;
30975 	uint32_t	lbasize;
30976 	sd_ssc_t	*ssc;
30977 
30978 	un = ddi_get_soft_state(sd_state, ddi_get_instance(devi));
30979 	if (un == NULL)
30980 		return (ENXIO);
30981 
30982 	if (cmd != TG_READ && cmd != TG_WRITE)
30983 		return (EINVAL);
30984 
30985 	ssc = sd_ssc_init(un);
30986 	mutex_enter(SD_MUTEX(un));
30987 	if (un->un_f_tgt_blocksize_is_valid == FALSE) {
30988 		mutex_exit(SD_MUTEX(un));
30989 		rval = sd_send_scsi_READ_CAPACITY(ssc, (uint64_t *)&cap,
30990 		    &lbasize, path_flag);
30991 		if (rval != 0)
30992 			goto done1;
30993 		mutex_enter(SD_MUTEX(un));
30994 		sd_update_block_info(un, lbasize, cap);
30995 		if ((un->un_f_tgt_blocksize_is_valid == FALSE)) {
30996 			mutex_exit(SD_MUTEX(un));
30997 			rval = EIO;
30998 			goto done;
30999 		}
31000 	}
31001 
31002 	if (NOT_DEVBSIZE(un)) {
31003 		/*
31004 		 * sys_blocksize != tgt_blocksize, need to re-adjust
31005 		 * blkno and save the index to beginning of dk_label
31006 		 */
31007 		first_byte  = SD_SYSBLOCKS2BYTES(start_block);
31008 		real_addr = first_byte / un->un_tgt_blocksize;
31009 
31010 		end_block = (first_byte + reqlength +
31011 		    un->un_tgt_blocksize - 1) / un->un_tgt_blocksize;
31012 
31013 		/* round up buffer size to multiple of target block size */
31014 		buffer_size = (end_block - real_addr) * un->un_tgt_blocksize;
31015 
31016 		SD_TRACE(SD_LOG_IO_PARTITION, un, "sd_tg_rdwr",
31017 		    "label_addr: 0x%x allocation size: 0x%x\n",
31018 		    real_addr, buffer_size);
31019 
31020 		if (((first_byte % un->un_tgt_blocksize) != 0) ||
31021 		    (reqlength % un->un_tgt_blocksize) != 0)
31022 			/* the request is not aligned */
31023 			dkl = kmem_zalloc(buffer_size, KM_SLEEP);
31024 	}
31025 
31026 	/*
31027 	 * The MMC standard allows READ CAPACITY to be
31028 	 * inaccurate by a bounded amount (in the interest of
31029 	 * response latency).  As a result, failed READs are
31030 	 * commonplace (due to the reading of metadata and not
31031 	 * data). Depending on the per-Vendor/drive Sense data,
31032 	 * the failed READ can cause many (unnecessary) retries.
31033 	 */
31034 
31035 	if (ISCD(un) && (cmd == TG_READ) &&
31036 	    (un->un_f_blockcount_is_valid == TRUE) &&
31037 	    ((start_block == (un->un_blockcount - 1))||
31038 	    (start_block == (un->un_blockcount - 2)))) {
31039 			path_flag = SD_PATH_DIRECT_PRIORITY;
31040 	}
31041 
31042 	mutex_exit(SD_MUTEX(un));
31043 	if (cmd == TG_READ) {
31044 		rval = sd_send_scsi_READ(ssc, (dkl != NULL)? dkl: bufaddr,
31045 		    buffer_size, real_addr, path_flag);
31046 		if (dkl != NULL)
31047 			bcopy(dkl + SD_TGTBYTEOFFSET(un, start_block,
31048 			    real_addr), bufaddr, reqlength);
31049 	} else {
31050 		if (dkl) {
31051 			rval = sd_send_scsi_READ(ssc, dkl, buffer_size,
31052 			    real_addr, path_flag);
31053 			if (rval) {
31054 				goto done1;
31055 			}
31056 			bcopy(bufaddr, dkl + SD_TGTBYTEOFFSET(un, start_block,
31057 			    real_addr), reqlength);
31058 		}
31059 		rval = sd_send_scsi_WRITE(ssc, (dkl != NULL)? dkl: bufaddr,
31060 		    buffer_size, real_addr, path_flag);
31061 	}
31062 
31063 done1:
31064 	if (dkl != NULL)
31065 		kmem_free(dkl, buffer_size);
31066 
31067 	if (rval != 0) {
31068 		if (rval == EIO)
31069 			sd_ssc_assessment(ssc, SD_FMT_STATUS_CHECK);
31070 		else
31071 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
31072 	}
31073 done:
31074 	sd_ssc_fini(ssc);
31075 	return (rval);
31076 }
31077 
31078 
31079 static int
31080 sd_tg_getinfo(dev_info_t *devi, int cmd, void *arg, void *tg_cookie)
31081 {
31082 
31083 	struct sd_lun *un;
31084 	diskaddr_t	cap;
31085 	uint32_t	lbasize;
31086 	int		path_flag = (int)(uintptr_t)tg_cookie;
31087 	int		ret = 0;
31088 
31089 	un = ddi_get_soft_state(sd_state, ddi_get_instance(devi));
31090 	if (un == NULL)
31091 		return (ENXIO);
31092 
31093 	switch (cmd) {
31094 	case TG_GETPHYGEOM:
31095 	case TG_GETVIRTGEOM:
31096 	case TG_GETCAPACITY:
31097 	case TG_GETBLOCKSIZE:
31098 		mutex_enter(SD_MUTEX(un));
31099 
31100 		if ((un->un_f_blockcount_is_valid == TRUE) &&
31101 		    (un->un_f_tgt_blocksize_is_valid == TRUE)) {
31102 			cap = un->un_blockcount;
31103 			lbasize = un->un_tgt_blocksize;
31104 			mutex_exit(SD_MUTEX(un));
31105 		} else {
31106 			sd_ssc_t	*ssc;
31107 			mutex_exit(SD_MUTEX(un));
31108 			ssc = sd_ssc_init(un);
31109 			ret = sd_send_scsi_READ_CAPACITY(ssc, (uint64_t *)&cap,
31110 			    &lbasize, path_flag);
31111 			if (ret != 0) {
31112 				if (ret == EIO)
31113 					sd_ssc_assessment(ssc,
31114 					    SD_FMT_STATUS_CHECK);
31115 				else
31116 					sd_ssc_assessment(ssc,
31117 					    SD_FMT_IGNORE);
31118 				sd_ssc_fini(ssc);
31119 				return (ret);
31120 			}
31121 			sd_ssc_fini(ssc);
31122 			mutex_enter(SD_MUTEX(un));
31123 			sd_update_block_info(un, lbasize, cap);
31124 			if ((un->un_f_blockcount_is_valid == FALSE) ||
31125 			    (un->un_f_tgt_blocksize_is_valid == FALSE)) {
31126 				mutex_exit(SD_MUTEX(un));
31127 				return (EIO);
31128 			}
31129 			mutex_exit(SD_MUTEX(un));
31130 		}
31131 
31132 		if (cmd == TG_GETCAPACITY) {
31133 			*(diskaddr_t *)arg = cap;
31134 			return (0);
31135 		}
31136 
31137 		if (cmd == TG_GETBLOCKSIZE) {
31138 			*(uint32_t *)arg = lbasize;
31139 			return (0);
31140 		}
31141 
31142 		if (cmd == TG_GETPHYGEOM)
31143 			ret = sd_get_physical_geometry(un, (cmlb_geom_t *)arg,
31144 			    cap, lbasize, path_flag);
31145 		else
31146 			/* TG_GETVIRTGEOM */
31147 			ret = sd_get_virtual_geometry(un,
31148 			    (cmlb_geom_t *)arg, cap, lbasize);
31149 
31150 		return (ret);
31151 
31152 	case TG_GETATTR:
31153 		mutex_enter(SD_MUTEX(un));
31154 		((tg_attribute_t *)arg)->media_is_writable =
31155 		    un->un_f_mmc_writable_media;
31156 		((tg_attribute_t *)arg)->media_is_solid_state =
31157 		    un->un_f_is_solid_state;
31158 		((tg_attribute_t *)arg)->media_is_rotational =
31159 		    un->un_f_is_rotational;
31160 		mutex_exit(SD_MUTEX(un));
31161 		return (0);
31162 	default:
31163 		return (ENOTTY);
31164 
31165 	}
31166 }
31167 
31168 /*
31169  *    Function: sd_ssc_ereport_post
31170  *
31171  * Description: Will be called when SD driver need to post an ereport.
31172  *
31173  *    Context: Kernel thread or interrupt context.
31174  */
31175 
31176 #define	DEVID_IF_KNOWN(d) "devid", DATA_TYPE_STRING, (d) ? (d) : "unknown"
31177 
31178 static void
31179 sd_ssc_ereport_post(sd_ssc_t *ssc, enum sd_driver_assessment drv_assess)
31180 {
31181 	int uscsi_path_instance = 0;
31182 	uchar_t	uscsi_pkt_reason;
31183 	uint32_t uscsi_pkt_state;
31184 	uint32_t uscsi_pkt_statistics;
31185 	uint64_t uscsi_ena;
31186 	uchar_t op_code;
31187 	uint8_t *sensep;
31188 	union scsi_cdb *cdbp;
31189 	uint_t cdblen = 0;
31190 	uint_t senlen = 0;
31191 	struct sd_lun *un;
31192 	dev_info_t *dip;
31193 	char *devid;
31194 	int ssc_invalid_flags = SSC_FLAGS_INVALID_PKT_REASON |
31195 	    SSC_FLAGS_INVALID_STATUS |
31196 	    SSC_FLAGS_INVALID_SENSE |
31197 	    SSC_FLAGS_INVALID_DATA;
31198 	char assessment[16];
31199 
31200 	ASSERT(ssc != NULL);
31201 	ASSERT(ssc->ssc_uscsi_cmd != NULL);
31202 	ASSERT(ssc->ssc_uscsi_info != NULL);
31203 
31204 	un = ssc->ssc_un;
31205 	ASSERT(un != NULL);
31206 
31207 	dip = un->un_sd->sd_dev;
31208 
31209 	/*
31210 	 * Get the devid:
31211 	 *	devid will only be passed to non-transport error reports.
31212 	 */
31213 	devid = DEVI(dip)->devi_devid_str;
31214 
31215 	/*
31216 	 * If we are syncing or dumping, the command will not be executed
31217 	 * so we bypass this situation.
31218 	 */
31219 	if (ddi_in_panic() || (un->un_state == SD_STATE_SUSPENDED) ||
31220 	    (un->un_state == SD_STATE_DUMPING))
31221 		return;
31222 
31223 	uscsi_pkt_reason = ssc->ssc_uscsi_info->ui_pkt_reason;
31224 	uscsi_path_instance = ssc->ssc_uscsi_cmd->uscsi_path_instance;
31225 	uscsi_pkt_state = ssc->ssc_uscsi_info->ui_pkt_state;
31226 	uscsi_pkt_statistics = ssc->ssc_uscsi_info->ui_pkt_statistics;
31227 	uscsi_ena = ssc->ssc_uscsi_info->ui_ena;
31228 
31229 	sensep = (uint8_t *)ssc->ssc_uscsi_cmd->uscsi_rqbuf;
31230 	cdbp = (union scsi_cdb *)ssc->ssc_uscsi_cmd->uscsi_cdb;
31231 
31232 	/* In rare cases, EG:DOORLOCK, the cdb could be NULL */
31233 	if (cdbp == NULL) {
31234 		scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
31235 		    "sd_ssc_ereport_post meet empty cdb\n");
31236 		return;
31237 	}
31238 
31239 	op_code = cdbp->scc_cmd;
31240 
31241 	cdblen = (int)ssc->ssc_uscsi_cmd->uscsi_cdblen;
31242 	senlen = (int)(ssc->ssc_uscsi_cmd->uscsi_rqlen -
31243 	    ssc->ssc_uscsi_cmd->uscsi_rqresid);
31244 
31245 	if (senlen > 0)
31246 		ASSERT(sensep != NULL);
31247 
31248 	/*
31249 	 * Initialize drv_assess to corresponding values.
31250 	 * SD_FM_DRV_FATAL will be mapped to "fail" or "fatal" depending
31251 	 * on the sense-key returned back.
31252 	 */
31253 	switch (drv_assess) {
31254 		case SD_FM_DRV_RECOVERY:
31255 			(void) sprintf(assessment, "%s", "recovered");
31256 			break;
31257 		case SD_FM_DRV_RETRY:
31258 			(void) sprintf(assessment, "%s", "retry");
31259 			break;
31260 		case SD_FM_DRV_NOTICE:
31261 			(void) sprintf(assessment, "%s", "info");
31262 			break;
31263 		case SD_FM_DRV_FATAL:
31264 		default:
31265 			(void) sprintf(assessment, "%s", "unknown");
31266 	}
31267 	/*
31268 	 * If drv_assess == SD_FM_DRV_RECOVERY, this should be a recovered
31269 	 * command, we will post ereport.io.scsi.cmd.disk.recovered.
31270 	 * driver-assessment will always be "recovered" here.
31271 	 */
31272 	if (drv_assess == SD_FM_DRV_RECOVERY) {
31273 		scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, NULL,
31274 		    "cmd.disk.recovered", uscsi_ena, devid, NULL,
31275 		    DDI_NOSLEEP, NULL,
31276 		    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
31277 		    DEVID_IF_KNOWN(devid),
31278 		    "driver-assessment", DATA_TYPE_STRING, assessment,
31279 		    "op-code", DATA_TYPE_UINT8, op_code,
31280 		    "cdb", DATA_TYPE_UINT8_ARRAY,
31281 		    cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb,
31282 		    "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason,
31283 		    "pkt-state", DATA_TYPE_UINT32, uscsi_pkt_state,
31284 		    "pkt-stats", DATA_TYPE_UINT32, uscsi_pkt_statistics,
31285 		    NULL);
31286 		return;
31287 	}
31288 
31289 	/*
31290 	 * If there is un-expected/un-decodable data, we should post
31291 	 * ereport.io.scsi.cmd.disk.dev.uderr.
31292 	 * driver-assessment will be set based on parameter drv_assess.
31293 	 * SSC_FLAGS_INVALID_SENSE - invalid sense data sent back.
31294 	 * SSC_FLAGS_INVALID_PKT_REASON - invalid pkt-reason encountered.
31295 	 * SSC_FLAGS_INVALID_STATUS - invalid stat-code encountered.
31296 	 * SSC_FLAGS_INVALID_DATA - invalid data sent back.
31297 	 */
31298 	if (ssc->ssc_flags & ssc_invalid_flags) {
31299 		if (ssc->ssc_flags & SSC_FLAGS_INVALID_SENSE) {
31300 			scsi_fm_ereport_post(un->un_sd, uscsi_path_instance,
31301 			    NULL, "cmd.disk.dev.uderr", uscsi_ena, devid,
31302 			    NULL, DDI_NOSLEEP, NULL,
31303 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
31304 			    DEVID_IF_KNOWN(devid),
31305 			    "driver-assessment", DATA_TYPE_STRING,
31306 			    drv_assess == SD_FM_DRV_FATAL ?
31307 			    "fail" : assessment,
31308 			    "op-code", DATA_TYPE_UINT8, op_code,
31309 			    "cdb", DATA_TYPE_UINT8_ARRAY,
31310 			    cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb,
31311 			    "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason,
31312 			    "pkt-state", DATA_TYPE_UINT32, uscsi_pkt_state,
31313 			    "pkt-stats", DATA_TYPE_UINT32,
31314 			    uscsi_pkt_statistics,
31315 			    "stat-code", DATA_TYPE_UINT8,
31316 			    ssc->ssc_uscsi_cmd->uscsi_status,
31317 			    "un-decode-info", DATA_TYPE_STRING,
31318 			    ssc->ssc_info,
31319 			    "un-decode-value", DATA_TYPE_UINT8_ARRAY,
31320 			    senlen, sensep,
31321 			    NULL);
31322 		} else {
31323 			/*
31324 			 * For other type of invalid data, the
31325 			 * un-decode-value field would be empty because the
31326 			 * un-decodable content could be seen from upper
31327 			 * level payload or inside un-decode-info.
31328 			 */
31329 			scsi_fm_ereport_post(un->un_sd, uscsi_path_instance,
31330 			    NULL,
31331 			    "cmd.disk.dev.uderr", uscsi_ena, devid,
31332 			    NULL, DDI_NOSLEEP, NULL,
31333 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
31334 			    DEVID_IF_KNOWN(devid),
31335 			    "driver-assessment", DATA_TYPE_STRING,
31336 			    drv_assess == SD_FM_DRV_FATAL ?
31337 			    "fail" : assessment,
31338 			    "op-code", DATA_TYPE_UINT8, op_code,
31339 			    "cdb", DATA_TYPE_UINT8_ARRAY,
31340 			    cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb,
31341 			    "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason,
31342 			    "pkt-state", DATA_TYPE_UINT32, uscsi_pkt_state,
31343 			    "pkt-stats", DATA_TYPE_UINT32,
31344 			    uscsi_pkt_statistics,
31345 			    "stat-code", DATA_TYPE_UINT8,
31346 			    ssc->ssc_uscsi_cmd->uscsi_status,
31347 			    "un-decode-info", DATA_TYPE_STRING,
31348 			    ssc->ssc_info,
31349 			    "un-decode-value", DATA_TYPE_UINT8_ARRAY,
31350 			    0, NULL,
31351 			    NULL);
31352 		}
31353 		ssc->ssc_flags &= ~ssc_invalid_flags;
31354 		return;
31355 	}
31356 
31357 	if (uscsi_pkt_reason != CMD_CMPLT ||
31358 	    (ssc->ssc_flags & SSC_FLAGS_TRAN_ABORT)) {
31359 		/*
31360 		 * pkt-reason != CMD_CMPLT or SSC_FLAGS_TRAN_ABORT was
31361 		 * set inside sd_start_cmds due to errors(bad packet or
31362 		 * fatal transport error), we should take it as a
31363 		 * transport error, so we post ereport.io.scsi.cmd.disk.tran.
31364 		 * driver-assessment will be set based on drv_assess.
31365 		 * We will set devid to NULL because it is a transport
31366 		 * error.
31367 		 */
31368 		if (ssc->ssc_flags & SSC_FLAGS_TRAN_ABORT)
31369 			ssc->ssc_flags &= ~SSC_FLAGS_TRAN_ABORT;
31370 
31371 		scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, NULL,
31372 		    "cmd.disk.tran", uscsi_ena, NULL, NULL, DDI_NOSLEEP, NULL,
31373 		    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
31374 		    DEVID_IF_KNOWN(devid),
31375 		    "driver-assessment", DATA_TYPE_STRING,
31376 		    drv_assess == SD_FM_DRV_FATAL ? "fail" : assessment,
31377 		    "op-code", DATA_TYPE_UINT8, op_code,
31378 		    "cdb", DATA_TYPE_UINT8_ARRAY,
31379 		    cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb,
31380 		    "pkt-reason", DATA_TYPE_UINT8, uscsi_pkt_reason,
31381 		    "pkt-state", DATA_TYPE_UINT8, uscsi_pkt_state,
31382 		    "pkt-stats", DATA_TYPE_UINT32, uscsi_pkt_statistics,
31383 		    NULL);
31384 	} else {
31385 		/*
31386 		 * If we got here, we have a completed command, and we need
31387 		 * to further investigate the sense data to see what kind
31388 		 * of ereport we should post.
31389 		 * No ereport is needed if sense-key is KEY_RECOVERABLE_ERROR
31390 		 * and asc/ascq is "ATA PASS-THROUGH INFORMATION AVAILABLE".
31391 		 * Post ereport.io.scsi.cmd.disk.dev.rqs.merr if sense-key is
31392 		 * KEY_MEDIUM_ERROR.
31393 		 * Post ereport.io.scsi.cmd.disk.dev.rqs.derr otherwise.
31394 		 * driver-assessment will be set based on the parameter
31395 		 * drv_assess.
31396 		 */
31397 		if (senlen > 0) {
31398 			/*
31399 			 * Here we have sense data available.
31400 			 */
31401 			uint8_t sense_key = scsi_sense_key(sensep);
31402 			uint8_t sense_asc = scsi_sense_asc(sensep);
31403 			uint8_t sense_ascq = scsi_sense_ascq(sensep);
31404 
31405 			if (sense_key == KEY_RECOVERABLE_ERROR &&
31406 			    sense_asc == 0x00 && sense_ascq == 0x1d)
31407 				return;
31408 
31409 			if (sense_key == KEY_MEDIUM_ERROR) {
31410 				/*
31411 				 * driver-assessment should be "fatal" if
31412 				 * drv_assess is SD_FM_DRV_FATAL.
31413 				 */
31414 				scsi_fm_ereport_post(un->un_sd,
31415 				    uscsi_path_instance, NULL,
31416 				    "cmd.disk.dev.rqs.merr",
31417 				    uscsi_ena, devid, NULL, DDI_NOSLEEP, NULL,
31418 				    FM_VERSION, DATA_TYPE_UINT8,
31419 				    FM_EREPORT_VERS0,
31420 				    DEVID_IF_KNOWN(devid),
31421 				    "driver-assessment",
31422 				    DATA_TYPE_STRING,
31423 				    drv_assess == SD_FM_DRV_FATAL ?
31424 				    "fatal" : assessment,
31425 				    "op-code",
31426 				    DATA_TYPE_UINT8, op_code,
31427 				    "cdb",
31428 				    DATA_TYPE_UINT8_ARRAY, cdblen,
31429 				    ssc->ssc_uscsi_cmd->uscsi_cdb,
31430 				    "pkt-reason",
31431 				    DATA_TYPE_UINT8, uscsi_pkt_reason,
31432 				    "pkt-state",
31433 				    DATA_TYPE_UINT8, uscsi_pkt_state,
31434 				    "pkt-stats",
31435 				    DATA_TYPE_UINT32,
31436 				    uscsi_pkt_statistics,
31437 				    "stat-code",
31438 				    DATA_TYPE_UINT8,
31439 				    ssc->ssc_uscsi_cmd->uscsi_status,
31440 				    "key",
31441 				    DATA_TYPE_UINT8,
31442 				    scsi_sense_key(sensep),
31443 				    "asc",
31444 				    DATA_TYPE_UINT8,
31445 				    scsi_sense_asc(sensep),
31446 				    "ascq",
31447 				    DATA_TYPE_UINT8,
31448 				    scsi_sense_ascq(sensep),
31449 				    "sense-data",
31450 				    DATA_TYPE_UINT8_ARRAY,
31451 				    senlen, sensep,
31452 				    "lba",
31453 				    DATA_TYPE_UINT64,
31454 				    ssc->ssc_uscsi_info->ui_lba,
31455 				    NULL);
31456 			} else {
31457 				/*
31458 				 * if sense-key == 0x4(hardware
31459 				 * error), driver-assessment should
31460 				 * be "fatal" if drv_assess is
31461 				 * SD_FM_DRV_FATAL.
31462 				 */
31463 				scsi_fm_ereport_post(un->un_sd,
31464 				    uscsi_path_instance, NULL,
31465 				    "cmd.disk.dev.rqs.derr",
31466 				    uscsi_ena, devid,
31467 				    NULL, DDI_NOSLEEP, NULL,
31468 				    FM_VERSION,
31469 				    DATA_TYPE_UINT8, FM_EREPORT_VERS0,
31470 				    DEVID_IF_KNOWN(devid),
31471 				    "driver-assessment",
31472 				    DATA_TYPE_STRING,
31473 				    drv_assess == SD_FM_DRV_FATAL ?
31474 				    (sense_key == 0x4 ?
31475 				    "fatal" : "fail") : assessment,
31476 				    "op-code",
31477 				    DATA_TYPE_UINT8, op_code,
31478 				    "cdb",
31479 				    DATA_TYPE_UINT8_ARRAY, cdblen,
31480 				    ssc->ssc_uscsi_cmd->uscsi_cdb,
31481 				    "pkt-reason",
31482 				    DATA_TYPE_UINT8, uscsi_pkt_reason,
31483 				    "pkt-state",
31484 				    DATA_TYPE_UINT8, uscsi_pkt_state,
31485 				    "pkt-stats",
31486 				    DATA_TYPE_UINT32,
31487 				    uscsi_pkt_statistics,
31488 				    "stat-code",
31489 				    DATA_TYPE_UINT8,
31490 				    ssc->ssc_uscsi_cmd->uscsi_status,
31491 				    "key",
31492 				    DATA_TYPE_UINT8,
31493 				    scsi_sense_key(sensep),
31494 				    "asc",
31495 				    DATA_TYPE_UINT8,
31496 				    scsi_sense_asc(sensep),
31497 				    "ascq",
31498 				    DATA_TYPE_UINT8,
31499 				    scsi_sense_ascq(sensep),
31500 				    "sense-data",
31501 				    DATA_TYPE_UINT8_ARRAY,
31502 				    senlen, sensep,
31503 				    NULL);
31504 			}
31505 		} else {
31506 			/*
31507 			 * For stat_code == STATUS_GOOD, this is not a
31508 			 * hardware error.
31509 			 */
31510 			if (ssc->ssc_uscsi_cmd->uscsi_status == STATUS_GOOD)
31511 				return;
31512 
31513 			/*
31514 			 * Post ereport.io.scsi.cmd.disk.dev.serr if we got the
31515 			 * stat-code but with sense data unavailable.
31516 			 * driver-assessment will be set based on parameter
31517 			 * drv_assess.
31518 			 */
31519 			scsi_fm_ereport_post(un->un_sd, uscsi_path_instance,
31520 			    NULL,
31521 			    "cmd.disk.dev.serr", uscsi_ena,
31522 			    devid, NULL, DDI_NOSLEEP, NULL,
31523 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
31524 			    DEVID_IF_KNOWN(devid),
31525 			    "driver-assessment", DATA_TYPE_STRING,
31526 			    drv_assess == SD_FM_DRV_FATAL ? "fail" : assessment,
31527 			    "op-code", DATA_TYPE_UINT8, op_code,
31528 			    "cdb",
31529 			    DATA_TYPE_UINT8_ARRAY,
31530 			    cdblen, ssc->ssc_uscsi_cmd->uscsi_cdb,
31531 			    "pkt-reason",
31532 			    DATA_TYPE_UINT8, uscsi_pkt_reason,
31533 			    "pkt-state",
31534 			    DATA_TYPE_UINT8, uscsi_pkt_state,
31535 			    "pkt-stats",
31536 			    DATA_TYPE_UINT32, uscsi_pkt_statistics,
31537 			    "stat-code",
31538 			    DATA_TYPE_UINT8,
31539 			    ssc->ssc_uscsi_cmd->uscsi_status,
31540 			    NULL);
31541 		}
31542 	}
31543 }
31544 
31545 /*
31546  *     Function: sd_ssc_extract_info
31547  *
31548  * Description: Extract information available to help generate ereport.
31549  *
31550  *     Context: Kernel thread or interrupt context.
31551  */
31552 static void
31553 sd_ssc_extract_info(sd_ssc_t *ssc, struct sd_lun *un, struct scsi_pkt *pktp,
31554     struct buf *bp, struct sd_xbuf *xp)
31555 {
31556 	size_t senlen = 0;
31557 	union scsi_cdb *cdbp;
31558 	int path_instance;
31559 	/*
31560 	 * Need scsi_cdb_size array to determine the cdb length.
31561 	 */
31562 	extern uchar_t	scsi_cdb_size[];
31563 
31564 	ASSERT(un != NULL);
31565 	ASSERT(pktp != NULL);
31566 	ASSERT(bp != NULL);
31567 	ASSERT(xp != NULL);
31568 	ASSERT(ssc != NULL);
31569 	ASSERT(mutex_owned(SD_MUTEX(un)));
31570 
31571 	/*
31572 	 * Transfer the cdb buffer pointer here.
31573 	 */
31574 	cdbp = (union scsi_cdb *)pktp->pkt_cdbp;
31575 
31576 	ssc->ssc_uscsi_cmd->uscsi_cdblen = scsi_cdb_size[GETGROUP(cdbp)];
31577 	ssc->ssc_uscsi_cmd->uscsi_cdb = (caddr_t)cdbp;
31578 
31579 	/*
31580 	 * Transfer the sense data buffer pointer if sense data is available,
31581 	 * calculate the sense data length first.
31582 	 */
31583 	if ((xp->xb_sense_state & STATE_XARQ_DONE) ||
31584 	    (xp->xb_sense_state & STATE_ARQ_DONE)) {
31585 		/*
31586 		 * For arq case, we will enter here.
31587 		 */
31588 		if (xp->xb_sense_state & STATE_XARQ_DONE) {
31589 			senlen = MAX_SENSE_LENGTH - xp->xb_sense_resid;
31590 		} else {
31591 			senlen = SENSE_LENGTH;
31592 		}
31593 	} else {
31594 		/*
31595 		 * For non-arq case, we will enter this branch.
31596 		 */
31597 		if (SD_GET_PKT_STATUS(pktp) == STATUS_CHECK &&
31598 		    (xp->xb_sense_state & STATE_XFERRED_DATA)) {
31599 			senlen = SENSE_LENGTH - xp->xb_sense_resid;
31600 		}
31601 
31602 	}
31603 
31604 	ssc->ssc_uscsi_cmd->uscsi_rqlen = (senlen & 0xff);
31605 	ssc->ssc_uscsi_cmd->uscsi_rqresid = 0;
31606 	ssc->ssc_uscsi_cmd->uscsi_rqbuf = (caddr_t)xp->xb_sense_data;
31607 
31608 	ssc->ssc_uscsi_cmd->uscsi_status = ((*(pktp)->pkt_scbp) & STATUS_MASK);
31609 
31610 	/*
31611 	 * Only transfer path_instance when scsi_pkt was properly allocated.
31612 	 */
31613 	path_instance = pktp->pkt_path_instance;
31614 	if (scsi_pkt_allocated_correctly(pktp) && path_instance)
31615 		ssc->ssc_uscsi_cmd->uscsi_path_instance = path_instance;
31616 	else
31617 		ssc->ssc_uscsi_cmd->uscsi_path_instance = 0;
31618 
31619 	/*
31620 	 * Copy in the other fields we may need when posting ereport.
31621 	 */
31622 	ssc->ssc_uscsi_info->ui_pkt_reason = pktp->pkt_reason;
31623 	ssc->ssc_uscsi_info->ui_pkt_state = pktp->pkt_state;
31624 	ssc->ssc_uscsi_info->ui_pkt_statistics = pktp->pkt_statistics;
31625 	ssc->ssc_uscsi_info->ui_lba = (uint64_t)SD_GET_BLKNO(bp);
31626 
31627 	/*
31628 	 * For partially read/write command, we will not create ena
31629 	 * in case of a successful command be reconized as recovered.
31630 	 */
31631 	if ((pktp->pkt_reason == CMD_CMPLT) &&
31632 	    (ssc->ssc_uscsi_cmd->uscsi_status == STATUS_GOOD) &&
31633 	    (senlen == 0)) {
31634 		return;
31635 	}
31636 
31637 	/*
31638 	 * To associate ereports of a single command execution flow, we
31639 	 * need a shared ena for a specific command.
31640 	 */
31641 	if (xp->xb_ena == 0)
31642 		xp->xb_ena = fm_ena_generate(0, FM_ENA_FMT1);
31643 	ssc->ssc_uscsi_info->ui_ena = xp->xb_ena;
31644 }
31645 
31646 
31647 /*
31648  *     Function: sd_check_bdc_vpd
31649  *
31650  * Description: Query the optional INQUIRY VPD page 0xb1. If the device
31651  *              supports VPD page 0xb1, sd examines the MEDIUM ROTATION
31652  *              RATE.
31653  *
31654  *		Set the following based on RPM value:
31655  *		= 0	device is not solid state, non-rotational
31656  *		= 1	device is solid state, non-rotational
31657  *		> 1	device is not solid state, rotational
31658  *
31659  *     Context: Kernel thread or interrupt context.
31660  */
31661 
31662 static void
31663 sd_check_bdc_vpd(sd_ssc_t *ssc)
31664 {
31665 	int		rval		= 0;
31666 	uchar_t		*inqb1		= NULL;
31667 	size_t		inqb1_len	= MAX_INQUIRY_SIZE;
31668 	size_t		inqb1_resid	= 0;
31669 	struct sd_lun	*un;
31670 
31671 	ASSERT(ssc != NULL);
31672 	un = ssc->ssc_un;
31673 	ASSERT(un != NULL);
31674 	ASSERT(!mutex_owned(SD_MUTEX(un)));
31675 
31676 	mutex_enter(SD_MUTEX(un));
31677 	un->un_f_is_rotational = TRUE;
31678 	un->un_f_is_solid_state = FALSE;
31679 
31680 	if (ISCD(un)) {
31681 		mutex_exit(SD_MUTEX(un));
31682 		return;
31683 	}
31684 
31685 	if (sd_check_vpd_page_support(ssc) == 0 &&
31686 	    un->un_vpd_page_mask & SD_VPD_DEV_CHARACTER_PG) {
31687 		mutex_exit(SD_MUTEX(un));
31688 		/* collect page b1 data */
31689 		inqb1 = kmem_zalloc(inqb1_len, KM_SLEEP);
31690 
31691 		rval = sd_send_scsi_INQUIRY(ssc, inqb1, inqb1_len,
31692 		    0x01, 0xB1, &inqb1_resid);
31693 
31694 		if (rval == 0 && (inqb1_len - inqb1_resid > 5)) {
31695 			SD_TRACE(SD_LOG_COMMON, un,
31696 			    "sd_check_bdc_vpd: \
31697 			    successfully get VPD page: %x \
31698 			    PAGE LENGTH: %x BYTE 4: %x \
31699 			    BYTE 5: %x", inqb1[1], inqb1[3], inqb1[4],
31700 			    inqb1[5]);
31701 
31702 			mutex_enter(SD_MUTEX(un));
31703 			/*
31704 			 * Check the MEDIUM ROTATION RATE.
31705 			 */
31706 			if (inqb1[4] == 0) {
31707 				if (inqb1[5] == 0) {
31708 					un->un_f_is_rotational = FALSE;
31709 				} else if (inqb1[5] == 1) {
31710 					un->un_f_is_rotational = FALSE;
31711 					un->un_f_is_solid_state = TRUE;
31712 					/*
31713 					 * Solid state drives don't need
31714 					 * disksort.
31715 					 */
31716 					un->un_f_disksort_disabled = TRUE;
31717 				}
31718 			}
31719 			mutex_exit(SD_MUTEX(un));
31720 		} else if (rval != 0) {
31721 			sd_ssc_assessment(ssc, SD_FMT_IGNORE);
31722 		}
31723 
31724 		kmem_free(inqb1, inqb1_len);
31725 	} else {
31726 		mutex_exit(SD_MUTEX(un));
31727 	}
31728 }
31729 
31730 /*
31731  *	Function: sd_check_emulation_mode
31732  *
31733  *   Description: Check whether the SSD is at emulation mode
31734  *		  by issuing READ_CAPACITY_16 to see whether
31735  *		  we can get physical block size of the drive.
31736  *
31737  *	 Context: Kernel thread or interrupt context.
31738  */
31739 
31740 static void
31741 sd_check_emulation_mode(sd_ssc_t *ssc)
31742 {
31743 	int		rval = 0;
31744 	uint64_t	capacity;
31745 	uint_t		lbasize;
31746 	uint_t		pbsize;
31747 	int		i;
31748 	int		devid_len;
31749 	struct sd_lun	*un;
31750 
31751 	ASSERT(ssc != NULL);
31752 	un = ssc->ssc_un;
31753 	ASSERT(un != NULL);
31754 	ASSERT(!mutex_owned(SD_MUTEX(un)));
31755 
31756 	mutex_enter(SD_MUTEX(un));
31757 	if (ISCD(un)) {
31758 		mutex_exit(SD_MUTEX(un));
31759 		return;
31760 	}
31761 
31762 	if (un->un_f_descr_format_supported) {
31763 		mutex_exit(SD_MUTEX(un));
31764 		rval = sd_send_scsi_READ_CAPACITY_16(ssc, &capacity, &lbasize,
31765 		    &pbsize, SD_PATH_DIRECT);
31766 		mutex_enter(SD_MUTEX(un));
31767 
31768 		if (rval != 0) {
31769 			un->un_phy_blocksize = DEV_BSIZE;
31770 		} else {
31771 			if (!ISP2(pbsize % DEV_BSIZE) || pbsize == 0) {
31772 				un->un_phy_blocksize = DEV_BSIZE;
31773 			} else if (pbsize > un->un_phy_blocksize) {
31774 				/*
31775 				 * Don't reset the physical blocksize
31776 				 * unless we've detected a larger value.
31777 				 */
31778 				un->un_phy_blocksize = pbsize;
31779 			}
31780 		}
31781 	}
31782 
31783 	for (i = 0; i < sd_flash_dev_table_size; i++) {
31784 		devid_len = (int)strlen(sd_flash_dev_table[i]);
31785 		if (sd_sdconf_id_match(un, sd_flash_dev_table[i], devid_len)
31786 		    == SD_SUCCESS) {
31787 			un->un_phy_blocksize = SSD_SECSIZE;
31788 			if (un->un_f_is_solid_state &&
31789 			    un->un_phy_blocksize != un->un_tgt_blocksize)
31790 				un->un_f_enable_rmw = TRUE;
31791 		}
31792 	}
31793 
31794 	mutex_exit(SD_MUTEX(un));
31795 }
31796